/opt/mawid/apps/dashboard/components
Edit: /opt/mawid/apps/dashboard/components/ui.tsx (3789B)
'use client';
import { type ReactNode } from 'react';
export function Button({
children,
onClick,
variant = 'primary',
type = 'button',
disabled,
className = '',
}: {
children: ReactNode;
onClick?: () => void;
variant?: 'primary' | 'secondary' | 'danger' | 'ghost';
type?: 'button' | 'submit';
disabled?: boolean;
className?: string;
}) {
const styles = {
primary: 'bg-emerald-600 text-white hover:bg-emerald-700',
secondary: 'bg-slate-100 text-slate-700 hover:bg-slate-200',
danger: 'bg-red-50 text-red-700 hover:bg-red-100',
ghost: 'text-slate-500 hover:bg-slate-100',
}[variant];
return (
);
}
export function Input(props: React.InputHTMLAttributes
) {
return (
);
}
export function Select(props: React.SelectHTMLAttributes) {
return (
);
}
export function Textarea(props: React.TextareaHTMLAttributes) {
return (
);
}
export function Card({ children, className = '' }: { children: ReactNode; className?: string }) {
return (
{children}
);
}
export function Field({ label, children }: { label: string; children: ReactNode }) {
return (
);
}
export function Badge({
children,
color = 'slate',
}: {
children: ReactNode;
color?: 'slate' | 'emerald' | 'amber' | 'red' | 'blue';
}) {
const styles = {
slate: 'bg-slate-100 text-slate-600',
emerald: 'bg-emerald-100 text-emerald-700',
amber: 'bg-amber-100 text-amber-700',
red: 'bg-red-100 text-red-700',
blue: 'bg-blue-100 text-blue-700',
}[color];
return (
{children}
);
}
export function Modal({
open,
onClose,
title,
children,
}: {
open: boolean;
onClose: () => void;
title: string;
children: ReactNode;
}) {
if (!open) return null;
return (
e.stopPropagation()}
>
{title}
{children}
);
}
export function Spinner() {
return (
);
}