Sheets
A sheet (kind: sheet) is a component players write on instead of
moving around: a Yahtzee score card, a D&D character sheet, a Clue detective
notepad, the per-hand score pad for Hearts or Farkle. Reach for a sheet
whenever the real-world component is a piece of paper with blanks on it.
Everything else on the table is an object you pick up and put down. A sheet is the opposite: it mostly stays where it is and what changes is the writing on it. Click the pad and it opens large, at a size you can actually type into — that is the gesture that matters. (You can still drag it: grab the paper rather than a cell. You rarely need to.) Each copy keeps its own values, so a per-seat score pad gives every player their own.
A new sheet is playable the moment you create it. Unlike every other kind, a pad gets a home of its own automatically — a zone whose pads live in the felt toolbar’s Sheets card rather than on the table — so you need touch neither zones nor setup to put a score pad in front of your players. You can still give a pad a spot on the felt when it belongs there; see where a pad lives below.
The two halves of a sheet
A sheet is deliberately split in two, and this is the thing to understand before you author one:
statBlockholds the blanks. Every writable cell on a sheet is an ordinary declared stat — the samestatBlockused for a creature card’s HP and Attack. Each entry gives the cell itskey, itslabel, itsinitialvalue, and itstype:number,bar(a number with a/maxprinted beside it),text, ortogglefor a checkbox. See shapes, behaviors & value bindings.sheetholds the layout. It says how those keys are printed — the title, the column headers, and the ordered rows with their gutter labels, or, in free layout, the rectangle each field occupies. It carries no values at all and taybl’s engine never reads it, exactly like a card’s composedcardFace.
The Studio’s sheet builder writes both halves together, so adding a row also creates its stat. You only need to think about the split when hand-editing GDL.
Where a pad lives
A component is only ever on the table because a setup placement puts it in a zone. That is a fair ask for a card or a meeple — you place them deliberately — but a pad you cannot find is a pad nobody fills in, so a sheet is the one kind taybl homes for you. Create a sheet — from Add component, from the inspector’s Create component panel (what you get with nothing selected), by converting an unplaced component to a sheet, or by asking Pip for one — and taybl mints its zone, its layout box, and the setup placement that puts a pad in it, all in the same edit.
That zone is a zone like any other, except for its
placement: sheets — meaning render in the felt’s Sheets card, and
nowhere on the table. It needs no position and no size (its box is required
by the schema but never read, which is why its Position & size section
says so and offers nothing to set). Players reach the pad from the toolbar.
The Sheet card in the inspector then asks the one question that actually changes the game — Who gets a pad?:
| Option | What it builds | Reach for it when |
|---|---|---|
| One shared pad | A shared zone, view: public — the default a new sheet is given | One pad for the table: a Yahtzee card everyone writes on, a running score |
| One per player — public | scope: perSeat, view: public | Everyone keeps their own pad and anyone may read all of them — a per-player score column, a public character sheet |
| One per player — private | scope: perSeat, view: owner | Only its owner may read it — a Clue detective notepad, a hidden bid sheet |
| No pad | Nothing — the sheet is marked hidden, so its placement is skipped at setup | A pad you are still designing, or one you have switched off for now |
The first three are one choice that rewrites the zone, its box, and the setup placement together, because those three have to agree (a per-seat zone must be placed in seat-local space, and its placement must say per-seat). A shared pad is deliberately never offered as private: a shared zone has no owner, so “owner only” would hide it from everybody. Where the pad renders is not part of the answer — a pad on the table stays on the table and just changes hands. A sheet you have hand-placed into several zones is edited through the first of them.
No pad is the off switch, and it is deliberately not a delete. It sets the
component’s hidden flag, which makes setup skip its placement — so no pad is
dealt and none appears in the Sheets card, while the zone, its box, its
placement and the whole printed layout stay exactly as you left them. Pick any
other answer and the pad comes back as it was. It is also what a sheet with no
home at all reads as: both mean "no pad reaches the table", so there is one
answer for both rather than a separate dead-end state, and picking One shared
pad gives a homeless pad its home in a single click.
If a pad belongs on the felt — a big score card in the middle of the table — place it there as you would any component, or switch its zone’s Renders in to Table surface. (Creating a sheet from a zone’s own New component… does it up front: the pad goes into that zone rather than getting a home of its own.) It then appears in both places: drawn on the felt and listed in the Sheets card, which lists every pad you may read whatever its placement. A pad on the table wants room to print its rows, so give it a plain zone of its own or an open play area; one squeezed onto a single grid cell will still draw, but nothing about it is designed for one.
How to edit in the Studio
Open your game → Layout tab → Add component and pick Sheet. You get
a usable starter pad — two rounds and a Total row under one Score column —
to rename into whatever you need. Select the sheet and the component inspector
grows a Sheet card. It opens with a live preview of the pad, drawn by the
same renderer the table uses, so the pad you arrange is the pad players get; it
redraws as you type. The preview’s cells are deliberately not writable — it
is a picture of the pad, not the pad, and a value belongs to a copy at the table,
not to the design (starting values are the initial in Stats).
The preview is a thumbnail, and the inspector column has nowhere else to go — so Open pad editor, just below it, opens the same pad full-screen with the same controls beside it. Reach for it whenever you are arranging rather than typing: placing fields on a free-layout pad is drag-and-resize work, and doing it at a few hundred pixels is the wrong size for the job. Nothing changes but the room you have — the cells stay un-writable there too. Escape, the ×, or a click on the dimmed background closes it.
Below the preview sit Who gets a pad? — the one control that edits the pad’s home rather than the pad — and then the pad itself:
| Control | What it writes |
|---|---|
| Shape | size — Portrait or Landscape. Turning the pad swaps its width and height rather than resetting them, so turning it twice gives you exactly what you started with. See portrait or landscape |
| Layout | sheet.layout — Rows (the default) prints a labelled row per field; Free lets you put each field where you like. Switching either way keeps your work — see free layout |
| Title | sheet.title. Leave it empty and the pad prints the component’s name |
| Ink | sheet.accentColor — the colour of the rules and headers |
| Columns | sheet.columns, Rows layout only. The first header simply names the column the rows already have; every header after that adds a cell to every field row — that is the Yahtzee case, a column per game |
| Rows / Fields | sheet.rows, in order — titled Rows in Rows layout and Fields in Free, where it is the only list. Drag a row by its grip to reorder it — an insertion bar shows where it will land — or step it with the ▲/▼ buttons, which stay the keyboard path. Each row also has an inline label, a type (Number, Bar, Text, Toggle), and a delete button; in Free each one carries its placement control too. Below the list, a New field box adds a row, and in Rows layout + Add section heading adds a labelled rule that holds no value |
Reordering either way moves the printed row and keeps its fields with it, and the preview follows immediately — that is the point of having it, since row order is the one thing you cannot judge from a list of controls.
Every one of those controls writes both halves in one edit. Add a row and it creates the printed row and one property per column behind it; delete a row and those properties go with it; add a column and each field row gains a cell and a property. You never maintain two lists by hand, and the two can never drift apart.
Renaming is the case to understand. Renaming a row or a column relabels its
properties but never rewrites their keys — a key is the address a written
value lives at, so you can retitle a pad mid-game without losing a single
figure anyone has entered. For the same reason, the one thing to avoid is
renaming a key by hand in the Stats section: the cell pointing at the old
key goes blank. That kind-agnostic Stats list is otherwise the advanced view
of the very same fields — go there for a starting value, an icon, or min /
max hints the pad’s compact controls don’t expose.
The editor caps a pad at 8 columns, and its field count depends on which layout it is in — because a "row" means two different things. In Rows the cap is 40, which is about where a printed grid stops being legible however big the pad is drawn. In Free nothing is printed as a grid — every field is a box you placed — so the cap is 200, enough for a real form: a Yahtzee card is 13 categories × 6 games = 78 blanks. Past either, split the pad into two sheets. (A Free pad with more than 40 fields will still switch back to Rows; it just prints them cramped, and the card says so before you do it.)
Change type… converts a component to or from a sheet. Converting to a sheet lays each existing property out as its own row, reusing the keys so anything already written stays addressable — and if that component wasn’t placed anywhere, it is given a pad’s home on the way in, exactly as a new sheet is. (One that was already placed keeps the spot it had.) Converting a sheet away discards the printed layout for good, but keeps the fields as ordinary properties.
Switch Layout to Free and this card changes shape: Columns and
+ Add section heading go away (Free prints neither), and the Rows list
becomes a Fields list with each field’s placement folded into its own row.
That is covered in free layout below. The one cell detail with
no control anywhere is span (a cell widened across columns) — it survives
every edit above untouched, so hand-authored spans are safe to mix with builder
edits.
Pip can author a pad too — ask it for "a score pad with a row per hand" and
it declares the blanks in statBlock and the printed layout in sheet, or adds
a whole kind: sheet component from scratch, homed in the Sheets card just as
the editor’s own create paths do.
Sheet fields
| Field | Values | Default | What it does |
|---|---|---|---|
kind | sheet | — | Marks this component as a sheet |
sheet | { title?, columns?, accentColor?, layout?, rows } | required | The printed layout — see below |
faces | { front?, back? } bindings | .optional() | Optional scan of the real sheet as background art (front), plus the pad’s reverse (back) — real art for a real back, drawn whenever a player turns the pad over |
A sheet shares the rest of its fields with every kind — see
components overview. Two of those shared fields
are worth setting deliberately: size fixes the pad’s proportions — and, since
a pad wider than it is tall is a landscape pad, its orientation too (see
portrait or landscape); a sheet with no size and no
scan is drawn as letter portrait, roughly 8.5 × 11. And statBlock — as
above — is where its blanks actually live.
Portrait or landscape
Plenty of real pads are wider than they are tall: a per-hand tally strip, a cribbage board, a wide stat block. The Sheet card’s Shape control turns the pad between Portrait and Landscape, and the whole table follows — the preview, the pad on the felt, and the pad a player picks up.
There is no orientation field. A pad’s size already says which way up it is:
width greater than height is landscape, and every surface that draws a pad
derives its box from that ratio. So Shape is a friendlier way to write
size, the same value the Fixed size card takes exact numbers for and the
same one Pip edits. Turning the pad swaps the two numbers, which is why a
pad you have tuned to 150 × 210 becomes 210 × 150 rather than being reset, and
why turning it twice is a no-op. A scan still outranks both: a pad with
faces.front art takes its aspect from the image, so scan a landscape form and
the pad is landscape whatever size says.
Two things worth doing after you turn a pad:
- If the pad sits on the felt, turn its zone box too. The pad’s footprint and the zone box it lives in are separate numbers, so a landscape pad in a portrait box is drawn letterboxed inside it. A pad homed in the Sheets card needs nothing — that zone’s box is never read.
- Look at the printed rows. In Rows layout taybl prints the label gutter as a share of the pad’s width and narrows it as the pad widens, so a wide pad gives its value cells the room instead of its labels. A pad with many rows and little height is still a cramped pad; that is a sign it wants Free layout, or fewer rows.
Inside sheet
| Field | Values | Default | What it does |
|---|---|---|---|
title | text | the component’s name | Printed at the top of the pad (a scan carries its own masthead, so art suppresses it) |
columns | list of headers | one unheaded column | One value cell per column per row — Yahtzee’s six games, a card game’s per-hand tally. Drawn in flow layout only |
accentColor | CSS colour | — | Rule and header ink |
layout | flow, free | flow | How the fields are positioned: flow prints them as labelled rows, free puts each one at its own box — see free layout .optional() |
rows | list of rows (at least one) | required | The printed rows, in order |
Each row is { label?, heading?, cells? }. A label prints in the left
gutter (Full House, Strength) — and in free layout it is the caption
drawn above the field’s box, since a free-form field is one row with one cell.
A row with heading: true and no cells is a section break — it breaks a long
pad into readable blocks without holding a value (flow only; free layout has
no row grid for a heading to divide). Otherwise cells lists the writable
cells, left to right.
Each cell is { key, span?, box?, hideLabel? }. The key points at the
statBlock entry this cell reads and writes — that is where its type and
starting value live. span widens a cell across columns in flow. box is
its { x, y, w, h } rectangle as fractions of the face, read only in free
layout, and hideLabel suppresses the row label above it — for a pad whose
artwork already prints that caption. Both are covered in
free layout below.
Filling a sheet at the table
Pick the pad up first. A pad printed at its true physical size — a sheet of paper on a table a metre and a half wide — draws cells only a few pixels tall, so clicking the paper opens it in a large panel over the felt, about four-fifths of the screen, where the cells are comfortable to type in and the − / + steppers have room to reappear. It is the same pad, fully live, not a preview. Zooming the table in on a pad also works, but "zoom the whole table to write one number" is the wrong gesture — physically you pick the pad up.
Escape, the ×, or a click on the dimmed felt puts it back down, and closing saves the cell you were half-way through. A press that travels drags the pad instead of opening it, so nudging a pad and opening it never collide. When the game isn’t active the open pad says so and stays read-only.
Three ways in, because the paper itself isn’t always easy to hit — and a pad homed in the Sheets card isn’t on the felt at all:
| Route | Reach for it when |
|---|---|
| Click the pad | It is on the table in front of you, and face-up |
| The felt toolbar’s Sheets button | Always works. Reach for it when the pad lives in the Sheets card, or is off-screen, buried under a piece, or parked in front of a seat you aren’t sitting behind — see below |
| Open, from the pad’s row in its zone’s container inspector | The pad is face-down — a face-down pad isn’t clickable, since it is showing its back. Right-click the pad (or its zone) to get the inspector, then use Open on the pad’s row |
Opening a face-down pad doesn’t show a blank sheet of paper: you get a short card explaining that the pad is face-down, with a Turn face-up button to flip it over and start writing (greyed out until the game is active).
The Sheets list
The felt’s top-left table tools toolbar carries a fourth button — Sheets — in any game that has a pad at all; games without one never show it. It lists every pad you are allowed to read, split into Mine (the pads in zones you own) and The table’s (everything else in view), each row naming the pad, its zone, whose seat it belongs to, and whether it is currently face-down. Click a row and the pad opens. A pad you may not read is simply not in the list — the same redaction that keeps its writing off your screen keeps it out of here, so the launcher can never become a peephole.
The list is where a placement: sheets pad lives, but it is not only for
those: it enumerates every readable pad whatever its placement, so a score card
sitting on the felt appears here too.
Playing solo — or previewing your own game, where one person drives every seat — every seat’s pad reads as Mine, because they all are. Each still carries its seat’s name, since that is the only thing telling one player’s pad from another’s.
Notes and Sheets take turns. Both dock in the same spot beside the toolbar, so opening one closes the other; the pen and the ruler stay armed either way.
Writing in a cell
Click any cell and type. A number or bar cell is a typed field, flanked by
− and + steppers whenever the row is tall enough to hold them (which is
why the opened pad has them and the on-table one often doesn’t); a text cell
is a short input; a toggle cell is a checkbox. Typing commits a moment
after you stop (or on Enter / clicking away), so a burst of typing is one
save rather than one per keystroke. The value belongs to that copy of the
sheet and reaches everyone allowed to see it, so a table can watch a score card
fill in live. Emptying a cell clears it rather than writing 0 — a pad
distinguishes "not scored yet" from "scored nothing".
taybl never totals a sheet. A Total row is a cell you fill in yourself,
exactly as on paper. This is the same principle as everywhere else in taybl:
the table holds the components and the players apply the rules. The
rules sidebar is the authority on how a score is
worked out. See handling components for the
player-side gestures.
A cell whose key names no statBlock entry is drawn as a dashed, un-writable
blank rather than breaking the pad — a half-authored sheet still lays out, so
you can see what is missing and add the field.
Who can see a sheet
A sheet obeys the same visibility rules as every other component — it is the zone that decides, not the sheet. This one choice is what separates a public score card from a private notepad:
- Put the sheet in a public zone and the whole table reads it as it fills in. This is a Yahtzee card or a shared score pad.
- Put it in a
view: ownerzone (usually withscope: perSeat, one pad each) and only its owner can read it. This is a Clue detective notepad — other players see that a pad is there, but none of its writing reaches them.
For an auto-homed pad you don’t set those by hand: that is exactly what Who gets a pad? writes for you.
See zone visibility and
zone scope. A pad also flips like anything else on the
table — Flip sits on the pad’s row in its zone’s container inspector,
exactly as for a card, since every
kind but a die turns over. A face-down pad shows nothing but its faces.back
(or a plain generic back), so turning one over mid-game is a way to hide what you
have written without moving it. That makes faces.back worth authoring when the
real sheet has a genuine reverse — a character sheet’s second page, a scoring
reference printed on the back of the pad. One nuance: the hover hotkeys skip a
face-up pad on purpose (its cells are typing fields, so F would flip the pad
you are filling in) — use the menu.
A pad starts face-up wherever it is placed, even one with back art, because paper
goes down writable-side-up; if you want one to start turned over, use the zone’s
faceOnEnter or the setup placement’s facing.
Free layout
Not every pad is a grid of rows. A D&D stat block, a cribbage board, a character sheet with a portrait box in the corner — these are irregular by nature, and so is a scan of the real card you want to type onto. For those, set the Sheet card’s Layout to Free and each field becomes a rectangle you put wherever you like.
| Mode | What taybl draws |
|---|---|
Rows (layout: flow, the default) | taybl draws the pad: a title, the column headers, and one labelled row per field, ruled like a printed form |
Free (layout: free) | Each cell sits at its own box. Its row’s label prints just above the box unless the cell sets hideLabel. The title still prints; column headers and section headings don’t, since there is no row grid for them to head or divide |
Switching is reversible, and nothing jumps. Going to Free hands every
field the box it already occupies, so the pad you were looking at is the pad you
get — then you move what wants moving. Going back to Rows keeps every box
and simply drops the mode, so flipping forward again restores your placement
exactly. (Under Rows a box is kept but ignored; that is what makes the
round trip lossless.)
Placing a field
In Free the Sheet card drops the grid controls it no longer describes — there is no Columns section and no + Add section heading, since a free pad has no row grid for a column to head or a heading to divide (existing columns and headings are kept, and come back the moment you switch to Rows). The Rows list becomes Fields: one line per field, carrying its label, its type and its placement control together. You place fields by pointing and dragging, not by working out fractions — and this is the work Open pad editor exists for, since aiming a few-pixel handle inside a thumbnail is nobody’s idea of a good time. Everything below works identically in both places:
- Place arms a field; the next click on the pad drops it there, centred on where you clicked. at centre beside it is the no-aiming fallback — it drops the field in the middle for you to drag from.
- Drag a frame to move it. Click it — or Placed in the list, which is easier to hit than a frame a few pixels tall — to select it, and its eight handles appear; pull a corner or an edge to resize. Hold ⇧ on a corner to keep the field’s shape.
- Arrow keys nudge the selected frame a hair at a time (Shift for a coarser step), for the last bit of alignment.
- Edges soft-snap twice over: to the pad’s own halves and quarters, and to the edges and sizes of the other fields — so a column of blanks lines up down the page and two boxes come out the same width without measuring. Hold Alt while dragging to ignore every snap and land exactly where you want.
- Selecting a field also opens Left / Top / Width / Height as whole
percentages of the face, for precision a drag can’t reach, and a
Hide this field’s label toggle (
hideLabel). - remove, beside Placed, puts the field back in the unplaced list.
Duplicating one field into a grid
A printed form repeats the same blank dozens of times — a Yahtzee card is 13 categories × 6 games, 78 boxes, every one the same size. Placing those by hand is the wrong kind of work, so a selected field can lay itself out as the whole block: set Down and Across under Duplicate, and press the button.
Three things worth knowing about it:
- The counts are the finished grid, including the field you started from.
13 × 6gives you 78 fields, not 79. The button always names how many are new, so there is nothing to work out. - Copies tile edge to edge, at exactly the source box’s size. That is not a rough first pass to nudge afterwards: a ruled form’s cells share their borders, so a box sized to one printed cell steps precisely one cell at a time. Size the first box against the artwork and the rest land on the lines.
- Each copy keeps the original’s type and its label setting. The second one matters most: a field placed onto a scan has its caption hidden, and 77 copies that started printing labels would cover the form.
Both limits are shown rather than discovered. The Down and Across maxima
are how many copies fit before running off the paper, and if a grid would pass
the pad’s field cap the button says how many are left. Copies are numbered as a
series from the source’s label — Round 1 → Round 2, Round 3… — which only
has to be predictable, since on a scan they are never printed.
A label belongs to the row, not the cell — a free-form field is one row with
one cell, so the row’s label is its name and hideLabel only decides whether it
is printed. Hide it when the paper underneath already says “Strength”. (A pad
that had several columns before you switched keeps them: those cells share one
label, so they nest under it in the Fields list, tagged with the column that
minted them.)
You can mix the two modes on one pad. Any field you never place still prints, gathered as a plain list along the translucent foot of the pad — no rules, no columns, since a free pad has no grid to line them up on. That is the right place for a field the printed form doesn’t have (a house-rule column, a running total), and out of the way of everything you did place.
Working from a scan
If you have an image of the real sheet, bind it to faces.front and taybl draws
it beneath the fields. The scan lends the pad its aspect ratio and carries
its own masthead, so taybl stops printing the title over the top of it.
Combined with Free, that is how you type onto a real form: turn on free
layout, then drop each field onto its pre-printed blank.
A scan does not by itself make a pad free-form, and this is a change worth
knowing if you built a pad before: free placement used to be switched on by the
presence of art, which meant a box on an art-less pad was silently ignored and
an irregular pad you had no scan of couldn’t be built at all. layout now says
it directly. Art is only ever drawn behind the fields; layout alone decides
where they sit. The two are independent, and either is useful without the other.
One convenience does still key off the artwork: a field you place on a pad that has a scan starts with its label hidden, since the form has already printed its captions and taybl would otherwise draw every one of them twice. Untick Hide this field’s label for the blanks the form forgot to name.
Related
- Components overview — shared fields
- Shapes, behaviors & value bindings —
statBlock, which holds a sheet’s blanks - Zones —
placement: sheets, the home a new pad is given - Zone visibility — public score card vs private notepad
- Zone scope —
perSeat, for one pad per player - Handling components — opening a pad and filling a cell during play
- The inspector panel — where the Sheet builder lives
- Moving around the table — the felt toolbar’s Sheets button, and the personal note pads for anything the designer didn’t print