/* room service · digital press kit v5d (v5 + loader handshake, images fade in, drawers pre-warm) v5: everything folds (except labels + photo band), recent recordings, justified text, compact ecosystem, endless reels (tap = sound), records in one swipeable row, live shows drift + swipe, room service sets play in the dock with a full-page link, clean video pop-up, contact layouts (?ct=a|b|c), no cover titles. v4 (fold-out drawers) renders the press kit from the JSON block in the page (id="rs-press-data"). v3: sitting-photo bio, kit-exact ecosystem rows, compact release band, two logo marquees, above rebuilt, live shows pulled live from the listening room, in-page player dock (soundcloud / spotify / bandcamp / youtube), dropbox-fed gallery, tighter contact. */ (function () { 'use strict'; var mount = document.getElementById('rs-press'); var dataEl = document.getElementById('rs-press-data'); if (!mount || !dataEl) return; var D; try { D = JSON.parse(dataEl.textContent); } catch (e) { mount.innerHTML = '

press kit: the content block has a typo (' + e.message + '). check the json in the html card.

'; return; } var W = D.worker || 'https://room-service.music-053.workers.dev'; var CSS = '\ :root{--pk-cream:#F2E2CA;--pk-black:#0D0D0D;--pk-ink:#0D0D0D;--pk-rose:#AF8080;--pk-sea:#67918D;--pk-slate:#34414C;--pk-sand:#EFC48B;--pk-mono:Simple,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;--pk-serif:Georgia,"Times New Roman",Times,serif}\ body.page-press{background:var(--pk-black)}\ body.page-press main.site-main>section.sec,body.page-press main.site-main>article.article{padding:0!important;margin:0!important;background:var(--pk-black)!important}\ body.page-press main.site-main>section.sec>.wrap,body.page-press main.site-main>article.article>.wrap{max-width:none!important;padding:0!important;margin:0!important;width:100%!important}\ body.page-press .content.gh-content{padding:0!important;max-width:none!important;margin:0!important}body.page-press .content.gh-content>*{max-width:none!important}\ body.page-press h1.u-title,body.page-press .page-head,body.page-press .post-meta{display:none!important}\ body.page-press .rs-strip{display:none}\ body.page-press.pk-dock-on{padding-bottom:84px}\ #rs-press{font-family:var(--pk-mono);color:var(--pk-cream);line-height:1.5;font-size:15px;overflow:hidden;-webkit-font-smoothing:antialiased;text-transform:none}\ #rs-press *{box-sizing:border-box}\ #rs-press img{display:block;max-width:100%;margin:0}\ #rs-press a{color:inherit;text-decoration:none}\ #rs-press p{margin:0}\ .pk{position:relative;overflow:hidden}\ .pk-in{max-width:1320px;margin:0 auto;padding:clamp(40px,6vw,84px) clamp(20px,5vw,64px)}\ .pk-lab{font-size:.78rem;letter-spacing:.14em;opacity:.8}\ .pk-note{font-size:.72rem;letter-spacing:.1em;color:var(--pk-sand)}\ .pk-corner{position:absolute;font-size:.8rem;letter-spacing:.08em;z-index:3}\ .pk-rv{opacity:0;transform:translateY(22px);transition:opacity 1s cubic-bezier(.2,.7,.2,1),transform 1s cubic-bezier(.2,.7,.2,1)}\ .pk-rv.on{opacity:1;transform:none}\ .pk-btn{display:inline-block;border:1px solid var(--pk-rose);color:var(--pk-cream);padding:10px 18px;font-size:.72rem;letter-spacing:.12em;transition:background .3s,color .3s;cursor:pointer;background:none;font-family:inherit}\ .pk-btn:hover{background:var(--pk-rose);color:var(--pk-black)}\ /* hero */\ .pk-hero{height:min(100svh,860px);min-height:520px;background:#000}\ .pk-hero img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center 30%;transform:scale(1);animation:pk-kb 28s ease-in-out infinite alternate}\ @keyframes pk-kb{from{transform:scale(1) translate(0,0)}to{transform:scale(1.09) translate(-1.2%,1.5%)}}\ .pk-hero::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,.35) 0%,rgba(0,0,0,0) 30%,rgba(0,0,0,0) 65%,rgba(0,0,0,.55) 100%)}\ .pk-hero .tl{left:clamp(18px,4vw,48px);top:clamp(18px,4vw,40px)}.pk-hero .tr{right:clamp(18px,4vw,48px);top:clamp(18px,4vw,40px);text-align:right}\ .pk-hero .bl{left:clamp(18px,4vw,48px);bottom:clamp(22px,4vw,44px)}.pk-hero .br{right:clamp(18px,4vw,48px);bottom:clamp(22px,4vw,44px);text-align:right}\ .pk-hero .ttl{position:absolute;left:50%;top:clamp(18px,4vw,40px);transform:translateX(-50%);font-size:clamp(1.2rem,2vw,1.6rem);letter-spacing:.06em;z-index:3}\ .pk-hero .dl{position:absolute;left:50%;bottom:clamp(22px,4vw,44px);transform:translateX(-50%);z-index:3;font-size:.72rem;letter-spacing:.12em;border-bottom:1px solid rgba(242,226,202,.5);padding-bottom:3px;opacity:.85}\ @media(max-width:640px){.pk-hero img{object-position:30% 30%}.pk-hero .ttl{top:auto;bottom:38%;font-size:2rem}.pk-hero .tr,.pk-hero .tl{font-size:.68rem;max-width:44%}.pk-hero .dl{bottom:74px}}\ /* bio */\ .pk-bio{background:var(--pk-cream);color:var(--pk-ink)}\ .pk-bio .pk-in{display:grid;grid-template-columns:5fr 7fr;gap:clamp(24px,5vw,72px);align-items:stretch;padding-top:0;padding-bottom:0}\ .pk-bio .ph{position:relative;min-height:520px;margin-left:calc(-1*clamp(20px,5vw,64px))}\ .pk-bio .ph img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:48% 35%}\ .pk-bio .tx{padding:clamp(44px,6vw,80px) 0;font-size:.9rem;line-height:1.75;display:flex;flex-direction:column;justify-content:center}\ .pk-bio .tx p+p{margin-top:1.1em}\ .pk-bio .tx em{font-style:normal;color:var(--pk-rose)}\ .pk-bio .pk-lab{position:absolute;right:clamp(20px,5vw,64px);top:22px}\ @media(max-width:800px){.pk-bio .pk-in{grid-template-columns:1fr}.pk-bio .ph{min-height:0;height:82vw;margin:0 calc(-1*clamp(20px,5vw,64px))}.pk-bio .ph img{object-position:50% 35%}.pk-bio .tx{padding:34px 0 44px}}\ /* ecosystem */\ .pk-eco{background:#000;padding:24px 0 clamp(44px,6vw,80px)}\ .pk-eco .pk-lab{position:absolute;right:clamp(20px,5vw,64px);top:26px}\ .pk-eco .grid{display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:auto auto 72px auto;column-gap:0;row-gap:0}\ .pk-eco .it{display:contents}\ .pk-eco .it:nth-child(1)>*{grid-column:1}.pk-eco .it:nth-child(2)>*{grid-column:2}.pk-eco .it:nth-child(3)>*{grid-column:3}\ .pk-eco .n{grid-row:1;text-align:center;font-size:.78rem;letter-spacing:.1em;opacity:.85;padding:44px 0 60px}\ .pk-eco .im{grid-row:2;aspect-ratio:3/2;overflow:hidden;background:#111;display:block;align-self:center;position:relative}\ .pk-eco .it:nth-child(2) .im{aspect-ratio:4/3;margin:-6% 0;z-index:2}\ .pk-eco .im img{width:100%;height:100%;object-fit:cover;transition:transform 1.6s ease}\ .pk-eco .im:hover img{transform:scale(1.04)}\ .pk-eco .nm{grid-row:3;align-self:end;text-align:center;font-size:1.35rem;letter-spacing:.06em;padding:0 0 14px;margin-top:40px}\ .pk-eco .nm.serif{font-family:var(--pk-serif);font-size:1.45rem;letter-spacing:.02em}\ .pk-eco .nm img{height:22px;margin:0 auto}\ .pk-eco .tx{grid-row:4;text-align:center;font-size:.84rem;line-height:1.55;max-width:32ch;margin:0 auto;white-space:pre-line;padding:16px 16px 0}\ @media(max-width:760px){.pk-eco .pk-lab{position:static;display:block;text-align:right;padding:0 20px 6px}.pk-eco .grid{display:block}.pk-eco .it{display:block;margin-bottom:46px}.pk-eco .n{padding:0 0 10px}.pk-eco .im,.pk-eco .it:nth-child(2) .im{aspect-ratio:16/10;margin:0}.pk-eco .nm{margin-top:22px;padding-bottom:6px}}\ /* releases (compact band over the live photo) */\ .pk-rel{background:#111;color:var(--pk-cream)}\ .pk-rel>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center 40%;opacity:.5}\ .pk-rel::before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,rgba(0,0,0,.72),rgba(0,0,0,.35) 60%,rgba(0,0,0,.6))}\ .pk-rel .pk-in{position:relative;z-index:2;display:grid;grid-template-columns:200px 1fr 1fr;gap:30px;padding-top:clamp(36px,5vw,64px);padding-bottom:clamp(36px,5vw,64px)}\ .pk-rel .yr{font-size:clamp(1.6rem,2.6vw,2.2rem);letter-spacing:.08em;margin:0 0 10px}\ .pk-rel ul{list-style:none;margin:0;padding:0;font-size:.76rem;letter-spacing:.07em;line-height:1.9}\ .pk-rel li{text-shadow:0 1px 10px rgba(0,0,0,.6)}\ @media(max-width:860px){.pk-rel .pk-in{grid-template-columns:1fr;gap:14px}.pk-rel ul{font-size:.7rem}}\ /* collage */\ .pk-col{background:var(--pk-black);padding:clamp(30px,4vw,48px) 0}\ .pk-col .row{display:flex;gap:14px;width:max-content;animation:pk-roll var(--d,110s) linear infinite;padding:7px 0}\ .pk-col .row.rev{animation-direction:reverse}\ .pk-col:hover .row{animation-play-state:paused}\ .pk-col .row a{flex:0 0 auto;height:clamp(150px,21vw,250px);overflow:hidden;border-radius:2px;background:#161412;transform:rotate(var(--r,0deg));transition:transform .5s}\ .pk-col .row a:hover{transform:rotate(0) scale(1.04);z-index:2}\ .pk-col .row img{height:100%;width:auto;display:block}\ @keyframes pk-roll{from{transform:translateX(0)}to{transform:translateX(-50%)}}\ /* reels */\ .pk-reels{background:#000}\ .pk-reels .pk-lab{position:absolute;right:clamp(20px,5vw,64px);top:26px}\ .pk-reels .grid{display:grid;grid-template-columns:repeat(var(--n,4),1fr);gap:14px;margin-top:30px}\ .pk-reels .v{aspect-ratio:9/16;background:#0a0908;overflow:hidden;border-radius:3px;position:relative}\ .pk-reels video{width:100%;height:100%;object-fit:cover;display:block}\ .pk-reels .snd{position:absolute;right:10px;bottom:10px;border:1px solid rgba(242,226,202,.6);color:var(--pk-cream);background:rgba(0,0,0,.45);font:inherit;font-size:.66rem;letter-spacing:.1em;padding:6px 10px;cursor:pointer}\ .pk-reels .more{display:flex;gap:10px;overflow-x:auto;scrollbar-width:none;margin-top:14px}\ .pk-reels .more button{flex:0 0 auto;width:72px;aspect-ratio:9/16;border:1px solid transparent;padding:0;background:#111;cursor:pointer;opacity:.7}\ .pk-reels .more button.on{border-color:var(--pk-cream);opacity:1}\ .pk-reels .more img{width:100%;height:100%;object-fit:cover}\ @media(max-width:640px){.pk-reels .grid{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none}.pk-reels .v{flex:0 0 72vw;scroll-snap-align:start}}\ /* shelves */\ .pk-shelf{background:var(--pk-black)}\ .pk-shelf .pk-lab.r{position:absolute;right:clamp(20px,5vw,64px);top:26px}\ .pk-shelf .pk-note.top{position:absolute;left:clamp(20px,5vw,64px);top:28px}\ .pk-row{display:grid;grid-template-columns:150px 1fr;align-items:end;gap:24px;margin-top:30px}\ .pk-row .nm{font-size:.8rem;letter-spacing:.06em;padding-bottom:16px;opacity:.9}\ .pk-tiles{display:grid;grid-template-columns:repeat(var(--c,6),1fr);gap:clamp(10px,1.6vw,22px);padding:0 10px 12px;position:relative}\ .pk-tiles::after{content:"";position:absolute;left:-6px;right:-6px;bottom:0;height:6px;background:var(--pk-slate);border-radius:1px;box-shadow:0 10px 24px rgba(0,0,0,.6)}\ .pk-t{position:relative;display:block;aspect-ratio:1;overflow:hidden;background:#1a1816;box-shadow:0 10px 22px rgba(0,0,0,.45);transition:transform .45s cubic-bezier(.2,.7,.2,1),box-shadow .45s;cursor:pointer}\ .pk-t img{width:100%;height:100%;object-fit:cover}\ .pk-t:hover{transform:translateY(-8px);box-shadow:0 22px 40px rgba(0,0,0,.6)}\ .pk-t .cap{position:absolute;left:0;right:0;bottom:0;padding:10px 10px 9px;font-size:.62rem;letter-spacing:.06em;line-height:1.35;background:linear-gradient(180deg,rgba(0,0,0,0),rgba(0,0,0,.82));opacity:0;transform:translateY(6px);transition:opacity .35s,transform .35s}\ .pk-t:hover .cap{opacity:1;transform:none}\ .pk-t .rs{position:absolute;top:7px;right:7px;font-size:.5rem;letter-spacing:.12em;background:rgba(242,226,202,.88);color:var(--pk-black);padding:2px 5px;border-radius:2px}\ .pk-t .pl{position:absolute;left:50%;top:50%;width:40px;height:40px;margin:-20px 0 0 -20px;border-radius:50%;border:1px solid rgba(242,226,202,.8);background:rgba(0,0,0,.35);display:grid;place-items:center;opacity:0;transition:opacity .3s}\ .pk-t .pl::after{content:"";border-left:11px solid var(--pk-cream);border-top:6px solid transparent;border-bottom:6px solid transparent;margin-left:3px}\ .pk-t:hover .pl,.pk-t.playing .pl{opacity:1}\ .pk-t.playing .pl::after{border:0;width:10px;height:12px;border-left:3px solid var(--pk-cream);border-right:3px solid var(--pk-cream);margin:0}\ .pk-wide .pk-t{aspect-ratio:16/9}\ .pk-wide .pk-t .cap{opacity:1;transform:none;font-size:.78rem}\ .pk-wide .pk-t .cap small{display:block;opacity:.65;font-size:.6rem;margin-top:2px}\ .pk-wide .pk-t .pl{opacity:.9;width:46px;height:46px;margin:-23px 0 0 -23px}\ .pk-head{display:grid;grid-template-columns:260px 1fr;gap:40px;align-items:start;margin-top:30px}\ .pk-head h3{margin:0 0 12px;font-weight:400;font-size:1.05rem;letter-spacing:.04em}\ .pk-head .tx{font-size:.8rem;line-height:1.7;opacity:.9;white-space:pre-line}\ .pk-head .btns{margin-top:22px;display:flex;gap:10px;flex-wrap:wrap}\ .pk-shelf .stack{display:grid;gap:30px}\ .pk-strip{overflow:hidden;position:relative;padding:4px 0 14px}\ .pk-strip .row{display:flex;gap:clamp(10px,1.4vw,18px);width:max-content;animation:pk-roll var(--d,160s) linear infinite}\ .pk-strip:hover .row{animation-play-state:paused}\ .pk-strip .pk-t{flex:0 0 auto;width:clamp(120px,13vw,170px)}\ .pk-strip::after{content:"";position:absolute;left:0;right:0;bottom:0;height:6px;background:var(--pk-slate)}\ @media(max-width:900px){.pk-row{grid-template-columns:1fr;gap:10px}.pk-row .nm{padding-bottom:0}.pk-head{grid-template-columns:1fr;gap:24px}}\ @media(max-width:640px){.pk-tiles{display:flex;overflow-x:auto;scroll-snap-type:x proximity;scrollbar-width:none;padding-bottom:16px;margin:0 calc(-1*clamp(20px,5vw,64px));padding-left:clamp(20px,5vw,64px);padding-right:clamp(20px,5vw,64px)}.pk-tiles::-webkit-scrollbar{display:none}.pk-tiles::after{display:none}.pk-t{flex:0 0 46vw;scroll-snap-align:start}.pk-wide .pk-t{flex-basis:78vw}.pk-t .cap{opacity:1;transform:none}.pk-shelf .pk-note.top{position:static;display:block;margin-bottom:-18px}.pk-strip .pk-t{width:40vw}}\ /* happy camper */\ .pk-hcr .icons{position:absolute;left:clamp(20px,5vw,64px);top:24px;display:flex;gap:clamp(18px,3vw,52px)}\ .pk-hcr .icons img{width:48px;height:48px}\ .pk-hcr .pk-in{padding-top:110px}\ .pk-hcr .side .lg img{width:110px;margin-bottom:30px}\ .pk-hcr .side .intro{color:var(--pk-rose);font-size:.8rem;line-height:1.6;margin:8px 0 16px;max-width:30ch}\ .pk-hcr .side .tx{font-size:.8rem;line-height:1.7;max-width:34ch;white-space:pre-line}\ .pk-hcr .rows{display:grid;gap:22px}\ .pk-hcr .foot{display:flex;justify-content:space-between;align-items:center;gap:20px;margin-top:28px;flex-wrap:wrap}\ @media(max-width:640px){.pk-hcr .icons{position:static;margin:0 0 10px}.pk-hcr .pk-in{padding-top:66px}}\ /* agenda */\ .pk-ag{background:var(--pk-cream);color:var(--pk-ink)}\ .pk-ag .pk-in{display:grid;grid-template-columns:1fr 1.1fr 1.3fr;gap:30px;align-items:center}\ .pk-ag .lab{font-size:.82rem;letter-spacing:.14em}\ .pk-ag .ttl{font-size:clamp(1.6rem,3vw,2.4rem);letter-spacing:.08em;margin-top:6px}\ .pk-ag .ph img{max-height:600px;width:auto;margin:0 auto}\ .pk-ag ul{list-style:none;margin:0;padding:0;font-size:.74rem;letter-spacing:.08em;line-height:2}\ .pk-ag li{display:flex;align-items:baseline;gap:6px;white-space:nowrap}\ .pk-ag li i{flex:1;border-bottom:1px dotted rgba(13,13,13,.6);transform:translateY(-4px);min-width:16px}\ @media(max-width:860px){.pk-ag .pk-in{grid-template-columns:1fr 1fr}.pk-ag .ph{grid-column:1/-1;order:3}.pk-ag .ph img{max-height:420px}}\ @media(max-width:560px){.pk-ag .pk-in{grid-template-columns:1fr}.pk-ag ul{font-size:.66rem}}\ /* labels: two marquees */\ .pk-lb{background:var(--pk-cream);color:var(--pk-ink);padding:clamp(36px,5vw,64px) 0 clamp(30px,4vw,56px)}\ .pk-lb .pk-lab{position:absolute;right:clamp(20px,5vw,64px);top:24px}\ .pk-lb .mq{overflow:hidden;padding:22px 0}\ .pk-lb .mq .row{display:flex;gap:clamp(48px,6vw,90px);width:max-content;animation:pk-roll var(--d,80s) linear infinite;align-items:center}\ .pk-lb .mq.rev .row{animation-direction:reverse}\ .pk-lb:hover .row{animation-play-state:paused}\ .pk-lb .mq img{height:clamp(34px,4vw,56px);width:auto;max-width:170px;object-fit:contain}\ /* above */\ .pk-ab{background:#2a0a07;color:var(--pk-cream);min-height:clamp(520px,58vw,760px);display:grid;grid-template-rows:auto 1fr auto;justify-items:center;text-align:center;padding:clamp(34px,5vw,60px) 20px clamp(40px,6vw,70px)}\ .pk-ab>img.bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center 40%;animation:pk-kb 32s ease-in-out infinite alternate}\ .pk-ab::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,.2),rgba(0,0,0,0) 30%,rgba(0,0,0,.5) 100%)}\ .pk-ab .wm{filter:drop-shadow(0 2px 12px rgba(0,0,0,.7))}\ .pk-ab>*:not(.bg){position:relative;z-index:2}\ .pk-ab .wm{height:clamp(22px,2.6vw,34px);width:auto}\ .pk-ab .l{align-self:end;display:grid;grid-template-columns:auto auto;column-gap:.5em;row-gap:.1em;align-items:baseline;font-family:var(--pk-serif);font-size:clamp(1.3rem,3.2vw,2.6rem);line-height:1.25;letter-spacing:.01em;text-shadow:0 2px 24px rgba(0,0,0,.45)}\ .pk-ab .l i{text-align:right;font-style:italic;font-size:.62em}\ .pk-ab .l i em{font-size:1.45em;font-style:italic}\ .pk-ab .l b{text-align:left;font-weight:400;text-transform:uppercase}\ .pk-ab .pk-btn{margin-top:clamp(28px,4vw,56px);border-color:rgba(242,226,202,.75);text-transform:uppercase;padding:11px 24px}\ /* contact */\ .pk-ct{background:var(--pk-black)}\ .pk-ct .pk-in{display:grid;grid-template-columns:1.15fr 1fr;gap:0;align-items:stretch;padding:0 0 0 clamp(20px,5vw,64px);max-width:none}\ .pk-ct .tx{display:flex;flex-direction:column;justify-content:space-between;padding:clamp(40px,5vw,64px) clamp(28px,5vw,80px) clamp(32px,4vw,48px) 0;max-width:760px}\ .pk-ct .lab{color:var(--pk-rose);font-size:.8rem;letter-spacing:.06em;margin-bottom:12px}\ .pk-ct .q{font-size:.86rem;line-height:1.75;max-width:44ch}\ .pk-ct .cols{display:grid;grid-template-columns:auto auto;justify-content:start;gap:clamp(30px,5vw,70px);margin-top:clamp(40px,5vw,72px);align-items:end}\ .pk-ct .ic{display:flex;gap:16px;align-items:center;flex-wrap:nowrap;margin-top:8px;min-height:32px}\ .pk-ct .ic img{height:22px;width:auto}\ .pk-ct .ic a.t{font-size:.76rem;letter-spacing:.04em;border-bottom:1px solid rgba(242,226,202,.35)}\ .pk-ct .bk{font-size:.8rem;line-height:1.9;margin-top:4px}\ .pk-ct .bk a:hover{color:var(--pk-rose)}\ .pk-ct .ph{position:relative;min-height:460px}\ .pk-ct .ph img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:60% center}\ .pk-ct .foot{font-size:.62rem;letter-spacing:.1em;opacity:.5;margin-top:34px}\ @media(max-width:800px){.pk-ct .pk-in{grid-template-columns:1fr;padding-right:clamp(20px,5vw,64px)}.pk-ct .tx{padding-right:0}.pk-ct .ph{min-height:0;aspect-ratio:4/5;margin:0 calc(-1*clamp(20px,5vw,64px))}.pk-ct .cols{grid-template-columns:1fr;gap:22px}.pk-ct .ic{flex-wrap:wrap}}\ /* fold-out drawers */\ .pk-fw{background:var(--pk-black);border-top:1px solid rgba(242,226,202,.12)}\ .pk-fw.lt{background:var(--pk-cream);color:var(--pk-ink);border-top-color:rgba(13,13,13,.12)}\ .pk-fbar{display:none;width:100%;font:inherit;color:inherit;background:none;border:0;cursor:pointer;text-align:left;padding:20px clamp(20px,5vw,64px);align-items:baseline;gap:14px}\ .pk-fbar b{font-weight:400;font-size:.8rem;letter-spacing:.14em;text-transform:uppercase;white-space:nowrap}\ .pk-fbar span{flex:1;font-size:.74rem;opacity:.62;letter-spacing:.03em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\ .pk-fbar i{font-style:normal;font-size:1.2rem;line-height:1;transition:transform .4s}\ .pk-fw.open .pk-fbar i{transform:rotate(45deg)}\ .pk-fbody{overflow:hidden}\ .pk-fold-on .pk-fbar{display:flex}\ .pk-fold-on .pk-fw:not(.open) .pk-fbody{height:0}\ .pk-fold-on .pk-fbody{transition:height .55s cubic-bezier(.2,.7,.2,1)}\ /* lightbox / video modal */\ .pk-lbx{position:fixed;inset:0;z-index:100001;background:rgba(5,5,5,.94);display:flex;align-items:center;justify-content:center;padding:20px;cursor:zoom-out}\ .pk-lbx img{max-width:min(96vw,1400px);max-height:92vh;width:auto;height:auto;box-shadow:0 30px 80px rgba(0,0,0,.6)}\ .pk-lbx .fr{width:min(94vw,860px);aspect-ratio:16/9;background:#000;box-shadow:0 30px 80px rgba(0,0,0,.6)}\ .pk-lbx iframe{width:100%;height:100%;border:0}\ .pk-lbx .x{position:absolute;top:14px;right:20px;color:var(--pk-cream);font-size:28px;line-height:1;cursor:pointer;opacity:.8;font-family:var(--pk-mono)}\ /* player dock */\ .pk-dock{position:fixed;left:0;right:0;bottom:0;z-index:100000;background:#141311;color:var(--pk-cream);font-family:var(--pk-mono);border-top:1px solid rgba(242,226,202,.15);transform:translateY(110%);transition:transform .5s cubic-bezier(.2,.7,.2,1);box-shadow:0 -20px 50px rgba(0,0,0,.5)}\ .pk-dock.on{transform:none}\ .pk-dock .in{max-width:1320px;margin:0 auto;display:grid;grid-template-columns:56px 1fr auto;gap:16px;align-items:center;padding:12px clamp(16px,4vw,64px);min-height:80px}\ .pk-dock .cv{width:56px;height:56px;object-fit:cover;background:#222}\ .pk-dock .meta{min-width:0}\ .pk-dock .t{font-size:.78rem;letter-spacing:.04em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\ .pk-dock .s{font-size:.64rem;opacity:.6;letter-spacing:.08em;margin-top:2px}\ .pk-dock .bar{height:2px;background:rgba(242,226,202,.2);margin-top:8px;cursor:pointer}\ .pk-dock .bar i{display:block;height:100%;width:0;background:#CAEFEC}\ .pk-dock .ctl{display:flex;gap:14px;align-items:center}\ .pk-dock button{font:inherit;color:inherit;background:none;border:1px solid rgba(242,226,202,.5);border-radius:50%;width:40px;height:40px;cursor:pointer;display:grid;place-items:center;padding:0}\ .pk-dock button.pp::after{content:"";border-left:11px solid var(--pk-cream);border-top:6px solid transparent;border-bottom:6px solid transparent;margin-left:3px}\ .pk-dock.playing button.pp::after{border:0;width:10px;height:12px;border-left:3px solid var(--pk-cream);border-right:3px solid var(--pk-cream);margin:0}\ .pk-dock .x{border:0;font-size:22px;opacity:.7;width:30px;height:30px}\ .pk-dock .ext{font-size:.62rem;letter-spacing:.1em;opacity:.65;border-bottom:1px solid rgba(242,226,202,.35)}\ .pk-dock .emb{grid-column:1/-1;display:none}\ .pk-dock.embed .in{grid-template-columns:1fr auto}\ .pk-dock.embed .cv,.pk-dock.embed .pp,.pk-dock.embed .bar,.pk-dock.embed .meta{display:none}\ .pk-dock.embed .emb{display:block;width:100%}\ .pk-dock .emb iframe{width:100%;border:0;display:block}\ .pk-dock .hid{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;left:0;top:0}\ @media(max-width:640px){.pk-dock .ext{display:none}}\ @media(prefers-reduced-motion:reduce){#rs-press *{animation:none!important;transition:none!important}.pk-rv{opacity:1;transform:none}}\ '; CSS += ` /* ===== v5 ===== */ #rs-press .pk-bio .tx p,#rs-press .pk-eco .tx,#rs-press .pk-eco .etx p,#rs-press .pk-head .tx,#rs-press .pk-hcr .side .tx,#rs-press .pk-hcr .side .intro,#rs-press .pk-ct .q{text-align:justify;text-align-last:left;-webkit-hyphens:auto;hyphens:auto} #rs-press .pk-t .cap{display:none}#rs-press .pk-wide .pk-t .cap{display:block} #rs-press .pk-t .rs{font-size:.56rem;padding:3px 6px} #rs-press .pk-t[data-kind=room] .pl{display:grid} #rs-press .pk-hcr .side .lg{margin-bottom:34px}#rs-press .pk-hcr .side .lg img{width:110px;margin:0} #rs-press .pk-eco .nm{display:flex;align-items:center;justify-content:center;height:34px;margin-top:40px;padding:0;font-family:var(--pk-mono)!important;font-size:1.15rem;letter-spacing:.12em;text-transform:uppercase} #rs-press .pk-eco .nm.lc{text-transform:none} #rs-press .pk-eco .nm img{height:17px;width:auto;margin:0 auto} #rs-press .pk-eco .tx{max-width:38ch;margin:0 auto} #rs-press .pk-eco .etx{display:none} @media(max-width:760px){ #rs-press .pk-eco{padding:14px 0 30px} #rs-press .pk-eco .grid{display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:auto;gap:10px;padding:0 16px} #rs-press .pk-eco .it{display:block;margin:0;cursor:pointer} #rs-press .pk-eco .it>*{grid-column:auto} #rs-press .pk-eco .n,#rs-press .pk-eco .tx{display:none} #rs-press .pk-eco .im,#rs-press .pk-eco .it:nth-child(2) .im{aspect-ratio:1;margin:0;border-radius:2px;opacity:.5;transition:opacity .4s} #rs-press .pk-eco .it.sel .im{opacity:1} #rs-press .pk-eco .nm{height:28px;margin-top:8px;font-size:.62rem;letter-spacing:.1em;border-bottom:1px solid transparent} #rs-press .pk-eco .nm img{height:9px} #rs-press .pk-eco .it.sel .nm{border-bottom-color:var(--pk-rose)} #rs-press .pk-eco .etx{display:block;padding:18px 16px 0;font-size:.82rem;line-height:1.6;white-space:pre-line;min-height:10em} #rs-press .pk-eco .etx a{display:inline-block;margin-top:12px;font-size:.68rem;letter-spacing:.1em;border-bottom:1px solid rgba(242,226,202,.4)} } /* horizontal rows (records, reels, live shows) */ .pk-hs{position:relative;min-width:0;max-width:100%} #rs-press a.c,#rs-press a.pk-t,#rs-press .pk-eco a.im,#rs-press .pk-col a,#rs-press .pk-hcr .icons a{border-bottom:0!important;box-shadow:none!important;text-decoration:none} .pk-hs .trk{display:flex;gap:clamp(10px,1.4vw,18px);overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none;-webkit-overflow-scrolling:touch;padding:4px 2px 18px} .pk-hs .trk::-webkit-scrollbar{display:none} .pk-hs.shelf::after{content:"";position:absolute;left:0;right:0;bottom:0;height:6px;background:var(--pk-slate);border-radius:1px;pointer-events:none} #rs-press .pk-hs .pk-t{flex:0 0 auto;width:clamp(118px,12.5vw,168px)} #rs-press .pk-hs .pk-t:hover{transform:translateY(-6px)} .pk-hs .ar{position:absolute;top:calc(50% - 28px);width:38px;height:38px;border-radius:50%;border:1px solid rgba(242,226,202,.45);background:rgba(13,13,13,.65);color:var(--pk-cream);font:inherit;font-size:15px;cursor:pointer;z-index:4;opacity:0;transition:opacity .3s;display:grid;place-items:center;padding:0} .pk-hs:hover .ar{opacity:1}.pk-hs .ar.l{left:-10px}.pk-hs .ar.r{right:-10px} @media(hover:none){.pk-hs .ar{display:none}} @media(max-width:640px){ .pk-hs .trk{margin:0 calc(-1*clamp(20px,5vw,64px));padding-left:clamp(20px,5vw,64px);padding-right:clamp(20px,5vw,64px)} #rs-press .pk-hs .pk-t{width:38vw} .pk-hs.shelf::after{left:calc(-1*clamp(20px,5vw,64px));right:calc(-1*clamp(20px,5vw,64px))} } /* reels v5: one endless row, tap for sound */ #rs-press .pk-reels .trk{margin-top:30px;padding-bottom:4px} #rs-press .pk-reels .v{flex:0 0 auto;width:calc((100% - 3*clamp(10px,1.4vw,18px))/4);cursor:pointer} .pk-reels .spk{position:absolute;right:10px;bottom:10px;width:30px;height:30px;border-radius:50%;background:rgba(0,0,0,.45);border:1px solid rgba(242,226,202,.5);display:grid;place-items:center;pointer-events:none} .pk-reels .spk svg{width:14px;height:14px;stroke:var(--pk-cream);fill:none;stroke-width:1.6} .pk-reels .spk .on{display:none}.pk-reels .v.snd-on .spk .on{display:block}.pk-reels .v.snd-on .spk .off{display:none} .pk-reels .v.snd-on{outline:1px solid rgba(242,226,202,.6);outline-offset:-1px} @media(max-width:640px){#rs-press .pk-reels .v{width:62vw}} /* recent recordings */ .pk-rec{background:var(--pk-black)} .pk-rec .pk-in{padding-top:clamp(28px,4vw,48px);padding-bottom:clamp(30px,4vw,52px)} .pk-rec .hd{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:18px;gap:16px} .pk-rec .hd a{font-size:.68rem;letter-spacing:.1em;opacity:.7;border-bottom:1px solid rgba(242,226,202,.3)} .pk-rec .grid{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(14px,2vw,26px)} .pk-rec .c{display:block;cursor:pointer;min-width:0} .pk-rec .im{position:relative;aspect-ratio:16/9;overflow:hidden;background:#161412;border-radius:2px} .pk-rec .im img{width:100%;height:100%;object-fit:cover;transition:transform 1.2s} .pk-rec .c:hover .im img{transform:scale(1.04)} .pk-rec .pl{position:absolute;left:14px;bottom:14px;width:44px;height:44px;border-radius:50%;border:1px solid rgba(242,226,202,.85);background:rgba(0,0,0,.4);display:grid;place-items:center} .pk-rec .pl::after{content:"";border-left:12px solid var(--pk-cream);border-top:7px solid transparent;border-bottom:7px solid transparent;margin-left:3px} .pk-rec .c.playing .pl::after{border:0;width:11px;height:13px;border-left:3px solid var(--pk-cream);border-right:3px solid var(--pk-cream);margin:0} .pk-rec .t{font-size:.8rem;letter-spacing:.05em;margin-top:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .pk-rec .fp{font-size:.64rem;letter-spacing:.1em;opacity:.6;margin-top:4px;display:inline-block;border-bottom:1px solid rgba(242,226,202,.3)} @media(max-width:700px){ .pk-rec .grid{grid-template-columns:1fr;gap:12px} .pk-rec .c{display:grid;grid-template-columns:118px 1fr;gap:14px;align-items:center} .pk-rec .t{margin-top:0;white-space:normal} .pk-rec .pl{left:50%;top:50%;bottom:auto;margin:-17px 0 0 -17px;width:34px;height:34px} .pk-rec .pl::after{border-left-width:9px;border-top-width:5px;border-bottom-width:5px} } /* dock: full page link for room service sets */ .pk-dock .fp{font-size:.64rem;letter-spacing:.1em;border:1px solid rgba(242,226,202,.45);padding:8px 11px;white-space:nowrap;display:none} .pk-dock.room .fp{display:inline-block}.pk-dock.room .ext{display:none} @media(max-width:640px){.pk-dock .in{grid-template-columns:44px 1fr auto;gap:10px}.pk-dock .cv{width:44px;height:44px}.pk-dock .ctl{gap:8px}.pk-dock .fp{padding:7px 8px;font-size:.58rem}} /* clean video pop-up */ .pk-vbox{position:fixed;inset:0;z-index:100002;display:flex;align-items:center;justify-content:center;padding:20px;background:rgba(13,13,13,.6);-webkit-backdrop-filter:blur(8px) saturate(.85);backdrop-filter:blur(8px) saturate(.85);opacity:0;transition:opacity .35s} .pk-vbox.on{opacity:1} .pk-vbox .vc{position:relative;width:min(92vw,880px);transform:scale(.96);transition:transform .45s cubic-bezier(.2,.7,.2,1)} .pk-vbox.on .vc{transform:none} .pk-vbox .fr{position:relative;aspect-ratio:16/9;background:#000;overflow:hidden;border-radius:4px;box-shadow:0 40px 90px rgba(0,0,0,.55)} .pk-vbox iframe{position:absolute;left:0;top:-60px;width:100%;height:calc(100% + 120px);border:0;pointer-events:none} .pk-vbox .cover{position:absolute;inset:0;background:#000 center/cover no-repeat;transition:opacity .6s;display:grid;place-items:center;cursor:pointer} .pk-vbox .cover::after{content:"";width:58px;height:58px;border-radius:50%;border:1px solid rgba(242,226,202,.8);background:rgba(0,0,0,.35) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9 7l8 5-8 5z' fill='%23F2E2CA'/%3E%3C/svg%3E") center/26px no-repeat} .pk-vbox.loading .cover::after{animation:pk-pulse 1.2s ease-in-out infinite} @keyframes pk-pulse{50%{opacity:.35}} .pk-vbox.playing .cover{opacity:0;pointer-events:none} .pk-vbox .hit{position:absolute;inset:0;cursor:pointer} .pk-vbox .bar{display:flex;align-items:center;gap:14px;margin-top:12px;color:var(--pk-cream);font-family:var(--pk-mono);font-size:.68rem;letter-spacing:.08em} .pk-vbox .bar button{font:inherit;color:inherit;background:none;border:1px solid rgba(242,226,202,.45);border-radius:50%;width:34px;height:34px;cursor:pointer;padding:0;display:grid;place-items:center;flex:none} .pk-vbox .bar svg{width:14px;height:14px;fill:var(--pk-cream);stroke:var(--pk-cream);stroke-width:0} .pk-vbox .bar .mu svg{fill:none;stroke-width:1.6} .pk-vbox .bar .pr{flex:1;height:2px;background:rgba(242,226,202,.22);cursor:pointer;position:relative} .pk-vbox .bar .pr::before{content:"";position:absolute;left:0;right:0;top:-10px;bottom:-10px} .pk-vbox .bar .pr i{position:absolute;left:0;top:0;bottom:0;width:0;background:#CAEFEC} .pk-vbox .bar .tt{min-width:9ch;text-align:right;opacity:.75} .pk-vbox .ttl{color:var(--pk-cream);font-family:var(--pk-mono);font-size:.74rem;letter-spacing:.06em;margin-bottom:10px;opacity:.85;padding-right:40px} .pk-vbox .x{position:absolute;right:-4px;top:-8px;font-size:26px;line-height:1;color:var(--pk-cream);cursor:pointer;opacity:.8;font-family:var(--pk-mono);background:none;border:0;padding:0 4px} /* above: separate phone image */ .pk-ab picture{position:absolute;inset:0;z-index:0!important} .pk-ab picture img{width:100%;height:100%;object-fit:cover;object-position:center 40%;animation:pk-kb 32s ease-in-out infinite alternate} @media(max-width:640px){#rs-press .pk-ab picture img{object-position:center center}} /* contact v5 */ #rs-press .pk-ct .foot{display:none} #rs-press .pk-ct .ic{gap:20px;flex-wrap:wrap;align-items:center} #rs-press .pk-ct .ic a{display:inline-flex;align-items:center;opacity:.88;transition:opacity .3s;border:0} #rs-press .pk-ct .ic a:hover{opacity:1} #rs-press .pk-ct .ic img{height:22px;width:auto;max-width:none;flex:none} #rs-press .pk-ct .ic img.wide{height:13px} #rs-press .pk-ct .ic svg{width:21px;height:21px;fill:none;stroke:var(--pk-cream);stroke-width:1.4;flex:none} #rs-press .pk-ct.ct-a,#rs-press .pk-ct.ct-b,#rs-press .pk-ct.ct-c{min-height:clamp(480px,42vw,620px)} #rs-press .pk-ct .ic{flex-wrap:nowrap} #rs-press .pk-ct .bk a{border-bottom:0!important;white-space:nowrap} #rs-press .pk-ct .cols{grid-template-columns:auto auto;gap:clamp(28px,4vw,56px);margin-top:clamp(30px,4vw,52px)} #rs-press .pk-ct.ct-a .pk-in,#rs-press .pk-ct.ct-b .pk-in,#rs-press .pk-ct.ct-c .pk-in{display:block;position:static;padding:clamp(48px,6vw,90px) clamp(20px,5vw,64px);max-width:1320px} #rs-press .pk-ct.ct-a .tx,#rs-press .pk-ct.ct-b .tx,#rs-press .pk-ct.ct-c .tx{position:relative;z-index:2;padding:0;max-width:500px;min-height:clamp(380px,32vw,460px)} #rs-press .pk-ct.ct-a .ph,#rs-press .pk-ct.ct-b .ph,#rs-press .pk-ct.ct-c .ph{position:absolute;inset:0;min-height:0;margin:0;aspect-ratio:auto;z-index:0;opacity:1;transform:none} #rs-press .pk-ct.ct-a .ph{left:26%} #rs-press .pk-ct.ct-a .ph img{object-position:50% 68%} #rs-press .pk-ct.ct-a .ph::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,#0D0D0D 0%,rgba(13,13,13,.78) 22%,rgba(13,13,13,.25) 52%,rgba(13,13,13,0) 75%)} #rs-press .pk-ct.ct-b .ph img{opacity:.22;filter:grayscale(.4);object-position:50% 70%} #rs-press .pk-ct.ct-b .tx{margin:0 auto;max-width:540px} #rs-press .pk-ct.ct-c .ph{left:auto;width:60%} #rs-press .pk-ct.ct-c .ph img{-webkit-mask-image:linear-gradient(90deg,transparent 0%,#000 60%);mask-image:linear-gradient(90deg,transparent 0%,#000 60%);object-position:50% 70%;filter:grayscale(.15)} @media(max-width:800px){ #rs-press .pk-ct.ct-a .ph{left:0;height:64%;bottom:auto} #rs-press .pk-ct.ct-a .ph img{object-position:50% 78%} #rs-press .pk-ct.ct-a .ph::after{background:linear-gradient(180deg,rgba(13,13,13,0) 0%,rgba(13,13,13,.15) 45%,rgba(13,13,13,.85) 82%,#0D0D0D 100%)} #rs-press .pk-ct.ct-a .tx,#rs-press .pk-ct.ct-c .tx{padding-top:44vh;min-height:0} #rs-press .pk-ct.ct-b .tx{min-height:0} #rs-press .pk-ct.ct-c .ph{width:100%;height:64%} #rs-press .pk-ct.ct-c .ph img{object-position:50% 78%} #rs-press .pk-ct.ct-c .ph img{-webkit-mask-image:linear-gradient(180deg,#000 35%,transparent 100%);mask-image:linear-gradient(180deg,#000 35%,transparent 100%)} #rs-press .pk-ct .cols{grid-template-columns:1fr;gap:20px;margin-top:34px} } #rs-press img.pk-wait{opacity:0}#rs-press img.pk-arrive{animation:pk-fadein .7s ease both}@keyframes pk-fadein{from{opacity:0}to{opacity:1}} /* fold bars (all screens) */ #rs-press .pk-fbar{padding:22px clamp(20px,5vw,64px)} #rs-press .pk-fbar b{min-width:15ch} #rs-press .pk-fbar:hover i{transform:rotate(90deg)}#rs-press .pk-fw.open .pk-fbar i{transform:rotate(45deg)} @media(max-width:640px){#rs-press .pk-fbar b{min-width:0}} `; /* helpers */ var base = D.base || ''; function src(n) { if (!n) return ''; return /^(https?:)?\//.test(n) ? n : base + n; } function esc(s) { return String(s == null ? '' : s).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } function em(s) { return esc(s).replace(/\*([^*]+)\*/g, '$1'); } function isRoom(u) { return /^\/vault\//.test(u || '') || /roomservice\.music\/vault/.test(u || ''); } function kind(it) { var u = it.url || ''; if (it.bc) return 'bc'; if (isRoom(u)) return 'room'; if (/soundcloud\.com\/[^\/]+\/[^\/?#]+/.test(u) && !/\/sets\//.test(u)) return 'sc'; if (/open\.spotify\.com\/(track|album|playlist|episode)\//.test(u)) return 'sp'; if (/youtube\.com|youtu\.be/.test(u)) return 'yt'; return 'ext'; } function tile(it, wide) { var u = it.url || '#', k = kind(it); return '' + '' + esc(it.title || '') + '' + (k === 'room' ? 'room service' : '') + '' + '' + esc(it.title || '') + (it.sub ? '' + esc(it.sub) + '' : '') + ''; } var ICON = { globe: '', instagram: '', spkOff: '', spkOn: '' }; function hrow(inner, cls, id) { return '
' + inner + '
'; } function ytId(u) { var m = (u || '').match(/(?:v=|youtu\.be\/|embed\/)([A-Za-z0-9_-]{6,})/); return m ? m[1] : ''; } var h = []; /* hero */ var H = D.hero || {}; h.push('
' + '' + esc(H.left) + '' + esc(H.title) + '' + esc(H.right) + '' + '' + esc(D.year) + '' + (D.pdf ? 'download pdf' : '') + '' + esc(H.sub) + '
'); /* recent recordings */ var RC = D.recent || {}; if ((RC.items || []).length) { h.push('
' + esc(RC.label || '[recent recordings]') + 'the listening room →
' + RC.items.map(function (it) { var u = it.url || ''; return '
' + (it.image ? '' : '') + '
' + esc(it.title || '') + '
full page →
'; }).join('') + '
'); } /* bio */ var B = D.bio || {}; h.push('
' + esc(B.label) + '
unders
' + (B.paragraphs || []).map(function (p) { return '

' + em(p) + '

'; }).join('') + '
'); /* ecosystem */ var E = D.ecosystem || {}; h.push('
' + esc(E.label) + '
' + (E.items || []).map(function (it) { var nm = it.wordmark ? '' + esc(it.name) + '' : esc(it.name); var serif = (it.name && it.name === it.name.toLowerCase()) ? ' lc' : ''; return '
' + esc(it.n) + '
' + '
' + nm + '

' + esc(it.text) + '

'; }).join('') + '
'); /* releases band */ var R = D.releases || {}; var groups = R.groups || (R.items ? [{ year: R.year, items: R.items }] : []); h.push('
' + (R.image ? '' : '') + '
' + esc(R.label) + '
' + groups.map(function (g) { return '
' + esc(g.year) + '
    ' + (g.items || []).map(function (s) { return '
  • ' + esc(s) + '
  • '; }).join('') + '
'; }).join('') + '
'); /* collage */ h.push('
'); /* reels */ var V = (D.reels && D.reels.videos) || []; if (V.length) { var loopV = V.length > 4 ? V.concat(V) : V; h.push('
' + esc(D.reels.label || '') + '
' + hrow(loopV.map(function (v, i) { return '
' + ICON.spkOff + ICON.spkOn + '
'; }).join(''), 'loop', 'pk-reelrow') + '
'); } /* selection */ var S = D.selection || {}; var shelves = []; (S.shelves || []).forEach(function (sh) { var last = shelves[shelves.length - 1]; if (last && !sh.auto && !last.auto && last.name === sh.name) last.items = last.items.concat(sh.items || []); else shelves.push({ name: sh.name, auto: sh.auto, items: (sh.items || []).slice() }); }); h.push('
' + esc(S.note) + '' + esc(S.label) + '
' + shelves.map(function (sh) { var inner = sh.items.map(function (it) { return tile(it); }).join(''); return '
' + esc(sh.name) + '
' + hrow(inner, 'shelf' + (sh.auto === 'vault' ? ' drift' : ''), sh.auto === 'vault' ? 'pk-vault' : '') + '
'; }).join('') + '
'); /* agenda */ var A = D.agenda || {}; h.push('
' + esc(A.label) + '
' + esc(A.title) + '
'); /* labels */ var L = D.labels || {}; var logos = L.logos || []; var half = Math.ceil(logos.length / 2), l1 = logos.slice(0, half), l2 = logos.slice(half); function mq(list, rev) { var row = list.concat(list).map(function (l) { return '' + esc(l.name) + ''; }).join(''); return '
' + row + '
'; } h.push('
' + esc(L.label) + '' + mq(l1, false) + mq(l2.length ? l2 : l1, true) + '
'); /* above */ var AB = D.above || {}; function abLine(s) { s = s || ''; var m = s.match(/^((?:\S+\s)*?)([A-Z][A-Z\s\-\.]+)$/); var small = m ? m[1].trim() : '', big = m ? m[2] : s; return '' + em(small) + '' + esc(big) + ''; } h.push('
' + (AB.image_phone ? '' : '') + (AB.wordmark ? 'above' : '') + '
' + [AB.line1, AB.line2, AB.line3].map(abLine).join('') + '
' + (AB.button ? '' + esc(AB.button) + '' : '') + '
'); /* mixes */ var M = D.mixes || {}; h.push('
' + esc(M.note) + '' + esc(M.label) + '

' + esc(M.title) + '

' + esc(M.text) + '

' + (M.button ? '' + esc(M.button) + '' : '') + (M.button2 ? '' + esc(M.button2) + '' : '') + '
' + '
' + (M.items || []).map(function (it) { return tile(it); }).join('') + '
'); /* scoring */ var SC = D.scoring || {}; h.push('
' + esc(SC.label) + '

' + esc(SC.title) + '

' + esc(SC.text) + '

' + (SC.button ? '' + esc(SC.button) + '' : '') + '
' + '
' + (SC.items || []).map(function (it) { return tile(it, true); }).join('') + '
'); /* happy camper */ var HC = D.hcr || {}; var hcItems = HC.items || []; var rows = []; for (var ri = 0; ri < hcItems.length; ri += 7) rows.push(hcItems.slice(ri, ri + 7)); h.push('
' + (HC.icons || []).map(function (ic) { return '' + esc(ic.name) + ''; }).join('') + '
' + esc(HC.label) + '
' + (HC.logo ? '
happy camper records
' : '') + (HC.intro ? '

' + esc(HC.intro) + '

' : '') + '

' + esc(HC.text) + '

' + '
' + rows.map(function (r) { return '
' + r.map(function (it) { return tile(it); }).join('') + '
'; }).join('') + '
' + '
' + (HC.button ? '' + esc(HC.button) + '' : '') + '' + esc(HC.note) + '
'); /* contact */ var CT = D.contact || {}; var ctQ = (location.search.match(/[?&]ct=([abcd])/) || [])[1]; var ctL = ctQ || CT.layout || 'a'; var ctCls = ctL === 'd' ? '' : ' ct-' + ctL; h.push('
' + esc(CT.label) + '

' + esc(CT.quote) + '

' + esc(CT.contact_label) + '
' + (CT.links || []).map(function (l) { var ic = l.icon && ICON[l.icon]; return '' + (l.image ? '' + esc(l.name) + '' : ic ? ic : esc(l.text || l.name)) + ''; }).join('') + '
' + (CT.direct && CT.direct.length ? '
' + CT.direct.map(function (b) { return '' + esc(b.text) + '
'; }).join('') + '
' : '') + '
' + esc(CT.bookings_label) + '
' + (CT.bookings || []).map(function (b) { return '' + esc(b.text) + '
'; }).join('') + '
' + '
' + '
'); var st = document.createElement('style'); st.textContent = CSS; document.head.appendChild(st); mount.innerHTML = h.join(''); /* fold-out drawers: sections listed in D.fold collapse into a one-line bar (phone by default, everywhere if D.fold_everywhere) */ var FOLD = D.fold || {}; var foldMap = { recent: '.pk-rec', bio: '.pk-bio', releases: '.pk-rel', agenda: '.pk-ag', labels: '.pk-lb', scoring: '.pk-wide', hcr: '.pk-hcr', mixes: '.pk-mixes', reels: '.pk-reels', selection: '.pk-sel', ecosystem: '.pk-eco', above: '.pk-ab', contact: '.pk-ct', photos: '.pk-col' }; Object.keys(FOLD).forEach(function (k) { var sec = mount.querySelector(foldMap[k]); if (!sec) return; var f = FOLD[k] || {}; var light = /pk-bio|pk-ag|pk-lb/.test(sec.className); var w = document.createElement('div'); w.className = 'pk-fw' + (light ? ' lt' : ''); w.id = 'pk-' + k; if (f.open) w.classList.add('open'); w.innerHTML = '
'; sec.parentNode.insertBefore(w, sec); w.querySelector('.pk-fbody').appendChild(sec); var bar = w.querySelector('.pk-fbar'), body = w.querySelector('.pk-fbody'); bar.addEventListener('click', function () { var open = !w.classList.contains('open'); if (open) { w.classList.add('open'); body.style.height = body.scrollHeight + 'px'; body.querySelectorAll('.pk-rv').forEach(function (el) { el.classList.add('on'); }); setTimeout(function () { if (w.classList.contains('open')) body.style.height = 'auto'; }, 600); mount.dispatchEvent(new CustomEvent('pk-open', { detail: k })); } else { body.style.height = body.scrollHeight + 'px'; requestAnimationFrame(function () { requestAnimationFrame(function () { w.classList.remove('open'); body.style.height = ''; }); }); } bar.setAttribute('aria-expanded', open ? 'true' : 'false'); }); }); function foldMode() { var on = D.fold_everywhere || window.matchMedia('(max-width:760px)').matches; mount.classList.toggle('pk-fold-on', !!on); } foldMode(); window.addEventListener('resize', foldMode); document.body.classList.add('page-press'); /* reveal */ var io = ('IntersectionObserver' in window) ? new IntersectionObserver(function (es) { es.forEach(function (e) { if (e.isIntersecting) { e.target.classList.add('on'); io.unobserve(e.target); } }); }, { rootMargin: '0px 0px -8% 0px' }) : null; function reveal(root) { (root || mount).querySelectorAll('.pk-rv:not(.on)').forEach(function (el) { io ? io.observe(el) : el.classList.add('on'); }); } reveal(); /* collage: from json or from the dropbox folder via the worker */ function collageRows(list) { var rows = [[], [], []]; list.forEach(function (im, i) { rows[i % 3].push(im); }); return rows.map(function (r, ri) { if (!r.length) return ''; var items = r.concat(r).map(function (im, i) { return ''; }).join(''); return '
' + items + '
'; }).join(''); } var col = document.getElementById('pk-col'), C = D.collage || {}; var jsonList = (C.images || []).map(function (n) { return { thumb: src(n), full: src(n) }; }); if (C.source === 'dropbox') { fetch(W + '/press-photos').then(function (r) { return r.json(); }).then(function (j) { var list = (j.photos || []).map(function (p) { return { thumb: W + '/press-photo?id=' + encodeURIComponent(p.id) + '&s=m', full: W + '/press-photo?id=' + encodeURIComponent(p.id) + '&s=l' }; }); col.innerHTML = collageRows(list.length ? list : jsonList); }).catch(function () { col.innerHTML = collageRows(jsonList); }); } else col.innerHTML = collageRows(jsonList); /* ---------- horizontal rows: arrows, endless loop, live-shows drift ---------- */ function setupRow(hs) { var trk = hs.querySelector('.trk'); if (!trk) return; var loop = hs.classList.contains('loop') || hs.classList.contains('drift'); function step() { var c = trk.querySelector('.pk-t,.v'); return c ? (c.getBoundingClientRect().width + 14) * Math.max(1, Math.floor(trk.clientWidth / (c.getBoundingClientRect().width + 14)) - 1) : 300; } hs.querySelector('.ar.l').addEventListener('click', function () { trk.scrollBy({ left: -step(), behavior: 'smooth' }); hold(); }); hs.querySelector('.ar.r').addEventListener('click', function () { trk.scrollBy({ left: step(), behavior: 'smooth' }); hold(); }); if (loop) trk.addEventListener('scroll', function () { var half = trk.scrollWidth / 2; if (half <= trk.clientWidth) return; if (trk.scrollLeft >= half) trk.scrollLeft -= half; else if (trk.scrollLeft <= 0 && hs.dataset.moved) trk.scrollLeft += half; hs.dataset.moved = 1; }, { passive: true }); var paused = 0, hov = false; function hold() { paused = Date.now() + 3500; } ['pointerdown', 'touchstart', 'wheel'].forEach(function (ev) { trk.addEventListener(ev, hold, { passive: true }); }); hs.addEventListener('mouseenter', function () { hov = true; }); hs.addEventListener('mouseleave', function () { hov = false; }); if (hs.classList.contains('drift') && !window.matchMedia('(prefers-reduced-motion:reduce)').matches) { var acc = 0, last = 0, vis = false; if ('IntersectionObserver' in window) new IntersectionObserver(function (es) { vis = es[0].isIntersecting; }).observe(hs); else vis = true; (function tick(t) { var dt = last ? Math.min(64, t - last) : 16; last = t; if (vis && !hov && Date.now() > paused && trk.scrollWidth > trk.clientWidth + 10) { acc += dt * 0.028; if (acc >= 1) { var n = Math.floor(acc); acc -= n; trk.scrollLeft += n; } } requestAnimationFrame(tick); })(0); } } mount.querySelectorAll('.pk-hs').forEach(setupRow); /* live shows: every set in the listening room, newest first */ var vaultEl = document.getElementById('pk-vault'); if (vaultEl) { function getSets() { try { var c = JSON.parse(sessionStorage.getItem('u_room') || 'null'); if (c && Date.now() - c.t < 6e5 && c.d.length) return Promise.resolve(c.d); } catch (e) { } return Promise.all(['/vault/', '/vault/page/2/', '/vault/page/3/'].map(function (u) { return fetch(u, { credentials: 'same-origin' }).then(function (r) { return r.ok ? r.text() : ''; }).catch(function () { return ''; }); })).then(function (txts) { var out = [], seen = {}; txts.forEach(function (t) { if (!t) return; var d = new DOMParser().parseFromString(t, 'text/html'); d.querySelectorAll('a.gcard').forEach(function (a) { var img = a.querySelector('img'); var href = a.getAttribute('href'); if (!img || !href || seen[href]) return; seen[href] = 1; out.push({ h: href, s: img.getAttribute('src'), n: (img.getAttribute('alt') || a.textContent || '').trim() }); }); }); try { sessionStorage.setItem('u_room', JSON.stringify({ t: Date.now(), d: out })); } catch (e) { } return out; }); } getSets().then(function (sets) { if (!sets || sets.length < 4) return; var items = sets.map(function (x) { return tile({ image: x.s, title: x.n, url: x.h }); }).join(''); vaultEl.querySelector('.trk').innerHTML = items + items; }).catch(function () { }); } /* ---------- ecosystem on phones: three side by side, tap one to read it ---------- */ var eco = mount.querySelector('.pk-eco'); if (eco) { var etx = eco.querySelector('.etx'), its = eco.querySelectorAll('.it'); function pickEco(i) { var it = (E.items || [])[i]; if (!it) return; its.forEach(function (x, j) { x.classList.toggle('sel', j === i); }); etx.innerHTML = '

' + esc(it.text).replace(/\n\n/g, '

') + '

' + (it.url ? '' + esc((it.name || '').toLowerCase()) + ' →' : ''); } pickEco(0); its.forEach(function (x, i) { x.addEventListener('click', function (e) { if (window.matchMedia('(max-width:760px)').matches) { e.preventDefault(); pickEco(i); } }); }); } /* ---------- reels: endless row, plays muted when in view, tap = sound ---------- */ var reelRow = document.getElementById('pk-reelrow'); if (reelRow) { var cells = reelRow.querySelectorAll('.v'); function vidOf(c) { var v = c.querySelector('video'); if (!v.getAttribute('src') && v.dataset.src) v.src = v.dataset.src; return v; } var reelVis = false; function inRow(c) { var r = c.getBoundingClientRect(), tr = reelRow.querySelector('.trk').getBoundingClientRect(); var w = Math.min(r.right, tr.right) - Math.max(r.left, tr.left); return w > r.width * .55; } function syncReels() { cells.forEach(function (c) { var v = c.querySelector('video'); if (reelVis && inRow(c)) { v = vidOf(c); var p = v.play(); p && p.catch(function () { }); } else if (!v.paused) { v.pause(); if (c.classList.contains('snd-on')) { v.muted = true; c.classList.remove('snd-on'); } } }); } if ('IntersectionObserver' in window) new IntersectionObserver(function (es) { reelVis = es[0].isIntersecting && reelRow.getBoundingClientRect().height > 40; syncReels(); }, { threshold: .3 }).observe(reelRow); var rt = 0; reelRow.querySelector('.trk').addEventListener('scroll', function () { clearTimeout(rt); rt = setTimeout(syncReels, 140); }, { passive: true }); mount.addEventListener('pk-open', function (e) { if (e.detail === 'reels') setTimeout(function () { reelVis = true; syncReels(); }, 650); }); cells.forEach(function (c) { c.addEventListener('click', function () { var v = vidOf(c), turnOn = !c.classList.contains('snd-on'); cells.forEach(function (o) { o.classList.remove('snd-on'); o.querySelector('video').muted = true; }); if (turnOn) { c.classList.add('snd-on'); v.muted = false; if (v.paused) v.play().catch(function () { }); if (dockState.W) { try { dockState.W.pause(); } catch (e) { } } } }); }); } /* ---------- clean video pop-up (youtube without its clutter) ---------- */ function openVideo(a) { var id = ytId(a.getAttribute('href')); if (!id) return; if (dockState.W) { try { dockState.W.pause(); } catch (e) { } } var box = document.createElement('div'); box.className = 'pk-vbox loading'; var poster = a.dataset.img || ('https://i.ytimg.com/vi/' + id + '/maxresdefault.jpg'); var play = '', pause = ''; box.innerHTML = '
' + esc(a.dataset.title || '') + '
' + '
0:00
'; document.body.appendChild(box); requestAnimationFrame(function () { box.classList.add('on'); }); var fr = box.querySelector('iframe'), st = { dur: 0, cur: 0, state: -1, muted: false }; function cmd(func, args) { try { fr.contentWindow.postMessage(JSON.stringify({ event: 'command', func: func, args: args || [] }), '*'); } catch (e) { } } function fmtS(x) { x = Math.max(0, Math.floor(x || 0)); return Math.floor(x / 60) + ':' + String(x % 60).padStart(2, '0'); } function onMsg(e) { if (e.source !== fr.contentWindow) return; var d; try { d = JSON.parse(e.data); } catch (x) { return; } var info = d.info || {}; if (d.event === 'onStateChange') info.playerState = d.info; if (info.duration) st.dur = info.duration; if (info.currentTime != null) st.cur = info.currentTime; if (info.playerState != null) { st.state = info.playerState; box.classList.toggle('playing', st.state === 1 || st.state === 3 && box.classList.contains('playing')); if (st.state === 1) box.classList.remove('loading'); if (st.state === 0) { box.classList.remove('playing'); } box.querySelector('.pp').innerHTML = st.state === 1 ? pause : play; } if (st.dur) { box.querySelector('.pr i').style.width = (100 * st.cur / st.dur) + '%'; box.querySelector('.tt').textContent = fmtS(st.cur) + ' / ' + fmtS(st.dur); } } window.addEventListener('message', onMsg); fr.addEventListener('load', function () { var n = 0; var t = setInterval(function () { try { fr.contentWindow.postMessage(JSON.stringify({ event: 'listening', id: 1, channel: 'widget' }), '*'); } catch (e) { } if (++n > 10) clearInterval(t); }, 250); }); function toggle() { if (st.state === 1) cmd('pauseVideo'); else { cmd('playVideo'); box.classList.add('loading'); } } box.querySelector('.hit').addEventListener('click', toggle); box.querySelector('.cover').addEventListener('click', function () { cmd('unMute'); toggle(); }); box.querySelector('.pp').addEventListener('click', toggle); box.querySelector('.mu').addEventListener('click', function () { st.muted = !st.muted; cmd(st.muted ? 'mute' : 'unMute'); box.querySelector('.mu').innerHTML = st.muted ? ICON.spkOff : ICON.spkOn; }); box.querySelector('.pr').addEventListener('click', function (e) { if (!st.dur) return; var r = e.currentTarget.getBoundingClientRect(); cmd('seekTo', [st.dur * (e.clientX - r.left) / r.width, true]); }); function close() { window.removeEventListener('message', onMsg); document.removeEventListener('keydown', k_); box.classList.remove('on'); setTimeout(function () { box.remove(); }, 350); } function k_(e) { if (e.key === 'Escape') close(); if (e.key === ' ') { e.preventDefault(); toggle(); } } document.addEventListener('keydown', k_); setTimeout(function () { if (st.state !== 1 && st.state !== 3 && document.body.contains(box)) { box.classList.remove('loading'); box.classList.add('playing'); fr.style.pointerEvents = 'auto'; box.querySelector('.hit').style.display = 'none'; } }, 3500); box.querySelector('.x').addEventListener('click', close); box.addEventListener('click', function (e) { if (e.target === box) close(); }); } /* lightbox for photos */ function openBox(inner) { var box = document.createElement('div'); box.className = 'pk-lbx'; box.innerHTML = '×' + inner; function close() { box.remove(); document.removeEventListener('keydown', esc_); } function esc_(e) { if (e.key === 'Escape') close(); } box.addEventListener('click', function (e) { if (e.target === box || e.target.className === 'x') close(); }); document.addEventListener('keydown', esc_); document.body.appendChild(box); } /* ---------- player dock ---------- */ var dock = null, dockState = { kind: '', W: null, dur: 0, playing: false, tile: null }, scApi = null; function loadSC(cb) { if (window.SC && SC.Widget) return cb(); if (scApi) { scApi.push(cb); return; } scApi = [cb]; var s = document.createElement('script'); s.src = 'https://w.soundcloud.com/player/api.js'; s.onload = function () { scApi.forEach(function (c) { c(); }); scApi = null; }; document.head.appendChild(s); } function fmt(ms) { var s = Math.floor(ms / 1000), m = Math.floor(s / 60), hh = Math.floor(m / 60); return (hh ? hh + ':' + String(m % 60).padStart(2, '0') : m) + ':' + String(s % 60).padStart(2, '0'); } function ensureDock() { if (dock) return dock; dock = document.createElement('div'); dock.className = 'pk-dock'; dock.innerHTML = '
open ↗full page →
'; document.body.appendChild(dock); dock.querySelector('.x').addEventListener('click', closeDock); dock.querySelector('.pp').addEventListener('click', function () { if (dockState.W) dockState.W.toggle(); }); dock.querySelector('.bar').addEventListener('click', function (e) { if (!dockState.W || !dockState.dur) return; var r = e.currentTarget.getBoundingClientRect(); dockState.W.seekTo(dockState.dur * (e.clientX - r.left) / r.width); }); return dock; } function closeDock() { if (!dock) return; if (dockState.W) { try { dockState.W.pause(); } catch (e) { } } dock.querySelector('.hid').innerHTML = ''; dock.querySelector('.emb').innerHTML = ''; dock.classList.remove('on', 'playing', 'embed', 'room'); document.body.classList.remove('pk-dock-on'); if (dockState.tile) dockState.tile.classList.remove('playing'); dockState = { kind: '', W: null, dur: 0, playing: false, tile: null }; } function muteReels() { mount.querySelectorAll('.pk-reels .v.snd-on').forEach(function (c) { c.classList.remove('snd-on'); c.querySelector('video').muted = true; }); } function scDock(widgetSrc) { loadSC(function () { var f = document.createElement('iframe'); f.allow = 'autoplay'; f.src = widgetSrc; dock.querySelector('.hid').appendChild(f); var w = SC.Widget(f), E = SC.Widget.Events; dockState.W = { toggle: function () { w.isPaused(function (p) { p ? w.play() : w.pause(); }); }, pause: function () { w.pause(); }, seekTo: function (ms) { w.seekTo(ms); } }; w.bind(E.READY, function () { w.getDuration(function (d) { dockState.dur = d; dock.querySelector('.s').textContent = fmt(d); }); w.play(); }); w.bind(E.PLAY, function () { dock.classList.add('playing'); if (dockState.tile) dockState.tile.classList.add('playing'); muteReels(); }); w.bind(E.PAUSE, function () { dock.classList.remove('playing'); setTimeout(function () { dock.classList.remove('playing'); }, 400); }); w.bind(E.FINISH, function () { dock.classList.remove('playing'); }); w.bind(E.PLAY_PROGRESS, function (e) { if (!dock.classList.contains('playing') && e.relativePosition < 1) { dock.classList.add('playing'); if (dockState.tile) dockState.tile.classList.add('playing'); } if (!dockState.dur && !dockState.asked) { dockState.asked = 1; w.getDuration(function (d) { dockState.dur = d; }); } if (dockState.dur) { dock.querySelector('.bar i').style.width = (100 * e.currentPosition / dockState.dur) + '%'; dock.querySelector('.s').textContent = fmt(e.currentPosition) + ' / ' + fmt(dockState.dur); } }); }); } var roomCache = {}; function roomInfo(url) { var path; try { path = new URL(url, location.href).pathname; } catch (e) { return Promise.resolve(null); } if (roomCache[path]) return roomCache[path]; roomCache[path] = fetch(path, { credentials: 'same-origin' }).then(function (r) { return r.ok ? r.text() : ''; }).then(function (t) { if (!t) return null; var d = new DOMParser().parseFromString(t, 'text/html'); var f = d.querySelector('.gh-content .sc-wrap iframe[src*="w.soundcloud.com/player"], .gh-content iframe[src*="w.soundcloud.com/player"]'); var og = d.querySelector('meta[property="og:image"]'), h1 = d.querySelector('h1'); return { sc: f ? f.getAttribute('src') : '', img: og ? og.getAttribute('content') : '', title: h1 ? h1.textContent.trim() : '' }; }).catch(function () { return null; }); return roomCache[path]; } function openDock(a, info) { var k = a.dataset.kind, url = a.getAttribute('href'); ensureDock(); closeDock(); dockState.tile = a; a.classList.add('playing'); dock.querySelector('.cv').src = a.dataset.img || (info && info.img) || ''; dock.querySelector('.t').textContent = a.dataset.title || (info && info.title) || ''; dock.querySelector('.s').textContent = 'loading'; dock.querySelector('.bar i').style.width = '0'; dock.querySelector('.ext').href = url; dock.querySelector('.fp').href = url; dock.classList.add('on'); document.body.classList.add('pk-dock-on'); if (k === 'room') { dock.classList.add('room'); var ws = info.sc.replace(/([?&])auto_play=[^&]*/, '$1').replace(/&+$/, ''); scDock(ws + (ws.indexOf('?') > -1 ? '&' : '?') + 'auto_play=true'); } else if (k === 'sc') scDock('https://w.soundcloud.com/player/?url=' + encodeURIComponent(url) + '&auto_play=true&show_artwork=false&visual=false&buying=false&sharing=false&download=false&show_playcount=false&show_user=false&hide_related=true'); else if (k === 'sp') { var m = url.match(/open\.spotify\.com\/(track|album|playlist|episode)\/([A-Za-z0-9]+)/); dock.classList.add('embed'); dock.querySelector('.emb').innerHTML = ''; } else if (k === 'bc') { var kindBc = /\/track\//.test(url) ? 'track' : 'album'; dock.classList.add('embed'); dock.querySelector('.emb').innerHTML = ''; } } /* recent recordings: fill covers + titles from the set pages themselves */ mount.querySelectorAll('.pk-rec .c').forEach(function (c) { roomInfo(c.getAttribute('href')).then(function (i) { if (!i) return; var img = c.querySelector('img'); if (!img.getAttribute('src') && i.img) { img.src = i.img; c.dataset.img = i.img; } if (!c.dataset.title && i.title) { c.dataset.title = i.title; c.querySelector('.t').textContent = i.title; } }); }); /* warm the cache when a finger or mouse gets close to a room service cover */ mount.addEventListener('pointerover', function (e) { var a = e.target.closest && e.target.closest('a[data-kind=room]'); if (a) roomInfo(a.getAttribute('href')); }); mount.addEventListener('touchstart', function (e) { var a = e.target.closest && e.target.closest('a[data-kind=room]'); if (a) roomInfo(a.getAttribute('href')); }, { passive: true }); mount.addEventListener('click', function (e) { var a = e.target.closest('a'); if (!a) return; if (a.dataset.lbx) { e.preventDefault(); openBox(''); return; } var k = a.dataset.kind; if (!k) return; if (k === 'room') { if (e.target.closest('[data-full]') || e.metaKey || e.ctrlKey) { if (e.target.closest('[data-full]')) { e.preventDefault(); location.href = a.getAttribute('href'); } return; } e.preventDefault(); if (dockState.tile === a && dockState.W) { dockState.W.toggle(); return; } roomInfo(a.getAttribute('href')).then(function (i) { if (i && i.sc) openDock(a, i); else location.href = a.getAttribute('href'); }); return; } if (k === 'yt') { e.preventDefault(); openVideo(a); return; } if (k === 'sc' || k === 'sp' || k === 'bc') { e.preventDefault(); if (dockState.tile === a && dockState.W) { dockState.W.toggle(); return; } openDock(a); } }); /* ---------- page ready: hold the loader until the first screen is complete ---------- */ (function () { var t0 = window.__pkT0 || Date.now(); // images fade in when they arrive instead of popping in half-drawn function watch(img) { if (img.complete && img.naturalWidth) return; if (img.closest('.pk-hero,.pk-ab')) return; img.classList.add('pk-wait'); var done = function () { img.classList.remove('pk-wait'); img.classList.add('pk-arrive'); }; img.addEventListener('load', done, { once: true }); img.addEventListener('error', done, { once: true }); } mount.querySelectorAll('img').forEach(watch); if ('MutationObserver' in window) new MutationObserver(function (ms) { ms.forEach(function (m) { m.addedNodes.forEach(function (n) { if (n.nodeType !== 1) return; if (n.tagName === 'IMG') watch(n); else n.querySelectorAll && n.querySelectorAll('img').forEach(watch); }); }); }).observe(mount, { childList: true, subtree: true }); // what has to be there before the page is shown: fonts, the hero, the recent-recordings covers function imgReady(img) { return new Promise(function (res) { if (!img) return res(); if (img.complete && (img.naturalWidth || !img.getAttribute('src'))) return res(); img.addEventListener('load', res, { once: true }); img.addEventListener('error', res, { once: true }); }); } var need = [document.fonts && document.fonts.ready ? document.fonts.ready.catch(function () { }) : Promise.resolve()]; need.push(imgReady(mount.querySelector('.pk-hero img'))); mount.querySelectorAll('.pk-rec .c').forEach(function (c) { need.push(roomInfo(c.getAttribute('href')).then(function () { var im = c.querySelector('img'); im.loading = 'eager'; return imgReady(im); })); }); var cap = new Promise(function (res) { setTimeout(res, 6000); }); Promise.race([Promise.all(need), cap]).then(function () { var wait = Math.max(0, 900 - (Date.now() - t0)); setTimeout(function () { window.dispatchEvent(new Event('pk-ready')); if (window.__pkDone) window.__pkDone(); }, wait); }); // warm a drawer's images when a finger or mouse heads for its bar, and on open function warm(w) { if (!w || w.dataset.warm) return; w.dataset.warm = 1; w.querySelectorAll('img[loading=lazy]').forEach(function (im, i) { if (i < 40) im.loading = 'eager'; }); } mount.querySelectorAll('.pk-fw').forEach(function (w) { var b = w.querySelector('.pk-fbar'); ['pointerenter', 'touchstart', 'focus'].forEach(function (ev) { b.addEventListener(ev, function () { warm(w); }, { passive: true }); }); if (w.classList.contains('open')) warm(w); }); })(); })();