@charset "UTF-8";

/* ==========================================================================
   CIBHER — modern visual layer

   Loaded LAST, after mbr-additional.css. The Mobirise stylesheets are
   generated and get regenerated wholesale on every re-export, so nothing
   here belongs in them. This file is the single artifact to copy into the
   other locales (en/de/fr/es/zh).

   The generated CSS leans hard on !important, so overrides here must too.

   Scoping rule: cid classes are NOT unique across pages. cid-v9M6OLZTkQ is
   the metrics strip on index.html but a prose section on about.html. Always
   pair a cid with its block class.
   ========================================================================== */

/* Design tokens live in tokens.css, linked before this file on every page. */

/* --------------------------------------------------------------------------
   1. Canvas
   theme/css/style.css sets `section { background-color: #ffffff }` globally.
   -------------------------------------------------------------------------- */

html {
  background-color: var(--c-bg);
}

body {
  background-color: var(--c-bg) !important;
  color: var(--c-text);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

section {
  background-color: var(--c-bg);
}

/* The menu wrapper holds a position:fixed navbar — it must not paint. */
.menu.cid-v9M6OLYhsX {
  background-color: transparent !important;
}

::selection {
  background: var(--c-accent);
  color: #04140e;
}

/* --------------------------------------------------------------------------
   2. Typography
   Replaces the fixed scale and the calc() mobile ramps in mbr-additional.css.
   Negative tracking on the large headings does most of the modernization.
   -------------------------------------------------------------------------- */

.display-1 {
  font-size: clamp(2.75rem, 7vw, 5.5rem) !important;
  line-height: .95 !important;
  letter-spacing: -.035em !important;
  font-weight: 800 !important;
}

.display-2 {
  font-size: clamp(2rem, 4.5vw, 3.5rem) !important;
  line-height: 1.05 !important;
  letter-spacing: -.03em !important;
  font-weight: 800 !important;
}

.display-5 {
  font-size: clamp(1.25rem, 2vw, 1.6rem) !important;
  line-height: 1.35 !important;
  letter-spacing: -.015em !important;
  font-weight: 700 !important;
}

.display-7 {
  font-size: clamp(1rem, 1.2vw, 1.125rem) !important;
  line-height: 1.6 !important;
  letter-spacing: 0 !important;
}

.display-4 {
  font-size: .95rem !important;
  line-height: 1.5 !important;
  letter-spacing: .01em !important;
  font-weight: 600 !important;
}

/* Optical balance: strong inside a heading shouldn't add weight twice */
.mbr-section-title strong,
h1 strong,
h2 strong,
h3 strong {
  font-weight: inherit;
}

.mbr-text,
.mbr-section-subtitle {
  color: var(--c-text-dim);
}

.mbr-white {
  color: var(--c-text) !important;
}

/* --------------------------------------------------------------------------
   3. Buttons
   Every button in the markup was btn-white-outline — no primary action
   existed anywhere. .btn-cta introduces one.
   -------------------------------------------------------------------------- */

.btn {
  border-radius: 100vw !important;
  padding: 1rem 2.25rem !important;
  font-weight: 700 !important;
  letter-spacing: .01em;
  transition: background-color .25s var(--ease), border-color .25s var(--ease),
    color .25s var(--ease), transform .25s var(--ease), box-shadow .25s var(--ease);
  will-change: transform;
}

@media (max-width: 767px) {
  .btn {
    padding: .8rem 1.75rem !important;
  }
}

/* Primary — purchase actions only */
.btn-cta,
.btn-cta:active {
  background-color: var(--c-accent) !important;
  border-color: var(--c-accent) !important;
  color: #04140e !important;
  box-shadow: 0 6px 24px -8px rgba(32, 172, 125, .6);
}

.btn-cta:hover,
.btn-cta:focus,
.btn-cta.focus,
.btn-cta.active {
  background-color: var(--c-accent-2) !important;
  border-color: var(--c-accent-2) !important;
  color: #04140e !important;
  transform: translateY(-2px);
  box-shadow: 0 12px 32px -8px rgba(42, 215, 149, .55) !important;
}

/* Secondary — softened so it reads below the CTA */
.btn-white-outline,
.btn-white-outline:active {
  border-color: rgba(255, 255, 255, .28) !important;
  color: var(--c-text) !important;
  background-color: transparent !important;
}

.btn-white-outline:hover,
.btn-white-outline:focus,
.btn-white-outline.focus,
.btn-white-outline.active {
  border-color: rgba(255, 255, 255, .45) !important;
  background-color: rgba(255, 255, 255, .08) !important;
  color: #ffffff !important;
  transform: translateY(-2px);
}

/* Keyboard focus must stay visible on a dark canvas */
a:focus-visible,
.btn:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible {
  outline: 2px solid var(--c-accent-2) !important;
  outline-offset: 3px;
}

/* --------------------------------------------------------------------------
   4. Navbar — the one place translucency earns its keep
   -------------------------------------------------------------------------- */

.cid-v9M6OLYhsX .container {
  background-color: rgba(5, 56, 39, .55) !important;
  -webkit-backdrop-filter: blur(18px) saturate(1.4);
  backdrop-filter: blur(18px) saturate(1.4);
  border: 1px solid var(--c-line);
  box-shadow: 0 18px 48px -20px rgba(0, 0, 0, .8) !important;
  transition: background-color .3s var(--ease), box-shadow .3s var(--ease),
    margin-top .3s var(--ease);
}

/* Browsers without backdrop-filter get an opaque pill rather than mud */
@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
  .cid-v9M6OLYhsX .container {
    background-color: rgba(5, 56, 39, .95) !important;
  }
}

.cid-v9M6OLYhsX .navbar.is-scrolled .container {
  background-color: rgba(5, 29, 20, .82) !important;
  margin-top: .5rem;
  box-shadow: 0 20px 50px -18px rgba(0, 0, 0, .9) !important;
}

.cid-v9M6OLYhsX .navbar-nav .nav-item .nav-link {
  color: var(--c-text) !important;
  opacity: .78;
  transition: opacity .2s var(--ease), color .2s var(--ease);
}

.cid-v9M6OLYhsX .navbar-nav .nav-item .nav-link:hover,
.cid-v9M6OLYhsX .navbar-nav .nav-item .nav-link:focus {
  color: var(--c-accent-2) !important;
  opacity: 1;
}

.cid-v9M6OLYhsX .navbar-caption {
  font-weight: 800 !important;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--c-text) !important;
}

/* The locale links are peers of the real navigation, not a footnote to it:
   they keep .nav-link's size, padding and hover pill untouched, which is why
   the list they moved into still carries .nav-dropdown.

   They now sit in their own <nav aria-label="Language"> rather than sharing
   the primary <ul>, where a screen reader announced six language codes as
   top-level navigation items. Only the leading gap is ours, to mark where the
   sections end and the locales start. */
.cid-v9M6OLYhsX .navbar-lang {
  display: flex;
  align-items: center;
}

.cid-v9M6OLYhsX .navbar-lang .navbar-nav {
  margin: 0 !important;
  padding-left: 0 !important;
  flex-direction: row;
  flex-wrap: wrap;
}

@media (min-width: 992px) {
  .cid-v9M6OLYhsX .navbar-lang {
    margin-left: .75rem;
  }
}

.cid-v9M6OLYhsX .dropdown-menu {
  background: rgba(14, 26, 8, .82) !important;
  -webkit-backdrop-filter: blur(18px);
  backdrop-filter: blur(18px);
  border: 1px solid var(--c-line) !important;
}

/* --------------------------------------------------------------------------
   5. Hero
   The inline style="opacity:.5;background:#000" that used to sit on
   .mbr-overlay is gone from the markup, but mbr-additional.css still sets the
   same pair on this cid, so !important still earns its place.

   jarallax was removed with theme/js/script.js: it had no reduced-motion
   guard. The hero keeps its background image, painted straight by
   `section { background-size: cover }` in theme/css/style.css — it simply
   no longer moves. The aurora carries what motion the section has.
   -------------------------------------------------------------------------- */

.cid-v9M6OLYlJl {
  position: relative;
  overflow: hidden;
}

.cid-v9M6OLYlJl .mbr-overlay {
  opacity: 1 !important;
  background-color: transparent !important;
  background-image: linear-gradient(180deg,
      rgba(3, 18, 12, .35) 0%,
      rgba(3, 18, 12, .75) 55%,
      var(--c-bg) 100%) !important;
  z-index: 1;
}

/* Ambient aurora — the single sanctioned motion layer on the page */
.cid-v9M6OLYlJl::after {
  content: "";
  position: absolute;
  inset: -25%;
  z-index: 2;
  pointer-events: none;
  opacity: .12;
  background:
    radial-gradient(38% 44% at 22% 28%, var(--c-accent-2) 0%, transparent 62%),
    radial-gradient(34% 40% at 78% 34%, var(--c-accent) 0%, transparent 60%),
    radial-gradient(46% 50% at 55% 76%, var(--c-surface-3) 0%, transparent 66%);
  filter: blur(28px);
  animation: cib-aurora 28s ease-in-out infinite alternate;
}

@keyframes cib-aurora {
  0% {
    transform: translate3d(-3%, -2%, 0) scale(1);
  }

  50% {
    transform: translate3d(3%, 2%, 0) scale(1.08);
  }

  100% {
    transform: translate3d(-2%, 3%, 0) scale(1.03);
  }
}

.cid-v9M6OLYlJl .container-fluid {
  position: relative;
  z-index: 3;
}

.cid-v9M6OLYlJl .mbr-section-title {
  text-shadow: 0 2px 40px rgba(0, 0, 0, .5);
  max-width: 20ch;
}

.cid-v9M6OLYlJl .mbr-text {
  color: var(--c-text-dim) !important;
  max-width: 52ch;
}

/* Accent eyebrow — states what the product is, above the fold */
.cib-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: .55rem;
  margin-bottom: 1.25rem;
  padding: .45rem 1rem;
  border: 1px solid rgba(42, 215, 149, .35);
  border-radius: 100vw;
  background: rgba(32, 172, 125, .12);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  color: var(--c-accent-2);
  font-family: 'Manrope', sans-serif;
  font-size: .78rem;
  font-weight: 700;
  letter-spacing: .13em;
  text-transform: uppercase;
}

.cib-eyebrow::before {
  content: "";
  width: .45rem;
  height: .45rem;
  border-radius: 50%;
  background: var(--c-accent-2);
  box-shadow: 0 0 0 0 rgba(42, 215, 149, .7);
  animation: cib-pulse 2.4s ease-out infinite;
}

@keyframes cib-pulse {
  to {
    box-shadow: 0 0 0 .6rem rgba(42, 215, 149, 0);
  }
}

/* Hero entrance — on load, not on scroll */
.cid-v9M6OLYlJl .content-wrap > * {
  animation: cib-rise .9s var(--ease) both;
}

.cid-v9M6OLYlJl .content-wrap > *:nth-child(1) { animation-delay: .05s; }
.cid-v9M6OLYlJl .content-wrap > *:nth-child(2) { animation-delay: .15s; }
.cid-v9M6OLYlJl .content-wrap > *:nth-child(3) { animation-delay: .25s; }
.cid-v9M6OLYlJl .content-wrap > *:nth-child(4) { animation-delay: .35s; }

@keyframes cib-rise {
  from {
    opacity: 0;
    transform: translateY(22px);
  }

  to {
    opacity: 1;
    transform: none;
  }
}

/* --------------------------------------------------------------------------
   6. CTA section (index)
   The YouTube background video was removed from the markup: it cost LCP and
   set third-party cookies before consent. The existing local fallback image
   carries the section instead.
   -------------------------------------------------------------------------- */

.article13.cid-v9M6OLY38r {
  position: relative;
  background-color: var(--c-bg);
}

.article13.cid-v9M6OLY38r .mbr-fallback-image {
  opacity: .28;
  filter: saturate(.5);
}

.article13.cid-v9M6OLY38r::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, var(--c-bg) 0%, rgba(3, 18, 12, .55) 50%, var(--c-bg) 100%);
  pointer-events: none;
}

.article13.cid-v9M6OLY38r .container {
  position: relative;
  z-index: 2;
}

.article13.cid-v9M6OLY38r .card-wrapper {
  background: linear-gradient(145deg, var(--c-surface-2) 0%, var(--c-surface-1) 100%) !important;
  border: 1px solid rgba(42, 215, 149, .22);
  box-shadow: 0 40px 90px -40px rgba(0, 0, 0, .9), 0 0 70px -30px rgba(32, 172, 125, .3);
}

.article13.cid-v9M6OLY38r .card-title {
  color: var(--c-text) !important;
}

/* --------------------------------------------------------------------------
   7. Metrics strip (index only — cid is reused on about.html)
   -------------------------------------------------------------------------- */

.features023.cid-v9M6OLZTkQ {
  background-color: var(--c-bg) !important;
  padding-top: 6rem;
  padding-bottom: 4rem;
}

.features023.cid-v9M6OLZTkQ .item-wrapper {
  position: relative;
  height: 100%;
  padding: 2.5rem 1.75rem;
  background: var(--c-surface-2);
  border: 1px solid var(--c-line);
  overflow: hidden;
  transition: transform .35s var(--ease), border-color .35s var(--ease),
    box-shadow .35s var(--ease);
}

/* Light catching the top edge — cheap, effective depth cue */
.features023.cid-v9M6OLZTkQ .item-wrapper::before {
  content: "";
  position: absolute;
  top: 0;
  left: 12%;
  right: 12%;
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(42, 215, 149, .6), transparent);
}

.features023.cid-v9M6OLZTkQ .item-wrapper:hover {
  transform: translateY(-6px);
  border-color: rgba(42, 215, 149, .3);
  box-shadow: 0 30px 60px -30px rgba(0, 0, 0, .9);
}

.features023.cid-v9M6OLZTkQ .num {
  color: var(--c-accent-2) !important;
  letter-spacing: -.04em;
}

.features023.cid-v9M6OLZTkQ .card-title {
  color: var(--c-text) !important;
}

/* --------------------------------------------------------------------------
   8. About page prose (same cid, different block — see scoping rule above)
   -------------------------------------------------------------------------- */

.content5.cid-v9M6OLZTkQ {
  background-color: var(--c-bg) !important;
  padding-top: 6rem;
  padding-bottom: 6rem;
}

.content5.cid-v9M6OLZTkQ .mbr-text,
.content5.cid-v9M6OLZTkQ ul {
  color: var(--c-text-dim) !important;
  max-width: 68ch;
}

.content5.cid-v9M6OLZTkQ .mbr-section-title {
  color: var(--c-text) !important;
}

.content5.cid-v9M6OLZTkQ .mbr-section-subtitle {
  color: var(--c-accent-2) !important;
}

.content5.cid-v9M6OLZTkQ ul {
  padding-left: 0;
  list-style: none;
}

.content5.cid-v9M6OLZTkQ ul li {
  position: relative;
  padding-left: 1.75rem;
  margin-bottom: 1rem;
}

.content5.cid-v9M6OLZTkQ ul li::before {
  content: "";
  position: absolute;
  left: 0;
  top: .62em;
  width: .5rem;
  height: .5rem;
  border-radius: 50%;
  background: var(--c-accent);
}

.content5.cid-v9M6OLZTkQ ul li strong {
  color: var(--c-text);
}

/* --------------------------------------------------------------------------
   9. FAQ accordion
   -------------------------------------------------------------------------- */

.list1.cid-v9M6OLZI65 {
  background-color: var(--c-bg) !important;
}

.list1.cid-v9M6OLZI65 .card {
  background: var(--c-surface-1) !important;
  border: 1px solid var(--c-line) !important;
  border-radius: var(--r-card) !important;
  margin-bottom: .75rem;
  padding: .5rem 1.75rem;
  transition: border-color .3s var(--ease), background-color .3s var(--ease),
    transform .3s var(--ease);
}

.list1.cid-v9M6OLZI65 .card:hover {
  border-color: var(--c-line-strong) !important;
  background: var(--c-surface-2) !important;
  transform: translateY(-2px);
}

.list1.cid-v9M6OLZI65 .panel-title {
  padding: 1.35rem 0 !important;
  cursor: pointer;
}

.list1.cid-v9M6OLZI65 .panel-title-edit {
  color: var(--c-text) !important;
  transition: color .25s var(--ease);
}

.list1.cid-v9M6OLZI65 .panel-title:not(.collapsed) .panel-title-edit {
  color: var(--c-accent-2) !important;
}

.list1.cid-v9M6OLZI65 .panel-text {
  color: var(--c-text-dim) !important;
}

/* The chevron was a glyph from the theme icon font, toggled between class
   names — mbri-arrow-up / mbri-arrow-down — that the font never defined, so
   it never once flipped. It is an inline SVG now, and the rotation hangs off
   the aria-expanded the accordion already maintains, which means the visible
   state and the announced state cannot drift apart. */
.list1.cid-v9M6OLZI65 .cib-chevron {
  flex: 0 0 auto;
  color: var(--c-accent-2);
  transition: transform .35s var(--ease);
}

.list1.cid-v9M6OLZI65 .panel-title[aria-expanded="true"] .cib-chevron {
  transform: rotate(180deg);
}

@media (prefers-reduced-motion: reduce) {
  .list1.cid-v9M6OLZI65 .cib-chevron { transition: none; }
}

.list1.cid-v9M6OLZI65 .panel-body {
  padding-bottom: 1.25rem !important;
}

/* --------------------------------------------------------------------------
   10. Marquee
   The edge mask is what stops this reading as a template widget.
   -------------------------------------------------------------------------- */

.gallery10.cid-v9M6OLZiWz {
  background-color: var(--c-bg) !important;
  padding-top: 2.5rem !important;
  padding-bottom: 2.5rem !important;
  border-top: 1px solid var(--c-line);
  border-bottom: 1px solid var(--c-line);
}

.gallery10.cid-v9M6OLZiWz .container-fluid {
  -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 12%, #000 88%, transparent 100%);
  mask-image: linear-gradient(90deg, transparent 0%, #000 12%, #000 88%, transparent 100%);
}

.gallery10.cid-v9M6OLZiWz .item {
  color: var(--c-accent) !important;
  min-height: 0 !important;
  /* Monospace sets the ticker apart from Manrope and reads as "technical",
     which suits a cryptography product.
     The band lists capabilities rather than adjectives now, so the items are
     phrases and a middot separates them. That returns word-spacing to a
     normal value: a 2.75rem gap between every word would have shredded
     "Recipient verification" into two unrelated items.
     Uppercase is gone with it — it rendered macOS as MACOS, and the product
     name is not ours to restyle. */
  font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace !important;
  font-size: clamp(.95rem, 1.9vw, 1.65rem) !important;
  font-weight: 700 !important;
  letter-spacing: .02em !important;
  word-spacing: .18em;
  opacity: .85;
}

/* --------------------------------------------------------------------------
   11. Contact form
   -------------------------------------------------------------------------- */

.form5.cid-v9M6OLZdu0 {
  background-color: var(--c-bg) !important;
}

.form5.cid-v9M6OLZdu0 .form-control,
.form5.cid-v9M6OLZdu0 .form-control:focus {
  background-color: var(--c-surface-1) !important;
  border: 1px solid var(--c-line) !important;
  border-radius: .9rem !important;
  color: var(--c-text) !important;
  padding: 1.05rem 1.25rem !important;
  font-family: 'Manrope', sans-serif !important;
  font-size: 1rem !important;
  box-shadow: none !important;
  transition: border-color .25s var(--ease), background-color .25s var(--ease),
    box-shadow .25s var(--ease);
}

.form5.cid-v9M6OLZdu0 .form-control:focus {
  border-color: var(--c-accent) !important;
  background-color: var(--c-surface-2) !important;
  box-shadow: 0 0 0 4px rgba(32, 172, 125, .16) !important;
}

.form5.cid-v9M6OLZdu0 .form-control::placeholder {
  color: rgba(238, 242, 236, .42) !important;
}

.form5.cid-v9M6OLZdu0 textarea.form-control {
  min-height: 9rem;
  resize: vertical;
}

.form5.cid-v9M6OLZdu0 .mbr-section-title {
  color: var(--c-text) !important;
}

/* --------------------------------------------------------------------------
   12. Contacts + map
   This section was background-color: transparent, i.e. sitting on the white
   body, while its title and subtitle are both hardcoded #ffffff — the phone,
   email and address were rendering white-on-white and were invisible.
   A dark surface fixes the bug and removes the page's only light block.
   -------------------------------------------------------------------------- */

.contacts03.cid-v9M6OLZKeO {
  background-color: var(--c-bg) !important;
}

.contacts03.cid-v9M6OLZKeO .mbr-section-title {
  color: var(--c-text) !important;
}

.contacts03.cid-v9M6OLZKeO .mbr-section-subtitle,
.contacts03.cid-v9M6OLZKeO .mbr-text {
  color: var(--c-text-dim) !important;
  line-height: 2 !important;
}

.contacts03.cid-v9M6OLZKeO .google-map {
  border: 1px solid var(--c-line);
  border-radius: 2rem;
  overflow: hidden;
}

/* Dark-mode the Google embed so it stops being a white rectangle */
.contacts03.cid-v9M6OLZKeO .google-map iframe {
  filter: invert(.92) hue-rotate(180deg) saturate(.6) contrast(.9);
  transition: filter .4s var(--ease);
}

.contacts03.cid-v9M6OLZKeO .google-map:hover iframe {
  filter: invert(.92) hue-rotate(180deg) saturate(.85) contrast(1);
}

/* --------------------------------------------------------------------------
   13. Footer
   -------------------------------------------------------------------------- */

.footer3.cid-v9Nx6zHpzI {
  background-color: var(--c-surface-1) !important;
  border-top: 1px solid var(--c-line);
  padding-top: 3.5rem !important;
  padding-bottom: 2.5rem !important;
}

.footer3.cid-v9Nx6zHpzI .foot-menu-item a {
  color: var(--c-text-dim) !important;
  transition: color .2s var(--ease);
}

.footer3.cid-v9Nx6zHpzI .foot-menu-item a:hover {
  color: var(--c-accent-2) !important;
}

.footer3.cid-v9Nx6zHpzI .row-copirayt p {
  color: rgba(238, 242, 236, .45) !important;
  font-size: .875rem !important;
}

/* --------------------------------------------------------------------------
   14. Scroll reveal
   Elements are tagged by modern.js; nothing is hidden unless JS runs, so a
   JS failure degrades to fully visible content.
   -------------------------------------------------------------------------- */

.cib-reveal {
  opacity: 0;
  transform: translateY(18px);
  transition: opacity .7s var(--ease), transform .7s var(--ease);
}

.cib-reveal.is-in {
  opacity: 1;
  transform: none;
}

/* --------------------------------------------------------------------------
   15. Reduced motion
   -------------------------------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {

  .cid-v9M6OLYlJl::after,
  .cib-eyebrow::before,
  .cid-v9M6OLYlJl .content-wrap > * {
    animation: none !important;
  }

  .cid-v9M6OLYlJl .content-wrap > * {
    opacity: 1 !important;
    transform: none !important;
  }

  .cib-reveal {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }

  .btn:hover,
  .features023.cid-v9M6OLZTkQ .item-wrapper:hover,
  .list1.cid-v9M6OLZI65 .card:hover {
    transform: none !important;
  }

  /* modern.js strips .loop-container when this query matches, so the JS never
     lays the band out as a scrolling strip. Without that layout the markup's
     two duplicate copies stack and clip, so it is restyled as one static,
     centred line and the edge mask is dropped. */
  .gallery10.cid-v9M6OLZiWz .container-fluid {
    -webkit-mask-image: none;
    mask-image: none;
  }

  .gallery10.cid-v9M6OLZiWz .item + .item {
    display: none;
  }

  .gallery10.cid-v9M6OLZiWz .item {
    text-align: center;
    padding: 0 1.5rem;
    white-space: normal;
    transform: none !important;
  }
}

/* --------------------------------------------------------------------------
   Static location map

   Replaces the Google Maps <iframe>. The iframe reached Google on every page
   load — an IP disclosure to a third party before the visitor could object,
   which is precisely the thing a consent banner would otherwise have to ask
   about. A self-hosted OpenStreetMap raster plus a link costs one lazy image
   and keeps the page at zero third-party requests.

   The pin is drawn in CSS rather than baked into the raster so it stays sharp
   at any density and can be restyled without regenerating the image.
   -------------------------------------------------------------------------- */
.static-map a {
  position: relative;
  display: block;
  overflow: hidden;
  border-radius: var(--r-card);
  border: 1px solid var(--c-line);
  line-height: 0;
}

.static-map img {
  width: 100%;
  height: auto;
  display: block;
  /* The OSM raster is light; dim and desaturate it so it sits inside the dark
     palette instead of glaring out of it. */
  filter: saturate(.75) brightness(.82) contrast(1.05);
  transition: filter .3s var(--ease), transform .45s var(--ease);
}

.static-map a:hover img,
.static-map a:focus-visible img {
  filter: saturate(.95) brightness(.95) contrast(1.02);
  transform: scale(1.02);
}

.static-map .map-pin {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 18px;
  height: 18px;
  margin: -9px 0 0 -9px;
  border-radius: 50%;
  background: var(--c-accent-2);
  border: 3px solid #04140e;
  box-shadow: 0 0 0 6px rgba(42, 215, 149, .22);
  pointer-events: none;
}

.static-map .map-cta {
  position: absolute;
  right: .75rem;
  bottom: .75rem;
  padding: .4rem .75rem;
  border-radius: 999px;
  background: rgba(4, 20, 14, .82);
  border: 1px solid var(--c-line-strong);
  color: var(--c-text);
  font-size: .8125rem;
  line-height: 1.4;
  backdrop-filter: blur(6px);
}

@media (prefers-reduced-motion: reduce) {
  .static-map img { transition: none; }
  .static-map a:hover img { transform: none; }
}

/* --------------------------------------------------------------------------
   Language switcher — active state

   The switcher previously gave no indication of which locale you were on, so
   the only way to tell was to read the page. aria-current carries that for
   assistive tech; this makes it visible.
   -------------------------------------------------------------------------- */
.nav-lang a[aria-current="page"] {
  color: var(--c-accent-2) !important;
  font-weight: 800 !important;
  text-decoration: underline;
  text-underline-offset: .28em;
  text-decoration-thickness: 2px;
}

/* Registration identifiers under the footer copyright. Required for the
   e-Commerce Directive Art. 5 identification duty, so it must be legible —
   dimmed, not hidden. */
.foot-reg {
  display: inline-block;
  margin-top: .35rem;
  font-size: .8125rem;
  opacity: .72;
}

/* --------------------------------------------------------------------------
   Skip link

   Ported verbatim from legal.css, which already carried the correct
   off-screen -> :focus reveal, so the marketing pages and the legal
   instruments now agree on how the first tab stop behaves. Kept as one rule
   in both files rather than a shared partial: legal.css has to stay
   self-sufficient.
   -------------------------------------------------------------------------- */

.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  background: var(--c-accent, #20ac7d);
  color: var(--c-on-accent, #04140e);
  padding: .6rem 1rem;
  z-index: var(--z-skiplink, 100);
}

.skip-link:focus {
  left: .5rem;
  top: .5rem;
}

/* --------------------------------------------------------------------------
   Navbar logo

   Was an inline style="height: 3.7rem" with no width or height attribute, so
   the fixed navbar reflowed once the image decoded — layout shift on every
   page load, on all twelve pages. The intrinsic 512x512 now travels in the
   attributes and the aspect ratio reserves the box before the bytes arrive;
   width:auto keeps the rendered height authoritative.
   -------------------------------------------------------------------------- */

.cid-v9M6OLYhsX .navbar-logo-img {
  height: 3.7rem;
  width: auto;
}

/* The generated theme sets `min-width: 6rem; object-fit: cover` on this image
   (mbr-additional.css). Against the `height: 3.7rem` above that forces a
   6rem x 3.7rem box and then CROPS the source to fill it -- the logo lost
   roughly a third of its height, top and bottom, on every marketing page.
   `cover` is for photographic fills; a wordmark must never be cropped. The
   mark is now an SVG with its viewBox trimmed to the glyph, so `contain` plus
   a released min-width lets `width: auto` above stay authoritative. Same
   selector as the rule being overridden, and this file loads after it. */

.cid-v9M6OLYhsX .navbar .navbar-logo img {
  min-width: 0;
  object-fit: contain;
}

/* --------------------------------------------------------------------------
   Contact form — labels, hints, error region

   The labels used to be .visually-hidden, which left the placeholder as the
   only label: it disappears the moment anyone types, and it is not announced
   as a label at all. They are visible now, and the placeholders demoted to
   examples.
   -------------------------------------------------------------------------- */

.form5.cid-v9M6OLZdu0 .form-label {
  display: block;
  margin-bottom: .4rem;
  color: var(--c-text) !important;
  font-family: 'Manrope', sans-serif;
  font-size: .9375rem;
  font-weight: 600;
  letter-spacing: .01em;
}

.form5.cid-v9M6OLZdu0 .form-hint {
  margin: .45rem 0 0 !important;
  color: var(--c-text-dim) !important;
  font-family: 'Manrope', sans-serif;
  font-size: .8125rem;
  line-height: 1.5;
}

/* Empty until a submit is refused, so it must not reserve space or paint a
   box while it holds nothing. */
.form5.cid-v9M6OLZdu0 .form-error:empty {
  display: none;
}

.form5.cid-v9M6OLZdu0 .form-error {
  margin: 0 0 1.25rem !important;
  padding: .85rem 1.1rem;
  border: 1px solid var(--c-danger, #e0563f);
  border-radius: .9rem;
  background: var(--c-danger-surface, rgba(224, 86, 63, .12));
  color: var(--c-text) !important;
  font-family: 'Manrope', sans-serif;
  font-size: .9375rem;
  line-height: 1.5;
}

/* The privacy notice under the form inherited the theme's link colour,
   #163300 — 1.36:1 against this background, i.e. invisible. It is the link to
   the Privacy Policy in a data-protection notice, so it is the one link on the
   page that has to be found. */

.form5.cid-v9M6OLZdu0 .form-privacy-note {
  color: var(--c-text-dim) !important;
}

.form5.cid-v9M6OLZdu0 .form-privacy-note a {
  color: var(--c-accent-2) !important;
  text-decoration: underline;
  text-underline-offset: .2em;
}

/* ------------------------------------------------------------------------
   Pre-availability notice (added 2026-09-04).

   docs/STATUS.md section 4: "A surface that cannot carry a marker must not
   carry the claim", and while a spec-only row stands, "no product surface may
   state the property the unbuilt control would provide". USER_MANUAL.md carries
   that marker in its header; this site did not, and it is the higher-traffic
   surface of the two. The only build-state disclosures anywhere on the site
   were two sentences inside the privacy pages.
   ------------------------------------------------------------------------ */
.cib-availability {
  max-width: 58ch;
  margin: 0 0 1.5rem;
  padding: .75rem 1rem;
  border-left: 3px solid currentColor;
  background: rgba(0, 0, 0, .28);
  color: #fff;
  opacity: .92;
}
