diff --git a/src/components/EffortPanel/EffortPanel.tsx b/src/components/EffortPanel/EffortPanel.tsx index b79555e0e..7fd42ea91 100644 --- a/src/components/EffortPanel/EffortPanel.tsx +++ b/src/components/EffortPanel/EffortPanel.tsx @@ -15,8 +15,9 @@ import { executeEffort } from '../../commands/effort/effort.js'; import { useMainLoopModel } from '../../hooks/useMainLoopModel.js'; import { useSetAppState } from '../../state/AppState.js'; -// 终端 ≥ 80 cols 时使用;窄屏适配第二阶段处理 -const PANEL_WIDTH = 76; +// 每档固定宽度,Ink Box 自动对齐。PANEL_WIDTH = SEGMENT * 6。 +const SEGMENT = 12; +const PANEL_WIDTH = SEGMENT * PANEL_POSITIONS.length; const SUBLABEL_ULTRACODE = 'xhigh + workflows'; type Props = { @@ -24,19 +25,6 @@ type Props = { onDone: (message: string) => void; }; -// ▲ 落在每档中心列:均匀分布 -function cursorColumn(cursor: PanelPosition): number { - const segment = Math.floor(PANEL_WIDTH / PANEL_POSITIONS.length); - const idx = PANEL_POSITIONS.indexOf(cursor); - return segment * idx + Math.floor(segment / 2); -} - -function renderPaddedLine(cursor: PanelPosition): string { - const col = cursorColumn(cursor); - // ▲ 上方的"分隔线 + 光标"行:左侧 ─,到列处 ▲,右侧继续 ─ - return `${'─'.repeat(col)}▲${'─'.repeat(Math.max(0, PANEL_WIDTH - col - 1))}`; -} - export function EffortPanel({ appStateEffort, onDone }: Props): React.ReactNode { const setAppState = useSetAppState(); const model = useMainLoopModel(); @@ -82,28 +70,47 @@ export function EffortPanel({ appStateEffort, onDone }: Props): React.ReactNode const envActive = envOverride !== null && envOverride !== undefined; const envRaw = process.env.CLAUDE_CODE_EFFORT_LEVEL; - // 两极文字行:左 Faster + 中间空格 + 右 Smarter - const fasterLen = 'Faster'.length; - const smarterLen = 'Smarter'.length; - const gap = Math.max(0, PANEL_WIDTH - fasterLen - smarterLen); - const poleLine = `Faster${' '.repeat(gap)}Smarter`; - return ( - - Effort - {envActive && {`⚠ CLAUDE_CODE_EFFORT_LEVEL=${envRaw} overrides this session`}} - - {poleLine} - - {renderPaddedLine(cursor)} - - {PANEL_POSITIONS.map(p => (p as string).padEnd(11)) - .join('') - .trimEnd()} + + + Effort - {`${' '.repeat(Math.max(0, PANEL_WIDTH - SUBLABEL_ULTRACODE.length))}${SUBLABEL_ULTRACODE}`} + {envActive && {`⚠ CLAUDE_CODE_EFFORT_LEVEL=${envRaw} overrides this session`}} + + Faster + Smarter + + {/* 分隔线 */} + {'─'.repeat(PANEL_WIDTH)} + {/* ▲ 行:每段独立居中,与下方档位文字严格对齐 */} + + {PANEL_POSITIONS.map(p => ( + + + {cursor === p ? '▲' : ' '} + + + ))} + + {/* 档位名 */} + + {PANEL_POSITIONS.map(p => ( + + + {p} + + + ))} + + {/* ultracode 副标签:右对齐到最末段 */} + + + + {SUBLABEL_ULTRACODE} + + - ←/→ adjust · Enter confirm · Esc cancel + ←/→ adjust · Enter confirm · Esc cancel );