{
  "note": "Plain ES modules, not minified. Files under js/ are served as they are.",
  "files": [
    {
      "file": "js/art.js",
      "url": "https://impossible-spaces-landing.pages.dev/js/art.js",
      "bytes": 25114,
      "lines": 636,
      "purpose": "One moving drawing per project, each showing what that project does. step signature: (ctx, w, h, t, dt, io)",
      "exports": [
        "STARS",
        "LINES",
        "SKY_SITE",
        "placeStars",
        "ART"
      ]
    },
    {
      "file": "js/content.js",
      "url": "https://impossible-spaces-landing.pages.dev/js/content.js",
      "bytes": 20467,
      "lines": 591,
      "purpose": "generated from relay70 portfolio registry/catalog.json and site.json (entries with preview true, minus impossible-spaces)",
      "exports": [
        "PROJECTS",
        "CATEGORIES",
        "SITE"
      ]
    },
    {
      "file": "js/dossier.js",
      "url": "https://impossible-spaces-landing.pages.dev/js/dossier.js",
      "bytes": 2841,
      "lines": 79,
      "purpose": "the project's text, set in the margins around the opened cell",
      "exports": [
        "Dossier"
      ]
    },
    {
      "file": "js/field.js",
      "url": "https://impossible-spaces-landing.pages.dev/js/field.js",
      "bytes": 7348,
      "lines": 213,
      "purpose": "The coloring of the plane and the pathfinders that walk it. ",
      "exports": [
        "hypDist",
        "buildGraph",
        "assignRegions",
        "geodesicSamples",
        "Pathfinders"
      ]
    },
    {
      "file": "js/hyper.js",
      "url": "https://impossible-spaces-landing.pages.dev/js/hyper.js",
      "bytes": 2517,
      "lines": 72,
      "purpose": "Poincaré disk machinery. Complex numbers are {re, im}; isometries are SU(1,1) matrices [[a,b],[conj(b),conj(a)]] acting z -> (az+b)/(conj(b)z+conj(a)).",
      "exports": [
        "C0",
        "C1",
        "cadd",
        "csub",
        "cmul",
        "cscale",
        "cdiv",
        "cabs2",
        "cabs",
        "cconj",
        "carg",
        "identity",
        "normalize",
        "mul",
        "apply",
        "inverse",
        "translation",
        "rotation",
        "translateFromTo",
        "interpTranslation"
      ]
    },
    {
      "file": "js/layout.js",
      "url": "https://impossible-spaces-landing.pages.dev/js/layout.js",
      "bytes": 3465,
      "lines": 76,
      "purpose": "Where everything sits on the plane. Used by the page and by the build that writes /api, so both describe exactly the same layout.",
      "exports": [
        "FRAMEABLE",
        "HUBS",
        "buildLayout"
      ]
    },
    {
      "file": "js/main.js",
      "url": "https://impossible-spaces-landing.pages.dev/js/main.js",
      "bytes": 9675,
      "lines": 299,
      "purpose": "a group brought to the middle is enlarged on a phone so its project names fit words for the cell nearest the middle: the introduction at the center, a group's summary on a group",
      "exports": []
    },
    {
      "file": "js/tiling.js",
      "url": "https://impossible-spaces-landing.pages.dev/js/tiling.js",
      "bytes": 4531,
      "lines": 133,
      "purpose": "{p,q} tiling generator for the Poincare disk. center of the circle through u and v that meets the unit circle at right angles",
      "exports": [
        "geodesicCircle",
        "sampleEdges",
        "generateTiling"
      ]
    },
    {
      "file": "js/view.js",
      "url": "https://impossible-spaces-landing.pages.dev/js/view.js",
      "bytes": 30723,
      "lines": 820,
      "purpose": "the group colors are chosen for paper; on the dark ground they are lifted to one lightness",
      "exports": [
        "DiskView"
      ]
    },
    {
      "file": "functions/api/sky.js",
      "url": null,
      "bytes": 1608,
      "lines": 28,
      "purpose": "Star positions for any moment and place, computed by the same code that draws the Long Night cell. GET /api/sky            now, as seen from Los Angeles",
      "exports": [
        "onRequestGet"
      ]
    },
    {
      "file": "tools/build-api.mjs",
      "url": null,
      "bytes": 10274,
      "lines": 203,
      "purpose": "Writes the machine-readable copy of the page: llms.txt and the JSON files under api/. Everything is computed by the same modules the page runs, so the two cannot disagree.",
      "exports": []
    }
  ]
}
