← Interface components

UI.Shape

luastra/ui
UI.Shape(input: Input): Node

Draws a bounded host-native geometric figure with explicit size, fill, outline, corner radius, label, and optional motion. It avoids shipping an image for simple scalable artwork.

Mental model

This is a declarative node: app.render describes it again from current state, while the host matches its stable id to the existing view.

Before you use it

Add luastra/ui to this module's dependencies in luastra.json, then import it with require("luastra/ui"). The project must declare the ui.render capability. app.render must return one UI.Screen root; place this node inside that tree rather than invoking it for a hidden side effect.

How it fits

The constructor validates its fields immediately and returns a UI.Node. After app.render returns, the host reconciles that node by stable id with the current semantic DOM-based interface. Current desktop and mobile hosts package the same web artifact; native adapters are used at capability boundaries.

When to use it

Use UI.Shape for rectangles, circles, polygons, stars, outlines, and colored card faces. Use UI.Image when the visual contains texture or detail that geometry cannot represent.

Shared parameter groups

visuallabelmotion

Parameters

ParameterType / valuesDescription
idlowercase path, requiredUnique ID.
shapesupported shape, requiredShape geometry.
widthnumber 1…4096, requiredWidth in CSS pixels.
heightnumber 1…4096, requiredHeight in CSS pixels.
marginnone | xs | sm | md | lg | xlAll-side outer spacing. Group: Layout and surfaces.
marginX / marginYnone | xs | sm | md | lg | xlAxis-specific outer spacing. Group: Layout and surfaces.
marginTop / marginBottom / marginStart / marginEndnone | xs | sm | md | lg | xlLogical side-specific outer spacing. Group: Layout and surfaces.
classNamesafe string ≤ 256 bytesAdditional admitted class tokens. Group: Layout and surfaces.
labelstringAccessible name. Group: State and semantics.
hiddenbooleanVisibility state. Group: State and semantics.
motion{ [property]: Tween | Sequence }Opacity, rotation, scale, and translation channels. Group: Events and motion.
width / height1…4096CSS-pixel size. Group: Image, Shape, and FlipCard.
cornerRadius0…2048Corner radius. Group: Image, Shape, and FlipCard.
fill / stroketoken | #RRGGBBFill and outline. Group: Image, Shape, and FlipCard.
strokeWidth0…64Outline thickness. Group: Image, Shape, and FlipCard.

Children and layout

This component does not accept arbitrary child nodes; named parameters provide its content.

Accessibility and keyboard

A stable id, logical render-tree order, and visible labels preserve predictable keyboard and screen-reader navigation.

Common mistakes

  • Using Shape as a button and losing button semantics.
  • Omitting the required width and height.

Returns

Node — a validated declarative UI node that becomes part of the next host-neutral render tree.

What happens next

A validated declarative node appears after it is returned as part of the current render tree.

Failures and fixes

Invalid fields, duplicate IDs, unsupported child combinations, or a missing ui.render capability fail during check, render-tree validation, or host startup.

Availability

Source API in 0.5.0-alpha; the public installer targets 0.5.0-alpha. Verify host-specific behavior against the selected SDK.

Focused example

UI.Shape {
    id = "status/star",
    shape = "star",
    width = 96,
    height = 96,
    fill = "warning",
    stroke = "accent",
    strokeWidth = 2,
    label = "Achievement",
}

Continue learning

Prerequisites

UI.Image

Companions

UI.TextUI.CodeUI.CodeBlock

Complete inventory

View all pages in Interface components
← Previous: UI.LayerNext: UI.TextInput →