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

Changelog

Every release, every API change — written so an agent can migrate from it alone.

Changelog

This changelog is written for the AI agents that develop the apps consuming lotusui. From the next release on, it records every API-visible change — created, updated, renamed, removed — with exact symbols, old→new forms, and replacement guidance, precise enough to migrate a consuming app from this document alone. There is deliberately no migrate tool: read the entries for the versions you crossed, apply them, then run go build ./... until clean — the compiler is the safety net. lotusui update prints the relevant sections when upgrading vendored components.

Format: Keep a Changelog sections, SemVer versions (Go modules enforce it). Until v1.0.0 breaking changes may land in minor versions; each will be recorded here in full.

[Unreleased]

Nothing yet.

[0.1.0] - 2026-08-02

The initial release: the ikaito design language for Gio (gioui.org) — desktop, mobile and web from one Go codebase.

Components

Component vocabulary and docs anatomy follow the conventions the web settled on; the color engine is lotusui's own.

  • Button — variants ButtonDefault/Secondary/Destructive/Outline/ Ghost/Link; icon-only and with-icon; Rounded pill form; loading (spinner or LoadingText); disabled; 1dp press nudge; focus ring.
  • BadgeBadgeDefault/Secondary/Destructive/Outline/Ghost; Icon; raw Bg/Fg status pairs.
  • Input — variants outline/subtle/flushed; Filter/Transform input mechanisms; Error; Start/End slots; suffix addon.
  • Field — label, helper, error, required, around any control.
  • Checkbox — indeterminate, invalid, disabled.
  • Switch — animated on the shared clock; invalid, disabled.
  • Select — floating panel on the portal primitive; Groups with labels and separators; check-marked selection; scrollable (7-row cap) opening aligned to the selection; placeholder; invalid.
  • TabsTabsDefault (muted well, raised active tab), TabsLine, TabsSubtle; Vertical; Icons; per-tab Disabled; the explicit Update-before-Sel contract.
  • Dialog — full-window scrim, width presets per size, entrance motion (Appear()), Escape/backdrop dismissal via onClose, corner ✕ (suppress with HideClose).
  • DropdownMenuDropdownMenuItem, DropdownMenuItemIcon, DropdownMenuShortcutItem, DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator.
  • CardCardOutline/Elevated/Subtle, size-scaled padding, equal-height rows via Min.Y; the image and edge-to-edge patterns documented.
  • Accordion, Alert (+Action, Color), AlertDialog, Avatar, Breadcrumb, Pagination, Popover, Progress, RadioGroup, Separator, Skeleton (+SkeletonCircle), Slider, Spinner, Table, Textarea, Toast/Toaster, Toggle/ToggleGroup, Tooltip — each with live per-example docs and an API table.
  • DropdownMenuTrigger — the anchored floating menu (close on selection/outside/Escape; KeepOpen for checkbox/radio menus).
  • One surface grammar: borders never change with elevation; resting surfaces carry the 1dp seat, floating layers the full shadow.
  • Strictly monotonic size ladders 2XS→2XL, pinned by a test.
  • Extensions beyond the usual web catalogs: Grid (spans, auto-flow), SimpleGrid (responsive columns, equal-height rows), Split + VSlide (the carousel motion grammar), Stack (VStack/HStack), ListView (virtualized; Scrollable, HoverRow), plus the page/layout utilities.
  • Floating — the portal primitive (end-of-frame layer on Gio's op.Defer): escapes parent clips, paints above everything, wins hit-testing. Select's panel is built on it.

Sizing and color

  • Shared Size enum: Size2XS…Size2XL, SizeMD default, one meaning across every component.
  • Semantic Palette tokens in paired fill/ink slots; Scheme with interaction steps (.500 base → .600 hover → .700 pressed); ColorScale C50–C900 with ten stock scales and ScaleFrom(anchor); per-instance Color ColorScale on Button/Badge — one anchor in, the whole ladder out. Precedence: Scheme > Color > the variant's role scheme.
  • DefaultDarkPalette — dark mode is a palette: NewTheme(WithPalette(lotusui.DefaultDarkPalette)).
  • Theme construction: NewTheme(WithPalette/WithRadius/WithSpace/ WithTextSize/WithFaces) — everything resolves once, nothing per frame.

Tooling (go run github.com/ikaito-com/lotusui/cmd/lotusui …)

  • add / update — the ownership model: vendor a component's source into the app (exported core identifiers auto-qualified, unexported helpers carried into a CLI-owned companion); update with a true three-way merge (base reconstructed from the Go module cache).
  • registry — generates registry.json, the build-time catalog for the CLI and AI agents (never read by app code at runtime).
  • skills — installs the agent skill files into .claude/skills/.
  • icons — Iconify fetch + normalization + typed constants; theme — palette generation from an anchor or theme.json, with WCAG contrast checks; verify — offline drift checks (icons, theme, API baseline, registry); api — the exported-API baseline; init — app scaffold; release — the version ritual.
  • First block: login-form (registry/blocks/login).

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