From 2d147fd97aee19310220b3f4d201515697761334 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20R=C3=B6ger?=
Date: Fri, 21 Aug 2026 20:35:22 +0200
Subject: [PATCH] feat(web): solver output enhancing
- math render header
- tooltips
- copy word to input
- cancel solver
---
nix/wordle-solver-web.nix | 2 +-
web/package.json | 1 +
web/src/App.svelte | 35 +++++++++++++----
web/src/components/SolverOutput.svelte | 53 +++++++++++++++++++++++---
web/src/components/WordleLine.svelte | 7 ++++
web/yarn.lock | 12 ++++++
6 files changed, 97 insertions(+), 13 deletions(-)
diff --git a/nix/wordle-solver-web.nix b/nix/wordle-solver-web.nix
index 21b2e78..bb5dfb0 100644
--- a/nix/wordle-solver-web.nix
+++ b/nix/wordle-solver-web.nix
@@ -14,7 +14,7 @@ stdenv.mkDerivation (finalAttrs: {
yarnOfflineCache = fetchYarnDeps {
yarnLock = finalAttrs.src + "/yarn.lock";
- hash = "sha256-ND+4leEGamH86IsM9JVtIqlwyrwVRQII75+rrawbiMI=";
+ hash = "sha256-ApqiC2ZS4GzKRXwPCb7KiMO1IemnNU7ykUYlgMp2XjE=";
};
yarnBuildScript = "build-no-wasm";
diff --git a/web/package.json b/web/package.json
index f64d63b..2e2e0d3 100644
--- a/web/package.json
+++ b/web/package.json
@@ -27,6 +27,7 @@
},
"dependencies": {
"esbuild": "^0.28.2",
+ "katex": "^0.18.4",
"rollup": "^4.62.4",
"svelte": "^5.56.9",
"wordle-solver": "link:./pkg"
diff --git a/web/src/App.svelte b/web/src/App.svelte
index 8d42466..b010e52 100644
--- a/web/src/App.svelte
+++ b/web/src/App.svelte
@@ -41,7 +41,9 @@
let cursor = $state(0);
- function reset() {
+ async function reset() {
+ await solver_reset(use_default_wordle_answers);
+
guesses = [
{
letters: ["", "", "", "", ""],
@@ -59,11 +61,22 @@
solution_space = solver_solution_space();
}
+ async function stopSolver() {
+ await solver_reset(use_default_wordle_answers);
+ for (const g of guesses.slice(0, -1)) {
+ try {
+ await solver_guess(g.letters, g.colors);
+ } catch (_) {}
+ }
+ }
+
function handleKey(event: KeyboardEvent) {
if (event.key === "Enter" && event.shiftKey) {
best_words = solver_evaluate_words(5, (p) => {
best_words_progress = p;
});
+ } else if (event.key === "Escape") {
+ stopSolver();
} else if (event.key === "Enter") {
const guess = guesses[guesses.length - 1];
@@ -107,11 +120,12 @@
{
- solver_reset(use_default_wordle_answers).then(() => {
- reset();
- });
+ onfocus={(e) => {
+ if (e.currentTarget) {
+ e.currentTarget.blur();
+ }
}}
+ onchange={reset}
/>
@@ -141,10 +155,17 @@
Type letters · ← → navigate · Space cycle color · Backspace delete ·
- Enter apply · Shift+Enter solve
+ Enter apply · Shift+Enter solve · Escape reset
{#if best_words}
-
+ {
+ console.log("CB");
+ guesses[guesses.length - 1].letters = g;
+ }}
+ />
{/if}
diff --git a/web/src/components/SolverOutput.svelte b/web/src/components/SolverOutput.svelte
index 2219bf8..9425621 100644
--- a/web/src/components/SolverOutput.svelte
+++ b/web/src/components/SolverOutput.svelte
@@ -1,4 +1,6 @@
{#await data}
@@ -27,16 +41,35 @@
- | Word |
- p[solution] |
- E[Inf.] |
- E[Score] |
+ Word |
+
+
+
{#each d.stats as s}
-
+
{
+ if (insert_guess) {
+ insert_guess([...s.word]);
+ }
+ }}
+ >
| {s.word} |
{s.solution_probability.toFixed(3)} |
{/await}
+
+
diff --git a/web/src/components/WordleLine.svelte b/web/src/components/WordleLine.svelte
index 4424aeb..b59bc4d 100644
--- a/web/src/components/WordleLine.svelte
+++ b/web/src/components/WordleLine.svelte
@@ -69,6 +69,13 @@
class:bg-green-600={colors[i] === Color.GREEN}
class:bg-yellow-600={colors[i] === Color.YELLOW}
class:bg-grey-600={colors[i] === Color.GREY}
+ onclick={() => {
+ if (cursor === i) {
+ colors[cursor] = (colors[cursor] + 1) % 3;
+ } else {
+ cursor = i;
+ }
+ }}
>
{letter}
diff --git a/web/yarn.lock b/web/yarn.lock
index cdd5d27..505e340 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -767,6 +767,11 @@ color-name@1.1.3:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+commander@^8.3.0:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
+ integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
+
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -1385,6 +1390,13 @@ json-parse-better-errors@^1.0.1:
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+katex@^0.18.4:
+ version "0.18.4"
+ resolved "https://registry.yarnpkg.com/katex/-/katex-0.18.4.tgz#aa09d0bfbcbab71a9a0f9d420def6c0d0a227a94"
+ integrity sha512-IMPntbRLOU+eu88XDiFKqQ8Akhr9Tv7jDMXqPhjG9SI1JMA4DIgXk4x9k4skJz2NZJXBRbC+2pYBLj9olqcZow==
+ dependencies:
+ commander "^8.3.0"
+
lightningcss-android-arm64@1.32.0:
version "1.32.0"
resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968"