/* product detail page
   Part of the split style.css. inc/enqueue.php enqueues each file as
   its own <link>, in filename order -- they are NOT concatenated, so a
   comment or a rule cut across the join does not heal at the seam. It
   breaks both files, and the browser drops everything it cannot parse
   without saying so. Keep every construct whole inside one file.
   Source order is still the cascade, so moving a rule between files
   can change which one wins. */

.pet-pdp-price { color: var(--pet-text); font-size: clamp(2rem, 4vw, 3.25rem); font-weight: 900; letter-spacing: -.04em; margin: .55rem 0 .5rem; }
/* The variant row must contain its <select> whatever the options say. An
   aquaristic option can be a model name plus an appended supplier code
   ("SunSun HW-702A · HW702A" and longer), and a flex child's min-width
   defaults to its content, so on a narrow Hebrew page the select's
   min-content width pushed the row -- and with it the document -- wider
   than the viewport. min-width: 0 lets the control shrink to the room the
   row actually has, max-width pins it inside that room, flex: 1 1 auto
   gives it the rest of the line after the label, and flex-wrap drops it
   under the label as a full-width control where even that is not enough.
   The browser elides long option text inside the closed control; the
   opened list still shows every option in full, so nothing is truncated
   away from the visitor. min-height keeps it a comfortable touch target
   (44px is the project's mobile baseline -- see 10-header.css's 44px
   controls). */
.pet-pdp-variant-field { align-items: center; display: flex; flex-wrap: wrap; gap: .6rem; margin: .6rem 0 0; }
.pet-pdp-variant-field label { color: var(--pet-muted); flex: 0 0 auto; font-size: .82rem; font-weight: 800; }
.pet-pdp-variant-select { background: var(--pet-surface); border: 1px solid var(--pet-border-input); border-radius: 10px; color: var(--pet-text); flex: 1 1 auto; font: inherit; max-width: 100%; min-height: 44px; min-width: 0; padding: .45rem .7rem; }
.pet-pdp-note { color: var(--pet-muted); line-height: 1.55; margin: 0 0 1.35rem; }

/* The four key facts, between the price and the action. A two-by-two block of
   label-over-value pairs: the value is the thing being read, so it carries the
   weight, and the label sits above it small and quiet.

   [hidden] is stated for the block as well as inherited: the variant selector
   sets it when the chosen member of a family states fewer than two facts, and
   a later edit that gives this section a `display` of its own would otherwise
   beat the browser's own [hidden] rule and leave an empty frame on the page --
   the trap AGENTS.md records for .pet-pdp-specs, written down here before it
   can happen rather than after. */
.pet-pdp-key-specs-block { margin: .3rem 0 1.25rem; }
.pet-pdp-key-specs-block[hidden] { display: none; }
.pet-pdp-key-specs { display: grid; gap: .8rem 1.2rem; grid-template-columns: repeat(2, minmax(0, 1fr)); margin: 0; }
.pet-pdp-key-specs > div { border-top: 1px solid var(--pet-border); min-width: 0; padding-top: .5rem; }
.pet-pdp-key-specs dt { color: var(--pet-muted); font-size: .74rem; font-weight: 800; letter-spacing: .02em; line-height: 1.3; }
/* overflow-wrap for the same reason the full table states it: a value can be
   an unbroken article number or a flow rate with no space in it, and a phone
   column is 150px wide. */
.pet-pdp-key-specs dd { color: var(--pet-text); font-size: .95rem; font-weight: 800; line-height: 1.35; margin: .15rem 0 0; overflow-wrap: anywhere; }
.pet-pdp-key-specs-more { margin: .8rem 0 0; }
.pet-pdp-key-specs-more a { color: var(--pet-primary); font-size: .82rem; font-weight: 800; text-decoration: underline; }
.pet-pdp-key-specs-more a:hover { color: var(--pet-primary-hover); }

/* One dominant action, one quiet alternative beside it. The primary takes the
   room that is left; WhatsApp is sized by its own label and is an outline
   rather than a fill, so the two never read as a pair of equals. */
.pet-pdp-actions { align-items: stretch; display: flex; flex-wrap: wrap; gap: .7rem; }
.pet-pdp-actions .pet-button { align-items: center; display: inline-flex; flex: 1 1 240px; justify-content: center; min-height: 56px; text-align: center; }
/* --pet-whatsapp-hover on both the border and the label, not --pet-whatsapp:
   the lighter tone measures 3.46 against white, which clears the 3:1 a
   component boundary owes and misses the 4.5:1 this .85rem word owes. The
   darker tone measures 4.72 both ways round, so it carries the label at rest
   and the white label on hover. */
.pet-pdp-cta-whatsapp { align-items: center; background: var(--pet-surface); border: 1px solid var(--pet-whatsapp-hover); border-radius: 999px; color: var(--pet-whatsapp-hover); display: inline-flex; flex: 0 0 auto; font-size: .85rem; font-weight: 800; justify-content: center; min-height: 56px; padding: 0 1.4rem; text-decoration: none; }
.pet-pdp-cta-whatsapp:hover { background: var(--pet-whatsapp-hover); border-color: var(--pet-whatsapp-hover); color: var(--pet-surface); }
.pet-pdp-consult-note { color: var(--pet-text-secondary); font-size: .82rem; line-height: 1.5; margin: .85rem 0 0; }
.pet-pdp-consult-note strong { color: var(--pet-text); }

/* The order form, no longer inside the purchase column. Constrained rather
   than full-bleed: a two-field form stretched across 1180px is a worse form
   than a narrow one, and the band it sits in is a step on the way down the
   page, not a section of its own. */
.pet-pdp-order { margin: clamp(1.5rem, 4vw, 2.75rem) 0 0; max-width: 720px; }
.pet-pdp-trust { border-bottom: 1px solid var(--pet-border); border-top: 1px solid var(--pet-border); display: grid; gap: .6rem; grid-template-columns: repeat(3, 1fr); margin-top: 1.6rem; padding: 1rem 0; }
.pet-pdp-trust div { align-items: center; display: flex; gap: .45rem; }
.pet-pdp-trust strong { color: var(--pet-success); font-size: 1.1rem; }
.pet-pdp-trust span { color: var(--pet-muted); font-size: .72rem; line-height: 1.25; }
/* .pet-pdp-consult carries NO appearance of its own any more. It used to be a
   card holding an advice line and a WhatsApp button; the 2026-08-29 layout
   replaced that with one dominant action and a quiet alternative in
   .pet-pdp-actions, and the class stayed on that row for one reason only:
   assets/analytics.js reports a WhatsApp click's location by asking
   link.closest('.pet-pdp-consult'), and it is the only thing that tells
   "product_page" apart from the floating button and the calculator. Dropping
   the class would not break a page -- it would silently reclassify every
   product-page WhatsApp click as "other". So the hook is kept and the paint is
   gone; do not give this selector a look again, or it will fight
   .pet-pdp-actions for the same box. */

/* THE PRODUCT SECTIONS: one markup, two shapes.
   product-detail.php emits a disclosure group -- a heading with a real
   <button> per section, followed in the DOM by the region that button opens.
   That order is the accordion, and it is the order the tab key and a screen
   reader follow at every width. Everything below turns the same DOM into a tab
   strip from 820px up: `order` lifts the four headings into one row and lays
   the open panel across the row beneath them. No second markup, no per-width
   JavaScript, and nothing that has to be kept in step with a breakpoint in a
   script.

   Closed panels are hidden only once the script has added .is-enhanced. Until
   then every panel is open, so a visitor with no JavaScript reads the whole
   page rather than the one section the previous markup left reachable. */
.pet-pdp-panels { margin-top: clamp(3rem, 7vw, 6rem); }
.pet-pdp-panels.is-enhanced .pet-pdp-panel:not(.is-open) { display: none; }
/* scroll-margin on both halves: the script scrolls to the heading, and a
   visitor arriving on a #returns URL is scrolled to the panel by the browser
   before any of this runs. */
.pet-pdp-tab { margin: 0; scroll-margin-top: 1.5rem; }
.pet-pdp-tab-toggle { align-items: center; background: none; border: 0; border-bottom: 1px solid var(--pet-border); box-sizing: border-box; color: var(--pet-text); cursor: pointer; display: flex; font: inherit; font-size: 1.02rem; font-weight: 800; gap: 1rem; justify-content: space-between; letter-spacing: -.01em; padding: 1.05rem 0 .95rem; text-align: start; width: 100%; }
/* The open/closed mark. Physical borders and a physical rotation on purpose:
   it is a chevron, which points down when a section is closed and up when it
   is open in every language, and is not one of the directional arrows
   50-catalog.css mirrors for Hebrew. It is a pseudo-element, so it is never
   announced and never needs a translation. The margin corrects for the ink
   sitting in one half of the rotated square: below centre when it points down,
   above it when it points up. */
.pet-pdp-tab-toggle::after { border-bottom: 2px solid currentColor; border-right: 2px solid currentColor; content: ""; flex: 0 0 auto; height: 8px; margin-top: -3px; transform: rotate(45deg); width: 8px; }
.pet-pdp-tab-toggle[aria-expanded="true"]::after { margin-top: 3px; transform: rotate(-135deg); }
.pet-pdp-tab-toggle:hover { color: var(--pet-primary); }
.pet-pdp-panel { padding: 1.1rem 0 1.6rem; scroll-margin-top: 1.5rem; }

@media (min-width: 820px) {
  /* The tab shape. The headings are order:1 and share the first flex line; a
     panel is order:2 and takes a whole line of its own, so the open one is
     drawn across the full width under the strip and the closed ones are
     display:none and out of the flow entirely. */
  .pet-pdp-panels { display: flex; flex-wrap: wrap; }
  /* Fills whatever the headings leave of the strip's line so the rule under
     the tabs runs the full width instead of stopping at the last name. */
  .pet-pdp-panels::after { border-bottom: 1px solid var(--pet-border); content: ""; flex: 1 1 0; min-width: 0; order: 1; }
  .pet-pdp-tab { border-bottom: 1px solid var(--pet-border); flex: 0 0 auto; order: 1; padding-inline-end: clamp(1rem, 4vw, 3rem); }
  /* The active mark is a 3px border that is transparent at rest, not a border
     that appears: a width that changes with the state would move every tab
     beside it by 2px on every click. margin-bottom pulls it over the 1px rule
     the heading draws, which is what makes the active tab look joined to its
     panel. */
  .pet-pdp-tab-toggle { border-bottom: 3px solid transparent; color: var(--pet-muted); font-size: .88rem; margin-bottom: -1px; padding: 1.1rem 0 .85rem; width: auto; }
  .pet-pdp-tab-toggle::after { display: none; }
  .pet-pdp-tab-toggle:hover, .pet-pdp-tab-toggle.is-active { border-bottom-color: var(--pet-primary); color: var(--pet-text); }
  .pet-pdp-panel { flex: 0 0 100%; min-width: 0; order: 2; padding: clamp(2rem, 4vw, 3rem) 0 0; }
}
.pet-pdp-section-heading h2 { font-size: clamp(1.55rem, 3vw, 2.3rem); letter-spacing: -.04em; margin: 0; }
.pet-pdp-description-copy { line-height: 1.75; max-width: 720px; }
.pet-pdp-characteristics { color: var(--pet-text); display: grid; gap: .5rem; margin: 0 0 1.1rem; padding-inline-start: 1.2rem; }
.pet-pdp-characteristics li { font-size: .92rem; line-height: 1.55; }
/* The specification table in #specifications. A <dl> of parameter/value pairs,
   one wrapper <div> per pair so the grid can place a label beside its value
   and still stack them on a phone. */
.pet-pdp-specs-copy { line-height: 1.75; max-width: 720px; }
.pet-pdp-specs { display: grid; margin: 0 0 1.1rem; }
.pet-pdp-specs > div { border-bottom: 1px solid var(--pet-border); display: grid; gap: .15rem 1.5rem; padding: .65rem 0; }
.pet-pdp-specs > div:last-child { border-bottom: 0; }
.pet-pdp-specs dt { color: var(--pet-muted); font-size: .86rem; }
/* A supplier value can be a whole composition line ("злаки, семена, овощи,
   ...") and must wrap rather than force the row wide; overflow-wrap covers the
   opposite case, an unbroken article number or a URL-shaped code. */
.pet-pdp-specs dd { color: var(--pet-text); font-size: .92rem; line-height: 1.55; margin: 0; overflow-wrap: anywhere; }
@media (min-width: 640px) {
  .pet-pdp-specs > div { grid-template-columns: minmax(150px, 32%) minmax(0, 1fr); }
}
/* The variant selector hides these two lists by setting .hidden when the newly
   chosen model has no rows. `display: grid` above is an author declaration and
   beats the browser's own [hidden] { display: none }, so without this pair the
   attribute is set and nothing disappears -- the same trap the characteristics
   list has carried since the selector was written. */
.pet-pdp-specs[hidden], .pet-pdp-characteristics[hidden] { display: none; }
.pet-pdp-source-note { color: var(--pet-muted); font-size: .82rem; }
/* auto-fit, not repeat(3, 1fr): the delivery panel holds two cards and the
   returns panel one, so a fixed three-track grid left a third of the row empty
   on one and two thirds on the other. An empty track collapses here and the
   cards that exist share the width. No padding-top of its own any more -- the
   panel it now sits inside carries the space. */
.pet-pdp-info-grid { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.pet-pdp-info-grid article { background: var(--pet-surface); border: 1px solid var(--pet-border); border-radius: 20px; padding: 1.4rem; }
/* h3, not h2: the panel's own name is the heading on the button that opens it,
   so a card inside it is one rank down. */
.pet-pdp-info-grid h3 { font-size: 1.15rem; margin: 1rem 0 0; }
.pet-pdp-info-grid p { color: var(--pet-muted); font-size: .9rem; line-height: 1.6; margin-bottom: 0; }
.pet-pdp-returns-card { grid-column: 1 / -1; }
/* One column, not two. This block used to hold the whole seven-paragraph
   return policy and needed the newspaper columns to stop being a wall; it now
   holds two or three short paragraphs, and a measure of about 80 characters
   reads better than two 40-character columns for that much text. */
.pet-pdp-legal-copy { color: var(--pet-muted); font-size: .86rem; line-height: 1.65; margin-top: 1rem; max-width: 760px; }
.pet-pdp-legal-copy p { margin: 0 0 .9rem; }
.pet-pdp-legal-copy strong { color: var(--pet-text); }
/* The link to the full text. A text link and not a button: the policy is
   reference material, and a second filled control on this page would be
   competing with the one action the first screen is built around. */
.pet-pdp-legal-link { margin: 0; }
.pet-pdp-legal-link a { color: var(--pet-primary); font-size: .88rem; font-weight: 800; text-decoration: underline; }
.pet-pdp-legal-link a:hover { color: var(--pet-primary-hover); }
.pet-pdp-icon { align-items: center; background: var(--pet-primary-soft); border-radius: 50%; color: var(--pet-primary); display: inline-flex; font-size: 1.2rem; font-weight: 900; height: 42px; justify-content: center; width: 42px; }
/* Brand badges, not text meant to be read or copied -- a long-press on
   mobile was selecting "VISA mastercard  Pay G Pay bit" and popping the
   OS's Copy/Search bubble over them. user-select stops the selection
   starting; pointer-events stays untouched since aria-label already carries
   the equivalent text for anyone using a screen reader. */
.pet-payment-methods { display: flex; flex-wrap: wrap; gap: .45rem; margin-top: 1rem; user-select: none; -webkit-user-select: none; }
.pet-payment-methods span { align-items: center; background: var(--pet-surface); border: 1px solid var(--pet-border); border-radius: 6px; color: var(--pet-text); display: inline-flex; font-size: .68rem; font-weight: 900; min-height: 28px; padding: 0 .5rem; }
.pet-payment-methods span:nth-child(1) { color: #1434cb; font-style: italic; }
.pet-payment-methods span:nth-child(2) { background: linear-gradient(90deg, #eb001b 0 50%, #f79e1b 50%); background-clip: text; color: transparent; font-size: .62rem; }
.pet-payment-methods span:nth-child(3) { color: #111; }
.pet-payment-methods span:nth-child(4) { color: #4285f4; }
.pet-payment-methods span:nth-child(5) { color: #1677ff; }
.pet-pdp-related { padding-top: clamp(3.5rem, 7vw, 6rem); }
.pet-pdp-section-heading { align-items: baseline; display: flex; justify-content: space-between; margin-bottom: 1.2rem; }
.pet-pdp-section-heading a { color: var(--pet-primary); font-size: .85rem; font-weight: 800; text-decoration: none; }
.pet-pdp-related-grid { display: grid; gap: 1rem; grid-template-columns: repeat(4, 1fr); }
.pet-pdp-related-card { border: 1px solid var(--pet-border); border-radius: 16px; color: var(--pet-text); display: flex; flex-direction: column; min-width: 0; overflow: hidden; padding-bottom: 1rem; text-decoration: none; }
.pet-pdp-related-card img { background: var(--pet-surface-muted); height: 170px; object-fit: contain; width: 100%; }
.pet-pdp-related-card strong, .pet-pdp-related-card span { padding: 0 1rem; }
.pet-pdp-related-card strong { font-size: .9rem; line-height: 1.35; margin-top: .8rem; }
.pet-pdp-related-card span { color: var(--pet-text); font-size: 1rem; font-weight: 900; margin-top: .45rem; }

@media (max-width: 820px) {
  .pet-pdp { padding-inline: 14px; }
  /* minmax(0, 1fr), not 1fr: a bare 1fr track's minimum is auto, so one
     child with a wide min-content re-inflates the track past the
     viewport. The child that actually did it is the variant <select> on
     the Hebrew page: Chromium resolves an RTL select's min-content from
     its longest option and, unlike LTR, ignores the min-width: 0 the
     rule above states -- measured 2026-09-02 on family p002-05 at an
     emulated 360, where the one-column page laid out 762px wide.
     Capping the track's minimum at 0 removes the whole class: the
     column is the viewport's width no matter what a child asks for,
     and the children shrink through their own min-width chain. */
  .pet-pdp-hero { grid-template-columns: minmax(0, 1fr); }
  /* The second half of the same Chromium quirk: an explicit width
     anchors the RTL select where the flex shrink alone does not.
     Full-width under its label at these widths -- which is also the
     easier control to hit with a thumb. */
  .pet-pdp-variant-select { width: 100%; }
  .pet-pdp-purchase { max-width: none; }
  .pet-pdp-image { height: min(440px, 75vw); }
  /* One column at these widths, so the thumbnail rail stops being a rail.
     As a vertical column beside the picture (60-legal.css's 76px track) a
     six-frame gallery measures ~450px of thumbnails against a ~290px
     image, and the taller of the two is the gallery's height -- every
     extra frame pushed the price and the primary action further down a
     phone screen. Below the picture as one horizontally scrollable row
     the strip costs a fixed ~76px whatever the frame count. `order`
     works here because the gallery is a grid and its two children are
     grid items; the DOM order (thumbnails first) is unchanged, so focus
     order and the browser-check's selectors see the same document.
     overflow-x on the strip itself: the row scrolls, the document does
     not grow. In RTL the row lays out and scrolls right-to-left on its
     own; nothing to mirror. */
  .pet-pdp-gallery { grid-template-columns: minmax(0, 1fr); }
  .pet-pdp-image-wrap { order: 1; }
  .pet-pdp-thumbnails { flex-direction: row; gap: .55rem; order: 2; overflow-x: auto; padding: 2px; }
  .pet-pdp-thumb { flex: 0 0 auto; }
  .pet-pdp-related-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 520px) {
  /* 48px keeps each frame at ~58px with its padding and border -- still
     over the 44px touch baseline -- while seven of them plus gaps fit a
     360px strip with about one and a half frames peeking past the edge
     to say the row scrolls. */
  .pet-pdp-thumb img { height: 48px; width: 48px; }
  .pet-pdp-image-wrap { min-height: 290px; }
  /* The action row is flex, not grid: a grid-template-columns here would have
     been ignored, which is how the WhatsApp button ended up beside a 150px
     primary on a narrow phone. Stack them by letting both take the whole line
     instead, with the dominant one still first. */
  .pet-pdp-actions .pet-button, .pet-pdp-cta-whatsapp { flex: 1 1 100%; }
  .pet-pdp-related-grid { grid-template-columns: 1fr; }
  .pet-pdp-trust { grid-template-columns: 1fr; }
}

@media (max-width: 780px) {
  body:has(.pet-commerce-page) .wp-block-post-content { margin-inline: 12px !important; width: calc(100% - 24px) !important; }
  .pet-commerce-page { padding-bottom: 110px; }
  .pet-commerce-page .wc-block-components-sidebar-layout { grid-template-columns: minmax(0, 1fr); }
  .pet-commerce-page .wc-block-components-main,
  .pet-commerce-page .wc-block-components-sidebar,
  .pet-commerce-page .wc-block-cart { min-width: 0; max-width: 100%; }
  .pet-commerce-page .wc-block-components-sidebar { padding: 1rem; position: static; }
  .pet-shipping-progress > div { align-items: flex-start; flex-direction: column; }
}

/* Keep the standalone product template aligned with the site-editor header.
   Raised from 781px to 1561px to match 60-legal.css's hamburger breakpoint
   -- this flex layout assumes the full nav is visible and lays it out
   alongside the logo, which is wrong below that width now that the nav is
   a hamburger instead (see 60-legal.css's own comment on this breakpoint
   for why a layout that changes shape at a breakpoint used to move the
   logo, and why that's the thing being fixed here). */
@media (min-width: 1561px) {
  .pet-product-detail-page .pet-site-header > .wp-block-group {
    align-items: center;
    display: flex !important;
    gap: 1rem;
    justify-content: space-between;
    min-width: 0;
  }
  .pet-product-detail-page .pet-site-header > .wp-block-group > .pet-nav-wrap {
    flex: 1 1 0;
    min-width: 0;
  }
  .pet-product-detail-page .pet-primary-nav {
    overflow-x: auto;
    padding-block: 8px 2px;
    scrollbar-width: none;
  }
  .pet-product-detail-page .pet-primary-nav::-webkit-scrollbar { display: none; }
  .pet-product-detail-page .pet-site-header > .wp-block-group > .pet-wordmark-slot { flex: 0 0 auto; margin: 0; }
  .pet-product-detail-page .pet-site-header > .wp-block-group > .pet-header-end {
    flex: 1 1 0;
    justify-content: flex-end;
    min-width: 0;
  }
  .pet-product-detail-page .pet-header-actions > p { margin: 0; }
}

/* Below 1561px, product-detail pages fall through to the same 3-column
   grid + hamburger as every other page (00-base.css's base rule, unset by
   anything in this file at this width) -- no separate stacking here any
   more, same reasoning as 60-legal.css's 780px block. */
@media (max-width: 780px) {
  .pet-product-detail-page .pet-wordmark-slot { padding: 0; }
}

/* Keep section rhythm compact so content does not get lost in empty space. */
.pet-reviews { padding-block: clamp(2.5rem, 4vw, 4rem); }
.pet-section-hero { padding: clamp(2.25rem, 5vw, 4.5rem); }
.pet-shop-heading { padding-block: clamp(2.25rem, 4vw, 3.75rem) 1rem; }


/* This file's own RTL pass (2026-08-24). The related-strip heading carries a
   "catalog" arrow: mirrored for Hebrew the same way the six other arrow
   glyphs already are (see 50-catalog.css's .pet-product-card-link rule --
   .pet-shop-card a span, .pet-info-cta, .pet-event-action,
   .pet-specialty-card-cta, .pet-breadcrumbs are the rest of the family).
   inline-block because a span only honours transform as a box. Deliberately
   scoped to the heading link's arrow span: the .pet-pdp-icon glyphs beside it
   include the sheqel sign and a check mark, which are symbols rather than
   directional arrows and must never be mirrored. */
[dir="rtl"] .pet-pdp-section-heading a [aria-hidden="true"] { display: inline-block; transform: rotate(180deg); }

/* Same white-melt as the grid cards (50-catalog.css): the PDP main image
   when the template marked it a pack shot, and related cards for every
   source but bred photographs and seashell cut-outs. This is the rendering
   site where the exclusion actually earns its keep -- .pet-pdp-related-card
   img paints --pet-surface-muted behind itself, so multiply here is not the
   no-op it is against a white card. 50-catalog.css carries the reasoning. */
.pet-img-blend,
.pet-pdp-related-card:not([data-source="bred"]):not([data-source="seashell"]) img { mix-blend-mode: multiply; }
