← back to Dw Marketing Reels
auto-save: 2026-08-04T16:04:49 (6 files) — server.js data/fetch-collection-products.mjs data/franquemont-london.json flipbooks/franquemont-london/ public/collections/franquemont-london-poster.jpg
a02cf7a9b5efda8a21ad2fded3410f9825add0b9 · 2026-08-04 16:04:55 -0700 · Steve Abrams
Files touched
A data/fetch-collection-products.mjsA data/franquemont-london.jsonA flipbooks/franquemont-london/audio.jsonA flipbooks/franquemont-london/index.htmlA flipbooks/franquemont-london/lines.txtA public/collections/franquemont-london-poster.jpgA public/collections/franquemont-london.htmlM server.js
Diff
commit a02cf7a9b5efda8a21ad2fded3410f9825add0b9
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Tue Aug 4 16:04:55 2026 -0700
auto-save: 2026-08-04T16:04:49 (6 files) — server.js data/fetch-collection-products.mjs data/franquemont-london.json flipbooks/franquemont-london/ public/collections/franquemont-london-poster.jpg
---
data/fetch-collection-products.mjs | 19 +
data/franquemont-london.json | 236 +++++++++
flipbooks/franquemont-london/audio.json | 3 +
flipbooks/franquemont-london/index.html | 579 +++++++++++++++++++++++
flipbooks/franquemont-london/lines.txt | 2 +
public/collections/franquemont-london-poster.jpg | Bin 0 -> 252962 bytes
public/collections/franquemont-london.html | 56 +++
server.js | 1 +
8 files changed, 896 insertions(+)
diff --git a/data/fetch-collection-products.mjs b/data/fetch-collection-products.mjs
new file mode 100644
index 0000000..05284ce
--- /dev/null
+++ b/data/fetch-collection-products.mjs
@@ -0,0 +1,19 @@
+import fs from 'node:fs';
+const handle=process.argv[2], out=process.argv[3];
+const get=(u)=>fetch(u,{headers:{'User-Agent':'Mozilla/5.0'}}).then(r=>r.json());
+let all=[],page=1;
+while(page<=6){
+ const j=await get(`https://www.designerwallcoverings.com/collections/${handle}/products.json?limit=250&page=${page}&sort_by=created-descending`).catch(()=>({}));
+ const ps=j.products||[]; if(!ps.length)break; all.push(...ps); page++;
+}
+const rows=all.map(p=>{
+ const imgs=(p.images||[]).map(i=>({url:i.src,w:i.width,h:i.height}));
+ if(!imgs.length)return null;
+ const room=imgs.length>1?imgs.slice(1).reduce((b,im)=>(im.w*im.h>b.w*b.h?im:b)):null;
+ const title=p.title.replace(/ \| .*$/,'').replace(/ Wallcovering$/,'').trim();
+ return {title,handle:p.handle,url:`https://www.designerwallcoverings.com/products/${p.handle}`,
+ image:imgs[0].url,room:(room||imgs[0]).url,has_room:!!room,chapter:'all'};
+}).filter(Boolean);
+fs.writeFileSync(out,JSON.stringify(rows,null,2));
+console.log(`${handle}: ${rows.length} products (${rows.filter(r=>r.has_room).length} real rooms)`);
+console.log('newest:',rows.slice(0,4).map(r=>r.title).join(' | '));
diff --git a/data/franquemont-london.json b/data/franquemont-london.json
new file mode 100644
index 0000000..a299602
--- /dev/null
+++ b/data/franquemont-london.json
@@ -0,0 +1,236 @@
+[
+ {
+ "title": "Java Slate Blue",
+ "handle": "java-slate-blue-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/java-slate-blue-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Java_SlateBlue_WallpaperSample_Franquemont_948a1aaa-ae30-4eb1-85ab-0e00b2144f5f.webp?v=1771008254",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/room-living_room-java-slate-blue-wallpaper.jpg?v=1775955171",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Java Glowing Ember",
+ "handle": "java-glowing-ember-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/java-glowing-ember-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Java_GlowingEmber_WallpaperSample_Franquemont_194c9be3-121f-4d0b-b8aa-628ad85b5b4a.webp?v=1771008245",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/room-living_room-java-glowing-ember-wallpaper.jpg?v=1775955167",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Floral Stripe Midnight Truffle",
+ "handle": "floral-stripe-midnight-truffle-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/floral-stripe-midnight-truffle-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Floral_Stripe_Midnight_Truffle_Wallpaper_Sample_Franquemont.jpg?v=1771007980",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Floral_Stripe_Midnight_Truffle_Wallpaper_Sample_Franquemont.webp?v=1781992015",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Woolf Dusky Blue",
+ "handle": "woolf-dusky-blue-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/woolf-dusky-blue-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Woolf_Dusky_Blue_Wallpaper_Sample_Franquemont.jpg?v=1771007970",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Woolf_Dusky_Blue_Wallpaper_Sample_Franquemont.webp?v=1781992014",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Floral Zigzag Slate Blue",
+ "handle": "floral-zigzag-slate-blue-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/floral-zigzag-slate-blue-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Floral_Zigzag_Slate_Blue_Wallpaper_Sample_Franquemont.jpg?v=1771007961",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Floral_Zigzag_Slate_Blue_Wallpaper_Sample_Franquemont.webp?v=1781992012",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Vine Blots Sunlit Amber",
+ "handle": "vine-blots-sunlit-amber-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/vine-blots-sunlit-amber-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Vine_Blots_Sunlit_Amber_Wallpaper_Sample_Franquemont_a4331b4b-4eed-494a-9b44-ac0297375aed.png?v=1771007952",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Vine_Blots_Sunlit_Amber_Wallpaper_Sample_Franquemont_a4331b4b-4eed-494a-9b44-ac0297375aed.webp?v=1781992011",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Vine Blots Artichoke & Dusty Blue",
+ "handle": "vine-blots-artichoke-dusty-blue-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/vine-blots-artichoke-dusty-blue-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vine-blots-artichoke-dusty-blue-wallpaper-36793665978419.jpg?v=1785464571",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vine-blots-artichoke-dusty-blue-wallpaper-37558449963059.jpg?v=1785464572",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Vine Blots Crimson & Fuchsia Blaze",
+ "handle": "vine-blots-crimson-fuchsia-blaze-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/vine-blots-crimson-fuchsia-blaze-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vine-blots-crimson-fuchsia-blaze-wallpaper-36793665617971.jpg?v=1785464571",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vine-blots-crimson-fuchsia-blaze-wallpaper-37558449930291.jpg?v=1785464573",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Vine Blots Sky & Sand",
+ "handle": "vine-blots-sky-sand-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/vine-blots-sky-sand-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vine-blots-sky-sand-wallpaper-36793664929843.jpg?v=1785464573",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vine-blots-sky-sand-wallpaper-37558449897523.jpg?v=1785464576",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Vine Blots Fuchsia Blaze",
+ "handle": "vine-blots-fuchsia-blaze-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/vine-blots-fuchsia-blaze-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Vine_Blots_Fuchsia_Blaze_Wallpaper_Sample_Franquemont.jpg?v=1771007913",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Vine_Blots_Fuchsia_Blaze_Wallpaper_Sample_Franquemont.webp?v=1781992005",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Vine Blots Dusty Blue",
+ "handle": "vine-blots-dusty-blue-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/vine-blots-dusty-blue-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Vine_Blots_Dusty_Blue_Wallpaper_Sample_Franquemont_10043581-8542-4b0e-b421-204d1a21f742.png?v=1771007903",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Vine_Blots_Dusty_Blue_Wallpaper_Sample_Franquemont_10043581-8542-4b0e-b421-204d1a21f742.webp?v=1781992004",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Vine Blots Apple & Sand",
+ "handle": "vine-blots-apple-sand-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/vine-blots-apple-sand-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vine-blots-apple-sand-wallpaper-36793663029299.jpg?v=1785464565",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vine-blots-apple-sand-wallpaper-37558449799219.jpg?v=1785464567",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Java Magenta Blush",
+ "handle": "java-magenta-blush-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/java-magenta-blush-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Java_MagentaBlush_WallpaperSample_Franquemont_ca8cf37c-a6dd-4470-9f9d-723b49fe119b.jpg?v=1771007884",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Java_MagentaBlush_WallpaperSample_Franquemont_ca8cf37c-a6dd-4470-9f9d-723b49fe119b.webp?v=1781992000",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Java Arctic",
+ "handle": "java-arctic-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/java-arctic-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-arctic-wallpaper-36793662242867.jpg?v=1785456532",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-arctic-wallpaper-37558449733683.jpg?v=1785456534",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Java Olive",
+ "handle": "java-olive-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/java-olive-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-olive-wallpaper-36793661849651.jpg?v=1785456552",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-olive-wallpaper-37558449700915.jpg?v=1785456555",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Java Burnt Orange",
+ "handle": "java-burnt-orange-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/java-burnt-orange-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-burnt-orange-wallpaper-36793661587507.jpg?v=1785456540",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-burnt-orange-wallpaper-37558449668147.jpg?v=1785456543",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Java Blush",
+ "handle": "java-blush-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/java-blush-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-blush-wallpaper-36793661063219.jpg?v=1785456536",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-blush-wallpaper-37558449635379.jpg?v=1785456538",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Java Indigo",
+ "handle": "java-indigo-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/java-indigo-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-indigo-wallpaper-36793660670003.jpg?v=1785456549",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-indigo-wallpaper-37558449602611.jpg?v=1785456551",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Java Verdant Green",
+ "handle": "java-verdant-green-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/java-verdant-green-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Java_Verdant_Green_Wallpaper_Sample_Franquemont.jpg?v=1771007824",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Java_Verdant_Green_Wallpaper_Sample_Franquemont.webp?v=1781991992",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Java Graphite",
+ "handle": "java-graphite-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/java-graphite-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-graphite-wallpaper-36793660080179.jpg?v=1785456544",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-graphite-wallpaper-37558449537075.jpg?v=1785456546",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Java Rust",
+ "handle": "java-rust-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/java-rust-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-rust-wallpaper-36793659621427.jpg?v=1785456557",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java-rust-wallpaper-37558449471539.jpg?v=1785456559",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Verster Oxblood",
+ "handle": "verster-oxblood-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/verster-oxblood-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/verster-oxblood-wallpaper-36793658998835.jpg?v=1785464505",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/verster-oxblood-wallpaper-37558449438771.jpg?v=1785464504",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Verster Hay",
+ "handle": "verster-hay-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/verster-hay-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/verster-hay-wallpaper-36793658671155.jpg?v=1785464497",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/verster-hay-wallpaper-37558449406003.jpg?v=1785464498",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Verster Moss",
+ "handle": "verster-moss-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/verster-moss-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/verster-moss-wallpaper-36793658179635.jpg?v=1785464501",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/verster-moss-wallpaper-37558449373235.jpg?v=1785464503",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Verster Carmine",
+ "handle": "verster-carmine-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/verster-carmine-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/verster-carmine-wallpaper-36793657884723.jpg?v=1785464495",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/verster-carmine-wallpaper-37558449340467.jpg?v=1785464497",
+ "has_room": true,
+ "chapter": "all"
+ },
+ {
+ "title": "Verster Rust",
+ "handle": "verster-rust-wallpaper",
+ "url": "https://www.designerwallcoverings.com/products/verster-rust-wallpaper",
+ "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/verster-rust-wallpaper-36793657524275.jpg?v=1785464504",
+ "room": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/verster-rust-wallpaper-37558449307699.jpg?v=1785464508",
+ "has_room": true,
+ "chapter": "all"
+ }
+]
\ No newline at end of file
diff --git a/flipbooks/franquemont-london/audio.json b/flipbooks/franquemont-london/audio.json
new file mode 100644
index 0000000..35b4886
--- /dev/null
+++ b/flipbooks/franquemont-london/audio.json
@@ -0,0 +1,3 @@
+{ "bgm": { "src": "assets/audio/jazz.wav", "volume": 0.34 },
+ "vo": [ { "src": "assets/audio/vo1.wav", "anchor": "intro" },
+ { "src": "assets/audio/vo2.wav", "anchor": "outro" } ] }
diff --git a/flipbooks/franquemont-london/index.html b/flipbooks/franquemont-london/index.html
new file mode 100644
index 0000000..5120402
--- /dev/null
+++ b/flipbooks/franquemont-london/index.html
@@ -0,0 +1,579 @@
+<!doctype html>
+<html lang="en" data-resolution="landscape">
+<head>
+<meta charset="UTF-8" />
+<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
+<style>
+ :root { --ink:#1c1a17; --cream:#f4efe6; --paper:#fbf8f1; --gold:#b08d57; }
+ html,body { margin:0; padding:0; width:1920px; height:1080px; overflow:hidden;
+ background:radial-gradient(120% 120% at 50% 0%, #2a2622 0%, #14110e 72%);
+ font-family:"Helvetica Neue",system-ui,sans-serif; }
+ #main-composition { position:relative; width:1920px; height:1080px; overflow:hidden; }
+ .stage { position:absolute; inset:0; perspective:3000px; perspective-origin:50% 46%; }
+
+ /* LEFT verso: brand + room + name */
+ .verso { position:absolute; top:97px; left:192px; width:768px; height:886px;
+ background:var(--paper); border-radius:8px 2px 2px 8px; overflow:hidden;
+ box-shadow: inset -30px 0 46px rgba(0,0,0,.12), 0 34px 66px rgba(0,0,0,.5);
+ display:flex; flex-direction:column; }
+ .wordmark { flex:0 0 auto; text-align:center; padding:49px 0 27px; }
+ .wordmark .wm { font-family:Georgia, serif; font-size:55px; color:var(--ink); letter-spacing:.02em; line-height:1; }
+ .wordmark .wsub { margin-top:8px; font-size:18px; letter-spacing:.34em; text-transform:uppercase; color:var(--gold); }
+ .wordmark .wr { width:64px; height:2px; background:var(--gold); margin:25px auto 0; }
+ .roomstack { position:relative; flex:1 1 auto; margin:0 42px 42px; border-radius:4px; overflow:hidden; background:#e9e3d7; }
+ .room { position:absolute; inset:0; opacity:0; }
+ .room .rimg { position:absolute; inset:0; width:100%; height:100%; object-fit:cover; }
+ .room.fallback .rimg { transform:scale(1.4); filter:blur(3px) brightness(.82) saturate(1.05); }
+ .room .rtint { position:absolute; inset:0; background:linear-gradient(180deg, rgba(0,0,0,0) 55%, rgba(0,0,0,.55) 100%); }
+ .room.fallback .rtint { background:linear-gradient(180deg, rgba(20,16,12,.30) 0%, rgba(20,16,12,.62) 100%); }
+ .rcap { position:absolute; left:0; right:0; bottom:0; padding:38px 42px; color:#fff; }
+ .rcap .rpat { font-family:Georgia, serif; font-size:48px; line-height:1.05; text-shadow:0 2px 14px rgba(0,0,0,.5); }
+ .rcap .rcol { margin-top:8px; font-size:20px; letter-spacing:.2em; text-transform:uppercase; color:#e7d8bd; }
+
+ /* RIGHT recto: page-turn stack of pattern swatches */
+ .leaf { position:absolute; top:97px; left:960px; width:768px; height:886px;
+ transform-origin:left center; transform-style:preserve-3d; will-change:transform; }
+ .leaf .face { position:absolute; inset:0; backface-visibility:hidden; overflow:hidden; border-radius:2px 8px 8px 2px;
+ background:var(--paper); box-shadow: 24px 28px 54px rgba(0,0,0,.42), inset 24px 0 42px rgba(0,0,0,.08); }
+ .leaf .back { transform:rotateY(180deg); background:linear-gradient(90deg,#efe9dc,#fbf8f1 22%);
+ box-shadow:-22px 28px 54px rgba(0,0,0,.36), inset -24px 0 42px rgba(0,0,0,.08); }
+ .leaf .art { position:absolute; inset:0; width:100%; height:100%; object-fit:cover; }
+ .leaf .shade { position:absolute; inset:0; opacity:0; pointer-events:none; background:linear-gradient(90deg, rgba(0,0,0,.42), rgba(0,0,0,0) 62%); }
+
+ /* cover + outro cards */
+ .card { position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; color:var(--cream); }
+ .card .kicker { font-size:31px; letter-spacing:.44em; text-transform:uppercase; color:var(--gold); }
+ .card .big { font-family:Georgia, serif; font-size:134px; line-height:1.0; margin:22px 60px; }
+ .card .sub { font-size:35px; letter-spacing:.18em; text-transform:uppercase; color:#c9bfae; }
+ .card .rule { width:120px; height:2px; background:var(--gold); margin:32px 0; }
+ .card .url { margin-top:28px; font-size:31px; letter-spacing:.24em; text-transform:uppercase; color:var(--cream); }
+</style>
+</head>
+<body>
+ <div id="main-composition" data-composition-id="flipbook" data-width="1920" data-height="1080" data-start="0" data-duration="62.3">
+
+ <div class="card" id="cover">
+ <div class="kicker">Designer Wallcoverings presents</div>
+ <div class="big">Franquemont London</div>
+ <div class="rule"></div>
+ <div class="sub">The Collection</div>
+ </div>
+
+ <div class="stage" id="stage">
+ <div class="verso">
+ <div class="wordmark"><div class="wm">Designer Wallcoverings</div><div class="wsub">est. lookbook</div><div class="wr"></div></div>
+ <div class="roomstack">
+ <div class="room" id="room0">
+ <img class="rimg" src="assets/room/r0.jpg" alt="Java Slate Blue room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Java Slate Blue</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room1">
+ <img class="rimg" src="assets/room/r1.jpg" alt="Java Glowing Ember room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Java Glowing Ember</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room2">
+ <img class="rimg" src="assets/room/r2.jpg" alt="Floral Stripe Midnight Truffle room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Floral Stripe Midnight Truffle</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room3">
+ <img class="rimg" src="assets/room/r3.jpg" alt="Woolf Dusky Blue room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Woolf Dusky Blue</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room4">
+ <img class="rimg" src="assets/room/r4.jpg" alt="Floral Zigzag Slate Blue room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Floral Zigzag Slate Blue</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room5">
+ <img class="rimg" src="assets/room/r5.jpg" alt="Vine Blots Sunlit Amber room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Vine Blots Sunlit Amber</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room6">
+ <img class="rimg" src="assets/room/r6.jpg" alt="Vine Blots Artichoke & Dusty Blue room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Vine Blots Artichoke & Dusty Blue</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room7">
+ <img class="rimg" src="assets/room/r7.jpg" alt="Vine Blots Crimson & Fuchsia Blaze room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Vine Blots Crimson & Fuchsia Blaze</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room8">
+ <img class="rimg" src="assets/room/r8.jpg" alt="Vine Blots Sky & Sand room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Vine Blots Sky & Sand</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room9">
+ <img class="rimg" src="assets/room/r9.jpg" alt="Vine Blots Fuchsia Blaze room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Vine Blots Fuchsia Blaze</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room10">
+ <img class="rimg" src="assets/room/r10.jpg" alt="Vine Blots Dusty Blue room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Vine Blots Dusty Blue</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room11">
+ <img class="rimg" src="assets/room/r11.jpg" alt="Vine Blots Apple & Sand room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Vine Blots Apple & Sand</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room12">
+ <img class="rimg" src="assets/room/r12.jpg" alt="Java Magenta Blush room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Java Magenta Blush</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room13">
+ <img class="rimg" src="assets/room/r13.jpg" alt="Java Arctic room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Java Arctic</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room14">
+ <img class="rimg" src="assets/room/r14.jpg" alt="Java Olive room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Java Olive</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room15">
+ <img class="rimg" src="assets/room/r15.jpg" alt="Java Burnt Orange room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Java Burnt Orange</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room16">
+ <img class="rimg" src="assets/room/r16.jpg" alt="Java Blush room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Java Blush</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room17">
+ <img class="rimg" src="assets/room/r17.jpg" alt="Java Indigo room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Java Indigo</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room18">
+ <img class="rimg" src="assets/room/r18.jpg" alt="Java Verdant Green room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Java Verdant Green</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room19">
+ <img class="rimg" src="assets/room/r19.jpg" alt="Java Graphite room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Java Graphite</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room20">
+ <img class="rimg" src="assets/room/r20.jpg" alt="Java Rust room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Java Rust</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room21">
+ <img class="rimg" src="assets/room/r21.jpg" alt="Verster Oxblood room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Verster Oxblood</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room22">
+ <img class="rimg" src="assets/room/r22.jpg" alt="Verster Hay room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Verster Hay</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room23">
+ <img class="rimg" src="assets/room/r23.jpg" alt="Verster Moss room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Verster Moss</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room24">
+ <img class="rimg" src="assets/room/r24.jpg" alt="Verster Carmine room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Verster Carmine</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ <div class="room" id="room25">
+ <img class="rimg" src="assets/room/r25.jpg" alt="Verster Rust room" />
+ <div class="rtint"></div>
+ <div class="rcap"><div class="rpat">Verster Rust</div><div class="rcol">Franquemont London · all</div></div>
+ </div>
+ </div>
+ </div>
+
+ <div class="leaf" id="leaf0">
+ <div class="face front"><img class="art" src="assets/img/p0.jpg" alt="Java Slate Blue" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf1">
+ <div class="face front"><img class="art" src="assets/img/p1.jpg" alt="Java Glowing Ember" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf2">
+ <div class="face front"><img class="art" src="assets/img/p2.jpg" alt="Floral Stripe Midnight Truffle" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf3">
+ <div class="face front"><img class="art" src="assets/img/p3.jpg" alt="Woolf Dusky Blue" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf4">
+ <div class="face front"><img class="art" src="assets/img/p4.jpg" alt="Floral Zigzag Slate Blue" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf5">
+ <div class="face front"><img class="art" src="assets/img/p5.jpg" alt="Vine Blots Sunlit Amber" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf6">
+ <div class="face front"><img class="art" src="assets/img/p6.jpg" alt="Vine Blots Artichoke & Dusty Blue" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf7">
+ <div class="face front"><img class="art" src="assets/img/p7.jpg" alt="Vine Blots Crimson & Fuchsia Blaze" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf8">
+ <div class="face front"><img class="art" src="assets/img/p8.jpg" alt="Vine Blots Sky & Sand" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf9">
+ <div class="face front"><img class="art" src="assets/img/p9.jpg" alt="Vine Blots Fuchsia Blaze" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf10">
+ <div class="face front"><img class="art" src="assets/img/p10.jpg" alt="Vine Blots Dusty Blue" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf11">
+ <div class="face front"><img class="art" src="assets/img/p11.jpg" alt="Vine Blots Apple & Sand" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf12">
+ <div class="face front"><img class="art" src="assets/img/p12.jpg" alt="Java Magenta Blush" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf13">
+ <div class="face front"><img class="art" src="assets/img/p13.jpg" alt="Java Arctic" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf14">
+ <div class="face front"><img class="art" src="assets/img/p14.jpg" alt="Java Olive" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf15">
+ <div class="face front"><img class="art" src="assets/img/p15.jpg" alt="Java Burnt Orange" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf16">
+ <div class="face front"><img class="art" src="assets/img/p16.jpg" alt="Java Blush" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf17">
+ <div class="face front"><img class="art" src="assets/img/p17.jpg" alt="Java Indigo" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf18">
+ <div class="face front"><img class="art" src="assets/img/p18.jpg" alt="Java Verdant Green" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf19">
+ <div class="face front"><img class="art" src="assets/img/p19.jpg" alt="Java Graphite" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf20">
+ <div class="face front"><img class="art" src="assets/img/p20.jpg" alt="Java Rust" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf21">
+ <div class="face front"><img class="art" src="assets/img/p21.jpg" alt="Verster Oxblood" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf22">
+ <div class="face front"><img class="art" src="assets/img/p22.jpg" alt="Verster Hay" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf23">
+ <div class="face front"><img class="art" src="assets/img/p23.jpg" alt="Verster Moss" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf24">
+ <div class="face front"><img class="art" src="assets/img/p24.jpg" alt="Verster Carmine" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ <div class="leaf" id="leaf25">
+ <div class="face front"><img class="art" src="assets/img/p25.jpg" alt="Verster Rust" /><div class="shade"></div></div>
+ <div class="face back"></div>
+ </div>
+ </div>
+
+ <div class="card" id="outro">
+ <div class="kicker">Shop the collection</div>
+ <div class="big">Franquemont London</div>
+ <div class="url">designerwallcoverings.com</div>
+ </div>
+
+ <audio id="bgm" src="assets/audio/jazz.wav" data-start="0" data-duration="62.3" data-track-index="20" data-volume="0.34"></audio>
+ <audio id="vo0" src="assets/audio/vo1.wav" data-start="3.7" data-track-index="21" data-volume="1"></audio>
+ <audio id="vo1" src="assets/audio/vo2.wav" data-start="48.85" data-track-index="22" data-volume="1"></audio>
+
+ <script>
+ window.__timelines = window.__timelines || {};
+ const tl = gsap.timeline({ paused: true });
+
+ gsap.set("#leaf0", { rotateY:0, zIndex:26 });
+ gsap.set("#leaf1", { rotateY:0, zIndex:25 });
+ gsap.set("#leaf2", { rotateY:0, zIndex:24 });
+ gsap.set("#leaf3", { rotateY:0, zIndex:23 });
+ gsap.set("#leaf4", { rotateY:0, zIndex:22 });
+ gsap.set("#leaf5", { rotateY:0, zIndex:21 });
+ gsap.set("#leaf6", { rotateY:0, zIndex:20 });
+ gsap.set("#leaf7", { rotateY:0, zIndex:19 });
+ gsap.set("#leaf8", { rotateY:0, zIndex:18 });
+ gsap.set("#leaf9", { rotateY:0, zIndex:17 });
+ gsap.set("#leaf10", { rotateY:0, zIndex:16 });
+ gsap.set("#leaf11", { rotateY:0, zIndex:15 });
+ gsap.set("#leaf12", { rotateY:0, zIndex:14 });
+ gsap.set("#leaf13", { rotateY:0, zIndex:13 });
+ gsap.set("#leaf14", { rotateY:0, zIndex:12 });
+ gsap.set("#leaf15", { rotateY:0, zIndex:11 });
+ gsap.set("#leaf16", { rotateY:0, zIndex:10 });
+ gsap.set("#leaf17", { rotateY:0, zIndex:9 });
+ gsap.set("#leaf18", { rotateY:0, zIndex:8 });
+ gsap.set("#leaf19", { rotateY:0, zIndex:7 });
+ gsap.set("#leaf20", { rotateY:0, zIndex:6 });
+ gsap.set("#leaf21", { rotateY:0, zIndex:5 });
+ gsap.set("#leaf22", { rotateY:0, zIndex:4 });
+ gsap.set("#leaf23", { rotateY:0, zIndex:3 });
+ gsap.set("#leaf24", { rotateY:0, zIndex:2 });
+ gsap.set("#leaf25", { rotateY:0, zIndex:1 });
+ gsap.set("#room0", { opacity:1 });
+ gsap.set("#room1", { opacity:0 });
+ gsap.set("#room2", { opacity:0 });
+ gsap.set("#room3", { opacity:0 });
+ gsap.set("#room4", { opacity:0 });
+ gsap.set("#room5", { opacity:0 });
+ gsap.set("#room6", { opacity:0 });
+ gsap.set("#room7", { opacity:0 });
+ gsap.set("#room8", { opacity:0 });
+ gsap.set("#room9", { opacity:0 });
+ gsap.set("#room10", { opacity:0 });
+ gsap.set("#room11", { opacity:0 });
+ gsap.set("#room12", { opacity:0 });
+ gsap.set("#room13", { opacity:0 });
+ gsap.set("#room14", { opacity:0 });
+ gsap.set("#room15", { opacity:0 });
+ gsap.set("#room16", { opacity:0 });
+ gsap.set("#room17", { opacity:0 });
+ gsap.set("#room18", { opacity:0 });
+ gsap.set("#room19", { opacity:0 });
+ gsap.set("#room20", { opacity:0 });
+ gsap.set("#room21", { opacity:0 });
+ gsap.set("#room22", { opacity:0 });
+ gsap.set("#room23", { opacity:0 });
+ gsap.set("#room24", { opacity:0 });
+ gsap.set("#room25", { opacity:0 });
+ gsap.set("#stage", { opacity: 0 });
+ gsap.set("#outro", { opacity: 0 }); gsap.set("#outro .big", { y: 34, opacity: 0 }); gsap.set("#outro .url", { opacity: 0 });
+ gsap.set("#cover .big", { y: 40, opacity: 0 }); gsap.set("#cover .kicker,#cover .sub,#cover .rule", { opacity: 0 });
+
+ // cover
+ tl.to("#cover .kicker", { opacity:1, duration:0.5 }, 0.2);
+ tl.to("#cover .big", { opacity:1, y:0, duration:0.8, ease:"power3.out" }, 0.4);
+ tl.to("#cover .rule,#cover .sub", { opacity:1, duration:0.5 }, 1.0);
+ tl.to("#cover", { opacity:0, duration:0.5, ease:"power1.in" }, 3.00);
+ tl.to("#stage", { opacity:1, duration:0.6, ease:"power1.out" }, 3.00);
+
+ // page turns + room crossfades
+
+ tl.to("#leaf0", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 4.2);
+ tl.to("#leaf0 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 4.2);
+ tl.to("#leaf0 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 4.7);
+ tl.set("#leaf0", { zIndex: 1000 }, 4.7);
+ tl.set("#leaf0", { opacity: 0 }, 5.200);
+ tl.to("#room0", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 4.7);
+ tl.to("#room1", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 4.7);
+ tl.to("#leaf1", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 5.8);
+ tl.to("#leaf1 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 5.8);
+ tl.to("#leaf1 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 6.3);
+ tl.set("#leaf1", { zIndex: 1001 }, 6.3);
+ tl.set("#leaf1", { opacity: 0 }, 6.800);
+ tl.to("#room1", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 6.3);
+ tl.to("#room2", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 6.3);
+ tl.to("#leaf2", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 7.4);
+ tl.to("#leaf2 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 7.4);
+ tl.to("#leaf2 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 7.9);
+ tl.set("#leaf2", { zIndex: 1002 }, 7.9);
+ tl.set("#leaf2", { opacity: 0 }, 8.400);
+ tl.to("#room2", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 7.9);
+ tl.to("#room3", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 7.9);
+ tl.to("#leaf3", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 9);
+ tl.to("#leaf3 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 9);
+ tl.to("#leaf3 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 9.5);
+ tl.set("#leaf3", { zIndex: 1003 }, 9.5);
+ tl.set("#leaf3", { opacity: 0 }, 10.000);
+ tl.to("#room3", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 9.5);
+ tl.to("#room4", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 9.5);
+ tl.to("#leaf4", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 10.6);
+ tl.to("#leaf4 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 10.6);
+ tl.to("#leaf4 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 11.1);
+ tl.set("#leaf4", { zIndex: 1004 }, 11.1);
+ tl.set("#leaf4", { opacity: 0 }, 11.600);
+ tl.to("#room4", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 11.1);
+ tl.to("#room5", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 11.1);
+ tl.to("#leaf5", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 12.2);
+ tl.to("#leaf5 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 12.2);
+ tl.to("#leaf5 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 12.7);
+ tl.set("#leaf5", { zIndex: 1005 }, 12.7);
+ tl.set("#leaf5", { opacity: 0 }, 13.200);
+ tl.to("#room5", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 12.7);
+ tl.to("#room6", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 12.7);
+ tl.to("#leaf6", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 13.8);
+ tl.to("#leaf6 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 13.8);
+ tl.to("#leaf6 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 14.3);
+ tl.set("#leaf6", { zIndex: 1006 }, 14.3);
+ tl.set("#leaf6", { opacity: 0 }, 14.800);
+ tl.to("#room6", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 14.3);
+ tl.to("#room7", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 14.3);
+ tl.to("#leaf7", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 15.4);
+ tl.to("#leaf7 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 15.4);
+ tl.to("#leaf7 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 15.9);
+ tl.set("#leaf7", { zIndex: 1007 }, 15.9);
+ tl.set("#leaf7", { opacity: 0 }, 16.400);
+ tl.to("#room7", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 15.9);
+ tl.to("#room8", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 15.9);
+ tl.to("#leaf8", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 17);
+ tl.to("#leaf8 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 17);
+ tl.to("#leaf8 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 17.5);
+ tl.set("#leaf8", { zIndex: 1008 }, 17.5);
+ tl.set("#leaf8", { opacity: 0 }, 18.000);
+ tl.to("#room8", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 17.5);
+ tl.to("#room9", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 17.5);
+ tl.to("#leaf9", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 18.6);
+ tl.to("#leaf9 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 18.6);
+ tl.to("#leaf9 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 19.1);
+ tl.set("#leaf9", { zIndex: 1009 }, 19.1);
+ tl.set("#leaf9", { opacity: 0 }, 19.600);
+ tl.to("#room9", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 19.1);
+ tl.to("#room10", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 19.1);
+ tl.to("#leaf10", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 20.2);
+ tl.to("#leaf10 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 20.2);
+ tl.to("#leaf10 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 20.7);
+ tl.set("#leaf10", { zIndex: 1010 }, 20.7);
+ tl.set("#leaf10", { opacity: 0 }, 21.200);
+ tl.to("#room10", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 20.7);
+ tl.to("#room11", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 20.7);
+ tl.to("#leaf11", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 21.8);
+ tl.to("#leaf11 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 21.8);
+ tl.to("#leaf11 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 22.3);
+ tl.set("#leaf11", { zIndex: 1011 }, 22.3);
+ tl.set("#leaf11", { opacity: 0 }, 22.800);
+ tl.to("#room11", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 22.3);
+ tl.to("#room12", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 22.3);
+ tl.to("#leaf12", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 23.4);
+ tl.to("#leaf12 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 23.4);
+ tl.to("#leaf12 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 23.9);
+ tl.set("#leaf12", { zIndex: 1012 }, 23.9);
+ tl.set("#leaf12", { opacity: 0 }, 24.400);
+ tl.to("#room12", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 23.9);
+ tl.to("#room13", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 23.9);
+ tl.to("#leaf13", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 25);
+ tl.to("#leaf13 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 25);
+ tl.to("#leaf13 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 25.5);
+ tl.set("#leaf13", { zIndex: 1013 }, 25.5);
+ tl.set("#leaf13", { opacity: 0 }, 26.000);
+ tl.to("#room13", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 25.5);
+ tl.to("#room14", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 25.5);
+ tl.to("#leaf14", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 26.6);
+ tl.to("#leaf14 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 26.6);
+ tl.to("#leaf14 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 27.1);
+ tl.set("#leaf14", { zIndex: 1014 }, 27.1);
+ tl.set("#leaf14", { opacity: 0 }, 27.600);
+ tl.to("#room14", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 27.1);
+ tl.to("#room15", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 27.1);
+ tl.to("#leaf15", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 28.2);
+ tl.to("#leaf15 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 28.2);
+ tl.to("#leaf15 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 28.7);
+ tl.set("#leaf15", { zIndex: 1015 }, 28.7);
+ tl.set("#leaf15", { opacity: 0 }, 29.200);
+ tl.to("#room15", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 28.7);
+ tl.to("#room16", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 28.7);
+ tl.to("#leaf16", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 29.8);
+ tl.to("#leaf16 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 29.8);
+ tl.to("#leaf16 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 30.3);
+ tl.set("#leaf16", { zIndex: 1016 }, 30.3);
+ tl.set("#leaf16", { opacity: 0 }, 30.800);
+ tl.to("#room16", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 30.3);
+ tl.to("#room17", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 30.3);
+ tl.to("#leaf17", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 31.4);
+ tl.to("#leaf17 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 31.4);
+ tl.to("#leaf17 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 31.9);
+ tl.set("#leaf17", { zIndex: 1017 }, 31.9);
+ tl.set("#leaf17", { opacity: 0 }, 32.400);
+ tl.to("#room17", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 31.9);
+ tl.to("#room18", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 31.9);
+ tl.to("#leaf18", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 33);
+ tl.to("#leaf18 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 33);
+ tl.to("#leaf18 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 33.5);
+ tl.set("#leaf18", { zIndex: 1018 }, 33.5);
+ tl.set("#leaf18", { opacity: 0 }, 34.000);
+ tl.to("#room18", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 33.5);
+ tl.to("#room19", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 33.5);
+ tl.to("#leaf19", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 34.6);
+ tl.to("#leaf19 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 34.6);
+ tl.to("#leaf19 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 35.1);
+ tl.set("#leaf19", { zIndex: 1019 }, 35.1);
+ tl.set("#leaf19", { opacity: 0 }, 35.600);
+ tl.to("#room19", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 35.1);
+ tl.to("#room20", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 35.1);
+ tl.to("#leaf20", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 36.2);
+ tl.to("#leaf20 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 36.2);
+ tl.to("#leaf20 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 36.7);
+ tl.set("#leaf20", { zIndex: 1020 }, 36.7);
+ tl.set("#leaf20", { opacity: 0 }, 37.200);
+ tl.to("#room20", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 36.7);
+ tl.to("#room21", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 36.7);
+ tl.to("#leaf21", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 37.8);
+ tl.to("#leaf21 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 37.8);
+ tl.to("#leaf21 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 38.3);
+ tl.set("#leaf21", { zIndex: 1021 }, 38.3);
+ tl.set("#leaf21", { opacity: 0 }, 38.800);
+ tl.to("#room21", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 38.3);
+ tl.to("#room22", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 38.3);
+ tl.to("#leaf22", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 39.4);
+ tl.to("#leaf22 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 39.4);
+ tl.to("#leaf22 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 39.9);
+ tl.set("#leaf22", { zIndex: 1022 }, 39.9);
+ tl.set("#leaf22", { opacity: 0 }, 40.400);
+ tl.to("#room22", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 39.9);
+ tl.to("#room23", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 39.9);
+ tl.to("#leaf23", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 41);
+ tl.to("#leaf23 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 41);
+ tl.to("#leaf23 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 41.5);
+ tl.set("#leaf23", { zIndex: 1023 }, 41.5);
+ tl.set("#leaf23", { opacity: 0 }, 42.000);
+ tl.to("#room23", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 41.5);
+ tl.to("#room24", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 41.5);
+ tl.to("#leaf24", { rotateY: -180, duration: 1, ease: "power2.inOut" }, 42.6);
+ tl.to("#leaf24 .shade", { opacity: 0.5, duration: 0.500, ease:"power1.in" }, 42.6);
+ tl.to("#leaf24 .shade", { opacity: 0, duration: 0.500, ease:"power1.out" }, 43.1);
+ tl.set("#leaf24", { zIndex: 1024 }, 43.1);
+ tl.set("#leaf24", { opacity: 0 }, 43.600);
+ tl.to("#room24", { opacity: 0, duration: 0.4, ease:"power1.inOut" }, 43.1);
+ tl.to("#room25", { opacity: 1, duration: 0.4, ease:"power1.inOut" }, 43.1);
+ tl.to("#leaf25 .art", { scale: 1.05, duration: 4.90, ease:"power1.out" }, 44.2);
+ tl.to("#room25 .rimg", { scale: 1.06, duration: 4.90, ease:"power1.out" }, 44.2);
+
+ // outro
+ tl.to("#stage", { opacity:0, duration:0.6, ease:"power1.in" }, 48.70);
+ tl.to("#outro", { opacity:1, duration:0.5 }, 48.90);
+ tl.to("#outro .big", { opacity:1, y:0, duration:0.7, ease:"power2.out" }, 49.10);
+ tl.to("#outro .url", { opacity:1, duration:0.5 }, 49.60);
+
+ gsap.set("#bgm", { volume: 0.34 });
+ tl.to("#bgm", { volume: 0.17, duration: 0.4 }, 3.40);
+ tl.to("#bgm", { volume: 0.34, duration: 0.6 }, 6.30);
+ tl.to("#bgm", { volume: 0.17, duration: 0.4 }, 48.55);
+ tl.to("#bgm", { volume: 0.34, duration: 0.6 }, 51.45);
+ tl.to("#bgm", { volume: 0, duration: 1.0, ease:"power1.in" }, 61.20);
+
+ window.__timelines["flipbook"] = tl;
+ </script>
+ </div>
+</body>
+</html>
\ No newline at end of file
diff --git a/flipbooks/franquemont-london/lines.txt b/flipbooks/franquemont-london/lines.txt
new file mode 100644
index 0000000..d1ca8e7
--- /dev/null
+++ b/flipbooks/franquemont-london/lines.txt
@@ -0,0 +1,2 @@
+Welcome to Designer Wallcoverings. This is Franquemont London — hand-drawn pattern and painterly colour. Settle in, and leaf through the collection.
+Thank you for visiting Designer Wallcoverings. May the Franquemont London palette inspire your next interior — grounds to layer, motifs to specify, and finishes worthy of a beautifully considered room.
diff --git a/public/collections/franquemont-london-poster.jpg b/public/collections/franquemont-london-poster.jpg
new file mode 100644
index 0000000..8f23dc1
Binary files /dev/null and b/public/collections/franquemont-london-poster.jpg differ
diff --git a/public/collections/franquemont-london.html b/public/collections/franquemont-london.html
new file mode 100644
index 0000000..574f2a6
--- /dev/null
+++ b/public/collections/franquemont-london.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
+<title>Franquemont London — Designer Wallcoverings</title>
+<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400;0,600;1,400&display=swap" rel="stylesheet">
+<style>
+ :root{ --ink:#111; --body:#444; --canvas:#fff; --gold:#b08212; --line:#e7e2d8; }
+ *{ box-sizing:border-box; margin:0; padding:0; }
+ body{ font-family:'Lora',Georgia,serif; color:var(--body); background:var(--canvas); -webkit-font-smoothing:antialiased; }
+ .banner{ position:relative; height:50vh; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; color:#fff; overflow:hidden; }
+ .banner .bg{ position:absolute; inset:0; background:url('/public/collections/franquemont-london-banner.jpg') center/cover; transform:scale(1.03); }
+ .banner .scrim{ position:absolute; inset:0; background:linear-gradient(180deg,rgba(20,16,12,.42),rgba(20,16,12,.62)); }
+ .banner .inner{ position:relative; padding:0 24px; }
+ .banner .kicker{ text-transform:uppercase; letter-spacing:5px; font-size:13px; color:#e7d8bd; margin-bottom:16px; }
+ .banner h1{ font-weight:400; font-size:clamp(34px,6vw,64px); line-height:1.08; text-shadow:0 2px 22px rgba(0,0,0,.5); }
+ .banner .sub{ margin-top:14px; font-size:clamp(15px,2.2vw,19px); font-style:italic; color:#f3ece0; }
+ .banner .rule{ width:52px; height:1px; background:var(--gold); margin:20px auto 0; }
+ .wrap{ max-width:1100px; margin:0 auto; padding:44px 24px 8px; }
+ .section-label{ text-transform:uppercase; letter-spacing:3px; font-size:12px; color:var(--gold); margin:0 0 18px; padding-bottom:10px; border-bottom:1px solid var(--line); text-align:center; }
+ .film video{ width:100%; border-radius:8px; background:#14110e; display:block; box-shadow:0 10px 40px rgba(0,0,0,.18); }
+ .film .note{ text-align:center; margin-top:14px; font-size:14px; font-style:italic; color:var(--body); }
+ .film .note b{ color:var(--ink); font-style:normal; }
+ .cta{ text-align:center; padding:34px 24px 8px; }
+ .cta a{ display:inline-block; text-transform:uppercase; letter-spacing:2px; font-size:13px; color:#fff; background:var(--ink); padding:14px 30px; border-radius:2px; text-decoration:none; }
+ .cta a:hover{ background:var(--gold); }
+ footer{ text-align:center; padding:52px 24px 72px; border-top:1px solid var(--line); margin-top:44px; }
+ footer .mark{ text-transform:uppercase; letter-spacing:5px; color:var(--ink); font-size:15px; }
+ footer a{ color:var(--gold); text-decoration:none; letter-spacing:1px; font-size:14px; display:inline-block; margin-top:10px; }
+ .player{ position:relative; }
+ .vchip{ position:absolute; top:12px; right:12px; display:flex; gap:8px; z-index:5; }
+ .vchip button{ font:600 13px/1 -apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,sans-serif; letter-spacing:.02em; color:#fff; background:rgba(20,20,20,.72); border:1px solid rgba(255,255,255,.28); border-radius:999px; padding:7px 12px; cursor:pointer; -webkit-backdrop-filter:blur(4px); backdrop-filter:blur(4px); }
+ .vchip button:hover{ background:rgba(20,20,20,.92); }
+</style></head><body>
+ <header class="banner"><div class="bg"></div><div class="scrim"></div>
+ <div class="inner"><div class="kicker">Designer Wallcoverings</div><h1>Franquemont London</h1>
+ <div class="sub">The Collection</div><div class="rule"></div></div></header>
+ <div class="wrap"><div class="section-label">The Flip Book · narrated</div>
+ <div class="film"><div class="player">
+ <video id="fbvid" controls playsinline preload="metadata" poster="/public/collections/franquemont-london-poster.jpg">
+ <source src="/reels/franquemont-london-flipbook.mp4" type="video/mp4"></video>
+ <div class="vchip">
+ <button type="button" id="fbspeed" title="Playback speed" aria-label="Adjust playback speed">⏩ 1×</button>
+ <button type="button" id="fbsound" title="Sound on/off" aria-label="Toggle sound">🔊</button>
+ </div></div>
+ <div class="note">🔊 <b>Sound on</b> — adjust <b>speed</b> & <b>sound</b> with the controls on the video. Narrated in Steve Abrams' voice.</div></div></div>
+ <script>(function(){var v=document.getElementById('fbvid');if(!v)return;
+ var sp=document.getElementById('fbspeed'),sd=document.getElementById('fbsound');
+ var rates=[1,1.25,1.5,0.5,0.75],ri=0;
+ sp.addEventListener('click',function(){ri=(ri+1)%rates.length;v.playbackRate=rates[ri];sp.textContent='⏩ '+rates[ri]+'×';});
+ function paint(){sd.textContent=v.muted||v.volume===0?'🔇':'🔊';}
+ sd.addEventListener('click',function(){v.muted=!v.muted;if(!v.muted&&v.volume===0)v.volume=1;paint();});
+ v.addEventListener('volumechange',paint);paint();
+ })();</script>
+ <div class="cta"><a href="https://www.designerwallcoverings.com/collections/franquemont-london">Shop the collection →</a></div>
+ <footer><div class="mark">Designer Wallcoverings</div><a href="https://designerwallcoverings.com">designerwallcoverings.com →</a></footer>
+</body></html>
\ No newline at end of file
diff --git a/server.js b/server.js
index 7686984..3fed6a1 100644
--- a/server.js
+++ b/server.js
@@ -129,6 +129,7 @@ const server = http.createServer(async (req, res) => {
if (p === '/privacy') return await serveFile(join(ROOT, 'public', 'privacy.html'), req, res);
if (p === '/terms') return await serveFile(join(ROOT, 'public', 'terms.html'), req, res);
if (p === '/showcase') return await serveFile(join(ROOT, 'public', 'showcase.html'), req, res);
+ if (p === '/collections/franquemont-london') return await serveFile(join(ROOT, 'public', 'collections', 'franquemont-london.html'), req, res);
if (p === '/collections/innovations-usa') return await serveFile(join(ROOT, 'public', 'collections', 'innovations-usa.html'), req, res);
if (p === '/collections/graduate-collection') return await serveFile(join(ROOT, 'public', 'collections', 'graduate-collection.html'), req, res);
if (p === '/api/reels') {
← c5c736e auto-save: 2026-08-04T15:04:21 (3 files) — flipbooks/innovat
·
back to Dw Marketing Reels
·
auto-save: 2026-08-04T16:35:00 (1 files) — flipbooks/franque 6a68353 →