/* ==========================================================================
   IMPORTED VERBATIM from docs/marketing/design/tokens.css @ 2fed987. Do not edit here: edit the source and rebuild
   with tools/build-plugin-css.py.
   ========================================================================== */

/* Oak Tree Dental - design tokens.
   Owner: Dalia (Section B). DRAFT for Mona's sign-off. Nothing here is published.

   This is the one source of truth. Every other design file references these
   properties; a literal hex or pixel value repeated anywhere else is a defect.

   There is no written brand guide (Mohsen, 29 Sep). Every colour below is a value
   already in use on the site or in oaktree-ui-standards.md, EXCEPT the ones marked
   PROPOSED (the button fill and its hover / active shades were chosen by Waseem on 29 Sep), which are new and go to Mona for a ruling before Michael ships them.

   UNITS: all lengths are px, NOT rem. This site's root font size is 15px, not the browser default 16px
   (found by Michael on staging, 30 Sep), so a rem token renders about 6% small: 2.75rem became 41.25px
   and the 44px tap-target rule failed wherever it was written in rem. px tokens are exact on any root.

   Contrast is computed (WCAG 2.1 relative luminance), not asserted. Ratios are
   quoted beside each pairing this file introduces.

   BREAKPOINTS cannot be custom properties (CSS does not allow var() inside @media),
   so they are declared here as the single reference and written as literals in the
   two component files, each with a comment pointing back to this list:
     --bp-tablet-up : 600px   phone -> tablet: mobile CTA width switches, layout gains a column
     --bp-desktop-up: 993px   Materialize's own boundary, already used by otd-frontend.css
   Mobile-first: base rules are the phone; min-width queries add to them.
*/

:root {

	/* ---- Colour: brand ---- */
	--color-accent:            #9a6c43;  /* button fill. Waseem chose it 29 Sep. WHITE label 4.57:1 (AA) */
	--color-accent-hover:      #5c3d1e;  /* primary hover: a deep brown, white label 9.81:1 (Waseem, 30 Sep: not the white swap) */
	--color-accent-active:     #4a3018;  /* primary pressed, white label 12.16:1 */
	--color-on-accent:         #ffffff;  /* label on the button fill */
	--color-brand-tan:         #bc8452;  /* the original brand tan. DECORATION ONLY: never text, never a
	                                        label background. White on it is 3.20:1 and fails AA (DEF-M3). */

	/* ---- Colour: neutral ---- */
	--color-ink:               #111111;  /* body and headings on white 18.88:1 */
	--color-grey:              #515153;  /* tertiary fill; secondary label. on white 7.92:1 */
	--color-grey-hover:        #232325;  /* grey CTA hover: near-black, white label 15.9:1; pressed uses --color-ink */
	--color-card-border:       #d3d3d6;  /* the sidebar card's existing border */
	--color-card-bg:           #eaeaea;  /* the sidebar card's existing body */
	--color-white:             #ffffff;
	--color-surface-hover:     #dcdcdc;  /* secondary (white) button on hover. grey label on it 5.78:1 */
	--color-surface-disabled:  #e6e6e6;
	--color-on-disabled:       #595959;  /* on --color-surface-disabled 5.61:1 */

	/* ---- Colour: state ---- */
	--color-error-ink:         #7a1f1f;  /* on --color-error-surface 9.44:1 */
	--color-error-surface:     #fdf3f2;

	/* ---- Colour: photograph scrim ---- */
	/* Hero scrim, chosen 30 Sep 2026 (Waseem: "add the shadow on the entire picture"; option 2f).
	   An even 46% black over the WHOLE lifted team photograph. It is lighter than the old
	   0.55 because the hero text is now all LARGE text (headline 48/32px; supporting line 24px, or
	   20px bold on phones), which needs 3:1, not 4.5:1. Measured on this photograph's real pixels at
	   1000 to 1920px wide: the darkest need is 0.416, so 0.46 has a 0.044 margin. It also passes on the
	   original un-lifted photo (need 0.401). Do NOT use it with body-size (small, regular) text on a
	   photograph: for that, white text needs a scrim of at least 0.575. */
	--scrim:                   rgba(0, 0, 0, 0.46);

	/* ---- Focus ---- */
	/* Two-tone so it holds on ANY background (white page, dark photo, tan fill):
	   3px ink outline, separated from the control by a 2px white gap.
	   ink vs white 18.88:1; white gap vs a dark photo 15.91:1. */
	--focus-ink:               var(--color-ink);
	--focus-gap-colour:        var(--color-white);
	--focus-width:             3px;
	--focus-offset:            2px;

	/* ---- Type ---- */
	--font-ui:                 "Open Sans", sans-serif;  /* the theme's own stack. Open Sans is NOT loaded on the page, so `sans-serif` decides what draws (Arial). The old `system-ui` drew Segoe UI and read heavier than the rest of the site (Michael, .0523) */
	--font-display:            inherit;  /* the theme's own heading face; not ours to change */

	/* Scale: Rocket Mortgage steps 16/24/32/48 measured on rocketmortgage.com,
	   plus 18 and 20 for older readers. Apple measured 17/19/28/32/40/56. */
	--text-14: 14px;      /* 14px  the reCAPTCHA notice ONLY: legal boilerplate, not content. Waseem, 30 Sep. Nothing else below 16px */
	--text-16: 16px;      /* 16px  UI, buttons, nav, minimum anywhere */
	--text-18: 18px;  /* 18px  body, mobile supporting line */
	--text-20: 20px;   /* 20px  desktop supporting line */
	--text-24: 24px;    /* 24px  tile titles */
	--text-32: 32px;      /* 32px  mobile hero headline, section headings */
	--text-40: 40px;      /* 40px  hero headline on large phones and tablets, 600 to 992px (Waseem: the 32px looked small at 611px) */
	--text-48: 48px;      /* 48px  desktop hero headline */

	--leading-tight:   1.17;  /* 56/48, Rocket's headline ratio */
	--leading-heading: 1.25;  /* 40/32 */
	--leading-body:    1.5;   /* 24/16, 28/18 */

	--weight-light:    300;
	--weight-regular:  400;
	--weight-ui:       500;
	--weight-heading:  600;

	/* ---- Spacing (4px base) ---- */
	--space-1:  4px;  /*  4px */
	--space-2:  8px;   /*  8px */
	--space-3:  12px;  /* 12px  minimum gap between adjacent tap targets */
	--space-4:  16px;     /* 16px */
	--space-5:  24px;   /* 24px  CTA horizontal padding, Rocket-measured */
	--space-6:  32px;     /* 32px */
	--space-7:  48px;     /* 48px */
	--space-8:  64px;     /* 64px */
	--space-9:  96px;     /* 96px */

	/* ---- Controls ---- */
	--size-tap-min:      44px;  /* 44px. Nothing tappable is smaller than this */
	--cta-height-compact: 44px; /* 44px. header, inline, sidebar. Apple standard = 44 */
	--cta-height-hero:    56px;  /* 56px. hero and end-of-page. Rocket = 56 */
	--cta-pad-x:          var(--space-5);
	--cta-mobile-width:   100%;    /* Decided 29 Sep 2026: Waseem delegated to Dalia, who chose full width under 600px
	                                  (Rocket measures 342 of 390). Replaces the text-based width rule in the standards file.
	                                  600px and up stays text-based. `auto` would restore text width everywhere. */

	/* ---- Shape ---- */
	--radius-pill:  999px;
	--radius-card:  12px;  /* 12px */
	--border-thin:  1px;
	--border-strong: 2px;

	/* ---- Motion ---- */
	--duration-fast: 200ms;   /* Waseem chose a softer fade, 29 Sep. Rocket measures 150ms; the old standard said 180ms */
	--ease-out:      cubic-bezier(0.33, 1, 0.68, 1);  /* Rocket's curve, measured */
	--duration-spin: 800ms;

	/* ---- Layout ---- */
	--header-height-desktop: 114px; /* MUST EQUAL THE REAL BAR. Staging and live are 114px (Tarek, 30 Sep); the hero spec says 78px but the
	                                   bar was never built to it. At 78 the links left an 18px dead strip above the panel. If the bar is
	                                   ever rebuilt to 78px, change this ONE token. */
	--logo-height-mobile:    48px;   /* Waseem, 30 Sep: logo a bit bigger. Was 36px. Centred on the bar's centre line */
	--header-height-mobile:  72px;    /* 72px. otd-frontend.css 12.4 */
	--bar-height:            68px;   /* 68px = 12 + 44 + 12, plus its 1px top border. mobile Book / Call bar */
	--z-scrim:               1;
	--z-caption:             2;
	--z-bar:                 900;
	--hero-height-desktop:   clamp(560px, 82svh, 760px);  /* 560-760px; lets the next section show */
	--hero-height-mobile:    clamp(480px, 78svh, 640px);    /* 480-640px */
	--card-head-height:      57px;   /* the sidebar card's header band, as the live form card measures it */
	--card-body-min-height:  260px;  /* sidebar card body under its 57px header: card is 317px tall (Waseem chose it, 30 Sep). Was 425px, the height of the six-field form it replaced */
	--paths-min-height:      88px;    /* 88px. each tile in the homepage paths strip */
	--measure-headline:      1088px;
	--measure-line:          640px;
	--measure-hero-line:     1088px; /* desktop hero supporting line: as wide as the headline, so at 1440 it sits on ONE line (Waseem, 30 Sep: 720px looked tight) */
	--gutter-phone:          20px;   /* home hero on phones: headline and buttons share this side gutter (Waseem's 540px check, 30 Sep) */
}

/* ==========================================================================
   LEGACY plugin rules (pruned): tools/css/otd-legacy.css
   ========================================================================== */

/* otd-legacy.css - the plugin stylesheet as of build F, PRUNED for build G (30 Sep 2026).
   Removed: the About-panel sections (replaced by design/menu.css) and every selector of the retired button
   families (.otd-hero-cta*, .otd-nav-cta-book, .otd-nav-cta, .otd-cta, .otd-cta-primary/-secondary, .otd-sidebar-cta;
   Mona C-d). Container rules are kept. Generated by tools/prune-legacy-css.py; do not edit by hand. */

/* ==========================================================================
   Oak Tree front-end redesign
   Spec: docs/marketing/oaktree-hero-header-spec.md

   SCOPING IS THE SAFETY MODEL. Every rule starts with a body class this plugin
   adds. Deactivate the plugin and the classes vanish, so the vendor theme renders
   exactly as it does today - there is no state to clean up and nothing to undo.

     .otd-hh            everything
     .otd-slim-header   review banner + address row removed
     .otd-pill          site-wide button radius
     .otd-no-sticky     sticky appointment bars

   Measured from the live site at 1440px and 375px on 28 Sep 2026, not matched by
   eye:
     .form-wrapper-default   330 x 491, #eaeaea, radius 2px, z-depth-1
     .form-name              66px, #bc8452, Open Sans 24px/500
     inner content width     294px
     .btn-tertiary           #515153, Poppins 14px/500
     header desktop          banner 40 + nav 114 = 154px
     header mobile           banner 40 + nav 64  = 104px
   ========================================================================== */


/* ==========================================================================
   1. SLIM HEADER - three rows become one

   Removes the two rows above the navigation:

     .announcements-banner-section  the review quote, 40px
     .top-nav-wrapper               address + phone

   The review banner was the weakest row on the page: all caps at 13px with
   NEGATIVE letter spacing, 104 characters, no stars and no source. Reviews stay in
   the navigation and on their own page, so nothing is lost. The address is carried
   by the footer and by structured data; the phone is already a button in the bar.

   Desktop goes 154px -> 114px. NOT to the 78px in the spec: getting there means
   shrinking the nav's own padding, which would fight the theme's `large`/`small`
   scroll states. The theme already shrinks the bar to 90px past 175px of scroll, so
   the remaining 24px is better taken by making the resting state match the scrolled
   one - a separate decision, and one to make with the hero on screen.

   Mona flagged the review banner removal as needing her review (spec item 5).
   ========================================================================== */

body.otd-slim-header .announcements-banner-section,
body.otd-slim-header .top-nav-wrapper {
	display: none !important;
}

/* The body carries an `announcements-banner` class that reserves room for the bar.
   Without this the space stays behind as a gap. */
body.otd-slim-header.announcements-banner .navbar-fixed {
	padding-top: 0 !important;
}


/* ==========================================================================
   2. SINGLE HERO - carousel furniture

   The slides themselves are removed in PHP, from the HTML, because they are
   `loading="eager"` images and hiding them in CSS would still download all four.
   See otd_frontend_single_hero().

   What is left here is the furniture: dots, arrows and the direction nav, which
   have nothing to point at once there is one slide.
   ========================================================================== */

body.otd-hh.home .flex-control-nav,
body.otd-hh.home .flex-direction-nav,
body.otd-hh.home #home-slider .dots,
body.otd-hh.home #home-slider .slider-nav,
body.otd-hh.home #home-slider .flex-control-paging,
/* The theme's own class. Measured on staging: with one slide this still rendered a
   single lone dot. The four guesses above were from other slider libraries; this is
   the one that is actually in the markup. */
body.otd-hh.home #home-slider .indicators {
	display: none !important;
}

/* THE SLIDE MUST BE FORCED VISIBLE. This is the bug that washed the hero out.
   ------------------------------------------------------------------------
   The theme drives its slider with Velocity and CROSS-FADES: it animates the
   current slide's opacity to 0 while animating the next one's up to 1. With four
   slides that is invisible, because there is always a successor.

   With one slide there is no successor. The slide fades itself out and nothing
   fades in, so it settles at `opacity: 0` and stays there - measured on staging as
   `class="bg-secondary slide-1 active velocity-animating"` with opacity 0. The
   photograph was still loading and still painting, just at zero opacity, which is
   why the hero looked washed out rather than blank: what remained visible was the
   pale `bg-secondary` panel behind it.

   `!important` beats the inline style Velocity writes, which is the only thing that
   works here - Velocity sets `style="opacity: 0"` directly on the element, and a
   normal rule loses to an inline style.

   Only applies on the homepage, and only while the single-hero feature is on. Turn
   OTD_FRONTEND_SINGLE_HERO off and the carousel and its cross-fade return intact. */
body.otd-hh.home #home-slider .slides > li {
	opacity: 1 !important;
}


/* ==========================================================================
   1b. STEADY NAV - stop the bar and logo resizing on scroll

   "The nav size changes when you scroll and logo shrinks." - Waseem, 28 Sep.

   The theme's scripts.js swaps the class past 175px of scroll:

     if ($(document).scrollTop() > 175) { $("nav").removeClass("large").addClass("small"); }

   Measured, both states:

                    nav.large          nav.small
     nav height     114px              90px  (desktop; equal at tablet width)
     logo shown     white, 60px tall   dark, different dimensions
     bar background transparent        #ffffff

   WHAT IS LOCKED: height and logo size. Both states are pinned to the LARGE
   geometry, so nothing shrinks. Large rather than small because the complaint was
   about shrinking - this keeps the bar at the size it already is when the page
   loads, and nothing gets smaller than what you see at the top.

   WHAT IS DELIBERATELY NOT LOCKED: the background colour and the logo swap.

   Those are not decoration. On the homepage the bar is transparent over the hero
   photograph and uses the WHITE logo; once scrolled it is a white bar and uses the
   DARK one. Freeze either and one of the two becomes invisible - a white logo on a
   white bar, or a dark logo on a dark photograph. The swap is what keeps the logo
   legible in both places, so it stays.

   The result: the bar no longer changes SIZE, only colour, which is the part that
   has to change.
   ========================================================================== */

body.otd-steady-nav .navbar-fixed nav.large,
body.otd-steady-nav .navbar-fixed nav.small,
body.otd-steady-nav .navbar-fixed nav.large .nav-wrapper,
body.otd-steady-nav .navbar-fixed nav.small .nav-wrapper {
	height: 114px !important;
	min-height: 114px !important;
	transition: background-color .25s ease !important;
}

/* Both logo variants to one size, so swapping between them is invisible in
   geometry. width:auto keeps the 500x420 source in proportion rather than
   stretching it to whatever box the theme had in mind for that state. */
body.otd-steady-nav .nav-logo img {
	height: 60px !important;
	width: auto !important;
	max-width: none !important;
	transition: none !important;
}

body.otd-steady-nav .nav-logo {
	display: flex !important;
	align-items: center !important;
	height: 114px !important;
}


/* ==========================================================================
   2b. HOMEPAGE HERO - form removed, content centred, two CTAs

   CORRECTION, 28 Sep. "We will leave the contact form as is" meant the CONTACT US
   PAGE form, not the homepage hero form. I read it as the hero and spent the day
   protecting the wrong one, which is why the centred hero in the approved mockup
   was never built. The Contact Us page is, and always was, excluded separately.

   The theme reserves the right-hand third for the form:

     #home-slider.slider .caption { padding-right: calc(330px + 2%) }

   and ships a `.caption-no-cf` variant at `calc(50px + 2%)` for heroes without one.
   Rather than add that class - which would need the theme's own PHP - the padding
   is overridden directly and the content centred.

   KNOWN ISSUE THAT CSS CANNOT FIX: slide 1 is still `slider1.jpg`, 1835x1000, and
   the right 40% of that file is a FLAT PAINTED PANEL - sampled across the middle,
   every pixel from 62% to 97% is identical rgb(157,176,193). It was painted in as a
   backdrop for the form. With the form gone it is just a pale block, and it will
   look WORSE centred than it did with the form covering it. The clean team
   photograph has to be uploaded to the media library and set as slide 1. Until then
   this hero is half-finished by definition.
   ========================================================================== */

/* The form module. Its column is `.col.s4.offset-s8` inside the slider's own
   container; hiding the wrapper leaves the (zero-height) container harmless. */
body.otd-hh.home #home-slider .form-wrapper-variation-3,
body.otd-hh.home #home-slider .form-wrapper {
	display: none !important;
}

/* Reclaim the 330px the form occupied and centre what is left. */
body.otd-hh.home #home-slider .caption,
body.otd-hh.home #home-slider article[class*="caption-variation"] {
	padding-right: calc(50px + 2%) !important;
	padding-left: calc(50px + 2%) !important;
	text-align: center !important;
}

/* The aligner is `display:flex; flex-direction:column; align-items:flex-end` -
   a COLUMN flex that pushes its children to the right. Measured in the local
   harness: the button row shrink-wrapped to 385px and sat at x=869 while the
   headline spanned the full 1095px, which is why the CTAs looked right-aligned
   while the text looked centred.

   `text-align: center` cannot fix that. In a flex container the cross-axis
   position is `align-items`, and text-align only affects inline content INSIDE
   each child. That is the whole bug. */
body.otd-hh.home #home-slider div[class*="caption-aligner"] {
	text-align: center !important;
	align-items: center !important;
	justify-content: center !important;
	margin-left: auto !important;
	margin-right: auto !important;
}


/* Slider variation 3 ships four empty divs inside the caption article -
   .border-top, .border-top-two, .border-right, .border-right-two - each a
   2px solid #fff absolutely positioned against the caption box. Together they
   drew a white bracket that framed the caption beside the old right-hand
   contact form. The form is gone and the caption is centred, so the bracket
   now reads as a stray white rectangle sitting on top of the team photo. */
body.otd-hh.home #home-slider .border-top,
body.otd-hh.home #home-slider .border-top-two,
body.otd-hh.home #home-slider .border-right,
body.otd-hh.home #home-slider .border-right-two {
	display: none !important;
}

/* The theme right-aligns the headline (`.slider .slides .slide-name{text-align:right}`).
   Centre it, and let both lines run full width so they stay on one line - the
   single-line treatment and the centred layout depend on each other. */
body.otd-hh.home #home-slider .slide-name,
body.otd-hh.home #home-slider .caption-body {
	text-align: center !important;
	max-width: none !important;
	margin-left: auto !important;
	margin-right: auto !important;
}

/* The two actions. Same geometry as the service page pair so the site has one
   button language: 52px tall, Poppins 15px/500, pill. */


/* Tan primary, per the agreed spec. The same dg-colors `:not()` rule that beat the
   service page buttons applies here, so these carry !important for the same reason. */


/* Solid white, brand grey label. Opaque rather than a ghost button: a translucent
   fill depends on the scrim staying dark behind it, and opaque cannot lose contrast. */


/* ==========================================================================
   2c. NAV BAR - phone and Book Now, pushed right

   In the approved mockup and missing from every build so far. The theme's nav row
   is `.navigation-and-logo`; the buttons are appended there and pushed right with
   margin-left:auto, which is what the mockup showed.
   ========================================================================== */

/* `.navigation-and-logo` is display:block with a FLOATED logo, so `margin-left:auto`
   did nothing and the buttons dropped onto their own row underneath the menu -
   measured at 0,64 1009x42. That was the misalignment.

   The fix is to put them inside `.main-nav-wrapper` and make that a flex row, so
   the menu and the buttons sit on one line with the buttons at the right. The
   wrapper is `hide-on-med-and-down`, so this only ever applies on desktop. */
/* DESKTOP ONLY. `.main-nav-wrapper` carries Materialize's `hide-on-med-and-down`,
   which sets display:none at 992px and below. An unscoped `display:flex !important`
   beat that and resurrected the full desktop menu on phones, next to the hamburger -
   caught in the local harness at 375px, not on the live site.

   993px is Materialize's own med-and-down boundary, so this hands control straight
   back to the theme below it. */
@media only screen and (min-width: 993px) {
	body.otd-hh .main-nav-wrapper {
		display: flex !important;
		align-items: center !important;
		justify-content: flex-end !important;
		gap: 18px;
	}
}

/* The menu must NOT be allowed to shrink. As a flex item it defaults to
   `flex-shrink: 1`, and the harness measured it squeezed to 502px, which wrapped
   "Patient Education" onto a second row and made the bar 128px tall.

   flex:0 0 auto plus nowrap keeps the four items on one line and lets the bar
   stay at its locked 114px. */
body.otd-hh .main-nav-wrapper .menu-primary-navigation-container {
	display: flex;
	align-items: center;
	flex: 0 0 auto !important;
	min-width: 0;
}

body.otd-hh .main-nav-wrapper #menu-primary-navigation {
	white-space: nowrap !important;
	display: flex !important;
	align-items: center !important;
	flex-wrap: nowrap !important;
}

body.otd-hh .main-nav-wrapper #menu-primary-navigation > li {
	float: none !important;
	flex: 0 0 auto !important;
}

body.otd-hh .otd-nav-actions {
	flex: 0 0 auto !important;
}

body.otd-hh .otd-nav-actions {
	display: flex;
	align-items: center;
	gap: 10px;
	flex: none;
}


body.otd-hh .otd-nav-cta-phone {
	background: transparent !important;
	border-color: rgba(255, 255, 255, .8) !important;
	color: #fff !important;
}

/* On interior pages the bar is white, so a white-on-white phone button would
   vanish. The theme swaps `nav.large` to `nav.small` past 175px of scroll and
   interior pages render white from the top, so the label follows the bar. */
body.otd-hh:not(.home) .otd-nav-cta-phone,
body.otd-hh nav.small .otd-nav-cta-phone {
	border-color: #bcbcbe !important;
	color: #515153 !important;
}


@media only screen and (max-width: 992px) {
	body.otd-hh .otd-nav-actions {
		display: none;
	}
}


/* ==========================================================================
   3. SERVICE PAGE SIDEBAR - form becomes a booking CTA

   Scoped to `.form-wrapper-default`, which no other form on the site uses:
     homepage hero form  .form-wrapper-variation-3  - not matched
     Contact Us form     no .form-wrapper-default    - not matched
     pop-up modal form   .form-wrapper inside .modal - not matched
   Verified against all three pages in the browser. "Keep the Contact Us form, we
   need it" is not a thing to get wrong, so PHP excludes that page as well.
   ========================================================================== */

/* A thin outline around the whole card - tan header and grey body together
   (Waseem, 28 Sep). With the form's input boxes gone the panel lost the internal
   edges that gave it shape, so it read as a flat grey area rather than a card.

   box-sizing keeps it at exactly 330px rather than 332px, so the sidebar column
   does not shift. overflow:hidden keeps the tan header's square top corners inside
   the 2px radius instead of poking through it. */
body.otd-hh .form-wrapper-default {
	box-sizing: border-box;
	border: 1px solid #d3d3d6 !important;
	border-radius: 2px;
	overflow: hidden;
}

/* No-flash swap. The form is hidden ONLY when JavaScript is running - `otd-js` is
   set on <html> by an inline script in the head. If scripts are blocked or fail,
   this never applies and the CF7 form renders and works exactly as today. The
   fallback for a broken enhancement is the thing it was replacing. */
html.otd-js body.otd-hh .form-wrapper-default .inner-form-wrapper:not(.otd-cta-body) {
	visibility: hidden;
}

/* 491 total - 66 header = 425. Holding the height keeps the sidebar column the same
   depth as before, so the template's row alignment does not move. */
body.otd-hh .form-wrapper-default .inner-form-wrapper.otd-cta-body {
	visibility: visible;
	min-height: 425px;
	padding: 22px 18px 20px;
	display: flex;
	flex-direction: column;
	justify-content: center; /* mockup option 1: optically centred */
	align-items: center;
	gap: 14px;
}

/* 294px matches the form inputs exactly, so the block's internal rhythm is
   unchanged. 52px tall, not the theme's 36px: a 36px target is below the 44px
   minimum Apple and WCAG 2.2 (2.5.8) ask for, and this is the primary conversion
   control on every service page. */


/* WHY THESE CARRY !important, when nothing else in this file does.
   ---------------------------------------------------------------
   The vendor's dg-colors.css contains:

     a:not(.text-contrast):not(.btn):not(.btn-tertiary):not(.btn-transparent)…
       { color: inherit; background: transparent; }

   Every `:not(.class)` contributes class-level specificity, so that selector scores
   higher than `body.otd-hh .form-wrapper-default .otd-cta-primary` even though mine
   looks longer. Measured on staging: the rules below DID match and were still
   losing - the buttons rendered with no fill and black text, on a #eaeaea panel.

   The alternative was to add `.btn` to the CTAs so the `:not(.btn)` clause excluded
   them, which would work but would also pull in the theme's button sizing and give
   us a second set of rules to fight. Overriding three declarations is the smaller,
   more legible change. Keep the scope: these apply only inside
   `.form-wrapper-default`, never to a button anywhere else. */

/* Grey, not tan (Waseem, 28 Sep). #515153 is the theme's own .btn-tertiary - the
   colour the form's submit button already used - so no new colour enters the
   palette, and it stops the block reading tan-on-tan under the tan header. */


/* Opaque, not a ghost button: a transparent fill would depend on the #eaeaea panel
   staying light behind it. Hierarchy comes from colour weight, not from making the
   second option faint. */


/* The theme strips outlines on .btn, and these are the primary conversion controls
   on the page. They must not be reachable invisibly. WCAG 2.1 AA 2.4.7. */


@media only screen and (max-width: 600px) {
	body.otd-hh .form-wrapper-default .inner-form-wrapper.otd-cta-body {
		min-height: 0;
		padding: 20px 16px;
	}

	
}


/* ==========================================================================
   4. SITE-WIDE BUTTON RADIUS

   "Go with C across the entire site, so they are consistent." - Waseem, 28 Sep.

   THE SITE IS NOT CONSISTENT TODAY, which is the actual problem. Measured across
   the homepage and a service page at 1440px, the SAME control differs by template:

     control                       service page     homepage
     See More Reviews              30px  (pill)     5px
     Call Us!                      60px  (pill)     5px
     CF7 submit / Get Directions   30px  (pill)     5px
     Request Appointment           0px              0px
     Read More, Services           -                5px

   Five values: 0, 5px, 30px, 50%, 60px. The homepage runs the theme's
   `variation-three` template, which styles buttons at 5px; interior pages use pills.

   999px, not 26px: a fixed radius is a true pill at exactly one height, and these
   run 30px to 54px tall.

   FLAGGED: this changes every button on the site, which is a visible brand change.
   Mona signs every asset. Waseem asked for it explicitly so it is built, but it
   needs her eyes before production.
   ========================================================================== */


/* Materialize wraps submit inputs in a span that carries the visible shape, so the
   wrapper has to round too or square corners show through behind the input. */


/* Circular icon buttons stay circular - the accessibility toolbar and back-to-top.
   999px would render them identically; listing them says they are a different
   control rather than an oversight. */


/* ==========================================================================
   5. STICKY APPOINTMENT BARS

   "I noticed its sticky and I dont like it. Its too spamy." - Waseem, 28 Sep.

   The theme adds `.show` to these on the same `scrollTop > 175` handler that
   shrinks the nav, so a bar slides up the moment a visitor starts reading and
   follows them down the page.

   THERE ARE TWO OF THEM, and they must be treated differently:

     .sticky-footer.hide-on-small-only   desktop/tablet. CTA only. Safe to remove.
     .sticky-footer.hide-on-med-and-up   MOBILE. CTA *and* the accessibility widget.

   DO NOT `display: none` THE MOBILE BAR. It hosts `.awda-sticky.mobile`, the only
   accessibility widget present on a phone - the desktop `section.awda-sticky` is
   `hide-on-small-only` and is display:none there. Hiding a parent takes the whole
   subtree with it, and there is no CSS that hides a parent and shows a child. A
   blanket rule here removes contrast and font-size controls from exactly the
   visitors who went looking for them.

   The bar's own background is also LEFT ALONE. Measured: `.sticky-footer` is
   #ffffff with a shadow, while `.awda-sticky` is transparent - the widget borrows
   the bar's background, and one of its controls (`.black-text-activator`) is a
   WHITE circle. Strip the bar and that control becomes white-on-white.

   So: remove the desktop bar, and on mobile remove only the promotional CTA. What
   is left is a slim white strip carrying the accessibility widget, which is what
   the theme would render if the promo had never been added.
   ========================================================================== */

body.otd-no-sticky .sticky-footer.hide-on-small-only,
body.otd-no-sticky .sticky-footer.hide-on-small-only.show {
	display: none !important;
}

body.otd-no-sticky .sticky-footer.hide-on-med-and-up .center-align {
	display: none !important;
}


/* ==========================================================================
   6. QR CODE BLOCKS

   Three per service page, all generated by the vendor's service-page template, so
   none of them can be removed by editing a page:

     dental-…-qrcode.png    "view this page on mobile"   .col.s12.m5 beside a .m7
     map-directions-qrcode  "open directions on mobile"  .col.s12.m3 beside a .m9
     phone-number-qrcode    "Call Us Today"              whole section.call-out.SPCUT

   The sidebar section goes entirely. The other two sit in layout columns, so the
   JavaScript widens the surviving sibling to fill the row - otherwise you get two
   narrow columns and a gap where the QR used to be. See otd-frontend.js.

   Note one theme bug found while measuring: the third block's column is
   `class="col m12 m6 l3"`. `m12` and `m6` contradict each other. Harmless today,
   but it means that column's tablet width is whatever Materialize resolves last.
   ========================================================================== */

body.otd-hh.otd-no-qr section.call-out.SPCUT {
	display: none !important;
}

/* Set by JavaScript on the column that held a QR image. */
body.otd-hh .otd-qr-removed {
	display: none !important;
}

/* Set by JavaScript on the sibling that has to take the freed width. */
body.otd-hh .otd-qr-widened {
	width: 100% !important;
	max-width: 100% !important;
	margin-left: 0 !important;
	flex: 0 0 100% !important;
}


/* Top-level menu items hidden by trimTopNav() to give the four-item nav.
   display:none, so they leave the accessibility tree and the tab order too - a
   keyboard user should not land on a link nobody can see. */
body.otd-hh #menu-primary-navigation > li.otd-nav-hidden {
	display: none !important;
}


/* ==========================================================================
   9. HOMEPAGE CORRECTIONS - 28 Sep, against the agreed mock
   docs/marketing/drafts/oaktree-hero-v2.html
   ========================================================================== */

/* 9.1 The white rule around the hero.
   Slider variation 3 ships four empty divs inside the caption article which draw
   a thin white L around the photograph. They framed the old grey panel. Against
   a full-bleed photograph they read as a stray line across the image. */
body.otd-hh.home #home-slider .border-right,
body.otd-hh.home #home-slider .border-right-two,
body.otd-hh.home #home-slider .border-top,
body.otd-hh.home #home-slider .border-top-two {
	display: none !important;
}

/* 9.2 The Welcome box sits UNDER the hero, not over it.
   The theme pulls it up with transform:translateY(-11vh) so it overlaps the
   slide. That was composed for the old image, whose lower right was empty grey.
   Over the team photograph it covers faces. */
body.otd-hh.home .theme-three-intro-box-container {
	transform: none !important;
}

/* 9.3 Navigation left, beside the logo. Actions right.
   Spec, Header: "logo left, navigation immediately beside it, phone and Book Now
   pushed right", and navigation is LEFT aligned, not centred, so the logo, the
   links and the hero headline share one vertical edge.

   The wrapper was justify-content:flex-end, which pushed the whole lot - menu
   included - to the right. flex-start seats the menu against the logo and
   margin-left:auto on the actions takes up the slack, which keeps them hard
   right however many nav items there are. */
@media only screen and (min-width: 993px) {
	body.otd-hh .main-nav-wrapper {
		justify-content: flex-start !important;
	}

	body.otd-hh .otd-nav-actions {
		margin-left: auto !important;
	}
}

/* 9.4 Book Now had lost its horizontal padding.
   .otd-nav-cta sets `padding: 0 20px` unprefixed, and a theme rule on anchors
   inside the nav bar outweighs it, collapsing the button onto its label. Stated
   with !important here because it is a conversion control and its hit area is
   not something to leave to specificity. Height and radius are restated so the
   pill keeps its shape if the theme also touches those. */

body.otd-hh .otd-nav-cta-phone{
	padding: 0 22px !important;
	height: 42px !important;
	line-height: 42px !important;
	border-radius: 999px !important;
	box-sizing: border-box !important;
}


/* 9.5 The phone is a number, not a button. Waseem, 28 Sep.
   It shipped as an outlined pill matching Book Now, which gave two controls equal
   visual weight and made the bar read as two competing buttons. Book Now is the
   one action we are asking for; the number is there for people who would rather
   call. Stripped to a plain link - no border, no fill, no pill geometry - so the
   only button in the bar is the one that matters.

   Overrides 9.4, which sets padding, height and radius on all three CTA classes,
   so this block must stay AFTER it. */
body.otd-hh .otd-nav-cta-phone,
body.otd-hh:not(.home) .otd-nav-cta-phone,
body.otd-hh nav.small .otd-nav-cta-phone {
	background: transparent !important;
	border: 0 !important;
	border-radius: 0 !important;
	padding: 0 !important;
	height: auto !important;
	line-height: normal !important;
}

/* The label still has to hold its own against the photograph on the homepage and
   against white on interior pages, so only the colour follows the bar. */
body.otd-hh.home nav:not(.small) .otd-nav-cta-phone {
	color: #fff !important;
}

body.otd-hh:not(.home) .otd-nav-cta-phone,
body.otd-hh nav.small .otd-nav-cta-phone {
	color: #515153 !important;
}


/* ==========================================================================
   10. HERO AND HEADER, ROUND 2 - 28 Sep
   ========================================================================== */

/* 10.1 The menu was sitting on top of the logo.
   9.3 set the wrapper to justify-content:flex-start, but `.navigation-and-logo`
   is display:block with a FLOATED logo, so the wrapper still began at x=0 and the
   first two links landed over the mark.

   Making the parent the flex row is the actual fix: the logo and the nav wrapper
   become siblings on one line, in source order, and the wrapper takes the rest of
   the width. Scoped to desktop - below 993px Materialize hides the wrapper and the
   hamburger takes over. */
@media only screen and (min-width: 993px) {
	body.otd-hh .navigation-and-logo {
		display: flex !important;
		align-items: center !important;
		gap: 30px;
	}

	/* The logo needs its width RESERVED, not merely asked for.
	   `nav.large .nav-logo img` is position:absolute with left:3%, so .nav-logo
	   itself measures ZERO and a flex row hands it nothing - the menu began at 30px
	   and the first two links rendered underneath the mark. A fixed basis is what
	   holds the space open: 3% of a 1440px bar is 43px, the mark is about 70px wide
	   at its 45px height, so 150px clears it at every desktop width without
	   depending on the image having loaded. */
	body.otd-hh .navigation-and-logo > .nav-logo {
		flex: 0 0 150px !important;
		float: none !important;
		margin: 0 !important;
		min-width: 150px !important;
	}

	body.otd-hh .navigation-and-logo > .main-nav-wrapper {
		flex: 1 1 auto !important;
		min-width: 0;
	}
}

/* 10.2 The white rule around the hero - the REAL source.
   9.1 hid the four border-* divs, which is why a line survived it. The rectangle
   is drawn by the caption article itself:

     .slider-variation-3 .caption-variation-3 { border: 2px solid #fff; ... }

   It framed the old grey panel. Over a full-bleed photograph it is a white box
   floating across the team. */
body.otd-hh.home #home-slider .caption-variation-3 {
	border: 0 !important;
}

/* 10.3 The scrim. There has never been one.
   Spec, Photography: "A scrim is still required. The team all wear black, so white
   type over the group is unreadable without one", and Hero: "Scrim - even, roughly
   50% over the whole image."

   Even, not a gradient: the headline sits centred over the middle of the frame and
   a top-down gradient would leave it on the lightest part. Painted on the slide so
   it covers the photograph and nothing else, with the caption lifted above it. */
body.otd-hh.home #home-slider .slides > li {
	position: relative;
}

body.otd-hh.home #home-slider .slides > li::after {
	content: "";
	position: absolute;
	inset: 0;
	background: rgba(0, 0, 0, .5);
	pointer-events: none;
	z-index: 1;
}

/* Lift the caption above the scrim with z-index ALONE.
   The first version of this rule also set position:relative, which overrode the
   theme's `position:absolute; top:16vh; left:5.5vw` and took the headline, the
   supporting line and both buttons off the hero entirely. z-index works on the
   already-positioned element; the position must not be touched. */
body.otd-hh.home #home-slider .slides > li > .caption-variation-3{
	z-index: 2;
}


/* 10.4 The logo must not change size when the bar does.
   Measured on the live staging build at 1440px:

     nav.large  White-Logo-Transparent.png   71 x 60
     nav.small  Logo-Transparent.png         54 x 45

   so the mark visibly shrinks on scroll. The section 1 rule
   (`body.otd-steady-nav .nav-logo img`) already asks for 60px and wins for the
   white variant, but the theme's own `nav.small .nav-logo img` is more specific
   and takes the dark one back to 45.

   Stated per nav state so this outranks it in both. max-height and max-width are
   reset too: the theme caps the small variant at 45px, and a cap beats a height.
   width:auto keeps the 500x420 source in proportion. */
body.otd-hh nav.large .nav-logo img,
body.otd-hh nav.small .nav-logo img,
body.otd-steady-nav nav.large .nav-logo img,
body.otd-steady-nav nav.small .nav-logo img {
	height: 60px !important;
	max-height: none !important;
	width: auto !important;
	max-width: none !important;
}


/* 10.5 ...and it must not MOVE when the bar changes state either.
   With the sizes equalised in 10.4 the mark still jumped on scroll. Measured at
   1440px, both variants share left:43px but not their vertical placement:

     nav.large  top: 9%   -> 17px
     nav.small  top: 38px -> 38px

   a 21px drop at the moment of the swap.

   27px puts the 60px mark in the optical centre of the 114px bar that section 1
   locks, and it is stated in pixels rather than a percentage so it cannot drift
   when the bar's own height is recalculated. Left is restated at the same value
   both already computed to, so the two variants sit in exactly one place. */
body.otd-hh nav.large .nav-logo img,
body.otd-hh nav.small .nav-logo img,
body.otd-steady-nav nav.large .nav-logo img,
body.otd-steady-nav nav.small .nav-logo img {
	top: 27px !important;
	bottom: auto !important;
	left: 43px !important;
	transition: none !important;
}


/* 10.6 The hero actions are DESKTOP ONLY.
   The spec is explicit - "Status: design agreed, not built. Desktop only." - and
   on a phone the injected pair collided with the theme's own mobile CTAs.
   Measured at 390px:

     Book An Appointment (ours)   y 358 - 410
     Call Now            (ours)   y 429 - 481
     (858) 748-2101      (theme)  y 445 - 496   <- 36px of overlap
     Request Appointment (theme)  y 504 - 555

   Call Now sat underneath the theme's phone button, so the hero showed four
   stacked controls with two of them on top of each other.

   RESOLVED THE OTHER WAY ROUND, on Waseem's call to drop Request Appointment from
   mobile. Hiding ours and then removing the theme's Request Appointment would have
   left a phone number as the only control on a phone, with no way to book at all -
   so the pair that survives is OURS, and the theme's duplicates go.

   Mobile now carries the same two actions as desktop, in the same order and the
   same language: Book An Appointment straight to NexHealth, then Call Now. The
   theme's `.call` and `.schedule` buttons are the duplicates, so both are hidden
   rather than just the one, because leaving its phone button would put two call
   controls on the same screen.

   993px is the same Materialize boundary the rest of this file uses. */
@media only screen and (max-width: 992px) {
	

	

	/* The theme's own hero pair. Scoped to the slider so the identical classes
	   used further down the page are untouched. */
	body.otd-hh.home #home-slider .btn.call,
	body.otd-hh.home #home-slider .btn.schedule {
		display: none !important;
	}
}


/* 10.7 The mobile hero address.
   It comes from the theme's own mobile contact block inside the slider - the same
   group as the `.call` and `.schedule` buttons 10.6 hides - not from anything this
   plugin adds. With those two gone the address is the last thing in the hero, so
   it carries the practice's location on its own and was measured at 20px/400,
   smaller than the supporting line above it.

   24px on the street address, with the "Our Address:" label held at 20px so the
   two still read as label then value rather than one block of equal weight. */
@media only screen and (max-width: 992px) {
	body.otd-hh.home #home-slider .address,
	body.otd-hh.home #home-slider .client-address {
		font-size: 24px !important;
		line-height: 1.35 !important;
	}

	body.otd-hh.home #home-slider .address > .address-label,
	body.otd-hh.home #home-slider .address strong,
	body.otd-hh.home #home-slider .address b {
		font-size: 20px !important;
	}
}


/* ==========================================================================
   11. CTA STANDARD - one button language across the site
   Waseem, 28 Sep: header type must match, buttons size to their text, and every
   CTA shares one hover behaviour.

   NOT YET RECONCILED against apple.com and rocketmortgage.com, which Waseem set
   as the reference for type and spacing. This container cannot reach either one,
   so the values below are chosen on their own merits and must be checked against
   those two before anyone calls this settled.
   ========================================================================== */

/* 11.1 Header type matches.
   Measured before this block: menu links Open Sans 16px/400, while the phone and
   Book Now were Poppins 13.5px/500 - visibly smaller sitting right beside them,
   which is exactly what Waseem saw.

   All three now share the menu's family and size. Book Now keeps 500 because it
   is the one button in the bar and weight is what separates it now that size no
   longer does; the phone drops to 400 because it is plain text among text links. */

body.otd-hh .otd-nav-cta-phone{
	font-family: 'Open Sans', Poppins, sans-serif !important;
	font-size: 16px !important;
	letter-spacing: normal !important;
}

body.otd-hh .otd-nav-cta-phone { font-weight: 400 !important; }


/* 11.2 Buttons are as wide as their text plus equal padding. Never stretched,
   never a fixed width - so "Book Now" and "Book An Appointment" carry the same
   breathing room rather than the same width.

   24px horizontal is the single padding value for every CTA on the site. */


/* 11.3 One hover behaviour everywhere.
   The fill darkens and nothing moves. A transform or a size change on hover
   shifts the things around it and, on a control this close to the nav, makes the
   bar feel unstable - so the change is colour only.

   180ms: fast enough to feel attached to the pointer, slow enough to read as a
   deliberate response rather than a flicker. Same curve on the way in and out.

   prefers-reduced-motion is honoured by dropping the transition, not the hover
   state - the button must still show it is interactive. */


/* Tan primary -> a darker tan. Same hue, ~10% down in lightness. */


/* Solid white secondary -> a light grey. Stays opaque, so it cannot lose
   contrast against the photograph behind it. */


/* The phone is text, so it underlines rather than filling. */
body.otd-hh .otd-nav-cta-phone:hover,
body.otd-hh .otd-nav-cta-phone:focus-visible {
	text-decoration: underline !important;
	text-underline-offset: 3px !important;
}

/* Keyboard users get a visible ring on every CTA. The theme strips outlines on
   .btn and these are the site's conversion controls. */


/* 11.4 EVERY button on the site, not just the ones this plugin injects.
   Audited 28 Sep across the homepage, Contact Us, Reviews, Patient Information
   and two service pages: 45 real buttons carrying SIX different signatures.

     18x  Poppins 15/500  pad 0/0      0.3s   theme - Get Directions, Request
                                              Appointment, Contact Us
     10x  Poppins 15/500  pad 24/24    0.18s  our hero pair
      6x  Open Sans 16/500 pad 24/24   0.18s  our Book Now
      4x  Poppins 15/500  pad 30/30    0.3s   Read More, Review us on Google
      1x  Poppins 15/500  pad 11.25    0.2s   nav dropdown

   Section 11.1 only ever reached the header, so this plugin was itself shipping
   two of those six. One language now covers all of them.

   HEIGHT IS DELIBERATELY NOT UNIFIED. The audit found 36px, 42px, 52px and 54px
   controls, and that is a real scale - an inline "Read More" should not be as
   heavy as a hero CTA. Family, size, weight, padding, radius and timing are what
   make them one family; height is what places them in it.

   Excludes the nav dropdown and hamburger triggers, which are menu machinery
   rather than calls to action and have their own geometry. */


/* The theme's own buttons get the same hover rule as ours: the fill darkens by
   the same amount and nothing moves. btn-tertiary is the grey secondary. */


/* 11.5 Hover, actually applied. Measured 28 controls and found FOUR behaviours
   where there should be one:

     18x  bg #515153 -> #77777a  PLUS filter brightness(.92)
      4x  bg #bc8452 -> #a5703f  (correct)
      4x  underline              (the phone, intended)
      2x  NOTHING                Book An Appointment and Call Now

   The two dead ones are the primary conversion controls on the homepage. The
   11.3 rules were written as `body.otd-hh .otd-hero-cta-primary:hover`, but the
   base colours are set by `body.otd-hh.home #home-slider .otd-hero-cta-primary`.
   That selector carries an ID, so it outranks the hover rule no matter how many
   !importants are stacked on it, and the button simply never changed. Restated
   here at matching specificity.

   The 18 were worse than inconsistent: the theme LIGHTENS grey on hover while
   11.4's brightness filter darkens whatever it is handed, so the two ran against
   each other on the same element. The filter is dropped - one mechanism, an
   explicit colour, in one direction. */

/* Hero pair - specificity matched to the base rules. */


/* Theme buttons - drop the filter, darken explicitly, and beat the theme's own
   lightening rule. */


/* 11.6 REGRESSION FIX for 11.4.
   11.4 set `display: inline-flex !important` on every .btn. Materialize hides
   elements with `display: none` on its `hide-on-*` classes, and !important beat
   them, so every responsive-hidden button became visible in every viewport.

   Seen on the homepage: "Why Choose Us" ships TWO Services buttons - one
   `hide-on-large-only` for phones, one `col l6` for desktop - and both rendered
   at 1440px, the phone one floating out at the right of the content column.

   Materialize's own breakpoints, restated so the hide classes win again. These
   are its published values, not guesses:

     hide-on-small-only      max-width 600px
     hide-on-med-and-down    max-width 992px
     hide-on-med-and-up      min-width 601px
     hide-on-large-only      min-width 993px
     hide-on-extra-large-only min-width 1201px

   LESSON, same shape as 11.5: a blanket !important on `display` does not just
   restyle a button, it defeats every layout utility the theme uses to place it.
   Restrict structural properties to the elements that actually need them. */


/* A button that is also a grid column must keep the column's width. 11.4's
   `width: auto` collapsed `.col.l6` to its text and pulled it out of the grid. */


/* 11.7 No shadows, and one height scale.
   Measured on hover across the homepage - a THIRD mechanism nobody decided on,
   in two different recipes:

     Read More            none -> 0 8px 17px rgba(0,0,0,.2) + 0 6px 20px rgba(0,0,0,.19)
     Services             none -> 0 3px 3px  rgba(0,0,0,.14) + two more
     Get Directions       none -> the same three
     Request Appointment  none -> the same three

   Materialize raises a z-depth on .btn:hover, and .btn-large raises a bigger one.
   That is a lift, which is exactly what "the fill darkens and NOTHING MOVES" rules
   out - and it is why a hovered Read More appeared to float off the page while its
   neighbours did not.

   Shadows off at rest and on hover, on every CTA. Colour remains the only thing
   that changes.

   HEIGHTS. 11.4 kept height as a deliberate scale, and it still is - but the
   measured set was 36, 42, 52 and 54, and 54 is not a step in a scale, it is
   .btn-large adding two pixels nobody asked for. Normalised to the three real
   steps:

     36px  inline, beside or beneath a block of text
     42px  header bar
     52px  hero, page and section CTAs

   .btn-large is a hero-sized control, so it joins the 52 step rather than
   inventing its own. */


/* ==========================================================================
   12. MOBILE HERO - 29 Sep, all measured at 390px before changing anything
   ========================================================================== */

/* 12.1 The hamburger was BLACK on the photograph.
   Measured: color rgb(0,0,0), font-size 14px, sitting over the dark upper third
   of the hero. Invisible in practice, which is the whole navigation gone on a
   phone.

   SIZE CORRECTED 29 Sep: this first went to 30px, which rendered as three very
   heavy bars filling the corner. The defect was the COLOUR, not the size - 14px
   was small but legible once it contrasted. 24px is a standard icon size and
   sits inside the 56px tap target the theme already gives it.

   White over the hero, 30px so it is a real target rather than a 14px glyph, and
   a soft shadow so it survives a light patch of the photograph. Only over the
   hero - on interior pages the bar is white and the icon must stay dark. */
@media only screen and (max-width: 992px) {
	body.otd-hh.home nav:not(.small) .button-collapse,
	body.otd-hh.home nav:not(.small) .button-collapse i {
		color: #fff !important;
		font-size: 24px !important;
		line-height: 1 !important;
		text-shadow: 0 1px 3px rgba(0, 0, 0, .45) !important;
	}

	body.otd-hh:not(.home) .button-collapse,
	body.otd-hh:not(.home) .button-collapse i,
	body.otd-hh nav.small .button-collapse,
	body.otd-hh nav.small .button-collapse i {
		color: #515153 !important;
		font-size: 24px !important;
		line-height: 1 !important;
	}
}

/* 12.2 Hero type was too small on a phone.
   Measured: headline 21.45px against 43.2px on desktop, supporting line 15.6px.
   The desktop treatment depends on each sitting on ONE line; on a phone they
   wrap anyway, so the reason for holding them small does not apply.

   30px and 17px. The headline still wraps to three lines at 390px, which is
   fine - it is the single-line constraint that was desktop-only, not the size. */
@media only screen and (max-width: 992px) {
	body.otd-hh.home #home-slider .slide-name,
	body.otd-hh.home #home-slider .slide-name * {
		font-size: 30px !important;
		line-height: 1.22 !important;
	}

	body.otd-hh.home #home-slider .caption-body,
	body.otd-hh.home #home-slider .caption-body * {
		font-size: 17px !important;
		line-height: 1.5 !important;
	}
}

/* 12.3 The address comes out of the hero.
   10.7 enlarged it; Waseem has now asked for it gone. It is the theme's own
   mobile contact block, and the same information is in the top bar, the footer
   and the JSON-LD, so nothing is lost by removing it from the hero - the hero
   now carries one message and two actions, as on desktop. */
@media only screen and (max-width: 992px) {
	body.otd-hh.home #home-slider .address,
	body.otd-hh.home #home-slider .client-address,
	body.otd-hh.home #home-slider .client-phone {
		display: none !important;
	}
}

/* ==========================================================================
   13. LANDING PAGES
   These ship WITHOUT <html> or <body> tags - a stripped noindex template - so
   `body.otd-hh` can never match and none of sections 11 or 12 reaches them.
   Measured on /lp/emergency-dentist/: Poppins 15px/500, 30px padding, 7.5px
   radius, 54px tall, with one control at 20px. Entirely outside the standard.

   Hooked off the button's own class instead of the body, since there is no body
   class to hook. Values identical to 11.4 so the two cannot drift.
   ========================================================================== */


/* 13.1 Beating the landing page's own inline <style>.
   The template ships its own block in the document:

     .landing-page-cta-btn       { border-radius: .5rem !important; }
     .hero .landing-page-cta-btn { font-size: 20px; }
     .landing-page-cta-btn       { width: 100%; padding: 0 3rem; }

   An inline <style> comes after the external stylesheet, so at equal specificity
   and equal !important the page wins - which is why section 13 left the radius at
   7.5px and one control at 20px. Restated with a tag and a second class so it
   outranks them.

   FLAGGED, NOT SETTLED: these are paid-campaign landing pages (noindex, their own
   template and their own type). Full-width square-ish buttons may well be a
   deliberate conversion choice that belongs to Ahmed, not a drift from the site
   standard. Bringing them into line was asked for; if Ahmed wants them back,
   delete section 13 and 13.1 - nothing else depends on them. */


/* 12.4 The mobile bar was as tall as the desktop one.
   Section 1 locks nav and .nav-wrapper to 114px to stop the theme resizing the
   bar between its large and small states. It carries no media query, so a phone
   got the same 114px - measured at 390x844, that is 13.5% of the viewport spent
   on a logo and a hamburger before any content.

   72px on mobile, with the mark at 44px and centred in it. The bar still does not
   change height between states, which is the point of section 1; it is simply a
   different constant below 993px. */
@media only screen and (max-width: 992px) {
	body.otd-steady-nav .navbar-fixed nav,
	body.otd-steady-nav .navbar-fixed nav.large,
	body.otd-steady-nav .navbar-fixed nav.small,
	body.otd-steady-nav .navbar-fixed nav .nav-wrapper,
	body.otd-steady-nav .navbar-fixed nav.large .nav-wrapper,
	body.otd-steady-nav .navbar-fixed nav.small .nav-wrapper,
	body.otd-hh nav,
	body.otd-hh nav .nav-wrapper {
		height: 72px !important;
		min-height: 72px !important;
	}

	body.otd-hh nav.large .nav-logo img,
	body.otd-hh nav.small .nav-logo img,
	body.otd-steady-nav nav.large .nav-logo img,
	body.otd-steady-nav nav.small .nav-logo img {
		height: 44px !important;
		top: 14px !important;
		left: 16px !important;
	}

	body.otd-steady-nav .nav-logo,
	body.otd-hh .nav-logo {
		height: 72px !important;
		flex: 0 0 auto !important;
		min-width: 0 !important;
	}

	body.otd-hh .button-collapse {
		height: 72px !important;
		line-height: 72px !important;
	}
}


/* 12.5 Logo and hamburger, balanced against each other on mobile.
   Measured at 390px: the mark rendered 52x44 while the hamburger glyph was 24px.
   A ratio of 1.83 reads as a large logo next to a small icon rather than two
   ends of one bar.

   Logo 36px tall, hamburger 26px - a ratio of 1.38. The logo stays the larger of
   the two, which is right since it is the brand and the icon is a utility, but
   they now read as a pair. The 72px bar and the full-height tap target are
   unchanged, so the hamburger is still a 72px target carrying a 26px mark. */
@media only screen and (max-width: 992px) {
	body.otd-hh nav.large .nav-logo img,
	body.otd-hh nav.small .nav-logo img,
	body.otd-steady-nav nav.large .nav-logo img,
	body.otd-steady-nav nav.small .nav-logo img {
		height: 36px !important;
		top: 18px !important;
	}

	body.otd-hh.home nav:not(.small) .button-collapse,
	body.otd-hh.home nav:not(.small) .button-collapse i,
	body.otd-hh:not(.home) .button-collapse,
	body.otd-hh:not(.home) .button-collapse i,
	body.otd-hh nav.small .button-collapse,
	body.otd-hh nav.small .button-collapse i {
		font-size: 26px !important;
	}
}


/* 12.6 A one-slide carousel should not behave like a carousel.
   Removing slides 2..n from the markup left the slider MACHINERY in place: two
   indicator elements are still in the DOM, and `#home-slider` still carries
   `touch-action: pan-y`, which is what a horizontal swipe handler sets so the
   browser does not steal the gesture.

   A simulated 260px horizontal drag on the local copy moved nothing, so this is
   belt and braces rather than a reproduced defect - some theme JS does not run
   there. On a real handset it costs nothing and removes the affordance.

   Indicators hidden, and the gesture handed back to the browser so a horizontal
   drag scrolls the page instead of being captured. */
body.otd-hh.home #home-slider .indicators,
body.otd-hh.home #home-slider .indicator-item,
body.otd-hh.home #home-slider .slick-dots,
body.otd-hh.home #home-slider .slick-arrow {
	display: none !important;
}

body.otd-hh.home #home-slider,
body.otd-hh.home #home-slider .slides,
body.otd-hh.home #home-slider .slides > li {
	touch-action: auto !important;
}

/* The photograph is not a draggable object. Without this a long press or drag on
   desktop picks the image up as a drag payload, which reads as "this slides". */
body.otd-hh.home #home-slider .slides > li img {
	-webkit-user-drag: none;
	user-select: none;
	pointer-events: none;
}


/* 12.7 The hamburger is an SVG, so font-size was the wrong lever.
   12.1 and 12.5 set font-size on .button-collapse assuming an icon font. The
   theme renders an inline <svg> sized in em, so 26px produced a 52x52 mark -
   larger than the 36px logo, which is the opposite of the balance 12.5 was
   trying to strike. Measured, not guessed: the SVG's own box was 52x52 while the
   computed font-size read 26px.

   Sized directly instead. 30px against a 36px logo puts the mark slightly
   smaller than the brand, which is the right order for a utility control, and
   keeps the 72px tap target. stroke/fill follow currentColor, so the white-over-
   hero and dark-on-interior rules in 12.1 still apply. */
@media only screen and (max-width: 992px) {
	body.otd-hh .button-collapse svg,
	body.otd-hh .button-collapse .svg-icon {
		width: 30px !important;
		height: 30px !important;
	}
}


/* 12.8 Hero type up again, at Waseem's request.
   12.2 took the headline from 21.45px to 30px and the supporting line from
   15.6px to 17px. Still reading small on a handset, so: 36px and 18px.

   36px is the practical ceiling for this copy at 390px. "Transform Your Smile
   with Dental Implants" is 41 characters and already sets to four lines at 30px;
   past 36 it takes a fifth and the block starts to crowd the buttons beneath it.
   If it needs to go larger than this, the copy has to get shorter - that is
   Esraa's, with Mona signing. */
@media only screen and (max-width: 992px) {
	body.otd-hh.home #home-slider .slide-name,
	body.otd-hh.home #home-slider .slide-name * {
		font-size: 36px !important;
		line-height: 1.16 !important;
	}

	body.otd-hh.home #home-slider .caption-body,
	body.otd-hh.home #home-slider .caption-body * {
		font-size: 18px !important;
		line-height: 1.5 !important;
	}
}


/* 12.9 The hero caption was only using 57% of a phone screen.
   Measured at 390px: the caption carried 57.8px of padding each side and a
   339.3px max-width, leaving the headline a 224px column. The theme's rule is
   `padding: 12rem 20.5vw 14rem 33vw` - composed around the 324x541 enquiry form
   that used to sit in the right third, and meaningless now the form is gone.

   That column is the real reason the type read small: 36px in 224px wraps to
   four lines, and four short lines look smaller than two long ones however large
   the glyphs are. Widening the column does more for perceived size than another
   step of font-size would.

   20px each side, full width. The headline gets ~350px instead of 224 - 56% more
   room - so the same 36px sets to fewer, longer lines. */
@media only screen and (max-width: 992px) {
	body.otd-hh.home #home-slider .caption-variation-3 {
		left: 0 !important;
		right: 0 !important;
		width: 100% !important;
		max-width: 100% !important;
		padding-left: 20px !important;
		padding-right: 20px !important;
	}

	body.otd-hh.home #home-slider .caption-aligner-variation-3 {
		width: 100% !important;
		max-width: 100% !important;
	}

	body.otd-hh.home #home-slider .slide-name {
		padding-left: 0 !important;
		padding-right: 0 !important;
	}
}

/* 12.9a 12.9 lost the cascade. The theme sets this caption's padding from at
   least eight rules, the strongest being an ID plus five classes:

     #home-slider.slider.slider-variation-3 .slides-variation-3
       .caption-variation-3.caption-no-cf

   which outranks `body.otd-hh.home #home-slider .caption-variation-3`. Same
   lesson as 11.5 and 11.6 - count the selector before adding force. Restated
   above it, with .caption-no-cf covered explicitly since several of the theme's
   rules only target that variant. */
@media only screen and (max-width: 992px) {
	body.otd-hh.home #home-slider.slider.slider-variation-3 .slides .caption-variation-3,
	body.otd-hh.home #home-slider.slider.slider-variation-3 .slides .caption-variation-3.caption-no-cf,
	body.otd-hh.home #home-slider.slider.slider-variation-3 .slides-variation-3 .caption-variation-3,
	body.otd-hh.home #home-slider.slider.slider-variation-3 .slides-variation-3 .caption-variation-3.caption-no-cf {
		left: 0 !important;
		right: 0 !important;
		width: 100% !important;
		max-width: 100% !important;
		padding-left: 20px !important;
		padding-right: 20px !important;
	}
}


/* 12.10 The hero content sat in the top two-thirds, leaving 342px empty.
   Measured at 390x844: the slide is 100vh, the caption is pinned at top:141px
   (16vh) with min-height:633px (75vh), and the buttons end at 503px - so 342px,
   40% of the screen, was empty below them while the content crowded the top.

   Both numbers come from the old composition, where the caption had to clear the
   324x541 form. With the form gone there is nothing to clear.

   Centred instead of offset: the caption fills the slide and centres its content,
   so the space distributes evenly above and below rather than all falling to the
   bottom. Nothing is resized - the same type and the same buttons simply sit in
   the middle of the frame. */
@media only screen and (max-width: 992px) {
	body.otd-hh.home #home-slider.slider.slider-variation-3 .slides .caption-variation-3,
	body.otd-hh.home #home-slider.slider.slider-variation-3 .slides .caption-variation-3.caption-no-cf,
	body.otd-hh.home #home-slider.slider.slider-variation-3 .slides-variation-3 .caption-variation-3,
	body.otd-hh.home #home-slider.slider.slider-variation-3 .slides-variation-3 .caption-variation-3.caption-no-cf {
		top: 0 !important;
		bottom: 0 !important;
		height: 100% !important;
		min-height: 0 !important;
		padding-top: 0 !important;
		padding-bottom: 0 !important;
		display: flex !important;
		flex-direction: column !important;
		justify-content: center !important;
		align-items: center !important;
	}

	body.otd-hh.home #home-slider .caption-aligner-variation-3 {
		display: block !important;
		width: 100% !important;
	}
}


/* 15. The "QR code for <page>" text link, removed on all 133 pages that carry it.
   removeQrTextLinks() marks the wrapping <p>; this hides it. A CSS-only fallback
   is included so the link goes even if the script does not run - `:has()` is
   supported by every current browser, and where it is not the JS path has
   already handled it. */
body.otd-hh p.otd-qr-removed,
body.otd-hh a.otd-qr-removed,
body.otd-hh p:has(> a[id^="QRC-"]) {
	display: none !important;
}

/* ==========================================================================
   16. THE MOBILE SLIDE-OUT MENU
   ========================================================================== */

/* 16.1 Home, Reviews and Contact Us were still showing on mobile.
   trimTopNav() marks them `otd-nav-hidden` in BOTH menus - verified, the class
   is on the element - but the rule that acts on it reads

     body.otd-hh #menu-primary-navigation > li.otd-nav-hidden

   which is the desktop menu's id. Nothing hid them in #mobile-demo, so a phone
   still showed the old seven-item nav with Home at the top. Same class, same
   intent, one selector short. */
body.otd-hh #mobile-demo > li.otd-nav-hidden {
	display: none !important;
}

/* 16.2 Patient Education was missing from the mobile menu entirely.
   Not our doing: the vendor put `hide-on-small-and-down` on that menu item in
   the WordPress menu config, and it carries in both menus, so Materialize hides
   it at 600px and below. One of the four agreed top-level sections was
   unreachable on a phone.

   The spec's navigation table names four items and says nothing is deleted, so
   this is a defect against it rather than a preference. Overridden only for
   TOP-LEVEL items in the two nav menus - the same class on individual service
   links inside the Services panel is the vendor trimming a long list on small
   screens, which is their call and is left alone. */
@media only screen and (max-width: 600px) {
	body.otd-hh #mobile-demo > li.hide-on-small-and-down,
	body.otd-hh #menu-primary-navigation > li.hide-on-small-and-down {
		display: list-item !important;
	}

	/* ...but not if trimTopNav() deliberately hid it. 16.1 must still win. */
	body.otd-hh #mobile-demo > li.hide-on-small-and-down.otd-nav-hidden,
	body.otd-hh #menu-primary-navigation > li.hide-on-small-and-down.otd-nav-hidden {
		display: none !important;
	}
}


/* ==========================================================================
   17. TAREK'S 0.8.8 DEFECTS
   docs/marketing/qa/2026-09-29-oaktree-frontend-0.8.8-test-report.md
   ========================================================================== */

/* 17.1 DEF-3 (High): six off-screen links in the desktop tab order.
   At 1440px #mobile-demo is display:block, visibility:visible, and merely pushed
   out of sight with translateX(300px). Off-screen is not hidden: tab went
   Book Now -> six stops at x=1440 -> the hero CTAs. Three of the six are ones
   this build injects into About, so half the defect is mine.

   visibility:hidden is what takes an element out of the tab sequence, and
   because the slide-out is only ever opened below 993px - Materialize hides the
   hamburger above it - there is nothing on desktop to break. pointer-events is
   belt and braces for the transform's own hit area. */
@media only screen and (min-width: 993px) {
	body.otd-hh #mobile-demo {
		visibility: hidden !important;
		pointer-events: none !important;
	}
}

/* 17.2 DEF-9 (Medium): the hero CTAs were stretched on a phone.
   Measured at 375px: both rendered exactly 279px - the column width - because
   12.6 set `width: 100%`. The standards doc says width comes from the text and
   records that Waseem asked for text-based width across all, so this contradicted
   our own rule while desktop obeyed it (216.6 and 117.4).

   Auto width, centred, with the column still capping them so a long label wraps
   rather than overflowing. */


/* 17.3 DEF-5 (Medium): prefers-reduced-motion was being undone by our own rule.
   11.3 sets `transition: none !important` inside the media query at line ~1092.
   11.7 then sets a transition again at line ~1123 - later in the file, outside
   any media query, equal specificity, also !important - so it won. The theme's
   own .btn correctly dropped to 0s, which is the control proving the query fires
   at all.

   Seventh instance this build of a correct rule losing the cascade, and the first
   where I lost to MYSELF. Ordering is the fix: this block is last in the file, so
   nothing of ours can follow it. Anything added after this point must repeat it. */
@media (prefers-reduced-motion: reduce) {
	
	body.otd-hh .otd-nav-cta-phone{
		transition: none !important;
		animation: none !important;
	}
}

/* ==========================================================================
   IMPORTED VERBATIM from docs/marketing/design/cta-booking.css @ 2fed987. Do not edit here: edit the source and rebuild
   with tools/build-plugin-css.py.
   ========================================================================== */

/* Oak Tree Dental - booking CTA component.
   Owner: Dalia (Section B). DRAFT: goes to Tarek to test, Mona to sign, Riad for the go.
   Requires tokens.css. Every value below is a token; a literal here is a defect.

   WHAT THIS REPLACES
   The "Request Appointment" form trigger, `a.btn.btn-tertiary[href="#contact-form-modal"]`,
   and its icon-only twins (`a.btn-floating.modal-trigger`), retargeted by Michael's JS to
   the NexHealth booking link. Also supersedes, for these controls only, the legacy
   families .otd-hero-cta / .otd-sidebar-cta / .otd-cta / .otd-nav-cta-book in
   otd-frontend.css (sections 10.6, 11.1-11.7, 12.6, 17.2). Retire those selectors as the
   markup below is adopted; do not stack a second rule on top.

   MARKUP CONTRACT
   Everything hangs off ONE class, .otd-book, so specificity is predictable. The JS that
   already retargets `a[href="#contact-form-modal"]` (by href, never by link text) must
   also add `otd-book otd-book--primary` (and `otd-book--hero` where the slot is a hero
   or end-of-page block) when it does. That is how the ~146 pages and 368 posts pick this
   up with no edit to the posts. A bare theme .btn left without the class simply stays
   the theme's grey button: it degrades, it does not break.
   Three trigger shapes exist on the live site: the text button, the button with a leading
   SVG icon, and the circular icon-only `.btn-floating` utilities. The first two take this
   component. The circular utilities keep their shape (excluded in the standards file) but
   need the same href retarget plus aria-label="Book an appointment online".
   Markup:
       <a class="otd-book otd-book--primary otd-book--hero" href="...NexHealth..."
          target="_blank" rel="noopener" aria-label="Book an appointment online">
         <span class="otd-book__label">Book an Appointment</span>
       </a>
   Variants: --primary (tan) | --secondary (white, for use on the hero photograph) |
             --tertiary (grey). Sizes: default 44px | --hero 56px.

   STATES
   default, hover, focus-visible, active ....... below
   loading ..... aria-busy="true"  (JS swaps the label to "Opening booking...")
   disabled .... aria-disabled="true"  (not the `disabled` attribute: an anchor has none)
   unavailable . the .otd-book-unavailable block, which REPLACES the button and carries the phone number

   BREAKPOINTS are the literals from tokens.css: 600px and 993px.
   !important appears on background / border-color / color ONLY. The theme's dg-colors
   rule is !important on those three (see otd-frontend.css 10.x "dg-colors"), so a
   non-important rule cannot win. Everything else wins on specificity alone.

   CONTRAST (computed)
     primary   label #ffffff on #9a6c43 4.57   hover: white on deep brown #5c3d1e 9.81   active #4a3018 12.16
     secondary label #515153 on #ffffff 7.92   hover: white label on #515153 7.92      active #232325 15.9
     tertiary  label #ffffff on #515153 7.92   hover: white on #232325 15.9           active ink #111111 18.9
     disabled  label #595959 on #e6e6e6 5.61
     unavailable text #7a1f1f on #fdf3f2 9.44
*/


/* ==========================================================================
   1. The button
   ========================================================================== */

body.otd-hh .otd-book {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: var(--space-2);
	box-sizing: border-box;
	width: auto;
	max-width: 100%;
	min-height: var(--cta-height-compact);
	padding: 0 var(--cta-pad-x);
	border: var(--border-strong) solid transparent;
	border-radius: var(--radius-pill);
	box-shadow: none;
	font-family: var(--font-ui);
	font-size: var(--text-16);
	font-weight: var(--weight-ui);
	line-height: var(--leading-body);
	letter-spacing: normal;
	text-transform: none;
	text-align: center;
	text-decoration: none;
	cursor: pointer;
	transition:
		background-color var(--duration-fast) var(--ease-out),
		border-color var(--duration-fast) var(--ease-out),
		color var(--duration-fast) var(--ease-out);
	-webkit-tap-highlight-color: transparent;
}

/* Long labels wrap rather than clip: at 200% zoom the pill grows taller, never cuts text. */
body.otd-hh .otd-book .otd-book__label {
	min-width: 0;
	overflow-wrap: anywhere;
}

/* THE HERO CAPTION RULE THE THEME HIDES (found by Michael on staging, 30 Sep).
   The theme has an inline rule on every link in the homepage hero caption that is not a .btn:
     .slider-variation-3.slider .caption-variation-3 a:not(.text-contrast):not(.btn):not(.btn-tertiary)
       :not(.btn-transparent):not(.btn-floating):not(.breadcrumb):not(.edit-link):not(.TLBC)
   which sets font-size 17px, font-weight 600 and letter-spacing 0.5px. It has 11 class-level parts,
   so `body.otd-hh .otd-book` (2) loses and the hero buttons rendered 17px / 600.
   DESIGN INTENT: hero buttons are 16px / 500 like every other button and the nav. Larger or heavier
   would make the hero button a different component. This repeats the chain and adds body.otd-hh and
   a.otd-book (13 parts), with no !important. It only sets the three properties the theme overrides. */
body.otd-hh .slider-variation-3.slider .caption-variation-3 a.otd-book:not(.text-contrast):not(.btn):not(.btn-tertiary):not(.btn-transparent):not(.btn-floating):not(.breadcrumb):not(.edit-link):not(.TLBC) {
	font-size: var(--text-16);
	font-weight: var(--weight-ui);
	letter-spacing: normal;
}

/* Under 993px the theme sets these hero links to display:block, so align-items was ignored and the label sat
   14px above centre (Tarek / Michael, section 7). Same :not() chain as the rule above. */
@media only screen and (max-width: 992px) {
	body.otd-hh .slider-variation-3.slider .caption-variation-3 a.otd-book.otd-book--hero:not(.text-contrast):not(.btn):not(.btn-tertiary):not(.btn-transparent):not(.btn-floating):not(.breadcrumb):not(.edit-link):not(.TLBC) {
		display: inline-flex;
	}
}

/* Hero and end-of-page size. */
body.otd-hh a.otd-book.otd-book--hero {
	min-height: var(--cta-height-hero);
}


/* ==========================================================================
   2. Variants: default, hover, active
   ONE hover rule for every variant (Waseem, 30 Sep: buttons identical except text and colour): on hover a filled button DEEPENS to a much
   darker shade of its own colour, label stays white. primary tan #9a6c43 -> deep brown #5c3d1e (9.81:1); tertiary grey #515153 -> near-black
   #232325 (15.9:1). The white secondary (it only sits on the dark hero photograph) cannot deepen, so it goes to grey #515153 with a white label.
   Pressed (:active) is deeper still (#4a3018, ink #111). Nothing ever turns white on a white page (Waseem: the button would vanish). NOTHING MOVES: no transform, no scale, no lift, no shadow.
   ========================================================================== */

/* Primary - deep tan, white label. The fill is #9a6c43, not the original brand tan #bc8452:
   white on #bc8452 is 3.20:1 and fails WCAG 2.1 AA (Mona, DEF-M3). */
body.otd-hh .otd-book.otd-book--primary {
	background-color: var(--color-accent) !important;
	border-color: var(--color-accent) !important;
	color: var(--color-on-accent) !important;
}
body.otd-hh .otd-book.otd-book--primary:hover {
	background-color: var(--color-accent-hover) !important;
	border-color: var(--color-accent-hover) !important;
	color: var(--color-on-accent) !important;
}
body.otd-hh .otd-book.otd-book--primary:active {
	background-color: var(--color-accent-active) !important;
	border-color: var(--color-accent-active) !important;
	color: var(--color-on-accent) !important;
}

/* Secondary - opaque white, for use on the hero photograph. Opaque so it cannot lose
   contrast if the scrim changes. */
body.otd-hh .otd-book.otd-book--secondary {
	background-color: var(--color-white) !important;
	border-color: var(--color-white) !important;
	color: var(--color-grey) !important;
}
/* Hover swaps fill and label (see section 2 above): white becomes dark grey, the label becomes white, the ring is white.
   (The old white to light grey #dcdcdc change was barely visible on the photograph.) White label on #515153 is 7.92:1; pressed #3f3f41 10.51:1. */
body.otd-hh .otd-book.otd-book--secondary:hover {
	background-color: var(--color-grey) !important;
	border-color: var(--color-white) !important;
	color: var(--color-white) !important;
}
body.otd-hh .otd-book.otd-book--secondary:active {
	background-color: var(--color-grey-hover) !important;
	border-color: var(--color-white) !important;
	color: var(--color-white) !important;
}

/* Tertiary - grey, for Get Directions, Call Now on a white page, and other supporting actions. */
body.otd-hh .otd-book.otd-book--tertiary {
	background-color: var(--color-grey) !important;
	border-color: var(--color-grey) !important;
	color: var(--color-white) !important;
}
body.otd-hh .otd-book.otd-book--tertiary:hover {
	background-color: var(--color-grey-hover) !important;
	border-color: var(--color-grey-hover) !important;
	color: var(--color-white) !important;
}
body.otd-hh .otd-book.otd-book--tertiary:active {
	background-color: var(--color-ink) !important;
	border-color: var(--color-ink) !important;
	color: var(--color-white) !important;
}

/* On a TAN band (the theme's .bg-primary, for example the footer band "Call Us Today!") every button is GREY
   (Waseem, 30 Sep: tan on tan is not good). The primary (tan) variant takes the tertiary look there, so it works
   whether or not the markup is changed to --tertiary. White label on #515153 is 7.92:1, on hover #3f3f41 10.51:1;
   grey on the tan #bc8452 band is 2.3:1 as a shape, but the white label is what carries it. */
body.otd-hh .bg-primary a.otd-book.otd-book--primary {
	background-color: var(--color-grey) !important;
	border-color: var(--color-grey) !important;
	color: var(--color-white) !important;
}
body.otd-hh .bg-primary a.otd-book.otd-book--primary:hover {
	background-color: var(--color-grey-hover) !important;
	border-color: var(--color-grey-hover) !important;
	color: var(--color-white) !important;
}
body.otd-hh .bg-primary a.otd-book.otd-book--primary:active {
	background-color: var(--color-ink) !important;
	border-color: var(--color-ink) !important;
	color: var(--color-white) !important;
}


/* ==========================================================================
   3. Focus
   Two-tone: white gap, then 3px ink. Holds on a white page, a dark photograph and a
   tan fill. The theme strips outlines on .btn; this puts a better one back.
   ========================================================================== */

body.otd-hh .otd-book:focus {
	outline: none;
}
body.otd-hh .otd-book:focus-visible {
	outline: var(--focus-width) solid var(--focus-ink);
	outline-offset: var(--focus-offset);
	box-shadow: 0 0 0 var(--focus-offset) var(--focus-gap-colour);
}


/* 3b. Retargeted theme buttons: <a class="btn btn-tertiary waves-effect otd-book ...">.
   Tarek's build G test (G3): these already carry the right classes and colours, but two properties lose.
   The winner is the PLUGIN'S OWN generic rule in otd-frontend.css (11.x),
     body.otd-hh .btn:not(.dropdown-button):not(.side-nav-dropdown-button):not(.button-collapse)
   which sets `transition: background-color 180ms ... !important` and `box-shadow: none !important`
   on every .btn. It scores 5 classes + 1 tag, so the fix must score higher AND be !important.
   Repeating .otd-book gives 5 classes + 2 tags. It is scoped to a.btn.otd-book only, so no other
   theme button changes. The reduced-motion rule at the end of the file removes the transition again,
   because !important here would otherwise defeat it. */
body.otd-hh a.btn.otd-book.otd-book.otd-book {
	transition:
		background-color var(--duration-fast) var(--ease-out),
		border-color var(--duration-fast) var(--ease-out),
		color var(--duration-fast) var(--ease-out) !important;
	box-shadow: none !important;
}
/* The plugin's legacy focus rule `.btn:not()x3:focus { box-shadow: none !important }` scores 6, so the
   white gap needs 7: four .otd-book (Michael, build G .0308). */
body.otd-hh a.btn.otd-book.otd-book.otd-book.otd-book:focus-visible {
	box-shadow: 0 0 0 var(--focus-offset) var(--focus-gap-colour) !important;
}


/* 3c. THE THEME'S OWN GREY BUTTONS take the same look (Waseem, 30 Sep: "all CTAs on the site should match").
   Read from staging on six page types, these are the buttons that were NOT yet the standard CTA:
     a.btn.btn-tertiary                       Get Directions, Book an Appointment, Contact Us (the footer band, every page),
                                              Read More and Services (home), the search submit (inner pages)
   They were Poppins 15px, 36px tall (52px on the home page), 5px corners on the home page and 30px elsewhere, 280px wide.
   They now match --tertiary exactly: Open Sans 16px / 500, 44px tall, full pill, 24px side padding, width from the text, grey fill
   #515153 with a white label (7.92:1), the same hover (fill and label swap, section 2), two-tone focus ring and 200ms colour fade. No markup change is
   needed, and adding otd-book otd-book--tertiary to them gives the same result (3b). The selector repeats .btn-tertiary so it outranks the
   plugin's generic `.btn:not()x3` rules; !important only on background, border-color and color, as everywhere else in this file.
   Also covered: the sidebar search submit (input.btn.btn-tertiary) and the contact form's Submit (input.wpcf7-submit). NOT touched: the round
   accessibility-toolbar buttons (.btn-floating) and buttons already .otd-book. */
body.otd-hh a.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book),
body.otd-hh button.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book),
body.otd-hh input.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book),
body.otd-hh input.wpcf7-submit.wpcf7-submit.wpcf7-submit.btn:not(.otd-book) {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: var(--space-2);
	box-sizing: border-box;
	width: auto;
	max-width: 100%;
	height: auto;
	min-height: var(--cta-height-compact);
	margin: 0;
	padding: 0 var(--cta-pad-x);
	border: var(--border-strong) solid var(--color-grey);
	border-radius: var(--radius-pill);
	box-shadow: none;
	font-family: var(--font-ui);
	font-size: var(--text-16);
	font-weight: var(--weight-ui);
	line-height: var(--leading-body);
	letter-spacing: normal;
	text-transform: none;
	text-align: center;
	text-decoration: none;
	cursor: pointer;
	transition:
		background-color var(--duration-fast) var(--ease-out),
		border-color var(--duration-fast) var(--ease-out),
		color var(--duration-fast) var(--ease-out);
	background-color: var(--color-grey) !important;
	border-color: var(--color-grey) !important;
	color: var(--color-white) !important;
}
body.otd-hh a.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book):hover,
body.otd-hh button.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book):hover,
body.otd-hh input.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book):hover,
body.otd-hh input.wpcf7-submit.wpcf7-submit.wpcf7-submit.btn:not(.otd-book):hover {
	background-color: var(--color-grey-hover) !important;
	border-color: var(--color-grey-hover) !important;
	color: var(--color-white) !important;
}
body.otd-hh a.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book):active,
body.otd-hh button.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book):active,
body.otd-hh input.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book):active,
body.otd-hh input.wpcf7-submit.wpcf7-submit.wpcf7-submit.btn:not(.otd-book):active {
	background-color: var(--color-ink) !important;
	border-color: var(--color-ink) !important;
	color: var(--color-white) !important;
}
body.otd-hh a.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book):focus-visible,
body.otd-hh button.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book):focus-visible,
body.otd-hh input.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book):focus-visible,
body.otd-hh input.wpcf7-submit.wpcf7-submit.wpcf7-submit.btn:not(.otd-book):focus-visible {
	outline: var(--focus-width) solid var(--focus-ink);
	outline-offset: var(--focus-offset);
	box-shadow: 0 0 0 var(--focus-offset) var(--focus-gap-colour) !important;
}

/* The contact form's Submit keeps the full width of its field (a form convention), and the theme's 20px bottom margin on phones
   is handled in forms.css; its height, corners, font, colours and hover are the standard CTA. */
body.otd-hh .wpcf7-form input.wpcf7-submit.wpcf7-submit.wpcf7-submit.btn:not(.otd-book) {
	width: 100%;
}

/* The footer band's three buttons are the SAME WIDTH (Waseem, 30 Sep): each fills its column up to 280px, so Get Directions,
   Book an Appointment and Contact Us line up as a set, as they did on live (275px). On a phone the columns stack and each button
   is still at most 280px, centred. */
body.otd-hh .contact-cta a.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book),
body.otd-hh .contact-cta a.otd-book {
	width: 100%;
	max-width: 280px;
}



/* ==========================================================================
   4. Loading and disabled
   ========================================================================== */

/* Loading: a ring before the label. The label text changes too ("Opening booking..."),
   so the state is never carried by the ring alone. */
body.otd-hh .otd-book[aria-busy="true"] {
	cursor: progress;
}
body.otd-hh .otd-book[aria-busy="true"]::before {
	content: "";
	flex: none;
	box-sizing: border-box;
	width: var(--text-16);
	height: var(--text-16);
	border: var(--border-strong) solid currentColor;
	border-top-color: transparent;
	border-radius: 50%;
	animation: otd-book-spin var(--duration-spin) linear infinite;
}
@keyframes otd-book-spin {
	to { transform: rotate(360deg); }
}

/* Disabled: dimmed, flat, not-allowed. Kept readable at 5.61:1 because a person in pain
   is exactly who reads a disabled button trying to work out why. JS must also
   preventDefault on click; aria-disabled does not stop an anchor navigating. */
body.otd-hh a.otd-book[aria-disabled="true"],
body.otd-hh a.otd-book[aria-disabled="true"]:hover,
body.otd-hh a.otd-book[aria-disabled="true"]:active {
	background-color: var(--color-surface-disabled) !important;
	border-color: var(--color-surface-disabled) !important;
	color: var(--color-on-disabled) !important;
	cursor: not-allowed;
}


/* ==========================================================================
   5. Unavailable - the fallback when NexHealth cannot be reached
   REPLACES the button. With the form gone, a dead booking link would leave a patient
   with no way to reach the practice, so this always carries a tappable phone number.
   Markup:
     <div class="otd-book-unavailable" role="alert">
       <p class="otd-book-unavailable__text">Online booking is not working right now.
          Please call us on (858) 748-2101.</p>
       <a class="otd-book otd-book--tertiary" href="tel:+18587482101">Call (858) 748-2101</a>
     </div>
   The number is in the sentence AND on the button, so it survives a screen reader that
   skips links. At 320px it wraps to three lines; the button is 188px wide at 16px/500,
   so it fits the 288px column. The phone comes from OTD_PHONE_E164 / OTD_PHONE_DISPLAY.
   ========================================================================== */

body.otd-hh .otd-book-unavailable {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--space-3);
	box-sizing: border-box;
	max-width: var(--measure-line);
	padding: var(--space-4);
	border: var(--border-strong) solid var(--color-error-ink);
	border-radius: var(--radius-card);
	background-color: var(--color-error-surface);
	color: var(--color-error-ink);
	text-align: center;
}
body.otd-hh .otd-book-unavailable__text {
	margin: 0;
	font-size: var(--text-16);
	font-weight: var(--weight-ui);
	line-height: var(--leading-body);
}


/* ==========================================================================
   6. Slots
   ========================================================================== */

/* 6a. Pair: Book + a second action (Get Directions, Call Now). Stacks on a phone. */
body.otd-hh .otd-book-pair {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--space-3);
}

/* 6b. End-of-page and blog-footer block. The supporting line sits ABOVE the button and
   is the prompt; there is no heading, so a screen reader hears one clear label
   (aria-label on the wrapper) rather than a heading and a paragraph saying the same thing.
     <aside class="otd-book-block" aria-label="Book an appointment">
       <p class="otd-book-block__line">Ready to schedule? Pick a time that suits you.</p>
       <a class="otd-book otd-book--primary otd-book--hero" ...>...</a>
     </aside> */
body.otd-hh .otd-book-block {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--space-4);
	box-sizing: border-box;
	max-width: var(--measure-line);
	margin: var(--space-7) auto;
	padding: var(--space-6) var(--space-5);
	border: var(--border-thin) solid var(--color-surface-hover);
	border-radius: var(--radius-card);
	background-color: var(--color-white);
	color: var(--color-ink);
	text-align: center;
}
body.otd-hh .otd-book-block__line {
	margin: 0;
	font-size: var(--text-18);
	line-height: var(--leading-body);
}

/* 6c. Sidebar block. Button, then a Call Now text link beneath (a link, not a second
   button: one primary per block). */
body.otd-hh .otd-book-side {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--space-3);
	text-align: center;
	color: var(--color-ink);
}
body.otd-hh .otd-book-side__line {
	margin: 0;
	font-size: var(--text-16);
	line-height: var(--leading-body);
}
body.otd-hh .otd-book-side__call {
	display: inline-flex;
	align-items: center;
	min-height: var(--size-tap-min);
	padding: 0 var(--space-2);
	color: var(--color-ink);
	font-size: var(--text-16);
	font-weight: var(--weight-ui);
	text-decoration: underline;
	text-underline-offset: var(--space-1);
}
body.otd-hh .otd-book-side__call:hover {
	text-decoration-thickness: var(--border-strong);
}
body.otd-hh .otd-book-side__call:focus-visible {
	outline: var(--focus-width) solid var(--focus-ink);
	outline-offset: var(--focus-offset);
	box-shadow: 0 0 0 var(--focus-offset) var(--focus-gap-colour);
}


/* 6d. The sidebar card on almost every template: SAME FOOTPRINT AS THE FORM, two CTAs inside.
   Real markup, read from staging (a service page):
     div.form-wrapper-default.bg-form.z-depth-1
       > div.contact-form
           > div.form-name.bg-primary            the HEADER band (a heading, not a button)
           > div.inner-form-wrapper.otd-cta-body
               > a.otd-cta.otd-cta-primary        Book An Appointment
               > a.otd-cta.otd-cta-secondary      Call (858) 748-2101
   The card is now 317px tall (57px header + 260px body; Waseem chose it 30 Sep, down from the form's 484px).
   Tarek: check a few templates for row alignment, because the old 425px hold existed to keep the sidebar
   column the same depth.
   What changes is what fails a measurable standard:
     header band  white on tan #bc8452 is 3.20:1, and 18px/500 is not large text. Fill becomes
                  #9a6c43 (4.57:1) and the size 20px. The words "Request An Appointment" are
                  Esraa's to change; "Request" no longer describes a booking.
     buttons      Book keeps the GREY fill (Waseem, 28 Sep: grey under a tan header avoids
                  tan-on-tan) and takes the --tertiary variant, 7.92:1. Call is --secondary.
                  Both are 56px (--hero) with the shared focus ring, hover and fade.
   Michael's JS adds `otd-book otd-book--tertiary otd-book--hero` to the primary and
   `otd-book otd-book--secondary otd-book--hero` to the secondary, and keeps otd-cta. */
body.otd-hh .form-wrapper-default {
	box-sizing: border-box;
	overflow: hidden;
	border: var(--border-thin) solid var(--color-card-border) !important;
}
body.otd-hh .form-wrapper-default .form-name {
	/* Tarek G8: the band measured 55px against the form's 57px once the type went to 20px. Fixed at 57px,
	   text centred, so the card footprint is unchanged whatever the line height does. */
	display: flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	min-height: var(--card-head-height);
	background-color: var(--color-accent) !important;
	color: var(--color-on-accent) !important;
	font-size: var(--text-20);
	font-weight: var(--weight-ui);
	line-height: var(--leading-heading);
}
body.otd-hh .form-wrapper-default .inner-form-wrapper.otd-cta-body {
	box-sizing: border-box;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: var(--space-4);
	min-height: var(--card-body-min-height);
	padding: var(--space-5) var(--space-4);
	background-color: var(--color-card-bg);
}
/* The Call button in the card is the white (secondary) variant, and white on the light grey card body (#e9e9e9-ish) is
   only about 1.2:1: the button's edge disappears (Waseem, 30 Sep: a CTA should not be the same colour as what it sits
   on). Here it gets a 2px dark grey outline and stays white inside, so it reads as a button on the card; hover still
   inverts to dark grey with a white label, with the outline kept dark (a white ring would vanish on this card).
   Outline #515153 on the card body #eaeaea is 6.5:1. */
/* The two stacked buttons in the card are the SAME WIDTH (Waseem, 30 Sep: Book was 215px and Call 192px). Both fill the card body's
   inner width, 56px tall; the card is centred, so they line up on both edges. */
body.otd-hh .form-wrapper-default .otd-cta-body a.otd-book {
	width: 100%;
}
body.otd-hh .form-wrapper-default .otd-cta-body a.otd-book.otd-book--secondary {
	border-color: var(--color-grey) !important;
}
body.otd-hh .form-wrapper-default .otd-cta-body a.otd-book.otd-book--secondary:hover,
body.otd-hh .form-wrapper-default .otd-cta-body a.otd-book.otd-book--secondary:active {
	border-color: var(--color-grey) !important;
}

@media only screen and (max-width: 599px) {
	body.otd-hh .form-wrapper-default .inner-form-wrapper.otd-cta-body {
		min-height: 0;
	}
}


/* ==========================================================================
   7. Mobile Book / Call bar
   Two buttons, four characters each, so both fit at 320px. Hidden until JS adds
   .is-visible (after the hero leaves the viewport) so it never duplicates the hero pair.
   Phones and tablets only: below 993px.
     <nav class="otd-book-bar" aria-label="Book or call">
       <a class="otd-book otd-book--primary" href="...NexHealth...">Book</a>
       <a class="otd-book otd-book--tertiary" href="tel:+18587482101">Call</a>
     </nav>
   Michael: add body.otd-has-bar while it is shown, and measure the accessibility
   toolbar and back-to-top (.btn-floating) against it. They must sit above the bar,
   not under it: raise their `bottom` by var(--bar-height).
   ========================================================================== */

body.otd-hh .otd-book-bar {
	display: none;
}

@media only screen and (max-width: 992px) {
	body.otd-hh .otd-book-bar.is-visible {
		position: fixed;
		inset: auto 0 0 0;
		z-index: var(--z-bar);
		display: grid;
		grid-template-columns: 1fr 1fr;
		gap: var(--space-3);
		box-sizing: border-box;
		padding: var(--space-3) var(--space-4);
		padding-bottom: calc(var(--space-3) + env(safe-area-inset-bottom));
		border-top: var(--border-thin) solid var(--color-surface-hover);
		background-color: var(--color-white);
	}
	body.otd-hh .otd-book-bar .otd-book {
		width: 100%;
	}
	body.otd-hh.otd-has-bar {
		padding-bottom: calc(var(--bar-height) + var(--border-thin) + env(safe-area-inset-bottom));
	}
}


/* ==========================================================================
   8. Width by breakpoint
   Phone: --cta-mobile-width (100% by default; `auto` restores text-based width).
   600px and up: text-based, auto, never stretched. Literal 600px = --bp-tablet-up.
   ========================================================================== */

body.otd-hh a.otd-book.otd-book--hero,
body.otd-hh .otd-book-block a.otd-book,
body.otd-hh .otd-book-pair a.otd-book {
	width: var(--cta-mobile-width);
}

@media only screen and (min-width: 600px) {
	body.otd-hh a.otd-book.otd-book--hero,
	body.otd-hh .otd-book-block a.otd-book,
	body.otd-hh .otd-book-pair a.otd-book {
		width: auto;
	}
	body.otd-hh .otd-book-pair {
		flex-direction: row;
		justify-content: center;
	}
}


/* ==========================================================================
   8b. Home hero buttons (moved here from homepage-hero.css, 30 Sep 2026, so they ship with the buttons)
   Markup: the plugin's .otd-hero-actions inside #home-slider, holding two a.otd-book.otd-book--hero.
   - The theme's own pair (.btn.call, .btn.schedule) is hidden at every width. It showed as a stray grey
     button and a second "Book an Appointment" under Call Now on phones.
   - Gutter: on phones the hero's content sits inside --gutter-phone (20px) each side, the same as the
     headline (set on the caption in homepage-hero.css). The buttons fill that width, so their edges
     line up with the text edges.
   - 320-499px: full width, stacked, --space-3 (12px) apart, 56px tall (the hero size).
   - 500-992px: stop stretching. Each button is capped at 440px and centred, STACKED: each on its own row
     (Waseem, 30 Sep: at 611px wide he expected one button per row; my earlier row-from-600 was wrong).
   - 993px and up (desktop): side by side at their own text width, centred.
   The plugin's own `flex-direction: column !important` at 992px and below agrees with this; nothing here
   overrides it any more.
   - margin: 0 cancels the theme's .5vh margin on .btn, which made the gap and the edges vary with the
     viewport height. Needs !important only because the theme's margin is on a longer selector chain.
   ========================================================================== */

body.otd-hh.home #home-slider .btn.call,
body.otd-hh.home #home-slider .btn.schedule {
	display: none !important;
}

body.otd-hh.home #home-slider .otd-hero-actions {
	display: flex !important;
	flex-direction: column;
	align-items: stretch !important;
	gap: var(--space-3);
	width: 100%;
	max-width: none;
	box-sizing: border-box;
	margin: var(--space-4) 0 0 !important;
	padding: 0 !important;
	z-index: var(--z-caption);
}
body.otd-hh.home #home-slider .otd-hero-actions a.otd-book {
	width: 100%;
	margin: 0 !important;
}

@media only screen and (min-width: 500px) and (max-width: 992px) {
	body.otd-hh.home #home-slider .otd-hero-actions {
		align-items: center !important;
	}
	body.otd-hh.home #home-slider .otd-hero-actions a.otd-book {
		max-width: 440px;
	}
}

@media only screen and (min-width: 993px) {
	/* The gap between Book and Call is 12px (--space-3) at EVERY width, phone stack and desktop row alike
	   (decision 30 Sep: one gap, same as the 44px minimum spacing between tap targets). A measured 16.5px at
	   600px was the theme's .5vh margin still on one button (12 + 4.5 at a 900px-tall window): the margin: 0
	   !important on a.otd-book above removes it. */
	body.otd-hh.home #home-slider .otd-hero-actions {
		flex-direction: row;
		align-items: center !important;
		justify-content: center !important;
		gap: var(--space-3);
		margin-top: var(--space-5) !important;
	}
	body.otd-hh.home #home-slider .otd-hero-actions a.otd-book {
		width: auto;
	}
}


/* ==========================================================================
   9. Motion, forced colours
   Reduced motion removes the transition and the spin, NOT the hover state: the
   button must still show it is interactive. Must stay LAST so nothing follows it
   (the plugin lost this cascade to itself once, DEF-5).
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
	body.otd-hh a.btn.otd-book.otd-book.otd-book {
		transition: none !important;
	}
	body.otd-hh a.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book),
	body.otd-hh button.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book),
	body.otd-hh input.btn.btn-tertiary.btn-tertiary.btn-tertiary:not(.otd-book),
	body.otd-hh input.wpcf7-submit.wpcf7-submit.wpcf7-submit.btn:not(.otd-book) {
		transition: none !important;
	}
	body.otd-hh .otd-book {
		transition: none;
	}
	body.otd-hh .otd-book[aria-busy="true"]::before {
		animation: none;
	}
}

@media (forced-colors: active) {
	body.otd-hh .otd-book {
		border-color: ButtonText !important;
		forced-color-adjust: auto;
	}
	body.otd-hh .otd-book[aria-disabled="true"] {
		border-style: dashed;
	}
}

/* ==========================================================================
   IMPORTED VERBATIM from docs/marketing/design/header.css @ 68d83e3. Do not edit here: edit the source and rebuild
   with tools/build-plugin-css.py.
   ========================================================================== */

/* Oak Tree Dental - header bar.
   Owner: Dalia (Section B). DRAFT. Requires tokens.css and cta-booking.css.

   BUILT ON TOP OF the agreed header (oaktree-hero-header-spec.md, 25 Sep; Waseem):
   one bar, logo left, four navigation items immediately beside it, phone and Book Now
   pushed right, Home removed, no review banner, no address row. All of that stands.
   This file changes only what fails a measurable standard:

     - Book Now is the .otd-book component (ink label on tan, 4.5:1+), not white on tan (3.20:1).
     - The phone stays plain text, as Waseem decided on 28 Sep, but is now a 44px tap target.
       The plugin gives it height:auto and no padding (9.5), so its target is the height of the
       text line, well under 44px. Tarek should measure the live number.
     - Nav links are as tall as the bar (78px), so they share one baseline and the panel touches them; they get, a visible focus ring and a hover state.
     - Bar height is a token (78px desktop per the spec, 72px phone per otd-frontend.css 12.4).

   NOT touched: the dropdown panels (About, Services, Patient Information, Patient Education),
   the mobile side menu, and the logo geometry (otd-frontend.css 10.4 / 10.5 / 12.5).

   REAL SELECTORS, from the plugin and the live markup:
     nav.large / nav.small   the theme's two bar states (small = after scrolling)
     .main-nav-wrapper       flex row: logo, menu, actions
     #menu-primary-navigation > li > a.TLPN.main-menu-item     the top-level links
     .otd-nav-actions        phone + Book Now, pushed right
     .otd-nav-cta-phone      the number, plain text
     .otd-nav-cta-book       Book Now; Michael's JS adds `otd-book otd-book--primary`
     .button-collapse        the hamburger, below 993px

   COLOUR FOLLOWS THE BAR
     home, bar over the photograph : white text.  White on the 0.55 scrim: 4.74:1 worst case.
     interior pages and nav.small  : --color-grey on white, 7.92:1.
   BREAKPOINT: 993px literal = --bp-desktop-up in tokens.css.
   !important is kept only where the theme sets the same property with !important
   (it does for padding, height and colour on these anchors, per otd-frontend.css 9.4).
*/


/* ==========================================================================
   1. Bar height
   ========================================================================== */

body.otd-hh nav,
body.otd-hh nav .nav-wrapper {
	height: var(--header-height-mobile) !important;
	min-height: var(--header-height-mobile) !important;
}
@media only screen and (min-width: 993px) {
	body.otd-hh nav,
	body.otd-hh nav .nav-wrapper {
		height: var(--header-height-desktop) !important;
		min-height: var(--header-height-desktop) !important;
	}
}


/* ==========================================================================
   2. Top-level links
   16px / 400 (Open Sans, measured live). Text colour follows the bar. A 44px target
   with 12px either side, so neighbours do not touch. Hover underlines, and never moves.
   ========================================================================== */

@media only screen and (min-width: 993px) {
	body.otd-hh #menu-primary-navigation > li > a.TLPN.main-menu-item {
		display: inline-flex;
		align-items: center;
		/* Every top-level link is the full bar height, so all four share one baseline and
		   the About panel can start exactly at the bar's edge (menu.css). A 78px target
		   clears 44px by a wide margin. If only About were tall, About's label would sit
		   lower than its neighbours. */
		min-height: var(--header-height-desktop);
		padding: 0 var(--space-3);
		font-family: var(--font-ui);
		font-size: var(--text-16);
		font-weight: var(--weight-regular);
		text-decoration: none;
		text-underline-offset: var(--space-1);
		transition: color var(--duration-fast) var(--ease-out);
	}
	body.otd-hh #menu-primary-navigation > li > a.TLPN.main-menu-item:hover {
		text-decoration: underline;
		text-decoration-thickness: var(--border-strong);
	}
	body.otd-hh #menu-primary-navigation > li > a.TLPN.main-menu-item:focus-visible {
		outline: var(--focus-width) solid var(--focus-ink);
		outline-offset: var(--focus-offset);
		box-shadow: 0 0 0 var(--focus-offset) var(--focus-gap-colour);
	}

	/* Colour follows the bar. */
	body.otd-hh.home nav:not(.small) #menu-primary-navigation > li > a.TLPN.main-menu-item {
		color: var(--color-white);
	}
	body.otd-hh:not(.home) #menu-primary-navigation > li > a.TLPN.main-menu-item,
	body.otd-hh nav.small #menu-primary-navigation > li > a.TLPN.main-menu-item {
		color: var(--color-grey);
	}
}


/* ==========================================================================
   3. Actions: phone (plain text) and Book Now (the one button)
   ========================================================================== */

@media only screen and (min-width: 993px) {
	body.otd-hh .otd-nav-actions {
		display: flex;
		align-items: center;
		gap: var(--space-5);
	}
}

/* The phone. Plain text among text links, per Waseem 28 Sep, but a real target. */
body.otd-hh .otd-nav-cta-phone {
	display: inline-flex !important;
	align-items: center;
	min-height: var(--size-tap-min);
	padding: 0 var(--space-2) !important;
	font-family: var(--font-ui);
	font-size: var(--text-16);
	font-weight: var(--weight-regular);
	text-decoration: none;
	text-underline-offset: var(--space-1);
	white-space: nowrap;
}
body.otd-hh .otd-nav-cta-phone:hover {
	text-decoration: underline;
	text-decoration-thickness: var(--border-strong);
}
body.otd-hh .otd-nav-cta-phone:focus-visible {
	outline: var(--focus-width) solid var(--focus-ink);
	outline-offset: var(--focus-offset);
	box-shadow: 0 0 0 var(--focus-offset) var(--focus-gap-colour);
}
body.otd-hh.home nav:not(.small) .otd-nav-cta-phone {
	color: var(--color-white) !important;
}
body.otd-hh:not(.home) .otd-nav-cta-phone,
body.otd-hh nav.small .otd-nav-cta-phone {
	color: var(--color-grey) !important;
}

/* Book Now. Geometry, colour and states all come from .otd-book in cta-booking.css
   (44px, ink on tan, hover, focus, active). Nothing repeated here: the only rule is
   that it never stretches inside the bar. */
body.otd-hh .otd-nav-actions .otd-book {
	flex: none;
	width: auto;
}

/* Below 993px the desktop menu rules above do not apply, and the actions are left to the
   plugin's own mobile rules (otd-frontend.css 16.x), which this file does not change.
   Book and Call also live in the hero and in the Book / Call bar (cta-booking.css 7).
   Tarek: confirm what the actions do at 390px on staging. */


/* ==========================================================================
   3b. Phone bar: logo and hamburger on ONE centre line (Waseem, 30 Sep)
   Measured on staging at 390px: the bar is 72px tall, so its centre line is 36px. The logo sat on it,
   but the hamburger glyph was centred at 30px, 6px too high, because its 72px box does not centre what
   is inside it. Fix: the logo is 48px (was 36px) and centred on the line; the hamburger box centres its
   glyph on the same line.
   The plugin sets logo height and top with !important (otd-frontend.css 12.4 and 12.5, and 10.5), so
   this repeats .otd-hh to outscore them. Michael can retire the old logo rules for widths under 993px.
   ========================================================================== */

@media only screen and (max-width: 992px) {
	body.otd-hh.otd-hh nav.large .nav-logo img,
	body.otd-hh.otd-hh nav.small .nav-logo img {
		height: var(--logo-height-mobile) !important;
		top: calc((var(--header-height-mobile) - var(--logo-height-mobile)) / 2) !important;
		bottom: auto !important;
		width: auto !important;
	}
	/* The theme gives the glyph `margin-top: 15px` (.svg-icon.svg-icon-hamburger-menu-icon), which pushed it to
	   43.5px after the centring above. Zeroed so it sits on the 36px line (Michael, .0445). */
	body.otd-hh .button-collapse svg.svg-icon.svg-icon-hamburger-menu-icon {
		margin-top: 0;
	}
	body.otd-hh.otd-hh .button-collapse {
		display: flex !important;
		align-items: center;
		justify-content: center;
		height: var(--header-height-mobile) !important;
		line-height: 0 !important;
	}
}


/* ==========================================================================
   4. Hamburger
   The plugin gives it a 72px-tall tap target (12.4) carrying a 26px glyph: it already
   clears 44px. Width is stated so it does too, and it gets the two-tone focus ring.
   ========================================================================== */

@media only screen and (max-width: 992px) {
	body.otd-hh .button-collapse {
		min-width: var(--size-tap-min);
	}
	body.otd-hh .button-collapse:focus-visible {
		outline: var(--focus-width) solid var(--focus-ink);
		outline-offset: calc(var(--focus-width) * -1 - var(--focus-offset));
		box-shadow: inset 0 0 0 var(--focus-offset) var(--focus-gap-colour);
	}
}


/* ==========================================================================
   5. Sub-nav panel: see menu.css
   The About panel, its hover / focus state (DEF-M3 C-b) and the mobile list live in
   menu.css, so there is one source. Nothing is repeated here.
   ========================================================================== */


/* ==========================================================================
   6. Reduced motion. Last in the file.
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
	body.otd-hh #menu-primary-navigation > li > a.TLPN.main-menu-item {
		transition: none;
	}
}

/* ==========================================================================
   IMPORTED VERBATIM from docs/marketing/design/menu.css @ 59b9e5f. Do not edit here: edit the source and rebuild
   with tools/build-plugin-css.py.
   ========================================================================== */

/* Oak Tree Dental - phone menu. Owner: Dalia (Section B). Requires tokens.css.

   WHAT THIS FILE IS NOW (30 Sep 2026)
   It used to also style the desktop About dropdown (the plugin's ul.otd-subnav: the item indicator, the
   panel, its motion, items and hover, about 200 lines, measured on the vendor's Services panel). Waseem's
   rule is that About matches Services, and in build .2016 About's desktop dropdown became the THEME'S OWN
   mega-menu markup, the same ul#dropdown-... structure as Services, so the theme animates and styles it.
   Those rules matched nothing, so they were deleted, with the tokens only they used (--delay-panel-open,
   --duration-panel, --duration-indicator, --measure-panel, --panel-half, --nav-indicator-height,
   --color-nav-indicator and the --panel-* tokens, --shadow-panel, --focus-on-dark). They are in git
   history (commit 3e96a9e and earlier) if the About panel is ever rebuilt.

   What remains:
   4   hide any leftover .otd-subnav at 992px and below (harmless if nothing matches)
   4b  the Book an Appointment button at the bottom of the phone slide-out
*/


/* ==========================================================================
   4. Phones and tablets: no desktop panel
   The desktop About panel must never appear over the hero, so it is switched off here.
   The phone slide-out list is NOT styled here any more (30 Sep 2026, Waseem's rule: About matches
   Services): About in the slide-out uses the theme's own sub-menu markup, identical to Services, so the
   48px child indent and the #mobile-demo .otd-subnav rules were removed.
   ========================================================================== */

@media only screen and (max-width: 992px) {
	body.otd-hh #menu-primary-navigation .otd-subnav {
		display: none;
	}
}


/* ==========================================================================
   4b. Book an Appointment at the bottom of the phone slide-out (Waseem, 30 Sep 2026)
   Markup, Michael adds it as the LAST child of ul#mobile-demo (the slide-out list):
     <li class="otd-menu-cta">
       <a class="otd-book otd-book--primary otd-book--hero" href="https://app.nexhealth.com/appt/rafik-riad-dds?lid=358242">
         <span class="otd-book__label">Book an Appointment</span></a>
     </li>
   The slide-out is a fixed, full-height, scrolling panel (#515153). The list becomes a column so the
   button's li can use margin-top:auto: it sits at the BOTTOM of the panel when the list is short, and
   sticks to the bottom edge when an open submenu makes the list taller than the screen.
   - Gutter 20px each side, the same as the hero (--gutter-phone); 56px tall (hero size); full width of the panel.
   - Tan fill with a 2px WHITE border: tan #9a6c43 on the grey panel is only 1.8:1, so the white ring is what
     makes the button's edge visible (7.92:1). The label is white on tan, 4.57:1.
   - The panel's own link rules (30px left padding, 48px line height, all !important in the theme) would
     squash the button, so the four properties they set are restated here with a higher score.
   ========================================================================== */

@media only screen and (max-width: 992px) {
	body.otd-hh #mobile-demo {
		display: flex;
		flex-direction: column;
	}
	body.otd-hh #mobile-demo > li {
		flex: none;
	}
	body.otd-hh #mobile-demo > li.otd-menu-cta {
		position: sticky;
		bottom: 0;
		margin-top: auto;
		padding: var(--space-4) var(--gutter-phone) calc(var(--space-4) + env(safe-area-inset-bottom));
		border: 0;
		background-color: var(--color-grey);
		line-height: normal;
	}
	body.otd-hh nav #mobile-demo > li.otd-menu-cta a.otd-book {
		display: flex;
		width: 100%;
		height: var(--cta-height-hero);
		margin: 0;
		padding: 0 var(--cta-pad-x) !important;
		border-color: var(--color-white) !important;   /* the primary variant's own border-color is on a longer chain */
		line-height: var(--leading-body) !important;
		text-align: center !important;
	}
}

/* ==========================================================================
   IMPORTED VERBATIM from docs/marketing/design/forms.css @ 2760249. Do not edit here: edit the source and rebuild
   with tools/build-plugin-css.py.
   ========================================================================== */

/* Oak Tree Dental - form additions.
   Owner: Dalia (Section B). DRAFT: Michael builds, Tarek tests, Mona reviews, Riad's go.
   Requires tokens.css.

   1. THE reCAPTCHA NOTICE ON /contact-us/  (Mohsen, 29 Sep; design call under SHARED-RULES 12)

   DECISION: show Google's line under the form. Do NOT unhide the badge.

   Why:
     - The badge is a fixed 256px-wide box pinned bottom-right. On this site that corner
       already holds the accessibility toolbar and, from the booking build, the mobile
       Book / Call bar and back-to-top. Unhiding it would put a fourth floating object on
       the phone screen of a patient who is trying to fill in a form, and on a phone it
       covers the submit button's neighbours.
     - Google explicitly allows hiding the badge when the fixed line is shown in the form's
       user flow, so the line is the compliant and the quieter option.
     - The line also reads properly to a screen reader and can be zoomed, which the badge,
       a floating iframe, cannot.

   WORDING is Google's and must not change (Mona / Mohsen):
     This site is protected by reCAPTCHA and the Google <a>Privacy Policy</a> and <a>Terms of Service</a> apply.
   Links: https://policies.google.com/privacy and https://policies.google.com/terms

   PLACEMENT: directly under the submit button, CENTRED under it (30 Sep, Michael's question: the
   theme centres the submit, and a left-aligned line 265px away would read as detached small print),
   above the form's response message, so it is read as part of the action ("by sending this, ..."), not as
   small print in a corner.
   REVISED 30 Sep after Tarek's test (G7): a separate new row started 63px left of the fields (the
   theme indents the fields with an icon column), sat 40px below the submit, and the theme's link
   rule turned the links grey with its own focus ring. So: the note goes INSIDE the submit's own
   container, and the links carry a class that outranks the theme.
   Real markup on /contact-us/ (read from the live page): the submit is
   `input.wpcf7-form-control.wpcf7-submit` in `div.row > div.input-field.col.s12`. Put the note
   INSIDE that same `div.input-field.col.s12`, immediately after the submit input:

     <p class="otd-recaptcha-note">This site is protected by reCAPTCHA and the Google
       <a class="otd-recaptcha-link" href="https://policies.google.com/privacy" target="_blank" rel="noopener">Privacy Policy<span class="otd-visually-hidden"> (opens in a new tab)</span></a> and
       <a class="otd-recaptcha-link" href="https://policies.google.com/terms" target="_blank" rel="noopener">Terms of Service<span class="otd-visually-hidden"> (opens in a new tab)</span></a> apply.</p>

   The links open in a new tab so a patient who reads them does not lose a half-completed form.
   The badge's existing hide rule stays. It applies on /contact-us/ only, because reCAPTCHA
   loads only there.

   STYLE (all tokens):
     14px / 400, line-height 1.5, the site grey #515153 on white: 7.92:1. (Was 16px; Waseem chose 14px on
     30 Sep so the note reads as small print and fits on one line at desktop width. It is the ONLY text on the
     site below 16px, because it is legal boilerplate, not content. No lock icon: a padlock reads as a
     promise of encryption that Google's line does not make; that would be Mona's ruling.)
     Links: ink, underlined (never colour alone), 2px underline on hover; focus is the shared
     two-tone ring. Inline links inside a sentence are exempt from the 44px target rule.
     Measure capped at 640px so the sentence never runs edge to edge on a wide screen.
     Space above: 16px from the submit button. Below: 16px before the response message.
*/


body.otd-hh .otd-recaptcha-note {
	max-width: var(--measure-line);
	margin: var(--space-4) auto var(--space-4);
	text-align: center;
	font-family: var(--font-ui);
	font-size: var(--text-14);
	font-weight: var(--weight-regular);
	line-height: var(--leading-body);
	color: var(--color-grey);
}

/* The theme's `a:not(.text-contrast):not(.btn)...` rule sets colour: inherit and scores 8 classes, so the
   link repeats its :not() chain and adds the note's own classes (Michael, build G .0308). */
body.otd-hh .wpcf7-form .otd-recaptcha-note a.otd-recaptcha-link:not(.text-contrast):not(.btn):not(.btn-tertiary):not(.btn-transparent):not(.btn-floating):not(.breadcrumb):not(.edit-link):not(.TLBC) {
	color: var(--color-ink);
	text-decoration: underline;
	text-underline-offset: var(--space-1);
}
body.otd-hh .wpcf7-form .otd-recaptcha-note a.otd-recaptcha-link:not(.text-contrast):not(.btn):not(.btn-tertiary):not(.btn-transparent):not(.btn-floating):not(.breadcrumb):not(.edit-link):not(.TLBC):hover {
	text-decoration-thickness: var(--border-strong);
}
body.otd-hh .wpcf7-form .otd-recaptcha-note a.otd-recaptcha-link:not(.text-contrast):not(.btn):not(.btn-tertiary):not(.btn-transparent):not(.btn-floating):not(.breadcrumb):not(.edit-link):not(.TLBC):focus-visible {
	outline: var(--focus-width) solid var(--focus-ink);
	outline-offset: var(--focus-offset);
	box-shadow: 0 0 0 var(--focus-offset) var(--focus-gap-colour);
}

/* For "(opens in a new tab)" and similar: read by screen readers, not seen. */
body.otd-hh .otd-visually-hidden {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}

/* CF7 shows its spinner as a 24px block after the submit, which pushed the note 40px away. Taking it out of
   the flow keeps the note 16px below the button; the spinner still appears while sending (Michael). */
body.otd-hh .wpcf7-form .wpcf7-spinner {
	position: absolute;
}

/* On phones the theme gives the submit a 20px bottom margin (margin: 20px 85px), which made the gap under
   the button 36px instead of 16px (Michael, build G .0313, 390px). Zeroing ONLY the bottom margin under
   600px keeps the note 16px below on every width and does not depend on the theme's number. The side
   margins are left to the theme. Literal 599px = --bp-tablet-up minus one. */
@media only screen and (max-width: 599px) {
	body.otd-hh .wpcf7-form input.wpcf7-submit {
		margin-bottom: 0;
	}
}

/* ==========================================================================
   IMPORTED VERBATIM from docs/marketing/design/footer.css @ e3a2248. Do not edit here: edit the source and rebuild
   with tools/build-plugin-css.py.
   ========================================================================== */

/* Oak Tree Dental - footer "What Sets Us Apart?" logo pair. Owner: Dalia (Section B). Requires tokens.css.

   THE DEFECT (Waseem, 30 Sep 2026, staging screenshot)
   The San Diego County Dental Society and ADA Member logos did not line up.
   Cause, read from computed style on staging (public page, read-only): .row.footerLogos holds ONE
   Materialize column (.col.s12.m6) that contains BOTH images, one under the other. The column has
   margin-left:auto and float:left, so it sits in the RIGHT half of the row, and each image is centred
   inside it: the Dental Society logo (251px, almost the column width) starts about 17px in, the ADA logo
   (135px) about 58px in. Two stacked logos with two different left edges, neither on the left edge of
   the paragraph above.

   THE FIX (corrected 30 Sep 2026: an earlier version of this note said two columns and side by side; wrong)
   The logos stay STACKED, as on live, and both are flush LEFT on the paragraph's left edge. Nothing is
   resized: they keep the widths the page already gives them (251px and 135px, stated below). This
   matches live except for the alignment defect. Side by side was considered and not done: matching live
   is the launch rule.

   Selector weight: scoped one level deeper than the theme's .row .col chain, no !important.
   Tarek: verify computed float is none and margin-left is 0 on the column, and that both images start
   at the paragraph's left edge.
*/

body.otd-hh .about-paragraph .row.footerLogos {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: flex-start;
	gap: var(--space-4) var(--space-6);
	margin: var(--space-4) 0 0;
	text-align: left;
}
body.otd-hh .about-paragraph .row.footerLogos .col {
	float: none;
	flex: 0 1 auto;
	width: auto;
	max-width: 100%;
	margin: 0;
	padding: 0;
	text-align: left;
}
body.otd-hh .about-paragraph .row.footerLogos .col img {
	display: block;
	max-width: 100%;
	height: auto;
	margin: 0;
}
/* the two sizes the page already used (measured on staging), stated so the row does not depend on the column width */
body.otd-hh .about-paragraph .row.footerLogos .col img[alt*="Dental Society"] { width: 251px; }
body.otd-hh .about-paragraph .row.footerLogos .col img[alt*="American Dental"] { width: 135px; }

/* ==========================================================================
   IMPORTED VERBATIM from docs/marketing/design/homepage-hero.css @ 9cb39e3. Do not edit here: edit the source and rebuild
   with tools/build-plugin-css.py.
   ========================================================================== */

/* Oak Tree Dental - homepage above the fold.
   Owner: Dalia (Section B). DRAFT. Requires tokens.css and cta-booking.css.

   WHAT THE PAGE IS FOR
   A patient on a phone, maybe in pain, has come to do one of four things: book, call,
   find the practice, or learn whether we take their insurance. The form is gone, so the
   page has ONE primary action (Book an Appointment, to NexHealth), one secondary
   (Call Now), and a strip directly beneath the hero for the other two intents.

   REAL SELECTORS, read from the live homepage (public markup, read-only):
     section#home-slider > ul.slides > li.slide-1 > article.caption-variation-3
       > div.caption-aligner-variation-3 > header.slide-name + header.caption-body
   plus the plugin's injected .otd-hero-actions (holding the two .otd-book buttons).
   The theme source itself is not in version control; nothing here relies on it.

   CONSTRAINTS FROM AGREED SPECS (oaktree-hero-header-spec.md): one static slide, centred
   content, no form module, no slider controls, the four .border-* frame divs hidden.

   !important is used only where the theme sets the same property with !important or an
   id-qualified selector (recorded in otd-frontend.css 10.x). Tarek: verify every
   property below in computed style; if the theme wins, raise specificity, do not stack more.
*/


/* ==========================================================================
   1. The hero frame
   Height is capped so the strip beneath is visible on the first screen: it tells the
   patient there is more, and puts "find us" and "insurance" within reach without a scroll.
   ========================================================================== */

body.otd-hh.home #home-slider {
	height: var(--hero-height-mobile);
}
body.otd-hh.home #home-slider .slides,
body.otd-hh.home #home-slider .slides > li {
	height: 100%;
}

@media only screen and (min-width: 993px) {
	body.otd-hh.home #home-slider {
		height: var(--hero-height-desktop);
	}
}

/* Scrim: even, var(--scrim) = 0.46 over the whole photograph (30 Sep 2026, Waseem's pick: option 2f).
   The photograph is the LIFTED version, assets/oaktree-hero-team-lifted.webp (.jpg as fallback):
   same shot, gamma 0.70, contrast +6%. Every piece of hero text is large text (3:1 needed) so a
   0.46 scrim passes with a 0.044 margin. Replaces the plugin's rgba(0,0,0,.5) on the original photo.
   The hero photograph must keep covering the whole slide (background-size: cover). */
body.otd-hh.home #home-slider .slides > li {
	position: relative;
}
body.otd-hh.home #home-slider .slides > li::after {
	content: "";
	position: absolute;
	inset: 0;
	background: var(--scrim);
	pointer-events: none;
	z-index: var(--z-scrim);
}


/* ==========================================================================
   2. Content: centred column, clear of the header, vertically centred in what remains
   The theme absolutely positions the caption (top:16vh; left:5.5vw). Fill the slide
   instead and let flexbox centre, so nothing depends on a viewport-height percentage.
   ========================================================================== */

body.otd-hh.home #home-slider .slides > li > .caption-variation-3 {
	position: absolute !important;
	inset: 0 !important;
	width: 100% !important;       /* the theme sets width:87%; with left/right:0 that left the text 94px off centre (found in a staging test, 30 Sep) */
	max-width: none !important;
	box-sizing: border-box;
	display: flex !important;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	padding: var(--header-height-mobile) var(--gutter-phone) var(--space-6);
	z-index: var(--z-caption);
}
@media only screen and (min-width: 993px) {
	body.otd-hh.home #home-slider .slides > li > .caption-variation-3 {
		padding: var(--header-height-desktop) var(--space-7) var(--space-7);
	}
}

body.otd-hh.home #home-slider div[class*="caption-aligner"] {
	display: flex !important;
	flex-direction: column;
	align-items: center !important;
	gap: var(--space-3);
	width: 100%;
	margin: 0 auto !important;
	text-align: center !important;
}

body.otd-hh.home #home-slider .border-top,
body.otd-hh.home #home-slider .border-top-two,
body.otd-hh.home #home-slider .border-right,
body.otd-hh.home #home-slider .border-right-two {
	display: none !important;
}


/* ==========================================================================
   3. Type
   Headline: 32px / 40px phone, 48px / 56px desktop, weight 600 (Apple 56/600, Rocket 48/500,
   both measured). Balanced wrap: two even lines if it must wrap, never a one-word orphan.
   Supporting line: 24px REGULAR at every width (Waseem, 30 Sep: not bold on phones). 24px regular is LARGE
   text under WCAG, so it needs 3:1, and white on the 0.46 scrim measures at least 3.5:1 at the worst pixel.
   (20px bold was the earlier phone size; 20px regular would be normal-size text and need 4.5:1.) It was 15px, smaller than the nav; at 18-20px regular it would need 4.5:1
   and fail on this photograph. Do not shrink it, and do not lighten it below 400, without re-measuring.
   ========================================================================== */

body.otd-hh.home #home-slider .slide-name,
body.otd-hh.home #home-slider .slide-name * {
	max-width: var(--measure-headline) !important;
	margin: 0 auto !important;
	color: var(--color-white) !important;
	font-family: var(--font-display) !important;
	font-size: var(--text-32) !important;
	font-weight: var(--weight-heading) !important;
	line-height: var(--leading-heading) !important;
	text-align: center !important;
	text-wrap: balance;
}
body.otd-hh.home #home-slider .caption-body,
body.otd-hh.home #home-slider .caption-body * {
	max-width: var(--measure-line) !important;
	margin: 0 auto !important;
	color: var(--color-white) !important;
	font-size: var(--text-24) !important;
	font-weight: var(--weight-regular) !important;
	line-height: var(--leading-body) !important;
	text-align: center !important;
	text-wrap: balance;
}

/* 600 to 992px (large phones, tablets, a narrow window): the 32px headline looked small at 611px wide
   (Waseem, 30 Sep), so it is 40px here; the supporting line is already 24px at every width. */
@media only screen and (min-width: 600px) and (max-width: 992px) {
	body.otd-hh.home #home-slider .slide-name,
	body.otd-hh.home #home-slider .slide-name * {
		font-size: var(--text-40) !important;
	}
	body.otd-hh.home #home-slider .caption-body,
	body.otd-hh.home #home-slider .caption-body * {
		max-width: var(--measure-hero-line) !important;
	}
}

@media only screen and (min-width: 993px) {
	body.otd-hh.home #home-slider .slide-name,
	body.otd-hh.home #home-slider .slide-name * {
		font-size: var(--text-48) !important;
		line-height: var(--leading-tight) !important;
	}
	body.otd-hh.home #home-slider .caption-body,
	body.otd-hh.home #home-slider .caption-body * {
		max-width: var(--measure-hero-line) !important;
	}
}


/* ==========================================================================
   4. The actions: Book an Appointment (primary), Call Now (secondary)
   The pair comes from cta-booking.css (.otd-book-pair). Phone: stacked, full width,
   Book first so it is the first thing a thumb reaches. Desktop: side by side, text width.
   The theme's own duplicate pair (.btn.call, .btn.schedule) is hidden in cta-booking.css 8b.
   Acceptance: at 320x568 and 390x844 Book is fully visible without scrolling.
   ========================================================================== */

/* The hero button rules (container, gutter, widths by breakpoint, hiding the theme's own pair, the
   margin reset) now live in cta-booking.css section 8b, so they ship with the buttons. */


/* ==========================================================================
   5. Paths strip: the other two things patients come to do
   NEW markup, inserted by Michael directly after section#home-slider:

     <section class="otd-paths" aria-label="Ways to reach us">
       <a class="otd-paths__item" href="tel:+18587482101">
         <span class="otd-paths__title">Call us</span>
         <span class="otd-paths__text">(858) 748-2101</span></a>
       <a class="otd-paths__item" href="{Google Maps link, already on the page}">
         <span class="otd-paths__title">Find us</span>
         <span class="otd-paths__text">{address, from the practice-facts file}</span></a>
       <a class="otd-paths__item" href="/patient-information/">
         <span class="otd-paths__title">Insurance and payment</span>
         <span class="otd-paths__text">{one line, Esraa}</span></a>
     </section>

   Every item is one whole tap target, 44px minimum by a wide margin. Phone and address are
   real text, not an image. Copy is Esraa's; no fee, carrier or coverage claim belongs here.
   Phone: three stacked rows. Tablet: three columns from 600px.
   ========================================================================== */

body.otd-hh.home .otd-paths {
	display: grid;
	grid-template-columns: 1fr;
	gap: var(--border-thin);
	background-color: var(--color-surface-hover);
	border-bottom: var(--border-thin) solid var(--color-surface-hover);
}

body.otd-hh.home .otd-paths__item {
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: var(--space-1);
	box-sizing: border-box;
	min-height: var(--paths-min-height);
	padding: var(--space-4) var(--space-5);
	background-color: var(--color-white);
	color: var(--color-ink);
	text-decoration: none;
	transition: background-color var(--duration-fast) var(--ease-out);
}
body.otd-hh.home .otd-paths__item:hover {
	background-color: var(--color-surface-hover);
}
body.otd-hh.home .otd-paths__item:focus-visible {
	outline: var(--focus-width) solid var(--focus-ink);
	outline-offset: calc(var(--focus-width) * -1 - var(--focus-offset));
	box-shadow: inset 0 0 0 var(--focus-offset) var(--focus-gap-colour);
}
body.otd-hh.home .otd-paths__title {
	font-size: var(--text-16);
	font-weight: var(--weight-heading);
	line-height: var(--leading-body);
}
body.otd-hh.home .otd-paths__text {
	font-size: var(--text-18);
	line-height: var(--leading-body);
}

@media only screen and (min-width: 600px) {
	body.otd-hh.home .otd-paths {
		grid-template-columns: repeat(3, 1fr);
	}
	body.otd-hh.home .otd-paths__item {
		align-items: center;
		text-align: center;
	}
}


/* ==========================================================================
   6. Reduced motion. Last in the file.
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
	body.otd-hh.home .otd-paths__item {
		transition: none;
	}
}

/* ==========================================================================
   GLUE (hand-written, last): tools/css/otd-glue.css
   ========================================================================== */

/* otd-glue.css - the few rules that make Dalia's imported design win against THEME rules it cannot see.
   Hand-written by Michael, appended LAST by tools/build-plugin-css.py. Each rule says which theme rule it beats.
   Nothing here changes a design VALUE: every value is a token from tokens.css. If Dalia folds a rule into her
   own file, delete it here (the hero font rule was folded into cta-booking.css @ f837178 and removed from here). */

/* 7. Hero pair at tablet and phone widths (Tarek, .0445, Waseem's screenshots).
   (a. The 769-992px box width rule was here; it is now Dalia's, in cta-booking.css 8b.)
   [was: 769-992px: the hero actions box shrank to its content (117px at 820), so the buttons were squeezed to 53-87px
      wide and the label wrapped one letter per line. Under 600px section 2 already gives the box width:100%; the
      same now holds up to the top of the tablet range. (The column layout and centring come from the legacy
      rule for widths up to 992px.)
   b. 320-768px: the theme's `.slider-variation-3.slider .caption-variation-3 a:not(...)` rule sets display:block on
      the hero links, so `align-items:center` in cta-booking.css did nothing and the label sat 14px above centre.
      Same :not() chain as section 1, display:inline-flex as the component asks. */
@media only screen and (max-width: 992px) {
	body.otd-hh .slider-variation-3.slider .caption-variation-3 a.otd-book.otd-book--hero:not(.text-contrast):not(.btn):not(.btn-tertiary):not(.btn-transparent):not(.btn-floating):not(.breadcrumb):not(.edit-link):not(.TLBC) {
		display: inline-flex;
	}
}

/* 11. (removed) The interim rule that kept the page invisible until the script had run is gone: every rewrite now happens
   in PHP, so the HTML arrives final. */

/* 12. Footer band button label casing (Waseem's screenshot, 30 Sep: it showed "Book An Appointment").
   The label in the HTML is "Book an Appointment" (Esraa's ruling: lowercase "an"). The theme's `.btn` rule sets
   text-transform: capitalize, which turns it into "Book An Appointment" on screen. This one button (the label we
   changed) shows the real text as written. Every other property stays exactly as on live. */
body.otd-hh a.btn.otd-book-footer {
	text-transform: none;
}

/* 13. "Helpful Related Links" after the QR column is removed (Dalia's ruling on .0713, relayed by Mohsen).
   The sibling column is widened to fill the row (.otd-qr-widened), so the tan panel is 919px, as intended, but its
   text stretched from live's 689px to 919px. Keep the 919px panel; cap the text column at 689px from 993px up
   (live's column width), no cap below. "Let Us Help" is left as it is. */
@media only screen and (min-width: 993px) {
	body.otd-hh section.SPTS > .col.otd-qr-widened > * {
		max-width: 689px;
	}
}


/* About panel rules (hover background, shadow, sub-menu hover) are gone: About is now the theme's own dropdown, so the theme styles and animates it like Services. */
