agent-loft 0.2.36 → 0.2.37

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-loft",
3
- "version": "0.2.36",
3
+ "version": "0.2.37",
4
4
  "type": "module",
5
5
  "description": "多个 agent 的工作台:把本机 Claude Code / Codex 放到一处统一管理,用飞书和 Web 页面随时驱动——会话、审批、模型切换都共用",
6
6
  "keywords": [
@@ -53,6 +53,17 @@
53
53
  }
54
54
  }
55
55
 
56
+ /* 顶栏下沿的渐变、模糊是给滚动的聊天内容用的:远程控制页下面是工具栏,会被它盖住一截 */
57
+ .main.remote-view .topbar {
58
+ padding-bottom: 8px;
59
+ background: var(--bg);
60
+ }
61
+
62
+ .main.remote-view .topbar::before,
63
+ .main.remote-view .topbar::after {
64
+ display: none;
65
+ }
66
+
56
67
  .remote-head {
57
68
  display: flex;
58
69
  align-items: center;
@@ -313,18 +324,48 @@
313
324
  opacity: 0.4;
314
325
  }
315
326
 
316
- /* 浏览器全屏时只剩画面 */
317
- .remote-body:fullscreen .desk-status {
327
+ /* 全屏时只剩画面 */
328
+ .remote-body.full .desk-status {
318
329
  display: none;
319
330
  }
320
331
 
321
- /* 不支持元素全屏(iPhone):铺满整个页面,盖住顶栏、侧栏,弹窗和提示还在上面 */
332
+ /* 不支持元素全屏(iPhone):铺满整个页面,盖住顶栏、侧栏,弹窗和提示还在上面。
333
+ 左右不留安全区:画面本来就居中、两边是黑边,刘海落在黑边里 */
322
334
  .remote-body.desk-full {
323
335
  position: fixed;
324
336
  inset: 0;
325
337
  z-index: 35;
326
338
  background: #111;
327
- padding: env(safe-area-inset-top) env(safe-area-inset-right) calc(env(safe-area-inset-bottom) + var(--kb-inset, 0px)) env(safe-area-inset-left);
339
+ padding: env(safe-area-inset-top) 0 var(--kb-inset, 0px);
340
+ }
341
+
342
+ /* 全屏时下面那排键默认收起,左上角的按钮拉出来;拉出来时是深色、矮一点的一条 */
343
+ .remote-body.full .desk-keys {
344
+ padding: 4px max(8px, env(safe-area-inset-left)) calc(4px + env(safe-area-inset-bottom)) max(8px, env(safe-area-inset-right));
345
+ border-top: none;
346
+ background: #111;
347
+ }
348
+
349
+ .remote-body.full:not(.keys-open) .desk-keys {
350
+ display: none;
351
+ }
352
+
353
+ /* 有软键盘垫着时不用再让出底部安全区 */
354
+ .remote-body.desk-full .desk-keys {
355
+ padding-bottom: calc(4px + max(0px, env(safe-area-inset-bottom) - var(--kb-inset, 0px)));
356
+ }
357
+
358
+ .remote-body.full .desk-keys .term-key {
359
+ height: 30px;
360
+ border-color: #333;
361
+ background: #262626;
362
+ color: #eee;
363
+ }
364
+
365
+ .remote-body.full .desk-keys .term-key.on {
366
+ background: var(--accent);
367
+ border-color: var(--accent);
368
+ color: var(--accent-fg);
328
369
  }
329
370
 
330
371
  /* 没连着时画面中间的「连接桌面」 */
@@ -341,7 +382,7 @@
341
382
  }
342
383
 
343
384
  .desk-idle[hidden],
344
- .desk-exitfull[hidden] {
385
+ .desk-fbtn[hidden] {
345
386
  display: none;
346
387
  }
347
388
 
@@ -362,12 +403,26 @@
362
403
  height: 16px;
363
404
  }
364
405
 
365
- /* 全屏时左上角「退出全屏」 */
366
- .desk-exitfull {
406
+ /* 全屏时左上角「退出全屏」「按键」 */
407
+ .desk-fullbar {
367
408
  position: absolute;
368
- left: 10px;
409
+ left: max(10px, env(safe-area-inset-left));
369
410
  top: 10px;
370
411
  z-index: 3;
412
+ display: flex;
413
+ gap: 8px;
414
+ }
415
+
416
+ .desk-fullbar[hidden] {
417
+ display: none;
418
+ }
419
+
420
+ .desk-fbtn.on {
421
+ background: var(--accent);
422
+ color: var(--accent-fg);
423
+ }
424
+
425
+ .desk-fbtn {
371
426
  display: grid;
372
427
  place-items: center;
373
428
  width: 34px;
@@ -378,7 +433,7 @@
378
433
  color: #fff;
379
434
  }
380
435
 
381
- .desk-exitfull svg {
436
+ .desk-fbtn svg {
382
437
  width: 18px;
383
438
  height: 18px;
384
439
  }
@@ -57,8 +57,12 @@ export function showDesktop(pane, tools) {
57
57
  h("div", { class: "muted" }, "远程桌面未连接"),
58
58
  h("button", { class: "btn primary", onclick: reconnect }, icon("plug"), "连接桌面"),
59
59
  );
60
- D.exitFull = h("button", { class: "desk-exitfull", hidden: true, title: "退出全屏", "aria-label": "退出全屏", onclick: () => setFull(false) }, icon("shrink"));
61
- D.viewport = h("div", { class: "desk-viewport" }, D.screen, D.zoomBadge, D.hint, D.idle, D.exitFull);
60
+ D.keysBtn = isTouch
61
+ ? h("button", { class: "desk-fbtn", title: "按键", "aria-label": "按键", onclick: () => toggleFullKeys() }, icon("keyboard"))
62
+ : null;
63
+ D.exitFull = h("button", { class: "desk-fbtn", title: "退出全屏", "aria-label": "退出全屏", onclick: () => setFull(false) }, icon("shrink"));
64
+ D.fullBar = h("div", { class: "desk-fullbar", hidden: true }, D.exitFull, D.keysBtn);
65
+ D.viewport = h("div", { class: "desk-viewport" }, D.screen, D.zoomBadge, D.hint, D.idle, D.fullBar);
62
66
  D.keyInput = isTouch ? mobileKeyInput() : null;
63
67
  D.keyRow = isTouch ? keyRow() : null;
64
68
  fill(pane, D.status, D.viewport, D.keyRow, D.keyInput);
@@ -104,6 +108,8 @@ async function connect() {
104
108
  rfb.resizeSession = false;
105
109
  rfb.viewOnly = D.viewOnly;
106
110
  rfb.showDotCursor = true;
111
+ // 画面没铺满时的边:和外框一个颜色,别再多出一圈灰
112
+ rfb.background = "#111";
107
113
  rfb.qualityLevel = 6;
108
114
  rfb.compressionLevel = 2;
109
115
  rfb.addEventListener("connect", () => {
@@ -282,11 +288,25 @@ function setFull(on) {
282
288
  syncFull();
283
289
  }
284
290
 
285
- /** 全屏时画面上一个「退出全屏」(手机上没有 Esc;真全屏在电脑上按 Esc 就行,不显示) */
291
+ /**
292
+ * 全屏时画面左上角「退出全屏」(手机上没有 Esc;真全屏在电脑上按 Esc 就行,不显示)。
293
+ * 手机上全屏时下面那排键先收起来,左上角的「按键」拉出来
294
+ */
286
295
  function syncFull() {
287
296
  if (!D.pane) return;
288
297
  const pseudo = D.pane.classList.contains("desk-full");
289
- D.exitFull.hidden = !(pseudo || (isTouch && fsElement() === D.pane));
298
+ const full = pseudo || fsElement() === D.pane;
299
+ if (full !== D.pane.classList.contains("full")) {
300
+ D.pane.classList.toggle("full", full);
301
+ toggleFullKeys(false);
302
+ }
303
+ D.fullBar.hidden = !(pseudo || (isTouch && full));
304
+ }
305
+
306
+ function toggleFullKeys(open = !D.pane.classList.contains("keys-open")) {
307
+ D.pane.classList.toggle("keys-open", open);
308
+ D.keysBtn?.classList.toggle("on", open);
309
+ if (!open && document.activeElement === D.keyInput) D.keyInput.blur();
290
310
  }
291
311
  document.addEventListener("fullscreenchange", syncFull);
292
312
  document.addEventListener("webkitfullscreenchange", syncFull);