Clickable previews: every still links to its exact app frame

New shared component src/ui/preview.js (appFrameUrl + previewLink): song + seed + frame + venue/venueSel deep-links. App honors ?frame= (warm seek on bank-song load) and ?venueSel= via shared pinVenueShell helper (src/venues/pin.js), which filmstrip and venue-gallery now also use. Filmstrip figures and venue-gallery cards wrap canvases; gallery cells stay unlinked (isolated scene probes, not reproducible in-app).
This commit is contained in:
Dejvino
2026-09-20 17:08:03 +02:00
parent cd7dfcd63d
commit 6c7e314a3e
6 changed files with 182 additions and 31 deletions
+2 -8
View File
@@ -22,9 +22,9 @@
import { Show, FADE_SECONDS } from '../Show.js';
import { generateLook } from '../look/LookGenerator.js';
import { venues } from '../venues/registry.js';
import { song, SONGS } from '../audio/songbank.js';
import { hashString } from '../engine/rng.js';
import { pinVenueShell } from '../venues/pin.js';
import { frameDescriptor, motionDescriptor } from './variety/descriptors.js';
import { descriptorDistance, directionOf, STRUCTURAL } from './variety/signature.js';
import { describeStory } from '../look/Story.js';
@@ -79,13 +79,7 @@ export function renderSong(show, name, { duration, every, venueEnabled = null, v
// Pin one venue in every row (same shell-swap as the venue gallery): the
// VenueSpec population stays the census one, only the shell is forced.
const sel = venueSel || (typeof location !== 'undefined' && new URLSearchParams(location.search).get('venueSel')) || null;
if (sel && look.venue) {
const picked = venues.find((v) => v.name === sel);
if (!picked) throw new Error(`unknown venue "${sel}"`);
look.venue.module = picked;
look.venue.name = picked.name;
look.venue.archetype = picked.archetype;
}
if (sel) pinVenueShell(look, sel);
show.useTrack(track, look);
const frames = [];