{#if view} {#if landscape}
{@render scoreboardBlock()}
{@render historyBody()}
{@render statusBlock()} {@render rackRow()} {@render controlButtons()}
{@render boardBlock()}
{:else} {@render scoreboardBlock()}
{#if historyOpen}
{@render historyBody()}
{/if} {@render boardBlock()}
{@render statusBlock()} {@render rackRow()} {/if} {:else}

{t('common.loading')}

{/if}
{#snippet scoreboardBlock()} {#if view} {@const badge = badgeKind(app.chatUnread[id] ?? false, app.messageUnread[id] ?? false)}
{#if badge}{/if} {#each view.game.seats as s (s.seat)}
{seatName(s)}
{#if blockConfirm[s.seat]}{t('game.blockShort')}{:else if addConfirm[s.seat]}{t('game.addFriendShort')}{:else}{s.score}{/if}
{#if historyShown && canBlock(s) && !addConfirm[s.seat]} (blockConfirm[s.seat] = v)} onconfirm={() => blockUser(s)} > βœ–οΈ {/if} {#if historyShown && canAddFriend(s) && !blockConfirm[s.seat]} (addConfirm[s.seat] = v)} onconfirm={() => addFriend(s)} > 🀝 {/if}
{/each}
{/if} {/snippet} {#snippet historyBody()} {#if view}
{#if gameOver} {#if view.game.vsAi} {:else} {/if} {:else} {/if} {#if !view.game.multipleWordsPerTurn}{t('game.oneWordRule')}{/if} {#if !(gameOver && view.game.vsAi)} {/if}
{#each historyGrid(moves, view.game.seats.length, thinkingSeat) as row} {#each row as cell (cell.player)}
{#if cell.kind === 'play'} {cell.words?.join(', ')} ({cell.score}) {:else if cell.kind === 'action'} ({moveActionLabel(cell.action ?? '')}) {:else if cell.kind === 'thinking'} {t('game.thinking')} {/if}
{/each} {/each}
{#if view.game.endReason === 'aborted'}

{t('game.abortedNote')}

{/if} {/if} {/snippet} {#snippet boardBlock()}
{ if (!swallowClick) closeHistoryByGesture(); }} > { focus = { row: r, col: c }; if (!gameOver) zoomed = !zoomed; }} onrecall={onRecall} onpenddown={onBoardDown} />
{/snippet} {#snippet statusBlock()} {#if view}
{view.bagLen === 0 ? t('game.bagEmpty') : t('game.bag', { n: view.bagLen })} {#if gameOver} {resultText()} {:else if placement.pending.length === 0} {isMyTurn ? t('game.yourTurn') : turnLabel()} {/if} {#if recallOverRack}{:else if preview}{preview.legal ? t('game.previewWords', { words: preview.words.join(', '), n: preview.score }) : t('game.previewIllegal')}{:else if !view.game.multipleWordsPerTurn}1️⃣{/if}
{/if} {/snippet} {#snippet rackRow()}
{#if !gameOver && placement.pending.length > 0 && !recallOverRack} {/if}
{/snippet} {#snippet controlButtons()} πŸ›Ÿ{#if hintCount > 0}{hintCount}{/if} {t('game.hint')} {#if placement.pending.length > 0} {:else} {/if} {/snippet} {#snippet bottomBar()} {#if view} {@render controlButtons()} {/if} {/snippet} {#if drag}
{drag.blank ? (usesStarBlank(variant) ? BLANK_STAR : '') : drag.letter}
{/if} {#if blankPrompt} (blankPrompt = null)}>
{#each alphabetLetters(variant) as ch (ch)} {/each}
{/if} {#if exchangeOpen && view} (exchangeOpen = false)}>
{#each view.rack as letter, i (i)} {/each}
{/if} {#if resignOpen} (resignOpen = false)}>
{/if}