Files
Musify/web-player
AdminandClaude Sonnet 5 a0c9c5fca9 web-player: P6 — menú contextual único (ContextMenu) + AccountMenu
Crea src/lib/components/ui/ContextMenu.svelte, que sustituye
TrackContextMenu y AlbumContextMenu (109 y 119 líneas, 90% idénticas):
misma función de posicionamiento (contextMenuPosition, exportada del
módulo, usando MENU_WIDTH/SUBMENU_WIDTH movidas a config.ts), mismo
backdrop, mismo Escape, mismo submenú "Añadir a playlist" genérico vía
{items, playlistAction, playlists}. Usa MenuItem para las acciones
(antes reimplementaban sus clases a mano) y Artwork size="xs" para las
miniaturas de playlist.

menus.svelte.ts (createTrackMenu) se adapta a la nueva
contextMenuPosition; se migran Inicio, Explorar (menú de pista y de
álbum) y Mezcla.

AccountMenu: panelClass (clases Tailwind libres) pasa a prop
width: 'sm'|'md'; añade cierre con Escape (mejora de accesibilidad,
antes no cerraba); TopBar y MobileHeader dejan de envolverlo en un
div.relative duplicado (su propio root ya lo es). z-index del panel
pasa a z-(--z-menu), al mismo nivel que ContextMenu (antes z-20 en
TopBar / sin z explícito en MobileHeader).

Verificado con npm run check/build; sin QA visual autenticada (Docker
no disponible en esta sesión).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 23:05:53 +02:00
..
2026-09-09 23:18:42 +02:00

web-player

Musify's web client: SvelteKit 2 (adapter-node), Svelte 5 runes, Tailwind 4, TypeScript. Authentication is server-side OIDC against Zitadel (openid-client and jose) with an encrypted session cookie; the backend is called from load functions and form actions through a typed openapi-fetch client.

Development

npm install
npm run dev      # :5173

Configuration lives in .env (template in .env.example). Bring the infrastructure stack up first (see ../deploy/README.md) and copy the WEB_CLIENT_ID / WEB_CLIENT_SECRET it writes to deploy/.env into this .env once, then run the dev server.

npm run check    # svelte-check — must be clean before closing a change
npm run lint     # prettier --check . && eslint .
npm run format   # prettier --write .
npm run build    # production build into build/
npm run gen:api  # regenerate src/lib/api/schema.d.ts from the running API

Production

Built and run as a container by the production stack — see ../deploy/README.md. There the same variables come from deploy/.env.prod through compose instead of from .env.

Conventions and the design system are documented in CLAUDE.md and in the musify-web skill.