/* fallback a:hover*/
a:hover {
  color: var(--umcg-color-text-on-light-hyperlink-hover);
  text-decoration: inherit;
}

.umcg-button-pagemenu:hover {
    color: var(--primitive-color-white);
}

/* fallback input text color to see liferay input fields */
input {
  color: var(--umcg-color-text-on-light-default);
}

.ae-ui .ae-container-input .ae-input {
  color: var(--umcg-color-text-on-light-default);
}

/* -----------------------------------------------------------------------------
   Liferay SearchBarPortlet styling overrides.
   Makes the portlet-rendered search look like the handoff's umcg-search
   component when it lives inside a .umcg-search wrapper (e.g. header-ds
   fragment). Scoped to .umcg-search so other search-bar placements on the
   site are not affected.
----------------------------------------------------------------------------- */

/* Flatten all Liferay/Bootstrap wrappers so the form and its input+button
   become effectively direct children of .umcg-search.
   Also reset position on input-group-inset-item wrappers: Clay by default
   uses position:absolute; right:0 on these to overlay the button *inside*
   the input's padding-right. We want the button as a plain flex sibling. */
.umcg-search .portlet-boundary,
.umcg-search .portlet,
.umcg-search .portlet-content,
.umcg-search .portlet-content-container,
.umcg-search .portlet-body,
.umcg-search .lfr-tooltip-scope,
.umcg-search .input-group-item,
.umcg-search .input-group-inset-item,
.umcg-search .input-group-inset-item-after,
.umcg-search .input-group-inset-item-before,
.umcg-search .autofit-float,
.umcg-search .autofit-row,
.umcg-search .autofit-col {
  display: contents;
  position: static;
}

/* Hide Liferay's portlet-header chrome inside search ("Search Bar" label, etc.) */
.umcg-search .portlet-header,
.umcg-search .portlet-topper,
.umcg-search .portlet-title-text {
  display: none;
}

.umcg-carousel-portlet .portlet-title-text {
  display: none;
}

/* Form = umcg-search__form. Remove any default form margins/padding. */
.umcg-search form {
  margin: 0;
  padding: 0;
  width: 100%;
}

/* The outer + inner .input-group become the flex row that matches __field. */
.umcg-search .input-group {
  display: flex;
  flex-direction: row;
  align-items: stretch;
  width: 100%;
  margin: 0;
  padding: 0;
}

.umcg-search.umcg-header__search-control {
  gap: 0;
}

/* Input = umcg-search__input + umcg-search__input-wrap combined.
   Bordered, rounded on the left, flex:1. order:1 forces it before the button
   regardless of any Clay source-order or absolute positioning. */
.umcg-search .search-bar-keywords-input,
.umcg-search input.form-control[name="q"] {
  box-sizing: border-box;
  order: 1;
  flex: 1 1 auto;
  min-width: 0;
  position: static;
  float: none;
  height: var(--umcg-search-control-size);
  padding-inline: calc(var(--umcg-spacing) * 4);
  margin: 0;
  border: 1px solid var(--umcg-color-surface-secondary-300);
  border-right: none;
  border-top-left-radius: var(--umcg-radius-default);
  border-bottom-left-radius: var(--umcg-radius-default);
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
  background-color: var(--umcg-color-surface-cards-blue-light);
  color: var(--umcg-color-text-on-light-default);
  font-size: var(--umcg-font-size-base);
  line-height: var(--umcg-line-height-base);
  font-weight: var(--umcg-font-weight-light);
  letter-spacing: var(--umcg-tracking-wide);
  outline: none;
  box-shadow: none;
}

.umcg-search .search-bar-keywords-input::placeholder,
.umcg-search input.form-control[name="q"]::placeholder {
  color: var(--umcg-color-text-on-light-placeholder);
  opacity: 1;
}

.umcg-search .search-bar-keywords-input:focus,
.umcg-search input.form-control[name="q"]:focus {
  outline: none;
  box-shadow: none;
}

/* Submit button = umcg-button-header--search. Fixed 52×52, rounded right,
   same blue-light background. order:2 + position:static + float:none ensure
   it ends up on the right edge of the flex row, overriding any Clay
   absolute-positioning that would normally overlay it inside the input. */
.umcg-search form button[type="submit"],
.umcg-search .btn[type="submit"] {
  order: 2;
  flex: 0 0 auto;
  flex-shrink: 0;
  box-sizing: border-box;
  position: static;
  float: none;
  width: var(--umcg-search-control-size);
  height: var(--umcg-search-control-size);
  padding: 0;
  margin: 0;
  border: 1px solid var(--umcg-color-surface-secondary-300);
  border-left: none;
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
  border-top-right-radius: var(--umcg-radius-default);
  border-bottom-right-radius: var(--umcg-radius-default);
  background-color: var(--umcg-color-surface-cards-blue-light);
  color: var(--umcg-color-text-on-light-default-alt);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

/* Override the Liferay Lexicon search icon with the handoff's umcg-icon
   search-glass (24×24 viewBox, stroke-based, 1.5 stroke-width). Hide the
   original Lexicon SVG and paint the handoff icon via CSS mask on ::before
   so it inherits currentColor automatically for hover/focus states. */
.umcg-search form button[type="submit"] .lexicon-icon,
.umcg-search .btn[type="submit"] .lexicon-icon {
  display: none;
}

.umcg-search form button[type="submit"]::before,
.umcg-search .btn[type="submit"]::before {
  content: "";
  display: block;
  width: 24px;
  height: 24px;
  background-color: currentColor;
  -webkit-mask-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"><path d="M11 19a8 8 0 1 1 0-16 8 8 0 0 1 0 16Z" stroke="black" stroke-width="1.5"/><path d="M21 21l-4.35-4.35" stroke="black" stroke-linecap="round" stroke-width="1.5"/></svg>');
          mask-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"><path d="M11 19a8 8 0 1 1 0-16 8 8 0 0 1 0 16Z" stroke="black" stroke-width="1.5"/><path d="M21 21l-4.35-4.35" stroke="black" stroke-linecap="round" stroke-width="1.5"/></svg>');
  -webkit-mask-size: contain;
          mask-size: contain;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-position: center;
          mask-position: center;
}

/* Hover / focus state — mirrors umcg-search[data-search-state=active] */
.umcg-search:hover .search-bar-keywords-input,
.umcg-search:focus-within .search-bar-keywords-input,
.umcg-search:hover input.form-control[name="q"],
.umcg-search:focus-within input.form-control[name="q"] {
  border-color: var(--umcg-color-surface-secondary-500);
  background-color: var(--umcg-color-surface-neutral-white);
}

.umcg-search:hover form button[type="submit"],
.umcg-search:focus-within form button[type="submit"],
.umcg-search:hover .btn[type="submit"],
.umcg-search:focus-within .btn[type="submit"] {
  border-color: var(--umcg-color-surface-secondary-500);
  background-color: var(--umcg-color-button-secondary-hover);
}

/* Replace Clay's light-blue .btn focus ring with the DS focus ring, matching
   .umcg-button-header:focus-visible (handoff umcg-search__submit). */
.umcg-search form button[type="submit"]:focus,
.umcg-search .btn[type="submit"]:focus {
  outline: none;
  box-shadow: none;
}

.umcg-search form button[type="submit"]:focus-visible,
.umcg-search .btn[type="submit"]:focus-visible {
  border-radius: var(--umcg-radius-focus);
  outline: 2px solid var(--umcg-color-border-focus-on-light-alt);
  box-shadow: none;
}

/* Hide Liferay internal hidden inputs (formDate, emptySearchEnabled, scope)
   that would otherwise force flex-box to add whitespace gaps. */
.umcg-search input[type="hidden"] {
  display: none;
}

/* -----------------------------------------------------------------------------
   Liferay search-bar-suggestions dropdown overrides for header-ds.
   - Hides the "Suggesties" subheader Liferay renders at the top of the list.
   Scoped to .umcg-search so other search placements remain untouched.
----------------------------------------------------------------------------- */

.umcg-search .dropdown-subheader {
  display: none;
}

.search-bar-suggestions-dropdown-menu .search-bar-suggestions-results-list .dropdown-subheader {
  display: none;
}

.search-bar-suggestions-dropdown-menu .search-bar-suggestions-show-more {
  display: none;
}

.umcg-search a.search-bar-suggestions-show-more:hover,
.umcg-search button.search-bar-suggestions-show-more:hover {
  color: var(--umcg-color-text-on-light-hyperlink-hover);
}

/* -----------------------------------------------------------------------------
   Re-style Liferay's search-bar-suggestions dropdown to match the handoff
   .umcg-search__panel + .umcg-reference look.
   - Panel: white bg, rounded, padded, shadowed (mirrors .umcg-search__panel).
   - Inner list: flex column with gap (mirrors .umcg-search__suggestions).
   - Each .dropdown-item: small medium-weight hyperlink with a leading arrow
     icon via ::before mask (mirrors .umcg-reference + .umcg-reference__icon).
   - .suggestion-item-description: hidden (not part of the handoff design).

   Specificity .search-bar-suggestions-dropdown-menu ... beats
   Bootstrap/Clay defaults (.dropdown-menu, .dropdown-item) without
   !important.
----------------------------------------------------------------------------- */

/* Panel — literal shadow value because --umcg-search-panel-shadow-local is
   scoped to .umcg-search (design-system-embedded), and Liferay portals the
   dropdown to <body>, outside that scope. */
.search-bar-suggestions-dropdown-menu {
  border: none;
  border-radius: var(--umcg-radius-default);
  background-color: var(--umcg-color-surface-neutral-white);
  padding: calc(var(--umcg-spacing) * 4);
  box-shadow: 1px 1px 16px 0 #0031831a;
  /* Liferay portals this dropdown to <body>, so it competes for stacking at
     the document root. The mobile-search overlay (.umcg-header__mobile-search-
     overlay) is position:fixed; z-index:100, so a z-index of 10 would render
     the suggestions *behind* the open overlay — invisible on mobile while the
     desktop search (no overlay) showed them fine. Sit above the overlay. */
  z-index: 200;
}

/* Inner list — flex column with gap */
.search-bar-suggestions-dropdown-menu .search-bar-suggestions-results-list,
.search-bar-suggestions-dropdown-menu .list-unstyled {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: calc(var(--umcg-spacing) * 2);
  list-style: none;
  margin: 0;
  padding: 0;
}

/* Suggestion link — .umcg-reference visual */
.search-bar-suggestions-dropdown-menu a.dropdown-item {
  display: inline-flex;
  align-items: center;
  gap: var(--umcg-space-scale-200);
  width: auto;
  padding: 0;
  background: transparent;
  color: var(--umcg-color-text-on-light-hyperlink);
  text-decoration: none;
  font-size: var(--umcg-font-size-sm);
  line-height: var(--umcg-line-height-sm);
  font-weight: var(--umcg-font-weight-medium);
  white-space: normal;
}

.search-bar-suggestions-dropdown-menu a.dropdown-item:hover,
.search-bar-suggestions-dropdown-menu a.dropdown-item:focus {
  color: var(--umcg-color-text-on-light-hyperlink-hover);
  background: transparent;
  text-decoration: none;
}

/* Leading arrow icon — mirrors .umcg-reference__icon-wrap > svg.umcg-icon */
.search-bar-suggestions-dropdown-menu a.dropdown-item::before {
  content: "";
  display: inline-block;
  flex: 0 0 auto;
  width: calc(var(--umcg-spacing) * 4);
  height: calc(var(--umcg-spacing) * 4);
  background-color: currentColor;
  -webkit-mask-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10.8333 10.8333" fill="none"><path d="M5.41667 10.0833L10.0833 5.41667L5.41667 0.75M10.0833 5.41667L0.75 5.41667" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>');
          mask-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10.8333 10.8333" fill="none"><path d="M5.41667 10.0833L10.0833 5.41667L5.41667 0.75M10.0833 5.41667L0.75 5.41667" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>');
  -webkit-mask-size: 12px 12px;
          mask-size: 12px 12px;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-position: center;
          mask-position: center;
}

/* Title — mirrors .umcg-reference__label. Inherit color from the parent
   <a> so it picks up the hyperlink + hover colors set on .dropdown-item
   (otherwise Bootstrap/Clay applies its own dark text on the inner div). */
.search-bar-suggestions-dropdown-menu .search-bar-suggestions-results-list .suggestion-item-title {
  color: var(--umcg-color-text-on-light-hyperlink);
  font-size: var(--umcg-font-size-sm);
  line-height: var(--umcg-line-height-sm);
  font-weight: var(--umcg-font-weight-medium);
}

.search-bar-suggestions-dropdown-menu .search-bar-suggestions-results-list .suggestion-item-title:hover {
  color: var(--umcg-color-text-on-light-hyperlink-hover);
}

/* Description — not part of the handoff design, hide it. */
.search-bar-suggestions-dropdown-menu .suggestion-item-description {
  display: none;
}

/* -----------------------------------------------------------------------------
   Loading-state styling for .input-group-inset-item-after.

   Clay's defaults override. When Liferay swaps
   the submit button for a <span class="inline-item"> with a spinner during
   keyword auto-suggest, the user sees that grey box around the spinner —
   completely off-style from the umcg-search look.

   Override with the umcg-search button visual: blue-light bg, secondary-300
   border, rounded right, 52×52 box. The submit-button styling further up
   (lines 106-130) sits visually on top of this when present.
----------------------------------------------------------------------------- */
.umcg-search .input-group .input-group-inset-item-after {
  display: flex;
  align-items: center;
  justify-content: center;
  order: 2;
  flex: 0 0 auto;
  box-sizing: border-box;
  width: var(--umcg-search-control-size);
  height: var(--umcg-search-control-size);
  margin: 0;
  padding: 0;
  border: 1px solid var(--umcg-color-surface-secondary-300);
  border-left: none;
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
  border-top-right-radius: var(--umcg-radius-default);
  border-bottom-right-radius: var(--umcg-radius-default);
  background-color: var(--umcg-color-surface-cards-blue-light);
  color: var(--umcg-color-text-on-light-default-alt);
  outline: none;
  box-shadow: none;
}

/* Suppress focus outline / box-shadow on the inner spinner span and the
   loading-animation itself — Clay applies focus styling that reads as a
   blue box around the loader when the search input is focused. */
.umcg-search .input-group .input-group-inset-item-after,
.umcg-search .input-group .input-group-inset-item-after:focus,
.umcg-search .input-group .input-group-inset-item-after:focus-within,
.umcg-search .input-group .input-group-inset-item-after .inline-item,
.umcg-search .input-group .input-group-inset-item-after .loading-animation {
  outline: none;
  box-shadow: none;
}

.umcg-search .input-group .input-group-inset-item-after .loading-animation {
  width: 16px;
  height: 16px;
}

.umcg-search .input-group .input-group-inset-item-after .loading-animation::before {
  display: none;
}


/* -----------------------------------------------------------------------------
   SiteNavigationMenuPortlet inside .umcg-main-menu / .umcg-mainmenu:
   flatten the portlet chrome so the ADT's <nav class="umcg-mainmenu">...</nav>
   output is not wrapped by Liferay portlet boxes that would break flex layout.
----------------------------------------------------------------------------- */
.umcg-main-menu .portlet-boundary,
.umcg-main-menu .portlet,
.umcg-main-menu .portlet-content,
.umcg-main-menu .portlet-content-container,
.umcg-main-menu .portlet-body,
.umcg-main-menu .autofit-float,
.umcg-main-menu .autofit-row,
.umcg-main-menu .autofit-col {
  display: contents;
}

.umcg-main-menu .portlet-header,
.umcg-main-menu .portlet-topper,
.umcg-main-menu .portlet-title-text {
  display: none;
}

.umcg-footer .portlet-header,
.umcg-footer .portlet-topper,
.umcg-footer .portlet-title-text {
  display: none;
}

/* -----------------------------------------------------------------------------
   Header-DS open-menu offset in edit mode.
   Both the main-menu overlay and the mobile-search overlay are
   position:fixed; inset:0; z-index:100, so they would cover the Liferay
   page-editor control bar at the top and intercept its clicks. Push them
   down only while the page editor is active, so the editor's toolbar stays
   accessible while previewing/using the open menu or mobile search. Scoped to
   .has-edit-mode-menu (page-edit mode only) rather than .has-control-menu, so
   a logged-in user merely *viewing* a page keeps the overlay full-bleed. */
body.has-edit-mode-menu .umcg-main-menu__overlay,
body.has-edit-mode-menu .umcg-header__mobile-search-overlay {
  top: 100px;
}

/* -----------------------------------------------------------------------------
   ReadSpeaker integration in header-ds.

   webReader.js loads a runtime CSS skin (?skin=readspeakerButton) that
   styles .rsbtn / .rsbtn_play / .rsbtn_exp / .rsbtn_player_item with
   defaults that conflict with the DS look. To override without !important,
   we use higher-specificity selectors via .umcg-header__readspeaker.rsbtn …
   (0,3,0) — beats ReadSpeaker's typical .rsbtn … (0,2,0).

   Visual approach — modeled after themes/umcg-website-theme/src/components/
   elements/readspeaker-button/_readspeaker-button.scss but adapted to DS
   variables:
   - Play-link blijft visueel een DS .umcg-button-header--secondary;
     reset ReadSpeaker's bg/border/padding zodat DS-button-styling doorslaat.
   - Speaker bar (.rsbtn_exp) absoluut gepositioneerd onder de knop.
   - Player-buttons (.rsbtn_player_item) als button-group met verticale
     separators, witte achtergrond, hover-state.
----------------------------------------------------------------------------- */

/* Wrapper: positioning anchor + reset van ReadSpeaker's `.rsbtn` defaults
   (height: 28px, font-size: 10px, box-sizing: content-box, margin-bottom: 10px,
   text-align: left, z-index: 1).

   Specificity 0,3,0 (drie chained classes) beats ReadSpeaker's `.rsbtn` (0,1,0)
   en zijn `.rs_addtools.rsbtn` of `.rsbtn.readspeakerbutton` varianten (0,2,0).

   `display` blijft NIET geset — daarmee komt de responsive show/hide van
   `.umcg-header__action--mobile/--desktop` (mobile: none, desktop: inline-flex)
   door. (NB: in DS <=1.0.0 heette deze hook `.umcg-header__secondary-action`;
   vanaf de DS 3.0.0 / embedded-1.3.0 migratie is dat `.umcg-header__action`.) */
.umcg-header__action.umcg-header__readspeaker.rsbtn {
  position: relative;
  margin: 0;
  padding: 0;
  text-align: inherit;
  box-sizing: border-box;
  height: auto;
  width: auto;
  font-size: inherit;
  line-height: inherit;
  font-family: inherit;
  color: inherit;
}

/* Hide ReadSpeaker UI-elementen die we in DS niet willen tonen.
   !important is hier noodzakelijk omdat ReadSpeaker via inline style="..."
   de display van deze elementen toggle't bij user-interactie (bv. tooltoggle
   gaat aan/uit op hover, toolpanel verschijnt op tooltoggle-klik). Inline
   styles verslaan externe CSS regels — alleen !important wint daarvan. */
.umcg-header__readspeaker.rsbtn .rsbtn_tooltoggle,
.umcg-header__readspeaker.rsbtn .rsbtn_toolpanel {
  display: none !important;
}

/* Forceer DS .umcg-button-header + --secondary styling op de play-link.
   Specificity bump 0,3,0 → 0,5,0 door de DS-button-classes mee te chainen
   op .rsbtn_play. Beats ReadSpeaker's class-chain rules zoals
   .readspeakerbutton.rsbtn.mega_toggle .rsbtn_play (0,4,0) die ná klik
   actief worden wanneer ReadSpeaker extra classes aan de wrapper toevoegt.

   Waardes komen uit design-system-embedded-1.3.0.css (.umcg-button-header +
   .umcg-button-header--secondary). LET OP de tekstkleur: --secondary heeft in
   1.3.0 twee color-declaraties; de laatste wint en zet `color` op
   --umcg-color-text-on-light-default-alt (= primitive-color-blue-700), NIET op
   --umcg-color-text-on-light-default (= zwart). Daarom hier de -alt token. */
.umcg-header__readspeaker.rsbtn .rsbtn_play.umcg-button-header.umcg-button-header--secondary {
  cursor: pointer;
  justify-content: center;
  align-items: center;
  gap: var(--umcg-space-sm);
  border: 0;
  border-radius: var(--umcg-radius-default);
  padding-inline: var(--umcg-space-lg);
  padding-block: var(--umcg-space-sm);
  font-size: var(--umcg-font-size-base);
  line-height: var(--umcg-line-height-base);
  font-weight: var(--umcg-font-weight-medium);
  font-family: var(--umcg-font-family-base);
  display: inline-flex;
  background-color: var(--umcg-color-button-secondary-default);
  color: var(--umcg-color-text-on-light-default-alt);
  text-decoration: none;
  box-shadow: none;
}

.umcg-header__readspeaker.rsbtn .rsbtn_play.umcg-button-header.umcg-button-header--secondary:hover,
.umcg-header__readspeaker.rsbtn .rsbtn_play.umcg-button-header.umcg-button-header--secondary:focus {
  background-color: var(--umcg-color-button-secondary-hover);
  text-decoration: none;
}

.umcg-header__readspeaker.rsbtn .rsbtn_play.umcg-button-header.umcg-button-header--secondary:active {
  background-color: var(--umcg-color-button-secondary-active);
}

/* Mobiel: net als de andere icon-only header-acties (Translate, zoeken) moet
   de Voorlezen-knop een 44×44 vierkant zijn. De embedded regel
   `.umcg-header__action { width:44px; height:44px; padding:0 }` zit op de
   WRAPPER, maar bij ReadSpeaker is de zichtbare knop de .rsbtn_play <a> (de
   wrapper is platgereset naar width/height:auto). Zonder deze regel houdt
   .rsbtn_play z'n brede padding-inline en wordt het een pill i.p.v. vierkant.
   Daarom hier het vierkant op .rsbtn_play zelf — alleen op de --mobile-knop;
   de --desktop-knop houdt de bredere knop met zichtbaar label.
   Specificity 0,6,0 wint van de basis .rsbtn_play-regel (0,5,0). */
.umcg-header__action--mobile.umcg-header__readspeaker.rsbtn .rsbtn_play.umcg-button-header.umcg-button-header--secondary {
  width: 44px;
  height: 44px;
  min-height: 0;
  padding: 0;
}

/* ReadSpeaker's skin gebruikt `.rsbtn a, .rsbtn span` om typography (color,
   font-size, font-family, font-weight, line-height) op alle inner elementen
   van .rsbtn af te dwingen. Voor de play-link (en zijn children) willen wij
   de DS-typography. Onze .rsbtn_play-rule hierboven zet die op het <a>;
   we laten alle descendants (de label-span, icon-wrap-span, en de <div> die
   lfr-editable rendert) ervan erven via `inherit`. Specificity 0,5,0
   beats ReadSpeaker's `.rsbtn span` (0,1,1). */
.umcg-header__readspeaker.rsbtn .rsbtn_play.umcg-button-header.umcg-button-header--secondary * {
  color: inherit;
  font-size: inherit;
  font-family: inherit;
  line-height: inherit;
  text-transform: inherit;
  text-decoration: inherit;
}

/* Het label inside .rsbtn_play heeft in DS --secondary een lichter font-weight.
   ReadSpeaker voegt `aria-hidden="true"` toe aan children en kan ze via zijn
   skin proberen te verbergen — we resetten daarom visibility/opacity/position/
   sr-only-clipping zodat ons label niet wordt weggeknepen.

   BELANGRIJK: zet hier GEEN `display`. DS regelt de label-zichtbaarheid
   responsive — `.umcg-header__action .umcg-button-header__label` is
   `display:none` op mobiel (header-acties zijn dan icon-only) en
   `display:inline` op desktop. Door display vrij te laten blijft die logica
   intact: de mobiele Voorlezen-knop toont alleen het icoon, de desktop-knop
   icoon + label. (Eerder forceerde deze regel `display:inline-block`, waardoor
   het label óók op mobiel verscheen en de icon-only-variant niet werd gebruikt.) */
.umcg-header__readspeaker.rsbtn .rsbtn_play .umcg-button-header__label,
.umcg-header__readspeaker.rsbtn .rsbtn_play .umcg-button-header__label[aria-hidden="true"] {
  font-weight: var(--umcg-font-weight-light);
  letter-spacing: var(--umcg-tracking-wide);
  visibility: visible;
  opacity: 1;
  position: static;
  width: auto;
  height: auto;
  margin: 0;
  padding: 0;
  overflow: visible;
  clip: auto;
  clip-path: none;
  white-space: normal;
}

/* Idem voor de icon-wrap. */
.umcg-header__readspeaker.rsbtn .rsbtn_play .umcg-button-header__icon-wrap,
.umcg-header__readspeaker.rsbtn .rsbtn_play .umcg-button-header__icon-wrap[aria-hidden="true"] {
  display: inline-flex;
  visibility: visible;
  opacity: 1;
  position: static;
  width: auto;
  height: auto;
}

/* De inner <div> die door lfr-editable wordt gerendered binnen de label-span:
   forceer inline-display zodat hij niet als blok onder het icoon valt. */
.umcg-header__readspeaker.rsbtn .rsbtn_play .umcg-button-header__label > div,
.umcg-header__readspeaker.rsbtn .rsbtn_play .umcg-button-header__label > span {
  display: inline;
  margin: 0;
  padding: 0;
}

/* Speaker bar — absoluut onder de knop. */
.umcg-header__readspeaker.rsbtn .rsbtn_exp {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  z-index: 100;
  height: auto;
  width: auto;
  padding: 0;
  background: transparent;
  border: 0;
}

/* Specificity bump 0,5,0 om ReadSpeaker's `.rsbtn.rsexpanded .rsbtn_exp
   .rsbtn_exp_inner` (0,4,0) te beat'en. Onze wrapper heeft na klik altijd
   .umcg-header__action + .umcg-header__readspeaker + .rsbtn +
   .rsexpanded, dus die chain matched 1-op-1. */
.umcg-header__action.umcg-header__readspeaker.rsbtn.rsexpanded .rsbtn_exp_inner {
  display: inline-flex;
  flex-wrap: nowrap;
  align-items: stretch;
  top: 0;
  height: auto;
  background-color: var(--umcg-color-surface-neutral-white);
  border: 1px solid var(--umcg-color-surface-secondary-300);
  border-radius: var(--umcg-radius-default);
  box-shadow: 1px 1px 16px 0 #0031831a;
}

/* Player-buttons als button-group: gelijkmatige hoogte, witte achtergrond,
   verticale separators tussen, rounded corners op eerste/laatste. */
.umcg-header__readspeaker.rsbtn .rsbtn_player_item {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background-color: var(--umcg-color-surface-neutral-white);
  border: 0;
  padding: 0 calc(var(--umcg-spacing) * 4);
  height: 40px;
  line-height: 1;
  color: var(--umcg-color-text-on-light-default);
  cursor: pointer;
  font-family: inherit;
  font-size: var(--umcg-font-size-sm);
}

.umcg-header__readspeaker.rsbtn .rsbtn_player_item:hover {
  background-color: var(--umcg-color-surface-cards-blue-light);
  color: var(--umcg-color-text-on-light-default);
}

.umcg-header__readspeaker.rsbtn .rsbtn_player_item:focus-visible {
  outline: 2px solid var(--umcg-color-border-focus-on-light-alt);
  outline-offset: -2px;
  z-index: 1;
}

/* Verticale separator tussen player-buttons (niet vóór de eerste). */
.umcg-header__readspeaker.rsbtn .rsbtn_player_item + .rsbtn_player_item::before {
  content: "";
  position: absolute;
  left: 0;
  top: calc(var(--umcg-spacing) * 2);
  bottom: calc(var(--umcg-spacing) * 2);
  width: 1px;
  background-color: var(--umcg-color-surface-secondary-300);
}

/* Eerste en laatste player-button matchen de rounded corners van de card. */
.umcg-header__readspeaker.rsbtn .rsbtn_exp_inner > .rsbtn_player_item:first-child {
  border-top-left-radius: var(--umcg-radius-default);
  border-bottom-left-radius: var(--umcg-radius-default);
}

.umcg-header__readspeaker.rsbtn .rsbtn_player_item.rsbtn_closer {
  border-top-right-radius: var(--umcg-radius-default);
  border-bottom-right-radius: var(--umcg-radius-default);
}

/* Verberg tekst-labels naast de iconen — icons-only player-row. */
.umcg-header__readspeaker.rsbtn .rsbtn_btnlabel {
  display: none;
}

/* Loading-progress balk: ReadSpeaker zet `style="left: -150px; display: block;"`
   inline via JS. We willen hem niet zichtbaar (loose progress-bar buiten de
   speaker bar). !important nodig om inline display: block te overrulen. */
.umcg-header__readspeaker.rsbtn .rs-player-loadindicator {
  display: none !important;
}

/* Status-overlay (error-meldingen zoals "Fout opgetreden, probeer nogmaals")
   blijft zichtbaar — belangrijk voor gebruikersfeedback. */
.umcg-header__readspeaker.rsbtn .rsbtn_status_overlay {
  padding: calc(var(--umcg-spacing) * 2);
  font-size: var(--umcg-font-size-sm);
  color: var(--umcg-color-text-on-light-default);
}

/* Volume- en speed-dropdown sliders: ReadSpeaker plakt deze als verticale
   sliders boven de bijbehorende button. Laat ze hun eigen styling
   behouden (default ReadSpeaker chrome is acceptabel voor deze dropdowns). */

/* -----------------------------------------------------------------------------
   Skip-links (umcg-ds-theme/portal_normal.ftl).
   Toegankelijkheid: het eerste tabbare element op de pagina is een verborgen
   link die op focus zichtbaar wordt en focus verplaatst naar de
   <div id="umcg-rs-reading-container"> in de drop-zone-master-ds fragment.

   We linken bewust naar onze eigen container i.p.v. Liferay's automatisch
   ge-emit'de <a id="main-content">, zodat editors kunnen kiezen waar de
   skip-link landt (= waar de master-page-content begint).
----------------------------------------------------------------------------- */
.umcg-skip-links {
  position: relative;
  z-index: 6000;
}

.umcg-skip-links__link {
  position: absolute;
  left: -10000px;
  top: auto;
  width: 1px;
  height: 1px;
  overflow: hidden;
  background-color: var(--umcg-color-bg-on-light-default, #fff);
  border: 1px solid var(--umcg-color-text-on-light-hyperlink, #003a73);
  color: var(--umcg-color-text-on-light-hyperlink, #003a73);
  padding: calc(var(--umcg-spacing) * 3) calc(var(--umcg-spacing) * 4);
  border-radius: var(--umcg-radius-default, .25rem);
  font-size: 1rem;
  text-decoration: underline;
}

.umcg-skip-links__link:active,
.umcg-skip-links__link:focus,
.umcg-skip-links__link:focus-visible {
  position: absolute;
  left: calc(var(--umcg-spacing) * 4);
  top: calc(var(--umcg-spacing) * 4);
  width: auto;
  height: auto;
  overflow: visible;
  outline: 2px solid var(--umcg-color-text-on-light-hyperlink, #003a73);
  outline-offset: 2px;
  z-index: 6001;
}

.umcg-slider__item .umcg-slider__media picture {
    display: flex;
    justify-content: center;
}

/* -----------------------------------------------------------------------------
   Rich-text table styling (paragraph-ds / lead-ds).

   The DS embedded CSS reset (`*, ::before, ::after { border: 0 solid }`)
   wipes the browser-default borders off WYSIWYG-inserted <table> markup.
   .umcg-rich-text currently has no rules for raw tables, so editor-emitted
   tables render as unstyled blocks without grid lines.

   Project-local override until the upstream DS adds .umcg-rich-text table
   rules. Scoped to .umcg-rich-text so the structural .umcg-table BEM
   component is not affected.
----------------------------------------------------------------------------- */
.umcg-rich-text table {
  width: 100%;
  border-collapse: collapse;
  border: 1px solid var(--umcg-color-surface-table-head);
}

.umcg-rich-text table th,
.umcg-rich-text table td {
  padding: calc(var(--umcg-spacing) * 2) calc(var(--umcg-spacing) * 3);
  border: 1px solid var(--umcg-color-surface-table-head);
  text-align: left;
  vertical-align: top;
}

.umcg-rich-text table th {
  font-weight: var(--umcg-font-weight-semibold);
}

/* -----------------------------------------------------------------------------
   Hide Asset Publisher full-content header chrome on DS-migrated pages.

   Liferay's AssetPublisher (display style "Volledige inhoud weergeven") emits
   a `.component-title.h4` wrapper containing a `.header-back-to` arrow link
   above the article body. This sits outside the ADT and is not configurable
   per-page, so we strip it via CSS for DS-styled articles.
----------------------------------------------------------------------------- */
.default-asset-publisher .component-title.h4 {
  display: none;
}

/* -----------------------------------------------------------------------------
   Responsive visibility helpers
   Gebruikt o.a. door umcg.nl-templates die een sectie als accordion op mobiel
   tonen en als flat text_block op desktop (MobieleWeergaveVoorSectie='accordeon').
   Breakpoint is gelijk aan de DS-standaard (>=1024px = desktop).
----------------------------------------------------------------------------- */
.umcg-only-mobile {
  display: block;
}
.umcg-only-desktop {
  display: none;
}
@media (min-width: 1024px) {
  .umcg-only-mobile {
    display: none;
  }
  .umcg-only-desktop {
    display: block;
  }
}

/* -----------------------------------------------------------------------------
   Rich-text afbeeldingen met component-styling (UMCGDEV-1110)
   De HtmlContentTransformer injecteert bij afbeeldingen in webcontent-rich-text
   de image-ds fragmentstructuur (figure.umcg-image > picture/img +
   span.umcg-image__source + figcaption). Binnen .umcg-rich-text winnen de
   generieke figure-regels uit de embedded CSS (display: flex, hogere
   specificiteit) echter van .umcg-image; herstel hier de component-look:
   grid met bron-overlay onderin beeld en de beeldverhouding-varianten.
----------------------------------------------------------------------------- */
.umcg-rich-text .umcg-image__source {
  color: var(--umcg-color-text-on-light-default-alt);
  font-size: var(--umcg-font-size-xs);
  font-weight: var(--umcg-font-weight-regular);
  line-height: var(--umcg-line-height-xs);

}

.umcg-rich-text figure.umcg-image {
  display: grid;
}
.umcg-rich-text figure.umcg-image > img,
.umcg-rich-text figure.umcg-image > picture {
  grid-area: 1 / 1;
  aspect-ratio: 16 / 9;
}
.umcg-rich-text figure.umcg-image > img,
.umcg-rich-text figure.umcg-image > picture > img {
  object-fit: cover;
  height: 100%;
}
.umcg-rich-text figure.umcg-image > figcaption {
  grid-column: 1;
}
.umcg-rich-text figure.umcg-image[data-image-ratio='16:10'] > img,
.umcg-rich-text figure.umcg-image[data-image-ratio='16:10'] > picture {
  aspect-ratio: 16 / 10;
}
.umcg-rich-text figure.umcg-image[data-image-ratio='16:9'] > img,
.umcg-rich-text figure.umcg-image[data-image-ratio='16:9'] > picture {
  aspect-ratio: 16 / 9;
}
.umcg-rich-text figure.umcg-image[data-image-ratio='4:3'] > img,
.umcg-rich-text figure.umcg-image[data-image-ratio='4:3'] > picture {
  aspect-ratio: 4 / 3;
}
.umcg-rich-text figure.umcg-image[data-image-ratio='1:1'] > img,
.umcg-rich-text figure.umcg-image[data-image-ratio='1:1'] > picture {
  aspect-ratio: 1;
}
.umcg-rich-text figure.umcg-image[data-image-ratio='2:3'] > img,
.umcg-rich-text figure.umcg-image[data-image-ratio='2:3'] > picture {
  aspect-ratio: 2 / 3;
}


/* -----------------------------------------------------------------------------
   Contact-panel: redacteurs-<h2> in het rich-text-veld stylen als __title
   De umcg.nl DS-templates vullen het contact-panel van de hero met één
   rich-text-veld (HeroTekstBlok) en onderdrukken de aparte
   umcg-contact__title (contact_title=""). Een door de redacteur getypte <h2>
   in dat veld valt daardoor terug op de generieke .umcg-rich-text h2
   (font-size-h2) — veel te groot. Geef zo'n h2 dezelfde typografie als
   .umcg-contact--default .umcg-contact__title (handoff hero-contact-panel
   3.0.1). Specificiteit (0,2,1) wint van .umcg-rich-text h2 (0,1,1),
   onafhankelijk van laadvolgorde.
----------------------------------------------------------------------------- */
.umcg-contact--default .umcg-contact__content h2 {
  width: 100%;
  color: var(--umcg-color-text-on-light-heading);
  font-size: var(--umcg-font-size-lg);
  line-height: var(--umcg-line-height-h4);
  font-weight: var(--umcg-font-weight-medium);
}

/* Quote — overflow-wrap houdt de quotetekst binnen de quote;
   max-width: fit-content houdt de foto rond. */
.umcg-quote__text {
  overflow-wrap: anywhere;
}

.umcg-quote .umcg-quote__media .umcg-quote__image {
  max-width:fit-content;
}


/* In edit-mode klikken doorlaten naar de editables onder de stretched-link
   overlay van de klikbare kaart. */
body.has-edit-mode-menu .umcg-quote--link .umcg-quote__link::before {
  pointer-events: none;
}



/* -----------------------------------------------------------------------------
   Cookie-notice: geen flash bij paginaload
   Het paneel rendert zonder hidden-attribuut en wordt door de DS-CSS dus
   direct getoond. Houd het verborgen tot behaviors.js het enhanced heeft;
   die beslist in dezelfde synchrone slag over tonen of verbergen.
----------------------------------------------------------------------------- */
.umcg-cookie-notice-advanced[data-cookie-notice]:not([data-cookie-notice-enhanced='true']) {
  display: none;
}

.umcg-section-background-blue {
  padding: var(--umcg-space-scale-600);
  border-radius: var(--umcg-radius-default);
  background-color: var(--umcg-color-surface-cards-blue-light);
}

@media (min-width: 768px) {
  .umcg-section-background-blue {
    padding: var(--umcg-space-scale-1000);
  }
}

/* -----------------------------------------------------------------------------
   Legacy button cta-button-darkblue is hardcoded in rich-text content. Override the DS embedded button styling
----------------------------------------------------------------------------- */
.umcg-rich-text {
  a.button.cta-button-darkblue {
    display: inline-flex;
    align-items: center;
    gap: var(--umcg-space-scale-200);
    max-width: 100%;
    border-radius: var(--umcg-radius-default);
    padding-inline: var(--umcg-space-lg);
    padding-block: var(--umcg-space-sm);
    font-size: var(--umcg-font-size-sm);
    line-height: var(--umcg-line-height-sm);
    font-weight: var(--umcg-font-weight-medium);
    background-color: var(--umcg-color-button-secondary-default);
    color: var(--umcg-color-text-on-light-hyperlink);
    text-decoration-line: none;
    cursor: pointer;
  }

  @media (hover: hover) {
    .button.cta-button-darkblue:hover {
      background-color: var(--umcg-color-button-secondary-hover);
      color: var(--umcg-color-text-on-light-hyperlink-hover);
      text-decoration-line: underline;
      text-decoration-thickness: 1px;
      text-underline-offset: 0.08em;
    }
  }

  .button.cta-button-darkblue:active {
    background-color: var(--umcg-color-button-secondary-active);
  }

  .button.cta-button-darkblue:focus-visible {
    color: var(--umcg-color-text-on-light-default);
    outline: 2px solid var(--umcg-color-border-focus-on-light-alt);
    outline-offset: -2px;
    border-radius: 2px;
  }

  .button.cta-button-darkblue[aria-disabled='true'] {
    pointer-events: none;
    color: var(--umcg-color-text-on-light-default);
    opacity: var(--umcg-opacity-disabled);
  }
}