/* =====================================================================
   Asbestos Re-inspection: motion system ("the yearly check").
   Scan (left-to-right reveals), Mark (amber = what changed), Rule (lines
   draw first), Settle (one easing, no loops). See motion-plan.md.

   Elements opt in with Elementor's Entrance Animation control (remapped
   below) or with ri-m-* / ri-load CSS classes in Advanced > CSS Classes.
   Hidden starting states only apply while html has .ri-motion, which the
   head script adds and removes again if the motion script never runs.
   ===================================================================== */
:root{--ri-ease:cubic-bezier(.2,.7,.2,1);--ri-ease-out:cubic-bezier(.16,1,.3,1);--ri-ease-io:cubic-bezier(.65,0,.35,1);--ri-rise:18px;--ri-amb-c:var(--e-global-color-accent,#F0A63A);--ri-amb-t:rgba(240,166,58,.15)}
@media (max-width:700px){:root{--ri-rise:12px}}

@keyframes riFadeUp{from{opacity:0;transform:translateY(var(--ri-rise))}to{opacity:1;transform:none}}
@keyframes riFadeUpSm{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@keyframes riWipe{from{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0 0 0 0)}}
@keyframes riMaskRise{from{clip-path:inset(100% 0 0 0);transform:translateY(.4em)}to{clip-path:inset(0 0 0 0);transform:none}}
@keyframes riSettleIn{from{opacity:0;transform:scale(.97)}to{opacity:1;transform:none}}
@keyframes riRise{from{transform:translateY(105%)}to{transform:none}}
@keyframes riSweep{from{background-position:100% 0}to{background-position:0 0}}
@keyframes riMark{from{opacity:0}to{opacity:1}}
@keyframes riAmber{to{color:var(--ri-amb-c)}}
@keyframes riDraw{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes riScan{0%{transform:translateX(-100%);opacity:1}80%{opacity:1}100%{transform:translateX(0);opacity:0}}
@keyframes riCellIn{from{opacity:0;transform:translateX(-8px)}to{opacity:1;transform:none}}
@keyframes riCheck{0%{transform:scaleX(0);opacity:1}55%{transform:scaleX(1);opacity:1}100%{transform:scaleX(1);opacity:0}}
@keyframes riEdgeX{from{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0 0 0 0)}}
@keyframes riEdgeY{from{clip-path:inset(0 0 100% 0)}to{clip-path:inset(0 0 0 0)}}
@keyframes riPing{0%{opacity:.9;transform:scale(1)}100%{opacity:0;transform:scale(1.55)}}
@keyframes riRoll{from{opacity:0;transform:translateY(.45em)}to{opacity:1;transform:none}}
@keyframes riPop{0%{transform:scale(.88)}60%{transform:scale(1.04)}100%{transform:none}}
@keyframes riTick{0%{transform:scale(.97)}60%{transform:scale(1.012)}100%{transform:none}}
@keyframes riDrop{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
@keyframes riFlash{from{background-color:rgba(240,166,58,.32)}to{background-color:rgba(240,166,58,0)}}
@keyframes riPanel{from{clip-path:inset(0 0 100% 0)}to{clip-path:inset(0 0 0 0)}}
@keyframes riItem{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
@keyframes riLogoTick{from{transform:rotate(-30deg)}to{transform:none}}
@keyframes riProgress{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes riPaneNext{from{opacity:0;transform:translateX(18px)}to{opacity:1;transform:none}}
@keyframes riPanePrev{from{opacity:0;transform:translateX(-18px)}to{opacity:1;transform:none}}
@keyframes riImgOpen{from{clip-path:inset(6% 5% 6% 5% round 12px);transform:scale(1.05)}to{clip-path:inset(0 0 0 0 round 12px);transform:none}}
@keyframes riImgUp{from{clip-path:inset(100% 0 0 0)}to{clip-path:inset(0 0 0 0)}}
@keyframes riCurtain{from{clip-path:inset(0 4.5% round 28px)}to{clip-path:inset(0 0 round 0)}}
@keyframes riDrift{from{translate:0 0}to{translate:0 -40px}}
@keyframes riDepth{from{scale:1}to{scale:1.04}}

/* ---------- 1. Elementor entrance presets, remapped to the motion language ---------- */
.elementor-element.animated{animation-duration:.85s;animation-timing-function:var(--ri-ease-out)}
.elementor-element.animated.animated-fast{animation-duration:.6s}
.elementor-element.animated.animated-slow{animation-duration:1.2s}
.elementor-element.animated.fadeInUp{animation-name:riFadeUp}
.elementor-element.animated.fadeInLeft{animation-name:riWipe;animation-timing-function:var(--ri-ease-io)}
.elementor-element.animated.slideInUp{animation-name:riMaskRise}
.elementor-element.animated.zoomIn{animation-name:riSettleIn}

/* ---------- 2. Load sequence (above the fold; pure CSS, never waits for scripts) ---------- */
.ri-load{animation:riFadeUp .8s var(--ri-ease-out) backwards}
.ri-load-1{animation-delay:.32s}.ri-load-2{animation-delay:.44s}.ri-load-3{animation-delay:.56s}
/* hero H1: lines rise (masked), then line 2 fills with amber left to right */
.ri-h1 .ri-l>span{animation:riRise .8s var(--ri-ease) both}
.ri-h1 .ri-l:nth-child(2)>span{animation-delay:.14s;color:var(--ri-amb-c)}
@supports ((-webkit-background-clip:text) or (background-clip:text)){
 .ri-h1 .ri-l:nth-child(2)>span,.animated .ri-hl{background-image:linear-gradient(90deg,var(--ri-amb-c) 0 50%,currentColor 50% 100%);background-size:200% 100%;background-position:0 0;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
 .ri-h1 .ri-l:nth-child(2)>span{color:var(--e-global-color-primary,#ECEAE4);animation:riRise .8s var(--ri-ease) .14s both,riSweep 1s var(--ri-ease-io) .95s backwards}
 .animated .ri-hl{color:var(--e-global-color-primary,#ECEAE4);animation:riSweep .9s var(--ri-ease-io) .5s backwards}
}
/* post title + featured image */
.ri-load-mask{animation:riMaskRise .9s var(--ri-ease-out) .2s backwards}
.ri-load-img{animation:riImgOpen 1.1s var(--ri-ease-out) backwards}

/* ---------- 3. Hero change list: an inspection pass ---------- */
.ri-change{position:relative;animation:riWipe 1s var(--ri-ease-io) .15s backwards}
.ri-change::after{content:"";position:absolute;inset:0;z-index:2;pointer-events:none;background:linear-gradient(90deg,transparent 0,rgba(240,166,58,.06) 70%,rgba(240,166,58,.18) calc(100% - 2px),var(--ri-amb-c) calc(100% - 2px));transform:translateX(-100%);opacity:0;animation:riScan 1.05s var(--ri-ease-io) .15s both}
.ri-ctable>.elementor-element{animation:riCellIn .5s var(--ri-ease-out) backwards}
.ri-ctable>.elementor-element:nth-child(-n+3){animation-delay:.45s}
.ri-ctable>.elementor-element:nth-child(n+4):nth-child(-n+6){animation-delay:.55s}
.ri-ctable>.elementor-element:nth-child(n+7):nth-child(-n+9){animation-delay:.63s}
.ri-ctable>.elementor-element:nth-child(n+10):nth-child(-n+12){animation-delay:.71s}
.ri-ctable>.elementor-element:nth-child(n+13):nth-child(-n+15){animation-delay:.79s}
.ri-ctable>.elementor-element:nth-child(n+16){animation-delay:.87s}
.ri-chg::after{content:"";position:absolute;inset:0;background:var(--ri-amb-t);box-shadow:inset 3px 0 0 var(--ri-amb-c);opacity:0;pointer-events:none;animation:riMark .8s ease-out forwards;animation-delay:calc(var(--d,0) * .22s + 1.25s)}
.ri-chg strong{animation:riAmber .4s ease forwards;animation-delay:calc(var(--d,0) * .22s + 1.25s)}
.ri-d1{--d:1}.ri-d2{--d:2}
/* below the hero copy (laptop and smaller) the panel waits until it is scrolled to */
.ri-motion .ri-change:not(.is-in),.ri-motion .ri-change:not(.is-in)::after,.ri-motion .ri-change:not(.is-in) .elementor-element,.ri-motion .ri-change:not(.is-in) .ri-chg::after,.ri-motion .ri-change:not(.is-in) strong{animation-play-state:paused}

/* ---------- 4. In-view reveals driven by ri-motion.js (.is-in) ---------- */
/* words (quote band) */
.ri-m-words .ri-w{display:inline-block;overflow:hidden;vertical-align:top;padding-bottom:.1em;margin-bottom:-.1em}
.ri-m-words .ri-w>span{display:inline-block}
.ri-motion .ri-m-words:not(.is-in) .ri-w>span{transform:translateY(110%)}
.ri-m-words.is-in .ri-w>span{animation:riRise .75s var(--ri-ease-out) backwards;animation-delay:calc(var(--i,0) * 28ms)}
/* rows in a Text Editor list */
.ri-motion .ri-m-rows:not(.is-in) li{opacity:0}
.ri-m-rows.is-in li{animation:riFadeUpSm .6s var(--ri-ease-out) backwards;animation-delay:calc(var(--i,0) * 80ms + 120ms)}
/* children of a staggered grid */
.ri-motion .ri-m-stagger>.elementor-element:not(.is-in){opacity:0;transform:translateY(var(--ri-rise))}
.ri-m-stagger>.elementor-element.is-in{animation:riFadeUp .8s var(--ri-ease-out) backwards;animation-delay:calc(var(--i,0) * 70ms)}
/* one-off amber "checked" sweep on a card */
.ri-m-check{position:relative}
.ri-m-check::after{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;background:linear-gradient(90deg,rgba(240,166,58,.16),rgba(240,166,58,.03));box-shadow:inset 3px 0 0 var(--ri-amb-c);transform-origin:left;transform:scaleX(0);opacity:0}
.ri-m-check.is-in::after{animation:riCheck 1.1s var(--ri-ease-io) forwards;animation-delay:calc(var(--i,0) * 70ms + .35s)}
/* coloured edges that draw in */
.ri-m-edge-top,.ri-m-edge-left{position:relative}
.ri-motion .ri-m-edge-top{border-top-color:transparent!important}
.ri-motion .ri-m-edge-left{border-left-color:transparent!important}
.ri-motion .ri-m-edge-top::before,.ri-motion .ri-m-edge-left::before{content:"";position:absolute;pointer-events:none;border-radius:inherit;clip-path:inset(0 100% 0 0)}
.ri-motion .ri-m-edge-top::before{inset:-3px -1px -1px -1px;border-top:3px solid var(--ri-edge,var(--ri-amb-c))}
.ri-motion .ri-m-edge-left::before{inset:-1px -1px -1px -3px;border-left:3px solid var(--ri-edge,var(--ri-amb-c));clip-path:inset(0 0 100% 0)}
.ri-motion .ri-m-edge-top.is-in::before{animation:riEdgeX .9s var(--ri-ease-io) .25s forwards}
.ri-motion .ri-m-edge-left.is-in::before{animation:riEdgeY .9s var(--ri-ease-io) .25s forwards}
.ri-note.ri-m-edge-left{--ri-edge:var(--e-global-color-text,#C3C9C6)}
/* the pull quote has no top/right/bottom border */
figure.ri-m-edge-left::before{inset:0 auto 0 -3px!important;width:0}
/* blockquotes inside blog posts */
.ri-post-body blockquote{position:relative}
.ri-motion .ri-post-body blockquote{border-left-color:transparent!important}
.ri-motion .ri-post-body blockquote::before{content:"";position:absolute;left:-3px;top:0;bottom:0;width:3px;background:var(--ri-amb-c);transform-origin:top;transform:scaleY(0);transition:transform .9s var(--ri-ease-io) .15s}
.ri-motion .ri-post-body blockquote.is-in::before{transform:none}

/* ---------- 5. Section-specific choreography (keyed to Elementor's own entrance) ---------- */
/* steps: line draws, each circle pings as it is reached, text follows */
.ri-steps::before{content:"";position:absolute;left:0;right:0;top:25px;height:2px;background:var(--e-global-color-riline,#2C353A);transform-origin:left;transform:scaleX(0)}
.ri-steps:not(.elementor-invisible)::before{animation:riDraw 1.1s var(--ri-ease-io) forwards}
.ri-step-n{position:relative}
.ri-step-n::after{content:"";position:absolute;inset:0;border-radius:50%;border:2px solid var(--ri-amb-c);opacity:0;pointer-events:none}
.ri-steps:not(.elementor-invisible) .ri-step-n::after{animation:riPing .9s var(--ri-ease-out) backwards}
.ri-steps:not(.elementor-invisible) .ri-step>.elementor-element:not(.ri-step-n){animation:riFadeUpSm .6s var(--ri-ease-out) backwards}
.ri-steps .ri-step:nth-child(1) .ri-step-n::after,.ri-steps .ri-step:nth-child(1)>.elementor-element{animation-delay:.05s}
.ri-steps .ri-step:nth-child(2) .ri-step-n::after,.ri-steps .ri-step:nth-child(2)>.elementor-element{animation-delay:.23s}
.ri-steps .ri-step:nth-child(3) .ri-step-n::after,.ri-steps .ri-step:nth-child(3)>.elementor-element{animation-delay:.41s}
.ri-steps .ri-step:nth-child(4) .ri-step-n::after,.ri-steps .ri-step:nth-child(4)>.elementor-element{animation-delay:.59s}
.ri-steps .ri-step:nth-child(5) .ri-step-n::after,.ri-steps .ri-step:nth-child(5)>.elementor-element{animation-delay:.77s}
.ri-steps .ri-step:nth-child(6) .ri-step-n::after,.ri-steps .ri-step:nth-child(6)>.elementor-element{animation-delay:.95s}
@media (max-width:1180px){.ri-steps::before{display:none}}
@media (max-width:700px){
 .ri-step::before{transform-origin:top;transform:scaleY(0)}
 .ri-steps:not(.elementor-invisible) .ri-step::before{animation:riDrawY .5s var(--ri-ease-io) forwards}
 .ri-steps .ri-step:nth-child(2)::before{animation-delay:.18s}.ri-steps .ri-step:nth-child(3)::before{animation-delay:.36s}
 .ri-steps .ri-step:nth-child(4)::before{animation-delay:.54s}.ri-steps .ri-step:nth-child(5)::before{animation-delay:.72s}
}
@keyframes riDrawY{from{transform:scaleY(0)}to{transform:none}}
/* FAQ: questions cascade in; an opened answer settles */
.ri-acc.animated .e-n-accordion-item{animation:riFadeUpSm .6s var(--ri-ease-out) backwards}
.ri-acc .e-n-accordion-item:nth-child(2){animation-delay:.05s}.ri-acc .e-n-accordion-item:nth-child(3){animation-delay:.1s}
.ri-acc .e-n-accordion-item:nth-child(4){animation-delay:.15s}.ri-acc .e-n-accordion-item:nth-child(5){animation-delay:.2s}
.ri-acc .e-n-accordion-item:nth-child(6){animation-delay:.25s}.ri-acc .e-n-accordion-item:nth-child(n+7){animation-delay:.3s}
.ri-acc .e-n-accordion-item[open]>.e-con{animation:riFadeUpSm .45s var(--ri-ease-out) .06s backwards}
/* Findings tabs: directional indicator + pane */
.ri-tabs-w .e-n-tab-title::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:3px;background:var(--ri-amb-c);transform:scaleX(0);transform-origin:var(--o,left);transition:transform .45s var(--ri-ease-out)}
.ri-tabs-w .e-n-tab-title[aria-selected=true]::after{transform:scaleX(1)}
.ri-tabs-w .e-n-tabs-content>.e-con.e-active>.elementor-element{animation:riPaneNext .55s var(--ri-ease-out) backwards}
.ri-tabs-w[data-ri-dir=prev] .e-n-tabs-content>.e-con.e-active>.elementor-element{animation-name:riPanePrev}
.ri-tabs-w .e-n-tabs-content>.e-con.e-active>.elementor-element:nth-child(2){animation-delay:.05s}
.ri-tabs-w .e-n-tabs-content>.e-con.e-active>.elementor-element:nth-child(3){animation-delay:.1s}
.ri-tabs-w .e-n-tabs-content>.e-con.e-active>.elementor-element:nth-child(4){animation-delay:.16s}
/* booking form: tiles press, errors drop in, summary rows flash when they change */
.ri-bookform .ri-tiles input:checked+label{animation:riTick .35s var(--ri-ease)}
.ri-bookform em.wpforms-error,.ri-bookform label.wpforms-error{animation:riDrop .3s var(--ri-ease-out)}
.ri-flash{animation:riFlash 1.1s ease-out}
.ri-s-due .elementor-heading-title.ri-roll{animation:riRoll .5s var(--ri-ease-out)}
.ri-formcard:has(.ri-done){animation:riSettleIn .5s var(--ri-ease-out)}

/* ---------- 6. Hover, focus and press (mouse/trackpad only where it is hover) ---------- */
.elementor-widget-button .elementor-button{position:relative;overflow:hidden;transition:background-color .25s,border-color .25s,color .25s,box-shadow .3s var(--ri-ease),transform .3s var(--ri-ease),translate .35s var(--ri-ease)}
.elementor-widget-button .elementor-button:active{transform:scale(.98)}
/* outline buttons: a light sheen passes once */
.ri-btn-line .elementor-button::after,.ri-btn-light .elementor-button::after{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(105deg,transparent 30%,rgba(255,255,255,.09) 50%,transparent 70%);transform:translateX(-120%)}
.ri-arrow{display:inline-block;transition:transform .3s var(--ri-ease)}
@media (hover:hover) and (pointer:fine){
 .elementor-widget-button:not(.ri-btn-line):not(.ri-btn-light):not(.ri-set) .elementor-button:hover{transform:translateY(-2px);box-shadow:0 0 0 4px rgba(240,166,58,.16),0 12px 26px -14px rgba(240,166,58,.7)}
 .ri-btn-light .elementor-button:hover{transform:translateY(-2px)}
 .ri-btn-line .elementor-button:hover::after,.ri-btn-light .elementor-button:hover::after{transform:translateX(120%);transition:transform .75s var(--ri-ease-io)}
 .ri-set .elementor-button:hover .ri-arrow{transform:translateX(5px)}
 .ri-back a:hover .ri-arrow{transform:translateX(-4px)}
}
.elementor-widget-button .elementor-button:focus-visible{box-shadow:0 0 0 4px rgba(240,166,58,.25)}
/* who cards: an inspector's torch follows the pointer */
@media (hover:hover) and (pointer:fine){
 .ri-m-torch:hover{background-image:radial-gradient(260px circle at var(--mx,50%) var(--my,50%),rgba(240,166,58,.09),transparent 65%);background-size:100% 100%;background-repeat:no-repeat}
}
/* nav: underline draws; current page drawn in amber (draws in on load) */
@media (min-width:981px){
 .ri-nav .xpro-elementor-horizontal-navbar-nav>li>a{position:relative}
 .ri-nav .xpro-elementor-horizontal-navbar-nav>li>a::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:2px;background:var(--ri-amb-c);transform:scaleX(0);transform-origin:left;opacity:.45;transition:transform .35s var(--ri-ease-out),opacity .2s}
 .ri-nav .xpro-elementor-horizontal-navbar-nav>li>a:hover::after,.ri-nav .xpro-elementor-horizontal-navbar-nav>li>a:focus-visible::after{transform:scaleX(1)}
 .ri-nav .xpro-elementor-horizontal-navbar-nav>li.current-menu-item>a::after,.ri-nav .xpro-elementor-horizontal-navbar-nav>li.current_page_item>a::after,.single-post .ri-nav .xpro-elementor-horizontal-navbar-nav>li.ri-nav-blogs>a::after{transform:scaleX(1);opacity:1;animation:riDraw .7s var(--ri-ease-io) .35s backwards}
}
/* mobile menu: the panel unrolls, links cascade */
@media (max-width:980px){
 .ri-nav .xpro-elementor-horizontal-navbar-wrapper.active{animation:riPanel .32s var(--ri-ease-out)}
 .ri-nav .xpro-elementor-horizontal-navbar-wrapper.active .xpro-elementor-horizontal-navbar-nav>li{animation:riItem .35s var(--ri-ease-out) backwards}
 .ri-nav .active .xpro-elementor-horizontal-navbar-nav>li:nth-child(2){animation-delay:.04s}.ri-nav .active .xpro-elementor-horizontal-navbar-nav>li:nth-child(3){animation-delay:.08s}
 .ri-nav .active .xpro-elementor-horizontal-navbar-nav>li:nth-child(4){animation-delay:.12s}.ri-nav .active .xpro-elementor-horizontal-navbar-nav>li:nth-child(5){animation-delay:.16s}
}
/* logo: the 12-tick ring turns one tick */
.ri-logo-img img{transition:transform .7s var(--ri-ease-out)}
.ri-head .ri-logo-img img{animation:riLogoTick 1s var(--ri-ease-out) .1s backwards}
@media (hover:hover){.ri-logo-link:hover .ri-logo-img img{transform:rotate(30deg)}}
/* footer links: underline draws from the left */
.ri-foot-links .elementor-icon-list-text{background:linear-gradient(currentColor,currentColor) 0 100%/0 1px no-repeat;transition:background-size .3s var(--ri-ease-out),color .2s}
.ri-foot-links a:hover .elementor-icon-list-text,.ri-foot-links a:focus-visible .elementor-icon-list-text{background-size:100% 1px}
/* hero phone: number warms to amber */
.ri-hero-tel .elementor-heading-title{transition:color .25s}
.ri-hero-tel:hover .elementor-heading-title{color:var(--ri-amb-c)}
/* blog reading progress (blog posts only) */
.single-post .ri-head::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:var(--ri-amb-c);transform-origin:left;transform:scaleX(var(--ri-p,0));pointer-events:none}
@supports (animation-timeline:scroll()){
 .single-post .ri-head::after{transform:scaleX(0);animation:riProgress linear both;animation-timeline:scroll(root)}
}

/* ---------- 7. Scroll-linked depth (large screens, supporting browsers only; no JS) ---------- */
@supports (animation-timeline:view()){
 @media (min-width:981px) and (prefers-reduced-motion:no-preference){
  .ri-m-curtain{animation:riCurtain linear both;animation-timeline:view();animation-range:entry 0% entry 75%}
  .ri-change{animation:riWipe 1s var(--ri-ease-io) .15s backwards,riDrift linear both;animation-timeline:auto,view();animation-range:normal,exit 0% exit 100%}
  .ri-post-img img{animation:riDepth linear both;animation-timeline:view();animation-range:exit 0% exit 100%}
 }
}

/* ---------- 8. Reduced motion: everything shown in its final state, no movement ---------- */
@media (prefers-reduced-motion:reduce){
 html{scroll-behavior:auto}
 *,*::before,*::after{animation:none!important;transition:none!important}
 .elementor-invisible{visibility:visible!important}
 .ri-chg::after{opacity:1}.ri-chg strong{color:var(--ri-amb-c)}
 .ri-steps::before{transform:none}
 .single-post .ri-head::after{display:none}
 .ri-h1 .ri-l:nth-child(2)>span,.ri-hl{-webkit-text-fill-color:currentColor!important;background:none!important;color:var(--ri-amb-c)!important}
 .ri-m-torch{background-image:none}
}
