/**
 * restyle.css - LandboUngdom site-specific overrides
 *
 * Handle: egovt-child-restyle. Third and last of the child theme's sheets:
 *
 *   tokens.css          names - Kit colour/type aliases + geometry tokens
 *   design-system.css   reusable lu-* components, geometry and type only
 *   restyle.css         <- we are here
 *
 * WHAT BELONGS HERE, AND WHAT DOES NOT
 *
 * This file is for things that are true of THIS SITE and cannot be expressed as
 * a reusable component: the global header and footer documents, and the handful
 * of places where a plugin's own CSS has to be argued with.
 *
 * A rule that would be just as correct on another page belongs in
 * design-system.css. A colour belongs in the Elementor Kit.
 *
 * HOUSE RULES
 *
 * - No !important unless a conflict has actually been measured, and every use
 *   names what it beats. Four of the five !important rules this file used to
 *   carry are gone, because the stale Cabin typography they were fighting has
 *   been cleared at source in the Elementor editor - which was always the real
 *   fix (HANDOFF section 5).
 * - Beat Elementor by matching its specificity, never by force. The client
 *   edits this site in Elementor and must not be locked out of it.
 * - Colour comes from the Kit via var(--lu-*). No hex in this file.
 *
 * WHERE THIS FILE SITS IN THE CASCADE (verified against the rendered <head>)
 *
 *   egovt-theme            parent theme.css, 194 KB
 *   style-elementor.css    ova-framework plugin CSS (priority 10)
 *   egovt-style + inline   ~28 KB of Ovatheme Customizer CSS
 *   elementor-frontend     + inline .elementor-kit-4 (palette + type scale)
 *   tokens -> ds -> THIS FILE                     <- we are here (priority 20)
 *   widget-heading, widget-counter, ...           Elementor per-widget CSS
 *   inline .elementor-post-NNNN                   Elementor per-document CSS
 *   wp-custom-css                                 Additional CSS, post 9002
 *
 * Two consequences worth internalising:
 *
 * 1. Elementor's per-widget sheets load AFTER us, and its per-document CSS
 *    prints INSIDE <body>, later than any stylesheet. Rules here therefore
 *    carry one extra notch of specificity - typically a leading `body` - which
 *    beats a plugin's .elementor-widget-x .y (0,3,3) while still losing to
 *    Elementor's per-element .elementor-NNNN .elementor-element-xxxxx (0,5,3).
 *    That gap is the point: the client's own Elementor edits keep winning.
 *
 * 2. Additional CSS (post 9002) prints on wp_head priority 101 and always wins.
 *    See docs/additional-css-9002.css for what is in it. Do not try to out-rank
 *    it from here - the fix is editing the Customizer, a manual prod step.
 */


/* ==========================================================================
   1. @font-face
   ========================================================================== */

/**
 * Intentionally empty.
 *
 * The GT Era @font-face declarations live in assets/css/gt-era-fonts.css under
 * their own handle (gt-era-fonts, registered in inc/elementor-fonts.php). They
 * are kept separate because that sheet is also enqueued into the Elementor
 * editor panel via elementor/editor/after_enqueue_styles, where this file is
 * not loaded - the font picker needs the faces, but the editor chrome must not
 * inherit the site's re-style.
 *
 * NOTE: GT Era is currently installed TWICE on this site. This theme ships one
 * copy; the WP Font Library holds another (wp_font_family / wp_font_face posts
 * 35590-35599, files in wp-content/uploads/fonts/) which emits its own inline
 * @font-face and --wp--preset--font-family-* tokens. Neither the posts nor the
 * uploads directory travel with this theme. See HANDOFF section 1a.
 */


/* ==========================================================================
   2. Element defaults
   ==========================================================================

   FONT FAMILY ONLY, and a safety net rather than the mechanism.

   The Elementor Kit already sets GT Era on body, links and h1-h6 at
   .elementor-kit-4 (0,1,0), and the Kit is the source of truth. These rules sit
   below that and never fight it - they exist for the case where the Kit is
   exported, re-imported or re-keyed, which HANDOFF section 2 flags as a real
   risk, and for markup the Kit's selectors do not reach.

   The old design used two faces and the re-style maps them one for one, so the
   existing typographic hierarchy survives unchanged:

       Nunito Sans  (old body face)     ->  --lu-font-body     GT Era Text
       Cabin        (old display face)  ->  --lu-font-display  GT Era Display

   None of these need !important. The Ovatheme Customizer's competing
   declarations are attached to the egovt-style handle and print earlier than
   this file at the same specificity, so we win on order alone - which is the
   whole reason the enqueue depends on egovt-style. See
   tools/font-audit-report.json for the measurements.
   ========================================================================== */

body {
	font-family: var(--lu-font-body);
	/**
	 * THE `!important` IS LOAD-BEARING, and what it beats is an inline style.
	 *
	 * ova-framework dims the page for the mobile drawer by writing the BODY's
	 * background: `$('body').css('background-color', 'rgba(0,0,0,0.4)')` on
	 * open, and `'transparent'` on close (script-elementor.js:12 and :20). It
	 * does not restore what was there - it hardcodes transparent - so the first
	 * time the drawer was opened and closed, the page ground was gone and the
	 * white canvas showed through for the rest of the visit. Reported as "the
	 * background turns white after using the menu".
	 *
	 * An element's inline style beats every stylesheet, so this is the one
	 * declaration that cannot be won on specificity or order. Two knock-on
	 * effects, both wanted:
	 *
	 *   - The 40% black dim is cancelled too, which returns the open state to
	 *     the design: `.ova_closeCanvas` is the scrim, and it is the page's own
	 *     colour at 75% (section 3), not a grey wash with black behind it.
	 *   - The ground cannot be painted on <html> instead - the --lu-* tokens are
	 *     declared on `body`, deliberately, because Elementor's Kit class lives
	 *     there (tokens.css). On <html> the var would not resolve.
	 */
	background-color: var(--lu-page-bg) !important;
	/* Companion to .lu-bleed in design-system.css section 15: a full-bleed
	 * section is 100vw wide, which includes the scrollbar, so without this the
	 * page gains a horizontal scrollbar. `clip` rather than `hidden` - hidden
	 * would make body a scroll container and break the sticky header. */
	overflow-x: clip;
}

h1, h2, h3, h4, h5, h6,
.nav_comment_text {
	font-family: var(--lu-font-display);
}

/**
 * Form controls do not inherit font-family from body - the UA stylesheet gives
 * them the operating system's UI font - so neither the Kit nor the rules above
 * can reach them. Nothing else competes here.
 */
button, input, optgroup, select, textarea {
	font-family: var(--lu-font-body);
}

/**
 * Ovatheme's "second font" utility. Beats `.cal1, .second_font { Cabin }` from
 * the Customizer on source order at equal (0,1,0) specificity.
 * Measured on: front page, the "28. August 2026" post date.
 */
.cal1,
.second_font {
	font-family: var(--lu-font-display);
}

/**
 * Mobile heading scale.
 *
 * The Kit sets h1-h4 once, for desktop, at .elementor-kit-4 h2 (0,1,1) - it has
 * no responsive control for the type scale. So the step down has to happen here.
 *
 * `body[class*="elementor-kit-"]` rather than `.elementor-kit-4` on purpose:
 * (0,1,2) clears the Kit's (0,1,1) without hard-coding the Kit's post id, which
 * changes if the Kit is re-imported (HANDOFF section 2).
 *
 * Only h1 and h2 move. h3 and h4 are already right at both widths, and the
 * stat figure stays at 81 because it reads --lu-type-h1-* rather than these.
 */
@media (max-width: 767px) {
	body[class*="elementor-kit-"] h1 {
		font-size: var(--lu-type-h1-page-size);
		line-height: var(--lu-type-h1-page-lh);
	}

	body[class*="elementor-kit-"] h2 {
		font-size: var(--lu-type-h2-size);
		line-height: var(--lu-type-h2-lh);
	}

	/**
	 * lu-page-head--long: a page title that is a sentence rather than a name
	 * steps once more on a phone (wave 3, D16). See tokens.css for why this is
	 * a modifier and not a change to --lu-type-h1-page-size.
	 *
	 * Matched at (0,2,1) so it beats the h1 rule above, which is (0,1,2).
	 */
	body[class*="elementor-kit-"] .lu-page-head--long h1,
	body[class*="elementor-kit-"] h1.lu-page-head--long {
		font-size: var(--lu-type-h1-page-long-size);
		line-height: var(--lu-type-h1-page-long-lh);
	}
}


/* ==========================================================================
   2b. Content width
   ==========================================================================
   The design's content column is 1320px - 1440 less a 60px gutter each side.
   Three things cap it at 1270 and they have to be answered separately:

     theme.css:414   .wrap_site { max-width: 1270px }          the page wrapper
     theme.css:423   .container, body .elementor-section
                     .elementor-section-boxed > .elementor-container
                     { max-width: 1270px !important }          "Fix Layout to 1270px"
     Elementor Kit   Content Width, now 1320                    already done

   The second is the only !important in this file besides Slider Revolution, and
   it is unavoidable: theme.css declares !important at exactly this specificity,
   so nothing but a matching !important can pass it. We load later, so equal
   specificity resolves our way.

   The wrapper is sized so its CONTENT box is exactly --lu-container, and its
   padding is --lu-pad rather than the theme's flat 10px. That keeps the gutter
   at 60px at 1440 (36px of centring plus 24px of padding) and stops it
   collapsing to 10px at every width in between - which is what let text run
   into the viewport edge from about 1024 down.

   A section nested inside a column loses another 20px to that column's default
   padding. Rather than cancelling it with a negative margin here - which would
   be wrong the moment a column had different padding - the columns this affects
   have their padding set to zero in Elementor. See HANDOFF section 6.
   ========================================================================== */

.wrap_site {
	max-width: calc(var(--lu-container) + 2 * var(--lu-pad));
	padding-inline: var(--lu-pad);
}

/**
 * The !important is unavoidable - theme.css declares one at exactly this
 * specificity - but the VALUE is a variable, which is what lets a full-bleed
 * section opt out without a second !important fight. `.lu-hero` and the footer's
 * advert strip raise --lu-container-max on themselves; it inherits down to the
 * container, and this rule reads it. See design-system.css section 13b.
 */
body .elementor-section.elementor-section-boxed > .elementor-container {
	max-width: var(--lu-container-max, var(--lu-container)) !important;
}


/* ==========================================================================
   3. Site chrome - the global header
   ==========================================================================

   Header document 5460 "Header primary", live as `global_header`,
   `single_header`, `blog_header` and both `sev` headers - so this is every page
   on the site except the four Konference 2026 pages, which use document 2737.

   The Elementor side of this has already been done: the Cabin typography and
   the #AAAD00 literals are cleared, `bg_dark` is off the masthead, and the two
   bars are bound to Kit globals (a53ee87 "Pink bjaelke", 1fa1664
   "Sidebaggrund"). What is left here is geometry and the plugin's own defaults.

   The nav rules below are deliberately NOT scoped to document 5460. Any header
   document gets the design; a document that still carries its own per-element
   Elementor settings - 2737 does - keeps them, because those print later and
   more specifically. That is the correct behaviour in both directions.
   ========================================================================== */

/* --- The sticky nav ------------------------------------------------------
 * The nav bar stays pinned to the top of the viewport for the length of the
 * page; the pink bar scrolls away and does not come back. Neither bar moves at
 * rest - desktop still draws pink above nav, mobile still draws nav above pink
 * - so this is a scroll behaviour, not a re-layout.
 *
 * Three things had to be true for `position: sticky` to do it on its own, with
 * no scroll listener and no JS in this theme:
 *
 * 1. NOTHING BETWEEN THE NAV AND THE VIEWPORT MAY SCROLL. `body` is
 *    `overflow-x: clip` rather than `hidden` for exactly this reason (section
 *    2): `clip` does not make a scroll container, `hidden` would, and a sticky
 *    element inside one sticks to that box instead of to the viewport.
 *
 * 2. THE CONTAINING BLOCK MUST BE THE PAGE, NOT THE HEADER. A sticky element
 *    never travels outside its containing block, and the header document's own
 *    wrapper is only as tall as the two bars it holds - 93px, measured - so a
 *    nav pinned inside it would come unstuck 41px into the scroll.
 *    `display: contents` drops that wrapper's box without touching the DOM:
 *    the two bars become boxes of `.ova-wrapp`, which spans the whole
 *    document, and the nav can stay pinned all the way to the footer. Safe
 *    because the wrapper paints nothing of its own - no background, border or
 *    padding, measured in the browser, not assumed - and selectors still match
 *    the DOM, so Elementor's own `.elementor-5460 .elementor-element-*` rules
 *    are unaffected.
 *
 * 3. THE PINK BAR MUST BE OUTSIDE THE STICKY BOX. On desktop it already is: an
 *    earlier sibling, so it scrolls off on its own. Mobile draws it below the
 *    nav, and is handled in the 1024px block near the end of this file.
 *
 * Scoped with `:has(> .lu-masthead)` rather than to document 5460, for the
 * reason in the section header: any header document carrying the design gets
 * the behaviour. Document 2737 (Konference) carries neither class and keeps
 * its static header.
 *
 * Switched off inside the Elementor editor: a document wrapper with no box is
 * not something the editor's drag-and-drop should have to reason about.
 * `elementor-editor-active` sits on the preview iframe's own body while the
 * panel is open and is swapped for `elementor-editor-preview` when it is
 * hidden - so the client's own preview still shows the real behaviour.
 */
body:not(.elementor-editor-active) .elementor:has(> .lu-masthead) {
	display: contents;
}

/**
 * No z-index here: the masthead already carries 99 from its own Elementor
 * Z-Index control, which prints later and at (0,4,0). That is what keeps the
 * pink bar - and the page - passing behind the pinned bar rather than through
 * it. The bar's opaque ground comes from the same place (Kit global
 * "Sidebaggrund"), so there is nothing to paint here either.
 *
 * Beats `.elementor-section { position: relative }` from elementor frontend.css
 * (0,1,0, earlier in the cascade) on the leading `body`, per the house rule.
 */
body .lu-masthead {
	position: sticky;
	top: 0;
}

/**
 * The logged-in toolbar is fixed over the top of the page at 601px and up, so
 * the nav pins below it rather than under it. WordPress publishes the
 * toolbar's own height (32px, 46px below 783px) on <html>, so this follows it
 * without restating either number. Below 601px the toolbar scrolls away with
 * the page and the nav goes back to the top of the viewport.
 * Editors only - `admin-bar` is never on a visitor's body.
 */
body.admin-bar .lu-masthead {
	top: var(--wp-admin--admin-bar--height, 32px);
}

@media (max-width: 600px) {
	body.admin-bar .lu-masthead {
		top: 0;
	}
}

/**
 * In-page anchors, and the browser's own find-on-page and focus scrolling,
 * would otherwise land the target underneath the pinned bar. The theme already
 * sets `scroll-behavior: smooth` on <html>; this is its companion.
 */
html {
	scroll-padding-top: var(--lu-header-bar-h);
}

/* --- The pinned nav's glass ----------------------------------------------
 * The bar transmits a little of whatever is behind it and blurs it. Nothing
 * about this is tied to the scroll: at rest there is nothing behind the bar
 * but the page's own ground, which is the colour the bar already is, so it
 * looks exactly as it always has - and the moment content passes underneath,
 * the glass shows. "Only when it is stuck" comes out of the physics rather
 * than out of a state we have to detect.
 *
 * That is the second reason for doing it this way. The first was a shadow, and
 * it was tied to a scroll-driven animation - a 2023 feature that Safari did not
 * ship until 26, so on an older browser it could never appear at all.
 * `backdrop-filter` is a decade old and prefixed back to Safari 9.
 *
 * WHY A PSEUDO-ELEMENT AND NOT THE SECTION ITSELF. `backdrop-filter` makes its
 * element a containing block for every `position: fixed` descendant, and the
 * mobile drawer - `.ova_nav`, fixed, full height - is a descendant of this
 * section. On the section, the drawer would be positioned against a 52px bar
 * instead of the viewport and the menu would be unusable. A pseudo-element has
 * no descendants to capture, so the effect lands and nothing moves.
 *
 * `z-index: -1` puts the layer behind the bar's own contents but in front of
 * the section's background, which is the paint order a stacking context gives
 * a negative-z child of an element that establishes one (the masthead does,
 * via its Elementor z-index of 99).
 */

/**
 * THE BAR'S GROUND MOVES OUT OF ELEMENTOR AND INTO HERE, and that is a real
 * trade to be aware of rather than a detail.
 *
 * `backdrop-filter` blurs everything painted behind its element - including the
 * section's own background. While that background is opaque there is nothing
 * behind it to see, so the glass has to be the only ground the bar has.
 *
 * Which means beating Elementor's own background rule for this section,
 * `.elementor-5460 .elementor-element.elementor-element-5bd9d18:not(...)` at
 * (0,4,0) - the first rule in this file that deliberately out-ranks a client
 * setting instead of deferring to it. (0,4,1) does it, on the element selector
 * rather than an !important.
 *
 * The colour still follows the Kit: --lu-nav-glass is mixed from --lu-page-bg,
 * the global the section is bound to, so Site Settings -> Global Colors ->
 * Sidebaggrund still repaints the bar. What no longer works is changing THIS
 * SECTION's background in the Elementor editor - that control is now inert,
 * and the value to edit is --lu-nav-glass in tokens.css. Recorded in HANDOFF
 * section 5.
 */
body .elementor .lu-masthead.elementor-section.elementor-top-section {
	background-color: transparent;
}

.lu-masthead::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	/* The bar as it has always been. A browser with no `backdrop-filter` stops
	 * here and gets an opaque bar rather than an unreadable transparent one. */
	background-color: var(--lu-page-bg);
	pointer-events: none;
}

@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
	.lu-masthead::before {
		background-color: var(--lu-nav-glass);
		-webkit-backdrop-filter: var(--lu-nav-glass-filter);
		backdrop-filter: var(--lu-nav-glass-filter);
	}
}


/* --- The pinned bar's shadow ---------------------------------------------
 * Drawn only while the bar is pinned, which is a state CSS cannot read: there
 * is no `:stuck` selector in any browser. `assets/nav-stuck.js` answers it by
 * watching a 1px sentinel with an IntersectionObserver and putting
 * `lu-nav-stuck` on <body>; its header carries the reasoning, including why
 * this is not the `animation-timeline: scroll()` version it replaces.
 *
 * The sentinel sits at the pink bar's height down the page. That single number
 * is the right trigger at both widths for two different reasons - on desktop it
 * is where the bar pins, on mobile it is where the pink bar finishes passing
 * behind it - so the shadow never falls across pink, which was the ask.
 *
 * Positioned against the initial containing block, which is anchored to the
 * document rather than to the viewport, so `top` here is a page coordinate.
 * `.ova-wrapp` is `position: relative` below 1025px (the pink bar hangs off it)
 * and static above, and the sentinel lands in the same place either way -
 * both containing blocks start at the top of the document.
 */
.lu-nav-sentinel {
	position: absolute;
	top: var(--lu-utility-bar-h);
	inset-inline-start: 0;
	width: 1px;
	height: 1px;
	pointer-events: none;
	visibility: hidden;
}

.lu-masthead::after {
	content: "";
	position: absolute;
	inset-inline: 0;
	top: 100%;
	height: var(--lu-nav-shadow-h);
	background: var(--lu-nav-shadow);
	/* The resting state, and the whole answer for a browser with no
	 * IntersectionObserver or no JS: no shadow, and a bar that is still glass. */
	opacity: 0;
	transition: opacity 160ms linear;
	pointer-events: none;
}

body.lu-nav-stuck .lu-masthead::after {
	opacity: 1;
}

/* A fade is not movement, but the design system asks every transition to have
 * an answer here, and the honest one is to arrive without the fade. */
@media (prefers-reduced-motion: reduce) {
	.lu-masthead::after {
		transition: none;
	}
}

/**
 * THE PARENT THEME HAS A STICKY HEADER OF ITS OWN, and it has to be switched
 * off or the two fight.
 *
 * The masthead carries the class `ovamenu_shrink_mobile`, which is the
 * ova-framework opt-in for it (script-elementor.js:55-80). Below desktop, once
 * the page has scrolled past the header's height + 150px, its scroll handler
 * adds `active_fixed` - theme.css:1222 then takes the bar out of flow with
 * `position: fixed` and a box-shadow - and inserts a spacer div after it whose
 * height it sets to the bar's own.
 *
 * Three things are wrong with that, and all three are measured on this site:
 *
 *   - It does not start until 202px of scroll, so the bar is gone from the
 *     screen for most of a phone's first swipe and then appears out of nowhere.
 *   - The spacer replaces a 52px bar, but a bar leaving the flow here takes its
 *     41px reservation for the pink bar with it - so the page jumped 41px up at
 *     the moment the class landed.
 *   - It brings its own box-shadow, which snaps on at 202px, below desktop
 *     only, and is not the design's. The design's is above: tinted from the
 *     palette, at both widths, from the moment the bar is actually pinned.
 *
 * Rather than let the class arrive and fix it up, this cancels what it does.
 * The JS still runs; it just has nothing left to change. Equal specificity to
 * theme.css's (0,2,1) and later in the cascade, per the house rule - no
 * `!important` is needed.
 *
 * The tidier fix is one editor change: clear `ovamenu_shrink_mobile` from the
 * masthead's CSS Classes in Elementor and the handler never binds at all. That
 * is a manual production step (HANDOFF section 5), and these two rules are what
 * make the theme correct on its own either way - including if the class is
 * added back later. `.show_mask_header` is the desktop spacer, the same
 * mechanism behind `ovamenu_shrink`; nothing on this site sets that class
 * today, and the rule costs one selector.
 */
body .lu-masthead.active_fixed {
	position: sticky;
	box-shadow: none;
}

.show_mask_header,
.show_mask_header_mobile {
	display: none;
}


/* --- The pink utility bar ------------------------------------------------ */

/**
 * Both header bars are --lu-header-bar-h tall, from the same token, so they
 * cannot drift apart. The pink bar's own padding has been removed in Elementor
 * (it was 10/11, giving 62px against the nav's 53) and its height now comes
 * from here.
 *
 * Width and gutter are NOT set here - design-system.css section 13b puts every
 * section of both chrome documents on the same line as the page content.
 */
.lu-masthead > .elementor-container {
	min-height: var(--lu-header-bar-h);
	align-items: center;
}

/* The utility strip is deliberately shallower than the nav bar - 41 against 52
 * on the frame. */
.lu-utility-bar > .elementor-container {
	min-height: var(--lu-utility-bar-h);
	align-items: center;
}

/* `.elementor-element-populated` is in the selector on purpose: the bar has two
 * columns, one of them empty, and only the populated one carries the links.
 * Without it the rule lands on the empty column's wrap and does nothing
 * visible, which is exactly how the mobile split failed the first time. */
.lu-utility-bar .elementor-widget-wrap.elementor-element-populated {
	align-items: center;
	/**
	 * `gap`, not a margin on the first link. The 30px used to live on
	 * `9a50d2e`'s _margin, which Elementor puts on the widget's inner container
	 * - so it also pushed the LAST link 30px off the right line. A gap spaces
	 * the pair without touching either outer edge, and stays correct whether the
	 * bar is left-aligned, right-aligned or split.
	 */
	gap: 30px;
}

.lu-utility-bar .elementor-button {
	padding: 0;
	background: none;
	border: 0;
}


/* --- The masthead -------------------------------------------------------- */

.lu-masthead .elementor-widget-wrap {
	align-items: center;
}

/**
 * The design puts a clear gap between the last nav item and the search control,
 * rather than running everything hard against the right edge. `auto` on the
 * search widget's inline-start margin is what opens it; the nav then settles
 * where the design has it, just right of the logo.
 */
.lu-masthead .elementor-widget-ova_search_popup {
	margin-inline-start: auto;
}

.lu-masthead .elementor-widget-button .elementor-button {
	background: none;
	border: 0;
	padding: 0;
}

/**
 * The Kontakt link needs breathing room from "Soeg" without a margin control
 * being retyped per breakpoint.
 */
.lu-masthead .elementor-widget-button {
	margin-inline-start: 28px;
}


/* --- The nav itself ------------------------------------------------------
 * Leading `body` throughout, for the reason in the file header: it clears the
 * ova-framework plugin sheet at (0,3,3) without ever reaching Elementor's own
 * per-element rules at (0,5,3).
 *
 * What each rule beats:
 *   type    style-elementor.css:103  .ova_nav ul.menu > li > a
 *                                    { font-size:14px; font-weight:500;
 *                                      text-transform:uppercase }
 *   colour  style-elementor.css:41   .elementor-widget-ova_menu .ova_nav
 *                                    ul.menu > li > a { color:#202B5D }
 */

body .elementor-widget-ova_menu .ova_nav ul.menu > li > a {
	/* flex, not the plugin's inline-block: an inline-block carries a baseline
	 * descender gap, which made the nav bar 53px against the pink bar's 52 and
	 * left the two visibly out of step. */
	display: flex;
	align-items: center;
	/* Separates a parent item from its chevron. Items without one have a single
	 * flex item, so this costs them nothing. */
	gap: 3px;
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-menu-size);
	font-weight: 700;
	line-height: var(--lu-type-menu-lh);
	text-transform: none;
	color: var(--lu-primary);
	padding-block: calc((var(--lu-header-bar-h) - var(--lu-type-menu-lh)) / 2);
	padding-inline: 12px;
}

/**
 * THE CURRENT PAGE IS NOT MARKED IN THE NAV.
 *
 * Hover is the only state the bar has. An item sits at --lu-primary whether or
 * not you are on the page it points to - which is a design decision, not a
 * simplification: with hover and "you are here" sharing one colour, a hovered
 * item and the current item were indistinguishable, and the bar appeared to
 * have a permanently hovered item in it.
 *
 * NEUTRALISING IS NOT THE SAME AS NOT STYLING. Dropping `.active` from the
 * hover rule below is not enough, because the Ovatheme Customizer paints the
 * same state from theme_mods primary_color (#BABC0E, an old-palette green in no
 * palette) in three places, all of which out-rank the resting rule above:
 *
 *   (0,4,3)  ul.menu > li.active > a                       color
 *   (0,4,3)  ul.menu > li.current-menu-parent > a          color
 *   (0,5,3)  ul.menu .dropdown-menu li.active > a          background-color
 *
 * ...and the plugin adds `.dropdown-menu li.active > a { color: #fff }` at
 * (0,5,3) of its own. So the current item has to be told what it is, at one
 * notch above each. The leading `body` is what supplies that notch.
 *
 * A fourth rule, `.dropdown-menu li.active { border-bottom-color: #BABC0E
 * !important }`, is left alone deliberately. Measured on a submenu page
 * (/ploejning/, whose item sits under Aktiviteter): border-bottom-width is 0px
 * on active and inactive items alike, so the colour never draws. Answering an
 * !important takes an !important, and there is nothing here to answer - so this
 * adds none.
 *
 * `:is()` keeps the pair on one line and takes its specificity from its most
 * specific argument, so the count above still holds.
 */
body .elementor-widget-ova_menu .ova_nav ul.menu > li:is(.active, .current-menu-parent) > a {
	color: var(--lu-primary);
}

/**
 * Hover. Beats the Ovatheme Customizer's
 * `.elementor-widget-ova_menu .ova_nav ul.menu > li > a:hover` (0,4,2), which
 * still carries theme_mods primary_color #baba0f. HANDOFF section 4 tracks
 * changing that value at source.
 *
 * The second selector is not redundant, and it is not there to match anything
 * the first does not - an active `li` is still an `li`. It is there to WIN:
 * the first is (0,4,4) and so is the rule above it, which would leave the
 * current item's hover to source order. At (0,5,4) it cannot drift.
 */
body .elementor-widget-ova_menu .ova_nav ul.menu > li > a:hover,
body .elementor-widget-ova_menu .ova_nav ul.menu > li:is(.active, .current-menu-parent) > a:hover {
	color: var(--lu-secondary);
}

/* The animated underline pseudo (style-elementor.css:59-66) has no colour of
 * its own; the Customizer paints it. Point it at the palette. */
body .elementor-widget-ova_menu .ova_nav ul.menu > li > a:after {
	background-color: var(--lu-secondary);
}

/* Submenus. */
body .elementor-widget-ova_menu .ova_nav ul.menu .dropdown-menu {
	background-color: var(--lu-page-bg);
	border-radius: 0 0 var(--lu-radius-btn) var(--lu-radius-btn);
	padding: 8px 0;
}

/**
 * …AND ON DESKTOP THE PANEL IS GLASS, like the bar it hangs from.
 *
 * Same recipe, same tokens: 10% of what is behind it, blurred. A submenu is a
 * panel floating over the page in exactly the way the pinned bar is, so it
 * should sit in the page the same way - and the two are on screen together,
 * which is what makes a difference between them read as an accident.
 *
 * Desktop only. Below 1025px a "submenu" is a block inside the off-canvas
 * drawer with the page scrimmed behind it, not a floating panel, and there is
 * nothing there for a blur to do.
 *
 * TWO THINGS THIS BEATS, and the first one is a client setting:
 *
 * 1. The ground. Elementor prints
 *    `.elementor-5460 .elementor-element.elementor-element-c4c6626 .ova_nav
 *    ul.menu .dropdown-menu` (0,5,3) INSIDE <body>, later than this file, so an
 *    equal-specificity rule loses the tie. (0,6,3) takes it. As with the
 *    masthead's ground in this section, that makes the widget's own Submenu
 *    Background control inert - HANDOFF section 5 records both.
 * 2. The shadow. The plugin gives the panel `rgba(6, 22, 58, .1) 0 10px 40px`,
 *    a blue one carried over from the theme demo. The geometry is right for a
 *    panel this size and is kept; only the colour changes, to the black the
 *    design settled on for the bar. A blue shadow and a black one on screen at
 *    the same moment is the kind of thing nobody names and everybody sees.
 */
@media (min-width: 1025px) {
	body .lu-masthead .elementor-element.elementor-widget-ova_menu .ova_nav ul.menu li .dropdown-menu {
		background-color: var(--lu-page-bg);
		box-shadow: 0 10px 40px color-mix(in srgb, black 10%, transparent);
	}

	@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
		body .lu-masthead .elementor-element.elementor-widget-ova_menu .ova_nav ul.menu li .dropdown-menu {
			background-color: var(--lu-nav-glass);
			-webkit-backdrop-filter: var(--lu-nav-glass-filter);
			backdrop-filter: var(--lu-nav-glass-filter);
		}
	}
}

body .elementor-widget-ova_menu .ova_nav ul.menu .dropdown-menu li > a {
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-body-size);
	font-weight: 700;
	line-height: var(--lu-type-body-lh);
	text-transform: none;
	color: var(--lu-primary);
	padding: 10px 20px;
}

/* Submenus follow the same pair: primary at rest, secondary on hover, and no
 * ground behind either state - and, like the bar above, they do not mark the
 * current page.
 *
 * The background has to be stated even though the colour is now the resting
 * one: the Customizer paints `.dropdown-menu li.active > a` from its long
 * `background-color` selector list, which is what would otherwise put a lime
 * block behind the current item in an open panel. */
body .elementor-widget-ova_menu .ova_nav ul.menu .dropdown-menu li.active > a {
	color: var(--lu-primary);
	background-color: transparent;
}

body .elementor-widget-ova_menu .ova_nav ul.menu .dropdown-menu li > a:hover,
body .elementor-widget-ova_menu .ova_nav ul.menu .dropdown-menu li.active > a:hover {
	color: var(--lu-secondary);
	background-color: transparent;
}

body .elementor-widget-ova_menu .ova_nav ul.menu .dropdown-menu li a:after {
	background-color: transparent;
}

/* --- The submenu chevron -------------------------------------------------
 * Drawn from --lu-icon-chevron rather than set in ElegantIcons. The token
 * carries the full reasoning; the short version is that the walker emits
 * `<i class="arrow_carrot-down">` and the icon font addresses that glyph as the
 * literal character "3", so every frame the font is not yet painting, the nav
 * reads "Aktiviteter 3" - and FlyingPress's font-display:swap guarantees there
 * are such frames.
 *
 * Sized in em so the widget's own icon size still drives it, filled with
 * `currentColor` so it keeps following the nav's colour pair (--lu-primary at
 * rest, --lu-secondary on hover) with no second rule.
 *
 * One selector covers both layouts: the desktop bar renders the <i> inside the
 * link, the mobile drawer inside `button.dropdown-toggle`.
 */
body .elementor-widget-ova_menu i.arrow_carrot-down {
	display: inline-block;
	width: 1em;
	height: 1em;
	flex: none;
}

body .elementor-widget-ova_menu i.arrow_carrot-down::before {
	content: "";
	display: block;
	width: 100%;
	height: 100%;
	background-color: currentColor;
	-webkit-mask: var(--lu-icon-chevron) center / contain no-repeat;
	mask: var(--lu-icon-chevron) center / contain no-repeat;
}


/* --- The search control -------------------------------------------------
 * The design pairs a small, heavy magnifier with the word "Soeg", both in the
 * Menu role. The widget renders only `<i class="icon_search">` - an ElegantIcons
 * glyph - and offers no label setting, so both come from here.
 *
 * The click handler is bound to `.ova_wrap_search_popup i`
 * (script-elementor.js:167), so the label is a ::after on the icon itself
 * rather than a sibling: a pseudo-element is part of its element's hit area,
 * which keeps the whole "search Soeg" pair clickable.
 */
body .elementor-widget-ova_search_popup .icon_search {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	color: var(--lu-primary);
	cursor: pointer;
	/* style-elementor.css flips this element with `rotateY(180deg)` because the
	 * ElegantIcons magnifier points the other way. We draw our own, so the flip
	 * has to go - it was mirroring both the mark and the "Soeg" label. */
	transform: none;
}

/* The glyph goes; the mark is drawn from --lu-icon-search so its stroke weight
 * is a value we control. Sized in em, so the widget's "Size" control still
 * drives it. */
body .elementor-widget-ova_search_popup .icon_search::before {
	content: "";
	width: 1em;
	height: 1em;
	flex: none;
	background-color: currentColor;
	-webkit-mask: var(--lu-icon-search) center / contain no-repeat;
	mask: var(--lu-icon-search) center / contain no-repeat;
}

body .elementor-widget-ova_search_popup .icon_search::after {
	content: "Søg";
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-menu-size);
	font-weight: 700;
	line-height: var(--lu-type-menu-lh);
	font-style: normal;
	letter-spacing: normal;
}

body .elementor-widget-ova_search_popup .icon_search:hover {
	color: var(--lu-secondary);
}


/* --- The search popup itself --------------------------------------------
 * The overlay the mark opens. Nothing here was designed: the widget exposes
 * controls for the ICON only (colour, size, border, margin, padding, align -
 * ova_search_popup.php:38-220) and none at all for the panel, so the field and
 * the button were arriving with the browser's own form styling, theme.css's
 * `input { border: 1px solid #343434 }`, and a scrim of flat
 * `rgba(0, 0, 0, .96)` (style-elementor.css:1343) - the only pure black on a
 * site whose darkest colour is a green.
 *
 * The type was already GT Era, but only by accident: it falls out of the
 * `button, input, ... { font-family: var(--lu-font-body) }` safety net in
 * section 2, at the UA's size and theme.css's 23px leading rather than at any
 * role in the scale. So this puts it on the Menu role - the same role the mark
 * and the word "Soeg" that open the panel already carry.
 *
 * The plugin's own rules are (0,4,0) and print later than this file, so each
 * selector below clears them by one class plus the leading `body`, and stays
 * well under Elementor's per-element (0,5,3).
 *
 * The placeholder and the button label are English because they are plugin
 * strings (`esc_html_e( 'Search ...', 'ova-framework' )`) with no Danish
 * translation loaded. That is a Loco Translate job, not a CSS one - HANDOFF
 * section 7.
 */

/* The scrim, from the palette rather than from black. */
body .elementor-widget-ova_search_popup .ova_search_popup {
	background: color-mix(in srgb, var(--lu-primary) 96%, transparent);
}

/**
 * The radius goes on the FORM, not on the two controls. They sit flush against
 * each other, so rounding each one would put a seam down the middle; clipping
 * the pair gives the button geometry of section 7 across the whole control.
 */
body .elementor-widget-ova_search_popup .ova_search_popup .search-form {
	border-radius: var(--lu-radius-btn);
	overflow: hidden;
}

body .elementor-widget-ova_search_popup .ova_search_popup .search-form .search-field,
body .elementor-widget-ova_search_popup .ova_search_popup .search-form .search-submit {
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-menu-size);
	line-height: var(--lu-type-menu-lh);
	border: 0;             /* theme.css:237 gives every input a #343434 hairline */
	padding-block: 0;
}

body .elementor-widget-ova_search_popup .ova_search_popup .search-form .search-field {
	background-color: var(--lu-page-bg);
	color: var(--lu-primary);
	font-weight: 400;
	padding-inline: var(--lu-pad);
}

/* Placeholder text is a hint, not content - the same colour at less weight. */
body .elementor-widget-ova_search_popup .ova_search_popup .search-form .search-field::placeholder {
	color: color-mix(in srgb, currentColor 55%, transparent);
	opacity: 1;   /* Firefox ships a 0.54 default that would compound the mix */
}

/**
 * The submit takes the page's primary button pairing - lime ground, primary
 * label - because there is no widget control to take it from. Bold, because
 * this is the Menu role and the Menu role is GT Era Text 700.
 */
body .elementor-widget-ova_search_popup .ova_search_popup .search-form .search-submit {
	background-color: var(--lu-secondary);
	color: var(--lu-primary);
	font-weight: 700;
	padding-inline: 40px;
}


/* --- The narrow desktop: 1025 to 1200 ------------------------------------
 * THE WINDOW WHERE THE BAR USED TO BREAK, and it is a window rather than a
 * point: the drawer does not arrive until 1024, so everything between there
 * and the width the row stops fitting was broken.
 *
 * WHAT BROKE, MEASURED. The row is logo | nav | search | Kontakt, and at 1140px
 * it is exactly full - the nav ends at 913 and the search starts at 918. One
 * step narrower and the search and Kontakt wrap to a second line, which takes
 * the bar from 52px to 73px and pushes the logo down with it. Every width from
 * 1135 down to 1025 was drawn that way.
 *
 * WHAT IT TAKES TO FIT AT 1025. The row has to lose 92px, and it is made up
 * from four places rather than one, because no single one of them is enough
 * without turning into a different design:
 *
 *   the "Søg" label       35px   the mark carries the meaning on its own at
 *                                this width, and the label comes back at 1201
 *   the logo's column     ~39px  it is 19.685% wide and the logo is 153px, so
 *                                it has been holding ~40px of nothing
 *   Kontakt's margin      12px   28 -> 16, still a clear gap from the search
 *   item padding           32px  12 -> 8 a side, which is not a visible change
 *
 * Measured after: it now holds to 1025 with 23px still spare, so a longer menu
 * item or a font that loads differently does not put it straight back.
 *
 * The alternative was moving the drawer's breakpoint up to ~1150. It was
 * rejected: the 1024 breakpoint is hardcoded in ova-framework's own stylesheet
 * (style-elementor.css:240 and a few hundred lines below it), the widget has no
 * control for it, and moving it in CSS would mean re-declaring the whole
 * off-canvas drawer at a second width and keeping the two in step forever.
 */
@media (min-width: 1025px) and (max-width: 1200px) {
	/**
	 * The mark stays, the word goes. Both are painted by the same `<i>` - see
	 * the search control above - so the label is simply emptied.
	 */
	body .elementor-widget-ova_search_popup .icon_search {
		position: relative;
	}

	/**
	 * …and the emptied ::after is then reused as the hit area. The mark alone is
	 * 28px where the pair was 63, which is a small target for a pointer; this
	 * takes it back to ~48 WITHOUT taking any width in the row, because it is
	 * positioned rather than laid out. Same trick as the drawer's close cross.
	 */
	body .elementor-widget-ova_search_popup .icon_search::after {
		content: "";
		position: absolute;
		inset: -10px;
	}

	/**
	 * The logo's column is a percentage (19.685%, an Elementor setting) and the
	 * logo is a fixed 153px, so the column carries ~40px of empty space that the
	 * nav could be using. Sizing it to its contents hands that straight over.
	 *
	 * Keyed to what the column CONTAINS rather than to its element hash, so a
	 * rebuild in the editor cannot silently unhook it. (0,5,1) against
	 * Elementor's (0,4,0) - the width is a client setting, and this is the one
	 * range where it has to give way.
	 */
	body .elementor .lu-masthead .elementor-column:has(> .elementor-widget-wrap > .elementor-widget-ova_logo) {
		width: auto;
		flex: 0 0 auto;
	}

	body .elementor .lu-masthead .elementor-column:has(> .elementor-widget-wrap > .elementor-widget-ova_menu) {
		width: auto;
		flex: 1 1 auto;
	}

	/**
	 * …AND THE FREED SPACE IS SPLIT, not handed to one side.
	 *
	 * The search already carries `margin-inline-start: auto` (above), which is
	 * what opens the gap before it. On its own that collects ALL the spare room
	 * on the right and parks the nav hard against the logo - measured at 10px
	 * from the logo to the first item's text, where the design has 96.
	 *
	 * A second auto margin makes the two share it: flexbox distributes free
	 * space equally between auto margins, so the nav keeps a gap on each side
	 * and both close evenly as the window narrows, instead of one of them
	 * closing first. Measured across the range - logo to text / nav to search:
	 *
	 *     1250  96 / 93     (the design's own proportions, above this range)
	 *     1200 115 / 107
	 *     1100  65 /  57
	 *     1025  27 /  19    tight, but still a gap on both sides
	 *
	 * It also means the step at 1201 is small and in the right direction: the
	 * nav moves out from the logo rather than snapping toward it.
	 */
	body .lu-masthead .elementor-widget-ova_menu {
		margin-inline-start: auto;
	}

	/* 28 -> 16. Kontakt still reads as separate from the search mark. */
	.lu-masthead .elementor-widget-button {
		margin-inline-start: 16px;
	}

	/* 12 -> 8 a side, the least visible of the four, and the one that buys the
	 * headroom: it is what keeps a gap on both sides of the nav at 1025 rather
	 * than 11px on one of them. */
	body .elementor-widget-ova_menu .ova_nav ul.menu > li > a {
		padding-inline: 8px;
	}
}


/* --- Mobile: the drawer -------------------------------------------------- */

@media (max-width: 1024px) {
	/**
	 * `.ova_nav` is a fixed-position off-canvas drawer below 1025px, not a
	 * container. JS toggles .show / .hide on it and inline-styles a width on
	 * `.ova_closeCanvas`.
	 *
	 * 250px is a magic number in style-elementor.css:412 with no Elementor
	 * control behind it. The design's panel is 324 of 402 - 80.6% - so it is
	 * expressed as that proportion and nothing else.
	 *
	 * It used to be capped at 324px as well, which meant the panel only hit the
	 * design's proportion at exactly 402px wide and shrank away from it at every
	 * width above: 75% at 430, 42% at 768, 32% at the top of this breakpoint.
	 * A drawer that narrows as the screen widens is the wrong way round.
	 */
	body .elementor-widget-ova_menu .ova_nav.show {
		width: 80vw;
	}

	/**
	 * `canvas_bg_gray` hardcodes #343434 with white links at
	 * style-elementor.css:394-400. The design's drawer is the page background
	 * with primary links. Matched at (0,3,1)+body rather than forced.
	 */
	/**
	 * `padding-top` is measured off the frame rather than left at the plugin's
	 * value: the first item's text sits at y 59 on node 1:313, and the item
	 * carries 14px of padding above it (below), so the list starts at 45.
	 * The close mark does not take part in this - it is lifted out of the flow
	 * below so it can sit on the masthead bar's centre line.
	 */
	body .elementor-widget-ova_menu .ova_nav.canvas_bg_gray {
		background-color: var(--lu-page-bg);
		padding-top: 45px;
	}

	body .elementor-widget-ova_menu .ova_nav.canvas_bg_gray ul.menu li a,
	body .elementor-widget-ova_menu .ova_nav .ova_closeNav {
		color: var(--lu-primary);
	}

	/**
	 * The toggle gets its own line, and it needs one.
	 *
	 * style-elementor.css:394-400 paints the link and the toggle white in one
	 * rule, but the two halves of that selector are NOT the same specificity:
	 *
	 *   .ova_nav.canvas_bg_gray ul.menu li a              (0,3,3)
	 *   .ova_nav.canvas_bg_gray ul.menu li .dropdown-toggle  (0,4,2)
	 *
	 * A single answer at (0,4,1) clears the first and loses to the second, which
	 * is why the drawer's links have been primary and its arrows white. Matching
	 * the toggle's own shape puts this at (0,4,3) - past the plugin, still under
	 * Elementor's per-element (0,5,3).
	 */
	body .elementor-widget-ova_menu .ova_nav.canvas_bg_gray ul.menu li .dropdown-toggle {
		color: var(--lu-primary);
	}

	/* Drawer items are H4 24/27 with a rule under each. */
	body .elementor-widget-ova_menu .ova_nav ul.menu > li > a {
		font-family: var(--lu-font-display);
		font-size: var(--lu-type-h4-size);
		font-weight: 500;
		line-height: var(--lu-type-h4-lh);
		padding: 14px 0;
	}

	/**
	 * `width: auto` and `align-items: stretch` are both load-bearing.
	 *
	 * style-elementor.css:303 gives every `li` `width: 100%` at this breakpoint,
	 * and Elementor emits `align-items: flex-end` on the menu for the desktop
	 * row layout. In a column flex container that aligns the cross axis to the
	 * RIGHT - so a 100%-wide item plus 20px of margin each side is 40px too wide
	 * and overflows off the LEFT edge, clipping the first two characters of
	 * every label; with `width: auto` it instead right-aligns every item and
	 * shrinks the rules to the text.
	 *
	 * The !important is the third in this file and, like the other two, names
	 * what it beats: Elementor's per-document rule
	 *   .elementor-5460 .elementor-element.elementor-element-c4c6626
	 *   .ova_nav ul.menu { align-items: flex-end }
	 * at (0,5,2), printed inside <body>. That value exists only for the desktop
	 * row and is simply wrong in a vertical drawer - style-elementor.css:418
	 * already overrides `flex-direction` on the same element for the same
	 * reason, so this follows an established precedent rather than setting one.
	 * Scoped to <=1024px, where the drawer is the only layout.
	 */
	body .elementor-widget-ova_menu .ova_nav ul.menu {
		align-items: stretch !important;
		text-align: start;
	}

	/**
	 * The rule belongs to the ITEM'S ROW, not to the item. On the `li` it sits
	 * below the whole element - so opening an accordion pushed it beneath the
	 * submenu and left the open item with no rule of its own. On the link it
	 * stays under the label it separates, open or closed.
	 *
	 * `> a` is load bearing: it reaches top-level links and no others, which is
	 * the whole point - the widget's own border setting could not make that
	 * distinction and is now cleared (HANDOFF section 6).
	 *
	 * The margin insets the rules by --lu-pad each side, which is also where
	 * the close mark ends, so the two share one right line.
	 */
	body .elementor-widget-ova_menu .ova_nav ul.menu > li {
		margin-inline: var(--lu-pad);
		width: auto;
	}

	body .elementor-widget-ova_menu .ova_nav ul.menu > li > a {
		border-bottom: 1px solid var(--lu-primary);
	}

	body .elementor-widget-ova_menu .ova_nav ul.menu > li > a:after {
		content: none;   /* the desktop underline pseudo has no place here */
	}

	/* --- The submenu arrow ---------------------------------------------------
	 * The drawer marks a submenu with a DOWN ARROW, not the chevron the desktop
	 * bar uses - node 1:355, at the H4 size the menu items are set in, on the
	 * same right line as the rules and the cross.
	 *
	 * The walker already emits `button.dropdown-toggle > i.arrow_carrot-down`,
	 * so this only swaps the mask the base rule in section 3 put there and
	 * fixes the geometry the plugin left behind.
	 *
	 * The plugin's own `right: 10px` (style-elementor.css:319) matches at the
	 * same specificity and prints later, so this needs one more class and one
	 * more element to clear it - (0,4,4) against its (0,3,3), still under
	 * Elementor's per-element (0,5,3).
	 */
	body .elementor-widget-ova_menu .ova_nav ul.menu li button.dropdown-toggle {
		position: absolute;
		/* Aligned to the item's FIRST line, not to its box: "Vaerktoejskasse
		 * for frivillige" wraps to two lines, and an arrow centred on the box
		 * would sit between them. 14px is the item's own padding-top. */
		top: 14px;
		right: 0;
		margin: 0;
		padding: 0;
		width: var(--lu-type-h4-size);
		height: var(--lu-type-h4-lh);
		font-size: var(--lu-type-h4-size);
		display: flex;
		align-items: center;
		justify-content: center;
	}

	body .elementor-widget-ova_menu .ova_nav button.dropdown-toggle i.arrow_carrot-down::before {
		-webkit-mask-image: var(--lu-icon-arrow-down);
		mask-image: var(--lu-icon-arrow-down);
	}

	/**
	 * ...and it turns over when the item is open.
	 *
	 * There is no state class to hang this on. The plugin's accordion is one
	 * line of jQuery - `$(this).parent().find('.dropdown-menu').first()
	 * .toggle('fast')` (script-elementor.js:24-26) - which writes an inline
	 * `display` on the submenu and adds no class to anything. (The plugin's own
	 * stylesheet expects an `.active_sub` class at style-elementor.css:327 that
	 * nothing in this code path ever sets.)
	 *
	 * So the open state is read off the inline style jQuery leaves behind. That
	 * is exact rather than approximate: `.toggle()` on a `ul` only ever writes
	 * `display: block` or `display: none`, and it writes `block` at the START of
	 * the opening animation, so the arrow turns with the panel rather than after
	 * it. Verified against the rendered attribute, not assumed.
	 */
	body .elementor-widget-ova_menu .ova_nav button.dropdown-toggle i.arrow_carrot-down {
		transition: rotate 0.2s ease;
	}

	body .elementor-widget-ova_menu .ova_nav li:has(> ul.dropdown-menu[style*="display: block"])
		> button.dropdown-toggle i.arrow_carrot-down {
		rotate: 180deg;
	}

	/* The rotation is the state, so reduced motion keeps the end position and
	 * drops only the travel - the answer DESIGN.md asks for. */
	@media (prefers-reduced-motion: reduce) {
		body .elementor-widget-ova_menu .ova_nav button.dropdown-toggle i.arrow_carrot-down {
			transition: none;
		}
	}

	/* --- The accordion ------------------------------------------------------
	 * Open, a submenu is a plain indented list on the page background. The
	 * desktop submenu is a floating panel and section 3 gives it a rounded
	 * bottom for that; inside the drawer it is neither floating nor a panel.
	 *
	 * The RULES between its items are not drawn here at all - they came from
	 * the nav widget's own "Show Border" setting in Elementor, which paints
	 * `.ova_nav li a` and so could not tell a top-level item from a submenu
	 * one. Cleared at source; see HANDOFF section 6. The rules you see now are
	 * only the `ul.menu > li` border below, which reaches top-level items only.
	 */
	body .elementor-widget-ova_menu .ova_nav ul.menu .dropdown-menu {
		border-radius: 0;
	}

	/**
	 * The hamburger sits on the page's right line like everything else. Its
	 * 15px margin is cleared in Elementor; this makes the plugin's wrapper fill
	 * the widget so the button can actually reach the edge - `.ova_wrap_nav` is
	 * narrower than its parent, which left the icon 9px short.
	 *
	 * `align-items: center` is what puts the bars on the bar's centre line, and
	 * is the other half of the cross's alignment below.
	 */
	body .elementor-widget-ova_menu .ova_wrap_nav {
		display: flex;
		justify-content: flex-end;
		align-items: center;
	}

	/* --- The two marks, drawn ------------------------------------------------
	 * The plugin renders both from Font Awesome - `<i class="fas fa-bars">` and
	 * `<i class="fas fa-times">`. Both are redrawn from --lu-icon-* masks, for
	 * the reason in tokens.css and with Figma's own geometry (nodes 1:334 and
	 * 1:350). `currentColor` keeps the colour rules above working unchanged.
	 */
	body .elementor-widget-ova_menu .ova_openNav,
	body .elementor-widget-ova_menu .ova_nav .ova_closeNav {
		background: none;
		border: 0;
		padding: 0;
		line-height: 0;   /* an inline-block mark otherwise carries a descender gap */
	}

	body .elementor-widget-ova_menu .ova_openNav i,
	body .elementor-widget-ova_menu .ova_nav .ova_closeNav i {
		display: block;
		width: 100%;
		height: 100%;
	}

	body .elementor-widget-ova_menu .ova_openNav i::before,
	body .elementor-widget-ova_menu .ova_nav .ova_closeNav i::before {
		content: "";
		display: block;
		width: 100%;
		height: 100%;
		background-color: currentColor;
		-webkit-mask: var(--lu-drawer-mark) center / contain no-repeat;
		mask: var(--lu-drawer-mark) center / contain no-repeat;
	}

	/* 24 x 14 - three bars, 2px, 6px apart. */
	body .elementor-widget-ova_menu .ova_openNav {
		--lu-drawer-mark: var(--lu-icon-menu);
		display: block;
		width: 24px;
		height: 14px;
	}

	/**
	 * The cross answers the user's question directly: it is lifted out of the
	 * drawer's flow and pinned so that its CENTRE lands on the masthead bar's
	 * centre line - the line the hamburger is centred on by the rule above. So
	 * opening the drawer swaps one mark for the other and neither moves.
	 *
	 * Horizontally it ends on --lu-pad, which is where the rules under the menu
	 * items end too (they are inset by the same token), so the cross and the
	 * rules share one right line. That is the frame: on node 1:313 the cross's
	 * right edge and every rule's right edge are both at x 306.
	 *
	 * The ::after is a touch target only - it enlarges the hit area to ~39px
	 * without moving the 19px mark or taking part in layout.
	 */
	body .elementor-widget-ova_menu .ova_nav .ova_closeNav {
		--lu-drawer-mark: var(--lu-icon-close);
		position: absolute;
		top: calc(var(--lu-header-bar-h) / 2);
		translate: 0 -50%;
		right: var(--lu-pad);
		display: block;
		width: 19px;
		height: 19px;
	}

	body .elementor-widget-ova_menu .ova_nav .ova_closeNav::after {
		content: "";
		position: absolute;
		inset: -10px;
	}

	/**
	 * The scrim. style-elementor.css:163 gives it rgba(0,0,0,.4); the design
	 * shows the page tinted with its own background at 75%.
	 */
	body .ova_closeCanvas {
		background: color-mix(in srgb, var(--lu-page-bg) 75%, transparent);
	}

	/**
	 * Mobile stacks the two header bars the other way up: logo first, then the
	 * pink bar.
	 *
	 * This was `order` on a flex `.elementor-5460` until the nav was made
	 * sticky, and the two cannot coexist: `order` needs that wrapper to be a
	 * flex container, and the sticky nav needs it to have no box at all
	 * (section 3, point 2). Taking the pink bar out of flow does both jobs at
	 * once - it draws the bar below the nav AND leaves the nav alone in the
	 * flow, so the sticky box is the nav's 52px and nothing else. The bar then
	 * scrolls away with the page and passes behind the pinned nav, which is
	 * opaque and carries z-index 99.
	 *
	 * Still keyed to the classes rather than to an element hash, so a widget
	 * rebuild in the editor cannot break it.
	 *
	 * The offset is the nav's own height token - the one that sets that height
	 * in section 3 - so the two cannot drift apart. `.ova-wrapp` is the theme's
	 * page wrapper (header/footer.php) and is made relative only to be the
	 * anchor: it spans the document, so the bar stays at a fixed place on the
	 * PAGE rather than travelling with the sticky nav.
	 */
	.ova-wrapp {
		position: relative;
	}

	.lu-utility-bar {
		position: absolute;
		inset-inline: 0;
		top: var(--lu-header-bar-h);
	}

	/**
	 * The bar is out of flow now, so the space it used to occupy is put back
	 * here. A margin and not padding: padding would grow the sticky box, which
	 * would pin a 41px transparent strip over the page and swallow clicks
	 * through it.
	 */
	body .lu-masthead {
		margin-bottom: var(--lu-utility-bar-h);
	}

	/**
	 * The two utility links split to the edges rather than sitting together on
	 * the right, which is how the mobile frame draws them. Elementor renders
	 * each as its own widget inside the column's widget-wrap, so the split goes
	 * on that wrap - and the 30px right margin the first one carries for the
	 * desktop layout has to come off, or the pair is not symmetrical.
	 */
	/**
	 * The split itself is an Elementor column control (`align_mobile:
	 * space-between` on 4f60e0b), so it stays editable and is not fought here.
	 * Only the 30px gap between the two links has to go - it is there for the
	 * desktop pairing and makes them asymmetrical once they are at the edges.
	 */
	.lu-utility-bar .elementor-widget-button {
		margin: 0;
	}
}


/* ==========================================================================
   4. Site chrome - the global footer
   ==========================================================================
   Footer document 3677 "Footer 6 test", live as `global_footer`.

   Colour is all bound to Kit globals now (primary ground, 5b04f39 foreground),
   and the column headings are real h4s, so the Kit supplies 24/27. What is left
   is the arrow the design puts in front of each footer link.
   ========================================================================== */

.elementor-3677 .ova_menu_page .menu li a {
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-body-size);
	line-height: var(--lu-type-body-lh);
}

/**
 * The "Bliv medlem / Log ind" list. Clearing the widget's own bg_color_box
 * control did not empty it: the Ovatheme Customizer paints .ova_list_link with
 * theme_mods primary_color, which is now the lime secondary. The design has no
 * box at all - the links sit straight on the footer ground.
 */
.elementor-3677 .ova_list_link {
	background: none;
	padding: 0;
	max-width: none;
}

/**
 * On the frame these two read as headings rather than list items: H4 24/27, no
 * chevron. The widget renders `a > text + span.icon + span.icon-hover`, so the
 * two icon spans are hidden rather than the icon settings blanked - the widget
 * emits the markup either way.
 */
.lu-footer-actions .ova_list_link ul.content {
	margin: 0;
	padding: 0;
	list-style: none;
}

.lu-footer-actions .ova_list_link .item {
	padding-inline: 0;   /* the widget indents each row by 20px */
}

/* style-elementor.css rules every row but the last with
 * `.ova_list_link ul.content li:not(:last-child) a` (0,3,3) - the `:not()`
 * counts, so this has to match its shape to clear it. The design has no rules
 * here at all. */
/**
 * The widget paints its hover ground and shadow on the LIST ITEM, and carries a
 * `box-shadow` class on its own wrapper - not on the link. Styling the anchor
 * alone left both in place.
 */
.lu-footer-actions .ova_list_link,
.lu-footer-actions .ova_list_link.box-shadow,
.lu-footer-actions .ova_list_link ul.content li.item,
.lu-footer-actions .ova_list_link ul.content li.item:hover {
	background: none;
	box-shadow: none;
	border: 0;
}

/* The hover rules are 1px pseudo-elements on the list item, not borders - which
 * is why zeroing every border still left two white bars around the link. */
.lu-footer-actions .ova_list_link ul.content li.item::before,
.lu-footer-actions .ova_list_link ul.content li.item::after {
	content: none;
}

.lu-footer-actions .ova_list_link ul.content li.item a,
.lu-footer-actions .ova_list_link ul.content li.item a:hover {
	display: block;
	padding-block: 0;
	border: 0;
	/* The widget treats these as buttons and paints a ground and a border on
	 * hover. The design has neither - only the text changes colour. */
	background: none;
	box-shadow: none;
	font-family: var(--lu-font-display);
	font-size: var(--lu-type-h4-size);
	font-weight: 500;
	line-height: var(--lu-type-h4-lh);
	color: var(--lu-surface-green);
}

.lu-footer-actions .ova_list_link .item .icon,
.lu-footer-actions .ova_list_link .item .icon-hover {
	display: none;
}

/**
 * "Foelg med paa:" and the three networks, which the design sets as text in the
 * first column rather than icons in the fourth.
 *
 * The block is pushed to the BOTTOM of its column with an auto margin so the
 * last social line sits on the same baseline as the last line of "Hvem er vi?".
 * The columns are already equal height, and that paragraph is the tallest
 * content, so aligning to the column's bottom aligns the two - without pinning
 * either one to a pixel value that a text edit would break.
 */
.elementor-3677 .elementor-element-45f5d13 > .elementor-widget-wrap {
	display: flex;
	flex-direction: column;
	align-content: stretch;
}

.lu-footer-follow {
	margin-block-start: auto;
}

/**
 * ...and two phantom margins were stopping that from working.
 *
 * `margin-block-start: auto` aligns the follow block to the BOTTOM OF THE
 * COLUMN, and the columns are equal height - so the block lands wherever the
 * tallest column's box ends. It was ending 16px below anything you can see:
 *
 *   theme.css:34      p { margin-bottom: 2rem }   32px under the last line of
 *                     "Hvem er vi?", collapsing out through the widget
 *   UA default        ul { margin-bottom: 1rem }  16px under the last link of
 *                     "Om LandboUngdom", likewise
 *
 * The row was therefore 16px taller than its own content and "Youtube" sat 34px
 * below the last line of every other column - which reads as a mistake even
 * though every box was aligned correctly.
 *
 * Removing the two trailing margins is the fix rather than hand-tuning a gap:
 * the row now measures what it draws, `auto` lands the block on the real
 * bottom, and it stays landed when any of this copy is edited. The spacing
 * inside column one - currently 33px between "Log ind" and "Foelg med paa:" -
 * is an OUTCOME of that, not a number anybody has to keep in step.
 *
 * Scoped to the footer document. The 2rem paragraph margin is load bearing for
 * body copy elsewhere; HANDOFF section 9 records the general case.
 */
.elementor-3677 .elementor-widget-text-editor p:last-child {
	margin-block-end: 0;
}

.elementor-3677 .ova_menu_page .menu {
	margin-block-end: 0;
}

/**
 * Same idea one level down. Each row of that list carries 5px of padding above
 * and below its link - correct BETWEEN rows, a tail below the last one, and
 * enough on its own to make this the tallest column and so to set where the
 * follow block lands. With it gone all three columns bottom out on the same
 * line: the last line of "Hvem er vi?", "Jobstafet.dk" and "Youtube" now sit
 * within a pixel of each other rather than 34px apart. tools/verify.js asserts
 * it, measuring the last TEXT LINE rather than the widget box - the columns run
 * at different leading, so their boxes cannot align even when their baselines do.
 */
.elementor-3677 .ova_menu_page .menu li:last-child a {
	padding-block-end: 0;
}


/**
 * Blank lines in the address block.
 *
 * The block under the logo is an icon-list widget, and the divider between
 * address / contact / CVR is an icon-list item with its text left empty. It
 * renders - `<li class="elementor-icon-list-item"><span
 * class="elementor-icon-list-text"></span></li>` is in the markup - but it
 * measures 0px tall, so on the front end the three groups run together.
 *
 * Two things make it collapse, and only the second matters: an empty element
 * has no line box of its own, and Elementor lays the row out as a FLEX
 * container, where an empty child is a zero-height flex item. Giving the span
 * one non-breaking space restores a real line box, so the row takes exactly one
 * line of the list's own leading - whatever that leading later becomes.
 *
 * Content rather than a height, because a height would have to be kept in step
 * with the type scale by hand. And on the pseudo-element rather than in
 * Elementor, because a space typed into the field is trimmed back out on save.
 *
 * (A cleaner structure would be three separate lists, or a text block - a blank
 * row is not really a list item. This makes the editor's own approach work,
 * and keeps working for any blank row added later.)
 */
.elementor-3677 .elementor-icon-list-text:empty::before {
	content: "\00a0";
}

.lu-footer-follow p {
	margin-block: 0;
}

.lu-footer-follow p + p {
	margin-block-start: var(--lu-type-body-lh);
}

.elementor-3677 .ova_list_link a,
.lu-footer-follow a {
	color: var(--lu-surface-green);
}

.elementor-3677 .ova_list_link a:hover,
.lu-footer-actions .ova_list_link ul.content li.item a:hover,
.lu-footer-follow a:hover {
	color: var(--lu-secondary);
}

/**
 * Column spacing.
 *
 * On the frame the columns are 224 / 447 / 334 / 315 wide but their CONTENT is
 * only ~315 each, so there is a real gap between one column's text and the
 * next. Padding rather than a grid gap, because the widths are percentages that
 * already match the frame and a gap would shift every column off it.
 */
.elementor-3677 .elementor-element-1114de4 > .elementor-container > .elementor-column:not(:last-child) {
	padding-inline-end: var(--lu-footer-gap);
}

@media (max-width: 767px) {
	/* Stacked, so the gap becomes vertical. */
	.elementor-3677 .elementor-element-1114de4 > .elementor-container > .elementor-column:not(:last-child) {
		padding-inline-end: 0;
		margin-block-end: var(--lu-footer-gap);
	}
}

/**
 * The arrow is drawn by the widget's own `show-arrow` class as a pseudo-element
 * on the link - there is no markup to reorder - and it renders as a chevron.
 * The design uses a plain right arrow, set in the body face so it does not
 * depend on an icon font being present.
 */
.elementor-3677 .ova_menu_page.show-arrow .menu li a {
	display: flex;
	align-items: baseline;
	gap: 8px;
}

.elementor-3677 .ova_menu_page.show-arrow .menu li a::before {
	content: "\2192";   /* -> */
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-body-size);
	line-height: var(--lu-type-body-lh);
	color: inherit;
	position: static;
	transform: none;
	margin: 0;
	width: auto;
	order: -1;
}


/* --- The Annoncer strip -------------------------------------------------
 * Sections 5c920a0 (the label) and a40b040 (an Elementor carousel of adverts,
 * behind a `global` widget) sit at the top of the footer document, so they
 * render on every page - which is why they appear on both Figma frames.
 *
 * The label's content is `<p><em>Annoncer</em></p>`; the design sets it as H4
 * 24/27, upright. Styled rather than rewritten so the client's own text and its
 * Elementor colour control both keep working.
 */
.lu-annoncer p,
.lu-annoncer em {
	font-family: var(--lu-font-display);
	font-size: var(--lu-type-h4-size);
	font-weight: 500;
	line-height: var(--lu-type-h4-lh);
	font-style: normal;
	margin: 0;
}

.lu-annoncer-row > .elementor-container {
	max-width: var(--lu-container);
}

/* Elementor's default column gap pads the column 10px, which set the carousel
 * in from the "Annoncer" label and the page's content line on both sides. */
.lu-annoncer-row > .elementor-container > .elementor-column > .elementor-widget-wrap {
	padding-inline: 0;
}

.lu-annoncer-row .elementor-widget-image img,
.lu-annoncer-row .swiper-slide img {
	border-radius: var(--lu-radius-card);
}


/* ==========================================================================
   5. Widget overrides
   ==========================================================================
   Elementor and Ovatheme widget internals where a measured conflict remains.
   Everything here is font-family only. Source: tools/font-audit-report.json.
   ========================================================================== */

/* --- Ovatheme counter widget -------------------------------------------
 * The Customizer's long Cabin selector list includes
 *   .ova_egovt_counter.elementor-widget-counter .elementor-counter-title
 *   .ova_egovt_counter.elementor-widget-counter .elementor-counter-number-wrapper
 * at (0,3,0). Matched exactly; we print later, so we win without !important.
 *
 * Note this class is on 12 pages, 8 of them demo leftovers - which is why it
 * carries family only, and why lu-stat in design-system.css does the design
 * work on the front page.
 */
.ova_egovt_counter.elementor-widget-counter .elementor-counter-title,
.ova_egovt_counter.elementor-widget-counter .elementor-counter-number-wrapper {
	font-family: var(--lu-font-display);
}

/* --- Ovatheme accordion and tabs ----------------------------------------
 * Same rule list, the Nunito Sans half. Specificity matched at (0,4,0)/(0,3,0).
 */
.according-egov .elementor-accordion .elementor-accordion-item .elementor-tab-content,
.egovt-tab .elementor-widget-tabs .elementor-tab-content {
	font-family: var(--lu-font-body);
}

/* --- Draw Attention (the Danish map on Lokalforeninger and Om) -------------
 * Approved on the Lokalforeninger / Ud i verden proposal, 2026-09-17.
 *
 * The plugin's own settings carry the colours (Draw Attention → the map):
 * Image background Sidebaggrund #FDF5EA, More Info background Lysegrøn fade
 * #ECF3DA, title and text colour Primær, the image's title "Tryk på kortet" and
 * Default More Info the sentence under it. What is left for the theme:
 */

/* The map is the designers' pin map (LU_DanmarksKort_04, 2026-09-30): a PNG,
 * 1660 x 1822, beige land and orange pins on a TRANSPARENT ground, so it sits
 * straight on the cream the plugin paints behind it. The pins are part of the
 * image; each association's clickable area is its whole piece of land (see
 * elementor-audit/edit-scripts/map-pins-migrate.php). The 2022 map was a JPEG
 * with white baked in and the map pane was multiplied onto the cream - which
 * also multiplied everything else in the pane, the hover label included. */

/* The hover label: white, not the panel's Lysegrøn at Leaflet's 90%. The
 * plugin writes the colour under the map's id and Leaflet the opacity inline. */
.hotspots-container .leaflet-tooltip {
	background: var(--lu-white) !important;
	border-color: var(--lu-white) !important;
	opacity: 1 !important;
}

.hotspots-container .leaflet-tooltip-top::before {
	border-top-color: var(--lu-white) !important;
}

.hotspots-container .leaflet-tooltip-bottom::before {
	border-bottom-color: var(--lu-white) !important;
}

.hotspots-container .leaflet-tooltip-left::before {
	border-left-color: var(--lu-white) !important;
}

.hotspots-container .leaflet-tooltip-right::before {
	border-right-color: var(--lu-white) !important;
}

/* One label at a time. Leaflet fades a closing label out and removes it 200ms
 * later - with the opacity held at 1 above, a quick move across the map left
 * a trail of them. The newest is always the pane's last child. */
.hotspots-container .leaflet-tooltip-pane .leaflet-tooltip:not(:last-child) {
	display: none !important;
}

/* No hover label where there is no hover: on a touch screen a tap left it
 * standing (and running off the edge), and the panel already names the
 * association. */
@media (hover: none) {
	.hotspots-container .leaflet-tooltip {
		display: none !important;
	}
}

/* The panel beside the map (under it on a phone): a Lysegrøn box with the
 * band's diagonal corners, sized to its content. */
.hotspots-container .hotspots-placeholder {
	align-self: flex-start;
	height: auto !important;
	padding: 40px 32px;
	border-radius: var(--lu-radius-band);
}

.hotspots-container .hotspot-title {
	margin: 0 0 20px;
	text-align: start;
	font-family: var(--lu-font-display) !important;
	font-size: var(--lu-type-h4-size) !important;
	font-weight: 500;
	line-height: var(--lu-type-h4-lh) !important;
	hyphens: auto;
	overflow-wrap: break-word;
	word-break: normal;
}

/* Each association's details were pasted with inline Montserrat, 15px, #111
 * and a lime link colour. Only the pasted formatting is neutralised: the
 * client's text and list stay. */
.hotspots-container .hotspot-content,
.hotspots-container .hotspot-content * {
	font-family: var(--lu-font-body) !important;
	font-size: var(--lu-type-body-size) !important;
	line-height: var(--lu-type-body-lh) !important;
	letter-spacing: 0 !important;
	color: inherit !important;
}

.hotspots-container .hotspot-content ul {
	margin: 0;
	padding: 0;
	list-style: none;
}

.hotspots-container .hotspot-content li {
	text-align: start !important;
}

/* An association after a click, in this order: its name; "Del af Region …" in
 * italic right under it; the contact lines; after a blank line the Facebook
 * link. The pasted list runs Lokalformand, number, email, Facebook, Region -
 * the region is the last item in all 47 (checked 2026-09-17). The content box
 * and the list are flattened (display: contents) so the name and every line
 * are items of one column and can be reordered. */
/* Only the association on show: the plugin marks it `visible` and hides the
 * previous one by removing that class (not by re-adding da-hidden), so a
 * broader selector kept every earlier one on screen. */
.hotspots-container .hotspot-info.visible {
	display: flex;
	flex-direction: column;
}

.hotspots-container .hotspot-info .hotspot-content,
.hotspots-container .hotspot-info .hotspot-content ul {
	display: contents;
}

.hotspots-container .hotspot-info .hotspot-title {
	order: 0;
	margin-block-end: 4px;
}

.hotspots-container .hotspot-info .hotspot-content li {
	order: 2;
}

.hotspots-container .hotspot-info .hotspot-content li:last-child {
	order: 1;
	margin-block-end: var(--lu-type-body-lh);
	font-style: italic !important;
}

.hotspots-container .hotspot-info .hotspot-content li:last-child::before {
	content: "Del af ";
}

.hotspots-container .hotspot-info .hotspot-content li:has(a[href*="facebook.com"]) {
	order: 3;
	margin-block-start: var(--lu-type-body-lh);
}

.hotspots-container .hotspot-content a {
	text-decoration: underline !important;
	text-underline-offset: 0.18em;
}

/* Underlined at rest, and it stays underlined on hover (D1, wave 3). */
.hotspots-container .hotspot-content a:hover {
	color: var(--lu-secondary) !important;
}

/* The plugin puts the panel beside the map from a 600px WINDOW up. On Om the
 * map sits in half a row (650px), which left the panel 163px wide. So the
 * layout follows the map's own width instead: under 900px the panel goes under
 * the map, as the plugin does on a phone. */
.elementor-widget-shortcode:has(.hotspots-container) {
	container-type: inline-size;
}

/* Beside the map, the panel travels down with it: pinned under the nav bar
 * while the map scrolls past, so "Tryk på kortet" and the association clicked
 * stay in view. It stops at the map's foot. */
@container (min-width: 900px) {
	.hotspots-container.layout-left .hotspots-placeholder {
		position: sticky;
		top: calc(var(--lu-header-bar-h) + var(--lu-pad));
	}
}

@container (max-width: 899px) {
	.hotspots-container.layout-left .hotspots-interaction {
		flex-direction: column-reverse;
	}

	.hotspots-container.layout-left .hotspots-placeholder,
	.hotspots-container.layout-left .hotspots-image-container {
		flex: 0 0 auto;
		width: 100%;
		max-width: 100%;
	}

	.hotspots-container .hotspots-placeholder {
		margin: 20px 0 0;
	}
}

@media (max-width: 767px) {
	.hotspots-container .hotspots-placeholder {
		margin: 20px 0 0;
		padding: 24px;
		border-radius: 0 24px 0 24px;
	}
}

/* --- Slider Revolution ---------------------------------------------------
 * !important, because these are inline styles.
 *
 * Slider Revolution 7 writes font-family straight onto each layer element from
 * JavaScript after load - `style="...; font-family: Arial; font-size: 66px;"`.
 * It is not in the HTML source and not in document.styleSheets, so no selector,
 * at any specificity, can reach it. An inline declaration is only beaten by
 * !important.
 *
 * Family only - the inline font-size and font-weight on these layers are left
 * completely alone, which is what keeps each slider's type scale intact.
 *
 * The front page no longer uses Slider Revolution, but 25 other pages do, each
 * with its own module. The durable fix is editing those sliders' own settings.
 */
sr7-module .sr7-layer,
sr7-module sr7-txt {
	font-family: var(--lu-font-display) !important;
}


/* ==========================================================================
   6. Page themes
   ==========================================================================
   One page breaks the site palette deliberately. /for-frivillige/ - the
   volunteers' toolbox - is drawn on Lyseblaa with a Moerkeroed footer, where
   every other page is Sidebaggrund over Primaer. Figma frames 1:105 (desktop)
   and 1:241 (mobile).

   Elementor owns everything INSIDE the page document, and the cards there take
   their colour from lu-fill-pink / lu-fill-red typed into the editor, exactly
   like anywhere else. This section is only for the two grounds Elementor cannot
   reach from page 8802: <body> itself, and the global footer document, which
   every page shares.

   The hook is `lu-page-frivillige`, added by a body_class filter in
   functions.php and keyed on the page's SLUG rather than its post id - see that
   function for why.

   No hex here, as everywhere: both colours are Kit aliases.
   ========================================================================== */

/* --- The page ground ----------------------------------------------------
 * A DIRECT OVERRIDE, AND NOT A TOKEN RE-POINT, and the difference matters.
 *
 * The obvious move is `--lu-page-bg: var(--lu-surface-blue)` on this body -
 * one line, and every ground follows. That is exactly why it is wrong:
 * --lu-page-bg has more than one consumer. The masthead paints itself with it
 * (section 3), the nav dropdowns take it as their panel ground, and
 * --lu-nav-glass is mixed from it in tokens.css. Re-pointing it would turn the
 * whole header blue, and the frame keeps the header cream on this page like
 * every other. A token with several consumers is not a page-theme switch.
 *
 * `!important` is load-bearing for the same reason it is on the rule this
 * overrides (section 2): ova-framework's mobile drawer writes
 * `background-color: transparent` INLINE on <body> when it closes, and an
 * inline style is beaten by nothing else. (0,1,1) against that rule's (0,0,1)
 * settles which of the two importants wins.
 */
body.lu-page-frivillige {
	background-color: var(--lu-surface-blue) !important;
}

/* --- The footer ground --------------------------------------------------
 * Here a re-point IS the right tool, and it is a re-point of the KIT variable
 * rather than of an --lu-* alias.
 *
 * Every ground in footer document 3677 is bound to `globals/colors?id=primary`
 * in the editor - the three filled sections, and the ova_menu_page widget's own
 * background, which would otherwise sit on the footer as a green block. Elementor
 * renders each of those as `var(--e-global-color-primary)`. Re-declaring that
 * variable on the sections flips all of them at once: no element ids in the
 * selector, nothing to keep in step with the editor, and no specificity contest
 * at all, because a custom property declaration does not compete with the rules
 * that read it - it just changes what they resolve to.
 *
 * The Annoncer strip is not part of the footer's dark block - it is two sections
 * at the TOP of the same document, sitting on the page ground, which is why it
 * appears above the footer on every page. Its label (lu-annoncer-head) is bound
 * to `primary` too, and is INCLUDED: on a Frivillige page it is Mørkerød like
 * the rest of the page's text (review, 2026-09-15 - the Figma frame's green
 * label is overruled). The advert carousel's section (lu-annoncer-row) is the
 * one exclusion; nothing in it is text.
 *
 * Scoped to `> .elementor-section` rather than to `.elementor-3677` itself for
 * the same reason: a declaration on the document would inherit into the
 * carousel whatever the selector said about it.
 */
body.lu-page-frivillige .elementor-3677 > .elementor-section:not(.lu-annoncer-row) {
	--e-global-color-primary: var(--lu-deep-red);
}

/* --- Hover on the blue ground -------------------------------------------
 * Every link on the site turns Sekundær on hover (DESIGN.md "Colour") - except
 * here: Sekundær all but disappears on Lyseblå. A link in the page's own content
 * keeps its colour and fades to 70% instead, without an underline.
 *
 * "The page's own content" is the toolbox template (.lu-toolbox - its back link,
 * the dep post's groups and notes) and the Frivillige page's document
 * ([data-elementor-type="wp-page"]). Not the header and footer: both are
 * `wp-post` documents, so the type attribute is what keeps them out. Left with
 * their own hovers: buttons, the area labels (they fill Mørkerød) and the cards
 * (they sit on their own pink or dark red ground).
 *
 * THE BODY CLASS IS WRITTEN TWICE, ON PURPOSE. A :not() counts as its most
 * specific argument (`.lu-labels a`, 0,1,1), which puts the selector at (0,4,3)
 * - one element short of the toolbox group links' own hover (0,4,4, section 12),
 * so they kept turning Sekundær under the fade. Doubled it is (0,5,3), above
 * that, lu-prose's (0,3,3) and the Kit's (0,2,1), with no id or !important.
 */
body.lu-page-frivillige.lu-page-frivillige :is(.lu-toolbox, [data-elementor-type="wp-page"]) a:not(.elementor-button, .lu-labels a, .lu-card a) {
	transition: opacity 0.2s ease;
}

/* The Lyseblå exception is about COLOUR only: the link keeps its colour and
 * fades. The underline is left alone here too (D1, wave 3). */
body.lu-page-frivillige.lu-page-frivillige :is(.lu-toolbox, [data-elementor-type="wp-page"]) a:not(.elementor-button, .lu-labels a, .lu-card a):hover {
	color: inherit;
	opacity: 0.7;
}

@media (prefers-reduced-motion: reduce) {
	body.lu-page-frivillige.lu-page-frivillige :is(.lu-toolbox, [data-elementor-type="wp-page"]) a { transition: none; }
}


/* ==========================================================================
   7. The news post template
   ==========================================================================
   single.php in this theme, for the 236 news posts. DESIGN.md "Articles";
   approved on the article proposal on 2026-09-15.

       desktop                                phone
       +------------------------------+       +-----------+
       | photo (container width)      |       | photo     | edge to edge
       +--------------------+---------+       | article   |
       | meta, title, body  | sidebar |       | Seneste   |
       +--------------------+---------+       | nyheder   |
       | Seneste nyheder              |       | sidebar   |
       +------------------------------+       +-----------+

   ONE grid holds all four, which is the only way the sidebar can sit beside the
   article on desktop and below the news cards on a phone (decision D3). The
   parent theme's sidebar is a separate column and could do neither.
   ========================================================================== */

/* The template's wrapper is .wrap_site, so it keeps the page's line (2b); only
 * its own top spacing goes, because the photo starts directly under the nav. */
.wrap_site.lu-post-wrap {
	padding-block: 0;
}

.lu-post {
	/* theme.css makes .wrap_site a wrapping flex row, so the grid is a flex item
	 * and would shrink to its content without being told to fill the row. */
	flex: 1 1 100%;
	min-inline-size: 0;
	display: grid;
	grid-template-columns: minmax(0, 1fr) var(--lu-post-side-w);
	grid-template-areas:
		"photo photo"
		"main  side"
		"more  more";
	column-gap: var(--lu-post-side-gap);
	align-items: start;
}

/**
 * THE PHOTO: header + photo take --lu-post-photo-fill per cent of the window,
 * never taller than 16:9 (decision D2).
 *
 * The ratio gives the height from the container width, and `max-height` caps it
 * at the share of the window - so a tall window shows the full 16:9 and a
 * laptop gets a wider crop with the title still on the first screen. Section 11
 * of design-system.css has the reasoning for subtracting the chrome and for the
 * doubled declaration.
 */
.lu-post__photo {
	grid-area: photo;
	/**
	 * The width has to be stated. A grid item WITH AN ASPECT RATIO does not
	 * stretch (DESIGN.md, "A layout mode changes what your properties mean"), so
	 * once `max-height` capped the height the ratio worked backwards from it and
	 * the photo came out 1168px wide in a 1320px row. With the width definite,
	 * the cap shortens the photo and the width stays.
	 */
	inline-size: 100%;
	margin: 0 0 var(--lu-post-photo-gap);
	aspect-ratio: 16 / 9;
	max-height: max(320px, calc(var(--lu-post-photo-fill)  * 1vh - var(--lu-chrome-h)));
	max-height: max(320px, calc(var(--lu-post-photo-fill) * 1svh - var(--lu-chrome-h)));
	overflow: hidden;
}

/* A post with no photo (18 of 236) would put its date flush against the nav.
 * WordPress marks the ones that have one with `has-post-thumbnail`. */
.lu-post:not(.has-post-thumbnail) {
	padding-block-start: var(--lu-page-head-top);
}

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

.lu-post__main {
	grid-area: main;
	min-inline-size: 0;
}

.lu-post__meta {
	margin: 0 0 var(--lu-type-body-lh);
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-body-size);
	line-height: var(--lu-type-body-lh);
	color: var(--lu-primary);
}

body .lu-post__meta a {
	font: inherit;
	color: inherit;
	text-decoration: none;
}

body .lu-post__meta a:hover {
	color: var(--lu-secondary);
	text-decoration: none;
}

/* The Kit's H1 on desktop; the phone size is below. Danish compounds need the
 * same breaking floor as every display role (DESIGN.md "Type"). */
body[class*="elementor-kit-"] .lu-post__title {
	margin: 0;
	color: var(--lu-primary);
	overflow-wrap: break-word;
	hyphens: auto;
}

/* Title to body: one wider gap - or one blank line when a deck comes first,
 * which then carries the wider gap itself (design-system.css section 8). */
.lu-post__body {
	margin-block-start: var(--lu-post-deck-gap);
}

.lu-post__body:has(.lu-deck) {
	margin-block-start: var(--lu-post-title-deck-gap);
}

/**
 * Elementor gives every column 10px of padding when its control is empty, and
 * not one of the 236 posts was built to the page's line - so a post's text sat
 * 10px inside it. Zeroed here, for post bodies only, at Elementor's own default
 * specificity plus one: a padding someone set on a column in the editor prints
 * later in <body> at (0,4,0) and still wins.
 */
.lu-post__body .elementor-column-gap-default > .elementor-column > .elementor-element-populated {
	padding: 0;
}

.lu-post__comments {
	margin-block-start: var(--lu-section-gap);
}

.lu-post__more {
	grid-area: more;
	margin-block-start: var(--lu-section-gap);
}

/* "Seneste nyheder", and any section built like it (lu-more-news - Tal og
 * analyser's articles): the heading sits 40px over its cards. */
.lu-post__more .lu-section-heading,
.lu-more-news .lu-section-heading {
	margin-block-end: 40px;
}

/* --- The sidebar --------------------------------------------------------
 * The client's own widgets, in the client's order (Appearance -> Widgets):
 * search, "Kategorier", "Arkiv". Styled from scratch rather than on top of
 * theme.css's `.sidebar .widget` rules - the template does not use that class,
 * so there is nothing of the demo theme's to undo.
 */
.lu-post__side {
	grid-area: side;
}

/* The same sidebar beside the news archive (index.php), so it is a class of its
 * own rather than a part of the post. */
/**
 * `minmax(0, 1fr)`, not the implicit `auto` column. An auto column grows to its
 * widest child's min-content, and the search field's min-content is the
 * <input>'s intrinsic width - about 20 characters, measured in the browser's
 * own font metrics. That came to 261px in headless Chromium and 301px on the
 * user's machine (2026-09-22), so in their browser the search and the archive
 * dropdown ran 21px past the photo's right edge while every test here passed.
 */
.lu-side {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: 56px;
	align-content: start;
	min-inline-size: 0;
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-body-size);
	line-height: var(--lu-type-body-lh);
	color: var(--lu-primary);
}

.lu-side .widget {
	margin: 0;
}

.lu-side .widget-title {
	margin: 0 0 16px;
	font-family: var(--lu-font-display);
	font-size: var(--lu-type-h4-size);
	font-weight: 500;
	line-height: var(--lu-type-h4-lh);
	color: inherit;
}

/* Search: a Custom HTML widget holding the theme's own search form. One ruled
 * field, with the mark drawn rather than set in ElegantIcons (DESIGN.md "Icons
 * and type" - the glyph is a printable character FlyingPress can paint). */
.lu-side .ova_search form {
	margin: 0;
}

.lu-side .ova_search .search {
	display: flex;
	align-items: stretch;
	block-size: 48px;
	border: 1px solid var(--lu-primary);
}

/* `inline-size: 0` + grow: the field takes whatever the button leaves, and its
 * intrinsic width (see .lu-side above) never enters the sum at all. */
.lu-side .ova_search input {
	flex: 1 1 auto;
	inline-size: 0;
	min-inline-size: 0;
	margin: 0;
	padding: 0 14px;
	border: 0;
	background: transparent;
	font: inherit;
	color: inherit;
}

.lu-side .ova_search input::placeholder {
	color: color-mix(in srgb, var(--lu-primary) 60%, transparent);
}

.lu-side .ova_search button {
	display: grid;
	place-items: center;
	margin: 0;
	padding: 0 14px;
	border: 0;
	background: transparent;
	color: inherit;
	cursor: pointer;
}

.lu-side .ova_search button i {
	display: block;
	inline-size: 17px;
	block-size: 17px;
	font-size: 0;
}

.lu-side .ova_search button i::before {
	content: "";
	display: block;
	inline-size: 100%;
	block-size: 100%;
	background-color: currentColor;
	-webkit-mask: var(--lu-icon-search) center / contain no-repeat;
	mask: var(--lu-icon-search) center / contain no-repeat;
}

/* Categories as labels, at every width: the date chip's shape - Lysegroen fade
 * behind Primaer, 32px tall, square - inverting on hover. */
.lu-side .widget_categories ul {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.lu-side .widget_categories li {
	margin: 0;
	padding: 0;
}

body .lu-side .widget_categories a {
	display: block;
	padding: 6px 12px;
	background-color: var(--lu-surface-green);
	font: inherit;
	color: var(--lu-primary);
	text-decoration: none;
}

body .lu-side .widget_categories a:hover,
body .lu-side .widget_categories .current-cat > a {
	background-color: var(--lu-primary);
	color: var(--lu-surface-green);
}

/* The archive: the widget's own month dropdown, ruled like the search. */
.lu-side .widget_archive select {
	inline-size: 100%;
	block-size: 48px;
	margin: 0;
	padding: 0 14px;
	border: 1px solid var(--lu-primary);
	border-radius: 0;
	background-color: transparent;
	font: inherit;
	color: inherit;
}

@media (max-width: 767px) {
	/* D3: photo, article, news cards, then search, categories and archive. */
	.lu-post {
		grid-template-columns: minmax(0, 1fr);
		grid-template-areas:
			"photo"
			"main"
			"more"
			"side";
	}

	/* Edge to edge: out through .wrap_site's own padding. The width has to grow by
	 * the same amount - with `inline-size: 100%` stated above, negative margins
	 * alone only shift a 362px photo left. */
	.lu-post__photo {
		inline-size: calc(100% + 2 * var(--lu-pad));
		margin-inline: calc(-1 * var(--lu-pad));
		aspect-ratio: var(--lu-post-photo-ratio-m);
		max-height: none;
	}

	/* 36/40.5 - the size H2 already steps down to on phones - where every other
	 * H1 on the site is 48/52. A long Danish title filled the screen at 48. */
	body[class*="elementor-kit-"] .lu-post__title {
		font-size: var(--lu-type-h3-size);
		line-height: var(--lu-type-h3-lh);
	}

	.lu-side {
		gap: 32px;
		margin-block-start: var(--lu-section-gap);
	}
}


/* ==========================================================================
   8. Linked images never run wider than their widget
   ==========================================================================
   Found on LU's organisering during the article rollout (2026-09-15), and the
   cause behind several of the sideways-scrolling pages in HANDOFF.md section 9
   issue 27.

   Elementor's image widget wraps a linked image in an `<a>` with
   `display: inline-block`, and prints the file's `width="1024"` as an HTML
   attribute. An inline-block is as wide as its content's minimum, a fixed
   width attribute makes that minimum 1024px, and the image's own
   `max-width: 100%` is measured against the link it is sizing - so the link
   grew to 1024px and pushed a 402px phone 642px sideways. The same image
   without a link fits. Capping the LINK at its widget closes the loop: the
   image's 100% then has something definite to be 100% of.
   ========================================================================== */

.elementor-widget-image .elementor-widget-container > a {
	max-width: 100%;
}

/* A campaign banner fills the line whatever the file's width (the front page's
   60 år banner is 902px; the Årsmøde banner before it was 2436px and only
   filled the line by being larger than it). The link becomes a block so the
   image's 100% is the line, not its own natural width. */
.lu-banner .elementor-widget-container > a {
	display: block;
}

.lu-banner img {
	width: 100%;
}



/* ==========================================================================
   9. The news archive - /blog/, categories, search (index.php)
   ==========================================================================
   DESIGN.md "Listings", decision D1: the post's grid with the article swapped
   for news cards two across (design-system.css section 22, lu-card-grid-2),
   beside the same sidebar. The title, then the cards and page numbers, then -
   on a phone - the sidebar.
   ========================================================================== */

.wrap_site.lu-listing-wrap {
	padding-block: 0;
}

.lu-listing {
	/* A flex item of .wrap_site, like the post (section 7). */
	flex: 1 1 100%;
	min-inline-size: 0;
	padding-block: var(--lu-page-head-top) var(--lu-section-gap);
	color: var(--lu-primary);
}

.lu-listing--side {
	display: grid;
	grid-template-columns: minmax(0, 1fr) var(--lu-post-side-w);
	grid-template-areas:
		"head head"
		"main side";
	column-gap: var(--lu-post-side-gap);
	align-items: start;
}

.lu-listing__head {
	grid-area: head;
	margin-block-end: var(--lu-post-deck-gap);
}

/* The Kit's H1; the phone size is section 2's. */
body[class*="elementor-kit-"] .lu-listing__title {
	margin: 0;
	color: var(--lu-primary);
	overflow-wrap: break-word;
	hyphens: auto;
}

.lu-listing__main {
	grid-area: main;
	min-inline-size: 0;
}

.lu-listing__side {
	grid-area: side;
}

@media (max-width: 767px) {
	.lu-listing--side {
		grid-template-columns: minmax(0, 1fr);
		grid-template-areas:
			"head"
			"main"
			"side";
	}
}


/* ==========================================================================
   10. The calendar - /event/ (ovaev-templates/archive-event.php)
   ==========================================================================
   The title, the filter (lu-filter), then a month heading (lu-month) over its
   events (lu-event-row), and page numbers.
   ========================================================================== */

.lu-calendar__month + .lu-calendar__month {
	margin-block-start: var(--lu-post-deck-gap);
}


/* ==========================================================================
   11. An event page (ovaev-templates/single-event.php)
   ==========================================================================
   Decision D4 and the review after it: no sidebar, the full container width.
   "<- Kalender", the round logo beside the title and its labels, the facts
   (lu-facts), the text at its 780px measure, then "Flere arrangementer".
   ========================================================================== */

body a.lu-event__back {
	display: inline-block;
	margin-block-end: 20px;
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-body-size);
	font-weight: 400;
	line-height: var(--lu-type-body-lh);
	color: var(--lu-primary);
	text-decoration: none;
}

/* Sekundær on hover, and text-decoration is left alone so each keeps its own
 * rest state (D1, wave 3): lu-event__back has no underline, lu-event__all is
 * underlined and stays so. */
body a.lu-event__back:hover,
body a.lu-event__all:hover {
	color: var(--lu-secondary);
}

.lu-event__head {
	display: grid;
	grid-template-columns: var(--lu-event-head-logo) minmax(0, 1fr);
	column-gap: var(--lu-event-row-gap);
	align-items: start;
}

.lu-event__logo {
	display: block;
	inline-size: var(--lu-event-head-logo);
	aspect-ratio: 1;
	border-radius: 50%;
	overflow: hidden;
	background-color: var(--lu-white);
}

.lu-event__logo img {
	display: block;
	inline-size: 100%;
	block-size: 100%;
	object-fit: cover;
}

.lu-event__logo--empty {
	background-color: var(--lu-surface-green);
}

.lu-event__heading {
	display: grid;
	gap: 20px;
	justify-items: start;
	min-inline-size: 0;
}

.lu-event .lu-facts {
	margin-block-start: var(--lu-facts-gap);
}

.lu-event__body {
	margin-block-start: var(--lu-post-deck-gap);
}

.lu-event__gallery {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: var(--lu-col-gap);
	max-width: 780px;
	margin-block-start: var(--lu-post-deck-gap);
}

.lu-event__gallery img {
	display: block;
	inline-size: 100%;
	block-size: auto;
}

.lu-event__more {
	margin-block-start: var(--lu-section-gap);
}

body[class*="elementor-kit-"] .lu-event__more-title {
	margin: 0 0 40px;
	text-align: center;
	color: var(--lu-primary);
}

.lu-event__more .lu-event-list {
	border-top: var(--lu-rule);
}

body a.lu-event__all {
	display: block;
	inline-size: max-content;
	margin: 40px auto 0;
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-body-size);
	font-weight: 400;
	line-height: var(--lu-type-body-lh);
	color: var(--lu-primary);
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

@media (max-width: 767px) {
	/* 36/40.5, as a news post's title on a phone (section 7). */
	body[class*="elementor-kit-"] .lu-event__title {
		font-size: var(--lu-type-h3-size);
		line-height: var(--lu-type-h3-lh);
	}

	.lu-event__heading {
		gap: 12px;
	}

	.lu-event__gallery {
		grid-template-columns: minmax(0, 1fr);
	}
}



/* ==========================================================================
   12. A toolbox page (ovadep-templates/single-dep.php)
   ==========================================================================
   Decision D6 on the hubs proposal: Frivillige's own page - the blue ground
   and dark red footer come from section 6, via the same body class - with the
   title, the six areas as labels, and the dep post's groups of links two
   across. The groups are ova_box_resource widgets in the post's Elementor
   content; the plugin's numbers and "Find mere" buttons are hidden, because the
   buttons led nowhere (file:///C:/Users/... or "#").
   ========================================================================== */

.lu-toolbox {
	color: var(--lu-deep-red);
}

.lu-toolbox__head {
	display: grid;
	gap: 20px;
	justify-items: start;
	margin-block-end: var(--lu-post-deck-gap);
}

body a.lu-toolbox__back {
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-body-size);
	font-weight: 400;
	line-height: var(--lu-type-body-lh);
	color: inherit;
	text-decoration: none;
}

/* Sekundær, not underlined - the site's one hover for a link. */
body a.lu-toolbox__back:hover {
	color: var(--lu-secondary);
	text-decoration: none;
}

body[class*="elementor-kit-"] .lu-toolbox .lu-listing__title {
	color: var(--lu-deep-red);
}

.lu-toolbox__head nav {
	margin: 0;
}

/* The toolbox's labels are pink over dark red, not the site's green. */
body .lu-toolbox .lu-labels a {
	background-color: var(--lu-rule-pink);
	color: var(--lu-deep-red);
}

body .lu-toolbox .lu-labels a:hover,
body .lu-toolbox .lu-labels a.is-current {
	background-color: var(--lu-deep-red);
	color: var(--lu-rule-pink);
}

/**
 * The dep post's document: its groups two across, anything else full width.
 *
 * LAID OUT BY WIDGET, NOT BY SECTION. The six posts were built differently -
 * one group per section on Landsorganisation, three groups in one section on
 * Traktortræk, a group sharing a section with a video on Pløjning - so a grid
 * of sections put groups in one column or across two. `display: contents` on
 * the section, container, column and widget-wrap makes every widget an item of
 * the one grid, whatever it was built in.
 *
 * Anything Elementor hides (the demo sections still inside Traktortræk and
 * Pløjning are hidden on every device) keeps its `display: none`: the rule
 * skips elements carrying an elementor-hidden-* class, and the children of a
 * hidden element are never reached.
 */
.lu-toolbox__body > .elementor {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	column-gap: 40px;
	row-gap: 56px;
	align-items: start;
}

.lu-toolbox__body > .elementor :is(.elementor-section, .elementor-container, .elementor-column, .elementor-widget-wrap):not([class*="elementor-hidden-"]) {
	display: contents;
}

.lu-toolbox__body .elementor-widget {
	grid-column: 1 / -1;
	margin: 0;
}

.lu-toolbox__body .elementor-widget.elementor-widget-ova_box_resource {
	grid-column: auto;
}

body .lu-toolbox__body .elementor-widget-text-editor a {
	font: inherit;
	color: inherit;
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

/* Underlined at rest, and it stays underlined on hover (D1, wave 3). */
body .lu-toolbox__body .elementor-widget-text-editor a:hover {
	color: var(--lu-secondary);
}

body .lu-toolbox .ova_box_resource {
	margin: 0;
	padding: 0;
	border: 0;
	background: none;
	box-shadow: none;
}

.lu-toolbox .ova_box_resource .text_number,
.lu-toolbox .ova_box_resource .read_more {
	display: none;
}

body .lu-toolbox .ova_box_resource .title {
	margin: 0 0 16px;
	font-family: var(--lu-font-display);
	font-size: var(--lu-type-h3-size);
	font-weight: 500;
	line-height: var(--lu-type-h3-lh);
	color: inherit;
}

/* The title links where "Find mere" did - nowhere - so it is only a heading. */
body .lu-toolbox .ova_box_resource .title a {
	font: inherit;
	color: inherit;
	text-decoration: none;
	pointer-events: none;
}

body .lu-toolbox .ova_box_resource ul.content {
	margin: 0;
	padding: 0;
	list-style: none;
	border-top: var(--lu-rule);
}

body .lu-toolbox .ova_box_resource ul.content li {
	margin: 0;
	padding: 0;
	border-bottom: var(--lu-rule);
}

body .lu-toolbox .ova_box_resource ul.content li a {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 12px 0;
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-body-size);
	font-weight: 400;
	line-height: var(--lu-type-body-lh);
	color: inherit;
	text-decoration: none;
}

/* The plugin draws a bullet in ::before; that slot is the kind of link now
 * (design-system.css section 30), and the chevron goes after. */
body .lu-toolbox .ova_box_resource ul.content li a::before {
	content: "";
	position: static;
	inline-size: auto;
	block-size: auto;
	margin: 0 0 0 auto;
	background: none;
	opacity: 0.75;
	transform: none;
}

body .lu-toolbox .ova_box_resource ul.content li a::after {
	content: "";
	order: 3;
	flex: 0 0 auto;
	inline-size: 20px;
	block-size: 20px;
	background-color: currentColor;
	-webkit-mask: var(--lu-icon-chevron) center / contain no-repeat;
	mask: var(--lu-icon-chevron) center / contain no-repeat;
	transform: rotate(-90deg);
}

body .lu-toolbox .ova_box_resource ul.content li a:hover {
	color: var(--lu-secondary);
	text-decoration: none;
}

/* A note between the groups (Traktortræk's "Alle traktortræk ... skal være
 * registreret") reads as body text at the measure. */
.lu-toolbox__body .elementor-widget-text-editor {
	max-width: 780px;
	font-family: var(--lu-font-body);
	font-size: var(--lu-type-body-size);
	line-height: var(--lu-type-body-lh);
	color: inherit;
}

@media (max-width: 767px) {
	.lu-toolbox__body > .elementor {
		grid-template-columns: minmax(0, 1fr);
		row-gap: 40px;
	}

	body .lu-toolbox .ova_box_resource .title {
		font-size: var(--lu-type-h4-size);
		line-height: var(--lu-type-h4-lh);
	}
}
