{
  "id": "op-art",
  "name": "Op Art",
  "tagline": "Hypnotic Truchet mazes, pulsing stripe tunnels and moiré, with one red wave flooding through the pattern.",
  "description": "Optical-art style for exhibitions, festivals, music releases and product drops that want to stop the scroll. Seeded Truchet tile mazes re-wire themselves as rotation waves sweep across the grid, a red ripple runs through the arcs, a tunnel of concentric rings XORs against rotating spokes, and chunky geometric type is punched out of solid plates so the pattern shows through the letters. Strict black and cream with a single red accent, small mono spec labels in black tags in the corners, and a moiré end card.",
  "mood": [
    "hypnotic",
    "graphic",
    "precise"
  ],
  "pacing": "medium",
  "format": "1:1",
  "width": 1080,
  "height": 1080,
  "durationSeconds": 7,
  "palette": {
    "ink": "#0d0d0c",
    "cream": "#efe8da",
    "red": "#e8402a",
    "pink": "#f2a493"
  },
  "fonts": {
    "display": {
      "family": "Unbounded",
      "weights": [
        900
      ],
      "source": "Google Fonts",
      "usage": "Uppercase knockout words 176–250px cut out of solid plates via SVG masks; 92px on the end card"
    },
    "body": {
      "family": "IBM Plex Mono",
      "weights": [
        500
      ],
      "source": "Google Fonts",
      "usage": "Spec labels 15px uppercase, tracking 0.12em, cream on black tags"
    }
  },
  "easing": {
    "tileRotate": "smoothstep (per-tile, staggered by distance)",
    "plate": "expo.out",
    "plateSwap": "back.out(3)",
    "tunnel": "none",
    "endCard": "expo.out"
  },
  "transitions": [
    "hard cut between pattern systems (maze → tunnel → inverted maze → moiré)",
    "solid plates wipe in across the pattern and carry knocked-out type",
    "palette inversion: cream-on-black maze becomes black-on-cream"
  ],
  "textAnimations": [
    "type is a hole in a plate: the plate grows from a 0-height line and the pattern shows through the letters",
    "word swap inside the same plate with a back.out bump",
    "date block scales up from scaleY 0, tag line rises 30px",
    "end-card words rise 40px with expo.out, 0.1s stagger"
  ],
  "rhythm": {
    "averageShotSeconds": 1.75,
    "notes": "Four pattern systems, ~1.4–2.2s each. The pattern itself never stops moving: rotation waves take ~1.2s to cross the grid, the tunnel streams outward continuously."
  },
  "tags": [
    "op-art",
    "pattern",
    "truchet",
    "exhibition",
    "generative",
    "monochrome"
  ],
  "guide": "- Palette is strictly #0d0d0c and #efe8da plus one accent red #e8402a (pink #f2a493 only as the soft edge of the red wave). No other colours, no gradients.\n- Truchet maze: 12–16 tiles across, each tile two quarter-circle arcs (stroke 30% of tile size), orientation from a seeded PRNG. Animate rotation waves: each tile turns +90° with smoothstep over ~0.4s, delayed by its distance from an origin (whole grid in ~1.2s).\n- Colour the accent by distance, not by tile: an expanding ring (band ~70px red, ~80px pink edge) or a flood front from a corner.\n- Tunnel: ~24 concentric rings (stroke = half the spacing) streaming outward with a breathing spacing, XORed with 28 rotating spokes via mix-blend-mode: difference.\n- Type is always knocked out of a solid plate (SVG mask) in Unbounded 900 uppercase, one short word per plate; plates wipe in with expo.out. Keep words ≤5 letters at 176–250px on 1080.\n- Corner labels: IBM Plex Mono 15px uppercase in black tags with red separators (title, seed, tile count, scene n / 4).\n- End on a moiré of two offset concentric ring sets behind a black disc with a red rim and the name; avoid soft fades and drop shadows."
}
