feat(tasks-ui): readability pass, height-budget fix and leftover sweep

The native port is finished off with the readability work the earlier rounds
left open, plus the cleanup of everything the shadcn era or the older canvas
left behind.

- Geometry: node height is now composed from named parts (chrome, two title
  lines, meta row) and per-node extras, so a teammate card that carries a task
  line no longer gets clipped by the old fixed 68px budget; the layout spec
  follows the new model and GRAPH_ROW_STRIDE stays exported for it.
- Readability: row rhythm (28-32px), three ink levels for title/meta/owner,
  truncation with title hints, current-row and hover expressed as an accent bar
  plus a hover fill (no shadows), phase frames and edges back on the l1/l2
  hairlines, control cluster uniformly 28px, drawer durations on tabular
  figures, kill action revealed on hover/focus without shifting the row, no
  horizontal overflow at 360px.
- Task window: the markdown body is pulled onto the page scale (12px body,
  12/13px headings, tightened list indent and paragraph spacing) while the
  shared MarkdownText/markdownTextProps contract is untouched.
- Cleanup: dead stylesheet rules, unused TSX exports and helpers, stale
  comments that still described the retired Variant-D canvas, zero-reference
  i18n keys across the dictionaries, and the Tailwind/shadcn/Variant-D
  narrative in the design doc, AGENTS.md and the plugin guide (kept as one
  short "why it was rolled back" section).

Verified here: typecheck and lint clean; 133 files / 1413 tests; build with no
radix-ui or --tw- strings in lib/client.js (988.9 KiB); the 70-assertion
real-browser contract at 70/70 with the 20 reference screenshots regenerated;
mount e2e 7/7.
This commit is contained in:
Menghuan1918
2026-09-27 22:18:19 +08:00
parent ae4280c70e
commit b554665bde
35 changed files with 856 additions and 1388 deletions
-36
View File
@@ -70,29 +70,16 @@ export const ko: Record<string, string> = {
openWithSettingsRemove: '삭제',
openWithSettingsInvalidHint: '이름이나 템플릿({path} 포함, scheme:// 로 시작해야 함)을 입력하지 않은 편집기는 메뉴에 표시되지 않습니다',
newTab: '새 탭',
openExplorer: '파일 탐색기',
brokenSymlink: '깨진 심볼릭 링크',
openGit: 'Git 패널',
newTerminal: '새 터미널',
terminalLimit: '터미널 개수가 최대치에 도달했습니다 (3)',
close: '닫기',
closeOtherTabs: '다른 탭 닫기',
closeLeftTabs: '왼쪽 탭 닫기',
closeRightTabs: '오른쪽 탭 닫기',
floatDropHint: '놓으면 자유 창에서 열립니다',
dockToSidebar: '사이드바로 돌아가기',
pinTerminal: '터미널 고정',
pinAgentTerminal: 'Agent 터미널 고정',
pinToWorkspace: '워크스페이스에 고정',
pinToGlobal: '전역에 고정',
unpinTerminal: '고정 해제',
pinnedTerminalTooltip: '{kind} · {scope} · {cwd}',
pinnedTerminalKindUi: 'UI 터미널',
pinnedTerminalKindAgent: 'Agent 터미널',
pinnedTerminalScopeWorkspace: '워크스페이스에 고정됨',
pinnedTerminalScopeGlobal: '전역에 고정됨',
pinnedRailLabel: '고정된 터미널',
closePinnedTerminal: '터미널 닫기',
collapseBottomPanel: '하단 패널 접기',
expandBottomPanel: '하단 패널 펼치기',
terminalError: '터미널 연결 실패',
@@ -124,10 +111,6 @@ export const ko: Record<string, string> = {
loading: '불러오는 중…',
error: '불러오기 실패',
retry: '다시 시도',
splitLeft: '왼쪽으로 분할',
splitRight: '오른쪽으로 분할',
splitUp: '위로 분할',
splitDown: '아래로 분할',
notRepo: '현재 디렉터리는 git 저장소가 아닙니다',
noChanges: '변경 사항 없음',
statusTruncated: '변경 사항이 너무 많아 처음 2000개만 표시합니다',
@@ -137,7 +120,6 @@ export const ko: Record<string, string> = {
unstageAll: '모두 스테이징 해제',
commitPlaceholder: '커밋 메시지 (Ctrl+Enter)',
commit: '커밋',
commitError: '커밋 실패',
branch: '브랜치',
worktree: '워크트리',
checkoutError: '브랜치 전환 실패',
@@ -161,7 +143,6 @@ export const ko: Record<string, string> = {
diffDeleted: '삭제됨',
diffRenamed: '이름 변경됨',
diffExpand: '나머지 {count}줄 펼치기',
diffCollapse: '접기',
discard: '변경 사항 버리기',
discardTitle: '변경 사항 버리기',
discardDesc: '"{path}"의 작업 공간 수정을 버립니다(복구 불가).',
@@ -182,18 +163,14 @@ export const ko: Record<string, string> = {
loadMore: '더 불러오기',
historyLoadError: '더 많은 기록 불러오기 실패',
produced: '이번 산출물',
producedOpen: '사이드바에서 열기',
disconnected: '터미널 연결이 끊겨 다시 연결하는 중…',
exited: '터미널 프로세스가 종료되었습니다',
noSession: '사이드바를 사용하려면 대화를 선택하세요',
pluginNotLoaded: '플러그인이 로드되지 않아 탭을 지금 사용할 수 없습니다:',
hiddenFiles: '숨김 파일',
parent: '상위 디렉터리',
copied: '복사됨',
copy: '복사',
newFile: '새 파일',
openEditor: '편집기 열기',
gitDetail: '변경 사항 세부 정보 보기',
referenceFile: '@파일',
addToConversation: '대화에 추가',
copyRelative: '상대 경로 복사',
@@ -237,7 +214,6 @@ export const ko: Record<string, string> = {
settingsSchemeCustomDesc: '전적으로 사용자가 제어합니다. 사용자 지정 CSS(내장 스타일 덮어쓰기 가능)를 주입하고 타이틀 바 하강 거리를 지정합니다',
settingsSchemeDetectedSuffix: '감지됨',
settingsCustomCssTitle: '사용자 지정 CSS',
settingsCustomCssDesc: '페이지 끝에 추가되는 스타일(동일 우선순위에서는 나중에 쓴 것이 이깁니다. JS 인라인 변수를 덮으려면 !important를 사용해야 합니다)',
settingsCustomCssPlaceholder: '/* 예: 직접 그린 타이틀 바의 셸을 위해 36px 확보 */\nhtml[data-dsh-title-bar-height="36"] {\n --dsh-title-bar-strip: 36px !important;\n}',
settingsSaveFailed: '저장 실패',
settingsConflict: '설정이 다른 창에서 수정되었습니다. 다시 시도하세요',
@@ -260,7 +236,6 @@ export const ko: Record<string, string> = {
settingsFontFamilyPlaceholder: '"JetBrains Mono", monospace',
settingsFontSizeTitle: '터미널 글꼴 크기',
settingsFontSizeDesc: '터미널 글꼴 크기(9–32, 기본 13)',
settingsFontSizeSuffix: 'px',
settingsShellTitle: 'Shell 경로',
settingsShellDesc: 'UI와 모델 터미널이 시작하는 shell(절대 경로 또는 실행 파일 이름). 비워두면 기존 순서로 해석합니다: yaml의 config.shell → $SHELL / 로그인 shell / Windows의 powershell.exe. 이후에 여는 터미널부터 적용됩니다',
settingsShellPlaceholder: '예: /bin/zsh (비워두면 자동 해석)',
@@ -302,19 +277,14 @@ export const ko: Record<string, string> = {
browserEmbedBlockedDesc: '이 사이트는 X-Frame-Options / frame-ancestors로 다른 페이지에 표시되는 것을 금지하여 사이드바에서 로드할 수 없습니다. 브라우저에서 직접 열 수 있습니다',
browserEmbedAnyway: '그래도 로드',
subagent: '작업 관리',
openSubagent: '작업 관리',
subagentMainAgent: '주 에이전트',
subagentEmpty: '서브 에이전트 없음',
subagentEmptyDesc: '현재 주 에이전트에서 파생된 서브 에이전트가 여기에 표시됩니다',
subagentRunning: '실행 중',
subagentInactive: '대기 중',
subagentModeOneShot: '일회성',
subagentModeContinuable: '이어서 가능',
subagentCount: '서브 에이전트 {count}개',
subagentCountRunning: '서브 에이전트 {count}개 · {running} 실행 중',
subagentDiagCorrupt: '기록 손상',
subagentDiagUnsupported: '지원되지 않는 항목',
subagentDiagUnavailable: '사용할 수 없음',
subagentThinking: '생각하는 중…',
sideChat: '사이드 채팅(beta)',
sideChatNew: '새 대화',
@@ -335,10 +305,7 @@ export const ko: Record<string, string> = {
sideChatThink: '생각 과정',
sideChatInjection: '컨텍스트 주입됨',
sideChatSend: '보내기',
sideChatCancel: '중지',
sideChatCancelTitle: '현재 턴 중단(대기열 유지)',
sideChatClose: '스레드 닫기',
sideChatCloseTitle: '스레드의 agent를 해제합니다(기록은 유지)',
sideChatError: '사이드 대화 오류: {message}',
sideChatTurnUsage: '입력 {input} tok · 출력 {output} tok',
sideChatBlockCollapse: '접기',
@@ -374,7 +341,6 @@ export const ko: Record<string, string> = {
jobDurationMinutes: '{minutes}분 {seconds}초',
jobDurationHours: '{hours}시간 {minutes}분',
jobViewOutput: '출력 보기',
jobHideOutput: '출력 접기',
jobNoOutput: '출력 없음',
jobNotReadYet: '모델이 이 작업의 출력을 읽기를 기다리는 중입니다(모델이 job_output을 실행하면 출력이 여기에 표시됩니다)',
jobOutputTruncated: '출력이 너무 길어 잘라서 표시합니다',
@@ -392,7 +358,6 @@ export const ko: Record<string, string> = {
settingsViewModeGraphDesc: '계층형 노드 그래프, 확대/이동 가능',
settingsViewModeTree: '트리',
settingsViewModeTreeDesc: '클래식 들여쓰기 트리, 키보드 탐색 지원',
tasksWorkflowMember: '워크플로 멤버',
tasksFoldCompleted: '✓ {count} 완료됨',
tasksFoldExpand: '완료된 노드 펼치기',
tasksFoldCollapse: '완료된 노드 접기',
@@ -413,7 +378,6 @@ export const ko: Record<string, string> = {
tasksStateError: '오류',
teamBoard: '팀 작업 보드',
teamChip: '팀 멤버 {members}명 · 작업 {tasks}개',
teamMembers: '멤버',
teamTasksEmpty: '공유 작업이 없습니다',
teamTaskCreate: '새 작업',
teamTaskSubject: '제목',