.screen-reader-text {
  border: 0;
  clip: rect(1px, 1px, 1px, 1px);
  clip-path: inset(50%);
  height: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute !important;
  white-space: nowrap;
  width: 1px;
}

.screen-reader-text:focus {
  background: #fff;
  clip: auto !important;
  clip-path: none;
  color: #17402a;
  display: block;
  font-size: 0.875rem;
  font-weight: 700;
  height: auto;
  left: 0.5rem;
  padding: 0.75rem 1rem;
  top: 0.5rem;
  width: auto;
  z-index: 100000;
}
:root {
  --nytte-radius-sm: 0.75rem;
  --nytte-radius-md: 1.25rem;
  --nytte-radius-lg: 2rem;
  /* CH-175: 180ms ease foeltes som et blink (ejerens ord: "saa virker det
     buggy"). 260ms med en bloed udglidning er hurtig nok til at foelges og
     langsom nok til at ses. Tokenet styrer alle micro-interaktioner. */
  --nytte-transition: 260ms cubic-bezier(0.25, 0.6, 0.25, 1);
}

html {
  scroll-behavior: smooth;
}

body {
  min-width: 320px;
  /* `clip` frem for `hidden`: `hidden` gør body til en scroll-container, og så
     klæber `position: sticky` aldrig for noget efterkommer — det er derfor
     produktgalleriet ikke kunne gøres sticky. `clip` beskærer stadig utilsigtet
     vandret overløb, men skaber ingen scroll-container.
     Fallback til `hidden` for browsere uden clip-understøttelse. */
  overflow-x: hidden;
  overflow-x: clip;
}

body,
button,
input,
select,
textarea {
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

a {
  text-underline-offset: 0.18em;
}

a:hover {
  color: var(--wp--preset--color--leaf);
}

:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  box-shadow: 0 0 0 4px var(--wp--preset--color--leaf);
  outline: 2px solid var(--wp--preset--color--white);
  outline-offset: 2px;
}

.nyttedyret-main {
  min-height: 55vh;
  /* WordPress lægger sin block-gap mellem header-skabelondelen og main, hvilket
     gav 24 px cremefarvet stribe mellem headeren og heroen. Heroerne er
     fuldbredde-farvefelter, der skal støde op til headeren; katalog- og
     produktsiden nulstillede den allerede hver for sig. */
  margin-block-start: 0;
}

.nyttedyret-announcement {
  background: var(--wp--preset--color--forest);
  color: var(--wp--preset--color--white);
  padding-block: 0.55rem;
}

.nyttedyret-announcement p {
  margin: 0;
}

.nyttedyret-header {
  background: color-mix(
    in srgb,
    var(--wp--preset--color--cream) 94%,
    transparent
  );
  border-bottom: 1px solid var(--wp--preset--color--border);
  position: sticky;
  top: 0;
  z-index: 50;
  backdrop-filter: blur(14px);
}

.admin-bar .nyttedyret-header {
  top: 32px;
}

.nyttedyret-header__inner {
  min-height: 5rem;
}

.nyttedyret-brand {
  gap: 0.75rem;
}

.nyttedyret-brand .wp-block-site-title {
  font-family: var(--wp--preset--font-family--display);
  font-size: 1.55rem;
  font-weight: 750;
  letter-spacing: -0.04em;
  line-height: 1;
  margin: 0;
}

.nyttedyret-primary-nav .wp-block-navigation-item__content {
  padding-block: 0.75rem;
}

.nyttedyret-header__actions {
  gap: 0.5rem;
}

.nyttedyret-header__actions .wp-block-search {
  margin: 0;
}

.nyttedyret-header__actions .wp-block-search__inside-wrapper {
  padding: 0;
}

.nyttedyret-header__actions .wp-block-search__input {
  position: absolute;
  height: 1px;
  width: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
}

.nyttedyret-header__actions .wp-block-search__button {
  align-items: center;
  background: transparent;
  border: 1px solid var(--wp--preset--color--border);
  color: var(--wp--preset--color--forest);
  display: inline-flex;
  height: 2.75rem;
  justify-content: center;
  margin: 0;
  padding: 0;
  width: 2.75rem;
}

.nyttedyret-header__actions .wc-block-mini-cart__button {
  border: 1px solid var(--wp--preset--color--border);
  border-radius: 999px;
  height: 2.75rem;
  padding: 0.6rem;
  width: 2.75rem;
}

.nyttedyret-hero {
  background:
    radial-gradient(
      circle at 88% 12%,
      color-mix(in srgb, var(--wp--preset--color--leaf-pale) 75%, transparent)
        0 14rem,
      transparent 14.1rem
    ),
    var(--wp--preset--color--cream);
  overflow: hidden;
  padding-block: var(--wp--preset--spacing--2-xl);
}

.nyttedyret-hero__grid {
  gap: clamp(2.5rem, 6vw, 6rem);
}

.nyttedyret-hero__copy {
  max-width: 44rem;
}

.nyttedyret-hero h1 {
  max-width: 12ch;
}

.nyttedyret-eyebrow {
  color: var(--wp--preset--color--leaf);
  font-size: 0.75rem;
  font-weight: 800;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.nyttedyret-hero__actions {
  margin-top: 2rem;
}

.nyttedyret-hero .is-style-outline .wp-block-button__link {
  background: transparent;
  border-color: var(--wp--preset--color--forest);
  color: var(--wp--preset--color--forest);
}

.nyttedyret-check-list {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1.25rem;
  list-style: none;
  margin: 2rem 0 0;
  padding: 0;
}

.nyttedyret-check-list li {
  font-size: 0.875rem;
  font-weight: 650;
}

.nyttedyret-check-list li::before {
  color: var(--wp--preset--color--leaf);
  content: "✓";
  font-weight: 900;
  margin-right: 0.45rem;
}

.nyttedyret-symptom-card {
  background: var(--wp--preset--color--forest);
  border-radius: var(--nytte-radius-lg);
  box-shadow: var(--wp--preset--shadow--card);
  color: var(--wp--preset--color--white);
  padding: clamp(1.5rem, 4vw, 2.75rem);
  position: relative;
  transform: rotate(1.5deg);
}

.nyttedyret-symptom-card::after {
  border: 1px solid color-mix(in srgb, white 22%, transparent);
  border-radius: calc(var(--nytte-radius-lg) - 0.5rem);
  content: "";
  inset: 0.65rem;
  pointer-events: none;
  position: absolute;
}

.nyttedyret-symptom-card > * {
  position: relative;
  z-index: 1;
}

.nyttedyret-symptom-card h2,
.nyttedyret-symptom-card a {
  color: inherit;
}

.nyttedyret-symptom-card__label {
  color: var(--wp--preset--color--leaf-pale);
  font-size: 0.75rem;
  font-weight: 800;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

.nyttedyret-symptom-links {
  list-style: none;
  margin: 1.5rem 0;
  padding: 0;
}

.nyttedyret-symptom-links li {
  border-top: 1px solid color-mix(in srgb, white 20%, transparent);
}

.nyttedyret-symptom-links li:last-child {
  border-bottom: 1px solid color-mix(in srgb, white 20%, transparent);
}

.nyttedyret-symptom-links a {
  align-items: center;
  display: flex;
  font-weight: 700;
  justify-content: space-between;
  padding-block: 0.85rem;
  transition: padding var(--nytte-transition);
}

.nyttedyret-symptom-links a:hover {
  padding-left: 0.35rem;
}

.nyttedyret-section {
  padding-block: var(--wp--preset--spacing--2-xl);
}

.nyttedyret-section__heading {
  margin-bottom: var(--wp--preset--spacing--xl);
}

.nyttedyret-problem-grid {
  gap: 1rem;
}

.nyttedyret-problem-card,
.nyttedyret-content-card {
  background: var(--wp--preset--color--cream);
  border: 1px solid var(--wp--preset--color--border);
  border-radius: var(--nytte-radius-md);
  height: 100%;
  padding: 1.4rem;
  transition:
    border-color var(--nytte-transition),
    box-shadow var(--nytte-transition),
    transform var(--nytte-transition);
}

.nyttedyret-problem-card:hover,
.nyttedyret-content-card:hover {
  border-color: var(--wp--preset--color--leaf);
  box-shadow: var(--wp--preset--shadow--card);
  transform: translateY(-3px);
}

.nyttedyret-problem-card__icon {
  align-items: center;
  background: var(--wp--preset--color--leaf-pale);
  border-radius: 50%;
  color: var(--wp--preset--color--leaf);
  display: flex;
  font-size: 0.75rem;
  height: 2.5rem;
  justify-content: center;
  width: 2.5rem;
}

.nyttedyret-problem-card h3,
.nyttedyret-content-card h2 {
  margin-bottom: 0.5rem;
}

.nyttedyret-problem-card p:last-child,
.nyttedyret-content-card p:last-child {
  color: var(--wp--preset--color--muted);
  margin-bottom: 0;
}

.nyttedyret-trust {
  background: var(--wp--preset--color--leaf-pale);
}

.nyttedyret-trust__grid {
  gap: 0;
}

.nyttedyret-trust__grid > .wp-block-column {
  border-left: 1px solid
    color-mix(in srgb, var(--wp--preset--color--leaf) 30%, transparent);
  padding-inline: clamp(1rem, 3vw, 2.5rem);
}

.nyttedyret-trust__grid > .wp-block-column:first-child {
  border-left: 0;
  padding-left: 0;
}

.nyttedyret-trust__grid > .wp-block-column:last-child {
  padding-right: 0;
}

.nyttedyret-page,
.nyttedyret-single,
.nyttedyret-archive,
.nyttedyret-search,
.nyttedyret-not-found {
  padding-block: var(--wp--preset--spacing--2-xl);
}

.nyttedyret-page__header {
  margin-bottom: var(--wp--preset--spacing--xl);
}

.nyttedyret-content-card .wp-block-post-featured-image {
  margin: -1.4rem -1.4rem 1.4rem;
}

.nyttedyret-content-card .wp-block-post-featured-image img {
  border-radius: var(--nytte-radius-md) var(--nytte-radius-md) 0 0;
}

.nyttedyret-footer {
  margin-block-start: 0;
  padding-block: var(--wp--preset--spacing--xl);
}

.nyttedyret-footer a {
  color: inherit;
}

.nyttedyret-footer .wp-block-site-title {
  font-family: var(--wp--preset--font-family--display);
  font-size: 2rem;
  font-weight: 750;
}

.nyttedyret-footer .is-style-list-none {
  list-style: none;
  padding-left: 0;
}

.nyttedyret-footer .is-style-list-none li + li {
  margin-top: 0.4rem;
}

/* WooCommerce foundation. Exact screen styling is added template by template. */
.woocommerce .woocommerce-breadcrumb {
  color: var(--wp--preset--color--muted);
  font-size: var(--wp--preset--font-size--small);
}

.woocommerce ul.products {
  gap: 1rem;
}

.woocommerce ul.products li.product,
.wc-block-grid__product,
.wc-block-product {
  background: var(--wp--preset--color--white);
  border: 1px solid var(--wp--preset--color--border);
  border-radius: var(--nytte-radius-md);
  overflow: hidden;
  padding: 1rem;
}

.woocommerce ul.products li.product .woocommerce-loop-product__title,
.wc-block-components-product-name {
  color: var(--wp--preset--color--forest);
  font-family: var(--wp--preset--font-family--display);
  font-size: 1.125rem;
  font-weight: 700;
}

.woocommerce ul.products li.product .price,
.wc-block-components-product-price {
  color: var(--wp--preset--color--forest);
  font-family: var(--wp--preset--font-family--display);
  font-weight: 750;
}

.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button,
.wc-block-components-button {
  background: var(--wp--preset--color--forest);
  border-radius: 999px;
  color: var(--wp--preset--color--white);
  font-weight: 700;
  min-height: 2.75rem;
}

.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover,
.wc-block-components-button:hover {
  background: var(--wp--preset--color--leaf);
  color: var(--wp--preset--color--white);
}

.wc-block-cart,
.wc-block-checkout {
  padding-block: var(--wp--preset--spacing--xl);
}

.wc-block-components-sidebar-layout .wc-block-components-main,
.wc-block-components-sidebar {
  background: var(--wp--preset--color--white);
  border: 1px solid var(--wp--preset--color--border);
  border-radius: var(--nytte-radius-md);
  padding: clamp(1rem, 3vw, 2rem);
}

.nyttedyret-live-goods-note {
  background: var(--wp--preset--color--leaf-pale);
  border-left: 4px solid var(--wp--preset--color--leaf);
  border-radius: var(--nytte-radius-sm);
  color: var(--wp--preset--color--forest);
  font-size: 0.875rem;
  margin-block: 1rem;
  padding: 0.9rem 1rem;
}

@media (max-width: 900px) {
  .nyttedyret-primary-nav {
    order: 3;
  }

  .nyttedyret-hero {
    padding-block: var(--wp--preset--spacing--xl);
  }

  .nyttedyret-symptom-card {
    transform: none;
  }

  .nyttedyret-problem-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .nyttedyret-problem-grid > .wp-block-column {
    width: auto;
  }
}

@media (max-width: 781px) {
  .admin-bar .nyttedyret-header {
    top: 46px;
  }

  .nyttedyret-announcement .wp-block-group {
    justify-content: center;
  }

  .nyttedyret-announcement p:last-child {
    display: none;
  }

  .nyttedyret-header__inner {
    min-height: 4.4rem;
  }

  .nyttedyret-brand .wp-block-site-title {
    font-size: 1.3rem;
  }

  .nyttedyret-header__actions .wp-block-search {
    display: none;
  }

  .nyttedyret-hero__grid {
    gap: 2.5rem;
  }

  .nyttedyret-trust__grid > .wp-block-column {
    border-left: 0;
    border-top: 1px solid
      color-mix(in srgb, var(--wp--preset--color--leaf) 30%, transparent);
    padding: 1.25rem 0;
  }

  .nyttedyret-trust__grid > .wp-block-column:first-child {
    border-top: 0;
    padding-top: 0;
  }
}

@media (max-width: 560px) {
  .nyttedyret-problem-grid {
    grid-template-columns: 1fr;
  }

  .nyttedyret-check-list {
    display: grid;
  }

  .nyttedyret-hero__actions .wp-block-button {
    width: 100%;
  }

  .nyttedyret-hero__actions .wp-block-button__link {
    width: 100%;
  }
}

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }

  *,
  *::before,
  *::after {
    scroll-behavior: auto !important;
    transition-duration: 0.01ms !important;
  }
}

/* ---------------------------------------------------------------------------
   Footer-tilslutning
   theme.json sætter styles.spacing.blockGap til "md" (1,5rem). WordPress
   omsætter det til margin-block-start på hvert søskendeblok i .wp-site-blocks,
   inklusive <footer>. Resultatet var en 24 px kalkfarvet stribe mellem
   indholdet og den mørkegrønne footer på hver eneste side — den læste som en
   søm, ikke som luft. Footeren har sin egen indvendige polstring.
   --------------------------------------------------------------------------- */
.wp-site-blocks > footer,
.wp-site-blocks > .nyttedyret-footer {
  margin-block-start: 0;
}

/* ---------------------------------------------------------------------------
   Admin-bjælkens højde som variabel
   WordPress' #wpadminbar ligger på z-index 99999 og kan ikke overtrumfes af
   temaets overlays. Fastgjorte overlays skal derfor starte under den i stedet
   for at forsøge at lægge sig ovenpå. Bjælken er 32 px fra 783 px og opefter,
   46 px derunder — samme brydepunkt som WordPress selv bruger.
   --------------------------------------------------------------------------- */
:root {
  --nytte-admin-bar: 0px;
}

body.admin-bar {
  --nytte-admin-bar: 32px;
}

@media screen and (max-width: 782px) {
  body.admin-bar {
    --nytte-admin-bar: 46px;
  }
}

/* ---------------------------------------------------------------------------
   CH-13/S1: sidegutteren som ét token
   Auditten målte 0, 5, 16, 24, 25, 33 og 40 px sidepadding afhængigt af
   skabelon — og spring inden for samme side. Under 1024 px kollapsede
   katalog- og produktskabeloner til 0-5 px, så kort rørte skærmkanten.
   theme.json's styles.spacing.padding når ikke disse skabeloner, fordi deres
   <main> er alignfull med egen padding. Tokenet defineres derfor her og
   anvendes eksplicit på de containere, der mangler det.
   --------------------------------------------------------------------------- */
:root {
  --nytte-gutter: clamp(1.5rem, 3vw, 2rem);
}

/* ---------------------------------------------------------------------------
   CH-175: Diskrete animationer paa hele sitet
   To lag: (1) ensartet micro-interaktion paa knapper — kortene har allerede
   egne hover-loeft i deres ark; (2) scroll-reveals, hvor indhold under
   folden glider 14 px op ved foerste moede med viewporten. JS i site.js
   giver KUN elementer under folden .nytte-reveal og fjerner begge klasser
   helt efter animationen, saa elementernes egne hover-transforms gaelder
   igen — .is-revealed maa derfor aldrig blive en varig tilstand.
   --------------------------------------------------------------------------- */
.nytte-button,
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button,
.wc-block-components-button {
  transition:
    background-color var(--nytte-transition),
    border-color var(--nytte-transition),
    box-shadow var(--nytte-transition),
    color var(--nytte-transition),
    transform var(--nytte-transition);
}

.nytte-button:hover,
.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover,
.wc-block-components-button:hover {
  box-shadow: 0 6px 16px rgb(23 64 42 / 18%);
  transform: translateY(-1px);
}

.nytte-button:active,
.woocommerce a.button:active,
.woocommerce button.button:active,
.woocommerce input.button:active,
.wc-block-components-button:active {
  box-shadow: 0 2px 6px rgb(23 64 42 / 12%);
  transform: translateY(0);
}

/* Disse elementer havde hover-tilstande UDEN transition, saa farveskiftet
   hakkede ind (ejerens ord om chipsene). Basen faar samme token som
   knapperne; hover-farverne ejes fortsat af de enkelte ark. */
.nytte-pest-chip,
.nytte-content-hero__aside-link,
.nytte-quantity-step,
.nytte-variation-choice,
.nytte-mobile-nav__back,
.nytte-mobile-nav__submenu,
.nytte-search-hit,
.nytte-search-overlay__close {
  transition:
    background-color var(--nytte-transition),
    border-color var(--nytte-transition),
    box-shadow var(--nytte-transition),
    color var(--nytte-transition),
    transform var(--nytte-transition);
}

.nytte-reveal {
  opacity: 0;
  transform: translateY(14px);
  /* 0,5 s foeltes stadig som et blink, naar starten blev aedt af en travl
     main thread (ejeren 2026-08-29). 0,7/0,75 s med ease-out laeses roligt
     uden at vaere slaebende. */
  /* !important: katalog- og relaterede-kort har egne transition-regler
     med hoejere vaegt (0,2,0 senere i kaskaden), som ellers erstatter
     listen her — opacity mistede sin overgang og blinkede ind. Klassen er
     midlertidig og fjernes af site.js efter animationen, saa kortenes egne
     hover-transitions gaelder igen bagefter. */
  transition:
    opacity 0.7s ease-out var(--nytte-reveal-delay, 0ms),
    transform 0.75s cubic-bezier(0.22, 0.61, 0.36, 1) var(--nytte-reveal-delay, 0ms) !important;
}

.nytte-reveal.is-revealed {
  opacity: 1;
  transform: translateY(0);
}

/* Lazy-billeder popper ind i ET frame, naar de er hentet — det aegte
   "blink". Billeder, der endnu ikke var hentet ved JS-start, toner ind
   over 0,55 s; site.js fjerner klasserne igen efter indtoningen. */
img.nytte-lazy-fade {
  opacity: 0;
  transition: opacity 0.55s ease-out;
}

img.nytte-lazy-fade.is-loaded {
  opacity: 1;
}

@media (prefers-reduced-motion: reduce) {
  .nytte-reveal,
  img.nytte-lazy-fade {
    opacity: 1;
    transform: none;
    transition: none;
  }
}
