From ed7a58a6982967f68d71cef28e5937e5dff03c15 Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Tue, 18 Aug 2026 09:13:31 -0400 Subject: [PATCH] The workshop gains 'The standing fires': board furniture on display MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FirewallEdge (both orientations), the illusion shimmer, and the sight trace (direct and through-a-warp) join the /?fx gallery — and to keep the display honest, the shimmer and sight trace were extracted from Board.svelte's inline markup into IllusionShimmer.svelte and SightTraceOverlay.svelte, so the workshop mounts the very components the live board does. No copies to drift. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc --- packages/web/src/Board.svelte | 66 ++-------------------- packages/web/src/FxGallery.svelte | 69 +++++++++++++++++++++++ packages/web/src/IllusionShimmer.svelte | 42 ++++++++++++++ packages/web/src/SightTraceOverlay.svelte | 54 ++++++++++++++++++ 4 files changed, 171 insertions(+), 60 deletions(-) create mode 100644 packages/web/src/IllusionShimmer.svelte create mode 100644 packages/web/src/SightTraceOverlay.svelte diff --git a/packages/web/src/Board.svelte b/packages/web/src/Board.svelte index c3c891f..36bc742 100644 --- a/packages/web/src/Board.svelte +++ b/packages/web/src/Board.svelte @@ -6,6 +6,8 @@ import { colorIndexOf as sharedColorIndex, wizardColor } from "./colors"; import { CREATURE_ART, objectArt, TERRAIN_ART, tokenArt } from "./art"; import FirewallEdge from "./FirewallEdge.svelte"; + import IllusionShimmer from "./IllusionShimmer.svelte"; + import SightTraceOverlay from "./SightTraceOverlay.svelte"; import TokenArt from "./TokenArt.svelte"; import { FX_SPRITES } from "./fx-sprites"; @@ -437,18 +439,11 @@ {#each Object.entries(view.illusionEdges) as [key, verdict] (key)} {#if verdict === "untested"} - {@const kind = key.split(":")[0]} + {@const kind = key.split(":")[0] === "V" ? "V" as const : "H" as const} {@const ix = Number(key.split(":")[1]?.split(",")[0])} {@const iy = Number(key.split(":")[1]?.split(",")[1])} - {@const x1 = kind === "V" ? (ix + 1) * CELL : ix * CELL + 2} - {@const y1 = kind === "V" ? iy * CELL + 2 : (iy + 1) * CELL} - {@const x2 = kind === "V" ? (ix + 1) * CELL : (ix + 1) * CELL - 2} - {@const y2 = kind === "V" ? (iy + 1) * CELL - 2 : (iy + 1) * CELL} - - { ev.stopPropagation(); onIllusionClick?.({ x: ix, y: iy }, kind === "V" ? "E" : "S"); }} - onkeydown={() => {}} /> + onIllusionClick?.({ x: ix, y: iy }, kind === "V" ? "E" : "S")} /> {/if} {/each} @@ -645,20 +640,7 @@ {/if} {#if sightTrace} - {@const A = { x: sightTrace.from.x * CELL + CELL / 2, y: sightTrace.from.y * CELL + CELL * 0.36 }} - {@const B = { x: sightTrace.to.x * CELL + CELL / 2, y: sightTrace.to.y * CELL + CELL * 0.36 }} - + {/if}