aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/eu
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <code@mail.matthias.benkard.de>2026-08-23 09:41:36 +0200
committerMatthias Andreas Benkard <code@mail.matthias.benkard.de>2026-08-23 09:41:36 +0200
commit4c8dee7ea32cd72188643f62021d903deb84aab2 (patch)
treef402c8b1d195ce0bb9cede4d6cf6f94a17949634 /src/main/java/eu
parent18f85ced396b6eadfe0823e97ac6ed944d593f58 (diff)
Der Vordruck richtet sich nach einem wirklichen Vordruck
Die bisherige Gestaltung hatte sich am Begriff des amtlichen Formulars orientiert, nicht an einem solchen. Der Abgleich mit einem wirklichen Bundesvordruck — dem Antrag auf Erteilung einer Bescheinigung für den Lohnsteuerabzug bei erweiterter unbeschränkter Einkommensteuerpflicht — hat ergeben, dass sie in fast jedem Merkmal danebenlag. Maßgeblich ist eine einzige Regel, und sie steht im Muster ausgeschrieben: „Weiße Felder bitte ausfüllen“. Grau ist, was die Stelle gedruckt hat — Beschriftungen, Leitspalten, Abschnittsköpfe, die Verfügung am Ende; weiß ist, was der Antragsteller beiträgt. Bisher war es umgekehrt. Diese Regel trägt nun die gesamte Gestaltung und ist im Vordruck selbst benannt. Alles Übrige folgt daraus. Die Zellen stoßen aneinander, ohne Abstand und ohne Rundung, verbunden durch schwarze Haarlinien; die Rahmen sind halbiert, damit zwischen zwei Zellen eine einzige Linie steht. Die Beschriftung sitzt klein im Feld oben links, die Erläuterung in Klammern dahinter. Links läuft die Leitspalte mit den Abschnittsbezeichnungen. Das Ankreuzfeld wird angekreuzt, nicht angehakt. Der Abschnitt „Zur Beachtung:“ nimmt auf, was bisher über Tagline, Haftungsabsatz und noscript-Kasten verstreut war. Und die Meldung wird zur „Verfügung der Zentralstelle“, die auch dann schon dasteht, wenn sie noch leer ist — ein Vordruck zeigt seine Abschnitte, bevor sie ausgefüllt sind. Die Schmuckfarbe entfällt ersatzlos: Das Amtsrot war erfunden, wirkliche Bundesvordrucke führen keine. Rot und Grün bleiben allein dort, wo sie etwas bedeuten. Die Kennung wandert aus dem gerahmten Verzeichnis oben rechts in die Fußecken, links die Vordrucknummer, rechts der Ausgabestand. Die Synopse folgt demselben Gerüst. Ein weiterer Mangel ist dabei zutage getreten: Der Grund der Leitspalte hing am Block statt an der Zelle. Im Druck fällt die Fläche des Blocks weg, sodass die Leitspalte weiß herausgekommen wäre — und das Grau ist keine Zier, es sagt, welche Felder auszufüllen sind. Geprüft an allen drei Seiten und an zwei wirklichen Synopsen (UWG 19/0/6, AGG 23/1/14 als Entwurfsfassung), hell und dunkel, breit und schmal, dazu die Druckvorschau; reuse lint meldet 154/154, mvnw test dreihundertsiebenundzwanzig Testfälle ohne Fehler. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: Ie0303f71baf5905fc8255f15ff375015a1de483e
Diffstat (limited to 'src/main/java/eu')
-rw-r--r--src/main/java/eu/mulk/aendggner/synopse/HtmlRenderer.java430
1 files changed, 208 insertions, 222 deletions
diff --git a/src/main/java/eu/mulk/aendggner/synopse/HtmlRenderer.java b/src/main/java/eu/mulk/aendggner/synopse/HtmlRenderer.java
index 09a60de..6357b29 100644
--- a/src/main/java/eu/mulk/aendggner/synopse/HtmlRenderer.java
+++ b/src/main/java/eu/mulk/aendggner/synopse/HtmlRenderer.java
@@ -33,7 +33,7 @@ public final class HtmlRenderer {
.append(esc(synopse.alt().jurabk()))
.append("</title>\n<style>\n")
.append(CSS)
- .append("</style>\n</head>\n<body>\n");
+ .append("</style>\n</head>\n<body>\n<div class=\"bogen\">\n");
rendereKopf(sb, synopse, quelleBeschreibung, entwurfsfassung);
@@ -55,71 +55,76 @@ public final class HtmlRenderer {
rendereFuss(sb);
- sb.append("</body>\n</html>\n");
+ sb.append("</div>\n</body>\n</html>\n");
return sb.toString();
}
/**
- * Der Briefkopf des Vordrucks ÄG-2, im Aufbau derselbe wie auf der Aufgabeseite: links die
- * ausstellende Stelle, rechts die Kennung; darunter der Vorspann mit Herkunft und Statistik.
+ * Der Kopf des Vordrucks ÄG-2: Titel, ausstellende Stelle, darunter der Vorspann als
+ * Beschriftungsstreifen — grau, was die Stelle gedruckt hat, weiß die Eintragung daneben.
*/
private static void rendereKopf(
StringBuilder sb, Synopse synopse, String quelle, boolean entwurfsfassung) {
- sb.append("<header class=\"briefkopf\">\n<div class=\"dienststelle\">\n");
- sb.append("<p class=\"langname\">").append(LANGNAME).append("</p>\n");
- sb.append("<h1>Synopse: ").append(esc(synopse.alt().jurabk())).append("</h1>\n");
- if (synopse.alt().langue() != null) {
- sb.append("<p class=\"langue\">").append(esc(synopse.alt().langue())).append("</p>\n");
- }
- sb.append("</div>\n<dl class=\"kennung\">\n");
- sb.append("<dt>Formblatt</dt><dd>ÄG&#8209;2</dd>\n");
- sb.append("<dt>Stammgesetz</dt><dd>")
+ sb.append("<header>\n<h1>Synopse zum Stammgesetz ")
.append(esc(synopse.alt().jurabk()))
- .append("</dd>\n<dt>Erstellt</dt><dd>")
- .append(LocalDate.now())
- .append("</dd>\n");
- if (entwurfsfassung) {
- sb.append("<dt>Stand</dt><dd>Entwurfsfassung</dd>\n");
- }
- sb.append("<dt>Geltung</dt><dd>nichtamtlich</dd>\n");
- sb.append("</dl>\n</header>\n");
+ .append("</h1>\n<p class=\"stelle\">")
+ .append(LANGNAME)
+ .append("</p>\n</header>\n");
- sb.append("<div class=\"vorgang\">\n");
if (entwurfsfassung) {
sb.append(
- "<p class=\"entwurfshinweis\">Entwurfsfassung — nicht geltendes Recht. Die neue Fassung"
- + " gibt den Stand des Gesetzgebungsverfahrens wieder.</p>\n");
+ "<p class=\"entwurfshinweis\"><strong>Entwurfsfassung — nicht geltendes Recht.</strong>"
+ + " Die neue Fassung gibt den Stand des Gesetzgebungsverfahrens wieder.</p>\n");
}
- sb.append("<p class=\"quelle\">Grundlage: ").append(esc(quelle)).append("</p>\n");
+
long geaendert =
synopse.eintraege().stream()
.filter(e -> e.art() != Synopse.Aenderungsart.UNVERAENDERT)
.count();
- sb.append("<p class=\"statistik\">")
- .append(geaendert)
- .append(" geänderte Normen, ")
- .append(synopse.manuellZuPruefen().size())
- .append(" manuell zu prüfende Befehle</p>\n");
- sb.append("</div>\n");
+ sb.append("<dl class=\"vorspann\">\n");
+ vorspannZeile(sb, "Stammgesetz", synopse.alt().jurabk());
+ if (synopse.alt().langue() != null) {
+ vorspannZeile(sb, "Langbezeichnung", synopse.alt().langue());
+ }
+ vorspannZeile(sb, "Grundlage", quelle);
+ vorspannZeile(sb, "Erstellt am", LocalDate.now().toString());
+ vorspannZeile(
+ sb,
+ "Umfang",
+ geaendert
+ + " geänderte Normen, "
+ + synopse.manuellZuPruefen().size()
+ + " manuell zu prüfende Befehle");
+ vorspannZeile(sb, "Geltung", entwurfsfassung ? "nichtamtlich, Entwurfsstand" : "nichtamtlich");
+ sb.append("</dl>\n");
+ }
+
+ private static void vorspannZeile(StringBuilder sb, String bezeichnung, String wert) {
+ sb.append("<dt>")
+ .append(esc(bezeichnung))
+ .append("</dt><dd>")
+ .append(esc(wert))
+ .append("</dd>\n");
}
/**
- * Der Fußsteg. Der Vorbehalt gehört gerade hierher und nicht bloß auf die Aufgabeseite: Die
- * Synopse wird ausgedruckt und weitergereicht, das Formular nicht.
+ * Der Fußsteg trägt wie im Muster die Vordrucknummer links und den Ausgabestand rechts. Der
+ * Vorbehalt gehört gerade hierher und nicht bloß auf die Aufgabeseite: Die Synopse wird
+ * ausgedruckt und weitergereicht, das Formular nicht.
*/
private static void rendereFuss(StringBuilder sb) {
- sb.append("<footer>\n<span>Erstellt am ")
- .append(LocalDate.now())
- .append(" mit ÄndGgner</span>\n")
+ sb.append("<footer>\n<span class=\"vordrucknummer\">ÄG&#8209;2</span>\n")
.append(
- "<span class=\"nebenquelle\">Ohne Gewähr; maßgeblich ist allein die amtliche"
+ "<span>Erstellt mit ÄndGgner. Ohne Gewähr; maßgeblich ist allein die amtliche"
+ " Verkündung im jeweiligen Gesetz- oder Verordnungsblatt.</span>\n")
- .append("</footer>\n");
+ .append("<span class=\"ausgabe\">")
+ .append(LocalDate.now())
+ .append("</span>\n</footer>\n");
}
private static final String LANGNAME =
- "Nichtamtliche Zentralstelle für die maschinelle Fortschreibung von Stammgesetzen anhand"
- + " von Änderungsvorschriften des Bundes und der Länder";
+ "ÄndGgner — nichtamtliche Zentralstelle für die maschinelle Fortschreibung von Stammgesetzen"
+ + " anhand von Änderungsvorschriften des Bundes und der Länder";
private static void rendereGliederungsAenderungen(StringBuilder sb, Synopse synopse) {
if (synopse.gliederungsAenderungen().isEmpty()) {
@@ -251,45 +256,50 @@ public final class HtmlRenderer {
private static final String CSS =
"""
- /* Der Vordruck ÄG-2. Das Farbgerüst ist dasselbe wie in
- src/main/resources/eu/mulk/aendggner/web/style.css und wird hier ein zweites Mal
- geführt: Diese Datei wird aus einem blob:-Verweis geöffnet und im Befehlszeilen-
- betrieb als einzelne Datei abgelegt; sie kann kein fremdes Stilblatt einbinden.
- Wer dort etwas ändert, ändere es hier mit.
-
- Die Schrift ist geteilt: Der Vordruck — Briefkopf, Kennung, Überschriften,
- Spaltenköpfe, Kästchen, Fußsteg — steht in der Groteske, der Wortlaut der Normen
- in der Antiqua. Amtskopf und Vorschrift sind zweierlei, im Gesetzblatt wie hier.
-
- Farbe trägt allein die Änderung: rot heißt weg, grün heißt hinzu. Damit die
- Aussage auch im Schwarzweiß-Ausdruck und bei Farbfehlsichtigkeit erhalten bleibt,
- tritt zur Farbe stets die Form — durchgestrichen gegen unterstrichen — sowie die
- Spalte, in der sie steht. */
+ /* Der Vordruck ÄG-2, gesetzt nach demselben Muster wie die Aufgabeseite (siehe
+ src/main/resources/eu/mulk/aendggner/web/style.css): weißes Papier, schwarze
+ Haarlinien, grauer Raster für alles, was die Stelle gedruckt hat. Das Farbgerüst
+ wird hier ein zweites Mal geführt, weil diese Datei aus einem blob:-Verweis
+ geöffnet und im Befehlszeilenbetrieb als einzelne Datei abgelegt wird; sie kann
+ kein fremdes Stilblatt einbinden. Wer dort etwas ändert, ändere es hier mit.
+
+ Die Schrift ist geteilt: Der Vordruck steht in der Groteske, der Wortlaut der
+ Normen in der Antiqua. Amtskopf und Vorschrift sind zweierlei, im Gesetzblatt wie
+ hier.
+
+ Schmuckfarbe gibt es nicht. Farbe trägt allein die Änderung: rot heißt weg, grün
+ heißt hinzu. Damit die Aussage auch im Schwarzweiß-Ausdruck und bei
+ Farbfehlsichtigkeit erhalten bleibt, tritt zur Farbe stets die Form —
+ durchgestrichen gegen unterstrichen — sowie die Spalte, in der sie steht. */
:root {
color-scheme: light dark;
- --fg: #111;
- --bg: #fff;
- --papier: #f3f1ea;
- --muted: #595959;
- --raster: #d6d2c6;
- --kasten: #f0ede4;
- --amt: #8b0f21;
+ --fg: #000;
+ --papier: #fff;
+ --feld: #fff;
+ --grund: #d5d5d5;
+ --tint: #e4e4e4;
+ --linie: #000;
+ --muted: #444;
+ --tisch: #9a9a9a;
--del-bg: #ffd7d7;
--del-fg: #8b0000;
--ins-bg: #d7f5d7;
--ins-fg: #005f00;
- --grotesk: system-ui, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
+ --grotesk: Arial, "Helvetica Neue", Helvetica, system-ui, sans-serif;
--antiqua: Georgia, "Times New Roman", serif;
}
+ /* Im Dunkeln kehrt sich nicht die Farbe um, sondern das Verhältnis: Der Grund der
+ Stelle bleibt heller als das Feld. */
@media (prefers-color-scheme: dark) {
:root {
- --fg: #e6e6e6;
- --bg: #1c1c1c;
- --papier: #0f0f0f;
- --muted: #a0a0a0;
- --raster: #3c3c3c;
- --kasten: #242424;
- --amt: #e79aa4;
+ --fg: #e8e8e8;
+ --papier: #1a1a1a;
+ --feld: #101010;
+ --grund: #333333;
+ --tint: #242424;
+ --linie: #7a7a7a;
+ --muted: #a8a8a8;
+ --tisch: #000;
--del-bg: #5a1f1f;
--del-fg: #ffb3b3;
--ins-bg: #1f4a1f;
@@ -297,153 +307,136 @@ public final class HtmlRenderer {
}
}
* { box-sizing: border-box; }
- /* Die Unterlage endet nie, auch wenn der Bogen kürzer ist als das Fenster. */
- html { background: var(--papier); }
+ html { background: var(--tisch); }
body {
counter-reset: norm;
+ margin: 0;
+ padding: 1.5rem 1rem;
font-family: var(--grotesk);
- line-height: 1.5;
- max-width: 90rem;
- margin: 2rem auto 3rem;
- padding: 2rem 2.25rem 2.5rem;
- border: 1px solid var(--fg);
+ font-size: 0.8125rem;
+ line-height: 1.4;
color: var(--fg);
- background: var(--bg);
}
- /* Auf schmalen Geräten wäre der Bogenrand nur ein Verlust an Satzbreite. */
- @media (max-width: 48rem) {
- body { margin: 0; padding: 1.25rem 1rem 2rem; border: none; }
+ /* Ein Blatt Papier hat keinen Rahmen; die Kante entsteht aus dem Farbunterschied zur
+ Unterlage. Die Breite ist größer als beim Antrag, weil zwei Spalten sie brauchen. */
+ .bogen {
+ max-width: 88rem;
+ margin: 0 auto;
+ padding: 1.75rem 1.75rem 0.75rem;
+ background: var(--papier);
}
-
- /* Briefkopf und Doppellinie wie auf der Aufgabeseite: kräftig in Amtsrot, dünn in
- Rasterfarbe, wobei die zweite Linie der Oberrand des Vorspanns ist. */
- .briefkopf {
- display: grid;
- grid-template-columns: 1fr auto;
- gap: 1rem 2rem;
- align-items: end;
- padding-bottom: 0.7rem;
- border-bottom: 3px solid var(--amt);
+ @media (max-width: 40rem) {
+ body { padding: 0; }
+ .bogen { padding: 1rem 0.75rem 0.5rem; }
}
- .langname {
- margin: 0 0 0.3rem;
- max-width: 30rem;
+
+ h1 { margin: 0 0 0.5rem; font-size: 1rem; line-height: 1.35; }
+ .stelle { margin: 0 0 0.9rem; font-size: 0.6875rem; color: var(--muted); }
+
+ .entwurfshinweis {
+ margin: 0 0 0.9rem;
+ padding: 0.45rem 0.6rem;
+ border: 1px solid var(--linie);
+ border-left: 4px solid var(--del-fg);
+ background: var(--feld);
font-size: 0.75rem;
- letter-spacing: 0.05em;
- text-transform: uppercase;
- line-height: 1.35;
- color: var(--muted);
}
- .dienststelle h1 {
- margin: 0;
- font-size: 1.9rem;
- letter-spacing: 0.06em;
- line-height: 1.1;
- }
- .langue { margin: 0.35rem 0 0; font-style: italic; color: var(--muted); }
- .kennung {
+
+ /* Der Vorspann ist der Beschriftungsstreifen des Musters: links grau die Bezeichnung,
+ rechts weiß die Eintragung, Zelle an Zelle ohne Abstand. */
+ .vorspann {
display: grid;
- grid-template-columns: auto auto;
- gap: 0 0.6rem;
+ grid-template-columns: 10rem 1fr;
margin: 0;
- padding: 0.4rem 0.6rem;
- border: 1px solid var(--raster);
- font-size: 0.75rem;
- line-height: 1.5;
- }
- .kennung dt { letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); }
- .kennung dd { margin: 0; font-weight: bold; color: var(--amt); white-space: nowrap; }
- /* Gestapelt zöge die Kennung sonst über die ganze Breite und sähe aus wie ein Kasten
- des Satzspiegels statt wie ein Stempel am Kopfrand. */
- @media (max-width: 34rem) {
- .briefkopf { grid-template-columns: 1fr; align-items: start; }
- .kennung { justify-self: start; }
+ border-top: 1px solid var(--linie);
+ border-left: 1px solid var(--linie);
+ font-size: 0.6875rem;
}
-
- .vorgang { margin-top: 3px; padding-top: 1rem; border-top: 1px solid var(--raster); }
- .quelle, .statistik, .gliederung, .ursachen {
- color: var(--muted);
- font-size: 0.85rem;
- margin: 0.2rem 0;
+ .vorspann dt {
+ padding: 0.2rem 0.5rem;
+ border-right: 1px solid var(--linie);
+ border-bottom: 1px solid var(--linie);
+ background: var(--grund);
+ font-weight: bold;
}
- .entwurfshinweis {
- margin: 0 0 0.9rem;
- padding: 0.9rem 1.1rem;
- border: 1px solid var(--raster);
- border-left: 4px solid var(--del-fg);
- background: var(--kasten);
- font-size: 0.9rem;
+ .vorspann dd {
+ margin: 0;
+ padding: 0.2rem 0.5rem;
+ border-right: 1px solid var(--linie);
+ border-bottom: 1px solid var(--linie);
+ background: var(--feld);
+ overflow-wrap: anywhere;
}
- /* Der Spaltenkopf steht mit der Gegenüberstellung in einem Block und nicht mehr im
- Kopfblock: Nur so reicht sein Klebebereich über alle Normen und nicht bloß über den
- Vorspann. Seine beiden Felder tragen die Form der Legende des Antragsvordrucks. */
+ /* Der Spaltenkopf steht mit der Gegenüberstellung in einem Block: Sein Klebebereich
+ reicht damit über alle Normen und endet vor dem Abschnitt „Manuell prüfen“. Seine
+ beiden Felder sind Beschriftungsstreifen wie im Vordruck, also grau. */
.spaltenkopf {
display: grid;
grid-template-columns: 1fr 1fr;
- gap: 1rem;
+ gap: 0.75rem;
position: sticky;
top: 0;
z-index: 1;
margin-top: 1.25rem;
- padding: 0.6rem 0 0.6rem 3rem;
- background: var(--bg);
+ padding: 0.5rem 0 0.5rem 2.5rem;
+ background: var(--papier);
}
.spaltenkopf div {
- padding: 0.3rem 0.8rem;
- background: var(--fg);
- color: var(--bg);
- font-size: 0.8rem;
+ padding: 0.25rem 0.5rem;
+ border: 1px solid var(--linie);
+ background: var(--grund);
+ font-size: 0.6875rem;
font-weight: bold;
- letter-spacing: 0.08em;
- text-transform: uppercase;
}
- /* Der Steg links trägt die Randziffer, wie im Vordruck die Feldziffer; sie macht die
- Abschnitte überdies zitierbar. */
- section { position: relative; padding-left: 3rem; }
+ /* Der Steg links trägt die Randziffer in einem Kästchen, wie der Antrag das
+ Ankreuzfeld; sie macht die Abschnitte überdies zitierbar. */
+ section { position: relative; padding-left: 2.5rem; }
section.norm {
counter-increment: norm;
- padding-top: 1rem;
- padding-bottom: 1rem;
- border-bottom: 1px solid var(--raster);
+ padding-top: 0.9rem;
+ padding-bottom: 0.9rem;
+ border-bottom: 1px solid var(--linie);
}
section.norm::before {
content: counter(norm);
position: absolute;
- top: 1.15rem;
+ top: 1rem;
left: 0;
width: 1.5rem;
- height: 1.5rem;
- border: 1px solid var(--amt);
- color: var(--amt);
- font-size: 0.8rem;
+ height: 1.2rem;
+ border: 1px solid var(--linie);
+ background: var(--grund);
+ font-size: 0.6875rem;
font-weight: bold;
- line-height: 1.4rem;
+ line-height: 1.1rem;
text-align: center;
}
- section.norm h2 { font-size: 1.05rem; margin: 0 0 0.5rem; letter-spacing: 0.02em; }
+ section.norm h2 { font-size: 0.8125rem; margin: 0 0 0.15rem; }
+ .gliederung, .ursachen { color: var(--muted); font-size: 0.6875rem; margin: 0.1rem 0; }
.vergleich {
display: grid;
grid-template-columns: 1fr 1fr;
- gap: 1rem;
+ gap: 0.75rem;
align-items: start;
+ margin-top: 0.5rem;
}
- /* Die alte Fassung liegt auf dem Kastenton wie ein Durchschlag, die neue auf
- Bogenweiß; beim Springen zwischen den Spalten ist damit ohne Hinsehen klar, wo man
+ /* Die alte Fassung liegt auf dem hellen Raster wie ein Durchschlag, die neue auf dem
+ weißen Feld; beim Springen zwischen den Spalten ist damit ohne Hinsehen klar, wo man
steht. Die Hinterlegungen der Änderungen heben sich von beiden Gründen ab. */
.vergleich > div {
- padding: 0.75rem 0.9rem;
- border: 1px solid var(--raster);
+ padding: 0.5rem 0.6rem;
+ border: 1px solid var(--linie);
white-space: pre-wrap;
overflow-wrap: anywhere;
font-family: var(--antiqua);
- font-size: 0.95rem;
+ font-size: 0.875rem;
line-height: 1.45;
}
- .vergleich > .alt { background: var(--kasten); }
- .vergleich > .neu { background: var(--bg); }
+ .vergleich > .alt { background: var(--tint); }
+ .vergleich > .neu { background: var(--feld); }
del, .alt del {
background: var(--del-bg);
@@ -455,111 +448,104 @@ public final class HtmlRenderer {
color: var(--ins-fg);
text-decoration: underline;
}
- .leer { color: var(--muted); font-style: italic; }
+ .leer { font-family: var(--grotesk); font-size: 0.75rem; color: var(--muted); }
- /* Kästchen in Versalien; die Farbe folgt derselben Regel wie im Diff. Beschriftet
- sind sie ohnehin, sodass die Farbe hier nur bestätigt, was dasteht. Der Rahmen
- steht auch dort, wo die Hinterlegung schwach wirkt. */
+ /* Kästchen wie die Ankreuzfelder des Antrags: eckig, haarfein umrandet. Beschriftet
+ sind sie ohnehin, sodass die Farbe nur bestätigt, was dasteht. */
.badge {
font-family: var(--grotesk);
- font-size: 0.7rem;
+ font-size: 0.625rem;
font-weight: normal;
text-transform: uppercase;
- letter-spacing: 0.06em;
- border: 1px solid var(--raster);
- padding: 0.1rem 0.55rem;
+ border: 1px solid var(--linie);
+ padding: 0 0.4rem;
vertical-align: middle;
white-space: nowrap;
}
- .neu-badge { background: var(--ins-bg); color: var(--ins-fg); border-color: var(--ins-fg); }
- .aufgehoben-badge {
- background: var(--del-bg);
- color: var(--del-fg);
- border-color: var(--del-fg);
- }
- .geaendert-badge { border-color: var(--raster); color: var(--muted); }
+ .neu-badge { background: var(--ins-bg); color: var(--ins-fg); }
+ .aufgehoben-badge { background: var(--del-bg); color: var(--del-fg); }
+ .geaendert-badge { background: var(--grund); color: var(--fg); }
- /* Die Abschnittsüberschriften treten als Balken auf wie die Legende des Feldblocks. */
+ /* Die Abschnittsüberschriften sind Beschriftungsstreifen über die volle Breite, wie im
+ Muster die Zeile „Verfügung des Finanzamts“. */
section.gliederung-aenderungen > h2, section.manuell > h2 {
- display: inline-block;
- margin: 0 0 0.9rem;
- padding: 0.3rem 0.8rem;
- background: var(--fg);
- color: var(--bg);
- font-size: 0.8rem;
- font-weight: bold;
- letter-spacing: 0.08em;
- text-transform: uppercase;
+ margin: 0 0 0.6rem;
+ padding: 0.25rem 0.5rem;
+ border: 1px solid var(--linie);
+ background: var(--grund);
+ font-size: 0.75rem;
+ text-align: center;
}
section.gliederung-aenderungen { padding-top: 1.25rem; }
- section.manuell { margin-top: 2rem; padding-top: 1.5rem; border-top: 3px solid var(--amt); }
- section.manuell h3 {
- margin: 1.25rem 0 0.5rem;
- font-size: 0.8rem;
- letter-spacing: 0.06em;
- text-transform: uppercase;
- }
- section.manuell li { margin-bottom: 0.7rem; }
- .originaltext { font-family: var(--antiqua); color: var(--muted); font-size: 0.85rem; }
+ section.manuell { margin-top: 1.5rem; padding-top: 1.25rem; }
+ section.manuell h3 { margin: 1rem 0 0.4rem; font-size: 0.6875rem; }
+ section.manuell li { margin-bottom: 0.6rem; font-size: 0.75rem; }
+ .originaltext { font-family: var(--antiqua); color: var(--muted); font-size: 0.8125rem; }
+ /* Vordrucknummer links, Ausgabestand rechts, beide winzig und ohne Zierrat. */
footer {
display: flex;
flex-wrap: wrap;
+ align-items: baseline;
justify-content: space-between;
- gap: 0.5rem 1.5rem;
- margin-top: 2.5rem;
- padding-top: 0.9rem;
- border-top: 1px solid var(--fg);
- font-size: 0.8125rem;
+ gap: 0.4rem 1rem;
+ margin-top: 1.5rem;
+ padding: 0.4rem 0 0.6rem;
+ font-size: 0.625rem;
color: var(--muted);
}
+ .vordrucknummer, .ausgabe { white-space: nowrap; }
/* Zwei Spalten Gesetzestext nebeneinander sind auf dem Telefon nicht zu lesen. Gestapelt
trägt der Spaltenkopf nichts mehr; deshalb beschriftet sich dort jede Spalte selbst. */
@media (max-width: 60rem) {
.spaltenkopf { display: none; }
.vergleich { grid-template-columns: 1fr; }
- section { padding-left: 2.25rem; }
+ .vorspann { grid-template-columns: 7rem 1fr; }
+ section { padding-left: 2rem; }
.vergleich > div::before {
display: block;
- margin-bottom: 0.4rem;
+ margin: -0.5rem -0.6rem 0.4rem;
+ padding: 0.15rem 0.6rem;
+ border-bottom: 1px solid var(--linie);
+ background: var(--grund);
font-family: var(--grotesk);
- font-size: 0.7rem;
+ font-size: 0.625rem;
font-weight: bold;
- letter-spacing: 0.08em;
- text-transform: uppercase;
- color: var(--muted);
}
.vergleich > .alt::before { content: "Alte Fassung"; }
.vergleich > .neu::before { content: "Neue Fassung"; }
}
/* Gedruckt wird stets auf weißes Papier, auch aus einem dunkel eingestellten Browser
- heraus: prefers-color-scheme gilt im Druck fort. Deshalb ist hier das ganze
- Farbgerüst zurückzusetzen und nicht nur ein Teil davon — sonst käme die alte Spalte
- als schwarzer Block aus dem Drucker. */
+ heraus: prefers-color-scheme gilt im Druck fort. Deshalb ist das ganze Farbgerüst
+ zurückzusetzen und nicht nur ein Teil davon — sonst käme die alte Spalte als
+ schwarzer Block aus dem Drucker. */
@media print {
:root {
--fg: #000;
- --bg: #fff;
--papier: #fff;
+ --feld: #fff;
+ --grund: #d5d5d5;
+ --tint: #e4e4e4;
+ --linie: #000;
--muted: #333;
- --raster: #999;
- --kasten: #f2f0ea;
- --amt: #000;
+ --tisch: #fff;
--del-bg: #ffd7d7;
--del-fg: #8b0000;
--ins-bg: #d7f5d7;
--ins-fg: #005f00;
}
- body { margin: 0; padding: 0; max-width: none; border: none; font-size: 10pt; }
+ body { padding: 0; font-size: 9pt; }
+ .bogen { max-width: none; padding: 0; }
.spaltenkopf { position: static; }
.vergleich, section.norm { break-inside: avoid; }
- /* Ohne diese Festlegung wirft der Druck die Hinterlegung weg. Durchstreichung
- und Unterstreichung überstehen ihn ohnehin und tragen die Aussage auch dort,
- wo schwarzweiß gedruckt wird; der Spaltenbalken und der Durchschlagston der
- alten Fassung aber haben keine solche zweite Gestalt. */
+ /* Ohne diese Festlegung wirft der Druck die Hinterlegung weg. Durchstreichung und
+ Unterstreichung überstehen ihn ohnehin und tragen die Aussage auch dort, wo
+ schwarzweiß gedruckt wird; der Raster der Stelle aber hat keine solche zweite
+ Gestalt — er sagt, was gedruckt und was eingetragen ist. */
del, ins, .badge, .entwurfshinweis, .spaltenkopf div, .vergleich > .alt,
+ .vorspann dt, section.norm::before,
section.gliederung-aenderungen > h2, section.manuell > h2 {
-webkit-print-color-adjust: exact;
print-color-adjust: exact;