mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-16 03:39:41 +02:00
Move inactive projects out of active workspace: - bauntown (community website) - maerchenzauber (AI story generation) - memoro (voice memo app) - news (news aggregation) - nutriphi (nutrition tracking) - reader (reading app) - uload (URL shortener) - wisekeep (AI wisdom extraction) Update CLAUDE.md documentation: - Add presi to active projects - Document archived projects section - Update workspace configuration Archived apps can be re-activated by moving back to apps/ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
333 lines
8.2 KiB
Markdown
333 lines
8.2 KiB
Markdown
# 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:**
|
|
|
|
```typescript
|
|
// 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:**
|
|
|
|
```typescript
|
|
// 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:**
|
|
|
|
```typescript
|
|
// 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:**
|
|
|
|
```typescript
|
|
// 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:**
|
|
|
|
```typescript
|
|
// 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:**
|
|
|
|
```typescript
|
|
// 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**
|
|
|
|
```typescript
|
|
// 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**
|
|
|
|
```typescript
|
|
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**
|
|
|
|
```typescript
|
|
// 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**
|
|
|
|
```typescript
|
|
// 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
|