60 lines
1.8 KiB
TypeScript
60 lines
1.8 KiB
TypeScript
/**
|
|
* Terminal-safe primitives for components mounted through the TUI extension service.
|
|
*
|
|
* Extensions use these wrappers instead of importing the underlying renderer, so
|
|
* `ctx.tui` remains the owner of key decoding, ANSI wrapping, and column width.
|
|
* @module @deepseek-ai/dsh-tui/extension-primitives
|
|
*/
|
|
|
|
import {
|
|
Key,
|
|
matchesKey,
|
|
truncateToWidth,
|
|
visibleWidth,
|
|
wrapTextWithAnsi,
|
|
type KeyId,
|
|
} from '@earendil-works/pi-tui'
|
|
|
|
/** Key identifiers accepted by TUI extension components. */
|
|
export const TuiKey = Key
|
|
|
|
/**
|
|
* Test whether terminal input matches one semantic key.
|
|
* @param data - Raw terminal input delivered to the component.
|
|
* @param key - Semantic key identifier to match.
|
|
* @returns Whether the input encodes the requested key.
|
|
*/
|
|
export function matchesTuiKey(data: string, key: KeyId): boolean {
|
|
return matchesKey(data, key)
|
|
}
|
|
|
|
/**
|
|
* Measure terminal columns after ignoring ANSI control sequences.
|
|
* @param value - Styled or plain terminal text.
|
|
* @returns Visible terminal-column width.
|
|
*/
|
|
export function tuiVisibleWidth(value: string): number {
|
|
return visibleWidth(value)
|
|
}
|
|
|
|
/**
|
|
* Wrap styled terminal text without splitting ANSI sequences.
|
|
* @param value - Styled or plain terminal text.
|
|
* @param width - Maximum visible columns per line.
|
|
* @returns Wrapped lines preserving active ANSI styling.
|
|
*/
|
|
export function wrapTuiText(value: string, width: number): string[] {
|
|
return wrapTextWithAnsi(value, width)
|
|
}
|
|
|
|
/**
|
|
* Truncate styled terminal text to a visible-column limit.
|
|
* @param value - Styled or plain terminal text.
|
|
* @param width - Maximum visible columns.
|
|
* @param ellipsis - Suffix used when truncation occurs.
|
|
* @returns Text whose visible width does not exceed the limit.
|
|
*/
|
|
export function truncateTuiText(value: string, width: number, ellipsis = ''): string {
|
|
return truncateToWidth(value, width, ellipsis)
|
|
}
|