paqad-ai
Version:
Spec-driven development framework — AI agents that think before they type
68 lines (58 loc) • 1.76 kB
text/typescript
export const INK = {
ink: '#6E7D86',
inkDark: '#C2CBD0',
muted: '#8E979D',
mutedDark: '#97A1A7',
mutedText: '#6B747A',
headline: '#1F2428',
headlineDark: '#E8ECEE',
hairOpacity: 0.28,
faintOpacity: 0.3,
faintStrokeOpacity: 0.45,
} as const;
export const SIGNAL = {
accent: '#F90093',
accentText: '#C80076',
accentTextDark: '#FF4DB2',
attention: '#F37748',
caution: '#C98A1B',
cautionDark: '#E3B04B',
cautionText: '#8F6110',
pass: '#2F8F6B',
passDark: '#5FC29C',
passText: '#26775A',
fail: '#D23B3B',
failDark: '#F08080',
onSignal: '#FFFFFF',
} as const;
export type StatusSet = {
name: string;
done: string;
doneDark: string;
failed: string;
failedDark: string;
};
export const STATUS_B: StatusSet = {
name: 'B · brand + functional green and red',
done: SIGNAL.pass,
doneDark: SIGNAL.passDark,
failed: SIGNAL.fail,
failedDark: SIGNAL.failDark,
};
export const PX_PER_COLUMN = 8.5;
export const BREATH = ['FF', 'CC', '8C', '66', '8C', 'CC'] as const;
export const SVG_FONT =
"-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', system-ui, sans-serif";
export type Signal = 'accent' | 'attention' | 'caution' | 'pass' | 'fail' | 'idle';
export function signalColor(signal: Signal): string {
if (signal === 'accent') return SIGNAL.accent;
if (signal === 'attention') return SIGNAL.attention;
if (signal === 'caution') return SIGNAL.caution;
if (signal === 'pass') return STATUS_B.done;
if (signal === 'fail') return STATUS_B.failed;
return INK.muted;
}
export function lightColor(signal: Signal, live: boolean, tick: number): string {
const color = signalColor(signal);
return live ? `${color}${BREATH[Math.abs(Math.trunc(tick)) % BREATH.length]}` : color;
}