File size: 1,541 Bytes
bc575bc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | /**
* Utilities for formatting keybinding hints in the UI.
*/
import { getKeybindings, type Keybinding, type KeyId } from "@earendil-works/pi-tui";
import { theme } from "../theme/theme.ts";
export interface KeyTextFormatOptions {
capitalize?: boolean;
}
function formatKeyPart(part: string, options: KeyTextFormatOptions): string {
const displayPart = process.platform === "darwin" && part.toLowerCase() === "alt" ? "option" : part;
return options.capitalize ? displayPart.charAt(0).toUpperCase() + displayPart.slice(1) : displayPart;
}
export function formatKeyText(key: string, options: KeyTextFormatOptions = {}): string {
return key
.split("/")
.map((k) =>
k
.split("+")
.map((part) => formatKeyPart(part, options))
.join("+"),
)
.join("/");
}
function formatKeys(keys: KeyId[], options: KeyTextFormatOptions = {}): string {
if (keys.length === 0) return "";
return formatKeyText(keys.join("/"), options);
}
export function keyText(keybinding: Keybinding): string {
return formatKeys(getKeybindings().getKeys(keybinding));
}
export function keyDisplayText(keybinding: Keybinding): string {
return formatKeys(getKeybindings().getKeys(keybinding), { capitalize: true });
}
export function keyHint(keybinding: Keybinding, description: string): string {
return theme.fg("dim", keyText(keybinding)) + theme.fg("muted", ` ${description}`);
}
export function rawKeyHint(key: string, description: string): string {
return theme.fg("dim", formatKeyText(key)) + theme.fg("muted", ` ${description}`);
}
|