{
  "manifestVersion": "1.0.0",
  "site": {
    "title": "Frontend Exhibit",
    "tagline": "A living gallery of bleeding-edge frontend craft",
    "baseUrl": "/Frontend-Exhibit/",
    "hubEntry": "index.html",
    "sharedAssets": {
      "css": "assets/css/",
      "js": "assets/js/"
    }
  },
  "registryRules": {
    "description": "Contract for autonomous agents registering new exhibits. Violating any rule breaks the hub build.",
    "rules": [
      "Each exhibit lives in its own folder under exhibits/<slug>/ and must be fully self-contained (no cross-exhibit imports).",
      "The <slug> must be unique, kebab-case, and match the 'slug' field of its entry below.",
      "Every exhibit folder must contain an index.html as its entry point.",
      "Append new entries to the 'exhibits' array; never mutate or delete existing entries.",
      "Shared design tokens may be consumed from assets/css/ and assets/js/ but never modified by an exhibit agent.",
      "All 'tags' values must come from the 'allowedTags' list; propose additions via a manifest PR, not ad-hoc strings.",
      "'status' must be one of: draft | live | archived. Only 'live' exhibits render on the hub.",
      "No exhibit may include secrets, API keys, analytics beacons, or third-party trackers. This repository is public.",
      "Exhibits render inside the hub's iframe. Any link that leaves the exhibit (back to the catalogue, external pages) must use target=\"_top\" or target=\"_blank\", never a plain same-frame link, or the hub will nest inside itself."
    ]
  },
  "allowedTags": [
    "3d",
    "webgl",
    "shaders",
    "typography",
    "micro-interactions",
    "scroll",
    "animation",
    "css-only",
    "svg",
    "canvas",
    "generative",
    "theme",
    "layout",
    "accessibility",
    "performance"
  ],
  "exhibitEntryTemplate": {
    "slug": "example-exhibit",
    "title": "Example Exhibit",
    "description": "One-sentence summary shown on the hub card.",
    "entry": "exhibits/example-exhibit/index.html",
    "thumbnail": "exhibits/example-exhibit/thumbnail.webp",
    "tags": ["animation"],
    "status": "draft",
    "author": "agent-or-human-identifier",
    "createdAt": "YYYY-MM-DD",
    "dependencies": [],
    "accentColor": "#7c5cff"
  },
  "exhibits": [
    {
      "slug": "gilded-age",
      "title": "The Gilded Age",
      "description": "Procedural gold leaf under a raking light. Press and drag to burnish through to the iron beneath. WebGL2, no libraries.",
      "entry": "exhibits/gilded-age/index.html",
      "tags": ["webgl", "shaders", "typography", "micro-interactions"],
      "status": "live",
      "author": "claude",
      "createdAt": "2026-07-07",
      "dependencies": [],
      "accentColor": "#d9a850"
    },
    {
      "slug": "kinetic-typography",
      "title": "Kinetic Type",
      "description": "A scroll-reactive type engine. Text warps, shears, and scales with scroll velocity and acceleration: variable font axes driven live, RGB split on acceleration, per-character traveling wave, velocity-reactive marquee, pinned scrubbed specimen.",
      "entry": "exhibits/kinetic-typography/index.html",
      "tags": ["typography", "scroll", "animation", "micro-interactions"],
      "status": "live",
      "author": "claude",
      "createdAt": "2026-07-07",
      "dependencies": ["lenis@1.1.14", "gsap@3.12.5"],
      "accentColor": "#d8ff3e"
    },
    {
      "slug": "control-room",
      "title": "Control Room",
      "description": "A brutalist dashboard where the page measures itself. Frame rate, pointer speed, input events, DOM nodes: every numeral's variable font weight is its own live value. Harsh instant inversions, stamp-to-hold instruments, a one-frame master invert.",
      "entry": "exhibits/control-room/index.html",
      "tags": ["typography", "micro-interactions", "layout", "theme"],
      "status": "live",
      "author": "claude",
      "createdAt": "2026-07-07",
      "dependencies": [],
      "accentColor": "#1a2fd6"
    },
    {
      "slug": "rewind-os",
      "title": "Rewind OS",
      "description": "A working desktop that time-travels through five eras of interface history. Drag the timeline and the whole OS re-dresses itself: phosphor terminal, one-bit bitmap, beveled grey, wet gloss, flat. Same windows, same content, only the chrome travels.",
      "entry": "exhibits/rewind-os/index.html",
      "tags": ["theme", "micro-interactions", "animation", "canvas"],
      "status": "live",
      "author": "claude",
      "createdAt": "2026-07-08",
      "dependencies": [],
      "accentColor": "#33ff66"
    },
    {
      "slug": "meridian-survey",
      "title": "Meridian Survey",
      "description": "An animated infographics dashboard for a fictional radio-sky survey. Donut, bar, and scatter charts where every value is a live spring: class chips, quarter control, and a signal-to-noise slider morph all charts in real time, with cross-chart hover highlighting and a table twin for every chart.",
      "entry": "exhibits/meridian-survey/index.html",
      "tags": ["svg", "animation", "micro-interactions", "accessibility"],
      "status": "live",
      "author": "claude",
      "createdAt": "2026-07-08",
      "dependencies": [],
      "accentColor": "#3987e5"
    },
    {
      "slug": "stillroom",
      "title": "Stillroom",
      "description": "A minimal glass workspace over a living gradient field. Frosted panels genuinely refract drifting color blobs beneath them; clicking a card runs a FLIP expansion on generated spring keyframes while the field converges, dilates, and re-tints around it.",
      "entry": "exhibits/stillroom/index.html",
      "tags": ["theme", "micro-interactions", "animation", "canvas", "layout"],
      "status": "live",
      "author": "claude",
      "createdAt": "2026-07-08",
      "dependencies": [],
      "accentColor": "#c9b8f0"
    }
  ]
}
