tabby-sftp-plus-plus 0.0.0-stage → 3.1.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DD1024z
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.en.md ADDED
@@ -0,0 +1,209 @@
1
+ # SFTP+ — Dual-Pane SFTP File Manager for Tabby
2
+
3
+ **[中文](https://github.com/10D24D/Tabby-SFTP-Plus/blob/main/README.md) | English**
4
+
5
+ [![Version](https://img.shields.io/github/package-json/v/10D24D/Tabby-SFTP-Plus?style=for-the-badge&label=Version&color=7B68EE)](https://github.com/10D24D/Tabby-SFTP-Plus)
6
+ [![Stars](https://img.shields.io/github/stars/10D24D/Tabby-SFTP-Plus?style=for-the-badge&label=Stars&color=orange)](https://github.com/10D24D/Tabby-SFTP-Plus/stargazers)
7
+ [![License](https://img.shields.io/github/license/10D24D/Tabby-SFTP-Plus?style=for-the-badge&label=License&color=green)](https://github.com/10D24D/Tabby-SFTP-Plus)
8
+
9
+ SFTP+ is a plugin for [Tabby Terminal](https://tabby.sh/) that adds a **dual-pane SFTP file manager** right inside your SSH terminal tabs. Each pane can host the **local disk** or **any remote connection**, giving local↔remote, local↔local, remote↔remote and remote↔local setups. Features include **drag-and-drop transfers**, **bookmark system**, **path memory**, transfer logs, file conflict handling, permission editing, and more — all without leaving the terminal.
10
+
11
+ ---
12
+
13
+ ## 📋 Features at a Glance
14
+
15
+ | Category | Description |
16
+ |----------|-------------|
17
+ | **📂 Dual-Pane Manager** | Each pane can host the **local disk** or **any remote connection** (local↔remote / local↔local / remote↔remote / remote↔local); horizontal / vertical / adaptive / single-pane layouts; draggable splitter, double-click to reset |
18
+ | **🔗 Connection Management** | The **connection picker** in the title bar switches either pane's endpoint in place: it lists open SSH tabs and unopened configured connections, each with a disconnect action (without affecting the panel's own tab) and a "current / other pane / not opened" marker; open it from the connection title or the pane's endpoint badge; the title-bar connection name toggles between "user@host" and the **alias** (falls back to user@host when no alias); reconnect happens in-place and in the background within the existing tab — no focus steal, the list shows "Waiting for <connection>" while disconnected, and returns to the last directory on recovery |
19
+ | **👁️ View / Edit** | Built-in text/image viewer and text editor (local + remote); extra editable extensions or allow-all-types (binaries still protected); image navigation (prev/next in same directory); copy / copy selection; text context menus for copy, cut, paste, and select-all; view-as-text; open or edit in the system default app; **virtualized line rendering** for large text (big logs scroll smoothly), **toggleable line numbers**, three viewer caret shapes (block / beam / underline, matching Tabby's terminal values); saving over a remote file changed by another program asks for confirmation first |
20
+ | **🎨 File Icons** | Built-in colored SVG file/folder icons; overlay badge for symlinks / shortcuts; customize extension mappings, icon directory, disabled built-in icons, and folder icon |
21
+ | **🔄 Drag & Drop** | Drag across panes to upload/download; recursive folder transfer; drag from OS Explorer/Desktop into either pane |
22
+ | **⬆️ Context Transfer** | Upload or download decided by the actual endpoints; a direct "transfer" when both panes are the same kind (multi-select batch) |
23
+ | **⚡ High-Speed Transfer** | Intra-directory file-level parallelism (1-10 concurrent, adjustable); tar channel for massive small-file directories (pack → single-file transfer → unpack), greatly reducing round trips; **five selectable channel modes** (Smart / SFTP only / TAR only / Prefer SFTP / Prefer TAR); **multi-selecting entries under one parent directory can pack them into a single archive**; batch delete via SSH `rm -rf` / `fs.rm(recursive)` |
24
+ | **🔖 Bookmark System** | **Global** bookmarks (visible in any tab) + **scoped** bookmarks (visible only in tabs of the same connection — local tabs included); group by scope or flatten and mix, with draggable group order; sort by **drag order / usage / name**; one click to **locate the bookmark for the current path**; the popup is resizable (double-click a handle to reset) and can be **pinned open** (stays put — clicks elsewhere won't close it / close on select, both panes can keep their popup open at once, and it re-anchors to its own pane on resize at the size you dragged), and a bookmark can carry a **linked path** that moves the other pane along |
25
+ | **📋 Transfer Log** | Full operation history including **Edit Load** / **Edit Save** types; filtering, stats, JSON export |
26
+ | **⚡ Transfer Control** | Progress bars (with percentage), pause/resume/cancel, resume support, real-time speed, **estimated time remaining**; outside TAR-only mode the tar channel falls back to the regular file-by-file transfer on failure; the transfer log tags transfers (⇄ SFTP / 📦 tar packing / file count); **a missing target directory is pre-flighted** (create / use current directory / cancel); submitting the same transfer twice is intercepted with a notice |
27
+ | **⚠️ File Conflict** | Visual diff on conflict (shows upload⬆/download⬇ direction), with overwrite/skip/rename options (**rename numbers duplicates by default**, or use timestamps / random suffixes) and batch processing; merge-overwrite has its own progress panel; content digests can be shown in the dialog, identical files can auto-skip, and differing digests are marked ≠ |
28
+ | **🔐 Permission Editor** | Remote chmod via 3×3 checkbox matrix with octal preview; unreadable permissions and failed changes are now reported instead of failing silently |
29
+ | **📌 Context Menus** | Upload/download, view/edit, new/rename/delete, copy/cut/paste, refresh, select all/invert; text viewer/editor context menus; <br />Header: column visibility, fit widths, borders & zebra stripes; menu items can also be disabled, not just reordered |
30
+ | **🔍 Filter & Sort** | Keyword filter, multi-column sorting (click headers), configurable visible columns; **Group** (None / Name / Date modified / Type / Size) splits the list into collapsible groups with expand-all / collapse-all, ↑/↓ stops on group headers and clicking a header selects the whole group; with focus on a file list, type a name prefix to jump to the match (Explorer-style; IME such as Chinese is supported); an absolute path typed into the address bar navigates there and highlights a trailing file |
31
+ | **🧭 Path Mode** | Four modes: `off` / `remember` / `sync` (sync with terminal) / `mirror` (both panes locked to one directory, available when both are local or both remote); configurable default |
32
+ | **🎨 Theme System** | 7 presets + custom colors, supports following the Tabby system theme |
33
+ | **⌨️ Panel Hotkey** | Customizable panel toggle hotkey with record/clear/conflict detection; panel actions (delete/rename/refresh/go up/back/forward), open/view/edit and common context-menu actions support **multiple key bindings**, and can be bound to mouse side buttons (Mouse3/Mouse4), the **mouse middle button and wheel up/down** (optionally with Ctrl/Alt/Shift/Win), plus an occupied-hotkey reference list |
34
+ | **🌐 Internationalization** | 24 locales (zh/en complete; other languages fall back to English for missing keys); auto-detects Tabby/browser language |
35
+ | **📦 Data Backup** | Export/import data (bookmarks, transfer logs, settings, path memory); **export is selectable per category** (Language / Theme / Layout / Object icons / Other / Transfer settings / Hotkeys / Bookmark data / Transfer logs) — unselected categories are not written, so importing such a file naturally leaves that data untouched |
36
+ | **🐞 Feedback** | Built-in "Report a Bug" / "Feature Request" in Settings, routed to the matching issue template for the UI language with the Tabby version, OS, frontend type and installed plugin list pre-filled |
37
+
38
+ ---
39
+
40
+ ## 🖥️ Interface Guide
41
+
42
+ | ![SFTP+ Panel](assets/SFTP-Plus_UI_Panel.png) | ![SFTP+ Settings](assets/SFTP-Plus_UI_Config.png) |
43
+ | :------------------------------------------: | :---------------------------------------------: |
44
+
45
+ ---
46
+
47
+ ## 📥 Installation
48
+
49
+ 1. Make sure [Tabby Terminal](https://tabby.sh/) is installed
50
+ 2. Configure the plugin directory in Tabby settings
51
+ 3. Place the built plugin (see "Development" section) into the plugin directory, then restart Tabby
52
+ 4. Open any SSH terminal tab — the **SFTP+** button should appear in the toolbar
53
+
54
+ ---
55
+
56
+ ## 🚀 Quick Start
57
+
58
+ 1. **Open** — Click the `SFTP+` button in the toolbar of an SSH terminal tab
59
+ 2. **Browse** — Navigate local files on the left and remote SFTP directories on the right; double-click to enter a directory
60
+ 3. **Transfer** — Drag across panes, or use right-click upload/download
61
+ 4. **View/Edit** — Right-click text or image files to view in-app; edit text and save (remote files upload automatically)
62
+
63
+ ---
64
+
65
+ ## 📏 File Size Limits
66
+
67
+ | Operation | Limit |
68
+ |-----------|-------|
69
+ | Text view | 2 MB (virtualized line rendering in the built-in viewer) |
70
+ | Image view | 15 MB |
71
+ | Text edit | 5 MB |
72
+
73
+ Exceeding a limit shows a clear dialog and toast with the cap.
74
+
75
+ ---
76
+
77
+ ## ⚙️ Settings Panel
78
+
79
+ Navigate to Tabby Settings → "SFTP+" in the left sidebar:
80
+
81
+ | Setting | Description |
82
+ |---------|-------------|
83
+ | **Language** | Follow System / Chinese / English |
84
+ | **Theme** | Auto / Dark / Light / Blue / Green / Purple / Red / Custom |
85
+ | **Custom Colors** | Independently set primary, background, text, and border colors |
86
+ | **Layout** | Adaptive (auto-switches based on panel width) / Horizontal / Vertical |
87
+ | **Table Style** | Show borders, show zebra stripes |
88
+ | **Upload/Download Concurrency** | Intra-directory file-level concurrency (1-10), takes effect immediately |
89
+ | **Transfer Channel Mode** | How folder transfers pick a route — five options: **Smart** (route by file count and size, default) / **SFTP only** (always file by file, no packing probe) / **TAR only** (always pack; fails hard with a reason when unavailable) / **Prefer SFTP** / **Prefer TAR**. The old "Tar Packing Acceleration" and "Fast Mode" toggles migrate into this setting automatically |
90
+ | **Default Upload/Download Paths** | Configure separate upload and download target directories; empty values use the current pane directory |
91
+ | **Default Path Mode** | Path mode for new connections on first open (off / remember / sync / mirror) |
92
+ | **Default Show Hidden** | Whether to show hidden files on new connections |
93
+ | **Additional editable extensions** | Extra extensions the built-in editor may open besides the text whitelist (e.g. `service, tf, plist`); accepts `.conf` / `*.conf` / `conf` |
94
+ | **Allow editing all file types** | Ignore the extension whitelist (off by default); binary content is still blocked to avoid corrupting files in a text editor |
95
+ | **Viewer & Editor** | Line-number toggle (on by default); three viewer caret shapes (block / beam / underline, matching Tabby's terminal cursor) |
96
+ | **File Icons** | Choose an icon resource directory, configure extension mappings, disable built-in icons, and replace the folder icon |
97
+ | **Toolbar Customization** | Drag-to-reorder toolbar buttons, hide unused items; pin buttons so they never collapse, or enable the ⋯ overflow menu — that menu lists every button with a per-row pin to move it in or out; the close button can be hidden once a panel toggle hotkey is bound |
98
+ | **Panel Opacity** | Adjustable 0.5–1; overlays and dialogs follow the same opacity (minimum 50%) |
99
+ | **Apply Settings Instantly** | On by default; when off, changes take effect only after closing and reopening the SFTP+ panel — handy when changing many options at once |
100
+ | **Panel Hotkey** | Custom panel toggle hotkey; panel actions (delete/rename/refresh/go up/back/forward), open/view/edit and common context-menu actions can be bound to multiple keys, and also to mouse side buttons (Mouse3/Mouse4), the mouse middle button and wheel up/down, with an occupied-hotkey reference list |
101
+ | **Data Backup** | Export/import data (JSON), selectable per category on export; clear all data (requires typing `DELETE` to confirm) |
102
+ | **Feedback** | Report a bug / request a feature (Tabby version, OS, frontend type and installed plugins are pre-filled) |
103
+ | **Compatibility** | Hide the native Tabby SFTP button to avoid conflicts |
104
+
105
+ ---
106
+
107
+ ## 💾 Data Backup
108
+
109
+ All data (bookmarks, transfer logs, path memory, settings) can be exported to and imported from a JSON file. Export is **selectable per category** (Language, Theme, Layout, Object icons, Other, Transfer settings, Hotkeys, Bookmark data, Transfer logs); unselected categories are not written — the import side treats a missing field as "do not overwrite", so an appearance-only backup will not wipe bookmarks or transfer logs.
110
+
111
+ Path: Settings → Data Backup → Export / Import
112
+
113
+ ---
114
+
115
+ ## 📜 Changelog
116
+
117
+ Latest version: **v3.1.1** (2026-11-05) — [Full changelog](CHANGELOG.en.md)
118
+
119
+ ---
120
+
121
+ ## 🛠️ Development
122
+
123
+ ### Tech Stack
124
+
125
+ | Category | Technology |
126
+ |----------|-----------|
127
+ | Framework | Angular 9 |
128
+ | Language | TypeScript 5.8 |
129
+ | Build | Webpack 5 |
130
+ | Styling | Inline styles (CSS variables for adaptive theming) |
131
+ | Dependencies | `tabby-core` / `tabby-settings` / `tabby-terminal` |
132
+ | Protocol | SFTP (reuses Tabby SSH Session) |
133
+
134
+ ### Build
135
+
136
+ ```bash
137
+ # Install dependencies
138
+ npm install
139
+
140
+ # Development mode (watch mode)
141
+ npm run watch
142
+
143
+ # Production build
144
+ npm run build
145
+ ```
146
+
147
+ The built plugin bundle is in `dist/` (`index.js` + auto-generated `package.json`).
148
+
149
+ ### Project Structure
150
+
151
+ ```
152
+ tabby-FTPS+/
153
+ ├── docs/
154
+ ├── scripts/ # Build helpers (copy-sftp-manifest generates dist/package.json)
155
+ ├── src/
156
+ │ ├── index.ts
157
+ │ ├── tabby-shims.d.ts
158
+ │ ├── services/ # sftp.service / bookmarks / i18n / transfer-log / config (Tabby convention)
159
+ │ ├── settings/ # sftp-settings component (Tabby convention)
160
+ │ ├── tabby/ # Terminal integration: config/hotkey providers, terminal-decorator
161
+ │ └── sftp/ # SFTP feature module
162
+ │ ├── sftp-floating-panel.component.ts
163
+ │ ├── sftp-workspace-tab.component.ts
164
+ │ ├── components/ # View layer (V): file panes, dialogs, context menu, conflict, transfer queue…
165
+ │ ├── controllers/ # Controller layer (C): column / viewer / bookmark controllers
166
+ │ └── core/ # Logic / utils / types: transfer, conflict, digest, drop, clipboard, path…
167
+ ├── locale/ # 24 GNU gettext .po locales
168
+ ├── tabby-plugin-common/ # Shared utilities across plugins (theme / utils)
169
+ ├── dist/ # Build output (index.js + package.json, gitignored)
170
+ └── package.json
171
+ ```
172
+
173
+ See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for the full tree.
174
+
175
+ ---
176
+
177
+ ## 🤝 How to Contribute
178
+
179
+ Contributions are always welcome! The plugin was conceived by the author (DD1024z), with the majority of implementation code generated using AI assistance.
180
+
181
+ - Report bugs or request features: [GitHub Issues](https://github.com/10D24D/Tabby-SFTP-Plus/issues) 📝
182
+ - Contribute code: Fork the project and submit a Pull Request 🚀
183
+ - Like SFTP+? Give it a [⭐ Star](https://github.com/10D24D/Tabby-SFTP-Plus) to show your support!
184
+ - Prefer something more direct? [☕ Treat me to a coffee](https://ko-fi.com/dd1024z) — every bit keeps it going.
185
+
186
+ Your stars and support are what keep me developing — thank you! ❤️
187
+
188
+ ## 🙏 Special Thanks
189
+
190
+ SFTP+ would not have grown without the foundational projects and the community's support. Special thanks to:
191
+
192
+ - [Tabby](https://tabby.sh/) — the powerful cross-platform terminal that hosts this plugin
193
+ - [SFTP (SSH File Transfer Protocol)](https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol) — the underlying file transfer protocol this plugin's remote file management is built upon
194
+ - [Tabby SFTP-UI](https://github.com/growingupfirst/tabby-sftp-ui) — an early two-pane SFTP file manager whose interaction and implementation ideas served as an important reference; some of SFTP+'s feature designs were inspired by it
195
+ - [@fweiger](https://github.com/fweiger) — Issue #13: a detailed UX optimization report (click/double-click interaction, right-click menu ordering, hotkey focus, etc.); several points shipped in v2.0.2
196
+ - [@HarpyWar](https://github.com/HarpyWar) — Issue #3: reported a broken hotkey settings page; fixed
197
+ - [@xingkongxiademodeng](https://github.com/xingkongxiademodeng) — Issue #10: flagged the serial (non-concurrent) directory upload bottleneck, guiding the concurrency optimization
198
+ - [@Hanzo-Huang](https://github.com/Hanzo-Huang) — Issue #5: suggested "get current working directory" like native SFTP; implemented
199
+ - [@Purgepyro](https://github.com/Purgepyro) — PR #18: additional editable extensions, allow-edit-all-types, and a fix for blank built-in icons after a manual install
200
+ - [@waylandun](https://github.com/waylandun) — Issue #21: editor paste leaked into the SSH terminal; PR #22 isolates text-input keys at the panel root (verified on macOS)
201
+ - Thanks also to [@webbrain-one](https://github.com/webbrain-one) and [@JayceVane](https://github.com/JayceVane) for their Pull Request attempts
202
+
203
+ ## 📝 License
204
+
205
+ SFTP+ is licensed under the [MIT](LICENSE) license. Feel free to use, modify, and share it — just comply with the terms.
206
+
207
+ ## ⚠️ Disclaimer
208
+
209
+ SFTP+ is a free and open-source project, primarily built with AI-assisted generation, so bugs and defects are inevitable. The author cannot guarantee that all features and code have been thoroughly verified. By using this plugin, you agree to assume the associated risks. The developer shall not be held liable for any problems or losses arising from its use. Please use it at your own discretion.
package/README.md CHANGED
@@ -1,3 +1,212 @@
1
- # Temporary Holding Version
1
+ # SFTP+ — Tabby 双栏 SFTP 文件管理器
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **中文 | [English](https://github.com/10D24D/Tabby-SFTP-Plus/blob/main/README.en.md)**
4
+
5
+ [![Version](https://img.shields.io/github/package-json/v/10D24D/Tabby-SFTP-Plus?style=for-the-badge&label=版本&color=7B68EE)](https://github.com/10D24D/Tabby-SFTP-Plus)
6
+ [![Stars](https://img.shields.io/github/stars/10D24D/Tabby-SFTP-Plus?style=for-the-badge&label=Stars&color=orange)](https://github.com/10D24D/Tabby-SFTP-Plus/stargazers)
7
+ [![License](https://img.shields.io/github/license/10D24D/Tabby-SFTP-Plus?style=for-the-badge&label=License&color=green)](https://github.com/10D24D/Tabby-SFTP-Plus)
8
+
9
+ SFTP+ 是 [Tabby Terminal](https://tabby.sh/) 的插件,为 SSH 终端标签页提供**双栏 SFTP 文件管理**功能:两栏各自可选**本机磁盘**或**任意远程连接**,组合出 本地↔远程 / 本地↔本地 / 远程↔远程 / 远程↔本地 四种形态。支持**书签系统**、**路径记忆**、**拖拽上传下载**、传输日志、文件冲突处理、权限编辑等,无需离开终端即可完成文件操作。
10
+
11
+ ---
12
+
13
+ ## 📋 功能一览
14
+
15
+ | 类别 | 功能 |
16
+ |------|------|
17
+ | **📂 双栏管理** | 左/右两栏各自可选**本机磁盘**或**任意远程连接**(本地↔远程 / 本地↔本地 / 远程↔远程 / 远程↔本地);可切换 水平/垂直/自适应/单栏 四种布局;分割线可拖拽调整,双击恢复默认 |
18
+ | **🔗 连接管理** | 顶栏**连接选择器**就地切换任一栏端点:列出已打开的 SSH 标签页与未打开的配置连接,每项可一键断开(不影响面板所在标签页)并标注「当前 / 另一栏 / 未打开」,点击连接标题或端点标识均可唤起;标题栏连接名可在「账号@地址」与「别名」间切换(别名缺失时回落账号@地址);断开重连在已有标签页内就地、后台完成,不抢焦点,断线期间列表留空提示「等待连接」,恢复后回到上次目录 |
19
+ | **👁️ 查看 / 编辑** | 内置文本/图片查看器与文本编辑器(本地+远程);可额外指定可编辑扩展名,或允许编辑所有类型(二进制仍保护);图片支持同目录上一张/下一张导航;支持「复制」「复制选中」;文本查看器/编辑器支持右键复制、剪切、粘贴、全选;支持「以文本方式查看」和「在系统中打开/编辑」;**大文本按行虚拟滚动**(可流畅浏览接近上限的日志)、**行号可开关**、查看器光标形状三档(方块 / 竖线 / 下划线,与 Tabby 终端取值一致);远端文件被其它程序改动后再保存会先确认 |
20
+ | **🎨 文件图标** | 内置彩色 SVG 文件/文件夹图标;符号链接 / 快捷方式叠加角标;支持按扩展名自定义映射、自定义图标目录、禁用内置图标和替换文件夹图标 |
21
+ | **🔄 拖拽传输** | 跨栏拖拽即上传/下载,支持文件夹递归传输;<br />支持从系统资源管理器/桌面拖入到本地或远程面板 |
22
+ | **⬆️ 右键传输** | 按两端端点自动决定上传 / 下载,两端同类时显示「传输」直传(多选批量) |
23
+ | **⚡ 高速传输** | 目录内多文件并行传输(并发数 1-10 可调);海量小文件走 tar 打包通道(本地打包→单文件传输→对端解包),大幅减少网络往返;**传输通道模式五档可选**(智能 / 仅 SFTP / 仅 TAR / 优先 SFTP / 优先 TAR);**多选同一父目录下的多个条目可合并为一个归档**一次传输;批量删除优先 SSH `rm -rf` / `fs.rm(recursive)` |
24
+ | **🔖 书签系统** | **全局**书签(任何标签页可见)+ **局部**书签(仅当前标签页的连接可见,本地标签页同样成立);可按范围分组或扁平混排,分组顺序可拖拽;排序可切 **拖拽顺序 / 使用频率 / 名称**;可一键**定位当前路径的书签**;浮层可拖拽调大小(双击手柄还原),底部可**钉住面板**(常驻:点其它位置也不关/选中后关闭,且左右两栏的书签面板可同时打开,缩放后自动贴回本栏并保持你拖出的尺寸),并可给书签配**联动路径**(点击时另一栏同步切过去) |
25
+ | **📋 传输日志** | 记录所有操作历史,含「编辑加载/编辑保存」分类,支持筛选、统计、JSON 导出 |
26
+ | **⚡ 传输控制** | 进度条显示(含百分比)、暂停/继续/取消、断点续传、实时速度、**预估剩余时间**;非「仅 TAR」模式下打包失败自动回退常规逐文件传输;传输记录标注传输方式(⇄ SFTP / 📦 tar 打包 / 文件数);**目标目录不存在时先预检**(创建 / 用当前目录 / 取消);同一笔传输重复提交会被拦截并提示 |
27
+ | **⚠️ 冲突处理** | 文件冲突时弹出对比界面(显示上传⬆/下载⬇方向),支持覆盖/跳过/重命名(重命名默认**按序号堆叠**,可改为时间戳或随机后缀),可批量操作;覆盖合并有独立进度面板;可计算两端内容摘要并在对话框展示,内容未变可自动跳过,内容不同时标 ≠ |
28
+ | **🔐 权限编辑** | 远程文件 chmod — 3×3 勾选框 + 八进制预览;读不到权限或修改失败时明确提示,不再静默 |
29
+ | **📌 右键菜单** | 上传/下载、查看/编辑、新建/重命名/删除、复制/剪切/粘贴、刷新、全选/反选;文本查看器/编辑器提供文本专用右键菜单;<br />表头右键:列显隐/列宽调整/面板边框与斑马纹切换 |
30
+ | **🔍 过滤排序** | 关键词过滤、多列排序(点击列头)、可配置显示列;**分组**(不分组 / 名称 / 修改日期 / 类型 / 大小)把列表切分为可折叠分组,支持全展开·全收起,↑/↓ 可停在分组表头上、点击表头即整组选中;焦点在文件列表时键入文件名前缀即可跳转选中(资源管理器式,支持中文输入法);地址栏输入绝对路径回车可跳转并定位(末段是文件则高亮该文件) |
31
+ | **🧭 路径模式** | 四选一:`off` / `remember`(路径记忆)/ `sync`(与终端同步)/ `mirror`(两栏锁同一目录,仅两栏同为本地或同为远程时可用);可设默认值 |
32
+ | **🎨 主题系统** | 7 种预设 + 自定义配色,支持跟随 Tabby 系统主题 |
33
+ | **⌨️ 面板快捷键** | 可自定义面板开关快捷键,支持录制/清除/冲突提示;面板操作(删除/重命名/刷新/返回上级/后退/前进)、打开·查看·编辑与右键菜单常用动作均支持**多键绑定**,并可绑定鼠标侧键(Mouse3/Mouse4)、**鼠标中键与滚轮上滚/下滚**(可叠加 Ctrl/Alt/Shift/Win),并提供已占用快捷键清单 |
34
+ | **🌐 国际化** | 24 种语言(简中 / 英完整,其余缺失键回退英文),自动检测 Tabby/浏览器语言 |
35
+ | **📦 数据备份** | 导出/导入数据(书签 + 传输记录 + 设置 + 路径记忆);**导出可按九类勾选**(语言 / 主题 / 布局 / 对象图标 / 其它 / 传输设置 / 快捷键 / 书签数据 / 传输记录),未勾选的类别不写入文件,导入时自然不覆盖原有数据 |
36
+ | **🐞 意见反馈** | 设置页内置「报缺陷 / 提需求」入口,按界面语言路由到对应 Issue 模板,并自动预填 Tabby 版本、系统、前端类型与已装插件列表 |
37
+
38
+ ---
39
+
40
+ ## 🖥️ 界面导览
41
+
42
+ | ![SFTP+ 操作面板](assets/SFTP-Plus_UI_Panel.png) | ![SFTP+ 设置界面](assets/SFTP-Plus_UI_Config.png) |
43
+ | :---------------------------------------------: | :---------------------------------------------: |
44
+
45
+ ---
46
+
47
+ ## 📥 安装
48
+
49
+ 1. 确保已安装 [Tabby Terminal](https://tabby.sh/)
50
+ 2. 在 Tabby 设置中配置插件目录
51
+ 3. 将构建产物放入插件目录(参见下方「开发」),重启 Tabby
52
+ 4. 打开任意 SSH 终端标签页,工具栏出现 **SFTP+** 按钮即安装成功
53
+
54
+ ---
55
+
56
+ ## 🚀 快速上手
57
+
58
+ 1. **打开** — 在 SSH 终端标签页的工具栏点击 `SFTP+` 按钮
59
+ 2. **浏览** — 左侧本地文件系统、右侧远程 SFTP 目录,双击进入目录
60
+ 3. **传输** — 拖拽、右键上传/下载,或选中后使用右键菜单
61
+ 4. **查看/编辑** — 右键文本或图片文件可内置查看;文本可编辑并保存(远程文件自动上传)
62
+
63
+ ---
64
+
65
+
66
+ ## 📏 文件大小限制
67
+
68
+ | 操作 | 上限 |
69
+ |------|------|
70
+ | 文本查看 | 2 MB(内置查看器按行虚拟滚动,可流畅浏览接近上限的日志) |
71
+ | 图片查看 | 15 MB |
72
+ | 文本编辑 | 5 MB |
73
+
74
+ 超出上限时仍会提示,并说明具体限制。
75
+
76
+ ---
77
+
78
+
79
+ ## ⚙️ 设置面板
80
+
81
+ 在 Tabby 设置页左侧找到「SFTP+」:
82
+
83
+ | 设置项 | 说明 |
84
+ |--------|------|
85
+ | **语言** | 跟随系统 / 中文 / English |
86
+ | **主题** | 自动 / 深色 / 浅色 / 蓝 / 绿 / 紫 / 红 / 自定义 |
87
+ | **自定义颜色** | 独立设置主色、背景、文字、边框颜色 |
88
+ | **布局** | 自适应(按面板宽度自动切换)/ 水平 / 垂直 |
89
+ | **表格样式** | 显示边框、显示斑马纹 |
90
+ | **上传/下载并发数** | 目录内文件级并发数(1-10),即时生效 |
91
+ | **传输通道模式** | 文件夹传输的择路方式,五档:**智能**(按文件数与体积自动择路,默认)/ **仅 SFTP**(永远逐文件,不做打包探测)/ **仅 TAR**(永远打包,不可用时硬失败并说明原因)/ **优先 SFTP** / **优先 TAR**。旧「tar 打包加速」与「快速模式」开关会自动迁移到本项 |
92
+ | **默认上传/下载路径** | 分别设置上传目标目录和下载目标目录;留空时使用当前面板目录 |
93
+ | **默认路径模式** | 新连接首次打开面板时的路径模式(off / remember / sync / mirror) |
94
+ | **默认显示隐藏文件** | 新连接首次打开面板时是否显示隐藏文件 |
95
+ | **额外可编辑扩展名** | 在内置文本白名单之外,额外允许内置编辑器打开的扩展名(如 `service, tf, plist`);支持 `.conf` / `*.conf` / `conf` 写法 |
96
+ | **允许编辑所有文件类型** | 忽略扩展名白名单(默认关);二进制内容仍会拦截,避免用文本编辑器损坏文件 |
97
+ | **查看器与编辑器** | 行号显示开关(默认开);查看器光标形状三档(方块 / 竖线 / 下划线,取值与 Tabby 终端光标一致) |
98
+ | **文件图标** | 选择图标资源目录、配置扩展名映射、禁用内置图标和替换文件夹图标 |
99
+ | **工具栏自定义** | 拖拽排序工具栏按钮、隐藏不常用项;可把按钮「固定」常显,或开启折叠菜单(⋯)把其余按钮收进菜单;该菜单列出全部按钮,每行图钉可就地切固定;关闭按钮 ✕ 需先绑面板快捷键才可停用/收起 |
100
+ | **面板透明度** | 0.5–1 可调,浮层与对话框一并生效(最低 50%) |
101
+ | **调整配置立即生效** | 默认开启;关闭后改动需「关闭并重开 SFTP+ 面板」才生效,适合一次调整多项 |
102
+ | **面板快捷键** | 自定义面板开关快捷键;面板操作(删除/重命名/刷新/返回上级/后退/前进)、打开·查看·编辑与右键菜单常用动作可绑定多个按键,也可绑定鼠标侧键(Mouse3/Mouse4)、鼠标中键与滚轮上滚/下滚,含已占用快捷键清单 |
103
+ | **数据备份** | 导出/导入数据(JSON),导出时可按九类勾选;清除全部数据(输入 `DELETE` 确认) |
104
+ | **意见反馈** | 报缺陷 / 提需求(自动预填 Tabby 版本、系统、前端类型与已装插件列表) |
105
+ | **兼容性** | 隐藏 Tabby 原生 SFTP 按钮避免冲突 |
106
+
107
+ ---
108
+
109
+ ## 💾 数据备份
110
+
111
+ 所有数据(书签、传输日志、路径记忆、设置)可导出为 JSON 文件,也支持导入恢复。导出时可**按类别勾选**(语言、主题、布局、对象图标、其它、传输设置、快捷键、书签数据、传输记录),未勾选的类别不会写入文件——导入侧对不存在的字段是「不覆盖」语义,因此「只导外观」的备份不会清空书签或传输记录。
112
+
113
+ 路径:设置页 → 数据备份 → 导出 / 导入
114
+
115
+ ---
116
+
117
+ ## 📜 版本历史
118
+
119
+ 最新版本 **v3.1.1**(2026-11-05)— [完整更新日志](CHANGELOG.md)
120
+
121
+ ---
122
+
123
+ ## 🛠️ 开发
124
+
125
+ ### 技术栈
126
+
127
+ | 类别 | 技术 |
128
+ |------|------|
129
+ | 框架 | Angular 9 |
130
+ | 语言 | TypeScript 5.8 |
131
+ | 构建 | Webpack 5 |
132
+ | 样式 | 内联样式(CSS 变量自适应主题) |
133
+ | 平台依赖 | `tabby-core` / `tabby-settings` / `tabby-terminal` |
134
+ | 传输协议 | SFTP(复用 Tabby SSH Session) |
135
+
136
+ ### 构建
137
+
138
+ ```bash
139
+ # 安装依赖
140
+ npm install
141
+
142
+ # 开发模式(watch 自动构建)
143
+ npm run watch
144
+
145
+ # 生产构建
146
+ npm run build
147
+ ```
148
+
149
+ 构建产物 `dist/index.js` 即为 Tabby 插件包;`dist/package.json` 由 `scripts/copy-sftp-manifest.mjs` 在构建时从根 `package.json` 自动派生(改写入口、剔除开发期脚本),**无需手工维护**。
150
+
151
+ ### 项目结构
152
+
153
+ ```
154
+ tabby-FTPS+/
155
+ ├── docs/ # 架构与开发文档
156
+ ├── scripts/ # 构建辅助(copy-sftp-manifest 自动生成 dist/package.json)
157
+ ├── src/
158
+ │ ├── index.ts # 插件入口(Angular Module 注册)
159
+ │ ├── tabby-shims.d.ts # Tabby 类型声明
160
+ │ ├── services/ # sftp.service / bookmarks / i18n / transfer-log / config(Tabby 约定目录)
161
+ │ ├── settings/ # sftp-settings 设置组件(Tabby 约定目录)
162
+ │ ├── tabby/ # 终端集成:config/hotkey provider、terminal-decorator(工具栏注入按钮)
163
+ │ └── sftp/ # SFTP 功能模块
164
+ │ ├── sftp-floating-panel.component.ts # 主面板(业务编排)
165
+ │ ├── sftp-workspace-tab.component.ts # 工作区独立标签页容器
166
+ │ ├── components/ # 视图层(V):文件列表面板、对话框、右键菜单、冲突处理、传输队列等
167
+ │ ├── controllers/ # 控制器层(C):列 / 查看器 / 书签控制器
168
+ │ └── core/ # 逻辑/工具/类型:传输、冲突、摘要、拖放、剪贴板、路径等
169
+ ├── locale/ # 24 语言 GNU gettext .po
170
+ ├── tabby-plugin-common/ # 跨插件公共工具(theme / utils)
171
+ ├── dist/ # 构建输出(index.js + package.json,不入库)
172
+ ├── package.json
173
+ └── webpack.config.js
174
+ ```
175
+
176
+ 更完整的目录说明见 [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md)。
177
+
178
+ ---
179
+
180
+ ## 🤝 如何贡献
181
+
182
+ 欢迎为 SFTP+ 贡献代码或建议!本插件功能想法由作者(DD1024z)提供,主要实现代码使用 AI 辅助生成。
183
+
184
+ - 提交 Bug 或功能请求:[GitHub Issues](https://github.com/10D24D/Tabby-SFTP-Plus/issues) 📝
185
+ - 贡献代码:Fork 项目并提交 Pull Request 🚀
186
+ - 喜欢 SFTP+?可以帮忙点个 [⭐ Star](https://github.com/10D24D/Tabby-SFTP-Plus) 支持一下!
187
+ - 想更直接一点?可以[☕ 请喝咖啡](https://ko-fi.com/dd1024z),一样是动力。
188
+
189
+ 您的点赞与 Star 是我持续开发的动力,感谢支持!❤️
190
+
191
+ ## 🙏 特别鸣谢
192
+
193
+ SFTP+ 的成长离不开基石项目与社区用户的支持,在此特别感谢:
194
+
195
+ - [Tabby](https://tabby.sh/) — 强大的跨平台终端,SFTP+ 得以在其生态内运行
196
+ - [SFTP(SSH File Transfer Protocol)](https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol) — 底层文件传输协议,本插件的远程文件管理能力构建于此之上
197
+ - [Tabby SFTP-UI](https://github.com/growingupfirst/tabby-sftp-ui) — 早期双栏 SFTP 文件管理器,其交互与实现思路为 SFTP+ 提供了重要参考,部分功能设计受其启发
198
+ - [@fweiger](https://github.com/fweiger) — Issue #13 提交了详尽的使用体验优化建议(单击/双击交互、右键菜单排序、快捷键聚焦等),多项已落地 v2.0.2
199
+ - [@HarpyWar](https://github.com/HarpyWar) — Issue #3 反馈热键设置页异常,已修复
200
+ - [@xingkongxiademodeng](https://github.com/xingkongxiademodeng) — Issue #10 指出目录上传串行无并发的性能瓶颈,为并发传输优化提供方向
201
+ - [@Hanzo-Huang](https://github.com/Hanzo-Huang) — Issue #5 提出「获取当前工作目录」功能建议,已实现
202
+ - [@Purgepyro](https://github.com/Purgepyro) — PR #18 新增自定义可编辑扩展名、允许编辑全部类型,并修复手动安装后内置图标空白
203
+ - [@waylandun](https://github.com/waylandun) — Issue #21 反馈编辑器粘贴会进终端,PR #22 在面板根隔离文本按键(macOS 实测)
204
+ - 同时感谢 [@webbrain-one](https://github.com/webbrain-one)、[@JayceVane](https://github.com/JayceVane) 提交 Pull Request 的贡献尝试
205
+
206
+ ## 📝 许可协议
207
+
208
+ SFTP+ 遵循 [MIT](LICENSE) 开源协议。欢迎使用、修改和分享,但请遵守协议条款。
209
+
210
+ ## ⚠️ 免责声明
211
+
212
+ SFTP+ 是一个免费的开源项目,主要使用 AI 辅助生成,难免存在一些 BUG 缺陷,作者无法保证功能代码验证到位。使用本插件即表示你同意承担相关风险,开发者不对因使用插件导致的任何问题或损失负责,请酌情使用。
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <rect x="3.5" y="5" width="17" height="14" rx="2" fill="#e08a2b"/>
3
+ <g fill="#fff">
4
+ <ellipse cx="9" cy="15" rx="1.7" ry="1.3"/>
5
+ <ellipse cx="15" cy="15" rx="1.7" ry="1.3"/>
6
+ <rect x="10.3" y="8" width="1.3" height="7"/>
7
+ <rect x="16.3" y="8" width="1.3" height="7"/>
8
+ <rect x="10.3" y="7.4" width="7.3" height="1.4" rx="0.6"/>
9
+ </g>
10
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <path fill="#5a6b8c" d="M5 2h10l4 4v16H5z"/>
3
+ <path fill="rgba(255,255,255,.35)" d="M15 2l4 4h-4z"/>
4
+ <g fill="#fff" opacity=".95"><path d="M10 9l-2.2 3 2.2 3 1-1.1-1.3-1.9 1.3-1.9zM14 9l-1 1.1 1.3 1.9-1.3 1.9 1 1.1 2.2-3z"/></g>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <path fill="#8a8a8a" d="M5 2h10l4 4v16H5z"/>
3
+ <path fill="rgba(255,255,255,.35)" d="M15 2l4 4h-4z"/>
4
+ <g fill="#fff" opacity=".9"><rect x="8.5" y="10" width="7" height="1.4" rx=".7"/><rect x="8.5" y="13" width="7" height="1.4" rx=".7"/><rect x="8.5" y="16" width="4.5" height="1.4" rx=".7"/></g>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <path fill="#2b579a" d="M5 2h10l4 4v16H5z"/>
3
+ <path fill="rgba(255,255,255,.22)" d="M15 2l4 4h-4z"/>
4
+ <text x="12" y="16.8" font-family="Arial, 'Segoe UI', Helvetica, sans-serif" font-size="11" font-weight="700" text-anchor="middle" fill="#fff">W</text>
5
+ </svg>
@@ -0,0 +1,19 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <!-- 文档底:橙色,与 doc/xls/ppt/pdf/zip 同家族 -->
3
+ <path fill="#e8923a" d="M5 2h10l4 4v16H5z"/>
4
+ <path fill="rgba(255,255,255,.35)" d="M15 2l4 4h-4z"/>
5
+ <!-- 白色齿轮:整体缩小,齿短且不张扬 -->
6
+ <g fill="#fff">
7
+ <rect x="11.4" y="7.6" width="1.2" height="2.2" rx=".35"/>
8
+ <rect x="11.4" y="7.6" width="1.2" height="2.2" rx=".35" transform="rotate(45 12 12)"/>
9
+ <rect x="11.4" y="7.6" width="1.2" height="2.2" rx=".35" transform="rotate(90 12 12)"/>
10
+ <rect x="11.4" y="7.6" width="1.2" height="2.2" rx=".35" transform="rotate(135 12 12)"/>
11
+ <rect x="11.4" y="7.6" width="1.2" height="2.2" rx=".35" transform="rotate(180 12 12)"/>
12
+ <rect x="11.4" y="7.6" width="1.2" height="2.2" rx=".35" transform="rotate(225 12 12)"/>
13
+ <rect x="11.4" y="7.6" width="1.2" height="2.2" rx=".35" transform="rotate(270 12 12)"/>
14
+ <rect x="11.4" y="7.6" width="1.2" height="2.2" rx=".35" transform="rotate(315 12 12)"/>
15
+ <circle cx="12" cy="12" r="3.4"/>
16
+ </g>
17
+ <!-- 中心孔(透出文档底色,强化齿轮观感) -->
18
+ <circle cx="12" cy="12" r="1.2" fill="#e8923a"/>
19
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <path fill="#e3b341" d="M3 6h5l2 2h11v11H3z"/>
3
+ <path fill="#f0c860" d="M3 8h18v9H3z"/>
4
+ <path fill="#c8962f" d="M3 6h5l2 2h11v2H3z" opacity=".6"/>
5
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
2
+ <path fill="#8b949e" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
3
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <rect x="3.5" y="5" width="17" height="14" rx="2.5" fill="#2bb0a3"/>
3
+ <circle cx="8" cy="9.5" r="2" fill="#fff"/>
4
+ <path d="M4 18.5 L9.5 12 L12.5 15 L15 12.5 L20 18.5 Z" fill="#fff" opacity="0.92"/>
5
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
2
+ <title>Ko-fi</title>
3
+ <path fill="none" stroke="#FF5E5B" stroke-width="1.5" stroke-linecap="round" d="M4.7 3.1V1.5M7.6 3.1V1.5"/>
4
+ <path fill="#FF5E5B" d="M1.7 4.4h9.3v5.4a3.5 3.5 0 0 1-3.5 3.5H5.2a3.5 3.5 0 0 1-3.5-3.5V4.4z"/>
5
+ <path fill="none" stroke="#FF5E5B" stroke-width="1.5" stroke-linecap="round" d="M11.4 6.1h1.1a2.2 2.2 0 0 1 0 4.4h-1.1"/>
6
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg id="n" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
2
+ <title>n</title>
3
+ <path fill="#c12127" d="M0,16V0H16V16ZM3,3V13H8V5H3v8h2V3Z"/>
4
+ <path fill="#fff" d="M3,3H13V13H11V5H8v8H3Z"/>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <path fill="#e2574c" d="M5 2h10l4 4v16H5z"/>
3
+ <path fill="rgba(255,255,255,.35)" d="M15 2l4 4h-4z"/>
4
+ <g fill="#fff" opacity=".92"><rect x="8.5" y="10" width="7" height="1.5" rx=".75"/><rect x="8.5" y="13" width="7" height="1.5" rx=".75"/><rect x="8.5" y="16" width="4.5" height="1.5" rx=".75"/></g>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <path fill="#d24726" d="M5 2h10l4 4v16H5z"/>
3
+ <path fill="rgba(255,255,255,.22)" d="M15 2l4 4h-4z"/>
4
+ <text x="12" y="16.8" font-family="Arial, 'Segoe UI', Helvetica, sans-serif" font-size="11" font-weight="700" text-anchor="middle" fill="#fff">P</text>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <path fill="#5b9bd5" d="M5 2h10l4 4v16H5z"/>
3
+ <path fill="rgba(255,255,255,.35)" d="M15 2l4 4h-4z"/>
4
+ <g fill="#fff" opacity=".92"><rect x="8.5" y="9" width="7" height="1.4" rx=".7"/><rect x="8.5" y="12" width="7" height="1.4" rx=".7"/><rect x="8.5" y="15" width="4.5" height="1.4" rx=".7"/></g>
5
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <rect x="3.5" y="5" width="17" height="14" rx="2" fill="#d2453f"/>
3
+ <path fill="#fff" d="M10 8.6 15.6 12 10 15.4z"/>
4
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <path fill="#217346" d="M5 2h10l4 4v16H5z"/>
3
+ <path fill="rgba(255,255,255,.22)" d="M15 2l4 4h-4z"/>
4
+ <text x="12" y="16.8" font-family="Arial, 'Segoe UI', Helvetica, sans-serif" font-size="11" font-weight="700" text-anchor="middle" fill="#fff">S</text>
5
+ </svg>
@@ -0,0 +1,16 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
2
+ <!-- 文档底:紫色,与 doc/xls/ppt/pdf 同家族 -->
3
+ <path fill="#9b6dd6" d="M5 2h10l4 4v16H5z"/>
4
+ <path fill="rgba(255,255,255,.35)" d="M15 2l4 4h-4z"/>
5
+ <!-- 简洁拉链:居中竖轨 + 滑块 + 顶部拉环 -->
6
+ <g fill="#fff" opacity=".92">
7
+ <!-- 顶部拉环 -->
8
+ <rect x="10.8" y="5.2" width="2.4" height="1.3" rx=".65" transform="rotate(-15,12,5.85)"/>
9
+ <!-- 竖向轨道 -->
10
+ <rect x="11.3" y="7" width="1.4" height="12" rx=".7"/>
11
+ <!-- 中部滑块(闭合块,视觉焦点) -->
12
+ <rect x="9.4" y="11" width="5.2" height="3.2" rx="1.2"/>
13
+ <!-- 滑块上的小横纹(增加质感) -->
14
+ <line x1="11" y1="12.6" x2="13" y2="12.6" stroke="#9b6dd6" stroke-width=".8" stroke-linecap="round"/>
15
+ </g>
16
+ </svg>