import React from 'react'; type BannerProps = { kind?: 'error' | 'info' | 'success'; children: React.ReactNode; }; const styles = { error: 'bg-red-50 text-red-800 border-red-200', info: 'bg-sky-50 text-sky-800 border-sky-200', success: 'bg-green-50 text-green-800 border-green-200', }; export const Banner: React.FC = ({ kind = 'info', children }) => (
{children}
); export const PageHeader: React.FC<{ title: string; subtitle?: string; icon?: React.ReactNode; actions?: React.ReactNode; }> = ({ title, subtitle, icon, actions }) => (
{icon && (
{icon}
)}

{title}

{subtitle &&

{subtitle}

}
{actions}
); export const Spinner: React.FC = () => (
Memuat...
); export const EmptyFarm: React.FC<{ onSettings: () => void }> = ({ onSettings }) => ( Pilih site, kandang, dan siklus, atau buat data di{' '} . ); type ConfirmDialogProps = { open: boolean; title: string; message: React.ReactNode; confirmLabel?: string; cancelLabel?: string; busy?: boolean; onConfirm: () => void; onCancel: () => void; }; export const ConfirmDialog: React.FC = ({ open, title, message, confirmLabel = 'Lanjutkan', cancelLabel = 'Batal', busy = false, onConfirm, onCancel, }) => { if (!open) return null; return (
{ if (!busy) onCancel(); }} >
event.stopPropagation()} >

{title}

{message}
); }; type AlertDialogProps = { open: boolean; title: string; message: React.ReactNode; dismissLabel?: string; kind?: 'error' | 'info' | 'success'; onDismiss: () => void; }; const alertIconStyles = { error: 'bg-red-600', info: 'bg-sky-600', success: 'bg-green-600', }; const alertIconClass = { error: 'fa-triangle-exclamation', info: 'fa-circle-info', success: 'fa-circle-check', }; export const AlertDialog: React.FC = ({ open, title, message, dismissLabel = 'Tutup', kind = 'error', onDismiss, }) => { if (!open) return null; return (
event.stopPropagation()} >

{title}

{message}
); };