/*
 * GREEN BADGER — responsive shell foundation (Phase 1).
 *
 * A NEW layer, loaded after sections.css. It adds nothing to and removes
 * nothing from the existing section breakpoints: every rule here is either a
 * custom property, or scoped to markup that only this file's PHP renders
 * (.dm-app-bar / .dm-app-nav / .dm-sheet), or lives inside the app-shell
 * capability query where the desktop design is not in play at all.
 *
 * Migrating individual sections onto the tokens below is later work.
 */

/* ------------------------------------------------------------ tokens */

body.dm-pack-green-badger {
	/* Brand, unchanged from the v3 system — restated here so the shell does
	   not have to reach into a section stylesheet for them. */
	--dm-black: #0b0b0a;
	--dm-gold: #b89a5b;
	--dm-cream: #f4f1e8;

	/* The registration margin invariant: never 0 at any width. The mobile
	   shell's horizontal gutter is the same measure, so chrome and content
	   register against one edge. */
	--margin: clamp(16px, 4vw, 96px);
	--gutter: var(--margin);

	/* The only four structural breakpoints this system introduces: 768 /
	   1024 / 1280 / 1600. Recorded as values so future work can read them
	   rather than re-guess. */
	--dm-bp-sm: 768px;
	--dm-bp-md: 1024px;
	--dm-bp-lg: 1280px;
	--dm-bp-xl: 1600px;

	--dm-appbar-h: 56px;
	--dm-appbar-h-compact: 48px;
	--dm-appnav-h: 56px;
	--dm-tap: 44px;

	/* The announcement is the first band of the fixed top chrome, so its height
	   has to be a number the shell can reserve. 0 unless one is actually
	   rendered — see the :has() rules below. */
	--dm-announce-h: 0px;

	/* WordPress owns the admin bar; the shell only has to start below it. The
	   fixed chrome cannot inherit html's margin-top, so the offset is restated
	   here at the two heights WP itself uses. */
	--dm-admin-offset: 0px;

	--dm-safe-top: env(safe-area-inset-top, 0px);
	--dm-safe-bottom: env(safe-area-inset-bottom, 0px);
	--dm-safe-left: env(safe-area-inset-left, 0px);
	--dm-safe-right: env(safe-area-inset-right, 0px);

	--dm-hairline: rgba(184, 154, 91, .28);
	--dm-scrim: rgba(11, 11, 10, .72);
}

body.dm-pack-green-badger:has(.dm-header-announcement) {
	--dm-announce-h: var(--dm-header-announcement-height, 36px);
}

/* Dismissed, or hidden by the pack's own mobile switch: the band is gone, so
   the reservation has to go with it or the gap comes back as dead space. */
body.dm-pack-green-badger:has(.dm-header-announcement.is-dismissed) {
	--dm-announce-h: 0px;
}

@media (max-width: 921px) {
	body.dm-header-announcement-mobile-hidden.dm-pack-green-badger {
		--dm-announce-h: 0px;
	}
}

body.admin-bar.dm-pack-green-badger { --dm-admin-offset: 32px; }

@media (max-width: 782px) {
	body.admin-bar.dm-pack-green-badger { --dm-admin-offset: 46px; }
}

/* At 600px WP core stops fixing the admin bar (#wpadminbar goes
   position:absolute and scrolls away with the page), so a constant offset
   would leave a 46px orphan band once it has scrolled off. Below 600px the
   chrome is sticky in real flow (see the ≤600px block further down) and
   needs no reservation at all. */
@media (max-width: 600px) {
	body.admin-bar.dm-pack-green-badger { --dm-admin-offset: 0px; }
}

/* ------------------------------------------------------- shell switch
 *
 * Both chromes are always in the DOM — server-rendered, no UA sniffing — and
 * CSS alone decides which one a device sees. Width and pointer BOTH have to
 * agree: a coarse pointer at 1024px+ (tablet in landscape) is a desktop-chrome
 * device, and a fine pointer in a narrow window never gets a bottom nav.
 */

.dm-app-bar,
.dm-app-nav {
	display: none;
}

@media (max-width: 1023px) {
	body.dm-pack-green-badger .dm-app-bar {
		display: flex;
	}

	/* Grid, not flex — .dm-app-nav's own rule (below) reserves the GUIDE
	   button's centre column; this higher-specificity switch has to agree
	   with it or the four real tabs collapse to content width. */
	body.dm-pack-green-badger .dm-app-nav {
		display: grid;
	}

	/* The desktop header is the other half of the switch. Astra renders its
	   own mobile header inside this element; the app bar replaces it. */
	body.dm-pack-green-badger .site-header,
	body.dm-pack-green-badger #masthead {
		display: none;
	}

	/* Two other plugins already fix a bar to the bottom of a phone: the generic
	   chrome-extras tab bar and Fruitera's mobile nav. All three are the same
	   idea, and only one of them may exist — under this pack it is the app nav. */
	body.dm-pack-green-badger .dm-tabbar {
		display: none;
	}

	/* Fruitera declares its bar `display:grid !important`, so nothing but
	   `!important` can retire it. This is the one place in this file that needs
	   it, and it is a suppression of foreign markup rather than a style of our
	   own that had to shout to be heard. */
	body.dm-pack-green-badger .fr-mobile-app-nav {
		display: none !important;
	}

	/* The announcement joins the fixed top chrome instead of standing in flow.
	 *
	 * In flow it was the first child of <body>, so the reservation body makes
	 * for the fixed app bar was inserted ABOVE it — the announcement started
	 * one whole bar-height down from the top (or from the admin bar), which is
	 * the gap. Out of flow there is nothing above it to reserve against: the
	 * band sits at the top, the app bar sits directly under it, and body
	 * reserves the two together.
	 */
	body.dm-pack-green-badger .dm-header-announcement {
		position: fixed;
		inset: calc(var(--dm-admin-offset) + var(--dm-safe-top)) 0 auto 0;
		/* Its own 9991 would put it over the bottom sheet (1000). Inside the
		   shell it only ever has to clear the app bar. */
		z-index: 901;
	}

	body.dm-pack-green-badger .dm-app-bar {
		top: calc(var(--dm-admin-offset) + var(--dm-safe-top) + var(--dm-announce-h));
	}

	/* The app bar carries the safe-area inset itself when it is the topmost
	   band. With an announcement above it, that band belongs to the
	   announcement — the bar would otherwise reserve the notch a second time. */
	body.dm-pack-green-badger:has(.dm-header-announcement:not(.is-dismissed)) .dm-app-bar {
		height: var(--dm-appbar-h);
		padding-top: 0;
	}

	body.dm-pack-green-badger:has(.dm-header-announcement:not(.is-dismissed)) .dm-app-bar.is-compact {
		height: var(--dm-appbar-h-compact);
	}

	body.dm-pack-green-badger {
		padding-top: calc(var(--dm-announce-h) + var(--dm-appbar-h) + var(--dm-safe-top));
		padding-bottom: calc(var(--dm-appnav-h) + var(--dm-safe-bottom));
	}
}

/* ≤600px: nothing may pin to an admin-bar constant, because WP's own bar is
 * absolute here and scrolls away. The whole top chrome — announcement + app
 * bar, wrapped by .dm-app-chrome in the PHP — is ONE sticky flow element:
 * at scroll 0 it sits naturally below the in-flow admin bar, and once that
 * bar scrolls off the wrapper pins itself to y=0. Logged-out is the same
 * code path with the admin bar simply absent from the flow.
 */
@media (max-width: 600px) {
	body.dm-pack-green-badger .dm-app-chrome {
		position: sticky;
		top: 0;
		z-index: 901;
	}

	body.dm-pack-green-badger .dm-header-announcement {
		position: relative;
		inset: auto;
	}

	body.dm-pack-green-badger .dm-app-bar {
		/* Relative, not static: geometrically identical inside the sticky
		   wrapper, but gives the transparent-at-top ::after panel (further
		   down) a box to fill. The fixed-mode top offset (announcement rule
		   above) would otherwise apply as a relative shift — neutralise it. */
		position: relative;
		top: auto;
	}

	/* The sticky wrapper occupies its own real flow space, so a computed
	   reservation on top of it would double-count. The bottom nav is still
	   fixed and keeps its reservation. */
	body.dm-pack-green-badger {
		padding-top: 0;
	}
}

/* ------------------------------------------------------------ top bar
 *
 * Never hides. It only compresses, so the brand mark is on screen at every
 * scroll position.
 */

.dm-app-bar {
	position: fixed;
	inset: 0 0 auto 0;
	z-index: 900;
	align-items: center;
	gap: 8px;
	height: calc(var(--dm-appbar-h) + var(--dm-safe-top));
	padding: var(--dm-safe-top) calc(var(--gutter) + var(--dm-safe-right)) 0 calc(var(--gutter) + var(--dm-safe-left));
	background: var(--dm-black);
	border-bottom: 1px solid transparent;
	transition: height 220ms ease, border-color 220ms ease;
}

.dm-app-bar.is-compact {
	height: calc(var(--dm-appbar-h-compact) + var(--dm-safe-top));
	border-bottom-color: var(--dm-hairline);
}

.dm-app-bar__brand {
	display: flex;
	align-items: center;
	margin-right: auto;
	min-height: var(--dm-tap);
	color: var(--dm-cream);
	text-decoration: none;
}

/* The theme and the Fruitera skin both size site logos by their own selectors,
   and either would win over a plain descendant rule here — so the app bar's
   mark is sized from the bar itself, which owns the only height that matters. */
body.dm-pack-green-badger .dm-app-bar__brand img,
body.dm-pack-green-badger .dm-app-bar__brand svg {
	display: block;
	/* Both dimensions are stated. `width:auto` would be the natural way to keep
	   the mark's aspect, but a global `aspect-ratio` further up the cascade
	   collapsed it to a square — `object-fit` restores the true proportions
	   inside a box this file controls outright. */
	width: 132px;
	height: 28px;
	object-fit: contain;
	object-position: left center;
	transition: height 220ms ease;
}

body.dm-pack-green-badger .dm-app-bar.is-compact .dm-app-bar__brand img,
body.dm-pack-green-badger .dm-app-bar.is-compact .dm-app-bar__brand svg {
	height: 22px;
}

.dm-app-bar__brand-text {
	font-family: 'Cormorant Garamond', Georgia, serif;
	font-size: 19px;
	letter-spacing: .12em;
	text-transform: uppercase;
}

.dm-app-bar__action {
	position: relative;
	display: flex;
	flex: 0 0 var(--dm-tap);
	align-items: center;
	justify-content: center;
	width: var(--dm-tap);
	height: var(--dm-tap);
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	color: var(--dm-cream);
	text-decoration: none;
	cursor: pointer;
}

.dm-app-bar__action .dm-ic {
	width: 21px;
	height: 21px;
}

.dm-app-bar__count {
	position: absolute;
	top: 6px;
	right: 4px;
	min-width: 16px;
	height: 16px;
	padding: 0 4px;
	background: var(--dm-gold);
	color: var(--dm-black);
	font-family: 'Noto Sans JP', system-ui, sans-serif;
	font-size: 10px;
	font-weight: 700;
	line-height: 16px;
	text-align: center;
}

.dm-app-bar__count[data-dm-count="0"] {
	display: none;
}

/* ---- Transparent at page top, settled after ~160px of scroll ----------
 *
 * Same mechanism as the desktop header (sections.css, gb-header-settle):
 * at scroll 0 the bar paints only a soft scrim (::before) so the hero art
 * shows through, and the solid panel (::after) is faded in by a CSS
 * scroll-driven animation across the first 160px. No script, no second
 * scroll listener — the compress-on-scroll JS keeps toggling .is-compact
 * independently and the two never touch the same property.
 *
 * The bar's flat paint is owned by chrome-inversion.css (--dm-bar-bg,
 * loaded after this file), so two things compose with it here: the
 * transparent override needs the .dm-app-chrome ancestor to outrank it,
 * and the settle panel paints var(--dm-bar-bg) — with the same
 * --dm-chrome-shift transition — so the cream inversion keeps working,
 * just one layer down. Keyframes are duplicated locally rather than
 * reusing gb-header-settle so this file stays standalone.
 */

@keyframes dm-appbar-settle {
	from { opacity: 0; }
	to   { opacity: 1; }
}

@keyframes dm-appbar-scrim-lift {
	from { opacity: 1; }
	to   { opacity: 0; }
}

@media (max-width: 1023px) {
	body.dm-pack-green-badger .dm-app-chrome .dm-app-bar {
		background: transparent;
	}

	/* Top-of-page scrim: keeps the brand mark and icons readable over the
	   hero art. Fades out as the settle panel fades in. */
	body.dm-pack-green-badger .dm-app-bar::before {
		content: "";
		position: absolute;
		inset: 0;
		z-index: -1;
		background: linear-gradient(180deg, rgba(7, 9, 7, .55) 0%, rgba(7, 9, 7, .2) 100%);
		opacity: 1;
		pointer-events: none;
	}

	body.dm-pack-green-badger .dm-app-bar::after {
		content: "";
		position: absolute;
		inset: 0;
		z-index: -1;
		background: var(--dm-bar-bg, var(--dm-black));
		opacity: 0;
		pointer-events: none;
		transition: background-color var(--dm-chrome-shift, 280ms) ease;
	}

	@supports (animation-timeline: scroll()) {
		body.dm-pack-green-badger .dm-app-bar::before {
			animation: dm-appbar-scrim-lift linear both;
			animation-timeline: scroll(root);
			animation-range: 0 160px;
		}
		body.dm-pack-green-badger .dm-app-bar::after {
			animation: dm-appbar-settle linear both;
			animation-timeline: scroll(root);
			animation-range: 0 160px;
		}
	}

	/* Engines without scroll-driven animations get one settled bar — the
	   resting state is the readable one, matching the desktop fallback. */
	@supports not (animation-timeline: scroll()) {
		body.dm-pack-green-badger .dm-app-bar::before { opacity: 0; }
		body.dm-pack-green-badger .dm-app-bar::after { opacity: 1; }
	}

	@media (prefers-reduced-motion: reduce) {
		body.dm-pack-green-badger .dm-app-bar::before { animation: none; opacity: 0; }
		body.dm-pack-green-badger .dm-app-bar::after { animation: none; opacity: 1; }
	}
}

/* --------------------------------------------------------- bottom nav */

.dm-app-nav {
	position: fixed;
	inset: auto 0 0 0;
	z-index: 900;
	/* display is set only inside the pointer:coarse switch further up —
	   this rule must NOT declare it, or it would win over that switch's
	   `display:none` on a fine-pointer/desktop viewport regardless of
	   source order (same specificity, this rule comes later). */
	/* 5 columns, not 4: the middle one is a dedicated, permanently empty gap
	   the GUIDE button sits over (green-badger-nav-guide.css) — the four real
	   tabs live in columns 1, 2, 4, 5 and never share a column with it. */
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) 74px minmax(0, 1fr) minmax(0, 1fr);
	align-items: stretch;
	height: calc(var(--dm-appnav-h) + var(--dm-safe-bottom));
	padding: 0 var(--dm-safe-right) var(--dm-safe-bottom) var(--dm-safe-left);
	background: var(--dm-black);
	border-top: 1px solid var(--dm-hairline);
}

/* The active indicator is one grid item that jumps to the active tab's own
   column — width and position both come for free from the grid instead of a
   translateX/percentage calc that assumed four equal-width flex columns. */
.dm-app-nav::before {
	content: "";
	grid-column: var(--dm-nav-active-col, 1);
	grid-row: 1;
	align-self: start;
	height: 2px;
	background: var(--dm-gold);
}

.dm-app-nav__item {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 3px;
	min-width: 0;
	color: rgba(244, 241, 232, .5);
	text-decoration: none;
	/* The Stamp slot is a <button>, not an <a> like the other three — these
	   reset it to look identical and avoid the Astra button:hover/:focus
	   background fight documented lower in this file. Inert on the <a>
	   items (border/background/font already default to this for them). */
	border: 0;
	background: none;
	font: inherit;
	cursor: pointer;
	-webkit-tap-highlight-color: transparent;
}

.dm-app-nav__item:hover,
.dm-app-nav__item:focus,
.dm-app-nav__item:active {
	background: none;
}

/* nth-CHILD, not nth-of-type: the 3rd item (Daily Stamp) is a <button>
   while the other three are <a> — nth-of-type counts same-tag siblings only
   and would silently miscount once the tags stopped matching. nth-child
   counts DOM position among ALL of .dm-app-nav's children, which is what
   these four are (positions 1-4; GUIDE's button/nudge follow after). */
.dm-app-nav__item { grid-row: 1; }

.dm-app-nav__item:nth-child(1) { grid-column: 1; }
.dm-app-nav__item:nth-child(2) { grid-column: 2; }
.dm-app-nav__item:nth-child(3) { grid-column: 4; }
.dm-app-nav__item:nth-child(4) { grid-column: 5; }

.dm-app-nav__item[aria-current="page"] {
	color: var(--dm-gold);
}

.dm-app-nav__item .dm-ic {
	width: 20px;
	height: 20px;
}

/* 目的 carries no icon: the glyph pair is the mark. It sits on the same
   optical line as the icons above the labels, so the row still scans as four
   equal targets. */
.dm-app-nav__glyph {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 20px;
	font-family: 'Noto Sans JP', system-ui, sans-serif;
	font-size: 13px;
	letter-spacing: .04em;
}

.dm-app-nav__label {
	font-family: 'Noto Sans JP', system-ui, sans-serif;
	font-size: 9px;
	letter-spacing: .08em;
	text-transform: uppercase;
	white-space: nowrap;
}

/* ------------------------------------------------------- bottom sheet
 *
 * Square corners and a 1px gold lip along the top edge instead of a drag
 * handle: the border IS the affordance, and it does not borrow another
 * platform's furniture.
 */

.dm-sheet[hidden] {
	display: none;
}

.dm-sheet {
	position: fixed;
	inset: 0;
	z-index: 1000;
}

.dm-sheet__scrim {
	position: absolute;
	inset: 0;
	background: var(--dm-scrim);
	opacity: 0;
	transition: opacity 260ms ease;
}

.dm-sheet.is-open .dm-sheet__scrim {
	opacity: 1;
}

.dm-sheet__panel {
	position: absolute;
	inset: auto 0 0 0;
	display: flex;
	flex-direction: column;
	max-height: 88vh;
	padding-bottom: var(--dm-safe-bottom);
	background: var(--dm-black);
	border-radius: 0;
	border-top: 1px solid var(--dm-gold);
	color: var(--dm-cream);
	transform: translateY(100%);
	transition: transform 260ms ease;
}

.dm-sheet.is-open .dm-sheet__panel {
	transform: translateY(0);
}

/* While a finger is on the panel it follows that finger exactly — no
   transition, or the panel lags behind the touch. */
.dm-sheet.is-dragging .dm-sheet__panel {
	transition: none;
}

.dm-sheet__head {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 14px var(--gutter);
	border-bottom: 1px solid var(--dm-hairline);
	/* The header is the drag surface, so the browser must not claim the
	   gesture as a scroll before the pointer handlers ever see it. */
	touch-action: none;
}

.dm-sheet__title {
	flex: 1 1 auto;
	margin: 0;
	/* Astra's own `h1,h2,...{color:var(--ast-global-color-2)}` targets h2
	   directly (main.min.css) and beats inherited color at equal specificity
	   no matter the source order — same fight documented in green-badger-
	   guide.css. Without this the sheet title (search/cart/guide alike)
	   renders in Astra's slate grey instead of --dm-cream. */
	color: var(--dm-cream);
	font-family: 'Cormorant Garamond', Georgia, serif;
	font-size: 20px;
	font-weight: 400;
	letter-spacing: .08em;
	text-transform: uppercase;
}

.dm-sheet__close {
	display: flex;
	align-items: center;
	justify-content: center;
	width: var(--dm-tap);
	height: var(--dm-tap);
	margin-right: -10px;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	color: var(--dm-cream);
	font-size: 17px;
	line-height: 1;
	cursor: pointer;
}

/* Chrome's default touch tap-highlight (a solid blue fill, not the UA focus
   outline) shows on real/CDP-simulated taps of a plain button/link with no
   override — same gap already closed elsewhere in this pack (green-badger-
   mobile.css et al.), just never set on these three shared shell controls. */
.dm-app-bar__action,
.dm-sheet__close,
.dm-app-nav__item {
	-webkit-tap-highlight-color: transparent;
}

/* The actual cause of the blue box on this button: Astra's theme.json
   `button:hover / button:focus { background: var(--ast-global-color-1) }`
   (its link/accent blue) is a bare-element + one-pseudo-class selector —
   (0,1,1) specificity — which OUTRANKS this plain `.dm-sheet__close`
   class rule (0,1,0) the instant the button is hovered or focused (exactly
   what happens on open, since app-shell.js focuses it). Restating the
   background at equal-or-higher specificity here is what actually closes
   that gap; :focus-visible's gold outline above only ever addressed the
   ring, never this separate background fight. */
.dm-app-bar__action:hover,
.dm-app-bar__action:focus,
.dm-app-bar__action:active,
.dm-sheet__close:hover,
.dm-sheet__close:focus,
.dm-sheet__close:active {
	background: none;
}

/* Plain :focus (mouse/programmatic — e.g. a sheet's own JS calling
   .focus() on its first focusable when it opens) is deliberately left
   without any ring; only :focus-visible below draws one. Without this reset
   the browser's own UA outline (blue) would otherwise show through here,
   off-brand and never overridden by the :focus-visible rule since the two
   pseudo-classes don't both match at once. */
.dm-app-bar__action:focus,
.dm-sheet__close:focus,
.dm-app-nav__item:focus {
	outline: none;
}

.dm-app-bar__action:focus-visible,
.dm-sheet__close:focus-visible,
.dm-app-nav__item:focus-visible {
	outline: 1px solid var(--dm-gold);
	outline-offset: -3px;
}

.dm-sheet__body a {
	color: var(--dm-gold);
}

.dm-sheet__body {
	flex: 1 1 auto;
	font-family: 'Noto Sans JP', system-ui, sans-serif;
	font-size: 14px;
	padding: 20px var(--gutter) 28px;
	overflow-y: auto;
	-webkit-overflow-scrolling: touch;
}

/* The one thing a body-scroll lock must not also do is shift the page. */
body.dm-sheet-open {
	overflow: hidden;
}

@media (prefers-reduced-motion: reduce) {
	.dm-app-bar,
	.dm-app-bar__brand img,
	.dm-app-bar__brand svg,
	.dm-app-nav::before,
	.dm-sheet__scrim,
	.dm-sheet__panel {
		transition: none;
	}
}

/* =====================================================================
 * GREEN BADGER — shared header drop-down product search
 * Native WooCommerce search results; this layer only owns the entry UI.
 * ===================================================================== */
.dm-header-search-strip[hidden] { display: none !important; }
.dm-header-search-strip {
	position: fixed;
	z-index: 998;
	left: 0;
	right: 0;
	top: var(--dm-search-strip-top, 0px);
	background: rgba(7, 8, 7, .985);
	border-top: 1px solid rgba(184,154,91,.14);
	border-bottom: 1px solid rgba(184,154,91,.32);
	box-shadow: 0 22px 44px rgba(0,0,0,.28);
	color: var(--dm-cream, #f4f1e8);
	transform: translateY(-8px);
	opacity: 0;
	transition: transform 180ms ease, opacity 180ms ease;
}
.dm-header-search-strip.is-open { transform: translateY(0); opacity: 1; }
.dm-header-search-strip__inner {
	width: min(1180px, calc(100% - 48px));
	margin: 0 auto;
	padding: 20px 0 16px;
}
.dm-header-search-strip__form {
	display: grid;
	grid-template-columns: 42px minmax(0,1fr) auto 42px;
	align-items: center;
	min-height: 54px;
	border-bottom: 1px solid rgba(184,154,91,.55);
}
.dm-header-search-strip__icon { display:grid; place-items:center; color:var(--dm-gold,#b89a5b); }
.dm-header-search-strip__icon svg { width:21px; height:21px; fill:none; stroke:currentColor; stroke-width:1.7; }
.dm-header-search-strip__form input[type="search"] {
	width: 100%;
	height: 54px;
	margin: 0;
	padding: 0 12px;
	border: 0 !important;
	outline: 0 !important;
	box-shadow: none !important;
	background: transparent !important;
	color: var(--dm-cream,#f4f1e8) !important;
	font: 500 14px/1.3 'Noto Sans JP', system-ui, sans-serif;
	letter-spacing: .035em;
}
.dm-header-search-strip__form input[type="search"]::placeholder { color: rgba(244,241,232,.46); }
.dm-header-search-strip__submit,
.dm-header-search-strip__close {
	appearance: none;
	border: 0;
	border-radius: 0;
	background: transparent;
	color: var(--dm-cream,#f4f1e8);
	cursor: pointer;
	-webkit-tap-highlight-color: transparent;
}
.dm-header-search-strip__submit {
	height: 38px;
	padding: 0 20px;
	border-left: 1px solid rgba(184,154,91,.32);
	color: var(--dm-gold,#b89a5b);
	font: 700 12px/1 'Noto Sans JP', system-ui, sans-serif;
	letter-spacing: .1em;
}
.dm-header-search-strip__close { width:42px; height:42px; font-size:24px; font-weight:300; line-height:1; }
.dm-header-search-strip__submit:hover,
.dm-header-search-strip__submit:focus-visible,
.dm-header-search-strip__close:hover,
.dm-header-search-strip__close:focus-visible { color:#fff; background:transparent; }
.dm-header-search-strip__submit:focus-visible,
.dm-header-search-strip__close:focus-visible,
.dm-header-search-strip__form input[type="search"]:focus-visible { outline: 1px solid var(--dm-gold,#b89a5b) !important; outline-offset: -2px; }
.dm-header-search-strip__recommended {
	display: flex;
	align-items: center;
	gap: 18px;
	min-width: 0;
	padding-top: 13px;
	overflow-x: auto;
	scrollbar-width: none;
	white-space: nowrap;
}
.dm-header-search-strip__recommended::-webkit-scrollbar { display:none; }
.dm-header-search-strip__recommended-label {
	flex: 0 0 auto;
	color: rgba(244,241,232,.48);
	font: 600 10px/1 'Noto Sans JP', system-ui, sans-serif;
	letter-spacing: .12em;
	text-transform: uppercase;
}
.dm-header-search-strip__recommended a {
	position: relative;
	flex: 0 0 auto;
	padding: 4px 0;
	color: rgba(244,241,232,.82) !important;
	font: 600 11px/1 'Noto Sans JP', system-ui, sans-serif;
	letter-spacing: .08em;
	text-decoration: none !important;
}
.dm-header-search-strip__recommended a::after {
	content:"";
	position:absolute;
	left:0; right:0; bottom:0;
	height:1px;
	background:var(--dm-gold,#b89a5b);
	transform:scaleX(0);
	transform-origin:left;
	transition:transform 160ms ease;
}
.dm-header-search-strip__recommended a:hover::after,
.dm-header-search-strip__recommended a:focus-visible::after { transform:scaleX(1); }
body.dm-search-strip-open { overflow-x: hidden; }

@media (max-width: 1023px) {
	.dm-header-search-strip { z-index: 902; }
	.dm-header-search-strip__inner { width:100%; padding:10px max(14px,var(--gutter,16px)) 11px; }
	.dm-header-search-strip__form { grid-template-columns: 34px minmax(0,1fr) 58px 34px; min-height:46px; }
	.dm-header-search-strip__form input[type="search"] { height:46px; padding:0 8px; font-size:13px; }
	.dm-header-search-strip__submit { height:34px; padding:0 10px; font-size:11px; }
	.dm-header-search-strip__close { width:34px; height:34px; font-size:21px; }
	.dm-header-search-strip__recommended { gap:14px; padding-top:10px; }
	.dm-header-search-strip__recommended-label { font-size:9px; }
	.dm-header-search-strip__recommended a { font-size:10px; }
}
@media (prefers-reduced-motion: reduce) {
	.dm-header-search-strip { transition:none; }
	.dm-header-search-strip__recommended a::after { transition:none; }
}


/* Search v3 polish — preserve the square Green Badger language, improve usability. */
.dm-header-search-strip__form {
  border:1px solid rgba(184,154,91,.30);
  border-bottom-color:rgba(184,154,91,.58);
}
.dm-header-search-strip__form input[type="search"] { font-size:16px !important; min-height:48px; }
.dm-header-search-strip__submit,
.dm-header-search-strip__close { min-width:44px; min-height:44px; }
.dm-header-search-strip__submit { height:44px; }
.dm-header-search-strip__close { width:44px; height:44px; }
.dm-header-search-strip__recommended-label { font-size:11px; color:rgba(244,241,232,.58); }
.dm-header-search-strip__recommended a {
  min-height:32px;
  display:inline-flex;
  align-items:center;
  padding:6px 9px;
  border:1px solid rgba(184,154,91,.22);
  color:rgba(244,241,232,.88) !important;
}
.dm-header-search-strip__recommended a:hover,
.dm-header-search-strip__recommended a:focus-visible { border-color:rgba(184,154,91,.62); }
.dm-header-search-strip__recommended a::after { display:none; }
@media (max-width:1023px) {
  .dm-header-search-strip__form { grid-template-columns:36px minmax(0,1fr) 64px 44px; min-height:50px; }
  .dm-header-search-strip__form input[type="search"] { height:48px; font-size:16px !important; }
  .dm-header-search-strip__submit { height:44px; min-width:60px; font-size:11px; }
  .dm-header-search-strip__close { width:44px; height:44px; font-size:21px; }
  .dm-header-search-strip__recommended a { min-height:34px; font-size:11px; }
  .dm-header-search-strip__recommended-label { font-size:10px; }
}
