/* Homepage section components.
 *
 * Each block maps to a registered section type in SectionRegistry.php.
 * Load order: base.css → chrome.css → home.css → home-native.css → home-sections.css → commerce.css
 *
 * Scoped under .aeri-home-native so all rules inherit the page's token context and stay isolated
 * from Elementor or any other block renderer that might share the DOM. */

/* ============================================================
 * Card lift — the hover motion of the editorial band (home-native.css).
 *
 * Pods, systems tiles and social tiles used to share this lift; they now use the measured
 * reference zoom defined under --aeri-zoom-* below. The notes on point 3 still explain why a
 * translateY must never be added to either motion.
 *
 * There is no reference for the editorial band's motion. RYOBI's pods scale their <img> and nothing
 * else, and its editorial card carries no text, so what reads there as "the card grew" is a
 * side-effect of the markup rather than a designed interaction. This one is AERI's, and three
 * choices carry it:
 *
 * 1. The whole card moves, not the image inside it. Scaling an image within a fixed frame reads as
 *    a picture sliding around inside a box; scaling the card moves the image and the caption
 *    together, which is what "the card came toward me" actually looks like.
 *
 * 2. Asymmetric timing. The base rule holds the leave and the :hover rule overrides it with the
 *    enter, so a card eases in slowly and returns quickly. Symmetric timing is what makes a hover
 *    feel sticky - the card is still shrinking under the cursor after the pointer has moved on -
 *    and it leaves a trail of half-grown cards when the pointer sweeps the row. The curve is
 *    front-loaded, so the movement is legible immediately and then settles; perceptually the
 *    motion is over well before the duration ends, which is what keeps 420ms from feeling slow.
 *
 * 3. transform-origin: center bottom, and no translateY.
 *
 *    The first version of this lifted with translateY(-6px) on a centre origin, and that flickered.
 *    Measured: the -6px lift was larger than the downward growth from a centre-origin scale, which
 *    is height*(scale-1)/2 - 4.4px for a 219px social tile at 1440, 2.3px at 390. So a hovered
 *    card's bottom edge sat *higher* than it did at rest, and a pointer parked 1px above the rest
 *    bottom edge fell outside the card the moment it lifted. :hover switched off, the card dropped
 *    back under the pointer, :hover switched on, and the transition restarted in the other
 *    direction on almost every pointer move: a 1-4px jitter band at the bottom edge of every social
 *    tile at all four widths, and of pods at 390.
 *
 *    Anchoring the scale at the bottom edge fixes it exactly. With origin centre-bottom and scale
 *    k>1 the hovered box is [x - w(k-1)/2, y - h(k-1)] to [x + w(k+1)/2, y + h] - a strict superset
 *    of the resting box [x, y] to [x + w, y + h]. A pointer inside the resting box is therefore
 *    always inside the hovered box, so the hover state cannot oscillate no matter where the pointer
 *    parks. The card still reads as growing toward the viewer: it rises off its base while the
 *    shadow stays put, which is a lift, just one that never retreats from the cursor.
 *
 * The editorial band takes a smaller factor (1.025) because it is ~1376px wide - see
 * home-native.css.
 *
 * On the shadow: it is a box-shadow transition rather than an opacity fade on a pseudo-element,
 * because the editorial card's overflow would clip a pseudo-element's outward shadow.
 * ============================================================ */
.aeri-home-native{
  --aeri-lift-enter:420ms;
  --aeri-lift-enter-curve:cubic-bezier(.2,.75,.25,1);
  --aeri-lift-leave:200ms;
  --aeri-lift-leave-curve:cubic-bezier(.4,0,.2,1);
  --aeri-lift-scale:1.04;
  --aeri-lift-shadow:0 16px 34px -12px rgba(0,0,0,.3);

  /* Card zoom — pods and systems tiles. (Social tiles fade instead; see the social grid block.)
   *
   * Measured on the reference at 1440, hovering a pod: the card box never changes
   * (332x422.3 before and after) while its media goes 332 -> 348.6 wide, i.e. exactly 1.05,
   * from a centre origin, over `all .3s cubic-bezier(.4,0,.2,1)`, with no shadow and no
   * z-index change. Hovering a systems tile behaves the same way on its <video>.
   *
   * The numbers below reproduce that motion while keeping our own markup: we scale the card
   * rather than the media inside it, because our cards carry a caption under the image and
   * scaling only the image would slide the picture around inside a fixed frame while the
   * caption sat still.
   *
   * Symmetric 300ms, not the asymmetric lift timing used by the editorial band: the reference
   * eases in and out at the same rate, and that is what reads as "丝滑" — the card is always
   * moving in the direction the pointer asked for, with no tail of half-grown cards.
   *
   * Centre origin is safe here (unlike the translateY that caused the old flicker) because a
   * centre-origin scale is still a strict superset of the resting box:
   *   [x - w(k-1)/2, y - h(k-1)/2] to [x + w(k+1)/2, y + h(k+1)/2] ⊃ [x, y] to [x+w, y+h].
   * A pointer inside the resting box is always inside the grown box, so :hover cannot oscillate.
   *
   * 1.05 growth against the gutters: worst case at 1440 is the 2-column systems tile, ~476px
   * wide, growing 11.9px per side into a 16px gutter; the largest pod grows 8.3px into 18px.
   * No card reaches its neighbour at any of the four widths.
   *
   * No shadow: the reference has none. Since no card reaches its neighbour, nothing needs
   * separating; z-index:2 is kept only so a grown card paints over the section below it. */
  --aeri-zoom-scale:1.05;
  --aeri-zoom-duration:300ms;
  --aeri-zoom-curve:cubic-bezier(.4,0,.2,1);
}

/* ============================================================
 * Pod grid  (type: pod_grid — campaign row and utility row)
 * Reference: grid-cols-4, col-span-1 at aspect 331/421, first utility card col-span-2 at 680/421.
 * ============================================================ */
.aeri-home-native .aeri-native-pods{padding:0 var(--aeri-gutter,32px) clamp(32px,4vw,56px);max-width:1440px;margin:0 auto}
.aeri-home-native .aeri-native-pod-grid{display:grid;grid-template-columns:repeat(var(--aeri-pod-columns,4),minmax(0,1fr));gap:clamp(8px,1.2vw,16px)}
/* The grid item lifts, not the link inside it. Reading hover on the item means a card whose link
 * the editor cleared still responds, and :focus-within gives keyboard focus the same lift that
 * hover gives the pointer. */
.aeri-home-native .aeri-native-pod{min-width:0;position:relative;transform-origin:center;transition:transform var(--aeri-zoom-duration) var(--aeri-zoom-curve)}
.aeri-home-native .aeri-native-pod:hover,.aeri-home-native .aeri-native-pod:focus-within{transform:scale(var(--aeri-zoom-scale));z-index:2}
.aeri-home-native .aeri-native-pod--span-2{grid-column:span 2}
/* A 2-column pod is twice as wide as its neighbours, so 1.05 grows it twice as far per side. At
 * 1440 that is 680px -> 714px: 17px of growth into a 16px gutter, which visibly clips the
 * 1-column card beside it (measured -1px clearance). 1.045 leaves 0.7px at 1440 and more at every
 * narrower width, where tile and gutter shrink together. */
.aeri-home-native .aeri-native-pod--span-2:hover,.aeri-home-native .aeri-native-pod--span-2:focus-within{--aeri-zoom-scale:1.045}
.aeri-home-native .aeri-native-pod-link{display:block;text-decoration:none;position:relative}
/* Pointer only on real anchors. An editor can clear a card's link, and a hand cursor on a card
 * that does nothing is worse than no affordance at all - it promises a click that never lands. */
.aeri-home-native a.aeri-native-pod-link{cursor:pointer}
.aeri-home-native .aeri-native-pod-link:focus-visible{outline:3px solid var(--aeri-lime);outline-offset:-3px}
/* Without an explicit aspect-ratio each card grows to the image's natural height, so a portrait
 * image (480x720) is taller than landscape siblings (480x600) and the row looks ragged. The
 * reference uses aspect-331/421 (~0.786) for single-column campaign pods and aspect-680/421
 * (~1.614) for the double-wide utility pod. Both are enforced here so every card in a row is
 * always the same height regardless of what image the editor uploads. */
.aeri-home-native .aeri-native-pod-media{display:block;width:100%;overflow:hidden;aspect-ratio:331/421}
.aeri-home-native .aeri-native-pod--span-2 .aeri-native-pod-media{aspect-ratio:680/421}
/* A single card spanning the grid is a billboard: a 3:1 band, too short to hold a 16:9 poster on a
 * phone, so it keeps the tile ratio there. */
.aeri-home-native .aeri-native-pod-grid--single .aeri-native-pod-media{aspect-ratio:3/1}
.aeri-home-native .aeri-native-pod-media picture,.aeri-home-native .aeri-native-pod-media img,.aeri-home-native .aeri-native-pod-media video{display:block;width:100%;height:100%;object-fit:cover}
.aeri-home-native .aeri-native-pod-title{display:block;padding:10px 0 0;font:700 13px/1.2 'Roboto Condensed',Arial,sans-serif;letter-spacing:.04em;text-transform:uppercase;color:var(--aeri-black)}
/* "Wide" row: two promo cards may grow past the 1440px page column, up to 2200px. On a 2560px
 * screen that puts each card at ~1088x495, which is the geometry the editor sketched. 2200px is a
 * ceiling, not a fixed width - narrower screens still fill edge to edge. */
.aeri-home-native .aeri-native-pods--full{max-width:2200px}
.aeri-home-native .aeri-native-pods--full .aeri-native-pod-media{aspect-ratio:11/5}
/* The 1.045 lift is calibrated for a 680px card; at 1088px it would grow 24px per side into a
 * 16px gutter. 1.028 keeps the same ~15px of growth. */
.aeri-home-native .aeri-native-pods--full .aeri-native-pod--span-2:hover,.aeri-home-native .aeri-native-pods--full .aeri-native-pod--span-2:focus-within{--aeri-zoom-scale:1.028}
@media(max-width:767px){
  .aeri-home-native .aeri-native-pod-grid{--aeri-pod-columns:2!important}
  .aeri-home-native .aeri-native-pod--span-2{grid-column:span 2}
  .aeri-home-native .aeri-native-pod-grid--single .aeri-native-pod-media{aspect-ratio:680/421}
  /* The wide row's media are 16:9 videos with the message baked into the top-left corner. At
   * desktop width the 11/5 crop only shaves the edges, but at phone width it cuts the first line
   * in half, so the phone gets the frame's native ratio. */
  .aeri-home-native .aeri-native-pods--full .aeri-native-pod-media{aspect-ratio:16/9}
}

/* ============================================================
 * Systems band  (type: systems_band)
 * Reference: grid-cols-6 / 2 rows — two 2×2 video tiles, one 2×1 image, two 1×1 images.
 * ============================================================ */
.aeri-home-native .aeri-native-systems{background:var(--aeri-gray);padding:clamp(40px,5vw,72px) var(--aeri-gutter,32px);max-width:none}
.aeri-home-native .aeri-native-section-head--center{text-align:center;max-width:none;margin-bottom:clamp(24px,3vw,40px)}
.aeri-home-native .aeri-native-section-head--center h2{font-size:clamp(26px,3.4vw,48px)}
.aeri-home-native .aeri-native-systems-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:clamp(8px,1.2vw,16px);max-width:1440px;margin:0 auto}
/* Row heights come from the single-row tiles, exactly as on the reference: its 2x1 tile carries
 * aspect-112/51 and its 1x1 tiles cap at 305, which makes row 1 = 203 and row 2 = 305, so the
 * two-row tile spanning both lands on 203 + 16 + 305 = 524 - the reference's max-h 526.
 *
 * This is required, not decorative: the media is absolutely positioned (below) so it cannot supply
 * height, and a tile with only a max-height collapses to zero. Each span therefore declares the
 * ratio its own box should have. */
.aeri-home-native .aeri-native-systems-tile{position:relative;min-width:0;min-height:0;overflow:hidden;aspect-ratio:var(--aeri-sys-ar,auto);transform-origin:center;transition:transform var(--aeri-zoom-duration) var(--aeri-zoom-curve)}
/* The tile lifts, not the link inside it. The tile carries overflow:hidden to clip its absolutely
 * positioned media, and that same rule would clip a scaled child - the card would keep its size
 * while its contents grew and were cut off at the edges. A tile's own box-shadow is not clipped by
 * its own overflow, so lift and shadow can live together on the element that owns the size. */
.aeri-home-native .aeri-native-systems-tile:hover,.aeri-home-native .aeri-native-systems-tile:focus-within{transform:scale(var(--aeri-zoom-scale));z-index:2}
.aeri-home-native .aeri-native-systems-tile--c2:not(.aeri-native-systems-tile--r2){--aeri-sys-ar:112/51;grid-column:span 2;max-height:203px}
.aeri-home-native .aeri-native-systems-tile--c1{--aeri-sys-ar:216/305;max-height:305px}
/* The two-row tile stretches to whatever the single-row tiles made the rows. The min-height is the
 * fallback for a band built only from two-row tiles, where nothing else would size the rows. */
.aeri-home-native .aeri-native-systems-tile--r2{grid-row:span 2;max-height:526px;min-height:320px}
.aeri-home-native .aeri-native-systems-tile--c2{grid-column:span 2}
.aeri-home-native .aeri-native-systems-link{display:block;position:relative;width:100%;height:100%;overflow:hidden;text-decoration:none;color:var(--aeri-white)}
.aeri-home-native .aeri-native-systems-link:focus-visible{outline:3px solid var(--aeri-lime);outline-offset:-3px}
/* Absolutely positioned so the media contributes no intrinsic height. A plain `height:100%` resolves
 * to auto here - the tile's height comes from its max-height and the grid's rows, which is not a
 * definite height for percentage resolution - so the image rendered at its natural size and was
 * clipped by the tile instead of being cover-fitted to it. At 1440 that showed a 672px image inside
 * a 526px tile, cropped from the bottom rather than centred, and on mobile it inflated the band to
 * ~2400px. This makes the media fill the box the grid actually allocated. */
.aeri-home-native .aeri-native-systems-media{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover}
.aeri-home-native .aeri-native-systems-title{position:absolute;left:0;right:0;bottom:0;z-index:1;padding:clamp(10px,2vw,20px);font:700 clamp(14px,1.6vw,22px)/1.1 Jost,Arial,sans-serif;letter-spacing:-.01em;text-transform:uppercase;background:linear-gradient(transparent,rgba(0,0,0,.7))}
@media(max-width:1023px){
  .aeri-home-native .aeri-native-systems-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .aeri-home-native .aeri-native-systems-tile--c2,.aeri-home-native .aeri-native-systems-tile--c1{grid-column:span 1}
  .aeri-home-native .aeri-native-systems-tile--r2,.aeri-home-native .aeri-native-systems-tile--c2.aeri-native-systems-tile--r2{grid-row:span 1;max-height:360px}
  .aeri-home-native .aeri-native-systems-tile--c2:not(.aeri-native-systems-tile--r2){max-height:180px}
  .aeri-home-native .aeri-native-systems-tile--c1{max-height:180px}
}
@media(max-width:767px){
  .aeri-home-native .aeri-native-systems-grid{grid-template-columns:minmax(0,1fr);gap:8px}
  .aeri-home-native .aeri-native-systems-tile{max-height:none!important;min-height:0!important;grid-column:span 1!important;grid-row:span 1!important}
  /* The tile is a bare box on mobile - it needs its own height now that the absolute media no
   * longer supplies one. */
  .aeri-home-native .aeri-native-systems-tile{aspect-ratio:16/9}
}

/* ============================================================
 * Social grid  (type: social_grid)
 * Reference: the Curalate carousel under "@ryobitoolsusa", measured live with the widget injected
 * (1440 / 1024 / 768 / 390). It is the last section before the footer and full-bleed:
 *   >=1024  five 9:16 tiles across, 43px inset each side   (266x473 at 1440, 183x325 at 1024)
 *   768     three across, 80px inset                       (199x353)
 *   <768    one 267x475 tile, centred, neighbours peeking
 * 6px gap and a 10px radius throughout. The caption is on every tile at rest; hover fades the
 * tile (opacity, 0.5s ease-in-out) instead of zooming it, so these tiles are not zoom cards.
 * ============================================================ */
.aeri-home-native .aeri-native-social-grid{--aeri-social-edge:43px;--aeri-social-gap:6px;--aeri-social-per:5;max-width:none;margin:0;padding:48px 0;background:none}
/* The selector order matters: .aeri-storefront is the ancestor of .aeri-home-native, and the pair
 * keeps this at the 0-2-0 depth of the blanket h2 rule on home-native.css:9 so it wins on source
 * order. Reference h2: headline-lg, 700 28/30 uppercase, 32px below; 24/28 and 24px under 1024. */
.aeri-storefront .aeri-home-native .aeri-native-social-heading{color:var(--aeri-black);font:700 28px/30px Jost,Arial,sans-serif;text-align:center;text-transform:uppercase;letter-spacing:0;margin:0 0 32px;padding:0 var(--aeri-gutter,16px)}
.aeri-home-native .aeri-native-social-stage{position:relative}
.aeri-home-native .aeri-native-social-tiles{display:flex;gap:var(--aeri-social-gap);margin:0;padding:0 var(--aeri-social-edge);list-style:none;overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x mandatory;scroll-padding-inline:var(--aeri-social-edge);scrollbar-width:none}
.aeri-home-native .aeri-native-social-tiles::-webkit-scrollbar{display:none}
.aeri-home-native .aeri-native-social-item{flex:0 0 calc((100% - (var(--aeri-social-per) - 1) * var(--aeri-social-gap)) / var(--aeri-social-per));min-width:0;scroll-snap-align:start;container-type:inline-size}
.aeri-home-native .aeri-native-social-tile{display:block;position:relative;overflow:hidden;aspect-ratio:266/473;border-radius:10px;background:var(--aeri-gray);color:#fff;text-decoration:none;transition:opacity .5s ease-in-out}
.aeri-home-native .aeri-native-social-tile img{display:block;width:100%;height:100%;object-fit:cover}
/* Hover lives on the item, not on an a: a tile without a link renders as a div and must fade too. */
@media(hover:hover){.aeri-home-native .aeri-native-social-item:hover .aeri-native-social-tile{opacity:.5}}
.aeri-home-native .aeri-native-social-tile:focus-visible{outline:3px solid var(--aeri-lime);outline-offset:-3px}
/* Caption type scales with the tile (cqi), not the viewport: the reference reads ~20/30 on a 266px
 * tile and the tile is narrowest at 1024, not at 390. */
.aeri-home-native .aeri-native-social-caption{position:absolute;inset:auto 0 0;padding:clamp(10px,5.6cqi,15px);padding-top:clamp(40px,24cqi,72px);background:linear-gradient(transparent,rgba(0,0,0,.62));color:#fff;font:400 clamp(13px,7.5cqi,20px)/1.5 Roboto,Arial,sans-serif;pointer-events:none}
.aeri-home-native .aeri-native-social-caption>span{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4;overflow:hidden}
/* Bare chevron centred on the tiles: 40px flush to the edge, 30px and 23px in below 1024, 14px in
 * on phones. Every box property is set because the theme's button rules otherwise paint a filled
 * button here. */
.aeri-storefront .aeri-home-native .aeri-native-social-arrow{position:absolute;top:50%;z-index:3;display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;min-width:0;margin:0;padding:0;border:0;border-radius:0;background:transparent;box-shadow:none;color:var(--aeri-black);cursor:pointer;transform:translateY(-50%);transition:opacity .2s}
.aeri-storefront .aeri-home-native .aeri-native-social-arrow[hidden]{display:none}
.aeri-storefront .aeri-home-native .aeri-native-social-arrow:hover{background:transparent;color:var(--aeri-black);opacity:.6}
.aeri-storefront .aeri-home-native .aeri-native-social-arrow:focus-visible{outline:2px solid var(--aeri-black);outline-offset:-2px}
/* Below 1024 the chevron sits over the peeking photo; a faint white halo keeps it legible there. */
.aeri-storefront .aeri-home-native .aeri-native-social-arrow svg{width:100%;height:100%;filter:drop-shadow(0 0 1.5px rgba(255,255,255,.95))}
.aeri-home-native .aeri-native-social-arrow--next{right:0}
.aeri-home-native .aeri-native-social-arrow--prev{left:0}
.aeri-home-native .aeri-native-social-arrow--prev svg{transform:scaleX(-1)}
/* At >=1024 the reference shows exactly five tiles: the 43px insets stay white and the chevron sits
 * on white. Below that the next tile peeks to the screen edge under the chevron. clip-path hides the
 * overflow without touching layout or scroll positions. */
@media(min-width:1024px){.aeri-home-native .aeri-native-social-tiles{clip-path:inset(-20px var(--aeri-social-edge))}}
@media(max-width:1023px){
  .aeri-home-native .aeri-native-social-grid{--aeri-social-edge:80px;--aeri-social-per:3}
  .aeri-storefront .aeri-home-native .aeri-native-social-heading{font-size:24px;line-height:28px;margin-bottom:24px}
  .aeri-storefront .aeri-home-native .aeri-native-social-arrow{width:30px;height:30px}
  .aeri-home-native .aeri-native-social-arrow--next{right:23px}
  .aeri-home-native .aeri-native-social-arrow--prev{left:23px}
}
@media(max-width:767px){
  .aeri-home-native .aeri-native-social-grid{--aeri-social-edge:calc((100% - 267px) / 2)}
  .aeri-home-native .aeri-native-social-item{flex-basis:267px;scroll-snap-align:center}
  .aeri-home-native .aeri-native-social-arrow--next{right:14px}
  .aeri-home-native .aeri-native-social-arrow--prev{left:14px}
}
/* The zoom cards deliberately do NOT appear here.
 *
 * They used to: the transform was dropped and a shadow substituted, on the reasoning that a
 * shadow appearing is a state change rather than motion. That was wrong for these three sections
 * for two reasons. The reference zooms its pods unconditionally — measured at 1440, its media
 * still goes 332 -> 348.6 with `transition-duration: 0.3s` intact under prefers-reduced-motion,
 * and its markup contains no such media query at all. And our version was indistinguishable from
 * a bug: on a machine with the OS animation toggle off, hovering a card produced a shadow and no
 * movement, which reads as "hover is broken", not as an accessibility accommodation.
 *
 * Only the editorial band keeps the reduction, because only it uses the long asymmetric lift
 * (1.025 over 420ms) that is actually a vestibular trigger. Its 1px border still gives hover a
 * visible state change when the transform is dropped. */
@media(prefers-reduced-motion:reduce){
  .aeri-home-native .aeri-native-editorial-card{transition:none}
  .aeri-home-native .aeri-native-editorial-card:hover,.aeri-home-native .aeri-native-editorial-card:focus-within{transform:none}
  .aeri-home-native .aeri-native-social-tile{transition:none}
}

/* ============================================================
 * Product spotlight (ProductSpotlight.php)
 *
 * Measured from the reference's product-slider section: two 50/50 columns at >=1200, the whole
 * card 56.9rem (569px) tall at 1440 and 6px radius, copy centred with 94px side padding, title
 * capped at 517px and body at 41ch, vertical dots at the right edge. Below 1200 the columns
 * stack and the dots move under the card.
 *
 * The card owns the height and the image is absolutely positioned inside the media slot. Letting
 * the image size the grid item is the EditorialCards failure: it rendered at the file's intrinsic
 * height and made the band ~1000px tall.
 *
 * The h2 rule is scoped to .aeri-storefront .aeri-home-native to outrank the blanket heading rule
 * in home-native.css (specificity 0-2-0). Written bare it would lose and the title would take the
 * global size, which reads as "the style never loaded".
 * ============================================================ */
/* The reference card measures 1340 at 1440, 1820 at 1920 and still 1820 at 2560 - its container
 * tops out at 1820, while ours topped out at 1440 and looked shrunken on wide monitors. The hero
 * and category bands already run wider than the content grid, so this band can too. Below 1440 the
 * old cap never applied; this changes nothing on laptops and phones. */
.aeri-storefront .aeri-home-native .aeri-native-spotlight{position:relative;max-width:1820px;padding-top:clamp(20px,3vw,48px);padding-bottom:clamp(20px,3vw,48px)}
/* The reference's card reads as a card because its page background is grey; this page is white,
 * so a 1px hairline supplies the same edge without turning the band into a grey stripe. */
.aeri-native-spotlight-viewport{overflow:hidden;border:1px solid var(--aeri-gray);border-radius:6px;background:#fff}
.aeri-native-spotlight-track{display:flex}
.aeri-native-spotlight-slide{flex:0 0 100%;min-width:0;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
.aeri-native-spotlight-media{position:relative;overflow:hidden;background:var(--aeri-gray)}
/* The <picture> wrapper is static and inline; positioning it too keeps the img's containing block
 * unambiguous regardless of which markup branch rendered it. */
.aeri-native-spotlight-media picture{position:absolute;inset:0;display:block}
.aeri-native-spotlight-media img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center}
.aeri-native-spotlight-copy{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:32px clamp(22px,6.5vw,94px)}
.aeri-native-spotlight-eyebrow{display:inline-flex;align-items:center;gap:8px;margin:0 0 10px;color:#717171;font:700 10px/1 'Roboto Condensed',Arial,sans-serif;letter-spacing:.14em;text-transform:uppercase}
.aeri-native-spotlight-eyebrow span{width:6px;height:6px;border-radius:50%;background:var(--aeri-clay)}
/* 46px at 1440, measured off the reference: its title is the theme's h2 (~40px), not the 63px
 * editorial heading this page uses for section heads. Matching that keeps the block a product
 * story rather than a second page title. */
.aeri-storefront .aeri-home-native .aeri-native-spotlight h2{max-width:517px;margin:0;color:var(--aeri-black);font-size:clamp(30px,3.2vw,46px);line-height:1.02}
.aeri-native-spotlight-text{max-width:410px;margin:14px 0 0;color:var(--aeri-muted);font-size:clamp(15px,1.4vw,20px);line-height:1.45}
.aeri-native-spotlight-product{display:flex;align-items:center;gap:14px;width:100%;margin-top:clamp(24px,4vw,64px);padding:10px 14px;border-radius:6px;background:#f4f4f2;color:var(--aeri-black);text-decoration:none;text-align:left;transition:background-color var(--aeri-motion) var(--aeri-ease)}
.aeri-native-spotlight-product:hover{background:#ececea}
.aeri-native-spotlight-product:focus-visible{outline:2px solid var(--aeri-black);outline-offset:2px}
.aeri-native-spotlight-thumb{flex:0 0 70px;width:70px;height:70px;display:grid;place-items:center;overflow:hidden;border-radius:4px;background:#fff}
.aeri-native-spotlight-thumb img{width:100%;height:100%;object-fit:contain}
.aeri-native-spotlight-info{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1 1 auto}
.aeri-native-spotlight-brand{color:var(--aeri-muted);font:700 10px/1.2 'Roboto Condensed',Arial,sans-serif;letter-spacing:.08em;text-transform:uppercase}
.aeri-native-spotlight-name{font:600 14px/1.25 Jost,Arial,sans-serif;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.aeri-native-spotlight-spec{color:var(--aeri-muted);font-size:12px;line-height:1.3}
.aeri-native-spotlight-buy{display:flex;flex-direction:column;align-items:flex-end;gap:4px;flex:0 0 auto;margin-left:auto}
.aeri-native-spotlight-price{font:700 18px/1 Jost,Arial,sans-serif;white-space:nowrap}
/* clay-text, not clay: #f06a2e on the row's #f4f4f2 measures 2.8:1. The deepened clay is 4.7:1. */
.aeri-native-spotlight-stock{color:var(--aeri-clay-text);font:700 10px/1 'Roboto Condensed',Arial,sans-serif;letter-spacing:.08em;text-transform:uppercase}
.aeri-native-spotlight-price del{color:var(--aeri-muted);font-size:14px;font-weight:400}
.aeri-native-spotlight-price ins{text-decoration:none}
.aeri-native-spotlight-controls{position:absolute;right:calc(var(--aeri-gutter,32px) + 32px);top:50%;transform:translateY(-50%);display:flex;flex-direction:column;align-items:center;gap:10px;z-index:2}
.aeri-native-spotlight-dots{display:flex;flex-direction:column;gap:0}
/* Hollow rings, as on the reference (its bullets are 30px boxes around a 24px SVG ring), not solid
 * dots. The 30px box is the hit area; the 2px inset keeps a visible gap between rings. The inactive
 * ring is #8a8d87 rather than the reference's paler grey because 1.4.11 needs 3:1 for the control
 * itself (that is 3.4:1); the active ring uses the deepened clay, which is 4.7:1. */
.aeri-native-spotlight-dots button{position:relative;width:30px;height:30px;padding:0;border:0;background:transparent;cursor:pointer}
.aeri-native-spotlight-dots button::after{content:"";position:absolute;inset:2px;border:2px solid #8a8d87;border-radius:50%;transition:border-color var(--aeri-motion) var(--aeri-ease)}
.aeri-native-spotlight-dots button:hover::after{border-color:var(--aeri-black)}
.aeri-native-spotlight-dots button[aria-current="true"]::after{border-color:var(--aeri-clay-text)}
.aeri-native-spotlight-dots button:focus-visible{outline:2px solid var(--aeri-black);outline-offset:2px}
@media(min-width:1200px){.aeri-native-spotlight-slide{height:clamp(480px,39.5vw,569px)}}
@media(max-width:1199px){
  .aeri-native-spotlight-slide{grid-template-columns:minmax(0,1fr)}
  .aeri-native-spotlight-media{aspect-ratio:5/3}
  .aeri-native-spotlight-copy{padding:28px 24px 34px}
  .aeri-native-spotlight-controls{position:static;transform:none;flex-direction:row;justify-content:center;gap:12px;margin-top:16px}
  .aeri-native-spotlight-dots{flex-direction:row}
}
@media(max-width:767px){.aeri-native-spotlight-media{aspect-ratio:4/3}}

/* ============================================================
 * Benefit band (BenefitBand.php)
 *
 * Four equal columns split by 1px vertical rules, each a round icon badge plus title and copy.
 * The reference puts this on a grey band; this page is white, so the rules do the dividing. The
 * width matches the spotlight below it (1820), which is the band it belongs to.
 *
 * The h2 rule needs the .aeri-storefront .aeri-home-native prefix: the blanket heading rule in
 * home-native.css is 0-2-0 and would otherwise own the title size and spacing.
 * ============================================================ */
.aeri-storefront .aeri-home-native .aeri-native-benefits{max-width:1820px;padding-top:clamp(24px,3.4vw,56px);padding-bottom:clamp(24px,3.4vw,56px)}
.aeri-native-benefits-list{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:0;margin:0;padding:0;list-style:none}
.aeri-native-benefit{display:flex;align-items:flex-start;gap:16px;min-width:0;padding:0 clamp(14px,1.8vw,28px);border-left:1px solid var(--aeri-line)}
.aeri-native-benefit:first-child{border-left:0;padding-left:0}
.aeri-native-benefit:last-child{padding-right:0}
.aeri-native-benefit-icon{flex:0 0 54px;width:54px;height:54px;display:grid;place-items:center;border-radius:50%;background:rgba(240,106,46,.10);color:var(--aeri-clay-text)}
.aeri-native-benefit-icon svg{width:26px;height:26px}
/* 19.2px at 1440 and 21.6px at 1920 - measured off the reference. Anything larger wraps
 * "Our Promise + Warranty" and drops that column's body a line below its neighbours. */
.aeri-storefront .aeri-home-native .aeri-native-benefit h2{margin:0 0 6px;color:var(--aeri-black);font-size:clamp(17px,1.33vw,21.6px);line-height:1.15;letter-spacing:-.02em}
.aeri-native-benefit p{margin:0;color:var(--aeri-muted);font-size:15px;line-height:1.45}
@media(max-width:1199px){
  .aeri-native-benefits-list{grid-template-columns:repeat(2,minmax(0,1fr));row-gap:28px}
  .aeri-native-benefit{border-left:0;padding:0}
  .aeri-native-benefit:nth-child(even){border-left:1px solid var(--aeri-line);padding-left:24px}
}
@media(max-width:767px){
  .aeri-native-benefits-list{grid-template-columns:minmax(0,1fr);row-gap:24px}
  .aeri-native-benefit:nth-child(even){border-left:0;padding-left:0}
  .aeri-native-benefit-icon{flex-basis:48px;width:48px;height:48px}
}

/* ============================================================
 * Bestsellers grid (section type `bestsellers`, Bestsellers.php)
 *
 * Measured on the reference at a 2560px viewport (computed styles, not eyeballed):
 *
 *   container     1920px, 50px side padding -> 1820 of content
 *   grid          6 columns of 297, gap 8px
 *   info cell     spans 2 columns, white, radius 6, padding 64/64/80
 *   kicker        12/15.6 700, letter-spacing .48px, uppercase, margin-bottom 8
 *   heading       48/48 700, letter-spacing -.96px, margin-bottom 16
 *   body copy     12/15.6 400, margin-bottom 56
 *   button        13/13 700, 2px border, radius 4, height 45, padding 0 20
 *   card white    297x563, radius 6, no border; image square with 23px inset
 *   card body     16px 30px 24px; title 12/18 700; rating row 8/6 margins;
 *                 price 16/24 700; option pills below
 *   badge         13px, padding 2px 8px, radius 2, inset 10px
 *   add-to-cart   absolute bar 237x45, radius 4, revealed on hover
 *
 * The reference page itself is #f7f7f7, so the band carries that surface and the tiles are white;
 * on AERI's white page the band edge is visible, which is the price of the 1:1 match.
 */
.aeri-native-bestsellers{max-width:none;margin:0;background:var(--aeri-white);padding:0 0 32px}
.aeri-native-bestsellers-inner{max-width:1920px;margin:0 auto;padding:0 50px}
.aeri-native-bestsellers-head{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:32px;min-height:300px;background:var(--aeri-white);border:1px solid #e6e6e6;padding:36px 48px;margin:0 0 8px}
.aeri-storefront .aeri-home-native .aeri-native-bestsellers-head h2{margin:0 0 12px;font-size:40px;line-height:42px;letter-spacing:-.8px;font-weight:700}
.aeri-native-bestsellers-head .aeri-native-kicker{margin:0 0 8px;color:var(--aeri-black);font:700 12px/15.6px Jost,Arial,sans-serif;letter-spacing:.48px;text-transform:uppercase}
.aeri-native-bestsellers-head p:not(.aeri-native-kicker){margin:0;max-width:720px;color:var(--aeri-black);font-size:14px;line-height:20px}
.aeri-native-bestsellers-link{display:inline-flex;align-items:center;justify-content:center;height:45px;min-height:45px;padding:0 20px;margin:0;border:2px solid var(--aeri-black);border-radius:4px;background:transparent;color:var(--aeri-black);text-decoration:none;font:700 13px/13px Jost,Arial,sans-serif;transition:background var(--aeri-motion) var(--aeri-ease),color var(--aeri-motion) var(--aeri-ease)}
.aeri-native-bestsellers-link:hover,.aeri-native-bestsellers-link:focus-visible{background:var(--aeri-black);color:var(--aeri-white)}
.aeri-native-bestsellers-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px;align-items:stretch}
.aeri-native-bestsellers-grid--2{grid-template-columns:repeat(2,minmax(0,1fr))}
.aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-card-body{padding:18px 20px}
.aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-card-body h3{font-size:16px;line-height:22px}
.aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-price{font-size:20px;line-height:26px}
.aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-cta{height:40px;font-size:13px;margin-top:14px}
@media(min-width:768px){
  .aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-card-media{height:350px;aspect-ratio:auto}
}
.aeri-native-bestsellers-card{display:flex;flex-direction:column;min-width:0;background:var(--aeri-white);border:1px solid #e6e6e6;border-radius:0}
.aeri-native-bestsellers-card-media{position:relative;flex:0 0 auto;aspect-ratio:1/1;background:var(--aeri-white);border-radius:0}
.aeri-native-bestsellers-card-link{position:absolute;inset:0;display:block;padding:9px;overflow:hidden}
.aeri-native-bestsellers-media-stack{position:relative;display:block;width:100%;height:100%}
.aeri-native-bestsellers-media-stack img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;transition:opacity var(--aeri-motion) var(--aeri-ease)}
.aeri-native-bestsellers-media-stack .aeri-native-bestsellers-img--alt{opacity:0}
.aeri-native-bestsellers-card:hover .aeri-native-bestsellers-img--alt,.aeri-native-bestsellers-card:focus-within .aeri-native-bestsellers-img--alt{opacity:1}
.aeri-native-bestsellers-badge{position:absolute;top:10px;left:10px;z-index:1;display:inline-flex;align-items:center;padding:2px 8px;border-radius:2px;background:var(--aeri-lime);color:var(--aeri-black);font:700 13px/15px Jost,Arial,sans-serif;letter-spacing:.02em;text-transform:uppercase}
.aeri-native-bestsellers-card-body{display:flex;flex-direction:column;flex:1;padding:18px 20px 20px}
.aeri-native-bestsellers-card-body h3{margin:0;font-size:14px;line-height:20px;font-weight:700}
.aeri-native-bestsellers-card-body h3 a{color:var(--aeri-black);text-decoration:none}
.aeri-native-bestsellers-card-body h3 a:hover{text-decoration:underline}
.aeri-native-bestsellers-rating{display:flex;align-items:center;gap:6px;margin:8px 0 6px;font-size:12px;line-height:26px}
.aeri-native-bestsellers-rating .aeri-stars{font-size:14px;line-height:1}
.aeri-native-bestsellers-price{display:flex;align-items:baseline;gap:8px;margin:0;font-size:18px;line-height:26px;font-weight:700}
.aeri-native-bestsellers-price ins{order:1;background:none;color:var(--aeri-lime-text);text-decoration:none}
.aeri-native-bestsellers-price del{order:2;font-size:13px;line-height:19.5px;font-weight:700;color:#111}
.aeri-native-bestsellers-cta{display:inline-flex;align-items:center;justify-content:space-between;gap:8px;width:100%;height:42px;margin:18px 0 0;padding:0 16px;border:1px solid var(--aeri-black);color:var(--aeri-black);text-decoration:none;font:700 12px/1 Jost,Arial,sans-serif;transition:background var(--aeri-motion) var(--aeri-ease),color var(--aeri-motion) var(--aeri-ease)}
.aeri-native-bestsellers-cta:hover,.aeri-native-bestsellers-cta:focus-visible{background:var(--aeri-black);color:var(--aeri-lime)}
.aeri-native-bestsellers .aeri-toolkit-options{margin:10px 0 0}
.aeri-native-bestsellers .aeri-toolkit-pills{flex-direction:column;gap:4px}
.aeri-native-bestsellers .aeri-toolkit-pill{justify-content:center;min-height:32px;padding:4px 8px;border-radius:2px;font-size:12px;line-height:16px;text-align:center}
@media(max-width:1199px){
  .aeri-native-bestsellers-inner{padding:0 24px}
  .aeri-native-bestsellers-head{padding:28px 32px;gap:24px;min-height:240px}
  .aeri-storefront .aeri-home-native .aeri-native-bestsellers-head h2{font-size:34px;line-height:36px;letter-spacing:-.6px}
  .aeri-native-bestsellers-grid{grid-template-columns:repeat(4,minmax(0,1fr))}
  .aeri-native-bestsellers-grid--2{grid-template-columns:repeat(2,minmax(0,1fr))}
  .aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-card-body{padding:18px 20px}
  .aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-card-body h3{font-size:16px;line-height:22px}
  .aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-price{font-size:20px;line-height:26px}
  .aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-cta{height:40px;font-size:13px;margin-top:14px}
  .aeri-native-bestsellers-card-body{padding:16px 18px 18px}
  .aeri-native-bestsellers-card-body h3{font-size:13px;line-height:19px}
  .aeri-native-bestsellers-price{font-size:16px;line-height:24px}
}
@media(max-width:767px){
  .aeri-native-bestsellers-inner{padding:0 12px}
  .aeri-native-bestsellers-head{grid-template-columns:1fr;gap:18px;padding:28px 24px;min-height:0}
  .aeri-storefront .aeri-home-native .aeri-native-bestsellers-head h2{font-size:30px;line-height:32px;letter-spacing:-.6px}
  .aeri-native-bestsellers-head p:not(.aeri-native-kicker){font-size:13px;line-height:18px}
  .aeri-native-bestsellers-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
  .aeri-native-bestsellers-card-link{padding:9px}
  .aeri-native-bestsellers-card-body{padding:12px 14px 16px}
  .aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-card-body{padding:12px 14px 16px}
  .aeri-native-bestsellers-card-body h3{font-size:12px;line-height:17px}
  .aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-card-body h3{font-size:12px;line-height:17px}
  .aeri-native-bestsellers-price{font-size:15px;line-height:22px}
  .aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-price{font-size:15px;line-height:22px}
  .aeri-native-bestsellers-cta{height:38px;font-size:11px;margin-top:14px}
  .aeri-native-bestsellers-grid--2 .aeri-native-bestsellers-cta{height:38px;font-size:11px;margin-top:14px}
}
