Skip to content

feat: V2 modernization — Neo-Brutalism UI, 3D tiles, photo scan, mobile UX, and architecture overhaul#18

Merged
JLeshnick merged 21 commits into
mainfrom
feat/modernization-v2
Jul 24, 2026
Merged

feat: V2 modernization — Neo-Brutalism UI, 3D tiles, photo scan, mobile UX, and architecture overhaul#18
JLeshnick merged 21 commits into
mainfrom
feat/modernization-v2

Conversation

@JLeshnick

Copy link
Copy Markdown
Owner

Summary

This is the full V2 modernization of Labyrinth Game Solver, accumulated across the feat/modernization-v2 branch. It touches nearly every layer of the app — visual design, component architecture, feature additions, and infrastructure cleanup.

Visual Design System

  • Full Neo-Brutalism theme applied globally: bold borders, hard drop-shadows, warm stone-gray palette, brutalist lock badges, and styled tooltips
  • 3D beveled block tile and pawn aesthetics matching MazeMaster plastic pieces
  • 3D Tray Platform wrapping the board in both light and dark modes; Neumorphic 2D shadow alternative
  • Continuous SVG corridor rendering on tiles (replaces discrete open/wall lines)
  • Semi-transparent path overlay with animated crawl underline for solver move display
  • Consistent CSS variable–driven theming across all tile states; dark mode tile darkening fixed
  • Ribbon-style redesigned AppHeader with brutalist title treatment and 3D settings button

Feature Additions

  • Board photo scan (BoardScanModal.tsx): capture or upload a photo of a physical board and auto-detect tile types/orientations using the per-tile closeup template atlas (atlas-config.json)
  • Move history dialog (MoveHistoryDialog.tsx): visual mini-board snapshots of each past move
  • Session stopwatch (useStopwatch.ts): timer visible during step-by-step navigation
  • Welcome guide (WelcomeGuide.tsx): three-step onboarding overlay on first launch
  • Go Home action from solver panel
  • Solver enhancements: ordering improvements, 1-move shortcut button, destination ring on hover

Architecture & Refactor

  • Folder reorganization: components/board/, components/panels/, components/modals/, components/ui/
  • Removed Electron desktop shell entirely (main-electron.cjs, preload.cjs, build/)
  • Removed LandingPage, TrophyPanel, save-slot system, and SetupPanel/SolverPanel root-level files (replaced by /panels/)
  • Replaced grid-crop tile atlas with per-tile closeup photo templates under public/tile-templates/
  • atlas-config.json externalizes tile atlas configuration for easy editing
  • Autosave-only storage (useLabyrinthStorage.ts); slot system removed
  • Responsive board grid (w-full), path overlay coordinate fixes, and desktop board scale constraint bug resolved

Mobile & Responsive UX

  • Two-column tablet layout (md:); mobile bottom sheet / peek panel gated to phones
  • 44px touch targets and icon-touch button size variants
  • TouchSensor for reliable drag-and-drop on mobile
  • Responsive typography and spacing in Setup/Solver panels
  • Max viewport bounds prevent bounce and double-tap zoom on iOS

Infra / Docs

  • Docs folder reorganized: docs/ARCHITECTURE.md, CHANGELOG.md, DECISIONS.md, DESIGN_SYSTEM.md, MASTER_PLAN.md, TODO.md
  • DEVELOPMENT_AND_RELEASES.md updated with full release pipeline details
  • CLAUDE.md updated to match current stack and patterns
  • Release workflow (release.yml) updated

Test plan

  • npm run typecheck passes with no errors
  • npm run test passes
  • npm run lint passes
  • Dev server launches and board renders correctly in 2D and 3D mode
  • Solver produces a path and the path overlay renders on the board
  • Board photo scan modal opens and processes an image
  • Move history dialog opens and shows mini-board snapshots
  • Welcome guide appears on a fresh (no localStorage) load
  • Dark mode toggle applies theme consistently across tiles, panels, and header
  • Mobile layout (< 768px): bottom sheet peek/expand works, touch drag-and-drop works
  • Tablet layout (768px–1024px): two-column layout appears

🤖 Generated with Claude Code

JLeshnick and others added 21 commits July 23, 2026 20:09
…stic beveled block aesthetics and remove unused dashboard widgets
…st Tray Wrapper, and add Neumorphic 2D shadows
…ing, and fully apply Brutalist theme to panel card widgets
…lish

- Fix corner tile SVG arc sweep flags (elbow pieces now render correctly)
- Apply neo-brutalism-card/app-surface to all modals, panels, dialogs, toast, tooltips
- Add brutalist variant to buttonVariants CVA; update base Card and DialogContent defaults
- Remove orphaned panel.tsx/panel-variants.ts and dead .shadow-neumorphic CSS
- Remove background radial gradient and blur-blob glow artifacts from App.tsx
- Remove gradient text and animate-pulse from AppHeader branding
- Remove internal DialogTrigger from SettingsDialog (eliminated duplicate settings button)
- Fix all SetupPanel buttons (Start Game, Randomize, Scan, Reset, player toggles)
- Fix SolverPanel buttons (Slide In, Cancel, Execute, Go Home, 1-move targets)
- Step nav buttons converted to brutalist bordered style
- Replace per-segment SVG lines with continuous polyline path overlay + animated marching dashes
- Remove glowing cell ring shadows; replace with clean ring-inset highlights
- Pushed-out tile preview fully opaque with brutalist border
- Replace emoji treasure display with compact text banner across tile bottom
- Add TREASURE_SHORT_NAMES and PAWN_COLOR_HEX to constants.ts
- Consolidate pawn colors; fix non-standard red-650/red-750 Tailwind stops
- Remove home corner R/G/B/Y letter badge from tiles
- Slim solver suggestions panel: remove idle arrow-hint banner, shrink heading
- Direct Route label only shown for single-turn solutions; multi-turn shows Multi-Turn Route
- Go Home button always shows same label; disabled/grayed when pawn is already home
- Solver solution cards made more compact (removed verbose pawn-moves text)
- Fix duplicate Settings button; AppHeader icon buttons deduplicated via iconBtnCls constant
- Remove dead animate-pulse-border, dash-crawl keyframes and shadow-theme-glow utility

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…t path overlay, animated path underline, slower path crawl

- Tile dark mode bg: stone-800 -> stone-900 so tiles read dark against the near-black board background
- Lock badge: replace rounded-full soft shadow-md with rounded-md border-2 border-stone-950 shadow-[2px_2px_0_0_#000000] matching brutalist language
- Path overlay lines: add opacity 0.45/0.70 so treasure name banners beneath stay readable
- Path underline polyline: add animate-path-crawl so both lines march together (no more static black + moving color)
- Path crawl speed: 0.6s -> 1.8s for a more relaxed pace

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Replace dark: Tailwind prefix (never fired — app uses data-theme, not .dark class) with:
  - bg-card for standard tile background (--card: #1b1917 dark / #ffffff light)
  - tile-corridor-fill CSS class in index.css using [data-theme="dark"] selector for SVG corridor fill
- Drop redundant dark: variants from corner tile color classes
- Grid gap: gap-0.5/xs:gap-1/md:gap-1.5 -> gap-px/xs:gap-0.5/md:gap-1 (tighter spacing, saves ~8px per side on mobile)
- Tile DraggableTile sizing: w-[90%] h-[90%] -> w-full h-full (fills cell fully, no wasted inset margin)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…oard

AppHeader:
- Remove Compass icon button from top-left branding
- Remove subtitle line (Web Edition / Play phase / tile count)
- Timer extracted as standalone brutalist badge next to step nav; shows ⏸/⏱ with elapsed time
- Pawn score pills replaced with brutalist chips: pawn color background, black border + hard shadow, active state elevated
- Dividers and gaps tightened; toolbar gaps reduced from gap-2 to gap-1.5
- Removed Compass import; cleaned up unused imports

Board:
- Cell highlight rings replaced with CSS outline (outline-2/outline-[3px]) — outline paints in overlay layer above box-shadows, fixing rings rendering behind tile drop shadows

App.tsx:
- Board flex ratio: md:flex-[1.4] lg:flex-[1.5] → md:flex-[1.6] lg:flex-[1.8]
- Desktop board max-w: calc(100svh-150px) → calc(100svh-120px) — tiles ~15% larger on desktop

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Board grid (play mode):
- Replace grid-cols-9/grid-rows-9 equal columns with custom gridTemplateColumns/Rows:
  "0.4fr repeat(7, 1fr) 0.4fr" — arrow slots take 0.4fr instead of 1fr, so the
  7 tile columns occupy ~89% of the board vs ~78% previously. Tiles are visibly
  larger in play mode, matching the edit-layout scale.

Cell highlight border:
- Remove ring/outline classes from cell (both render behind tile box-shadows)
- Add a pointer-events-none z-40 overlay div after the tile in DOM order with
  border-2/border-[3px] classes — paints above box-shadow correctly for
  isOnHoveredPath, isCustomTarget, isActiveTarget, and isOver states

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…in settings, styled tooltips, hover fix

Board:
- SVG path viewBox 0 0 9 9 -> 0 0 7.8 7.8; tile centers cx(c)=c+0.9/cy(r)=r+0.9
  to match the 0.4fr repeat(7,1fr) 0.4fr grid — path overlay now aligns with tiles

AppHeader:
- Compass icon button removed; title is now a neo-brutalism-card <a> tag linking to GitHub repo
- Timer folded into the active Play Game step button as an inline mono badge (⏸/⏱ elapsed)
- 3D View button removed from toolbar (moved to Settings Experimental section)
- iconBtnCls hover: changed from hover:bg-stone-100 (white, obscures icon) to
  hover:bg-stone-200 hover:text-stone-950 — dark background, icon becomes visible dark on light
- All native title="" tooltips replaced with styled <Tooltip> components (neo-brutalism-card)
- Mute button: removed text-theme-primary tint from Volume2 icon so hover color is consistent

SettingsDialog:
- Add is3D/onToggle3D props
- New "Experimental" section in Preferences tab with 3D Isometric View toggle

Tooltip component:
- New src/components/ui/tooltip.tsx: group-hover invisible->visible overlay div,
  app-dialog-panel neo-brutalism-card, supports top/bottom/left/right sides

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Path SVG alignment:
- Move SVG out of gapped grid div into tray wrapper as absolute-positioned sibling
- Use viewBox="0 0 100 100" preserveAspectRatio="none" with percentage coords
- Tile center pct(i) = (i + 0.9) / 7.8 * 100 — eliminates gap math entirely,
  SVG coords now map exactly to tile centers regardless of gap size
- All stroke widths, dash arrays, and marker sizes also expressed in pct units

Highlight borders:
- Add isPathStart / isPathEnd back to BoardSpaceProps and render loop
- rounded-lg -> rounded-2xl to match tile shape
- Start tile: border-[3px] border-green-400
- End tile:   border-[3px] border-theme-primary
- Mid path:   border-2 border-theme-primary/60 (subtle, doesn't compete with markers)
- Custom target / active target: border-[3px] distinct colors as before

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Path overlay:
- Revert viewBox to "0 0 7.8 7.8" with tc(i)=i+0.9 coords — preserveAspectRatio="xMidYMid meet"
  keeps the SVG square and correctly centered over the grid regardless of 3D padding
- strokeDasharray/strokeWidth back to simple literal values matching the keyframe's -0.6 offset
- Animation speed: 1.8s -> 0.9s (the 100-unit viewBox made 1.8s look static; 7.8 viewBox needs ~0.9s)

Pushed tile:
- Move out of the grid (where it sat in a 0.4fr arrow cell and shrank) into the tray wrapper
  as position:absolute, sized to one tile cell (1/7.8 * 100% of tray) and placed just
  outside the board edge — matches the tile grid visually at full tile size
- Remove now-unused gridRow/gridColumn variables

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… smaller arrows

- Revert to grid-cols-9/grid-rows-9 equal columns (removes all fr-fraction math)
- SVG path overlay back inside the grid div, viewBox "0 0 9 9", tc(i)=i+1.5 (proven correct)
- Pushed tile back to gridRow/gridColumn placement in the 9×9 grid — sits in a
  proper 1fr cell at full tile size, no clipping
- Arrow buttons: max-w-[85%] max-h-[85%] -> max-w-[70%] max-h-[70%] so they read
  smaller than tiles visually without changing the column fractions
- Animation speed: 0.9s (keeps correct pace with 7.8-unit dash cycle in 9-unit viewBox)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@JLeshnick
JLeshnick merged commit 81a5cb5 into main Jul 24, 2026
2 checks passed
@JLeshnick
JLeshnick deleted the feat/modernization-v2 branch July 24, 2026 20:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant