{
  "note": "Plain ES modules, not minified. Files under js/ are served as they are.",
  "files": [
    {
      "file": "js/art/director.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/director.js",
      "bytes": 3613,
      "lines": 99,
      "purpose": "Page-wide attention budget across the twelve drawings. It never edits a model. It answers claim(id, seconds) when a module's slow driver asks to start an optional excursion, scales how",
      "exports": [
        "Director"
      ]
    },
    {
      "file": "js/art/gallery.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/gallery.js",
      "bytes": 8380,
      "lines": 202,
      "purpose": "Developer gallery: each drawing module at its own size, driven by the same adapter the page uses, with a fixed seed, an injected clock and UTC, selectable detail and motion, and scripted pointer",
      "exports": []
    },
    {
      "file": "js/art/index.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/index.js",
      "bytes": 1050,
      "lines": 23,
      "purpose": "The twelve drawings, each a stateful module behind the page's drawing signature.",
      "exports": [
        "MODULES",
        "ART"
      ]
    },
    {
      "file": "js/art/input.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/input.js",
      "bytes": 4608,
      "lines": 116,
      "purpose": "Pointer features for one drawing: position in the drawing's own units, smoothed velocity, speed, dwell, winding about the center, and time since the pointer left. The tracker sees a position",
      "exports": [
        "PointerTracker",
        "PathReplay",
        "PATHS"
      ]
    },
    {
      "file": "js/art/math/affine.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/math/affine.js",
      "bytes": 1130,
      "lines": 25,
      "purpose": "Plane transforms as homogeneous 3x3 matrices acting on column vectors, stored as the six numbers [a, b, c, d, e, f]: x' = a x + c y + e, y' = b x + d y + f (the canvas matrix layout).",
      "exports": [
        "identity",
        "rotation",
        "translation",
        "multiply",
        "invert",
        "apply",
        "determinant",
        "distance"
      ]
    },
    {
      "file": "js/art/math/bessel.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/math/bessel.js",
      "bytes": 900,
      "lines": 26,
      "purpose": "Bessel functions of the first kind with integer order, and the zeros that fix the vibration modes of an ideal circular membrane clamped at its rim.",
      "exports": [
        "besselJ",
        "ZEROS"
      ]
    },
    {
      "file": "js/art/math/contour.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/math/contour.js",
      "bytes": 2133,
      "lines": 46,
      "purpose": "Marching squares: line segments of the level set of a scalar field sampled on an n by n grid that covers [-1, 1] in both directions. NaN samples mark points outside the domain. Segments",
      "exports": [
        "contour"
      ]
    },
    {
      "file": "js/art/math/halfplane.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/math/halfplane.js",
      "bytes": 2347,
      "lines": 72,
      "purpose": "A convex region as the intersection of half-planes, found by clipping a bounding polygon one half-plane at a time. Each output vertex carries the label of the line its outgoing edge lies on.",
      "exports": [
        "boundPolygon",
        "clip",
        "intersect",
        "area",
        "edgeLengths",
        "extreme"
      ]
    },
    {
      "file": "js/art/math/optics.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/math/optics.js",
      "bytes": 4411,
      "lines": 113,
      "purpose": "Ray tracing through a convex polygon of one refractive index in air: ray-edge intersection, Snell refraction, total internal reflection. Pure functions, no drawing.",
      "exports": [
        "outwardNormals",
        "reflect",
        "refract",
        "criticalAngle",
        "pointInPoly",
        "traceRay",
        "countReflections"
      ]
    },
    {
      "file": "js/art/math/pentagrid.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/math/pentagrid.js",
      "bytes": 4629,
      "lines": 104,
      "purpose": "Penrose-type rhombus tilings by de Bruijn's pentagrid method. Five families of parallel lines, family j perpendicular to e_j = (cos 72j, sin 72j) degrees, with line offsets gamma_j. Every",
      "exports": [
        "E",
        "EI",
        "gammaFor",
        "tiling",
        "topology"
      ]
    },
    {
      "file": "js/art/math/sky.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/math/sky.js",
      "bytes": 5225,
      "lines": 92,
      "purpose": "Star catalog, sidereal time, horizontal coordinates, and a stereographic view of the sky. Celestial calculations stay apart from the display projection: the projection can tilt without",
      "exports": [
        "STARS",
        "LINES",
        "CONSTELLATIONS",
        "SKY_SITE",
        "siderealHours",
        "horizontal",
        "unitFromAltAz",
        "placeStars",
        "viewBasis",
        "project",
        "unproject",
        "TWO_PI"
      ]
    },
    {
      "file": "js/art/math/util.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/math/util.js",
      "bytes": 4128,
      "lines": 107,
      "purpose": "Small numeric helpers shared by every drawing module. No DOM, no canvas. factor for an exponential approach with time constant tau, valid for any step size",
      "exports": [
        "TAU",
        "clamp",
        "lerp",
        "smooth",
        "easeOut",
        "easeInOut",
        "wrapPi",
        "expK",
        "rgba",
        "mix",
        "Rng",
        "hashString",
        "cloneState",
        "isFiniteState",
        "Heap"
      ]
    },
    {
      "file": "js/art/modules/auto-relay.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/modules/auto-relay.js",
      "bytes": 13378,
      "lines": 322,
      "purpose": "auto.relay70: a small deterministic discrete-event model of a job with two branches that must both finish before it continues. place of each node on the cell, and the edges between them (quadratic curves)",
      "exports": [
        "edgePoint",
        "createWorld",
        "advance",
        "setSlow"
      ]
    },
    {
      "file": "js/art/modules/caltpa.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/modules/caltpa.js",
      "bytes": 7122,
      "lines": 164,
      "purpose": "CalTPA Writing Studio: a polygon that stays inside seven moving boundaries (half-plane intersection). slack of each boundary at the drift clock, before the pointer's adjustment",
      "exports": [
        "NC",
        "NORMALS",
        "S_MIN"
      ]
    },
    {
      "file": "js/art/modules/chromata.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/modules/chromata.js",
      "bytes": 11993,
      "lines": 283,
      "purpose": "Chromata: pathfinders cross a picture, steered by color, edge direction, coverage and barriers. After Michael Bromley's Chromata. the picture the pathfinders cross: sky, sun, two hills, water",
      "exports": [
        "GN",
        "picture"
      ]
    },
    {
      "file": "js/art/modules/code-playground.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/modules/code-playground.js",
      "bytes": 12426,
      "lines": 316,
      "purpose": "Code Playground. Plane transforms do not commute: rotate-then-translate and translate-then-rotate end in different places. A short program of rotations (R) and translations (T), kept as a list of",
      "exports": [
        "COMMUTATOR",
        "RT",
        "TR",
        "inverseProgram",
        "opMatrix",
        "programMatrix",
        "commutatorShift",
        "poses"
      ]
    },
    {
      "file": "js/art/modules/focus-matrix.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/modules/focus-matrix.js",
      "bytes": 10187,
      "lines": 243,
      "purpose": "Focus Matrix: one-dimensional optimal transport, a fixed amount of material moved from one rail to another. target settings: weight, center and width of three concentrations, as the picture steps through them",
      "exports": [
        "BINS",
        "cumulative",
        "quantile",
        "cdfAt",
        "monotonePlan"
      ]
    },
    {
      "file": "js/art/modules/lithorium.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/modules/lithorium.js",
      "bytes": 10622,
      "lines": 257,
      "purpose": "Lithorium: a Penrose-type rhombus tiling built from a pentagrid; its offsets drift, and the tiling rearranges in rows at discrete moments. rebuilds the patch for the current offsets; tiles that persist keep their fade state",
      "exports": [
        "G0"
      ]
    },
    {
      "file": "js/art/modules/long-night.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/modules/long-night.js",
      "bytes": 15873,
      "lines": 371,
      "purpose": "Long Night: the bright stars over Los Angeles for the current time on a stereographic chart, with the zenith near the center and the horizon on a ring of pines. The pointer tilts the chart. Stars",
      "exports": [
        "HR",
        "MAX_TILT",
        "TRACK_STEP_MS",
        "makeView",
        "trackSamples"
      ]
    },
    {
      "file": "js/art/modules/math-mastery.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/modules/math-mastery.js",
      "bytes": 8357,
      "lines": 203,
      "purpose": "Math Mastery: exact dissections that keep their area, as rectangles are cut and reassembled. pieces of the shear dissection of a b by H rectangle: the top edge slides by s u, the triangle",
      "exports": [
        "shearPieces",
        "polygonArea",
        "euclidSquares",
        "SCENE_LIST",
        "SHEAR_SIZE"
      ]
    },
    {
      "file": "js/art/modules/onleigh.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/modules/onleigh.js",
      "bytes": 10175,
      "lines": 244,
      "purpose": "Onleigh Crystals. Geometric optics on a faceted outline: five rays from one emitter refract into the crystal (index 1.5, an authored display value, not a measurement of quartz), reflect inside",
      "exports": [
        "POLY",
        "NORMALS",
        "rayFan"
      ]
    },
    {
      "file": "js/art/modules/roots-of-reason.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/modules/roots-of-reason.js",
      "bytes": 15202,
      "lines": 365,
      "purpose": "Roots of Reason. Space colonization: resource points are scattered in a crown region above a ground line and a root region below it. Each growth step, every point attracts the nearest branch",
      "exports": [
        "normalize"
      ]
    },
    {
      "file": "js/art/modules/sound-toys.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/modules/sound-toys.js",
      "bytes": 10536,
      "lines": 256,
      "purpose": "Sound Toys: nine coupled phase oscillators on a ring, the Kuramoto model. coupling matrix for a global scale and optional per-oscillator local factors",
      "exports": [
        "N",
        "coupling",
        "deriv",
        "rk4",
        "order"
      ]
    },
    {
      "file": "js/art/modules/study-cards.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/modules/study-cards.js",
      "bytes": 9544,
      "lines": 239,
      "purpose": "Physics flashcards. The vibration modes of an ideal circular membrane clamped at its rim: ten modes (Bessel function in the radius, cosine or sine in the angle), each a damped oscillator.",
      "exports": [
        "MODES",
        "phiAt",
        "stepMode",
        "modeEnergy"
      ]
    },
    {
      "file": "js/art/render.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/render.js",
      "bytes": 3232,
      "lines": 86,
      "purpose": "Drawing frame shared by every module. Modules draw in normalized units: the center of the cell is (0, 0), its mean vertex radius is 1, x runs right and y runs down. Stroke widths are given in CSS",
      "exports": [
        "makeFrame",
        "setupFrame"
      ]
    },
    {
      "file": "js/art/runtime.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art/runtime.js",
      "bytes": 4451,
      "lines": 128,
      "purpose": "Adapter between a stateful drawing module and the page's drawing signature   step(ctx, w, h, t, dt, io)",
      "exports": [
        "STEP",
        "createArtwork",
        "makeArt"
      ]
    },
    {
      "file": "js/art.js",
      "url": "https://impossible-spaces-landing-v2.pages.dev/js/art.js",
      "bytes": 244,
      "lines": 4,
      "purpose": "Public drawing interface of the page: ART maps a project id to a factory for its step function step(ctx, w, h, t, dt, io). The modules live under js/art/.",
      "exports": []
    },
    {
      "file": "js/content.js",
      "url": "https://impossible-spaces-landing-v2.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-v2.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-v2.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-v2.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-v2.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-v2.pages.dev/js/main.js",
      "bytes": 11420,
      "lines": 348,
      "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-v2.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-v2.pages.dev/js/view.js",
      "bytes": 37277,
      "lines": 986,
      "purpose": "the group colors are chosen for paper; on the dark ground they are lifted to one lightness",
      "exports": [
        "liftForDark",
        "PALETTES",
        "DiskView"
      ]
    },
    {
      "file": "functions/api/sky.js",
      "url": null,
      "bytes": 1617,
      "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": 11797,
      "lines": 217,
      "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": []
    }
  ]
}
