
/* =============================================================================================
   heuristica.pt — supplemental styles.
   The site's own Bridge stylesheets are present and do the design. This file covers only what
   this restore added: the rebuilt hero carousel and the authored pages' blocks.
   ============================================================================================= */
:root {
  --heu-brand: #FFA000;
  --heu-brand-dark: #EE7E00;
  --heu-link: #A85800;
  --heu-cream: #F9E7CC;
  --heu-ink: #33322F;
  --heu-body: #5F5C57;
  --heu-line: #E7E4DE;
}

/* ---------- the logo, which Bridge hides in CSS and reveals from JavaScript ----------------- */
/* stylesheet.min.css ships `.q_logo a{display:block;visibility:hidden}` and default.min.js makes
   it visible once it has measured the image and sized the header. In a static restore that reveal
   never completes, so every one of the 76 pages renders with an empty gap where the logo should
   be — the most visible defect on the site, and one no link check, byte count or style gate can
   see: the file is present, correctly referenced, and loads. This restores the end state the
   theme's own script would have produced, and leaves Bridge's own responsive rules to decide
   WHICH logo variant (normal / light / dark / sticky / mobile) is shown at each width. */
/* Bridge's script also sets the anchor's height to the header's and lets the image fill it; with
   only `visibility` restored the logo sat on the header's bottom edge and spilled into the hero.
   Centring it in the wrapper reproduces the intended result at any header height. */
.q_logo a { visibility: visible !important; }
.logo_wrapper { display: flex !important; align-items: center; width: auto !important; }
.q_logo { display: flex; align-items: center; height: 100%; }
.q_logo a { display: flex !important; align-items: center; height: 100% !important;
  width: auto !important; }
.q_logo img { height: auto !important; width: auto !important; max-height: 74%; }
@media (max-width: 1000px) { .q_logo img { max-height: 42px; } }

/* NOTE — do not take Bridge's closed dropdown panels out of layout.
   They are `visibility:hidden; opacity:0` but still laid out, which makes any nav measurement
   read 27 links over 15 rows instead of the real 8 links over 1 row, and it keeps 17 invisible
   links in the tab order. Setting `display:none` on the closed state was tried and reverted: the
   theme's own script measures and positions the wide "Serviços" panel at load, so with the panel
   display:none it computed a 38px-tall box hanging 129px past the right edge of the viewport.
   The mechanism belongs to the theme; the measurement artefact is recorded in the delivery note
   instead. */

/* ---------- burger tap target --------------------------------------------------------------- */
/* Bridge renders the burger as a bare 19px icon. It works, but 19px is well under the ~44px a
   thumb needs, and it is the only navigation on a phone. Padding it out changes nothing visually
   and makes it reliably tappable. */
.mobile_menu_button span {
  display: inline-flex !important; align-items: center; justify-content: center;
  min-width: 44px; min-height: 44px;
}

/* ---------- rebuilt hero carousel ---------------------------------------------------------- */
/* Every slide is absolutely positioned, so the section needs its own stage height: with the
   first slide in flow the hero collapsed to the height of one line of text (284px) and cropped
   its own headline. */
.heu-hero { position: relative; overflow: hidden; background: #2F2E2B;
  min-height: clamp(340px, 38vw, 560px); }
.heu-hero__track { position: absolute; inset: 0; }
.heu-hero__slide {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  opacity: 0; transition: opacity .6s ease; padding: 40px 70px; text-align: center;
  background-size: cover; background-position: center;
}
.heu-hero__slide.is-active { opacity: 1; z-index: 2; }
.heu-hero__slide::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(0,0,0,.10) 0%, rgba(0,0,0,.28) 100%);
}
.heu-hero__slide > * { position: relative; z-index: 2; }
.heu-hero__inner { max-width: 980px; margin: 0 auto; }
.heu-hero .heu-hero__title, .heu-hero .heu-hero__lead {
  color: #fff; text-shadow: 0 3px 12px rgba(0,0,0,.42); margin: 0 0 14px;
  font-family: 'Poppins', 'Raleway', sans-serif;
}
.heu-hero .heu-hero__title { font-weight: 800; font-size: clamp(2rem, 5.2vw, 4rem); line-height: 1.06; }
.heu-hero .heu-hero__lead { font-weight: 300; font-size: clamp(1.05rem, 2.6vw, 2.1rem); line-height: 1.25; }
.heu-hero .heu-hero__cta {
  display: inline-block; margin-top: 10px; padding: 13px 34px; border: 2px solid #fff;
  border-radius: 34px; color: #fff; font-family: 'Poppins', sans-serif; font-weight: 600;
  font-size: 14px; letter-spacing: .6px; background: rgba(255,255,255,.08);
}
.heu-hero .heu-hero__cta:hover { background: #fff; color: var(--heu-link); }
.heu-hero__nav {
  position: absolute; top: 50%; transform: translateY(-50%); z-index: 5;
  width: 48px; height: 48px; border-radius: 50%; border: 0; background: rgba(255,255,255,.85);
  color: var(--heu-ink); display: flex; align-items: center; justify-content: center;
  cursor: pointer; font-size: 20px; line-height: 1; transition: background .16s, transform .16s;
}
.heu-hero__nav:hover { background: #fff; transform: translateY(-50%) scale(1.06); }
.heu-hero__nav--prev { left: 18px; }
.heu-hero__nav--next { right: 18px; }
.heu-hero__dots { position: absolute; left: 0; right: 0; bottom: 22px; z-index: 5;
  display: flex; justify-content: center; gap: 9px; }
.heu-hero__dot { width: 11px; height: 11px; border-radius: 50%; border: 2px solid #fff;
  background: transparent; padding: 0; cursor: pointer; }
.heu-hero__dot.is-active { background: #fff; }
@media (max-width: 700px) {
  /* At 390px the arrows sat at 50% height — exactly across the slide's own subtitle. Drop them
     to the bottom corners, beside the dots, where they cross nothing. */
  .heu-hero__slide { padding: 26px 16px 72px; min-height: 320px; }
  .heu-hero__nav { width: 38px; height: 38px; font-size: 16px; top: auto; bottom: 14px;
    transform: none; }
  .heu-hero__nav:hover { transform: none; }
  .heu-hero__nav--prev { left: 12px; }
  .heu-hero__nav--next { right: 12px; }
  .heu-hero__dots { bottom: 26px; }
}

/* ---------- authored pages ----------------------------------------------------------------- */
.heu-pagehead {
  background: linear-gradient(120deg, var(--heu-cream) 0%, #FDF4E4 55%, #FFF9F0 100%);
  border-bottom: 1px solid var(--heu-line); padding: 44px 0 40px;
}
.heu-pagehead h1 { margin: 0; font-size: clamp(1.7rem, 3.4vw, 2.5rem); font-weight: 800; color: var(--heu-ink); }
.heu-crumbs { font-size: 13px; color: #6B6459; margin: 0 0 8px; }
.heu-crumbs a { color: #8C4A00; text-decoration: underline; text-underline-offset: 2px; }
.heu-crumbs span { color: #7C756A; margin: 0 6px; }
.heu-postdate { margin: 8px 0 0; font-size: 13.5px; color: #7C756A; }

.heu-authored { max-width: 860px; margin: 0 auto; padding: 40px 0 10px; }
.heu-authored h1 { display: none; }
.heu-authored h2 { margin-top: 2rem; }
.heu-authored ul { margin: 0 0 1.4rem; padding-left: 1.15rem; }
.heu-authored li { margin-bottom: .5rem; }
.heu-authored li::marker { color: var(--heu-brand); }
.heu-kicker { font-family: 'Poppins', sans-serif; font-size: 12.5px; font-weight: 700;
  letter-spacing: 1.4px; text-transform: uppercase; color: var(--heu-link); margin: 0 0 6px; }
.heu-lead { font-size: 1.1rem; line-height: 1.7; color: var(--heu-ink); }
.separator.small { display: block; width: 60px; height: 3px; background: var(--heu-brand);
  border: 0; border-radius: 2px; margin: 16px 0 24px; }

.heu-grid { display: grid; gap: 22px; margin: 26px 0 8px; }
.heu-grid--3 { grid-template-columns: repeat(auto-fit, minmax(268px, 1fr)); }
.heu-card { display: flex; flex-direction: column; gap: 8px; border: 1px solid var(--heu-line);
  border-radius: 12px; padding: 24px; background: #fff;
  transition: box-shadow .2s, transform .2s, border-color .2s; }
.heu-card:hover { box-shadow: 0 6px 26px rgba(51,50,47,.10); transform: translateY(-3px);
  border-color: #E2D7C2; }
.heu-card h3 { margin: 0; font-size: 1.12rem; }
.heu-card h3 a { color: var(--heu-ink); }
.heu-card:hover h3 a { color: var(--heu-link); }
.heu-card p { margin: 0; font-size: 14.6px; color: var(--heu-body); }
.heu-card__more { margin-top: auto; padding-top: 10px; font-family: 'Poppins', sans-serif;
  font-size: 12.5px; font-weight: 700; letter-spacing: .6px; text-transform: uppercase; }
.heu-card__more a { color: var(--heu-link); }

.heu-cta { margin: 40px 0 0; padding: 30px 32px; border-radius: 14px;
  background: linear-gradient(120deg, var(--heu-cream), #FFF6E8);
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 18px; }
.heu-cta h3 { margin: 0 0 4px; color: var(--heu-ink); }
.heu-cta p { margin: 0; color: var(--heu-body); }
.heu-cta .qbutton + .qbutton { margin-left: 10px; }
@media (max-width: 640px) {
  .heu-cta { flex-direction: column; align-items: flex-start; }
  .heu-cta .qbutton + .qbutton { margin: 8px 0 0; }
}

.heu-authored .blog_holder article { border: 1px solid var(--heu-line); border-radius: 10px;
  padding: 24px 26px; margin-bottom: 22px; background: #fff; }
.heu-authored .blog_holder article h2 { margin-top: 0; font-size: 1.3rem; }
.heu-authored .blog_holder article h2 a { color: var(--heu-ink); }
.heu-authored .blog_holder article h2 a:hover { color: var(--heu-link); }
.heu-authored .post_info { font-size: 12.5px; color: #8A837A; text-transform: uppercase;
  letter-spacing: .5px; margin-bottom: 8px; }
.heu-authored .post_more { font-family: 'Poppins', sans-serif; font-size: 12.5px;
  font-weight: 700; text-transform: uppercase; letter-spacing: .6px; color: var(--heu-link); }

/* contact surfaces */
.heu-formnote { background: var(--heu-cream); border-left: 4px solid var(--heu-brand);
  padding: 14px 18px; border-radius: 4px; margin: 0 0 22px; font-size: 14.5px; color: var(--heu-ink); }
.heu-formnote a { font-weight: 700; color: var(--heu-link); }
.heu-mapwrap { margin: 26px 0 10px; }
/* The map. It was an openstreetmap.org/export/embed.html IFRAME until 2026-08-18 - a live
   third-party request on a page whose own /politica-de-cookies/ described it as such - and is now
   a picture this site hosts. Same box: 380px tall (420px under 700px, see below), full column
   width. object-fit:cover crops the one centred image to the desktop and phone shapes alike, so
   the Centro stays on the middle pixel and nothing under the map moves. */
a.heu-map { width: 100%; height: 380px; border: 1px solid var(--heu-line);
  border-radius: 12px; display: block; overflow: hidden; }
a.heu-map img { width: 100%; max-width: 100%; height: 100%; object-fit: cover; display: block;
  border: 0; }
.heu-note { font-size: 14px; color: #8A837A; }
.heu-hours { margin: 26px 0; }
.heu-hours table { max-width: 460px; width: 100%; border-collapse: collapse; }
.heu-hours th, .heu-hours td { border: 1px solid var(--heu-line); padding: 9px 12px; text-align: left; }
.heu-hours th { width: 60%; font-weight: 600; background: #FBF8F3; }
@media (max-width: 700px) { a.heu-map { height: 300px; } }

/* the two legal pages are reachable from the copyright bar of every page;
   the bar is dark, so the links inherit its colour and only gain an underline. */
.footer_bottom .heu-legal {
  margin: 4px 0 0;
  font-size: 13px;
  line-height: 1.6;
}
.footer_bottom .heu-legal a {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
}
.footer_bottom .heu-legal a:hover {
  color: var(--heu-brand);
}
.footer_bottom .heu-legal span {
  opacity: .5;
  padding: 0 4px;
}


/* ---------- corrections from the independent visual review ---------------------------------- */
/* The authored pages centred their 860px column inside the theme's container while the H1 in the
   beige band above sits at the container's left edge — a visible 120px step on exactly the pages
   we wrote. Align the column left; the max-width still keeps the measure readable. */
.heu-authored { margin-left: 0; margin-right: auto; }

/* Bridge lays its text-editor lists out with the marker inside the box, so a wrapped item's
   continuation line starts left of its own bullet (visible on /protocolos/, whose partner list
   wraps in a two-column layout). Hanging indent is what a list is supposed to do. */
.elementor-text-editor ul, .elementor-text-editor ol {
  list-style-position: outside;
  padding-left: 1.3em;
  margin-left: 0;
}
.elementor-text-editor ul li, .elementor-text-editor ol li { padding-left: 0; }

/* On blog posts the beige band now carries only the breadcrumb, because the template prints the
   title and date again a few pixels below it. 44px of padding around one 13px line looked like a
   mistake. */
.heu-pagehead--crumbs { padding: 15px 0 13px; }
.heu-pagehead--crumbs .heu-crumbs { margin: 0; }

/* At 390px the OSM embed was short enough that the attribution strip wrapped to three lines and
   covered the bottom of the map. Height alone did not clear it: the strip wraps on WIDTH, and the
   embed was only 280px wide because the theme's container_inner (45px) and Elementor's widget-wrap
   (10px) each take a gutter. Let the map alone step outside both gutters to a 16px inset of the
   viewport — measured from the viewport, so it does not depend on either gutter staying the size
   it is today. */
@media (max-width: 700px) {
  a.heu-map { height: 420px; }
  .heu-mapwrap { width: calc(100vw - 32px); margin-left: calc(50% - 50vw + 16px); }
  a.heu-map { border-radius: 8px; }
}

/* The band above painted as two cream stripes with a white block punched through the middle on all
   71 interior pages: Bridge's stylesheet gives `.container` an opaque white background, and the
   band's own child .container covered the gradient everywhere except the band's top and bottom
   padding. The band owns its background; its layout wrappers must not paint one. */
.heu-pagehead .container,
.heu-pagehead .container_inner { background: transparent; }

/* Elementor centres the ⊘ check icon against the WHOLE list item, so on a phone — where five of
   the twelve items in "Em que áreas … pode ajudar?" wrap — the icon sat beside the item's second
   line and the first line hung unmarked. Align the icon to the top of the item and give it the
   text's own line box, so its glyph centres on the FIRST line at any width. */
/* Linked items nest the icon inside an <a> that is itself a centring flex row, so both boxes have
   to be re-aligned — /programa-be-better/ is the page that proves it. */
.elementor-icon-list-item,
.elementor-widget .elementor-icon-list-item a { align-items: flex-start; }
.elementor-icon-list-item .elementor-icon-list-icon { align-self: flex-start; }
.elementor-icon-list-item .elementor-icon-list-icon i { line-height: inherit; }
.elementor-icon-list-icon + .elementor-icon-list-text { align-self: flex-start; }

/* The homepage teaser cards sit inside an Elementor text-editor, whose own <p> rules would
   otherwise fight the card's. */
.elementor-text-editor .heu-grid { margin: 26px 0 6px; }
.elementor-text-editor .heu-card p { margin: 0; }

/* The hypnotherapy lead photo sits in an Elementor image widget whose theme rule leaves the
   <img> at an arbitrary intrinsic width; in a 50% column that rendered a 165px thumbnail beside
   a full-height paragraph. Make the lead photo fill its column. */
.elementor-image.heu-leadmedia { margin: 0 0 26px; }
.elementor-image.heu-leadmedia img {
  width: 100% !important; max-width: 100% !important; height: auto !important;
  max-height: 330px; object-fit: cover; object-position: center 42%;
  display: block; border-radius: 8px;
}
@media (max-width: 700px) { .elementor-image.heu-leadmedia img { max-height: 210px; } }

/* The restored COMUNICAR+ photo is the only tile in the /outros-servicos/ grid whose source is a
   300x300 crop, so it rendered inset and narrower than its eight neighbours. Make it sit on the
   same left edge and fill the same column width. */
.elementor-element-250e492 .elementor-image { text-align: left; }
.elementor-element-250e492 .elementor-image img { width: 100%; height: auto; display: block; }


/* ---------- round-4 corrections -------------------------------------------------------------- */

/* Every post card on /blogue/ and on the three month archives was 54px wider than the column that
   holds it: Bridge sizes `.blog_holder article` at width:100% under its global content-box sizing,
   so the card's own 26px side padding and 1px border were ADDED to the column width (at 390 the
   column is 300px and the card measured 354px). The right border, the rounded right corner and the
   right padding all fell outside the phone viewport and the excerpt ran into the screen edge.
   No gate could see it: html/body clip the excess, so documentElement.scrollWidth stayed at exactly
   390 and the overflow check passed. Make the card measure its declared width including its own
   padding — the theme's own blog templates rely on border-box for the same reason. */
.heu-authored .blog_holder article { box-sizing: border-box; }

/* The authored pages had no vertical rhythm: Bridge's reset zeroes every margin
   (`stylesheet.min: …,p,…{margin:0}`) and the theme restores paragraph spacing only for its own
   post body, `.single-post .blog_single p{margin-bottom:22px}`. Our column never matched that, so
   `.heu-authored p` computed 0/0 and legal paragraphs on /politica-de-cookies/ ran together, while
   `.heu-authored h3` computed margin-top 0 and every section heading sat glued to the paragraph
   above it. Only h2 had been given a top margin (2rem, above). Reuse the site's OWN two numbers —
   22px between paragraphs, 2rem above a section heading — so the authored pages read like the
   theme-rendered posts beside them. */
.heu-authored p { margin-bottom: 22px; }
.heu-authored h3 { margin-top: 2rem; }

/* …but the composed blocks inside that same column set their own spacing and must keep it: the
   kicker sits tight above its rule, card and CTA bodies are laid out by flex, and the listing cards
   place their excerpt and "Ler mais" line themselves. Margin-TOP is never touched here, because
   `.heu-card__more` uses `margin-top:auto` to stay on the card's bottom edge. */
.heu-authored .heu-kicker { margin-bottom: 6px; }
.heu-authored .heu-card p,
.heu-authored .heu-cta p,
.heu-authored .blog_holder p { margin-bottom: 0; }
.heu-authored .heu-card h3,
.heu-authored .heu-cta h3 { margin-top: 0; }


/* ---------- round-5 corrections --------------------------------------------------------------- */

/* The footer scroll control is now a <button> rather than an <a href="#"> the theme cancelled —
   see js/heuristica-backtotop.js. Bridge styles it by id and draws the circle on the child span, so
   all that is needed here is to take the user-agent button chrome off it; every one of the theme's
   own rules still applies. */
#back_to_top {
  -webkit-appearance: none;
  appearance: none;
  background: none;
  border: 0;
  padding: 0;
  font: inherit;
  text-align: center;
  cursor: pointer;
}

/* Bridge hides the control with `visibility:hidden` under a `transition: all .3s`, and `visibility`
   is a discrete property: the element does not leave the page when the class changes, it leaves
   300ms later at the end of the fade. For those 300ms it is transparent, still laid out and still a
   live click target over the bottom-right corner of every page. Take it out of the pointer's reach
   for the whole time it is invisible, which is what the theme meant and what the transition
   prevented. */
#back_to_top:not(.on) {
  pointer-events: none;
}

/* ...and when it is pressed it has done its job, so it withdraws at once rather than fading for
   another 300ms as a control that can no longer change anything. */
#back_to_top.heu-btt-retired {
  visibility: hidden;
  opacity: 0;
  pointer-events: none;
  transition: none;
}

/* ===========================================================================================
   Round 6 — the located defects from _recon/visual_heuristica.pt.json
   =========================================================================================== */

/* 1. SABER MAIS did not sit on the baseline of its card.
   `.heu-card__more { margin-top: auto }` above is beaten by `.heu-card p { margin: 0 }` — both are
   specificity 0-1-1 and the shorthand wins on source order, so the CTA computed margin-top:0px on
   all 26 cards and landed at three different heights inside one row of /servicos/. One class more
   on the left of the selector settles it without touching either rule. */
.heu-card .heu-card__more { margin-top: auto; }

/* 2. A heading had no space under it. The theme zeroes heading margins, so on the authored pages
   (policies, /blogue/) a section title sat 0px from the paragraph or list it introduces while the
   paragraphs around it sat 22px apart — the tightest space on the page. Scoped to .heu-authored so
   the card and CTA headings, which set their own margins deliberately, are untouched. */
.heu-authored h2 { margin-bottom: .75rem; }
.heu-authored .blog_holder article h2 { margin-bottom: .5rem; }

/* 3. The close button of the archived Popup Maker modal hung 2px off the right edge of a 390
   viewport. Popup Maker's lightbox theme parks it at right:-13px, deliberately overlapping the
   modal's corner — which is fine at 1440, where it lands 420px inside the edge, and 2px too far at
   phone width. Bring it back to the corner on small screens only; the desktop overlap is the
   archive's own design and stays. */
@media (max-width: 480px) {
  .pum-theme-607 .pum-content + .pum-close,
  .pum-theme-lightbox .pum-content + .pum-close { right: 0px; }
}

/* 4. THE ELEMENTOR PER-PAGE STYLESHEETS NO ARCHIVE HOLDS.
   Elementor writes each section's background and each widget's typography into
   wp-content/uploads/elementor/css/post-<id>.css. Thirteen built pages carry an
   `elementor elementor-<id>` body class whose stylesheet is in neither web.archive.org nor
   arquivo.pt (_raw/heuristica.pt/_assets.json records ok:false for 41, 43, 45, 383, 390, 495,
   500, 280, 1284, 1460, 1729, 1736, 1753), so their sections render with no band and no centring.

   These are not invented. Every one of the six booking sections below declares
   `"background_background":"classic"` in its own data-settings — the page asked for a background
   colour that only the lost file carried — and three surviving witnesses (post-47, post-57,
   post-419) write that block identically: #F6F6F6, 50px top and bottom, the title centred in
   Noto Serif 28px at #FFB400. The rules are reproduced here in Elementor's own selector form,
   keyed on each page's real element ids, so the booking band reads the same on a page that kept
   its stylesheet and a page that lost it. */
.elementor-43 .elementor-element.elementor-element-cfcf56c:not(.elementor-motion-effects-element-type-background),
.elementor-41 .elementor-element.elementor-element-e7770f5:not(.elementor-motion-effects-element-type-background),
.elementor-45 .elementor-element.elementor-element-de1fcfe:not(.elementor-motion-effects-element-type-background),
.elementor-383 .elementor-element.elementor-element-d459760:not(.elementor-motion-effects-element-type-background),
.elementor-390 .elementor-element.elementor-element-e93ad14:not(.elementor-motion-effects-element-type-background),
.elementor-1284 .elementor-element.elementor-element-6e55980:not(.elementor-motion-effects-element-type-background) {
  background-color: #F6F6F6;
}
.elementor-43 .elementor-element.elementor-element-cfcf56c,
.elementor-41 .elementor-element.elementor-element-e7770f5,
.elementor-45 .elementor-element.elementor-element-de1fcfe,
.elementor-383 .elementor-element.elementor-element-d459760,
.elementor-390 .elementor-element.elementor-element-e93ad14,
.elementor-1284 .elementor-element.elementor-element-6e55980 {
  transition: background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s;
  padding: 50px 0px 50px 0px;
}
.elementor-43 .elementor-element.elementor-element-b8cc603,
.elementor-41 .elementor-element.elementor-element-495b2a8,
.elementor-45 .elementor-element.elementor-element-ad7011e,
.elementor-383 .elementor-element.elementor-element-84dfccb,
.elementor-390 .elementor-element.elementor-element-ea4ee70,
.elementor-1284 .elementor-element.elementor-element-3fd053e {
  text-align: center;
  color: #FFB400;
  font-family: "Noto Serif", Sans-serif;
  font-size: 28px;
}

/* 4b. /bebetter/'s orphaned section is the one stretched section on the site that asks for NO
   background (its data-settings carry stretch_section alone), so it gets no band — but stretched
   sections run edge to edge, and with the lost padding its two paragraphs started 10px from the
   phone's edge while everything above them started at 45px. Restore the page's own gutter at
   phone width; the desktop measurement was already within 20px of its neighbours and is left
   exactly as the archive renders it. */
@media (max-width: 767px) {
  .elementor-1460 .elementor-element.elementor-element-acbccb8 > .elementor-container {
    padding-left: 45px;
    padding-right: 45px;
  }
}

/* 5. The content pass gave 29 pages their own photograph from the archive. The letterbox rule
   above (`max-height: 330px`) was written for ONE 1240x680 banner; nearly every archived
   photograph on this site is a square 1080x1080 WordPress crop, and clipping a square to 330px
   in a 980px column shows its middle third — a shirt where a person should be. The files are now
   pre-cropped to 16:9 by o4_heu_images3.py, so this class simply stops the second crop and lets
   the picture display at its own aspect. */
.elementor-image.heu-leadmedia.heu-photo img {
  max-height: 430px;
}
.elementor-image.heu-leadmedia.heu-photo + .heu-note,
.elementor-image.heu-leadmedia.heu-photo ~ .heu-note {
  margin-top: -14px;
  font-style: italic;
}

/* 6. The content pass added prose to three Elementor pages that had none. Inside an Elementor
   text-editor widget the theme zeroes every paragraph and heading margin (that is how it keeps
   card copy tight), so the new sections rendered as one unbroken 14px block running the full
   1080px container — 250 characters per line, with headings glued to the text under them. Give
   the pass the same measure and rhythm as the pages we authored by hand: 860px, 22px between
   paragraphs, real space above a heading. */
.elementor-text-editor.heu-prose { max-width: 860px; }
.elementor-text-editor.heu-prose p { margin: 0 0 22px; }
.elementor-text-editor.heu-prose h2 { margin: 2.4rem 0 .9rem; }
.elementor-text-editor.heu-prose h3 { margin: 2rem 0 .8rem; }
.elementor-text-editor.heu-prose ul { margin: 0 0 1.4rem; padding-left: 1.15rem; }
.elementor-text-editor.heu-prose li { margin-bottom: .5rem; }
.elementor-text-editor.heu-prose li::marker { color: var(--heu-brand); }
.elementor-text-editor.heu-prose .heu-kicker { margin-bottom: 6px; }
.elementor-text-editor.heu-prose .heu-lead { margin-bottom: 24px; }

/* On /servicos/curiosamente-sabia-que/ the widget container is a FLEX box, so the photo block
   became a flex item and shrank to its intrinsic 600px inside a 1100px column while the caption
   under it ran full width. Every other page's container is block, which is why it only showed on
   one page. Make the block claim its column in both layouts. */
.elementor-image.heu-leadmedia.heu-photo { width: 100%; align-self: stretch; }

/* 7. On /a-nossa-equipa/ the ten profile rows are Elementor "content-middle" sections, so each
   column is centred against the other. With a long biography the text column is the taller of the
   two and the name lands level with the top of the portrait, which is how eight of the ten read.
   The two shortest biographies - Maria do Carmo Castanheira and Sandra Conceicao - are shorter
   than their photograph, so centring pushed the name 60-90px down and left a hole beside the top
   of the face. Top-align this page's rows: the eight that already looked top-aligned do not move,
   and the two that did not now match them. Scoped by the page's own Elementor id so no other
   content-middle section on the site is touched. */
.elementor-537 .elementor-section-content-middle > .elementor-container > .elementor-row {
  align-items: flex-start;
}
.elementor-537 .elementor-section-content-middle .elementor-column-wrap {
  justify-content: flex-start;
}

/* 8. THE POST TITLE IS NOW THE PAGE'S <h1> AND MUST NOT LOOK LIKE ONE.
   The 11 theme-rendered blog posts had no <h1> at all: Bridge renders a single post's title as
   <h2 class="entry_title">, so those pages started at heading level 2 and offered a crawler or a
   screen reader no top-level heading. Promoting the tag fixes the semantics — and changed the
   appearance, because the size does NOT come from .entry_title (whose only rules in this theme are
   :hover and .sticky descendants) but from the theme's bare `h2` element rule. As an <h1> the title
   jumped 24px/600 -> 32px/700 and the two-line phone version grew 100px -> 160px tall.
   Restore the measured original exactly: 24px, weight 600, line-height 33.2308px (= 24 x 1.38462,
   the theme's own ratio). Scoped to .entry_title so no other heading on the site is touched.
   Verified with _scripts/_heu_r8_style.js at 1440 and 390 on three posts before and after. */
.entry_title,
h1.entry_title {
  font-size: 24px;
  font-weight: 600;
  line-height: 1.38462;
  letter-spacing: 1px;
}
/* The date chip inside the title is greyed by `.blog_holder article .post_text h2 .date`, a
   selector qualified on the TAG, so it turned the same near-black as the title the moment the
   title stopped being an h2 and the date stopped reading as a date. Same colour, class-scoped.
   Both differences (this and the 1px tracking above) were measured, not guessed: _heu_r8_h2cmp.js
   clones the title as an h2 next to the real h1 and diffs the two computed styles. */
.entry_title .date,
h1.entry_title .date {
  color: #bebebe;
}

/* 9. THE FOUR BE@BETTER PAGES WHOSE PER-PAGE ELEMENTOR CSS WAS NEVER ARCHIVED.
   /bebetter/ (1460), /bebetter/programas/ (1729), /education/ (1736) and /kids/ (1753) are four of
   the thirteen built pages whose post-<id>.css exists in neither archive. Their eight sibling
   programme pages kept theirs, so for once the correct rendering is not a guess: on every sibling
   the programme logo sits opposite the MIDDLE of the paragraph beside it, because Elementor wrote
   the vertical alignment into the per-page sheet. Without it the logo pins to the top of its
   column and the rest of that half-page is white — 467px on education, 574px on kids, and the band
   reads as an empty placeholder block rather than as a two-column band.
   Restore the alignment the siblings show. Desktop only: below 768px Elementor stacks the columns
   and there is no shorter column to centre. Scoped by page id so the ten pages that still HAVE
   their own CSS keep the exact layout the archive shipped. */
@media (min-width: 768px) {
  .elementor-1460 .elementor-row,
  .elementor-1729 .elementor-row,
  .elementor-1736 .elementor-row,
  .elementor-1753 .elementor-row {
    align-items: center;
  }
  /* The row is a flex container; its columns must not be told to stretch by the theme reset, or
     align-items above has nothing to act on. */
  .elementor-1460 .elementor-row > .elementor-column,
  .elementor-1729 .elementor-row > .elementor-column,
  .elementor-1736 .elementor-row > .elementor-column,
  .elementor-1753 .elementor-row > .elementor-column {
    align-self: center;
  }
}

/* 10. THE PRINT CONTROL IS NOW A <button> AND MUST STILL LOOK LIKE THE LINK IT REPLACED.
   "Imprimir Página" was an <a href="#"> whose own onclick called window.print() and returned false
   — a button wearing a link's clothes, and one of the 257 href="#" on this site. Making it a real
   <button> is correct semantically and loud visually: a native button arrives with its own grey
   background, 2px outset border, Arial 13.33px and black text, which is why it suddenly rendered
   as a boxed system control on the eleven blog posts.
   These are the anchor's measured values, taken by cloning it beside the button and diffing the two
   computed styles (_heu_r8_printcmp.js) at 1440 and 390 — not a guess at what looks close. */
button.qode_print_page {
  appearance: none;
  -webkit-appearance: none;
  background: transparent;
  border: 0;
  padding: 0;
  margin: 0;
  display: inline;
  color: #3a3a3a;
  font-family: inherit;
  font-size: 12px;
  text-align: center;
  cursor: pointer;
}
button.qode_print_page i,
button.qode_print_page span {
  color: #3a3a3a;
}


/* ===========================================================================================
   Round 9 — the seven defects a person found by opening the site in a browser, in ten minutes,
   after every gate we had was green. `node _scripts/qa_legibility.js` now measures them.
   Each entry records the CAUSE, because six of the seven were introduced by this restore and
   the seventh is the theme's own value pushed past the point a person can use it.
   =========================================================================================== */

/* 1. THE FOOTER WAS A WHITE SQUARE ON THE TWO LEGAL PAGES — and the cause was in the HTML.
   `/politica-de-cookies/` and `/politica-de-privacidade/` closed `.content_inner` and never closed
   `.content`, so `<footer>` parsed as a CHILD of `.content` on those two pages alone. Bridge ships
   `.content, .content .container, .full_width { background-color: … }`, so the footer's own
   `.container` — transparent on all 79 other pages — painted opaque white directly over the
   `#262626` the footer holder had already painted, while the widgets kept the white text the
   customizer chose for a dark footer. 18 elements at contrast 1:1 and 1.03:1: present, selectable
   with ctrl+A, invisible. No other gate could see it — the markup is there, the refs resolve, the
   page is not thin and the console is clean.
   The missing `</div>` is fixed in both pages. This rule is the belt to that braces: the footer
   holder owns the footer's background at every width, and no layout wrapper inside it may paint
   one, whatever a page's own nesting turns out to be. */
.footer_top .container,
.footer_top .container_inner,
.footer_bottom .container,
.footer_bottom .container_inner { background-color: transparent; }

/* 2. "SABER MAIS" COULD NOT BE READ.
   The hero CTA is this restore's own invention: Slider Revolution's runtime is a paid file that
   survived in neither archive, and the original slide carried no button at all — its title and
   subtitle were themselves the link, in white with `rgba(0,0,0,0.75)` drop shadows (the layer's
   own data-tsh, still readable in _raw/heuristica.pt/pages/index.html). The rebuilt button copied
   the theme's outlined `.qbutton` — white text, white border, `rgba(255,255,255,.08)` fill — which
   is legible over a dark photograph and disappears over a bright one. Three of the five banners
   are bright rooms; measured contrast 1:1.
   Fixed the way the original slide solved the same problem: the button carries its own dark ground
   and the shadow the archived layers used. Over the brightest possible photograph the fill still
   leaves ~6:1, so the label reads on every slide rather than on some. */
.heu-hero .heu-hero__cta {
  background: rgba(28, 27, 25, .66);
  border-color: rgba(255, 255, 255, .92);
  text-shadow: 0 2px 8px rgba(0, 0, 0, .75);
}
.heu-hero .heu-hero__cta:hover { background: #fff; color: var(--heu-link); text-shadow: none; }

/* 3. THE NAVIGATION WAS SET AT 10px AND 11px.
   Not body copy: all 13 sub-12px elements are menu items. `style_dynamic.css` — the site's own
   customizer output — sets `nav.main_menu > ul > li > a { font-size: 11px }` over Bridge's own
   13px, and the theme sets the dropdown panels at 11px and their third level at 10px. So this one
   IS the original's appearance, and the original was unreadable: 10px uppercase Raleway with 1px
   tracking is the "hold a magnifying glass to the screen" the client described.
   The smallest change that fixes it is the floor itself — 12px, the size below which the gate (and
   every accessibility guideline) calls text too small. Nothing else about the menu moves: same
   family, same weight, same colour, same tracking, same uppercase. */
nav.main_menu > ul > li > a { font-size: 12px; }
.drop_down .second .inner ul li a,
.drop_down .second .inner ul li h5,
.drop_down .wide .second .inner ul li.sub ul li a,
.drop_down .wide .second ul li ul li a { font-size: 12px; }

/* 4. THE HERO ARROWS WERE ALIVE AND UNREACHABLE ON A PHONE.
   qa_interactions dispatches the click on the button itself and saw the slide change, so the
   carousel passed. A finger does not click the element, it clicks whatever is topmost at the
   point it lands — and at 390 the round-8 rule that moved the arrows down to the bottom corners
   put them underneath `.heu-hero__dots`, a full-width, transparent, same-z-index box that spans
   the whole slide. `document.elementFromPoint()` at either arrow's centre returned
   `div.heu-hero__dots`, and the real mouse click that followed changed nothing.
   The dots container is a layout device, not a control: it must not take the pointer at all. Only
   the five dots themselves do. The arrows go above it as well, so nothing added to that corner
   later can repeat this. */
.heu-hero__dots { pointer-events: none; }
.heu-hero__dot { pointer-events: auto; }
.heu-hero__nav { z-index: 6; }

/* …and both controls now have a target a finger can land on. The dot keeps its 11px appearance —
   the circle moves to a pseudo-element — inside a 26px box, and the phone arrows go back to the
   44px they should never have dropped below. */
.heu-hero__dot {
  width: 26px; height: 26px; border: 0; background: transparent;
  position: relative; display: inline-flex; align-items: center; justify-content: center;
}
.heu-hero__dot::after {
  content: ""; width: 11px; height: 11px; border-radius: 50%;
  border: 2px solid #fff; background: transparent; box-sizing: border-box;
}
.heu-hero__dot.is-active { background: transparent; }
.heu-hero__dot.is-active::after { background: #fff; }
@media (max-width: 700px) {
  .heu-hero__nav { width: 44px; height: 44px; font-size: 18px; }
}

/* 5. THE HERO CROPPED A WOMAN'S HEAD IN HALF, and the reason was the stage height.
   The five banners are 1240x680. The archived slider declared its own box for them —
   `gridheight:"680,600,600,400"` against `responsiveLevels:"1240,1024,778,480"`, still readable in
   the setREVStartSize call in _raw/heuristica.pt/pages/index.html — so at 1240 the photograph was
   shown whole. This restore invented `clamp(340px, 38vw, 560px)` instead, which is 547px at 1440:
   `background-size:cover` then scaled the image to 790px and threw away 243 of them, 121 off the
   top, straight through the subject's forehead.
   Restore the slider's own heights. What little a wider viewport still has to crop is taken from
   the bottom of the frame (a table, a floor, leaves) rather than split evenly across the top,
   because in all five photographs the person is in the upper half. */
.heu-hero { min-height: 680px; }
.heu-hero__slide { background-position: 50% 25%; }
@media (max-width: 1239px) { .heu-hero { min-height: 600px; } }
@media (max-width: 777px)  { .heu-hero { min-height: 400px; } }

/* 6. THE BURGER WAS A 12x14 GLYPH.
   Its tap area has been 44x44 since the logo pass and a real click at its centre does open the
   drawer — but a person aims at what they can see, and what they can see is Bridge's
   `.mobile_menu_button span { font-size: 14px }` rendering `fa-bars` at 12x14 in #9d9d9d, which is
   the only navigation on a phone. Give the glyph the size the target already has, and the colour
   the customizer chose for the menu it opens (`nav.main_menu > ul > li > a { color: #333333 }`)
   instead of the theme's default grey. */
.mobile_menu_button span { font-size: 22px; color: #333333; }
.mobile_menu_button span i { font-size: inherit; line-height: 1; }

/* 7. ON A PHONE A LINK LOOKED LIKE PLAIN TEXT.
   Bridge colours a body link #3a3a3a against #818181 prose and gives it no underline and no extra
   weight — a slightly darker grey, which at 390 on a phone reads as emphasis, not as something to
   tap. In the footer it is worse: the customizer paints the widget text #fcfcfc and its links
   #ffffff, so `geral@heuristica.pt` is typographically identical to the address printed above it.
   Underline the links that sit inside running copy, and only those: buttons, cards, the menu and
   post titles keep the appearance the theme gives them. */
.heu-authored p a, .heu-authored li a,
.elementor-text-editor p a, .elementor-text-editor li a,
.post_text p a, .blog_single p a,
.footer_top .textwidget a, .footer_top .widget_recent_entries li a {
  text-decoration: underline;
  text-underline-offset: 2px;
  text-decoration-thickness: 1px;
}
.heu-authored p a.qbutton, .heu-authored li a.qbutton,
.elementor-text-editor p a.qbutton, .post_text p a.qbutton,
.heu-card__more a, .heu-card h3 a, a.heu-map { text-decoration: none; }

/* 8. AND THE STANDALONE LINKS A FINGER HAS TO HIT.
   A link that is the whole of its line is a control, not a word in a sentence, and the gate holds
   those to 24px. The footer's two link lists and the homepage teaser cards rendered 17-21px tall
   because the theme's line-height was all that was giving them height. Give them the height
   without moving anything: an inline-block whose line box is 24px sits in the space the inline
   anchor already occupied. */
.footer_top .textwidget a,
.footer_top .widget_recent_entries li a,
.heu-card h3 a,
.heu-card__more a {
  display: inline-block;
  min-height: 24px;
  line-height: 24px;
}

/* …and one class of link the inline-block above cannot help: a link inside running copy, which
   must stay inline so the sentence can still wrap through it. `<p><strong>E-mail:</strong>
   <a>geral@heuristica.pt</a></p>` on /contactos/ measured 121x17 — a mailto a visitor is meant to
   tap, one line of 14px type tall. line-height cannot fix it (an inline box's rect follows the
   font's content area, not the line box) but vertical padding can: it enlarges the border box and
   the hit area, changes no line's position, and is invisible because it is transparent. */
.heu-authored p a,
.elementor-text-editor p a,
.post_text p a,
.blog_single p a { padding-top: 4px; padding-bottom: 4px; }

/* 8b. THE SAME 24px FLOOR, EVERYWHERE ELSE ON THE SITE.
   Running the gate over all 81 pages rather than the three the client happened to open found 333
   more controls under 24px, in five families — and every one of them is the same thing: an INLINE
   anchor or label whose only height is the theme's 13-15px type. Vertical padding is the whole
   answer for an inline box: it enlarges the border box and the hit area, it does not enter the
   line-box calculation, so not one line of type moves. Buttons are excluded because they already
   carry their own padding and would grow visibly. */
.post_info a,
.post_author_link,
.single_tags .tags_text a,
aside .widget ul li a,
.blog_holder ul li a,
.heu-crumbs a,
.elementor-accordion-title,
.elementor-toggle-title,
.elementor-heading-title a,
.elementor-image-box-title a,
.elementor-text-editor li a,
.elementor-text-editor span a,
.elementor-text-editor strong a,
.elementor-widget-container > ul li a {
  padding-top: 4px;
  padding-bottom: 4px;
}

/* …and one family that is not a text link at all. Elementor's image widgets wrap a `display:block`
   <img> in an INLINE <a>, so the anchor's own rect is the empty 20px strut beside the picture
   rather than the picture — the control measures 159x20 while the thing a finger lands on is
   250px square. Making the anchor a block does not change one pixel of the rendering; it just
   makes the box the anchor claims the box it actually occupies. */
figure.elementor-image-box-img > a,
.gallery-icon > a { display: block; }

/* Elementor's carousel pagination is a 6x6 dot with a 6x6 hit area — the same defect as the hero
   dots, in the theme's own component, on the four pages that carry an image carousel. Keep the
   6px dot exactly as it renders and pad it out to 24 inside a content-box, so the painted circle
   is unchanged and the target is four times its width. The negative margin gives back the space
   the padding takes, leaving the row of dots the width it already was. */
.swiper-pagination-bullet {
  box-sizing: content-box;
  padding: 9px;
  background-clip: content-box;
  margin: 0 -3px !important;
}

/* 9. THE FOUR SLIDES THAT ARE NOT ON SCREEN ARE STILL ON THE PAGE.
   The rebuilt carousel fades slides with `opacity` alone. `opacity` does not inherit as a computed
   value, so every heading, paragraph and link inside a slide at opacity 0 still computes opacity 1,
   is still laid out, is still in the tab order, and is still read aloud — aria-hidden or not. It is
   also why the legibility gate photographs four invisible "Consulta de Psicologia" headlines and
   measures them at 1:1: they really are painting nothing.
   `visibility` is the property that answers all of that, and it is discrete, so it has to be timed
   rather than eased: hold it until the fade has finished on the way out, and switch it immediately
   on the way in. Same 600ms cross-fade on screen, nothing behind it. */
.heu-hero__slide {
  visibility: hidden;
  transition: opacity .6s ease, visibility 0s linear .6s;
}
.heu-hero__slide.is-active {
  visibility: visible;
  transition: opacity .6s ease, visibility 0s linear 0s;
}

/* 10. THE PAGEHEAD BAND STOPS BEING A GRADIENT.
   The band is a restore addition and carried a three-stop wash. A gradient cannot be reasoned
   about: qa_legibility computes contrast against the ground it can name, and when it finds an
   image or a gradient anywhere above the text it refuses to guess and sends the element to a
   camera instead — screenshot, remove the text colour, screenshot again, diff.
   That camera photographs the page as a first-time visitor sees it, and on the fifteen pages that
   carry the site's own Popup Maker modal that means through a 60%-black scrim. The four elements
   on this band came back at 1.06:1, or failed to photograph at all, on every one of those pages,
   with nothing wrong with any of them: the scrim is doing exactly what a scrim is for.
   A flat opaque ground ends the argument. `groundOf` stops at the first opaque background, the
   arithmetic is then exact rather than approximate — #6B6459 crumbs at 5.2:1, the #33322F title at
   11.5:1, the #8C4A00 links at 6.1:1 — and nothing is weakened: paint white text on this band and
   the same arithmetic returns 1.05:1 and fails, which was verified with a canary before this rule
   was written. The colour is the gradient's own middle, so the band renders as it already read at
   120px tall. */
.heu-pagehead {
  background: #FBF1E0;
}

/* 11. THE LAST TWO CONTROLS UNDER 24px, FOUND ONLY BY SWEEPING ALL 81 PAGES.
   The archived welcome modal's own call to action — `Clique aqui para entrar em contacto
   connosco!` — is a 332x17 inline anchor, i.e. the one thing the modal exists to be clicked and
   the shortest control on the page. Same vertical padding as every other inline link here.
   And Elementor writes an accordion header as `<span class="elementor-accordion-title"
   role="button">`, so the gate measures the LABEL rather than the full-width row that actually
   takes the click. Where the label is a short one — "Q.I." on /servicos/curiosamente-sabia-que/
   measures 22px wide — the label alone is under the floor. Extend its box to the right, which is
   the one direction with nothing after it, so no glyph moves. */
.pum-content p a,
.pum-content li a { padding-top: 4px; padding-bottom: 4px; }
.elementor-accordion-title,
.elementor-toggle-title { padding-right: 8px; }

/* 12. THE LAST PLACES WHERE A LINK STILL READ AS PLAIN TEXT (item 7, the rest of it).
   Sweeping all 81 pages rather than three found three more families, none of them blocking and all
   of them the client's complaint:
     * the blog sidebar's "Artigos Recentes" and "Publicações" lists. Bridge ships
       `aside .widget a { color: inherit }`, so every link in a sidebar widget is the same grey as
       the text around it. The footer's identical widget lists were underlined above; these are the
       same component and get the same treatment.
     * the archived popup's own call to action — `<a style="color:#ee7e00">` inside a
       `<span style="color:#ee7e00">`, so link and prose are the same colour by construction, in
       the one block on the page that exists to be clicked.
     * "SIGA-NOS NO FACEBOOK", which is an `a.qbutton` — a real button with a real border — that
       the same `aside .widget a` rule strips of the colour and the 700 weight `.qbutton` declares.
       It is not underlined, because a bordered button is not a link; it gets back the two values
       the theme's own button rule set and a sidebar rule accidentally outranked. */
aside .widget ul li a:not(.qbutton),
.pum-content p a,
.pum-content li a {
  text-decoration: underline;
  text-underline-offset: 2px;
  text-decoration-thickness: 1px;
}
aside .widget a.qbutton { color: #3a3a3a; font-weight: 700; text-decoration: none; }

/* 5b. …AND THE 133 PIXELS OF THE HERO THAT WERE BEHIND THE HEADER.
   Restoring the slider's own 680px stage was necessary and not sufficient. style_dynamic.css — the
   customizer again — sets `.content { margin-top: -133px }`, a Bridge option meant for a header
   that is transparent over a slider. This header is not transparent: `<header class="regular">`,
   opaque white, z-index 110. So the hero's box started at y=15 and its top 133px were painted
   under a solid white bar, which is where the third banner's subject has her head.
   Measured, not assumed: `_scripts/_heu_r9_overlap.js` reports header bottom 148 against hero top
   15 at 1440 and 1240, 248 against 115 at 1024 — 133px at every width where Bridge still draws the
   desktop header — and 0 at 768 and 390, where the mobile header is in flow. So the correction is
   the same 133px, applied only above Bridge's own 1000px header breakpoint.
   With the whole stage visible, 8% is enough bias to keep the top of a head clear of the frame at
   1440 and at 1920, where a wider viewport scales the 1240x680 banner taller and crops more. */
@media (min-width: 1001px) {
  .heu-hero { margin-top: 133px; }
}
.heu-hero__slide { background-position: 50% 8%; }
