Platforms
Desktop and mobile first — same Go module; the web is a compile target too.
One Go codebase, one design language: lotusui embeds its font and paints a consistent interface on every target, down to the typography. Desktop and mobile are the product focus; the web is the same module compiled to WebAssembly when you want a browser build. The platform decides input (pointer or touch) and packaging, nothing else. The few places where a platform genuinely differs are called out across this site with badges like the ones above.
Desktop macOS Windows Linux
A first-class home for lotusui apps. Hover affordances (row pills, button shades, pointer cursors) do their best work here, and on macOS the seamless window gives native edge-to-edge chrome — no title bar, traffic lights kept. Windows and Linux run with standard decorations.
Mobile Android iOS
Touch-ready by construction: the theme's tap targets default to a 44dp
finger size, scrolling (Scrollable, ListView) is native touch scrolling, and text input goes
through the platform IME. Hover states simply never fire — and that's safe by design, because
in lotusui hover is always an affordance, never the only signal: selection and
active states are explicit props (active, Value, Sel),
so nothing becomes unreachable without a pointer.
Web WASM
The same Go module reaches the browser via WebAssembly — a real shipping
target, not a separate port, and how this documentation site shows live demos. Build with
GOOS=js GOARCH=wasm, one gallery bundle for every Preview. The binary embeds its
fonts (roughly 13 MB raw, a fraction over the wire compressed); each docs Preview is a
gallery iframe addressed by URL hash (loading="lazy" so off-screen
examples boot on demand).
GOOS=js GOARCH=wasm go build -ldflags="-s -w" -o app.wasm .
# serve with wasm_exec.js from $(go env GOROOT)/lib/wasm/
# and a <div id="giowindow"> for the canvas host
What's platform-specific in the API
Almost nothing. The one platform-gated symbol is
MakeSeamlessWindow, which exists only on macOS (behind a build tag) — call it from
a small main_darwin.go and every other target compiles cleanly without it.
Everything else in the library builds on every target.