# Research: SvelteKit Integration ## Decision: SvelteKit SPA with FastAPI Backend ### Rationale SvelteKit provides a robust file-based routing system and shared layout mechanism that fulfills the requirements (FR-001, FR-002, FR-004, FR-005). By using `adapter-static` in SPA mode, we can generate a set of static files that can be served by the existing FastAPI backend, satisfying the constraint of no Node.js server in production (FR-003, Assumptions). ### Alternatives Considered - **Vanilla Svelte (Current)**: Lacks built-in routing and layout management, leading to manual implementation overhead. - **SvelteKit with Node.js Server**: Rejected because the project requires the Python backend to be the primary server. - **Inertia.js**: Requires more tight coupling between backend and frontend than desired for this project. ## Technical Implementation Details ### SvelteKit Configuration (SPA Mode) 1. **Adapter**: Use `@sveltejs/adapter-static`. 2. **Fallback**: Configure `fallback: 'index.html'` in `svelte.config.js`. 3. **Client-Side Rendering**: Create `src/routes/+layout.ts` with: ```typescript export const ssr = false; export const prerender = false; ``` This ensures the entire app is treated as a SPA. ### FastAPI Backend Integration 1. **Static Files**: Mount the `frontend/build` (or `dist`) directory using `StaticFiles`. 2. **SPA Routing**: Implement a catch-all route to serve `index.html` for any non-API request. This allows SvelteKit's client-side router to handle deep links like `/settings`. ```python @app.get("/{full_path:path}") async def serve_spa(full_path: str): # Check if path exists in static files, else serve index.html ... ``` ### Migration Strategy 1. **Layout**: Move shared UI (header, footer) from `App.svelte` to `src/routes/+layout.svelte`. 2. **Routes**: - `Dashboard.svelte` -> `src/routes/+page.svelte` (or `src/routes/dashboard/+page.svelte`) - `Settings.svelte` -> `src/routes/settings/+page.svelte` 3. **API Client**: Reuse existing `frontend/src/lib/api.js` but ensure it works within SvelteKit's load functions if needed (though for pure SPA, standard `onMount` or reactive statements also work). ## Best Practices - Use SvelteKit's `$lib` alias for shared components and utilities. - Leverage `+page.ts` `load` functions for data fetching to ensure data is ready before component mount (User Story 2). - Use SvelteKit's `goto` for programmatic navigation.