inital working version

This commit is contained in:
Stefan Hardegger
2025-07-22 21:49:40 +02:00
parent bebb799784
commit 59d29dceaf
98 changed files with 8027 additions and 856 deletions

View File

@@ -0,0 +1,66 @@
import { InputHTMLAttributes, forwardRef, TextareaHTMLAttributes } from 'react';
interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
label?: string;
error?: string;
}
interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
label?: string;
error?: string;
}
const Input = forwardRef<HTMLInputElement, InputProps>(
({ label, error, className = '', ...props }, ref) => {
const baseClasses = 'w-full px-3 py-2 border rounded-lg theme-card theme-text theme-border focus:outline-none focus:ring-2 focus:ring-theme-accent focus:border-transparent disabled:opacity-50 disabled:cursor-not-allowed';
return (
<div className="w-full">
{label && (
<label className="block text-sm font-medium theme-header mb-1">
{label}
</label>
)}
<input
ref={ref}
className={`${baseClasses} ${error ? 'border-red-500' : ''} ${className}`}
{...props}
/>
{error && (
<p className="mt-1 text-sm text-red-600">{error}</p>
)}
</div>
);
}
);
Input.displayName = 'Input';
const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(
({ label, error, className = '', rows = 4, ...props }, ref) => {
const baseClasses = 'w-full px-3 py-2 border rounded-lg theme-card theme-text theme-border focus:outline-none focus:ring-2 focus:ring-theme-accent focus:border-transparent disabled:opacity-50 disabled:cursor-not-allowed resize-vertical';
return (
<div className="w-full">
{label && (
<label className="block text-sm font-medium theme-header mb-1">
{label}
</label>
)}
<textarea
ref={ref}
rows={rows}
className={`${baseClasses} ${error ? 'border-red-500' : ''} ${className}`}
{...props}
/>
{error && (
<p className="mt-1 text-sm text-red-600">{error}</p>
)}
</div>
);
}
);
Textarea.displayName = 'Textarea';
export { Input, Textarea };