Components
A component is a physical object type on the table — a meeple, a card,
a die, a wooden cube. One entry describes one type; count says how many
physical copies of it exist. taybl never spawns, scores, or removes
components on its own: players pick them up and move them by hand, exactly
as at a real table.
Every component has a kind — the discriminant that decides which extra
fields it carries:
- Piece (
kind: piece) — meeples, minis, pawns, markers. - Card (
kind: card) — anything that flips between a front and a shared back. - Die (
kind: die) — a randomiser with two or more faces. - Token (
kind: token) — chips, cubes, coins, counters.
Pick the kind by what the object is at the table, not by what it does in the rules — a "resource cube" is a token, a "hero figure" is a piece, even if the rulebook treats them similarly.
How to edit in the Studio
Open your game → Layout tab. Click a component on the table to open the component inspector on the right. There you set the Name, Quantity, the Per player toggle, Behaviors, and the kind-specific extras. Front and back art are set through the face slots (upload or replace inline). Cards are also grouped into decks from the separate Decks tab — see decks.
To add a new type, use Add component in the Layout toolbar; to retire one
without deleting it, toggle hidden (below).
Fields shared by every kind
| Field | Values | Default | What it does |
|---|---|---|---|
kind | piece card die token | — | The discriminant; picks the kind-specific fields |
id | lowercase snake_case | — | Unique id, referenced by setup and zones |
name | text | — | Human label shown in the inspector and hover preview |
faces | FaceBinding per side | .optional() (required on card) | Art bindings — see shapes, behaviors & value bindings and below |
size | { w, h, thickness } mm | .optional() | Real-world dimensions in millimetres. Absent → sized from the host zone box (whose fitContents scales the contents to the box — see layout) |
count | integer ≥ 1 | 1 | How many physical copies of this type exist |
perSeat | true | .optional() | When set, count applies per seated player |
properties | record of string / number / boolean | .optional() | Free-form data tags (suit, faction, point value) — never enforced |
hidden | true | .optional() | Skip this type during setup and hide it from pickers. The type stays in the GDL so flipping it back re-enables it |
Face bindings
Art is bound through a FaceBinding — faces.front and faces.back. A
binding is format-agnostic: { image } for the current 2D renderer,
{ model } reserved for a future 3D renderer, { color } as a flat-colour
fallback or tint. Components reference assets by id only, so adding 3D
later is purely additive.
| Field | Values | Default | What it does |
|---|---|---|---|
image | asset id | .optional() | 2D sprite, drawn by the current renderer |
model | asset id | .optional() | 3D model id, reserved for a future renderer |
color | colour string | .optional() | Flat-colour fallback / tint when no art is bound |
Related
- Pieces —
kind: piece - Cards —
kind: card - Dice —
kind: die - Tokens —
kind: token - Shapes, behaviors & value bindings —
shape,footprint,behaviors,valueBinding,attachable - Decks — grouping cards into a deck
- Uploading assets — where face art comes from