/* Motion follows the story: reveal a place, then introduce its details. */
.motion-line{display:block;overflow:clip;padding-bottom:.15em;margin-bottom:-.15em}
.motion-line-content{display:block}
@media(prefers-reduced-motion:no-preference){
 .text-link svg,.button svg,.search-toggle,.search-toggle svg,.hero-controls button,.save-button,.compare-button,.compare-button svg,.home-image-arrow,.testimonial-controls button,.comparison-pick i,.service-plus{transition:transform .45s var(--ease),background-color .3s,color .3s,border-color .3s}
 .search-result{transition:background-color .25s,transform .3s var(--ease)}.search-result:hover,.search-result:focus-visible{transform:translateX(3px)}.search-result>svg{transition:transform .3s}.search-result:hover>svg{transform:rotate(-30deg)}
 .search-dialog[open]{animation:directory-in .45s var(--ease) both}.search-dialog[open]::backdrop{animation:backdrop-in .5s ease both}.search-dialog[open] .search-result{animation:entry-in .65s var(--ease) both}.search-dialog[open] .search-result:nth-child(2){animation-delay:.04s}.search-dialog[open] .search-result:nth-child(3){animation-delay:.08s}.search-dialog[open] .search-result:nth-child(4){animation-delay:.12s}.search-dialog[open] .search-result:nth-child(5){animation-delay:.16s}.search-dialog.is-closing{animation:directory-out .2s ease both}.search-dialog.is-closing::backdrop{animation:backdrop-out .2s ease both}
 .hero-heading h1{animation:headline-in 1s var(--ease) both}.hero-intro{animation:headline-in .9s .12s var(--ease) both}.hero-images{animation:hero-arrive .9s .1s var(--ease) both}.hero-scene.is-entering{animation:scene-in .85s var(--ease) both}.hero-caption-content>div:not([hidden]){animation:caption-in .55s var(--ease) both}
 /* Separate image, heading and copy tracks give each section a readable sequence. */
 .reveal-ready .motion-part{opacity:0;transform:translateY(28px);transition:opacity .7s var(--ease),transform .9s var(--ease);transition-delay:calc(var(--reveal-delay,0ms) + var(--step,0)*85ms + 120ms)}
 .reveal-ready.is-revealed .motion-part{opacity:1;transform:none}
 .reveal-ready .motion-line-content{transform:translateY(112%);transition:transform 1.05s var(--ease);transition-delay:calc(var(--line-step,0)*130ms + 60ms)}
 .reveal-ready.is-revealed .motion-line-content{transform:none}
 .home-card.reveal-ready .home-image>a,.home-feature-grid .home-card:nth-child(n).reveal-ready .home-image>a,.journal-card.reveal-ready .journal-image{clip-path:inset(0 100% 0 0);transition:clip-path 1.2s var(--ease);transition-delay:var(--reveal-delay,0ms)}
 .home-feature-grid .home-card:nth-child(even).reveal-ready .home-image>a{clip-path:inset(0 0 0 100%)}
 .home-card.reveal-ready.is-revealed .home-image>a,.home-feature-grid .home-card:nth-child(n).reveal-ready.is-revealed .home-image>a,.journal-card.reveal-ready.is-revealed .journal-image{clip-path:inset(0)}
 .home-card.reveal-ready .home-index,.home-card.reveal-ready .save-button{opacity:0;transition:opacity .55s .4s}
 .home-card.reveal-ready.is-revealed .home-index,.home-card.reveal-ready.is-revealed .save-button{opacity:1}
 .home-card .home-image img.motion-photo,.home-feature-grid .home-card:nth-child(n) .home-image img.motion-photo,.studio-image>img.motion-photo,.private-search-image>img.motion-photo{transform:translateY(var(--photo-offset,0px)) scale(1.075);transition:transform 1.35s var(--ease);will-change:auto}
 .home-card.reveal-ready:not(.is-revealed) .home-image img.motion-photo,.home-feature-grid .home-card:nth-child(n).reveal-ready:not(.is-revealed) .home-image img.motion-photo{transform:translateY(0) scale(1.18)}
 .journal-card:nth-child(n).reveal-ready .journal-image img{transform:scale(1.14);transition:transform 1.35s var(--ease);transition-delay:var(--reveal-delay,0ms)}
 .journal-card:nth-child(n).reveal-ready.is-revealed .journal-image img{transform:scale(1.025)}
 /* Observe the fixed frame; clipping the observer target itself can suppress its intersection. */
 [data-motion=image].reveal-ready>img{clip-path:inset(0 0 100% 0);transition:clip-path 1.2s var(--ease),transform 1.35s var(--ease)}
 [data-motion=image].reveal-ready.is-revealed>img{clip-path:inset(0)}
 .article-cover.reveal-ready{opacity:0;transform:translateY(30px);transition:opacity .9s var(--ease),transform 1.2s var(--ease)}
 .article-cover.reveal-ready.is-revealed{opacity:1;transform:none}
 .comparison-demo.reveal-ready .comparison-pick{opacity:0;transition:transform 1.15s var(--ease),opacity .8s var(--ease)}
 .comparison-demo.reveal-ready .comparison-pick:first-child{transform:translateX(48px) scale(.96)}
 .comparison-demo.reveal-ready .comparison-pick:last-child{transform:translateX(-48px) scale(.96);transition-delay:.12s}
 .comparison-demo.reveal-ready.is-revealed .comparison-pick{transform:none;opacity:1}
 .comparison-demo.reveal-ready :is(.comparison-demo-top,.comparison-demo-bottom){opacity:0;transform:translateY(15px);transition:transform .7s .45s var(--ease),opacity .7s .45s}
 .comparison-demo.reveal-ready.is-revealed :is(.comparison-demo-top,.comparison-demo-bottom){opacity:1;transform:none}
 .service{position:relative}.service::before{content:'';position:absolute;inset:0 0 auto;height:1px;background:var(--action);transform-origin:left;transform:scaleX(0);transition:transform .95s var(--ease);opacity:.5}
 .service.is-revealed::before{transform:scaleX(1)}
 .service[open] .service-body{animation:service-in .55s var(--ease) both}.service[open] .service-body li{animation:entry-in .65s var(--ease) both}.service[open] .service-body li:nth-child(2){animation-delay:.09s}.service[open] .service-body li:nth-child(3){animation-delay:.18s}
 .testimonials.reveal-ready:not(.is-revealed){opacity:0;transform:translateY(34px)}
 .testimonials.reveal-ready{transition:opacity .9s var(--ease),transform 1s var(--ease)}
 .testimonials.is-revealed figure:not([hidden]) blockquote{animation:quote-in .9s var(--ease) both}.testimonials.is-revealed figure:not([hidden]) figcaption{animation:caption-in .7s .17s var(--ease) both}
 .compare-dialog[open] .compare-home{animation:compare-column-in .65s var(--ease) both}.compare-dialog[open] .compare-home:nth-child(2){animation-delay:.12s}.compare-tray:not([hidden]){animation:tray-in .5s var(--ease) both}.enquiry-dialog[open]{animation:headline-in .45s var(--ease) both}.toast{transition:transform .3s,opacity .3s}
 /* Focus must take precedence over decorative timing. */
 .motion-instant,.motion-instant *,.motion-instant::before{transition:none!important;animation:none!important}
 @media(hover:hover){
  .home-card.is-revealed .home-image>a:hover img.motion-photo,.home-feature-grid .home-card:nth-child(n).is-revealed .home-image>a:hover img.motion-photo{transform:translateY(var(--photo-offset,0px)) scale(1.11);transition-duration:.8s}
  .journal-card:nth-child(n).is-revealed .journal-image:hover img{transform:scale(1.065);transition-duration:.8s;transition-delay:0ms}
 }
 @media(max-width:760px){[data-motion=journal]{--reveal-delay:0ms!important}.comparison-demo.reveal-ready .comparison-pick:first-child{transform:translateX(22px)}.comparison-demo.reveal-ready .comparison-pick:last-child{transform:translateX(-22px)}.comparison-demo.reveal-ready.is-revealed .comparison-pick{transform:none}.reveal-ready .motion-part{transform:translateY(20px)}.reveal-ready.is-revealed .motion-part{transform:none}}
 @keyframes directory-in{from{opacity:0;transform:translateX(24px)}to{opacity:1;transform:none}}
 @keyframes directory-out{to{opacity:0;transform:translateX(30px)}}
 @keyframes backdrop-in{from{opacity:0}to{opacity:1}}@keyframes backdrop-out{to{opacity:0}}
 @keyframes entry-in{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}
 @keyframes headline-in{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}
 @keyframes hero-arrive{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
 @keyframes scene-in{from{opacity:0;transform:scale(1.025)}to{opacity:1;transform:none}}
 @keyframes caption-in{from{opacity:0;transform:translateY(15px)}to{opacity:1;transform:none}}
 @keyframes service-in{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:none}}
 @keyframes quote-in{from{opacity:0;transform:translateX(24px)}to{opacity:1;transform:none}}
 @keyframes compare-column-in{from{opacity:0;transform:translateY(20px) scale(.97)}to{opacity:1;transform:none}}
 @keyframes tray-in{from{opacity:0;transform:translate(-50%,30px)}to{opacity:1;transform:translate(-50%,0)}}
}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{animation:none!important;transition:none!important}.reveal-ready,.motion-part,.motion-line-content{opacity:1;transform:none;clip-path:none}.motion-photo{transform:none!important}.motion-line{overflow:visible}}
