You are being asked to build something, not to play. This skill routes you to the reference material for making an interface that looks like Structs and a client that behaves like one.
Everything below is verified against structs-webapp, the flagship client — not inferred from the API surface. When a doc and that codebase disagree, the codebase wins.
Not this skill? If you want to build structs — the in-game machines — that is
structs-building. If you want to
use the Desktop MCP tools, that is TOOLS.md.
| Decision | Guidance |
|---|---|
| UI or client? | Visuals → the SUI pages. Chain, events, work → the client pages. Most real projects need both |
| Scaling model | The game renders at scale(2) above 1152px. At 1× SUI is half size. Settle this before writing markup — retrofitting is painful. ui/ |
| Which SUI JS | Import each class directly with .js. Never import SUI.js outside a bundler — it has an extensionless import that 404s and takes the module down. ui/runtime |
| Serving assets | SUI’s URLs are root-absolute. From a subpath, every icon vanishes silently. Serve at root or rewrite. ui/gotchas |
| Extend or build fresh | Adding to Structs Desktop is usually cheaper than a new app. client/desktop-extensions |
border-radius: 0.And one that saves an hour: never invent an icon. There are 67 glyph icons and 29 sprite icons. If the concept has no glyph, use a text label — no emoji, no inline SVG.
Interface — develop/ui/
| Need | Page |
|---|---|
| Colours, spacing, z-index, type | tokens |
| The two icon inventories | icons |
| Markup contracts for every component | components |
| Steppers, tooltips, the drawer | runtime |
| Why the layout is broken | gotchas |
| Keeping a multi-page console coherent | patterns |
| Dashboard, form, menu, HUD, assembled | recipes |
| Runnable starter files | examples |
Client — develop/client/
| Need | Page |
|---|---|
| The three-channel architecture | index |
| State, factories, the string-number trap | state-and-data |
| Wallet, signing queue, charge gating | actions-and-signing |
| Proof-of-work: hashing, difficulty, workers | work-and-pow |
| Real-time events and all 26 listeners | realtime-grass |
| PFP compositing, struct art, Lottie | rendering-entities |
| Ambits, tiles, fog of war | map |
| Adding an MCP tool or board page | desktop-extensions |
Context — repos (which repository to read, and which wins) · frontend-architecture (the webapp’s MVVM layer) · maintenance (how these pages stay true)
document.fonts.check('16px Structicons') first, always.body { text-align: center } is inherited by everything;
only eleven rules re-assert left. Left-align data surfaces explicitly.min-width: auto is the default. word-break does
nothing about it — you need min-width: 0.--text-body.
Four CSS rules fix it; they are in
sui-patch.css.--from-input-height-content and
sui-message-system-model-frame-center are the real names.account sequence mismatch. Serialise — one in
flight, one per block. Don’t track sequence numbers.currentBlock - (lastActionBlock + 1). Hold the queue until
the confirmed last-action height has loaded, or the client will think it has infinite
charge and empty its queue into one block.label.sui-input-text; checkbox container is a <div>tabular-nums on numeric cells, min-width: 0 on flex items with long textFull checklist: ui/patterns.