77 lines
2.3 KiB
TypeScript
77 lines
2.3 KiB
TypeScript
import { FEYNMAN_ASCII_LOGO } from "../../logo.mjs";
|
|
|
|
export const RESET = "\x1b[0m";
|
|
const BOLD = "\x1b[1m";
|
|
const DIM = "\x1b[2m";
|
|
|
|
function rgb(red: number, green: number, blue: number): string {
|
|
return `\x1b[38;2;${red};${green};${blue}m`;
|
|
}
|
|
|
|
// Match the outer CLI to the bundled Feynman Pi theme instead of generic magenta panels.
|
|
const INK = rgb(211, 198, 170);
|
|
const STONE = rgb(157, 169, 160);
|
|
export const ASH = rgb(133, 146, 137);
|
|
const DARK_ASH = rgb(92, 106, 114);
|
|
export const SAGE = rgb(167, 192, 128);
|
|
const TEAL = rgb(127, 187, 179);
|
|
const ROSE = rgb(230, 126, 128);
|
|
|
|
function paint(text: string, ...codes: string[]): string {
|
|
return `${codes.join("")}${text}${RESET}`;
|
|
}
|
|
|
|
export function printInfo(text: string): void {
|
|
console.log(paint(` ${text}`, ASH));
|
|
}
|
|
|
|
export function printSuccess(text: string): void {
|
|
console.log(paint(`✓ ${text}`, SAGE, BOLD));
|
|
}
|
|
|
|
export function printWarning(text: string): void {
|
|
console.log(paint(`⚠ ${text}`, STONE, BOLD));
|
|
}
|
|
|
|
export function printError(text: string): void {
|
|
console.log(paint(`✗ ${text}`, ROSE, BOLD));
|
|
}
|
|
|
|
export function printSection(title: string): void {
|
|
console.log("");
|
|
console.log(paint(`◆ ${title}`, TEAL, BOLD));
|
|
}
|
|
|
|
export function printAsciiHeader(subtitleLines: string[] = []): void {
|
|
console.log("");
|
|
for (const line of FEYNMAN_ASCII_LOGO) {
|
|
console.log(paint(` ${line}`, TEAL, BOLD));
|
|
}
|
|
for (const line of subtitleLines) {
|
|
console.log(paint(` ${line}`, ASH));
|
|
}
|
|
console.log("");
|
|
}
|
|
|
|
export function printPanel(title: string, subtitleLines: string[] = []): void {
|
|
const inner = 53;
|
|
const border = "─".repeat(inner + 2);
|
|
const renderLine = (text: string, color: string, bold = false): string => {
|
|
const content = text.length > inner ? `${text.slice(0, inner - 3)}...` : text;
|
|
const codes = bold ? `${color}${BOLD}` : color;
|
|
return `${DARK_ASH}${BOLD}│${RESET} ${codes}${content.padEnd(inner)}${RESET} ${DARK_ASH}${BOLD}│${RESET}`;
|
|
};
|
|
|
|
console.log("");
|
|
console.log(paint(`┌${border}┐`, DARK_ASH, BOLD));
|
|
console.log(renderLine(title, TEAL, true));
|
|
if (subtitleLines.length > 0) {
|
|
console.log(paint(`├${border}┤`, DARK_ASH, BOLD));
|
|
for (const line of subtitleLines) {
|
|
console.log(renderLine(line, INK));
|
|
}
|
|
}
|
|
console.log(paint(`└${border}┘`, DARK_ASH, BOLD));
|
|
console.log("");
|
|
}
|