|
16 | 16 | /** The index of the current guess */ |
17 | 17 | $: i = won ? -1 : data.answers.length; |
18 | 18 |
|
| 19 | + /** The current guess */ |
| 20 | + $: currentGuess = data.guesses[i] || ''; |
| 21 | +
|
19 | 22 | /** Whether the current guess can be submitted */ |
20 | | - $: submittable = data.guesses[i]?.length === 5; |
| 23 | + $: submittable = currentGuess.length === 5; |
21 | 24 |
|
22 | 25 | /** |
23 | 26 | * A map of classnames for all letters that have been guessed, |
|
60 | 63 | * @param {MouseEvent} event |
61 | 64 | */ |
62 | 65 | function update(event: MouseEvent) { |
63 | | - const guess = data.guesses[i]; |
64 | 66 | const key = /** @type {HTMLButtonElement} */ (event.target as HTMLButtonElement).getAttribute( |
65 | 67 | 'data-key' |
66 | 68 | ); |
67 | 69 |
|
68 | 70 | if (key === 'backspace') { |
69 | | - data.guesses[i] = guess.slice(0, -1); |
| 71 | + currentGuess = currentGuess.slice(0, -1); |
70 | 72 | if (form?.badGuess) form.badGuess = false; |
71 | | - } else if (guess.length < 5) { |
72 | | - data.guesses[i] += key; |
| 73 | + } else if (currentGuess.length < 5) { |
| 74 | + currentGuess += key; |
73 | 75 | } |
74 | 76 | } |
75 | 77 |
|
|
81 | 83 | function keydown(event: KeyboardEvent) { |
82 | 84 | if (event.metaKey) return; |
83 | 85 |
|
| 86 | + if (event.key === 'Enter' && !submittable) return; |
| 87 | +
|
84 | 88 | document |
85 | 89 | .querySelector(`[data-key="${event.key}" i]`) |
86 | 90 | ?.dispatchEvent(new MouseEvent('click', { cancelable: true })); |
|
114 | 118 | <h2 class="visually-hidden">Row {row + 1}</h2> |
115 | 119 | <div class="row" class:current> |
116 | 120 | {#each Array.from(Array(5).keys()) as column (column)} |
| 121 | + {@const guess = current ? currentGuess : data.guesses[row]} |
117 | 122 | {@const answer = data.answers[row]?.[column]} |
118 | | - {@const value = data.guesses[row]?.[column] ?? ''} |
119 | | - {@const selected = current && column === data.guesses[row].length} |
| 123 | + {@const value = guess?.[column] ?? ''} |
| 124 | + {@const selected = current && column === guess.length} |
120 | 125 | {@const exact = answer === 'x'} |
121 | 126 | {@const close = answer === 'c'} |
122 | 127 | {@const missing = answer === '_'} |
|
169 | 174 | on:click|preventDefault={update} |
170 | 175 | data-key={letter} |
171 | 176 | class={classnames[letter]} |
172 | | - disabled={data.guesses[i].length === 5} |
| 177 | + disabled={submittable} |
173 | 178 | formaction="?/update" |
174 | 179 | name="key" |
175 | 180 | value={letter} |
|
0 commit comments