DocsComponents

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:

  1. statBlock holds the blanks. Every writable cell on a sheet is an ordinary declared stat — the same statBlock used for a creature card’s HP and Attack. Each entry gives the cell its key, its label, its initial value, and its type: number, bar (a number with a /max printed beside it), text, or toggle for a checkbox. See shapes, behaviors & value bindings.
  2. sheet holds 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 composed cardFace.

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?:

OptionWhat it buildsReach for it when
One shared padA shared zone, view: public — the default a new sheet is givenOne pad for the table: a Yahtzee card everyone writes on, a running score
One per player — publicscope: perSeat, view: publicEveryone keeps their own pad and anyone may read all of them — a per-player score column, a public character sheet
One per player — privatescope: perSeat, view: ownerOnly its owner may read it — a Clue detective notepad, a hidden bid sheet
No padNothing — the sheet is marked hidden, so its placement is skipped at setupA 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:

ControlWhat it writes
ShapesizePortrait 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
Layoutsheet.layoutRows (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
Titlesheet.title. Leave it empty and the pad prints the component’s name
Inksheet.accentColor — the colour of the rules and headers
Columnssheet.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 / Fieldssheet.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

FieldValuesDefaultWhat it does
kindsheetMarks this component as a sheet
sheet{ title?, columns?, accentColor?, layout?, rows }requiredThe 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

FieldValuesDefaultWhat it does
titletextthe component’s namePrinted at the top of the pad (a scan carries its own masthead, so art suppresses it)
columnslist of headersone unheaded columnOne value cell per column per row — Yahtzee’s six games, a card game’s per-hand tally. Drawn in flow layout only
accentColorCSS colourRule and header ink
layoutflow, freeflowHow the fields are positioned: flow prints them as labelled rows, free puts each one at its own box — see free layout .optional()
rowslist of rows (at least one)requiredThe 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:

RouteReach for it when
Click the padIt is on the table in front of you, and face-up
The felt toolbar’s Sheets buttonAlways 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 inspectorThe 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: owner zone (usually with scope: 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 tableFlip 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.

ModeWhat 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 × 6 gives 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 1Round 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.

Sign in to ask Pip about building games.
Sign in