> ## Documentation Index
> Fetch the complete documentation index at: https://dev.polltheroom.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Document and widgets

> Every step, every widget, every property, every look and what stops a poll going on stage. Generated from the code that enforces it.

<Note>
  This page is generated from the API's own reference at [`/llms-full.txt`](https://test.polltheroom.com/llms-full.txt) by `scripts/developers-sync.mjs`. Edit the spec, not this page.
</Note>

## The deck document

A deck is a JSON array of steps, at most 200. The first step is always the join screen. Steps count from 0, so the join screen is step 0 and the first slide is step 1; a person reading the editor's filmstrip counts from 1, so their "slide 6" is step 5. A slide step is a page (or a blank) with things floating on it: up to 4 polls, 8 text boxes, 8 shapes and 4 images. A poll step is one poll filling the screen. Positions are fractions of the slide, 0 to 1. A bare array is document version 1.

### Step: join

| property | type                        | required | meaning                                      |
| -------- | --------------------------- | -------- | -------------------------------------------- |
| `id`     | string, up to 64 characters | no       | Stable id. Omit it and the server makes one. |
| `kind`   | "join"                      | yes      |                                              |

### Step: slide

| property    | type                                                                                                           | required | meaning                                                   |
| ----------- | -------------------------------------------------------------------------------------------------------------- | -------- | --------------------------------------------------------- |
| `id`        | string, up to 64 characters                                                                                    | no       | Stable id. Omit it and the server makes one.              |
| `kind`      | "slide"                                                                                                        | yes      |                                                           |
| `pageIndex` | integer 0 to 199, or null                                                                                      | yes      | The uploaded page behind the slide; null is a blank slide |
| `overlays`  | list of object (id, poll, rect, style, z, locked, prevRect), up to 4                                           | yes      |                                                           |
| `texts`     | list of object (id, text, rect, z, style), up to 8                                                             | no       |                                                           |
| `shapes`    | list of object (id, rect, z, style, prevRect), up to 8                                                         | no       |                                                           |
| `images`    | list of object (id, rect, z, dataUrl, fit, shadow, outline, outlineColor, radius, prevRect, original), up to 4 | no       |                                                           |
| `notes`     | string, up to 2000 characters                                                                                  | no       | Presenter-only speaker notes                              |

### Step: poll

| property | type                                                                                                                                                                                                                                                                                                                                                                                                                   | required | meaning                                      |
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------- |
| `id`     | string, up to 64 characters                                                                                                                                                                                                                                                                                                                                                                                            | no       | Stable id. Omit it and the server makes one. |
| `kind`   | "poll"                                                                                                                                                                                                                                                                                                                                                                                                                 | yes      |                                              |
| `poll`   | object (type, prompt, timeLimitSec, options, multiSelect, correctIndex, quizView, optionImages, groups, targets, estimateMin, estimateMax, answer, dimensions, moderated, wheelSource, wheelNames, place, placeTheme, refs, accent, colorMode, optionColors, showPercent, showCount, mcStyle, imgStyle, totStyle, rankStyle, hpStyle, scaleStyle, npsStyle, estStyle, wcStyle, ofStyle, qaStyle, mapStyle, roundsMode) | yes      |                                              |
| `notes`  | string, up to 2000 characters                                                                                                                                                                                                                                                                                                                                                                                          | no       | Presenter-only speaker notes                 |

### Overlay (a poll floating on a slide)

| property   | type                                                                                                                                                                                                                                                                                                                                                                                                                   | required | meaning                                                 |
| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------- |
| `id`       | string, up to 64 characters                                                                                                                                                                                                                                                                                                                                                                                            | no       | Stable id. Omit it and the server makes one.            |
| `poll`     | object (type, prompt, timeLimitSec, options, multiSelect, correctIndex, quizView, optionImages, groups, targets, estimateMin, estimateMax, answer, dimensions, moderated, wheelSource, wheelNames, place, placeTheme, refs, accent, colorMode, optionColors, showPercent, showCount, mcStyle, imgStyle, totStyle, rankStyle, hpStyle, scaleStyle, npsStyle, estStyle, wcStyle, ofStyle, qaStyle, mapStyle, roundsMode) | yes      |                                                         |
| `rect`     | object (x, y, w, h)                                                                                                                                                                                                                                                                                                                                                                                                    | no       | Where the card sits; left out, the bottom-right quarter |
| `style`    | object (variant, accent, background, radius, shadow, outline, outlineColor, showPercent, showCount, showJoin, rotation, colorMode, optionColors, showTitle, titleFont, titleSize, titleColor, titleBold, titleAlign, textFont)                                                                                                                                                                                         | no       | How the card is drawn; left out, the house default      |
| `z`        | number                                                                                                                                                                                                                                                                                                                                                                                                                 | no       | Stacking order among the slide's elements               |
| `locked`   | true or false                                                                                                                                                                                                                                                                                                                                                                                                          | no       |                                                         |
| `prevRect` | object (x, y, w, h)                                                                                                                                                                                                                                                                                                                                                                                                    | no       | The size to restore after the full-page toggle          |

Any widget can float on a slide. Put the card over a screenshot, a picture or empty space, never over the slide's own text; when the corner you had in mind holds text, take the one with the picture, and when the whole slide is text, use a full-screen poll step instead. A card lower than a fifth of the slide has no room for its answers. The card must stay on the slide, `x + w` and `y + h` at most 1, and the API refuses one that does not. Leave `rect` and `style` out for the house card in the bottom-right quarter. The card's `variant` is read by multiple choice; the other widgets draw their own look.

### Overlay card style

| property       | type                                                       | required | meaning                                     |
| -------------- | ---------------------------------------------------------- | -------- | ------------------------------------------- |
| `variant`      | one of bars, columns, donut, pie                           | no       | The chart drawn on the card                 |
| `accent`       | string matching the hex pattern                            | no       |                                             |
| `background`   | "transparent" or string matching the hex pattern           | no       | The card colour, or transparent for none    |
| `radius`       | integer 0 to 32                                            | no       |                                             |
| `shadow`       | true or false                                              | no       |                                             |
| `outline`      | true or false                                              | no       |                                             |
| `outlineColor` | string matching the hex pattern                            | no       |                                             |
| `showPercent`  | true or false                                              | no       |                                             |
| `showCount`    | true or false                                              | no       |                                             |
| `showJoin`     | true or false                                              | no       | Print the join code on the card             |
| `rotation`     | number -180 to 180                                         | no       | Degrees                                     |
| `colorMode`    | one of match, palette                                      | no       |                                             |
| `optionColors` | list of string matching the hex pattern, or null, up to 10 | no       | A colour per option; null follows colorMode |
| `showTitle`    | true or false                                              | no       | Default true                                |
| `titleFont`    | string, up to 80 characters                                | no       | A font key from the library                 |
| `titleSize`    | number 1 to 20                                             | no       | cqw                                         |
| `titleColor`   | string matching the hex pattern                            | no       |                                             |
| `titleBold`    | true or false                                              | no       | Default true                                |
| `titleAlign`   | one of left, center, right                                 | no       |                                             |
| `textFont`     | string, up to 80 characters                                | no       |                                             |

### Text box

| property | type                                    | required | meaning                                      |
| -------- | --------------------------------------- | -------- | -------------------------------------------- |
| `id`     | string, up to 64 characters             | no       | Stable id. Omit it and the server makes one. |
| `text`   | string, up to 300 characters            | yes      |                                              |
| `rect`   | object (x, y, w, h)                     | yes      |                                              |
| `z`      | number                                  | no       | Stacking order among the slide's elements    |
| `style`  | object (size, color, bold, align, font) | yes      |                                              |

### Shape

| property   | type                                                                 | required | meaning                                      |
| ---------- | -------------------------------------------------------------------- | -------- | -------------------------------------------- |
| `id`       | string, up to 64 characters                                          | no       | Stable id. Omit it and the server makes one. |
| `rect`     | object (x, y, w, h)                                                  | yes      |                                              |
| `z`        | number                                                               | no       | Stacking order among the slide's elements    |
| `style`    | object (shape, fill, opacity, radius, shadow, outline, outlineColor) | yes      |                                              |
| `prevRect` | object (x, y, w, h)                                                  | no       |                                              |

### Image

| property       | type                                                       | required | meaning                                                |
| -------------- | ---------------------------------------------------------- | -------- | ------------------------------------------------------ |
| `id`           | string, up to 64 characters                                | no       | Stable id. Omit it and the server makes one.           |
| `rect`         | object (x, y, w, h)                                        | yes      |                                                        |
| `z`            | number                                                     | no       | Stacking order among the slide's elements              |
| `dataUrl`      | string, up to 12000000 characters matching the hex pattern | yes      |                                                        |
| `fit`          | one of cover, contain                                      | no       | Fill the frame (crop overflow) or show the whole image |
| `shadow`       | true or false                                              | no       |                                                        |
| `outline`      | true or false                                              | no       |                                                        |
| `outlineColor` | string matching the hex pattern                            | no       |                                                        |
| `radius`       | integer 0 to 48                                            | no       | Corner rounding in px                                  |
| `prevRect`     | object (x, y, w, h)                                        | no       |                                                        |
| `original`     | object (dataUrl, rect)                                     | no       | The pre-crop copy, for Reset                           |

### Rect

| property | type             | required | meaning |
| -------- | ---------------- | -------- | ------- |
| `x`      | number 0 to 1    | yes      |         |
| `y`      | number 0 to 1    | yes      |         |
| `w`      | number 0.02 to 1 | yes      |         |
| `h`      | number 0.02 to 1 | yes      |         |

## Widgets

Every poll has a `type`, a `prompt` and, where it takes answers, `options`. The tables list only the properties that type reads; anything else is dropped on save. A look is chosen per widget; the first is the default. **To present** lists what the readiness check asks for before a room can start; a deck can be saved without it. The API runs the check for you: reading a deck answers with `ready` and `problems`, and so does every write, each problem naming the step, the card and the property.

### Multiple choice (`multiple-choice`)

One question, up to ten answers; one pick each, or several with multiSelect. A quiz is this with a correctIndex.

| property       | type                                                                 | required | meaning                                                                                                                               |
| -------------- | -------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `type`         | "multiple-choice"                                                    | yes      |                                                                                                                                       |
| `prompt`       | string, up to 140 characters                                         | yes      | The question, as it reads on screen                                                                                                   |
| `timeLimitSec` | integer 5 to 600, or null                                            | no       | Seconds people get to answer; null means no countdown                                                                                 |
| `options`      | list of string, up to 80 characters, up to 10                        | yes      | The answers to choose between, in order                                                                                               |
| `accent`       | string matching the hex pattern                                      | no       | The result's accent colour                                                                                                            |
| `colorMode`    | one of match, palette                                                | no       | Colour options as shades of the accent (match) or as distinct hues (palette)                                                          |
| `optionColors` | list of string matching the hex pattern, or null, up to 10           | no       | A colour per option; null follows colorMode                                                                                           |
| `showPercent`  | true or false                                                        | no       | Print percentages beside the answers                                                                                                  |
| `showCount`    | true or false                                                        | no       | Print vote counts beside the answers                                                                                                  |
| `multiSelect`  | true or false                                                        | no       | Let each person pick several options                                                                                                  |
| `correctIndex` | integer 0 to 9                                                       | no       | Quiz: the index in options of the answer that scores                                                                                  |
| `quizView`     | one of question, standings                                           | no       | Quiz: show the question, or the standings board                                                                                       |
| `mcStyle`      | one of bars, lollipops, bubbles, spokes, butterfly, heat, arc, chord | no       | Result style: bars, lollipops, bubbles, spokes, butterfly, heat, arc, chord. arc needs multiSelect true; chord needs multiSelect true |

**Looks** (`mcStyle`): bars (default), lollipops, bubbles, spokes, butterfly, heat, arc, chord. arc needs `multiSelect` true. chord needs `multiSelect` true.

**Can:** takes up to 10 options; its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`); options are coloured by identity, so a palette and a colour per option mean something; its full-screen result can print percentages (`showPercent`) and counts (`showCount`); as an overlay, the card can print percentages and counts (the card style's `showPercent`, `showCount`).

**To present:** Ask a question; At least two options.

### Image choice (`image-choice`)

Multiple choice where every answer is a picture.

| property       | type                                                                                | required | meaning                                                                      |
| -------------- | ----------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |
| `type`         | "image-choice"                                                                      | yes      |                                                                              |
| `prompt`       | string, up to 140 characters                                                        | yes      | The question, as it reads on screen                                          |
| `timeLimitSec` | integer 5 to 600, or null                                                           | no       | Seconds people get to answer; null means no countdown                        |
| `options`      | list of string, up to 80 characters, up to 10                                       | yes      | The answers to choose between, in order                                      |
| `accent`       | string matching the hex pattern                                                     | no       | The result's accent colour                                                   |
| `colorMode`    | one of match, palette                                                               | no       | Colour options as shades of the accent (match) or as distinct hues (palette) |
| `optionColors` | list of string matching the hex pattern, or null, up to 10                          | no       | A colour per option; null follows colorMode                                  |
| `showPercent`  | true or false                                                                       | no       | Print percentages beside the answers                                         |
| `showCount`    | true or false                                                                       | no       | Print vote counts beside the answers                                         |
| `optionImages` | list of string, up to 500000 characters matching the hex pattern, or null, up to 10 | no       | Image choice: an image per option as a data URL, null for none               |
| `imgStyle`     | one of tiles, mosaic, fill, hero                                                    | no       | Result style: tiles, mosaic, fill, hero                                      |

**Looks** (`imgStyle`): tiles (default), mosaic, fill, hero.

**Can:** takes up to 10 options; its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`); its full-screen result can print percentages (`showPercent`) and counts (`showCount`); as an overlay, the card can print percentages and counts (the card style's `showPercent`, `showCount`).

**To present:** Ask a question; At least two options.

### This or that (`this-or-that`)

Two sides, one tap.

| property       | type                                                       | required | meaning                                                                      |
| -------------- | ---------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |
| `type`         | "this-or-that"                                             | yes      |                                                                              |
| `prompt`       | string, up to 140 characters                               | yes      | The question, as it reads on screen                                          |
| `timeLimitSec` | integer 5 to 600, or null                                  | no       | Seconds people get to answer; null means no countdown                        |
| `options`      | list of string, up to 80 characters, up to 2               | yes      | The answers to choose between, in order                                      |
| `accent`       | string matching the hex pattern                            | no       | The result's accent colour                                                   |
| `colorMode`    | one of match, palette                                      | no       | Colour options as shades of the accent (match) or as distinct hues (palette) |
| `optionColors` | list of string matching the hex pattern, or null, up to 10 | no       | A colour per option; null follows colorMode                                  |
| `showPercent`  | true or false                                              | no       | Print percentages beside the answers                                         |
| `showCount`    | true or false                                              | no       | Print vote counts beside the answers                                         |
| `totStyle`     | one of split, tug, camps                                   | no       | Result style: split, tug, camps                                              |

**Looks** (`totStyle`): split (default), tug, camps.

**Can:** takes up to 2 options; its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`); options are coloured by identity, so a palette and a colour per option mean something; its full-screen result can print percentages (`showPercent`) and counts (`showCount`).

**To present:** Ask a question; At least two options.

### Ranking (`ranking`)

People put the options in order; the result is the room's order.

| property       | type                                                       | required | meaning                                                                      |
| -------------- | ---------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |
| `type`         | "ranking"                                                  | yes      |                                                                              |
| `prompt`       | string, up to 140 characters                               | yes      | The question, as it reads on screen                                          |
| `timeLimitSec` | integer 5 to 600, or null                                  | no       | Seconds people get to answer; null means no countdown                        |
| `options`      | list of string, up to 80 characters, up to 10              | yes      | The answers to choose between, in order                                      |
| `accent`       | string matching the hex pattern                            | no       | The result's accent colour                                                   |
| `colorMode`    | one of match, palette                                      | no       | Colour options as shades of the accent (match) or as distinct hues (palette) |
| `optionColors` | list of string matching the hex pattern, or null, up to 10 | no       | A colour per option; null follows colorMode                                  |
| `showPercent`  | true or false                                              | no       | Print percentages beside the answers                                         |
| `showCount`    | true or false                                              | no       | Print vote counts beside the answers                                         |
| `rankStyle`    | one of list, podium, avg                                   | no       | Result style: list, podium, avg                                              |

**Looks** (`rankStyle`): list (default), podium, avg.

**Can:** takes up to 10 options; its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`); options are coloured by identity, so a palette and a colour per option mean something; its full-screen result can print percentages (`showPercent`) and counts (`showCount`).

**To present:** Ask a question; At least two options.

### 100 points (`hundred-points`)

Everyone spends 100 points across the options.

| property       | type                                                                       | required | meaning                                                                           |
| -------------- | -------------------------------------------------------------------------- | -------- | --------------------------------------------------------------------------------- |
| `type`         | "hundred-points"                                                           | yes      |                                                                                   |
| `prompt`       | string, up to 140 characters                                               | yes      | The question, as it reads on screen                                               |
| `timeLimitSec` | integer 5 to 600, or null                                                  | no       | Seconds people get to answer; null means no countdown                             |
| `options`      | list of string, up to 80 characters, up to 10                              | yes      | The answers to choose between, in order                                           |
| `accent`       | string matching the hex pattern                                            | no       | The result's accent colour                                                        |
| `colorMode`    | one of match, palette                                                      | no       | Colour options as shades of the accent (match) or as distinct hues (palette)      |
| `optionColors` | list of string matching the hex pattern, or null, up to 10                 | no       | A colour per option; null follows colorMode                                       |
| `showPercent`  | true or false                                                              | no       | Print percentages beside the answers                                              |
| `showCount`    | true or false                                                              | no       | Print vote counts beside the answers                                              |
| `hpStyle`      | one of bars, treemap, waffle, columns, sunburst, marimekko, icicle, bullet | no       | Result style: bars, treemap, waffle, columns, sunburst, marimekko, icicle, bullet |
| `groups`       | list of string, up to 40 characters, up to 10                              | no       | 100 points: a parent group per option, for the nested looks                       |
| `targets`      | list of number 0 to 100, up to 10                                          | no       | 100 points: a target per option, for the bullet look                              |

**Looks** (`hpStyle`): bars (default), treemap, waffle, columns, sunburst, marimekko, icicle, bullet. sunburst, marimekko, icicle use `groups`, one entry per option. bullet use `targets`, one entry per option.

**Can:** takes up to 10 options; its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`); options are coloured by identity, so a palette and a colour per option mean something; its full-screen result can print percentages (`showPercent`) and counts (`showCount`).

**To present:** Ask a question; At least two options.

### Star rating (`rating`)

One to five stars.

| property       | type                                                       | required | meaning                                                                      |
| -------------- | ---------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |
| `type`         | "rating"                                                   | yes      |                                                                              |
| `prompt`       | string, up to 140 characters                               | yes      | The question, as it reads on screen                                          |
| `timeLimitSec` | integer 5 to 600, or null                                  | no       | Seconds people get to answer; null means no countdown                        |
| `accent`       | string matching the hex pattern                            | no       | The result's accent colour                                                   |
| `colorMode`    | one of match, palette                                      | no       | Colour options as shades of the accent (match) or as distinct hues (palette) |
| `optionColors` | list of string matching the hex pattern, or null, up to 10 | no       | A colour per option; null follows colorMode                                  |
| `showPercent`  | true or false                                              | no       | Print percentages beside the answers                                         |
| `showCount`    | true or false                                              | no       | Print vote counts beside the answers                                         |
| `scaleStyle`   | one of stars, faces, breakdown, gauge, curve, bloom        | no       | Style: stars, faces, breakdown, gauge, curve, bloom                          |

**Looks** (`scaleStyle`): stars (default), faces, breakdown, gauge, curve, bloom.

**Can:** its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`); its full-screen result can print counts (`showCount`); as an overlay, the card can print counts (the card style's `showPercent`, `showCount`).

**To present:** Ask a question.

### NPS 0–10 (`nps`)

How likely to recommend, 0 to 10, scored the NPS way.

| property       | type                                                       | required | meaning                                                                      |
| -------------- | ---------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |
| `type`         | "nps"                                                      | yes      |                                                                              |
| `prompt`       | string, up to 140 characters                               | yes      | The question, as it reads on screen                                          |
| `timeLimitSec` | integer 5 to 600, or null                                  | no       | Seconds people get to answer; null means no countdown                        |
| `accent`       | string matching the hex pattern                            | no       | The result's accent colour                                                   |
| `colorMode`    | one of match, palette                                      | no       | Colour options as shades of the accent (match) or as distinct hues (palette) |
| `optionColors` | list of string matching the hex pattern, or null, up to 10 | no       | A colour per option; null follows colorMode                                  |
| `showPercent`  | true or false                                              | no       | Print percentages beside the answers                                         |
| `showCount`    | true or false                                              | no       | Print vote counts beside the answers                                         |
| `npsStyle`     | one of score, needle, diverging, swarm                     | no       | Result style: score, needle, diverging, swarm                                |

**Looks** (`npsStyle`): score (default), needle, diverging, swarm.

**Can:** its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`).

**To present:** Ask a question.

### Estimate (`estimate`)

Everyone guesses a number inside a range; the real answer is revealed when the poll closes.

| property       | type                                                       | required | meaning                                                                      |
| -------------- | ---------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |
| `type`         | "estimate"                                                 | yes      |                                                                              |
| `prompt`       | string, up to 140 characters                               | yes      | The question, as it reads on screen                                          |
| `timeLimitSec` | integer 5 to 600, or null                                  | no       | Seconds people get to answer; null means no countdown                        |
| `accent`       | string matching the hex pattern                            | no       | The result's accent colour                                                   |
| `colorMode`    | one of match, palette                                      | no       | Colour options as shades of the accent (match) or as distinct hues (palette) |
| `optionColors` | list of string matching the hex pattern, or null, up to 10 | no       | A colour per option; null follows colorMode                                  |
| `showPercent`  | true or false                                              | no       | Print percentages beside the answers                                         |
| `showCount`    | true or false                                              | no       | Print vote counts beside the answers                                         |
| `estimateMin`  | number                                                     | no       | Estimate: the lowest guess allowed                                           |
| `estimateMax`  | number                                                     | no       | Estimate: the highest guess allowed                                          |
| `answer`       | number                                                     | no       | Estimate: the real answer, revealed when the poll closes                     |
| `estStyle`     | one of hist, curve, dots, range                            | no       | Result style: hist, curve, dots, range                                       |

**Looks** (`estStyle`): hist (default), curve, dots, range.

**Can:** its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`).

**To present:** Ask a question; Set the guess range.

### Radar (`radar`)

Three to eight axes rated 1 to 5, drawn as a radar.

| property       | type                                                       | required | meaning                                                                      |
| -------------- | ---------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |
| `type`         | "radar"                                                    | yes      |                                                                              |
| `prompt`       | string, up to 140 characters                               | yes      | The question, as it reads on screen                                          |
| `timeLimitSec` | integer 5 to 600, or null                                  | no       | Seconds people get to answer; null means no countdown                        |
| `accent`       | string matching the hex pattern                            | no       | The result's accent colour                                                   |
| `colorMode`    | one of match, palette                                      | no       | Colour options as shades of the accent (match) or as distinct hues (palette) |
| `optionColors` | list of string matching the hex pattern, or null, up to 10 | no       | A colour per option; null follows colorMode                                  |
| `showPercent`  | true or false                                              | no       | Print percentages beside the answers                                         |
| `showCount`    | true or false                                              | no       | Print vote counts beside the answers                                         |
| `dimensions`   | list of string, up to 40 characters, up to 8               | no       | Radar: the axes people rate 1 to 5, three to eight of them                   |

**Can:** its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`).

**To present:** Ask a question; At least three axes.

### Word cloud (`word-cloud`)

A word or a few per person, sized by how often they come up.

| property       | type                                                       | required | meaning                                                                      |
| -------------- | ---------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |
| `type`         | "word-cloud"                                               | yes      |                                                                              |
| `prompt`       | string, up to 140 characters                               | yes      | The question, as it reads on screen                                          |
| `timeLimitSec` | integer 5 to 600, or null                                  | no       | Seconds people get to answer; null means no countdown                        |
| `accent`       | string matching the hex pattern                            | no       | The result's accent colour                                                   |
| `colorMode`    | one of match, palette                                      | no       | Colour options as shades of the accent (match) or as distinct hues (palette) |
| `optionColors` | list of string matching the hex pattern, or null, up to 10 | no       | A colour per option; null follows colorMode                                  |
| `showPercent`  | true or false                                              | no       | Print percentages beside the answers                                         |
| `showCount`    | true or false                                              | no       | Print vote counts beside the answers                                         |
| `moderated`    | true or false                                              | no       | Hold submissions until the host approves them                                |
| `wcStyle`      | one of cloud, wordle, bubbles                              | no       | Result style: cloud, wordle, bubbles                                         |

**Looks** (`wcStyle`): cloud (default), wordle, bubbles.

**Can:** its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`); its full-screen result can print counts (`showCount`); as an overlay, the card can print counts (the card style's `showPercent`, `showCount`).

**To present:** Ask a question.

### Open feed (`open-feed`)

Free text from the room, shown as it arrives.

| property       | type                                                       | required | meaning                                                                      |
| -------------- | ---------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |
| `type`         | "open-feed"                                                | yes      |                                                                              |
| `prompt`       | string, up to 140 characters                               | yes      | The question, as it reads on screen                                          |
| `timeLimitSec` | integer 5 to 600, or null                                  | no       | Seconds people get to answer; null means no countdown                        |
| `accent`       | string matching the hex pattern                            | no       | The result's accent colour                                                   |
| `colorMode`    | one of match, palette                                      | no       | Colour options as shades of the accent (match) or as distinct hues (palette) |
| `optionColors` | list of string matching the hex pattern, or null, up to 10 | no       | A colour per option; null follows colorMode                                  |
| `showPercent`  | true or false                                              | no       | Print percentages beside the answers                                         |
| `showCount`    | true or false                                              | no       | Print vote counts beside the answers                                         |
| `moderated`    | true or false                                              | no       | Hold submissions until the host approves them                                |
| `ofStyle`      | one of feed, cards, bubbles                                | no       | Result style: feed, cards, bubbles                                           |

**Looks** (`ofStyle`): feed (default), cards, bubbles.

**Can:** its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`).

**To present:** Ask a question.

### Q\&A (`qa-upvotes`)

Questions from the room, upvoted to the top.

| property       | type                         | required | meaning                                               |
| -------------- | ---------------------------- | -------- | ----------------------------------------------------- |
| `type`         | "qa-upvotes"                 | yes      |                                                       |
| `prompt`       | string, up to 140 characters | yes      | The question, as it reads on screen                   |
| `timeLimitSec` | integer 5 to 600, or null    | no       | Seconds people get to answer; null means no countdown |
| `qaStyle`      | one of list, spotlight       | no       | Style: list, spotlight                                |

**Looks** (`qaStyle`): list (default), spotlight.

**To present:** Ask a question.

### Timer (`timer`)

A shared countdown on the big screen. Takes no answers.

| property       | type                         | required | meaning                                               |
| -------------- | ---------------------------- | -------- | ----------------------------------------------------- |
| `type`         | "timer"                      | yes      |                                                       |
| `prompt`       | string, up to 140 characters | yes      | The question, as it reads on screen                   |
| `timeLimitSec` | integer 5 to 600, or null    | no       | Seconds people get to answer; null means no countdown |

**To present:** Ask a question.

### Spin the wheel (`wheel`)

Spins between everyone in the room, or a custom list, and picks one.

| property       | type                                          | required | meaning                                                    |
| -------------- | --------------------------------------------- | -------- | ---------------------------------------------------------- |
| `type`         | "wheel"                                       | yes      |                                                            |
| `prompt`       | string, up to 140 characters                  | yes      | The question, as it reads on screen                        |
| `timeLimitSec` | integer 5 to 600, or null                     | no       | Seconds people get to answer; null means no countdown      |
| `wheelSource`  | one of participants, custom                   | no       | Wheel: spin between everyone in the room, or a custom list |
| `wheelNames`   | list of string, up to 40 characters, up to 20 | no       | Wheel: the custom names on the dial                        |

**Can:** options are coloured by identity, so a palette and a colour per option mean something.

**To present:** Ask a question; Add at least two names for the wheel.

### Live map (`map`)

Where people are joining from, on a fixed list of countries.

| property       | type                                                       | required | meaning                                                                      |
| -------------- | ---------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |
| `type`         | "map"                                                      | yes      |                                                                              |
| `prompt`       | string, up to 140 characters                               | yes      | The question, as it reads on screen                                          |
| `timeLimitSec` | integer 5 to 600, or null                                  | no       | Seconds people get to answer; null means no countdown                        |
| `accent`       | string matching the hex pattern                            | no       | The result's accent colour                                                   |
| `colorMode`    | one of match, palette                                      | no       | Colour options as shades of the accent (match) or as distinct hues (palette) |
| `optionColors` | list of string matching the hex pattern, or null, up to 10 | no       | A colour per option; null follows colorMode                                  |
| `showPercent`  | true or false                                              | no       | Print percentages beside the answers                                         |
| `showCount`    | true or false                                              | no       | Print vote counts beside the answers                                         |
| `mapStyle`     | one of pins, heat, bars                                    | no       | Style: pins, heat, bars                                                      |

**Looks** (`mapStyle`): pins (default), heat, bars.

**Can:** its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`).

**To present:** Ask a question.

### Place map (`place-map`)

A real map of one place; everyone drops a pin on it.

| property       | type                           | required | meaning                                               |
| -------------- | ------------------------------ | -------- | ----------------------------------------------------- |
| `type`         | "place-map"                    | yes      |                                                       |
| `prompt`       | string, up to 140 characters   | yes      | The question, as it reads on screen                   |
| `timeLimitSec` | integer 5 to 600, or null      | no       | Seconds people get to answer; null means no countdown |
| `place`        | object (label, lat, lon, zoom) | no       | Place map: the place people drop a pin on             |
| `placeTheme`   | one of standard, light, dark   | no       | Place map: the map tiles                              |

**To present:** Ask a question; Pick a place.

### Rounds (`rounds`)

Compares the results of earlier polls in the deck. Takes no answers.

| property       | type                                                       | required | meaning                                                                                  |
| -------------- | ---------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------- |
| `type`         | "rounds"                                                   | yes      |                                                                                          |
| `prompt`       | string, up to 140 characters                               | yes      | The question, as it reads on screen                                                      |
| `timeLimitSec` | integer 5 to 600, or null                                  | no       | Seconds people get to answer; null means no countdown                                    |
| `accent`       | string matching the hex pattern                            | no       | The result's accent colour                                                               |
| `colorMode`    | one of match, palette                                      | no       | Colour options as shades of the accent (match) or as distinct hues (palette)             |
| `optionColors` | list of string matching the hex pattern, or null, up to 10 | no       | A colour per option; null follows colorMode                                              |
| `showPercent`  | true or false                                              | no       | Print percentages beside the answers                                                     |
| `showCount`    | true or false                                              | no       | Print vote counts beside the answers                                                     |
| `roundsMode`   | one of bump, stream, slope, dumbbell                       | no       | Chart: bump, stream, slope, dumbbell                                                     |
| `refs`         | list of integer 0 to 199, up to 12                         | no       | Rounds: indexes of earlier poll steps to compare; empty means every poll before this one |

**Looks** (`roundsMode`): bump (default), stream, slope, dumbbell.

**Can:** its full-screen result has its own colour model (`accent`, `colorMode`, `optionColors`).

**To present:** Ask a question.

## Limits

* 200 steps per deck; one PDF behind them, up to 60 pages.
* Per slide: 4 polls, 8 text boxes, 8 shapes, 4 images.
* Images travel as data URLs: up to 12 MB for an image on a slide, 500 KB per option image.
