Die Schnellerfassung braucht ein Feld und einen Knopf; wer beim Erfassen erst ein Formular ausfüllen muss, erfasst nichts. Der Fokus bleibt danach im Feld, damit mehrere Sachen hintereinander hineingehen. Die Filter der Aufgabenliste stehen in der Adresse, nicht im Zustand der Komponente — so lässt sich eine gefilterte Liste als Lesezeichen ablegen, und der Zurück-Knopf tut, was er soll. Die Startseite zeigt jetzt, was überfällig, heute oder morgen fällig ist, statt nur die Bereiche aufzuzählen. Für die Auswahlfelder bewusst das native <select>: es bedient sich auf dem Handy mit dem Systemdialog und ist ohne Zusatzcode tastaturbedienbar. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
38 lines
918 B
TypeScript
38 lines
918 B
TypeScript
import { cn } from '@/lib/utils'
|
|
|
|
/**
|
|
* Fortschritt als Balken. Der Wert steht zusätzlich als Text daneben — ein
|
|
* Balken allein ist für Menschen mit Sehschwäche und für Vorleseprogramme
|
|
* wertlos.
|
|
*/
|
|
export function Fortschrittsbalken({
|
|
prozent,
|
|
className,
|
|
beschriftung,
|
|
}: {
|
|
prozent: number
|
|
className?: string
|
|
beschriftung?: string
|
|
}) {
|
|
const wert = Math.min(100, Math.max(0, Math.round(prozent)))
|
|
|
|
return (
|
|
<div
|
|
role="progressbar"
|
|
aria-valuenow={wert}
|
|
aria-valuemin={0}
|
|
aria-valuemax={100}
|
|
{...(beschriftung ? { 'aria-label': beschriftung } : {})}
|
|
className={cn('bg-gedaempft h-2 w-full overflow-hidden rounded-full', className)}
|
|
>
|
|
<div
|
|
className={cn(
|
|
'h-full rounded-full transition-[width]',
|
|
wert === 100 ? 'bg-erfolg' : 'bg-betont',
|
|
)}
|
|
style={{ width: `${wert}%` }}
|
|
/>
|
|
</div>
|
|
)
|
|
}
|