coxpit 5.14.1 → 5.14.2

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/package.json +1 -1
  2. package/src/cockpit.ts +32 -18
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coxpit",
3
- "version": "5.14.1",
3
+ "version": "5.14.2",
4
4
  "description": "Self-hosted cockpit for running a fleet of AI coding agents across your own machines — parallel worktree runs, live board, compare & merge, web terminal, design capture.",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
package/src/cockpit.ts CHANGED
@@ -5,7 +5,7 @@ export const COCKPIT_HTML = /* html */ `<!doctype html>
5
5
  <html lang="en">
6
6
  <head>
7
7
  <meta charset="utf-8" />
8
- <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
8
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover" />
9
9
  <title>coxpit · cockpit</title>
10
10
  <link rel="icon" href="/brand/favicon.ico" sizes="any" />
11
11
  <link rel="icon" type="image/png" sizes="32x32" href="/brand/favicon-32.png" />
@@ -23,9 +23,13 @@ export const COCKPIT_HTML = /* html */ `<!doctype html>
23
23
  --sans:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,Roboto,sans-serif;
24
24
  }
25
25
  *{box-sizing:border-box}
26
- html,body{height:100%}
26
+ /* 모바일 앱처럼 잠금 — 러버밴드·핀치줌 차단(뷰포트 meta user-scalable=no 와 함께).
27
+ body overflow:hidden 이라 앱셸은 스크롤 안 하고, 안쪽 컨테이너(터미널·트리)만 스크롤.
28
+ position:fixed 는 iOS 소프트키보드가 입력바를 가려 회피 — overscroll-behavior:none 으로 충분. */
29
+ html,body{height:100%;overscroll-behavior:none}
27
30
  body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:14px;line-height:1.5;
28
- -webkit-font-smoothing:antialiased;overflow:hidden}
31
+ -webkit-font-smoothing:antialiased;overflow:hidden;overscroll-behavior:none;touch-action:manipulation}
32
+ .term-host .xterm-viewport{overscroll-behavior:contain} /* 터미널 스크롤이 페이지로 안 번지게 */
29
33
  button{font-family:var(--sans)}
30
34
  :focus-visible{outline:2px solid rgba(78,201,176,.5);outline-offset:1px;border-radius:4px}
31
35
 
@@ -250,16 +254,26 @@ export const COCKPIT_HTML = /* html */ `<!doctype html>
250
254
  body.touch .reqbar{display:none}
251
255
  body.touch #splitRow, body.touch #splitCol{display:none}
252
256
  @media (max-width:860px){
253
- header{gap:8px;padding:0 10px}
254
- .brand .wm{font-size:17px}
257
+ /* 모바일 = 아이콘만(텍스트 라벨 숨김) + 폰트 최소화 */
258
+ .b-txt{display:none}
259
+ body{font-size:12px}
260
+ header{gap:6px;padding:0 8px;height:44px}
261
+ .layout{height:calc(100dvh - 44px)}
262
+ .scrim{inset:44px 0 0 0}
263
+ .brand img{height:19px} .brand .wm{font-size:15px;margin-left:0}
255
264
  .mach{display:none}
256
- .vtab{padding:6px 8px;gap:5px}
257
- .menu-btn{display:inline-flex}
265
+ .vtabs{gap:2px} .vtab{padding:6px 8px;gap:0;font-size:12px}
266
+ .toggle{padding:5px 8px;font-size:12px}
267
+ .menu-btn{display:inline-flex;font-size:14px;padding:4px 8px}
258
268
  .layout{grid-template-columns:1fr}
259
- .rail{position:fixed;top:46px;bottom:0;left:0;width:84%;max-width:320px;z-index:40;background:var(--panel);transform:translateX(-100%);transition:transform .18s ease;border-right:1px solid var(--line-hi);box-shadow:2px 0 16px rgba(0,0,0,.4)}
269
+ .rail{position:fixed;top:44px;bottom:0;left:0;width:84%;max-width:300px;z-index:40;background:var(--panel);transform:translateX(-100%);transition:transform .18s ease;border-right:1px solid var(--line-hi);box-shadow:2px 0 16px rgba(0,0,0,.4);font-size:11.5px}
260
270
  .rail.open{transform:translateX(0)}
261
- .tab{max-width:52vw}
271
+ .tabbar{height:34px} .tab{max-width:56vw;font-size:11px;padding:0 8px}
272
+ .tc-btn{font-size:11px;padding:3px 7px}
273
+ .leaf-h{height:24px;font-size:10.5px}
262
274
  .term-ibar{display:flex}
275
+ .tkey{font-size:12px;padding:7px 9px;min-width:38px}
276
+ .tinput input{font-size:15px;padding:8px 10px}
263
277
  }
264
278
  </style>
265
279
  </head>
@@ -269,14 +283,14 @@ export const COCKPIT_HTML = /* html */ `<!doctype html>
269
283
  <a class="brand" href="/"><img src="/brand/mark.png" alt="" /><span class="wm">coxpit</span></a>
270
284
  <span class="mach"><span class="dot"></span><span id="mach">local</span></span>
271
285
  <div class="vtabs">
272
- <button type="button" class="vtab on" id="vtTerm"><span class="g">⌗</span>Terminal</button>
273
- <button type="button" class="vtab" id="vtReview"><span class="g">⧉</span>Review</button>
274
- <button type="button" class="vtab" disabled title="Docs = 보드"><span class="g">▤</span>Docs</button>
286
+ <button type="button" class="vtab on" id="vtTerm"><span class="g">⌗</span><span class="b-txt">Terminal</span></button>
287
+ <button type="button" class="vtab" id="vtReview"><span class="g">⧉</span><span class="b-txt">Review</span></button>
288
+ <button type="button" class="vtab" disabled title="Docs = 보드"><span class="g">▤</span><span class="b-txt">Docs</span></button>
275
289
  </div>
276
290
  <div class="right">
277
- <span class="ws" id="ws"><span class="dot"></span><span id="wstext">connecting</span></span>
278
- <button type="button" class="toggle" id="secretsBtn" title="시크릿(API 키) 관리 — 세션에 env 로 주입">🔑 Secrets</button>
279
- <a class="toggle" href="/" title="보드(모니터) 뷰로">← Board</a>
291
+ <span class="ws" id="ws"><span class="dot"></span><span id="wstext" class="b-txt">connecting</span></span>
292
+ <button type="button" class="toggle" id="secretsBtn" title="시크릿(API 키) 관리 — 세션에 env 로 주입">🔑<span class="b-txt"> Secrets</span></button>
293
+ <a class="toggle" href="/" title="보드(모니터) 뷰로">←<span class="b-txt"> Board</span></a>
280
294
  </div>
281
295
  </header>
282
296
 
@@ -294,8 +308,8 @@ export const COCKPIT_HTML = /* html */ `<!doctype html>
294
308
  <div class="tabctl">
295
309
  <button class="tc-btn" id="splitRow" title="세로 분할 — 포커스 페인을 좌우로" disabled>▐ split</button>
296
310
  <button class="tc-btn" id="splitCol" title="가로 분할 — 포커스 페인을 상하로" disabled>▬ split</button>
297
- <button class="tc-btn session" id="sessionBtn" title="자유 세션(폴더 지정 터미널) 열기">+ Session</button>
298
- <button class="tc-btn" id="closeBtn" title="포커스 페인 닫기(탭은 유지)" disabled pane</button>
311
+ <button class="tc-btn session" id="sessionBtn" title="자유 세션(폴더 지정 터미널) 열기">+<span class="b-txt"> Session</span></button>
312
+ <button class="tc-btn" id="closeBtn" title="포커스 페인 닫기(탭은 유지)" disabled>×<span class="b-txt"> pane</span></button>
299
313
  </div>
300
314
  </div>
301
315
  <div class="panes" id="panes"></div>
@@ -552,7 +566,7 @@ export const COCKPIT_HTML = /* html */ `<!doctype html>
552
566
  var host=document.createElement('div'); host.className='term-host';
553
567
  var term=new window.Terminal({
554
568
  fontFamily: "ui-monospace, 'SF Mono', Menlo, Monaco, 'Apple SD Gothic Neo', 'Noto Sans KR', monospace",
555
- fontSize: 12, cursorBlink: true, allowProposedApi: true, scrollback: 4000,
569
+ fontSize: isMobile() ? 11 : 12, cursorBlink: true, allowProposedApi: true, scrollback: 4000,
556
570
  theme: { background:'#0b0d12', foreground:'#dee4ec', cursor:'#4ec9b0', selectionBackground:'rgba(78,201,176,.25)', black:'#1c212c', brightBlack:'#5c6675' },
557
571
  });
558
572
  var fit=new window.FitAddon.FitAddon(); term.loadAddon(fit);