|
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) {
|
63 |
| - const guess = data.guesses[i]; |
64 | 66 | const key = /** @type {HTMLButtonElement} */ (event.target).getAttribute('data-key');
|
65 | 67 |
|
66 | 68 | if (key === 'backspace') {
|
67 |
| - data.guesses[i] = guess.slice(0, -1); |
| 69 | + currentGuess = currentGuess.slice(0, -1); |
68 | 70 | if (form?.badGuess) form.badGuess = false;
|
69 |
| - } else if (guess.length < 5) { |
70 |
| - data.guesses[i] += key; |
| 71 | + } else if (currentGuess.length < 5) { |
| 72 | + currentGuess += key; |
71 | 73 | }
|
72 | 74 | }
|
73 | 75 |
|
|
79 | 81 | function keydown(event) {
|
80 | 82 | if (event.metaKey) return;
|
81 | 83 |
|
| 84 | + if (event.key === 'Enter' && !submittable) return; |
| 85 | +
|
82 | 86 | document
|
83 | 87 | .querySelector(`[data-key="${event.key}" i]`)
|
84 | 88 | ?.dispatchEvent(new MouseEvent('click', { cancelable: true }));
|
|
107 | 111 | <a class="how-to-play" href="/sverdle/how-to-play">How to play</a>
|
108 | 112 |
|
109 | 113 | <div class="grid" class:playing={!won} class:bad-guess={form?.badGuess}>
|
110 |
| - {#each Array(6) as _, row} |
| 114 | + {#each Array.from(Array(6).keys()) as row (row)} |
111 | 115 | {@const current = row === i}
|
112 | 116 | <h2 class="visually-hidden">Row {row + 1}</h2>
|
113 | 117 | <div class="row" class:current>
|
114 |
| - {#each Array(5) as _, column} |
| 118 | + {#each Array.from(Array(5).keys()) as column (column)} |
| 119 | + {@const guess = current ? currentGuess : data.guesses[row]} |
115 | 120 | {@const answer = data.answers[row]?.[column]}
|
116 |
| - {@const value = data.guesses[row]?.[column] ?? ''} |
117 |
| - {@const selected = current && column === data.guesses[row].length} |
| 121 | + {@const value = guess?.[column] ?? ''} |
| 122 | + {@const selected = current && column === guess.length} |
118 | 123 | {@const exact = answer === 'x'}
|
119 | 124 | {@const close = answer === 'c'}
|
120 | 125 | {@const missing = answer === '_'}
|
|
167 | 172 | on:click|preventDefault={update}
|
168 | 173 | data-key={letter}
|
169 | 174 | class={classnames[letter]}
|
170 |
| - disabled={data.guesses[i].length === 5} |
| 175 | + disabled={submittable} |
171 | 176 | formaction="?/update"
|
172 | 177 | name="key"
|
173 | 178 | value={letter}
|
|
0 commit comments