@joystyk/launcher 0.0.0 → 0.2.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.
Files changed (55) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +245 -2
  3. package/dist/browser/daily-prefetch.d.ts +8 -0
  4. package/dist/browser/daily-prefetch.js +32 -0
  5. package/dist/browser/daily-prefetch.js.map +1 -0
  6. package/dist/browser/index.d.ts +3 -0
  7. package/dist/browser/index.js +4 -0
  8. package/dist/browser/rooms.d.ts +2 -0
  9. package/dist/browser/rooms.js +49 -0
  10. package/dist/browser/rooms.js.map +1 -0
  11. package/dist/browser/services.d.ts +127 -0
  12. package/dist/browser/services.js +95 -0
  13. package/dist/browser/services.js.map +1 -0
  14. package/dist/browser/stage.d.ts +28 -0
  15. package/dist/browser/stage.js +1195 -0
  16. package/dist/browser/stage.js.map +1 -0
  17. package/dist/fixture/engine.d.ts +60 -0
  18. package/dist/fixture/engine.js +164 -0
  19. package/dist/fixture/engine.js.map +1 -0
  20. package/dist/fixture/index.d.ts +52 -0
  21. package/dist/fixture/index.js +63 -0
  22. package/dist/fixture/index.js.map +1 -0
  23. package/dist/fixture/module.d.ts +2 -0
  24. package/dist/fixture/module.js +135 -0
  25. package/dist/fixture/module.js.map +1 -0
  26. package/dist/fixture/probe.d.ts +10 -0
  27. package/dist/fixture/probe.js +19 -0
  28. package/dist/fixture/probe.js.map +1 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.js +4 -0
  31. package/dist/launcher.d.ts +190 -0
  32. package/dist/launcher.js +4614 -0
  33. package/dist/launcher.js.map +1 -0
  34. package/dist/model.d.ts +431 -0
  35. package/dist/model.js +566 -0
  36. package/dist/model.js.map +1 -0
  37. package/dist/report-problem.d.ts +39 -0
  38. package/dist/report-problem.js +359 -0
  39. package/dist/report-problem.js.map +1 -0
  40. package/dist/report.d.ts +18 -0
  41. package/dist/report.js +32 -0
  42. package/dist/report.js.map +1 -0
  43. package/dist/room-drivers.d.ts +26 -0
  44. package/dist/room-drivers.js +92 -0
  45. package/dist/room-drivers.js.map +1 -0
  46. package/dist/safe-point.d.ts +33 -0
  47. package/dist/safe-point.js +44 -0
  48. package/dist/safe-point.js.map +1 -0
  49. package/dist/save-slots.d.ts +6 -0
  50. package/dist/save-slots.js +18 -0
  51. package/dist/save-slots.js.map +1 -0
  52. package/dist/theme.d.ts +35 -0
  53. package/dist/theme.js +111 -0
  54. package/dist/theme.js.map +1 -0
  55. package/package.json +67 -11
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcher.js","names":["_gyral$compiled"],"sources":["../src/launcher.ts"],"sourcesContent":["import type { ChildValue } from '@gyral/core';\n// <jy-launcher>: the frame around a game (D-07). It picks a mode from the manifest, builds\n// the seats, then hands a `<jy-game-stage>` the plan; the stage loads the game's module,\n// creates the local session and mounts the canvas, and reports back. Around the canvas the\n// launcher draws the platform's own screens: the resume offer, the pass-and-play hand-off\n// (D-31), the overlay (pause, preferences, exit) and the results, with the `results` ad slot.\n// The results open as a non-modal dialog over the finished game: the canvas stays mounted\n// (and inert while they show), so the player can close them and look at the final board.\n//\n// Online with friends (server rooms, D-48) adds a lobby: the stage opens the room (creating\n// it, or joining by link or code) and reports it after every change; the launcher draws the\n// invite, the seats, the clock and the host's controls, and asks the room for changes through\n// the stage. The game mounts when the match starts, and its results show over the final board.\n//\n// The model is pure and JSON, so the page server-renders the setup form: without JavaScript\n// it shows a disabled Start button and says JavaScript is needed. Everything with a lifecycle\n// (storage, the session, the mounted game) lives in the stage element, loaded on first Start.\nimport {\n command,\n css,\n defineDriver,\n define,\n call,\n keyed,\n each,\n focus,\n html,\n intentsOf,\n nothing,\n prop,\n type Command,\n type Next,\n} from '@gyral/core';\nimport {\n optionsForMode,\n type GameOption,\n type OptionValue,\n type Json,\n type Mode,\n type SeatInfo,\n} from '@joystyk/contracts';\nimport type { StoredPreferences } from '@joystyk/storage';\nimport '@joystyk/ui/ad-slot';\nimport {\n clockLabel,\n clockValue,\n computerSeatsFor,\n formatElapsed,\n initialSetup,\n isLauncherGame,\n isoDuration,\n AI_NOTICE,\n MODE_LABELS,\n modeOptions,\n needsAiNotice,\n offerAnnouncement,\n offerText,\n ONLINE_CHECKING,\n parseClockValue,\n parsePreferenceChange,\n parseRoomCode,\n parseStageOutput,\n pickMode,\n playerCounts,\n resultView,\n seatsFor,\n spacedCode,\n startProblem,\n toStageMode,\n type Begin,\n type ClockOption,\n type DailyFrame,\n type FrameState,\n type LauncherGame,\n type ModeOption,\n type OnlineRooms,\n type ResultView,\n type RoomFrame,\n type RoomOfferFrame,\n type RoomPlan,\n type RoomRequest,\n type RoomSeat,\n type SaveSummary,\n type Setup,\n type StageControl,\n type StageOutput,\n} from './model.ts';\nimport './report-problem.ts';\nimport { checkOnline, copyText, readInvite, shareText, showRoomInUrl } from './room-drivers.ts';\nimport { reportSafePoint } from './safe-point.ts';\n\nexport type Phase =\n | { readonly _tag: 'Setup' }\n | { readonly _tag: 'Loading' }\n /** D-44: an AI-content game waits for the player to accept the notice. */\n | { readonly _tag: 'AiNotice'; readonly save: SaveSummary | null }\n | { readonly _tag: 'Resume'; readonly save: SaveSummary }\n /** Online with friends: the room is open and its match hasn't started. */\n | { readonly _tag: 'Lobby' }\n | { readonly _tag: 'Playing'; readonly frame: FrameState | null; readonly menu: boolean }\n /**\n * The game is over. Its canvas stays mounted with the final board; `shown` says whether the\n * results dialog is open over it (the canvas is inert then) or closed for a look at the board.\n */\n | { readonly _tag: 'Results'; readonly result: ResultView; readonly shown: boolean }\n | { readonly _tag: 'Failed'; readonly message: string };\n\nexport type LauncherState = {\n /** True once hydrated; exposed as `:state(live)`. */\n readonly live: boolean;\n readonly setup: Setup;\n readonly phase: Phase;\n /** Counts games started here; each gets a fresh stage element. */\n readonly round: number;\n /** The stage element's code has loaded. */\n readonly stageReady: boolean;\n readonly seats: readonly SeatInfo[];\n readonly begin: Begin;\n readonly resumeSlot: string | null;\n readonly reveals: number;\n readonly preferences: StoredPreferences | null;\n /** The frame's live regions. */\n readonly polite: string;\n readonly assertive: string;\n /** A message about the last game or save, shown on the setup and play screens. */\n readonly notice: string | null;\n /** The safe point last reported to the page. */\n readonly safe: boolean;\n /** The config this round starts with: null for the game's own setup, or a rematch's. */\n readonly config: Json | null;\n /** The config \"Play again\" starts with, when the finished game's engine named one. */\n readonly rematch: Json | null;\n /** Online with friends: how this round opens its room, or null for local play. */\n readonly plan: RoomPlan | null;\n /** The room as the stage last reported it. */\n readonly room: RoomFrame | null;\n /** The daily puzzle's results: streaks and share text, once the stage has recorded them. */\n readonly daily: DailyFrame | null;\n /** The puzzle this round plays, when the stage names it (a daily puzzle), for \"Report a problem\". */\n readonly puzzle: string | null;\n /** Which games the room server hosts, as it last answered (the same for every game page). */\n readonly online: OnlineRooms;\n};\n\nexport type LauncherMsg =\n | { readonly _tag: 'PickMode'; readonly mode: Mode }\n | { readonly _tag: 'PickLevel'; readonly level: string }\n | { readonly _tag: 'PickPlayers'; readonly players: number }\n | { readonly _tag: 'Rename'; readonly seat: number; readonly name: string }\n | {\n readonly _tag: 'PickGameOption';\n readonly key: string;\n readonly value: string;\n readonly checked: boolean | undefined;\n }\n | { readonly _tag: 'Start' }\n | { readonly _tag: 'StageLoaded' }\n | { readonly _tag: 'StageOut'; readonly out: StageOutput }\n | { readonly _tag: 'AcceptAiNotice' }\n | { readonly _tag: 'Resume' }\n | { readonly _tag: 'ChooseSave'; readonly slot: string }\n | { readonly _tag: 'NewGame' }\n | { readonly _tag: 'Reveal' }\n | { readonly _tag: 'OpenMenu' }\n | { readonly _tag: 'CloseMenu' }\n | { readonly _tag: 'MenuClosed' }\n | { readonly _tag: 'SetPreference'; readonly changes: Partial<StoredPreferences> }\n | { readonly _tag: 'Exit' }\n | { readonly _tag: 'PlayAgain' }\n | { readonly _tag: 'ChangeMode' }\n /** Close the results to look at the final board (Escape, or \"Review the board\"). */\n | { readonly _tag: 'HideResults' }\n | { readonly _tag: 'ShowResults' }\n /** Online with friends: the join form, the invite in the address bar, and lobby requests. */\n | { readonly _tag: 'TypeCode'; readonly code: string }\n | { readonly _tag: 'ToggleWatch'; readonly watch: boolean }\n | { readonly _tag: 'JoinRoom' }\n | { readonly _tag: 'InviteFound'; readonly code: string }\n /** The room server's answer: which games it hosts, or that it can't be reached. */\n | { readonly _tag: 'OnlineChecked'; readonly online: OnlineRooms }\n /** D-61: ask to end the match early, or answer the room's open offer. */\n | { readonly _tag: 'OfferEnd' }\n | { readonly _tag: 'RoomRequest'; readonly request: RoomRequest }\n | { readonly _tag: 'AnswerOffer'; readonly answer: 'accept' | 'decline' | 'withdraw' }\n | { readonly _tag: 'Copy'; readonly what: 'link' | 'code' }\n | { readonly _tag: 'Copied'; readonly what: 'link' | 'code'; readonly ok: boolean }\n /** The daily results: share (or copy) the emoji form, or copy the words form. */\n | { readonly _tag: 'Share'; readonly form: 'symbols' | 'words' }\n | {\n readonly _tag: 'Shared';\n readonly form: 'symbols' | 'words';\n readonly how: 'shared' | 'copied' | 'cancelled' | 'failed';\n };\n\nconst props = {\n /** The game, from its manifest and catalog listing. Property only (`.game=${…}`). */\n game: prop.value(isLauncherGame, { required: true }),\n};\nexport type LauncherProps = { readonly game: LauncherGame };\n\nconst i = intentsOf<typeof Launcher>();\n\n// --- Effects ------------------------------------------------------------------------------------\n\n/** Loads and registers `<jy-game-stage>` on first Start, so pages pay for it only when played. */\nexport const stageLoader = defineDriver<undefined, void, string>({\n name: 'launcher-stage',\n run: async () => {\n await import('./browser/stage.ts');\n },\n concurrency: 'exhaust',\n toError: (cause) => (cause instanceof Error ? cause.message : String(cause)),\n});\n\nconst loadStage = (): Command<LauncherMsg> =>\n command<undefined, void, string, LauncherMsg>(stageLoader, undefined, {\n onSuccess: () => ({ _tag: 'StageLoaded' }),\n onFailure: () => ({\n _tag: 'StageOut',\n out: { _tag: 'Failed', message: \"The game couldn't load. Check your connection, then try again.\" },\n }),\n });\n\n// --- The model ----------------------------------------------------------------------------------\n\nexport const freshState = (game: LauncherGame, live = false, online: OnlineRooms = ONLINE_CHECKING): LauncherState => ({\n live,\n setup: initialSetup(game, online),\n phase: { _tag: 'Setup' },\n round: 0,\n stageReady: false,\n seats: [],\n begin: null,\n resumeSlot: null,\n reveals: 0,\n preferences: null,\n polite: '',\n assertive: '',\n notice: null,\n safe: true,\n config: null,\n rematch: null,\n plan: null,\n room: null,\n daily: null,\n puzzle: null,\n online,\n});\n\n/** True when the page should ask the room server which games it hosts: the game lists online play and nobody has answered yet. */\nconst asksOnline = (game: LauncherGame, online: OnlineRooms): boolean =>\n online._tag === 'Checking' && game.modes.includes('server');\n\n/** The modes this game offers, given the room server's last answer. */\nconst optionsOf = (s: LauncherState, game: LauncherGame): readonly ModeOption[] => modeOptions(game, s.online);\n\n/** Whether an update could be offered now (offline-and-updates.md, Rule 2). */\nexport const isSafePoint = (phase: Phase): boolean =>\n phase._tag === 'Playing' ? (phase.frame?.safePoint ?? false) : true;\n\n/** Returns the next state, reporting the safe point to the page when it changed. */\nconst settle = (\n next: LauncherState,\n game: LauncherGame,\n commands: readonly Command<LauncherMsg>[] = [],\n): Next<LauncherState, LauncherMsg> => {\n const safe = isSafePoint(next.phase);\n return safe === next.safe\n ? [next, commands]\n : [{ ...next, safe }, [...commands, reportSafePoint({ safe, gameId: game.id })]];\n};\n\n/** A fresh live region text; repeating a message nudges it so screen readers say it again. */\nconst say = (previous: string, message: string): string => (previous === message ? `${message} ` : message);\n\nconst STAGE = 'jy-game-stage';\n\nconst beginPlay = (s: LauncherState, game: LauncherGame, begin: 'new' | 'resume'): Next<LauncherState, LauncherMsg> =>\n // A room keeps loading until the stage reports it; its game mounts when the match starts.\n // (After the AI-content notice, the phase goes back to Loading so the room's report opens the lobby.)\n s.plan !== null\n ? settle({ ...s, begin, phase: { _tag: 'Loading' } }, game)\n : settle(\n {\n ...s,\n begin,\n resumeSlot: begin === 'resume' && s.phase._tag === 'Resume' ? (s.phase.save.slot ?? null) : null,\n phase: { _tag: 'Playing', frame: null, menu: false },\n },\n game,\n [focus(STAGE)],\n );\n\nconst toSetup = (s: LauncherState, game: LauncherGame): Next<LauncherState, LauncherMsg> =>\n settle({ ...s, phase: { _tag: 'Setup' }, begin: null, room: null, plan: null }, game, [\n focus('.start'),\n ...(s.room === null ? [] : [showRoomInUrl<LauncherMsg>(null)]),\n ]);\n\nconst startRound = (\n s: LauncherState,\n game: LauncherGame,\n seats: readonly SeatInfo[],\n config: Json | null,\n plan: RoomPlan | null = null,\n): Next<LauncherState, LauncherMsg> =>\n settle(\n {\n ...s,\n seats,\n config,\n rematch: null,\n round: s.round + 1,\n begin: null,\n resumeSlot: null,\n reveals: 0,\n notice: null,\n plan,\n room: null,\n daily: null,\n puzzle: null,\n phase: { _tag: 'Loading' },\n polite: say(\n s.polite,\n plan === null ? `Loading ${game.name}…` : plan.action === 'create' ? 'Opening a room…' : 'Joining the room…',\n ),\n },\n game,\n s.stageReady ? [] : [loadStage()],\n );\n\n/** Hands a request to the room through the stage. */\nconst ask = (s: LauncherState, request: RoomRequest): Next<LauncherState, LauncherMsg> => [\n s,\n [call(STAGE, 'roomRequest', request)],\n];\n\n/** A lobby request, once the room is open. The room itself checks who may ask what. */\nconst askRoom = (s: LauncherState, request: RoomRequest): Next<LauncherState, LauncherMsg> =>\n s.plan !== null && s.room !== null ? ask(s, request) : s;\n\n/** A seat number from a button's value. */\nconst seatOf = (value: string | undefined): number | undefined => {\n if (value === undefined || !/^\\d{1,2}$/.test(value)) return undefined;\n return Number(value);\n};\n\n/** True while this round plays in a server room. */\nconst inRoom = (s: LauncherState): boolean => s.plan !== null;\n\n/** The stage's room report: the lobby until the match starts, the address bar once the code is known. */\nconst roomReport = (s: LauncherState, room: RoomFrame, game: LauncherGame): Next<LauncherState, LauncherMsg> => {\n const first = s.room === null || s.room.code !== room.code;\n const commands = first ? [showRoomInUrl<LauncherMsg>(room.code)] : [];\n const next = { ...s, room };\n const offered = offerAnnouncement(s.room?.offer ?? null, room.offer, room.seat, room.seats);\n const line = room.notice !== null && room.notice !== s.room?.notice ? room.notice : offered;\n const announce = line === null ? {} : { polite: say(s.polite, line) };\n if (s.phase._tag === 'Loading') {\n return settle({ ...next, ...announce, phase: { _tag: 'Lobby' } }, game, [...commands, focus('#lobby-title')]);\n }\n return settle({ ...next, ...announce }, game, commands);\n};\n\n/** After loading (and the AI-content notice): resume a save, or begin at once. */\nconst proceed = (s: LauncherState, game: LauncherGame, save: SaveSummary | null): Next<LauncherState, LauncherMsg> =>\n save === null\n ? beginPlay(s, game, 'new')\n : settle({ ...s, phase: { _tag: 'Resume', save } }, game, [focus('.resume .primary')]);\n\nconst fromStage = (s: LauncherState, out: StageOutput, game: LauncherGame): Next<LauncherState, LauncherMsg> => {\n switch (out._tag) {\n case 'Prepared': {\n if (s.phase._tag !== 'Loading') return { ...s, preferences: out.preferences };\n const prepared = { ...s, preferences: out.preferences };\n return needsAiNotice(game, out.preferences)\n ? settle({ ...prepared, phase: { _tag: 'AiNotice', save: out.save } }, game, [focus('.ai-notice .primary')])\n : proceed(prepared, game, out.save);\n }\n case 'Preferences':\n // Another tab changed them; the stage has already passed them to the game.\n return s.preferences === null ? s : { ...s, preferences: out.preferences };\n case 'Rematch':\n return { ...s, rematch: out.config };\n case 'Daily': {\n const { daily } = out;\n if (s.phase._tag === 'Results') return { ...s, daily };\n // Today's puzzle was finished earlier: its results show without a game.\n if (daily.earlier === null || (s.phase._tag !== 'Playing' && s.phase._tag !== 'Loading')) return s;\n const result: ResultView = {\n result: daily.earlier.result,\n headline: \"You've played today's puzzle\",\n summary: daily.earlier.summary,\n elapsedMs: null,\n assisted: null,\n };\n return settle(\n {\n ...s,\n daily,\n phase: { _tag: 'Results', result, shown: true },\n polite: say(s.polite, `${result.headline}. ${daily.next}.`),\n },\n game,\n [focus('#results-title')],\n );\n }\n case 'Puzzle':\n return { ...s, puzzle: out.puzzleId };\n case 'Room':\n return inRoom(s) ? roomReport(s, out.room, game) : s;\n case 'Frame': {\n const { frame } = out;\n // In a room the game mounts when the match starts, and again at a rematch.\n const starts =\n inRoom(s) &&\n frame.outcome === null &&\n (s.phase._tag === 'Lobby' || s.phase._tag === 'Loading' || s.phase._tag === 'Results');\n if (starts) return settle({ ...s, phase: { _tag: 'Playing', frame, menu: false } }, game, [focus(STAGE)]);\n const looking = inRoom(s) && frame.outcome !== null && (s.phase._tag === 'Lobby' || s.phase._tag === 'Loading');\n if (s.phase._tag !== 'Playing' && !looking) return s;\n if (frame.outcome !== null) {\n const result = resultView(\n frame.outcome,\n frame.seats,\n toStageMode(s.setup.mode ?? 'solo') ?? 'solo',\n s.room?.seat ?? null,\n );\n return settle(\n {\n ...s,\n phase: { _tag: 'Results', result, shown: true },\n assertive: say(s.assertive, `${result.headline} ${result.summary}`),\n },\n game,\n [focus('#results-title')],\n );\n }\n if (s.phase._tag !== 'Playing') return s;\n const before = s.phase.frame?.handoff ?? null;\n const handedOff = frame.handoff !== null && (before === null || before.seat !== frame.handoff.seat);\n return settle(\n { ...s, phase: { ...s.phase, frame, menu: s.phase.menu && frame.handoff === null } },\n game,\n handedOff ? [focus('.reveal')] : [],\n );\n }\n case 'ExitRequested':\n return s.phase._tag === 'Playing' || s.phase._tag === 'Results' || s.phase._tag === 'Lobby'\n ? toSetup(s, game)\n : s;\n case 'Announce':\n return out.politeness === 'assertive'\n ? { ...s, assertive: say(s.assertive, out.message) }\n : { ...s, polite: say(s.polite, out.message) };\n case 'Notice':\n return { ...s, notice: out.message, polite: say(s.polite, out.message) };\n case 'Failed':\n return s.phase._tag === 'Setup'\n ? s\n : settle({ ...s, phase: { _tag: 'Failed', message: out.message } }, game, [focus('.failed h3')]);\n }\n};\n\n// --- The view -----------------------------------------------------------------------------------\n\n// --- Rooms: the join form, the lobby and its seats ----------------------------------------------\n\nconst joinView = (s: LauncherState) => html`<form class=\"join\" aria-labelledby=\"join-title\" data-intent=${i.JoinRoom}>\n <h3 id=\"join-title\">Join a friend's room</h3>\n <p class=\"field\">\n <label for=\"room-code\">Room code or invite link</label>\n <input\n id=\"room-code\"\n name=\"code\"\n value=${s.setup.code}\n autocomplete=\"off\"\n autocapitalize=\"characters\"\n spellcheck=\"false\"\n maxlength=\"200\"\n aria-invalid=${s.setup.codeError === null ? null : 'true'}\n aria-describedby=${s.setup.codeError === null ? 'room-code-hint' : 'room-code-hint room-code-error'}\n data-intent=${i.TypeCode}\n />\n <small id=\"room-code-hint\" class=\"note\">Six letters and digits, such as K7M 2QX.</small>\n </p>\n ${s.setup.codeError === null ? nothing : html`<p class=\"error\" id=\"room-code-error\">${s.setup.codeError}</p>`}\n <p class=\"check\">\n <input type=\"checkbox\" id=\"room-watch\" name=\"watch\" ?checked=${s.setup.watch} data-intent=${i.ToggleWatch} />\n <label for=\"room-watch\">Just watch</label>\n </p>\n <div class=\"actions\"><button type=\"submit\" class=\"join-room\" ?disabled=${!s.live}>Join room</button></div>\n</form>`;\n\ntype SeatPick = {\n readonly me: number | null;\n readonly host: number | null;\n readonly hosting: boolean;\n readonly lobby: boolean;\n};\n\nconst seatTags = (seat: RoomSeat, pick: SeatPick): string => {\n const tags: string[] = [];\n if (seat.id === pick.me) tags.push('you');\n if (seat.id === pick.host) tags.push('host');\n if (seat.controller === 'ai')\n tags.push(\n seat.claimed ? 'the computer plays for now' : `the computer${seat.aiLevel === null ? '' : `, ${seat.aiLevel}`}`,\n );\n else if (seat.claimed) {\n if (!seat.connected) tags.push('away');\n else if (pick.lobby) tags.push(seat.ready ? 'ready' : 'not ready');\n }\n return tags.join(' · ');\n};\n\nconst SeatRow = (seat: RoomSeat, pick: SeatPick) => {\n const open = !seat.claimed && seat.controller === 'human';\n const label = open ? 'Open seat' : seat.controller === 'ai' && !seat.claimed ? 'Computer' : seat.name;\n const removable = pick.hosting && pick.lobby && seat.id !== pick.me && !open;\n return html`<li class=\"seat\" data-open=${open ? 'yes' : 'no'} data-ready=${seat.ready ? 'yes' : 'no'}>\n <span class=\"seat-name\">${label}</span>\n <small class=\"seat-tags\">${seatTags(seat, pick)}</small>\n ${\n pick.hosting && pick.lobby && open\n ? html`<button type=\"button\" class=\"small\" value=${seat.id} data-intent=${i.FillSeat}>\n Add the computer<span class=\"visually-hidden\"> to seat ${seat.id + 1}</span>\n </button>`\n : nothing\n }\n ${\n removable\n ? html`<button type=\"button\" class=\"small\" value=${seat.id} data-intent=${i.RemoveSeat}>\n Remove<span class=\"visually-hidden\"> ${label} from seat ${seat.id + 1}</span>\n </button>`\n : nothing\n }\n </li>`;\n};\n\nconst ClockRow = (o: ClockOption, picked: boolean) =>\n html`<option value=${o.value} ?selected=${picked}>${o.label}</option>`;\n\nconst connectionLine = (room: RoomFrame): string | null => {\n if (room.connection === 'connecting') return 'Connecting to the room…';\n if (room.connection === 'reconnecting') return 'Connection lost. Reconnecting…';\n return null;\n};\n\nconst lobbyView = (s: LauncherState, game: LauncherGame) => {\n const room = s.room;\n if (room === null) return nothing;\n const me = room.seat === null ? undefined : room.seats.find((seat) => seat.id === room.seat);\n const hosting = room.seat !== null && room.seat === room.host;\n const lobby = room.phase === 'lobby';\n const problem = startProblem(room);\n const pick: SeatPick = { me: room.seat, host: room.host, hosting, lobby };\n const status = connectionLine(room) ?? room.notice ?? '';\n const closed = room.connection === 'closed';\n return html`<section class=\"lobby panel\" aria-labelledby=\"lobby-title\">\n <h3 id=\"lobby-title\" tabindex=\"-1\">${game.name} room <span class=\"code\">${spacedCode(room.code)}</span></h3>\n <p class=\"room-status\" role=\"status\">${status}</p>\n ${\n closed\n ? html`<div class=\"actions\">\n ${room.noticeCode === 'replaced' ? html`<button type=\"button\" class=\"primary\" value=\"reconnect\" data-intent=${i.RoomAction}>Use this tab instead</button>` : nothing}\n <button type=\"button\" value=\"leave\" data-intent=${i.RoomAction}>Back</button>\n </div>`\n : html`<div class=\"invite\">\n <p class=\"field\">\n <label for=\"invite-link\">Invite link</label>\n <input id=\"invite-link\" class=\"invite-link\" readonly value=${room.link} />\n </p>\n <div class=\"actions\">\n <button type=\"button\" value=\"link\" data-intent=${i.Copy}>Copy link</button>\n <button type=\"button\" value=\"code\" data-intent=${i.Copy}>Copy code</button>\n </div>\n <p class=\"note\">Send the link to a friend, or read them the code. Anyone with it can join or watch.</p>\n </div>\n <h4 id=\"seats-title\">Players</h4>\n <ol class=\"seats\" aria-labelledby=\"seats-title\">\n ${each(\n room.seats,\n (seat) => seat.id,\n SeatRow,\n () => pick,\n )}\n </ol>\n <p class=\"note\">${room.spectators === 0 ? 'Nobody is watching.' : room.spectators === 1 ? '1 person is watching.' : `${String(room.spectators)} people are watching.`}</p>\n ${\n room.clockOptions.length === 0\n ? nothing\n : hosting && lobby\n ? html`<p class=\"field\">\n <label for=\"room-clock\">Turn clock</label>\n <select id=\"room-clock\" name=\"clock\" data-intent=${i.PickClock}>\n ${each(\n room.clockOptions,\n (o) => o.value,\n ClockRow,\n (o) => o.value === clockValue(room.clock),\n )}\n </select>\n </p>`\n : html`<p class=\"clock-setting\">Turn clock: ${clockLabel(room.clock)}</p>`\n }\n ${\n hosting && lobby && room.aiLevels.length > 1\n ? html`<p class=\"field\">\n <label for=\"room-ai-level\">Computer level</label>\n <select id=\"room-ai-level\" name=\"aiLevel\" data-intent=${i.PickRoomLevel}>\n ${each(\n room.aiLevels,\n (l) => l,\n LevelOption,\n (l) => l === (room.aiLevel ?? room.aiLevels[0]),\n )}\n </select>\n </p>`\n : nothing\n }\n <div class=\"actions\">\n ${\n me === undefined || !lobby\n ? html`<p class=\"note\">${room.seat === null ? 'You are watching. The match starts when the host starts it.' : ''}</p>`\n : html`<button type=\"button\" class=\"ready\" aria-pressed=${me.ready ? 'true' : 'false'} value=${me.ready ? 'no' : 'yes'} data-intent=${i.ToggleReady}>\n Ready\n </button>`\n }\n ${\n hosting && lobby\n ? html`<button type=\"button\" class=\"primary start-match\" aria-describedby=\"start-hint\" ?disabled=${problem !== null} data-intent=${i.StartMatch}>\n Start the match\n </button>`\n : nothing\n }\n <button type=\"button\" class=\"leave\" value=\"leave\" data-intent=${i.RoomAction}>Leave room</button>\n </div>\n ${hosting && lobby ? html`<p class=\"hint\" id=\"start-hint\">${problem ?? 'Everyone is ready.'}</p>` : nothing}\n ${!hosting && lobby && me !== undefined ? html`<p class=\"hint\">The host starts the match once everyone is ready.</p>` : nothing}`\n }\n </section>`;\n};\n\nconst ModeRow = (o: ModeOption, picked: boolean) => html`<label class=\"mode\" data-playable=${o.playable ? 'yes' : 'no'}>\n <input type=\"radio\" name=\"mode\" value=${o.mode} ?checked=${picked} ?disabled=${!o.playable} data-intent=${i.PickMode} />\n <span>${o.label}</span>\n ${o.note === null ? nothing : html`<small class=\"soon\">${o.note}</small>`}\n</label>`;\n\nconst LevelOption = (level: string, picked: boolean) =>\n html`<option value=${level} ?selected=${picked}>${level}</option>`;\n\nconst CountOption = (count: number, picked: boolean) =>\n html`<option value=${count} ?selected=${picked}>${count}</option>`;\n\ntype NameField = { readonly seat: number; readonly name: string; readonly error: string | null };\n\nconst NameRow = (f: NameField) => html`<div class=\"name\">\n <label for=\"name-${f.seat}\">Player ${f.seat + 1}</label>\n <input\n id=\"name-${f.seat}\"\n name=\"seat-${f.seat}\"\n value=${f.name}\n placeholder=\"Player ${f.seat + 1}\"\n maxlength=\"20\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-invalid=${f.error === null ? null : 'true'}\n aria-describedby=${f.error === null ? null : `name-${f.seat}-error`}\n data-intent=${i.Rename}\n />\n ${f.error === null ? nothing : html`<p class=\"error\" id=\"name-${f.seat}-error\">${f.error}</p>`}\n</div>`;\n\nconst setupHint = (s: LauncherState, game: LauncherGame, options: readonly ModeOption[]): string => {\n if (!s.live) return 'JavaScript is needed to play.';\n if (game.status !== 'available') return 'Coming soon: not playable yet.';\n if (!options.some((o) => o.playable)) return 'This game is coming soon.';\n return '';\n};\n\nconst GameChoice = (choice: { readonly value: string | number; readonly label: string }, selected: OptionValue) =>\n html`<option value=${String(choice.value)} ?selected=${choice.value === selected}>${choice.label}</option>`;\nconst GameOptionRow = (option: GameOption, value: OptionValue) => html`<p class=\"field\">\n ${\n option.kind === 'toggle'\n ? html`<label><input type=\"checkbox\" name=${option.key} value=\"toggle\" ?checked=${value === true} data-intent=${i.PickGameOption}> ${option.label}</label>`\n : html`<label>${option.label}<select name=${option.key} data-intent=${i.PickGameOption}>${each(\n option.choices,\n (c) => String(c.value),\n GameChoice,\n () => value,\n )}</select></label>`\n }\n ${option.help === undefined ? nothing : html`<small>${option.help}</small>`}\n</p>`;\n\nconst setupView = (s: LauncherState, game: LauncherGame) => {\n const options = optionsOf(s, game);\n const { mode } = s.setup;\n const counts = playerCounts(game, mode);\n const playable = options.some((o) => o.mode === mode && o.playable);\n const names: NameField[] = [];\n if (mode === 'pass-and-play') {\n for (let seat = 0; seat < s.setup.players; seat += 1)\n names.push({ seat, name: s.setup.names[seat] ?? '', error: s.setup.errors[seat] ?? null });\n }\n return html`<form class=\"setup\" aria-label=\"Start ${game.name}\" data-intent=${i.Start}>\n ${s.notice === null ? nothing : html`<p class=\"notice\">${s.notice}</p>`}\n <fieldset class=\"modes\">\n <legend>Choose how to play</legend>\n <div class=\"mode-list\">${each(\n options,\n (o) => o.mode,\n ModeRow,\n (o) => o.mode === mode,\n )}</div>\n </fieldset>\n ${\n (mode === 'ai' || computerSeatsFor(game, s.setup) > 0) && game.aiLevels.length > 1\n ? html`<p class=\"field\">\n <label for=\"ai-level\">Computer level</label>\n <select id=\"ai-level\" name=\"aiLevel\" data-intent=${i.PickLevel}>\n ${each(\n game.aiLevels,\n (l) => l,\n LevelOption,\n (l) => l === s.setup.aiLevel,\n )}\n </select>\n </p>`\n : nothing\n }\n ${\n counts.length > 1\n ? html`<p class=\"field\">\n <label for=\"players\">Players</label>\n <select id=\"players\" name=\"players\" data-intent=${i.PickPlayers}>\n ${each(\n counts,\n (n) => n,\n CountOption,\n (n) => n === s.setup.players,\n )}\n </select>\n </p>`\n : nothing\n }\n ${\n mode === 'pass-and-play'\n ? html`<fieldset class=\"names\">\n <legend>Player names</legend>\n ${each(names, (f) => f.seat, NameRow)}\n ${\n computerSeatsFor(game, s.setup) > 0\n ? html`<p class=\"note\">The computer plays the other ${computerSeatsFor(game, s.setup) === 1 ? 'seat' : `${String(computerSeatsFor(game, s.setup))} seats`}.</p>`\n : nothing\n }\n </fieldset>`\n : nothing\n }\n ${mode === 'server' ? html`<p class=\"note\">Open a room and invite friends with a link, or join a friend's room below.</p>` : nothing}\n ${\n optionsForMode(game.options ?? [], mode ?? 'solo').length === 0\n ? nothing\n : html`<fieldset class=\"game-options\"><legend>Game options</legend>${each(\n optionsForMode(game.options ?? [], mode ?? 'solo'),\n (o) => o.key,\n GameOptionRow,\n (o) => s.setup.options?.[o.key] ?? o.default,\n )}</fieldset>`\n }\n <div class=\"actions\">\n ${\n mode === 'server'\n ? html`<button type=\"submit\" class=\"start primary\" ?disabled=${!s.live || !playable}>Create a room</button>`\n : html`<button type=\"submit\" class=\"start primary\" aria-label=\"Start ${game.name}\" ?disabled=${!s.live || !playable}>Start</button>`\n }\n <p class=\"hint\">${setupHint(s, game, options)}</p>\n </div>\n ${game.aiContent === true ? html`<p class=\"note\">This game uses AI-made content. You'll see a short notice before it starts.</p>` : nothing}\n </form>\n ${mode === 'server' && playable ? joinView(s) : nothing}`;\n};\n\nconst resumeView = (save: SaveSummary) => {\n const players = save.players.filter((p) => p !== '');\n return html`<section class=\"resume panel\" aria-labelledby=\"resume-title\">\n <h3 id=\"resume-title\">Continue your saved game?</h3>\n ${save.choices === undefined ? nothing : html`<label>Saved game<select aria-label=\"Saved game\" data-intent=${i.ChooseSave}>${save.choices.map((choice) => html`<option value=${choice.slot} ?selected=${choice.slot === save.slot}>${choice.label}</option>`)}</select></label>`}\n <p>\n ${players.length > 1 ? `${players.join(' and ')}: ` : ''}<time datetime=${isoDuration(save.elapsedMs)}>${formatElapsed(save.elapsedMs)}</time> played so far.\n </p>\n <div class=\"actions\">\n <button type=\"button\" class=\"primary\" data-intent=${i.Resume}>Resume</button>\n <button type=\"button\" data-intent=${i.NewGame}>Start a new game</button>\n <button type=\"button\" data-intent=${i.Exit}>Back</button>\n </div>\n </section>`;\n};\n\nconst aiNoticeView = () => html`<section class=\"ai-notice panel\" aria-labelledby=\"ai-notice-title\">\n <h3 id=\"ai-notice-title\">${AI_NOTICE.title}</h3>\n <p>${AI_NOTICE.body}</p>\n <p>${AI_NOTICE.scope}</p>\n <div class=\"actions\">\n <button type=\"button\" class=\"primary\" data-intent=${i.AcceptAiNotice}>Accept and play</button>\n <button type=\"button\" data-intent=${i.Exit}>Not now</button>\n </div>\n</section>`;\n\nconst handoffView = (handoff: {\n readonly name: string;\n}) => html`<section class=\"handoff panel\" aria-labelledby=\"handoff-title\">\n <h3 id=\"handoff-title\">Pass to ${handoff.name}, then tap to reveal</h3>\n <p>Only ${handoff.name} should look at the screen.</p>\n <button type=\"button\" class=\"reveal primary\" data-intent=${i.Reveal}>Tap to reveal</button>\n</section>`;\n\n/**\n * The results, as a non-modal dialog over the finished game's canvas: modal would make the\n * page inert, and the results are where the page may offer an update (a safe point). It stays\n * in the document while closed, so reopening it keeps the ad slot as it was.\n */\n/** The buttons that answer an open offer, for a player who hasn't answered it yet. */\nconst answerButtons = (offer: RoomOfferFrame, me: number | null, what: string) => {\n if (me === null || offer.status !== 'open') return nothing;\n if (offer.by === me)\n return html`<button type=\"button\" value=\"withdraw\" data-intent=${i.AnswerOffer}>Withdraw the offer</button>`;\n if (offer.accepted.includes(me)) return nothing;\n return html`<button type=\"button\" class=\"primary\" value=\"accept\" data-intent=${i.AnswerOffer}>Accept<span class=\"visually-hidden\"> ${what}</span></button>\n <button type=\"button\" value=\"decline\" data-intent=${i.AnswerOffer}>Decline<span class=\"visually-hidden\"> ${what}</span></button>`;\n};\n\n/** The results' actions: a local game plays again; in a room any player offers a rematch, which starts when everyone accepts (D-61). */\nconst resultActions = (s: LauncherState, game: LauncherGame) => {\n if (s.setup.mode === 'daily') {\n return html`<div class=\"actions\">\n ${\n s.daily === null || s.daily.share === ''\n ? nothing\n : html`<button type=\"button\" class=\"primary share\" value=\"symbols\" data-intent=${i.Share}>Share</button>\n <button type=\"button\" value=\"words\" data-intent=${i.Share}>Copy as text</button>`\n }\n ${game.modes.length > 1 ? html`<button type=\"button\" data-intent=${i.ChangeMode}>Change mode</button>` : nothing}\n <a class=\"back\" href=\"/\">Back to all games</a>\n </div>`;\n }\n if (!inRoom(s)) {\n return html`<div class=\"actions\">\n <button type=\"button\" class=\"primary\" data-intent=${i.PlayAgain}>Play again</button>\n <button type=\"button\" data-intent=${i.ChangeMode}>Change mode</button>\n <a class=\"back\" href=\"/\">Back to all games</a>\n </div>`;\n }\n const room = s.room;\n const me = room?.seat ?? null;\n const seated = room !== null && me !== null && room.connection === 'online';\n const offer = room?.offer?.kind === 'rematch' ? room.offer : null;\n const open = offer?.status === 'open' ? offer : null;\n const note =\n offer !== null\n ? offerText(offer, me)\n : me === null\n ? 'The players may start a rematch; stay to watch it.'\n : 'Any player can offer a rematch. It starts when everyone accepts.';\n return html`<div class=\"actions\">\n ${seated && open === null ? html`<button type=\"button\" class=\"primary offer-rematch\" data-intent=${i.PlayAgain}>Offer a rematch</button>` : nothing}\n ${seated && open !== null ? answerButtons(open, me, 'the rematch') : nothing}\n <button type=\"button\" data-intent=${i.ChangeMode}>Leave room</button>\n <a class=\"back\" href=\"/\">Back to all games</a>\n </div>\n <p class=\"note offer-state\">${note}</p>`;\n};\n\n/** The daily part of the results: streaks, the next release and the share text it would send. */\nconst dailyView = (d: DailyFrame) => html`<dl class=\"facts daily-facts\">\n <div>\n <dt>Streak</dt>\n <dd>${d.streak} ${d.streak === 1 ? 'day' : 'days'} (best ${d.bestStreak})</dd>\n </div>\n ${\n d.winStreak === null\n ? nothing\n : html`<div>\n <dt>Wins in a row</dt>\n <dd>${d.winStreak} (best ${d.bestWinStreak ?? d.winStreak})</dd>\n </div>`\n }\n </dl>\n ${\n d.statistics === undefined\n ? nothing\n : html`<section class=\"word-statistics\" aria-labelledby=\"word-statistics-title\">\n <h4 id=\"word-statistics-title\">Daily Word statistics</h4>\n <dl class=\"facts\"><div><dt>Played</dt><dd>${d.statistics.played}</dd></div><div><dt>Won</dt><dd>${d.statistics.won}</dd></div><div><dt>Win rate</dt><dd>${d.statistics.winPercent}%</dd></div></dl>\n <table><caption>Wins by guess count</caption><tbody>${d.statistics.distribution.map((count, index) => html`<tr><th scope=\"row\">${index + 1} ${index === 0 ? 'guess' : 'guesses'}</th><td><meter min=\"0\" max=${Math.max(1, d.statistics!.won)} value=${count} aria-label=\"Wins in ${index + 1} guesses\">${count}</meter></td><td>${count}</td></tr>`)}</tbody></table>\n </section>`\n }\n <p class=\"next\">${d.next}</p>\n ${\n d.share === ''\n ? nothing\n : html`<figure class=\"share-preview\">\n <figcaption>What Share sends</figcaption>\n <pre aria-hidden=\"true\">${d.share}</pre>\n <p class=\"visually-hidden\">${d.shareWords}</p>\n </figure>`\n }`;\n\nconst resultsView = (s: LauncherState, r: ResultView, shown: boolean, game: LauncherGame) => html`<dialog\n id=\"results\"\n class=\"results\"\n aria-labelledby=\"results-title\"\n data-result=${r.result}\n ?open=${shown}\n data-intent=${i.HideResults}\n data-intent-on=\"keydown\"\n>\n <div class=\"results-body\">\n <p class=\"kicker\">Game over</p>\n <h3 id=\"results-title\" tabindex=\"-1\">${r.headline}</h3>\n <p class=\"summary\">${r.summary}</p>\n <dl class=\"facts\">\n ${\n r.elapsedMs === null\n ? nothing\n : html`<div>\n <dt>Time</dt>\n <dd><time datetime=${isoDuration(r.elapsedMs)}>${formatElapsed(r.elapsedMs)}</time></dd>\n </div>`\n }\n ${\n r.assisted === null\n ? nothing\n : html`<div class=\"assisted\">\n <dt>Help</dt>\n <dd>${r.assisted}</dd>\n </div>`\n }\n </dl>\n ${s.daily === null ? nothing : dailyView(s.daily)} ${resultActions(s, game)} ${reportView(s, game)}\n ${\n s.daily?.earlier != null\n ? nothing\n : html`<p class=\"review\">\n <button type=\"button\" class=\"review-board\" aria-keyshortcuts=\"Escape\" data-intent=${i.HideResults}>Review the board</button>\n </p>`\n }\n </div>\n <ad-slot class=\"results-ad\" slot-id=\"results\" page=\"results\" game-id=${game.id}></ad-slot>\n</dialog>`;\n\nconst failedView = (message: string) => html`<section class=\"failed panel\" role=\"alert\" aria-labelledby=\"failed-title\">\n <h3 id=\"failed-title\" tabindex=\"-1\">The game couldn't start</h3>\n <p>${message}</p>\n <div class=\"actions\"><button type=\"button\" class=\"primary\" data-intent=${i.ChangeMode}>Back</button></div>\n</section>`;\n\nconst ReducedMotionOption = (o: { readonly value: string; readonly label: string }, picked: boolean) =>\n html`<option value=${o.value} ?selected=${picked}>${o.label}</option>`;\n\nconst MOTION_OPTIONS = [\n { value: 'system', label: 'Follow my device' },\n { value: 'reduce', label: 'Reduce motion' },\n { value: 'no-preference', label: 'Full motion' },\n] as const;\n\nconst THEME_OPTIONS = [\n { value: 'system', label: 'Follow my device' },\n { value: 'light', label: 'Light' },\n { value: 'dark', label: 'Dark' },\n] as const;\n\nconst preferencesView = (p: StoredPreferences) => html`<fieldset class=\"prefs\">\n <legend>Preferences</legend>\n <p class=\"field\">\n <label for=\"pref-motion\">Motion</label>\n <select id=\"pref-motion\" name=\"reducedMotion\" data-intent=${i.SetPreference}>\n ${each(\n MOTION_OPTIONS,\n (o) => o.value,\n ReducedMotionOption,\n (o) => o.value === p.reducedMotion,\n )}\n </select>\n </p>\n <p class=\"field\">\n <label for=\"pref-theme\">Game colors</label>\n <select id=\"pref-theme\" name=\"theme\" data-intent=${i.SetPreference}>\n ${each(\n THEME_OPTIONS,\n (o) => o.value,\n ReducedMotionOption,\n (o) => o.value === p.theme,\n )}\n </select>\n </p>\n <p class=\"check\">\n <input type=\"checkbox\" id=\"pref-sound\" name=\"sound\" ?checked=${p.sound} data-intent=${i.SetPreference} />\n <label for=\"pref-sound\">Sound</label>\n </p>\n <p class=\"field\">\n <label for=\"pref-volume\">Volume</label>\n <input type=\"range\" id=\"pref-volume\" name=\"volume\" min=\"0\" max=\"100\" step=\"5\" value=${Math.round(p.volume * 100)} data-intent=${i.SetPreference} />\n </p>\n <p class=\"check\">\n <input\n type=\"checkbox\"\n id=\"pref-keys\"\n name=\"singleKeyShortcuts\"\n aria-describedby=\"pref-keys-note\"\n ?checked=${p.singleKeyShortcuts}\n data-intent=${i.SetPreference}\n />\n <label for=\"pref-keys\">Single-key shortcuts</label>\n </p>\n <p class=\"note\" id=\"pref-keys-note\">Turn these off if you use speech input or a switch.</p>\n <p class=\"check\">\n <input\n type=\"checkbox\"\n id=\"pref-ai\"\n name=\"aiContentAccepted\"\n aria-describedby=\"pref-ai-note\"\n ?checked=${p.aiContentAccepted === true}\n data-intent=${i.SetPreference}\n />\n <label for=\"pref-ai\">Allow games with AI-made content</label>\n </p>\n <p class=\"note\" id=\"pref-ai-note\">Turned off, those games ask again before they start.</p>\n</fieldset>`;\n\n/** The puzzle a report names: the one the stage reported, else the daily result's date. */\nconst puzzleOf = (s: LauncherState, game: LauncherGame): string =>\n s.puzzle ?? (s.daily === null ? '' : `${game.id}:${s.daily.date}`);\n\n/**\n * \"Report a problem\" for a game with AI-made content (D-52), in the frame: the results and the\n * menu, never the canvas (D-07).\n */\nconst reportView = (s: LauncherState, game: LauncherGame) =>\n game.aiContent === true\n ? html`<jy-report-problem class=\"report\" game-id=${game.id} puzzle-id=${puzzleOf(s, game)}></jy-report-problem>`\n : nothing;\n\nconst overlayView = (\n open: boolean,\n preferences: StoredPreferences | null,\n game: LauncherGame,\n room: boolean,\n canEnd: boolean,\n report: ReturnType<typeof reportView>,\n) => html`<dialog\n class=\"overlay\"\n aria-labelledby=\"menu-title\"\n ?modal=${open}\n data-intent=${i.MenuClosed}\n data-intent-on=\"close\"\n>\n <h3 id=\"menu-title\">${room ? 'Menu' : 'Paused'}</h3>\n <p class=\"note\">${room ? 'The match goes on while this menu is open.' : `${game.name} waits while this menu is open.`}</p>\n <div class=\"actions\">\n <button type=\"button\" class=\"primary\" autofocus data-intent=${i.CloseMenu}>${room ? 'Back to the game' : 'Resume'}</button>\n ${canEnd ? html`<button type=\"button\" class=\"end-match\" aria-describedby=\"end-match-note\" data-intent=${i.OfferEnd}>Ask to end the match</button>` : nothing}\n <button type=\"button\" class=\"exit\" data-intent=${i.Exit}>${room ? 'Leave room' : 'Save and exit'}</button>\n </div>\n ${canEnd ? html`<p class=\"note\" id=\"end-match-note\">It ends with no result if the others agree, or if nobody declines within a minute.</p>` : nothing}\n ${report} ${preferences === null ? nothing : preferencesView(preferences)}\n</dialog>`;\n\nconst StageRow = (_round: number, pick: readonly [StageControl, boolean, string, boolean]) =>\n html`<jy-game-stage\n class=\"stage\"\n role=\"region\"\n tabindex=\"-1\"\n aria-label=${pick[2]}\n ?hidden=${pick[1]}\n ?inert=${pick[3]}\n .control=${pick[0]}\n data-intent=${i.StageOut}\n ></jy-game-stage>`;\n\nconst stageControl = (s: LauncherState, game: LauncherGame): StageControl => ({\n gameId: game.id,\n mode: toStageMode(s.setup.mode ?? 'solo') ?? 'solo',\n seats: s.seats,\n begin: s.begin,\n // A room never pauses: the match goes on while the menu is open.\n paused: s.phase._tag === 'Playing' && s.phase.menu && !inRoom(s),\n reveals: s.reveals,\n preferences: s.preferences,\n config: s.config,\n setup: Object.fromEntries(\n optionsForMode(game.options ?? [], s.setup.mode ?? 'solo')\n .map((o) => [o.key, s.setup.options?.[o.key] ?? o.default])\n .concat(\n s.setup.mode === 'ai' && game.players.max === 1\n ? [['level', s.setup.aiLevel ?? game.aiLevels[0] ?? 'medium']]\n : [],\n ),\n ),\n room: s.plan,\n ...(s.resumeSlot === null ? {} : { resumeSlot: s.resumeSlot }),\n});\n\n/** The bar's button: the overlay during play; after it, a way back to closed results. */\nconst barButton = (phase: Phase, handoff: boolean) => {\n if (phase._tag === 'Playing') {\n return html`<button type=\"button\" class=\"menu-button\" aria-haspopup=\"dialog\" ?disabled=${handoff} data-intent=${i.OpenMenu}>Menu</button>`;\n }\n if (phase._tag !== 'Results') return nothing;\n // Held in place while the results show, so the bar keeps its size.\n return html`<button\n type=\"button\"\n class=\"menu-button show-results\"\n aria-controls=\"results\"\n data-held=${phase.shown ? 'yes' : 'no'}\n data-intent=${i.ShowResults}\n >\n Show results\n </button>`;\n};\n\n/** The bar's clock while a room's decision clock runs: whose it is and what is left. */\nconst timerView = (room: RoomFrame | null) => {\n const timer = room?.timer ?? null;\n if (timer === null) return nothing;\n const mine = timer.seat === room?.seat;\n return html`<p class=\"timer\" role=\"timer\" data-low=${timer.seconds <= 10 && !timer.paused ? 'yes' : 'no'} data-paused=${timer.paused ? 'yes' : 'no'}>\n ${mine ? 'Your time' : `${timer.name}'s time`}: <time datetime=${isoDuration(timer.seconds * 1000)}>${formatElapsed(timer.seconds * 1000)}</time>${\n timer.paused ? ' (paused: nobody is at the table)' : ''\n }\n </p>`;\n};\n\n/** The bar's line for an offer to end the match: its state, and the viewer's answer buttons. */\nconst offerBar = (room: RoomFrame | null) => {\n const offer = room?.offer ?? null;\n if (room === null || offer?.kind !== 'end') return nothing;\n return html`<div class=\"offer\" role=\"group\" aria-label=\"Offer to end the match\">\n <p class=\"offer-text\">${offerText(offer, room.seat)}</p>\n ${room.connection === 'online' ? answerButtons(offer, room.seat, 'ending the match') : nothing}\n </div>`;\n};\n\n/** A seated player may ask to end a match in progress when no such offer is open. */\nconst canOfferEnd = (room: RoomFrame | null): boolean =>\n room !== null &&\n room.seat !== null &&\n room.phase === 'playing' &&\n room.connection === 'online' &&\n room.offer?.status !== 'open';\n\n/** The bar's status line: loading, a room's connection, or the latest notice. */\nconst statusLine = (s: LauncherState, game: LauncherGame, notice: string | null): string => {\n if (s.phase._tag === 'Loading')\n return s.plan === null\n ? `Loading ${game.name}…`\n : s.plan.action === 'create'\n ? 'Opening a room…'\n : 'Joining the room…';\n // The lobby has a status line of its own.\n if (s.phase._tag === 'Lobby') return '';\n const connection = s.room === null ? null : connectionLine(s.room);\n return connection ?? notice ?? '';\n};\n\nconst playView = (s: LauncherState, game: LauncherGame) => {\n const { phase } = s;\n const results = phase._tag === 'Results' ? phase : null;\n const staged =\n phase._tag === 'Loading' ||\n phase._tag === 'AiNotice' ||\n phase._tag === 'Resume' ||\n phase._tag === 'Lobby' ||\n phase._tag === 'Playing' ||\n results !== null;\n const frame = phase._tag === 'Playing' ? phase.frame : null;\n const handoff = frame?.handoff ?? null;\n // The canvas shows during play (not behind a hand-off) and, with the final board, after it.\n const hidden = (phase._tag !== 'Playing' && results === null) || handoff !== null;\n const inert = results?.shown ?? false;\n const control = stageControl(s, game);\n const label = `${game.name}: game`;\n const notice = frame?.notice ?? s.room?.notice ?? s.notice;\n const replaced = s.room?.connection === 'closed' && s.room.noticeCode === 'replaced' && phase._tag !== 'Lobby';\n return html`<div class=\"play\">\n <div class=\"bar\">\n <p class=\"mode-label\">${game.name} · ${MODE_LABELS[s.setup.mode ?? 'solo']}${s.room === null ? '' : ` · ${spacedCode(s.room.code)}`}</p>\n <p class=\"status\" role=\"status\">${statusLine(s, game, notice)}</p>\n ${phase._tag === 'Lobby' ? nothing : timerView(s.room)}\n ${replaced ? html`<button type=\"button\" value=\"reconnect\" data-intent=${i.RoomAction}>Use this tab instead</button>` : nothing}\n ${barButton(phase, handoff !== null)}\n ${phase._tag === 'Playing' ? offerBar(s.room) : nothing}\n </div>\n ${phase._tag === 'AiNotice' ? aiNoticeView() : nothing} ${phase._tag === 'Resume' ? resumeView(phase.save) : nothing}\n ${phase._tag === 'Lobby' ? lobbyView(s, game) : nothing}\n ${handoff === null ? nothing : handoffView(handoff)}\n <div class=\"arena\">\n ${staged && s.stageReady ? keyed(s.round, StageRow(s.round, [control, hidden, label, inert])) : nothing}\n ${results === null ? nothing : resultsView(s, results.result, results.shown, game)}\n </div>\n ${phase._tag === 'Playing' ? overlayView(phase.menu, s.preferences, game, inRoom(s), inRoom(s) && canOfferEnd(s.room), reportView(s, game)) : nothing}\n </div>`;\n};\n\nconst mainView = (s: LauncherState, game: LauncherGame) => {\n switch (s.phase._tag) {\n case 'Setup':\n return setupView(s, game);\n case 'Failed':\n return failedView(s.phase.message);\n case 'Loading':\n case 'AiNotice':\n case 'Resume':\n case 'Lobby':\n case 'Playing':\n case 'Results':\n return playView(s, game);\n }\n};\n\nconst styles = css`\n @layer components {\n :host {\n display: block;\n container-type: inline-size;\n --launcher-accent: var(--jy-arcade-yellow, var(--jy-accent, oklch(50% 0.2 285)));\n --launcher-ink: var(--jy-arcade-ink, oklch(20% 0.03 285));\n }\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n h3,\n p,\n dl,\n dd,\n fieldset {\n margin: 0;\n }\n .launcher {\n display: grid;\n gap: var(--jy-space-s, 1rem);\n }\n .setup,\n .panel,\n .play {\n display: grid;\n gap: var(--jy-space-s, 1rem);\n }\n fieldset {\n padding: var(--jy-space-xs, 0.75rem) var(--jy-space-s, 1rem);\n border: 2px solid color-mix(in oklch, currentColor 30%, transparent);\n border-radius: var(--jy-radius-s, 0.5rem);\n }\n legend,\n .kicker,\n .mode-label,\n .start,\n .soon {\n font-family: var(--jy-font-mono, ui-monospace, monospace);\n letter-spacing: 0.08em;\n text-transform: uppercase;\n }\n legend {\n padding-inline: 0.4em;\n font-size: var(--jy-step--1, 0.9rem);\n }\n .mode-list {\n display: flex;\n flex-wrap: wrap;\n gap: var(--jy-space-2xs, 0.5rem) var(--jy-space-s, 1rem);\n }\n .mode {\n display: inline-flex;\n align-items: center;\n gap: 0.5em;\n min-block-size: var(--jy-target-min, 2.75rem);\n cursor: pointer;\n &[data-playable='no'] {\n cursor: not-allowed;\n opacity: 0.75;\n }\n }\n .soon {\n font-size: 0.7rem;\n padding: 0.1em 0.5em;\n border: 1px solid currentColor;\n border-radius: var(--jy-radius-pill, 999px);\n }\n input[type='radio'],\n input[type='checkbox'] {\n inline-size: 1.15em;\n block-size: 1.15em;\n margin: 0;\n accent-color: var(--launcher-accent);\n }\n input[type='range'] {\n accent-color: var(--launcher-accent);\n }\n .field,\n .name {\n display: grid;\n gap: var(--jy-space-3xs, 0.25rem);\n justify-items: start;\n }\n .names {\n display: grid;\n gap: var(--jy-space-xs, 0.75rem);\n }\n .check {\n display: flex;\n align-items: center;\n gap: 0.5em;\n min-block-size: var(--jy-target-min, 2.75rem);\n }\n input:not([type]),\n select {\n min-block-size: var(--jy-target-min, 2.75rem);\n padding-inline: 0.6em;\n border: 2px solid color-mix(in oklch, currentColor 35%, transparent);\n border-radius: var(--jy-radius-s, 0.5rem);\n background: var(--jy-surface-raised, Canvas);\n color: var(--jy-text, CanvasText);\n font: inherit;\n }\n input[aria-invalid='true'] {\n border-color: var(--jy-danger, red);\n }\n .error {\n color: var(--jy-danger, red);\n font-weight: 600;\n }\n .actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--jy-space-2xs, 0.5rem) var(--jy-space-s, 1rem);\n }\n button,\n .back {\n min-block-size: var(--jy-target-min, 2.75rem);\n padding: 0.55em 1.2em;\n border: 2px solid var(--launcher-accent);\n border-radius: var(--jy-radius-s, 0.5rem);\n background: transparent;\n color: inherit;\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n touch-action: manipulation;\n transition: translate var(--jy-duration-fast, 120ms) var(--jy-ease-out, ease-out);\n }\n .back {\n display: inline-flex;\n align-items: center;\n text-decoration: none;\n }\n .primary {\n border-color: transparent;\n background: var(--launcher-accent);\n color: var(--launcher-ink);\n box-shadow: 0 0.25em 0 color-mix(in oklch, var(--launcher-accent) 55%, black);\n }\n .start {\n padding-inline: 1.6em;\n font-weight: 700;\n letter-spacing: 0.1em;\n }\n button:active:not(:disabled) {\n translate: 0 0.15em;\n }\n button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n :is(button, .back, input, select):focus-visible {\n outline: 3px solid var(--jy-focus-ring, currentColor);\n outline-offset: 3px;\n }\n .hint,\n .note {\n font-size: var(--jy-step--1, 0.9rem);\n opacity: 0.85;\n }\n .notice {\n font-weight: 600;\n }\n .bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--jy-space-2xs, 0.5rem) var(--jy-space-s, 1rem);\n }\n .mode-label {\n font-size: var(--jy-step--1, 0.9rem);\n color: var(--launcher-accent);\n }\n .status {\n flex: 1;\n min-inline-size: 0;\n min-block-size: 1lh;\n }\n .menu-button {\n margin-inline-start: auto;\n }\n /* Keeps its place in the bar while the results show, so nothing moves when they close. */\n .show-results[data-held='yes'] {\n visibility: hidden;\n }\n /* The canvas and, after the game, the results over it. */\n .arena {\n position: relative;\n display: grid;\n }\n /* The canvas: the game's own surface and theme tokens, set by the stage. */\n .stage {\n display: block;\n min-block-size: 12rem;\n border-radius: var(--jy-radius-m, 0.75rem);\n outline-offset: 4px;\n transition: opacity var(--jy-duration, 200ms) var(--jy-ease-out, ease-out);\n &[hidden] {\n display: none;\n }\n /* Behind the results the final board stays visible, dimmed, and can't be used. */\n &[inert] {\n opacity: 0.55;\n }\n }\n .handoff {\n place-items: center;\n min-block-size: 16rem;\n padding: var(--jy-space-l, 2rem) var(--jy-space-s, 1rem);\n border: 3px dashed var(--launcher-accent);\n border-radius: var(--jy-radius-m, 0.75rem);\n text-align: center;\n h3 {\n font-size: var(--jy-step-1, 1.4rem);\n text-wrap: balance;\n }\n }\n .reveal {\n min-inline-size: min(100%, 16rem);\n min-block-size: 3.5rem;\n }\n /*\n * Over the canvas, out of the flow: opening and closing the results never moves the board\n * or the page. A board shorter than the results scrolls them instead of growing.\n */\n .results {\n position: absolute;\n inset-block-start: var(--jy-space-s, 1rem);\n inset-inline: var(--jy-space-s, 1rem);\n z-index: 1;\n inline-size: auto;\n block-size: auto;\n max-inline-size: 48rem;\n max-block-size: calc(100% - 2 * var(--jy-space-s, 1rem));\n margin: 0 auto;\n padding: var(--jy-space-m, 1.5rem);\n overflow: auto;\n overscroll-behavior: contain;\n border: 3px solid var(--launcher-accent);\n border-radius: var(--jy-radius-m, 0.75rem);\n background: var(--jy-surface, Canvas);\n color: var(--jy-text, CanvasText);\n box-shadow: var(--jy-shadow, none);\n opacity: 1;\n translate: 0 0;\n transition:\n opacity var(--jy-duration, 200ms) var(--jy-ease-out, ease-out),\n translate var(--jy-duration, 200ms) var(--jy-ease-out, ease-out),\n display var(--jy-duration, 200ms) allow-discrete;\n &[open] {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: var(--jy-space-s, 1rem);\n align-items: start;\n }\n &:not([open]) {\n opacity: 0;\n translate: 0 0.5rem;\n }\n }\n @starting-style {\n .results[open] {\n /* Keep text readable from the first frame; animate the panel's position. */\n translate: 0 0.5rem;\n }\n }\n @container (inline-size >= 40rem) {\n .results[open] {\n grid-template-columns: minmax(0, 1fr) 300px;\n }\n }\n .results-body {\n display: grid;\n gap: var(--jy-space-s, 1rem);\n align-content: start;\n }\n .results h3 {\n font-size: var(--jy-step-2, 2rem);\n color: var(--launcher-accent);\n }\n .kicker {\n font-size: var(--jy-step--1, 0.9rem);\n }\n .facts {\n display: flex;\n flex-wrap: wrap;\n gap: var(--jy-space-s, 1rem);\n dt {\n font-size: 0.75rem;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n opacity: 0.8;\n }\n dd {\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n }\n }\n /* The daily results: the next release, and the share text exactly as Share sends it. */\n .next {\n margin-block: var(--jy-space-xs, 0.5rem);\n }\n .share-preview {\n margin: 0 0 var(--jy-space-s, 1rem);\n figcaption {\n font-size: 0.75rem;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n opacity: 0.8;\n }\n pre {\n margin: var(--jy-space-2xs, 0.25rem) 0 0;\n padding: var(--jy-space-xs, 0.5rem);\n border-radius: 0.5rem;\n background: color-mix(in oklch, currentColor 8%, transparent);\n font-family: inherit;\n line-height: 1.3;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n }\n }\n .results-ad {\n min-inline-size: 0;\n }\n .review-board {\n min-inline-size: 0;\n padding-inline: 0;\n border-color: transparent;\n text-decoration: underline;\n text-underline-offset: 0.2em;\n }\n .overlay {\n inline-size: min(100% - 2rem, 30rem);\n max-block-size: min(100dvh - 2rem, 44rem);\n padding: var(--jy-space-m, 1.5rem);\n border: 3px solid var(--launcher-accent);\n border-radius: var(--jy-radius-m, 0.75rem);\n background: var(--jy-surface, Canvas);\n color: var(--jy-text, CanvasText);\n box-shadow: var(--jy-shadow, none);\n opacity: 1;\n scale: 1;\n transition:\n opacity var(--jy-duration, 200ms) var(--jy-ease-out, ease-out),\n scale var(--jy-duration, 200ms) var(--jy-ease-out, ease-out),\n display var(--jy-duration, 200ms) allow-discrete,\n overlay var(--jy-duration, 200ms) allow-discrete;\n &:not([open]) {\n opacity: 0;\n scale: 0.96;\n }\n &::backdrop {\n background: oklch(15% 0.03 285 / 0.6);\n }\n &[open] {\n display: grid;\n gap: var(--jy-space-s, 1rem);\n }\n }\n @starting-style {\n .overlay[open] {\n opacity: 0;\n scale: 0.96;\n }\n }\n /* Online with friends: the join form and the lobby. */\n .join,\n .lobby {\n display: grid;\n gap: var(--jy-space-s, 1rem);\n padding: var(--jy-space-s, 1rem);\n border: 2px solid color-mix(in oklch, currentColor 30%, transparent);\n border-radius: var(--jy-radius-s, 0.5rem);\n }\n .join h3,\n .lobby h3 {\n font-size: var(--jy-step-1, 1.4rem);\n }\n .lobby h4 {\n margin: 0;\n font-size: var(--jy-step-0, 1rem);\n }\n .code,\n .invite-link {\n font-family: var(--jy-font-mono, ui-monospace, monospace);\n letter-spacing: 0.08em;\n }\n .code {\n color: var(--launcher-accent);\n white-space: nowrap;\n }\n .invite {\n display: grid;\n gap: var(--jy-space-2xs, 0.5rem);\n }\n .invite .field,\n .join .field {\n justify-items: stretch;\n }\n .invite-link,\n #room-code {\n inline-size: min(100%, 36rem);\n }\n .seats {\n display: grid;\n gap: var(--jy-space-2xs, 0.5rem);\n margin: 0;\n padding: 0;\n list-style: none;\n counter-reset: seat;\n }\n .seat {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--jy-space-3xs, 0.25rem) var(--jy-space-xs, 0.75rem);\n min-block-size: var(--jy-target-min, 2.75rem);\n padding-inline: var(--jy-space-xs, 0.75rem);\n border-radius: var(--jy-radius-s, 0.5rem);\n background: color-mix(in oklch, currentColor 6%, transparent);\n counter-increment: seat;\n &::before {\n content: counter(seat);\n min-inline-size: 1.5em;\n font-family: var(--jy-font-mono, ui-monospace, monospace);\n opacity: 0.7;\n }\n &[data-open='yes'] .seat-name {\n font-style: italic;\n opacity: 0.8;\n }\n &[data-ready='yes']::after {\n content: '✓' / '';\n color: var(--launcher-accent);\n font-weight: 700;\n }\n }\n .seat-name {\n font-weight: 600;\n }\n .seat-tags {\n flex: 1;\n opacity: 0.85;\n }\n .small {\n min-block-size: var(--jy-target-min, 2.75rem);\n padding: 0.3em 0.9em;\n font-size: var(--jy-step--1, 0.9rem);\n }\n .ready[aria-pressed='true'] {\n background: color-mix(in oklch, var(--launcher-accent) 25%, transparent);\n }\n .room-status:empty {\n display: none;\n }\n .timer {\n font-family: var(--jy-font-mono, ui-monospace, monospace);\n font-variant-numeric: tabular-nums;\n &[data-low='yes'] {\n color: var(--jy-danger, red);\n font-weight: 700;\n }\n }\n .offer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--jy-space-3xs, 0.25rem) var(--jy-space-xs, 0.75rem);\n flex-basis: 100%;\n }\n .visually-hidden {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n /* Reduced motion removes the frame's decorative motion: the player's choice wins over the system's. */\n :host(:state(reduce-motion)) *,\n :host(:state(reduce-motion)) *::backdrop {\n transition: none !important;\n animation: none !important;\n }\n @media (prefers-reduced-motion: reduce) {\n :host(:not(:state(allow-motion))) *,\n :host(:not(:state(allow-motion))) *::backdrop {\n transition: none !important;\n animation: none !important;\n }\n }\n @media (forced-colors: active) {\n button,\n .back {\n border-color: ButtonText;\n }\n }\n }\n`;\n\nexport const Launcher = define<LauncherState, LauncherMsg, LauncherProps>()('jy-launcher', {\n props,\n init: (p) => [freshState(p.game), [reportSafePoint({ safe: true, gameId: p.game.id })]],\n states: (s) => ({\n live: s.live,\n playing: s.phase._tag === 'Playing',\n 'reduce-motion': s.preferences?.reducedMotion === 'reduce',\n 'allow-motion': s.preferences?.reducedMotion === 'no-preference',\n }),\n intent: {\n PickGameOption: ({ target, value, checked }) => {\n const key = (target as HTMLInputElement | HTMLSelectElement).name;\n return /^[a-z][A-Za-z0-9]{0,49}$/.test(key) && value !== undefined\n ? { _tag: 'PickGameOption', key, value, checked }\n : undefined;\n },\n PickMode: ({ value }) =>\n value !== undefined &&\n (['solo', 'ai', 'pass-and-play', 'p2p', 'server', 'daily'] as const).some((m) => m === value)\n ? { _tag: 'PickMode', mode: value as Mode }\n : undefined,\n PickLevel: ({ value }) => (value === undefined || value === '' ? undefined : { _tag: 'PickLevel', level: value }),\n PickPlayers: ({ value }) => {\n const players = Number(value);\n return Number.isInteger(players) && players > 0 ? { _tag: 'PickPlayers', players } : undefined;\n },\n Rename: ({ value, target }) => {\n const match = /^seat-(\\d+)$/.exec((target as HTMLInputElement).name);\n return match?.[1] === undefined\n ? undefined\n : { _tag: 'Rename', seat: Number(match[1]), name: (value ?? '').slice(0, 40) };\n },\n Start: () => ({ _tag: 'Start' }),\n StageOut: ({ detail }) => {\n const out = parseStageOutput(detail);\n return out === undefined ? undefined : { _tag: 'StageOut', out };\n },\n AcceptAiNotice: () => ({ _tag: 'AcceptAiNotice' }),\n Resume: () => ({ _tag: 'Resume' }),\n ChooseSave: ({ value }) => (value === undefined ? undefined : { _tag: 'ChooseSave', slot: value }),\n NewGame: () => ({ _tag: 'NewGame' }),\n Reveal: () => ({ _tag: 'Reveal' }),\n OpenMenu: () => ({ _tag: 'OpenMenu' }),\n CloseMenu: () => ({ _tag: 'CloseMenu' }),\n MenuClosed: () => ({ _tag: 'MenuClosed' }),\n SetPreference: ({ value, checked, target }) => {\n const changes = parsePreferenceChange((target as HTMLInputElement).name, value, checked);\n return changes === undefined ? undefined : { _tag: 'SetPreference', changes };\n },\n Exit: () => ({ _tag: 'Exit' }),\n PlayAgain: () => ({ _tag: 'PlayAgain' }),\n ChangeMode: () => ({ _tag: 'ChangeMode' }),\n // A click on \"Review the board\", or Escape anywhere in the results dialog.\n HideResults: ({ key }) => (key === undefined || key === 'Escape' ? { _tag: 'HideResults' } : undefined),\n ShowResults: () => ({ _tag: 'ShowResults' }),\n TypeCode: ({ value }) => ({ _tag: 'TypeCode', code: (value ?? '').slice(0, 200) }),\n ToggleWatch: ({ checked }) => (checked === undefined ? undefined : { _tag: 'ToggleWatch', watch: checked }),\n JoinRoom: () => ({ _tag: 'JoinRoom' }),\n ToggleReady: ({ value }) =>\n value === 'yes' || value === 'no'\n ? { _tag: 'RoomRequest', request: { kind: 'ready', ready: value === 'yes' } }\n : undefined,\n StartMatch: () => ({ _tag: 'RoomRequest', request: { kind: 'start' } }),\n PickClock: ({ value }) => {\n const setting = parseClockValue(value);\n return setting === undefined ? undefined : { _tag: 'RoomRequest', request: { kind: 'clock', setting } };\n },\n PickRoomLevel: ({ value }) =>\n value === undefined || value === ''\n ? undefined\n : { _tag: 'RoomRequest', request: { kind: 'ai-level', level: value } },\n FillSeat: ({ value }) => {\n const seat = seatOf(value);\n return seat === undefined ? undefined : { _tag: 'RoomRequest', request: { kind: 'fill-with-ai', seat } };\n },\n RemoveSeat: ({ value }) => {\n const seat = seatOf(value);\n return seat === undefined ? undefined : { _tag: 'RoomRequest', request: { kind: 'remove-seat', seat } };\n },\n RoomAction: ({ value }) =>\n value === 'leave' || value === 'reconnect' ? { _tag: 'RoomRequest', request: { kind: value } } : undefined,\n OfferEnd: () => ({ _tag: 'OfferEnd' }),\n AnswerOffer: ({ value }) =>\n value === 'accept' || value === 'decline' || value === 'withdraw'\n ? { _tag: 'AnswerOffer', answer: value }\n : undefined,\n Copy: ({ value }) => (value === 'link' || value === 'code' ? { _tag: 'Copy', what: value } : undefined),\n Share: ({ value }) => (value === 'symbols' || value === 'words' ? { _tag: 'Share', form: value } : undefined),\n },\n update: {\n PickGameOption: (s, m, { props: { game } }) => {\n if (s.phase._tag !== 'Setup') return s;\n const option = optionsForMode(game.options ?? [], s.setup.mode ?? 'solo').find((o) => o.key === m.key);\n const value =\n option?.kind === 'toggle' ? m.checked : option?.choices.find((c) => String(c.value) === m.value)?.value;\n return value === undefined ? s : { ...s, setup: { ...s.setup, options: { ...s.setup.options, [m.key]: value } } };\n },\n PickMode: (s, m, { props: { game } }) =>\n s.phase._tag === 'Setup' && optionsOf(s, game).some((o) => o.mode === m.mode && o.playable)\n ? { ...s, setup: pickMode(game, s.setup, m.mode) }\n : s,\n PickLevel: (s, m, { props: { game } }) =>\n game.aiLevels.includes(m.level) ? { ...s, setup: { ...s.setup, aiLevel: m.level } } : s,\n PickPlayers: (s, m, { props: { game } }) =>\n playerCounts(game, s.setup.mode).includes(m.players)\n ? { ...s, setup: { ...s.setup, players: m.players, errors: [] } }\n : s,\n Rename: (s, m) => {\n if (m.seat < 0 || m.seat >= s.setup.players) return s;\n const names = Array.from({ length: s.setup.players }, (_, seat) =>\n seat === m.seat ? m.name : (s.setup.names[seat] ?? ''),\n );\n const errors = s.setup.errors.map((e, seat) => (seat === m.seat ? null : e));\n return { ...s, setup: { ...s.setup, names, errors } };\n },\n Start: (s, _m, { props: { game } }) => {\n if (!s.live || s.phase._tag !== 'Setup') return s;\n if (!optionsOf(s, game).some((o) => o.mode === s.setup.mode && o.playable)) return s;\n if (s.setup.mode === 'server') return startRound(s, game, [], null, { action: 'create' });\n const seats = seatsFor(game, s.setup);\n if (!seats.ok)\n return [{ ...s, setup: { ...s.setup, errors: seats.errors } }, [focus('input[aria-invalid=\"true\"]')]];\n return startRound(s, game, seats.seats, null);\n },\n StageLoaded: (s) => ({ ...s, stageReady: true }),\n StageOut: (s, m, { props: { game } }) => fromStage(s, m.out, game),\n AcceptAiNotice: (s, _m, { props: { game } }) =>\n s.phase._tag === 'AiNotice' && s.preferences !== null\n ? proceed({ ...s, preferences: { ...s.preferences, aiContentAccepted: true } }, game, s.phase.save)\n : s,\n Resume: (s, _m, { props: { game } }) => (s.phase._tag === 'Resume' ? beginPlay(s, game, 'resume') : s),\n ChooseSave: (s, m) => {\n if (s.phase._tag !== 'Resume') return s;\n const choice = s.phase.save.choices?.find((c) => c.slot === m.slot);\n return choice === undefined ? s : { ...s, phase: { _tag: 'Resume', save: { ...s.phase.save, ...choice } } };\n },\n NewGame: (s, _m, { props: { game } }) => (s.phase._tag === 'Resume' ? beginPlay(s, game, 'new') : s),\n Reveal: (s) =>\n s.phase._tag === 'Playing' && s.phase.frame?.handoff != null\n ? [{ ...s, reveals: s.reveals + 1 }, [focus(STAGE)]]\n : s,\n OpenMenu: (s, _m, { props: { game } }) =>\n s.phase._tag === 'Playing' && s.phase.frame?.handoff == null\n ? settle({ ...s, phase: { ...s.phase, menu: true } }, game)\n : s,\n CloseMenu: (s) => (s.phase._tag === 'Playing' && s.phase.menu ? { ...s, phase: { ...s.phase, menu: false } } : s),\n MenuClosed: (s) => (s.phase._tag === 'Playing' && s.phase.menu ? { ...s, phase: { ...s.phase, menu: false } } : s),\n SetPreference: (s, m) => (s.preferences === null ? s : { ...s, preferences: { ...s.preferences, ...m.changes } }),\n Exit: (s, _m, { props: { game } }) => {\n // Leaving a room goes through the stage, which gives the seat up before it closes.\n if (inRoom(s) && s.room !== null && (s.phase._tag === 'Playing' || s.phase._tag === 'Lobby'))\n return ask(s, { kind: 'leave' });\n return s.phase._tag === 'Playing' ||\n s.phase._tag === 'Resume' ||\n s.phase._tag === 'Loading' ||\n s.phase._tag === 'AiNotice'\n ? toSetup(s, game)\n : s;\n },\n PlayAgain: (s, _m, { props: { game } }) => {\n if (s.phase._tag !== 'Results') return s;\n // In a room this offers a rematch; offering one that is already open accepts it.\n return inRoom(s) ? askRoom(s, { kind: 'offer', offer: 'rematch' }) : startRound(s, game, s.seats, s.rematch);\n },\n ChangeMode: (s, _m, { props: { game } }) => {\n if (inRoom(s) && s.room !== null && s.phase._tag === 'Results') return ask(s, { kind: 'leave' });\n return s.phase._tag === 'Results' || s.phase._tag === 'Failed' ? toSetup(s, game) : s;\n },\n // The results close to the final board, which can be read but no longer played; the\n // session stays until the player picks Play again, Change mode or leaves the page.\n HideResults: (s) =>\n s.phase._tag === 'Results' && s.phase.shown && s.daily?.earlier == null\n ? [{ ...s, phase: { ...s.phase, shown: false } }, [focus(STAGE)]]\n : s,\n ShowResults: (s) =>\n s.phase._tag === 'Results' && !s.phase.shown\n ? [{ ...s, phase: { ...s.phase, shown: true } }, [focus('#results-title')]]\n : s,\n // A game that lists online play asks the room server first, and reads an invite once it\n // knows whether rooms are open; any other game reads it at once (and ignores it).\n Hydrated: (s, _m, { props: { game } }) => [\n { ...s, live: true },\n [\n asksOnline(game, s.online)\n ? checkOnline<LauncherMsg>((online) => ({ _tag: 'OnlineChecked', online }))\n : readInvite<LauncherMsg>((code) => ({ _tag: 'InviteFound', code })),\n ],\n ],\n OnlineChecked: (s, m, { props: { game } }) => {\n const next = { ...s, online: m.online };\n // A setup whose mode the answer made unplayable (or that had none) moves to the first playable mode.\n const options = optionsOf(next, game);\n const first = options.find((o) => o.playable)?.mode;\n const keep = s.setup.mode !== null && options.some((o) => o.mode === s.setup.mode && o.playable);\n const setup = s.phase._tag !== 'Setup' || keep || first === undefined ? s.setup : pickMode(game, s.setup, first);\n return [{ ...next, setup }, [readInvite<LauncherMsg>((code) => ({ _tag: 'InviteFound', code }))]];\n },\n TypeCode: (s, m) => (s.phase._tag === 'Setup' ? { ...s, setup: { ...s.setup, code: m.code, codeError: null } } : s),\n ToggleWatch: (s, m) => (s.phase._tag === 'Setup' ? { ...s, setup: { ...s.setup, watch: m.watch } } : s),\n JoinRoom: (s, _m, { props: { game } }) => {\n if (!s.live || s.phase._tag !== 'Setup' || s.setup.mode !== 'server') return s;\n if (!optionsOf(s, game).some((o) => o.mode === 'server' && o.playable)) return s;\n const code = parseRoomCode(s.setup.code);\n if (code === null) {\n return [\n {\n ...s,\n setup: { ...s.setup, codeError: 'Enter the six-character code from the invite, or paste the invite link.' },\n },\n [focus('#room-code')],\n ];\n }\n return startRound({ ...s, setup: { ...s.setup, code, codeError: null } }, game, [], null, {\n action: 'join',\n code,\n watch: s.setup.watch,\n });\n },\n InviteFound: (s, m, { props: { game } }) => {\n if (s.phase._tag !== 'Setup' || !optionsOf(s, game).some((o) => o.mode === 'server' && o.playable)) return s;\n return [\n { ...s, setup: { ...pickMode(game, s.setup, 'server'), code: m.code, codeError: null } },\n [focus('.join-room')],\n ];\n },\n RoomRequest: (s, m) =>\n m.request.kind === 'ai-level' && s.room?.aiLevels.includes(m.request.level) !== true ? s : askRoom(s, m.request),\n // The menu closes on the way: the offer then shows in the bar.\n OfferEnd: (s) =>\n s.phase._tag === 'Playing' && canOfferEnd(s.room)\n ? askRoom({ ...s, phase: { ...s.phase, menu: false } }, { kind: 'offer', offer: 'end' })\n : s,\n AnswerOffer: (s, m) => {\n const offer = s.room?.offer ?? null;\n return offer?.status === 'open' ? askRoom(s, { kind: 'answer', offer: offer.id, answer: m.answer }) : s;\n },\n Copy: (s, m) =>\n s.room === null\n ? s\n : [\n s,\n [\n copyText<LauncherMsg>(m.what === 'link' ? s.room.link : s.room.code, (ok) => ({\n _tag: 'Copied',\n what: m.what,\n ok,\n })),\n ],\n ],\n Copied: (s, m) => ({\n ...s,\n polite: say(\n s.polite,\n m.ok\n ? m.what === 'link'\n ? 'Invite link copied.'\n : 'Room code copied.'\n : 'Copying didn’t work here. Select the link and copy it yourself.',\n ),\n }),\n Share: (s, m) => {\n const d = s.daily;\n if (d === null || d.share === '' || s.phase._tag !== 'Results') return s;\n return m.form === 'symbols'\n ? [s, [shareText<LauncherMsg>(d.share, (how) => ({ _tag: 'Shared', form: 'symbols', how }))]]\n : [\n s,\n [\n copyText<LauncherMsg>(d.shareWords, (ok) => ({\n _tag: 'Shared',\n form: 'words',\n how: ok ? 'copied' : 'failed',\n })),\n ],\n ];\n },\n Shared: (s, m) => {\n const line =\n m.how === 'shared'\n ? 'Shared.'\n : m.how === 'copied'\n ? m.form === 'words'\n ? 'Result copied as text.'\n : 'Result copied. Paste it anywhere.'\n : m.how === 'cancelled'\n ? null\n : 'Copying didn’t work here. Select the result and copy it yourself.';\n return line === null ? s : { ...s, polite: say(s.polite, line) };\n },\n // Client navigation between game pages reuses this element with a new game. The room\n // server's answer holds for every game; a page that never asked asks now.\n PropsChanged: (s, { props: p, prev }) => {\n if (p.game.id === prev.game.id) return s;\n const fresh = freshState(p.game, s.live, s.online);\n return s.live && asksOnline(p.game, s.online)\n ? [fresh, [checkOnline<LauncherMsg>((online) => ({ _tag: 'OnlineChecked', online }))]]\n : fresh;\n },\n },\n view: (s, _i, { props: { game } }): ChildValue => html`<div class=\"launcher\" data-phase=${s.phase._tag}>\n ${mainView(s, game)}\n <p class=\"visually-hidden\" aria-live=\"polite\">${s.polite}</p>\n <p class=\"visually-hidden\" aria-live=\"assertive\">${s.assertive}</p>\n </div>`,\n styles,\n});\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'jy-launcher': InstanceType<typeof Launcher>;\n }\n}\n"],"mappings":"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"}