initial
This commit is contained in:
157
ts/colors.ts
Normal file
157
ts/colors.ts
Normal file
@@ -0,0 +1,157 @@
|
||||
/**
|
||||
* Color theme and styling utilities for ModelGrid CLI
|
||||
* Uses Deno standard library colors module
|
||||
*/
|
||||
import * as colors from '@std/fmt/colors';
|
||||
|
||||
/**
|
||||
* Color theme for consistent CLI styling
|
||||
*/
|
||||
export const theme = {
|
||||
// Message types
|
||||
error: colors.red,
|
||||
warning: colors.yellow,
|
||||
success: colors.green,
|
||||
info: colors.cyan,
|
||||
dim: colors.dim,
|
||||
highlight: colors.bold,
|
||||
|
||||
// Status indicators
|
||||
statusActive: (text: string) => colors.green(colors.bold(text)),
|
||||
statusInactive: (text: string) => colors.red(text),
|
||||
statusWarning: (text: string) => colors.yellow(text),
|
||||
statusUnknown: (text: string) => colors.dim(text),
|
||||
|
||||
// GPU status colors
|
||||
gpuHealthy: colors.green, // GPU healthy
|
||||
gpuWarning: colors.yellow, // GPU warning
|
||||
gpuError: colors.red, // GPU error
|
||||
|
||||
// VRAM usage colors
|
||||
vramGood: colors.green, // < 60% usage
|
||||
vramMedium: colors.yellow, // 60-85% usage
|
||||
vramCritical: colors.red, // > 85% usage
|
||||
|
||||
// Container status colors
|
||||
containerRunning: colors.green,
|
||||
containerStopped: colors.red,
|
||||
containerStarting: colors.yellow,
|
||||
|
||||
// Box borders
|
||||
borderSuccess: colors.green,
|
||||
borderError: colors.red,
|
||||
borderWarning: colors.yellow,
|
||||
borderInfo: colors.cyan,
|
||||
borderDefault: (text: string) => text, // No color
|
||||
|
||||
// Command/code highlighting
|
||||
command: colors.cyan,
|
||||
code: colors.dim,
|
||||
path: colors.blue,
|
||||
model: colors.magenta,
|
||||
};
|
||||
|
||||
/**
|
||||
* Status symbols with colors
|
||||
*/
|
||||
export const symbols = {
|
||||
success: colors.green('✓'),
|
||||
error: colors.red('✗'),
|
||||
warning: colors.yellow('⚠'),
|
||||
info: colors.cyan('ℹ'),
|
||||
running: colors.green('●'),
|
||||
stopped: colors.red('○'),
|
||||
starting: colors.yellow('◐'),
|
||||
unknown: colors.dim('◯'),
|
||||
gpu: colors.cyan('◆'),
|
||||
container: colors.blue('▣'),
|
||||
model: colors.magenta('◈'),
|
||||
};
|
||||
|
||||
/**
|
||||
* Get color for VRAM usage percentage
|
||||
*/
|
||||
export function getVramColor(percentage: number): (text: string) => string {
|
||||
if (percentage < 60) return theme.vramGood;
|
||||
if (percentage < 85) return theme.vramMedium;
|
||||
return theme.vramCritical;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get color for GPU utilization
|
||||
*/
|
||||
export function getGpuUtilColor(percentage: number): (text: string) => string {
|
||||
if (percentage < 60) return theme.gpuHealthy;
|
||||
if (percentage < 85) return theme.gpuWarning;
|
||||
return theme.gpuError;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format GPU vendor with color
|
||||
*/
|
||||
export function formatGpuVendor(vendor: 'nvidia' | 'amd' | 'intel' | 'unknown'): string {
|
||||
switch (vendor) {
|
||||
case 'nvidia':
|
||||
return colors.green('NVIDIA');
|
||||
case 'amd':
|
||||
return colors.red('AMD');
|
||||
case 'intel':
|
||||
return colors.blue('Intel');
|
||||
case 'unknown':
|
||||
default:
|
||||
return colors.dim('Unknown');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Format container status with color
|
||||
*/
|
||||
export function formatContainerStatus(
|
||||
status: 'running' | 'stopped' | 'starting' | 'error' | 'unknown',
|
||||
): string {
|
||||
switch (status) {
|
||||
case 'running':
|
||||
return theme.containerRunning('Running');
|
||||
case 'stopped':
|
||||
return theme.containerStopped('Stopped');
|
||||
case 'starting':
|
||||
return theme.containerStarting('Starting');
|
||||
case 'error':
|
||||
return theme.error('Error');
|
||||
case 'unknown':
|
||||
default:
|
||||
return theme.dim('Unknown');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Format container type with color
|
||||
*/
|
||||
export function formatContainerType(type: 'ollama' | 'vllm' | 'tgi' | 'custom'): string {
|
||||
switch (type) {
|
||||
case 'ollama':
|
||||
return colors.green('Ollama');
|
||||
case 'vllm':
|
||||
return colors.cyan('vLLM');
|
||||
case 'tgi':
|
||||
return colors.magenta('TGI');
|
||||
case 'custom':
|
||||
return colors.yellow('Custom');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Format model status with color
|
||||
*/
|
||||
export function formatModelStatus(status: 'loaded' | 'loading' | 'unloaded' | 'error'): string {
|
||||
switch (status) {
|
||||
case 'loaded':
|
||||
return theme.success('Loaded');
|
||||
case 'loading':
|
||||
return theme.warning('Loading');
|
||||
case 'unloaded':
|
||||
return theme.dim('Unloaded');
|
||||
case 'error':
|
||||
return theme.error('Error');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user