/**
 * LefiL Theme — responsive breakpoint helpers.
 * Breakpoint: 1024px (Figma desktop frame 1440px / mobile frame 390px).
 * Any element carrying a class containing "--desktop" or "--mobile" is
 * toggled by this single rule set, so new sections don't need new CSS.
 *
 * This used to split at 768px while the header alone switched at 1024px
 * (its desktop nav — tagline + 5 links + pill button in one row — gets
 * uncomfortably tight before 768px). That mismatch left a 768-1024px "gap
 * zone" where the header showed its mobile hamburger UI while every other
 * section still rendered its desktop layout — and several sections
 * (Concept's absolutely-positioned photo scatter, News' 712px+520px+48px
 * grid, ~1280px min-width) were never designed to fit in that range, so
 * they visibly overflowed/broke there. Moving every section to the
 * header's 1024px breakpoint removes the mismatch; the simpler
 * (already-designed-for-390px) mobile layouts scale up to tablet widths
 * far more gracefully than the desktop ones scale down.
 *
 * NOTE 1: these elements always have other utility classes appended after
 * the --desktop/--mobile token (e.g. "site-header--desktop has-background"),
 * so this MUST be a substring match ([class*=]), not an ends-with match
 * ([class$=]) — ends-with only matches when --desktop/--mobile happens to
 * be the last class in the attribute, which is never the case here.
 *
 * NOTE 2: every rule here needs !important. WordPress's own block-library
 * CSS ships `body .is-layout-flex{display:flex}`, which has specificity
 * (0,1,1) — higher than a bare attribute selector (0,1,0) — and every one
 * of our flex-layout --desktop/--mobile groups carries the is-layout-flex
 * class. Without !important that core rule silently wins regardless of
 * source order, and both variants stay visible at every width.
 *
 * NOTE 3: when a hidden group is revealed again, it needs the SAME display
 * value it would have had natively — "flex" for a flex-layout group (the
 * WP-added is-layout-flex class marks these), "block" for a constrained/
 * flow-layout group (the block default). A single blanket display value
 * would break whichever type it doesn't match, so the two are split below.
 */

/*
 * WordPress's global styles apply the root blockGap (24px) to every
 * top-level block inside .wp-site-blocks via
 * :where(.wp-site-blocks) > * { margin-block-start: ... } — a LOGICAL
 * property, not margin-top, so a plain margin-top:0 silently loses (it's a
 * different property that happens to map to the same physical edge).
 * Targeting .wp-block-group directly also missed the footer's case: the
 * <!-- wp:template-part --> block renders an EXTRA wrapping <footer
 * class="wp-block-template-part"> around footer.html's own root <footer
 * class="wp-block-group site-footer">, so the direct child of
 * .wp-site-blocks receiving this margin is that outer wrapper, not the
 * inner one. Targeting every direct child of .wp-site-blocks by position
 * sidesteps both issues.
 */
.wp-site-blocks > * {
	margin-block-start: 0 !important;
}

/*
 * Same root blockGap margin-top (24px), applied instead to every top-level
 * section inside <main> (.home-news, .home-concept, .home-menu, ...).
 * Every section already creates its own visual separation from its
 * neighbor via generous padding (80-150px) and a background-color/border
 * change, so this extra 24px on top just widened the gap unintentionally
 * beyond what Figma specifies between sections.
 */
main.wp-block-group > * {
	margin-top: 0 !important;
}

/*
 * Same blockGap mechanism also adds margin-top to whichever of the
 * --desktop/--mobile pair is NOT the first child of its ".home-X" wrapper
 * (the --mobile variant is always second in markup order), even while the
 * other variant sits hidden via display:none. That produced an unwanted
 * 24px gap above the Hero photo on mobile. Neither variant should ever
 * carry this margin — visual spacing between sections is intentionally
 * handled by each section's own padding, not by WP's flow blockGap.
 */
[class*="--desktop"],
[class*="--mobile"] {
	margin-top: 0 !important;
}

[class*="--mobile"] {
	display: none !important;
}

@media (max-width: 1024px) {

	[class*="--desktop"] {
		display: none !important;
	}

	[class*="--mobile"].is-layout-flex {
		display: flex !important;
	}

	[class*="--mobile"].is-layout-grid {
		display: grid !important;
	}

	[class*="--mobile"]:not(.is-layout-flex):not(.is-layout-grid) {
		display: block !important;
	}

	/*
	 * core/cover is flex by its own default core CSS (align-items/
	 * justify-content: center, for vertically/horizontally centering its
	 * inner-container per the block's contentPosition) but never carries
	 * the is-layout-flex marker class — that marker only gets added by
	 * WP's layout block-support system to Group-family blocks. Without
	 * this override, the :not(.is-layout-flex):not(.is-layout-grid) rule
	 * above forces display:block on every --mobile-suffixed Cover block,
	 * silently discarding its centering and leaving the text pinned to
	 * the top of the cover instead of centered. Higher specificity than
	 * that rule (4 selectors vs. 3) so it wins despite coming first.
	 */
	[class*="--mobile"].wp-block-cover:not(.is-layout-flex):not(.is-layout-grid) {
		display: flex !important;
	}
}

/*
 * Desktop sections wider than the 1440px Figma frame: cap and center.
 *
 * theme.json sets contentSize/wideSize (1280px/1440px), and any section
 * using "layout":{"type":"constrained"} gets that cap applied to its
 * content automatically by WP core — those sections already center fine
 * past 1440px and need nothing here.
 *
 * But most of this theme's --desktop sections use "layout":{"type":"flex"}
 * with a fixed edge padding (e.g. padding:120px 80px, or the
 * --wp--preset--spacing--section token) instead, which has no such cap:
 * past 1440px the fixed padding stays put and the content between it just
 * keeps stretching to fill the viewport. Each section listed below is
 * exactly that case — verified individually, since a blanket
 * [class*="--desktop"] rule would also catch full-bleed Cover-block heroes
 * (party-hero--desktop, concept-hero--desktop) and home-hero--desktop
 * (which wraps one), where capping the box would wrongly shrink the photo
 * itself; those are deliberately left out.
 *
 * box-sizing:border-box is required: these sections' own edge padding must
 * count toward the 1440px cap (matching how wideSize already behaves),
 * not be added on top of it.
 */
.page-title-header--desktop,
.news-filter-tabs--desktop,
.home-access--desktop,
.access-info--desktop,
.concept-philosophy--desktop,
.concept-chef--desktop,
.concept-detail--desktop,
.gallery-page--desktop.gallery-filter-tabs,
.home-concept-teaser--desktop {
	max-width: 1440px;
	margin-left: auto;
	margin-right: auto;
	box-sizing: border-box;
}

/*
 * .home-contact--desktop itself carries a full-bleed background photo
 * (.home-contact__bg, absolutely positioned via inset:0 against this same
 * element) — capping that box directly would shrink the photo along with
 * the content, the exact "background stays 100%, only the content centers"
 * split the fix is meant to preserve. .home-contact__inner is the actual
 * content row (WebCard/PhoneCard etc.), so it gets the cap instead.
 */
.home-contact__inner {
	max-width: 1440px;
	margin-left: auto;
	margin-right: auto;
}

/*
 * Separators inside a vertical flex group (WP's default align-items:
 * flex-start for that layout, same as every other stretch fix in this
 * file) collapse to 0 width instead of spanning the row — invisible
 * dividers with no visual symptom to grep for except "the line I expected
 * isn't there". A separator's whole purpose is to span full width, so
 * this is a safe blanket fix rather than a per-usage one. Placed early so
 * later width overrides (e.g. the short kicker rules below) still win.
 */
.wp-block-separator {
	width: 100%;
}

/*
 * Reusable "photo + justified text column" split-panel layout: a
 * horizontal flex row (.split-panel) pairing a full-height photo with a
 * text column (.split-panel__column) that stretches to the same height
 * and internally splits its own content — a heading block at the top, a
 * CTA button pinned to the bottom — via justify-content:space-between.
 *
 * WP's .is-layout-flex row default is align-items:center, so without the
 * stretch override the text column keeps its own natural content height
 * and visibly floats in the middle of the row instead of filling it,
 * which is what left an empty gap below the button. Even once the column
 * is stretched, an inline justify-content is still needed: the
 * is-content-justification-space-between class WP adds from the
 * justifyContent JSON attribute doesn't reliably win the cascade here, so
 * .split-panel__column sets it directly instead of depending on that
 * class. Reused by the standalone Concept page (same layout pattern).
 */
.split-panel {
	align-items: stretch;
}

.split-panel__column {
	display: flex;
	flex-direction: column;
	justify-content: space-between;
}

/*
 * Scroll-aware header (see assets/js/header-scroll.js). --site-header-height
 * is a fallback for the brief window before JS measures the real value;
 * it's kept close to each breakpoint's actual header height so there's no
 * visible layout jump. The header is fixed and slides out of view via
 * transform, driven by the .is-header-hidden class the script toggles.
 */
:root {
	--site-header-height: 96px;
}

@media (max-width: 1024px) {
	:root {
		--site-header-height: 63px;
	}
}

/*
 * When logged in, WP's admin bar is itself position:fixed at the true
 * viewport top (32px tall, 46px under 783px) and pushes <body> down via
 * margin-top — but a position:fixed descendant like our header ignores
 * that body margin and would sit at true top:0, underneath the admin bar,
 * leaving a gap above the page content that isn't there when logged out.
 * WP core exposes the exact offset as --wp-admin--admin-bar--height on
 * <html> (0 when the bar isn't shown), so anchoring to it keeps the header
 * flush under the admin bar at every breakpoint without duplicating its
 * media query here.
 */
.site-header {
	position: fixed;
	top: var(--wp-admin--admin-bar--height, 0px);
	left: 0;
	width: 100%;
	z-index: 9999;
	transition: transform 0.3s ease;
}

.site-header.is-header-hidden {
	transform: translateY(-100%);
}

main.wp-block-group {
	padding-top: var(--site-header-height);
}

/*
 * TOP page first view: the header floats transparently over the hero photo
 * instead of sitting in its own opaque band above it (Figma: Header frame
 * sits at y:0, directly on top of the hero image). So on the front page
 * only, main isn't pushed down by the header's reserved height — the hero
 * itself renders flush to the true viewport top, with the fixed header
 * overlaid on top of it. header-scroll.js toggles .is-header-transparent
 * via an IntersectionObserver on .home-hero, so the header still turns
 * solid (this same reserved-space rule applies elsewhere) once the FV
 * section scrolls out of view.
 */
body.home main.wp-block-group {
	padding-top: 0;
}

/*
 * The transparent overlay look is the DEFAULT on the front page (no JS
 * needed), because waiting for header-scroll.js's IntersectionObserver to
 * add a class produced a brief flash of the solid white header over the
 * hero photo on first paint — exactly the "gray/white band" bug this was
 * reported as. JS's only job now is the opposite: add .is-header-solid once
 * the hero has scrolled out of view, restoring the normal (every other
 * page's) solid look. Every value below is copied from that solid state's
 * live computed styles so the restore is exact.
 */
/*
 * !important throughout: the header block's own backgroundColor:"base" /
 * textColor:"..." attributes render as WP preset classes
 * (has-base-background-color etc.), which core itself ships with
 * !important — a plain override here loses that fight, same reasoning as
 * the .is-header-solid restore rules below.
 */
body.home .site-header--desktop,
body.home .site-header--mobile {
	background-color: transparent !important;
	border-bottom-color: transparent !important;
}

.site-header--desktop,
.site-header--mobile {
	transition: background-color 0.3s ease, border-color 0.3s ease;
}

/* Figma's SEOText box is a fixed single line (197px, right of the 86px logo + 17px gap) */
.site-header__tagline {
	white-space: nowrap;
}

body.home .site-header__brand p {
	color: rgba(255, 255, 255, 0.85) !important;
}

body.home .site-header__logo img {
	filter: brightness(0) invert(1);
}

body.home .site-header__nav .wp-block-navigation-item__content {
	color: #fff;
}

body.home .site-header__reservation .wp-block-button__link,
body.home .site-header__reservation-mobile .wp-block-button__link {
	background-color: transparent !important;
	color: #fff !important;
	border-color: #fff !important;
	transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease;
}

/*
 * Hover: invert the transparent/white-outline button to a solid white fill
 * with dark text (border stays white, blending into the now-white fill).
 * Scoped to :not(.is-header-solid) — once the solid header state takes
 * over (see .is-header-solid rules below), the button is already a solid
 * white/primary look on its own, so this transparent-state-only inversion
 * doesn't apply there.
 */
body.home .site-header:not(.is-header-solid) .site-header__reservation .wp-block-button__link:hover,
body.home .site-header:not(.is-header-solid) .site-header__reservation-mobile .wp-block-button__link:hover {
	background-color: #ffffff !important;
	color: #1a1a1a !important;
	border-color: #ffffff !important;
}

body.home .wp-block-navigation__responsive-container-open {
	color: #fff;
}

/*
 * !important throughout: restoring the preset-driven "solid" colors has to
 * outrank both the transparent rules above and WP core's own !important
 * preset classes (has-text-subtle-color etc.) on the same elements.
 */
body.home .site-header.is-header-solid .site-header--desktop,
body.home .site-header.is-header-solid .site-header--mobile {
	background-color: var(--wp--preset--color--base) !important;
	border-bottom-color: var(--wp--preset--color--border) !important;
}

body.home .site-header.is-header-solid .site-header__brand p {
	color: var(--wp--preset--color--text-subtle) !important;
}

body.home .site-header.is-header-solid .site-header__logo img {
	filter: none;
}

body.home .site-header.is-header-solid .site-header__nav .wp-block-navigation-item__content {
	color: var(--wp--preset--color--text-body);
}

body.home .site-header.is-header-solid .site-header__reservation .wp-block-button__link,
body.home .site-header.is-header-solid .site-header__reservation-mobile .wp-block-button__link {
	background-color: var(--wp--preset--color--base) !important;
	color: var(--wp--preset--color--primary) !important;
	border-color: var(--wp--preset--color--primary) !important;
}

body.home .site-header.is-header-solid .wp-block-navigation__responsive-container-open {
	color: var(--wp--preset--color--primary);
}

.site-header__reservation .wp-block-button__link,
.site-header__reservation-mobile .wp-block-button__link {
	transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease;
}

/*
 * Reservation button hover — "solid" header state (every non-home page,
 * plus the home page once scrolled past the hero into .is-header-solid):
 * invert to a black fill with white text. Deliberately NOT scoped with
 * :not(.is-header-solid) like the transparent-state hover above — this
 * plain selector is lower specificity, so on the transparent hero state
 * that more specific rule still wins; everywhere else (its only other
 * context) this is the one that applies.
 */
.site-header__reservation .wp-block-button__link:hover,
.site-header__reservation-mobile .wp-block-button__link:hover {
	background-color: #1a1a1a !important;
	color: #ffffff !important;
	border-color: #1a1a1a !important;
}

/*
 * Hero wrapper is a vertical flex column (image band, then text band).
 * WordPress's flex layout support defaults vertical flex containers to
 * align-items:flex-start, which does NOT stretch children to full width.
 * The Cover block's actual <img> is position:absolute (contributes no
 * intrinsic width to its parent), so without stretch it collapses to
 * near-zero width instead of spanning the section. Force stretch so both
 * the image band and the text band fill the full width as designed.
 */
.home-hero--desktop,
.home-hero--mobile {
	align-items: stretch !important;
}

.home-hero--desktop > *,
.home-hero--mobile > * {
	width: 100%;
	/*
	 * Flex items default to min-width:auto, which floors their cross-axis
	 * size at their content's min-content size and can override stretch.
	 * min-width:0 removes that floor, standard practice alongside stretch.
	 */
	min-width: 0;
}

/*
 * Hero (desktop) fits the first viewport instead of Figma's fixed 920px
 * total (552px photo / 60% + 368px text block / 40%), which overflows short
 * laptop screens. Both the photo height and the text block's vertical
 * padding scale with viewport height (vh) between a floor and Figma's
 * value, so the section always shrinks to fit rather than pushing "Scroll
 * Down" below the fold. Horizontal padding is untouched — only vertical
 * space is fluid. The header floats transparently on top of the hero (see
 * .is-header-transparent above) rather than occupying its own space above
 * it, so the hero's budget is the full viewport height with no
 * header-height subtraction.
 */
.home-hero--desktop {
	min-height: 100vh;
	/* WP's default blockGap (24px) would otherwise sit between the photo
	   and text blocks, breaking the 552px+368px=920px split below. */
	gap: 0 !important;
}

.home-hero--desktop .wp-block-cover {
	min-height: 0 !important;
	height: clamp(170px, 60vh, 552px);
	flex-shrink: 1;
}

.home-hero--desktop > .wp-block-group.has-background {
	padding-top: clamp(20px, 6vh, 67px) !important;
	padding-bottom: clamp(20px, 6vh, 67px) !important;
	gap: clamp(14px, 3vh, 34px) !important;
	flex-shrink: 1;
}

/* Figma's dim value (15%) isn't one of WordPress's 10%-step dim presets */
.home-hero--desktop .has-background-dim-15 {
	opacity: 0.15;
}

/*
 * Mobile Hero: fills the first view instead of Figma's fixed 628px total
 * (380px photo + 248px text band), which leaves dead space or clips the
 * scroll indicator depending on the device's actual viewport height. The
 * photo/text split stays at Figma's ~60/40 ratio, but as flex-basis
 * percentages of the viewport-height container rather than fixed px, so it
 * scales with the device. 100dvh accounts for mobile browser chrome
 * (address bar) that 100vh doesn't; min-height:100vh is the fallback for
 * browsers without dvh support.
 */
.home-hero--mobile {
	min-height: 100vh;
	min-height: 100dvh;
	gap: 0 !important;
}

.home-hero--mobile .wp-block-cover {
	min-height: 0 !important;
	height: auto;
	flex: 1 1 60%;
}

.home-hero--mobile > .wp-block-group.has-background {
	/*
	 * flex-shrink:0 (not the 0 0 40% used on the photo) deliberately: the
	 * text block's own content (headline + subline + scroll indicator, a
	 * near-fixed height regardless of device) must never be compressed
	 * below its natural size, which a strict 40% basis would do on short
	 * viewports and clip/overlap the text. min-height:100dvh on the
	 * container (not a hard height) lets the SECTION grow taller than the
	 * viewport instead when that happens, so the photo simply absorbs
	 * whatever space is left (flex:1 1 60% above) rather than the layout
	 * breaking.
	 */
	flex: 0 0 40%;
	flex-shrink: 0;
	display: flex;
	flex-direction: column;
	justify-content: center;
}

.home-hero--mobile .has-background-dim-10 {
	/*
	 * !important needed here too: dim-10 IS one of core's standard 10%-step
	 * presets, so core ships its own compound override for it (0,4,0
	 * specificity) that otherwise beats this 2-class selector and silently
	 * renders 10% instead of the intended 12%.
	 */
	opacity: 0.12 !important;
}

/* Access section: streetscape photo inside the white MapMock card, fixed 440px height */
.home-access__streetscape img {
	width: 100%;
	height: 440px;
	object-fit: cover;
}

/* Desktop nav link hit area/spacing (core/navigation-link ships no padding of its own) */
.site-header__nav .wp-block-navigation-item__content {
	padding: 8px 12px;
}

/*
 * PageTitleHeader's H1-style paragraph sits in a vertical flex column with
 * the default align-items:flex-start, which shrink-wraps block children to
 * their own content width instead of the full section width (same class of
 * bug as the Hero/Related Sites/Gallery stretch fixes elsewhere in this
 * file). For a short title ("Access", "News") that's invisible, but a long
 * one ("Party & Banquet") can end up shrink-wrapped narrower than
 * necessary and wrap awkwardly. Figma's heading text box always spans the
 * section's full content width, so force that here instead of relying on
 * shrink-to-fit sizing.
 */
.page-title-header--desktop .has-dm-serif-font-family,
.page-title-header--mobile .has-dm-serif-font-family {
	width: 100%;
}

/*
 * PageTitleHeader's divider (shared across every subpage) sits inside a
 * group that already has its own left/right padding (var(--spacing--section)
 * on desktop, var(--spacing--sm) on mobile) — but that group is ALSO a
 * child of an outer "constrained" wrapper that centers a 1280px box within
 * the 1440px page (an implicit 80px inset of its own), so the two insets
 * stack and the line ends up ~160px from each edge instead of 80px,
 * narrower than the page's actual content width. The negative-margin
 * "breakout" here cancels just this element's own inner padding so its
 * rendered width matches the outer constrained content box exactly. Also
 * thinned from the WP-core default 2px border to a Figma-accurate hairline.
 */
.page-title-header--desktop hr.wp-block-separator {
	border-bottom-width: 1px;
	width: calc(100% + 2 * var(--wp--preset--spacing--section));
	margin-left: calc(-1 * var(--wp--preset--spacing--section));
	margin-right: calc(-1 * var(--wp--preset--spacing--section));
}

/*
 * Mobile's version of the same narrowing bug didn't resolve with the same
 * "cancel this element's own padding" fix above — its ancestor chain
 * shrink-wraps to content width rather than the viewport, so the
 * percentage math doesn't resolve against the true 390px viewport at all.
 * Sidestepping that chain entirely: position relative to the viewport
 * itself (100vw) and inset by the intended 16px on each side.
 */
.page-title-header--mobile hr.wp-block-separator {
	border-bottom-width: 1px;
	position: relative;
	left: 50%;
	width: calc(100vw - 32px);
	margin-left: calc(-50vw + 16px);
}

/* Access section: 16x16 map-pin icon centered inside a 40x40 circular badge */
.home-access__pin-badge {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	border-radius: 100%;
	background-color: var(--wp--preset--color--background-alt);
	flex-shrink: 0;
}

.home-access__pin-badge img {
	width: 16px;
	height: 16px;
}

/*
 * Related Sites cards grid: a plain flex row left both cards sized by their
 * own content, so Futo's longer description text made it noticeably wider
 * than Fylo (Figma is a strictly even 2-column grid). !important needed —
 * WP's own `.is-layout-flex{display:flex}` (specificity 0,1,1) otherwise
 * wins over this plain class rule and the row layout persists.
 */
.home-related__grid {
	display: grid !important;
	grid-template-columns: repeat(2, 1fr);
}

/*
 * Related Sites cards are a vertical flex column (photo, then name+desc).
 * Same align-items:flex-start default as the Hero fix above: the photo
 * <figure> has a definite height but only a percentage width, so without
 * stretch it shrinks to the image's own intrinsic aspect ratio instead of
 * filling the card.
 */
/*
 * WP core ships :where(.wp-block-group.has-background) { padding: 1.25em
 * 2.375em } as a low-specificity fallback for any group with a background
 * color and no explicit padding of its own. This card never sets its own
 * padding (the photo is meant to sit flush against all four edges, with
 * only the text below it padded), so that ~38px side padding was silently
 * squeezing the flush photo in from both sides on every card, desktop and
 * mobile alike.
 */
.home-related__card {
	align-items: stretch;
	padding: 0;
}

/*
 * Mobile Related Sites: the vertical stack wrapping the two cards has no
 * distinguishing class in the template, so it fell back to WP's default
 * align-items:flex-start for vertical flex groups (see comment above) —
 * each card shrink-wrapped to its own content width instead of stretching
 * to the section's full width, which in turn starved the photo (itself
 * width:100% of the card) down to a near-square crop.
 */
.home-related__cards--mobile {
	align-items: stretch;
}

/*
 * Related Sites card photos: fixed 200px height, flush against the card's
 * own edges (Figma has no gap/padding around the photo box itself — only
 * the text below it is padded). No radius of its own: the card carries
 * overflow:hidden at its own border-radius, which clips the flush box to
 * match the card's rounded top corners.
 *
 * As of the current Figma, this slot holds each sister brand's logo mark
 * on a plain background rather than a cropped photo — object-fit:contain
 * (not cover) so the mark renders at its own proportions instead of being
 * cropped to fill, plus padding so it doesn't touch the box edges.
 */
.home-related__photo {
	width: 100% !important;
	height: 200px !important;
	background-color: #fafaf9;
	box-sizing: border-box;
	padding: 24px;
}

.home-related__photo img {
	width: 100% !important;
	height: 100% !important;
	object-fit: contain;
	display: block;
}

/*
 * Mobile Related Sites cards use a 160px photo (vs. 200px on desktop).
 * !important here (and above) is required: WP's core inline block-library
 * CSS (".wp-block-image img { height: auto; max-width: 100% }") ties this
 * rule's specificity exactly (one class + one tag each) and loads after
 * our theme stylesheet, so without !important the core rule wins the
 * cascade and the photo falls back to its native 1:1 aspect ratio instead
 * of the fixed crop.
 */
.home-related__photo--mobile {
	height: 160px !important;
}

/*
 * Gallery grid (front page teaser): re-checked against current Figma
 * (1029:495) — it's a plain uniform 3-column grid of same-height cells
 * (410.67 x 400, ~1.027:1), not a staggered masonry. The "gallery" CPT's
 * Query Loop already renders row-major 3-column via the post-template
 * block's default layout attribute, so no grid-auto-flow override is
 * needed; every cell just gets the same aspect-ratio crop.
 */
.home-gallery__masonry .wp-block-post-featured-image img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.home-gallery__masonry .wp-block-post-featured-image {
	aspect-ratio: 1.027;
}

/*
 * WP core collapses any post-template grid to a single column under 600px
 * (block-library/post-template/style.css), which would flatten this grid
 * to one column on mobile. Both mobile Gallery grids (this teaser and the
 * full grid on page-gallery.html) keep their multi-column layout at every
 * width per Figma, so the column count is restored with !important to
 * outrank that core rule.
 */
.home-gallery__masonry--mobile.is-layout-grid {
	grid-template-columns: repeat(3, 1fr) !important;
}

.gallery-page__grid--mobile.is-layout-grid {
	grid-template-columns: repeat(2, 1fr) !important;
}

/* Concept page's bottom Gallery teaser: same uniform-grid pattern and CPT source as the front-page one */
.concept-space__grid .wp-block-post-featured-image img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.concept-space__grid .wp-block-post-featured-image {
	aspect-ratio: 1.027;
}

.concept-space__grid--mobile.is-layout-grid {
	grid-template-columns: repeat(2, 1fr) !important;
}

/*
 * The Gallery CTA button sits in a wp:buttons wrapper with
 * justifyContent:"center" (needed to center it under the masonry grid).
 * Its label is a spaceless Japanese string, so by default the browser can
 * break it at any character; combined with this inline-flex text+icon
 * button inside a centered flex context, the shrink-to-fit width
 * calculation collapses to a fraction of the text's one-line width and it
 * wraps across three lines instead of rendering on one. white-space:nowrap
 * removes the possibility of a mid-word break, which fixes the sizing
 * regardless of exactly why the shrink-to-fit pass under-measured it.
 */
.home-gallery__cta .wp-block-button__link {
	width: auto !important;
	white-space: nowrap !important;
}

/*
 * Gallery page "もっと見る" (load more) is core/query-pagination-next, not a
 * core/button, so it doesn't inherit theme.json's button element styles —
 * hand-styled here as the same circular arrow-icon pattern as
 * .arrow-cta-button (TOP/News section-header CTAs), centered under the grid.
 * The label text is kept in the markup for accessibility but visually
 * hidden — the block only renders plain text, no room for the icon markup
 * .arrow-cta-button uses, so the icon here is drawn with a CSS mask instead.
 */
.gallery-page__more {
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 52px;
	height: 52px;
	box-sizing: border-box;
	border: 1px solid #c4a882;
	border-radius: 14px;
	background-color: transparent;
	color: #1a1a1a;
	text-decoration: none;
	text-indent: -9999px;
	overflow: hidden;
	transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease;
}

.gallery-page__more::after {
	content: '';
	position: absolute;
	top: 50%;
	left: 50%;
	width: 24px;
	height: 19px;
	transform: translate(-50%, -50%);
	background-color: currentColor;
	-webkit-mask: center / contain no-repeat url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 16' fill='none'%3E%3Cpath d='M1 8H19M13 1L19.5 8L13 15' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	mask: center / contain no-repeat url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 16' fill='none'%3E%3Cpath d='M1 8H19M13 1L19.5 8L13 15' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

.gallery-page__more:hover {
	background-color: #1a1a1a;
	border-color: #1a1a1a;
	color: #ffffff;
}

/*
 * Numbered pagination (← 1 2 3 →), used on News archive/single-category
 * and the Gallery page's mobile view: WP core ships no visual styling of
 * its own for query-pagination beyond bare link color, so without this
 * the numbers ran together with no consistent gap and no way to tell the
 * current page apart from the rest.
 */
.wp-block-query-pagination {
	gap: 16px;
	padding-top: 24px;
	padding-bottom: 48px;
}

.wp-block-query-pagination-numbers {
	display: inline-flex;
	align-items: center;
	gap: 16px;
}

.wp-block-query-pagination .page-numbers,
.wp-block-query-pagination-previous,
.wp-block-query-pagination-next {
	font-size: 12px;
	text-decoration: none;
}

.wp-block-query-pagination-previous,
.wp-block-query-pagination-next {
	font-family: var(--wp--preset--font-family--sans);
	color: #a6a09b;
}

.wp-block-query-pagination .page-numbers {
	font-family: var(--wp--preset--font-family--dm-sans);
	font-weight: 400;
	color: #a6a09b;
}

.wp-block-query-pagination .page-numbers.current {
	font-weight: 700;
	color: #1a1a1a;
}

.gallery-page__more--mobile {
	margin-left: auto;
	margin-right: auto;
}

/*
 * Gallery filter tabs (Figma): underline-style tabs, not plain text links —
 * shared design between the Gallery page and the News list, per the design
 * review that flagged the two as inconsistent.
 */
.gallery-filter-tabs {
	gap: 24px;
}

.gallery-filter-tabs__tab,
.gallery-filter-tabs__tab a {
	color: var(--wp--preset--color--text-muted);
	text-decoration: none;
	letter-spacing: 2.42px;
	text-transform: uppercase;
}

.gallery-filter-tabs__tab {
	padding-bottom: 4px;
	border-bottom: 2px solid transparent;
}

.gallery-filter-tabs__tab.is-active,
.gallery-filter-tabs__tab.is-active a {
	color: var(--wp--preset--color--primary);
}

.gallery-filter-tabs__tab.is-active {
	border-bottom-color: var(--wp--preset--color--primary);
}

/*
 * Gallery grid row heights (Figma): rows 1, 2 and 4 are 400px, but row 3
 * (items 7-9) is a shorter 300px — not a uniform grid throughout. Desktop
 * only: the mobile variant carries the SAME .gallery-page__grid class
 * (plus --mobile) since it's the same post-template block, so these :not()
 * guards are required — without them the desktop 400px/300px row heights
 * bled into the mobile 2-column grid (167x180 in Figma), stretching every
 * mobile photo to 400px tall and making the grid look like a single stacked
 * column instead of two.
 */
.gallery-page__grid .wp-block-post-featured-image img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.gallery-page__grid:not(.gallery-page__grid--mobile) > *:nth-child(-n+6) .wp-block-post-featured-image,
.gallery-page__grid:not(.gallery-page__grid--mobile) > *:nth-child(n+10) .wp-block-post-featured-image {
	height: 400px;
}

.gallery-page__grid:not(.gallery-page__grid--mobile) > *:nth-child(n+7):nth-child(-n+9) .wp-block-post-featured-image {
	height: 300px;
}

.gallery-page__grid--mobile > * .wp-block-post-featured-image {
	height: 180px;
}

/*
 * Footer nav links (Sitemap + Legal groups, both breakpoints) are
 * underline-free by default in Figma, showing the underline only on
 * hover — the browser's default underline otherwise applies unopposed.
 */
.site-footer a {
	text-decoration: none;
}

.site-footer a:hover {
	text-decoration: underline;
}

/*
 * Site-wide body copy is Light (300) instead of Regular (400) — description
 * paragraphs (Concept body, News excerpts, Access details, CTA blurbs, the
 * Hero's English subtext, etc.), in both Noto Sans JP and DM Sans.
 *
 * Scoped by tag + exclusion rather than a font-family class, since the base
 * body font (Noto Sans JP) is set once on <body> in theme.json and inherited
 * by most paragraphs without each one carrying its own font-family class.
 * Headings use this theme's serif fonts (Noto Serif JP / DM Serif Display)
 * and are excluded by their font-family class. Buttons and nav links never
 * match at all (they're <a>, not <p>). Labels/badges that set their own
 * inline font-weight (e.g. the SemiBold section kickers) are unaffected
 * too — inline style outranks this plain, non-!important rule.
 */
p:not(.has-serif-font-family):not(.has-dm-serif-font-family) {
	font-weight: 300;
}

/* Footer Sitemap/Legal links render as <p><a>...</a></p>, not body copy */
/*
 * WP's .is-layout-flex row default is align-items:center, so the shorter
 * Legal column (2 links) was vertically centered against the taller
 * Sitemap column (4 links) instead of top-aligning — "プライバシーポリシー"
 * needs to start level with "Concept", not floated to the middle.
 */
.site-footer__links {
	align-items: flex-start;
}

.site-footer__links p {
	font-weight: 400;
}

/*
 * Hero ScrollIndicator (Figma 721:32): "Scroll Down" label, then a short
 * vertical line below it — not the wide horizontal rule this used to be.
 */
.home-hero__scroll-indicator {
	align-items: center;
}

.home-hero__scroll-line {
	display: block;
	width: 1px;
	height: 24px;
	background-color: var(--wp--preset--color--text-muted);
}

/*
 * Site-wide: WP core's own
 * .wp-block-buttons.is-vertical>.wp-block-button[class*=wp-block-button__width]
 * rule sets width via calc(var(--wp--block-button--width)*1%). That custom
 * property is never defined anywhere in this theme, so the calc() is
 * invalid and resolves to width:auto (shrink-to-fit, i.e. text-width)
 * instead of the intended 100% — silently breaking every "full width"
 * button in a vertical stack (Reservation CTA, Party & Banquet, Access,
 * mobile CTAs, ...). Core's selector outranks a plain override, hence
 * !important; scoped to is-vertical so horizontal button rows (which
 * don't use this width mechanism) are untouched.
 */
.wp-block-buttons.is-vertical > .wp-block-button.wp-block-button__width-100 {
	width: 100% !important;
}

/*
 * Reservation CTA (shared "Variation-2-Asymmetric" markup across the home
 * page and every subpage that reuses it): the button stack defaults to
 * align-items:flex-start, which shrink-wraps each button to its own text
 * instead of the full 360px column — the row itself is left at its default
 * align-items:center (matching Figma), since the divider is now a fixed-
 * height spacer rather than something that needs to stretch to match.
 */
.home-reservation--desktop .wp-block-buttons,
.home-reservation__right-col {
	align-items: stretch;
}

/* The 1px x 360px vertical divider between the two columns (a wp:spacer, transparent by default) */
.home-reservation__divider {
	background-color: var(--wp--preset--color--border-strong);
}

/* Reservation section's small kicker rule is left-aligned (unlike the centered hero rule) */
.home-reservation__rule {
	width: 40px;
	margin-left: 0;
	margin-right: auto;
	border-color: var(--wp--preset--color--border-strong);
}

/*
 * ADDRESS / BY TRAIN / BY CAR divider hairlines. WP core's default
 * .wp-block-separator border-bottom-width is 2px, which reads as too heavy
 * next to Figma's thin hairline — halved to 1px here.
 */
.home-access__divider {
	border-bottom-width: 1px;
}

/* Access section's kicker rule (same left-aligned 40px treatment) */
.home-access__rule {
	width: 40px;
	margin-left: 0;
	margin-right: auto;
	border-color: var(--wp--preset--color--border-strong);
}

/*
 * Menu section's 3 cards must render at equal width regardless of how much
 * their descriptions differ in length. flex-grow:1 alone isn't enough here:
 * with the default flex-basis:auto, each card's STARTING width (before
 * growth is distributed) is based on its own content size, and unequal
 * starting points stay unequal after growth. flex-basis:0 makes all three
 * start from zero so flex-grow distributes space purely proportionally.
 */
.home-menu__cards > .home-menu__card {
	flex-basis: 0;
}

/*
 * Menu cards (Lunch/Dinner/Drink & Wine) are clickable through to a PDF
 * menu — the whole card is wrapped in an <a> around the wp:cover markup.
 * The link needs to behave like the cover block it wraps (fill the card,
 * no underline/color change) since it's otherwise invisible and the
 * cover's own overflow:hidden + border-radius live on the parent.
 */
.home-menu__card-link {
	display: block;
	width: 100%;
	height: 100%;
	color: inherit;
	text-decoration: none;
}

/*
 * Concept section (desktop): Figma has the photo and text column flush
 * (720px + 720px = 1440px, no gap) and 640px tall. Unlike the other
 * split-panel instances (Access, Party & Banquet), which set an explicit
 * blockGap because they DO want a gap, this one never set one — so it fell
 * back to WP's default flex gap (24px), stealing width from both 50%
 * columns and leaving a sliver of blank space after the photo.
 */
.home-concept--desktop {
	gap: 0;
	height: 640px;
}

/* Concept section: short horizontal rule above the headline */
.home-concept__rule {
	width: 100px;
	flex-shrink: 0;
	margin-left: 0;
	margin-right: 0;
	border-color: var(--wp--preset--color--border-strong);
}

.home-concept__rule--mobile {
	width: 56px;
}

/* Concept section (mobile): fixed 260px photo height, cropped to fill */
.home-concept--mobile .home-concept__photo,
.home-concept--mobile .home-concept__photo img {
	height: 260px;
}

/* Mobile full-bleed editorial image band between News and Concept */
.home-editorial-break--mobile img {
	width: 100%;
	height: 240px;
	object-fit: cover;
}

/*
 * Menu / Gallery / Concept photography: fill their flex tracks and crop to
 * the box. home-related--desktop/mobile img deliberately excluded — that
 * slot now holds each sister brand's logo mark (see .home-related__photo
 * img below), which needs object-fit:contain so the mark isn't cropped.
 */
.home-menu__card img,
.home-gallery--desktop img,
.home-gallery--mobile img,
.home-concept__photo img,
.home-access--mobile figure:first-child img,
.concept-philosophy__photo img,
.concept-chef__photo img,
.concept-space__photo img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* Access section (mobile) entrance photo: fixed height so the 100% rule above has something to fill */
.home-access--mobile figure:first-child {
	height: 240px;
}

/*
 * 45% dim isn't one of WordPress's 10%-step dim presets, same situation as
 * the home page Hero's 15%. Used by the Concept page's mobile Hero and the
 * Party & Banquet page's Hero.
 *
 * !important is required: core ships an unconditional opacity:0.5 baseline
 * on .wp-block-cover .wp-block-cover__background (specificity 0,2,0) as
 * the fallback for covers with no matching dim-N class. Core's own dim-10
 * .. dim-100 overrides beat that baseline with 4-class compound selectors
 * (0,4,0) scoped to each exact step; a plain single-class rule like this
 * one (0,1,0) for a non-standard step never wins the cascade without it —
 * it was silently rendering at 50% instead of 45% until this was added.
 */
.has-background-dim-45 {
	opacity: 0.45 !important;
}

/*
 * Same align-items:flex-start default as the RelatedSites/News-gallery
 * fixes: these mobile sections stack a photo above text in a vertical
 * flex group, and without stretch the photo shrink-wraps to its own
 * intrinsic width instead of filling the section.
 */
.concept-philosophy--mobile,
.concept-chef--mobile {
	align-items: stretch;
}

/*
 * Same align-items:flex-start default, this time on the Access InfoSection
 * now that its photo is gone and the details column is the section's only
 * (and therefore full-width) child: without stretch the whole column and
 * every divider row inside it shrink-wraps to content width instead of
 * filling the section, leaving the border-bottom rules looking cut off.
 */
.access-info--desktop,
.access-info--mobile,
.access-info__list {
	align-items: stretch;
}

/* Fixed photo heights per Figma, desktop then mobile */
.concept-philosophy__photo { height: 420px; }
.concept-philosophy__photo--mobile { height: 220px; }

.concept-chef__photo { height: 580px; }
.concept-chef__photo--mobile { height: 380px; }

.concept-space__photo { height: 360px; }
.concept-space__photo--mobile { height: 200px; }

/*
 * View Gallery button: same inline-flex text+icon centering issue as the
 * Gallery section CTA — this one isn't inside a centered wp:buttons
 * wrapper, but nowrap still guards against the spaceless Japanese-adjacent
 * label ever wrapping oddly at narrow widths.
 */
.concept-space__cta .wp-block-button__link {
	white-space: nowrap;
}

/*
 * Gallery lightbox: core/post-featured-image does not support WP's native
 * "lightbox" block attribute (that's core/image-only — confirmed absent
 * from wp-includes/blocks/post-featured-image/block.json), so the Gallery
 * grid's click-to-enlarge behavior is a small custom overlay instead
 * (see assets/js/gallery-lightbox.js).
 */
body.gallery-lightbox-open {
	overflow: hidden;
}

.gallery-lightbox {
	display: none;
	position: fixed;
	inset: 0;
	z-index: 100000;
	background-color: rgba(20, 18, 16, 0.92);
	align-items: center;
	justify-content: center;
	padding: 48px;
	box-sizing: border-box;
}

.gallery-lightbox.is-open {
	display: flex;
}

.gallery-lightbox__image {
	max-width: 100%;
	max-height: 100%;
	width: auto;
	height: auto;
	object-fit: contain;
	display: block;
}

.gallery-lightbox__close {
	position: absolute;
	top: 24px;
	right: 32px;
	width: 44px;
	height: 44px;
	border: 1px solid rgba(255, 255, 255, 0.4);
	background: transparent;
	color: var(--wp--preset--color--base);
	font-size: 28px;
	line-height: 1;
	cursor: pointer;
	display: flex;
	align-items: center;
	justify-content: center;
}

.gallery-lightbox__close:hover {
	background-color: rgba(255, 255, 255, 0.1);
}

/* News list page: featured article photo + card grid photos, fixed heights per Figma */
.news-featured {
	align-items: stretch;
}

.news-featured__photo {
	height: 330px;
}

.news-featured__photo img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.news-card__photo {
	height: 240px;
}

.news-card__photo img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

/* ============================================================
 * TOP page redesign (Figma lefil-top-redesign, 721:4)
 * ============================================================ */

/*
 * Shared "outline arrow" CTA button — used in the Concept/News/Menu/
 * Gallery/Access section headers. Not a WP button block (those render
 * filled/outline rectangles); this is a bespoke circular-icon + label
 * pattern, so it's hand-styled rather than using core button variants.
 */
.arrow-cta-button {
	display: inline-flex;
	align-items: center;
	gap: 16px;
	text-decoration: none;
	flex-shrink: 0;
}

.arrow-cta-button__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 52px;
	height: 52px;
	border: 1px solid #c4a882;
	border-radius: 14px;
	flex-shrink: 0;
	color: #1a1a1a;
	transition: background-color 0.3s ease, border-color 0.3s ease;
	box-sizing: border-box;
}

.arrow-cta-button__icon svg {
	width: 24px;
	height: 19px;
	display: block;
	transition: transform 0.3s ease;
}

.arrow-cta-button:hover .arrow-cta-button__icon {
	background-color: #1a1a1a;
	border-color: #1a1a1a;
	color: #ffffff;
}

.arrow-cta-button:hover .arrow-cta-button__icon svg {
	transform: translateX(3px);
}

.arrow-cta-button__label {
	font-family: var(--wp--preset--font-family--sans);
	font-weight: 500;
	font-size: 13px;
	letter-spacing: 1px;
	color: #1a1a1a;
	white-space: nowrap;
	text-decoration: underline;
	text-decoration-color: transparent;
	text-underline-offset: 4px;
	transition: text-decoration-color 0.3s ease;
}

.arrow-cta-button:hover .arrow-cta-button__label {
	text-decoration-color: #1a1a1a;
}

/*
 * Small (mobile) variant: replaces the old black rectangular wp:button
 * "◯◯を見る" CTAs that were left over on mobile-only sections (News,
 * Gallery) while their desktop siblings had already been converted to
 * this circular arrow pattern. 40x40 circle, 16x12 arrow, per spec.
 */
.arrow-cta-button--sm .arrow-cta-button__icon {
	width: 40px;
	height: 40px;
	border-radius: 50%;
}

.arrow-cta-button--sm .arrow-cta-button__icon svg {
	width: 16px;
	height: 12px;
}

.arrow-cta-button--sm .arrow-cta-button__label {
	font-size: 12px;
}

/* Shared section-header label (e.g. "(Menu)") above the JP heading */
.section-label {
	display: block;
	font-family: var(--wp--preset--font-family--dm-serif);
	font-size: 12px;
	letter-spacing: 3px;
	text-transform: uppercase;
	color: #7c5c3e;
}

/* ---------- Concept (TOP page) — scattered photos + centered text ---------- */
.home-concept-v2--desktop {
	position: relative;
	height: 900px;
	overflow: hidden;
}

.home-concept-v2__photos {
	position: absolute;
	top: 0;
	width: 340px;
	height: 900px;
	overflow: hidden;
}

.home-concept-v2__photos--left {
	left: 0;
}

.home-concept-v2__photos--right {
	right: 0;
}

.home-concept-v2__photo {
	position: absolute;
	object-fit: cover;
}

.home-concept-v2__center {
	position: relative;
	z-index: 1;
	height: 900px;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 48px;
	padding: 100px 400px;
	box-sizing: border-box;
	text-align: center;
}

.home-concept-v2__label {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 16px;
}

.home-concept-v2__label-rule {
	width: 0.5px;
	height: 48px;
	background-color: #79716b;
}

/*
 * Mobile variant of the same scattered-photo pattern (Figma "concept-mobile",
 * TOP mobile node 1183:1407) — four photos absolutely positioned around the
 * edges of a relative container, a white 40% wash over each (not just a
 * plain photo), centered text stack in the middle. Different geometry from
 * desktop (bleeding off the left/right screen edges rather than two fixed
 * side columns), so it's a parallel set of classes rather than a reuse.
 */
.home-concept-v2--mobile {
	position: relative;
	overflow: hidden;
	padding: 80px 24px 40px;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
}

.home-concept-v2__photo-wrap--mobile {
	position: absolute;
}

.home-concept-v2__photo-wrap--mobile img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.home-concept-v2__photo-wrap--mobile::after {
	content: '';
	position: absolute;
	inset: 0;
	background-color: rgba(255, 255, 255, 0.4);
}

/*
 * ---------- Gallery (TOP page) — dual-row auto-scrolling marquee ----------
 * Each row is rendered as two identical wp:query blocks back-to-back (same
 * offset/perPage), so the row's items are literally duplicated in the DOM.
 * Animating translateX 0 -> -50% then looping is therefore seamless: at
 * -50% the (identical) second half sits exactly where the first half
 * started. Row 2 plays the same keyframes in reverse (animation-direction)
 * so it drifts the opposite way. Fullbleed: negative side-margins cancel
 * the section's own horizontal padding so the strip runs edge-to-edge.
 */
/*
 * The negative side-margins below intentionally push .gallery-marquee's
 * box past its padded parent's content edge (the fullbleed trick), which
 * makes the PARENT's layout box register that extra width too — without
 * clipping, that reads as real page overflow and adds a horizontal
 * scrollbar to the whole site, not just a visual bleed. home-gallery--desktop
 * and --mobile are top-level, viewport-width sections, so clipping
 * overflow-x there contains the bleed at exactly the viewport edge (the
 * same place it would end up unclipped) with no page-level side effect.
 */
.home-gallery--desktop,
.home-gallery--mobile {
	overflow-x: hidden;
}

/*
 * !important required: this section's own layout:"constrained" wrapper
 * ships WP core's `.is-layout-constrained > :where(...) { margin-left:
 * auto !important; margin-right: auto !important; }` centering rule —
 * plain margin-left/right here silently loses to that regardless of
 * specificity or source order, since !important always wins over a
 * normal declaration.
 */
.gallery-marquee {
	margin-left: calc(-1 * var(--wp--preset--spacing--section)) !important;
	margin-right: calc(-1 * var(--wp--preset--spacing--section)) !important;
	width: calc(100% + 2 * var(--wp--preset--spacing--section));
	/*
	 * The same constrained-layout rule also sets max-width (to the theme's
	 * content-size) without !important — but a max-width still caps the
	 * width above however that width was computed, so it silently clips
	 * the breakout back down to content-size unless overridden too.
	 */
	max-width: none !important;
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.gallery-marquee__row {
	overflow: hidden;
	width: 100%;
}

.gallery-marquee__track {
	display: flex;
	flex-wrap: nowrap;
	width: max-content;
	gap: 16px;
	padding: 0 16px;
	animation: gallery-marquee-scroll 50s linear infinite;
}

/*
 * Each row is built from two back-to-back wp:query blocks (see markup) so
 * the row's photos are literally duplicated in the DOM for the seamless
 * 0%/-50% loop. Query and post-template each render their own wrapping
 * element (.wp-block-query div, then a <ul>), which would otherwise stack
 * the two queries as block-level boxes instead of feeding all 12 <li>
 * cards into the flex track as siblings. display:contents removes both
 * wrapper levels from the box tree while keeping the <li> cards in place.
 */
.gallery-marquee__track > .wp-block-query,
.gallery-marquee__list {
	display: contents;
}

.gallery-marquee__list > li {
	list-style: none;
	margin: 0;
	padding: 0;
}

.gallery-marquee__row--reverse .gallery-marquee__track {
	animation-direction: reverse;
}

.gallery-marquee__row:hover .gallery-marquee__track {
	animation-play-state: paused;
}

@keyframes gallery-marquee-scroll {
	from {
		transform: translateX(0);
	}
	to {
		transform: translateX(-50%);
	}
}

.gallery-marquee__card {
	position: relative;
	flex: 0 0 auto;
	width: 320px;
	height: 280px;
	border-radius: 6px;
	overflow: hidden;
	display: block;
}

.gallery-marquee__card img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform 0.5s ease-out;
}

.gallery-marquee__card:hover img {
	transform: scale(1.05);
}

.gallery-marquee__card::after {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, 0.5) 100%);
	pointer-events: none;
}

.gallery-marquee--mobile {
	margin-left: calc(-1 * var(--wp--preset--spacing--sm)) !important;
	margin-right: calc(-1 * var(--wp--preset--spacing--sm)) !important;
	width: calc(100% + 2 * var(--wp--preset--spacing--sm));
	gap: 8px;
}

.gallery-marquee--mobile .gallery-marquee__track {
	gap: 8px;
	padding: 0 8px;
	animation-duration: 36s;
}

.gallery-marquee--mobile .gallery-marquee__card {
	width: 180px;
	height: 160px;
	border-radius: 4px;
}

/* Touch devices have no hover: keep both rows in constant motion */
@media (hover: none) {
	.gallery-marquee__row:hover .gallery-marquee__track {
		animation-play-state: running;
	}
}

@media (prefers-reduced-motion: reduce) {
	.gallery-marquee__track {
		animation: none;
	}
}

/*
 * Category badge (wp:post-terms renders as a plain <a>, so it inherits the
 * browser's default underline — theme.json's elements.link only sets a
 * color, no text-decoration reset). Not News-specific: any post-terms
 * badge site-wide picks up the same unwanted underline.
 */
.wp-block-post-terms a {
	text-decoration: none;
}

/*
 * ---------- News (TOP page) — magazine editorial grid ----------
 * The featured-left column (photo+content, ~605px tall) and the secondary
 * column (3 stacked cards, ~434px tall) are unequal heights, and this row
 * has no verticalAlignment CSS class WP reliably outputs for flex groups —
 * it defaulted to vertically centering the shorter secondary column
 * instead of top-aligning it against the featured photo, same class of bug
 * as the Hero/Related-Sites/Gallery stretch fixes elsewhere in this file.
 */
.news-editorial-grid {
	align-items: flex-start !important;
}

.news-featured-left__photo {
	height: 440px;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 8px;
	overflow: hidden;
}

.news-featured-left__photo img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	border-radius: 8px;
}

/*
 * wp:post-template wraps each card in its own <li> (the query loop's own
 * markup), so .news-secondary-card is a grandchild of .news-secondary-list,
 * not a direct child — a > combinator between the two never matches.
 * Target the <li> itself instead; :last-child then works naturally since
 * the <li> siblings are what's actually being iterated.
 */
.news-secondary-list > li {
	border-bottom: 0.5px solid var(--wp--preset--color--border);
	padding-bottom: 24px;
	margin-bottom: 24px;
}

.news-secondary-list > li:last-child {
	border-bottom: none;
	padding-bottom: 0;
	margin-bottom: 0;
}

.news-secondary-card__photo {
	width: 160px;
	height: 110px;
	flex-shrink: 0;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 6px;
	overflow: hidden;
}

.news-secondary-card__photo img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	border-radius: 6px;
}

/*
 * News (TOP page, mobile) — same magazine-grid design language as desktop,
 * adapted to a single stacked column. Own class names throughout (not
 * shared with the desktop .news-featured-left__photo etc.) since those
 * carry a fixed 440px/160x110px desktop sizing that would otherwise leak
 * into this aspect-ratio-based mobile layout.
 */
.news-featured-photo--mobile {
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 8px;
	overflow: hidden;
}

.news-featured-photo--mobile img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	border-radius: 8px;
}

.news-secondary-list--mobile > li {
	border-bottom: 0.5px solid var(--wp--preset--color--border);
	padding-bottom: 16px;
	margin-bottom: 16px;
}

.news-secondary-list--mobile > li:last-child {
	border-bottom: none;
	padding-bottom: 0;
	margin-bottom: 0;
}

.news-secondary-card__photo--mobile {
	width: 110px;
	height: 80px;
	flex-shrink: 0;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 6px;
	overflow: hidden;
}

.news-secondary-card__photo--mobile img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	border-radius: 6px;
}

/* ---------- News archive page — uniform 3-column card grid ---------- */
.news-archive-card__photo {
	height: 240px;
	overflow: hidden;
	display: block;
}

.news-archive-card__photo img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform 0.5s ease-out;
}

.news-archive-card__photo:hover img {
	transform: scale(1.05);
}

/* ---------- Reservation CTA (TOP page) — "Contact" card layout ---------- */
.home-contact--desktop {
	position: relative;
	padding: 89px 80px;
	border-top: 1px solid var(--wp--preset--color--border);
	border-bottom: 1px solid var(--wp--preset--color--border);
	overflow: hidden;
}

.home-contact__bg {
	position: absolute;
	inset: 0;
	object-fit: cover;
	z-index: 0;
}

.home-contact__bg-dim {
	position: absolute;
	inset: 0;
	background-color: rgba(248, 247, 244, 0.9);
	z-index: 0;
}

.home-contact__inner {
	position: relative;
	z-index: 1;
	display: flex;
	gap: 80px;
	align-items: flex-start;
}

.home-contact__header {
	width: 480px;
	flex-shrink: 0;
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.home-contact__header-label {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 8px;
}

.home-contact__header-rule {
	width: 32px;
	height: 1px;
	background-color: #7c5c3e;
}

.home-contact__accent-line {
	width: 40px;
	height: 2px;
	background-color: #79716b;
}

.home-contact__right {
	flex: 1 0 0;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 20px;
}

.home-contact__card {
	background-color: #ffffff;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 8px;
	padding: 40px 32px;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 24px;
}

.home-contact__card-label {
	font-family: var(--wp--preset--font-family--sans);
	font-weight: 500;
	font-size: 14px;
	color: #403e3c;
	white-space: nowrap;
}

.home-contact__form-button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	background-color: #7c5c3e;
	color: #ffffff;
	padding: 16px 36px;
	border-radius: 40px;
	font-family: var(--wp--preset--font-family--sans);
	font-weight: 500;
	font-size: 14px;
	text-decoration: none;
	white-space: nowrap;
	transition: background-color 0.3s ease;
}

.home-contact__form-button:hover {
	background-color: #63482f;
}

.home-contact__phone-detail {
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: 4px;
}

.home-contact__phone-number {
	font-family: var(--wp--preset--font-family--serif);
	font-weight: 600;
	font-size: 36px;
	color: #7c5c3e;
	text-decoration: none;
	white-space: nowrap;
}

.home-contact__phone-hours {
	font-family: var(--wp--preset--font-family--sans);
	font-size: 11px;
	color: #a6a09b;
	white-space: nowrap;
}

.home-contact--mobile {
	padding: 56px 24px;
	background: linear-gradient(to right, #f8f7f4, #efece6);
	border-top: 1px solid #e7e5e4;
	border-bottom: 1px solid #e7e5e4;
	display: flex;
	flex-direction: column;
	gap: 32px;
}

.home-contact--mobile .home-contact__header {
	width: 100%;
	align-items: center;
	text-align: center;
}

.home-contact--mobile .home-contact__card {
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 16px;
	padding: 20px;
}

.home-contact--mobile .home-contact__form-button {
	/*
	 * box-sizing:border-box is required here: the base rule's content-box
	 * default meant width:100% + this padding added on top of that 100%,
	 * overflowing the card and squeezing the button's own text right up
	 * against its edges instead of leaving visible side padding.
	 */
	box-sizing: border-box;
	width: 100%;
	padding: 12px 20px;
}

.home-contact--mobile .home-contact__phone-detail {
	align-items: center;
	width: 100%;
}

.home-contact--mobile .home-contact__header-label {
	align-items: center;
}

.home-contact--mobile .home-contact__header-rule {
	display: none;
}

.home-contact--mobile .home-contact__phone-number {
	font-size: 28px;
}

/* ============================================================
 * Motion: entrance + scroll-reveal + hover (assets/js/scroll-animations.js)
 * ============================================================ */

/*
 * Respect reduced-motion preference: skip all entrance/reveal transitions,
 * elements render in their final state immediately (JS still adds
 * is-visible, this just removes the animated transition).
 */
@media (prefers-reduced-motion: reduce) {
	.hero-reveal,
	.hero-image-reveal,
	.reveal-up,
	.reveal-stagger > * {
		transition: none !important;
		opacity: 1 !important;
		transform: none !important;
	}
}

/* ---------- Hero entrance (page load) ---------- */
.hero-reveal {
	opacity: 0;
	transform: translateY(20px);
	transition: opacity 0.7s ease-out, transform 0.7s ease-out;
}

.hero-reveal.is-visible {
	opacity: 1;
	transform: translateY(0);
}

.hero-reveal--1 { transition-delay: 0.1s; }
.hero-reveal--2 { transition-delay: 0.3s; }
.hero-reveal--3 { transition-delay: 0.5s; }
.hero-reveal--4 { transition-delay: 0.7s; }

.hero-image-reveal {
	opacity: 0;
	transform: scale(1.05);
	transition: opacity 1s ease-out, transform 1.2s ease-out;
}

.hero-image-reveal.is-visible {
	opacity: 1;
	transform: scale(1);
}

/* ---------- Scroll-triggered reveal (IntersectionObserver) ---------- */
.reveal-up {
	opacity: 0;
	transform: translateY(36px);
	transition: opacity 0.7s ease-out, transform 0.7s ease-out;
}

.reveal-up.is-visible {
	opacity: 1;
	transform: translateY(0);
}

/* Card grids: JS assigns each direct child a ~100ms-stepped transition-delay */
.reveal-stagger > * {
	opacity: 0;
	transform: translateY(36px);
	transition: opacity 0.6s ease-out, transform 0.6s ease-out;
}

.reveal-stagger.is-visible > * {
	opacity: 1;
	transform: translateY(0);
}

/* ---------- Hover: image cards scale on hover, container clips overflow ---------- */
.home-menu__card,
.home-related__photo,
.news-featured__photo,
.news-card__photo {
	overflow: hidden;
}

.home-menu__card .wp-block-cover__image-background,
.home-related__photo img,
.news-featured__photo img,
.news-card__photo img,
.news-featured-left__photo img,
.news-secondary-card__photo img {
	transition: transform 0.5s ease-out;
}

.home-menu__card:hover .wp-block-cover__image-background,
.home-related__card:hover .home-related__photo img,
.news-featured__photo:hover img,
.news-card__photo:hover img,
.news-featured-left__photo:hover img,
.news-secondary-card__photo:hover img {
	transform: scale(1.05);
}

.home-news__featured .wp-block-post-featured-image,
.home-news__secondary .wp-block-post-featured-image {
	overflow: hidden;
}

/* ---------- Hover: buttons — smooth color/border transitions ---------- */
.wp-element-button,
.gallery-lightbox__close {
	transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease, filter 0.3s ease;
}

/*
 * Solid-fill buttons that aren't the pill-shaped header Reservation button
 * or the circular arrow-cta-button/.gallery-page__more (each has its own
 * dedicated hover already) — e.g. Access page's "Google マップ" button, the
 * Contact section's "お問い合わせフォームはこちら" button. Outline-style
 * buttons (.is-style-outline) are excluded: brightening a transparent fill
 * with no background to lighten just dims the border/text oddly.
 */
.wp-element-button:not(.is-style-outline):hover {
	filter: brightness(1.1);
}

/* ---------- Hover: text links — underline grows left to right ---------- */
.site-footer__links a,
.gallery-filter-tabs__tab a {
	position: relative;
	text-decoration: none;
}

.site-footer__links a::after,
.gallery-filter-tabs__tab a::after {
	content: "";
	position: absolute;
	left: 0;
	bottom: -2px;
	width: 0;
	height: 1px;
	background-color: currentColor;
	transition: width 0.3s ease;
}

.site-footer__links a:hover::after,
.gallery-filter-tabs__tab a:hover::after {
	width: 100%;
}

/*
 * ---------- Header nav links: accent color + underline on hover ----------
 * No Figma hover spec exists for this (Figma doesn't carry hover states);
 * this reproduces the reference screenshot's pattern using the project's
 * existing accent color (#c8956c, already used for the arrow-cta-button
 * border and section "(Label)" text elsewhere on the site).
 *
 * !important on color/current-state rules: the header nav's resting color
 * comes from either a WP core preset class (.has-text-body-color, which
 * core itself ships with !important) on non-home/solid-header pages, or
 * the body.home transparent-header override (color:#fff, see ~line 253) —
 * both need to be outranked the same way regardless of which header state
 * is active when the pointer lands.
 */
.site-header__nav .wp-block-navigation-item__content,
.site-header__nav-mobile .wp-block-navigation-item__content {
	position: relative;
	text-decoration: none;
	transition: color 0.3s ease;
}

.site-header__nav .wp-block-navigation-item__content::after,
.site-header__nav-mobile .wp-block-navigation-item__content::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	height: 1px;
	background-color: #c8956c;
	transform: scaleX(0);
	transform-origin: left;
	transition: transform 0.3s ease;
}

/*
 * The visual gap between text and underline is (this offset) + whatever
 * padding sits below the text inside .wp-block-navigation-item__content —
 * desktop has 8px of its own (see the padding rule above, for hit-area),
 * mobile has none. A single shared "bottom" value can't land ~4-6px below
 * the text on both, so each gets its own: desktop pulls the line up into
 * its padding (positive bottom), mobile pushes it out past the box edge
 * (negative bottom) by roughly the same visual amount.
 */
.site-header__nav .wp-block-navigation-item__content::after {
	bottom: 3px;
}

.site-header__nav-mobile .wp-block-navigation-item__content::after {
	bottom: -5px;
}

.site-header__nav .wp-block-navigation-item__content:hover,
.site-header__nav .wp-block-navigation-item__content.is-current-nav,
.site-header__nav-mobile .wp-block-navigation-item__content:hover,
.site-header__nav-mobile .wp-block-navigation-item__content.is-current-nav {
	color: #c8956c !important;
}

.site-header__nav .wp-block-navigation-item__content:hover::after,
.site-header__nav .wp-block-navigation-item__content.is-current-nav::after,
.site-header__nav-mobile .wp-block-navigation-item__content:hover::after,
.site-header__nav-mobile .wp-block-navigation-item__content.is-current-nav::after {
	transform: scaleX(1);
}

/*
 * News article detail (single-news.html): the body copy, article gallery
 * and related-news grid all reused var:preset|spacing|section (80px) as
 * their side padding on every breakpoint — fine on desktop, but on a
 * ~390px phone that leaves ~230px of actual content width. Same story for
 * the related-news grid staying 3 columns at any width. Mobile-only
 * overrides bring both back in line with the rest of the site's ~20px
 * mobile margin and single-column mobile card stacking.
 */
@media (max-width: 1024px) {
	.news-detail-body,
	.news-detail-related {
		padding-left: 20px !important;
		padding-right: 20px !important;
	}

	.news-detail-related .wp-block-post-template.is-layout-grid {
		grid-template-columns: 1fr !important;
	}
}

/*
 * Hero featured image: fixed 390x260 (3:2) container on mobile rather than
 * the 21/9 aspect ratio, which runs too tall on a narrow viewport. Setting
 * height on the figure alone isn't enough — the img itself still needs an
 * explicit width/height/object-fit or it renders at its own natural size
 * inside the fixed-height box, leaving empty space below instead of being
 * cropped to fill it.
 */
@media (max-width: 1024px) {
	.single-news .wp-block-post-featured-image {
		aspect-ratio: unset !important;
		width: 100%;
		height: 260px !important;
	}

	.single-news .wp-block-post-featured-image img {
		width: 100%;
		height: 100%;
		object-fit: cover;
		display: block;
	}
}

/*
 * Same align-items:flex-start default as the RelatedSites/News-gallery
 * fixes above: the MainLargePhoto is a direct child of this vertical flex
 * section with no width of its own, so without stretch it shrink-wraps to
 * whatever width its own height-constrained aspect ratio happens to
 * produce instead of filling the section.
 */
.party-facilities--mobile {
	align-items: stretch;
}

/*
 * Same align-items:flex-start default as the RelatedSites card fix above:
 * without this, each photo shrink-wraps to its own intrinsic width
 * instead of stretching to the full-bleed container's width. Left/right
 * padding is forced to 0 for the same reason as .home-related__card: WP
 * core's :where(.wp-block-group.has-background) fallback (1.25em 2.375em)
 * otherwise silently reintroduces ~38px side insets, defeating the
 * full-bleed layout the template's own padding-left/right removal intended.
 */
.news-detail-gallery--mobile {
	align-items: stretch;
	padding-left: 0;
	padding-right: 0;
}

.news-detail-gallery__photo--mobile {
	width: 100%;
}

.news-detail-gallery__photo--mobile img {
	width: 100%;
	height: 200px;
	object-fit: cover;
	border-radius: 4px;
}

/* Related-news card photos: 350x233 on mobile per Figma (vs. the desktop grid's own aspect ratio) */
@media (max-width: 1024px) {
	.news-detail-related .news-card__photo img {
		height: 233px;
		object-fit: cover;
	}
}

/* Access page: mobile-only storefront photo, missing from the mobile section entirely before (350x240 per Figma) */
.access-info__photo--mobile img {
	height: 240px;
	object-fit: cover;
}

/*
 * Shared breadcrumb line (Figma places one on every subpage, typically as
 * a small standalone strip near the bottom of the page rather than a
 * top-of-page header element). One block reused across every subpage
 * template rather than duplicating --desktop/--mobile variants, since it's
 * just a single text line — padding alone needs to flex with viewport.
 */
.page-breadcrumb {
	padding: 24px 80px;
}

@media (max-width: 1024px) {
	.page-breadcrumb {
		padding: 16px 20px;
	}
}

/*
 * News article detail breadcrumb: the trailing segment is the post's own
 * title, rendered via the dynamic core/post-title block (level:0 so it's a
 * <p>, not a heading) — a flex row of two <p> siblings rather than
 * one continuous sentence, since nesting the dynamic block inside another
 * <p> is invalid HTML (browsers silently split it into two block-level
 * paragraphs instead of running them inline). Reset browser default <p>
 * margins so the two still read as one line.
 */
.news-detail-breadcrumb p {
	margin: 0;
}
