Sentence Trainer

{#each masteryThresholds as [, , title], i} {/each} {#each masteryThresholds as _, i}
{/each}
{#each sentenceWords as _, i} {#if i !== sentenceWords.length - 1} {@const word = sentenceWords.slice(i, i + 2).join(" ")} {@const mastery = wordMastery.get(word) ?? 0}
{/if} {/each} {#each sentenceWords as word, i} {@const mastery = wordMastery.get(word)}
{word}
{/each} {#each sentenceWords as _, i} {#if i < sentenceWords.length - 2} {@const word = sentenceWords.slice(i, i + 3).join(" ")} {@const mastery = wordMastery.get(word) ?? 0}
{/if} {/each}
{#if level === masteryThresholds.length} {@const maxDigits = 4} {@const indices = Array.from({ length: maxDigits }, (_, i) => i)} {@const wpmString = Math.floor(bestWPM).toString().padStart(maxDigits, " ")}
{#each indices as i} {@const char = wpmString[i]} {#key char}
{char}
{/key} {/each}
WPM
{#key wpm}
{Math.floor(wpm)}
{/key}
WPM
{/if}
{#key recorder}
{/key}
{#if devTools}
Dev Tools
Total {Math.round(totalMs)}ms
Char {Math.round(msPerChar)}ms
Word {Math.round(msPerWord)}ms
{#each masteryThresholds as _, i} {/each}
L{i + 1}
{#each wordStats.entries() as [word, stats]} {@const mastery = wordMastery.get(word) ?? 0} {#each stats as stat} {/each} {/each}
{word} {Math.round(mastery * 100)}% {stat}
{/if}