/* ============================================================
   RHINORY v13 GIFT GATEWAY  —  /gifts/
   ------------------------------------------------------------
   Brief: docs/briefs/2026-08-20-gifts-catalog-plugin-consume.md (S3 — paint).
   Design source (do not re-derive — these are ports):
     prototypes/13/09-gifts.html   (`.g13` scope: hero, shelf, routes, closer)
     prototypes/13/v13-shared.css  (palette + type scale)
     prototypes/13/shop-all.css    (the `.sa-add` buy control the shelf reuses)

   TWO JOBS, ONE FILE.

   (1) RESTYLE of the plugin's `winery/product-catalog` + `winery/product-card`
       into the gift shelf. RESTYLE-ONLY, per the storefront ownership map's
       Rule 1: the block is not forked, no renderer is re-implemented, no class
       is renamed, and nothing here touches the FROZEN `.winery-c7-*` /
       `data-winery-c7-*` / `winery-c7:*` surface. Everything below is either a
       `--winery-*` token override (the plugin's documented paint knob) or an
       additive declaration on a published `.winery-*` class hook.

   (2) PAINT of the theme-owned brand chrome around it — the `.g13-*` sections
       rendered by patterns/gifts-0*.php. Those share no markup with the
       plugin; they are the hero, the review pull-quote, the Blake's Bricks and
       corporate routes, the art collaboration, and the Foundation closer.

   WHY EVERY CATALOG RULE IS SCOPED TO `.rhinory-page--gifts`
   (templates/page-gift.html). Two reasons, both load-bearing:

     a. The gift shelf and /shop/'s cellar grid are the SAME blocks with the
        same classes. /shop/ must keep its tall inset-bottle card
        (assets/css/winery-storefront.css); the gift shelf wants a
        photography-led 4:3 tile. The page scope is what keeps them apart —
        the `is_page('gift')` enqueue gate in functions.php is belt, this is
        braces, and the braces are what make the selector self-documenting.

     b. It settles the cascade by SPECIFICITY instead of print order.
        winery-storefront.css is attached with wp_enqueue_block_style() at
        `init`, so where its handle lands relative to this one is not something
        the theme can depend on (see rhinory_v4_attach_winery_storefront_paint()
        for the full reasoning). Its catalog rules are (0,2,0) descendants and
        its block-root rules double their class to reach (0,2,0); prefixing
        with the page class puts every rule here at (0,3,0) and the question
        stops being a question.

   WHY THE TOKEN OVERRIDES SIT ON THE BLOCK ROOTS AND NOT ON THE PAGE SCOPE.
   Custom properties inherit, so the nearest declaring ancestor wins — and
   winery-storefront.css declares the whole `--winery-*` set ON
   `.winery-product-catalog` / `.winery-product-card` themselves. A declaration
   on `.rhinory-page--gifts` would sit further up the tree and be shadowed by
   those. Re-declaring on the same elements at higher specificity is the only
   placement that actually reaches the block.

   REGISTER: light / paper, same as /shop/. The dark Reserve-cool site chrome
   (nav, campaign bar, footer) is untouched — the one dark surface this file
   paints is the Foundation closer, which is a theme section, not site chrome.
   No `#D4A24C` anywhere: acacia is `#B97727`, soft gold `#E2C58F`.
   ============================================================ */

/* ============================================================
   0 · PAGE SCOPE + TOKENS
   Local `--g13-*` names rather than the `--rhw-*` set winery-storefront.css
   declares: this file must paint correctly on its own terms, and the chrome
   sections render whether or not a winery/* block is on the page at all
   (winery-storefront.css only attaches when one is). Values are the literal
   v13 palette (prototypes/13/v13-shared.css:33-36 + shop-all.css:23-26).
   ============================================================ */
.rhinory-page--gifts {
	--g13-paper: #FBF7EE;
	--g13-paper-2: #F7F1E5;
	--g13-card: #F4EEE0;
	--g13-card-2: #EAE1CE;
	--g13-card-3: #E2D6BE;
	--g13-ink: #2D2926;
	--g13-ink-2: #3A352F;
	--g13-muted: #717271;
	--g13-burgundy: #520000;
	--g13-burgundy-2: #3D0000;
	--g13-burgundy-tint: rgba(82, 0, 0, 0.07);
	--g13-acacia: #B97727;
	--g13-gold-soft: #E2C58F;
	--g13-carbon: #1A1512;
	--g13-rule: rgba(45, 41, 38, 0.10);
	--g13-rule-2: rgba(45, 41, 38, 0.18);
	--g13-rule-burg: rgba(82, 0, 0, 0.24);

	--g13-ff-display: "Cormorant Garamond", Georgia, serif;
	--g13-ff-label: "Josefin Sans", system-ui, sans-serif;
	--g13-ff-body: "Lora", Georgia, serif;

	--g13-type-h2: clamp(40px, 5.4vw, 76px);
	--g13-type-lede: 18px;
	--g13-type-eyebrow: 11px;

	/* the prototype's `.wrap` (09-gifts.html:44-46). The catalog block is
	   re-pointed at the same pair below so the shelf lines up with the chrome
	   sections above and below it rather than running to /shop/'s 2100px. */
	--g13-max: 1360px;
	--g13-gutter: 56px;

	/* the air between the hero's CTA and the first row of tiles. One number,
	   two consumers: the plugin's headerless block-start padding token and the
	   catalog's own padding rule (both in § 2), so the shelf can never end up
	   with two different leads depending on which rule wins. */
	--g13-shelf-lead: 104px;

	background: var(--g13-paper);
	color: var(--g13-ink);
	font-family: var(--g13-ff-body);
	-webkit-font-smoothing: antialiased;
	text-rendering: optimizeLegibility;
}

@media (max-width: 1024px) {
	.rhinory-page--gifts { --g13-gutter: 40px; }
}

@media (max-width: 560px) {
	.rhinory-page--gifts { --g13-gutter: 22px; }
}

/* Core's flow layout hangs a `--wp--style--block-gap` margin off every direct
   child of a core/group, and each chrome section (plus `<main>` itself) is a
   group. These bands are meant to run flush and set their own vertical rhythm
   from their own padding, so the inherited gap is zeroed once here at the top
   of the file — every rule below is at the same (0,2,0) or higher and declared
   later, so anything that genuinely wants a margin still gets one. */
.rhinory-page--gifts > *,
.rhinory-page--gifts .wp-block-group > * {
	margin-block: 0;
}

/* ---- shared chrome primitives (`.wrap` / `.eyebrow` / `.g-btn`) ---- */
.rhinory-page--gifts .g13-wrap,
.rhinory-page--gifts .g13-hero__grid,
.rhinory-page--gifts .g13-routes,
.rhinory-page--gifts .g13-art-band,
.rhinory-page--gifts .g13-head,
.rhinory-page--gifts .g13-quote {
	width: 100%;
	max-width: var(--g13-max);
	margin-inline: auto;
	padding-inline: var(--g13-gutter);
}

.rhinory-page--gifts .g13-eyebrow {
	margin: 0;
	display: inline-flex;
	align-items: center;
	gap: 12px;
	font-family: var(--g13-ff-label);
	font-size: var(--g13-type-eyebrow);
	font-weight: 600;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--g13-burgundy);
}
.rhinory-page--gifts .g13-eyebrow::before {
	content: "";
	width: 24px;
	height: 1px;
	background: currentColor;
	flex: none;
}

.rhinory-page--gifts .g13-btns {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	align-items: center;
	margin: 36px 0 0 0;
}
.rhinory-page--gifts .g13-btn {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	min-height: 54px;
	padding: 17px 32px;
	border: 1px solid var(--g13-burgundy);
	background: var(--g13-burgundy);
	color: var(--g13-paper);
	border-radius: 2px;
	font-family: var(--g13-ff-label);
	font-size: 12px;
	font-weight: 600;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	text-decoration: none;
	transition: background 0.2s, transform 0.18s, color 0.2s;
}
.rhinory-page--gifts .g13-btn:hover,
.rhinory-page--gifts .g13-btn:focus-visible {
	background: var(--g13-burgundy-2);
	border-color: var(--g13-burgundy-2);
	color: var(--g13-paper);
	transform: translateY(-1px);
	box-shadow: 0 12px 30px -16px rgba(82, 0, 0, 0.55);
}
.rhinory-page--gifts .g13-btn--out {
	background: none;
	color: var(--g13-burgundy);
	border-color: var(--g13-rule-2);
}
.rhinory-page--gifts .g13-btn--out:hover,
.rhinory-page--gifts .g13-btn--out:focus-visible {
	background: var(--g13-burgundy-tint);
	border-color: var(--g13-burgundy);
	color: var(--g13-burgundy);
	box-shadow: none;
}
/* the dark closer inverts the pair: gold fill on the carbon ground */
.rhinory-page--gifts .g13-btn--gold {
	background: var(--g13-gold-soft);
	border-color: var(--g13-gold-soft);
	color: var(--g13-carbon);
}
.rhinory-page--gifts .g13-btn--gold:hover,
.rhinory-page--gifts .g13-btn--gold:focus-visible {
	background: var(--g13-paper);
	border-color: var(--g13-paper);
	color: var(--g13-carbon);
	box-shadow: none;
}

/* ============================================================
   1 · HERO  (templates/page-gift.html `.g13-hero` — `.g-hero` port)
   Photography-led and deliberately text-free over the image: nothing sits on
   top of the stage, so the crop never has to reserve space for a label.

   THE STAGE STAYS `wp:html` (carried over from the retired
   patterns/gifts-00-hero.php, dissolved into the template 2026-08-31): the
   prototype crops the shot (`background-position: 56% 48%`) and slow-pans it,
   and neither survives a content-editable <img>. It is theme-bundled, so it
   also carries no media-library dependency into a fresh environment. Every
   other part of the hero — crumb, headline, lede, CTA — is a native core block
   an operator edits in the canvas.
   ============================================================ */
.rhinory-page--gifts .g13-hero {
	background: var(--g13-paper);
	border-bottom: 1px solid var(--g13-rule-2);
	overflow: hidden;
}
.rhinory-page--gifts .g13-hero__grid {
	display: grid;
	grid-template-columns: 1fr 1.26fr;
	gap: 76px;
	align-items: center;
	padding-block: 104px 96px;
}
@media (max-width: 1100px) {
	.rhinory-page--gifts .g13-hero__grid {
		grid-template-columns: 1fr;
		gap: 44px;
		padding-block: 64px 56px;
	}
}

.rhinory-page--gifts .g13-crumb {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 11px;
	margin: 0 0 34px 0;
	font-family: var(--g13-ff-label);
	font-size: 12px;
	font-weight: 600;
	letter-spacing: 0.14em;
	text-transform: uppercase;
}
.rhinory-page--gifts .g13-crumb a {
	color: var(--g13-muted);
	text-decoration: none;
}
.rhinory-page--gifts .g13-crumb a:hover { color: var(--g13-burgundy); }
.rhinory-page--gifts .g13-crumb__sep { color: var(--g13-rule-2); }
.rhinory-page--gifts .g13-crumb__current { color: var(--g13-burgundy); }

/* clamp ceiling is 80px, not the type scale's larger step: at 86px the longer
   authored line ("A gift that helps") overflowed the 519px hero column by ~2px
   and broke the intended two-line set (prototype comment, 09-gifts.html:79). */
.rhinory-page--gifts .g13-hero__headline {
	font-family: var(--g13-ff-display);
	font-weight: 500;
	font-size: clamp(46px, 5.4vw, 80px);
	line-height: 0.94;
	letter-spacing: -0.012em;
	color: var(--g13-ink);
	margin: 22px 0 0 0;
	text-wrap: pretty;
}
.rhinory-page--gifts .g13-hero__headline em {
	font-style: italic;
	font-weight: 500;
	color: var(--g13-burgundy);
}
@media (max-width: 560px) {
	.rhinory-page--gifts .g13-hero__headline { font-size: 40px; }
}

.rhinory-page--gifts .g13-hero__lede {
	font-family: var(--g13-ff-body);
	font-size: var(--g13-type-lede);
	line-height: 1.7;
	color: var(--g13-ink-2);
	max-width: 50ch;
	margin: 26px 0 0 0;
}

.rhinory-page--gifts .g13-hero__media {
	display: flex;
	flex-direction: column;
	gap: 14px;
	min-width: 0;
}
.rhinory-page--gifts .g13-stage {
	position: relative;
	overflow: hidden;
	background: var(--g13-carbon);
	border: 1px solid var(--g13-rule-2);
	aspect-ratio: 4 / 3;
	box-shadow: 0 40px 84px -40px rgba(45, 41, 38, 0.52);
}
/* Theme-bundled per § Image pipeline: image-set() serves the baked .webp
   sibling and falls back to the .jpg. The prototype's ken-burns pan is
   deliberately NOT ported — it was a requestAnimationFrame loop, and a static
   crop is the honest still of the same frame. */
/* The stage photo is a core/image an operator swaps from the canvas, not a
   hardcoded CSS background (brief
   docs/briefs/2026-08-31-gift-hero-wanda-images-swappable.md). The figure keeps
   the treatment that belongs to the FRAME — the -5% overscan, the 1.04 push and
   the grade — and the <img> inside carries the crop.

   `object-fit: cover` + `object-position` is the exact analogue of the
   `background-size: cover` + `background-position` this replaced: both resolve
   to the same scale-to-fill and the same percentage offset, so the framing is
   unchanged by construction, not by eye.

   The hand-written `image-set()` pair is gone with the background: a core/image
   rides `rhinory_core_image_to_picture` (mu-plugin), which emits the `.webp`
   sibling as a `<source>` and is why `picture { display: contents }` exists in
   style.css — the wrapper stays out of the box tree so this absolute
   positioning still resolves against the figure.

   `position: absolute` on the <img> rather than `height: 100%`: the figure has
   no in-flow content, so a percentage height would have nothing definite to
   resolve against at the 1000px break where the art column stops being
   stretched by its sibling. */
.rhinory-page--gifts .g13-stage__img {
	position: absolute;
	inset: -5%;
	margin: 0;
	filter: saturate(0.94) contrast(1.04);
	transform: scale(1.04);
}
.rhinory-page--gifts .g13-stage__img img {
	position: absolute;
	inset: 0;
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: 56% 48%;
}

/* ============================================================
   2 · THE GIFT SHELF  —  RESTYLE of winery/product-catalog
   Everything from here to §4 is a paint override on plugin-rendered markup.
   ============================================================ */

/* ---- token overrides (the plugin's documented paint knob) ----
   Declared on the block roots, not on the page scope — see the file header
   for why that placement is the only one that reaches the block. */
.rhinory-page--gifts .winery-product-catalog,
.rhinory-page--gifts .winery-product-card {
	/* line the shelf up with the chrome sections rather than /shop/'s 2100px */
	--winery-shop-max-width: var(--g13-max);
	--winery-shop-inline-gutter: var(--g13-gutter);
	--winery-catalog-max-width: var(--g13-max);
	--winery-catalog-inline-gutter: var(--g13-gutter);

	/* /shop/ draws a continuous ledger rule (gap 0, hairline per cell); the
	   gift shelf is discrete tiles with air between them (09-gifts.html:98). */
	--winery-catalog-grid-gap: 24px;
	/* INERT ON THIS SHELF, and kept deliberately — verified 2026-08-29 against
	   blocks/product-catalog/style.css. That floor only governs the auto-fill
	   grid; this catalog is `layout: 3-up`, which the plugin renders as
	   `repeat(3, minmax(0, 1fr))` at a HIGHER specificity, so the column tracks
	   the grid width directly and no card floor reaches it at any width. The
	   floor is enforced by dropping a track instead — see the shelf breakpoint
	   below the grid rule. This stays declared at the value the floor is worth
	   (20rem = 320px) so that if the shelf ever moves off a fixed layout it
	   lands on a sane column rather than on the plugin's 12rem default. */
	--winery-catalog-card-min-width: 20rem;
	--winery-catalog-background: transparent;

	/* The shelf runs headerless (showHeader:false in
	   scripts/provision-gifts-page.php — the hero is the page's one header),
	   and the plugin's `.winery-product-catalog--header-hidden` rule zeroes
	   block-start padding by default. That default is right for a shelf that
	   is meant to butt against what precedes it; here the hero ends on a CTA
	   and the first row of tiles must not start against it. The contract names
	   this token as the theme's seam for exactly that case.

	   ZERO, not `--g13-shelf-lead`: what stands between the hero's CTA and the
	   first row of tiles is now the theme's own section head
	   (templates/page-gift.html, `.g13-head`), and the lead moved up to
	   `.g13-shelf` so it is applied ONCE to whatever the band's first child
	   happens to be. Leaving the token at the lead would stack a second 104px
	   between the head and the grid. The token stays declared rather than
	   deleted because the plugin's own headerless default is already 0 and a
	   silent reliance on that default is what this seam exists to make
	   explicit — if the head is ever removed, this is the line to change back.
	   Contract: ~/dev/wordpress-for-wineries/docs/contract.md § winery/product-catalog — showHeader */
	--winery-catalog-headerless-block-start-padding: 0;

	/* the tile: seated on card stock, 4-wide by 3-high photograph on top */
	--winery-card-background: var(--g13-card);
	--winery-card-border-color: var(--g13-rule-2);
	--winery-card-media-aspect-ratio: 4 / 3;
	/* The 14px frame of card stock around the shot. This is the plugin's own
	   media-box padding token, NOT a box override on the <img>: the shared
	   card rule absolutely-positions the image against __media-link, and an
	   abspos REPLACED element resolves `width:auto`/`height:auto` to its
	   INTRINSIC size (CSS 2.1 §10.3.8/§10.6.5 — the opposite inset is dropped
	   as over-constrained), so insetting the image directly rendered every
	   bottle shot at full pixel size anchored top-left and clipped by
	   __media's overflow:hidden. On cut-out PNGs that visible corner is
	   transparent, which is why the shelf's cards read as BLANK. Padding the
	   media box moves the inset to the containing block instead, where
	   inset:0 + object-fit:contain still letterbox correctly. */
	--winery-card-media-inset: 14px;
	--winery-card-padding: 24px;
	--winery-card-cta-background: var(--g13-burgundy);
	--winery-card-cta-background-hover: var(--g13-burgundy-2);
	--winery-card-cta-color: var(--g13-paper);
}

/* the band the shelf sits in: it owns the section's vertical air and carries
   the `#gifts-shelf` anchor the hero CTA scrolls to (scroll-margin keeps the
   sticky nav off the section head on arrival). */
.rhinory-page--gifts .g13-shelf {
	background: var(--g13-paper);
	padding-block: var(--g13-shelf-lead) 112px;
	scroll-margin-top: 96px;
}
.rhinory-page--gifts .winery-product-catalog.winery-product-catalog {
	background: var(--g13-paper);
	padding-block: 0;
}
@media (max-width: 900px) {
	.rhinory-page--gifts .g13-shelf { padding-bottom: 76px; }
	.rhinory-page--gifts { --g13-shelf-lead: 72px; }
}

/* ---- the shelf's section head (templates/page-gift.html `.g13-head` — the
   prototype's `.g-head` / `.gp-meta` pair, 09-gifts.html:133-136 + 91-94).
   Theme-owned chrome, not plugin markup: it shares no class with the catalog
   and is the FIRST child of the band, so it is what `--g13-shelf-lead` now
   lands on. Two columns, bottom-aligned: the headline reads left, the
   packaging / shipping facts sit right-aligned against it like a caption.

   WHY NOT THE CATALOG BLOCK'S OWN HEADER (carried over from the retired
   patterns/gifts-00b-shelf-head.php, dissolved into the template 2026-08-31):
   the plugin's winery/product-catalog header is off (`showHeader:false`)
   because it duplicated the hero's eyebrow + headline + description. This is a
   different thing — the prototype's own SECTION head, between the hero and the
   card grid — and its right-hand column is a shipping/packaging meta list the
   block header has no slot for. Restoring it through the block would mean
   turning the duplicate header back on to get one of its three parts. ---- */
.rhinory-page--gifts .g13-head {
	display: grid;
	grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
	gap: 28px 60px;
	align-items: end;
	margin-bottom: 52px;
}
.rhinory-page--gifts .g13-head__heading {
	font-family: var(--g13-ff-display);
	font-weight: 500;
	font-size: var(--g13-type-h2);
	line-height: 1.03;
	letter-spacing: -0.008em;
	color: var(--g13-ink);
	margin: 0;
	max-width: 24ch;
	text-wrap: balance;
}
/* the prototype's global `.g13 em` (09-gifts.html:51), applied here rather
   than site-wide: this file may not restyle every em on the page. */
.rhinory-page--gifts .g13-head__heading em {
	font-style: italic;
	font-weight: 500;
	color: var(--g13-burgundy);
}
.rhinory-page--gifts .g13-head__meta {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 9px;
	align-items: flex-end;
	text-align: right;
	font-family: var(--g13-ff-label);
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: var(--g13-muted);
}
/* below the prototype's 1040px break the two columns stack, and the meta
   list turns into a wrapping row so it reads as a strapline under the
   headline instead of a right-aligned column with nothing to align to. */
@media (max-width: 1040px) {
	.rhinory-page--gifts .g13-head {
		grid-template-columns: 1fr;
		gap: 20px;
		margin-bottom: 38px;
	}
	.rhinory-page--gifts .g13-head__heading { max-width: 30ch; }
	.rhinory-page--gifts .g13-head__meta {
		flex-direction: row;
		flex-wrap: wrap;
		gap: 10px 26px;
		align-items: baseline;
		text-align: left;
	}
}

/* No `.winery-product-catalog__title` / `__eyebrow` / `__description` rules:
   the shelf runs headerless, so that region is never emitted. Paint for a node
   that cannot render reads as live style to the next person and quietly rots —
   if the header is ever turned back on, style it then, against what it
   actually renders. The page's one header is the hero
   (patterns/gifts-00-hero.php, § 1). */

/* ---- the grid ----
   cancels the ledger frame winery-storefront.css draws for /shop/: with a
   24px gap and a full border per tile, a container hairline would read as a
   stray rule floating beside the first column.
   `margin-top: 0`: the 24px here used to be the gap under the catalog header.
   The header is gone, so the shelf's lead is `--g13-shelf-lead` and this
   margin would silently add to it. */
.rhinory-page--gifts .winery-product-catalog .winery-product-catalog__grid {
	margin-top: 0;
	background: none;
	border-top: 0;
	border-left: 0;
}

/* ---- THE 300px COLUMN FLOOR (v13.2 CD pass 2026-08-29, 09-gifts.html:99-108)
   A cut product name is the one thing this card system forbids, and on a fixed
   3-up the column has no floor of its own: `--winery-catalog-card-min-width`
   governs the plugin's auto-fill grid only (see the token block in § 2), and
   the `--3-up` rule overrides that grid with three equal tracks at a higher
   specificity. So the floor has to be a BREAKPOINT — the grid drops a track
   rather than letting the column keep shrinking, which is exactly the mechanism
   the design-of-record uses.

   Measured on the live shelf: the longest gift name is clean at a 300px column,
   needs 3 lines at 267px and 4 at 237px. The arithmetic, with this page's own
   `--g13-max` / `--g13-gutter` (1360 / 56, the same numbers the prototype's
   `.wrap` uses, which is why its 1080px step ports across unchanged):
   3 x 300 + 2 x 24 gap + 2 x 56 gutter = 1060px. The plugin steps 3-up to 2-up
   at 64rem (1024px), so between 1025px and 1059px the shelf packs three columns
   at 288.3px to 299.7px — under the floor, and invisible to a 1440/390 suite
   because the whole band sits between them. Stepping at 1080px clears it with
   20px of headroom.

   The 2-up leg needs no help: the plugin drops to one column at 48rem (768px),
   and 2 x 300 + 24 + 2 x 56 = 736px, so the narrowest 2-up column the shelf can
   pack is (769 - 112 - 24) / 2 = 316px. The design-of-record's own 720px step is
   the same call arrived at from a slightly different gutter; the plugin's 768px
   is already inside it, so it is left alone rather than restated.

   HENCE THE LOWER BOUND, which is load-bearing and not tidiness. The plugin's
   own 1-up step is `@media (max-width: 48rem) { .winery-product-catalog--3-up
   .winery-product-catalog__grid }` at (0,2,0); this selector is (0,3,0), so an
   unbounded `max-width: 1080px` would outrank it at every width below 768 and
   hold the shelf at two columns all the way down. Measured before the bound was
   added: 216px columns at a 500px viewport, with the Keras name cut — the very
   defect this block exists to prevent, reintroduced by the fix for it. 769px is
   one pixel above the plugin's step, written in rem so it tracks the same
   constant the plugin's own rule uses. ---- */
@media (min-width: 48.0625rem) and (max-width: 1080px) {
	.rhinory-page--gifts .winery-product-catalog--3-up .winery-product-catalog__grid {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

/* ============================================================
   3 · THE GIFT TILE  —  RESTYLE of winery/product-card (`.gcat` port)
   ============================================================ */
.rhinory-page--gifts .winery-product-card.winery-product-card {
	background: var(--g13-card);
	/* /shop/'s asymmetric right+bottom hairline is half of a shared ledger
	   rule between touching cells; a tile with air around it needs all four. */
	border: 1px solid var(--g13-rule-2);
	transition: transform 0.25s ease, border-color 0.25s ease;
}
.rhinory-page--gifts .winery-product-card.winery-product-card:hover,
.rhinory-page--gifts .winery-product-card.winery-product-card:focus-within {
	background: var(--g13-card);
	border-color: var(--g13-burgundy);
	transform: translateY(-4px);
}
/* the ::after ring winery-storefront.css uses to draw /shop/'s hover border
   would now double the real border above. */
.rhinory-page--gifts .winery-product-card.winery-product-card::after { content: none; }

/* ---- media ---- */
.rhinory-page--gifts .winery-product-card .winery-product-card__media {
	background: var(--g13-card-2);
	border-bottom: 1px solid var(--g13-rule-2);
}
/* `contain` with a small inset, NOT `cover`. The shelf mixes lifestyle
   photography with cut-out pack shots on transparent grounds; `cover` crops a
   cut-out bottle at the shoulders, while `contain` only letterboxes a
   lifestyle frame. Letterboxing is the recoverable failure, so it is the
   default. (The prototype picked per-card with `.gcat--fit`; that needs a
   per-product art-direction field the plugin does not expose — see the S3
   result note.) */
.rhinory-page--gifts .winery-product-card .winery-product-card__image,
.rhinory-page--gifts .winery-product-card .winery-product-card__secondary-image {
	object-fit: contain;
	/* the shelf drops /shop/'s bottle drop-shadow: a gift pack is photographed
	   on its own ground, so the cast shadow would double the real one. */
	filter: saturate(0.96) contrast(1.03);
	transform-origin: center;
	transition: transform 0.8s cubic-bezier(0.2, 0.7, 0.2, 1);
}
/* /shop/ zooms hard into the bottle label (scale 1.55) because every card
   there IS a bottle. A gift pack has no label to find, so the shelf uses the
   prototype's gentle lift instead. */
.rhinory-page--gifts .winery-product-card:hover .winery-product-card__image,
.rhinory-page--gifts .winery-product-card:focus-within .winery-product-card__image {
	transform: scale(1.045);
}
.rhinory-page--gifts .winery-product-card--has-secondary-image:hover .winery-product-card__image,
.rhinory-page--gifts .winery-product-card--has-secondary-image:focus-within .winery-product-card__image {
	transform: none;
}

/* ---- body ---- */
.rhinory-page--gifts .winery-product-card .winery-product-card__body {
	padding: 22px var(--winery-card-padding) var(--winery-card-padding);
}
.rhinory-page--gifts .winery-product-card .winery-product-card__eyebrow {
	font-size: 10px;
	letter-spacing: 0.2em;
	margin: 0 0 9px 0;
	padding-right: 0;
}
.rhinory-page--gifts .winery-product-card .winery-product-card__vintage {
	top: 22px;
	right: var(--winery-card-padding);
}
.rhinory-page--gifts .winery-product-card .winery-product-card__title {
	font-weight: 500;
	font-size: 24px;
	line-height: 1.08;
	margin: 0;
}
.rhinory-page--gifts .winery-product-card .winery-product-card__title em {
	font-style: italic;
	font-weight: 500;
	color: var(--g13-burgundy);
}
.rhinory-page--gifts .winery-product-card .winery-product-card__teaser,
.rhinory-page--gifts .winery-product-card .winery-product-card__varietal {
	font-size: 10.5px;
	letter-spacing: 0.16em;
	color: var(--g13-muted);
	margin: 9px 0 0 0;
}
/* the C7 excerpt is the wine's full tasting note — ~50 words of cedar and
   loganberry aimed at someone choosing a bottle to DRINK. On this shelf the
   reader is choosing a bottle to SEND, and the prototype's tile says so with
   silence: `.gcat` (09-gifts.html:240-249) carries an eyebrow, a title, one
   meta line, a price and a buy control, and no prose at all. The note is not
   deleted, only unrendered here — it is the PDP's job, and /shop/ and the
   bundle PDP still show it (this rule is page-scoped like every other rule in
   this file). */
.rhinory-page--gifts .winery-product-card .winery-product-card__excerpt {
	display: none;
}

/* ---- foot: price left, buy right — REGION 3, and the shelf does not own it ----
   RECONCILED 2026-08-29 (`2026-08-29-gift-v13-card-reconcile`). This file used
   to run its own foot: `margin-top: 18px` with an auto-margin restored by a
   `:not(:has(__member-preview)):not(:has(__sale-label)):not(:has(.rhinory-crash-subscribe))`
   triple. That predated the v13.1 card system, which now owns the pinned
   selling block for every `.winery-product-card` on the site
   (winery-storefront.css § 2b/3): auto margin above the group, 16px padding,
   the hairline, a 74px reserve and `align-content: flex-end`, with the
   member-preview carrying the auto margin on the cards that have one and the
   qualifier line travelling on a fixed 12px.

   Two systems stacked is why the exclusion list had to exist, and its rationale
   had gone stale: `__sale-label` was in the list from when the sale mark rode
   ABOVE the rule, but v13.1 moved it BELOW
   (`--winery-card-sale-label-order: 4`), so the reason to exclude sale cards
   from the auto margin no longer existed.

   THIS IS A DE-DUPLICATION, NOT A BUG FIX, and the distinction is recorded
   because the first draft of this note claimed the latter. Probed in-browser
   2026-08-29 by reintroducing the deleted rules: the geometry does not move,
   under any combination of sale state and column width. The reason is that the
   price row's OWN auto margin is inert on this shelf today. Six of the seven
   cards carry a `__member-preview`, and on those the body's one auto margin
   lives on the preview (winery-storefront.css § 2b), so it is the preview that
   absorbs free space and the price row is pinned whatever its own margin says.
   The seventh — the gift card, the only card with no preview — is structurally
   ALONE in its grid row at every column count the shelf packs (7 items wrap
   3+3+1 and 2+2+2+1), so it never has a taller sibling to give it free space in
   the first place.

   So what is deleted is a second, redundant statement of a rule the global
   system already makes correctly. It is worth deleting rather than leaving
   because it becomes load-bearing the moment either premise changes — an
   eighth product putting a preview-less card beside a taller one, or a card
   running a line taller near the column floor, which the clamp-3 title above
   now explicitly permits. Guarded from here on by the row-alignment case in
   tests/visual/surfaces/gifts.spec.ts, which forces exactly that state and
   fails (gaps split 99 / 125) when the pin is removed.

   So the rules are gone rather than re-tuned. The global system is the design
   here and the geometry is unchanged by deleting them: 74px reserve, 99px from
   card bottom to price-row top (74 + the body's 24px inset + the 1px border) —
   the same numbers the design-of-record draws at 74 / 98 before its border.
   `align-items: flex-end` and the hairline both come from that system too; the
   2026-08-22 "no border-top" note above is superseded, because the v13.1 pass
   moved the hairline onto the row itself on every surface. */
.rhinory-page--gifts .winery-product-card .winery-product-card__price,
.rhinory-page--gifts .winery-product-card .winery-product-card__price-now {
	font-family: var(--g13-ff-display);
	font-style: italic;
	font-weight: 500;
	font-size: 28px;
	line-height: 1;
	letter-spacing: 0;
	color: var(--g13-ink);
}
.rhinory-page--gifts .winery-product-card .winery-product-card__cta {
	min-height: 42px;
	padding: 11px 16px;
	font-size: 10.5px;
}

/* ---- bundle slot → the tile's one meta line ----
   The plugin's bundle slot emits TWO things: a count (`__bundle-count`, "1
   bottle") and a per-component list (`__bundle-items`, one row per child wine
   with a thumbnail, collection eyebrow, vintage, varietal and teaser). On
   /shop/ and the bundle PDP that breakdown is the point — it answers "what is
   actually in this box" for a multi-bottle set. On this gateway it is noise:
   every SKU on the gift shelf resolves to a ONE-bottle box, so the list is a
   four-column dump of the same wine the tile is already named after, plus a
   second thumbnail of the bottle already in the media well above it.

   So the slot is split rather than suppressed. The count is real, resolved
   product data and becomes the prototype's `.gcat-meta` line
   (09-gifts.html:113); the component list is hidden.

   NOTHING IS FORKED. The plugin still renders its full slot — every node is
   in the DOM, `winery_bundle_contents_render` still fires, and the frozen
   `.winery-c7-*` / `data-winery-c7-*` surface is untouched. This is paint on
   published `.winery-*` class hooks, page-scoped to `.rhinory-page--gifts`,
   which is why /shop/ and the bundle PDP keep the rich slot unchanged.
   Contract: ~/dev/wordpress-for-wineries/docs/contract.md § DOM contract —
   .winery-product-card__bundle-contents / __bundle-count / __bundle-items */
.rhinory-page--gifts .winery-product-card .winery-product-card__bundle-contents {
	margin-top: 9px;
}
.rhinory-page--gifts .winery-product-card .winery-product-card__bundle-items {
	display: none;
}
/* REGION 2 — the variable middle, and it gets a FLOOR rather than a fixed box
   (09-gifts.html `.gcat-meta`, CD pass 2026-08-29). The /shop/ gift band
   reserves its contents list at the 4-line worst case because 3-to-4 lines is
   EVERY card there. Here the spec line is one line by design ("1 bottle · gift
   box included") on all but the longest sets, so reserving a worst case would
   punch a two-line hole in every card — the exact fault v13.2 fixed on the wine
   title. One line is the floor; a longer sentence wraps and region 3 absorbs
   it, because the selling block is bottom-pinned. `min-height` and
   `line-height` are the same number read off the same rule: change one, change
   the other. */
.rhinory-page--gifts .winery-product-card .winery-product-card__bundle-count {
	margin: 0;
	font-family: var(--g13-ff-label);
	font-size: 10.5px;
	font-weight: 600;
	letter-spacing: 0.16em;
	line-height: 1.55;
	text-transform: uppercase;
	color: var(--g13-muted);
	min-height: calc(1 * 1.55em);
}
/* The prototype's meta line is "1 bottle · gift box included". The count half
   is product data; the box half is not a C7 field on any of these SKUs, so it
   rides here as a page-scoped suffix. It is safe BECAUSE it is attached to
   `__bundle-count` rather than to the card: the count only renders for a
   product that actually resolved as a bundle, i.e. a boxed gift set, so the
   claim can never appear on a bare bottle or on the gift card (neither emits
   the slot at all). If a gift set ever ships unboxed, this is the one rule to
   delete. */
.rhinory-page--gifts .winery-product-card .winery-product-card__bundle-count::after {
	content: " · gift box included";
	color: var(--g13-muted);
}

/* ---- gift-card CTA (F2) ----
   The `rhinory-gift-card-cta` class is added server-side by
   inc/gift-card-routing.php when it strips the frozen buy trigger off a
   gift-card card, leaving a plain link to the gift-card PDP. It is styled the
   same as any other buy CTA on purpose: this is still the tile's one
   conversion control, it just leads to a denomination picker rather than
   straight to the cart. The rule exists so the class is a real, findable hook
   rather than a marker with no CSS behind it. */
.rhinory-page--gifts .winery-product-card .winery-product-card__cta.rhinory-gift-card-cta {
	white-space: nowrap;
}

/* ============================================================
   4 · REVIEW PULL-QUOTE  (blocks/curated-review/render.php — `.g13-quote`
       figure, one operator-selected winery_review; was patterns/gifts-01-quote.php)
   ============================================================ */
.rhinory-page--gifts .g13-quote {
	display: grid;
	grid-template-columns: auto 1fr auto;
	align-items: center;
	gap: 22px 28px;
	margin: 44px auto 0 auto;
	padding-block: 24px;
	background: var(--g13-burgundy-tint);
	border: 1px solid var(--g13-rule-burg);
	border-left: 2px solid var(--g13-burgundy);
}
.rhinory-page--gifts .g13-quote__stars {
	font-family: var(--g13-ff-label);
	font-size: 13px;
	letter-spacing: 0.1em;
	color: var(--g13-burgundy);
}
.rhinory-page--gifts .g13-quote__stars::before { content: "\2605\2605\2605\2605\2605"; }
.rhinory-page--gifts .g13-quote__body {
	margin: 0;
	font-family: var(--g13-ff-display);
	font-style: italic;
	font-weight: 500;
	font-size: 20px;
	line-height: 1.46;
	color: var(--g13-ink);
	text-wrap: pretty;
}
.rhinory-page--gifts .g13-quote__attr {
	font-family: var(--g13-ff-label);
	font-size: 10px;
	font-weight: 600;
	letter-spacing: 0.2em;
	text-transform: uppercase;
	color: var(--g13-muted);
	display: inline-flex;
	align-items: center;
	gap: 9px;
	white-space: nowrap;
}
.rhinory-page--gifts .g13-quote__attr strong {
	color: var(--g13-burgundy);
	font-weight: 600;
}
@media (max-width: 820px) {
	.rhinory-page--gifts .g13-quote {
		grid-template-columns: 1fr;
		gap: 12px;
	}
	.rhinory-page--gifts .g13-quote__attr { white-space: normal; }
}

/* ============================================================
   5 · ROUTES  (templates/page-gift.html `.g13-routes` — `.g-routes` port)
   Blake's Bricks (the proceeds one-liner) + the corporate entry.

   Theme-owned brand chrome, deliberately NOT plugin content: neither route is
   a Commerce7 product, so neither belongs on the shelf above.

   OPERATOR-FILLABLE TARGET: `/gift/corporate/` is the intended home of the
   corporate subpage (prototype 13/09a-corporate-gifts.html), which is a
   separate editorial brief and does not exist in WP yet. Repoint or publish
   that page before launch.
   ============================================================ */
.rhinory-page--gifts .g13-routes {
	background: var(--g13-card-2);
	border-top: 1px solid var(--g13-rule-2);
	padding-block: 0;
	/* the band's ground is full-bleed while the rows inside stay on the `.wrap`
	   measure, so the shared inline padding above is widened into a centered
	   inner box instead of a max-width box on a tinted ground. */
	max-width: none;
	padding-inline: max(var(--g13-gutter), calc((100% - var(--g13-max)) / 2 + var(--g13-gutter)));
}
.rhinory-page--gifts .g13-route {
	display: grid;
	grid-template-columns: 1fr auto;
	align-items: center;
	gap: 34px;
	padding-block: 40px;
	border-top: 1px solid var(--g13-rule-2);
}
.rhinory-page--gifts .g13-route:first-child { border-top: 0; }
.rhinory-page--gifts .g13-route:last-child { border-bottom: 1px solid var(--g13-rule-2); }
@media (max-width: 860px) {
	.rhinory-page--gifts .g13-route {
		grid-template-columns: 1fr;
		gap: 20px;
	}
}
/* The two decorative eyebrows are gone from the routes rows
   (Nicole, 2026-08-29) and `.g13-eyebrow` above is untouched — the paint stays.
   The 13px this line used to carry as a top margin is now an ADJACENT-SIBLING
   rule, so it belongs to the eyebrow-then-line relationship rather than to the
   line. These rows are operator-editable, so a compensating margin that only
   reads correctly while the eyebrow is absent would break the first time
   someone re-adds one — the line would sit 13px low under it. Re-add an eyebrow
   and the gap comes back with it; leave it out and the line sits flush at the
   top of its cell. */
.rhinory-page--gifts .g13-route__line {
	font-family: var(--g13-ff-body);
	font-size: 16.5px;
	line-height: 1.68;
	color: var(--g13-ink-2);
	margin: 0;
	max-width: 74ch;
	text-wrap: pretty;
}
.rhinory-page--gifts .g13-route .g13-eyebrow + .g13-route__line {
	margin-top: 13px;
}
.rhinory-page--gifts .g13-route__line strong {
	color: var(--g13-burgundy);
	font-weight: 600;
}
/* The link is authored as a core/paragraph so an operator can retype the label
   and repoint the href from the canvas (core has no block that emits a bare
   <a>). The wrapper has to be layout-neutral, because the anchor is the SECOND
   grid item of `.g13-route` and was so when this row was a wp:html blob.

   `display: grid`, NOT `display: contents`. `contents` is the tidier answer on
   paper — it dissolves the <p> out of the box tree entirely, so the anchor
   itself stays the grid item — and it renders pixel-identically. It also makes
   the paragraph UNSELECTABLE in the Site Editor: a block with no box has
   nothing for a canvas click to land on, so clicking the CTA selected the row
   group instead and the operator could never type in it. That defeats the
   point of authoring it as a block.

   A one-cell grid is the faithful stand-in, because the anchor was a GRID ITEM
   before and stays one here, just of a transparent inner grid: it inherits the
   same `stretch` sizing in both directions. That distinction is load-bearing at
   the 860px break, where `.g13-route` collapses to a single column and the CTA
   is meant to run the full width of the row — a shrink-to-fit flex wrapper
   renders the button at its 190px content width there instead of the authored
   346px, which is a visible paint change on mobile. Above the break the wrapper
   is itself in an `auto` track, so the column takes the anchor's max-content
   width and nothing stretches. `margin: 0` keeps the paragraph's default block
   margins out of the row. */
.rhinory-page--gifts .g13-route__cta {
	display: grid;
	margin: 0;
}
.rhinory-page--gifts .g13-route__link {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	min-height: 46px;
	padding: 13px 22px;
	border: 1px solid var(--g13-rule-2);
	font-family: var(--g13-ff-label);
	font-size: 11.5px;
	font-weight: 600;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--g13-burgundy);
	text-decoration: none;
	white-space: nowrap;
}
.rhinory-page--gifts .g13-route__link:hover,
.rhinory-page--gifts .g13-route__link:focus-visible {
	border-color: var(--g13-burgundy);
	background: var(--g13-burgundy-tint);
}
.rhinory-page--gifts .g13-route__arrow { transition: transform 0.3s cubic-bezier(0.2, 0.7, 0.2, 1); }
.rhinory-page--gifts .g13-route__link:hover .g13-route__arrow { transform: translateX(5px); }

/* ============================================================
   6 · ART COLLABORATION  (templates/page-gift.html `.g13-art` — `.g-art` port)
   Editorial, not a Commerce7 product: the pieces are commissioned one at a
   time, so this band is a link out rather than a catalog row.

   WANDA CANON: a separate label series under the "Wanda's Wee Zoo" nonprofit —
   do not conflate it with the Crash / Signature wine collections.
   ============================================================ */
.rhinory-page--gifts .g13-art-band {
	background: var(--g13-paper);
	border-top: 1px solid var(--g13-rule-2);
	padding-block: 112px;
}
@media (max-width: 900px) {
	.rhinory-page--gifts .g13-art-band { padding-block: 76px; }
}
.rhinory-page--gifts .g13-art {
	display: grid;
	grid-template-columns: 1fr 1fr;
	align-items: stretch;
	border: 1px solid var(--g13-rule-2);
	background: var(--g13-card);
	overflow: hidden;
}
@media (max-width: 1000px) {
	.rhinory-page--gifts .g13-art { grid-template-columns: 1fr; }
}
/* Same swap as the hero stage above (§ 1): a core/image the operator replaces
   from the canvas, with the crop moved from `background-position` to
   `object-position` and the `image-set()` pair retired in favour of the
   mu-plugin's picture-wrap. `background-color` stays as the ground that shows
   while the photo decodes, or if a swapped-in image ever 404s. */
.rhinory-page--gifts .g13-art__img {
	position: relative;
	min-height: 460px;
	margin: 0;
	background-color: var(--g13-card-2);
	filter: saturate(0.96) contrast(1.03);
}
.rhinory-page--gifts .g13-art__img img {
	position: absolute;
	inset: 0;
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center 42%;
}
.rhinory-page--gifts .g13-art__body {
	padding: 64px 56px;
	display: flex;
	flex-direction: column;
	gap: 18px;
	justify-content: center;
}
@media (max-width: 640px) {
	.rhinory-page--gifts .g13-art__body { padding: 44px 26px; }
}
.rhinory-page--gifts .g13-art__heading {
	font-family: var(--g13-ff-display);
	font-weight: 500;
	font-size: clamp(32px, 3.6vw, 48px);
	line-height: 1.04;
	letter-spacing: -0.008em;
	color: var(--g13-ink);
	margin: 0;
	max-width: 20ch;
}
.rhinory-page--gifts .g13-art__heading em {
	font-style: italic;
	font-weight: 500;
	color: var(--g13-burgundy);
}
.rhinory-page--gifts .g13-art__lede {
	font-family: var(--g13-ff-body);
	font-size: var(--g13-type-lede);
	line-height: 1.7;
	color: var(--g13-ink-2);
	max-width: 44ch;
	margin: 0;
}
.rhinory-page--gifts .g13-art__attr {
	list-style: none;
	margin: 6px 0 0 0;
	padding: 18px 0 0 0;
	border-top: 1px solid var(--g13-rule-2);
	display: flex;
	flex-direction: column;
	gap: 8px;
	font-family: var(--g13-ff-label);
	font-size: 10.5px;
	font-weight: 600;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: var(--g13-muted);
}
/* `b` AND `strong`: the list is now a core/list block, and core's bold format
   writes <strong>. The authored markup is <strong> — <b> stays matched so an
   older paste or a hand edit paints the same. */
.rhinory-page--gifts .g13-art__attr li b,
.rhinory-page--gifts .g13-art__attr li strong {
	color: var(--g13-burgundy);
	font-weight: 600;
}
.rhinory-page--gifts .g13-art__body .g13-btns { margin-top: 6px; }

/* ============================================================
   7 · FOUNDATION CLOSER  (templates/page-gift.html `.g13-close` — `.g-close`)
   The one dark surface this file paints. It is a theme SECTION, not site
   chrome — the nav / campaign bar / footer are untouched.

   DELIBERATELY NOT SHARED WITH /shop/'s `rhinory-foundation-close` (carried
   over from the retired patterns/gifts-04-foundation-close.php): same dark
   band, but the gift gateway's copy addresses the GIVER ("Every gift opens a
   second door") and adds the 501(c)(3) / EIN / partner line, where /shop/'s
   copy addresses the buyer. Same design vocabulary, different message — the two
   sections stay separate so editing one never rewrites the other.

   Its landmark name ("Rhinory Foundation") is applied at render time by
   inc/gift-page-landmarks.php, not authored in the template: `core/group` has
   no `aria-label` attribute and core would flag the section as invalid content
   in the editor.
   ============================================================ */
.rhinory-page--gifts .g13-close {
	position: relative;
	overflow: hidden;
	background: var(--g13-carbon);
	color: var(--g13-paper);
	padding: 104px var(--g13-gutter);
	text-align: center;
}
.rhinory-page--gifts .g13-close::before {
	content: "";
	position: absolute;
	inset: 0;
	background: radial-gradient(60% 80% at 50% 0%, rgba(226, 197, 143, 0.09), transparent 70%);
}
.rhinory-page--gifts .g13-close > * {
	position: relative;
	z-index: 2;
}
.rhinory-page--gifts .g13-close__heading {
	font-family: var(--g13-ff-display);
	font-weight: 600;
	font-size: var(--g13-type-h2);
	line-height: 1.03;
	letter-spacing: -0.012em;
	color: var(--g13-paper);
	margin: 0 auto;
	max-width: 34ch;
}
.rhinory-page--gifts .g13-close__heading em {
	/* `display: block` removed 2026-08-29: this heading now carries an authored
	   <br> in the pattern, so the break lives where the copy lives and an
	   operator editing the heading can see it. Faking the break off the em meant
	   it silently depended on the italic clause staying the second half. */
	font-style: italic;
	font-weight: 600;
	color: var(--g13-gold-soft);
}
.rhinory-page--gifts .g13-close__body {
	font-family: var(--g13-ff-body);
	font-size: var(--g13-type-lede);
	line-height: 1.68;
	color: rgba(241, 228, 206, 0.9);
	max-width: 58ch;
	margin: 22px auto 0 auto;
}
.rhinory-page--gifts .g13-close__stat { margin: 30px 0 0 0; }
.rhinory-page--gifts .g13-close__stat-fig {
	display: block;
	font-family: var(--g13-ff-display);
	font-style: italic;
	font-weight: 500;
	font-size: clamp(44px, 5vw, 60px);
	line-height: 1;
	color: var(--g13-gold-soft);
}
.rhinory-page--gifts .g13-close__stat-label {
	display: block;
	margin-top: 6px;
	font-family: var(--g13-ff-label);
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: rgba(241, 228, 206, 0.8);
}
.rhinory-page--gifts .g13-close__ein {
	margin: 26px 0 0 0;
	font-family: var(--g13-ff-label);
	font-size: 10.5px;
	font-weight: 600;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: rgba(241, 228, 206, 0.66);
	line-height: 1.9;
}
.rhinory-page--gifts .g13-close .g13-btns {
	justify-content: center;
	margin-top: 30px;
}
.rhinory-page--gifts .g13-close__sig {
	font-family: var(--g13-ff-display);
	font-style: italic;
	font-weight: 500;
	font-size: 30px;
	color: var(--g13-paper);
	display: inline-block;
	margin: 34px 0 0 0;
	padding: 16px 38px;
	border-top: 1px solid rgba(241, 228, 206, 0.25);
	border-bottom: 1px solid rgba(241, 228, 206, 0.25);
}

/* The dark closer must meet the dark site footer with no seam. `.rhinory-page`
   (style.css § GENERIC PAGE TEMPLATE) reserves `padding-bottom: 120px` for the
   dark generic-page register; this page carries BOTH classes, and § 0 repaints
   the wrapper paper, so that reserved band rendered as a cream strip between
   `.g13-close` and the footer. The prototype has no such strip: the closer runs
   flush into the chrome (09-gifts.html — `.g-close` is the last thing on the
   page). `.g13-close` supplies its own 104px bottom padding, so the reserve has
   no job here.

   Same defect and same fix as /shop/ (`.rhinory-page--shop { padding-bottom: 0 }`,
   style.css) — zeroed page-side, NOT by touching parts/footer.html, because the
   footer is site chrome shared by every template and the strip is this page's
   wrapper, not the footer's.

   Class doubled to (0,2,0): `.rhinory-page` and `.rhinory-page--gifts` are both
   (0,1,0), so a single class would leave the winner decided by print order.
   gifts.css declares `rhinory-v4-style` as a dependency and does print after it
   today, but the whole point of this file's scoping discipline is that order is
   not something it depends on. */
.rhinory-page--gifts.rhinory-page--gifts {
	padding-bottom: 0;
}

/* ============================================================
   7b · SPLIT HEADERS  (Nicole, 2026-08-29 — 09-gifts.html `.g-split`)
   ------------------------------------------------------------
   Three section heads now carry an authored <br> at the roman/italic seam, the
   way the hero h1 already did: `.g13-head__heading` (§ 2),
   `.g13-art__heading` (§ 6) and `.g13-close__heading` (§ 7). A heading that
   carries its own break must RELEASE the `ch` measure travelling with it —
   capping a line that is already broken wraps it twice — and `text-wrap` steps
   from `balance` to `pretty` for the same reason: balancing a two-line heading
   that has already chosen its own two lines just fights the author.

   Written as `h2.g13-split` rather than `.g13-split` so it is (0,3,0): it has
   to beat the per-heading `max-width` rules AND the 1040px
   `.g13-head__heading { max-width: 30ch }` step, which is a (0,2,0) tie this
   would otherwise win or lose by source order.

   THE ART HEAD STAYS AN <h2>. The design-of-record draws it as
   `<h3 id="art-h">` and did so before this pass; it is a PEER of the other two
   section heads, not subordinate to them, so the theme takes the hard break and
   leaves the level (decided 2026-08-29 —
   docs/briefs/2026-08-29-gift-v13-card-reconcile.md § the three decisions).
   ============================================================ */
.rhinory-page--gifts h1.g13-split,
.rhinory-page--gifts h2.g13-split,
.rhinory-page--gifts h3.g13-split {
	max-width: none;
	text-wrap: pretty;
}

/* ============================================================
   8 · REDUCED MOTION
   Everything this file animates is decorative — hover lifts, the tile's
   image scale, the route arrow. None of it carries meaning, so it all goes.
   ============================================================ */
@media (prefers-reduced-motion: reduce) {
	.rhinory-page--gifts .g13-btn,
	.rhinory-page--gifts .g13-route__arrow,
	.rhinory-page--gifts .winery-product-card.winery-product-card,
	.rhinory-page--gifts .winery-product-card .winery-product-card__image,
	.rhinory-page--gifts .winery-product-card .winery-product-card__secondary-image {
		transition: none;
	}
	.rhinory-page--gifts .g13-btn:hover,
	.rhinory-page--gifts .winery-product-card.winery-product-card:hover,
	.rhinory-page--gifts .winery-product-card.winery-product-card:focus-within {
		transform: none;
	}
	.rhinory-page--gifts .g13-route__link:hover .g13-route__arrow { transform: none; }
	.rhinory-page--gifts .winery-product-card:hover .winery-product-card__image,
	.rhinory-page--gifts .winery-product-card:focus-within .winery-product-card__image {
		transform: none;
	}
}
