···26262727## Testing Guidelines
28282929-- There is no dedicated test runner yet. Use `pnpm check` and `pnpm lint` before submitting changes.
2929+- There is no dedicated test runner yet.
3030+- **Before submitting changes, you must:**
3131+ 1. Run `pnpm check` - Must complete with **0 errors and 0 warnings**
3232+ 2. Run `pnpm format` - Format all code with Prettier
3333+ 3. Run `pnpm lint` - Ensure no linting errors
3034- For UI changes, verify key flows manually (login, card editing, save/load, and route navigation across `[handle]` pages).
31353236## Commit & Pull Request Guidelines
+7
CLAUDE.md
···1616- `pnpm format` - Format code with Prettier
1717- `pnpm deploy` - Build and deploy to Cloudflare Workers
18181919+## Code Quality Requirements
2020+2121+Before submitting changes:
2222+2323+1. **Run `pnpm check`** - Must complete with 0 errors and 0 warnings
2424+2. **Run `pnpm format`** - Format all code with Prettier
2525+1926## Architecture
20272128### Tech Stack
···11<script lang="ts">
22- import type { ContentComponentProps } from '../../types';
32 import { onMount, onDestroy } from 'svelte';
43 import Tetris8BitMusic from './Tetris8Bit.mp3';
55-66- let { item }: ContentComponentProps = $props();
7485 let canvas: HTMLCanvasElement;
96 let container: HTMLDivElement;
···252249253250 oscillator.start(audioCtx.currentTime);
254251 oscillator.stop(audioCtx.currentTime + duration);
255255- } catch (e) {
252252+ } catch {
256253 // Audio not supported
257254 }
258255 }
+3-2
src/lib/cards/GameCards/TetrisCard/index.ts
···11//Music by DJARTMUSIC - The Return Of The 8-bit Era
22//https://pixabay.com/de/music/videospiele-the-return-of-the-8-bit-era-301292/
3344-import type { CardDefinition } from '../../types';
44+import type { CardDefinition, ContentComponentProps } from '../../types';
55import TetrisCard from './TetrisCard.svelte';
66import SidebarItemTetrisCard from './SidebarItemTetrisCard.svelte';
77+import type { Component } from 'svelte';
7889export const TetrisCardDefinition = {
910 type: 'tetris',
1010- contentComponent: TetrisCard,
1111+ contentComponent: TetrisCard as unknown as Component<ContentComponentProps>,
1112 sidebarComponent: SidebarItemTetrisCard,
1213 allowSetColor: true,
1314 defaultColor: 'accent',
···99 const data = getAdditionalUserData();
1010 // svelte-ignore state_referenced_locally
1111 let record = $state(data[item.cardType] as any);
1212-1313- let animated = $derived(emojiToNotoAnimatedWebp(record.value.status));
1412</script>
15131614<EmojiPicker