Bausteine

Bausteine

Zehn Komponenten, mehr nicht — auch mit zehn Inhaltstypen. Jede ist ein HTML-Fragment mit eigener Kennung und einzeln nachladbar. Alle Werte kommen aus tokens.css.

Farben

eine Akzentfarbe, drei Status — unverändert
Akzent ok · geprüft warn · ungeprüft fehler neutral

Iteration 2 und 3 haben keinen einzigen Token ergänzt. Light und Dark teilen dieselben Namen; Umschalten setzt data-thema="dunkel" am html-Element.


1 · Shell

.shell / .leiste / .kopf / .bahn

Seitenleiste mit zehn Typen in vier Gruppen (Personen · Labor · Arbeit · Wissen), darunter Werkzeug. Die Gruppenüberschrift trägt die Ordnung, nicht die Linie. Unter 900px wird die Leiste zur waagerechten Kopfzeile; die Gruppentitel entfallen dort.

Zustände: Navigationspunkt: ruhend · Hover · aria-current="page". Thema: hell · dunkel.

<aside class="leiste">
  <a class="leiste__marke" href="/">…</a>
  <nav class="leiste__gruppe" aria-label="Labor">
    <span class="leiste__titel">Labor</span>
    <a class="navpunkt" href="/proben" aria-current="page">
      <svg class="ikon">…</svg><span>Proben</span><span class="navpunkt__zahl">1 204</span>
    </a>
  </nav>
</aside>

2 · Filter

.filter / .filterknopf / .suche · --gross --klein

Ein Formular für Suche und Filter. Die große Suche auf der Startseite ist dieselbe Komponente in --gross. Jede Änderung lädt nur die Ergebnisliste nach; die Werte reisen als Formulardaten, nicht als Client-State.

Zustände: Feld: leer · gefüllt · Fokus. Knopf: ruhend · Hover · gewählt (Radio in der Beschriftung).

<form class="filter" id="filter" hx-get="/fragmente/untersuchungen"
      hx-trigger="change, input changed delay:250ms"
      hx-target="#ergebnis" hx-swap="outerHTML">
  <div class="suche suche--klein">
    <svg class="ikon">…</svg>
    <input type="search" name="q" placeholder="Bezeichnung oder Methode">
  </div>
  <div class="filter__gruppe" role="group" aria-label="Prüfstatus">
    <label class="filterknopf">
      <input type="radio" name="pruef" value="" checked><span>alle</span>
    </label>
  </div>
  <div class="filter__rechts"><span class="filter__zahl">95 Leistungen</span></div>
</form>

3 · Datenzeile

.liste / .zeile / .gruppenkopf / .tagtrenner / .leerzustand

Ein Zeilenmuster für alle zehn Typen. Drei Varianten decken die neuen Fälle ab: Gruppenkopf für den Leistungskatalog, Tagestrenner für den Notizenstrom, knappe Zeile für lange Kataloge.

Zustände: ruhend · Hover · ungeprüft (Punkt vor dem Titel) · knapp (.zeile--knapp) · Leerzustand statt Liste. Gruppenköpfe kleben beim Scrollen (position: sticky).

<div class="liste" id="ergebnis">
  <div class="gruppenkopf" id="serologie">
    <b>Serologie</b><span class="gruppenkopf__zahl">10</span>
  </div>
  <a class="zeile zeile--knapp" href="/untersuchungen/l-03-001">
    <span class="zeile__haupt">
      <span class="zeile__titel">ELISA Salmonellen</span>
      <span class="zeile__unter">ELISA · Serum, Fleischsaft</span>
    </span>
    <span class="zeile__rechts">
      <span class="leise mono">L-03-001</span><span class="leise">Preis folgt</span>
    </span>
  </a>

  <div class="tagtrenner">Gestern · 19.09.2026</div>
  <a class="zeile zeile--ungeprueft" href="/notizen/n-02218">…
    <span class="schlagworte"><span class="abzeichen">Tierseuchen</span></span>
  </a>
</div>

4 · Abzeichen

.abzeichen · --geprueft --ungeprueft --fehler --akzent

Prüfstatus, Zustand, Priorität, Schlagwort, Gerätestatus. Nur die drei Status-Token plus neutral und Akzent.

Zustände: neutral (Schlagwort, Version, „geplant") · geprüft (auch „freigegeben", „in Betrieb") · ungeprüft (auch „unbestätigt", „Entwurf") · Fehler (auch „Störung") · Akzent.

<span class="abzeichen abzeichen--geprueft">in Betrieb</span>
<span class="abzeichen abzeichen--ungeprueft">unbestätigt</span>
<span class="abzeichen">Version 4.2</span>

5 · Herkunft

.herkunft / .herkunft__id / .maschine

Immer an derselben Stelle: Agent oder Mensch, Quelle als Link, Erstell- und Änderungsdatum. Dazu ID zum Kopieren und die Maschinenansicht. Unverändert aus Iteration 1, gilt für alle zehn Typen.

Zustände: Agent · Mensch · geändert von · nicht geprüft. In der Zeile gekürzt (.herkunft--zeile), am Rand senkrecht gestapelt.

<div class="herkunft">
  <span class="herkunft__teil"><span class="herkunft__wer">Agent</span> · Inventarabgleich</span>
  <span class="herkunft__teil">Quelle: <a href="…">odoo.intern/maintenance/equipment/33</a></span>
  <span class="herkunft__teil">erstellt 04.02.2021</span>
</div>

6 · Feldliste

.felder (dl) / .hinweis

Der Feldbereich jeder Detailseite. Verknüpfungen stehen als Link im Wert, nicht als eigener Block — so bleibt die Beziehung Tierarzt ↔ Betrieb ↔ Probe eine ruhige Liste und kein Graph.

Zustände: Wert · Wert mit Verknüpfung · Wert unbestätigt · leer. Darunter optional eine Hinweisbox (neutral, warn, akzent).

<dl class="felder">
  <dt>Betreuender Tierarzt</dt>
  <dd class="mit-link"><a href="/tieraerzte/t-00412">Dr. Lena Farwick</a>
    <span class="leise">Tierarztpraxis Seenland</span></dd>
  <dt>Bestandsgröße</dt><dd>48 000 Tiere in 4 Ställen</dd>
</dl>
<div class="hinweis">Autogene Impfstoffe schützen nicht gegen HPAI oder ASP.</div>

7 · Bewertung

.bewertung

Ein Klick, ein Fragment. Die Antwort ersetzt die Komponente durch das Ergebnis.

Zustände: offen (zwei Knöpfe) · bewertet (Ergebnis + zurücknehmen) · mit Zähler („bisher 3 × nützlich") · gesperrt.

<div class="bewertung" id="bewertung-n-02218"
     hx-post="/fragmente/bewertung/n-02218" hx-swap="outerHTML">
  <span class="bewertung__frage">War diese Meldung nützlich?</span>
  <button class="knopf knopf--klein" name="wert" value="ja">nützlich</button>
  <button class="knopf knopf--klein" name="wert" value="nein">nicht nützlich</button>
</div>

8 · Prompt-Panel

.prompt / .meldung

Der wichtigste Schreibweg, gleich für alle zehn Typen — und eine Simulation: Der Prompt wird kopiert, außerhalb des Systems beantwortet und das Ergebnis hier eingefügt. Einen direkten Modellaufruf enthält der Entwurf nicht. Die Aufgaben sind intern: Vollständigkeit prüfen, Verknüpfungen vorschlagen, Schlagworte vergeben — nie Text für Kunden oder Einsender. Ein Auswahlfeld kann den Ausschnitt bestimmen, aus dem der Prompt erzeugt wird; bei der SOP der Abschnitt.

Zustände: leer (Hinweis) · prüfend · Fehler (feldgenau, kein Entwurf) · Erfolg (Entwurf angelegt, ansehen oder verwerfen).

<section class="karte prompt">
  <form hx-get="/fragmente/sop/sop-lab-014/prompt" hx-trigger="change"
        hx-target="#prompt-text" hx-swap="outerHTML">
    <select name="abschnitt">…</select>
  </form>
  <pre class="prompt__text" id="prompt-text">…erzeugter Prompt…</pre>
  <form class="prompt__rueck" hx-post="/fragmente/rueckgabe/sop-lab-014"
        hx-target="#rueckgabe-status" hx-swap="outerHTML">
    <textarea name="ergebnis"></textarea>
    <div class="meldung meldung--ok" id="rueckgabe-status">…</div>
    <button class="knopf knopf--haupt">Prüfen und als Entwurf anlegen</button>
  </form>
</section>

9 · Formular

.formular / .feld / .knopf / .meldung

Kurze Erfassung mit höchstens fünf Feldern. Validierung je Feld, Erfolg ersetzt das ganze Formular. Knopf und Feld sind Primitive dieser Komponente.

Zustände: Feld: ruhend · Fokus · Fehler (data-zustand="fehler") · Hinweis. Formular: leer · abgeschickt · Erfolg.

<div class="feld" data-zustand="fehler">
  <label for="v-probe">Verknüpfte Probe</label>
  <input id="v-probe" name="probe" aria-invalid="true"
         hx-post="/fragmente/pruefe/probennummer" hx-trigger="change"
         hx-target="#v-probe-fehler" hx-swap="outerHTML">
  <span class="feld__fehler" id="v-probe-fehler">Unbekannte Probennummer.</span>
</div>

10 · Lesetext

neu .lesen / .lesetext / .rand / .hinweis

Neu in Iteration 2 und die einzige Langtext-Ansicht: die SOP. Nötig, weil MDX-Fließtext mit Überschriften, Listen, Tabellen und Hinweisboxen mit Feldliste und Datenzeile nicht darstellbar ist — beide sind auf kurze Werte ausgelegt. Zweispaltig: Text bis 68 Zeichen, rechts das mitlaufende Inhaltsverzeichnis. Unter 900px wandert das Verzeichnis nach oben.

Zustände: Absatz, Liste, Tabelle, Code, Hinweisbox (neutral · warn · akzent). Verzeichnis: Eintrag · Untereintrag (.tief) · laufend (aria-current="true").

<div class="lesen">
  <article class="lesetext">
    <div class="hinweis hinweis--akzent"><div><b>Diese Fassung gilt.</b> …</div></div>
    <h2 id="ablauf">3 Ablauf</h2>
    <p>…</p>
    <ol><li>Sichtprüfung der Umverpackung</li></ol>
    <table><thead><tr><th>Material</th><th>Lagerung</th></tr></thead>…</table>
  </article>
  <aside class="rand">
    <span class="rand__titel">Inhalt</span>
    <nav aria-label="Inhaltsverzeichnis">
      <a href="#ablauf" aria-current="true">3 Ablauf</a>
      <a class="tief" href="#ablauf-annahme">3.1 Annahme</a>
    </nav>
  </aside>
</div>

Korrekturen in Iteration 3

vor den neuen Typen erledigt
  • Ticket statt Vorgang. Navigation, Listen, Detailseiten, Schnell-Erfassung, Feldnamen und Endpunkt (/fragmente/ticket) tragen durchgehend den Begriff Ticket.
  • Kein style-Attribut mehr im Markup. Alle Inline-Stile sind in Klassen aufgegangen: .startblock, .statusreihe, .knopfreihe, .probenreihe, .stapel, .nachsatz, .feldname, .feld--breit, .karte__ueberschrift, .meldung--oben, .hinweis--abstand, .trenner--eng, .leerzustand--knapp, .suche--kopf, .suche--breit, .zeile__unter--lang, .herkunft--stapel, .bewertung__zaehler. Varianten der bestehenden zehn Komponenten, keine neue dabei.
  • Testadressen auf @test.invac.eu.
  • Schrift selbst gehostet. schrift.css mit @font-face auf assets/schrift/, kein Google-Fonts-Link mehr in den Seiten.
  • Prompts nur mit internen Aufgaben: Vollständigkeit prüfen, Verknüpfungen vorschlagen, Schlagworte vergeben. Kein Prompt erzeugt Text für Kunden oder Einsender, keiner bewertet Befunde. Das Panel bleibt eine Simulation — kopieren, extern beantworten lassen, Ergebnis einfügen; einen direkten Modellaufruf gibt es im Entwurf nicht.

Abweichungen von Iteration 1

vollständig
  • Suche ist in Filter aufgegangen. Beide waren dasselbe Formular mit denselben Klassen; als getrennte Komponenten gezählt wären es mit Lesetext elf. Das Markup ändert sich nicht, nur die Zählung.
  • Neu: Lesetext. Die einzige Komponente, die dazugekommen ist. Begründung: MDX-Langtext mit Überschriften, Tabellen und Hinweisboxen lässt sich mit Feldliste oder Datenzeile nicht darstellen — beide sind für kurze Werte gebaut. Betrifft nur den Typ SOP.
  • Drei Varianten statt neuer Komponenten: Gruppenkopf (Leistungskatalog), Tagestrenner (Notizenstrom) und knappe Zeile gehören zur Datenzeile. Schlagworte sind Abzeichen, der Gerätestatus ist ein Abzeichen, die Hinweisbox gehört zu Feldliste und Lesetext.
  • Shell wächst von fünf auf zehn Einträge in vier Gruppen mit Überschrift. Keine neue Struktur, nur mehr .leiste__gruppe.
  • Prompt-Panel kann einen Ausschnitt wählen (Abschnitt der SOP). Ein Auswahlfeld, ein Fragment mehr — keine neue Komponente.
  • Keine neuen Tokens, keine neue Schrift, keine zweite Akzentfarbe. Einzige Änderung an tokens.css seit der Abnahme: --farbe-text-3 von #858F92 auf #6B7578 wegen Kontrast — das war eine Korrektur, keine Erweiterung.

Was das System bewusst nicht enthält

  • Keine Kennzahlenwand. Zahlen erscheinen nur dort, wo sie eine Liste erklären.
  • Keine Diagramme — auch nicht beim Gerät. Stammdaten und Status, keine Messkurven.
  • Kein Graph. Beziehungen zwischen Tierarzt, Betrieb und Proben sind verknüpfte Listen.
  • Kein Brett zum Ziehen, keine virtuellen Tabellen, keine Modalkaskaden.
  • Keine zweite Akzentfarbe, keine Verläufe, eine Schattenstufe, eine Schrift.
  • Kein eigener Chat und kein Modellaufruf. Das Modell läuft beim Nutzer; das System liefert den Prompt und nimmt das Ergebnis strukturiert zurück.
  • Keine Prompts nach außen. Kein erzeugter Text richtet sich an Kunden oder Einsender.
  • Kein stilles Schreiben durch Agenten. Alles, was ein Agent anlegt, ist sichtbar „ungeprüft" und bleibt lesbar, bis ein Mensch es bestätigt.
  • Kein Preis im Katalog. Solange die Preisliste nicht angebunden ist, steht dort „Preis folgt" — kein Platzhalterbetrag.
  • Keine Rollenlogik im Prototyp. Rechte, Mandanten und Löschfristen sind offen und werden nicht angedeutet.

Screens

12