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

{t('common.loading')}

{/if}
{#if dictWarming} {/if} {#snippet turnStrip()} {#if view && !(gameOver && view.game.hotseat)}
{#if gameOver} {resultText()} {:else if preview?.legal && !recallOverRack} {preview.words.map((w) => w.toUpperCase()).join('+')} = {preview.score} {:else} {view.game.hotseat ? t('hotseat.turnOf', { name: hotseatName(view.game.toMove) }) : isMyTurn ? t('game.yourTurn') : turnLabel()} {/if}
{/if} {/snippet} {#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)}
{#if gameOver && view.game.hotseat}{/if}{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 view.game.hotseat} {:else} {/if} {#if !view.game.multipleWordsPerTurn}{t('game.oneWordRule')}{/if} {#if !(gameOver && (view.game.vsAi || view.game.hotseat))} {/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}
{view.bagLen === 0 ? t('game.bagEmpty') : t('game.bag', { n: view.bagLen })}
{/if} {/snippet} {#snippet boardBlock()}
{ if (!swallowClick) closeHistoryByGesture(); }} > { focus = { row: r, col: c }; if (!gameOver) zoomed = !zoomed; }} onrecall={onRecall} onpenddown={onBoardDown} />
{/snippet} {#snippet rackRow()}
{#if locked} {:else} 0 && !recallOverRack ? confirmBtn : undefined} ondown={onRackDown} /> {/if}
{/snippet} {#snippet confirmBtn()} {/snippet} {#snippet controlButtons()} {#if view?.game.hotseat} {:else if view?.game.vsAi} {:else} πŸ›Ÿ{#if hintCount > 0}{hintCount}{/if} {t('game.hint')} {/if} {#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} {#if unlockOpen && view} (unlockOpen = false)} onresult={() => (unlockOpen = false)} /> {/if} {#if hostMenuStep === 'pin'} (hostMenuStep = 'closed')} onresult={() => (hostMenuStep = 'menu')} /> {/if} {#if hostMenuStep === 'menu' && view} { hostMenuStep = 'closed'; hostConfirm = null; }}> {#if hostConfirm}

{hostConfirmText(hostConfirm)}

{:else}
{t('hotseat.exclude')}
{#each view.game.seats as s (s.seat)} {/each}
{/if}
{/if} {#if hostDone} {/if} {#if exportOpen} (exportOpen = false)}>
{#if exportImageAvailable} {/if}
{/if}