> responsive layout, Container nodes (VBox/HBox/Grid/Margin) for automatic arrangement, Theme resources for consistent styling, and keyboard/gamepad focus navigation. Use when laying out a HUD, menu, or UI in a Godot project, working with Control/Container nodes, anchors, themes, or focus in a .tscn.
npx skills add https://github.com/gamedev-skills/awesome-gamedev-agent-skills --skill godot-ui-control
Lay out responsive UI with Control anchors and Container nodes, style it with a
Theme, and make it navigable by keyboard and gamepad. Targets Godot 4.3+.
Control-derived nodes; arranging UI that adapts to window size; theming; or wiring
focus navigation for controller/keyboard.
When *not* to use: in-world 2D nodes (Node2D/sprites) → godot-nodes-scenes;
animating UI transitions → godot-animation (Tween); genre UIs like card hands →
card-game/visual-novel. For full input rebinding → input-systems.
Control nodes for UI, not Node2D. Controls have a rect (position + size),anchors, and participate in focus/theming.
Control's edges stick to. Use the editor's Layout presets (Top-Left, Full Rect,
Center, etc.) instead of hand-placing pixels.
VBoxContainer,HBoxContainer, GridContainer, MarginContainer, etc. — the container sets their
position/size; you control flow with size_flags. Don't set child anchors inside a
container (it overrides them).
Theme. Assign a Theme resource on a top Control; children inheritit. Override per-node with theme overrides only when necessary.
control and define neighbors or rely on auto-neighbor.
pressed, toggled, text_submitted, value_changed).extends Control
func _ready() -> void:
# Stretch this panel to fill its parent (equivalent to the "Full Rect" preset).
anchors_preset = Control.PRESET_FULL_RECT
# Or set anchors manually: all four edges at the parent's far corners.
# anchor_left = 0; anchor_top = 0; anchor_right = 1; anchor_bottom = 1
extends VBoxContainer # children stack vertically, auto-sized
func _ready() -> void:
for child in get_children():
if child is Button:
child.pressed.connect(_on_button_pressed.bind(child.name))
# Give the first button focus so a gamepad can navigate immediately.
if get_child_count() > 0:
(get_child(0) as Control).grab_focus()
func _on_button_pressed(which: StringName) -> void:
match which:
"PlayButton": get_tree().change_scene_to_file("res://game.tscn")
"QuitButton": get_tree().quit()
# In a HBoxContainer: a label on the left, a spacer that eats remaining width.
func _ready() -> void:
$Label.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN
$Spacer.size_flags_horizontal = Control.SIZE_EXPAND_FILL # grows to fill
func _ready() -> void:
# Per-node overrides: use add_theme_* (type-specific setters).
$Title.add_theme_font_size_override("font_size", 32)
$Title.add_theme_color_override("font_color", Color.GOLD)
$Panel.add_theme_stylebox_override("panel", preload("res://ui/panel.stylebox.tres"))
Container cannot set its ownposition/anchors — the container owns layout. To free-place, take the node out of the
container or use a plain Control/PanelContainer wrapper.
from the anchored point. Set anchors via presets, then nudge with offsets. Setting only
position while anchors are at 0 makes UI not scale with the window.
Node2D for UI. Buttons/labels parented under a Node2D won't theme or take focuscorrectly. Keep UI under a CanvasLayer/Control subtree.
grab_focus() on an initial control and ensure focus_mode is not FOCUS_NONE.
Theme resource styles a whole subtree; add_theme_*overrides one node. Overusing per-node overrides defeats centralized theming.
rect_* properties are renamed. Godot 3's rect_size/rect_position/rect_min_sizeare now size/position/custom_minimum_size in 4.x.
mouse_filter on a full-rect Control can swallow clicks meant for nodes beneath it;set MOUSE_FILTER_IGNORE on purely decorative panels.
resources, focus neighbor wiring, and CanvasLayer for HUDs, read
references/layout-and-theming.md.
game-ui-ux — cross-engine UI/UX: responsive scaling, safe areas, focus navigation, screen flow.godot-animation — Tween-based UI transitions and juicing.godot-signals-groups — connecting UI events to game logic.input-systems — rebindable input and multi-device focus.card-game / visual-novel — UI-heavy genre templates.Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.
Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.
Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling
Use Expo DOM components to run web code in a webview on native and as-is on web. Migrate web code to native incrementally.
Take gamedev-skills/godot-ui-control from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.