@wendongfly/myhi 1.3.173 → 1.3.174

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.
Files changed (2) hide show
  1. package/dist/chat.html +62 -17
  2. package/package.json +1 -1
package/dist/chat.html CHANGED
@@ -220,7 +220,10 @@
220
220
  background: var(--surface); border: 1px solid var(--border); color: var(--muted);
221
221
  font-size: 0.95rem; cursor: pointer; display: none; align-items: center; justify-content: center;
222
222
  box-shadow: 0 2px 8px rgba(0,0,0,0.35);
223
+ opacity: 0; pointer-events: none; transition: opacity 0.2s; /* 桌面端:鼠标移进聊天区才现身 */
223
224
  }
225
+ #msg-nav-btn.hovered { opacity: 1; pointer-events: auto; }
226
+ @media (pointer: coarse) { #msg-nav-btn { opacity: 1; pointer-events: auto; } } /* 触屏没有 hover,常显 */
224
227
  #msg-nav-btn:hover { color: var(--text); border-color: var(--blue); }
225
228
  #msg-nav-panel {
226
229
  position: fixed; right: 0.5rem; bottom: 11.8rem; z-index: 60; display: none;
@@ -284,11 +287,18 @@
284
287
  /* ── 设置面板 ───────────────────────────── */
285
288
  #settings-backdrop { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.5); z-index: 60; }
286
289
  #settings-backdrop.open { display: block; }
287
- #settings-panel { position: fixed; top: 0; right: -320px; width: 300px; max-width: 85vw; height: 100%; background: var(--surface); border-left: 1px solid var(--border); z-index: 61; transition: right 0.25s ease; overflow-y: auto; padding: 1rem; }
290
+ #settings-panel { position: fixed; top: 0; right: -360px; width: 340px; max-width: 92vw; height: 100%; background: var(--surface); border-left: 1px solid var(--border); z-index: 61; transition: right 0.25s ease; overflow-y: auto; padding: 1rem; }
288
291
  #settings-panel.open { right: 0; }
289
- .panel-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; font-size: 1rem; font-weight: 600; }
292
+ .panel-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.6rem; font-size: 1rem; font-weight: 600; }
290
293
  .panel-close { background: none; border: none; color: var(--muted); font-size: 1.2rem; cursor: pointer; }
291
- .setting-group { margin-bottom: 1.2rem; }
294
+ /* 设置抽屉分类页签:一屏只看一类,不再长条堆叠(1.3.174 用户反馈太拥挤) */
295
+ #settings-tabs { display: flex; gap: 0.25rem; margin-bottom: 0.9rem; border-bottom: 1px solid var(--border); padding-bottom: 0.4rem; }
296
+ #settings-tabs .stab {
297
+ flex: 1; background: none; border: none; color: var(--muted);
298
+ font-size: 0.8rem; padding: 0.35rem 0.2rem; border-radius: 7px; cursor: pointer; white-space: nowrap;
299
+ }
300
+ #settings-tabs .stab.active { background: var(--surface3); color: var(--text); font-weight: 600; }
301
+ .setting-group { margin-bottom: 1rem; }
292
302
  .setting-group h4 { font-size: 0.75rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 0.5rem; }
293
303
  .setting-toggle { display: flex; justify-content: space-between; align-items: center; padding: 0.5rem 0; font-size: 0.85rem; cursor: pointer; }
294
304
  .seg-row { display: flex; gap: 0.35rem; flex-wrap: wrap; }
@@ -531,6 +541,7 @@
531
541
  </div>
532
542
  <div id="sk-claude-agent" style="display:none">
533
543
  <button class="sk sk-claude" id="sk-inbox" data-sk="draft" onclick="openInboxSheet()" style="color:var(--yellow)">📥 草稿<span id="inbox-badge" style="display:none;margin-left:0.2rem;background:var(--yellow);color:#000;border-radius:8px;padding:0 0.32rem;font-size:0.66rem;font-weight:700"></span></button>
544
+ <button class="sk sk-claude" data-sk="folder" onclick="fpOpenFolder()" style="color:var(--blue2)">📂 文件夹</button>
534
545
  <button class="sk sk-claude" data-sk="model" onclick="openModelSheet()">模型</button>
535
546
  <button class="sk sk-claude" id="btn-plan" data-sk="plan" onclick="togglePlanMode()">计划</button>
536
547
  <button class="sk sk-claude" data-sk="compact" onclick="doSlashCmd('/compact')">压缩</button>
@@ -585,8 +596,13 @@
585
596
  <div id="settings-backdrop" onclick="closeSettings()"></div>
586
597
  <div id="settings-panel">
587
598
  <div class="panel-header"><span>设置</span><button class="panel-close" onclick="closeSettings()">✕</button></div>
588
- <div class="setting-group">
589
- <h4>外观</h4>
599
+ <div id="settings-tabs">
600
+ <button class="stab active" data-tab="look">外观</button>
601
+ <button class="stab" data-tab="chat">聊天</button>
602
+ <button class="stab" data-tab="bar">快捷栏</button>
603
+ <button class="stab" data-tab="more">更多</button>
604
+ </div>
605
+ <div class="setting-group" data-stab="look">
590
606
  <div style="font-size:0.8rem;color:var(--text2);margin:0.1rem 0 0.35rem">主题</div>
591
607
  <div id="seg-theme" class="seg-row">
592
608
  <button class="seg" data-theme="system">跟随系统</button>
@@ -601,14 +617,14 @@
601
617
  <button class="seg" data-font="large">大</button>
602
618
  </div>
603
619
  </div>
604
- <div class="setting-group">
620
+ <div class="setting-group" data-stab="chat" style="display:none">
605
621
  <h4>显示</h4>
606
622
  <label class="setting-toggle"><span>解析终端输出</span><input type="checkbox" id="set-parse" checked></label>
607
623
  <label class="setting-toggle"><span>显示思考过程</span><input type="checkbox" id="set-thinking" checked></label>
608
624
  <label class="setting-toggle"><span>工具调用默认折叠</span><input type="checkbox" id="set-collapse" checked></label>
609
625
  <label class="setting-toggle"><span>思考过程默认折叠</span><input type="checkbox" id="set-thinkcollapse" checked></label>
610
626
  </div>
611
- <div class="setting-group">
627
+ <div class="setting-group" data-stab="chat" style="display:none">
612
628
  <h4>输入</h4>
613
629
  <div style="font-size:0.8rem;color:var(--text2);margin:0.1rem 0 0.35rem">回车键</div>
614
630
  <div id="seg-enter" class="seg-row">
@@ -620,18 +636,17 @@
620
636
  自动:电脑回车发送 / Shift+回车换行;手机回车换行、用按钮发送。<br>发送:回车总是发送(换行用 Shift+回车)。换行:回车总是换行(发送用 Ctrl/⌘+回车 或按钮)。
621
637
  </div>
622
638
  </div>
623
- <div class="setting-group">
624
- <h4>快捷栏</h4>
639
+ <div class="setting-group" data-stab="bar" style="display:none">
625
640
  <div id="seg-skmode" class="seg-row">
626
- <button class="seg" data-skmode="normal">普通</button>
627
- <button class="seg" data-skmode="expert">专家</button>
641
+ <button class="seg" data-skmode="normal">普通模式</button>
642
+ <button class="seg" data-skmode="expert">专家模式</button>
628
643
  </div>
629
644
  <div style="font-size:0.72rem;color:var(--muted);margin-top:0.35rem;line-height:1.5">
630
- 专家 = 显示全部快捷按钮(默认)。普通 = 只显示下面勾选的,给简单用户减负。
645
+ 专家 = 显示全部快捷按钮。普通 = 只显示下面勾选的,给简单用户减负。两种模式下都可以再单独勾选。
631
646
  </div>
632
647
  <div id="sk-visible-list" style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:0.15rem 0.6rem;margin-top:0.5rem"></div>
633
648
  </div>
634
- <div class="setting-group">
649
+ <div class="setting-group" data-stab="more" style="display:none">
635
650
  <h4>语音识别 (ASR)</h4>
636
651
  <div style="font-size:0.72rem;color:var(--muted);margin-bottom:0.35rem">SenseVoice 或兼容服务的地址,留空表示禁用语音</div>
637
652
  <div style="display:flex;gap:0.4rem">
@@ -640,7 +655,7 @@
640
655
  </div>
641
656
  <div id="set-asr-status" style="font-size:0.72rem;min-height:1.2em;margin-top:0.25rem;color:var(--muted)"></div>
642
657
  </div>
643
- <div class="setting-group">
658
+ <div class="setting-group" data-stab="more" style="display:none">
644
659
  <h4>服务管理</h4>
645
660
  <button onclick="restartMyhi()" style="width:100%;padding:0.6rem;background:var(--red2);color:#fff;border:none;border-radius:8px;cursor:pointer;font-size:0.85rem;font-weight:600;margin-top:0.1rem">重启 myhi</button>
646
661
  </div>
@@ -1169,8 +1184,8 @@
1169
1184
 
1170
1185
  // 设置
1171
1186
  // 快捷栏:skVisible 逐按钮勾选(唯一显隐依据,null=默认全显);skMode 仅记录最接近的预设(高亮用)
1172
- const SK_LABELS = { draft:'📥 草稿', model:'模型', plan:'计划', compact:'压缩', resume:'恢复', clear:'清除', secrets:'🔑 密钥', guard:'🛡 护栏', followup:'🔄 跟进', git:'提交', memory:'记忆', skills:'技能', cost:'费用' };
1173
- const SK_NORMAL_PRESET = ['draft', 'plan', 'clear', 'guard', 'memory', 'skills'];
1187
+ const SK_LABELS = { draft:'📥 草稿', folder:'📂 文件夹', model:'模型', plan:'计划', compact:'压缩', resume:'恢复', clear:'清除', secrets:'🔑 密钥', guard:'🛡 护栏', followup:'🔄 跟进', git:'提交', memory:'记忆', skills:'技能', cost:'费用' };
1188
+ const SK_NORMAL_PRESET = ['draft', 'folder', 'plan', 'clear', 'guard', 'memory', 'skills'];
1174
1189
  const DEFAULT_SETTINGS = { parseOutput: true, showThinking: true, collapseTools: true, thinkCollapsed: true, enterMode: 'auto', skMode: null, skVisible: null };
1175
1190
  let settings = loadSettings();
1176
1191
 
@@ -2369,6 +2384,27 @@
2369
2384
  renderMsgNav();
2370
2385
  p.style.display = 'block';
2371
2386
  }
2387
+ // 桌面端:鼠标移进聊天区/把手/清单 → 显示把手;离开 → 延迟 350ms 收起
2388
+ // (清单开着时不收把手,方便看着清单滚动定位)。触屏设备无常显(见 CSS)。
2389
+ let _navHideTimer = null;
2390
+ function navShow() { clearTimeout(_navHideTimer); document.getElementById('msg-nav-btn').classList.add('hovered'); }
2391
+ function navHideLater() {
2392
+ clearTimeout(_navHideTimer);
2393
+ _navHideTimer = setTimeout(() => {
2394
+ if (document.getElementById('msg-nav-panel').style.display === 'block') return;
2395
+ document.getElementById('msg-nav-btn').classList.remove('hovered');
2396
+ }, 350);
2397
+ }
2398
+ ['mouseenter'].forEach(ev => {
2399
+ chatArea.addEventListener(ev, navShow);
2400
+ document.getElementById('msg-nav-btn').addEventListener(ev, navShow);
2401
+ document.getElementById('msg-nav-panel').addEventListener(ev, navShow);
2402
+ });
2403
+ ['mouseleave'].forEach(ev => {
2404
+ chatArea.addEventListener(ev, navHideLater);
2405
+ document.getElementById('msg-nav-btn').addEventListener(ev, navHideLater);
2406
+ document.getElementById('msg-nav-panel').addEventListener(ev, navHideLater);
2407
+ });
2372
2408
  function renderMsgNav() {
2373
2409
  const list = document.getElementById('msg-nav-panel');
2374
2410
  const items = [...chatArea.querySelectorAll('.msg-input .bubble')]
@@ -3250,7 +3286,16 @@
3250
3286
  }
3251
3287
 
3252
3288
  // ── 设置面板 ──────────────────────────────────
3253
- window.openSettings = function() { document.getElementById('settings-backdrop').classList.add('open'); document.getElementById('settings-panel').classList.add('open'); syncSettingsUI(); };
3289
+ window.openSettings = function() { document.getElementById('settings-backdrop').classList.add('open'); document.getElementById('settings-panel').classList.add('open'); syncSettingsUI(); applySettingsTab(localStorage.getItem('myhi_settings_tab') || 'look'); };
3290
+ // 设置抽屉分类页签(1.3.174:一屏只看一类,不再长条堆叠)
3291
+ function applySettingsTab(tab) {
3292
+ document.querySelectorAll('#settings-tabs .stab').forEach(b => b.classList.toggle('active', b.dataset.tab === tab));
3293
+ document.querySelectorAll('#settings-panel [data-stab]').forEach(g => { g.style.display = g.dataset.stab === tab ? '' : 'none'; });
3294
+ }
3295
+ document.querySelectorAll('#settings-tabs .stab').forEach(b => b.addEventListener('click', () => {
3296
+ localStorage.setItem('myhi_settings_tab', b.dataset.tab);
3297
+ applySettingsTab(b.dataset.tab);
3298
+ }));
3254
3299
  window.closeSettings = function() { document.getElementById('settings-backdrop').classList.remove('open'); document.getElementById('settings-panel').classList.remove('open'); };
3255
3300
 
3256
3301
  // ── 文件管理 ──────────────────────────────────
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wendongfly/myhi",
3
- "version": "1.3.173",
3
+ "version": "1.3.174",
4
4
  "description": "Web-based terminal sharing with chat UI — control your terminal from phone via LAN/Tailscale",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",