b6619ef53b
- app.go: App struct with stub bindings (RunCheck/StartEngine/
StopEngine/GetStatus/Version) — emits check:result, check:done,
engine:status, stats:update events. Real backend lands in Phase 1.
- run.go: wails.Run() with frameless 480x640 fixed window, Classic
dark bg matching theme.
- embed.go: //go:embed all:frontend/dist for the Vite build output.
- frontend/: Vite + React project derived from `wails init -t react`.
Removed default template assets and wired Classic variant from
docs/design/v2/.
- components/Classic.jsx: variant 1 with custom title bar
(drag region, sun/moon theme toggle, min/close hooked to
Wails WindowMinimise/Quit).
- components/shared.jsx: useDrover hook adapted to call Wails
bindings and listen on backend events instead of mock SCENARIOS.
Added IconSun + IconMoon for the title-bar toggle.
- App.jsx: owns mode state, wraps setMode in
document.startViewTransition so the title-bar toggle gives a
circle-reveal sweep from the cursor.
- style.css: clean reset (overflow hidden, no scrollbars, brand
background) — replaces the wails-react-template defaults.
- wailsjs/go/gui/App.js: hand-written bindings since our App
struct lives in package gui rather than the standard top-level
main; `wails generate module` would have written package main
bindings here.
- build/: standard wails artifacts (icon, manifest); will be
consumed by `wails build` once we wire it through CI.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
32 lines
1.2 KiB
React
32 lines
1.2 KiB
React
import * as React from 'react'
|
|
import ClassicWindow from './components/Classic.jsx'
|
|
|
|
// Wails sizes the host window itself (internal/gui/run.go). Classic renders
|
|
// 100% of that surface; we own the mode state here so the title-bar toggle
|
|
// in Classic can flip between dark and light without re-mounting.
|
|
//
|
|
// onToggleMode receives the click event so we can plant a circle-reveal
|
|
// origin at the cursor position. The View Transitions API (Chromium 111+,
|
|
// Edge / WebView2 included) snapshots the old DOM, swaps to the new one
|
|
// after setMode commits, and animates between them. Fallback path just
|
|
// flips the mode synchronously when the API is missing.
|
|
export default function App() {
|
|
const [mode, setMode] = React.useState('dark')
|
|
|
|
function onToggleMode(e) {
|
|
const x = e?.clientX ?? window.innerWidth - 24
|
|
const y = e?.clientY ?? 16
|
|
document.documentElement.style.setProperty('--reveal-x', x + 'px')
|
|
document.documentElement.style.setProperty('--reveal-y', y + 'px')
|
|
|
|
const flip = () => setMode(m => (m === 'dark' ? 'light' : 'dark'))
|
|
if (document.startViewTransition) {
|
|
document.startViewTransition(flip)
|
|
} else {
|
|
flip()
|
|
}
|
|
}
|
|
|
|
return <ClassicWindow mode={mode} onToggleMode={onToggleMode} />
|
|
}
|