Vapora/docs/adrs/0003-leptos-frontend.md
Jesús Pérez 7110ffeea2
Some checks failed
Rust CI / Security Audit (push) Has been cancelled
Rust CI / Check + Test + Lint (nightly) (push) Has been cancelled
Rust CI / Check + Test + Lint (stable) (push) Has been cancelled
chore: extend doc: adr, tutorials, operations, etc
2026-01-12 03:32:47 +00:00

113 lines
2.3 KiB
Markdown

# ADR-003: Leptos CSR-Only para Frontend
**Status**: Accepted | Implemented
**Date**: 2024-11-01
**Deciders**: Frontend Architecture Team
**Technical Story**: Selecting WASM framework for client-side Kanban board UI
---
## Decision
Usar **Leptos 0.8.12 en modo Client-Side Rendering (CSR)** para frontend WASM, sin SSR.
---
## Rationale
1. **Fine-Grained Reactivity**: Similar to SolidJS (not virtual DOM), updates only affected nodes
2. **WASM Performance**: Compiles to optimized WebAssembly
3. **Deployment Simplicity**: CSR = static files + API, no server-side rendering complexity
4. **VAPORA is a Platform**: Not a content site, so no SEO requirement
---
## Alternatives Considered
### ❌ Yew
- Virtual DOM model (slower updates)
- Larger bundle size
### ❌ Dioxus
- Promising but less mature ecosystem
### ✅ Leptos CSR (CHOSEN)
- Fine-grained reactivity, excellent performance
- No SEO needed for platform
---
## Trade-offs
**Pros**:
- ✅ Excellent WASM performance
- ✅ Simple deployment (static files)
- ✅ UnoCSS integration for glassmorphism styling
- ✅ Strong type safety in templates
**Cons**:
- ⚠️ No SEO (not applicable for platform)
- ⚠️ Smaller ecosystem than React/Vue
- ⚠️ Leptos SSR available but adds complexity
---
## Implementation
**Leptos Component Example**:
```rust
#[component]
fn ProjectBoard() -> impl IntoView {
let (projects, set_projects) = create_signal(vec![]);
view! {
<div class="grid grid-cols-3 gap-4">
<For each=projects key=|p| p.id let:project>
<ProjectCard project />
</For>
</div>
}
}
```
**Key Files**:
- `/crates/vapora-frontend/src/main.rs` (app root)
- `/crates/vapora-frontend/src/pages/` (page components)
- `/crates/vapora-frontend/Cargo.toml` (dependencies)
---
## Verification
```bash
# Build WASM
trunk build --release
# Serve and test
trunk serve
# Check bundle size
ls -lh dist/index_*.wasm
```
**Expected**: WASM bundle < 500KB, components render reactively
---
## Consequences
- Team must learn Leptos reactive system
- SSR not available (acceptable trade-off)
- Maintenance: Leptos updates follow Rust ecosystem
---
## References
- [Leptos Documentation](https://leptos.dev/)
- `/crates/vapora-frontend/src/` (source code)
---
**Related ADRs**: ADR-001 (Workspace)