fix: fieldset/legend durch echte Überschriften ersetzt, globales CSS vervollständigt

<legend> positioniert sich per Spezifikation immer auf der oberen
Rahmenlinie seines <fieldset> - das lässt sich nicht per CSS aufheben,
nur kaschieren. Die vorherige "Nachbesserung" (mehr Padding/Breite auf
der legend) war ein Pflaster, kein Fix - kam prompt wieder zum
Vorschein, sobald eine neue .form-section-Seite entstand. .form-section
ist jetzt ein <div>, die Überschrift ein normales <h3
class="form-section-title"> mit voller CSS-Kontrolle. Betrifft alle
neun Vorlagen mit diesem Muster.

Zusätzlich alle restlichen unstyled Formulare (Login, Passwort-Reset,
Einladung annehmen, Nutzer anlegen, CSV-Import, Abteilung anlegen,
Firma umbenennen, Fall-Entscheiden) auf dasselbe form-card/form-section/
form-grid-Muster gehoben, für durchgängig konsistentes globales CSS
statt gemischter roher und gestylter Formulare. antrag_neu.html (der
Fragebogen) bleibt bewusst unverändert - dessen fieldset/legend haben
keinen Rahmen-Konflikt und sind an bereits getestete :has()-Adaptivlogik
gekoppelt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
noroot
2026-09-01 12:18:35 +02:00
parent 7db4707bc5
commit cbe68b16c9
19 changed files with 254 additions and 121 deletions

View File

@@ -25,12 +25,22 @@
{{end}}
</ul>
{{end}}
<div class="form-card">
<form method="post" action="/verwaltung/abteilungen">
<label for="name">Neue Abteilung</label>
<input type="text" id="name" name="name" required>
<button type="submit">Anlegen</button>
<div class="form-section">
<div class="form-grid">
<div>
<label for="name">Neue Abteilung</label>
<input type="text" id="name" name="name" required>
</div>
</div>
</div>
<div class="form-actions">
<button type="submit">Anlegen</button>
</div>
</form>
</div>
</div>
</body>
</html>
{{end}}

View File

@@ -8,11 +8,21 @@
<h1>{{.Name}}</h1>
<p class="hinweis">Angelegt am {{.CreatedAt}}</p>
<div class="form-card">
<form method="post" action="/betreiber/accounts/{{.AccountID}}/umbenennen">
<label for="name">Firmenname</label>
<input type="text" id="name" name="name" value="{{.Name}}" required>
<button type="submit">Umbenennen</button>
<div class="form-section">
<div class="form-grid">
<div>
<label for="name">Firmenname</label>
<input type="text" id="name" name="name" value="{{.Name}}" required>
</div>
</div>
</div>
<div class="form-actions">
<button type="submit">Umbenennen</button>
</div>
</form>
</div>
<h2>Nutzer</h2>
<ul class="beteiligte">

View File

@@ -13,8 +13,8 @@
{{if .Error}}<p class="fehler">{{.Error}}</p>{{end}}
<div class="form-card">
<form method="post" action="/betreiber/accounts">
<fieldset class="form-section">
<legend>Firma</legend>
<div class="form-section">
<h3 class="form-section-title">Firma</h3>
<div class="form-grid">
<div class="form-full">
<label for="account_name">Firmenname</label>
@@ -37,9 +37,9 @@
<input type="text" id="land" name="land" value="Deutschland" required>
</div>
</div>
</fieldset>
<fieldset class="form-section">
<legend>Abrechnung</legend>
</div>
<div class="form-section">
<h3 class="form-section-title">Abrechnung</h3>
<div class="form-grid">
<div>
<label for="rechnungsemail">Rechnungsemail</label>
@@ -50,9 +50,9 @@
<input type="text" id="ust_id" name="ust_id" placeholder="z. B. DE123456789">
</div>
</div>
</fieldset>
<fieldset class="form-section">
<legend>Erster Nutzer (wird Admin)</legend>
</div>
<div class="form-section">
<h3 class="form-section-title">Erster Nutzer (wird Admin)</h3>
<div class="form-grid">
<div>
<label for="email">E-Mail</label>
@@ -63,7 +63,7 @@
<input type="password" id="password" name="password" minlength="8" required>
</div>
</div>
</fieldset>
</div>
<div class="form-actions">
<button type="submit">Firma anlegen</button>
</div>

View File

@@ -14,8 +14,8 @@
{{if .Error}}<p class="fehler">{{.Error}}</p>{{end}}
<div class="form-card">
<form method="post" action="{{if .ID}}{{.ActionBase}}/{{.ID}}{{else}}{{.ActionBase}}{{end}}">
<fieldset class="form-section">
<legend>Grunddaten</legend>
<div class="form-section">
<h3 class="form-section-title">Grunddaten</h3>
<div class="form-grid">
<div>
<label for="name">Name</label>
@@ -35,10 +35,10 @@
<p class="hinweis">Tatsächliche Länder benennen, nicht "EU"/"Drittland" — die USA sind DSGVO-rechtlich bereits ein Drittland wie jedes andere.</p>
</div>
</div>
</fieldset>
</div>
<fieldset class="form-section">
<legend>Rechtliches &amp; Datenschutz</legend>
<div class="form-section">
<h3 class="form-section-title">Rechtliches &amp; Datenschutz</h3>
<div class="form-grid">
<div class="form-full">
<label>Zusicherungen</label>
@@ -66,10 +66,10 @@
<input type="text" id="subprozessoren" name="subprozessoren" value="{{.Subprozessoren}}">
</div>
</div>
</fieldset>
</div>
<fieldset class="form-section">
<legend>Einsatzbereich</legend>
<div class="form-section">
<h3 class="form-section-title">Einsatzbereich</h3>
<div class="form-grid">
<div class="form-full">
<label>Geeignete Zwecke</label>
@@ -84,10 +84,10 @@
<input type="text" id="einschraenkungen" name="einschraenkungen" value="{{.Einschraenkungen}}">
</div>
</div>
</fieldset>
</div>
<fieldset class="form-section">
<legend>Beleg</legend>
<div class="form-section">
<h3 class="form-section-title">Beleg</h3>
<div class="form-grid">
<div>
<label for="letzte_pruefung">Letzte Prüfung</label>
@@ -98,7 +98,7 @@
<input type="text" id="quelle" name="quelle" value="{{.Quelle}}" required>
</div>
</div>
</fieldset>
</div>
<div class="form-actions">
<button type="submit">Speichern</button>

View File

@@ -6,15 +6,25 @@
<h1>Einladung annehmen</h1>
<p class="hinweis">Sie treten dem Konto von <strong>{{.Firmenname}}</strong> bei.</p>
{{if .Error}}<p class="fehler">{{.Error}}</p>{{end}}
<div class="form-card">
<form method="post">
<label for="email">E-Mail</label>
<input type="email" id="email" name="email" required>
<label for="password">Passwort (mind. 8 Zeichen)</label>
<input type="password" id="password" name="password" minlength="8" required>
<button type="submit">Konto anlegen</button>
<div class="form-section">
<div class="form-grid">
<div>
<label for="email">E-Mail</label>
<input type="email" id="email" name="email" required>
</div>
<div>
<label for="password">Passwort (mind. 8 Zeichen)</label>
<input type="password" id="password" name="password" minlength="8" required>
</div>
</div>
</div>
<div class="form-actions">
<button type="submit">Konto anlegen</button>
</div>
</form>
</div>
<p><a href="/login">Schon ein Konto? Anmelden</a></p>
</div>
</body>

View File

@@ -18,8 +18,8 @@
{{if .Gespeichert}}<p class="hinweis">Gespeichert.</p>{{end}}
<div class="form-card">
<form method="post" action="{{.ActionBase}}/{{.Typ}}">
<fieldset class="form-section">
<legend>{{.Label}}{{if .IstUebersteuert}} <span class="hinweis">(eigene Vorlage)</span>{{else if eq .ActionBase "/verwaltung/email-vorlagen"}} <span class="hinweis">(Plattform-Standard, nicht angepasst)</span>{{end}}</legend>
<div class="form-section">
<h3 class="form-section-title">{{.Label}}{{if .IstUebersteuert}} <span class="hinweis">(eigene Vorlage)</span>{{else if eq .ActionBase "/verwaltung/email-vorlagen"}} <span class="hinweis">(Plattform-Standard, nicht angepasst)</span>{{end}}</h3>
<div class="form-grid">
<div class="form-full">
<label for="betreff">Betreff</label>
@@ -30,7 +30,7 @@
<textarea id="text" name="text" rows="10" required>{{.Text}}</textarea>
</div>
</div>
</fieldset>
</div>
<div class="form-actions">
<button type="submit">Speichern</button>
</div>

View File

@@ -53,30 +53,39 @@
{{else if .CanEntscheiden}}
<h2>Entscheiden</h2>
{{if .Error}}<p class="fehler">{{.Error}}</p>{{end}}
<div class="form-card">
<form method="post" action="/faelle/{{.ID}}/entscheiden">
<fieldset>
<legend>Entscheidung</legend>
<label><input type="radio" name="entscheidung" value="genehmigt" required> Genehmigt</label>
<label><input type="radio" name="entscheidung" value="genehmigt_mit_auflagen"> Genehmigt mit Auflagen</label>
<label><input type="radio" name="entscheidung" value="abgelehnt"> Abgelehnt</label>
<label><input type="radio" name="entscheidung" value="rueckfrage"> Rückfrage</label>
</fieldset>
{{if .WerkzeugOptionen}}
<label>Werkzeug (bei Genehmigung erforderlich)
<select name="werkzeug_id">
<option value="">— auswählen —</option>
{{range .WerkzeugOptionen}}<option value="{{.ID}}">{{.Name}}</option>{{end}}
</select>
</label>
{{end}}
<label>Begründung (Pflicht bei Abweichung vom Vorschlag)
<textarea name="begruendung" rows="3"></textarea>
</label>
<button type="submit">Entscheidung speichern</button>
<div class="form-section">
<div class="form-grid">
<div class="form-full">
<label>Entscheidung</label>
<div class="chip-group">
<label><input type="radio" name="entscheidung" value="genehmigt" required> Genehmigt</label>
<label><input type="radio" name="entscheidung" value="genehmigt_mit_auflagen"> Genehmigt mit Auflagen</label>
<label><input type="radio" name="entscheidung" value="abgelehnt"> Abgelehnt</label>
<label><input type="radio" name="entscheidung" value="rueckfrage"> Rückfrage</label>
</div>
</div>
{{if .WerkzeugOptionen}}
<div class="form-full">
<label for="werkzeug_id">Werkzeug (bei Genehmigung erforderlich)</label>
<select id="werkzeug_id" name="werkzeug_id">
<option value="">— auswählen —</option>
{{range .WerkzeugOptionen}}<option value="{{.ID}}">{{.Name}}</option>{{end}}
</select>
</div>
{{end}}
<div class="form-full">
<label for="begruendung">Begründung (Pflicht bei Abweichung vom Vorschlag)</label>
<textarea id="begruendung" name="begruendung" rows="3"></textarea>
</div>
</div>
</div>
<div class="form-actions">
<button type="submit">Entscheidung speichern</button>
</div>
</form>
</div>
{{else}}
<p class="hinweis">Noch keine Entscheidung getroffen. Nur die Rolle "Verantwortlicher" kann entscheiden.</p>
{{end}}

View File

@@ -14,8 +14,8 @@
{{if .Gespeichert}}<p class="hinweis">Gespeichert.</p>{{end}}
<div class="form-card">
<form method="post" action="/verwaltung/firma">
<fieldset class="form-section">
<legend>Firma</legend>
<div class="form-section">
<h3 class="form-section-title">Firma</h3>
<div class="form-grid">
<div class="form-full">
<label for="account_name">Firmenname</label>
@@ -38,9 +38,9 @@
<input type="text" id="land" name="land" value="{{.Land}}" required>
</div>
</div>
</fieldset>
<fieldset class="form-section">
<legend>Abrechnung</legend>
</div>
<div class="form-section">
<h3 class="form-section-title">Abrechnung</h3>
<div class="form-grid">
<div>
<label for="rechnungsemail">Rechnungsemail</label>
@@ -51,7 +51,7 @@
<input type="text" id="ust_id" name="ust_id" value="{{.UStID}}" placeholder="z. B. DE123456789">
</div>
</div>
</fieldset>
</div>
<div class="form-actions">
<button type="submit">Speichern</button>
</div>

View File

@@ -28,8 +28,8 @@
{{else}}
<div class="form-card">
<form method="post" action="/verwaltung/freigabe-regeln">
<fieldset class="form-section">
<legend>Neue Freigabe-Regel</legend>
<div class="form-section">
<h3 class="form-section-title">Neue Freigabe-Regel</h3>
<div class="form-grid">
<div>
<label for="bedingung">Bedingung</label>
@@ -55,7 +55,7 @@
</select>
</div>
</div>
</fieldset>
</div>
<div class="form-actions">
<button type="submit">Anlegen</button>
</div>

View File

@@ -20,8 +20,8 @@
<div class="form-card">
<form method="post" action="/verwaltung/genehmiger-rollen">
<fieldset class="form-section">
<legend>Neue Genehmiger-Rolle</legend>
<div class="form-section">
<h3 class="form-section-title">Neue Genehmiger-Rolle</h3>
<div class="form-grid">
<div>
<label for="name">Name</label>
@@ -32,7 +32,7 @@
<input type="text" id="beschreibung" name="beschreibung" placeholder="z. B. Prüft den Antrag aus Sicherheitssicht">
</div>
</div>
</fieldset>
</div>
<div class="form-actions">
<button type="submit">Anlegen</button>
</div>

View File

@@ -21,8 +21,8 @@
{{if .Gespeichert}}<p class="hinweis">Löschfristen gespeichert.</p>{{end}}
<div class="form-card">
<form method="post" action="/verwaltung/loeschfristen">
<fieldset class="form-section">
<legend>Maximale Aufbewahrungsdauer (Tage)</legend>
<div class="form-section">
<h3 class="form-section-title">Maximale Aufbewahrungsdauer (Tage)</h3>
<div class="form-grid">
{{range .Zeilen}}
<div>
@@ -31,7 +31,7 @@
</div>
{{end}}
</div>
</fieldset>
</div>
<div class="form-actions">
<button type="submit">Speichern</button>
</div>

View File

@@ -6,15 +6,26 @@
<h1>Anmelden</h1>
{{if .Error}}<p class="fehler">{{.Error}}</p>{{end}}
{{if .Message}}<p class="hinweis">{{.Message}}</p>{{end}}
<div class="form-card">
<form method="post" action="/login">
<label for="email">E-Mail</label>
<input type="email" id="email" name="email" required>
<label for="password">Passwort</label>
<input type="password" id="password" name="password" required>
<button type="submit">Anmelden</button>
<div class="form-section">
<h3 class="form-section-title">Anmelden</h3>
<div class="form-grid">
<div class="form-full">
<label for="email">E-Mail</label>
<input type="email" id="email" name="email" required>
</div>
<div class="form-full">
<label for="password">Passwort</label>
<input type="password" id="password" name="password" required>
</div>
</div>
</div>
<div class="form-actions">
<button type="submit">Anmelden</button>
</div>
</form>
</div>
<p><a href="/register">Noch kein Konto? Registrieren</a></p>
<p><a href="/passwort-vergessen">Passwort vergessen?</a></p>
</div>

View File

@@ -15,13 +15,22 @@
geschlossen wird.
</p>
{{if .Error}}<p class="fehler">{{.Error}}</p>{{end}}
<div class="form-card">
<form method="post" action="/verwaltung/nutzer/import" enctype="multipart/form-data">
<label for="csv">CSV-Datei</label>
<input type="file" id="csv" name="csv" accept=".csv,text/csv" required>
<button type="submit">Importieren</button>
<div class="form-section">
<div class="form-grid">
<div class="form-full">
<label for="csv">CSV-Datei</label>
<input type="file" id="csv" name="csv" accept=".csv,text/csv" required>
</div>
</div>
</div>
<div class="form-actions">
<button type="submit">Importieren</button>
</div>
</form>
</div>
</div>
</body>
</html>
{{end}}

View File

@@ -11,23 +11,34 @@
auf einem anderen Weg an die neue Person weitergegeben werden.
</p>
{{if .Error}}<p class="fehler">{{.Error}}</p>{{end}}
<div class="form-card">
<form method="post" action="/verwaltung/nutzer">
<label for="email">E-Mail</label>
<input type="email" id="email" name="email" required>
<label for="password">Initialpasswort (mind. 8 Zeichen)</label>
<input type="password" id="password" name="password" minlength="8" required>
<fieldset>
<legend>Rolle</legend>
{{range .Rollen}}
<label><input type="radio" name="role" value="{{.}}" required> {{.}}</label>
{{end}}
</fieldset>
<button type="submit">Nutzer anlegen</button>
<div class="form-section">
<div class="form-grid">
<div>
<label for="email">E-Mail</label>
<input type="email" id="email" name="email" required>
</div>
<div>
<label for="password">Initialpasswort (mind. 8 Zeichen)</label>
<input type="password" id="password" name="password" minlength="8" required>
</div>
<div class="form-full">
<label>Rolle</label>
<div class="chip-group">
{{range .Rollen}}
<label><input type="radio" name="role" value="{{.}}" required> {{.}}</label>
{{end}}
</div>
</div>
</div>
</div>
<div class="form-actions">
<button type="submit">Nutzer anlegen</button>
</div>
</form>
</div>
</div>
</body>
</html>
{{end}}

View File

@@ -6,11 +6,21 @@
<h1>Passwort vergessen</h1>
{{if .Error}}<p class="fehler">{{.Error}}</p>{{end}}
{{if .Message}}<p class="hinweis">{{.Message}}</p>{{end}}
<div class="form-card">
<form method="post" action="/passwort-vergessen">
<label for="email">E-Mail</label>
<input type="email" id="email" name="email" required>
<button type="submit">Link anfordern</button>
<div class="form-section">
<div class="form-grid">
<div class="form-full">
<label for="email">E-Mail</label>
<input type="email" id="email" name="email" required>
</div>
</div>
</div>
<div class="form-actions">
<button type="submit">Link anfordern</button>
</div>
</form>
</div>
<p><a href="/login">Zurück zur Anmeldung</a></p>
</div>
</body>

View File

@@ -5,12 +5,22 @@
<div class="page">
<h1>Neues Passwort setzen</h1>
{{if .Error}}<p class="fehler">{{.Error}}</p>{{end}}
<div class="form-card">
<form method="post" action="/passwort-zuruecksetzen/{{.Token}}">
<label for="password">Neues Passwort</label>
<input type="password" id="password" name="password" required minlength="8">
<button type="submit">Passwort setzen</button>
<div class="form-section">
<div class="form-grid">
<div class="form-full">
<label for="password">Neues Passwort</label>
<input type="password" id="password" name="password" required minlength="8">
</div>
</div>
</div>
<div class="form-actions">
<button type="submit">Passwort setzen</button>
</div>
</form>
</div>
</div>
</body>
</html>
{{end}}

View File

@@ -11,8 +11,8 @@
{{if .Error}}<p class="fehler">{{.Error}}</p>{{end}}
<div class="form-card">
<form method="post" action="/register">
<fieldset class="form-section">
<legend>Firma</legend>
<div class="form-section">
<h3 class="form-section-title">Firma</h3>
<div class="form-grid">
<div class="form-full">
<label for="account_name">Firmenname</label>
@@ -35,9 +35,9 @@
<input type="text" id="land" name="land" value="Deutschland" required>
</div>
</div>
</fieldset>
<fieldset class="form-section">
<legend>Abrechnung</legend>
</div>
<div class="form-section">
<h3 class="form-section-title">Abrechnung</h3>
<div class="form-grid">
<div>
<label for="rechnungsemail">Rechnungsemail</label>
@@ -48,9 +48,9 @@
<input type="text" id="ust_id" name="ust_id" placeholder="z. B. DE123456789">
</div>
</div>
</fieldset>
<fieldset class="form-section">
<legend>Erster Nutzer (wird Admin)</legend>
</div>
<div class="form-section">
<h3 class="form-section-title">Erster Nutzer (wird Admin)</h3>
<div class="form-grid">
<div>
<label for="email">E-Mail</label>
@@ -61,7 +61,7 @@
<input type="password" id="password" name="password" minlength="8" required>
</div>
</div>
</fieldset>
</div>
<div class="form-actions">
<button type="submit">Konto anlegen</button>
</div>