/* HomeLynx V8.1.54 — native drawer + chrome handoff.
   Parent: V8.1.52. Mobile presentation/gesture timing only.

   V8.1.52 unified the visible chrome groups, but the listing content could still
   scroll underneath a stationary drawer handle and the MID snap introduced a
   second shove. V8.1.53 makes the drawer and chrome one interaction sequence:

   1) TOP HEADER GROUP   = fixed HomeLynx head; brand + intent tabs move as one.
   2) TOP SATELLITES     = Neo / hamburger / route identity, same clock/ease.
   3) THUMB GROUP        = omnibox / bottom controls, same clock/ease opposite Y.
   4) LEGACY SEARCH HEAD = follows the same top clock; never visibility-snaps.

   Preview law: PEEK/MID owns the vertical gesture; listing scroll is locked. One
   committed upward swipe promotes the entire drawer to FULL. Drawer promotion
   and chrome travel start on the same frame and share the same native ease.
   No opacity cut and no visibility toggle participates in the transition. */

:root{
  --hlx-mobile-chrome-ms:560ms;
  --hlx-mobile-chrome-ease:cubic-bezier(.16,1,.30,1);
  --hlx-mobile-head-off-y:-150px;
  --hlx-mobile-head-peek-y:-58px;
  --hlx-mobile-satellite-off-y:-148px;
  --hlx-mobile-bottom-off-y:calc(100% + 38px);
  --hlx-mobile-peek-top:56px;
}
.hlx-mobile-hydrator{display:none}

@media(max-width:767px){
  /* The fixed HomeLynx head is now the primary top motion group. Its brand and
     intent tabs do NOT animate independently; they remain rigid children of the
     same compositor layer. This is the anti-chunk rule. */
  body.hlx-search-active.hlx-mobile-chrome-top .hlx-v8-head,
  body.hlx-search-active.hlx-mobile-chrome-explore .hlx-v8-head,
  body.hlx-search-active.hlx-mobile-chrome-navigate .hlx-v8-head{
    opacity:1!important;
    visibility:visible!important;
    background:#fff!important;
    background-image:none!important;
    box-shadow:none!important;
    will-change:transform;
    backface-visibility:hidden;
    transition:transform var(--hlx-mobile-chrome-ms) var(--hlx-mobile-chrome-ease)!important;
  }
  body.hlx-search-active.hlx-mobile-chrome-top .hlx-v8-head{
    transform:translate3d(0,0,0)!important;
  }
  body.hlx-search-active.hlx-mobile-chrome-explore .hlx-v8-head{
    transform:translate3d(0,var(--hlx-mobile-head-off-y),0)!important;
    pointer-events:none!important;
  }
  body.hlx-search-active.hlx-mobile-chrome-navigate .hlx-v8-head{
    /* One rigid header translation: brand exits above the glass while the tab
       row naturally lands in the compact peek lane. No position-mode swap. */
    transform:translate3d(0,var(--hlx-mobile-head-peek-y),0)!important;
    pointer-events:none!important;
  }

  /* Children stay welded to the header group. Earlier releases translated
     these independently, which is what produced the block-by-block appearance. */
  body.hlx-search-active.hlx-mobile-chrome-top .hlx-v8-brand,
  body.hlx-search-active.hlx-mobile-chrome-explore .hlx-v8-brand,
  body.hlx-search-active.hlx-mobile-chrome-navigate .hlx-v8-brand,
  body.hlx-search-active.hlx-mobile-chrome-top .hlx-v8-head .hlx-intent-tabs,
  body.hlx-search-active.hlx-mobile-chrome-explore .hlx-v8-head .hlx-intent-tabs,
  body.hlx-search-active.hlx-mobile-chrome-navigate .hlx-v8-head .hlx-intent-tabs{
    transform:none!important;
    translate:none!important;
    transition:none!important;
    opacity:1!important;
    visibility:visible!important;
  }
  body.hlx-search-active.hlx-mobile-chrome-top .hlx-v8-brand,
  body.hlx-search-active.hlx-mobile-chrome-top .hlx-v8-head .hlx-intent-tabs,
  body.hlx-search-active.hlx-mobile-chrome-navigate .hlx-v8-head .hlx-intent-tabs{
    pointer-events:auto!important;
  }
  body.hlx-search-active.hlx-mobile-chrome-explore .hlx-v8-brand,
  body.hlx-search-active.hlx-mobile-chrome-explore .hlx-v8-head .hlx-intent-tabs,
  body.hlx-search-active.hlx-mobile-chrome-navigate .hlx-v8-brand{
    pointer-events:none!important;
  }

  /* Body-level top satellites use the exact same 560 ms clock/ease. They are
     separate DOM nodes, but one motion group contract: same trigger, same path,
     same completion. Nothing becomes visibility:hidden at the end. */
  body.hlx-mobile-chrome-top .hlx-menu-trigger,
  body.hlx-mobile-chrome-explore .hlx-menu-trigger,
  body.hlx-mobile-chrome-navigate .hlx-menu-trigger,
  body.hlx-mobile-chrome-top .hlx-neo-float,
  body.hlx-mobile-chrome-explore .hlx-neo-float,
  body.hlx-mobile-chrome-navigate .hlx-neo-float,
  body.hlx-mobile-chrome-top .hlx-os-top,
  body.hlx-mobile-chrome-explore .hlx-os-top,
  body.hlx-mobile-chrome-navigate .hlx-os-top,
  body.hlx-mobile-chrome-top .hlx-owner-topline,
  body.hlx-mobile-chrome-explore .hlx-owner-topline,
  body.hlx-mobile-chrome-navigate .hlx-owner-topline,
  body.hlx-mobile-chrome-top .hlx-finance-brand,
  body.hlx-mobile-chrome-explore .hlx-finance-brand,
  body.hlx-mobile-chrome-navigate .hlx-finance-brand,
  body.hlx-mobile-chrome-top .hlx-owner-auth-brand,
  body.hlx-mobile-chrome-explore .hlx-owner-auth-brand,
  body.hlx-mobile-chrome-navigate .hlx-owner-auth-brand{
    opacity:1!important;
    visibility:visible!important;
    will-change:transform;
    backface-visibility:hidden;
    transition:transform var(--hlx-mobile-chrome-ms) var(--hlx-mobile-chrome-ease)!important;
  }
  body.hlx-mobile-chrome-top .hlx-menu-trigger,
  body.hlx-mobile-chrome-top .hlx-os-top,
  body.hlx-mobile-chrome-top .hlx-owner-topline,
  body.hlx-mobile-chrome-top .hlx-finance-brand,
  body.hlx-mobile-chrome-top .hlx-owner-auth-brand{
    transform:translate3d(0,0,0)!important;
    pointer-events:auto!important;
  }
  body.hlx-mobile-chrome-explore .hlx-menu-trigger,
  body.hlx-mobile-chrome-navigate .hlx-menu-trigger,
  body.hlx-mobile-chrome-explore .hlx-os-top,
  body.hlx-mobile-chrome-navigate .hlx-os-top,
  body.hlx-mobile-chrome-explore .hlx-owner-topline,
  body.hlx-mobile-chrome-navigate .hlx-owner-topline,
  body.hlx-mobile-chrome-explore .hlx-finance-brand,
  body.hlx-mobile-chrome-navigate .hlx-finance-brand,
  body.hlx-mobile-chrome-explore .hlx-owner-auth-brand,
  body.hlx-mobile-chrome-navigate .hlx-owner-auth-brand{
    transform:translate3d(0,var(--hlx-mobile-satellite-off-y),0)!important;
    pointer-events:none!important;
  }
  body.hlx-mobile-chrome-top .hlx-neo-float{
    transform:translate3d(-50%,0,0)!important;
    pointer-events:auto!important;
  }
  body.hlx-mobile-chrome-explore .hlx-neo-float,
  body.hlx-mobile-chrome-navigate .hlx-neo-float{
    transform:translate3d(-50%,var(--hlx-mobile-satellite-off-y),0)!important;
    pointer-events:none!important;
  }

  /* Generic route segment rail: same clock. Search tabs are already children
     of the fixed header and are therefore intentionally excluded here. */
  body.hlx-mobile-chrome-top .hlx-os-segments,
  body.hlx-mobile-chrome-explore .hlx-os-segments,
  body.hlx-mobile-chrome-navigate .hlx-os-segments{
    opacity:1!important;
    visibility:visible!important;
    will-change:transform;
    backface-visibility:hidden;
    transition:transform var(--hlx-mobile-chrome-ms) var(--hlx-mobile-chrome-ease)!important;
  }
  body.hlx-mobile-chrome-top .hlx-os-segments,
  body.hlx-mobile-chrome-navigate .hlx-os-segments{
    transform:translate3d(0,0,0)!important;
    pointer-events:auto!important;
  }
  body.hlx-mobile-chrome-explore .hlx-os-segments{
    transform:translate3d(0,var(--hlx-mobile-satellite-off-y),0)!important;
    pointer-events:none!important;
  }

  /* Thumb group. Every bottom object receives one shared Y contract. No fade,
     no delayed visibility flip, and no stagger. */
  body.hlx-mobile-chrome-top .hlx-v8-searchrow.hlx-bottom-dock,
  body.hlx-mobile-chrome-explore .hlx-v8-searchrow.hlx-bottom-dock,
  body.hlx-mobile-chrome-navigate .hlx-v8-searchrow.hlx-bottom-dock{
    opacity:1!important;
    visibility:visible!important;
    will-change:transform;
    backface-visibility:hidden;
    transition:transform var(--hlx-mobile-chrome-ms) var(--hlx-mobile-chrome-ease)!important;
  }
  body.hlx-mobile-chrome-top .hlx-v8-searchrow.hlx-bottom-dock,
  body.hlx-mobile-chrome-navigate .hlx-v8-searchrow.hlx-bottom-dock{
    transform:translate3d(-50%,0,0)!important;
    pointer-events:auto!important;
  }
  body.hlx-mobile-chrome-explore .hlx-v8-searchrow.hlx-bottom-dock{
    transform:translate3d(-50%,var(--hlx-mobile-bottom-off-y),0)!important;
    pointer-events:none!important;
  }

  body.hlx-mobile-chrome-top .hlx-neo-attach-chiphost.hlx-bottom-dock-chiphost,
  body.hlx-mobile-chrome-explore .hlx-neo-attach-chiphost.hlx-bottom-dock-chiphost,
  body.hlx-mobile-chrome-navigate .hlx-neo-attach-chiphost.hlx-bottom-dock-chiphost,
  body.hlx-mobile-chrome-top #tabbar,
  body.hlx-mobile-chrome-explore #tabbar,
  body.hlx-mobile-chrome-navigate #tabbar,
  body.hlx-mobile-chrome-top .hlx-pd-dock,
  body.hlx-mobile-chrome-explore .hlx-pd-dock,
  body.hlx-mobile-chrome-navigate .hlx-pd-dock{
    opacity:1!important;
    visibility:visible!important;
    will-change:transform;
    backface-visibility:hidden;
    transition:transform var(--hlx-mobile-chrome-ms) var(--hlx-mobile-chrome-ease)!important;
  }
  body.hlx-mobile-chrome-top .hlx-neo-attach-chiphost.hlx-bottom-dock-chiphost,
  body.hlx-mobile-chrome-navigate .hlx-neo-attach-chiphost.hlx-bottom-dock-chiphost,
  body.hlx-mobile-chrome-top #tabbar,
  body.hlx-mobile-chrome-navigate #tabbar,
  body.hlx-mobile-chrome-top .hlx-pd-dock,
  body.hlx-mobile-chrome-navigate .hlx-pd-dock{
    transform:translate3d(0,0,0)!important;
    pointer-events:auto!important;
  }
  body.hlx-mobile-chrome-explore .hlx-neo-attach-chiphost.hlx-bottom-dock-chiphost,
  body.hlx-mobile-chrome-explore #tabbar,
  body.hlx-mobile-chrome-explore .hlx-pd-dock{
    transform:translate3d(0,var(--hlx-mobile-bottom-off-y),0)!important;
    pointer-events:none!important;
  }

  /* Legacy full-results search head is top chrome, not card content. It moves
     on the same clock and stays painted all the way out of frame. */
  body.hlx-sheet-full.hlx-mobile-chrome-top .hlx-search-head,
  body.hlx-sheet-full.hlx-mobile-chrome-explore .hlx-search-head,
  body.hlx-sheet-full.hlx-mobile-chrome-navigate .hlx-search-head{
    opacity:1!important;
    visibility:visible!important;
    will-change:transform;
    backface-visibility:hidden;
    transition:transform var(--hlx-mobile-chrome-ms) var(--hlx-mobile-chrome-ease)!important;
  }
  body.hlx-sheet-full.hlx-mobile-chrome-top .hlx-search-head{
    transform:translate3d(0,0,0)!important;
  }
  body.hlx-sheet-full.hlx-mobile-chrome-explore .hlx-search-head,
  body.hlx-sheet-full.hlx-mobile-chrome-navigate .hlx-search-head{
    transform:translate3d(0,calc(-100% - 10px),0)!important;
    pointer-events:none!important;
  }

  /* EXPLORE and NAVIGATE share the same deep-content geometry. Reverse intent
     overlays the compact chrome instead of making the listing slab jump by a
     second block. TOP keeps the prior .51 layout law. */
  body.hlx-sheet-full.hlx-mobile-chrome-explore,
  body.hlx-sheet-full.hlx-mobile-chrome-navigate{
    --hlx-full-search-h:0px!important;
  }
  body.hlx-sheet-full .hlx-sheet-grab{
    transition:padding-top var(--hlx-mobile-chrome-ms) var(--hlx-mobile-chrome-ease)!important;
    will-change:padding-top;
  }

  /* Same rule for the newer V8 property sheet: EXPLORE and NAVIGATE do not
     resize it differently. Chrome overlays; the content plane stays coherent. */
  body.hlx-search-active.hlx-mobile-chrome-explore .hlx-v8-sheet.is-slidable.is-expanded,
  body.hlx-search-active.hlx-mobile-chrome-navigate .hlx-v8-sheet.is-slidable.is-expanded{
    height:calc(100dvh - max(8px,var(--hlx-dock-bottom,8px)))!important;
    max-height:none!important;
    border-radius:0!important;
    transition:border-radius var(--hlx-mobile-chrome-ms) var(--hlx-mobile-chrome-ease)!important;
  }

  /* V8.1.53 native drawer arbitration. Before FULL, cards are a preview plane,
     never an independently scrolling rail. The user's vertical swipe belongs to
     the whole drawer, while horizontal photo gestures remain available. During
     the FULL snap the rail stays locked until the transform settles, preventing
     content from racing ahead of the handle. */
  .hlx-results-sheet{
    transition:transform var(--hlx-mobile-chrome-ms) var(--hlx-mobile-chrome-ease),
               border-radius var(--hlx-mobile-chrome-ms) var(--hlx-mobile-chrome-ease),
               box-shadow var(--hlx-mobile-chrome-ms) var(--hlx-mobile-chrome-ease)!important;
    backface-visibility:hidden;
    transform-style:preserve-3d;
  }
  .hlx-results-sheet.hlx-sheet-dragging,
  .hlx-results-sheet.hlx-sheet-noanim{
    transition:none!important;
  }
  .hlx-results-sheet[data-sheet-state="peek"],
  .hlx-results-sheet[data-sheet-state="mid"]{
    touch-action:pan-x;
  }
  .hlx-results-sheet[data-sheet-state="peek"] .hlx-sheet-scroll,
  .hlx-results-sheet[data-sheet-state="mid"] .hlx-sheet-scroll,
  .hlx-results-sheet.hlx-sheet-settling .hlx-sheet-scroll,
  body.hlx-sheet-full .hlx-results-sheet.hlx-sheet-settling .hlx-sheet-scroll{
    overflow-y:hidden!important;
    overscroll-behavior:none!important;
  }
  body.hlx-sheet-full .hlx-results-sheet[data-sheet-state="full"]:not(.hlx-sheet-settling):not(.hlx-sheet-dragging) .hlx-sheet-scroll{
    overflow-y:auto!important;
    overscroll-behavior:contain!important;
  }
  /* Keep the handle/action crown compact once the drawer reaches FULL. This is
     the last spatial gap after the HomeLynx header has travelled off glass. */
  body.hlx-sheet-full.hlx-mobile-chrome-explore .hlx-sheet-grab,
  body.hlx-sheet-full.hlx-mobile-chrome-navigate .hlx-sheet-grab{
    padding:4px 20px 3px!important;
  }
  body.hlx-sheet-full.hlx-mobile-chrome-explore .hlx-results-actions,
  body.hlx-sheet-full.hlx-mobile-chrome-navigate .hlx-results-actions{
    padding-top:3px!important;
    padding-bottom:8px!important;
  }

  /* Persistent escape route law. */
  body.hlx-property-detail-route .hlx-pd-back-wrap,
  .hlx-v8-results-head [data-hlx-close-results],
  [aria-modal="true"] [data-close],
  [aria-modal="true"] [aria-label*="Close" i]{
    opacity:1!important;
    visibility:visible!important;
    pointer-events:auto!important;
  }

  .hlx-mobile-hydrator{
    position:fixed;z-index:2147481200;left:50%;
    bottom:max(16px,calc(env(safe-area-inset-bottom,0px) + 12px));
    width:30px;height:30px;margin-left:-15px;display:grid;place-items:center;
    opacity:0;transform:translateY(10px);pointer-events:none;
    transition:opacity 150ms ease,transform 190ms var(--hlx-mobile-chrome-ease);
  }
  .hlx-mobile-hydrator__ring{
    width:20px;height:20px;box-sizing:border-box;border-radius:50%;
    border:2px solid rgba(11,13,12,.18);border-top-color:#0B0D0C;
    animation:hlx-mobile-hydrator-spin .72s linear infinite;
    box-shadow:0 4px 18px rgba(11,13,12,.08);background:rgba(255,255,255,.28);
    -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
  }
  body.hlx-mobile-at-bottom .hlx-mobile-hydrator{opacity:1;transform:none}
  body.hlx-mobile-bottom-settled .hlx-mobile-hydrator__ring{
    width:7px;height:7px;border:0;background:#0B0D0C;animation:none;box-shadow:none;
    transition:width 160ms ease,height 160ms ease,background 160ms ease;
  }
  @keyframes hlx-mobile-hydrator-spin{to{transform:rotate(360deg)}}
}

@media(prefers-reduced-motion:reduce){
  :root{--hlx-mobile-chrome-ms:1ms}
  .hlx-mobile-hydrator__ring{animation-duration:1.4s}
}
