feat: Oberflaechenbausteine, Anwendungsrahmen und Konventionen

Basisbausteine im shadcn/ui-Stil, aber mit drei bewussten Abweichungen:

- Bedienelemente sind 44px hoch statt 36px. Ich bediene die App oft am
  Handy im Heim oder auf dem Amt; kleiner ist dort nicht treffsicher.
- Auswahlfelder benutzen das native <select>. Android und iOS oeffnen
  dafuer ihre eigene Liste - schneller als jeder Nachbau, und mit
  Screenreader und Tastatur funktioniert es ohne Zutun.
- Eingabefelder haben mindestens 16px Schrift, sonst zoomt iOS-Safari
  beim Hineintippen das Formular heran.

<Feld> verdrahtet Beschriftung, Erklaerung und Fehler ueber
aria-describedby. Der Erklaerungstext ist kein Beiwerk: die Anwendung
benutzt Begriffe aus dem Betreuungsrecht, die niemand nachschlagen soll.

<Rechtshinweis> ist der stehende Vermerk, dass hier keine Rechtsberatung
stattfindet. Er steht an jeder Stelle mit Paragraphenbezug.

Der Anwendungsrahmen fuehrt drei Bedingungen zusammen, ohne die niemand
an Fachdaten kommt: angemeldet, zweiter Faktor eingerichtet, mindestens
eine betreute Person zugeordnet. Die Navigation zeigt Zaehler fuer
ueberfaellige Fristen und neuen Posteingang - die Frage "wo muss ich
hin?" wird schon im Menue beantwortet.

Das Farbschema wird per Inline-Skript mit CSP-Nonce gesetzt, bevor die
Seite gezeichnet wird - sonst blitzt beim Laden das helle Thema auf.

docs/KONVENTIONEN.md haelt fest, was in allen weiteren Etappen gilt:
Verzeichnisaufbau, Cent-Betraege, Umgang mit verschluesselten Feldern,
Zugriffspruefung, Audit-Pflicht, Ampelfarben, Commit-Trailer.

Etappe: 1
Phase: Fundament
This commit is contained in:
Florian Wilde
2026-08-22 01:54:56 +02:00
parent bd1c7b801f
commit dcd3a8ce71
30 changed files with 2151 additions and 12 deletions
+50
View File
@@ -0,0 +1,50 @@
import { Scale } from 'lucide-react'
import { cn } from '@/lib/utils'
/**
* Der stehende Hinweis, dass diese Anwendung keine Rechtsberatung ist.
*
* Er steht an JEDER Stelle, an der ein Paragraph genannt wird. Das ist
* keine Formalie: Die App rechnet Fristen aus und schlaegt Einordnungen
* vor, aber sie kennt den Einzelfall nicht. Wer sich darauf verlaesst,
* statt beim Rechtspfleger nachzufragen, kann Geld und Anspruch verlieren.
*/
export function Rechtshinweis({
rechtsgrundlage,
className,
kurz = false,
}: {
rechtsgrundlage?: string
className?: string
kurz?: boolean
}) {
if (kurz) {
return (
<p className={cn('text-xs text-muted-foreground', className)}>
{rechtsgrundlage && <span className="font-medium">{rechtsgrundlage} · </span>}
Keine Rechtsberatung. Im Zweifel bei Gericht, Bezirk oder Anwalt nachfragen.
</p>
)
}
return (
<div
className={cn(
'flex items-start gap-2.5 rounded-md border border-border bg-muted/50 p-3',
className,
)}
>
<Scale className="mt-0.5 size-4 shrink-0 text-muted-foreground" aria-hidden="true" />
<p className="text-sm text-muted-foreground">
{rechtsgrundlage && (
<>
<span className="font-medium text-foreground">{rechtsgrundlage}</span>{' '}
</>
)}
Dieser Hinweis dient der eigenen Orientierung und ersetzt{' '}
<strong className="font-medium">keine Rechtsberatung</strong>. Er ersetzt insbesondere nicht
die Rückfrage beim Betreuungsgericht, beim Sozialhilfeträger oder bei einem Anwalt.
</p>
</div>
)
}