5.6 KiB
Plan — Organización de carpetas (web-player)
Plan de trabajo para agentes/IA. Cubre la estructura de directorios, no el sistema de diseño (para tokens/componentización visual ver
docs/frontend-refactor-plan.md, P0–P14, que sigue siendo la referencia para radios/tamaños/tipografía/colores). Basado en una lectura completa deweb-player/src(2026-09-22, ramaweb-player-ref).
Cómo usar este documento
- Cada fase (F1…F7) es independiente y es un commit. No mezcles fases.
- Al mover archivos: actualizar todos los imports que los referencian (
grepdel nombre viejo de ruta antes de dar la fase por cerrada). - Cierre de cada fase:
npm run checkynpm run lintlimpios (desdeweb-player/). - Al terminar una fase, marca su casilla en la sección Registro.
Orden recomendado: F1 → F2 → F3 → F4 → F6 (independientes entre sí, pueden ir en
cualquier orden). F5 es opcional y requiere confirmación explícita del usuario antes de
empezarla (cambia URLs públicas / config de Zitadel).
Diagnóstico
src/lib/raíz tiene 12 archivos sueltos mezclando estado reactivo (runes), helpers de dominio y utilidades genéricas.src/lib/components/raíz tiene 4 componentes de layout/chrome sueltos (niui/niplayer/).src/lib/components/ui/tiene 38 componentes en un único nivel, sin categorizar.src/routes/reparte auth en cuatro sitios distintos (/login,/logout,/auth/login,/auth/callback).
F1 — Agrupar estado reactivo
Crear src/lib/state/ y mover:
menus.svelte.tsnavigation.svelte.tsplaylists.svelte.tstoggle.svelte.ts
lib/player/*.svelte.ts y lib/theme/mode.svelte.ts se quedan donde están (ya tienen
dominio propio, no son huérfanos).
Cierre: imports actualizados, npm run check y npm run lint limpios.
F2 — Agrupar helpers de dominio
Crear src/lib/data/ y mover:
albums.tscollections.tsgenres.tsmixes.tsrecentlyPlayed.tssearch.ts
Cierre: igual que F1.
F3 — Utilidades genéricas
format.ts→src/lib/utils/format.ts.types.tsse queda en la raíz delib/(si crece mucho, pasar asrc/lib/types/index.tsen una fase futura — no crear la carpeta por adelantado).config.tsse queda en la raíz delib/(config global, un único archivo, no amerita carpeta).
Cierre: igual que F1.
F4 — Componentes de layout/chrome
Crear src/lib/components/layout/ y mover:
MobileHeader.svelteSidebar.svelteTabsBar.svelteTopBar.svelte
Cierre: igual que F1.
F5 (opcional, requiere confirmación) — Consolidar rutas de auth
Unificar /login, /logout, /auth/login, /auth/callback bajo /auth/:
/auth→ page (login screen, hoy en/login/+page.svelte)/auth/login→ server endpoint (ya existe)/auth/logout→ server endpoint (hoy/logout/+server.ts)/auth/callback→ server endpoint (ya existe)
Cambia URLs públicas. Si AUTH_REDIRECT_URI / AUTH_POST_LOGOUT_URI en la config de
Zitadel apuntan a las rutas actuales, hay que actualizarlas ahí también antes de mergear.
No empezar esta fase sin confirmación explícita.
F6 — Categorizar components/ui/
38 componentes en un único nivel dificultan el escaneo visual y el autocompletado del editor. Agrupar por categoría funcional (no por jerarquía atómica estricta — sería excesivo para este tamaño):
| Carpeta | Componentes | Criterio |
|---|---|---|
primitives/ |
Alert, BackLink, Button, Checkbox, Chip, EmptyState, Field, IconButton, InfiniteScroll, Input, Logo, SegmentedControl, Slider, Surface, Textarea | Piezas genéricas, sin conocimiento del dominio música |
overlay/ |
AccountMenu, ConfirmDialog, ContextMenu, GlassMenu, MenuItem, Modal | Todo lo que flota encima del contenido |
media/ |
ArtistLink, Artwork, Avatar, EqBars, ExplicitBadge, ListRow, MediaCard, MediaIdentity, PlayButton, TrackList | Específicos del dominio música/track |
forms/ |
AlbumForm, CoverForm, ImageDropzone, PlaylistForm | Formularios compuestos de entidad |
layout/ |
Page, PageHeader, SectionHeading | Andamiaje de página (distinto de components/layout/ de F4, que es el chrome global) |
Sin barrels/index.ts — actualizar cada ruta de import directamente, no hace falta esa
indirección para esto.
Hacer un sub-commit por categoría (mover + actualizar imports + npm run check) en vez
de mover las 38 de una vez, para mantener el diff revisable.
Cierre: las 5 subcarpetas creadas, ui/ raíz sin .svelte sueltos, imports
actualizados, npm run check y npm run lint limpios.
Registro
- F1 — estado reactivo →
lib/state/ - F2 — helpers de dominio →
lib/data/ - F3 — utilidades genéricas (
format.ts→lib/utils/) - F4 — componentes de layout/chrome →
components/layout/ - F5 — consolidar rutas de auth bajo
/auth/(opcional, pendiente de confirmación) - F6 — categorizar
components/ui/(primitives/overlay/media/forms/layout)