@co0ontty/wand 1.31.2 → 1.31.3

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.
@@ -318,6 +318,59 @@
318
318
  })()
319
319
  };
320
320
 
321
+ // ── 统一线性图标库 ──
322
+ // 替代页面里散落的 emoji(🛡 / ⌨ / 📁 / 🔔 …)。这些 emoji 在系统字体里渲染成
323
+ // 彩色卡通形态,与项目温暖米色 + 棕橙的复古主题视觉冲突明显。这里集中维护
324
+ // currentColor 线性 SVG,让图标跟随父级文字颜色变化,hover / active 状态自然继承。
325
+ var ICON_PATHS = {
326
+ // shape sets — 24x24 viewbox, currentColor stroke
327
+ shield: '<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>',
328
+ shieldCheck: '<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/><polyline points="9 12 11 14 15 10"/>',
329
+ keyboard: '<rect x="2" y="6" width="20" height="12" rx="2"/><line x1="6" y1="10" x2="6" y2="10"/><line x1="10" y1="10" x2="10" y2="10"/><line x1="14" y1="10" x2="14" y2="10"/><line x1="18" y1="10" x2="18" y2="10"/><line x1="6" y1="14" x2="6" y2="14"/><line x1="18" y1="14" x2="18" y2="14"/><line x1="9" y1="14" x2="15" y2="14"/>',
330
+ cloud: '<path d="M17.5 19a4.5 4.5 0 1 0-1-8.9 6 6 0 0 0-11.5 1.7A4 4 0 0 0 6 19h11.5z"/>',
331
+ terminal: '<polyline points="4 7 9 12 4 17"/><line x1="12" y1="17" x2="20" y2="17"/>',
332
+ chat: '<path d="M21 12a8 8 0 0 1-12.9 6.3L3 20l1.7-5.1A8 8 0 1 1 21 12z"/>',
333
+ folder: '<path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>',
334
+ folderOpen:'<path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2"/><path d="M3 9h18l-2 8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>',
335
+ trash: '<polyline points="3 6 5 6 21 6"/><path d="M19 6l-1 13a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"/><path d="M10 11v6"/><path d="M14 11v6"/><path d="M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2"/>',
336
+ slash: '<polyline points="4 17 10 11 4 5"/><line x1="12" y1="19" x2="20" y2="19"/>',
337
+ chevronDown: '<polyline points="6 9 12 15 18 9"/>',
338
+ chevronUp: '<polyline points="6 15 12 9 18 15"/>',
339
+ chevronRight:'<polyline points="9 6 15 12 9 18"/>',
340
+ bell: '<path d="M18 16v-5a6 6 0 1 0-12 0v5l-2 2h16z"/><path d="M10 21a2 2 0 0 0 4 0"/>',
341
+ music: '<path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/>',
342
+ vibrate: '<rect x="9" y="4" width="6" height="16" rx="1"/><path d="M5 8v8"/><path d="M3 10v4"/><path d="M19 8v8"/><path d="M21 10v4"/>',
343
+ globe: '<circle cx="12" cy="12" r="9"/><line x1="3" y1="12" x2="21" y2="12"/><path d="M12 3a14 14 0 0 1 0 18"/><path d="M12 3a14 14 0 0 0 0 18"/>',
344
+ smartphone:'<rect x="6" y="2" width="12" height="20" rx="2.5"/><line x1="11" y1="18" x2="13" y2="18"/>',
345
+ desktop: '<rect x="3" y="4" width="18" height="12" rx="2"/><line x1="8" y1="20" x2="16" y2="20"/><line x1="12" y1="16" x2="12" y2="20"/>',
346
+ link: '<path d="M10 14a4.5 4.5 0 0 0 6.36 0l3-3a4.5 4.5 0 1 0-6.36-6.36l-1.42 1.41"/><path d="M14 10a4.5 4.5 0 0 0-6.36 0l-3 3a4.5 4.5 0 1 0 6.36 6.36l1.42-1.41"/>',
347
+ palette: '<circle cx="13.5" cy="6.5" r="1"/><circle cx="17.5" cy="10.5" r="1"/><circle cx="8.5" cy="7.5" r="1"/><circle cx="6.5" cy="12.5" r="1"/><path d="M12 3a9 9 0 1 0 0 18 1.5 1.5 0 0 0 1.1-2.5 1.5 1.5 0 0 1 1.1-2.5h2.3A4.5 4.5 0 0 0 21 11.5C21 6.8 16.97 3 12 3z"/>',
348
+ play: '<polygon points="6 4 20 12 6 20 6 4"/>',
349
+ inbox: '<polyline points="22 13 16 13 14 16 10 16 8 13 2 13"/><path d="M5 5h14l3 8v6a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-6z"/>',
350
+ zap: '<polygon points="13 2 4 14 11 14 10 22 20 9 13 9 13 2"/>',
351
+ wrench: '<path d="M14.7 6.3a4 4 0 1 1 4 4l-9 9-3.5 1 1-3.5 7.5-7.5z"/>',
352
+ edit: '<path d="M12 20h9"/><path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4z"/>',
353
+ check: '<polyline points="5 12 10 17 19 7"/>',
354
+ signal: '<path d="M2 12a15 15 0 0 1 20 0"/><path d="M5 16a10 10 0 0 1 14 0"/><path d="M9 20a4 4 0 0 1 6 0"/><circle cx="12" cy="20" r="0.5" fill="currentColor"/>',
355
+ file: '<path d="M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"/><polyline points="14 3 14 9 20 9"/>',
356
+ image: '<rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="1.5"/><polyline points="3 18 9 12 14 17 21 12"/>',
357
+ sigma: '<polyline points="18 4 6 4 13 12 6 20 18 20"/>'
358
+ };
359
+ // 渲染 SVG 字符串。size 默认 14,strokeWidth 默认 1.8(与现有 send/stop 按钮线宽接近)。
360
+ // cls 用于添加额外 class(如 .composer-pill-icon),便于 CSS 微调。
361
+ function iconSvg(name, opts) {
362
+ var path = ICON_PATHS[name];
363
+ if (!path) return "";
364
+ opts = opts || {};
365
+ var size = opts.size || 14;
366
+ var stroke = opts.strokeWidth || 1.8;
367
+ var cls = opts.cls ? ' class="' + opts.cls + '"' : "";
368
+ var fill = opts.fill || "none";
369
+ return '<svg' + cls + ' width="' + size + '" height="' + size + '" viewBox="0 0 24 24"' +
370
+ ' fill="' + fill + '" stroke="currentColor" stroke-width="' + stroke + '"' +
371
+ ' stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' + path + '</svg>';
372
+ }
373
+
321
374
  // ── Structured session status bar (in-flight timer) ──
322
375
  var _statusBarTimerId = null;
323
376
  var _statusBarStartTime = 0;
@@ -1313,7 +1366,7 @@
1313
1366
  app.innerHTML =
1314
1367
  '<div class="boot-loading">' +
1315
1368
  '<div class="boot-loading-card">' +
1316
- '<div class="boot-loading-text" style="font-size:1.3em;margin-bottom:12px">📡 无法连接到服务器</div>' +
1369
+ '<div class="boot-loading-text" style="font-size:1.3em;margin-bottom:12px;display:flex;align-items:center;justify-content:center;gap:8px">' + iconSvg("signal", { size: 20, strokeWidth: 1.8 }) + '<span>无法连接到服务器</span></div>' +
1317
1370
  '<div class="boot-loading-text" style="opacity:0.7;font-size:0.95em">请检查网络连接或确认 Wand 服务正在运行。</div>' +
1318
1371
  '<button onclick="location.reload()" style="margin-top:18px;padding:8px 24px;border-radius:8px;border:1px solid rgba(150,118,85,0.3);background:rgba(255,255,255,0.8);cursor:pointer;font-size:0.95em">重试</button>' +
1319
1372
  '</div>' +
@@ -1418,10 +1471,10 @@
1418
1471
  '</span>' +
1419
1472
  '<span class="approval-stats-popup" id="approval-stats-popup">' +
1420
1473
  '<span class="approval-stats-popup-title">自动批准统计</span>' +
1421
- (stats.command > 0 ? '<span class="approval-stats-row"><span class="approval-stats-row-icon">⚡</span><span class="approval-stats-row-label">命令执行</span><span class="approval-stats-row-count">' + stats.command + '</span></span>' : '') +
1422
- (stats.file > 0 ? '<span class="approval-stats-row"><span class="approval-stats-row-icon">📝</span><span class="approval-stats-row-label">文件写入</span><span class="approval-stats-row-count">' + stats.file + '</span></span>' : '') +
1423
- (stats.tool > 0 ? '<span class="approval-stats-row"><span class="approval-stats-row-icon">🔧</span><span class="approval-stats-row-label">其他工具</span><span class="approval-stats-row-count">' + stats.tool + '</span></span>' : '') +
1424
- '<span class="approval-stats-row approval-stats-row-total"><span class="approval-stats-row-icon">∑</span><span class="approval-stats-row-label">合计</span><span class="approval-stats-row-count">' + stats.total + '</span></span>' +
1474
+ (stats.command > 0 ? '<span class="approval-stats-row"><span class="approval-stats-row-icon">' + iconSvg("terminal", { size: 12, strokeWidth: 1.8 }) + '</span><span class="approval-stats-row-label">命令执行</span><span class="approval-stats-row-count">' + stats.command + '</span></span>' : '') +
1475
+ (stats.file > 0 ? '<span class="approval-stats-row"><span class="approval-stats-row-icon">' + iconSvg("edit", { size: 12, strokeWidth: 1.8 }) + '</span><span class="approval-stats-row-label">文件写入</span><span class="approval-stats-row-count">' + stats.file + '</span></span>' : '') +
1476
+ (stats.tool > 0 ? '<span class="approval-stats-row"><span class="approval-stats-row-icon">' + iconSvg("wrench", { size: 12, strokeWidth: 1.8 }) + '</span><span class="approval-stats-row-label">其他工具</span><span class="approval-stats-row-count">' + stats.tool + '</span></span>' : '') +
1477
+ '<span class="approval-stats-row approval-stats-row-total"><span class="approval-stats-row-icon">' + iconSvg("sigma", { size: 12, strokeWidth: 1.8 }) + '</span><span class="approval-stats-row-label">合计</span><span class="approval-stats-row-count">' + stats.total + '</span></span>' +
1425
1478
  '</span>' +
1426
1479
  '</span>';
1427
1480
  }
@@ -1687,20 +1740,20 @@
1687
1740
  '<p class="blank-chat-subtitle">支持终端 PTY 会话与结构化 chat 会话,两种模式可并存。</p>' +
1688
1741
  '<div class="blank-chat-tools">' +
1689
1742
  '<button class="blank-chat-tool-btn" id="welcome-tool-claude" type="button">' +
1690
- '<span class="tool-icon">🤖</span>新建终端会话' +
1743
+ '<span class="tool-icon">' + iconSvg("terminal", { size: 16, strokeWidth: 1.8 }) + '</span>新建终端会话' +
1691
1744
  '</button>' +
1692
1745
  '<button class="blank-chat-tool-btn" id="welcome-tool-codex" type="button">' +
1693
- '<span class="tool-icon">⌘</span>新建 Codex 会话' +
1746
+ '<span class="tool-icon tool-icon-text">⌘</span>新建 Codex 会话' +
1694
1747
  '</button>' +
1695
1748
  '<button class="blank-chat-tool-btn" id="welcome-tool-structured" type="button">' +
1696
- '<span class="tool-icon">💬</span>新建结构化会话' +
1749
+ '<span class="tool-icon">' + iconSvg("chat", { size: 16, strokeWidth: 1.8 }) + '</span>新建结构化会话' +
1697
1750
  '</button>' +
1698
1751
  '</div>' +
1699
1752
  '<div class="blank-chat-cwd-wrap">' +
1700
1753
  '<div class="blank-chat-cwd" id="blank-chat-cwd" role="button" tabindex="0" title="点击切换工作目录">' +
1701
- '<span class="blank-chat-cwd-icon">📁</span>' +
1754
+ '<span class="blank-chat-cwd-icon">' + iconSvg("folder", { size: 13, strokeWidth: 1.8 }) + '</span>' +
1702
1755
  '<span class="blank-chat-cwd-path" id="blank-chat-cwd-path">' + escapeHtml(getEffectiveCwd()) + '</span>' +
1703
- '<span class="blank-chat-cwd-arrow" id="blank-chat-cwd-arrow">▼</span>' +
1756
+ '<span class="blank-chat-cwd-arrow" id="blank-chat-cwd-arrow">' + iconSvg("chevronDown", { size: 11, strokeWidth: 2 }) + '</span>' +
1704
1757
  '</div>' +
1705
1758
  '<div class="blank-chat-cwd-dropdown hidden" id="blank-chat-cwd-dropdown"></div>' +
1706
1759
  '</div>' +
@@ -1778,7 +1831,7 @@
1778
1831
  '</span>' +
1779
1832
  '</span>' +
1780
1833
  renderAutoApproveChip(selectedSession) +
1781
- '<button id="terminal-interactive-toggle-top" class="composer-pill composer-pill-chip composer-interactive-toggle' + (state.terminalInteractive ? " active" : "") + '" type="button" title="切换终端交互模式">⌨</button>' +
1834
+ '<button id="terminal-interactive-toggle-top" class="composer-pill composer-pill-chip composer-interactive-toggle' + (state.terminalInteractive ? " active" : "") + '" type="button" title="切换终端交互模式" aria-label="切换终端交互模式">' + iconSvg("keyboard", { size: 13, strokeWidth: 1.7, cls: "composer-pill-icon" }) + '</button>' +
1782
1835
  '<span class="permission-actions hidden" id="permission-actions">' +
1783
1836
  '<span class="permission-actions-divider"></span>' +
1784
1837
  '<span class="permission-actions-label" id="permission-actions-label">等待授权</span>' +
@@ -1813,7 +1866,7 @@
1813
1866
  ? (function() {
1814
1867
  var bits = "";
1815
1868
  if (selectedSession.provider === "claude" && selectedSession.claudeSessionId) {
1816
- bits += '<span id="claude-session-id-badge" class="claude-session-id-badge" data-claude-id="' + escapeHtml(selectedSession.claudeSessionId) + '" title="点击复制 Claude 会话 ID">☁ ' + escapeHtml(selectedSession.claudeSessionId.slice(0, 8)) + '</span>';
1869
+ bits += '<span id="claude-session-id-badge" class="claude-session-id-badge" data-claude-id="' + escapeHtml(selectedSession.claudeSessionId) + '" title="点击复制 Claude 会话 ID">' + iconSvg("cloud", { size: 11, strokeWidth: 1.7, cls: "claude-session-id-icon" }) + '<span class="claude-session-id-text">' + escapeHtml(selectedSession.claudeSessionId.slice(0, 8)) + '</span></span>';
1817
1870
  }
1818
1871
  if (!isStructuredSession(selectedSession) && selectedSession.exitCode !== undefined && selectedSession.exitCode !== null) {
1819
1872
  if (bits) bits += '<span class="session-info-separator">|</span>';
@@ -1834,12 +1887,12 @@
1834
1887
  '</div>' +
1835
1888
  '<div class="modal-body">' +
1836
1889
  '<div class="folder-picker-quick-row">' +
1837
- '<button class="folder-picker-quick-btn" data-path="/tmp">🗑️ 临时目录</button>' +
1838
- '<button class="folder-picker-quick-btn" data-path="/">📁 根目录</button>' +
1890
+ '<button class="folder-picker-quick-btn btn-with-icon" data-path="/tmp">' + iconSvg("trash", { size: 13, strokeWidth: 1.7 }) + '<span>临时目录</span></button>' +
1891
+ '<button class="folder-picker-quick-btn btn-with-icon" data-path="/">' + iconSvg("folder", { size: 13, strokeWidth: 1.7 }) + '<span>根目录</span></button>' +
1839
1892
  '</div>' +
1840
1893
  '<div id="folder-breadcrumb" class="folder-breadcrumb"></div>' +
1841
1894
  '<div class="folder-picker">' +
1842
- '<span class="folder-picker-icon">📁</span>' +
1895
+ '<span class="folder-picker-icon">' + iconSvg("folder", { size: 15, strokeWidth: 1.7 }) + '</span>' +
1843
1896
  '<input type="text" id="folder-picker-input" class="folder-picker-input" value="" placeholder="输入或选择工作目录..." autocomplete="off" />' +
1844
1897
  '</div>' +
1845
1898
  '<div id="folder-picker-dropdown" class="folder-picker-dropdown hidden"></div>' +
@@ -2751,7 +2804,7 @@
2751
2804
  '</div>' +
2752
2805
  '<div class="settings-update-section" id="web-update-section">' +
2753
2806
  '<div class="settings-section-head">' +
2754
- '<span class="settings-section-icon">🌐</span>' +
2807
+ '<span class="settings-section-icon">' + iconSvg("globe", { size: 18, strokeWidth: 1.7 }) + '</span>' +
2755
2808
  '<div class="settings-section-head-text">' +
2756
2809
  '<h4 class="settings-section-heading">Web 端</h4>' +
2757
2810
  '<p class="settings-section-sub">浏览器访问的服务版本</p>' +
@@ -2780,7 +2833,7 @@
2780
2833
  '</div>' +
2781
2834
  '<div class="settings-update-section hidden" id="android-apk-section">' +
2782
2835
  '<div class="settings-section-head">' +
2783
- '<span class="settings-section-icon">📱</span>' +
2836
+ '<span class="settings-section-icon">' + iconSvg("smartphone", { size: 18, strokeWidth: 1.7 }) + '</span>' +
2784
2837
  '<div class="settings-section-head-text">' +
2785
2838
  '<h4 class="settings-section-heading">Android App</h4>' +
2786
2839
  '<p class="settings-section-sub">原生客户端版本与 APK 下载</p>' +
@@ -2814,7 +2867,7 @@
2814
2867
  '</div>' +
2815
2868
  '<div class="settings-update-section hidden" id="macos-dmg-section">' +
2816
2869
  '<div class="settings-section-head">' +
2817
- '<span class="settings-section-icon">🖥️</span>' +
2870
+ '<span class="settings-section-icon">' + iconSvg("desktop", { size: 18, strokeWidth: 1.7 }) + '</span>' +
2818
2871
  '<div class="settings-section-head-text">' +
2819
2872
  '<h4 class="settings-section-heading">macOS App</h4>' +
2820
2873
  '<p class="settings-section-sub">原生客户端版本与 DMG 下载</p>' +
@@ -2848,7 +2901,7 @@
2848
2901
  '</div>' +
2849
2902
  '<div class="settings-update-section" id="android-connect-section">' +
2850
2903
  '<div class="settings-section-head">' +
2851
- '<span class="settings-section-icon">🔗</span>' +
2904
+ '<span class="settings-section-icon">' + iconSvg("link", { size: 18, strokeWidth: 1.7 }) + '</span>' +
2852
2905
  '<div class="settings-section-head-text">' +
2853
2906
  '<h4 class="settings-section-heading">App 连接码</h4>' +
2854
2907
  '<p class="settings-section-sub">粘贴到 Android App 即可自动连接,无需密码;改密码后失效。</p>' +
@@ -2876,7 +2929,7 @@
2876
2929
  '</div>' +
2877
2930
  '<div class="settings-notification-section">' +
2878
2931
  '<div class="settings-section-head">' +
2879
- '<span class="settings-section-icon">🔔</span>' +
2932
+ '<span class="settings-section-icon">' + iconSvg("bell", { size: 18, strokeWidth: 1.7 }) + '</span>' +
2880
2933
  '<div class="settings-section-head-text">' +
2881
2934
  '<h4 class="settings-section-heading">通知偏好</h4>' +
2882
2935
  '<p class="settings-section-sub">提示音与应用内通知气泡</p>' +
@@ -2910,7 +2963,7 @@
2910
2963
  '</div>' +
2911
2964
  '<div id="native-sound-section" class="settings-notification-section hidden">' +
2912
2965
  '<div class="settings-section-head">' +
2913
- '<span class="settings-section-icon">🎵</span>' +
2966
+ '<span class="settings-section-icon">' + iconSvg("music", { size: 18, strokeWidth: 1.7 }) + '</span>' +
2914
2967
  '<div class="settings-section-head-text">' +
2915
2968
  '<h4 class="settings-section-heading">系统通知铃声</h4>' +
2916
2969
  '<p class="settings-section-sub">选择 Android 系统通知使用的铃声</p>' +
@@ -2918,12 +2971,12 @@
2918
2971
  '</div>' +
2919
2972
  '<div class="settings-row-with-action">' +
2920
2973
  '<select id="native-sound-select" class="field-input field-select"></select>' +
2921
- '<button id="native-sound-preview" class="btn btn-secondary btn-sm" type="button">▶ 试听</button>' +
2974
+ '<button id="native-sound-preview" class="btn btn-secondary btn-sm btn-with-icon" type="button">' + iconSvg("play", { size: 11, strokeWidth: 1.8, fill: "currentColor" }) + '<span>试听</span></button>' +
2922
2975
  '</div>' +
2923
2976
  '</div>' +
2924
2977
  '<div id="native-haptic-section" class="settings-notification-section hidden">' +
2925
2978
  '<div class="settings-section-head">' +
2926
- '<span class="settings-section-icon">📳</span>' +
2979
+ '<span class="settings-section-icon">' + iconSvg("vibrate", { size: 18, strokeWidth: 1.7 }) + '</span>' +
2927
2980
  '<div class="settings-section-head-text">' +
2928
2981
  '<h4 class="settings-section-heading">触感反馈</h4>' +
2929
2982
  '<p class="settings-section-sub">按钮操作和任务完成时提供振动反馈</p>' +
@@ -2941,7 +2994,7 @@
2941
2994
  '</div>' +
2942
2995
  '<div class="settings-notification-section">' +
2943
2996
  '<div class="settings-section-head">' +
2944
- '<span class="settings-section-icon">🌐</span>' +
2997
+ '<span class="settings-section-icon">' + iconSvg("globe", { size: 18, strokeWidth: 1.7 }) + '</span>' +
2945
2998
  '<div class="settings-section-head-text">' +
2946
2999
  '<h4 class="settings-section-heading">浏览器通知</h4>' +
2947
3000
  '<p class="settings-section-sub">来自系统通知中心的弹窗</p>' +
@@ -3059,7 +3112,7 @@
3059
3112
  (typeof WandNative !== "undefined" && typeof WandNative.getAppIcon === "function" ?
3060
3113
  '<div class="settings-app-icon-block">' +
3061
3114
  '<div class="settings-section-head">' +
3062
- '<span class="settings-section-icon">🎨</span>' +
3115
+ '<span class="settings-section-icon">' + iconSvg("palette", { size: 18, strokeWidth: 1.7 }) + '</span>' +
3063
3116
  '<div class="settings-section-head-text">' +
3064
3117
  '<h4 class="settings-section-heading">应用图标</h4>' +
3065
3118
  '<p class="settings-section-sub">选择 App 启动器图标,返回桌面后生效</p>' +
@@ -4982,9 +5035,9 @@
4982
5035
  // 新建会话时显示简化的目录选择器(单行紧凑设计)
4983
5036
  return '<div class="folder-picker-compact" id="folder-picker-container">' +
4984
5037
  '<div class="folder-picker-compact-row">' +
4985
- '<span class="folder-picker-compact-icon">📁</span>' +
5038
+ '<span class="folder-picker-compact-icon">' + iconSvg("folder", { size: 13, strokeWidth: 1.7 }) + '</span>' +
4986
5039
  '<input type="text" id="folder-picker-input" class="folder-picker-compact-input" value="' + escapeHtml(currentDir) + '" placeholder="工作目录" autocomplete="off" />' +
4987
- '<button type="button" id="folder-picker-toggle" class="folder-picker-toggle" title="选择目录">▼</button>' +
5040
+ '<button type="button" id="folder-picker-toggle" class="folder-picker-toggle" title="选择目录" aria-label="选择目录">' + iconSvg("chevronDown", { size: 11, strokeWidth: 2 }) + '</button>' +
4988
5041
  '</div>' +
4989
5042
  '<div id="folder-picker-dropdown" class="folder-picker-dropdown hidden">' +
4990
5043
  '<div class="folder-picker-quick-row">' +
@@ -5014,7 +5067,7 @@
5014
5067
  }
5015
5068
 
5016
5069
  return '<div class="working-dir-indicator" id="working-dir-indicator" title="' + escapeHtml(displayDir) + '" data-path="' + escapeHtml(displayDir) + '">' +
5017
- '<span class="working-dir-indicator-icon">📁</span>' +
5070
+ '<span class="working-dir-indicator-icon">' + iconSvg("folder", { size: 12, strokeWidth: 1.7 }) + '</span>' +
5018
5071
  '<span class="working-dir-indicator-path">' + escapeHtml(displayPath) + '</span>' +
5019
5072
  '</div>';
5020
5073
  }
@@ -8417,8 +8470,8 @@
8417
8470
  if (isAutoApproveImpliedByMode(session)) return "";
8418
8471
  var enabled = !!session.autoApprovePermissions;
8419
8472
  return enabled
8420
- ? '<span id="auto-approve-toggle" class="composer-pill composer-pill-chip auto-approve-indicator active" title="自动批准已启用 — 点击关闭">🛡 自动</span>'
8421
- : '<span id="auto-approve-toggle" class="composer-pill composer-pill-chip auto-approve-indicator" title="自动批准已关闭 — 点击开启">🛡 手动</span>';
8473
+ ? '<span id="auto-approve-toggle" class="composer-pill composer-pill-chip auto-approve-indicator active" title="自动批准已启用 — 点击关闭">' + iconSvg("shieldCheck", { size: 12, strokeWidth: 1.7, cls: "composer-pill-icon" }) + '<span class="composer-pill-label">自动</span></span>'
8474
+ : '<span id="auto-approve-toggle" class="composer-pill composer-pill-chip auto-approve-indicator" title="自动批准已关闭 — 点击开启">' + iconSvg("shield", { size: 12, strokeWidth: 1.7, cls: "composer-pill-icon" }) + '<span class="composer-pill-label">手动</span></span>';
8422
8475
  }
8423
8476
 
8424
8477
  function fetchAvailableModels() {
@@ -11478,7 +11531,7 @@
11478
11531
  var a = items[i];
11479
11532
  var thumb = a.previewUrl
11480
11533
  ? '<img src="' + escapeHtml(a.previewUrl) + '" alt="">'
11481
- : '<span class="att-icon">📄</span>';
11534
+ : '<span class="att-icon">' + iconSvg("file", { size: 13, strokeWidth: 1.7 }) + '</span>';
11482
11535
  html += '<span class="attachment-pill" data-index="' + i + '">' +
11483
11536
  thumb +
11484
11537
  '<span class="att-name" title="' + escapeHtml(a.name) + '">' + escapeHtml(a.name) + '</span>' +
@@ -12477,7 +12530,7 @@
12477
12530
  '</button>' +
12478
12531
  '<div class="queue-bar-panel" data-queue-panel="1" role="region" aria-label="排队消息列表">' +
12479
12532
  '<div class="queue-bar-panel-header">' +
12480
- '<span class="queue-bar-panel-title">📥 排队中 (' + count + ')</span>' +
12533
+ '<span class="queue-bar-panel-title">' + iconSvg("inbox", { size: 13, strokeWidth: 1.7, cls: "queue-bar-panel-title-icon" }) + '<span>排队中 (' + count + ')</span></span>' +
12481
12534
  '<button type="button" class="queue-bar-clear" data-action="clear"' +
12482
12535
  (count === 0 ? " disabled" : "") + '>清空</button>' +
12483
12536
  '<button type="button" class="queue-bar-collapse" data-action="collapse" aria-label="收起">' +
@@ -16173,10 +16226,10 @@
16173
16226
  '</span>' +
16174
16227
  '<span class="approval-stats-popup" id="approval-stats-popup">' +
16175
16228
  '<span class="approval-stats-popup-title">自动批准统计</span>' +
16176
- (stats.command > 0 ? '<span class="approval-stats-row"><span class="approval-stats-row-icon">⚡</span><span class="approval-stats-row-label">命令执行</span><span class="approval-stats-row-count">' + stats.command + '</span></span>' : '') +
16177
- (stats.file > 0 ? '<span class="approval-stats-row"><span class="approval-stats-row-icon">📝</span><span class="approval-stats-row-label">文件写入</span><span class="approval-stats-row-count">' + stats.file + '</span></span>' : '') +
16178
- (stats.tool > 0 ? '<span class="approval-stats-row"><span class="approval-stats-row-icon">🔧</span><span class="approval-stats-row-label">其他工具</span><span class="approval-stats-row-count">' + stats.tool + '</span></span>' : '') +
16179
- '<span class="approval-stats-row approval-stats-row-total"><span class="approval-stats-row-icon">∑</span><span class="approval-stats-row-label">合计</span><span class="approval-stats-row-count">' + stats.total + '</span></span>' +
16229
+ (stats.command > 0 ? '<span class="approval-stats-row"><span class="approval-stats-row-icon">' + iconSvg("terminal", { size: 12, strokeWidth: 1.8 }) + '</span><span class="approval-stats-row-label">命令执行</span><span class="approval-stats-row-count">' + stats.command + '</span></span>' : '') +
16230
+ (stats.file > 0 ? '<span class="approval-stats-row"><span class="approval-stats-row-icon">' + iconSvg("edit", { size: 12, strokeWidth: 1.8 }) + '</span><span class="approval-stats-row-label">文件写入</span><span class="approval-stats-row-count">' + stats.file + '</span></span>' : '') +
16231
+ (stats.tool > 0 ? '<span class="approval-stats-row"><span class="approval-stats-row-icon">' + iconSvg("wrench", { size: 12, strokeWidth: 1.8 }) + '</span><span class="approval-stats-row-label">其他工具</span><span class="approval-stats-row-count">' + stats.tool + '</span></span>' : '') +
16232
+ '<span class="approval-stats-row approval-stats-row-total"><span class="approval-stats-row-icon">' + iconSvg("sigma", { size: 12, strokeWidth: 1.8 }) + '</span><span class="approval-stats-row-label">合计</span><span class="approval-stats-row-count">' + stats.total + '</span></span>' +
16180
16233
  '</span>';
16181
16234
  // Pulse animation on the badge
16182
16235
  var badge = container.querySelector(".approval-stats-badge");
@@ -16292,11 +16345,11 @@
16292
16345
  if (enabled) {
16293
16346
  toggle.className = base + " active";
16294
16347
  toggle.title = "自动批准已启用 — 点击关闭";
16295
- toggle.textContent = "🛡 自动";
16348
+ toggle.innerHTML = iconSvg("shieldCheck", { size: 12, strokeWidth: 1.7, cls: "composer-pill-icon" }) + '<span class="composer-pill-label">自动</span>';
16296
16349
  } else {
16297
16350
  toggle.className = base;
16298
16351
  toggle.title = "自动批准已关闭 — 点击开启";
16299
- toggle.textContent = "🛡 手动";
16352
+ toggle.innerHTML = iconSvg("shield", { size: 12, strokeWidth: 1.7, cls: "composer-pill-icon" }) + '<span class="composer-pill-label">手动</span>';
16300
16353
  }
16301
16354
  }
16302
16355
 
@@ -15644,4 +15644,150 @@
15644
15644
  .wand-dialog-footer .btn { flex: 1 1 auto; }
15645
15645
  }
15646
15646
 
15647
+ /* =====================================================================
15648
+ 线性 SVG 图标适配层 —— 把散落各处的 emoji 换成 currentColor SVG 之后,
15649
+ 这里集中处理"原本给文本字号 / line-height 的容器现在塞了一个 svg"
15650
+ 的对齐问题。命名上沿用旧 class,只补尺寸与 flex 居中。
15651
+ ===================================================================== */
15652
+
15653
+ /* 通用:任何 svg 在带 .btn-with-icon 的按钮里都做 inline-flex 8px gap */
15654
+ .btn-with-icon {
15655
+ display: inline-flex;
15656
+ align-items: center;
15657
+ gap: 6px;
15658
+ }
15659
+ .btn-with-icon > svg { flex-shrink: 0; }
15660
+
15661
+ /* composer pill 内的 svg 图标(自动批准 / 终端交互)—— 让 svg 沿基线对齐 */
15662
+ .composer-pill-icon {
15663
+ display: inline-block;
15664
+ vertical-align: -2px;
15665
+ }
15666
+ .composer-pill-label {
15667
+ display: inline-block;
15668
+ letter-spacing: 0.02em;
15669
+ }
15670
+ /* 终端交互按钮里只放 svg —— 撤销原来的字号微调(emoji 时代留下的) */
15671
+ .composer-interactive-toggle {
15672
+ font-size: 0.625rem;
15673
+ padding: 0 8px;
15674
+ min-height: 22px;
15675
+ }
15676
+
15677
+ /* settings section-head 圆角小徽章 —— 现在装 SVG,移除原 font-size */
15678
+ .settings-section-icon {
15679
+ font-size: 0;
15680
+ line-height: 0;
15681
+ }
15682
+ .settings-section-icon > svg { display: block; }
15683
+
15684
+ /* 空白首页 tool button 里的 svg */
15685
+ .blank-chat-tool-btn .tool-icon {
15686
+ display: inline-flex;
15687
+ align-items: center;
15688
+ justify-content: center;
15689
+ width: 18px;
15690
+ height: 18px;
15691
+ font-size: 1.125rem; /* 保留给 tool-icon-text 变体(Codex ⌘ 等) */
15692
+ }
15693
+ .blank-chat-tool-btn .tool-icon > svg { display: block; }
15694
+ .blank-chat-tool-btn .tool-icon-text {
15695
+ width: auto;
15696
+ height: auto;
15697
+ font-family: var(--font-mono);
15698
+ font-size: 1rem;
15699
+ line-height: 1;
15700
+ }
15701
+
15702
+ /* 空白首页 CWD 行的文件夹图标 + 下拉箭头 */
15703
+ .blank-chat-cwd-icon {
15704
+ display: inline-flex;
15705
+ align-items: center;
15706
+ justify-content: center;
15707
+ font-size: 0;
15708
+ line-height: 0;
15709
+ }
15710
+ .blank-chat-cwd-icon > svg { display: block; }
15711
+ .blank-chat-cwd-arrow {
15712
+ display: inline-flex;
15713
+ align-items: center;
15714
+ justify-content: center;
15715
+ font-size: 0;
15716
+ line-height: 0;
15717
+ transition: transform var(--transition-fast);
15718
+ }
15719
+ .blank-chat-cwd-arrow > svg { display: block; }
15720
+
15721
+ /* 文件夹选择器:模态框里 input 前的文件夹图标 + 快捷按钮 */
15722
+ .folder-picker-icon {
15723
+ display: inline-flex;
15724
+ align-items: center;
15725
+ justify-content: center;
15726
+ font-size: 0;
15727
+ line-height: 0;
15728
+ }
15729
+ .folder-picker-icon > svg { display: block; }
15730
+ .folder-picker-quick-btn.btn-with-icon { gap: 5px; }
15731
+
15732
+ /* Claude session id 徽章:icon + text */
15733
+ .claude-session-id-badge {
15734
+ display: inline-flex;
15735
+ align-items: center;
15736
+ gap: 4px;
15737
+ }
15738
+ .claude-session-id-icon { flex-shrink: 0; }
15739
+ .claude-session-id-text { font-family: var(--font-mono); }
15740
+
15741
+ /* 批准统计弹窗的行图标 —— 现在是 svg */
15742
+ .approval-stats-row-icon {
15743
+ display: inline-flex;
15744
+ align-items: center;
15745
+ justify-content: center;
15746
+ width: 14px;
15747
+ height: 14px;
15748
+ font-size: 0;
15749
+ line-height: 0;
15750
+ }
15751
+ .approval-stats-row-icon > svg { display: block; }
15752
+
15753
+ /* 附件 pill 缩略图 svg */
15754
+ .attachment-pill .att-icon > svg { display: block; }
15755
+
15756
+ /* 排队面板标题 (排队中) —— 现在 icon + text 用 inline-flex 排 */
15757
+ .queue-bar-panel-title {
15758
+ display: inline-flex;
15759
+ align-items: center;
15760
+ gap: 5px;
15761
+ }
15762
+ .queue-bar-panel-title-icon { flex-shrink: 0; }
15763
+
15764
+ /* 紧凑目录选择器(新建会话时显示的小条)的图标 + 折叠箭头 */
15765
+ .folder-picker-compact-icon {
15766
+ display: inline-flex;
15767
+ align-items: center;
15768
+ justify-content: center;
15769
+ font-size: 0;
15770
+ line-height: 0;
15771
+ }
15772
+ .folder-picker-compact-icon > svg { display: block; }
15773
+ .folder-picker-toggle {
15774
+ display: inline-flex;
15775
+ align-items: center;
15776
+ justify-content: center;
15777
+ font-size: 0;
15778
+ line-height: 0;
15779
+ }
15780
+ .folder-picker-toggle > svg { display: block; }
15781
+ .folder-picker-toggle.open { transform: rotate(180deg); }
15782
+
15783
+ /* 顶部工作目录指示器的小图标 */
15784
+ .working-dir-indicator-icon {
15785
+ display: inline-flex;
15786
+ align-items: center;
15787
+ justify-content: center;
15788
+ font-size: 0;
15789
+ line-height: 0;
15790
+ }
15791
+ .working-dir-indicator-icon > svg { display: block; }
15792
+
15647
15793
  /* 结束标记 */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@co0ontty/wand",
3
- "version": "1.31.2",
3
+ "version": "1.31.3",
4
4
  "description": "A web terminal for local CLI tools like Claude.",
5
5
  "type": "module",
6
6
  "bin": {