ui-basics is a skill from the Summer skill library: a guide your AI agent reads when the task matches, so it builds the good version on the first try. Build UI: HUDs, menus, health bars, dialogue boxes, Control trees, anchors, containers and themes.
When your agent uses it
- Building Summer Engine UI: HUDs, main menus, pause menus, health bars, progress bars, dialogue boxes, or any Control-node tree
- Laying out a pause menu, settings screen, or inventory panel with anchors and containers so it stays responsive
- “add a pause menu” / “add a settings screen” / “add an options menu” / “add a main menu”
Install
summer setup installs every skill for your agent. To add only this one:
claude-code for your agent, such as codex or cursor. See Skills for every option.
The skill
Build menus and HUDs using Summer Engine Control nodes. Follow these patterns for layout, buttons, and responsive design.Control Hierarchy
Use containers for layout, then add content nodes:Common Containers
Basic Menu
A menu is a dozen nodes: build it in onesummer_run_script call (one undo
step), never as a chain of summer_add_node / summer_set_prop calls.
add_theme_constant_override as above. set_anchors_and_offsets_preset pins
a Control the way the editor’s layout menu does.
HUD (Health Bar)
value and max_value for the fill. Update value from a script when health changes.
Anchors Preset
Common preset values in the current Summer Engine UI API:
Set via
summer_set_prop(scenePath, path, key="anchors_preset", value="15").
Connecting Buttons
Wire thepressed signal to a handler:
scenePath is required on every scene tool in this skill
(summer_run_script, summer_set_prop, summer_connect_signal,
summer_save_scene); the examples use res://main.tscn. A call without it is
rejected before it reaches the engine.
The receiver node must have a script with func _on_start_pressed() -> void:.
Property Reference
Responsive Layout
For UI that scales with window size:- Use
anchors_presetto anchor to corners or edges - Use
size_flags_horizontalandsize_flags_verticalon children (SIZE_EXPAND_FILL, etc.) - MarginContainer with percentage-based margins (may need theme or script)
Text, fonts and symbols
The default font only has letters, digits and common punctuation. Anything else renders as an empty box with a hex code in it (for example a box reading25 B2 for ▲, or 25 C0 for ◀), and on the web there is no system font to fall back to.
- Never put emoji or Unicode symbols in Label, Button or RichTextLabel text: arrows (▲ ▼ ◀ ▶ ← →), stars, hearts, check marks, music notes, keycap symbols. Write the words instead (“Up”, “Next”), or show an icon.
- Draw icons as nodes: a TextureRect with a small texture, a Polygon2D triangle for arrows, or a
_draw()shape. Key prompts are a rounded StyleBoxFlat panel with the key’s letter in it. - If the game really needs symbols or another script (Japanese, Arabic, Cyrillic), add a font file that contains them: import a TTF/OTF that covers the characters, set it as the theme’s default font, and add it to the fallbacks of any other font you use.
- Never use
SystemFontfor text players see on iPhone or Android, not even as a fallback: in the Summer Games app on iPhone it has no system fonts and draws every glyph as a box, while desktop looks fine. Import a TTF/OTF into the project, and fall back toThemeDB.fallback_font. If you load font bytes withFileAccessinstead, the file must be in the pack (release-readinesscheck 8). - After adding text, take one screenshot and look for boxes with hex codes; fix any you find before moving on.
Fallback (no MCP — edit .tscn directly)
If Summer MCP isn’t connected, write the menu hierarchy by hand:
Collaborative protocol
This skill writes UI scene nodes and wires button signals. Always ask before applying: “May I add the MainMenu (Control + Margin + VBox + Title + Start/Quit buttons) and connect Start.pressed to_on_start_pressed?”.
From a shell
No Summer MCP tools in this session? Run each one as a command; whensummer --version is missing or below 4.0, use npx -y summer-engine@latest in place of summer. Fields are flags in kebab-case (--scene-path res://main.tscn) or one --input '<json>', and summer ops describe <op> prints the exact input. The summer-cli skill has the rest.
Source:
library/skills/ui-basics/SKILL.md, rendered from summer-engine@4.3.0 on npm.
