Skip to content

Randbedingungen

UJL ist ein Open-Source-Projekt (MIT) und wird von festen Randbedingungen geprägt: Barrierefreiheit nach WCAG 2.2, Datenschutz (DSGVO) und ein TypeScript/Svelte/Zod/Vite-Stack im pnpm-Monorepo. Für Bild-Workflows kann zusätzlich ein Library Service auf Basis von Payload CMS und PostgreSQL betrieben werden.

Qualität und Compliance: Das Framework richtet sich nach WCAG 2.2 für Barrierefreiheit und berücksichtigt rechtliche Anforderungen wie den European Accessibility Act und die DSGVO für Datenschutz. Performance ist für die Editor-Usability wichtig.

Technologie und Architektur: UJL basiert auf einem Svelte-basierten TypeScript-Stack und trennt strikt zwischen Inhalt und Design. Die Architektur ermöglicht flexibles Rendering über verschiedene Adapter.

Entwicklungsprozess: Automatisierte Qualitätssicherung (CI/CD), koordinierte Releases und strukturierte Workflows mit Code-Reviews sichern die Qualität des Open-Source-Projekts.

2.1 Technische Constraints

2.1.1 Technologie-Stack

ConstraintBeschreibungAuswirkung
Sprache & TypisierungTypeScript (strict) + ES ModulesDurchgängige Typisierung und konsistente Schnittstellen über Packages hinweg
UI-FrameworkSvelteEleganteste Entwicklungslösung für das Team; ermöglicht framework-agnostische Integration über Web Components. Wichtig für breite Nutzbarkeit, unabhängig vom Framework der Anwender.
UI-Bausteine & Stylingshadcn-svelte + Tailwind CSSKonsistentes UI-Grundgerüst, schnelle UI-Iteration, Utility-first Styling
Schema-ValidierungZodRuntime-Validierung + Type Inference (Schema-first Datenmodell)
Build & BundlingViteBewährtes Tooling für moderne Web-Pakete und Libraries
Repository-SetupMonorepo mit pnpm Workspaces + ChangesetsIndustriestandard für koordinierte Package-Entwicklung und Releases
Library ServicePayload CMS + PostgreSQLPayload CMS ist einfach zu bedienen und ermöglicht schnelle Backend-Konfiguration mit moderner API-Architektur, was für ein Frontend-lastiges Team wichtig ist. PostgreSQL ist eine performante Datenbank mit Vektordatenbank-Funktionalität für geplante semantische Suche.

2.1.2 Browser- & Plattform-Support

ConstraintBeschreibungAuswirkung
Web ComponentsWeb-Ausgabe kann als Custom Element eingebettet werdenFramework-agnostische Integration in Host-Seiten
Shadow DOMWeb-Component-Ausgabe nutzt Shadow DOM zur Style-IsolationVerhindert CSS-Konflikte mit Host-Anwendungen
Lokales Self-HostingLibrary Service kann per Docker/Docker Compose betrieben werdenNiedrige Einstiegshürde für Entwicklung und Self-Hosting

Evergreen Browser Support

Wir unterstützen vorerst nur moderne Browser mit ES2022-Features ohne Legacy-Support. So können wir eine moderne Gesamtarchitektur bauen und die Entwicklung beschleunigen.

2.1.3 Architektur-Constraints

Datenfluss - Aus der Redaktion zum Endkunden

Redakteur:innen erstellen Inhalte im Crafter und Designer:innen konfigurieren ein globales Theme. Diese Dokumente (.ujlc.json und .ujlt.json) werden vom Composer gegen Schemas validiert und in einen Abstract Syntax Tree transformiert. Dieser AST wird dann von Adaptern in konkrete Ausgabeformate gerendert, zum Beispiel als HTML/CSS/JS für universelle Einbettung. So wird sichergestellt, dass nur validierte, strukturierte Inhalte gerendert werden.

ConstraintBeschreibungAuswirkung
Trennung Content/ThemeInhalt (.ujlc.json) und Design (.ujlt.json) sind getrennte ArtefakteArchitektur erzwingt „Brand-Compliance by Design“
AST als ZwischenformatKomposition erzeugt ein AST als Transferformat zwischen Dokumenten und RenderingRendering-Ziele bleiben austauschbar (Adapter-Pattern)
Asynchrone KompositionKomposition/„compose“ ist asynchron (z. B. wegen Auflösung externer Daten wie Bilder)Schnittstellen und Aufrufer müssen Async unterstützen
Adapter-PatternRendering in unterschiedliche Targets über AdapterErleichtert Integration in verschiedene Stacks
Library ServiceSeparates Backend für AssetsAustauschbar über definierte Schnittstellen; Betrieb bei Bedarf

Abstract Syntax Tree (AST)

Ein Abstract Syntax Tree ist eine baumartige Datenstruktur, die die hierarchische Struktur eines Dokuments repräsentiert. In UJL wird das JSON-Dokument (.ujlc.json) zusammen mit dem Theme (.ujlt.json) vom Composer in einen AST transformiert. Dieser AST dient als Zwischenformat zwischen den Quelldokumenten und dem finalen Rendering.

Verschiedene Adapter können das gleiche AST in unterschiedliche Ausgabeformate transformieren (z. B. Svelte-Komponenten, Web Components, HTML, PDF), und neue Render-Targets können möglichst effizient implementiert werden.

-> Siehe auch Abstract Syntax Tree (Wikipedia)

2.1.4 Sicherheits-Constraints

ConstraintBeschreibungAuswirkung
Secrets im ClientKeine privilegierten Secrets im Frontend; serverseitige Vermittlung (BFF / Backend-for-Frontend) und Least-PrivilegeErhöhte Sicherheit durch Authentifizierung, reduziertes Risiko bei Client-Kompromittierung
Schreibzugriffe Library ServiceSchreiboperationen sind zu schützen (Authentifizierung/Autorisierung)Getrennte Rechte (read vs. write), rotierbare Tokens, auditable Zugriffe
EingabedatenExterne Daten (Import/CMS/Uploads) müssen validiert werdenKonsequente Schema-Validierung und defensives Rendering (XSS-/Injection-Vermeidung)

2.2 Organisatorische Constraints

2.2.1 Team & Entwicklungsprozess

ConstraintBeschreibungAuswirkung
Open SourceUJL wird als Open Source entwickelt (MIT)Transparenz, Nachvollziehbarkeit, Contributions möglich
CI/CDAutomatisierte Checks (Build, Lint, Tests)Gleichbleibende Qualitätsbasis und reproduzierbare Builds
Koordinierte ReleasesVersionierung/Release der Packages wird koordiniertKonsistente Paketstände, nachvollziehbare Änderungen

2.2.2 Branching-Strategie & Git-Workflow

ConstraintBeschreibungBranches
GitflowFeature-Branches → develop → mainmain (releases), develop (aktiv), feat/*, fix/*
Protected Branchesmain, develop (keine direkten Commits)Merge nur via Merge Requests mit Reviews
Conventional CommitsCommit Messages mit Präfixfeat:, fix:, docs:, refactor:, test:, chore:
Branch NamingLowercase mit Bindestrichenfeat/module-registry, fix/image-validation

2.2.3 Release-Management

ConstraintBeschreibungProzess
Semantic VersioningMAJOR.MINOR.PATCH nach SemVer 2.0.0Breaking Changes = MAJOR, Features = MINOR, Fixes = PATCH
Changesets WorkflowChangesets auf Feature-Branches erstellenpnpm changeset → Review → Merge → Release-PR
Koordinierte ReleasesAlle Packages zusammen releasenVersionsnummern synchron halten
Noch kein NPM-PublishingAktuell nur interne VersionierungVorbereitet für zukünftiges Public Publishing

2.2.4 CI/CD Pipeline

StageTools/CommandsZweck
installpnpm install --frozen-lockfileDependencies installieren, Cache nutzen
buildpnpm run buildAlle Packages + Docs builden
testpnpm run testVitest Unit Tests ausführen
qualitypnpm run lint, pnpm run checkESLint, TypeScript Type Checking
deployGitLab Pages (nur main/develop)Automatische Dokumentations-Deployments

2.3 Konventionen

2.3.1 Code-Konventionen

KonventionBeschreibungTool
PrettierTabs, Single Quotes, 100 Chars, keine Trailing Commas.prettierrc
ESLintRecommended + Unused Variables (underscores allowed)eslint.config.js
TypeScript Strictstrict: true, noImplicitAny: true, strictNullChecks: truetsconfig.json
Naming ConventionsPascalCase für Klassen/Components, camelCase für Funktionen/Variablen-
File Extensions.ts für Logic, .svelte für Components, .test.ts für Tests-

2.3.2 Testing-Konventionen

KonventionBeschreibungFramework
Unit Tests*.test.ts neben Source-FilesVitest (Jest-API)
E2E Testse2e/**/*.test.ts für User FlowsPlaywright (Chromium)
Test Attributesdata-testid nur bei PUBLIC_TEST_MODE=trueCustom Test-Utils
Coverage ReportsHTML Reports mit v8 ProviderVitest Coverage
CI Behavior2 Retries, 1 Worker (sequential)Playwright Config

Test-Pattern:

typescript
import { test, expect } from "@playwright/test";

test("should render navigation tree", async ({ page }) => {
	await page.goto("/");
	await expect(page.getByTestId("nav-tree")).toBeVisible();
});

2.3.3 Dokumentations-Konventionen

KonventionBeschreibungLocation
arc42 DocsArchitektur-Dokumentation in VitePressapps/docs/src/arc42/
Package READMEsMarkdown-READMEs pro Packagepackages/*/README.md
Code CommentsJSDoc für Public APIs, inline für komplexe LogikInline in Source
ChangelogsAutomatisch via Changesets generiertCHANGELOG.md pro Package
Type DocsTypeScript Types dienen als Dokumentation.d.ts Files

README-Struktur:

  1. Installation
  2. Usage (Quick Start)
  3. API Reference
  4. Examples
  5. Development Commands

2.3.4 Naming-Konventionen

BereichKonventionBeispiele
Packages@ujl-framework/<name>@ujl-framework/core, @ujl-framework/adapter-svelte
ComponentsPascalCase, beschreibendAdapterRoot.svelte, MediaPicker.svelte
Fileskebab-case für Svelte, camelCase für TSnav-tree.svelte, moduleRegistry.ts
TypesPascalCase mit PrefixUJLCDocument, UJLTTokenSet, UJLAbstractNode
FunctionscamelCase, Verb-firstcomposeModule(), validateUJLCDocument()
ConstantsUPPER_SNAKE_CASEDEFAULT_THEME, MAX_NESTING_DEPTH

Prefixes:

  • UJLC = Content-bezogen
  • UJLT = Theme-bezogen
  • UJL = Framework-übergreifend

2.4 Qualitäts-Constraints

2.4.1 Accessibility-Anforderungen

AnforderungStandardUmsetzung
WCAG 2.2 AAMindest-Kontrast 4.5:1 für TextOKLCH-Farbraum, automatische Kontrast-Berechnung
Keyboard-NavigationVollständige Tastatur-BedienbarkeitCtrl+C/X/V/I, Delete, Pfeiltasten im Crafter
Semantisches HTMLKorrekte HTML5-Strukturen<nav>, <main>, <article>, <section> in Modulen
Screen-Reader-SupportARIA-Labels, alt-Textealt-Attribute pflichtgemäß, ARIA-Labels wo nötig
Fokus-IndikatorenSichtbare FokuszuständeCustom Focus Styles in Tailwind

Work in Progress

Die vollständige Barrierefreiheit ist noch Work in Progress. Die Content-Frames sind bereits vollständig barrierefrei. Die vollständige Accessibility-Implementierung im Crafter selbst ist ein komplexes Unterfangen und wird noch etwas Zeit in Anspruch nehmen.

2.4.2 Performance-Anforderungen

MetrikZielwertMessung
Crafter Responsiveness<200 ms bei 200 ModulenManual Testing, Performance API
Bundle-Größe<100 KB (gzip)vite build --mode production + gzip
Initial Page Load<2s (3G Network)Lighthouse CI
Tree-to-Preview Sync<50 msPerformance API

Hinweis

Die angegebenen Performance-Zielwerte sind grobe Richtlinien. Die endgültigen Performance-Anforderungen müssen noch genau geprüft und festgelegt werden.

2.4.3 Maintainability-Anforderungen

AnforderungBeschreibungUmsetzung
Type Coverage100% TypeScript (keine .js Files)Strict Mode, keine any ohne Begründung
Test CoverageWichtige Pfade getestetVitest Unit Tests, Playwright E2E Tests
Code DuplicationDRY-Prinzip befolgenShared Utilities, abstrakte Base-Klassen
Documentation CoverageREADMEs für alle Public PackagesMarkdown-READMEs + arc42 Docs
Agentic CodingRepository ist für AI-Agenten optimiertAGENTS.md, .cursor/rules/, strukturierte Kontexte
Dependency UpdatesRegelmäßige Updates (Renovate/Dependabot)Automatisierte PRs (geplant)

2.5 Externe Abhängigkeiten

2.5.1 Wichtige Dependencies

  • Svelte (UI/Editor), Zod (Schema), Tailwind + shadcn-svelte (UI), Vite (Build), pnpm/Changesets (Monorepo/Release).
  • Betrieb bei Bedarf: Payload CMS + PostgreSQL für den Library Service.

2.5.2 Build-Tool-Dependencies

  • Tooling wird „State of the Art“ gehalten; konkrete Versionen sind in den Projektdateien gepflegt, nicht in dieser Doku.

2.6 Gesetze und Regularien

2.6.1 Barrierefreiheit

KontextStandardLink
EU-KontextEuropean Accessibility Act (Richtlinie (EU) 2019/882)EUR-Lex
Web-StandardWCAG 2.2W3C
Deutschland (öffentlich)BITV 2.0Gesetze im Internet

2.6.2 Datenschutz

AnforderungUmsetzung in UJL
DatenminimierungKeine Analytics/Tracking im Crafter
TransparenzOpen Source (vollständige Einsicht in Code)
PortabilitätExport/Import von UJL-Dokumenten (JSON)
Selbst-HostingDocker Compose für Library Service, keine Cloud-Abhängigkeit

DSGVO

Bei Betrieb/Hosting und bei Telemetrie/Logs gilt die DSGVO (Datenschutz-Grundverordnung) als rechtlicher Rahmen für personenbezogene Datenverarbeitung. EUR-Lex

2.6.3 Open Source Lizenzierung

UJL wird unter der MIT License veröffentlicht (Open Source Initiative). Contributions müssen mit der Lizenz kompatibel sein; Third-Party-Abhängigkeiten sind entsprechend zu prüfen.

UJL Crafter - Der erste Open-Source WYSIWYG Editor ohne Design-Chaos