diff --git a/src/server/team.ts b/src/server/team.ts index 38d61b4..b49a8fb 100644 --- a/src/server/team.ts +++ b/src/server/team.ts @@ -151,11 +151,12 @@ export function renderTeamHtml(cwd: string): string { .chart { position: relative; display: inline-flex; min-width: 100%; justify-content: center; padding: 12px 24px 40px; } .edges { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; z-index: 0; overflow: visible; } .subtree { position: relative; z-index: 1; display: inline-flex; flex-direction: column; align-items: center; } - .children { display: flex; flex-direction: row; align-items: flex-start; justify-content: center; gap: 13px; margin-top: 40px; } + .children { display: flex; flex-direction: row; align-items: flex-start; justify-content: center; gap: 11px; margin-top: 42px; } .node { position: relative; - width: 176px; + width: 168px; + overflow: hidden; background: linear-gradient(180deg, rgba(255,255,255,.02), rgba(0,0,0,.10)), var(--surface); border: 1px solid var(--border); border-radius: 14px; @@ -171,7 +172,7 @@ export function renderTeamHtml(cwd: string): string { .node-id { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; } .node-name { font-weight: 700; font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; outline: none; border-radius: 4px; } .node-name[contenteditable="true"] { background: rgba(88,166,255,.12); box-shadow: 0 0 0 1px rgba(88,166,255,.5); padding: 0 4px; cursor: text; } - .node-role { font: 10.5px/1.2 var(--font-mono); color: var(--muted); white-space: nowrap; text-transform: uppercase; letter-spacing: .04em; } + .node-role { display: block; max-width: 100%; font: 10.5px/1.2 var(--font-mono); color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-transform: uppercase; letter-spacing: .04em; } .node-model { text-transform: none; letter-spacing: 0; } .node-badge { margin-left: auto; align-self: flex-start; font: 700 9px/1 var(--font-mono); text-transform: uppercase; letter-spacing: .06em; padding: 3px 6px; border-radius: 999px; } @@ -254,9 +255,12 @@ export function renderTeamHtml(cwd: string): string { if (!parent) return; parentOf[n.getAttribute('data-node-id')] = pid; var s = centerBottom(parent, box), e = centerTop(n, box); - var midY = s.y + (e.y - s.y) * 0.5; - var fwd = 'M ' + s.x + ' ' + s.y + ' C ' + s.x + ' ' + midY + ', ' + e.x + ' ' + midY + ', ' + e.x + ' ' + e.y; - var rev = 'M ' + e.x + ' ' + e.y + ' C ' + e.x + ' ' + midY + ', ' + s.x + ' ' + midY + ', ' + s.x + ' ' + s.y; + // Sharp org-chart elbow: down from the parent to the shared bus, across, down to the child. + // Siblings share the same top Y, so their bus Y matches → one clean horizontal bus. + var busY = Math.round(s.y + (e.y - s.y) * 0.5); + var sx = Math.round(s.x), ex = Math.round(e.x); + var fwd = 'M ' + sx + ' ' + Math.round(s.y) + ' L ' + sx + ' ' + busY + ' L ' + ex + ' ' + busY + ' L ' + ex + ' ' + Math.round(e.y); + var rev = 'M ' + ex + ' ' + Math.round(e.y) + ' L ' + ex + ' ' + busY + ' L ' + sx + ' ' + busY + ' L ' + sx + ' ' + Math.round(s.y); edgeMap[n.getAttribute('data-node-id')] = { fwd: fwd, rev: rev }; var base = document.createElementNS(NS, 'path'); base.setAttribute('class', 'edge-base'); base.setAttribute('d', fwd);