/* hero.mjs — one composition, grouped by craft / plex sheet. Edit any group independently. Every placeable layer has a uniform transform { x, y, rotation, scale } (x,y = centre offset in −1..1). Render: node tools/render-composition.mjs compositions/hero.mjs out.svg 1600 */ export const composition = { size: 1600, seed: 'MESON-5113', // ---- BACKGROUND — the lit substrate + surface craft ---- background: { color: 'rgb(229,222,203)', film: { opacity: 0.6, density: 0.5, seed: 8 }, // milky diffusion aging: { opacity: 0.5, scratches: 5, dust: 0.45, foxing: 0.5, seed: 5 }, grain: { opacity: 0.42, intensity: 0.42, seed: 19 }, }, // ---- FIELD 1 — the ridgeline vacuum carpet (the sea) ---- fieldSea: { enabled: true, transform: { x: 0, y: 0, rotation: 0, scale: 1 }, seed: 'VACUUM-5113', color: { hueBack: 0.54, hueFront: 0.47, sat: 0.6 }, layers: 3, blurPerLayer: [2.6, 1.1, 0], seedPerLayer: ['fieldA', 'fieldB', 'fieldC'], opacityPerLayer: [0.5, 0.72, 0.95], chaos: 0.32, blips: 0.7, mound: 0.3, horizonY: 0.36, lines: 46, overlap: 1.7, }, // ---- FIELD 2 — the rippled perspective depth grid ---- fieldGrid: { enabled: true, pos: 'over', // 'over' | 'behind' the sea transform: { x: 0, y: 0, rotation: 0, scale: 1 }, color: { hue: 0.56, hue2: 0.5, sat: 0.26, lightNear: 0.44, lightFar: 0.66 }, opacity: 0.38, vp: [0, 0.0], dir: 0, spread: Math.PI * 2, rays: 30, depthLines: 17, rMin: 0.04, rMax: 3.0, ripple: { amp: 0.07, ampRad: 0.06, freqR: 2.4, freqA: 5, phase: 0 }, layers: 2, blurPerLayer: [1.1, 0], }, // ---- DISK — the shock "sun" (own centre / rotation / scale) ---- disk: { enabled: true, transform: { x: 0.0, y: -0.25, rotation: 0, scale: 0.95 }, hue: 0.06, sat: 0.82, size: 0.16, pressure: 0.85, intensity: 0.85, striations: 0.6, stain: 0.35, soften: 1.35, }, // ---- BUBBLE — the particle event / tracks (decoupled from the disk) ---- bubble: { enabled: true, transform: { x: 0.28, y: -0.1, rotation: 12, scale: 0.82 }, palette: 'magentarise', saturation: 1.05, traceHue: 0, primaries: 18, sweepers: 5, cosmics: 6, eloss: 0.34, bfield: 1.0, deltaRate: 0.6, }, // ---- FIDUCIARIES — frame-level "No 001" + arrow (never scales w/ event) ---- fiduciaries: { enabled: true, label: 'No 001', pencil: '#39312a', width: 1.0, arrow: true, corners: false, // target defaults to the bubble centre; set explicitly to decouple: target: [0.28, -0.1], transform: { x: 0, y: 0, rotation: 0, scale: 1 }, }, };