81 lines
2.7 KiB
TypeScript
81 lines
2.7 KiB
TypeScript
import { clsx, type ClassValue } from 'clsx'
|
|
import { twMerge } from 'tailwind-merge'
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
return twMerge(clsx(inputs))
|
|
}
|
|
|
|
export function slugify(text: string): string {
|
|
return text
|
|
.toLowerCase()
|
|
.replace(/\s+/g, '-')
|
|
.replace(/[^\w-]+/g, '')
|
|
.replace(/--+/g, '-')
|
|
.trim()
|
|
}
|
|
|
|
export function maskSecret(value: string): string {
|
|
if (!value) return '••••••••'
|
|
if (value.length <= 8) return '••••••••••••'
|
|
return value.slice(0, 4) + '•'.repeat(Math.min(value.length - 8, 16)) + value.slice(-4)
|
|
}
|
|
|
|
export function envBadgeStyles(env: string) {
|
|
switch (env) {
|
|
case 'production':
|
|
return {
|
|
bg: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20 hover:border-emerald-500/40',
|
|
active: 'bg-emerald-500 text-slate-950 font-semibold shadow-lg shadow-emerald-500/25 border-emerald-400',
|
|
dot: 'bg-emerald-400',
|
|
}
|
|
case 'staging':
|
|
return {
|
|
bg: 'bg-amber-500/10 text-amber-400 border-amber-500/20 hover:border-amber-500/40',
|
|
active: 'bg-amber-500 text-slate-950 font-semibold shadow-lg shadow-amber-500/25 border-amber-400',
|
|
dot: 'bg-amber-400',
|
|
}
|
|
case 'development':
|
|
return {
|
|
bg: 'bg-cyan-500/10 text-cyan-400 border-cyan-500/20 hover:border-cyan-500/40',
|
|
active: 'bg-cyan-500 text-slate-950 font-semibold shadow-lg shadow-cyan-500/25 border-cyan-400',
|
|
dot: 'bg-cyan-400',
|
|
}
|
|
default:
|
|
return {
|
|
bg: 'bg-slate-500/10 text-slate-400 border-slate-500/20 hover:border-slate-500/40',
|
|
active: 'bg-slate-500 text-slate-950 font-semibold shadow-lg shadow-slate-500/25 border-slate-400',
|
|
dot: 'bg-slate-400',
|
|
}
|
|
}
|
|
}
|
|
|
|
export function envColor(env: string) {
|
|
switch (env) {
|
|
case 'production':
|
|
return 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20'
|
|
case 'staging':
|
|
return 'bg-amber-500/10 text-amber-400 border-amber-500/20'
|
|
case 'development':
|
|
return 'bg-cyan-500/10 text-cyan-400 border-cyan-500/20'
|
|
default:
|
|
return 'bg-slate-500/10 text-slate-400 border-slate-500/20'
|
|
}
|
|
}
|
|
|
|
export function typeColor(type: string) {
|
|
switch (type) {
|
|
case 'secret':
|
|
return 'bg-rose-500/10 text-rose-400 border-rose-500/20'
|
|
case 'url':
|
|
return 'bg-sky-500/10 text-sky-400 border-sky-500/20'
|
|
case 'json':
|
|
return 'bg-purple-500/10 text-purple-400 border-purple-500/20'
|
|
case 'boolean':
|
|
return 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20'
|
|
case 'number':
|
|
return 'bg-amber-500/10 text-amber-400 border-amber-500/20'
|
|
default:
|
|
return 'bg-slate-500/10 text-slate-300 border-slate-500/20'
|
|
}
|
|
}
|