mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-15 01:01:09 +02:00
- 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>
8.2 KiB
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:
- Beginner Mode - Visueller Drag-and-Drop Builder mit vorgefertigten Modulen
- Advanced Mode - HTML-Templates mit Variablen-System
- 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)
- ✅ Alte, nicht genutzte Types entfernen
- ✅ Discriminated Unions für CardConfig einführen
- ✅ Props-Interfaces konsolidieren
Phase 2: State Management (2-3 Tage)
- ✅ Svelte Stores für Cards implementieren
- ✅ Optimistic Updates einbauen
- ✅ Error Handling verbessern
Phase 3: Performance (3-4 Tage)
- ✅ Lazy Loading für Cards
- ✅ Virtual Scrolling für Listen
- ✅ IFrame-Pool für SafeHTMLCard
Phase 4: Features (1 Woche)
- ✅ Bessere Konvertierungs-Logik
- ✅ Module-Kommunikation
- ✅ 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:
- Überkomplexität der Type-Definitionen
- Fehlende zentrale State-Verwaltung
- Performance-Engpässe bei vielen Cards
- 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