{
  "schemaVersion": 1,
  "id": "deco-elevator",
  "version": "1.0.0",
  "status": "published",
  "kind": "background",
  "title": "Midnight Elevator",
  "summary": "Emerald Art Deco elevator doors part to reveal an impossible golden city of setback towers and a sunburst, then close again. Brass, gold and perspective lines. Loops.",
  "description": "Brushed emerald elevator doors with brass grilles and stepped gold jambs slide apart on an impossible luminous city: setback towers, a gold spire, a sunburst of arcs and a mirrored avenue receding to a point. The camera pushes forward through the opening, then the doors close again so the film loops. The look is built from precise 2.5D planes and perspective linework rather than costly 3D ray marching, which keeps it light to render. The film has no settings.",
  "role": "Shader film (three.js): Art Deco architectural cinema, a finished 8-second portrait film with no settings.",
  "collections": [
    "impossible-worlds",
    "product-reveals",
    "hypnotic-loops"
  ],
  "tags": [
    "art deco",
    "elevator",
    "doors",
    "city",
    "skyscraper",
    "gold",
    "emerald",
    "1920s",
    "architecture",
    "luxury",
    "sunburst",
    "reveal",
    "loop",
    "portrait film"
  ],
  "synonyms": [
    "art deco animation",
    "elevator doors opening",
    "golden city",
    "roaring twenties intro",
    "deco skyline",
    "doors opening reveal"
  ],
  "useCases": [
    "A hotel, real-estate or cocktail-bar promo",
    "A 1920s-style party invitation or event opener",
    "A doors-opening reveal for a title or product"
  ],
  "featured": null,
  "publishedAt": "2026-10-10",
  "implementation": {
    "target": "three",
    "runtime": "browser",
    "language": "javascript",
    "module": "esm",
    "entry": "src/deco-elevator.js",
    "exports": [
      {
        "name": "createDecoElevator",
        "signature": "createDecoElevator() => { scene, camera, setSize(width, height), update(time), dispose() }",
        "description": "The film as one full-screen shader; render its scene with its camera straight to the canvas."
      }
    ],
    "reusable": [
      "src/deco-elevator.js"
    ],
    "demo": "demo.js",
    "harness": "index.html"
  },
  "dependencies": [
    {
      "id": "three",
      "version": "0.185.1",
      "reason": "Renderer and a full-screen shader material."
    },
    {
      "id": "apw-runtime",
      "version": "1.0.0",
      "scope": "demo",
      "reason": "Demo harness."
    }
  ],
  "params": [],
  "presets": [],
  "output": {
    "width": 1080,
    "height": 1350,
    "fps": 30,
    "durationSeconds": 8,
    "posterSeconds": 5.5,
    "alpha": false,
    "motion": "procedural",
    "loop": {
      "seamless": true,
      "cycleSeconds": 8,
      "method": "Every part of the film is a function of the time modulo its length, and every motion completes whole cycles, so the last frame meets the first."
    },
    "seed": null
  },
  "composition": {
    "inputs": "The time in seconds, 0 to 8. The film has no other settings.",
    "outputs": "An opaque full-frame picture, already in display colours: render it straight to the canvas.",
    "coordinates": "Composed for a 4:5 portrait frame and measured by the frame height: in a wider frame the picture stays centred at full height and its background fills the sides; in a narrower one, such as 9:16, the sides are cropped.",
    "lighting": "Self-lit: gold linework and a glow around the sunburst behind the tallest tower.",
    "timing": "The doors part, the camera pushes forward down the avenue of towers, then the doors close again.",
    "compatibleWith": [],
    "notes": [
      "Symmetric brass grille doors with gold stepped jambs frame the whole film.",
      "No text or signage: the city is pure geometry.",
      "Every pixel is a function of the time alone, so frames can be rendered in any order."
    ]
  },
  "reuse": [
    "Reveal transition: cut on the closed doors at either end and swap in your own scene as they part.",
    "Event invitation: the open doors hold the golden skyline from about 3 s to 6 s.",
    "Seamless loop: the doors close at the end, so it repeats cleanly."
  ],
  "integration": {
    "newProject": "Create a WebGLRenderer on a canvas (no antialiasing), call createDecoElevator() once and film.setSize(width, height); then for each frame call film.update(timeInSeconds) and renderer.render(film.scene, film.camera).",
    "existingProject": "Copy src/deco-elevator.js, which needs only three. Render film.scene with film.camera into your own canvas or render target; the output is opaque and already in display colours, so use no tone mapping or colour conversion."
  },
  "performance": {
    "notes": "One full-screen fragment shader. About 7 ms a frame at 1080 by 1350 on an integrated Intel GPU (Iris Xe), and about 1 s a frame with software WebGL.",
    "limits": "Plays at 30 frames a second at full size on an integrated GPU."
  },
  "limitations": [
    "The film is finished: it has no settings. To change colours or timing, edit the shader.",
    "It is composed for a 4:5 portrait frame.",
    "Its length is fixed at 8 seconds; repeat the loop to fill a longer clip."
  ],
  "license": {
    "spdx": "MIT",
    "notice": "Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.",
    "thirdParty": []
  },
  "provenance": "From the owner's collection Twenty Impossible Worlds: the original GLSL ES 3.00 shader of the film “Midnight Elevator”, created with ChatGPT / Codex and used as published, wrapped for AI Pixel Wizard as a three.js full-screen shader in October 2026. One literal was changed (an integer 0 passed as a float, which strict WebGL 2 compilers reject). The collection's synthesised soundtrack is not part of this ingredient.",
  "changelog": [
    {
      "version": "1.0.0",
      "date": "2026-10-10",
      "notes": "Initial release."
    }
  ]
}
