changedInput schema / properties / ops / items / oneOf
Previous value: -[
- {
- "additionalProperties": false,
- "properties": {
- "at": {
- "description": "Position, default end of deck",
- "maximum": 9007199254740991,
- "minimum": 0,
- "type": "integer"
- },
- "op": {
- "const": "add_slide",
- "type": "string"
- },
- "slide": {
- "additionalProperties": false,
- "properties": {
- "blocks": {
- "additionalProperties": {
- "oneOf": [
- {
- "additionalProperties": false,
- "properties": {
- "level": {
- "description": "display = title and statement slides, h1 = slide heading, h2 = sub heading",
- "enum": [
- "display",
- "h1",
- "h2"
- ],
- "type": "string"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "text": {
- "description": "Heading. Wrap the key words in ==double equals== to highlight them. Aim for at most 70 characters",
- "minLength": 1,
- "type": "string"
- },
- "type": {
- "const": "heading",
- "type": "string"
- }
- },
- "required": [
- "type",
- "text",
- "level"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "size": {
- "enum": [
- "lead",
- "body",
- "small"
- ],
- "type": "string"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "text": {
- "description": "Paragraph. Aim for at most 260 characters",
- "minLength": 1,
- "type": "string"
- },
- "type": {
- "const": "text",
- "type": "string"
- }
- },
- "required": [
- "type",
- "text",
- "size"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "build": {
- "description": "together = all items with the block, items = one item per click",
- "enum": [
- "together",
- "items"
- ],
- "type": "string"
- },
- "items": {
- "items": {
- "description": "One point, a short sentence, no bullet character. Aim for at most 100 characters",
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 5,
- "minItems": 2,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "bullets",
- "type": "string"
- }
- },
- "required": [
- "type",
- "items"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "decimals": {
- "maximum": 2,
- "minimum": 0,
- "type": "integer"
- },
- "detail": {
- "description": "Optional context or source. Aim for at most 90 characters",
- "minLength": 1,
- "type": "string"
- },
- "label": {
- "description": "What the number means. Aim for at most 48 characters",
- "minLength": 1,
- "type": "string"
- },
- "prefix": {
- "description": "e.g. $, €",
- "maxLength": 3,
- "type": "string"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "suffix": {
- "description": "e.g. %, x, M, k",
- "maxLength": 4,
- "type": "string"
- },
- "type": {
- "const": "stat",
- "type": "string"
- },
- "value": {
- "description": "The number itself, animated as a count up",
- "type": "number"
- }
- },
- "required": [
- "type",
- "value",
- "label"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "build": {
- "description": "together = all items with the block, items = one item per click",
- "enum": [
- "together",
- "items"
- ],
- "type": "string"
- },
- "items": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "decimals": {
- "maximum": 2,
- "minimum": 0,
- "type": "integer"
- },
- "detail": {
- "description": "Optional context or source. Aim for at most 90 characters",
- "minLength": 1,
- "type": "string"
- },
- "label": {
- "description": "What the number means. Aim for at most 48 characters",
- "minLength": 1,
- "type": "string"
- },
- "prefix": {
- "description": "e.g. $, €",
- "maxLength": 3,
- "type": "string"
- },
- "suffix": {
- "description": "e.g. %, x, M, k",
- "maxLength": 4,
- "type": "string"
- },
- "value": {
- "description": "The number itself, animated as a count up",
- "type": "number"
- }
- },
- "required": [
- "value",
- "label"
- ],
- "type": "object"
- },
- "maxItems": 4,
- "minItems": 2,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "stats",
- "type": "string"
- }
- },
- "required": [
- "type",
- "items"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "caption": {
- "description": "Source or footnote. Aim for at most 90 characters",
- "minLength": 1,
- "type": "string"
- },
- "categories": {
- "description": "X axis labels (column, line), rows (bar) or segments (donut)",
- "items": {
- "maxLength": 24,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 8,
- "minItems": 2,
- "type": "array"
- },
- "highlight": {
- "description": "Index of the category to draw in the accent color, the rest stays muted",
- "maximum": 9007199254740991,
- "minimum": 0,
- "type": "integer"
- },
- "kind": {
- "enum": [
- "column",
- "bar",
- "line",
- "donut"
- ],
- "type": "string"
- },
- "series": {
- "description": "One value per category. Donut takes exactly one series",
- "items": {
- "additionalProperties": false,
- "properties": {
- "name": {
- "maxLength": 30,
- "minLength": 1,
- "type": "string"
- },
- "values": {
- "items": {
- "type": "number"
- },
- "type": "array"
- }
- },
- "required": [
- "name",
- "values"
- ],
- "type": "object"
- },
- "maxItems": 3,
- "minItems": 1,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "chart",
- "type": "string"
- },
- "unit": {
- "description": "Shown after values, e.g. %, $M",
- "maxLength": 6,
- "type": "string"
- }
- },
- "required": [
- "type",
- "kind",
- "categories",
- "series"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "alt": {
- "description": "What the image shows. Aim for at most 120 characters",
- "minLength": 1,
- "type": "string"
- },
- "assetId": {
- "minLength": 1,
- "type": "string"
- },
- "fit": {
- "enum": [
- "cover",
- "contain"
- ],
- "type": "string"
- },
- "focus": {
- "additionalProperties": false,
- "description": "Focal point for cover crops",
- "properties": {
- "x": {
- "maximum": 1,
- "minimum": 0,
- "type": "number"
- },
- "y": {
- "maximum": 1,
- "minimum": 0,
- "type": "number"
- }
- },
- "required": [
- "x",
- "y"
- ],
- "type": "object"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "image",
- "type": "string"
- }
- },
- "required": [
- "type",
- "assetId",
- "alt",
- "fit"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "alt": {
- "minLength": 1,
- "type": "string"
- },
- "assetId": {
- "minLength": 1,
- "type": "string"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "logo",
- "type": "string"
- }
- },
- "required": [
- "type",
- "assetId",
- "alt"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "items": {
- "description": "Customer, partner or press logos",
- "items": {
- "additionalProperties": false,
- "properties": {
- "alt": {
- "minLength": 1,
- "type": "string"
- },
- "assetId": {
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "assetId",
- "alt"
- ],
- "type": "object"
- },
- "maxItems": 8,
- "minItems": 3,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "logos",
- "type": "string"
- }
- },
- "required": [
- "type",
- "items"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "author": {
- "maxLength": 40,
- "minLength": 1,
- "type": "string"
- },
- "role": {
- "maxLength": 60,
- "type": "string"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "text": {
- "description": "The quote, without quotation marks. Aim for at most 200 characters",
- "minLength": 1,
- "type": "string"
- },
- "type": {
- "const": "quote",
- "type": "string"
- }
- },
- "required": [
- "type",
- "text",
- "author"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "build": {
- "description": "together = all items with the block, items = one item per click",
- "enum": [
- "together",
- "items"
- ],
- "type": "string"
- },
- "current": {
- "description": "Index of the milestone that represents now",
- "maximum": 9007199254740991,
- "minimum": 0,
- "type": "integer"
- },
- "items": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "label": {
- "description": "Date or phase, e.g. Q3 2026",
- "maxLength": 16,
- "minLength": 1,
- "type": "string"
- },
- "text": {
- "description": "Detail. Aim for at most 80 characters",
- "minLength": 1,
- "type": "string"
- },
- "title": {
- "description": "Milestone. Aim for at most 36 characters",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "label",
- "title"
- ],
- "type": "object"
- },
- "maxItems": 6,
- "minItems": 3,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "timeline",
- "type": "string"
- }
- },
- "required": [
- "type",
- "items"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "people": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "bio": {
- "description": "One line of credibility. Aim for at most 80 characters",
- "minLength": 1,
- "type": "string"
- },
- "name": {
- "maxLength": 32,
- "minLength": 1,
- "type": "string"
- },
- "photoAssetId": {
- "type": "string"
- },
- "role": {
- "maxLength": 40,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "name",
- "role"
- ],
- "type": "object"
- },
- "maxItems": 6,
- "minItems": 1,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "team",
- "type": "string"
- }
- },
- "required": [
- "type",
- "people"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "build": {
- "description": "together = all items with the block, items = one item per click",
- "enum": [
- "together",
- "items"
- ],
- "type": "string"
- },
- "columns": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "highlight": {
- "description": "Our column, drawn with the accent",
- "type": "boolean"
- },
- "items": {
- "items": {
- "description": "Point. Aim for at most 60 characters",
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 5,
- "minItems": 1,
- "type": "array"
- },
- "title": {
- "maxLength": 28,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "title",
- "items"
- ],
- "type": "object"
- },
- "maxItems": 3,
- "minItems": 2,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "comparison",
- "type": "string"
- }
- },
- "required": [
- "type",
- "columns"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "build": {
- "description": "together = all items with the block, items = one item per click",
- "enum": [
- "together",
- "items"
- ],
- "type": "string"
- },
- "items": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "text": {
- "description": "Card text. Aim for at most 110 characters",
- "minLength": 1,
- "type": "string"
- },
- "title": {
- "description": "Card title. Aim for at most 32 characters",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "title",
- "text"
- ],
- "type": "object"
- },
- "maxItems": 4,
- "minItems": 2,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "cards",
- "type": "string"
- }
- },
- "required": [
- "type",
- "items"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "columns": {
- "items": {
- "maxLength": 24,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 5,
- "minItems": 2,
- "type": "array"
- },
- "highlightColumn": {
- "maximum": 9007199254740991,
- "minimum": 0,
- "type": "integer"
- },
- "rows": {
- "description": "Each row has one cell per column",
- "items": {
- "items": {
- "maxLength": 40,
- "type": "string"
- },
- "type": "array"
- },
- "maxItems": 6,
- "minItems": 1,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "table",
- "type": "string"
- }
- },
- "required": [
- "type",
- "columns",
- "rows"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "detail": {
- "description": "Contact, link or next step. Aim for at most 80 characters",
- "minLength": 1,
- "type": "string"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "text": {
- "description": "The ask or call to action. ==Highlight== the amount or key words. Aim for at most 70 characters",
- "minLength": 1,
- "type": "string"
- },
- "type": {
- "const": "cta",
- "type": "string"
- }
- },
- "required": [
- "type",
- "text"
- ],
- "type": "object"
- }
- ]
- },
- "description": "Block per zone of the layout, keyed by zone name",
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "intent": {
- "description": "The one thing this slide must communicate, as a sentence. Not shown on the slide",
- "maxLength": 160,
- "minLength": 1,
- "type": "string"
- },
- "layout": {
- "description": "Layout id from instadeck://layouts",
- "enum": [
- "title",
- "title-image",
- "statement",
- "section",
- "headline-stat",
- "stats",
- "points",
- "text-image",
- "image-text",
- "image-full",
- "chart",
- "chart-insight",
- "cards",
- "comparison",
- "timeline",
- "team",
- "quote",
- "logos",
- "table",
- "closing"
- ],
- "type": "string"
- },
- "motion": {
- "additionalProperties": false,
- "properties": {
- "entrance": {
- "description": "Entrance of this slide's content, overrides the deck default. An exception that marks a key moment",
- "pattern": "^[a-z][a-z0-9-]{0,31}$",
- "type": "string"
- },
- "transition": {
- "description": "Transition INTO this slide, overrides the deck default",
- "pattern": "^[a-z][a-z0-9-]{0,31}$",
- "type": "string"
- },
- "zones": {
- "additionalProperties": {
- "pattern": "^[a-z][a-z0-9-]{0,31}$",
- "type": "string"
- },
- "description": "Entrance per zone, e.g. { \"image\": \"focus\" }, for the one element that should arrive differently",
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- }
- },
- "type": "object"
- },
- "notes": {
- "description": "Speaker notes",
- "maxLength": 1200,
- "type": "string"
- },
- "tone": {
- "description": "default, inverse (dark on light swapped) or accent (accent colored background, for one or two key moments)",
- "enum": [
- "default",
- "inverse",
- "accent"
- ],
- "type": "string"
- }
- },
- "required": [
- "layout",
- "intent",
- "blocks"
- ],
- "type": "object"
- }
- },
- "required": [
- "op",
- "slide"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "blocks": {
- "additionalProperties": {
- "anyOf": [
- {
- "oneOf": [
- {
- "additionalProperties": false,
- "properties": {
- "level": {
- "description": "display = title and statement slides, h1 = slide heading, h2 = sub heading",
- "enum": [
- "display",
- "h1",
- "h2"
- ],
- "type": "string"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "text": {
- "description": "Heading. Wrap the key words in ==double equals== to highlight them. Aim for at most 70 characters",
- "minLength": 1,
- "type": "string"
- },
- "type": {
- "const": "heading",
- "type": "string"
- }
- },
- "required": [
- "type",
- "text",
- "level"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "size": {
- "enum": [
- "lead",
- "body",
- "small"
- ],
- "type": "string"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "text": {
- "description": "Paragraph. Aim for at most 260 characters",
- "minLength": 1,
- "type": "string"
- },
- "type": {
- "const": "text",
- "type": "string"
- }
- },
- "required": [
- "type",
- "text",
- "size"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "build": {
- "description": "together = all items with the block, items = one item per click",
- "enum": [
- "together",
- "items"
- ],
- "type": "string"
- },
- "items": {
- "items": {
- "description": "One point, a short sentence, no bullet character. Aim for at most 100 characters",
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 5,
- "minItems": 2,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "bullets",
- "type": "string"
- }
- },
- "required": [
- "type",
- "items"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "decimals": {
- "maximum": 2,
- "minimum": 0,
- "type": "integer"
- },
- "detail": {
- "description": "Optional context or source. Aim for at most 90 characters",
- "minLength": 1,
- "type": "string"
- },
- "label": {
- "description": "What the number means. Aim for at most 48 characters",
- "minLength": 1,
- "type": "string"
- },
- "prefix": {
- "description": "e.g. $, €",
- "maxLength": 3,
- "type": "string"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "suffix": {
- "description": "e.g. %, x, M, k",
- "maxLength": 4,
- "type": "string"
- },
- "type": {
- "const": "stat",
- "type": "string"
- },
- "value": {
- "description": "The number itself, animated as a count up",
- "type": "number"
- }
- },
- "required": [
- "type",
- "value",
- "label"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "build": {
- "description": "together = all items with the block, items = one item per click",
- "enum": [
- "together",
- "items"
- ],
- "type": "string"
- },
- "items": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "decimals": {
- "maximum": 2,
- "minimum": 0,
- "type": "integer"
- },
- "detail": {
- "description": "Optional context or source. Aim for at most 90 characters",
- "minLength": 1,
- "type": "string"
- },
- "label": {
- "description": "What the number means. Aim for at most 48 characters",
- "minLength": 1,
- "type": "string"
- },
- "prefix": {
- "description": "e.g. $, €",
- "maxLength": 3,
- "type": "string"
- },
- "suffix": {
- "description": "e.g. %, x, M, k",
- "maxLength": 4,
- "type": "string"
- },
- "value": {
- "description": "The number itself, animated as a count up",
- "type": "number"
- }
- },
- "required": [
- "value",
- "label"
- ],
- "type": "object"
- },
- "maxItems": 4,
- "minItems": 2,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "stats",
- "type": "string"
- }
- },
- "required": [
- "type",
- "items"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "caption": {
- "description": "Source or footnote. Aim for at most 90 characters",
- "minLength": 1,
- "type": "string"
- },
- "categories": {
- "description": "X axis labels (column, line), rows (bar) or segments (donut)",
- "items": {
- "maxLength": 24,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 8,
- "minItems": 2,
- "type": "array"
- },
- "highlight": {
- "description": "Index of the category to draw in the accent color, the rest stays muted",
- "maximum": 9007199254740991,
- "minimum": 0,
- "type": "integer"
- },
- "kind": {
- "enum": [
- "column",
- "bar",
- "line",
- "donut"
- ],
- "type": "string"
- },
- "series": {
- "description": "One value per category. Donut takes exactly one series",
- "items": {
- "additionalProperties": false,
- "properties": {
- "name": {
- "maxLength": 30,
- "minLength": 1,
- "type": "string"
- },
- "values": {
- "items": {
- "type": "number"
- },
- "type": "array"
- }
- },
- "required": [
- "name",
- "values"
- ],
- "type": "object"
- },
- "maxItems": 3,
- "minItems": 1,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "chart",
- "type": "string"
- },
- "unit": {
- "description": "Shown after values, e.g. %, $M",
- "maxLength": 6,
- "type": "string"
- }
- },
- "required": [
- "type",
- "kind",
- "categories",
- "series"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "alt": {
- "description": "What the image shows. Aim for at most 120 characters",
- "minLength": 1,
- "type": "string"
- },
- "assetId": {
- "minLength": 1,
- "type": "string"
- },
- "fit": {
- "enum": [
- "cover",
- "contain"
- ],
- "type": "string"
- },
- "focus": {
- "additionalProperties": false,
- "description": "Focal point for cover crops",
- "properties": {
- "x": {
- "maximum": 1,
- "minimum": 0,
- "type": "number"
- },
- "y": {
- "maximum": 1,
- "minimum": 0,
- "type": "number"
- }
- },
- "required": [
- "x",
- "y"
- ],
- "type": "object"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "image",
- "type": "string"
- }
- },
- "required": [
- "type",
- "assetId",
- "alt",
- "fit"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "alt": {
- "minLength": 1,
- "type": "string"
- },
- "assetId": {
- "minLength": 1,
- "type": "string"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "logo",
- "type": "string"
- }
- },
- "required": [
- "type",
- "assetId",
- "alt"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "items": {
- "description": "Customer, partner or press logos",
- "items": {
- "additionalProperties": false,
- "properties": {
- "alt": {
- "minLength": 1,
- "type": "string"
- },
- "assetId": {
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "assetId",
- "alt"
- ],
- "type": "object"
- },
- "maxItems": 8,
- "minItems": 3,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "logos",
- "type": "string"
- }
- },
- "required": [
- "type",
- "items"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "author": {
- "maxLength": 40,
- "minLength": 1,
- "type": "string"
- },
- "role": {
- "maxLength": 60,
- "type": "string"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "text": {
- "description": "The quote, without quotation marks. Aim for at most 200 characters",
- "minLength": 1,
- "type": "string"
- },
- "type": {
- "const": "quote",
- "type": "string"
- }
- },
- "required": [
- "type",
- "text",
- "author"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "build": {
- "description": "together = all items with the block, items = one item per click",
- "enum": [
- "together",
- "items"
- ],
- "type": "string"
- },
- "current": {
- "description": "Index of the milestone that represents now",
- "maximum": 9007199254740991,
- "minimum": 0,
- "type": "integer"
- },
- "items": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "label": {
- "description": "Date or phase, e.g. Q3 2026",
- "maxLength": 16,
- "minLength": 1,
- "type": "string"
- },
- "text": {
- "description": "Detail. Aim for at most 80 characters",
- "minLength": 1,
- "type": "string"
- },
- "title": {
- "description": "Milestone. Aim for at most 36 characters",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "label",
- "title"
- ],
- "type": "object"
- },
- "maxItems": 6,
- "minItems": 3,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "timeline",
- "type": "string"
- }
- },
- "required": [
- "type",
- "items"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "people": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "bio": {
- "description": "One line of credibility. Aim for at most 80 characters",
- "minLength": 1,
- "type": "string"
- },
- "name": {
- "maxLength": 32,
- "minLength": 1,
- "type": "string"
- },
- "photoAssetId": {
- "type": "string"
- },
- "role": {
- "maxLength": 40,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "name",
- "role"
- ],
- "type": "object"
- },
- "maxItems": 6,
- "minItems": 1,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "team",
- "type": "string"
- }
- },
- "required": [
- "type",
- "people"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "build": {
- "description": "together = all items with the block, items = one item per click",
- "enum": [
- "together",
- "items"
- ],
- "type": "string"
- },
- "columns": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "highlight": {
- "description": "Our column, drawn with the accent",
- "type": "boolean"
- },
- "items": {
- "items": {
- "description": "Point. Aim for at most 60 characters",
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 5,
- "minItems": 1,
- "type": "array"
- },
- "title": {
- "maxLength": 28,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "title",
- "items"
- ],
- "type": "object"
- },
- "maxItems": 3,
- "minItems": 2,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "comparison",
- "type": "string"
- }
- },
- "required": [
- "type",
- "columns"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "build": {
- "description": "together = all items with the block, items = one item per click",
- "enum": [
- "together",
- "items"
- ],
- "type": "string"
- },
- "items": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "text": {
- "description": "Card text. Aim for at most 110 characters",
- "minLength": 1,
- "type": "string"
- },
- "title": {
- "description": "Card title. Aim for at most 32 characters",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "title",
- "text"
- ],
- "type": "object"
- },
- "maxItems": 4,
- "minItems": 2,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "cards",
- "type": "string"
- }
- },
- "required": [
- "type",
- "items"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "columns": {
- "items": {
- "maxLength": 24,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 5,
- "minItems": 2,
- "type": "array"
- },
- "highlightColumn": {
- "maximum": 9007199254740991,
- "minimum": 0,
- "type": "integer"
- },
- "rows": {
- "description": "Each row has one cell per column",
- "items": {
- "items": {
- "maxLength": 40,
- "type": "string"
- },
- "type": "array"
- },
- "maxItems": 6,
- "minItems": 1,
- "type": "array"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "type": {
- "const": "table",
- "type": "string"
- }
- },
- "required": [
- "type",
- "columns",
- "rows"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "detail": {
- "description": "Contact, link or next step. Aim for at most 80 characters",
- "minLength": 1,
- "type": "string"
- },
- "step": {
- "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
- "maximum": 5,
- "minimum": 0,
- "type": "integer"
- },
- "text": {
- "description": "The ask or call to action. ==Highlight== the amount or key words. Aim for at most 70 characters",
- "minLength": 1,
- "type": "string"
- },
- "type": {
- "const": "cta",
- "type": "string"
- }
- },
- "required": [
- "type",
- "text"
- ],
- "type": "object"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "description": "Zones to set. null removes the block from the zone. Unlisted zones stay",
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- },
- "intent": {
- "description": "The one thing this slide must communicate, as a sentence. Not shown on the slide",
- "maxLength": 160,
- "minLength": 1,
- "type": "string"
- },
- "layout": {
- "description": "Layout id from instadeck://layouts",
- "enum": [
- "title",
- "title-image",
- "statement",
- "section",
- "headline-stat",
- "stats",
- "points",
- "text-image",
- "image-text",
- "image-full",
- "chart",
- "chart-insight",
- "cards",
- "comparison",
- "timeline",
- "team",
- "quote",
- "logos",
- "table",
- "closing"
- ],
- "type": "string"
- },
- "motion": {
- "additionalProperties": false,
- "properties": {
- "entrance": {
- "description": "Entrance of this slide's content, overrides the deck default. An exception that marks a key moment",
- "pattern": "^[a-z][a-z0-9-]{0,31}$",
- "type": "string"
- },
- "transition": {
- "description": "Transition INTO this slide, overrides the deck default",
- "pattern": "^[a-z][a-z0-9-]{0,31}$",
- "type": "string"
- },
- "zones": {
- "additionalProperties": {
- "pattern": "^[a-z][a-z0-9-]{0,31}$",
- "type": "string"
- },
- "description": "Entrance per zone, e.g. { \"image\": \"focus\" }, for the one element that should arrive differently",
- "propertyNames": {
- "type": "string"
- },
- "type": "object"
- }
- },
- "type": "object"
- },
- "notes": {
- "maxLength": 1200,
- "type": "string"
- },
- "op": {
- "const": "update_slide",
- "type": "string"
- },
- "slide_id": {
- "type": "string"
- },
- "tone": {
- "description": "default, inverse (dark on light swapped) or accent (accent colored background, for one or two key moments)",
- "enum": [
- "default",
- "inverse",
- "accent"
- ],
- "type": "string"
- }
- },
- "required": [
- "op",
- "slide_id"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "op": {
- "const": "remove_slide",
- "type": "string"
- },
- "slide_id": {
- "type": "string"
- }
- },
- "required": [
- "op",
- "slide_id"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "op": {
- "const": "move_slide",
- "type": "string"
- },
- "slide_id": {
- "type": "string"
- },
- "to": {
- "maximum": 9007199254740991,
- "minimum": 0,
- "type": "integer"
- }
- },
- "required": [
- "op",
- "slide_id",
- "to"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "design": {
- "additionalProperties": false,
- "description": "Only the fields to change",
- "properties": {
- "colors": {
- "additionalProperties": false,
- "properties": {
- "accent": {
- "description": "Signal color: key numbers, highlights, chart focus. Never for decoration",
- "type": "string"
- },
- "accent2": {
- "description": "Secondary chart and diagram color",
- "type": "string"
- },
- "bg": {
- "description": "Main background",
- "type": "string"
- },
- "fg": {
- "description": "Main text",
- "type": "string"
- },
- "muted": {
- "description": "Secondary text: labels, captions, detail",
- "type": "string"
- },
- "surface": {
- "description": "Card and panel background, close to bg",
- "type": "string"
- }
- },
- "type": "object"
- },
- "fonts": {
- "additionalProperties": false,
- "properties": {
- "body": {
- "oneOf": [
- {
- "additionalProperties": false,
- "properties": {
- "family": {
- "description": "Family from the curated Google Fonts list (instadeck://fonts)",
- "enum": [
- "Inter",
- "Inter Tight",
- "Plus Jakarta Sans",
- "Manrope",
- "DM Sans",
- "Space Grotesk",
- "Sora",
- "Outfit",
- "Work Sans",
- "IBM Plex Sans",
- "Archivo",
- "Schibsted Grotesk",
- "Geist",
- "Figtree",
- "Fraunces",
- "Playfair Display",
- "Instrument Serif",
- "Source Serif 4",
- "Newsreader",
- "Libre Caslon Text",
- "DM Serif Display",
- "Bricolage Grotesque",
- "Syne",
- "Unbounded",
- "Big Shoulders Display",
- "JetBrains Mono",
- "IBM Plex Mono"
- ],
- "type": "string"
- },
- "source": {
- "const": "google",
- "type": "string"
- }
- },
- "required": [
- "source",
- "family"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "assetId": {
- "description": "Font file added with add_asset (woff2, woff, ttf, otf)",
- "type": "string"
- },
- "family": {
- "description": "Name to register the font under",
- "minLength": 1,
- "type": "string"
- },
- "source": {
- "const": "asset",
- "type": "string"
- },
- "weight": {
- "description": "Weight of this file",
- "maximum": 900,
- "minimum": 100,
- "type": "integer"
- }
- },
- "required": [
- "source",
- "assetId",
- "family",
- "weight"
- ],
- "type": "object"
- }
- ]
- },
- "heading": {
- "oneOf": [
- {
- "additionalProperties": false,
- "properties": {
- "family": {
- "description": "Family from the curated Google Fonts list (instadeck://fonts)",
- "enum": [
- "Inter",
- "Inter Tight",
- "Plus Jakarta Sans",
- "Manrope",
- "DM Sans",
- "Space Grotesk",
- "Sora",
- "Outfit",
- "Work Sans",
- "IBM Plex Sans",
- "Archivo",
- "Schibsted Grotesk",
- "Geist",
- "Figtree",
- "Fraunces",
- "Playfair Display",
- "Instrument Serif",
- "Source Serif 4",
- "Newsreader",
- "Libre Caslon Text",
- "DM Serif Display",
- "Bricolage Grotesque",
- "Syne",
- "Unbounded",
- "Big Shoulders Display",
- "JetBrains Mono",
- "IBM Plex Mono"
- ],
- "type": "string"
- },
- "source": {
- "const": "google",
- "type": "string"
- }
- },
- "required": [
- "source",
- "family"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "assetId": {
- "description": "Font file added with add_asset (woff2, woff, ttf, otf)",
- "type": "string"
- },
- "family": {
- "description": "Name to register the font under",
- "minLength": 1,
- "type": "string"
- },
- "source": {
- "const": "asset",
- "type": "string"
- },
- "weight": {
- "description": "Weight of this file",
- "maximum": 900,
- "minimum": 100,
- "type": "integer"
- }
- },
- "required": [
- "source",
- "assetId",
- "family",
- "weight"
- ],
- "type": "object"
- }
- ]
- }
- },
- "type": "object"
- },
- "shape": {
- "additionalProperties": false,
- "properties": {
- "cards": {
- "description": "How cards and panels are drawn",
- "enum": [
- "flat",
- "outline",
- "filled"
- ],
- "type": "string"
- },
- "radius": {
- "description": "Corner radius of cards, images and charts in px",
- "maximum": 32,
- "minimum": 0,
- "type": "number"
- }
- },
- "type": "object"
- },
- "space": {
- "additionalProperties": false,
- "properties": {
- "density": {
- "enum": [
- "airy",
- "balanced",
- "compact"
- ],
- "type": "string"
- },
- "unit": {
- "description": "Spacing unit in px, every gap is a multiple",
- "maximum": 16,
- "minimum": 8,
- "type": "number"
- }
- },
- "type": "object"
- },
- "type": {
- "additionalProperties": false,
- "properties": {
- "base": {
- "description": "Body size in px on a 1920x1080 slide",
- "maximum": 36,
- "minimum": 22,
- "type": "number"
- },
- "headingCase": {
- "enum": [
- "none",
- "upper"
- ],
- "type": "string"
- },
- "headingTracking": {
- "description": "Letter spacing of headings in em",
- "maximum": 0.05,
- "minimum": -0.05,
- "type": "number"
- },
- "headingWeight": {
- "maximum": 900,
- "minimum": 300,
- "type": "integer"
- },
- "scale": {
- "enum": [
- "minor-third",
- "major-third",
- "perfect-fourth",
- "augmented-fourth",
- "perfect-fifth",
- "golden"
- ],
- "type": "string"
- }
- },
- "type": "object"
- }
- },
- "type": "object"
- },
- "op": {
- "const": "set_design",
- "type": "string"
- }
- },
- "required": [
- "op",
- "design"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "motion": {
- "additionalProperties": false,
- "properties": {
- "entrance": {
- "description": "Default entrance of slide content: a preset or a name from vocabulary.entrances",
- "pattern": "^[a-z][a-z0-9-]{0,31}$",
- "type": "string"
- },
- "heroes": {
- "description": "Animate numbers, charts and timelines (count up, grow, draw)",
- "type": "boolean"
- },
- "intensity": {
- "description": "How much this deck moves: still (nothing moves), subtle, expressive, kinetic. Measured against what the motion really does",
- "enum": [
- "still",
- "subtle",
- "expressive",
- "kinetic"
- ],
- "type": "string"
- },
- "rationale": {
- "description": "Why this motion language fits the audience and brand, one or two sentences",
- "maxLength": 240,
- "minLength": 1,
- "type": "string"
- },
- "tempo": {
- "description": "Scales every duration: calm 1.25x, confident 1x, brisk 0.8x",
- "enum": [
- "calm",
- "confident",
- "brisk"
- ],
- "type": "string"
- },
- "transition": {
- "description": "Default transition between slides: a preset or a name from vocabulary.transitions",
- "pattern": "^[a-z][a-z0-9-]{0,31}$",
- "type": "string"
- },
- "vocabulary": {
- "additionalProperties": false,
- "description": "Entries to add or replace, null removes one. Unlisted entries stay",
- "properties": {
- "entrances": {
- "additionalProperties": {
- "anyOf": [
- {
- "additionalProperties": false,
- "properties": {
- "duration": {
- "description": "Milliseconds at tempo confident, the deck tempo scales it. 0 = no motion",
- "maximum": 3000,
- "minimum": 0,
- "type": "integer"
- },
- "easing": {
- "description": "Named easing (out-expo, out-cubic, in-out, in-cubic, out-back), CSS keyword, cubic-bezier(...) or linear(...) for springs",
- "type": "string"
- },
- "keyframes": {
- "description": "States from hidden towards rest. The element always ends in its natural place, so never write the final resting keyframe",
- "items": {
- "additionalProperties": false,
- "properties": {
- "clipPath": {
- "description": "CSS clip-path, e.g. inset(0 0 100% 0)",
- "maxLength": 200,
- "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
- "type": "string"
- },
- "easing": {
- "description": "Easing from this keyframe to the next",
- "type": "string"
- },
- "filter": {
- "description": "CSS filter, e.g. blur(8px)",
- "maxLength": 200,
- "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
- "type": "string"
- },
- "offset": {
- "description": "Position in time 0 to 1, default evenly spaced",
- "maximum": 1,
- "minimum": 0,
- "type": "number"
- },
- "opacity": {
- "maximum": 1,
- "minimum": 0,
- "type": "number"
- },
- "transform": {
- "description": "CSS transform, e.g. translateY(40px) scale(0.96)",
- "maxLength": 200,
- "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
- "type": "string"
- }
- },
- "type": "object"
- },
- "maxItems": 6,
- "type": "array"
- },
- "purpose": {
- "description": "What this motion is for, one sentence",
- "maxLength": 160,
- "minLength": 1,
- "type": "string"
- },
- "stagger": {
- "description": "Milliseconds between blocks that enter together, default from the tempo",
- "maximum": 600,
- "minimum": 0,
- "type": "integer"
- }
- },
- "required": [
- "purpose",
- "keyframes",
- "duration",
- "easing"
- ],
- "type": "object"
- },
- {
- "type": "null"
- }
- ]
- },
- "propertyNames": {
- "pattern": "^[a-z][a-z0-9-]{0,31}$",
- "type": "string"
- },
- "type": "object"
- },
- "transitions": {
- "additionalProperties": {
- "anyOf": [
- {
- "additionalProperties": false,
- "properties": {
- "duration": {
- "description": "Milliseconds at tempo confident, the deck tempo scales it. 0 = no motion",
- "maximum": 2000,
- "minimum": 0,
- "type": "integer"
- },
- "easing": {
- "description": "Named easing (out-expo, out-cubic, in-out, in-cubic, out-back), CSS keyword, cubic-bezier(...) or linear(...) for springs",
- "type": "string"
- },
- "enter": {
- "description": "Incoming slide: states before rest, e.g. [{ transform: 'translateX(1920px)' }]. Rest is the implicit end",
- "items": {
- "additionalProperties": false,
- "properties": {
- "clipPath": {
- "description": "CSS clip-path, e.g. inset(0 0 100% 0)",
- "maxLength": 200,
- "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
- "type": "string"
- },
- "easing": {
- "description": "Easing from this keyframe to the next",
- "type": "string"
- },
- "filter": {
- "description": "CSS filter, e.g. blur(8px)",
- "maxLength": 200,
- "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
- "type": "string"
- },
- "offset": {
- "description": "Position in time 0 to 1, default evenly spaced",
- "maximum": 1,
- "minimum": 0,
- "type": "number"
- },
- "opacity": {
- "maximum": 1,
- "minimum": 0,
- "type": "number"
- },
- "transform": {
- "description": "CSS transform, e.g. translateY(40px) scale(0.96)",
- "maxLength": 200,
- "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
- "type": "string"
- }
- },
- "type": "object"
- },
- "maxItems": 6,
- "type": "array"
- },
- "exit": {
- "description": "Outgoing slide: states after rest, e.g. [{ opacity: 0, transform: 'scale(0.96)' }]. Rest is the implicit start",
- "items": {
- "additionalProperties": false,
- "properties": {
- "clipPath": {
- "description": "CSS clip-path, e.g. inset(0 0 100% 0)",
- "maxLength": 200,
- "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
- "type": "string"
- },
- "easing": {
- "description": "Easing from this keyframe to the next",
- "type": "string"
- },
- "filter": {
- "description": "CSS filter, e.g. blur(8px)",
- "maxLength": 200,
- "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
- "type": "string"
- },
- "offset": {
- "description": "Position in time 0 to 1, default evenly spaced",
- "maximum": 1,
- "minimum": 0,
- "type": "number"
- },
- "opacity": {
- "maximum": 1,
- "minimum": 0,
- "type": "number"
- },
- "transform": {
- "description": "CSS transform, e.g. translateY(40px) scale(0.96)",
- "maxLength": 200,
- "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
- "type": "string"
- }
- },
- "type": "object"
- },
- "maxItems": 6,
- "type": "array"
- },
- "over": {
- "description": "Which slide lies on top during the transition, default exit",
- "enum": [
- "exit",
- "enter"
- ],
- "type": "string"
- },
- "purpose": {
- "description": "What this motion is for, one sentence",
- "maxLength": 160,
- "minLength": 1,
- "type": "string"
- },
- "shared": {
- "description": "Elements on both slides (the headline, a logo, the same image) glide from their old place and size to the new one",
- "type": "boolean"
- }
- },
- "required": [
- "purpose",
- "duration",
- "easing"
- ],
- "type": "object"
- },
- {
- "type": "null"
- }
- ]
- },
- "propertyNames": {
- "pattern": "^[a-z][a-z0-9-]{0,31}$",
- "type": "string"
- },
- "type": "object"
- }
- },
- "type": "object"
- }
- },
- "type": "object"
- },
- "op": {
- "const": "set_motion",
- "type": "string"
- }
- },
- "required": [
- "op",
- "motion"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "op": {
- "const": "set_title",
- "type": "string"
- },
- "title": {
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "op",
- "title"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "brief": {
- "additionalProperties": false,
- "properties": {
- "audience": {
- "description": "Who will see it: seed investors, enterprise buyers, partners",
- "type": "string"
- },
- "company": {
- "description": "Company or product name",
- "minLength": 1,
- "type": "string"
- },
- "goal": {
- "description": "What the audience should do or believe afterwards",
- "type": "string"
- },
- "language": {
- "description": "Language of the slide content, BCP 47 tag, e.g. en, cs, de",
- "minLength": 2,
- "type": "string"
- },
- "topic": {
- "description": "What the deck is about, e.g. seed round pitch, partner pitch, product launch",
- "minLength": 1,
- "type": "string"
- }
- },
- "type": "object"
- },
- "op": {
- "const": "set_brief",
- "type": "string"
- }
- },
- "required": [
- "op",
- "brief"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "brand_kit_id": {
- "description": "Brand kit whose colors and fonts replace the design",
- "type": "string"
- },
- "op": {
- "const": "apply_brand",
- "type": "string"
- }
- },
- "required": [
- "op",
- "brand_kit_id"
- ],
- "type": "object"
- }
-]New value: +[
+ {
+ "additionalProperties": false,
+ "properties": {
+ "at": {
+ "description": "Position, default end of deck",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "op": {
+ "const": "add_slide",
+ "type": "string"
+ },
+ "slide": {
+ "additionalProperties": false,
+ "properties": {
+ "background": {
+ "description": "Background of the slide. brand = a visual drawn from the brand colors (no assets needed), image = the user's image under an overlay that keeps text legible. Use it for the title and chapter openers, not on every slide",
+ "oneOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "type": {
+ "const": "brand",
+ "type": "string"
+ },
+ "visual": {
+ "description": "numeral = the chapter number set very large, field = a color field across part of the slide, geometry = one thin line in the accent along the edge of the slide",
+ "enum": [
+ "numeral",
+ "field",
+ "geometry"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "visual"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "assetId": {
+ "description": "An image asset the user supplied (add_asset). Never a stock or generated image",
+ "minLength": 1,
+ "type": "string"
+ },
+ "focus": {
+ "additionalProperties": false,
+ "description": "Focal point for the crop. Put it where the text is not",
+ "properties": {
+ "x": {
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ },
+ "y": {
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ }
+ },
+ "required": [
+ "x",
+ "y"
+ ],
+ "type": "object"
+ },
+ "overlay": {
+ "description": "How much of the slide background color covers the image so text stays legible, 0 to 0.95. Default 0.55. The browser measures the text over the image and reports the smallest value that works",
+ "maximum": 0.95,
+ "minimum": 0,
+ "type": "number"
+ },
+ "type": {
+ "const": "image",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "assetId"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "beat": {
+ "description": "The story beat this slide carries (section pitch, beats): hook, problem, traction, ask...",
+ "enum": [
+ "hook",
+ "problem",
+ "why-now",
+ "solution",
+ "product",
+ "traction",
+ "market",
+ "business-model",
+ "competition",
+ "go-to-market",
+ "roadmap",
+ "team",
+ "financials",
+ "risks",
+ "decision",
+ "ask"
+ ],
+ "type": "string"
+ },
+ "blocks": {
+ "additionalProperties": {
+ "oneOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "level": {
+ "description": "display = title and statement slides, h1 = slide heading, h2 = sub heading",
+ "enum": [
+ "display",
+ "h1",
+ "h2"
+ ],
+ "type": "string"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "text": {
+ "description": "Heading. Wrap the key words in ==double equals== to highlight them. Aim for at most 70 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "type": {
+ "const": "heading",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "text",
+ "level"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "size": {
+ "enum": [
+ "lead",
+ "body",
+ "small"
+ ],
+ "type": "string"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "text": {
+ "description": "Paragraph. Aim for at most 260 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "type": {
+ "const": "text",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "text",
+ "size"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "build": {
+ "description": "together = all items with the block, items = one item per click",
+ "enum": [
+ "together",
+ "items"
+ ],
+ "type": "string"
+ },
+ "items": {
+ "items": {
+ "description": "One point, a short sentence, no bullet character. Aim for at most 100 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 5,
+ "minItems": 2,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "bullets",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "items"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "decimals": {
+ "maximum": 2,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "detail": {
+ "description": "Optional context or source. Aim for at most 90 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "label": {
+ "description": "What the number means. Aim for at most 48 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "prefix": {
+ "description": "e.g. $, €",
+ "maxLength": 3,
+ "type": "string"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "suffix": {
+ "description": "e.g. %, x, M, k",
+ "maxLength": 4,
+ "type": "string"
+ },
+ "type": {
+ "const": "stat",
+ "type": "string"
+ },
+ "value": {
+ "description": "The number itself, animated as a count up",
+ "type": "number"
+ }
+ },
+ "required": [
+ "type",
+ "value",
+ "label"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "build": {
+ "description": "together = all items with the block, items = one item per click",
+ "enum": [
+ "together",
+ "items"
+ ],
+ "type": "string"
+ },
+ "items": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "decimals": {
+ "maximum": 2,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "detail": {
+ "description": "Optional context or source. Aim for at most 90 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "label": {
+ "description": "What the number means. Aim for at most 48 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "prefix": {
+ "description": "e.g. $, €",
+ "maxLength": 3,
+ "type": "string"
+ },
+ "suffix": {
+ "description": "e.g. %, x, M, k",
+ "maxLength": 4,
+ "type": "string"
+ },
+ "value": {
+ "description": "The number itself, animated as a count up",
+ "type": "number"
+ }
+ },
+ "required": [
+ "value",
+ "label"
+ ],
+ "type": "object"
+ },
+ "maxItems": 4,
+ "minItems": 2,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "stats",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "items"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "axis": {
+ "description": "Show a value axis with gridlines. Only when the audience must read values off the chart, labels on the bars usually suffice (Tufte)",
+ "type": "boolean"
+ },
+ "caption": {
+ "description": "Source or footnote. Aim for at most 90 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "categories": {
+ "description": "X axis labels (column, stacked, waterfall, line), rows (bar) or segments (donut)",
+ "items": {
+ "maxLength": 24,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 10,
+ "minItems": 2,
+ "type": "array"
+ },
+ "decimals": {
+ "description": "Decimal places of the value labels. Omit it: labels keep the decimals the values have (at most 3), the same for every label",
+ "maximum": 3,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "estimate": {
+ "description": "Index of the first category that is an estimate or plan (IBCS): from there bars are hatched. Name those categories e.g. 2025E",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "highlight": {
+ "description": "Index of the category to draw in the accent color, the rest stays muted",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "kind": {
+ "description": "column, bar (horizontal), line, donut (share of a whole, at most 4 segments read well), stacked (columns split into series), waterfall (bridge: first and last categories are totals, the ones between are changes that add up)",
+ "enum": [
+ "column",
+ "bar",
+ "line",
+ "donut",
+ "stacked",
+ "waterfall"
+ ],
+ "type": "string"
+ },
+ "reference": {
+ "additionalProperties": false,
+ "description": "A horizontal line at a reference value: target, plan or average",
+ "properties": {
+ "label": {
+ "description": "What the line marks, e.g. Target, Plan, Average. Aim for at most 24 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "value": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "value",
+ "label"
+ ],
+ "type": "object"
+ },
+ "series": {
+ "description": "One value per category. Donut takes exactly one series",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "maxLength": 30,
+ "minLength": 1,
+ "type": "string"
+ },
+ "values": {
+ "items": {
+ "type": "number"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "name",
+ "values"
+ ],
+ "type": "object"
+ },
+ "maxItems": 3,
+ "minItems": 1,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "chart",
+ "type": "string"
+ },
+ "unit": {
+ "description": "Shown after values, e.g. %, $M",
+ "maxLength": 6,
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "kind",
+ "categories",
+ "series"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "alt": {
+ "description": "What the image shows. Aim for at most 120 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "assetId": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "fit": {
+ "enum": [
+ "cover",
+ "contain"
+ ],
+ "type": "string"
+ },
+ "focus": {
+ "additionalProperties": false,
+ "description": "Focal point for cover crops",
+ "properties": {
+ "x": {
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ },
+ "y": {
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ }
+ },
+ "required": [
+ "x",
+ "y"
+ ],
+ "type": "object"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "image",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "assetId",
+ "alt",
+ "fit"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "alt": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "assetId": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "logo",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "assetId",
+ "alt"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "items": {
+ "description": "Customer, partner or press logos",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "alt": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "assetId": {
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "assetId",
+ "alt"
+ ],
+ "type": "object"
+ },
+ "maxItems": 8,
+ "minItems": 3,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "logos",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "items"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "author": {
+ "maxLength": 40,
+ "minLength": 1,
+ "type": "string"
+ },
+ "role": {
+ "maxLength": 60,
+ "type": "string"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "text": {
+ "description": "The quote, without quotation marks. Aim for at most 200 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "type": {
+ "const": "quote",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "text",
+ "author"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "build": {
+ "description": "together = all items with the block, items = one item per click",
+ "enum": [
+ "together",
+ "items"
+ ],
+ "type": "string"
+ },
+ "current": {
+ "description": "Index of the milestone that represents now",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "items": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "label": {
+ "description": "Date or phase, e.g. Q3 2026",
+ "maxLength": 16,
+ "minLength": 1,
+ "type": "string"
+ },
+ "text": {
+ "description": "Detail. Aim for at most 80 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "title": {
+ "description": "Milestone. Aim for at most 36 characters",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "label",
+ "title"
+ ],
+ "type": "object"
+ },
+ "maxItems": 6,
+ "minItems": 3,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "timeline",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "items"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "people": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "bio": {
+ "description": "One line of credibility. Aim for at most 80 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "name": {
+ "maxLength": 32,
+ "minLength": 1,
+ "type": "string"
+ },
+ "photoAssetId": {
+ "type": "string"
+ },
+ "role": {
+ "maxLength": 40,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "role"
+ ],
+ "type": "object"
+ },
+ "maxItems": 6,
+ "minItems": 1,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "team",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "people"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "build": {
+ "description": "together = all items with the block, items = one item per click",
+ "enum": [
+ "together",
+ "items"
+ ],
+ "type": "string"
+ },
+ "columns": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "highlight": {
+ "description": "Our column, drawn with the accent",
+ "type": "boolean"
+ },
+ "items": {
+ "items": {
+ "description": "Point. Aim for at most 60 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 5,
+ "minItems": 1,
+ "type": "array"
+ },
+ "title": {
+ "maxLength": 28,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "title",
+ "items"
+ ],
+ "type": "object"
+ },
+ "maxItems": 3,
+ "minItems": 2,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "comparison",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "columns"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "build": {
+ "description": "together = all items with the block, items = one item per click",
+ "enum": [
+ "together",
+ "items"
+ ],
+ "type": "string"
+ },
+ "items": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "icon": {
+ "description": "An icon that carries the meaning of the card (the kind of risk, the step of a process). Give all cards one or none, and avoid the same icon on two cards unless they mean the same thing",
+ "enum": [
+ "risk",
+ "security",
+ "lock",
+ "time",
+ "people",
+ "person",
+ "goal",
+ "growth",
+ "decline",
+ "chart",
+ "money",
+ "global",
+ "speed",
+ "done",
+ "fail",
+ "layers",
+ "settings",
+ "data",
+ "cloud",
+ "delivery",
+ "company",
+ "document",
+ "search",
+ "mail",
+ "launch",
+ "milestone",
+ "link",
+ "balance",
+ "partnership",
+ "idea",
+ "package",
+ "route"
+ ],
+ "type": "string"
+ },
+ "text": {
+ "description": "Card text. Aim for at most 110 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "title": {
+ "description": "Card title. Aim for at most 32 characters",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "title",
+ "text"
+ ],
+ "type": "object"
+ },
+ "maxItems": 4,
+ "minItems": 2,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "cards",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "items"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "columns": {
+ "items": {
+ "maxLength": 24,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 5,
+ "minItems": 2,
+ "type": "array"
+ },
+ "highlightColumn": {
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "rows": {
+ "description": "Each row has one cell per column",
+ "items": {
+ "items": {
+ "maxLength": 40,
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "maxItems": 6,
+ "minItems": 1,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "table",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "columns",
+ "rows"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "detail": {
+ "description": "Contact, link or next step. Aim for at most 80 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "text": {
+ "description": "The ask or call to action. ==Highlight== the amount or key words. Aim for at most 70 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "type": {
+ "const": "cta",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "text"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "description": "Block per zone of the layout, keyed by zone name",
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "composition": {
+ "additionalProperties": false,
+ "description": "The geometry of the slide grid as intent: where the content sits, how two columns share the width and which zone leads. The engine derives the numbers and measures that the slide holds. Without it the slide follows the composition of the school",
+ "properties": {
+ "axis": {
+ "description": "left (default), center (low density layouts with one column) or asymmetric (the content is pushed right, the left side stays empty on purpose)",
+ "enum": [
+ "left",
+ "center",
+ "asymmetric"
+ ],
+ "type": "string"
+ },
+ "dominant": {
+ "description": "The zone that leads and gets the larger column, in a two column layout",
+ "minLength": 1,
+ "type": "string"
+ },
+ "split": {
+ "description": "Ratio of the two columns of title-image, text-image, image-text and chart-insight",
+ "enum": [
+ "1:3",
+ "1:2",
+ "1:1",
+ "2:1",
+ "3:1"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "intent": {
+ "description": "The one thing this slide must communicate, as a sentence. Not shown on the slide",
+ "maxLength": 160,
+ "minLength": 1,
+ "type": "string"
+ },
+ "layout": {
+ "description": "Layout id from instadeck://layouts",
+ "enum": [
+ "title",
+ "title-image",
+ "statement",
+ "section",
+ "headline-stat",
+ "stats",
+ "points",
+ "text-image",
+ "image-text",
+ "image-full",
+ "chart",
+ "chart-insight",
+ "cards",
+ "comparison",
+ "timeline",
+ "team",
+ "quote",
+ "logos",
+ "table",
+ "closing"
+ ],
+ "type": "string"
+ },
+ "motion": {
+ "additionalProperties": false,
+ "properties": {
+ "entrance": {
+ "description": "Entrance of this slide's content, overrides the deck default. An exception that marks a key moment",
+ "pattern": "^[a-z][a-z0-9-]{0,31}$",
+ "type": "string"
+ },
+ "transition": {
+ "description": "Transition INTO this slide, overrides the deck default",
+ "pattern": "^[a-z][a-z0-9-]{0,31}$",
+ "type": "string"
+ },
+ "zones": {
+ "additionalProperties": {
+ "pattern": "^[a-z][a-z0-9-]{0,31}$",
+ "type": "string"
+ },
+ "description": "Entrance per zone, e.g. { \"image\": \"focus\" }, for the one element that should arrive differently",
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "notes": {
+ "description": "Speaker notes",
+ "maxLength": 1200,
+ "type": "string"
+ },
+ "tone": {
+ "description": "default, inverse (dark on light swapped) or accent (accent colored background, for one or two key moments)",
+ "enum": [
+ "default",
+ "inverse",
+ "accent"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "layout",
+ "intent",
+ "blocks"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "op",
+ "slide"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "background": {
+ "anyOf": [
+ {
+ "description": "Background of the slide. brand = a visual drawn from the brand colors (no assets needed), image = the user's image under an overlay that keeps text legible. Use it for the title and chapter openers, not on every slide",
+ "oneOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "type": {
+ "const": "brand",
+ "type": "string"
+ },
+ "visual": {
+ "description": "numeral = the chapter number set very large, field = a color field across part of the slide, geometry = one thin line in the accent along the edge of the slide",
+ "enum": [
+ "numeral",
+ "field",
+ "geometry"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "visual"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "assetId": {
+ "description": "An image asset the user supplied (add_asset). Never a stock or generated image",
+ "minLength": 1,
+ "type": "string"
+ },
+ "focus": {
+ "additionalProperties": false,
+ "description": "Focal point for the crop. Put it where the text is not",
+ "properties": {
+ "x": {
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ },
+ "y": {
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ }
+ },
+ "required": [
+ "x",
+ "y"
+ ],
+ "type": "object"
+ },
+ "overlay": {
+ "description": "How much of the slide background color covers the image so text stays legible, 0 to 0.95. Default 0.55. The browser measures the text over the image and reports the smallest value that works",
+ "maximum": 0.95,
+ "minimum": 0,
+ "type": "number"
+ },
+ "type": {
+ "const": "image",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "assetId"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "null removes the background"
+ },
+ "beat": {
+ "description": "The story beat this slide carries (section pitch, beats): hook, problem, traction, ask...",
+ "enum": [
+ "hook",
+ "problem",
+ "why-now",
+ "solution",
+ "product",
+ "traction",
+ "market",
+ "business-model",
+ "competition",
+ "go-to-market",
+ "roadmap",
+ "team",
+ "financials",
+ "risks",
+ "decision",
+ "ask"
+ ],
+ "type": "string"
+ },
+ "blocks": {
+ "additionalProperties": {
+ "anyOf": [
+ {
+ "oneOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "level": {
+ "description": "display = title and statement slides, h1 = slide heading, h2 = sub heading",
+ "enum": [
+ "display",
+ "h1",
+ "h2"
+ ],
+ "type": "string"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "text": {
+ "description": "Heading. Wrap the key words in ==double equals== to highlight them. Aim for at most 70 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "type": {
+ "const": "heading",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "text",
+ "level"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "size": {
+ "enum": [
+ "lead",
+ "body",
+ "small"
+ ],
+ "type": "string"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "text": {
+ "description": "Paragraph. Aim for at most 260 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "type": {
+ "const": "text",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "text",
+ "size"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "build": {
+ "description": "together = all items with the block, items = one item per click",
+ "enum": [
+ "together",
+ "items"
+ ],
+ "type": "string"
+ },
+ "items": {
+ "items": {
+ "description": "One point, a short sentence, no bullet character. Aim for at most 100 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 5,
+ "minItems": 2,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "bullets",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "items"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "decimals": {
+ "maximum": 2,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "detail": {
+ "description": "Optional context or source. Aim for at most 90 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "label": {
+ "description": "What the number means. Aim for at most 48 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "prefix": {
+ "description": "e.g. $, €",
+ "maxLength": 3,
+ "type": "string"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "suffix": {
+ "description": "e.g. %, x, M, k",
+ "maxLength": 4,
+ "type": "string"
+ },
+ "type": {
+ "const": "stat",
+ "type": "string"
+ },
+ "value": {
+ "description": "The number itself, animated as a count up",
+ "type": "number"
+ }
+ },
+ "required": [
+ "type",
+ "value",
+ "label"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "build": {
+ "description": "together = all items with the block, items = one item per click",
+ "enum": [
+ "together",
+ "items"
+ ],
+ "type": "string"
+ },
+ "items": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "decimals": {
+ "maximum": 2,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "detail": {
+ "description": "Optional context or source. Aim for at most 90 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "label": {
+ "description": "What the number means. Aim for at most 48 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "prefix": {
+ "description": "e.g. $, €",
+ "maxLength": 3,
+ "type": "string"
+ },
+ "suffix": {
+ "description": "e.g. %, x, M, k",
+ "maxLength": 4,
+ "type": "string"
+ },
+ "value": {
+ "description": "The number itself, animated as a count up",
+ "type": "number"
+ }
+ },
+ "required": [
+ "value",
+ "label"
+ ],
+ "type": "object"
+ },
+ "maxItems": 4,
+ "minItems": 2,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "stats",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "items"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "axis": {
+ "description": "Show a value axis with gridlines. Only when the audience must read values off the chart, labels on the bars usually suffice (Tufte)",
+ "type": "boolean"
+ },
+ "caption": {
+ "description": "Source or footnote. Aim for at most 90 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "categories": {
+ "description": "X axis labels (column, stacked, waterfall, line), rows (bar) or segments (donut)",
+ "items": {
+ "maxLength": 24,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 10,
+ "minItems": 2,
+ "type": "array"
+ },
+ "decimals": {
+ "description": "Decimal places of the value labels. Omit it: labels keep the decimals the values have (at most 3), the same for every label",
+ "maximum": 3,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "estimate": {
+ "description": "Index of the first category that is an estimate or plan (IBCS): from there bars are hatched. Name those categories e.g. 2025E",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "highlight": {
+ "description": "Index of the category to draw in the accent color, the rest stays muted",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "kind": {
+ "description": "column, bar (horizontal), line, donut (share of a whole, at most 4 segments read well), stacked (columns split into series), waterfall (bridge: first and last categories are totals, the ones between are changes that add up)",
+ "enum": [
+ "column",
+ "bar",
+ "line",
+ "donut",
+ "stacked",
+ "waterfall"
+ ],
+ "type": "string"
+ },
+ "reference": {
+ "additionalProperties": false,
+ "description": "A horizontal line at a reference value: target, plan or average",
+ "properties": {
+ "label": {
+ "description": "What the line marks, e.g. Target, Plan, Average. Aim for at most 24 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "value": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "value",
+ "label"
+ ],
+ "type": "object"
+ },
+ "series": {
+ "description": "One value per category. Donut takes exactly one series",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "maxLength": 30,
+ "minLength": 1,
+ "type": "string"
+ },
+ "values": {
+ "items": {
+ "type": "number"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "name",
+ "values"
+ ],
+ "type": "object"
+ },
+ "maxItems": 3,
+ "minItems": 1,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "chart",
+ "type": "string"
+ },
+ "unit": {
+ "description": "Shown after values, e.g. %, $M",
+ "maxLength": 6,
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "kind",
+ "categories",
+ "series"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "alt": {
+ "description": "What the image shows. Aim for at most 120 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "assetId": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "fit": {
+ "enum": [
+ "cover",
+ "contain"
+ ],
+ "type": "string"
+ },
+ "focus": {
+ "additionalProperties": false,
+ "description": "Focal point for cover crops",
+ "properties": {
+ "x": {
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ },
+ "y": {
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ }
+ },
+ "required": [
+ "x",
+ "y"
+ ],
+ "type": "object"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "image",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "assetId",
+ "alt",
+ "fit"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "alt": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "assetId": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "logo",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "assetId",
+ "alt"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "items": {
+ "description": "Customer, partner or press logos",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "alt": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "assetId": {
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "assetId",
+ "alt"
+ ],
+ "type": "object"
+ },
+ "maxItems": 8,
+ "minItems": 3,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "logos",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "items"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "author": {
+ "maxLength": 40,
+ "minLength": 1,
+ "type": "string"
+ },
+ "role": {
+ "maxLength": 60,
+ "type": "string"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "text": {
+ "description": "The quote, without quotation marks. Aim for at most 200 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "type": {
+ "const": "quote",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "text",
+ "author"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "build": {
+ "description": "together = all items with the block, items = one item per click",
+ "enum": [
+ "together",
+ "items"
+ ],
+ "type": "string"
+ },
+ "current": {
+ "description": "Index of the milestone that represents now",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "items": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "label": {
+ "description": "Date or phase, e.g. Q3 2026",
+ "maxLength": 16,
+ "minLength": 1,
+ "type": "string"
+ },
+ "text": {
+ "description": "Detail. Aim for at most 80 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "title": {
+ "description": "Milestone. Aim for at most 36 characters",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "label",
+ "title"
+ ],
+ "type": "object"
+ },
+ "maxItems": 6,
+ "minItems": 3,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "timeline",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "items"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "people": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "bio": {
+ "description": "One line of credibility. Aim for at most 80 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "name": {
+ "maxLength": 32,
+ "minLength": 1,
+ "type": "string"
+ },
+ "photoAssetId": {
+ "type": "string"
+ },
+ "role": {
+ "maxLength": 40,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "role"
+ ],
+ "type": "object"
+ },
+ "maxItems": 6,
+ "minItems": 1,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "team",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "people"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "build": {
+ "description": "together = all items with the block, items = one item per click",
+ "enum": [
+ "together",
+ "items"
+ ],
+ "type": "string"
+ },
+ "columns": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "highlight": {
+ "description": "Our column, drawn with the accent",
+ "type": "boolean"
+ },
+ "items": {
+ "items": {
+ "description": "Point. Aim for at most 60 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 5,
+ "minItems": 1,
+ "type": "array"
+ },
+ "title": {
+ "maxLength": 28,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "title",
+ "items"
+ ],
+ "type": "object"
+ },
+ "maxItems": 3,
+ "minItems": 2,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "comparison",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "columns"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "build": {
+ "description": "together = all items with the block, items = one item per click",
+ "enum": [
+ "together",
+ "items"
+ ],
+ "type": "string"
+ },
+ "items": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "icon": {
+ "description": "An icon that carries the meaning of the card (the kind of risk, the step of a process). Give all cards one or none, and avoid the same icon on two cards unless they mean the same thing",
+ "enum": [
+ "risk",
+ "security",
+ "lock",
+ "time",
+ "people",
+ "person",
+ "goal",
+ "growth",
+ "decline",
+ "chart",
+ "money",
+ "global",
+ "speed",
+ "done",
+ "fail",
+ "layers",
+ "settings",
+ "data",
+ "cloud",
+ "delivery",
+ "company",
+ "document",
+ "search",
+ "mail",
+ "launch",
+ "milestone",
+ "link",
+ "balance",
+ "partnership",
+ "idea",
+ "package",
+ "route"
+ ],
+ "type": "string"
+ },
+ "text": {
+ "description": "Card text. Aim for at most 110 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "title": {
+ "description": "Card title. Aim for at most 32 characters",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "title",
+ "text"
+ ],
+ "type": "object"
+ },
+ "maxItems": 4,
+ "minItems": 2,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "cards",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "items"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "columns": {
+ "items": {
+ "maxLength": 24,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 5,
+ "minItems": 2,
+ "type": "array"
+ },
+ "highlightColumn": {
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "rows": {
+ "description": "Each row has one cell per column",
+ "items": {
+ "items": {
+ "maxLength": 40,
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "maxItems": 6,
+ "minItems": 1,
+ "type": "array"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "type": {
+ "const": "table",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "columns",
+ "rows"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "detail": {
+ "description": "Contact, link or next step. Aim for at most 80 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "step": {
+ "description": "Reveal step: 0 or omitted = with slide entrance, 1..5 = on click, in order",
+ "maximum": 5,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "text": {
+ "description": "The ask or call to action. ==Highlight== the amount or key words. Aim for at most 70 characters",
+ "minLength": 1,
+ "type": "string"
+ },
+ "type": {
+ "const": "cta",
+ "type": "string"
+ }
+ },
+ "required": [
+ "type",
+ "text"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "description": "Zones to set. null removes the block from the zone. Unlisted zones stay",
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "composition": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "description": "The geometry of the slide grid as intent: where the content sits, how two columns share the width and which zone leads. The engine derives the numbers and measures that the slide holds. Without it the slide follows the composition of the school",
+ "properties": {
+ "axis": {
+ "description": "left (default), center (low density layouts with one column) or asymmetric (the content is pushed right, the left side stays empty on purpose)",
+ "enum": [
+ "left",
+ "center",
+ "asymmetric"
+ ],
+ "type": "string"
+ },
+ "dominant": {
+ "description": "The zone that leads and gets the larger column, in a two column layout",
+ "minLength": 1,
+ "type": "string"
+ },
+ "split": {
+ "description": "Ratio of the two columns of title-image, text-image, image-text and chart-insight",
+ "enum": [
+ "1:3",
+ "1:2",
+ "1:1",
+ "2:1",
+ "3:1"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "null returns the slide to the composition of its school. A new layout resets it too, unless you give one"
+ },
+ "intent": {
+ "description": "The one thing this slide must communicate, as a sentence. Not shown on the slide",
+ "maxLength": 160,
+ "minLength": 1,
+ "type": "string"
+ },
+ "layout": {
+ "description": "Layout id from instadeck://layouts",
+ "enum": [
+ "title",
+ "title-image",
+ "statement",
+ "section",
+ "headline-stat",
+ "stats",
+ "points",
+ "text-image",
+ "image-text",
+ "image-full",
+ "chart",
+ "chart-insight",
+ "cards",
+ "comparison",
+ "timeline",
+ "team",
+ "quote",
+ "logos",
+ "table",
+ "closing"
+ ],
+ "type": "string"
+ },
+ "motion": {
+ "additionalProperties": false,
+ "properties": {
+ "entrance": {
+ "description": "Entrance of this slide's content, overrides the deck default. An exception that marks a key moment",
+ "pattern": "^[a-z][a-z0-9-]{0,31}$",
+ "type": "string"
+ },
+ "transition": {
+ "description": "Transition INTO this slide, overrides the deck default",
+ "pattern": "^[a-z][a-z0-9-]{0,31}$",
+ "type": "string"
+ },
+ "zones": {
+ "additionalProperties": {
+ "pattern": "^[a-z][a-z0-9-]{0,31}$",
+ "type": "string"
+ },
+ "description": "Entrance per zone, e.g. { \"image\": \"focus\" }, for the one element that should arrive differently",
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "notes": {
+ "maxLength": 1200,
+ "type": "string"
+ },
+ "op": {
+ "const": "update_slide",
+ "type": "string"
+ },
+ "slide_id": {
+ "type": "string"
+ },
+ "tone": {
+ "description": "default, inverse (dark on light swapped) or accent (accent colored background, for one or two key moments)",
+ "enum": [
+ "default",
+ "inverse",
+ "accent"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "slide_id"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "op": {
+ "const": "remove_slide",
+ "type": "string"
+ },
+ "slide_id": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "slide_id"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "op": {
+ "const": "move_slide",
+ "type": "string"
+ },
+ "slide_id": {
+ "type": "string"
+ },
+ "to": {
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "op",
+ "slide_id",
+ "to"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "design": {
+ "additionalProperties": false,
+ "description": "Only the fields to change",
+ "properties": {
+ "colors": {
+ "additionalProperties": false,
+ "properties": {
+ "accent": {
+ "description": "Signal color: key numbers, highlights, chart focus. Never for decoration",
+ "type": "string"
+ },
+ "accent2": {
+ "description": "Secondary chart and diagram color",
+ "type": "string"
+ },
+ "bg": {
+ "description": "Main background",
+ "type": "string"
+ },
+ "fg": {
+ "description": "Main text",
+ "type": "string"
+ },
+ "muted": {
+ "description": "Secondary text: labels, captions, detail",
+ "type": "string"
+ },
+ "surface": {
+ "description": "Card and panel background, close to bg",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "fonts": {
+ "additionalProperties": false,
+ "properties": {
+ "body": {
+ "oneOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "family": {
+ "description": "Family from the curated Google Fonts list (instadeck://fonts)",
+ "enum": [
+ "Inter",
+ "Inter Tight",
+ "Plus Jakarta Sans",
+ "Manrope",
+ "DM Sans",
+ "Space Grotesk",
+ "Sora",
+ "Outfit",
+ "Work Sans",
+ "IBM Plex Sans",
+ "Archivo",
+ "Schibsted Grotesk",
+ "Geist",
+ "Figtree",
+ "Fraunces",
+ "Playfair Display",
+ "Instrument Serif",
+ "Source Serif 4",
+ "Newsreader",
+ "Libre Caslon Text",
+ "DM Serif Display",
+ "Bricolage Grotesque",
+ "Syne",
+ "Unbounded",
+ "Big Shoulders Display",
+ "JetBrains Mono",
+ "IBM Plex Mono"
+ ],
+ "type": "string"
+ },
+ "source": {
+ "const": "google",
+ "type": "string"
+ }
+ },
+ "required": [
+ "source",
+ "family"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "assetId": {
+ "description": "Font file added with add_asset (woff2, woff, ttf, otf)",
+ "type": "string"
+ },
+ "family": {
+ "description": "Name to register the font under",
+ "minLength": 1,
+ "type": "string"
+ },
+ "source": {
+ "const": "asset",
+ "type": "string"
+ },
+ "weight": {
+ "description": "Weight of this file",
+ "maximum": 900,
+ "minimum": 100,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "source",
+ "assetId",
+ "family",
+ "weight"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "heading": {
+ "oneOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "family": {
+ "description": "Family from the curated Google Fonts list (instadeck://fonts)",
+ "enum": [
+ "Inter",
+ "Inter Tight",
+ "Plus Jakarta Sans",
+ "Manrope",
+ "DM Sans",
+ "Space Grotesk",
+ "Sora",
+ "Outfit",
+ "Work Sans",
+ "IBM Plex Sans",
+ "Archivo",
+ "Schibsted Grotesk",
+ "Geist",
+ "Figtree",
+ "Fraunces",
+ "Playfair Display",
+ "Instrument Serif",
+ "Source Serif 4",
+ "Newsreader",
+ "Libre Caslon Text",
+ "DM Serif Display",
+ "Bricolage Grotesque",
+ "Syne",
+ "Unbounded",
+ "Big Shoulders Display",
+ "JetBrains Mono",
+ "IBM Plex Mono"
+ ],
+ "type": "string"
+ },
+ "source": {
+ "const": "google",
+ "type": "string"
+ }
+ },
+ "required": [
+ "source",
+ "family"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "assetId": {
+ "description": "Font file added with add_asset (woff2, woff, ttf, otf)",
+ "type": "string"
+ },
+ "family": {
+ "description": "Name to register the font under",
+ "minLength": 1,
+ "type": "string"
+ },
+ "source": {
+ "const": "asset",
+ "type": "string"
+ },
+ "weight": {
+ "description": "Weight of this file",
+ "maximum": 900,
+ "minimum": 100,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "source",
+ "assetId",
+ "family",
+ "weight"
+ ],
+ "type": "object"
+ }
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "shape": {
+ "additionalProperties": false,
+ "properties": {
+ "cards": {
+ "description": "How cards and panels are drawn",
+ "enum": [
+ "flat",
+ "outline",
+ "filled"
+ ],
+ "type": "string"
+ },
+ "radius": {
+ "description": "Corner radius of cards, images and charts in px",
+ "maximum": 32,
+ "minimum": 0,
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "space": {
+ "additionalProperties": false,
+ "properties": {
+ "density": {
+ "enum": [
+ "airy",
+ "balanced",
+ "compact"
+ ],
+ "type": "string"
+ },
+ "unit": {
+ "description": "Spacing unit in px, every gap is a multiple",
+ "maximum": 16,
+ "minimum": 8,
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "type": {
+ "additionalProperties": false,
+ "properties": {
+ "base": {
+ "description": "Body size in px on a 1920x1080 slide",
+ "maximum": 36,
+ "minimum": 22,
+ "type": "number"
+ },
+ "headingCase": {
+ "enum": [
+ "none",
+ "upper"
+ ],
+ "type": "string"
+ },
+ "headingTracking": {
+ "description": "Letter spacing of headings in em",
+ "maximum": 0.05,
+ "minimum": -0.05,
+ "type": "number"
+ },
+ "headingWeight": {
+ "maximum": 900,
+ "minimum": 300,
+ "type": "integer"
+ },
+ "scale": {
+ "enum": [
+ "minor-third",
+ "major-third",
+ "perfect-fourth",
+ "augmented-fourth",
+ "perfect-fifth",
+ "golden"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "op": {
+ "const": "set_design",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "design"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "motion": {
+ "additionalProperties": false,
+ "properties": {
+ "entrance": {
+ "description": "Default entrance of slide content: a preset or a name from vocabulary.entrances",
+ "pattern": "^[a-z][a-z0-9-]{0,31}$",
+ "type": "string"
+ },
+ "heroes": {
+ "description": "Animate numbers, charts and timelines (count up, grow, draw)",
+ "type": "boolean"
+ },
+ "intensity": {
+ "description": "How much this deck moves: still (nothing moves), subtle, expressive, kinetic. Measured against what the motion really does",
+ "enum": [
+ "still",
+ "subtle",
+ "expressive",
+ "kinetic"
+ ],
+ "type": "string"
+ },
+ "rationale": {
+ "description": "Why this motion language fits the audience and brand, one or two sentences",
+ "maxLength": 240,
+ "minLength": 1,
+ "type": "string"
+ },
+ "tempo": {
+ "description": "Scales every duration: calm 1.25x, confident 1x, brisk 0.8x",
+ "enum": [
+ "calm",
+ "confident",
+ "brisk"
+ ],
+ "type": "string"
+ },
+ "transition": {
+ "description": "Default transition between slides: a preset or a name from vocabulary.transitions",
+ "pattern": "^[a-z][a-z0-9-]{0,31}$",
+ "type": "string"
+ },
+ "vocabulary": {
+ "additionalProperties": false,
+ "description": "Entries to add or replace, null removes one. Unlisted entries stay",
+ "properties": {
+ "entrances": {
+ "additionalProperties": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "duration": {
+ "description": "Milliseconds at tempo confident, the deck tempo scales it. 0 = no motion",
+ "maximum": 3000,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "easing": {
+ "description": "Named easing (out-expo, out-cubic, in-out, in-cubic, out-back), CSS keyword, cubic-bezier(...) or linear(...) for springs",
+ "type": "string"
+ },
+ "keyframes": {
+ "description": "States from hidden towards rest. The element always ends in its natural place, so never write the final resting keyframe",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "clipPath": {
+ "description": "CSS clip-path, e.g. inset(0 0 100% 0)",
+ "maxLength": 200,
+ "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
+ "type": "string"
+ },
+ "easing": {
+ "description": "Easing from this keyframe to the next",
+ "type": "string"
+ },
+ "filter": {
+ "description": "CSS filter, e.g. blur(8px)",
+ "maxLength": 200,
+ "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
+ "type": "string"
+ },
+ "offset": {
+ "description": "Position in time 0 to 1, default evenly spaced",
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ },
+ "opacity": {
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ },
+ "transform": {
+ "description": "CSS transform, e.g. translateY(40px) scale(0.96)",
+ "maxLength": 200,
+ "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "maxItems": 6,
+ "type": "array"
+ },
+ "purpose": {
+ "description": "What this motion is for, one sentence",
+ "maxLength": 160,
+ "minLength": 1,
+ "type": "string"
+ },
+ "stagger": {
+ "description": "Milliseconds between blocks that enter together, default from the tempo",
+ "maximum": 600,
+ "minimum": 0,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "purpose",
+ "keyframes",
+ "duration",
+ "easing"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "propertyNames": {
+ "pattern": "^[a-z][a-z0-9-]{0,31}$",
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "transitions": {
+ "additionalProperties": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "duration": {
+ "description": "Milliseconds at tempo confident, the deck tempo scales it. 0 = no motion",
+ "maximum": 2000,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "easing": {
+ "description": "Named easing (out-expo, out-cubic, in-out, in-cubic, out-back), CSS keyword, cubic-bezier(...) or linear(...) for springs",
+ "type": "string"
+ },
+ "enter": {
+ "description": "Incoming slide: states before rest, e.g. [{ transform: 'translateX(1920px)' }]. Rest is the implicit end",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "clipPath": {
+ "description": "CSS clip-path, e.g. inset(0 0 100% 0)",
+ "maxLength": 200,
+ "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
+ "type": "string"
+ },
+ "easing": {
+ "description": "Easing from this keyframe to the next",
+ "type": "string"
+ },
+ "filter": {
+ "description": "CSS filter, e.g. blur(8px)",
+ "maxLength": 200,
+ "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
+ "type": "string"
+ },
+ "offset": {
+ "description": "Position in time 0 to 1, default evenly spaced",
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ },
+ "opacity": {
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ },
+ "transform": {
+ "description": "CSS transform, e.g. translateY(40px) scale(0.96)",
+ "maxLength": 200,
+ "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "maxItems": 6,
+ "type": "array"
+ },
+ "exit": {
+ "description": "Outgoing slide: states after rest, e.g. [{ opacity: 0, transform: 'scale(0.96)' }]. Rest is the implicit start",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "clipPath": {
+ "description": "CSS clip-path, e.g. inset(0 0 100% 0)",
+ "maxLength": 200,
+ "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
+ "type": "string"
+ },
+ "easing": {
+ "description": "Easing from this keyframe to the next",
+ "type": "string"
+ },
+ "filter": {
+ "description": "CSS filter, e.g. blur(8px)",
+ "maxLength": 200,
+ "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
+ "type": "string"
+ },
+ "offset": {
+ "description": "Position in time 0 to 1, default evenly spaced",
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ },
+ "opacity": {
+ "maximum": 1,
+ "minimum": 0,
+ "type": "number"
+ },
+ "transform": {
+ "description": "CSS transform, e.g. translateY(40px) scale(0.96)",
+ "maxLength": 200,
+ "pattern": "^[a-zA-Z0-9\\s().,%+-]*$",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "maxItems": 6,
+ "type": "array"
+ },
+ "over": {
+ "description": "Which slide lies on top during the transition, default exit",
+ "enum": [
+ "exit",
+ "enter"
+ ],
+ "type": "string"
+ },
+ "purpose": {
+ "description": "What this motion is for, one sentence",
+ "maxLength": 160,
+ "minLength": 1,
+ "type": "string"
+ },
+ "shared": {
+ "description": "Elements on both slides (the headline, a logo, the same image) glide from their old place and size to the new one",
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "purpose",
+ "duration",
+ "easing"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "propertyNames": {
+ "pattern": "^[a-z][a-z0-9-]{0,31}$",
+ "type": "string"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "op": {
+ "const": "set_motion",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "motion"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "op": {
+ "const": "set_title",
+ "type": "string"
+ },
+ "title": {
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "title"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "brief": {
+ "additionalProperties": false,
+ "properties": {
+ "audience": {
+ "description": "Who will see it: seed investors, enterprise buyers, partners",
+ "type": "string"
+ },
+ "bigIdea": {
+ "description": "What the audience should take away and do, in one sentence. Every slide serves it",
+ "maxLength": 200,
+ "minLength": 10,
+ "type": "string"
+ },
+ "company": {
+ "description": "Company or product name",
+ "minLength": 1,
+ "type": "string"
+ },
+ "concept": {
+ "additionalProperties": false,
+ "description": "The design concept, required when the deck is created",
+ "properties": {
+ "avoid": {
+ "description": "What the deck must not look like",
+ "maxLength": 160,
+ "minLength": 3,
+ "type": "string"
+ },
+ "idea": {
+ "description": "The visual idea of the deck in one sentence, e.g. a quiet editorial deck where one number per slide speaks",
+ "maxLength": 200,
+ "minLength": 10,
+ "type": "string"
+ },
+ "references": {
+ "description": "Named references, e.g. Bloomberg Businessweek covers, Braun product manuals",
+ "items": {
+ "maxLength": 80,
+ "minLength": 2,
+ "type": "string"
+ },
+ "maxItems": 4,
+ "type": "array"
+ },
+ "school": {
+ "description": "Design school the deck follows (section schools), when one fits",
+ "enum": [
+ "swiss",
+ "editorial",
+ "ma",
+ "keynote",
+ "product-tech",
+ "brutalist",
+ "bauhaus",
+ "functional",
+ "data-editorial",
+ "ibcs",
+ "humanist"
+ ],
+ "type": "string"
+ },
+ "signature": {
+ "description": "One device that recurs on every slide: a rule, a crop, a number style, a color field",
+ "maxLength": 160,
+ "minLength": 3,
+ "type": "string"
+ }
+ },
+ "required": [
+ "idea",
+ "avoid",
+ "signature"
+ ],
+ "type": "object"
+ },
+ "delivery": {
+ "description": "How the deck is used: live (spoken to an audience), pre-read (read alone, no speaker) or both. It decides text density, motion and speaker notes (validation checks density and motion). Ask the user, do not infer it from the industry",
+ "enum": [
+ "live",
+ "pre-read",
+ "both"
+ ],
+ "type": "string"
+ },
+ "frame": {
+ "description": "Narrative frame that orders the story (section pitch, frames): classical, scqa, abt, monroe, story-spine, sparkline, toulmin",
+ "enum": [
+ "classical",
+ "scqa",
+ "abt",
+ "monroe",
+ "story-spine",
+ "sparkline",
+ "toulmin"
+ ],
+ "type": "string"
+ },
+ "goal": {
+ "description": "What the audience should do or believe afterwards",
+ "type": "string"
+ },
+ "language": {
+ "description": "Language of the slide content, BCP 47 tag, e.g. en, cs, de",
+ "minLength": 2,
+ "type": "string"
+ },
+ "topic": {
+ "description": "What the deck is about, e.g. seed round pitch, partner pitch, product launch",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "op": {
+ "const": "set_brief",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "brief"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "brand_kit_id": {
+ "description": "Brand kit whose colors and fonts replace the design",
+ "type": "string"
+ },
+ "op": {
+ "const": "apply_brand",
+ "type": "string"
+ }
+ },
+ "required": [
+ "op",
+ "brand_kit_id"
+ ],
+ "type": "object"
+ }
+]