coxpit 5.0.1 → 5.0.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/board.ts +9 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coxpit",
3
- "version": "5.0.1",
3
+ "version": "5.0.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": "MIT",
package/src/board.ts CHANGED
@@ -58,7 +58,10 @@ export const BOARD_HTML = /* html */ `<!doctype html>
58
58
  .mdot.on{background:var(--s-done)}
59
59
 
60
60
  /* ── layout ─────────────────────────────── */
61
- .layout{display:grid;grid-template-columns:318px 1fr;min-height:calc(100vh - 55px)}
61
+ /* fixed viewport height so the rail stays put and each column scrolls on its own
62
+ (the board grew tall with many cards and dragged the rail's + New below the fold) */
63
+ .layout{display:grid;grid-template-columns:318px 1fr;height:calc(100vh - 55px);overflow:hidden}
64
+ .layout > aside,.layout > main{min-height:0}
62
65
  aside{border-right:1px solid var(--line);padding:20px 18px;background:var(--surface);
63
66
  display:flex;flex-direction:column;gap:26px}
64
67
  main{padding:20px;overflow:auto}
@@ -138,7 +141,7 @@ export const BOARD_HTML = /* html */ `<!doctype html>
138
141
  /* rail repo-row actions — icon-ghost, never white: transparent bg · muted icon · hover ink + surface */
139
142
  #repoList .repo .rmbtn{background:transparent;border:1px solid transparent;color:var(--muted);cursor:pointer;
140
143
  padding:3px;display:inline-flex;border-radius:6px;transition:color .15s,background .15s,border-color .15s}
141
- #repoList .repo .rmbtn:hover{color:var(--ink);background:var(--surface);border-color:var(--line-hi)}
144
+ #repoList .repo .rmbtn:hover{color:var(--ink);background:var(--surface2)}
142
145
  #repoList .repo .rmbtn .ic{width:13px;height:13px;color:inherit}
143
146
  .navi{display:flex;align-items:center;gap:9px;padding:7px 10px;border-radius:8px;color:var(--muted);
144
147
  cursor:pointer;font-size:13px;border:none;background:transparent;width:100%;text-align:left;font-family:var(--sans)}
@@ -221,7 +224,8 @@ export const BOARD_HTML = /* html */ `<!doctype html>
221
224
  .dd-btn:hover{border-color:var(--line-hi)}
222
225
  .dd.open .dd-btn{border-color:rgba(78,201,176,.55)}
223
226
  .dd-lbl{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
224
- .dd-car{color:var(--faint);font-size:10px;transition:transform .15s}
227
+ .dd-car{color:var(--faint);display:inline-flex;align-items:center;transition:transform .15s}
228
+ .dd-car .ic{width:13px;height:13px}
225
229
  .dd.open .dd-car{transform:rotate(180deg)}
226
230
  .dd-panel{position:absolute;top:calc(100% + 5px);left:0;right:0;z-index:40;background:var(--surface2);
227
231
  border:1px solid var(--line-hi);border-radius:9px;box-shadow:var(--shadow);max-height:230px;
@@ -710,7 +714,7 @@ export const BOARD_HTML = /* html */ `<!doctype html>
710
714
  .menu-btn{display:none;font-size:15px;padding:5px 10px}
711
715
  .scrim{position:fixed;inset:0;top:54px;background:rgba(5,7,10,.5);z-index:29;display:none}
712
716
  @media (max-width:860px){
713
- .layout{grid-template-columns:1fr;min-height:calc(100dvh - 55px)}
717
+ .layout{grid-template-columns:1fr;height:calc(100dvh - 55px)}
714
718
  /* 사이드바 = 오프캔버스 드로어 — 플릿이 첫 화면, 런처는 ☰ 뒤에 */
715
719
  .menu-btn{display:inline-flex}
716
720
  aside{position:fixed;top:54px;bottom:0;left:0;width:min(86vw,340px);max-width:100vw;z-index:30;
@@ -1199,7 +1203,7 @@ function dressSelect(id){
1199
1203
  const sel = $(id); if(!sel || sel.dataset.dd) return;
1200
1204
  sel.dataset.dd = '1';
1201
1205
  const dd = document.createElement('div'); dd.className = 'dd';
1202
- dd.innerHTML = '<button type="button" class="dd-btn"><span class="dd-lbl"></span><span class="dd-car">▾</span></button><div class="dd-panel"></div>';
1206
+ dd.innerHTML = '<button type="button" class="dd-btn"><span class="dd-lbl"></span><span class="dd-car"><svg class="ic"><use href="#i-chevron-down"/></svg></span></button><div class="dd-panel"></div>';
1203
1207
  sel.parentNode.insertBefore(dd, sel);
1204
1208
  sel.style.display = 'none';
1205
1209
  dd.querySelector('.dd-btn').addEventListener('click', (e)=>{