{#snippet scoreboardBlock()} {#if view}
{#if app.chatUnread[id]}
{/if} {#each view.game.seats as s (s.seat)}
{seatName(s)}
{addConfirm[s.seat] ? t('game.addFriendShort') : s.score}
{#if historyShown && canAddFriend(s.accountId)}
(addConfirm[s.seat] = v)} onconfirm={() => addFriend(s.accountId)} >
π€
{/if}
{/each}
{/if} {/snippet} {#snippet historyBody()} {#if view}
{#if gameOver} {#if view.game.vsAi}
{:else}
π€
{/if} {:else}
(resignOpen = true)} disabled={waitingForOpponent} aria-label={t('game.dropGame')}>π
{/if} {#if !view.game.multipleWordsPerTurn}
{t('game.oneWordRule')}
{/if}
navigate(`/game/${id}/chat`)} aria-label={t('game.chat')}> {#key chatBlink}
0 && !app.reduceMotion}>π¬
{/key}
{#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 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}
β
{/if}
{/snippet} {#snippet controlButtons()}
π
{t('game.draw')}
π{#if hintCount > 0}
{hintCount}
{/if}
{t('game.hint')}
{#if placement.pending.length > 0}
β©οΈ
{t('game.reset')}
{:else}
π
{/if} {/snippet} {#snippet bottomBar()} {#if view}
{@render controlButtons()}
{/if} {/snippet} {#if drag}
{drag.blank ? '' : drag.letter}
{/if} {#if blankPrompt}
(blankPrompt = null)}>
{#each alphabetLetters(variant) as ch (ch)}
chooseBlank(ch)}>{ch}
{/each}
{/if} {#if exchangeOpen && view}
(exchangeOpen = false)}>
{#each view.rack as letter, i (i)}
toggleExch(i)}> {letter === BLANK ? '?' : letter}
{/each}
{exchangeSel.length === 0 ? t('game.passNoExchange') : t('game.exchangeConfirm', { n: exchangeSel.length })}
{/if} {#if resignOpen}
(resignOpen = false)}>
(resignOpen = false)}>{t('common.cancel')}
{t('game.dropGame')}
{/if}