lotusui the ikaito design language for Gio — desktop, mobile, web
GitHub

Platforms

Desktop, mobile and web are compile targets, not ports.

DesktopMobileWeb

Gio renders every pixel itself, and lotusui embeds its font — so the same code produces the same interface on every target, down to the typography. There is one codebase and one design language; 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

The first-class home. 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 Gio's 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

WebAssembly is a first-class Gio target — every live demo on this site is lotusui compiled with GOOS=js GOARCH=wasm, one bundle for the whole gallery. The binary embeds its fonts (roughly 13 MB raw, a fraction over the wire compressed), so ship ONE app bundle, lazy-load it below the fold, and address states by URL hash the way this site's iframes do.

sh
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 Gio to attach to

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, like Gio's own AppKitViewEvent) — 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.

Every demo on this site is the real Go component compiled to WebAssembly — one gallery app, one bundle, addressed by URL hash.