2026-03-19 18:23:04 +01:00
# UI Boundaries (MUST / MUST NOT)
## Listen-Standard
2026-04-29 09:57:22 +02:00
1. MUST Listen über `initStandardListPage(...)` initialisieren.
2. MUST Filter-Toolbar über zentrale Helper/Partials rendern.
3. MUST aktive Chips/Drawer-Verhalten über Standard-Contracts laufen lassen.
2026-03-19 18:23:04 +01:00
4. MUST NOT direkt `gridFiltersFromSchema(...)` oder `initListFilterExperience(...)` in Listen-Templates verwenden.
5. MUST NOT Legacy-Filter-Toggle-Markup (`data-toolbar-toggle` , `data-filter-overflow` , `data-filter-toggle` ) neu einbauen.
2026-04-29 09:57:22 +02:00
6. MUST rowInteraction-Standard für Listen mit Row-Navigation beibehalten (sichtbare Action-Spalte + Enter + Doppelklick-Fallback).
2026-03-19 18:23:04 +01:00
7. MUST pageSize-Standard beibehalten (10/25/50/100, Toolbar rechts, URL > localStorage > default).
## Detailseiten-Standard
1. MUST Hauptformular mit `data-standard-detail-form="1"` markieren.
2026-04-29 09:57:22 +02:00
2. MUST Unsaved/Shortcut/Dirty-State über `initStandardDetailPage(...)` nutzen.
3. MUST Detail-Aktionen über Action-Policy-Contract (`data-detail-action-policy` , `data-detail-action-kind` , `data-detail-confirm-message` ) steuern.
2026-03-19 18:23:04 +01:00
4. MUST NOT inline `confirm(...)` (`onclick` / `onsubmit` ) auf standardisierten Detailseiten nutzen.
## Confirm + Telemetry Standard
2026-04-29 09:57:22 +02:00
1. MUST Confirm-Dialoge zentral über den globalen Confirm-Service abwickeln.
2026-03-19 18:23:04 +01:00
2. MUST NOT `window.confirm(...)` in App-JS oder inline HTML-Handlern verwenden.
2026-04-29 09:57:22 +02:00
3. MUST relevante Frontend-Warnpfade zentral über Frontend-Telemetrie erfassen.
2026-03-19 18:23:04 +01:00
4. MUST NOT relevante UX-/Fehlerpfade nur als Console-Warnung implementieren.
## Frontend Page-Module Hard Cut
2026-04-29 09:57:22 +02:00
1. MUST Seiteninitialisierung über dedizierte Module unter `web/js/pages/*` umsetzen.
2. MUST Page-Config über `script[type="application/json"]` + `readPageConfig(...)` bereitstellen/lesen.
3. MUST alle JS-`src` in `pages/**` und `templates/**` über `assetVersion('...js...')` laden.
2026-03-19 18:23:04 +01:00
4. MUST NOT inline `<script type="module">...</script>` in `pages/**` oder `templates/**` verwenden.
## Component Lifecycle Runtime
2026-04-29 09:57:22 +02:00
1. MUST migrierte Komponenten über `init(root, config)` + `destroy()` standardisieren.
2026-03-19 18:23:04 +01:00
2. MUST NOT migrierte Komponenten per `DOMContentLoaded` /Module-Sideeffect selbst auto-initialisieren.
3. MUST Listener, Timer und Observer, die in `init(...)` entstehen, in `destroy()` wieder abbauen.
2026-04-29 09:57:22 +02:00
4. MUST Runtime-Konfiguration über Page-Config (`readPageConfig(...)` ) beziehen, keine verteilten Ad-hoc-Globals.
5. MUST host-gebundene UI-Komponenten über explizite `data-app-component` -Hosts im Markup binden.
6. Global-Utilities ohne natürliches Host-Element MAY via Runtime `scope: 'global'` registriert werden, MÜSSEN aber denselben Lifecycle-Contract inkl. `destroy()` einhalten.
2026-03-19 18:23:04 +01:00
## Shared Partials
2026-04-29 09:57:22 +02:00
1. MUST Listen-Titlebar über `templates/partials/app-list-titlebar.phtml` rendern.
2. MUST List-Tabs über `templates/partials/app-list-tabs.phtml` rendern.
3. MUST Purge-Action über `templates/partials/app-list-purge-action.phtml` rendern.
4. MUST Detail-Validation-Summary über `templates/partials/app-details-validation-summary.phtml` rendern.
2026-03-19 18:23:04 +01:00
## RBAC in Templates
2026-04-29 09:57:22 +02:00
1. MUST UI-Capabilities nur über `$viewAuth` lesen.
2026-03-19 18:23:04 +01:00
2. MUST NOT `can('...')` in Templates verwenden.
## CSS Boundaries
2026-04-29 09:57:22 +02:00
1. MUST Styles möglichst lokal in `web/css/components` , `web/css/layout` oder `web/css/pages` halten.
2. MUST NOT globale unscoped Overrides ohne klaren Scope einführen.
2026-03-19 18:23:04 +01:00
3. MUST Vendor-Overrides nur in `web/css/vendor-overrides/**` pflegen.
4. MUST bestehende CSS-Variablen bevorzugen statt neue Inline-Farbwerte zu verteilen.
2026-04-15 18:44:29 +02:00
## Komponenten in Formularen
2026-04-29 09:57:22 +02:00
1. MUST Core-Button-Klassen (`secondary outline small` , `danger outline small` ) verwenden statt Custom-Button-CSS. Custom-CSS nur für Layout (z.B. `border-radius: 50%` ).
2026-04-15 18:44:29 +02:00
2. MUST `margin-bottom: 0` auf Buttons, Inputs, Selects und Labels innerhalb selbststaendiger Komponenten in Formularen resetten (Core setzt `margin-bottom: var(--app-spacing)` global).
3. MUST Checkboxen in Flex-Containern mit expliziter Groesse (`width: 1.25em; height: 1.25em` ) und `flex-shrink: 0` versehen (Core nutzt `appearance: none` mit Custom-Sizing).
4. MUST `position: sticky` mit `top: calc(var(--app-topbar-height) + ...)` verwenden, nicht `top: 0` (Topbar ist sticky).
5. MUST Icon-Only-Buttons mit `data-tooltip` und `aria-label` versehen.
6. MUST bei `grid-template-columns` mit mehr als einer Spalte ein `@media` -Fallback auf Single-Column definieren.
2026-04-29 09:57:22 +02:00
7. MUST bestehende `--app-*` CSS-Variablen für Farben verwenden, nie Farbwerte hardcoden.