/**
 * tokens.css - LandboUngdom design tokens
 *
 * Handle: egovt-child-tokens. First of the three child-theme sheets:
 *
 *   tokens.css          <- we are here. Names, no rules.
 *   design-system.css   reusable lu-* components (geometry + type)
 *   restyle.css         site-specific overrides (nav, footer, safety nets)
 *
 * THE ONE IDEA IN THIS FILE
 *
 * Colour is not defined here. It is *aliased* here.
 *
 * The Elementor Kit (post 4, "Site Settings") already holds the whole palette
 * and the h1-h4 type scale, and Elementor publishes every entry as a CSS custom
 * property. Verified in the rendered <head>:
 *
 *   .elementor-kit-4{--e-global-color-primary:#125442;
 *                    --e-global-color-a53ee87:#E8B5DB; ... }
 *
 * So every --lu-* colour below is `var(--e-global-color-X, #hex)`. The hex is a
 * fallback for the case where Elementor is disabled or the Kit is re-keyed on
 * import (HANDOFF section 2 flags that as a real risk) - it is NOT the value.
 *
 * Consequence, and the whole point: the client changes a colour in
 * Site Settings -> Global Colors and every component follows. Nothing in this
 * theme has to be edited, and nothing here can drift from what the client sees.
 *
 * WHY THESE ARE ON `body` AND NOT `:root`
 *
 * Elementor declares --e-global-* on `.elementor-kit-4`, and that class is on
 * <body>, not <html>:
 *
 *   <body class="home ... elementor-default elementor-kit-4 elementor-page-2984">
 *
 * Custom properties resolve against the element they are declared on. A
 * `:root { --lu-primary: var(--e-global-color-primary) }` would resolve against
 * <html>, where --e-global-color-primary does not exist, and silently fall back
 * to the hex forever - the Kit would appear to be wired up and would not be.
 * Declaring on `body` puts both on the same element. Do not "tidy" this to
 * :root.
 *
 * NAMING
 *
 * --lu- cannot collide with --e-global-* or --wp--preset--*. Names are by role,
 * not by hue, and each carries the Kit entry it aliases so the two stay legible
 * against each other. The Kit titles are Danish; they are quoted verbatim.
 */


/* ==========================================================================
   1. Colour - aliases of the Elementor Kit
   ========================================================================== */

body {

	/* Brand ---------------------------------------------------------------- */
	--lu-primary:         var(--e-global-color-primary,   #125442);  /* Kit system `primary` + `text`; customs 386d5a2, 8f447a8, 9b3bae4 */
	--lu-secondary:       var(--e-global-color-secondary, #BABC0E);  /* Kit system `secondary` */
	--lu-accent:          var(--e-global-color-accent,    #D94F08);  /* Kit system `accent`; customs a653d0c, 7a4ba5c */
	--lu-white:           var(--e-global-color-40f4f99,   #FFFFFF);  /* Kit custom 40f4f99 "Hvid" */

	/* Surfaces ------------------------------------------------------------- */
	--lu-page-bg:         var(--e-global-color-1fa1664,   #FDF5EA);  /* Kit custom 1fa1664 "Sidebaggrund" */
	--lu-header-surface:  var(--e-global-color-e7995fd,   #FEFAF4);  /* Kit custom e7995fd "Header flade" */
	--lu-banner-surface:  var(--e-global-color-4ec2446,   #E3F2F5);  /* Kit custom 4ec2446 "Banner flade"; ccb621b is a duplicate */
	--lu-surface-green:   var(--e-global-color-5b04f39,   #ECF3DA);  /* Kit custom 5b04f39 "Lysegroen fade" */
	--lu-surface-blue:    var(--e-global-color-ac5852a,   #A1C2E5);  /* Kit custom ac5852a "Lyseblaa" */
	--lu-surface-sand:    var(--e-global-color-5d6de1d,   #EFE4C0);  /* Kit custom 5d6de1d "Sand" */

	/* Accents -------------------------------------------------------------- */
	--lu-stat-blue:       var(--e-global-color-b1a3d42,   #4091D9);  /* Kit custom b1a3d42 "Blaa" */
	--lu-rule-pink:       var(--e-global-color-a53ee87,   #E8B5DB);  /* Kit custom a53ee87 "Pink bjaelke" */
	--lu-deep-red:        var(--e-global-color-f711d1f,   #5E1C1F);  /* Kit custom f711d1f "Moerkeroed" */


/* ==========================================================================
   2. Type - family aliased, scale named
   ========================================================================== */

	/**
	 * Families come from the Kit's typography globals, same reasoning as above.
	 * The Kit sets `primary` = GT Era Display 500 and `text` = GT Era Text 400.
	 *
	 * The fallback stacks are not decoration: GT Era is a commercial Grilli Type
	 * face served from assets/fonts/, and HANDOFF section 1a records that the
	 * production install is a separate manual step. If it is missing, these are
	 * what the site renders in.
	 */
	--lu-font-display: var(--e-global-typography-primary-font-family, "GT Era Display"), Georgia, "Times New Roman", serif;
	--lu-font-body:    var(--e-global-typography-text-font-family,    "GT Era Text"),    "Helvetica Neue", Arial, sans-serif;

	/**
	 * The scale, from the Figma variables (file jRKX6HSuFI3ocoJyyUGWZb).
	 *
	 * The Kit ALREADY applies h1-h4 and body to real elements, so these tokens
	 * are not for headings. They exist for the one case the Kit cannot reach:
	 * type *inside a third-party widget's markup*, where a heading is the wrong
	 * element or the widget hardcodes its own size. `ova_blog` renders its card
	 * title as an <h2>, for instance - semantically fine, but the Kit then gives
	 * it 48px where the design wants 24px.
	 *
	 * Figma line-heights are unitless-per-px values; kept as px so they cannot
	 * be re-scaled by an inherited font-size further down some widget's tree.
	 */
	--lu-type-h1-size:   81px;   --lu-type-h1-lh: 81px;     --lu-type-h1-ls: -0.005em;
	--lu-type-h2-size:   48px;   --lu-type-h2-lh: 60.75px;  --lu-type-h2-ls: -0.005em;
	--lu-type-h3-size:   36px;   --lu-type-h3-lh: 40.5px;   --lu-type-h3-ls: 0;
	--lu-type-h4-size:   24px;   --lu-type-h4-lh: 27px;     --lu-type-h4-ls: 0;
	--lu-type-body-size: 16px;   --lu-type-body-lh: 20px;               /* "Broedtekst", 400 */
	--lu-type-menu-size: 18px;   --lu-type-menu-lh: 20px;               /* "Menu", GT Era Text 700 */


/* ==========================================================================
   3. Geometry - the part Elementor has no token layer for
   ========================================================================== */

	/**
	 * Elementor's Kit covers colour and type and nothing else. Radius, gutters,
	 * aspect ratios and vertical rhythm have to live somewhere, and per-element
	 * Elementor settings are the wrong place for them - they would be retyped by
	 * hand on every widget and drift immediately. This is that somewhere.
	 *
	 * All of it is measured off the Figma frames, not guessed:
	 *   desktop 1:33 (1440 wide), mobile 1:130 (402 wide).
	 */

	/* Layout --------------------------------------------------------------- */
	--lu-container: 1320px;   /* 1440 - 2x60 gutter. The Elementor Kit's Content
	                             Width must match; see HANDOFF section 2. */
	--lu-gutter:      60px;   /* first content x-origin on the desktop frame.
	                             Descriptive: what the gutter measures at 1440.
	                             Not used for layout - --lu-pad is. */

	/**
	 * --lu-pad is the MINIMUM side padding, and the thing layout actually uses.
	 *
	 * A container capped at --lu-container and centred gives a 60px gutter at
	 * 1440 for free, and nothing at all at 1320 - text runs into the viewport
	 * edge, which is what happened at every width between roughly 1024 and 1340.
	 * Padding fixes that, but then the two have to be reconciled so the gutter
	 * is still exactly 60 at the design width:
	 *
	 *     max-width: calc(var(--lu-container) + 2 * var(--lu-pad))   = 1368
	 *     padding-inline: var(--lu-pad)                              = 24
	 *
	 * At 1440: (1440 - 1368) / 2 + 24 = 36 + 24 = 60.  Exactly the frame.
	 * At 1100: the cap is inactive, so the gutter is a flat 24.
	 * At  402: 20, and the content box is 362 - the Figma mobile width.
	 */
	--lu-pad:         24px;
	--lu-col-gap:     20px;   /* card origins 60 / 506 / 953, each 427 wide */

	/* Header --------------------------------------------------------------- */
	/* Two heights, from the frame: the utility strip is shallower than the nav
	 * bar it sits above (nodes 1:391 and 1:361). */
	--lu-header-bar-h:  52px;
	--lu-utility-bar-h: 41px;

	/**
	 * The two together, which is what sits above the first section on the page.
	 * Derived rather than typed: 93px is not a number anyone should be able to
	 * get wrong by editing one of the bars and not the other.
	 */
	--lu-chrome-h: calc(var(--lu-header-bar-h) + var(--lu-utility-bar-h));

	/**
	 * THE PINNED NAV'S GLASS.
	 *
	 * The bar and the page are near enough the same colour (header flade against
	 * Sidebaggrund), so a bar pinned over content has nothing to say where it
	 * ends. A shadow was the first answer and it was the wrong one: a shadow can
	 * only show on what is directly under the bar, which on this site is a
	 * photograph as often as it is the page ground, and on a photograph a wash
	 * that subtle is invisible. Glass says it everywhere - what passes under the
	 * bar goes soft, whatever colour it is.
	 *
	 * 90%, so the bar is the same colour it has always been when there is nothing
	 * behind it and only shows its hand once the page is moving under it. The
	 * blur is what does the work; the 10% is what makes the blur visible at all.
	 *
	 * Mixed from --lu-page-bg, the Kit global the masthead is bound to, so a
	 * palette change still flows through. See restyle.css section 3 for the one
	 * consequence: the bar's ground is now set here rather than in Elementor.
	 */
	--lu-nav-glass:        color-mix(in srgb, var(--lu-page-bg) 90%, transparent);
	--lu-nav-glass-filter: blur(12px);

	/**
	 * THE PINNED BAR'S SHADOW, which the glass works with rather than against:
	 * the glass says the bar is in front of the page, the shadow says how far.
	 * It is drawn only while the bar is pinned - see restyle.css section 3.
	 *
	 * BLACK, NOT THE PALETTE - one of the two places in the theme where that is
	 * right; the other is --lu-media-scrim, for the same reason. Everything else
	 * that washes over the page is mixed from --lu-primary - see --lu-media-tint
	 * below - because a tint on a photograph should belong to the brand. A shadow
	 * is not a tint: it is the absence of light, it is neutral, and at these
	 * strengths a green-tinted one read as a dirty smudge on the cream rather than
	 * as depth. Called on the rendered page rather than in the abstract, after
	 * looking at both.
	 *
	 * Three stops, not two: a tight contact edge and a long ambient tail. A
	 * single stop reads as a drawn line, and a two-stop version of this fell
	 * away so fast that it was there on a screenshot and not there to the eye.
	 *
	 * CALIBRATED, not guessed. Measured against the page's own ground (#FDF5EA)
	 * with the bar pinned over it, as the drop in the red channel row by row:
	 *
	 *     11% / 4%     green, 14px   25 -> 7    too faint to read as anything
	 *     16% / 6% / 2% green, 18px  38 -> 12   visible, but green and heavy
	 *     22% / 9% / 3% green, 20px  52 -> 19   reads as a band, not a shadow
	 *      8% / 3% / 1% black,  9px  20 -> 4    this
	 *
	 * The last row is half the strength and half the reach of the one above it,
	 * which is the whole of the brief it was changed to meet.
	 *
	 * Re-measure the same way if the page ground ever changes: the number that
	 * matters is the contact edge against the ground BEHIND it, not the
	 * percentage. `black` is the CSS keyword, not a hex - no Kit colour is being
	 * bypassed here, because the Kit has no black to bypass.
	 */
	--lu-nav-shadow-h: 9px;
	--lu-nav-shadow: linear-gradient(
		to bottom,
		color-mix(in srgb, black 8%, transparent),
		color-mix(in srgb, black 3%, transparent) 30%,
		color-mix(in srgb, black 1%, transparent) 60%,
		transparent
	);

	/**
	 * The search mark, drawn rather than set in an icon font.
	 *
	 * The widget renders `<i class="icon_search">` from ElegantIcons, and a font
	 * glyph has no stroke weight to adjust. Carrying it as a mask keeps the
	 * colour on `currentColor`, so the widget's own "Icon Color" control still
	 * works, and puts the stroke width where it can be edited - here.
	 */
	--lu-icon-search: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round'%3E%3Ccircle cx='10' cy='10' r='6.5'/%3E%3Cpath d='M14.9 14.9 20.5 20.5'/%3E%3C/svg%3E");

	/**
	 * The submenu chevron, drawn for a second reason on top of the stroke-weight
	 * one above: THE ICON FONT IS NOT RELIABLE TO PAINT WITH.
	 *
	 * ElegantIcons addresses its glyphs through printable ASCII -
	 * `.arrow_carrot-down:before { content: "\33" }` is the literal digit 3
	 * (egovt/assets/libs/elegant_font/ele_style.css:95). Any moment the browser
	 * renders that character in a fallback face, the nav reads "Aktiviteter 3".
	 *
	 * Which is exactly what FlyingPress arranges. Its `fonts_display_swap`
	 * option rewrites EVERY @font-face on the page - stripping any font-display
	 * already declared and forcing `swap`
	 * (flying-press/src/Optimizer/Font.php:126-136, no exclusion list). `swap`
	 * means a zero block period: the fallback paints immediately and is replaced
	 * only when the font arrives. Text fonts want that. An icon font must have
	 * `block`, and cannot keep it while that option is on.
	 *
	 * Browsers differ in how long that window is, which is why this was reported
	 * as a Chrome-only bug - it is not, it is a race, and Chrome loses it most
	 * often. Drawing the mark removes the race rather than shortening it.
	 * Same 24-box and stroke-width as the search mark, so the two read as a pair.
	 * HANDOFF section 9 carries the site-wide fix for the glyphs still in a font.
	 */
	--lu-icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 9.5 12 16.5 19 9.5'/%3E%3C/svg%3E");

	/**
	 * The mobile drawer's three marks, and the same argument again: the plugin
	 * renders `<i class="fas fa-bars">` and `<i class="fas fa-times">` from Font
	 * Awesome, which font-display:swap paints as a fallback box first, and the
	 * drawer's arrow is a text glyph GT Era Display does not contain (measured:
	 * U+2193 falls through to the serif fallback in Display, though GT Era Text
	 * has it). Drawing all three settles both problems at once and puts the
	 * chrome on one stroke weight.
	 *
	 * Geometry is Figma's, not invented - node 1:313 "LU - Menu Mobil":
	 *   1:334  the hamburger, three 2px bars 24 wide at y 1 / 7 / 13
	 *   1:350  the cross, two 2px strokes across a 19.18 x 19.09 box
	 * The arrow (1:355) is drawn to the same 2px language at the H4 size the
	 * frame sets it in.
	 */
	--lu-icon-menu:  url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 14' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='M0 1h24M0 7h24M0 13h24'/%3E%3C/svg%3E");
	--lu-icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 19.18 19.09' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='M0.79 18.38 18.47 0.71'/%3E%3Cpath d='M0.71 0.71 18.39 18.39'/%3E%3C/svg%3E");
	--lu-icon-arrow-down: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v16'/%3E%3Cpath d='M5.5 13.5 12 20 18.5 13.5'/%3E%3C/svg%3E");

	/* Hero ------------------------------------------------------------------ */
	/* The photograph's aspect ratio (1500x1000). Mobile leans on it: the image
	 * is painted 100vw wide, so its height is 100vw / this - which is what the
	 * copy below has to be pushed down by. A fixed px value only lines up at one
	 * viewport width and drifts everywhere else. */
	--lu-hero-ratio: 1.5;

	/**
	 * HOW MUCH OF THE WINDOW THE FIRST SCREEN TAKES, as a percentage, chrome
	 * included. The hero is the remainder: this minus --lu-chrome-h.
	 *
	 * It used to be a flat 961px - the Figma frame's hero height - capped at
	 * the window. That read as "too high" on every real laptop, and the reason
	 * is the header: the frame's 961px hero starts 93px down, so 1054px of
	 * content was competing for a 900-982px window and the fold landed inside
	 * the photograph. Nothing below the hero was ever visible, at any common
	 * size, so the page gave no sign that it continued.
	 *
	 * At 90 the next section shows by about a tenth of the window - enough to
	 * read as "there is more here" without taking anything from the hero.
	 * Measured at 1512x982: hero 791px, 98px of the next section showing.
	 *
	 * A number, not a length, so it can be multiplied by whichever viewport
	 * unit the browser supports - see design-system.css section 11.
	 */
	--lu-hero-fill: 90;

	/* Subpage head --------------------------------------------------------- */
	/**
	 * lu-page-head, the head of a subpage with a photograph - design-system.css
	 * section 11b. Approved on the proposal 2026-09-15 (DESIGN.md).
	 *
	 * The same share-of-the-window mechanism as --lu-hero-fill, at a subpage's
	 * share: header and head together take 60% of the window. At 1440x1000 that
	 * is a 507px photograph, within a few px of the 510px Slider Revolution heads
	 * it replaced - the height people knew survives, and the page below always
	 * shows. The front page is 90 because it is the front door; a subpage's job
	 * is to get you to its content.
	 */
	--lu-page-head-fill: 60;

	/* The phone band's proportion. A design choice, not a file's - unlike
	 * --lu-hero-ratio above, which is the hero photograph's own 1500x1000. */
	--lu-page-head-ratio: 1.5;

	/* The title block's distance from the photograph's bottom edge. 52 is the
	 * front page hero's own padding-block-end, so the two heads agree. */
	--lu-page-head-inset: 52px;

	/**
	 * THE SCRIM behind a subpage title: black, bottom half only.
	 *
	 * The second black on the site, after --lu-nav-shadow, and for the same
	 * reason. --lu-media-tint (below) tints a photograph with the brand; a scrim
	 * exists to take light away from under white type, which is neutral work, and
	 * a green one shifts the photograph's hue as well as its brightness. Chosen on
	 * the proposal (D2). Always layered over --lu-media-tint, never instead of it.
	 */
	--lu-media-scrim: linear-gradient(to top, color-mix(in srgb, black 50%, transparent), transparent 55%);

	/* Radius --------------------------------------------------------------- */
	/**
	 * Two shapes, and they are not interchangeable.
	 *
	 * Cards round their TOP TWO CORNERS ONLY. The media sits flush at the top
	 * and the coloured body runs square to the bottom edge - true of every card
	 * in the file, desktop and mobile, green, pink and dark red.
	 *
	 * Bands round DIAGONALLY, top-right and bottom-left. That asymmetry is a
	 * deliberate brand shape, not a rounding error; the stats band (node 1:67)
	 * is `rounded-bl-[36px] rounded-tr-[36px]`. Writing 36px on all four corners
	 * is the single easiest way to get this design subtly wrong.
	 */
	--lu-radius-card: 24px 24px 0 0;
	--lu-radius-card-side: 24px 0 0 24px;  /* the person card on its side: its two left corners */
	--lu-radius-band: 0 36px 0 36px;
	--lu-radius-band-mirror: 36px 0 36px 0;  /* the band's corners mirrored: top-left and bottom-right */
	--lu-radius-btn:  15px;

	/* Component metrics ---------------------------------------------------- */
	--lu-card-pad:      24px;      /* 5.62% of the 427px card */

	/**
	 * How far an lu-list item's last line sits above its rule.
	 *
	 * Node 1:57 ends at y 171 and the rule under it is at 187.
	 *
	 * It matters beyond the list: the panel's LAST rule is what the news card's
	 * "Laes mere" is aligned to across the row. That alignment is expressed
	 * through --lu-card-pad, which both cards share - the last rule sits one
	 * card padding above the bottom edge, and so does the read-more's baseline.
	 */
	--lu-list-rule-gap: 16px;
	--lu-card-ratio:    427 / 263; /* media box, node 1:47 */
	--lu-band-pad-y:    96px;      /* band is 353 tall on the frame */
	--lu-band-pad-x:    40px;      /* keeps the stats off the rounded corners */
	--lu-band-gap:      40px;      /* between the stats, wider than a card row */
	--lu-footer-gap:    56px;      /* between footer columns; 24px stacked */

	/**
	 * A wash over cover imagery so overlaid controls stay legible and the photo
	 * sits back a step. Built from --lu-primary rather than a flat black, so it
	 * tints with the palette instead of just greying the picture.
	 *
	 * TWO STRENGTHS, and which one to use is a question about what is on top of
	 * the picture, not about how big it is:
	 *
	 *   --lu-media-tint       18%  something has to stay LEGIBLE over it - the
	 *                              video still, where a play button sits on an
	 *                              unpredictable frame.
	 *   --lu-media-tint-soft  10%  nothing is competing; the wash is only
	 *                              seating the photograph into the page. The
	 *                              hero, whose copy sits over a dark corner of
	 *                              its own and needs no help.
	 *
	 * Both are the same colour, so the two treatments still read as one idea and
	 * both still follow a palette change.
	 */
	--lu-media-tint:      color-mix(in srgb, var(--lu-primary) 18%, transparent);
	--lu-media-tint-soft: color-mix(in srgb, var(--lu-primary) 10%, transparent);
	--lu-btn-pad:       17px 47px;
	--lu-btn-pad-sm:    14px 32px;  /* lu-btn--sm: 18/20 label, 48px tall */
	--lu-section-gap:   90px;      /* between top-level sections */
	--lu-rule:          1px solid color-mix(in srgb, currentColor 30%, transparent);
}


/* --------------------------------------------------------------------------
   Mobile
   --------------------------------------------------------------------------
   Only the values that actually change on the 402px frame. Type does not:
   a card title is 24/27 at both widths, which is why the scale above has no
   mobile variants.

   767px is Elementor's own mobile breakpoint (Kit `viewport_md` 768), so this
   switches in step with anything the client sets per-device in the editor.
   -------------------------------------------------------------------------- */

@media (max-width: 767px) {
	body {
		--lu-gutter:      20px;   /* content x-origin on the mobile frame */
		--lu-pad:         20px;   /* 402 - 2x20 = 362, the Figma content width */
		--lu-col-gap:     20px;
		--lu-section-gap: 40px;
		--lu-band-pad-y:  64px;
		--lu-band-pad-x:  24px;
		/**
		 * Stacked, the stats need much more air between them than they do side
		 * by side - 32px read as one block of numbers rather than four.
		 *
		 * 64px is the frame: on the mobile frame each stat occupies a 232px slot
		 * (nodes 1:179, 1:183, 1:187, 1:191, all adjacent), and against the
		 * ~163px an implemented stat measures that leaves ~69px between them.
		 * Taking the band's own vertical padding instead gives the box ONE
		 * internal rhythm - the space above the first stat, between each pair
		 * and below the last are all the same - and lands within 5px of it.
		 */
		--lu-band-gap:    64px;
		--lu-footer-gap:  24px;

		/* The subpage title sits closer to the photograph's edge on a 268px band
		 * than on a 507px one - 52 would leave the title floating mid-picture. */
		--lu-page-head-inset: 24px;

		/**
		 * H2 drops a step on mobile - 48/60.75 is a desktop measure and simply
		 * does not fit 362px. Confirmed against the mobile frame: "Seneste
		 * nyheder og begivenheder" (node 1:159) and "Kommende aktiviteter"
		 * (1:228) are both 36/40.5 there, so H2 and H3 converge.
		 *
		 * H1 and H4 are NOT in here on purpose. The mobile frame keeps the stat
		 * figure at 81/81 (node 1:182) and every card title at 24/27, and the
		 * stat figure reads --lu-type-h1-*. Page headings get their own mobile
		 * size below instead, so shrinking them cannot shrink the stats.
		 */
		--lu-type-h2-size: 36px;
		--lu-type-h2-lh:   40.5px;

		/* For real <h1> elements only - article titles, not the stat figure. */
		--lu-type-h1-page-size: 48px;
		--lu-type-h1-page-lh:   52px;

		/**
		 * A LONG page title steps once more (wave 3, D16).
		 *
		 * 48/52 is right for the 30 page headings that fit in one to three
		 * lines at 402 - "Tal og analyser", "Politisk udvalg", "Lokale
		 * aktiviteter". It is not right for the handful that are sentences:
		 * "Kom med til DM i traktortræk den 5. september 2026" is 49
		 * characters and runs to five lines, which is most of the first
		 * screen before any content.
		 *
		 * So the step is a MODIFIER the head opts into, not a change to the
		 * token above: dropping the global size would shrink thirty headings
		 * that are already correct, and would put H1 and H2 at the same size
		 * on a phone, so a page title would stop reading as one.
		 *
		 * 36/40.5 is H2's own phone size, so a long title converges with a
		 * section heading rather than going below it. 32 was considered and
		 * rejected: it drops under H3, and a card heading on the same screen
		 * would then be larger than the page's own title.
		 */
		--lu-type-h1-page-long-size: 36px;
		--lu-type-h1-page-long-lh:   40.5px;
	}
}


/* ==========================================================================
   4. The news post template - restyle.css section 7
   ==========================================================================
   Approved on the article proposal, 2026-09-15 (DESIGN.md "Articles"). Kept in
   a block of its own, after the mobile block above, and with its own mobile
   block after it - declaring these in the first `body` block would put the
   desktop values after nothing and the phone values in two places.
   -------------------------------------------------------------------------- */

body {
	/**
	 * Header + photo take this share of the window, never taller than 16:9
	 * (decision D2). 75 rather than the subpage head's 60: on a news post the
	 * photograph is the first thing to read. At 1440x1000 75 still ends the date
	 * and a two-line title above the fold; 80 pushed the title's second line
	 * under it. A number, so it can multiply a viewport unit.
	 */
	--lu-post-photo-fill: 75;

	/* Photo to the date and the search: half the 56 first drawn. */
	--lu-post-photo-gap: 28px;

	/* The phone photo runs edge to edge, 4:3 - 302px tall at 402. */
	--lu-post-photo-ratio-m: 4 / 3;

	/* The theme's 320px sidebar is the column plus the gap in front of it. The
	 * article's main column is what is left: 1000px at 1440. */
	--lu-post-side-w:   280px;
	--lu-post-side-gap: 40px;

	/* Title to deck (one blank line), and below the deck - or below the title
	 * when a post has no deck - one wider gap. */
	--lu-post-title-deck-gap: var(--lu-type-h4-lh);
	--lu-post-deck-gap:       56px;

	/* The deck, from Figma 1:126: the display face at H4 size. */
	--lu-type-deck-size: var(--lu-type-h4-size);
	--lu-type-deck-lh:   var(--lu-type-h4-lh);
}

@media (max-width: 767px) {
	body {
		--lu-post-photo-gap:      16px;
		--lu-post-title-deck-gap: 20px;
		--lu-post-deck-gap:       32px;

		/**
		 * 20/24: the one phone-only size outside the seven type roles, and a
		 * deliberate one. At 24/27 under a 36px title the deck crowded the
		 * screen; the title itself steps to 36/40.5, an existing role.
		 */
		--lu-type-deck-size: 20px;
		--lu-type-deck-lh:   24px;
	}
}


/* ==========================================================================
   5. Listings - the news archive, the calendar and the event pages
   ==========================================================================
   DESIGN.md "Listings", approved on the listings proposal on 2026-09-15.
   ========================================================================== */

body {
	/**
	 * From the nav to a page's first title, on every page that opens with a
	 * title rather than a photograph: article pages, posts without a photo, the
	 * news archive, the calendar and the event pages. It was the section gap
	 * (90 / 40) until the listings review asked for the title closer to the nav.
	 */
	--lu-page-head-top: 56px;

	/* A calendar row: the round logo, the space around everything in the row,
	 * and the gap between the logo, the text and the chevron. */
	--lu-event-logo:     112px;
	--lu-event-row-pad:  24px;
	--lu-event-row-gap:  40px;

	/* The logo beside an event page's title. */
	--lu-event-head-logo: 160px;

	/**
	 * A fact - the date, time and place under their label, and the time and
	 * place in a calendar row: the display face at 20/24, the size the deck
	 * steps down to on phones. Not a new size, a second use of that one.
	 */
	--lu-type-fact-size: 20px;
	--lu-type-fact-lh:   24px;

	/* The small labels in a calendar row. The full-size label is the date
	 * chip's shape, Broedtekst on 32px; this is the same shape a step down. */
	--lu-label-sm-size: 14px;
	--lu-label-sm-lh:   28px;
	--lu-label-sm-pad:  10px;

	/* Dato / Tid / Sted under the event's labels. */
	--lu-facts-gap: 32px;

	/* A form field and a page number: the sidebar search's 48, and 40. */
	--lu-field-h: 48px;
	--lu-pager-size: 40px;

	/* The person card (DESIGN.md "People"). Portrait, not the news card's
	 * landscape; the name at the fact size, the details at the small labels'
	 * 14. Laid on its side the name steps to 18/22 and the photo is 104 wide.
	 * The side-on card is chosen by the width of the widget, not the window
	 * (design-system.css section 33), so these are not in the media query. */
	--lu-person-ratio:       4 / 5;
	--lu-person-detail-size: 14px;
	--lu-person-detail-lh:   18px;
	--lu-person-side-media:  104px;
	--lu-person-side-min:    130px;
	--lu-person-side-name:   18px;
	--lu-person-side-name-lh: 22px;
}

@media (max-width: 767px) {
	body {
		--lu-page-head-top: 32px;

		--lu-event-logo:      64px;
		--lu-event-row-pad:   20px;
		--lu-event-row-gap:   16px;
		--lu-event-head-logo: 64px;

		--lu-label-sm-size: 12px;
		--lu-label-sm-lh:   24px;
		--lu-label-sm-pad:  8px;

		--lu-facts-gap: 24px;
	}
}
