Files
Neon-Desk/components/ui/button.tsx
francy51 ca45d8ea4c Redesign dashboard/screener UI for improved density and performance
- Add compact/dense CSS tokens for tighter layouts
- Add size prop to Button (default/compact) and Input (default/compact)
- Add density prop to Panel (normal/compact/dense)
- Add size prop to MetricCard (default/compact/inline)
- Create IndexCardRow component for horizontal metric display
- Create FilterChip component for removable filter tags
- Redesign Command Center with flat sections, reduced cards
- Tighten AppShell spacing (sidebar w-56, header mb-3, main space-y-4)

Design goals achieved:
- Denser, cleaner terminal-style layout
- Reduced card usage in favor of flat sections with dividers
- More space-efficient controls and metrics
- Better use of widescreen layouts
2026-03-16 19:51:00 -04:00

45 lines
1.5 KiB
TypeScript

import { cn } from "@/lib/utils";
type ButtonVariant = "primary" | "ghost" | "danger" | "secondary";
type ButtonSize = "default" | "compact";
type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
variant?: ButtonVariant;
size?: ButtonSize;
};
const variantMap: Record<ButtonVariant, string> = {
primary:
"border-[color:var(--line-strong)] bg-[color:var(--accent)] text-[#16181c] hover:bg-[color:var(--accent-strong)]",
secondary:
"border-[color:var(--line-weak)] bg-[color:var(--panel-bright)] text-[color:var(--terminal-bright)] hover:border-[color:var(--line-strong)] hover:bg-[color:var(--panel)]",
ghost:
"border-[color:var(--line-weak)] bg-transparent text-[color:var(--terminal-bright)] hover:border-[color:var(--line-strong)] hover:bg-[color:var(--panel-soft)]",
danger:
"border-[color:var(--danger)] bg-[color:var(--danger-soft)] text-[#ffc9c9] hover:bg-[color:var(--danger)] hover:text-[#1e0d0d]",
};
const sizeMap: Record<ButtonSize, string> = {
default: "min-h-11 px-3 py-2 text-sm gap-2",
compact: "min-h-8 px-2.5 py-1.5 text-xs gap-1.5",
};
export function Button({
className,
variant = "primary",
size = "default",
...props
}: ButtonProps) {
return (
<button
className={cn(
"inline-flex items-center justify-center rounded-xl border font-medium transition duration-200 disabled:cursor-not-allowed disabled:opacity-50",
variantMap[variant],
sizeMap[size],
className,
)}
{...props}
/>
);
}