54 lines
2.4 KiB
Markdown
54 lines
2.4 KiB
Markdown
# CluPilot — verbindliche Regeln (Repo-Teil)
|
||
|
||
Die **Vollfassung der Regeln R1–R17 liegt beim Nutzer**, nicht im Repo. Die
|
||
Kurzfassung steht in `docs/handoffs/2026-07-25-clupilot-state-handoff.md` §9.
|
||
Bei Konflikt: **STOP & fragen.**
|
||
|
||
Diese Datei hält die Regeln fest, die aus konkreten Fehlern im laufenden Betrieb
|
||
entstanden sind — sie sind nicht verhandelbar und werden per Test erzwungen.
|
||
|
||
---
|
||
|
||
## R18 — Icon-Größe und Zeilenumbruch
|
||
|
||
**Ein Icon steht neben seinem Text, nie darüber, und nie größer als bestellt.**
|
||
|
||
Verboten:
|
||
|
||
1. **Icon zwingt den Text auf eine zweite Zeile.** Ein Navigationseintrag, ein
|
||
Button, ein Tabellen-Action ist **einzeilig**. Zwei Zeilen sind nur erlaubt,
|
||
wenn der Text selbst bewusst zweizeilig gesetzt ist (Label + Unterzeile) —
|
||
dann steht das Icon links davon, nicht darüber.
|
||
2. **Icon größer als die Zeile, in der es sitzt.** Standard ist `size-5` (20px)
|
||
in der Navigation, `size-4` (16px) in Buttons, Tabellen und Fließtext.
|
||
Größer nur, wenn es als eigenständiges Element gemeint ist (Leerzustand,
|
||
Statusplakette).
|
||
|
||
### Warum das zweimal schiefging
|
||
|
||
- **Zeilenumbruch.** Tailwinds Preflight setzt `svg { display: block }`. Ein
|
||
Icon in einem *inline*-Elternteil schiebt den folgenden Text damit auf die
|
||
nächste Zeile. Genau so wurde aus dem Eintrag „Zugangsdaten" ein doppelt so
|
||
hoher Kasten mit Schloss oben und Wort darunter.
|
||
- **Größe.** `.size-4` und `.size-5` haben **dieselbe Spezifität**, also
|
||
entscheidet die Reihenfolge im Stylesheet — und Tailwind gibt `.size-4` *vor*
|
||
`.size-5` aus. Eine Komponente, die `size-5` bedingungslos mitmergt, überstimmt
|
||
damit **jedes** `class="size-4"` am Aufrufort. Alle so geschriebenen Icons
|
||
liefen still auf 20px.
|
||
|
||
### Wie es jetzt gebaut ist
|
||
|
||
- `resources/views/components/ui/icon.blade.php` setzt seine Standardgröße
|
||
**nur**, wenn der Aufrufort keine `size-`/`w-`/`h-`-Klasse mitgibt, und
|
||
rendert `inline-block shrink-0 align-middle` statt des Preflight-`block`.
|
||
- `resources/views/components/ui/nav-item.blade.php` legt Label und Icon in eine
|
||
eigene Flex-Zeile, damit ein Icon auch im falschen Slot daneben landet.
|
||
- Icons in `<x-ui.nav-item>` gehören in `<x-slot:icon>`, nicht in den
|
||
Default-Slot.
|
||
|
||
### Erzwungen durch
|
||
|
||
`tests/Feature/IconLayoutTest.php` — Größe des Aufruforts gewinnt, Icon bleibt
|
||
`inline-block`, Nav-Eintrag bleibt einzeilig aus beiden Slots, und kein
|
||
Blade-File im Repo darf ein Icon am Icon-Slot vorbeischmuggeln.
|