diff --git a/docs/superpowers/plans/2026-10-05-weisses-design-p1-tote-klassen.md b/docs/superpowers/plans/2026-10-05-weisses-design-p1-tote-klassen.md new file mode 100644 index 0000000..86aea7a --- /dev/null +++ b/docs/superpowers/plans/2026-10-05-weisses-design-p1-tote-klassen.md @@ -0,0 +1,178 @@ +# P1 Task 4: tote Klassen und Übergangsschicht KOMPAT + +Ergebnis des Klassen-Abgleichs mit `css-klassen.mjs` (Werkzeug-Repo `$W`). Zeilenangaben beziehen sich auf `global.css` im Stand `a6877aa` (vor diesem Commit). Spec: Abschnitt „Übergangsschicht KOMPAT“. + +## Werkzeug + +`node "$W/css-klassen.mjs" "$WT" [--ohne-ausnahmen] [--mit-neu]` gibt JSON aus: `{ defined, used, dead, undefinedUsed }` und dazu `definedAt` (Name → Datei:Zeile), `prefixes`, `ausnahmen`, `laufzeit`, `neuOhneBenutzer`, `counts`. + +- **Definiert:** Klasse in einem Selektor in `global.css`, `chat.css`, `serverpuls.css`, `admin-areas.css` oder `pages/AdminPage.css` (Regeln in `@media` und `@container` zählen, `@keyframes` nicht). Geparst mit `postcss`. +- **Benutzt:** Wort in einem `className`-Ausdruck in `src/**/*.jsx` (Literale, Template-Strings, Zweige von `?:`, rechte Seite von `&&`, Teile einer `+`-Kette; Bedingungen und Vergleiche wie `filter === 'all'` zählen nicht; ein Ergebnis, das an Text klebt wie `fin-todo-${x || 'info'}`, ist nur ein Namensteil). Dazu Wörter aus Zeichenketten in `src/lib/*.js` und `src/hooks/*.js`, die eine definierte Klasse sind. Geparst mit `@babel/parser`. +- **Präfixe:** `xxx-${…}` oder `'xxx-' + …` deckt `xxx-*`. +- **Ausnahmeliste** (entfällt mit `--ohne-ausnahmen`): `fin-neg`, `fin-fixed-off`, `legal-tone-*`, `legal-version-*`, `badge-*`, `status-*`, `ticket-tab-active`, `ui-btn-*`, `side-dot-*`, `woms-chat`, `chat-*`. +- **NEU-Bereiche:** Regeln zwischen den Kommentaren `NEU-ANFANG` und `NEU-ENDE` in `global.css` (Basis, Hilfsklassen und Bausteine aus Task 2 und 3) sind das neue System; ihre Benutzer entstehen in P1 Task 5 bis 8 und in P2 bis P9. Eine Klasse mit einer Regel dort gilt nie als tot und steht in `neuOhneBenutzer` (mit `--mit-neu` zählt sie normal, so findet P10 unbenutzt gebliebene neue Klassen). Ohne diese Trennung stünden 77 neue Klassen als „tot“ in der Liste. +- **Laufzeit-Klassen** (gelten immer als benutzt): `u-*` (uPlot erzeugt `u-legend` im DOM) und `mine` (Modifikator der Sprechblasen des Chat-Bausteins aus dem Kundenportal, gesetzt über `renderMessage(…, { mine })` in `ChatThread.jsx`). + +## Ergebnis + +| Lauf | definiert | tot | +|---|---|---| +| Vor P1 (`bd84d22`, ohne NEU-Bereiche) | 514 | **67** | +| Vor diesem Task (`a6877aa`), roh | 594 | 144 | +| davon Laufzeit-Klassen (`mine`, `u-legend`) | | 2 | +| davon NEU-Bereiche (Task 2 und 3, noch ohne Benutzer) | | 77 | +| **Kandidaten (Altlast)** | | **65** | +| Nach diesem Task | 524 | 3 (siehe Gegenprobe) | + +Erwartet waren etwa 66 Namen (Grenzen 40 und 90). Der Lauf auf dem Stand vor P1 ergibt 67, die Altlast-Kandidaten im aktuellen Stand 65: Die Differenz sind `link-danger`, `num`, `nowrap`, `small`, `strong` und `xs` (jetzt NEU) sowie `mine` und `u-legend` (Laufzeit), dazu kommen `stat-label` und `stat-value` wie unten. + +## Gegenprobe + +Für jeden der 65 Kandidaten: `rg -w src --glob '!*.css'`. Bei Treffern zusätzlich mit genauer Wortgrenze (`rg -e '(^|[^A-Za-z0-9_-])($|[^A-Za-z0-9_-])' --glob '!*.css' src`), weil `-w` den Bindestrich als Wortgrenze behandelt und `stat-value` in `fin-stat-value` „findet“. + +- 62 Kandidaten: 0 Treffer. +- `stat-label`, `stat-value`: je 3 Treffer, alle in `fin-stat-label` und `fin-stat-value` (`AboCard.jsx`); mit genauer Wortgrenze 0, also tot. +- `success`: 71 Treffer, wirklich benutzt: `AdminPage.jsx` Zeile 25 setzt `admin-notice ${notice.type}` (`success` oder `error`). Bleibt. +- `admin-status`, `admin-empty-line`: 0 Treffer, tot, aber in `pages/AdminPage.css`, das nicht zu diesem Paket gehört (Task 9 und P8 fassen die Datei an). Bleiben vorerst. + +Gelöscht sind damit 62 Namen aus `global.css`. + +| Klasse | Definition (Stand `a6877aa`) | `rg -w` Treffer | Ergebnis | +|---|---|---|---| +| `admin-empty-line` | pages/AdminPage.css:361, pages/AdminPage.css:372 | 0 | tot, bleibt vorerst: Datei liegt ausserhalb dieses Pakets (P8 baut die Admin-Seite um) | +| `admin-status` | pages/AdminPage.css:280, pages/AdminPage.css:293 | 0 | tot, bleibt vorerst: Datei liegt ausserhalb dieses Pakets (P8 baut die Admin-Seite um) | +| `bg-amber` | global.css:494 | 0 | gelöscht | +| `bg-black` | global.css:487 | 0 | gelöscht | +| `bg-blue` | global.css:490 | 0 | gelöscht | +| `bg-blue-grey` | global.css:491 | 0 | gelöscht | +| `bg-dark-grey` | global.css:484, global.css:748, global.css:761 | 0 | gelöscht | +| `bg-green` | global.css:488 | 0 | gelöscht | +| `bg-light-grey` | global.css:485 | 0 | gelöscht | +| `bg-orange` | global.css:495 | 0 | gelöscht | +| `bg-teal` | global.css:489 | 0 | gelöscht | +| `bg-white` | global.css:486 | 0 | gelöscht | +| `bg-yellow` | global.css:493 | 0 | gelöscht | +| `btn-secondary` | global.css:593 | 0 | gelöscht | +| `col-12` | global.css:695 | 0 | gelöscht | +| `container` | global.css:504 | 0 | gelöscht | +| `control-panel-section` | global.css:1009, global.css:1014 | 0 | gelöscht | +| `dashboard-section` | global.css:1238 | 0 | gelöscht | +| `drop-zone` | global.css:963, global.css:972 | 0 | gelöscht | +| `fade-in` | global.css:1041 | 0 | gelöscht | +| `flex-col` | global.css:1321 | 0 | gelöscht | +| `form-select` | global.css:638, global.css:654, global.css:1308, global.css:1309 | 0 | gelöscht | +| `gap-1` | global.css:1324 | 0 | gelöscht | +| `gap-4` | global.css:1324 | 0 | gelöscht | +| `mb-1` | global.css:707 | 0 | gelöscht | +| `modal-content` | global.css:904 | 0 | gelöscht | +| `modern-card` | global.css:993, global.css:1003, global.css:1306, global.css:1307 | 0 | gelöscht | +| `mt-1` | global.css:704 | 0 | gelöscht | +| `nav-link` | global.css:545, global.css:553 | 0 | gelöscht | +| `nav-right` | global.css:558 | 0 | gelöscht | +| `navbar` | global.css:518 | 0 | gelöscht | +| `navbar-brand` | global.css:531 | 0 | gelöscht | +| `navbar-nav` | global.css:540, global.css:1095 | 0 | gelöscht | +| `priority-high` | global.css:838 | 0 | gelöscht | +| `priority-low` | global.css:836 | 0 | gelöscht | +| `priority-medium` | global.css:837 | 0 | gelöscht | +| `priority-none` | global.css:835 | 0 | gelöscht | +| `quick-actions` | global.css:1239 | 0 | gelöscht | +| `side-group-label` | global.css:1134, global.css:1138 | 0 | gelöscht | +| `slide-in` | global.css:1045 | 0 | gelöscht | +| `slider` | global.css:916, global.css:926, global.css:930, global.css:941, global.css:946, global.css:957 | 0 | gelöscht | +| `slider-container` | global.css:911 | 0 | gelöscht | +| `spacer` | global.css:609 | 0 | gelöscht | +| `stat-card` | global.css:1234 | 0 | gelöscht | +| `stat-info` | global.css:1235 | 0 | gelöscht | +| `stat-label` | global.css:1237 | 3, alle nur Teil von `fin-stat-label` | gelöscht | +| `stat-value` | global.css:1236 | 3, alle nur Teil von `fin-stat-value` | gelöscht | +| `stats-grid` | global.css:1233 | 0 | gelöscht | +| `success` | pages/AdminPage.css:99 | 71 | bleibt: dynamischer Modifikator `admin-notice ${notice.type}` (AdminPage.jsx:25, Typen `success`/`error`) | +| `table-hover` | global.css:600, global.css:604 | 0 | gelöscht | +| `text-black` | global.css:498 | 0 | gelöscht | +| `text-green` | global.css:500 | 0 | gelöscht | +| `text-large` | global.css:701 | 0 | gelöscht | +| `text-right` | global.css:699 | 0 | gelöscht | +| `text-small` | global.css:700 | 0 | gelöscht | +| `text-xlarge` | global.css:702 | 0 | gelöscht | +| `ticket-collapsed` | global.css:742, global.css:748 | 0 | gelöscht | +| `ticket-expanded` | global.css:755, global.css:761 | 0 | gelöscht | +| `ticket-id` | global.css:742, global.css:755, global.css:794, global.css:807 | 0 | gelöscht | +| `ticket-id-expanded` | global.css:807, global.css:811 | 0 | gelöscht | +| `ticket-info` | global.css:820 | 0 | gelöscht | +| `ticket-row` | global.css:715, global.css:720, global.css:727, global.css:731, global.css:735 | 0 | gelöscht | +| `ticket-time` | global.css:815 | 0 | gelöscht | +| `worksheet-cell` | global.css:771, global.css:777 | 0 | gelöscht | +| `worksheet-expansion` | global.css:767 | 0 | gelöscht | + +## Nicht gelöscht, obwohl der Abgleich sie roh nennt + +- **NEU (77, Task 2 und 3, Benutzer folgen):** `actions`, `brand`, `btn-block`, `btn-primary`, `btn-quiet`, `cell-sub`, `cell-title`, `check`, `code-input`, `count`, `critical`, `crumb`, `dialog`, `dialog-body`, `dialog-close`, `dialog-foot`, `dialog-head`, `dialog-wide`, `err`, `eyebrow`, `fact`, `facts`, `field-row`, `field-row-3`, `hide-md`, `hide-sm`, `hint`, `hot`, `input`, `is-invalid`, `k`, `kv`, `link-danger`, `loading`, `login`, `login-box`, `login-foot`, `login-links`, `main`, `menu-open`, `mobile-bar`, `msg`, `nav`, `nav-count`, `nav-dot`, `nav-item`, `neg`, `nowrap`, `num`, `page-head`, `paused`, `prose`, `right`, `scrim`, `search`, `section`, `select`, `select-quiet`, `shell`, `sidebar`, `sidebar-foot`, `small`, `stat`, `stats`, `strong`, `sub`, `sw`, `tab`, `table`, `table-foot`, `tabs`, `textarea`, `toast`, `two-col`, `v`, `who`, `xs` +- **Laufzeit (2):** `mine`, `u-legend`. +- **Nur durch die Ausnahmeliste am Leben** (Lauf mit `--ohne-ausnahmen`, 6 Namen): `chat-bubble`, `chat-input-row`, `chat-meta` (Sprechblasen und Eingabezeile kommen zur Laufzeit aus dem Chat-Baustein des Portals), `ui-btn-danger`, `ui-btn-sm` (`Button.jsx` setzt sie über die Tabelle `VARIANTS` und `size`; beide stehen in KOMPAT). `status-occupied` hat keinen Benutzer: `statusClass()` in `lib/ticketStatus.js` liefert nur `status-open`, `-working`, `-awaiting`, `-assigned` und `-closed`. Es ist gelöscht, die übrigen fünf stehen in KOMPAT. + +## Zusätzlich gelöscht (nicht tot, laut Plan) + +- Alle `!important` in `global.css`: 77 vorher, 0 nachher. Offen bleiben 6 in `pages/AdminPage.css` und 2 in `admin-areas.css` (beide Dateien gehören nicht zu diesem Paket; Task 9 und P8). +- `.btn-green, .btn-primary { … !important }` samt Hover und `.btn-secondary`; `.btn-dark`, `.btn-teal`, `.btn-green` stehen neu in KOMPAT. +- `.footer` (zweimal), `.navbar*`, `.nav-link`, `.nav-right`, `.ticket-row*`, `.ticket-collapsed`, `.ticket-expanded`, `.ticket-id*`, `.ticket-time`, `.ticket-info`, `.worksheet-expansion`, `.worksheet-cell`, `.slider*`, `.drop-zone`, `.modern-card`. +- Die Legacy-Responsive-Regeln (`@media (max-width: 768px)` mit `.col-6`, `.navbar-nav`, `.ticket-tab`); `.col-6 { width: 100% }` unter 768 px steht neu in KOMPAT. +- Die Keyframes `slideDown`, `fadeIn` und `slideIn` (`WorksheetList.jsx` bringt eigene in einem `