loading-games 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/games/2048.js +2 -0
- package/dist/games/2048.js.map +1 -0
- package/dist/games/asteroids.js +2 -0
- package/dist/games/asteroids.js.map +1 -0
- package/dist/games/brick-breaker.js +2 -0
- package/dist/games/brick-breaker.js.map +1 -0
- package/dist/games/flappy.js +2 -0
- package/dist/games/flappy.js.map +1 -0
- package/dist/games/memory-cards.js +2 -0
- package/dist/games/memory-cards.js.map +1 -0
- package/dist/games/snake.js +2 -0
- package/dist/games/snake.js.map +1 -0
- package/dist/games/whack-a-mole.js +2 -0
- package/dist/games/whack-a-mole.js.map +1 -0
- package/dist/games/wordle-lite.js +2 -0
- package/dist/games/wordle-lite.js.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +403 -0
- package/dist/index.d.ts +403 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.cjs +2 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +33 -0
- package/dist/react/index.d.ts +33 -0
- package/dist/react/index.js +2 -0
- package/dist/react/index.js.map +1 -0
- package/dist/svelte/index.d.ts +88 -0
- package/dist/svelte/index.js +2 -0
- package/dist/svelte/index.js.map +1 -0
- package/dist/vue/index.cjs +2 -0
- package/dist/vue/index.cjs.map +1 -0
- package/dist/vue/index.d.cts +157 -0
- package/dist/vue/index.d.ts +157 -0
- package/dist/vue/index.js +2 -0
- package/dist/vue/index.js.map +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/theme.ts","../src/dpad.ts","../src/games/snake/index.ts","../src/games/brick-breaker/index.ts","../src/games/flappy/index.ts","../src/games/2048/index.ts","../src/games/wordle-lite/index.ts","../src/games/asteroids/index.ts","../src/games/memory-cards/index.ts","../src/games/whack-a-mole/index.ts","../src/controller.ts","../src/delay.ts","../src/scores.ts","../src/component.ts","../src/index.ts"],"names":["readCSSVar","varName","getSystemDefaults","DARK_DEFAULTS","LIGHT_DEFAULTS","resolveTheme","theme","resolved","key","cssVar","CSS_VAR_MAP","cssValue","value","applyThemeToElement","element","init_theme","__esmMin","ARROWS","Dpad","init_dpad","options","parent","primaryColor","textColor","showFire","overlay","cells","cell","btn","bg","text","target","snake_exports","__export","SnakeGame","GRID_SIZE","BASE_TICK_MS","SPEED_INCREASE","SWIPE_THRESHOLD","init_snake","onScore","onGameOver","canvas","dpr","rect","mid","occupied","p","pos","now","head","next","ctx","cellSize","W","H","x","y","fx","fy","i","padding","alpha","r","px","py","pw","ph","dir","touch","dx","dy","absDx","absDy","brick_breaker_exports","BrickBreakerGame","init_brick_breaker","_onGameOver","flappy_exports","FlappyGame","GRAVITY","JUMP_VELOCITY","PIPE_WIDTH","PIPE_GAP","PIPE_SPEED","BIRD_X","BIRD_RADIUS","init_flappy","e","maxTop","topHeight","t","dt","pipe","inX","inY","bY","__exports","Game2048","init__","_onScore","wordle_lite_exports","WordleLiteGame","init_wordle_lite","asteroids_exports","AsteroidsGame","init_asteroids","memory_cards_exports","MemoryCardsGame","EMOJIS","GRID","FLIP_MS","init_memory_cards","pairs","j","emoji","id","cols","rows","w","h","b","total","idx","card","a","elapsed","timeBonus","c","scaleX","cx","cy","pulse","n","whack_a_mole_exports","WhackAMoleGame","ROUND_DURATION","HOLE_COUNT","SPAWN_START_MS","SPAWN_END_MS","MOLE_MIN_STAY","MOLE_STAY_RANGE","init_whack_a_mole","available","interval","hole","padX","padY","cellW","cellH","col","row","num","step","progress","prog","offsetY","DelayController","remaining","STORAGE_KEY","readStore","raw","writeStore","store","buildKey","game","namespace","getPersonalBest","saveScore","score","existing","isNewRecord","getAllScores","clearScores","prefix","filtered","SIZE_MAP","GameController","host","callbacks","opts","resolvedName","GameClass","err","size","dimensions","animation","message","toast","el","duration","personalBest","badge","name","games","state","ms","resolve","LoadingGameElement","result","oldValue","newValue","delay","minDisplay","exitAnimation","saveScores"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Theme resolution — 3-level priority:\r\n * 1. Explicit theme prop (highest)\r\n * 2. CSS variables on :root (--lg-primary, etc.)\r\n * 3. prefers-color-scheme detection (lowest)\r\n */\r\n\r\nimport type { ThemeObject, ResolvedTheme } from './types.js'\r\n\r\nconst DARK_DEFAULTS: ResolvedTheme = {\r\n primary: '#6366F1',\r\n background: '#0F0F0F',\r\n surface: '#1A1A2E',\r\n text: '#F8F8F8',\r\n accent: '#E94560',\r\n}\r\n\r\nconst LIGHT_DEFAULTS: ResolvedTheme = {\r\n primary: '#4F46E5',\r\n background: '#FFFFFF',\r\n surface: '#F3F4F6',\r\n text: '#111827',\r\n accent: '#E94560',\r\n}\r\n\r\nconst CSS_VAR_MAP: Record<keyof ResolvedTheme, string> = {\r\n primary: '--lg-primary',\r\n background: '--lg-background',\r\n surface: '--lg-surface',\r\n text: '--lg-text',\r\n accent: '--lg-accent',\r\n}\r\n\r\n/**\r\n * Read a CSS variable from :root, returns null if not set.\r\n */\r\nfunction readCSSVar(varName: string): string | null {\r\n if (typeof window === 'undefined') return null\r\n const value = getComputedStyle(document.documentElement)\r\n .getPropertyValue(varName)\r\n .trim()\r\n return value || null\r\n}\r\n\r\n/**\r\n * Detect system color scheme preference.\r\n */\r\nfunction getSystemDefaults(): ResolvedTheme {\r\n if (typeof window === 'undefined') return DARK_DEFAULTS\r\n try {\r\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches\r\n return prefersDark ? DARK_DEFAULTS : LIGHT_DEFAULTS\r\n } catch {\r\n return DARK_DEFAULTS\r\n }\r\n}\r\n\r\n/**\r\n * Resolve the final theme from all sources.\r\n * Priority: explicit prop > CSS variables > system defaults.\r\n */\r\nexport function resolveTheme(theme?: ThemeObject): ResolvedTheme {\r\n const systemDefaults = getSystemDefaults()\r\n\r\n const resolved: ResolvedTheme = { ...systemDefaults }\r\n\r\n // Level 2: CSS variables\r\n for (const [key, cssVar] of Object.entries(CSS_VAR_MAP) as [keyof ResolvedTheme, string][]) {\r\n const cssValue = readCSSVar(cssVar)\r\n if (cssValue) {\r\n resolved[key] = cssValue\r\n }\r\n }\r\n\r\n // Level 1: Explicit theme prop\r\n if (theme) {\r\n for (const [key, value] of Object.entries(theme) as [keyof ThemeObject, string | undefined][]) {\r\n if (value) {\r\n resolved[key] = value\r\n }\r\n }\r\n }\r\n\r\n return resolved\r\n}\r\n\r\n/**\r\n * Apply resolved theme as CSS variables to a container element.\r\n * This allows games to reference CSS variables for dynamic theming.\r\n */\r\nexport function applyThemeToElement(element: HTMLElement, theme: ResolvedTheme): void {\r\n for (const [key, cssVar] of Object.entries(CSS_VAR_MAP) as [keyof ResolvedTheme, string][]) {\r\n element.style.setProperty(cssVar, theme[key])\r\n }\r\n}\r\n","/**\n * Virtual D-pad — Reusable touch controller overlay.\n *\n * Renders 4 directional arrows (+ optional center/fire button) as an\n * overlay positioned at the bottom-center of a parent element.\n * Only renders when touch is available ('ontouchstart' in window).\n *\n * Each button meets the 44×44px minimum touch target requirement.\n * Semi-transparent, themed with the provided primary color.\n */\n\nexport type DpadDirection = 'up' | 'down' | 'left' | 'right'\n\nexport interface DpadOptions {\n /** Parent element to attach the overlay to. Must have position: relative/absolute/fixed. */\n parent: HTMLElement\n /** Primary theme color for button backgrounds. */\n primaryColor: string\n /** Text/icon color. */\n textColor: string\n /** Called when a direction button is pressed. */\n onDirection: (dir: DpadDirection) => void\n /** If true, render a center \"fire\" button. */\n showFire?: boolean\n /** Called when the fire button is pressed. */\n onFire?: () => void\n}\n\nconst BTN_SIZE = 44\nconst GAP = 2\n\nconst ARROWS: Record<DpadDirection, string> = {\n up: '\\u25B2',\n down: '\\u25BC',\n left: '\\u25C0',\n right: '\\u25B6',\n}\n\nexport class Dpad {\n private overlay: HTMLDivElement | null = null\n private boundClick: (e: MouseEvent) => void\n private boundTouch: (e: TouchEvent) => void\n\n constructor(private options: DpadOptions) {\n this.boundClick = this.handleClick.bind(this)\n this.boundTouch = this.handleTouch.bind(this)\n }\n\n /** Create and mount the D-pad. No-op if touch is unavailable. */\n mount(): void {\n if (!('ontouchstart' in window)) return\n if (this.overlay) return\n\n const { parent, primaryColor, textColor, showFire } = this.options\n\n // Ensure parent is positioned\n const pStyle = getComputedStyle(parent)\n if (pStyle.position === 'static') parent.style.position = 'relative'\n\n const overlay = document.createElement('div')\n overlay.setAttribute('data-lg-dpad', '')\n overlay.style.cssText = [\n 'position:absolute',\n 'bottom:12px',\n 'left:50%',\n 'transform:translateX(-50%)',\n `display:grid`,\n `grid-template-columns:${BTN_SIZE}px ${BTN_SIZE}px ${BTN_SIZE}px`,\n `grid-template-rows:${BTN_SIZE}px ${BTN_SIZE}px ${BTN_SIZE}px`,\n `gap:${GAP}px`,\n 'pointer-events:none',\n 'z-index:10',\n ].join(';')\n\n // Grid layout: [_, up, _], [left, center, right], [_, down, _]\n const cells: (DpadDirection | 'fire' | null)[] = [\n null, 'up', null,\n 'left', showFire ? 'fire' : null, 'right',\n null, 'down', null,\n ]\n\n for (const cell of cells) {\n const btn = document.createElement('button')\n if (cell && cell !== 'fire') {\n btn.textContent = ARROWS[cell]\n btn.setAttribute('aria-label', cell)\n btn.dataset.dir = cell\n btn.style.cssText = this.buttonStyle(primaryColor, textColor)\n } else if (cell === 'fire') {\n btn.textContent = '\\u25CF'\n btn.setAttribute('aria-label', 'fire')\n btn.dataset.action = 'fire'\n btn.style.cssText = this.buttonStyle(primaryColor, textColor)\n } else {\n btn.style.cssText = 'visibility:hidden;'\n }\n overlay.appendChild(btn)\n }\n\n overlay.addEventListener('click', this.boundClick)\n overlay.addEventListener('touchstart', this.boundTouch, { passive: true })\n\n parent.appendChild(overlay)\n this.overlay = overlay\n }\n\n /** Remove the D-pad from the DOM and clean up listeners. */\n destroy(): void {\n if (!this.overlay) return\n this.overlay.removeEventListener('click', this.boundClick)\n this.overlay.removeEventListener('touchstart', this.boundTouch)\n this.overlay.remove()\n this.overlay = null\n }\n\n private buttonStyle(bg: string, text: string): string {\n return [\n 'pointer-events:auto',\n `width:${BTN_SIZE}px`,\n `height:${BTN_SIZE}px`,\n 'border:none',\n 'border-radius:8px',\n `background:${bg}55`,\n `color:${text}`,\n 'font-size:16px',\n 'display:flex',\n 'align-items:center',\n 'justify-content:center',\n 'touch-action:manipulation',\n 'cursor:pointer',\n '-webkit-tap-highlight-color:transparent',\n ].join(';')\n }\n\n private handleClick(e: MouseEvent): void {\n const target = (e.target as HTMLElement).closest('[data-dir],[data-action]') as HTMLElement | null\n if (!target) return\n if (target.dataset.dir) {\n this.options.onDirection(target.dataset.dir as DpadDirection)\n } else if (target.dataset.action === 'fire') {\n this.options.onFire?.()\n }\n }\n\n private handleTouch(e: TouchEvent): void {\n const target = (e.target as HTMLElement).closest('[data-dir],[data-action]') as HTMLElement | null\n if (!target) return\n if (target.dataset.dir) {\n this.options.onDirection(target.dataset.dir as DpadDirection)\n } else if (target.dataset.action === 'fire') {\n this.options.onFire?.()\n }\n }\n}\n","/**\r\n * Snake — Classic snake game with wrapping walls.\r\n * \r\n * Controls:\r\n * - Keyboard: Arrow keys\r\n * - Touch: Swipe gestures\r\n * - Mobile: Virtual D-pad (rendered by the host component)\r\n * \r\n * Bundle target: ~4 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\nimport { Dpad } from '../../dpad.js'\r\n\r\ntype Direction = 'up' | 'down' | 'left' | 'right'\r\ntype Point = { x: number; y: number }\r\n\r\nconst GRID_SIZE = 20 // cells per row/column\r\nconst BASE_TICK_MS = 150 // starting tick speed\r\nconst SPEED_INCREASE = 5 // ms faster per 5 points\r\nconst SWIPE_THRESHOLD = 30 // minimum swipe distance (px)\r\n\r\nexport class SnakeGame implements GamePlugin {\r\n readonly name = 'snake'\r\n readonly bundleSize = 4_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n\r\n private snake: Point[] = []\r\n private food: Point = { x: 0, y: 0 }\r\n private direction: Direction = 'right'\r\n private nextDirection: Direction = 'right'\r\n private score = 0\r\n private tickMs = BASE_TICK_MS\r\n private lastTick = 0\r\n private animFrameId: number | null = null\r\n private running = false\r\n private cellSize = 0\r\n\r\n private boundKeyDown: (e: KeyboardEvent) => void\r\n private boundTouchStart: (e: TouchEvent) => void\r\n private boundTouchEnd: (e: TouchEvent) => void\r\n private touchStartX = 0\r\n private touchStartY = 0\r\n private isTouchDevice = false\r\n private dpad: Dpad | null = null\r\n\r\n private onScoreCallback?: (score: number) => void\r\n private onGameOverCallback?: () => void\r\n\r\n constructor(onScore?: (score: number) => void, onGameOver?: () => void) {\r\n this.onScoreCallback = onScore\r\n this.onGameOverCallback = onGameOver\r\n this.boundKeyDown = this.handleKeyDown.bind(this)\r\n this.boundTouchStart = this.handleTouchStart.bind(this)\r\n this.boundTouchEnd = this.handleTouchEnd.bind(this)\r\n }\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas\r\n this.ctx = canvas.getContext('2d')!\r\n this.theme = resolveTheme(theme)\r\n\r\n canvas.setAttribute('aria-label', 'Snake game \\u2014 loading in background')\r\n canvas.setAttribute('role', 'img')\r\n\r\n // Scale for device pixel ratio\r\n const dpr = window.devicePixelRatio || 1\r\n const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr\r\n canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr)\r\n canvas.style.width = `${rect.width}px`\r\n canvas.style.height = `${rect.height}px`\r\n\r\n this.cellSize = Math.floor(rect.width / GRID_SIZE)\r\n this.isTouchDevice = 'ontouchstart' in window\r\n this.reset()\r\n }\r\n\r\n private reset(): void {\r\n // Start in the middle going right\r\n const mid = Math.floor(GRID_SIZE / 2)\r\n this.snake = [\r\n { x: mid, y: mid },\r\n { x: mid - 1, y: mid },\r\n { x: mid - 2, y: mid },\r\n ]\r\n this.direction = 'right'\r\n this.nextDirection = 'right'\r\n this.score = 0\r\n this.tickMs = BASE_TICK_MS\r\n this.placeFood()\r\n }\r\n\r\n private placeFood(): void {\r\n const occupied = new Set(this.snake.map(p => `${p.x},${p.y}`))\r\n let pos: Point\r\n do {\r\n pos = {\r\n x: Math.floor(Math.random() * GRID_SIZE),\r\n y: Math.floor(Math.random() * GRID_SIZE),\r\n }\r\n } while (occupied.has(`${pos.x},${pos.y}`))\r\n this.food = pos\r\n }\r\n\r\n start(): void {\r\n this.running = true\r\n this.lastTick = performance.now()\r\n this.loop(performance.now())\r\n this.attachEventListeners()\r\n if (this.isTouchDevice) this.mountDpad()\r\n }\r\n\r\n pause(): void {\r\n this.running = false\r\n if (this.animFrameId !== null) {\r\n cancelAnimationFrame(this.animFrameId)\r\n this.animFrameId = null\r\n }\r\n }\r\n\r\n resume(): void {\r\n if (!this.running) {\r\n this.running = true\r\n this.lastTick = performance.now()\r\n this.loop(performance.now())\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.pause()\r\n this.removeEventListeners()\r\n this.dpad?.destroy()\r\n this.dpad = null\r\n }\r\n\r\n getScore(): number {\r\n return this.score\r\n }\r\n\r\n // ─── Game Loop ──────────────────────────────────────────────────────────────\r\n\r\n private loop(now: number): void {\r\n if (!this.running) return\r\n\r\n this.animFrameId = requestAnimationFrame(t => this.loop(t))\r\n\r\n if (now - this.lastTick >= this.tickMs) {\r\n this.lastTick = now\r\n this.tick()\r\n }\r\n\r\n this.render()\r\n }\r\n\r\n private tick(): void {\r\n this.direction = this.nextDirection\r\n\r\n const head = this.snake[0]!\r\n const next: Point = {\r\n x: (head.x + (this.direction === 'right' ? 1 : this.direction === 'left' ? -1 : 0) + GRID_SIZE) % GRID_SIZE,\r\n y: (head.y + (this.direction === 'down' ? 1 : this.direction === 'up' ? -1 : 0) + GRID_SIZE) % GRID_SIZE,\r\n }\r\n\r\n // Collision with self\r\n if (this.snake.some(p => p.x === next.x && p.y === next.y)) {\r\n this.onGameOverCallback?.()\r\n this.reset()\r\n return\r\n }\r\n\r\n this.snake.unshift(next)\r\n\r\n if (next.x === this.food.x && next.y === this.food.y) {\r\n this.score += 10\r\n this.onScoreCallback?.(this.score)\r\n\r\n // Speed up every 5 points\r\n if (this.score % 50 === 0) {\r\n this.tickMs = Math.max(60, this.tickMs - SPEED_INCREASE)\r\n }\r\n\r\n this.placeFood()\r\n } else {\r\n this.snake.pop()\r\n }\r\n }\r\n\r\n // ─── Rendering ──────────────────────────────────────────────────────────────\r\n\r\n private render(): void {\r\n const { ctx, cellSize, theme } = this\r\n const rect = this.canvas.getBoundingClientRect()\r\n const W = rect.width\r\n const H = rect.height\r\n\r\n // Background\r\n ctx.fillStyle = theme.background\r\n ctx.fillRect(0, 0, W, H)\r\n\r\n // Grid (subtle)\r\n ctx.strokeStyle = theme.surface\r\n ctx.lineWidth = 0.5\r\n ctx.globalAlpha = 0.3\r\n for (let x = 0; x <= W; x += cellSize) {\r\n ctx.beginPath(); ctx.moveTo(x, 0); ctx.lineTo(x, H); ctx.stroke()\r\n }\r\n for (let y = 0; y <= H; y += cellSize) {\r\n ctx.beginPath(); ctx.moveTo(0, y); ctx.lineTo(W, y); ctx.stroke()\r\n }\r\n ctx.globalAlpha = 1\r\n\r\n // Food\r\n const fx = this.food.x * cellSize + cellSize / 2\r\n const fy = this.food.y * cellSize + cellSize / 2\r\n ctx.fillStyle = theme.accent\r\n ctx.beginPath()\r\n ctx.arc(fx, fy, cellSize * 0.4, 0, Math.PI * 2)\r\n ctx.fill()\r\n\r\n // Snake\r\n this.snake.forEach((p, i) => {\r\n const x = p.x * cellSize\r\n const y = p.y * cellSize\r\n const padding = 1\r\n\r\n if (i === 0) {\r\n // Head\r\n ctx.fillStyle = theme.primary\r\n } else {\r\n // Body — fade toward tail\r\n const alpha = 1 - (i / this.snake.length) * 0.4\r\n ctx.globalAlpha = alpha\r\n ctx.fillStyle = theme.primary\r\n }\r\n\r\n const r = 3\r\n const px = x + padding\r\n const py = y + padding\r\n const pw = cellSize - padding * 2\r\n const ph = cellSize - padding * 2\r\n\r\n ctx.beginPath()\r\n ctx.roundRect(px, py, pw, ph, r)\r\n ctx.fill()\r\n ctx.globalAlpha = 1\r\n })\r\n\r\n // Score\r\n ctx.fillStyle = theme.text\r\n ctx.font = `bold ${Math.round(cellSize * 0.7)}px monospace`\r\n ctx.textAlign = 'right'\r\n ctx.fillText(`${this.score}`, W - 8, cellSize)\r\n }\r\n\r\n // ─── Controls ───────────────────────────────────────────────────────────────\r\n\r\n private attachEventListeners(): void {\r\n document.addEventListener('keydown', this.boundKeyDown)\r\n this.canvas.addEventListener('touchstart', this.boundTouchStart, { passive: true })\r\n this.canvas.addEventListener('touchend', this.boundTouchEnd, { passive: true })\r\n }\r\n\r\n private removeEventListeners(): void {\r\n document.removeEventListener('keydown', this.boundKeyDown)\r\n this.canvas.removeEventListener('touchstart', this.boundTouchStart)\r\n this.canvas.removeEventListener('touchend', this.boundTouchEnd)\r\n }\r\n\r\n private handleKeyDown(e: KeyboardEvent): void {\r\n const map: Record<string, Direction> = {\r\n ArrowUp: 'up',\r\n ArrowDown: 'down',\r\n ArrowLeft: 'left',\r\n ArrowRight: 'right',\r\n }\r\n const dir = map[e.key]\r\n if (!dir) return\r\n\r\n // Prevent reverse direction\r\n const opposites: Record<Direction, Direction> = {\r\n up: 'down', down: 'up', left: 'right', right: 'left',\r\n }\r\n if (opposites[dir] !== this.direction) {\r\n this.nextDirection = dir\r\n e.preventDefault()\r\n }\r\n }\r\n\r\n private handleTouchStart(e: TouchEvent): void {\r\n const touch = e.touches[0]\r\n if (!touch) return\r\n this.touchStartX = touch.clientX\r\n this.touchStartY = touch.clientY\r\n }\r\n\r\n private handleTouchEnd(e: TouchEvent): void {\r\n const touch = e.changedTouches[0]\r\n if (!touch) return\r\n\r\n const dx = touch.clientX - this.touchStartX\r\n const dy = touch.clientY - this.touchStartY\r\n const absDx = Math.abs(dx)\r\n const absDy = Math.abs(dy)\r\n\r\n if (Math.max(absDx, absDy) < SWIPE_THRESHOLD) return // min 44px touch target\r\n\r\n let dir: Direction\r\n if (absDx > absDy) {\r\n dir = dx > 0 ? 'right' : 'left'\r\n } else {\r\n dir = dy > 0 ? 'down' : 'up'\r\n }\r\n\r\n const opposites: Record<Direction, Direction> = {\r\n up: 'down', down: 'up', left: 'right', right: 'left',\r\n }\r\n if (opposites[dir] !== this.direction) {\r\n this.nextDirection = dir\r\n }\r\n }\r\n\r\n // ─── Virtual D-pad ─────────────────────────────────────────────────────────\r\n\r\n private mountDpad(): void {\r\n const parent = this.canvas.parentElement\r\n if (!parent) return\r\n\r\n this.dpad = new Dpad({\r\n parent,\r\n primaryColor: this.theme.primary,\r\n textColor: this.theme.text,\r\n onDirection: (dir) => {\r\n const opposites: Record<Direction, Direction> = {\r\n up: 'down', down: 'up', left: 'right', right: 'left',\r\n }\r\n if (opposites[dir] !== this.direction) {\r\n this.nextDirection = dir\r\n }\r\n },\r\n })\r\n this.dpad.mount()\r\n }\r\n}\r\n","/**\r\n * Brick Breaker — Stub implementation.\r\n * Full implementation planned for Phase 3.\r\n * Bundle target: ~6 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nexport class BrickBreakerGame implements GamePlugin {\r\n readonly name = 'brick-breaker'\r\n readonly bundleSize = 6_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private animFrameId: number | null = null\r\n private running = false\r\n private score = 0\r\n\r\n constructor(private onScore?: (s: number) => void, private _onGameOver?: () => void) {}\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas\r\n this.ctx = canvas.getContext('2d')!\r\n this.theme = resolveTheme(theme)\r\n\r\n const dpr = window.devicePixelRatio || 1\r\n const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr\r\n canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr)\r\n canvas.style.width = `${rect.width}px`\r\n canvas.style.height = `${rect.height}px`\r\n }\r\n\r\n start(): void {\r\n this.running = true\r\n this.render()\r\n }\r\n\r\n pause(): void {\r\n this.running = false\r\n if (this.animFrameId !== null) {\r\n cancelAnimationFrame(this.animFrameId)\r\n this.animFrameId = null\r\n }\r\n }\r\n\r\n resume(): void {\r\n if (!this.running) {\r\n this.running = true\r\n this.render()\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.pause()\r\n }\r\n\r\n getScore(): number { return this.score }\r\n\r\n private render(): void {\r\n const rect = this.canvas.getBoundingClientRect()\r\n const W = rect.width\r\n const H = rect.height\r\n const { ctx, theme } = this\r\n\r\n ctx.fillStyle = theme.background\r\n ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.text\r\n ctx.font = 'bold 18px system-ui'\r\n ctx.textAlign = 'center'\r\n ctx.textBaseline = 'middle'\r\n ctx.fillText('Brick Breaker', W / 2, H / 2 - 16)\r\n ctx.font = '14px system-ui'\r\n ctx.globalAlpha = 0.6\r\n ctx.fillText('Coming soon!', W / 2, H / 2 + 16)\r\n ctx.globalAlpha = 1\r\n }\r\n}\r\n","/**\r\n * Flappy Bird — Infinite runner, physics-based.\r\n *\r\n * Mechanics:\r\n * - Gravity: 0.4 px/frame², jump impulse: -7 px/frame\r\n * - Gap: 150px, randomized vertical position\r\n * - Score: +1 per pipe cleared\r\n * - Pipe color: theme.primary\r\n *\r\n * Controls:\r\n * - Desktop: Spacebar or click\r\n * - Mobile: Tap\r\n *\r\n * Bundle target: ~5 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nconst GRAVITY = 0.4\r\nconst JUMP_VELOCITY = -7\r\nconst PIPE_WIDTH = 52\r\nconst PIPE_GAP = 150\r\nconst PIPE_SPEED = 2.2\r\nconst BIRD_X = 80\r\nconst BIRD_RADIUS = 14\r\n\r\ninterface Pipe {\r\n x: number\r\n topHeight: number\r\n passed: boolean\r\n}\r\n\r\nexport class FlappyGame implements GamePlugin {\r\n readonly name = 'flappy'\r\n readonly bundleSize = 5_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private W = 0\r\n private H = 0\r\n\r\n private birdY = 0\r\n private birdVY = 0\r\n private pipes: Pipe[] = []\r\n private score = 0\r\n private personalBest = 0\r\n private animFrameId: number | null = null\r\n private running = false\r\n private dead = false\r\n private frameCount = 0\r\n private lastTime = 0\r\n\r\n private boundJump: () => void\r\n private boundKey: (e: KeyboardEvent) => void\r\n private boundTouch: () => void\r\n\r\n private onScore?: (score: number) => void\r\n private onGameOver?: () => void\r\n\r\n constructor(onScore?: (score: number) => void, onGameOver?: () => void) {\r\n this.onScore = onScore\r\n this.onGameOver = onGameOver\r\n this.boundJump = this.jump.bind(this)\r\n this.boundKey = (e: KeyboardEvent) => { if (e.code === 'Space') { e.preventDefault(); this.jump() } }\r\n this.boundTouch = this.jump.bind(this)\r\n }\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas\r\n this.ctx = canvas.getContext('2d')!\r\n this.theme = resolveTheme(theme)\r\n\r\n const dpr = window.devicePixelRatio || 1\r\n const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr\r\n canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr)\r\n canvas.style.width = `${rect.width}px`\r\n canvas.style.height = `${rect.height}px`\r\n this.W = rect.width\r\n this.H = rect.height\r\n\r\n canvas.setAttribute('aria-label', 'Flappy Bird game \\u2014 loading in background')\r\n canvas.setAttribute('role', 'img')\r\n\r\n this.reset()\r\n }\r\n\r\n private reset(): void {\r\n this.birdY = this.H / 2\r\n this.birdVY = 0\r\n this.pipes = []\r\n this.score = 0\r\n this.dead = false\r\n this.frameCount = 0\r\n this.spawnPipe(this.W + 100)\r\n }\r\n\r\n private spawnPipe(x?: number): void {\r\n const minTop = 60\r\n const maxTop = this.H - PIPE_GAP - 60\r\n const topHeight = minTop + Math.random() * (maxTop - minTop)\r\n this.pipes.push({ x: x ?? this.W + 50, topHeight, passed: false })\r\n }\r\n\r\n start(): void {\r\n this.running = true\r\n this.lastTime = performance.now()\r\n this.loop(performance.now())\r\n this.canvas.addEventListener('click', this.boundJump)\r\n document.addEventListener('keydown', this.boundKey)\r\n this.canvas.addEventListener('touchstart', this.boundTouch, { passive: true })\r\n }\r\n\r\n pause(): void {\r\n this.running = false\r\n if (this.animFrameId !== null) {\r\n cancelAnimationFrame(this.animFrameId)\r\n this.animFrameId = null\r\n }\r\n }\r\n\r\n resume(): void {\r\n if (!this.running) {\r\n this.running = true\r\n this.lastTime = performance.now()\r\n this.loop(performance.now())\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.pause()\r\n this.canvas.removeEventListener('click', this.boundJump)\r\n document.removeEventListener('keydown', this.boundKey)\r\n this.canvas.removeEventListener('touchstart', this.boundTouch)\r\n }\r\n\r\n getScore(): number { return this.score }\r\n\r\n private jump(): void {\r\n if (this.dead) { this.reset(); return }\r\n this.birdVY = JUMP_VELOCITY\r\n }\r\n\r\n private loop(now: number): void {\r\n if (!this.running) return\r\n this.animFrameId = requestAnimationFrame(t => this.loop(t))\r\n const dt = Math.min((now - this.lastTime) / 16.67, 3)\r\n this.lastTime = now\r\n if (!this.dead) this.update(dt)\r\n this.render()\r\n }\r\n\r\n private update(dt: number): void {\r\n this.frameCount++\r\n this.birdVY += GRAVITY * dt\r\n this.birdY += this.birdVY * dt\r\n\r\n if (this.birdY + BIRD_RADIUS >= this.H || this.birdY - BIRD_RADIUS <= 0) {\r\n this.die(); return\r\n }\r\n\r\n if (this.frameCount % 90 === 0) this.spawnPipe()\r\n\r\n for (const pipe of this.pipes) {\r\n pipe.x -= PIPE_SPEED * dt\r\n if (!pipe.passed && pipe.x + PIPE_WIDTH < BIRD_X) {\r\n pipe.passed = true\r\n this.score++\r\n if (this.score > this.personalBest) this.personalBest = this.score\r\n this.onScore?.(this.score)\r\n }\r\n\r\n const inX = BIRD_X + BIRD_RADIUS > pipe.x && BIRD_X - BIRD_RADIUS < pipe.x + PIPE_WIDTH\r\n const inY = this.birdY - BIRD_RADIUS < pipe.topHeight || this.birdY + BIRD_RADIUS > pipe.topHeight + PIPE_GAP\r\n if (inX && inY) { this.die(); return }\r\n }\r\n this.pipes = this.pipes.filter(p => p.x + PIPE_WIDTH > -10)\r\n }\r\n\r\n private die(): void {\r\n this.dead = true\r\n this.birdVY = JUMP_VELOCITY * 0.5\r\n this.onGameOver?.()\r\n }\r\n\r\n private render(): void {\r\n const { ctx, W, H, theme } = this\r\n ctx.fillStyle = theme.background\r\n ctx.fillRect(0, 0, W, H)\r\n\r\n for (const pipe of this.pipes) {\r\n ctx.fillStyle = theme.primary\r\n ctx.fillRect(pipe.x - 4, pipe.topHeight - 24, PIPE_WIDTH + 8, 24)\r\n ctx.beginPath(); ctx.roundRect(pipe.x, 0, PIPE_WIDTH, pipe.topHeight - 6, [0,0,6,6]); ctx.fill()\r\n const bY = pipe.topHeight + PIPE_GAP\r\n ctx.fillRect(pipe.x - 4, bY, PIPE_WIDTH + 8, 24)\r\n ctx.beginPath(); ctx.roundRect(pipe.x, bY + 6, PIPE_WIDTH, H - bY, [6,6,0,0]); ctx.fill()\r\n }\r\n\r\n ctx.save()\r\n ctx.translate(BIRD_X, this.birdY)\r\n ctx.rotate(Math.min(Math.max(this.birdVY * 0.05, -0.5), 1.0))\r\n if (this.dead) ctx.globalAlpha = 0.6\r\n ctx.fillStyle = '#FFD93D'\r\n ctx.beginPath(); ctx.arc(0, 0, BIRD_RADIUS, 0, Math.PI * 2); ctx.fill()\r\n ctx.fillStyle = '#fff'; ctx.beginPath(); ctx.arc(5, -4, 5, 0, Math.PI * 2); ctx.fill()\r\n ctx.fillStyle = '#333'; ctx.beginPath(); ctx.arc(6, -4, 2.5, 0, Math.PI * 2); ctx.fill()\r\n ctx.fillStyle = '#FF6B35'\r\n ctx.beginPath(); ctx.moveTo(BIRD_RADIUS - 2, 0); ctx.lineTo(BIRD_RADIUS + 8, -3); ctx.lineTo(BIRD_RADIUS + 8, 3); ctx.closePath(); ctx.fill()\r\n ctx.restore()\r\n\r\n ctx.fillStyle = theme.text\r\n ctx.font = 'bold 28px monospace'\r\n ctx.textAlign = 'center'\r\n ctx.fillText(String(this.score), W / 2, 44)\r\n\r\n if (this.dead) {\r\n ctx.fillStyle = 'rgba(0,0,0,0.45)'\r\n ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.text\r\n ctx.font = 'bold 20px system-ui'\r\n ctx.textAlign = 'center'\r\n ctx.fillText('Tap to retry', W / 2, H / 2)\r\n ctx.font = '14px system-ui'; ctx.globalAlpha = 0.7\r\n ctx.fillText(`Score: ${this.score} Best: ${this.personalBest}`, W / 2, H / 2 + 28)\r\n ctx.globalAlpha = 1\r\n }\r\n }\r\n}\r\n","/**\r\n * 2048 — Stub implementation.\r\n * Full implementation planned for Phase 3.\r\n * Bundle target: ~5 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nexport class Game2048 implements GamePlugin {\r\n readonly name = '2048'\r\n readonly bundleSize = 5_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private animFrameId: number | null = null\r\n private running = false\r\n private score = 0\r\n\r\n constructor(private _onScore?: (s: number) => void, private _onGameOver?: () => void) {}\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas\r\n this.ctx = canvas.getContext('2d')!\r\n this.theme = resolveTheme(theme)\r\n const dpr = window.devicePixelRatio || 1\r\n const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr\r\n canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr)\r\n canvas.style.width = `${rect.width}px`\r\n canvas.style.height = `${rect.height}px`\r\n }\r\n\r\n start(): void { this.running = true; this.render() }\r\n pause(): void { this.running = false; if (this.animFrameId !== null) { cancelAnimationFrame(this.animFrameId); this.animFrameId = null } }\r\n resume(): void { if (!this.running) { this.running = true; this.render() } }\r\n destroy(): void { this.pause() }\r\n getScore(): number { return this.score }\r\n\r\n private render(): void {\r\n const rect = this.canvas.getBoundingClientRect()\r\n const W = rect.width, H = rect.height\r\n const { ctx, theme } = this\r\n ctx.fillStyle = theme.background; ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.text; ctx.font = 'bold 18px system-ui'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'\r\n ctx.fillText('2048', W / 2, H / 2 - 16)\r\n ctx.font = '14px system-ui'; ctx.globalAlpha = 0.6\r\n ctx.fillText('Coming soon!', W / 2, H / 2 + 16); ctx.globalAlpha = 1\r\n }\r\n}\r\n","/**\r\n * Wordle-lite — Stub implementation.\r\n * Full implementation planned for Phase 3.\r\n * Bundle target: ~7 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nexport class WordleLiteGame implements GamePlugin {\r\n readonly name = 'wordle-lite'\r\n readonly bundleSize = 7_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private animFrameId: number | null = null\r\n private running = false\r\n private score = 0\r\n\r\n constructor(private _onScore?: (s: number) => void, private _onGameOver?: () => void) {}\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas\r\n this.ctx = canvas.getContext('2d')!\r\n this.theme = resolveTheme(theme)\r\n const dpr = window.devicePixelRatio || 1\r\n const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr\r\n canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr)\r\n canvas.style.width = `${rect.width}px`\r\n canvas.style.height = `${rect.height}px`\r\n }\r\n\r\n start(): void { this.running = true; this.render() }\r\n pause(): void { this.running = false; if (this.animFrameId !== null) { cancelAnimationFrame(this.animFrameId); this.animFrameId = null } }\r\n resume(): void { if (!this.running) { this.running = true; this.render() } }\r\n destroy(): void { this.pause() }\r\n getScore(): number { return this.score }\r\n\r\n private render(): void {\r\n const rect = this.canvas.getBoundingClientRect()\r\n const W = rect.width, H = rect.height\r\n const { ctx, theme } = this\r\n ctx.fillStyle = theme.background; ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.text; ctx.font = 'bold 18px system-ui'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'\r\n ctx.fillText('Wordle-lite', W / 2, H / 2 - 16)\r\n ctx.font = '14px system-ui'; ctx.globalAlpha = 0.6\r\n ctx.fillText('Coming soon!', W / 2, H / 2 + 16); ctx.globalAlpha = 1\r\n }\r\n}\r\n","/**\r\n * Asteroids — Stub implementation.\r\n * Full implementation planned for Phase 3.\r\n * Bundle target: ~8 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nexport class AsteroidsGame implements GamePlugin {\r\n readonly name = 'asteroids'\r\n readonly bundleSize = 8_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private animFrameId: number | null = null\r\n private running = false\r\n private score = 0\r\n\r\n constructor(private _onScore?: (s: number) => void, private _onGameOver?: () => void) {}\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas\r\n this.ctx = canvas.getContext('2d')!\r\n this.theme = resolveTheme(theme)\r\n const dpr = window.devicePixelRatio || 1\r\n const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr\r\n canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr)\r\n canvas.style.width = `${rect.width}px`\r\n canvas.style.height = `${rect.height}px`\r\n }\r\n\r\n start(): void { this.running = true; this.render() }\r\n pause(): void { this.running = false; if (this.animFrameId !== null) { cancelAnimationFrame(this.animFrameId); this.animFrameId = null } }\r\n resume(): void { if (!this.running) { this.running = true; this.render() } }\r\n destroy(): void { this.pause() }\r\n getScore(): number { return this.score }\r\n\r\n private render(): void {\r\n const rect = this.canvas.getBoundingClientRect()\r\n const W = rect.width, H = rect.height\r\n const { ctx, theme } = this\r\n ctx.fillStyle = theme.background; ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.text; ctx.font = 'bold 18px system-ui'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'\r\n ctx.fillText('Asteroids', W / 2, H / 2 - 16)\r\n ctx.font = '14px system-ui'; ctx.globalAlpha = 0.6\r\n ctx.fillText('Coming soon!', W / 2, H / 2 + 16); ctx.globalAlpha = 1\r\n }\r\n}\r\n","/**\r\n * Memory Cards — Emoji pair matching game.\r\n * Bundle target: ~4 kB gzipped\r\n * See SPEC.md §7.7 for full spec.\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nconst EMOJIS = ['🎮','🚀','🎯','🎲','🌟','🎸','🦄','🍕']\r\nconst GRID = 4\r\nconst FLIP_MS = 300\r\n\r\ninterface Card {\r\n id: number; emoji: string; flipped: boolean; matched: boolean; flipProgress: number; pulsePhase: number\r\n}\r\n\r\nexport class MemoryCardsGame implements GamePlugin {\r\n readonly name = 'memory-cards'\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private W = 0; private H = 0\r\n private cards: Card[] = []\r\n private flippedIdxs: number[] = []\r\n private locked = false\r\n private score = 0; private matchCount = 0; private startTime = 0\r\n private selectedIdx = 0 // keyboard navigation index\r\n private animFrameId: number | null = null\r\n private running = false; private lastTime = 0\r\n private boundClick: (e: MouseEvent) => void\r\n private boundTouch: (e: TouchEvent) => void\r\n private boundKeyDown: (e: KeyboardEvent) => void\r\n\r\n private onScore?: (s: number) => void\r\n private onGameOver?: () => void\r\n\r\n constructor(onScore?: (s: number) => void, onGameOver?: () => void) {\r\n this.onScore = onScore\r\n this.onGameOver = onGameOver\r\n this.boundClick = this.onClick.bind(this)\r\n this.boundTouch = this.onTouch.bind(this)\r\n this.boundKeyDown = this.onKeyDown.bind(this)\r\n }\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas; this.ctx = canvas.getContext('2d')!; this.theme = resolveTheme(theme)\r\n\r\n canvas.setAttribute('aria-label', 'Memory Cards game \\u2014 loading in background')\r\n canvas.setAttribute('role', 'img')\r\n canvas.setAttribute('tabindex', '0')\r\n\r\n const dpr = window.devicePixelRatio || 1; const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr; canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr); canvas.style.width = `${rect.width}px`; canvas.style.height = `${rect.height}px`\r\n this.W = rect.width; this.H = rect.height; this.reset()\r\n }\r\n\r\n private reset(): void {\r\n const pairs = [...EMOJIS, ...EMOJIS]\r\n for (let i = pairs.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [pairs[i], pairs[j]] = [pairs[j]!, pairs[i]!] }\r\n this.cards = pairs.map((emoji, id) => ({ id, emoji, flipped: false, matched: false, flipProgress: 0, pulsePhase: 0 }))\r\n this.flippedIdxs = []; this.locked = false; this.score = 0; this.matchCount = 0\r\n this.startTime = Date.now(); this.selectedIdx = 0\r\n }\r\n\r\n start(): void {\r\n this.running = true; this.lastTime = performance.now(); this.loop(performance.now())\r\n this.canvas.addEventListener('click', this.boundClick)\r\n this.canvas.addEventListener('touchend', this.boundTouch, { passive: true })\r\n document.addEventListener('keydown', this.boundKeyDown)\r\n }\r\n\r\n pause(): void { this.running = false; if (this.animFrameId !== null) { cancelAnimationFrame(this.animFrameId); this.animFrameId = null } }\r\n resume(): void { if (!this.running) { this.running = true; this.lastTime = performance.now(); this.loop(performance.now()) } }\r\n\r\n destroy(): void {\r\n this.pause()\r\n this.canvas.removeEventListener('click', this.boundClick)\r\n this.canvas.removeEventListener('touchend', this.boundTouch)\r\n document.removeEventListener('keydown', this.boundKeyDown)\r\n }\r\n\r\n getScore(): number { return this.score }\r\n\r\n private bounds(i: number) {\r\n const pad = 8; const cols = GRID; const rows = GRID\r\n const w = (this.W - pad * (cols + 1)) / cols; const h = (this.H - pad * (rows + 1)) / rows\r\n return { x: pad + (i % cols) * (w + pad), y: pad + Math.floor(i / cols) * (h + pad), w, h }\r\n }\r\n\r\n private cardAt(px: number, py: number): number {\r\n for (let i = 0; i < this.cards.length; i++) { const b = this.bounds(i); if (px >= b.x && px <= b.x + b.w && py >= b.y && py <= b.y + b.h) return i }\r\n return -1\r\n }\r\n\r\n private onClick(e: MouseEvent): void { const r = this.canvas.getBoundingClientRect(); this.tryFlip(e.clientX - r.left, e.clientY - r.top) }\r\n private onTouch(e: TouchEvent): void { const t = e.changedTouches[0]; if (!t) return; const r = this.canvas.getBoundingClientRect(); this.tryFlip(t.clientX - r.left, t.clientY - r.top) }\r\n\r\n private onKeyDown(e: KeyboardEvent): void {\r\n const total = this.cards.length\r\n switch (e.key) {\r\n case 'Tab':\r\n e.preventDefault()\r\n this.selectedIdx = (this.selectedIdx + (e.shiftKey ? total - 1 : 1)) % total\r\n break\r\n case 'ArrowRight': e.preventDefault(); this.selectedIdx = (this.selectedIdx + 1) % total; break\r\n case 'ArrowLeft': e.preventDefault(); this.selectedIdx = (this.selectedIdx + total - 1) % total; break\r\n case 'ArrowDown': e.preventDefault(); this.selectedIdx = (this.selectedIdx + GRID) % total; break\r\n case 'ArrowUp': e.preventDefault(); this.selectedIdx = (this.selectedIdx + total - GRID) % total; break\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault()\r\n this.tryFlipByIdx(this.selectedIdx)\r\n break\r\n }\r\n }\r\n\r\n private tryFlipByIdx(idx: number): void {\r\n if (this.locked) return\r\n const card = this.cards[idx]!; if (card.flipped || card.matched) return\r\n card.flipped = true; this.flippedIdxs.push(idx)\r\n this.checkMatch()\r\n }\r\n\r\n private tryFlip(x: number, y: number): void {\r\n if (this.locked) return\r\n const idx = this.cardAt(x, y); if (idx === -1) return\r\n const card = this.cards[idx]!; if (card.flipped || card.matched) return\r\n card.flipped = true; this.flippedIdxs.push(idx); this.selectedIdx = idx\r\n this.checkMatch()\r\n }\r\n\r\n private checkMatch(): void {\r\n if (this.flippedIdxs.length !== 2) return\r\n this.locked = true\r\n const [a, b] = this.flippedIdxs as [number, number]\r\n if (this.cards[a]!.emoji === this.cards[b]!.emoji) {\r\n setTimeout(() => {\r\n this.cards[a]!.matched = true; this.cards[b]!.matched = true\r\n this.matchCount++; this.score += 10; this.onScore?.(this.score)\r\n this.flippedIdxs = []; this.locked = false\r\n if (this.matchCount === EMOJIS.length) {\r\n // Speed bonus: reward fast completion\r\n const elapsed = (Date.now() - this.startTime) / 1000\r\n const timeBonus = Math.max(0, Math.round((60 - elapsed) * 5))\r\n this.score += timeBonus; this.onScore?.(this.score)\r\n this.onGameOver?.()\r\n setTimeout(() => this.reset(), 2000)\r\n }\r\n }, FLIP_MS + 100)\r\n } else {\r\n setTimeout(() => {\r\n this.cards[a]!.flipped = false; this.cards[b]!.flipped = false\r\n this.flippedIdxs = []; this.locked = false\r\n }, FLIP_MS + 600)\r\n }\r\n }\r\n\r\n private loop(now: number): void {\r\n if (!this.running) return\r\n this.animFrameId = requestAnimationFrame(t => this.loop(t))\r\n const dt = (now - this.lastTime) / FLIP_MS; this.lastTime = now\r\n for (const c of this.cards) {\r\n if (c.flipped && c.flipProgress < 1) c.flipProgress = Math.min(1, c.flipProgress + dt)\r\n else if (!c.flipped && c.flipProgress > 0) c.flipProgress = Math.max(0, c.flipProgress - dt)\r\n if (c.matched) c.pulsePhase = (c.pulsePhase + dt * 0.15) % (Math.PI * 2)\r\n }\r\n this.render()\r\n }\r\n\r\n private render(): void {\r\n const { ctx, W, H, theme } = this\r\n ctx.fillStyle = theme.background; ctx.fillRect(0, 0, W, H)\r\n for (let i = 0; i < this.cards.length; i++) {\r\n const card = this.cards[i]!; const b = this.bounds(i)\r\n const scaleX = Math.abs(Math.cos(card.flipProgress * Math.PI))\r\n const cx = b.x + b.w / 2; const cy = b.y + b.h / 2\r\n ctx.save(); ctx.translate(cx, cy); ctx.scale(scaleX, 1); ctx.translate(-b.w / 2, -b.h / 2)\r\n ctx.beginPath(); ctx.roundRect(0, 0, b.w, b.h, 6)\r\n if (card.flipProgress > 0.5) {\r\n if (card.matched) {\r\n // Pulsing glow for matched cards\r\n const pulse = 0.2 + Math.sin(card.pulsePhase) * 0.1\r\n ctx.fillStyle = theme.primary + '33'; ctx.fill()\r\n ctx.strokeStyle = theme.primary; ctx.lineWidth = 3\r\n ctx.globalAlpha = 0.6 + pulse; ctx.stroke(); ctx.globalAlpha = 1\r\n // Outer glow\r\n ctx.shadowColor = theme.primary; ctx.shadowBlur = 8\r\n ctx.stroke(); ctx.shadowBlur = 0\r\n } else {\r\n ctx.fillStyle = theme.surface; ctx.fill()\r\n }\r\n ctx.font = `${Math.min(b.w, b.h) * 0.45}px serif`; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'\r\n ctx.fillText(card.emoji, b.w / 2, b.h / 2)\r\n } else {\r\n ctx.fillStyle = theme.primary + '99'; ctx.fill()\r\n ctx.strokeStyle = theme.primary; ctx.lineWidth = 1; ctx.globalAlpha = 0.25\r\n for (let j = 0; j < 3; j++) { const n = 4 + j * 5; ctx.strokeRect(n, n, b.w - n * 2, b.h - n * 2) }\r\n ctx.globalAlpha = 1\r\n }\r\n // Keyboard selection highlight\r\n if (i === this.selectedIdx) {\r\n ctx.strokeStyle = theme.text; ctx.lineWidth = 2; ctx.setLineDash([4, 3])\r\n ctx.strokeRect(0, 0, b.w, b.h); ctx.setLineDash([])\r\n }\r\n ctx.restore()\r\n }\r\n ctx.fillStyle = theme.text; ctx.globalAlpha = 0.5; ctx.font = '11px system-ui'; ctx.textAlign = 'right'\r\n ctx.fillText(`${this.matchCount}/${EMOJIS.length} \\u00b7 ${this.score}pts`, W - 6, H - 4); ctx.globalAlpha = 1\r\n }\r\n}\r\n","/**\r\n * Whack-a-Mole — Touch-first, 3×3 grid, 20-second rounds.\r\n *\r\n * Mechanics:\r\n * - 3×3 holes, moles appear for 800–1500ms\r\n * - 20-second timed round, spawn rate accelerates from 900ms→500ms\r\n * - +1 per hit, high score is very shareable\r\n *\r\n * Controls: Mouse click / tap / keyboard 1-9\r\n * Bundle target: ~4 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nconst GRID = 3\r\nconst ROUND_DURATION = 20_000\r\nconst HOLE_COUNT = GRID * GRID\r\nconst SPAWN_START_MS = 900\r\nconst SPAWN_END_MS = 500\r\nconst MOLE_MIN_STAY = 800\r\nconst MOLE_STAY_RANGE = 700\r\n\r\ninterface Hole {\r\n active: boolean\r\n showProgress: number\r\n hideAt: number // timestamp when mole auto-hides (0 = no mole)\r\n hit: boolean\r\n hitProgress: number\r\n}\r\n\r\nexport class WhackAMoleGame implements GamePlugin {\r\n readonly name = 'whack-a-mole'\r\n readonly bundleSize = 4_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private W = 0; private H = 0\r\n\r\n private holes: Hole[] = []\r\n private score = 0\r\n private timeLeft = ROUND_DURATION\r\n private roundStart = 0\r\n private animFrameId: number | null = null\r\n private running = false\r\n private lastTime = 0\r\n private roundOver = false\r\n private nextSpawnTime = 0\r\n\r\n private boundClick: (e: MouseEvent) => void\r\n private boundTouch: (e: TouchEvent) => void\r\n private boundKeyDown: (e: KeyboardEvent) => void\r\n\r\n private onScore?: (s: number) => void\r\n private onGameOver?: () => void\r\n\r\n constructor(onScore?: (s: number) => void, onGameOver?: () => void) {\r\n this.onScore = onScore\r\n this.onGameOver = onGameOver\r\n this.boundClick = this.onClick.bind(this)\r\n this.boundTouch = this.onTouch.bind(this)\r\n this.boundKeyDown = this.onKeyDown.bind(this)\r\n }\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas; this.ctx = canvas.getContext('2d')!; this.theme = resolveTheme(theme)\r\n\r\n canvas.setAttribute('aria-label', 'Whack-a-Mole game \\u2014 loading in background')\r\n canvas.setAttribute('role', 'img')\r\n\r\n const dpr = window.devicePixelRatio || 1; const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr; canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr); canvas.style.width = `${rect.width}px`; canvas.style.height = `${rect.height}px`\r\n this.W = rect.width; this.H = rect.height\r\n this.reset()\r\n }\r\n\r\n private reset(): void {\r\n this.holes = Array.from({ length: HOLE_COUNT }, () => ({\r\n active: false, showProgress: 0, hideAt: 0, hit: false, hitProgress: 0,\r\n }))\r\n this.score = 0; this.timeLeft = ROUND_DURATION; this.roundOver = false\r\n this.nextSpawnTime = 0\r\n }\r\n\r\n start(): void {\r\n this.running = true; this.roundStart = performance.now(); this.lastTime = performance.now()\r\n this.nextSpawnTime = performance.now()\r\n this.loop(performance.now())\r\n this.canvas.addEventListener('click', this.boundClick)\r\n this.canvas.addEventListener('touchend', this.boundTouch, { passive: true })\r\n document.addEventListener('keydown', this.boundKeyDown)\r\n }\r\n\r\n pause(): void {\r\n this.running = false\r\n if (this.animFrameId !== null) { cancelAnimationFrame(this.animFrameId); this.animFrameId = null }\r\n }\r\n\r\n resume(): void {\r\n if (!this.running) {\r\n this.running = true; this.lastTime = performance.now()\r\n this.nextSpawnTime = performance.now()\r\n this.loop(performance.now())\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.pause()\r\n this.canvas.removeEventListener('click', this.boundClick)\r\n this.canvas.removeEventListener('touchend', this.boundTouch)\r\n document.removeEventListener('keydown', this.boundKeyDown)\r\n }\r\n\r\n getScore(): number { return this.score }\r\n\r\n // ─── RAF-based Mole Spawner ───────────────────────────────────────────────\r\n\r\n private trySpawnMole(now: number): void {\r\n if (this.roundOver || now < this.nextSpawnTime) return\r\n\r\n const available = this.holes.map((h, i) => (!h.active && !h.hit ? i : -1)).filter(i => i >= 0)\r\n if (available.length > 0) {\r\n const idx = available[Math.floor(Math.random() * available.length)]!\r\n this.activateMole(idx, now)\r\n }\r\n\r\n // Spawn rate accelerates: 900ms → 500ms over the round\r\n const elapsed = now - this.roundStart\r\n const t = Math.min(1, elapsed / ROUND_DURATION)\r\n const interval = SPAWN_START_MS - t * (SPAWN_START_MS - SPAWN_END_MS)\r\n this.nextSpawnTime = now + interval\r\n }\r\n\r\n private activateMole(idx: number, now: number): void {\r\n const hole = this.holes[idx]!\r\n hole.active = true; hole.hit = false; hole.hitProgress = 0\r\n hole.hideAt = now + MOLE_MIN_STAY + Math.random() * MOLE_STAY_RANGE\r\n }\r\n\r\n private holeBounds(i: number): { cx: number; cy: number; r: number } {\r\n const cols = GRID; const rows = GRID\r\n const padX = 24; const padY = 24\r\n const cellW = (this.W - padX * 2) / cols; const cellH = (this.H - padY * 2 - 30) / rows\r\n const col = i % cols; const row = Math.floor(i / cols)\r\n const cx = padX + col * cellW + cellW / 2\r\n const cy = padY + row * cellH + cellH / 2 + 30\r\n const r = Math.min(cellW, cellH) * 0.38\r\n return { cx, cy, r }\r\n }\r\n\r\n // ─── Input ────────────────────────────────────────────────────────────────\r\n\r\n private onClick(e: MouseEvent): void { const r = this.canvas.getBoundingClientRect(); this.tryHit(e.clientX - r.left, e.clientY - r.top) }\r\n private onTouch(e: TouchEvent): void { const t = e.changedTouches[0]; if (!t) return; const r = this.canvas.getBoundingClientRect(); this.tryHit(t.clientX - r.left, t.clientY - r.top) }\r\n\r\n private onKeyDown(e: KeyboardEvent): void {\r\n // Keys 1-9 map to holes 0-8 (top-left to bottom-right)\r\n const num = parseInt(e.key, 10)\r\n if (num >= 1 && num <= 9) {\r\n e.preventDefault()\r\n if (this.roundOver) { this.reset(); this.nextSpawnTime = performance.now(); return }\r\n const idx = num - 1\r\n const hole = this.holes[idx]\r\n if (hole && hole.active && !hole.hit) {\r\n hole.active = false; hole.hit = true; hole.hitProgress = 0; hole.hideAt = 0\r\n this.score++; this.onScore?.(this.score)\r\n }\r\n }\r\n }\r\n\r\n private tryHit(px: number, py: number): void {\r\n if (this.roundOver) { this.reset(); this.nextSpawnTime = performance.now(); return }\r\n for (let i = 0; i < this.holes.length; i++) {\r\n const hole = this.holes[i]!; if (!hole.active || hole.hit) continue\r\n const b = this.holeBounds(i)\r\n const dist = Math.hypot(px - b.cx, py - b.cy)\r\n if (dist < b.r * 1.2) {\r\n hole.active = false; hole.hit = true; hole.hitProgress = 0; hole.hideAt = 0\r\n this.score++; this.onScore?.(this.score)\r\n return\r\n }\r\n }\r\n }\r\n\r\n // ─── Loop ─────────────────────────────────────────────────────────────────\r\n\r\n private loop(now: number): void {\r\n if (!this.running) return\r\n this.animFrameId = requestAnimationFrame(t => this.loop(t))\r\n const dt = now - this.lastTime; this.lastTime = now\r\n this.update(now, dt); this.render()\r\n }\r\n\r\n private update(now: number, dt: number): void {\r\n if (this.roundOver) return\r\n\r\n this.timeLeft = Math.max(0, ROUND_DURATION - (now - this.roundStart))\r\n if (this.timeLeft === 0) { this.roundOver = true; this.onGameOver?.(); return }\r\n\r\n // RAF-based spawner (replaces setInterval)\r\n this.trySpawnMole(now)\r\n\r\n // Auto-hide moles whose time is up\r\n for (const hole of this.holes) {\r\n if (hole.active && hole.hideAt > 0 && now >= hole.hideAt) {\r\n hole.active = false; hole.hideAt = 0\r\n }\r\n }\r\n\r\n const step = dt / 200\r\n for (const hole of this.holes) {\r\n if (hole.active) hole.showProgress = Math.min(1, hole.showProgress + step)\r\n else if (hole.hit) { hole.hitProgress = Math.min(1, hole.hitProgress + step); if (hole.hitProgress >= 1) hole.hit = false }\r\n else hole.showProgress = Math.max(0, hole.showProgress - step)\r\n }\r\n }\r\n\r\n private render(): void {\r\n const { ctx, W, H, theme } = this\r\n ctx.fillStyle = theme.background; ctx.fillRect(0, 0, W, H)\r\n\r\n // Timer bar\r\n const progress = this.timeLeft / ROUND_DURATION\r\n ctx.fillStyle = theme.surface; ctx.fillRect(16, 10, W - 32, 12)\r\n ctx.fillStyle = progress > 0.3 ? theme.primary : theme.accent\r\n ctx.beginPath(); ctx.roundRect(16, 10, (W - 32) * progress, 12, 4); ctx.fill()\r\n\r\n // Score\r\n ctx.fillStyle = theme.text; ctx.font = 'bold 18px monospace'; ctx.textAlign = 'left'\r\n ctx.fillText(`${this.score}`, 16, H - 8)\r\n ctx.textAlign = 'right'; ctx.globalAlpha = 0.5; ctx.font = '12px system-ui'\r\n ctx.fillText(`${Math.ceil(this.timeLeft / 1000)}s`, W - 16, H - 8); ctx.globalAlpha = 1\r\n\r\n // Holes & moles\r\n for (let i = 0; i < this.holes.length; i++) {\r\n const hole = this.holes[i]!; const b = this.holeBounds(i)\r\n\r\n // Hole (always visible)\r\n ctx.fillStyle = theme.surface; ctx.globalAlpha = 0.6\r\n ctx.beginPath(); ctx.ellipse(b.cx, b.cy + b.r * 0.2, b.r, b.r * 0.4, 0, 0, Math.PI * 2); ctx.fill()\r\n ctx.globalAlpha = 1\r\n\r\n // Hole number label for keyboard hint\r\n ctx.fillStyle = theme.text; ctx.globalAlpha = 0.2; ctx.font = `bold ${b.r * 0.3}px monospace`\r\n ctx.textAlign = 'center'; ctx.fillText(`${i + 1}`, b.cx, b.cy + b.r * 0.55); ctx.globalAlpha = 1\r\n\r\n // Mole (pops up via showProgress or flies away on hit)\r\n const prog = hole.active || hole.hit ? (hole.hit ? 1 - hole.hitProgress : hole.showProgress) : hole.showProgress\r\n if (prog <= 0) continue\r\n\r\n const offsetY = (1 - prog) * b.r * 1.5\r\n const cy = b.cy - offsetY\r\n\r\n ctx.save()\r\n ctx.beginPath()\r\n ctx.ellipse(b.cx, b.cy + b.r * 0.25, b.r, b.r * 0.45, 0, 0, Math.PI * 2)\r\n ctx.clip()\r\n\r\n // Mole body\r\n ctx.fillStyle = hole.hit ? theme.accent : '#8B4513'\r\n ctx.beginPath(); ctx.arc(b.cx, cy, b.r * 0.8, 0, Math.PI * 2); ctx.fill()\r\n // Eyes\r\n ctx.fillStyle = '#fff'\r\n ctx.beginPath(); ctx.arc(b.cx - b.r * 0.28, cy - b.r * 0.15, b.r * 0.15, 0, Math.PI * 2); ctx.fill()\r\n ctx.beginPath(); ctx.arc(b.cx + b.r * 0.28, cy - b.r * 0.15, b.r * 0.15, 0, Math.PI * 2); ctx.fill()\r\n ctx.fillStyle = '#333'\r\n ctx.beginPath(); ctx.arc(b.cx - b.r * 0.25, cy - b.r * 0.15, b.r * 0.08, 0, Math.PI * 2); ctx.fill()\r\n ctx.beginPath(); ctx.arc(b.cx + b.r * 0.25, cy - b.r * 0.15, b.r * 0.08, 0, Math.PI * 2); ctx.fill()\r\n // Nose\r\n ctx.fillStyle = '#FFB6C1'\r\n ctx.beginPath(); ctx.arc(b.cx, cy + b.r * 0.05, b.r * 0.1, 0, Math.PI * 2); ctx.fill()\r\n\r\n if (hole.hit) {\r\n ctx.fillStyle = '#FFD700'; ctx.font = `bold ${b.r * 0.6}px system-ui`\r\n ctx.textAlign = 'center'; ctx.fillText('\\u2713', b.cx, cy - b.r * 0.6)\r\n }\r\n\r\n ctx.restore()\r\n }\r\n\r\n // Round over overlay\r\n if (this.roundOver) {\r\n ctx.fillStyle = 'rgba(0,0,0,0.55)'; ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.text; ctx.font = 'bold 24px system-ui'; ctx.textAlign = 'center'\r\n ctx.fillText(`Score: ${this.score}`, W / 2, H / 2)\r\n ctx.font = '14px system-ui'; ctx.globalAlpha = 0.7\r\n ctx.fillText('Tap to play again', W / 2, H / 2 + 32); ctx.globalAlpha = 1\r\n }\r\n }\r\n}\r\n","/**\r\n * GameController — Orchestrates the entire game lifecycle.\r\n *\r\n * Manages:\r\n * - Delay timer (don't flash for fast loads)\r\n * - Dynamic game chunk loading\r\n * - Canvas setup and teardown\r\n * - Entry/exit animations\r\n * - Score callbacks\r\n * - Visibility API pause/resume\r\n * - prefers-reduced-motion fallback\r\n */\r\n\r\nimport type {\r\n GameName,\r\n GamePlugin,\r\n LoadingGameOptions,\r\n Score,\r\n GameResult,\r\n ExitAnimation,\r\n GameState,\r\n} from './types.js'\r\nimport { resolveTheme, applyThemeToElement } from './theme.js'\r\nimport { DelayController } from './delay.js'\r\nimport { getPersonalBest, saveScore } from './scores.js'\r\n\r\ninterface ControllerCallbacks {\r\n onScore: (score: Score) => void\r\n onGameOver: (result: GameResult) => void\r\n onComplete: () => void\r\n onError: (err: Error) => void\r\n}\r\n\r\nconst SIZE_MAP = {\r\n sm: { width: 280, height: 220 },\r\n md: { width: 400, height: 320 },\r\n lg: { width: 560, height: 440 },\r\n full: { width: 0, height: 0 }, // handled separately\r\n}\r\n\r\nexport class GameController {\r\n hasEverActivated = false\r\n\r\n private host: HTMLElement\r\n private callbacks: ControllerCallbacks\r\n private options: LoadingGameOptions = {}\r\n private state: GameState = 'idle'\r\n\r\n private canvas: HTMLCanvasElement | null = null\r\n private overlay: HTMLElement | null = null\r\n private skipLink: HTMLAnchorElement | null = null\r\n\r\n private currentGame: GamePlugin | null = null\r\n private delayController: DelayController | null = null\r\n private _gameStartTime = 0\r\n private _currentScore = 0\r\n\r\n private boundVisibilityChange: () => void\r\n\r\n constructor(host: HTMLElement, callbacks: ControllerCallbacks) {\r\n this.host = host\r\n this.callbacks = callbacks\r\n this.boundVisibilityChange = this.handleVisibilityChange.bind(this)\r\n document.addEventListener('visibilitychange', this.boundVisibilityChange)\r\n }\r\n\r\n // ─── Public API ─────────────────────────────────────────────────────────────\r\n\r\n activate(options: LoadingGameOptions): void {\r\n this.hasEverActivated = true\r\n this.options = options\r\n if (this.state !== 'idle') return\r\n\r\n this.setState('delaying')\r\n\r\n this.delayController = new DelayController({\r\n delay: options.delay ?? 800,\r\n minDisplay: options.minDisplay ?? 0,\r\n onShow: () => this.showGame(),\r\n onExit: () => this.exitGame(),\r\n })\r\n\r\n this.delayController.start()\r\n }\r\n\r\n deactivate(opts: { animation: ExitAnimation }): void {\r\n this.options.exitAnimation = opts.animation\r\n\r\n if (this.state === 'delaying') {\r\n this.delayController?.end()\r\n this.setState('idle')\r\n return\r\n }\r\n\r\n if (this.state === 'playing') {\r\n this.currentGame?.pause()\r\n this.delayController?.end()\r\n }\r\n }\r\n\r\n /** Immediately tear down on error — no animation, no delay. */\r\n errorDeactivate(): void {\r\n this.delayController?.destroy()\r\n this.delayController = null\r\n this.currentGame?.destroy()\r\n this.currentGame = null\r\n this.teardownDOM()\r\n this.setState('idle')\r\n }\r\n\r\n updateOptions(options: LoadingGameOptions): void {\r\n this.options = { ...this.options, ...options }\r\n }\r\n\r\n destroy(): void {\r\n this.delayController?.destroy()\r\n this.currentGame?.destroy()\r\n this.currentGame = null\r\n this.teardownDOM()\r\n document.removeEventListener('visibilitychange', this.boundVisibilityChange)\r\n }\r\n\r\n // ─── Game Lifecycle ──────────────────────────────────────────────────────────\r\n\r\n private async showGame(): Promise<void> {\r\n this.setState('loading-game')\r\n\r\n const resolvedName = this.resolveGameName(this.options.game ?? 'random')\r\n\r\n try {\r\n const GameClass = await this.loadGameChunk(resolvedName)\r\n this.setupDOM()\r\n\r\n const theme = resolveTheme(this.options.theme)\r\n if (this.overlay) applyThemeToElement(this.overlay, theme)\r\n\r\n // Set game-specific aria-label\r\n if (this.canvas) {\r\n this.canvas.setAttribute('aria-label', `${resolvedName} game — loading in background`)\r\n }\r\n\r\n // prefers-reduced-motion: show static animation, no gameplay\r\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\r\n this.showReducedMotionFallback(theme)\r\n return\r\n }\r\n\r\n this.currentGame = new GameClass(\r\n (score: number) => this.handleScoreUpdate(score, resolvedName),\r\n () => this.handleGameOverEvent(resolvedName),\r\n )\r\n await this.currentGame.init(this.canvas!, this.options.theme ?? {})\r\n\r\n this.setState('playing')\r\n this._gameStartTime = Date.now()\r\n this._currentScore = 0\r\n this.currentGame.start()\r\n\r\n this.showToast('Loading in the background — play while you wait!')\r\n } catch (err) {\r\n this.callbacks.onError(err instanceof Error ? err : new Error(String(err)))\r\n this.teardownDOM()\r\n this.setState('idle')\r\n }\r\n }\r\n\r\n private async exitGame(): Promise<void> {\r\n if (this.state === 'playing' || this.state === 'min-display') {\r\n this.currentGame?.pause()\r\n this.showCompletionOverlay()\r\n\r\n // Wait 1.5s then fully exit\r\n await this.sleep(1500)\r\n }\r\n\r\n this.setState('exiting')\r\n await this.animateExit(this.options.exitAnimation ?? 'fade')\r\n\r\n this.currentGame?.destroy()\r\n this.currentGame = null\r\n this.teardownDOM()\r\n this.setState('idle')\r\n this.callbacks.onComplete()\r\n }\r\n\r\n // ─── DOM Setup ───────────────────────────────────────────────────────────────\r\n\r\n private setupDOM(): void {\r\n const size = this.options.size ?? 'md'\r\n const dimensions = SIZE_MAP[size]\r\n\r\n // Container\r\n this.overlay = document.createElement('div')\r\n this.overlay.setAttribute('data-lg-overlay', '')\r\n Object.assign(this.overlay.style, {\r\n position: size === 'full' ? 'fixed' : 'relative',\r\n inset: size === 'full' ? '0' : 'auto',\r\n width: size === 'full' ? '100%' : `${dimensions.width}px`,\r\n height: size === 'full' ? '100%' : `${dimensions.height}px`,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: size === 'full' ? '9999' : 'auto',\r\n opacity: '0',\r\n transition: 'opacity 300ms ease, transform 300ms ease',\r\n transform: 'scale(0.97)',\r\n overflow: 'hidden',\r\n borderRadius: size === 'full' ? '0' : '12px',\r\n })\r\n\r\n // Skip link (accessibility — must be first focusable element)\r\n this.skipLink = document.createElement('a')\r\n this.skipLink.href = '#'\r\n this.skipLink.textContent = 'Skip game, wait for loading'\r\n this.skipLink.setAttribute('data-lg-skip', '')\r\n Object.assign(this.skipLink.style, {\r\n position: 'absolute',\r\n top: '-9999px',\r\n left: '-9999px',\r\n })\r\n this.skipLink.addEventListener('focus', () => {\r\n Object.assign(this.skipLink!.style, { top: '8px', left: '8px' })\r\n })\r\n this.skipLink.addEventListener('blur', () => {\r\n Object.assign(this.skipLink!.style, { top: '-9999px', left: '-9999px' })\r\n })\r\n this.skipLink.addEventListener('click', (e) => {\r\n e.preventDefault()\r\n this.deactivate({ animation: 'none' })\r\n })\r\n\r\n // Canvas\r\n this.canvas = document.createElement('canvas')\r\n this.canvas.setAttribute('role', 'application')\r\n this.canvas.setAttribute('tabindex', '0')\r\n Object.assign(this.canvas.style, {\r\n width: '100%',\r\n height: '100%',\r\n display: 'block',\r\n })\r\n\r\n this.overlay.appendChild(this.skipLink)\r\n this.overlay.appendChild(this.canvas)\r\n this.host.appendChild(this.overlay)\r\n\r\n // Animate in\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n if (this.overlay) {\r\n this.overlay.style.opacity = '1'\r\n this.overlay.style.transform = 'scale(1)'\r\n }\r\n })\r\n })\r\n }\r\n\r\n private teardownDOM(): void {\r\n this.overlay?.remove()\r\n this.overlay = null\r\n this.canvas = null\r\n this.skipLink = null\r\n }\r\n\r\n private async animateExit(animation: ExitAnimation): Promise<void> {\r\n if (!this.overlay || animation === 'none') return\r\n\r\n if (animation === 'fade') {\r\n this.overlay.style.opacity = '0'\r\n } else if (animation === 'slide') {\r\n this.overlay.style.transform = 'translateY(-20px)'\r\n this.overlay.style.opacity = '0'\r\n }\r\n\r\n await this.sleep(350)\r\n }\r\n\r\n // ─── UI Helpers ──────────────────────────────────────────────────────────────\r\n\r\n private showToast(message: string): void {\r\n const toast = document.createElement('div')\r\n toast.textContent = message\r\n Object.assign(toast.style, {\r\n position: 'absolute',\r\n bottom: '12px',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n background: 'rgba(0,0,0,0.7)',\r\n color: '#fff',\r\n padding: '6px 12px',\r\n borderRadius: '6px',\r\n fontSize: '12px',\r\n whiteSpace: 'nowrap',\r\n opacity: '0',\r\n transition: 'opacity 300ms ease',\r\n pointerEvents: 'none',\r\n })\r\n\r\n this.overlay?.appendChild(toast)\r\n requestAnimationFrame(() => { toast.style.opacity = '1' })\r\n\r\n setTimeout(() => {\r\n toast.style.opacity = '0'\r\n setTimeout(() => toast.remove(), 300)\r\n }, 2000)\r\n }\r\n\r\n private showCompletionOverlay(): void {\r\n const el = document.createElement('div')\r\n el.textContent = '\\u2713 Done! Loading complete.'\r\n Object.assign(el.style, {\r\n position: 'absolute',\r\n inset: '0',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n background: 'rgba(0,0,0,0.6)',\r\n color: '#fff',\r\n fontSize: '18px',\r\n fontWeight: 'bold',\r\n fontFamily: 'system-ui, sans-serif',\r\n opacity: '0',\r\n transition: 'opacity 300ms ease',\r\n })\r\n this.overlay?.appendChild(el)\r\n requestAnimationFrame(() => { el.style.opacity = '1' })\r\n }\r\n\r\n private showReducedMotionFallback(theme: ReturnType<typeof resolveTheme>): void {\r\n if (!this.canvas) return\r\n const ctx = this.canvas.getContext('2d')!\r\n const W = this.canvas.width\r\n const H = this.canvas.height\r\n ctx.fillStyle = theme.background\r\n ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.primary\r\n ctx.font = '16px system-ui'\r\n ctx.textAlign = 'center'\r\n ctx.fillText('Loading\\u2026', W / 2, H / 2)\r\n this.setState('playing')\r\n }\r\n\r\n // ─── Score Handling ───────────────────────────────────────────────────────────\r\n\r\n private handleGameOverEvent(game: Exclude<GameName, 'random'>): void {\r\n const duration = Date.now() - this._gameStartTime\r\n const personalBest = getPersonalBest(game, this.options.namespace)\r\n this.callbacks.onGameOver({\r\n game,\r\n finalScore: this._currentScore,\r\n duration,\r\n isNewRecord: this._currentScore > personalBest,\r\n })\r\n }\r\n\r\n private handleScoreUpdate(score: number, game: Exclude<GameName, 'random'>): void {\r\n this._currentScore = score\r\n const personalBest = getPersonalBest(game, this.options.namespace)\r\n let isNewRecord = false\r\n\r\n if (this.options.saveScores !== false && score > personalBest) {\r\n isNewRecord = saveScore(game, score, this.options.namespace)\r\n }\r\n\r\n this.callbacks.onScore({ game, current: score, personalBest: Math.max(score, personalBest), isNewRecord })\r\n\r\n if (isNewRecord) this.showNewRecordBadge()\r\n }\r\n\r\n private showNewRecordBadge(): void {\r\n const badge = document.createElement('div')\r\n badge.textContent = '\\uD83C\\uDFC6 New Record!'\r\n Object.assign(badge.style, {\r\n position: 'absolute',\r\n top: '12px',\r\n left: '50%',\r\n transform: 'translateX(-50%) scale(0.8)',\r\n background: 'gold',\r\n color: '#000',\r\n padding: '4px 10px',\r\n borderRadius: '6px',\r\n fontSize: '12px',\r\n fontWeight: 'bold',\r\n fontFamily: 'system-ui, sans-serif',\r\n opacity: '0',\r\n transition: 'opacity 300ms ease, transform 300ms ease',\r\n pointerEvents: 'none',\r\n })\r\n this.overlay?.appendChild(badge)\r\n requestAnimationFrame(() => {\r\n badge.style.opacity = '1'\r\n badge.style.transform = 'translateX(-50%) scale(1)'\r\n })\r\n setTimeout(() => {\r\n badge.style.opacity = '0'\r\n setTimeout(() => badge.remove(), 300)\r\n }, 2500)\r\n }\r\n\r\n // ─── Dynamic Imports ──────────────────────────────────────────────────────────\r\n\r\n private async loadGameChunk(name: Exclude<GameName, 'random'>): Promise<new (onScore?: (s: number) => void, onGameOver?: () => void) => GamePlugin> {\r\n switch (name) {\r\n case 'snake':\r\n return (await import('./games/snake/index.js')).SnakeGame\r\n case 'brick-breaker':\r\n return (await import('./games/brick-breaker/index.js')).BrickBreakerGame\r\n case 'flappy':\r\n return (await import('./games/flappy/index.js')).FlappyGame\r\n case '2048':\r\n return (await import('./games/2048/index.js')).Game2048\r\n case 'wordle-lite':\r\n return (await import('./games/wordle-lite/index.js')).WordleLiteGame\r\n case 'asteroids':\r\n return (await import('./games/asteroids/index.js')).AsteroidsGame\r\n case 'memory-cards':\r\n return (await import('./games/memory-cards/index.js')).MemoryCardsGame\r\n case 'whack-a-mole':\r\n return (await import('./games/whack-a-mole/index.js')).WhackAMoleGame\r\n default:\r\n throw new Error(`Unknown game: ${name}`)\r\n }\r\n }\r\n\r\n // ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\n private resolveGameName(name: GameName): Exclude<GameName, 'random'> {\r\n if (name !== 'random') return name\r\n const games: Exclude<GameName, 'random'>[] = [\r\n 'snake', 'brick-breaker', 'flappy', '2048',\r\n 'wordle-lite', 'asteroids', 'memory-cards', 'whack-a-mole',\r\n ]\r\n return games[Math.floor(Math.random() * games.length)]!\r\n }\r\n\r\n private setState(state: GameState): void {\r\n this.state = state\r\n }\r\n\r\n private handleVisibilityChange(): void {\r\n if (!this.currentGame) return\r\n if (document.visibilityState === 'hidden') {\r\n this.currentGame.pause()\r\n } else if (this.state === 'playing') {\r\n this.currentGame.resume()\r\n }\r\n }\r\n\r\n private sleep(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms))\r\n }\r\n}\r\n","/**\r\n * Intelligent delay system.\r\n * \r\n * Rules:\r\n * - Don't show the game if loading completes before `delay` ms (prevents flash)\r\n * - Once shown, keep the game visible for at least `minDisplay` ms\r\n * - When loading completes, transition to the exit animation\r\n */\r\n\r\nexport interface DelayOptions {\r\n /** Milliseconds to wait before showing the game. @default 800 */\r\n delay: number\r\n /** Minimum milliseconds to show the game once visible. @default 0 */\r\n minDisplay: number\r\n /** Called when the game should become visible */\r\n onShow: () => void\r\n /** Called when the game should start exiting */\r\n onExit: () => void\r\n}\r\n\r\nexport class DelayController {\r\n private delayTimer: ReturnType<typeof setTimeout> | null = null\r\n private minDisplayTimer: ReturnType<typeof setTimeout> | null = null\r\n private showTime: number | null = null\r\n private loadingCompletedWhileDelaying = false\r\n private isVisible = false\r\n private destroyed = false\r\n\r\n constructor(private options: DelayOptions) {}\r\n\r\n /**\r\n * Called when loading starts (active = true).\r\n * Starts the delay timer.\r\n */\r\n start(): void {\r\n if (this.destroyed) return\r\n this.loadingCompletedWhileDelaying = false\r\n\r\n this.delayTimer = setTimeout(() => {\r\n this.delayTimer = null // timer has fired — clear the reference\r\n if (this.destroyed) return\r\n\r\n if (this.loadingCompletedWhileDelaying) {\r\n // Loading completed during delay — don't show game\r\n return\r\n }\r\n\r\n this.isVisible = true\r\n this.showTime = Date.now()\r\n this.options.onShow()\r\n }, this.options.delay)\r\n }\r\n\r\n /**\r\n * Called when loading ends (active = false).\r\n * Either cancels the delay (if still waiting) or triggers exit with minDisplay logic.\r\n */\r\n end(): void {\r\n if (this.destroyed) return\r\n\r\n if (this.delayTimer !== null) {\r\n // Still in delay period — cancel and never show\r\n clearTimeout(this.delayTimer)\r\n this.delayTimer = null\r\n this.loadingCompletedWhileDelaying = true\r\n return\r\n }\r\n\r\n if (!this.isVisible) return\r\n\r\n const elapsed = Date.now() - (this.showTime ?? 0)\r\n const remaining = this.options.minDisplay - elapsed\r\n\r\n if (remaining <= 0) {\r\n // minDisplay already elapsed — exit immediately\r\n this.triggerExit()\r\n } else {\r\n // Wait for minDisplay remainder\r\n this.minDisplayTimer = setTimeout(() => {\r\n if (!this.destroyed) this.triggerExit()\r\n }, remaining)\r\n }\r\n }\r\n\r\n private triggerExit(): void {\r\n this.isVisible = false\r\n this.options.onExit()\r\n }\r\n\r\n /** Clean up all timers. */\r\n destroy(): void {\r\n this.destroyed = true\r\n if (this.delayTimer !== null) {\r\n clearTimeout(this.delayTimer)\r\n this.delayTimer = null\r\n }\r\n if (this.minDisplayTimer !== null) {\r\n clearTimeout(this.minDisplayTimer)\r\n this.minDisplayTimer = null\r\n }\r\n }\r\n}\r\n","/**\r\n * Score persistence layer.\r\n * Stores personal bests per game in localStorage under the 'loading-games' namespace.\r\n */\r\n\r\nimport type { GameName } from './types.js'\r\n\r\nconst STORAGE_KEY = 'loading-games:scores'\r\n\r\ninterface ScoreEntry {\r\n personalBest: number\r\n lastPlayed: string // ISO date string\r\n totalGames: number\r\n}\r\n\r\ntype ScoreStore = Record<string, ScoreEntry>\r\n\r\nfunction readStore(): ScoreStore {\r\n if (typeof window === 'undefined' || !window.localStorage) return {}\r\n try {\r\n const raw = localStorage.getItem(STORAGE_KEY)\r\n return raw ? (JSON.parse(raw) as ScoreStore) : {}\r\n } catch {\r\n return {}\r\n }\r\n}\r\n\r\nfunction writeStore(store: ScoreStore): void {\r\n if (typeof window === 'undefined' || !window.localStorage) return\r\n try {\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify(store))\r\n } catch {\r\n // Quota exceeded or private browsing — fail silently\r\n }\r\n}\r\n\r\n/**\r\n * Build the storage key for a game, optionally scoped by namespace.\r\n */\r\nfunction buildKey(game: Exclude<GameName, 'random'>, namespace?: string): string {\r\n return namespace ? `${namespace}:${game}` : game\r\n}\r\n\r\n/**\r\n * Get the personal best for a game.\r\n * Returns 0 if no score has been recorded.\r\n */\r\nexport function getPersonalBest(\r\n game: Exclude<GameName, 'random'>,\r\n namespace?: string\r\n): number {\r\n const store = readStore()\r\n const key = buildKey(game, namespace)\r\n return store[key]?.personalBest ?? 0\r\n}\r\n\r\n/**\r\n * Save a new score. Returns true if this is a new personal best.\r\n */\r\nexport function saveScore(\r\n game: Exclude<GameName, 'random'>,\r\n score: number,\r\n namespace?: string\r\n): boolean {\r\n const store = readStore()\r\n const key = buildKey(game, namespace)\r\n const existing = store[key]\r\n\r\n const isNewRecord = score > (existing?.personalBest ?? 0)\r\n\r\n store[key] = {\r\n personalBest: isNewRecord ? score : (existing?.personalBest ?? 0),\r\n lastPlayed: new Date().toISOString(),\r\n totalGames: (existing?.totalGames ?? 0) + 1,\r\n }\r\n\r\n writeStore(store)\r\n return isNewRecord\r\n}\r\n\r\n/**\r\n * Get all scores, optionally filtered by namespace.\r\n */\r\nexport function getAllScores(namespace?: string): Record<string, ScoreEntry> {\r\n const store = readStore()\r\n if (!namespace) return store\r\n\r\n return Object.fromEntries(\r\n Object.entries(store).filter(([key]) => key.startsWith(`${namespace}:`))\r\n )\r\n}\r\n\r\n/**\r\n * Clear all scores, optionally scoped to a namespace.\r\n */\r\nexport function clearScores(namespace?: string): void {\r\n if (!namespace) {\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n localStorage.removeItem(STORAGE_KEY)\r\n }\r\n return\r\n }\r\n\r\n const store = readStore()\r\n const prefix = `${namespace}:`\r\n const filtered = Object.fromEntries(\r\n Object.entries(store).filter(([key]) => !key.startsWith(prefix))\r\n )\r\n writeStore(filtered)\r\n}\r\n","/**\r\n * <loading-game> Web Component\r\n *\r\n * Registers a custom element that wraps the GameController.\r\n * Works in any framework or plain HTML.\r\n *\r\n * @example HTML\r\n * <loading-game game=\"snake\" active=\"true\" theme-primary=\"#6366F1\"></loading-game>\r\n *\r\n * @example Imperative JS\r\n * const el = document.querySelector('loading-game')\r\n * el.start()\r\n * el.stop()\r\n * el.setTheme({ primary: '#E94560' })\r\n */\r\n\r\nimport type { GameName, GameSize, ExitAnimation, ThemeObject, LoadingGameOptions } from './types.js'\r\nimport { GameController } from './controller.js'\r\n\r\nexport class LoadingGameElement extends HTMLElement {\r\n static observedAttributes = [\r\n 'game',\r\n 'active',\r\n 'size',\r\n 'delay',\r\n 'min-display',\r\n 'exit-animation',\r\n 'save-scores',\r\n 'namespace',\r\n ]\r\n\r\n private controller: GameController | null = null\r\n private _theme: ThemeObject = {}\r\n\r\n // ─── Lifecycle ────────────────────────────────────────────────────────────\r\n\r\n connectedCallback(): void {\r\n this.setAttribute('role', 'region')\r\n this.setAttribute('aria-label', 'Loading game')\r\n\r\n this.controller = new GameController(this, {\r\n onScore: (score) => this.dispatchEvent(new CustomEvent('lg:score', { detail: score, bubbles: true })),\r\n onGameOver: (result) => this.dispatchEvent(new CustomEvent('lg:gameover', { detail: result, bubbles: true })),\r\n onComplete: () => this.dispatchEvent(new CustomEvent('lg:complete', { bubbles: true })),\r\n onError: (err) => {\r\n this.controller?.errorDeactivate()\r\n this.dispatchEvent(new CustomEvent('lg:error', { detail: err, bubbles: true }))\r\n },\r\n })\r\n\r\n if (this.getAttribute('active') === 'true') {\r\n this.controller.activate(this.buildOptions())\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n this.controller?.destroy()\r\n this.controller = null\r\n }\r\n\r\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\r\n if (oldValue === newValue || !this.controller) return\r\n\r\n if (name === 'active') {\r\n if (newValue === 'true') {\r\n this.controller.activate(this.buildOptions())\r\n } else {\r\n this.controller.deactivate({ animation: this.getExitAnimation() })\r\n }\r\n } else {\r\n // For other attribute changes, update the controller options\r\n this.controller.updateOptions(this.buildOptions())\r\n }\r\n }\r\n\r\n // ─── Property Setter for theme (object — can't be an attribute) ───────────\r\n\r\n set theme(value: ThemeObject) {\r\n this._theme = value\r\n this.controller?.updateOptions(this.buildOptions())\r\n }\r\n\r\n get theme(): ThemeObject {\r\n return this._theme\r\n }\r\n\r\n // ─── Imperative API ───────────────────────────────────────────────────────\r\n\r\n /** Start the game manually. Equivalent to setting active=\"true\". */\r\n start(): void {\r\n this.setAttribute('active', 'true')\r\n }\r\n\r\n /** Stop the game manually. Equivalent to setting active=\"false\". */\r\n stop(): void {\r\n this.removeAttribute('active')\r\n }\r\n\r\n /** Update the theme dynamically. */\r\n setTheme(theme: ThemeObject): void {\r\n this.theme = theme\r\n }\r\n\r\n // ─── Helpers ──────────────────────────────────────────────────────────────\r\n\r\n private buildOptions(): LoadingGameOptions {\r\n const game = (this.getAttribute('game') ?? 'random') as GameName\r\n const size = (this.getAttribute('size') ?? 'md') as GameSize\r\n const delay = parseInt(this.getAttribute('delay') ?? '800', 10)\r\n const minDisplay = parseInt(this.getAttribute('min-display') ?? '0', 10)\r\n const exitAnimation = (this.getAttribute('exit-animation') ?? 'fade') as ExitAnimation\r\n const saveScores = this.getAttribute('save-scores') !== 'false'\r\n const namespace = this.getAttribute('namespace') ?? undefined\r\n\r\n return {\r\n game,\r\n size,\r\n delay,\r\n minDisplay,\r\n exitAnimation,\r\n saveScores,\r\n namespace,\r\n theme: this._theme,\r\n }\r\n }\r\n\r\n private getExitAnimation(): ExitAnimation {\r\n return (this.getAttribute('exit-animation') ?? 'fade') as ExitAnimation\r\n }\r\n}\r\n","/**\r\n * loading-games — Main entry point\r\n *\r\n * Exports the Web Component, types, and utilities.\r\n * Auto-registers <loading-game> custom element on import.\r\n */\r\n\r\nexport { LoadingGameElement } from './component.js'\r\nexport { GameController } from './controller.js'\r\n\r\n// Types\r\nexport type {\r\n GameName,\r\n GameSize,\r\n ExitAnimation,\r\n ThemeObject,\r\n Score,\r\n GameResult,\r\n LoadingGameOptions,\r\n GamePlugin,\r\n GameState,\r\n ResolvedTheme,\r\n} from './types.js'\r\n\r\n// Utilities\r\nexport { resolveTheme, applyThemeToElement } from './theme.js'\r\nexport { getPersonalBest, saveScore, getAllScores, clearScores } from './scores.js'\r\nexport { DelayController } from './delay.js'\r\nexport { Dpad } from './dpad.js'\r\nexport type { DpadDirection, DpadOptions } from './dpad.js'\r\n\r\n// Auto-register custom element\r\nimport { LoadingGameElement } from './component.js'\r\n\r\nif (typeof customElements !== 'undefined' && !customElements.get('loading-game')) {\r\n customElements.define('loading-game', LoadingGameElement)\r\n}\r\n"]}
|