fix(tui): measure status cwd by display width

Budget the right-hand status label by terminal display width so wide Unicode paths cannot wrap skinny status bars.
This commit is contained in:
Brooklyn Nicholson 2026-05-23 14:11:44 -05:00
parent 4d9791c551
commit a4c27af697
2 changed files with 9 additions and 2 deletions

View file

@ -22,4 +22,11 @@ describe('statusRuleWidths', () => {
it('omits the cwd segment when there is no room for it', () => {
expect(statusRuleWidths(2, 'abcdef')).toEqual({ leftWidth: 2, rightWidth: 0, separatorWidth: 0 })
})
it('budgets the cwd segment by display width, not utf-16 length', () => {
const widths = statusRuleWidths(30, '目录/分支')
expect(widths.leftWidth + widths.separatorWidth + widths.rightWidth).toBeLessThanOrEqual(30)
expect(widths.rightWidth).toBeGreaterThan('目录/分支'.length)
})
})

View file

@ -1,4 +1,4 @@
import { Box, type ScrollBoxHandle, Text } from '@hermes/ink'
import { Box, type ScrollBoxHandle, stringWidth, Text } from '@hermes/ink'
import { useStore } from '@nanostores/react'
import { type ReactNode, type RefObject, useEffect, useMemo, useRef, useState } from 'react'
import unicodeSpinners from 'unicode-animations'
@ -160,7 +160,7 @@ export function statusRuleWidths(cols: number, cwdLabel: string) {
return { leftWidth: width, rightWidth: 0, separatorWidth: 0 }
}
const rightWidth = Math.max(0, Math.min(cwdLabel.length, maxRightWidth))
const rightWidth = Math.max(0, Math.min(stringWidth(cwdLabel), maxRightWidth))
const separatorWidth = rightWidth > 0 ? desiredSeparatorWidth : 0
const leftWidth = Math.max(1, width - separatorWidth - rightWidth)