From 8a925782ab771bcae1914ab139353e483b8abd74 Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Tue, 18 Aug 2026 21:32:25 +0200 Subject: [PATCH] feat: add UI conformance and launch context --- .gitignore | 2 + webui/conformance/ConformanceApp.tsx | 210 ++++++++++++++++++ webui/conformance/conformance.css | 33 +++ webui/conformance/index.html | 12 + webui/conformance/main.tsx | 26 +++ .../snapshots/shared-ui-dark-desktop.png | Bin 0 -> 235838 bytes .../snapshots/shared-ui-light-desktop.png | Bin 0 -> 233314 bytes .../snapshots/shared-ui-light-narrow.png | Bin 0 -> 216286 bytes .../conformance/tests/ui-conformance.spec.ts | 75 +++++++ webui/package-lock.json | 97 +++++++- webui/package.json | 22 +- webui/playwright.conformance.config.ts | 47 ++++ webui/src/App.tsx | 3 + webui/src/components/PageLayout.tsx | 5 +- webui/src/components/UnsavedChangesGuard.tsx | 2 - webui/src/i18n/generatedTranslations.ts | 16 ++ webui/src/index.ts | 2 + webui/src/layout/AppShell.tsx | 30 ++- webui/src/layout/BreadcrumbBar.tsx | 51 ++++- webui/src/platform/ActiveObjectContext.tsx | 55 +++++ webui/src/platform/launchContext.ts | 126 +++++++++++ webui/src/styles/auth-gate.css | 8 +- webui/src/styles/badges.css | 2 +- webui/src/styles/components.css | 158 +++++++------ webui/src/styles/dialogs.css | 6 +- webui/src/styles/forms.css | 12 +- webui/src/styles/layout.css | 51 +++-- webui/src/styles/retention-policies.css | 2 +- webui/src/styles/tables.css | 16 +- webui/src/styles/tokens.css | 52 ++++- webui/src/types.ts | 45 ++++ webui/tests/launch-context.test.ts | 88 ++++++++ webui/tsconfig.conformance.json | 7 + webui/tsconfig.module-tests.json | 2 + webui/vite.conformance.config.ts | 12 + 35 files changed, 1125 insertions(+), 150 deletions(-) create mode 100644 webui/conformance/ConformanceApp.tsx create mode 100644 webui/conformance/conformance.css create mode 100644 webui/conformance/index.html create mode 100644 webui/conformance/main.tsx create mode 100644 webui/conformance/tests/snapshots/shared-ui-dark-desktop.png create mode 100644 webui/conformance/tests/snapshots/shared-ui-light-desktop.png create mode 100644 webui/conformance/tests/snapshots/shared-ui-light-narrow.png create mode 100644 webui/conformance/tests/ui-conformance.spec.ts create mode 100644 webui/playwright.conformance.config.ts create mode 100644 webui/src/platform/ActiveObjectContext.tsx create mode 100644 webui/src/platform/launchContext.ts create mode 100644 webui/tests/launch-context.test.ts create mode 100644 webui/tsconfig.conformance.json create mode 100644 webui/vite.conformance.config.ts diff --git a/.gitignore b/.gitignore index 252e52a..d218ddf 100644 --- a/.gitignore +++ b/.gitignore @@ -149,6 +149,8 @@ webui/.module-test-build/ webui/.policy-test-build/ webui/.template-preview-test-build/ webui/.import-test-build/ +webui/dist-conformance/ +webui/test-results/ # Security audit reports audit-reports/ diff --git a/webui/conformance/ConformanceApp.tsx b/webui/conformance/ConformanceApp.tsx new file mode 100644 index 0000000..294c75a --- /dev/null +++ b/webui/conformance/ConformanceApp.tsx @@ -0,0 +1,210 @@ +import { useMemo, useState } from "react"; +import { FileText, GitBranch, Inbox, Search, ShieldCheck } from "lucide-react"; +import { useLocation } from "react-router"; +import ActionToolbar, { ToolbarGroup } from "../src/components/ActionToolbar"; +import Button from "../src/components/Button"; +import Card from "../src/components/Card"; +import ContentGrid, { FormGrid } from "../src/components/ContentGrid"; +import ContentSection from "../src/components/ContentSection"; +import CountBadge from "../src/components/CountBadge"; +import DefinitionNodeIcon from "../src/components/DefinitionNodeIcon"; +import DefinitionPalette, { DefinitionPaletteGroup, DefinitionPaletteItem } from "../src/components/DefinitionPalette"; +import DescriptionList, { DescriptionItem } from "../src/components/DescriptionList"; +import Dialog from "../src/components/Dialog"; +import { DialogForm, DialogSection } from "../src/components/DialogAnatomy"; +import FilterBar from "../src/components/FilterBar"; +import FloatingStatus from "../src/components/FloatingStatus"; +import FormSection from "../src/components/FormSection"; +import MetricCard from "../src/components/MetricCard"; +import MetricGrid from "../src/components/MetricGrid"; +import PageLayout from "../src/components/PageLayout"; +import SelectionList, { SelectionListItem, SelectionListItemContent } from "../src/components/SelectionList"; +import StatePanel from "../src/components/StatePanel"; +import WorkspaceFrame from "../src/components/WorkspaceFrame"; +import WorkspaceLayout from "../src/components/WorkspaceLayout"; +import BreadcrumbBar from "../src/layout/BreadcrumbBar"; +import { useGuardedNavigate } from "../src/components/UnsavedChangesGuard"; +import { + createQuickAccessLaunchContext, + quickAccessLaunchState +} from "../src/platform/launchContext"; +import type { AuthInfo } from "../src/types"; + +export default function ConformanceApp() { + const [dialogOpen, setDialogOpen] = useState(false); + + return ( +
+ setDialogOpen(true)}>Prüfdialog öffnen} + > +
+

Aktionen, Filter und Status

+ + + + + + + + + + + + + 27 + + + } /> + } /> + Erneut versuchen} /> + +
+ +
+

Kennzahlen und Eigenschaften

+ + + + + + + +

Nachvollziehbare Entscheidung

+ + A-2026-004218 + Fachbereich Öffentlicher Raum und nachhaltige Mobilität + 18. August 2026, 14:42 Uhr + +
+
+ +
+

Listen- und Arbeitsbereich

+ + + + } title="Anwohnerparkausweis" description="A-2026-004218 · Prüfung läuft" /> + + + } title="Sondernutzung öffentlicher Fläche" description="A-2026-004219 · Rückfrage offen" /> + + + } + > + Bearbeiten}> +

Die Identität wurde geprüft. Ein aktueller Wohnsitznachweis muss noch bestätigt werden.

+ + + + + + +
+
+
+
+ +
+

Definitionsarbeitsbereich

+
+ + + } label="Bedingung prüfen" /> + } label="Freigabe anfordern" /> + + + + + Automatische Prüfung läuft … + +
+
+ + +
+ + setDialogOpen(false)} + footer={<>} + > + event.preventDefault()}> + +