Exhibition wall where framed photographs hang from a gallery rail on picture cords: grab a frame and it swings like a real pendulum with spring and damping, neighbours feel it through the rail, and an optional draught keeps the wall gently alive. Plain editable tree: section > container > header (eyebrow, h2, artist line, intro, visit details list, button) > a "Hanging Rail" wrapper component whose props are the physics and look controls, holding "Hanging Photo" component instances in its photos slot. Rail props (data attributes read by the inline script): physics (soft|bouncy|stiff) spring and damping of the swing; wind (still|breeze|gusty) idle draught that sways the frames; coupling (true|false) a swinging frame nudges its neighbours through the rail; limit (s|m|l) how far a frame can be pulled (35, 55 or 75 degrees); hang (cords|wire|clip) two picture cords, one wire, or a bulldog clip straight on the rail; rail (rail|wire|none) brushed rail, thin wire or nothing; frame (gallery|polaroid|bare) dark frame with white mat, instant-photo border or the print alone; spots (true|false) soft gallery spotlight above each frame; hint (true|false) the drag hint under the rail. Photo props: image, imageAlt, ratio (portrait|landscape|square), size (s|m|l), cord (short|medium|long), tilt (-3 to 3 degree rest angle), showPlaque + title + meta, showPrice + price, sold (gallery red dot). Section options (data attributes): data-theme (plaster|charcoal|sage) wall colour; data-cta (true|false) visit button. On wide screens the frames share one rail; on narrow screens they wrap into rows of three or two, each row with its own rail. Keyboard: every frame is focusable, Left and Right arrows push it, Home or Escape stops it, Enter or Space gives it a nudge. Touch drags swing the frame while vertical scrolling still works. Reduced motion: no draught and the frame settles without oscillating. Without JS the frames hang still at their rest angles.