managarten/uload/docs/reports/card-architecture-analysis.md
Till-JS c712a2504a feat: integrate uload and picture, unify package naming
- Add uload project with apps/web structure
  - Reorganize from flat to monorepo structure
  - Remove PocketBase binary and local data
  - Update to pnpm and @uload/web namespace

- Add picture project to monorepo
  - Remove embedded git repository

- Unify all package names to @{project}/{app} schema:
  - @maerchenzauber/* (was @storyteller/*)
  - @manacore/* (was manacore-*, manacore)
  - @manadeck/* (was web, backend, manadeck)
  - @memoro/* (was memoro-web, landing, memoro)
  - @picture/* (already unified)
  - @uload/web

- Add convenient dev scripts for all apps:
  - pnpm dev:{project}:web
  - pnpm dev:{project}:landing
  - pnpm dev:{project}:mobile
  - pnpm dev:{project}:backend

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 04:00:36 +01:00

8.2 KiB

Card-Architektur Analyse

Übersicht

Die Card-Architektur im uload-Projekt implementiert ein dreistufiges Rendering-System mit unterschiedlichen Komplexitätsstufen für verschiedene Nutzergruppen. Das System ist modular aufgebaut und bietet drei verschiedene Modi:

  1. Beginner Mode - Visueller Drag-and-Drop Builder mit vorgefertigten Modulen
  2. Advanced Mode - HTML-Templates mit Variablen-System
  3. Expert Mode - Direkter HTML/CSS Code-Editor

Architektur-Struktur

Kern-Komponenten

src/lib/components/cards/
├── Card.svelte              # Hauptkomponente - Router für verschiedene Modi
├── BaseCard.svelte          # Modular-System für Beginner Mode
├── TemplateCard.svelte      # Template-Engine für Advanced Mode
├── SafeHTMLCard.svelte      # Sandbox-Renderer für Expert Mode
├── types.ts                 # TypeScript Definitionen
└── modules/                 # Vorgefertigte Module
    ├── HeaderModule.svelte
    ├── ContentModule.svelte
    ├── LinksModule.svelte
    ├── MediaModule.svelte
    ├── StatsModule.svelte
    ├── ActionsModule.svelte
    └── FooterModule.svelte

Services

src/lib/services/
├── cardService.ts           # Business Logic, Konvertierung, DB-Operationen
└── cardSanitizer.ts         # Security, HTML/CSS Sanitization

Stärken der Architektur

1. Flexibles Multi-Mode System

  • Verschiedene Komplexitätsstufen für unterschiedliche Nutzergruppen
  • Nahtlose Konvertierung zwischen Modi möglich
  • Progressive Disclosure - Nutzer können mit einfachen Funktionen starten

2. Starke Security-Maßnahmen

  • DOMPurify für HTML-Sanitization
  • Sandbox-IFrames für Custom HTML
  • Content Security Policy (CSP) Integration
  • XSS-Prävention durch HTML-Escaping

3. Modulares Design

  • Wiederverwendbare Module
  • Klare Trennung von Concerns
  • Einfache Erweiterbarkeit durch neue Module

4. TypeScript Integration

  • Vollständige Typisierung aller Komponenten
  • Interfaces für alle Module und Konfigurationen
  • Type Guards und Validierung

Kritische Punkte & Verbesserungsvorschläge

1. Überkomplexe Type-Struktur ⚠️

Problem:

  • Zu viele überlappende Interfaces (357 Zeilen in types.ts)
  • UnifiedCard enthält optionale Configs für alle drei Modi gleichzeitig
  • Redundante Typen zwischen altem und neuem System

Lösung:

// Vereinfachte Struktur mit discriminated unions
type CardConfig =
	| { mode: 'beginner'; config: ModularConfig }
	| { mode: 'advanced'; config: TemplateConfig }
	| { mode: 'expert'; config: CustomHTMLConfig };

interface Card {
	id: string;
	metadata: CardMetadata;
	constraints: CardConstraints;
	config: CardConfig;
}

2. Fehlende State Management ⚠️

Problem:

  • Kein zentraler Store für Card-Zustände
  • Props-Drilling durch mehrere Ebenen
  • Keine Optimistic Updates

Lösung:

// Svelte Store für Card Management
import { writable, derived } from 'svelte/store';

export const cardStore = createCardStore({
	cards: new Map(),
	activeCard: null,
	editMode: false
});

3. Performance-Probleme bei vielen Cards ⚠️

Problem:

  • Jede Card rendert ein eigenes IFrame (SafeHTMLCard)
  • Keine Virtualisierung bei Listen
  • Fehlende Lazy Loading Strategie

Lösung:

// Intersection Observer für Lazy Loading
const cardObserver = new IntersectionObserver(
	(entries) => {
		entries.forEach((entry) => {
			if (entry.isIntersecting) {
				loadCard(entry.target.dataset.cardId);
			}
		});
	},
	{ rootMargin: '100px' }
);

4. Unvollständige Konvertierungs-Logik ⚠️

Problem:

  • Template zu Modular Konvertierung ist nur ein Stub
  • HTML zu Modular verwendet keine echte Analyse
  • Verlust von Information bei Mode-Wechsel

Lösung:

// AI-gestützte Konvertierung implementieren
async function convertToModular(html: string): Promise<ModularConfig> {
	const dom = parseHTML(html);
	const modules = await analyzeStructure(dom);
	return generateModularConfig(modules);
}

5. Fehlende Validierung ⚠️

Problem:

  • Keine Schema-Validierung für Card-Konfigurationen
  • Fehlende Grenzen für Module-Anzahl
  • Keine Größenbeschränkungen für Custom HTML/CSS

Lösung:

// Zod Schema für Validierung
import { z } from 'zod';

const CardSchema = z.object({
	renderMode: z.enum(['beginner', 'advanced', 'expert']),
	constraints: z.object({
		maxModules: z.number().max(20),
		maxHTMLSize: z.number().max(100000),
		maxCSSSize: z.number().max(50000)
	})
});

6. Unklare Module-Kommunikation ⚠️

Problem:

  • Module können nicht miteinander kommunizieren
  • Keine Events zwischen Modulen
  • Fehlende globale Card-Context

Lösung:

// Event Bus für Module
const cardEventBus = {
	emit: (event: string, data: any) => {},
	on: (event: string, handler: Function) => {},
	off: (event: string, handler: Function) => {}
};

Architektur-Verbesserungen

1. Vereinfachte Komponenten-Hierarchie

Card.svelte (nur Routing)
├── ModularCard.svelte (Beginner)
├── TemplateCard.svelte (Advanced)
└── CustomCard.svelte (Expert)

2. Centralized State Management

// stores/cards.ts
export const cardsStore = {
	cards: writable<Map<string, Card>>(),
	activeCard: writable<string | null>(),
	editMode: writable<boolean>(),

	// Actions
	createCard: async (config: CardConfig) => {},
	updateCard: async (id: string, updates: Partial<Card>) => {},
	deleteCard: async (id: string) => {},
	convertCard: async (id: string, targetMode: RenderMode) => {}
};

3. Plugin-System für Module

interface CardModule {
	name: string;
	component: Component;
	schema: ZodSchema;
	defaultProps: any;

	// Lifecycle hooks
	onMount?: () => void;
	onDestroy?: () => void;
	onPropsChange?: (props: any) => void;
}

// Registry für Module
const moduleRegistry = new Map<string, CardModule>();

4. Optimierte Rendering-Pipeline

// Virtual DOM für Performance
class CardRenderer {
	private cache = new Map();

	render(card: Card): VNode {
		const cached = this.cache.get(card.id);
		if (cached && !card.isDirty) return cached;

		const vnode = this.createVNode(card);
		this.cache.set(card.id, vnode);
		return vnode;
	}
}

5. Bessere Developer Experience

// Dev Tools Integration
if (import.meta.env.DEV) {
	window.__CARD_DEVTOOLS__ = {
		inspect: (cardId: string) => {},
		export: (cardId: string) => {},
		import: (config: any) => {},
		benchmark: () => {}
	};
}

Empfohlene Sofortmaßnahmen

Phase 1: Cleanup (1-2 Tage)

  1. Alte, nicht genutzte Types entfernen
  2. Discriminated Unions für CardConfig einführen
  3. Props-Interfaces konsolidieren

Phase 2: State Management (2-3 Tage)

  1. Svelte Stores für Cards implementieren
  2. Optimistic Updates einbauen
  3. Error Handling verbessern

Phase 3: Performance (3-4 Tage)

  1. Lazy Loading für Cards
  2. Virtual Scrolling für Listen
  3. IFrame-Pool für SafeHTMLCard

Phase 4: Features (1 Woche)

  1. Bessere Konvertierungs-Logik
  2. Module-Kommunikation
  3. Undo/Redo System

Fazit

Die Card-Architektur ist grundsätzlich gut durchdacht mit einem innovativen Multi-Mode Ansatz und starken Security-Features. Die Hauptprobleme liegen in:

  1. Überkomplexität der Type-Definitionen
  2. Fehlende zentrale State-Verwaltung
  3. Performance-Engpässe bei vielen Cards
  4. Unvollständige Features (Konvertierung, Validierung)

Mit den vorgeschlagenen Verbesserungen könnte das System:

  • 30-40% weniger Code benötigen
  • 2-3x bessere Performance erreichen
  • Deutlich wartbarer werden
  • Bessere Developer Experience bieten

Die Architektur hat eine solide Basis, benötigt aber Refactoring für Production-Readiness.

Metriken

  • Code-Komplexität: 7/10 (zu hoch)
  • Performance: 6/10 (verbesserungswürdig)
  • Security: 9/10 (sehr gut)
  • Wartbarkeit: 5/10 (needs improvement)
  • Erweiterbarkeit: 7/10 (gut)
  • Developer Experience: 6/10 (okay)

Gesamt-Bewertung: 6.7/10 - Solide Basis mit Verbesserungspotential