:root{
  --paper:#ffffff; --ink:#262626; --logo:#34345e; --soft:#808080; --line:#ececec; --tint:#f6f6f6; --pink:#e46f98;
  --shade:rgba(255,255,255,.97); --shade-ink:#262626;
  color-scheme:light;
  box-sizing:border-box;
  padding-top:env(safe-area-inset-top,0px); padding-bottom:env(safe-area-inset-bottom,0px);
}
*,*::before,*::after{box-sizing:inherit}
html{scroll-padding-top:env(safe-area-inset-top,0px)}
body{margin:0;background:var(--paper);color:var(--ink);font:400 calc(17px * var(--ts,1))/1.6 var(--font-text,"Source Sans 3","Myriad Pro","Segoe UI",system-ui,-apple-system,sans-serif);-webkit-font-smoothing:antialiased}
img,video{max-width:100%;display:block}
img{height:auto}
a{color:inherit}
:focus-visible{outline:2px solid var(--pink);outline-offset:3px;border-radius:4px}

.shell{display:grid;grid-template-columns:300px minmax(0,1fr);gap:56px;max-width:1440px;margin:0 auto;padding:56px 56px 96px}
.side{position:sticky;top:calc(56px + env(safe-area-inset-top,0px));align-self:start;z-index:10} /* logo and menu stay on top of pieces flying past */
.logo{display:block;width:230px;aspect-ratio:486/201;background:var(--logo);-webkit-mask:url("assets/logo.png") left/contain no-repeat;mask:url("assets/logo.png") left/contain no-repeat}
.logo span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
nav ul{list-style:none;margin:48px 0 0;padding:0;display:flex;flex-direction:column;gap:6px}
nav a{display:inline-flex;align-items:center;gap:10px;text-decoration:none;color:var(--soft);font-size:calc(16px * var(--ts,1));padding:3px 0;transition:color .2s}
nav a::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--pink);transform:scale(0);transition:transform .25s}
nav a:hover{color:var(--ink)}
nav a[aria-current="page"]{color:var(--ink);font-weight:600}
nav a[aria-current="page"]::before{transform:scale(1)}
.side .note{margin-top:40px;color:var(--soft);font-size:14px;line-height:1.5;max-width:22ch}

main{min-width:0;position:relative}
.view{display:none}
.view.on{display:block}
/* the page being cleared away floats above the next one while both are on the table */
.view.leaving{display:block;position:absolute;left:0;right:0;z-index:1;pointer-events:none}
@keyframes in{from{opacity:0}to{opacity:1}}
/* fonts and text size come from look.css (the Look section in the editor) */
h1,h2,h3,.l-title{font-family:var(--font-head,inherit)}
h1,h2{font-weight:500;letter-spacing:-.01em;margin:0}
h1{font-size:calc(30px * var(--ts,1));line-height:1.25}
.lede{color:var(--soft);margin:10px 0 0;max-width:52ch}
.head{margin-bottom:32px}

/* showreel player */
.player{position:relative;border-radius:14px;overflow:hidden;background:var(--tint);aspect-ratio:16/9;cursor:pointer}
.player video{width:100%;height:100%;object-fit:cover}
.player .big{position:absolute;inset:0;margin:auto;width:84px;height:84px;border-radius:50%;border:0;background:var(--paper);color:var(--ink);display:grid;place-items:center;cursor:pointer;box-shadow:0 6px 30px rgba(40,30,80,.18);transition:transform .25s,opacity .25s}
.player .big svg{width:26px;margin-left:5px}
.player:hover .big{transform:scale(1.06)}
.player.playing .big{opacity:0;pointer-events:none;transform:scale(.8)}
.bar{position:absolute;left:0;right:0;bottom:0;display:flex;align-items:center;gap:14px;padding:14px 18px;background:linear-gradient(transparent,rgba(20,18,40,.45));color:#fff;opacity:0;transition:opacity .3s}
.player.playing:hover .bar,.player.paused-mid .bar,.player:focus-within .bar{opacity:1}
.bar button{background:none;border:0;color:#fff;padding:4px;cursor:pointer;display:grid}
.bar svg{width:18px;height:18px}
.track{flex:1;height:3px;background:rgba(255,255,255,.35);border-radius:3px;position:relative;cursor:pointer}
.track i{position:absolute;inset:0 auto 0 0;width:0;background:var(--pink);border-radius:3px}
.thin{position:absolute;left:0;bottom:0;height:3px;background:var(--pink);width:0;transition:opacity .3s}
.player.playing:hover .thin{opacity:0}
.time{font-size:13px;font-variant-numeric:tabular-nums;opacity:.9}
.caption{display:flex;justify-content:space-between;gap:16px;margin-top:14px;color:var(--soft);font-size:15px}
.caption b{color:var(--ink);font-weight:500}

.section-title{display:flex;justify-content:space-between;align-items:baseline;margin:72px 0 22px}
.section-title h2{font-size:calc(22px * var(--ts,1))}
.section-title a{color:var(--soft);font-size:15px;text-decoration:none}
.section-title a:hover{color:var(--ink)}

/* masonry */
/* each piece is placed by render.js (layout), in content order, left to right */
.masonry{position:relative}
.masonry button{all:unset;display:block;position:absolute;cursor:zoom-in;border-radius:6px;overflow:hidden}
.masonry button:focus-visible{outline:2px solid var(--pink);outline-offset:3px}
.masonry img{width:100%;height:auto;transition:transform .5s ease}
.load-error{color:var(--soft);max-width:52ch}
/* hover lift, tilt and boil are done frame by frame in script.js (see HOVER) */

/* animation tiles */
.tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:28px 22px}
.tile{all:unset;cursor:pointer;display:block}
.tile .frame{aspect-ratio:16/9;border-radius:10px;overflow:hidden;background:var(--tint);position:relative}
.tile video,.tile img{width:100%;height:100%;object-fit:cover}
.tile .frame::after{content:"";position:absolute;right:12px;bottom:12px;width:30px;height:30px;border-radius:50%;background:var(--paper) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M8 5v14l11-7z' fill='%2334345e'/%3E%3C/svg%3E") 55% 50%/14px no-repeat;opacity:.95}
.tile h3{font-size:16px;font-weight:500;margin:12px 0 2px}
.tile p{margin:0;color:var(--soft);font-size:14px}
.tile:focus-visible .frame{outline:2px solid var(--pink);outline-offset:3px}

/* projects */
.projects{display:flex;flex-direction:column;gap:64px}
.project{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:36px;align-items:center}
.project:nth-child(even) .pimg{order:2}
.pimg{border-radius:10px;overflow:hidden}
.pimg img{width:100%}
.project h2{font-size:calc(22px * var(--ts,1));margin-bottom:8px}
.project p{color:var(--soft);margin:0 0 12px;max-width:44ch}
.project .meta{font-size:14px}
.project{cursor:pointer;border-radius:10px}
.project .more{display:block;margin-top:14px;font-size:15px;color:var(--ink);width:max-content;padding-bottom:2px;background:linear-gradient(var(--pink),var(--pink)) left bottom/0 2px no-repeat;transition:background-size .4s ease}
.project:hover .more,.project:focus-visible .more{background-size:100% 2px}

/* about / contact */
.about{display:grid;grid-template-columns:minmax(0,320px) minmax(0,1fr);gap:48px;align-items:start}
.about img{border-radius:10px;width:100%;height:auto}
.prose p{max-width:58ch;margin:0 0 16px}
.contact a.mail{font-size:30px;font-weight:500;text-decoration:none;padding-bottom:2px}
.links{display:flex;gap:24px;margin-top:28px;color:var(--soft)}
.links a{text-decoration:none}
.links a:hover{color:var(--ink)}

/* lightbox */
.lb{position:fixed;inset:0;background:var(--shade);display:none;place-items:center;z-index:50;padding:calc(24px + env(safe-area-inset-top,0px)) 70px calc(24px + env(safe-area-inset-bottom,0px))}
.lb.on{display:grid;animation:in .25s ease}
.lb img,.lb video{max-height:86vh;max-width:min(1200px,100%);border-radius:6px;box-shadow:none}
.lb video{width:min(1200px,100%)}
/* only the viewer's own close/arrow buttons: the showreel's controls also sit inside .lb while it plays large */
.lb>button{position:absolute;background:none;border:0;color:var(--shade-ink);cursor:pointer;padding:12px;opacity:.8}
.lb>button:hover{opacity:1}
.lb>button svg{width:26px;height:26px}
.lb .x{top:calc(14px + env(safe-area-inset-top,0px));right:14px}
.lb .prev{left:10px;top:50%;transform:translateY(-50%)}
.lb .next{right:10px;top:50%;transform:translateY(-50%)}
.lb .count{position:absolute;bottom:calc(18px + env(safe-area-inset-bottom,0px));left:0;right:0;text-align:center;color:var(--soft);font-size:14px}

/* intro + small motion */
.intro{position:fixed;inset:0;background:var(--paper);display:grid;place-items:center;z-index:100;cursor:pointer;transition:opacity .7s ease,visibility .7s}
.intro.done{opacity:0;visibility:hidden}
.intro-logo{width:min(360px,72vw);animation:write 1.3s cubic-bezier(.6,0,.2,1) .15s both,pop .6s 1.4s ease both}
@keyframes write{from{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0 0 0 0)}}
@keyframes pop{40%{transform:scale(1.06) rotate(-2deg)}100%{transform:none}}
.side .logo{transform-origin:30% 60%}
.side .logo:not(.anim):hover{animation:wiggle .7s ease}
/* the animated logo: Annabel's drawings stacked in one image; script.js steps through them */
.logo.anim{-webkit-mask:none;mask:none;background-color:transparent;background-repeat:no-repeat;background-size:100% calc(var(--frames) * 100%);background-position:0 0}
@keyframes wiggle{25%{transform:rotate(-3deg)}50%{transform:rotate(2deg)}75%{transform:rotate(-1deg)}}
@keyframes rise{from{opacity:0;transform:translateY(18px) rotate(1.5deg)}to{opacity:1;transform:none}}
.tile video.prev{position:absolute;inset:0}
.contact a.mail{background:linear-gradient(var(--pink),var(--pink)) left bottom/0 2px no-repeat;transition:background-size .4s ease}
.contact a.mail:hover{background-size:100% 2px}
.contact-grid{display:grid;grid-template-columns:minmax(0,340px) minmax(0,1fr);gap:56px;align-items:center}
/* desktop: About and Contact sit in the middle of the screen rather than at the top
   (also while being cleared away, so they don't jump mid-transition) */
@media (min-width:901px){
  #v-about:is(.on,.leaving),#v-contact:is(.on,.leaving){display:flex;flex-direction:column;justify-content:center;min-height:calc(100vh - 152px);min-height:calc(100svh - 152px)}
  #v-about .about{align-items:center}
}
.portrait{margin:0;aspect-ratio:4/5;border-radius:10px;background:var(--tint);display:grid;place-items:center;color:var(--soft);font-size:15px;transform:rotate(-1.5deg)}
.portrait img{width:100%;height:100%;object-fit:cover;border-radius:inherit}

@media (max-width:900px){
  .shell{grid-template-columns:minmax(0,1fr);gap:28px;padding:24px 20px 72px}
  .side{position:relative;top:0;min-width:0}  .caption{flex-direction:column;gap:2px}
  .logo{width:170px}
  nav ul{flex-direction:row;gap:20px;margin-top:22px;overflow-x:auto;padding-bottom:6px;scrollbar-width:none;
    /* fade out at whichever edge has more menu beyond it (script.js sets more-left / more-right) */
    -webkit-mask-image:linear-gradient(90deg,transparent 0,#000 var(--fade-l,0px),#000 calc(100% - var(--fade-r,0px)),transparent 100%);
    mask-image:linear-gradient(90deg,transparent 0,#000 var(--fade-l,0px),#000 calc(100% - var(--fade-r,0px)),transparent 100%)}
  nav ul::-webkit-scrollbar{display:none}
  nav ul.more-right{--fade-r:56px}
  nav ul.more-left{--fade-l:36px}
  nav a{white-space:nowrap}
  nav a::before{display:none}
  nav a[aria-current="page"]{text-decoration:underline;text-decoration-color:var(--pink);text-decoration-thickness:2px;text-underline-offset:6px}
  .side .note{display:none}
  h1{font-size:24px}
  .project,.about{grid-template-columns:1fr;gap:18px}
  .project:nth-child(even) .pimg{order:0}
  .contact-grid{grid-template-columns:1fr;gap:32px}
  .portrait{max-width:300px}
  .lb{padding-left:12px;padding-right:12px}
  .lb .prev,.lb .next{top:auto;bottom:calc(6px + env(safe-area-inset-bottom,0px));transform:none}
  .contact a.mail{font-size:22px}
}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
/* hand-arranged viewer */
html{scrollbar-gutter:stable;overflow-x:clip}
body{overflow-x:clip}
.masonry>button,.tiles>.tile{rotate:var(--rest,0deg)}
.lb{background:transparent;padding:0}
.lb.on{display:block;animation:none}
/* desktop: the menu and anything left behind go soft while a piece is open; it steps in and out like the rest of the motion */
@media (min-width:900px){
  .lb.on{animation:veil-in .5s steps(6) both}
  .lb.on.closing{animation:veil-out .5s steps(6) both}
}
@keyframes veil-in{from{backdrop-filter:blur(0);-webkit-backdrop-filter:blur(0);background:rgba(255,255,255,0)}to{backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);background:rgba(255,255,255,.3)}}
@keyframes veil-out{from{backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);background:rgba(255,255,255,.3)}to{backdrop-filter:blur(0);-webkit-backdrop-filter:blur(0);background:rgba(255,255,255,0)}}
.lb .ui{z-index:2;opacity:0;transition:opacity .3s}
.lb.ready .ui{opacity:.8}
.lb.ready .ui:hover{opacity:1}
.lb .card{position:fixed;margin:0;border-radius:6px;overflow:hidden;background:var(--tint);box-shadow:0 16px 40px rgba(40,30,60,.14);will-change:transform;cursor:zoom-out}
.lb .card img,.lb .card video{width:100%;height:100%;max-width:none;max-height:none;object-fit:cover;border-radius:0;box-shadow:none;display:block}
.lb .card>video{position:absolute;inset:0;opacity:0;transition:opacity .35s;cursor:auto}
.lb .card>video.ready{opacity:1}
/* the showreel's own player, moved into the viewer card while it plays large */
.lb .card .player{position:absolute;inset:0;border-radius:0;aspect-ratio:auto;cursor:auto}
.player-hold{aspect-ratio:16/9}

/* gallery label beside an opened piece: like a small museum wall label */
.lb .label{position:fixed;z-index:1;visibility:hidden;font-size:14px;line-height:1.55;color:var(--ink);cursor:auto}
.lb .label.on{visibility:visible}
:is(.label,.drawer) .l-title{margin:0 0 8px;font-size:17px}
:is(.label,.drawer) .l-title em{font-style:italic;font-weight:500}
:is(.label,.drawer) .l-text{margin:0 0 16px;color:#555;max-width:40ch}
:is(.label,.drawer) dl,.sheet .facts{margin:0;border-top:1px solid var(--line);padding-top:12px;display:grid;gap:6px}
:is(.label,.drawer) dl div,.sheet .facts div{display:grid;grid-template-columns:76px 1fr;gap:12px}
:is(.label,.drawer) dt,.sheet .facts dt{color:var(--soft);font-size:12px;letter-spacing:.06em;text-transform:uppercase;padding-top:2px}
:is(.label,.drawer) dd,.sheet .facts dd{margin:0}
:is(.label,.drawer) .enquire{display:inline-block;margin-top:16px;text-decoration:none;padding-bottom:2px;background:linear-gradient(var(--pink),var(--pink)) left bottom/0 2px no-repeat;transition:background-size .4s ease}
:is(.label,.drawer) .enquire:hover{background-size:100% 2px}
.drawer .enquire{background-size:100% 2px}

/* buy box inside a label: one row per option, with its price and a Buy button */
:is(.label,.drawer) .buy{margin-top:16px;border-top:1px solid var(--line);padding-top:12px;display:grid;gap:8px}
.buy-row{display:grid;grid-template-columns:1fr auto auto;gap:14px;align-items:center}
.buy-price{font-variant-numeric:tabular-nums;font-weight:500}
.buy-btn{background:var(--ink);color:#fff;text-decoration:none;border-radius:999px;padding:4px 16px;font-size:14px;font-weight:500;transition:background .2s}
.buy-btn:hover,.buy-btn:focus-visible{background:var(--pink)}
.buy-off{color:var(--soft);font-size:13px}
.buy-row.sold .buy-opt,.buy-row.sold .buy-price{color:var(--soft);text-decoration:line-through}
.drawer .buy-btn{padding:7px 20px}

/* shop page: the artwork with its name and price underneath */
.masonry.shop button{overflow:visible;border-radius:0;cursor:pointer}
.masonry.shop img{border-radius:6px}
/* fixed height: the grid layout reserves exactly this much under each shop piece (META in render.js) */
.shop-meta{display:flex;justify-content:space-between;align-items:baseline;gap:12px;height:38px;box-sizing:border-box;padding:10px 2px 4px;font-size:15px;line-height:24px;overflow:hidden}
.shop-meta b{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.shop-meta span{color:var(--soft);white-space:nowrap}
.shop-notes{list-style:none;padding:0;margin:56px 0 0;max-width:62ch;color:var(--soft);font-size:15px;display:grid;gap:6px}
#v-thanks .back{text-decoration:none;padding-bottom:2px;background:linear-gradient(var(--pink),var(--pink)) left bottom/100% 2px no-repeat}

/* phones: a one-line caption between the arrows, and the full label in a drawer that slides up when it's tapped */
.lb .label.cap{text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;font-size:14px}
.label.cap span{color:var(--ink)}
.label.cap b{font-weight:500;margin-left:8px;padding-bottom:1px;border-bottom:2px solid var(--pink)}
.lb .drawer{position:fixed;left:0;right:0;bottom:0;z-index:3;visibility:hidden;max-height:72vh;overflow-y:auto;overscroll-behavior:contain;background:var(--paper);border-radius:16px 16px 0 0;box-shadow:0 -12px 40px rgba(40,30,60,.16);padding:12px 22px calc(28px + env(safe-area-inset-bottom,0px));font-size:15px;line-height:1.55;cursor:auto}
.lb .drawer.open{visibility:visible}
.drawer::before{content:"";display:block;width:40px;height:4px;border-radius:2px;background:var(--line);margin:0 auto 18px}
.drawer .l-text{max-width:none}
@media (max-width:900px){
  .lb .count{top:calc(28px + env(safe-area-inset-top,0px));bottom:auto;left:18px;right:auto;text-align:left}
}

/* project sheet: its own scrolling page, laid over the table */
.lb .sheet{position:fixed;z-index:1;background:var(--paper);border-radius:12px;box-shadow:0 30px 80px rgba(40,30,60,.18);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:var(--line) transparent;padding:44px 56px 64px;cursor:auto}
.sheet .hero{margin:0 auto;border-radius:8px;overflow:hidden;background:var(--tint);visibility:hidden}
.sheet.landed .hero{visibility:visible}
.sheet .hero img{width:100%;height:100%;object-fit:cover}
.sheet h2{font-size:28px;margin:32px 0 4px}
.sheet>.meta{color:var(--soft);font-size:15px;margin:0 0 24px}
.sheet .detail p{max-width:62ch;margin:0 0 16px}
.sheet .gallery{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin:32px 0}
.sheet figure{margin:0}
.sheet figure img{border-radius:8px;width:100%}
.sheet figcaption{color:var(--soft);font-size:14px;margin-top:8px}
.sheet .facts{max-width:520px;font-size:15px}
/* project page blocks */
.sheet .detail>*{margin:0 0 40px}
.sheet .detail .b-text p{margin:0 0 16px}
.sheet .detail .b-text p:last-child{margin-bottom:0}
.b-image.medium{width:70%;margin-left:auto;margin-right:auto}
.b-image.small{width:45%;margin-left:auto;margin-right:auto}
.b-imagetext{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:36px;align-items:center}
.b-imagetext.right>figure{order:2}
/* a row: every image the same height (render.js sets each one's share of the width from its proportions) */
.b-row{display:flex;gap:16px;align-items:flex-start}
.b-row>figure{flex:1 1 0;min-width:0}
.b-rowwrap .b-row{margin-bottom:10px}
.b-caption{color:var(--soft);font-size:14px;margin:0;max-width:62ch}
.b-video video{width:100%;border-radius:8px;background:#000;display:block}
@media (max-width:900px){
  .sheet .detail>*{margin-bottom:28px}
  .b-image.medium,.b-image.small{width:100%}
  .b-imagetext{grid-template-columns:1fr;gap:14px}
  .b-imagetext.right>figure{order:0}
  .b-row{gap:8px}
}
@media (max-width:520px){.b-row{flex-direction:column;gap:14px}.b-row>figure{flex:none!important;width:100%}}
.lb .card{z-index:1}
@media (max-width:900px){
  .lb .sheet{padding:20px 18px 40px}
  .sheet h2{font-size:22px;margin-top:20px}
  .sheet .gallery{grid-template-columns:1fr;gap:16px}
}
