waffensachkunde

Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.

/ app src shared textabstand.ts

2,6 KB Rohdatei
app/src/shared/textabstand.ts — 57 Zeilen
1 /**
2 * Die Textabstände – Zeilen-, Wort- und Zeichenabstand in Stufen.
3 *
4 * **Warum es das gibt.** WCAG 1.4.12 (Textabstand) verlangt, dass sich Text
5 * mit weiterem Zeilen-, Wort- und Zeichenabstand darstellen lässt, ohne dass
6 * Inhalt verlorengeht. Im Browser erfüllt man das, indem man nutzereigene
7 * Stilblätter toleriert; der eigene Prüfplan stellt den Fall entsprechend mit
8 * einem Entwicklerwerkzeug-Stilblatt nach.
9 *
10 * In einer ausgelieferten Electron-Anwendung hat der Endnutzer aber weder
11 * Erweiterungen noch Entwicklerwerkzeuge — der Einzige, der die Abstände
12 * ändern könnte, ist die Anwendung selbst. Formal ist das kein Verstoß gegen
13 * 1.4.12: In einer geschlossenen Umgebung misst das Kriterium die Toleranz
14 * gegenüber Overrides, die es hier gar nicht geben kann. Es ist trotzdem eine
15 * Lücke, und zwar bei denen, für die das Kriterium geschrieben wurde:
16 * Menschen mit Legasthenie, mit Sehbehinderung, mit Konzentrationsstörungen.
17 * Für sie ist die (gute) Vorgabe 1,65 manchmal einfach zu eng.
18 *
19 * **Die Werte der weiteren Stufe** sind genau die aus 1.4.12: Zeilenhöhe das
20 * 1,5-fache der Schriftgröße, Wortabstand 0,16 em, Zeichenabstand 0,12 em.
21 * Weil die Anwendung schon bei 1,65 anfängt, liegt die weitere Stufe darüber
22 * und nicht darunter — das Kriterium nennt Mindestwerte, keine Sollwerte.
23 */
24
25 /** Die wählbaren Stufen. */
26 export const TEXTABSTAENDE = ['normal', 'weit', 'sehr-weit'] as const;
27
28 export type Textabstand = (typeof TEXTABSTAENDE)[number];
29
30 export const TEXTABSTAND_STANDARD: Textabstand = 'normal';
31
32 /** Beschriftung für die Bedienelemente und die Ansage. */
33 export const TEXTABSTAND_BEZEICHNUNG: Readonly<Record<Textabstand, string>> = Object.freeze({
34 normal: 'Normal',
35 weit: 'Weit',
36 'sehr-weit': 'Sehr weit',
37 });
38
39 /** Was die Stufe bewirkt – steht als erklärender Satz am Bedienelement. */
40 export const TEXTABSTAND_ERKLAERUNG: Readonly<Record<Textabstand, string>> = Object.freeze({
41 normal: 'Die gewohnte Darstellung.',
42 weit: 'Mehr Luft zwischen Zeilen, Wörtern und Buchstaben.',
43 'sehr-weit': 'Noch mehr Luft – für längere Texte am Stück.',
44 });
45
46 export function istTextabstand(wert: unknown): wert is Textabstand {
47 return typeof wert === 'string' && (TEXTABSTAENDE as readonly string[]).includes(wert);
48 }
49
50 export function textabstandBereinigen(wert: unknown): Textabstand {
51 return istTextabstand(wert) ? wert : TEXTABSTAND_STANDARD;
52 }
53
54 /** „Zeilenabstand: Weit“ – für die Live-Region nach dem Umstellen. */
55 export function textabstandAnsage(stufe: Textabstand): string {
56 return `Textabstand: ${TEXTABSTAND_BEZEICHNUNG[stufe]}.`;
57 }