/* ==========================================================================
   Ojas Blend — components
   ========================================================================== */

/* ---------- Eyebrow: small Montserrat label above headings ----------------- */

.ojas-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: var(--ojas-space-xs);
  margin-bottom: var(--ojas-space-sm);
  font-family: var(--ojas-font-body);
  font-size: var(--ojas-size-meta);
  font-weight: var(--ojas-weight-semibold);
  line-height: var(--ojas-lh-tight);
  letter-spacing: var(--ojas-track-label);
  text-transform: uppercase;
  color: var(--ojas-eyebrow);
}
.ojas-eyebrow::before {                 /* leaf tick, decorative */
  content: "";
  width: 10px; height: 10px;
  border-radius: 0 10px 0 10px;         /* a leaf-ish lozenge */
  background: var(--ojas-jasmine);
  flex: 0 0 auto;
}
.ojas-section--dark .ojas-eyebrow,
.ojas-hero--dark .ojas-eyebrow { color: var(--ojas-eyebrow-on-dark); }
/*
 * Ink, not Amazon. base.css says of this ground "Jasmine: ink text only
 * (7.4:1)" and then the eyebrow was set in Amazon anyway — 2.94:1 on Jasmine,
 * under AA, on every accent section including the booking block on the front
 * page. The tick goes with it: at 2.94 it was under the 3:1 a meaningful
 * graphic needs too.
 */
.ojas-section--accent .ojas-eyebrow { color: var(--ojas-ink); }
.ojas-section--accent .ojas-eyebrow::before { background: var(--ojas-ink); }
.ojas-eyebrow + :is(h1, h2, h3) { margin-top: var(--ojas-pull); }

/* ---------- Chips (dietary, badges) ----------------------------------------- */

.ojas-chips { display: flex; flex-wrap: wrap; gap: var(--ojas-space-xs); margin: 0; padding: 0; list-style: none; }
.ojas-chip {
  display: inline-flex;
  align-items: center;
  min-height: 26px;
  padding: 3px 10px;
  /* A chip is a word or two. If it is ever handed a sentence it wraps inside
     its card rather than running out of it — the Dough Therapy card did. */
  max-width: 100%;
  white-space: normal;
  overflow-wrap: anywhere;
  text-align: left;
  border-radius: var(--ojas-radius-pill);
  background: var(--ojas-vanilla);
  color: var(--ojas-ink);
  font-size: var(--ojas-size-meta);
  font-weight: var(--ojas-weight-semibold);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
}
.ojas-chip--badge  { background: var(--ojas-lemon); }
.ojas-chip--new    { background: var(--ojas-papaya); }
.ojas-chip--dark   { background: var(--ojas-amazon); color: var(--ojas-white); }
.ojas-section--dark .ojas-chip { background: var(--ojas-glass-fill); color: var(--ojas-offwhite); border: 1px solid var(--ojas-glass-border); }

/* ---------- Buttons: pills, 52px ------------------------------------------- */

.ojas-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--ojas-space-xs);
  min-height: 52px;
  padding: 14px 26px;
  border: 1.5px solid transparent;
  border-radius: var(--ojas-radius-pill);
  font-family: var(--ojas-font-body);
  font-size: var(--ojas-size-ui);
  font-weight: var(--ojas-weight-semibold);
  line-height: var(--ojas-lh-tight);
  letter-spacing: var(--ojas-track-button);
  text-decoration: none;
  cursor: pointer;
  transition: background var(--ojas-transition) var(--ojas-ease),
              color var(--ojas-transition) var(--ojas-ease),
              border-color var(--ojas-transition) var(--ojas-ease),
              transform var(--ojas-transition) var(--ojas-ease);
}
.ojas-btn:hover { transform: translateY(-1px); }
.ojas-btn__icon { transition: transform var(--ojas-transition) var(--ojas-ease); }
.ojas-btn:hover .ojas-btn__icon { transform: translateX(3px); }

.ojas-btn--primary { background: var(--ojas-amazon); color: var(--ojas-white); }           /* 6.0:1 */
.ojas-btn--primary:hover { background: var(--ojas-jasmine); color: var(--ojas-ink); }       /* 7.4:1 */

/*
 * The accent CTA is ink, not Orange Slice.
 *
 * Orange was the guideline's "appetite CTA" and it did the job it was picked
 * for — 3.05:1 against the off-white page, so the button announced itself. Ink
 * announces itself harder (13.9:1 against the same page) and reads restrained
 * rather than loud, which is the register the rest of this site is in.
 *
 * It is distinguished from the primary button by darkness rather than hue —
 * 2.4:1 between the two — so the pair reads as a hierarchy instead of as two
 * competing colours.
 */
.ojas-btn--accent { background: var(--ojas-ink); color: var(--ojas-white); }                /* 14.3:1 */
.ojas-btn--accent:hover { background: var(--ojas-amazon); color: var(--ojas-white); }       /* 6.0:1 */

/*
 * ...and reverses on a dark ground, because ink on the deep green sections is
 * 1.4:1 — a button you cannot see. The CTA band, the gift card, the dark page
 * headers and the Be-the-creator panel all carry accent buttons, so this is not
 * hypothetical. The creator panel was found by measuring every accent button on
 * every page against its own ground, not by reading the templates.
 */
.ojas-section--dark .ojas-btn--accent,
.ojas-hero--dark .ojas-btn--accent,
.ojas-giftcard .ojas-btn--accent,
.ojas-page-header--amazon .ojas-btn--accent,
.ojas-page-header--deep .ojas-btn--accent,
.ojas-creator__panel .ojas-btn--accent { background: var(--ojas-white); color: var(--ojas-ink); }
.ojas-section--dark .ojas-btn--accent:hover,
.ojas-hero--dark .ojas-btn--accent:hover,
.ojas-giftcard .ojas-btn--accent:hover,
.ojas-page-header--amazon .ojas-btn--accent:hover,
.ojas-page-header--deep .ojas-btn--accent:hover,
.ojas-creator__panel .ojas-btn--accent:hover { background: var(--ojas-jasmine); color: var(--ojas-ink); }

.ojas-btn--secondary { background: var(--ojas-jasmine); color: var(--ojas-ink); }           /* 7.4:1 */
.ojas-btn--secondary:hover { background: var(--ojas-amazon); color: var(--ojas-white); }

.ojas-btn--ghost { background: transparent; color: var(--ojas-amazon); border-color: var(--ojas-amazon); }
.ojas-btn--ghost:hover { background: var(--ojas-amazon); color: var(--ojas-white); }
/*
 * A ghost button over a photograph. The default Amazon-on-transparent measures
 * 1.13:1 against the header scrim — invisible — where white is 5.29:1 even if
 * the photograph behind it is pure white.
 */
.ojas-section--dark .ojas-btn--ghost,
.ojas-page-header--amazon .ojas-btn--ghost,
.ojas-page-header--deep .ojas-btn--ghost,
.ojas-hero--dark .ojas-btn--ghost { color: var(--ojas-white); border-color: var(--ojas-glass-border); }
.ojas-section--dark .ojas-btn--ghost:hover,
.ojas-page-header--amazon .ojas-btn--ghost:hover,
.ojas-page-header--deep .ojas-btn--ghost:hover,
.ojas-hero--dark .ojas-btn--ghost:hover { background: var(--ojas-white); color: var(--ojas-amazon); border-color: var(--ojas-white); }
/*
 * A ghost button is a colour and an outline with nothing behind it, so it can
 * only be read against the ground it sits on. Amazon on Amazon is 1.00:1 — the
 * phone number on the speciality headers vanished completely the moment those
 * headers stopped being photographs, because the rule that saved it was keyed
 * to the scrim. Every ground states its own now.
 */
.ojas-page-header--jasmine .ojas-btn--ghost,
.ojas-page-header--island .ojas-btn--ghost,
.ojas-page-header--papaya .ojas-btn--ghost,
.ojas-page-header--lemon .ojas-btn--ghost,
.ojas-page-header--vanilla .ojas-btn--ghost,
.ojas-page-header--band .ojas-btn--ghost { color: var(--ojas-ink); border-color: var(--ojas-ink); }
.ojas-page-header--jasmine .ojas-btn--ghost:hover,
.ojas-page-header--island .ojas-btn--ghost:hover,
.ojas-page-header--papaya .ojas-btn--ghost:hover,
.ojas-page-header--lemon .ojas-btn--ghost:hover,
.ojas-page-header--vanilla .ojas-btn--ghost:hover,
.ojas-page-header--band .ojas-btn--ghost:hover { background: var(--ojas-ink); color: var(--ojas-white); border-color: var(--ojas-ink); }
/* Text buttons in a header, same reasoning. */
.ojas-page-header--amazon .ojas-btn--text,
.ojas-page-header--deep .ojas-btn--text { color: var(--ojas-vanilla); }
.ojas-section--accent .ojas-btn--ghost { color: var(--ojas-ink); border-color: var(--ojas-ink); }
.ojas-section--accent .ojas-btn--ghost:hover { background: var(--ojas-ink); color: var(--ojas-white); }

.ojas-btn--compact { min-height: 44px; padding: 11px 20px; font-size: 14px; }
.ojas-btn--full { width: 100%; }

/*
 * The underlined text CTA. It is not a chunky button, but it is a standalone
 * control rather than a link inside a sentence, so WCAG 2.2's 24x24 minimum
 * target applies — it was 21px. The box now clears that on its own, and an
 * invisible band takes the actual hit area to 44px without moving the
 * underline off the text.
 */
.ojas-btn--text {
  position: relative;
  min-height: 24px;
  padding: 2px 0 5px;
  border: 0;
  border-bottom: 1.5px solid currentColor;
  border-radius: 0;
  background: none;
  color: var(--ojas-amazon);
}
.ojas-btn--text::after {
  content: "";
  position: absolute;
  left: 0; right: 0; top: 50%;
  height: 44px;
  transform: translateY(-50%);
}
.ojas-btn--text:hover { color: var(--ojas-jasmine-text); transform: none; }
.ojas-section--dark .ojas-btn--text { color: var(--ojas-vanilla); }

/* ---------- Header --------------------------------------------------------- */

/*
 * The frosted bar is painted by a pseudo-element, not by the header itself.
 *
 * `backdrop-filter` makes the element carrying it a containing block for
 * fixed-position descendants — and the mobile drawer is a fixed child of this
 * header, so with the filter here its `top: 96px; bottom: 0` resolved against
 * the 97px bar instead of the viewport and the panel collapsed to 64px tall.
 *
 * The rule applies to whatever has the filter, and a pseudo-element cannot
 * contain anything, so moving both the tint and the blur onto ::before keeps
 * the frost at every width and leaves the drawer measuring against the screen.
 * The tint has to move with it: left on the header it would sit *over* the
 * blur and hide it.
 */
.ojas-header {
  position: sticky;
  top: 0;
  z-index: var(--ojas-z-header);
  background: transparent;
  border-bottom: 1px solid var(--ojas-border);
}
.ojas-header::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: rgba(248, 247, 246, 0.92);
  backdrop-filter: saturate(1.2) blur(10px);
}
.ojas-header--overlay { position: absolute; inset: 0 0 auto; background: transparent; border-bottom-color: transparent; backdrop-filter: none; }
.ojas-header__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--ojas-space-lg);
  min-height: var(--ojas-header-h);
}

.ojas-brand { display: inline-flex; align-items: center; text-decoration: none; flex-shrink: 0; }
.ojas-brand img { display: block; }

/* --------------------------------------------------------------------------
   The brand lockup
   The tagline used to be baked into the wordmark artwork, at 13.5% of its
   height — a few pixels of raster type at any size a header can carry, and
   scaling it up only produced a bigger soft thing. The mark now ships without
   it (assets/images/mark-*.png) and "Food for Soul" is live text: crisp at
   every size, scaling with the reader's font settings, translatable, selectable
   and spoken aloud.

   The artwork's own arrangement is kept — tagline beneath the mark, right edges
   aligned — and the whole lockup scales from one number, --ojas-lockup-h.
   -------------------------------------------------------------------------- */
.ojas-lockup {
  --ojas-lockup-h: 48px;
  display: inline-flex;
  flex-direction: column;
  align-items: flex-end;   /* right edges align, as they do in the artwork */
  gap: 3px;
  line-height: 1;
}
.ojas-lockup__mark { height: var(--ojas-lockup-h); width: auto; display: block; }
.ojas-lockup__tagline {
  font-family: var(--ojas-font-body);
  font-weight: var(--ojas-weight-medium);
  /*
   * Measured off the vector, the tagline's ink is 14.4% of the mark's height.
   * Live type is set a good deal larger than that, because the point of the
   * change is that it can be read; the floor stops a small viewport taking it
   * below legibility.
   */
  font-size: max(11px, calc(var(--ojas-lockup-h) * 0.27));
  letter-spacing: 0.02em;
  white-space: nowrap;
  color: var(--ojas-brand-mark);
}

/*
 * One tagline colour per ground, each measured against it. The tagline is set
 * in the mark's own ink, so the two must agree: #1D6837 here was sampled from
 * the guideline-PDF cut, where JPEG had dragged Amazon off by a few points.
 * The vector inks it #14723A exactly, which is 5.61:1 on the header ground —
 * less than the 6.36:1 the drifted green measured, and still clear of AA.
 *
 * On the deep green footer the artwork's own jasmine is 4.39:1 — under AA for
 * text this size — so the lockup uses the guideline's Jasmine hex, which is
 * 4.74:1 and, at a hair apart, indistinguishable beside the mark.
 */
.ojas-lockup--amazon  { --ojas-brand-mark: var(--ojas-amazon); }
.ojas-lockup--jasmine { --ojas-brand-mark: var(--ojas-jasmine); }
.ojas-lockup--white   { --ojas-brand-mark: var(--ojas-white); }

.ojas-footer__brand .ojas-lockup { --ojas-lockup-h: 56px; align-items: flex-start; }
.ojas-footer__brand .ojas-lockup__tagline { padding-inline-start: 2px; }

@media (max-width: 1024px) { .ojas-header .ojas-lockup { --ojas-lockup-h: 40px; } }
@media (max-width: 480px)  { .ojas-header .ojas-lockup { --ojas-lockup-h: 34px; } }
.ojas-brand__name {                     /* text fallback when no logo is uploaded */
  font-family: var(--ojas-font-display);
  font-size: 30px;
  line-height: 1;
  color: var(--ojas-amazon);
  margin: 0;
}
.ojas-header--overlay .ojas-brand__name { color: var(--ojas-white); }

.ojas-header__actions { display: flex; align-items: center; gap: var(--ojas-space-sm); flex-shrink: 0; }
.ojas-header__phone {
  font-size: var(--ojas-size-ui);
  font-weight: var(--ojas-weight-medium);
  text-decoration: none;
  white-space: nowrap;
  color: var(--ojas-ink);
}
@media (max-width: 1200px) { .ojas-header__phone { display: none; } }
@media (max-width: 480px)  { .ojas-header__actions .ojas-btn { display: none; } }
.ojas-nav__actions { display: none; }

/* ---------- Navigation ----------------------------------------------------- */

.ojas-nav ul { list-style: none; margin: 0; padding: 0; }
.ojas-nav > ul { display: flex; align-items: center; gap: var(--ojas-space-lg); }
/*
 * Scoped to the menu list. Written as `.ojas-nav a` it also claimed the "Book
 * catering" button that sits under the list in the drawer — a two-part selector
 * beats `.ojas-btn--primary` — handing it the link's colour, display, padding
 * and bottom rule. Same shape of bug as `.ojas-faq-nav a` had.
 */
.ojas-nav li a {
  display: inline-block;
  padding: var(--ojas-space-xs) 0;
  font-size: var(--ojas-size-ui);
  font-weight: var(--ojas-weight-medium);
  text-decoration: none;
  color: var(--ojas-ink);
}
.ojas-header--overlay .ojas-nav li a { color: var(--ojas-white); }
.ojas-nav li a:hover,
.ojas-nav .current-menu-item > a,
.ojas-nav .current_page_item > a,
.ojas-nav .current-menu-ancestor > a { color: var(--ojas-amazon); }
.ojas-nav .current-menu-item > a { box-shadow: inset 0 -2px 0 var(--ojas-jasmine); }
.ojas-nav li { position: relative; margin: 0; }

.ojas-nav .sub-menu {
  position: absolute; top: 100%; left: 0;
  min-width: 220px;
  padding: var(--ojas-space-sm) 0;
  background: var(--ojas-white);
  border-radius: var(--ojas-radius);
  box-shadow: var(--ojas-shadow);
  opacity: 0; visibility: hidden; transform: translateY(8px);
  transition: opacity var(--ojas-transition) var(--ojas-ease), transform var(--ojas-transition) var(--ojas-ease), visibility var(--ojas-transition);
}
.ojas-nav li:hover > .sub-menu,
.ojas-nav li:focus-within > .sub-menu { opacity: 1; visibility: visible; transform: none; }
.ojas-nav .sub-menu a { display: block; padding: var(--ojas-space-xs) var(--ojas-space-md); color: var(--ojas-ink); }
.ojas-nav .sub-menu a:hover { background: var(--ojas-offwhite); color: var(--ojas-amazon); }
.ojas-nav .sub-menu .sub-menu { top: 0; left: 100%; }

.ojas-nav-toggle {
  display: none; align-items: center; justify-content: center;
  width: 46px; height: 46px; padding: 0;
  background: transparent; border: 1.5px solid var(--ojas-border);
  border-radius: var(--ojas-radius-circle); cursor: pointer; color: var(--ojas-amazon);
}
.ojas-nav-toggle__bar { display: block; width: 18px; height: 2px; background: currentColor; position: relative; transition: background var(--ojas-transition); }
.ojas-nav-toggle__bar::before, .ojas-nav-toggle__bar::after { content: ""; position: absolute; left: 0; width: 18px; height: 2px; background: currentColor; transition: transform var(--ojas-transition) var(--ojas-ease); }
.ojas-nav-toggle__bar::before { top: -6px; }
.ojas-nav-toggle__bar::after  { top: 6px; }
.ojas-nav-toggle[aria-expanded="true"] .ojas-nav-toggle__bar { background: transparent; }
.ojas-nav-toggle[aria-expanded="true"] .ojas-nav-toggle__bar::before { transform: translateY(6px) rotate(45deg); }
.ojas-nav-toggle[aria-expanded="true"] .ojas-nav-toggle__bar::after  { transform: translateY(-6px) rotate(-45deg); }

@media (max-width: 1024px) {
  .ojas-nav-toggle { display: inline-flex; }
  /*
   * The drawer opens *below* the header bar rather than behind it.
   *
   * <header> is also sticky with a z-index — a stacking context — so the
   * drawer's own z-index only ever resolved against its siblings inside that
   * bar. Two things followed: it painted over the logo and the close button,
   * and the backdrop (a child of <body>, outside that context) painted over
   * the whole drawer, washing it out and swallowing every tap.
   */
  .ojas-nav {
    position: fixed; inset: var(--ojas-header-h) 0 0 auto; z-index: var(--ojas-z-drawer);
    width: min(360px, 88vw);
    padding: var(--ojas-space-lg);
    background: var(--ojas-amazon); overflow-y: auto;
    overscroll-behavior: contain;
    transform: translateX(100%); transition: transform var(--ojas-transition) var(--ojas-ease);
  }
  /* The bar itself stays above the drawer, so the logo and the close button
     are never covered by it. */
  .ojas-brand, .ojas-header__actions { position: relative; z-index: calc(var(--ojas-z-drawer) + 1); }
  .ojas-nav[data-open="true"] { transform: none; }
  /*
   * Below 480px the bar drops its button and below 1200px its phone number, so
   * the drawer shows whichever is missing. Without this a phone had no way to
   * book and no way to call anywhere in the navigation.
   */
  /* The last link already draws a rule, so the block needs air, not a second one. */
  .ojas-nav__actions { display: grid; gap: var(--ojas-space-md); margin-top: var(--ojas-space-xl); }
  .ojas-nav__actions .ojas-nav__cta { display: none; }
  /*
   * `.ojas-nav a` sets display:block for every link in the drawer and outranks
   * a single class, so the label and the number ran together on one line.
   */
  .ojas-nav a.ojas-nav__phone { display: grid; gap: 2px; padding: 0; border-bottom: 0; }
  .ojas-nav__phone-label { font-size: var(--ojas-size-meta); text-transform: uppercase; letter-spacing: var(--ojas-track-label); color: var(--ojas-eyebrow-on-dark); }
  .ojas-nav__phone-number { font-family: var(--ojas-font-display); font-size: var(--ojas-size-h5, 20px); color: var(--ojas-white); }

  /*
   * The page is pinned while the drawer is open (see lock() in theme.js). The
   * header goes fixed for the duration: sticky needs a scrollport, and there
   * is not one while the body is pinned.
   */
  body.ojas-nav-open { position: fixed; left: 0; right: 0; width: 100%; overflow: hidden; }
  body.ojas-nav-open .ojas-header { position: fixed; top: 0; left: 0; right: 0; }
  .ojas-nav > ul { flex-direction: column; align-items: stretch; gap: 0; }
  .ojas-nav li a, .ojas-header--overlay .ojas-nav li a {
    display: block; padding: var(--ojas-space-sm) 0; color: var(--ojas-white);
    border-bottom: 1px solid var(--ojas-glass-border); font-size: 17px; box-shadow: none;
  }
  .ojas-nav .sub-menu { position: static; min-width: 0; padding: 0 0 0 var(--ojas-space-md); background: transparent; box-shadow: none; opacity: 1; visibility: visible; transform: none; }
  /*
   * --ojas-muted-on-dark is off-white at 72%, which composites to 3.72:1 on
   * the drawer's green — under AA for 17px text, and it applied to every
   * sub-menu link in the menu. 86% is the first step that clears 4.5:1; the
   * token is left alone because it is read against darker grounds elsewhere.
   */
  .ojas-nav .sub-menu a { color: rgba(248, 247, 246, 0.86); }
  .ojas-nav li a:hover, .ojas-nav .sub-menu a:hover { color: var(--ojas-white); background: transparent; box-shadow: none; }
  /*
   * The current section was Amazon green on the Amazon-green drawer: a ratio
   * of 1.00, which is to say invisible. Whichever section you were in vanished
   * and left a headless group of links behind it. Jasmine is the obvious
   * substitute and is only 2.94:1 here, so the current state is carried by
   * white text plus a Lemon rule down the edge — 4.70:1, and a second cue that
   * is not colour. These selectors sit after the .sub-menu rules, which
   * otherwise win on source order and flatten the current page back into its
   * neighbours.
   */
  .ojas-nav .current-menu-item > a,
  .ojas-nav .current_page_item > a,
  .ojas-nav .current-menu-ancestor > a,
  .ojas-nav .current-menu-parent > a,
  .ojas-nav .sub-menu .current-menu-item > a,
  .ojas-nav .sub-menu .current_page_item > a {
    color: var(--ojas-white); background: transparent;
    box-shadow: inset 2px 0 0 var(--ojas-lemon);
    padding-left: var(--ojas-space-xs);
  }
  /*
   * Below the header, not below the drawer. The backdrop is a child of <body>
   * and the drawer is inside the header's stacking context, so "drawer minus
   * one" still put it on top of the drawer.
   */
  .ojas-nav-backdrop { position: fixed; inset: 0; z-index: calc(var(--ojas-z-header) - 1); background: var(--ojas-scrim-heavy); opacity: 0; visibility: hidden; transition: opacity var(--ojas-transition), visibility var(--ojas-transition); }
  .ojas-nav-backdrop[data-open="true"] { opacity: 1; visibility: visible; }
  /*
   * Nothing floats over an open drawer. The header is sticky with z-index 100,
   * which makes it a stacking context, so the drawer's 200 only ranks it
   * against its siblings inside that bar — and the order button, a child of
   * <body> at the same 100 but later in the document, painted on top of it and
   * took the taps in that corner. The drawer is modal; these two come back the
   * moment it closes.
   */
  body.ojas-nav-open .ojas-order,
  body.ojas-nav-open .ojas-a11y { display: none; }
}

/*
 * The drawer button appears exactly where the bar drops its own. It has to come
 * after the drawer block above: at equal specificity that block's
 * `display: none` would otherwise win on source order.
 */
@media (max-width: 480px) {
  .ojas-nav__actions .ojas-nav__cta { display: inline-flex; justify-self: start; }
}

/* ---------- Hero: light split, leaf-masked photo (guideline p.2) ------------ */

.ojas-hero { position: relative; padding-block: var(--ojas-section-y) var(--ojas-section-y-large); overflow: hidden; }
.ojas-hero__grid {
  display: grid;
  gap: clamp(var(--ojas-space-lg), 5vw, var(--ojas-space-3xl));
  align-items: center;
  grid-template-columns: repeat(auto-fit, minmax(min(420px, 100%), 1fr));
}
/*
 * The hero headline breaks on its own commas, not mid-clause.
 *
 * ojas_bind_closing_clause() binds the words after the final comma with
 * non-breaking spaces, so the line break lands on the comma where the reader
 * pauses anyway. Two things have to be off for that to work:
 *
 * `text-wrap: balance` was tried here first and actively fought it — balance
 * picks a target line width from the whole block, the bound clause is wider
 * than that target, and the browser then breaks it wherever it can. Which,
 * because base.css sets `overflow-wrap: break-word` on everything to stop long
 * URLs escaping their container, meant mid-word: "not just the roo / m".
 *
 * So: balance off (base.css sets it on every heading) and normal wrapping
 * restored, for this one element. A hero headline is short, hand-written, and
 * never a URL.
 */
.ojas-hero h1 { text-wrap: wrap; overflow-wrap: normal; }
/*
 * The eyebrow is 12px everywhere it labels a section, which is right for a
 * label. In the hero it is not labelling anything — it is the brand line, the
 * first words on the site, and it was reading as fine print above an 88px
 * headline. 15px carries it without turning it into a second heading, and the
 * leaf tick grows with it so the pair stays balanced.
 */
.ojas-hero .ojas-eyebrow { font-size: var(--ojas-size-ui); letter-spacing: 0.1em; margin-bottom: var(--ojas-space-md); }
.ojas-hero .ojas-eyebrow::before { width: 12px; height: 12px; border-radius: 0 12px 0 12px; }
.ojas-hero__text { max-width: 54ch; margin-top: var(--ojas-space-md); font-size: var(--ojas-size-lead); line-height: 1.6; }
.ojas-hero__actions { margin-top: var(--ojas-space-lg); }
.ojas-hero__media { position: relative; }
.ojas-hero__media img { width: 100%; aspect-ratio: 5 / 4; object-fit: cover; }

/* Dark variant: full-bleed photo with an Amazon scrim */
.ojas-hero--dark { color: var(--ojas-white); isolation: isolate; min-height: min(80vh, 760px); display: grid; align-items: center; }
.ojas-hero--dark h1 { color: var(--ojas-white); }
.ojas-hero--dark .ojas-hero__text { color: var(--ojas-text-on-dark); }
.ojas-hero__bg { position: absolute; inset: 0; z-index: -2; }
.ojas-hero__bg img { width: 100%; height: 100%; object-fit: cover; }
.ojas-hero--dark::after { content: ""; position: absolute; inset: 0; z-index: -1; background: var(--ojas-scrim); }
.ojas-hero--dark.ojas-hero--scrim-heavy::after { background: var(--ojas-scrim-heavy); }
.ojas-hero--center .ojas-hero__inner { text-align: center; margin-inline: auto; }
.ojas-hero--center h1 { max-width: 16ch; margin-inline: auto; }
.ojas-hero--center .ojas-hero__text, .ojas-hero--center .ojas-eyebrow { margin-inline: auto; justify-content: center; }
.ojas-hero--center .ojas-hero__actions { justify-content: center; }

/* Leaf mask: the guideline's signature crop, traced from the logo mark and
   defined once in header.php. The aspect ratio matches the mark, so the
   curve keeps its shape at any width. */
.ojas-media--leaf {
  clip-path: url(#ojas-leaf-clip);
  aspect-ratio: 1.1446;
  width: 100%;
}
.ojas-media--leaf img,
.ojas-media--leaf video { display: block; width: 100%; height: 100%; object-fit: cover; }
.ojas-media--leaf-placeholder { aspect-ratio: 1.1446; }
/* A colour or gradient inside the leaf wrapper fills it; the wrapper has the shape. */
.ojas-media--leaf > .ojas-media--leaf-fill { width: 100%; height: 100%; aspect-ratio: auto; }
.ojas-media--rounded { border-radius: var(--ojas-radius-lg); overflow: hidden; }
.ojas-media--circle { border-radius: var(--ojas-radius-circle); aspect-ratio: 1; object-fit: cover; }

/* Leaf pattern band (guideline p.6) */
/*
 * The leaf pattern.
 *
 * Text on a pattern is a contrast problem before it is a taste problem, and the
 * numbers here are unforgiving. On the flat Amazon ground white is 6.00:1 and
 * the guideline's Vanilla eyebrow is 4.83:1 — but where a leaf stroke crossed a
 * letter at the original .85 opacity those fell to 3.49:1 and 2.81:1, both
 * under AA.
 *
 * Vanilla has almost no headroom — 0.33 above the 4.5:1 line — so the pattern
 * has to be quiet enough for it rather than the other way round. At a 0.05
 * fill every colour on the ground still clears AA against a leaf: white
 * 5.68:1, off-white 5.31:1, Vanilla 4.57:1. That keeps the guideline's own
 * eyebrow colour instead of substituting white for it.
 *
 * Two earlier attempts are worth not repeating. A veil between the pattern and
 * the content measured well but could only leave the leaves showing in a strip
 * along the top and bottom edges — correct, and it looked like a bug. Before
 * that the pattern was a generic outlined leaf drawn in this stylesheet, which
 * was a second leaf, slightly different from the one in the logo.
 */
.ojas-pattern-leaves {
  /*
   * Deeper than the plain dark sections, and deliberately so. On Amazon there
   * is no strength at which this pattern and small body text can both hold:
   * a full Island stroke under 16px text measures 2.96:1, and Amazon is light
   * enough that even a 5% texture pushes muted text under AA. #0E4F28 has the
   * headroom — the leaves run at 15% here and the tightest text on the section
   * still measures 4.77:1. The ground would carry 20% (4.54:1) if the pattern
   * is ever wanted stronger; the strength lives in --ojas-leaf-veil.
   */
  background-color: var(--ojas-amazon-deep);
  /*
   * The leaf from the wordmark, emitted by ojas_leaf_pattern_style() from the
   * same outline the photo clip uses. The fallback is a plain ground: a
   * missing pattern is a section that still reads perfectly.
   */
  /*
   * Veil first, pattern under it: a layer of the ground colour painted back
   * over the leaves. It sets the strength without touching the file, so the
   * SVG stays the client's artwork and this stays a design decision.
   */
  background-image:
    linear-gradient(var(--ojas-leaf-veil), var(--ojas-leaf-veil)),
    var(--ojas-leaf-pattern, none);
  background-size: auto, var(--ojas-leaf-pattern-size, 520px 520px);
}

/* Page header for inner pages */
.ojas-page-header { padding-block: var(--ojas-section-y); text-align: center; }

/* --------------------------------------------------------------------------
   Page header grounds
   Colour rather than photography: a photograph behind a heading always needs a
   scrim, and a scrim makes every page the same grey-green. Seven grounds from
   the guideline palette instead, each with the text colour that clears AA on
   it — the numbers are in the README table, and none of these pairings is
   below 4.69:1.
   -------------------------------------------------------------------------- */

/*
 * background-COLOR, not the `background` shorthand. These rules come after
 * .ojas-pattern-leaves at equal specificity, so the shorthand was resetting
 * background-image to none and the CSR page header — which asks for both a
 * tone and the leaf pattern — had silently been painting no pattern at all
 * since the tones landed in 1.19.1. A tone only ever meant to set a colour.
 */
.ojas-page-header--band,
.ojas-page-header--vanilla { background-color: var(--ojas-vanilla); }
.ojas-page-header--jasmine { background-color: var(--ojas-jasmine); }
.ojas-page-header--island  { background-color: var(--ojas-island); }
.ojas-page-header--lemon   { background-color: var(--ojas-lemon); }
.ojas-page-header--papaya  { background-color: var(--ojas-papaya); }
.ojas-page-header--amazon  { background-color: var(--ojas-amazon); }
.ojas-page-header--deep    { background-color: var(--ojas-amazon-deep); }

/* A tone sets the ground; a patterned header keeps the deeper one. */
.ojas-page-header.ojas-pattern-leaves { background-color: var(--ojas-amazon-deep); }

/*
 * When a header stands on the same colour as the section beneath it, the two
 * become one block and their padding stacks — 56px under the header plus 56
 * above the section, a hundred and twelve pixels of empty colour between the
 * lead paragraph and whatever comes next. Only the grounds that genuinely
 * match are listed: --deep is Amazon deep and --dark is Amazon, which look
 * close and are not the same value.
 *
 * Trimmed to 20px rather than zeroed. At zero the section has no padding to
 * contain its first child's top margin, the margin collapses out through the
 * top edge, and 64px of page background appears between two blocks that are
 * supposed to be one colour — a white stripe where the gap used to be.
 */
/*
 * ...unless the header is patterned. Commitments' header is the deeper green
 * now, so the seam it shares with the Amazon section below is a real colour
 * change and wants the section's full padding back. The trim only ever earned
 * its place where the two grounds were identical.
 */
.ojas-page-header--amazon:not(.ojas-pattern-leaves) + .ojas-section--dark,
.ojas-page-header--vanilla + .ojas-section--band,
.ojas-page-header--band + .ojas-section--band,
.ojas-page-header--jasmine + .ojas-section--accent { padding-top: var(--ojas-space-md); }

/* Light grounds: ink throughout, 4.69:1 at worst. */
.ojas-page-header--vanilla,
.ojas-page-header--jasmine,
.ojas-page-header--island,
.ojas-page-header--lemon,
.ojas-page-header--papaya { color: var(--ojas-ink); }
.ojas-page-header--vanilla h1,
.ojas-page-header--jasmine h1,
.ojas-page-header--island h1,
.ojas-page-header--lemon h1,
.ojas-page-header--papaya h1 { color: var(--ojas-ink); }
.ojas-page-header--vanilla .ojas-page-header__text,
.ojas-page-header--jasmine .ojas-page-header__text,
.ojas-page-header--island .ojas-page-header__text,
.ojas-page-header--lemon .ojas-page-header__text,
.ojas-page-header--papaya .ojas-page-header__text { color: var(--ojas-ink); }

/* Amazon is dark enough to carry an Amazon eyebrow only on the two palest. */
.ojas-page-header--band .ojas-eyebrow,
.ojas-page-header--vanilla .ojas-eyebrow,
.ojas-page-header--lemon .ojas-eyebrow { color: var(--ojas-amazon); }
.ojas-page-header--band .ojas-eyebrow::before,
.ojas-page-header--vanilla .ojas-eyebrow::before,
.ojas-page-header--lemon .ojas-eyebrow::before { background: var(--ojas-amazon); }
.ojas-page-header--jasmine .ojas-eyebrow,
.ojas-page-header--island .ojas-eyebrow,
.ojas-page-header--papaya .ojas-eyebrow { color: var(--ojas-ink); }
.ojas-page-header--jasmine .ojas-eyebrow::before,
.ojas-page-header--island .ojas-eyebrow::before,
.ojas-page-header--papaya .ojas-eyebrow::before { background: var(--ojas-ink); }

/* Dark grounds. */
.ojas-page-header--amazon,
.ojas-page-header--deep { color: var(--ojas-text-on-dark); }
.ojas-page-header--amazon h1,
.ojas-page-header--deep h1 { color: var(--ojas-white); }
.ojas-page-header--amazon .ojas-page-header__text,
.ojas-page-header--deep .ojas-page-header__text { color: var(--ojas-text-on-dark); }
.ojas-page-header--amazon .ojas-eyebrow,
.ojas-page-header--deep .ojas-eyebrow { color: var(--ojas-vanilla); }
.ojas-page-header--amazon .ojas-eyebrow::before,
.ojas-page-header--deep .ojas-eyebrow::before { background: var(--ojas-vanilla); }
.ojas-page-header--amazon a:not(.ojas-btn),
.ojas-page-header--deep a:not(.ojas-btn) { color: var(--ojas-vanilla); }
.ojas-page-header--media { position: relative; color: var(--ojas-white); isolation: isolate; padding-block: var(--ojas-section-y-large); }
.ojas-page-header--media .ojas-page-header__media { position: absolute; inset: 0; z-index: -2; overflow: hidden; }
.ojas-page-header--media .ojas-page-header__media img { width: 100%; height: 100%; object-fit: cover; }
.ojas-page-header--media::after { content: ""; position: absolute; inset: 0; z-index: -1; background: var(--ojas-scrim-heavy); }
/* A header that actually has a photograph behind it needs the measured scrim. */
.ojas-page-header--media:has(.ojas-page-header__media)::after { background: var(--ojas-scrim-photo); }
.ojas-page-header--media h1 { color: var(--ojas-white); }
.ojas-page-header--media .ojas-eyebrow { color: var(--ojas-eyebrow-on-dark); }
.ojas-page-header__text { max-width: 60ch; margin-inline: auto; font-size: var(--ojas-size-lead); }
.ojas-page-header--media .ojas-page-header__text { color: var(--ojas-text-on-dark); }

/* ---------- Section heading ---------------------------------------------------- */

.ojas-section-head { margin-bottom: var(--ojas-space-2xl); }
.ojas-section-head--center { text-align: center; }
.ojas-section-head--center .ojas-eyebrow { justify-content: center; }
.ojas-section-head--center .ojas-section-head__text { margin-inline: auto; }
.ojas-section-head__text { max-width: 60ch; margin-top: var(--ojas-space-sm); font-size: var(--ojas-size-lead); }
.ojas-section-head--split { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: var(--ojas-space-lg); }
.ojas-section-head--split > * { margin-bottom: 0; }

/* ---------- Cards -------------------------------------------------------------- */

.ojas-card {
  display: flex; flex-direction: column;
  background: var(--ojas-white);
  border-radius: var(--ojas-radius-lg);
  overflow: hidden;
  box-shadow: var(--ojas-shadow-sm);
  transition: transform var(--ojas-transition) var(--ojas-ease), box-shadow var(--ojas-transition) var(--ojas-ease);
}
.ojas-card:hover { transform: translateY(-4px); box-shadow: var(--ojas-shadow-lg); }
.ojas-card__media { position: relative; aspect-ratio: 4 / 3; overflow: hidden; background: var(--ojas-vanilla); }
.ojas-menu-media img,
.ojas-package-media img { width: 100%; height: 100%; object-fit: cover; }
/* Slightly held back, so an unreplaced placeholder reads as pending. */
.ojas-menu-media--empty img { opacity: 0.85; }
.ojas-card:hover .ojas-menu-media--empty img,
.ojas-card:hover .ojas-package-media--empty img { transform: none; }
.ojas-card__media img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.6s var(--ojas-ease); }
.ojas-card:hover .ojas-card__media img { transform: scale(1.04); }
.ojas-card__badge { position: absolute; top: var(--ojas-space-sm); left: var(--ojas-space-sm); }
.ojas-card__body { display: flex; flex-direction: column; flex: 1; gap: var(--ojas-space-sm); padding: var(--ojas-space-md) var(--ojas-space-lg) var(--ojas-space-lg); }
/*
 * Card, menu-card, related-card and step titles are set in the body face, not
 * Quitos.
 *
 * Quitos is a display type and it earns its keep at 44px and up, where its
 * letterforms are the brand. At the 24px a card gives it, with the 1.05 display
 * leading the heading rule hands down, a two-line title like "Catering for a
 * fitness brand is not catering for an office" closed up into something you
 * decode rather than read — and it sat directly above body copy in Montserrat
 * that was visibly easier to scan.
 *
 * So: the body face at h5, semibold for the hierarchy the size no longer
 * carries, the display tracking removed, and room between the lines. Declared
 * once for all four, because they are the same thing — the name of an item in a
 * card — and they were drifting apart: the related card carried its own
 * font-family, the menu card its own 1.15 leading. The related card keeps a
 * larger size of its own, set beside its colour further down.
 *
 * The booking steps sit four across, which leaves each title about 130px: at
 * h4 in Quitos "We bring the kitchen to you" wrapped to two cramped lines above
 * body copy it was supposed to lead. Its numeral badge stays in the display
 * face — a numeral at 20px in a 44px badge is a mark, not a line to read.
 *
 * The feature list is the same story with an icon beside it. Four across on the
 * home page leaves 193px, and "A restaurant kitchen" was already taking two
 * lines of Quitos at h4 to say four words — beside a 56px tile, which made the
 * icon and the title fight over the same vertical space.
 *
 * The menu item name was the last one still in the display face, and the worst
 * of them on a phone: the pizza list leaves 239px beside its photograph, where
 * every one of the fourteen names wrapped and the longest took four lines. The
 * restaurant menu shares the class, so its dish rows come with it — which is
 * the point. A pizza row and a bowl row are the same object and now read the
 * same way.
 *
 * The headings above the grids are still Quitos; nothing about the brand voice
 * changes, only the size at which it is asked to work.
 */
.ojas-card__title,
.ojas-emenu__title,
.ojas-related__title,
.ojas-step__title,
.ojas-feature__title,
.ojas-why__title,
.ojas-menu-item__name {
  font-family: var(--ojas-font-body);
  font-size: var(--ojas-size-h5);
  font-weight: var(--ojas-weight-semibold);
  line-height: 1.35;
  letter-spacing: 0;
}
.ojas-card__title { margin: 0; }
.ojas-card__title a { text-decoration: none; color: inherit; }
.ojas-card__title a:hover { color: var(--ojas-jasmine-text); }
.ojas-card__excerpt { margin: 0; color: var(--ojas-muted); }
.ojas-card__footer { margin-top: auto; padding-top: var(--ojas-space-sm); display: flex; align-items: center; justify-content: space-between; gap: var(--ojas-space-sm); }
.ojas-card__meta {
  display: flex; flex-wrap: wrap; gap: var(--ojas-space-xs) var(--ojas-space-md);
  margin: 0;
  font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow);
}
.ojas-card__price { font-weight: var(--ojas-weight-semibold); color: var(--ojas-amazon); }
.ojas-card--tint { background: var(--ojas-vanilla); box-shadow: none; }
.ojas-card--plain { background: transparent; box-shadow: none; }
.ojas-card--plain:hover { box-shadow: none; }
.ojas-card--plain .ojas-card__body { padding-inline: 0; padding-bottom: 0; }
.ojas-card--plain .ojas-card__media { border-radius: var(--ojas-radius); }

.ojas-section--dark .ojas-card { background: var(--ojas-glass-fill); border: 1px solid var(--ojas-glass-border); box-shadow: none; color: var(--ojas-text-on-dark); }
.ojas-section--dark .ojas-card__title { color: var(--ojas-white); }
.ojas-section--dark .ojas-card__excerpt { color: var(--ojas-muted-on-dark); }
.ojas-section--dark .ojas-card__meta { color: var(--ojas-eyebrow-on-dark); }
.ojas-section--dark .ojas-card__price { color: var(--ojas-lemon); }

/* ---------- Feature list ----------------------------------------------------- */

.ojas-feature { display: flex; gap: var(--ojas-space-md); }
.ojas-feature__icon {
  flex: 0 0 auto; display: grid; place-items: center;
  width: 56px; height: 56px;
  border-radius: 0 20px 0 20px;          /* leaf-cornered square */
  background: var(--ojas-jasmine); color: var(--ojas-ink);
}
/*
 * These tiles used to hold a Unicode character — ✿, ☯, ♥, ♻, a bare dollar
 * sign — which meant the drawing came from whichever fallback font the reader's
 * device had: a flat outline on Windows, a full-colour emoji on a phone, a
 * notdef box where the font had nothing. They hold ojas_icon() now: one 24x24
 * grid, one stroke weight, currentColor, so a tile picks up the ink or the
 * white of whatever section it lands in.
 */
.ojas-icon { display: block; }
.ojas-section--dark .ojas-feature__icon { background: var(--ojas-jasmine); color: var(--ojas-ink); }
.ojas-feature__title { margin: 0 0 var(--ojas-space-xs); color: var(--ojas-heading); }   /* type comes from the shared card-title rule */
.ojas-section--dark .ojas-feature__title { color: var(--ojas-white); }
.ojas-feature__text { margin: 0; color: var(--ojas-muted); }
.ojas-section--dark .ojas-feature__text { color: var(--ojas-muted-on-dark); }

/* ---------- Testimonials ----------------------------------------------------- */

.ojas-testimonial { max-width: 40ch; margin-inline: auto; text-align: center; }
.ojas-testimonial__mark {
  display: grid; place-items: center; width: 64px; height: 64px;
  margin: 0 auto var(--ojas-space-md);
  border-radius: 0 24px 0 24px; background: var(--ojas-vanilla);
  font-family: var(--ojas-font-display); font-size: 40px; line-height: 1; color: var(--ojas-amazon);
}
.ojas-testimonial__quote {
  margin: 0 0 var(--ojas-space-md); padding: 0; border: 0;
  font-family: var(--ojas-font-display); font-size: var(--ojas-size-h3); line-height: 1.2; color: var(--ojas-heading);
}
.ojas-testimonial__name { display: block; font-size: var(--ojas-size-ui); font-weight: var(--ojas-weight-semibold); color: var(--ojas-ink); }
.ojas-testimonial__role { display: block; margin-top: var(--ojas-space-2xs); font-size: var(--ojas-size-meta); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-muted); }
.ojas-section--dark .ojas-testimonial__quote { color: var(--ojas-white); }
.ojas-section--dark .ojas-testimonial__name { color: var(--ojas-white); }
.ojas-section--dark .ojas-testimonial__role { color: var(--ojas-muted-on-dark); }

/*
 * --ojas-muted-on-dark is off-white at 72%. Against the footer's deep green it
 * composites to 5.53:1 and is fine; against this section's Amazon it is
 * **3.72:1** — under AA for 16px text, and it has been that way on every dark
 * section, independently of the leaf pattern. Exactly the same alpha trap as
 * the drawer sub-menu further up this file, and found the same way: the flat
 * colour looks like 5.61:1 until you composite the alpha.
 *
 * 0.92 clears 4.5:1 here with the pattern's veil in place and still reads as
 * secondary next to the headings. The token is left alone; it is correct
 * against the darker grounds it was set for.
 */
.ojas-section--dark :is(.ojas-card__excerpt, .ojas-feature__text, .ojas-testimonial__role),
.ojas-section--dark .ojas-review--feature .ojas-review__meta { color: rgba(248, 247, 246, 0.92); }

/* ---------- Menu / price list -------------------------------------------------- */

/*
 * Capped rather than full-bleed: on a term archive the list sits in the wide
 * container, and a one-line dish description stretched to 1100px is a stripe,
 * not a sentence. Inside the narrow container this changes nothing.
 */
.ojas-menu-list { list-style: none; margin: 0 auto; padding: 0; max-width: 820px; }
.ojas-menu-item {
  display: grid; grid-template-columns: 1fr auto; gap: var(--ojas-space-2xs) var(--ojas-space-md);
  padding-block: var(--ojas-space-md); border-bottom: 1px solid var(--ojas-border); margin: 0;
}
.ojas-menu-item__name { margin: 0; color: var(--ojas-heading); }   /* type comes from the shared card-title rule */
.ojas-menu-item__price { font-weight: var(--ojas-weight-semibold); color: var(--ojas-amazon); white-space: nowrap; align-self: start; }
.ojas-menu-item__desc { grid-column: 1 / -1; margin: 0; color: var(--ojas-muted); }
.ojas-menu-item__diet { grid-column: 1 / -1; margin: var(--ojas-space-2xs) 0 0; }

/*
 * Dish rows carry the photo cutouts from the current site. Every dish gets one
 * -- a placeholder stands in where there is no photograph -- so the column is
 * always the same width and the list of names stays on one straight edge.
 */
.ojas-dish {
  grid-template-columns: clamp(88px, 13vw, 136px) minmax(0, 1fr) auto;
  /* Named explicitly so the photo's "1 / -1" has a last line to reach: in an
     implicit grid -1 resolves back to line 1 and the photo sits in the name's
     row, stretching it. Rows a dish does not use collapse to zero. */
  grid-template-rows: auto auto auto;
  align-items: start;
}
.ojas-dish .ojas-menu-item__desc,
.ojas-dish .ojas-menu-item__diet { grid-column: 2 / -1; }
/*
 * A square box for every dish, because the menu mixes two kinds of image: the
 * bowl and bottle cutouts are transparent PNGs that should float on the card,
 * the wraps, smoothies and juices are photographs with their own backgrounds
 * that should fill a neat thumbnail. Same box, different fit — so the rows stay
 * the same height either way.
 */
/*
 * The bowls are cut-out PNGs on nothing — a circle of food with no background.
 * Flat on a white card they read as stickers, so they get a shadow that follows
 * the silhouette rather than a box: drop-shadow uses the alpha channel, so the
 * shade falls under the rim of the plate and the plate lifts off the card.
 * Two shadows, not one — a tight contact shade and a wide soft one, which is
 * what actually happens under a real object and what a single blur cannot fake.
 * The size is a variable because the same plate appears at 72px in a menu row
 * and at 460px on its own page, and one shadow cannot serve both.
 */
.ojas-dish__media { grid-column: 1; grid-row: 1 / -1; align-self: center; aspect-ratio: 1;
  --ojas-plate-shadow: drop-shadow(0 6px 7px rgba(26, 45, 32, 0.20)) drop-shadow(0 1px 2px rgba(26, 45, 32, 0.12));
}
.ojas-dish__media img { display: block; width: 100%; height: 100%; object-fit: contain;
  /*
   * A third of each cut-out's width is empty, so `contain` alone leaves the
   * plate at 71% of its slot while a framed photograph beside it fills the
   * whole square. Scaled up they match, and what gets cropped is the
   * transparent margin, never the food.
   */
  transform: scale(1.22);
  filter: var(--ojas-plate-shadow);
  transition: transform 0.5s var(--ojas-ease-entrance), filter 0.5s var(--ojas-ease-entrance);
}
/* A framed photograph is a rectangle in a rectangle; it needs no silhouette. */
/*
 * A photograph of a dish is a circle — a plate, the way the cut-outs beside it
 * already read. A PNG cut-out keeps its transparency and is not clipped: it is
 * the food on its plate already, and a circle would cut the rim.
 */
.ojas-dish__media--photo img { object-fit: cover; border-radius: 50%; filter: none; transform: none; }
/* Dimmed, so an unreplaced placeholder reads as pending; and it is a drawing,
   not a plate, so it takes neither the silhouette shadow nor the upscale. */
.ojas-dish__media--empty img { opacity: 0.7; filter: none; transform: none; }

@media (max-width: 560px) {
  /* Too narrow for name and price side by side once the photo takes a column. */
  .ojas-dish { grid-template-columns: 72px minmax(0, 1fr); }
  .ojas-dish .ojas-menu-item__price { grid-column: 2; justify-self: start; }
}

/* Chapter numbering, as on the catering menu */
.ojas-chapter { margin-bottom: var(--ojas-space-2xl); }
.ojas-chapter__label { display: block; margin-bottom: var(--ojas-space-xs); font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow); }

/* ---------- Location card details ---------------------------------------------- */

.ojas-details { display: grid; gap: var(--ojas-space-sm); margin: 0; }
/*
 * The label carries a small icon so the block can be scanned rather than read —
 * on the find-us and contact pages people are looking for one of three things
 * and the eye should land on it without parsing three uppercase labels. The
 * icon inherits the label's own eyebrow colour, so it never competes with it.
 */
.ojas-details dt { display: flex; align-items: center; gap: 7px; font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow); }
.ojas-details dt .ojas-icon { flex: 0 0 auto; }
.ojas-details dd { margin: 2px 0 0; }

/* ---------- Forms ------------------------------------------------------------------ */

.ojas-field { display: block; margin-bottom: var(--ojas-space-md); }
.ojas-label { display: block; margin-bottom: var(--ojas-space-xs); font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-ink); }
.ojas-input, .ojas-select, .ojas-textarea,
input[type="text"], input[type="email"], input[type="url"], input[type="tel"], input[type="date"],
input[type="number"], input[type="search"], input[type="password"], select, textarea {
  width: 100%; padding: 13px var(--ojas-space-md);
  background: var(--ojas-white); border: 1.5px solid var(--ojas-border); border-radius: var(--ojas-radius-sm);
  font-family: var(--ojas-font-body); font-size: var(--ojas-size-body); color: var(--ojas-ink);
  transition: border-color var(--ojas-transition);
}
:is(input, select, textarea):focus-visible { border-color: var(--ojas-amazon); outline-offset: 0; }
textarea { min-height: 140px; resize: vertical; }
::placeholder { color: var(--ojas-muted); opacity: 0.8; }
.ojas-form-note { font-size: var(--ojas-size-meta); color: var(--ojas-muted); }
.ojas-form__row { display: grid; gap: var(--ojas-space-md); grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr)); }
.ojas-hp { position: absolute; left: -9999px; opacity: 0; }
.ojas-alert { padding: var(--ojas-space-md); margin-bottom: var(--ojas-space-md); border-radius: var(--ojas-radius-sm); border-left: 3px solid; }
.ojas-alert--ok    { background: var(--ojas-vanilla); border-color: var(--ojas-amazon); }
.ojas-alert--error { background: var(--ojas-error-bg); border-color: var(--ojas-orange-deep); color: var(--ojas-error-text); }

/* ---------- Footer ------------------------------------------------------------------ */

.ojas-footer { padding-block: var(--ojas-section-y) var(--ojas-float-clear); background: var(--ojas-bg-footer); color: var(--ojas-text-on-dark); }
.ojas-footer :is(h1, h2, h3, h4, h5, h6) { color: var(--ojas-white); }
.ojas-footer a { color: var(--ojas-text-on-dark); text-decoration: none; }
.ojas-footer a:hover { color: var(--ojas-jasmine); }
/*
 * The brand block gets a wider track than the link columns; auto-fit on equal
 * tracks gave the address the same width as a four-word column and wrapped it
 * to five lines.
 */
.ojas-footer__grid {
  display: grid;
  gap: var(--ojas-space-xl) var(--ojas-space-lg);
  grid-template-columns: minmax(240px, 1.4fr) repeat(auto-fit, minmax(150px, 1fr));
  margin-bottom: var(--ojas-space-2xl);
}
@media (max-width: 900px) {
  .ojas-footer__grid { grid-template-columns: repeat(auto-fit, minmax(min(160px, 100%), 1fr)); }
  .ojas-footer__brand { grid-column: 1 / -1; max-width: none; }
}
/*
 * Phones only. 160px plus a 32px gutter needs 352px of track and a 375px phone
 * has 335, so auto-fit fell to one column and stacked all five link lists:
 * 2191px of footer, 2.7 phone screens. Twenty pixels narrower and a tighter
 * gutter fit two columns, which is 340px shorter. The threshold stays below the
 * tablet range, where 160px still buys three unwrapped columns and four narrow
 * ones would be worse. The long speciality labels wrap to two lines here; they
 * keep their full wording, because the anchor text is the point of them.
 */
@media (max-width: 560px) {
  /*
   * One column, and the columns collapse.
   *
   * Two 158px columns put every "What we cater" link onto two or three lines
   * and left holes beside the short lists — 1,527px of ragged footer, twice the
   * height of the screen. Full width, each link fits on one line; collapsed,
   * the whole thing is a short list of section names you can open.
   */
  /*
   * 64px of grid margin plus the bottom bar's 32px was proportionate when the
   * columns were tall. Collapsed, the whole footer is 919px and that 96px gap
   * before the copyright line reads as a hole. Half of it is plenty here.
   */
  .ojas-footer__grid { grid-template-columns: 1fr; row-gap: 0; margin-bottom: var(--ojas-space-lg); }

  .ojas-footer__col { border-top: 1px solid var(--ojas-glass-border); }
  .ojas-footer__brand { padding-bottom: var(--ojas-space-lg); }

  /* The summary is the control now: a full-width row with a chevron. */
  .ojas-footer__summary {
    pointer-events: auto; cursor: pointer;
    display: flex; align-items: center; justify-content: space-between;
    gap: var(--ojas-space-md);
    padding-block: var(--ojas-space-md);
    min-height: 48px;
    -webkit-tap-highlight-color: transparent;
  }
  .ojas-footer__summary .ojas-footer__title { margin-bottom: 0; }
  .ojas-footer__summary::after {
    content: ""; flex: none; width: 9px; height: 9px;
    border-right: 2px solid var(--ojas-jasmine);
    border-bottom: 2px solid var(--ojas-jasmine);
    transform: rotate(45deg) translate(-2px, -2px);
    transition: transform var(--ojas-ease-quick, 180ms ease);
  }
  .ojas-footer__group[open] > .ojas-footer__summary::after {
    transform: rotate(-135deg) translate(-3px, -3px);
  }
  .ojas-footer__summary:focus-visible { outline: 2px solid var(--ojas-lemon); outline-offset: 2px; }

  .ojas-footer__group > ul { padding-bottom: var(--ojas-space-md); }
  .ojas-footer__group > ul li { margin-bottom: 0; }
  /* 44px rows: the links are the tap targets once a section is open. */
  .ojas-footer__group > ul a { display: block; padding-block: 10px; }

  /* Two groups stacked in one cell need a rule between them too. */
  .ojas-footer__group + .ojas-footer__group { border-top: 1px solid var(--ojas-glass-border); }
}

@media (max-width: 560px) and (prefers-reduced-motion: reduce) {
  .ojas-footer__summary::after { transition: none; }
}
/*
 * There was a `.ojas-footer__brand img { height: 48px; ... }` here, left from
 * when the footer carried a plain logo image. The only img in that block is now
 * the lockup mark, and at 0,1,1 this rule outranked `.ojas-lockup__mark` at
 * 0,1,0 — so the footer lockup rendered at 48px while its own
 * `--ojas-lockup-h: 56px` sat there doing nothing, and a stray margin-bottom
 * fought the lockup's 3px gap. Same shape as the other container-beats-
 * component leaks in this file. Deleted rather than patched: nothing else in
 * the block is an image.
 */
.ojas-footer__title { font-family: var(--ojas-font-body); font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-vanilla); margin-bottom: var(--ojas-space-md); }

/* --------------------------------------------------------------------------
   Footer groups

   A <details> per column, printed open. On a wide screen it is not a control
   at all: the marker is gone, the summary cannot be clicked, and the column
   reads exactly as it did before. Below 560px it becomes the thing that makes
   the footer usable on a phone.
   -------------------------------------------------------------------------- */
.ojas-footer__group > summary { list-style: none; }
.ojas-footer__group > summary::-webkit-details-marker { display: none; }
.ojas-footer__summary { cursor: default; pointer-events: none; }
.ojas-footer__summary .ojas-footer__title { margin-bottom: var(--ojas-space-md); }
.ojas-footer ul { list-style: none; margin: 0; padding: 0; }
.ojas-footer li { margin-bottom: var(--ojas-space-xs); }
.ojas-footer__bottom { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--ojas-space-md); padding-top: var(--ojas-space-lg); border-top: 1px solid var(--ojas-glass-border); font-size: var(--ojas-size-meta); color: var(--ojas-muted-on-dark); }

/* The questions block under "What is included" on a service page. */
.ojas-service__asks-title { margin-top: var(--ojas-space-lg); }
.ojas-service__asks { list-style: none; margin: var(--ojas-space-xs) 0 0; padding: 0; display: grid; gap: 6px; color: var(--ojas-muted); }
.ojas-service__asks li { position: relative; padding-left: var(--ojas-space-md); }
.ojas-service__asks li::before { content: "?"; position: absolute; left: 0; font-weight: var(--ojas-weight-semibold); color: var(--ojas-amazon); }

/* --------------------------------------------------------------------------
   The explore signpost
   Two columns where there is room, the button holding the right edge; stacked
   below that, with the button first to the eye rather than last.
   -------------------------------------------------------------------------- */

.ojas-explore-cta {
  display: grid; gap: var(--ojas-space-lg) var(--ojas-space-2xl);
  grid-template-columns: minmax(0, 1fr) auto; align-items: center;
}
.ojas-explore-cta__title { font-size: var(--ojas-size-h2); color: var(--ojas-heading); margin: 0 0 var(--ojas-space-sm); }
.ojas-explore-cta__text { margin: 0; max-width: 60ch; }
.ojas-explore-cta__facets {
  list-style: none; margin: var(--ojas-space-md) 0 0; padding: 0;
  display: grid; gap: 4px;
  font-size: var(--ojas-size-ui); color: var(--ojas-ink);
}
.ojas-explore-cta__do { justify-self: end; }
@media (max-width: 860px) {
  .ojas-explore-cta { grid-template-columns: minmax(0, 1fr); }
  .ojas-explore-cta__do { justify-self: start; }
}
/* On the Jasmine ground the heading is ink like everything else, not Amazon. */
.ojas-section--accent .ojas-explore-cta__title { color: var(--ojas-ink); }

/* ---------- Pagination / filters ------------------------------------------------------ */

/*
 * paginate_links( 'type' => 'list' ) returns <ul class="page-numbers"> with
 * each link in an <li> — so the list box carries the *same class as the links*.
 * The chip styling therefore landed on the list itself: a pill drawn around a
 * vertical, bulleted stack of circles. The flex row was on .nav-links, whose
 * only child is that list, so it had nothing to lay out.
 *
 * The row goes on the list, and the chip is scoped to the links inside it.
 */
.ojas-pagination { margin-top: var(--ojas-space-2xl); }
.ojas-pagination .nav-links { display: flex; justify-content: center; }
.ojas-pagination ul.page-numbers {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap; justify-content: center; gap: var(--ojas-space-xs);
}
.ojas-pagination li { margin: 0; }
.ojas-pagination li > .page-numbers {
  display: grid; place-items: center; min-width: 46px; min-height: 46px; padding-inline: var(--ojas-space-md);
  border: 1.5px solid var(--ojas-border); border-radius: var(--ojas-radius-pill);
  font-size: var(--ojas-size-ui); font-weight: var(--ojas-weight-semibold); text-decoration: none; color: var(--ojas-amazon);
  transition: background var(--ojas-transition), border-color var(--ojas-transition), color var(--ojas-transition);
}
.ojas-pagination li > a.page-numbers:hover,
.ojas-pagination li > .page-numbers.current { background: var(--ojas-amazon); border-color: var(--ojas-amazon); color: var(--ojas-white); }
.ojas-pagination li > .page-numbers.dots { border-color: transparent; }

@media (prefers-reduced-motion: reduce) { .ojas-pagination li > .page-numbers { transition: none; } }

.ojas-filters { display: flex; flex-wrap: wrap; gap: var(--ojas-space-xs); margin-bottom: var(--ojas-space-2xl); }
.ojas-filters--center { justify-content: center; }
.ojas-filter {
  display: inline-flex; align-items: center; min-height: 42px; padding: 0 var(--ojas-space-md);
  border: 1.5px solid var(--ojas-border); border-radius: var(--ojas-radius-pill); background: var(--ojas-white);
  font-size: 14px; font-weight: var(--ojas-weight-semibold); text-decoration: none; color: var(--ojas-ink);
  transition: background var(--ojas-transition), color var(--ojas-transition), border-color var(--ojas-transition);
}
.ojas-filter:hover, .ojas-filter[aria-current="page"] { background: var(--ojas-amazon); border-color: var(--ojas-amazon); color: var(--ojas-white); }

/* ---------- Split / media + text ----------------------------------------------------- */

.ojas-split { display: grid; gap: clamp(var(--ojas-space-lg), 5vw, var(--ojas-space-3xl)); align-items: center; grid-template-columns: repeat(auto-fit, minmax(min(420px, 100%), 1fr)); }
.ojas-split--media-right .ojas-split__media { order: 2; }
@media (max-width: 900px) { .ojas-split--media-right .ojas-split__media { order: 0; } }

/* ---------- Entry content / meta ---------------------------------------------------- */

.ojas-entry-content > * { margin-bottom: var(--ojas-space-md); }
.ojas-entry-content > :last-child { margin-bottom: 0; }
.ojas-entry-content :is(h2, h3, h4) { margin-top: var(--ojas-space-xl); }
.ojas-entry-content img { border-radius: var(--ojas-radius); }
.ojas-entry-meta { display: flex; flex-wrap: wrap; gap: var(--ojas-space-xs) var(--ojas-space-md); margin-bottom: var(--ojas-space-md); font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow); }

/* ---------- Widgets --------------------------------------------------------------------- */

.widget { margin-bottom: var(--ojas-space-xl); }
.widget-title { font-family: var(--ojas-font-body); font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; margin-bottom: var(--ojas-space-md); }
.widget ul { list-style: none; margin: 0; padding: 0; }
.widget li { margin-bottom: var(--ojas-space-xs); }
.widget a { text-decoration: none; }

/* ---------- Overlay-header clearance ------------------------------------------------- */

.ojas-has-overlay-header .ojas-page-header { padding-top: calc(var(--ojas-section-y) + var(--ojas-header-h)); }
.ojas-has-overlay-header .ojas-hero--dark { padding-top: calc(var(--ojas-section-y-large) + var(--ojas-header-h)); }

/* ---------- Comments -------------------------------------------------------------------- */

.ojas-comments .comment-list, .ojas-comments .children { list-style: none; margin: 0; padding: 0; }
.ojas-comments .children { padding-left: var(--ojas-space-lg); }
.ojas-comments .comment-body { padding: var(--ojas-space-lg) 0; border-bottom: 1px solid var(--ojas-border); }
.ojas-comments .comment-author { display: flex; align-items: center; gap: var(--ojas-space-sm); margin-bottom: var(--ojas-space-xs); }
.ojas-comments .comment-author img { border-radius: var(--ojas-radius-circle); }
.ojas-comments .comment-author .fn { font-style: normal; font-weight: var(--ojas-weight-semibold); color: var(--ojas-ink); }
.ojas-comments .comment-metadata a, .ojas-comments .reply a { font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; text-decoration: none; color: var(--ojas-eyebrow); }
.ojas-comments .comment-respond { margin-top: var(--ojas-space-2xl); }
.ojas-comments .comment-form-cookies-consent { display: flex; gap: var(--ojas-space-xs); align-items: flex-start; }
.ojas-comments .comment-form-cookies-consent input { width: auto; }

/* ---------- Print ----------------------------------------------------------------------- */

@media print {
  .ojas-header, .ojas-footer, .ojas-nav-toggle, .ojas-hero__bg { display: none !important; }
  body { background: #fff; color: #000; }
  .ojas-js .ojas-reveal { opacity: 1; transform: none; }
}

/* ==========================================================================
   Motion — the four Anika-derived effects, rebuilt on the brand tokens.
   Every one is opt-in per element, off under `prefers-reduced-motion`, and
   collapses to ordinary layout below 1025px (no scroll-jacking on touch).
   Driven by assets/js/motion.js.
   ========================================================================== */

/* ---------- 1. Clip-path wipe reveal (replaces GSAP image reveals) --------- */

.ojas-js .ojas-wipe {
  --wipe-from: inset(0 100% 0 0);
  clip-path: var(--wipe-from);
  transition: clip-path 1.1s cubic-bezier(0.22, 1, 0.36, 1);
  will-change: clip-path;
}
.ojas-js .ojas-wipe[data-wipe="left"]  { --wipe-from: inset(0 0 0 100%); }
.ojas-js .ojas-wipe[data-wipe="up"]    { --wipe-from: inset(100% 0 0 0); }
.ojas-js .ojas-wipe[data-wipe="down"]  { --wipe-from: inset(0 0 100% 0); }
.ojas-js .ojas-wipe.is-visible { clip-path: inset(0 0 0 0); }

/* ---------- 2. Pinned scroll stack (the "events we cater" section) --------- */

.ojas-pin { position: relative; }
.ojas-pin__sticky { position: relative; }

.ojas-pin__bgs { display: none; }                 /* only used while pinned */
.ojas-pin__bg img { width: 100%; height: 100%; object-fit: cover; }

.ojas-pin__head { margin-bottom: var(--ojas-space-2xl); }
.ojas-pin__panels {
  display: grid;
  gap: var(--ojas-grid-gap);
  grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
}
.ojas-pin__panel-inner {
  display: flex; flex-direction: column; gap: var(--ojas-space-sm);
  height: 100%;
  padding: var(--ojas-space-lg);
  background: var(--ojas-white);
  border-radius: var(--ojas-radius-lg);
  box-shadow: var(--ojas-shadow-sm);
}
.ojas-pin__thumb {
  width: 120px; height: 120px;
  border-radius: 0 40px 0 40px;                     /* leaf-cornered */
  object-fit: cover;
}
.ojas-pin__number {
  font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow);
}
.ojas-pin__title { margin: 0; font-size: var(--ojas-size-h3); }
.ojas-pin__text { margin: 0; color: var(--ojas-muted); }
.ojas-pin__dots { display: none; }

/* Pinned state: JS adds .is-pinned only on ≥1025px without reduced motion. */
.ojas-pin.is-pinned {
  /* --ojas-pin-n is printed inline by the template: one viewport per item */
  height: calc(var(--ojas-pin-n, 4) * 100vh);
  color: var(--ojas-white);
}
.ojas-pin.is-pinned .ojas-pin__sticky {
  position: sticky; top: 0;
  height: 100vh; overflow: hidden;
  display: grid; align-items: center;
  isolation: isolate;
}
.ojas-pin.is-pinned .ojas-pin__bgs { display: block; position: absolute; inset: 0; z-index: -2; }
.ojas-pin.is-pinned .ojas-pin__bg {
  position: absolute; inset: 0; overflow: hidden;
  background: var(--ojas-amazon);                   /* ground when an item has no image */
  will-change: height;
}
.ojas-pin.is-pinned .ojas-pin__bg img {
  will-change: transform; transform-origin: center;
  /*
   * The background is depth, not subject — the card in front carries the
   * content. Blurring it does two things at once: it stops a busy photograph
   * competing with the text, and it flattens the backdrop so the card's
   * contrast is predictable whatever image the client swaps in. Scaled up so
   * the blur never exposes a soft edge at the frame.
   */
  filter: blur(10px) saturate(0.95);
  transform: scale(1.12);
}
.ojas-pin.is-pinned .ojas-pin__scrim {
  position: absolute; inset: 0; z-index: -1;
  background: var(--ojas-scrim-pin);
}

.ojas-pin.is-pinned .ojas-pin__head { text-align: center; margin-bottom: var(--ojas-space-lg); position: relative; }
.ojas-pin.is-pinned .ojas-pin__head h2 { color: var(--ojas-white); }
.ojas-pin.is-pinned .ojas-pin__head .ojas-eyebrow { color: var(--ojas-eyebrow-on-dark); justify-content: center; }

.ojas-pin.is-pinned .ojas-pin__panels {
  display: block; position: relative; z-index: 1;
  width: min(460px, 100%); margin-inline: auto;
  min-height: 540px;
}
.ojas-pin.is-pinned .ojas-pin__panel {
  position: absolute; inset: 0;
  opacity: 0; transform: translateY(30px);
  will-change: opacity, transform;
  pointer-events: none;
}
.ojas-pin.is-pinned .ojas-pin__panel.is-current { pointer-events: auto; }
/*
 * The card. It was rgba(248,247,246,0.14) — 14% opaque — which put white text
 * at 2.08:1 over a bright photograph, less than half the 4.5:1 WCAG asks for.
 * Measured against a blown-out backdrop, the values below give 7.89:1.
 */
.ojas-pin.is-pinned .ojas-pin__panel-inner {
  display: grid; justify-items: center; align-content: center; gap: var(--ojas-space-sm);
  padding: var(--ojas-space-2xl) var(--ojas-space-xl);
  background: var(--ojas-glass-pin);
  border: 1px solid rgba(248, 247, 246, 0.18);
  border-radius: var(--ojas-radius-lg);
  backdrop-filter: blur(18px) saturate(1.1);
  -webkit-backdrop-filter: blur(18px) saturate(1.1);
  box-shadow: 0 24px 60px rgba(6, 26, 18, 0.34);
  color: var(--ojas-white);
}
.ojas-pin.is-pinned .ojas-pin__thumb {
  width: 190px; height: 190px;
  border-radius: var(--ojas-radius-circle);
  object-fit: cover;
  margin-bottom: var(--ojas-space-xs);
  box-shadow: 0 10px 30px rgba(6, 26, 18, 0.4);
}
.ojas-pin.is-pinned .ojas-pin__number {
  color: var(--ojas-vanilla); letter-spacing: var(--ojas-track-label);
  font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
}
.ojas-pin.is-pinned .ojas-pin__title { color: var(--ojas-white); }
.ojas-pin.is-pinned .ojas-pin__text { color: var(--ojas-offwhite); max-width: 32ch; }
.ojas-pin.is-pinned .ojas-btn--text { color: var(--ojas-vanilla); }
/* The heading sits over the blurred photo, not the card — it needs its own lift. */
.ojas-pin.is-pinned .ojas-pin__head h2 { text-shadow: 0 2px 24px rgba(6, 26, 18, 0.5); }

.ojas-pin.is-pinned .ojas-pin__dots {
  display: flex; justify-content: center; gap: var(--ojas-space-xs);
  margin: var(--ojas-space-lg) 0 0; padding: 0; list-style: none;
}
.ojas-pin.is-pinned .ojas-pin__dots li {
  width: 8px; height: 8px; margin: 0; border-radius: 50%;
  background: var(--ojas-glass-border); transition: background var(--ojas-transition), transform var(--ojas-transition);
}
.ojas-pin.is-pinned .ojas-pin__dots li.is-current { background: var(--ojas-jasmine); transform: scale(1.4); }

/* ---------- 3. Horizontal scroll-jack (Anika "transform image") ------------- */

.ojas-hscroll { position: relative; }
.ojas-hscroll__track {
  display: flex; gap: var(--ojas-grid-gap);
  overflow-x: auto; scroll-snap-type: x mandatory;        /* native swipe on touch */
  padding-bottom: var(--ojas-space-2xs);
  -webkit-overflow-scrolling: touch;
  /*
   * No scrollbar under the cards.
   *
   * `scrollbar-width: thin` still draws one, and on a band of cards it reads as
   * a stray grey slider rather than a control — 11px of it, the full width of
   * the section, under a row that already shows the next card peeking past the
   * edge. The peek and the snap are the affordance; the bar was only ever the
   * browser's default showing through.
   *
   * It stays scrollable by touch, wheel, trackpad and keyboard: this hides the
   * bar, it does not disable the overflow.
   */
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.ojas-hscroll__track::-webkit-scrollbar { display: none; }
.ojas-hscroll__track > * { flex: 0 0 min(340px, 82vw); scroll-snap-align: start; }

/*
 * A card and a bit, at every width, so there is always something cut off at the
 * right edge to say the row keeps going. Below 380px a fixed 340 left almost
 * nothing peeking on the narrowest phones.
 */
@media (max-width: 480px) {
  .ojas-hscroll__track > * { flex-basis: min(300px, 78vw); }
}

/*
 * height and top are set by motion.js from the content — see initHscroll().
 * The section's own vertical padding goes with them: it sits inside the
 * explicit height the script sets, so it only eats runway and pushes the
 * pinned viewport off centre.
 */
.ojas-hscroll.is-pinned { padding-block: 0; }
.ojas-hscroll.is-pinned .ojas-hscroll__sticky {
  position: sticky; display: grid; align-content: center; overflow: hidden;
  /*
   * Pin the column to the viewport width. The track is width:max-content, so
   * without this it sized the grid's only column to the full length of the
   * card row — and the heading, sharing that column, was centred inside 2491px
   * instead of 1440px and ran 440px off the right edge, where overflow:hidden
   * quietly cut it in half.
   */
  grid-template-columns: 100%;
  justify-items: start;
}
.ojas-hscroll.is-pinned .ojas-hscroll__track {
  overflow: visible; scroll-snap-type: none; padding-bottom: 0;
  width: max-content;
  padding-inline: var(--ojas-gutter);
  will-change: transform;
}
.ojas-hscroll.is-pinned .ojas-hscroll__track > * { flex-basis: 380px; }
.ojas-hscroll.is-pinned .ojas-hscroll__head { padding-inline: var(--ojas-gutter); margin-bottom: var(--ojas-space-lg); }

/*
 * The catering-menu footer: the dietary key and the button, in their own band
 * after the runway. When the section above is not pinned it still has its own
 * bottom padding, so this one opens flush; when it is pinned that padding is
 * zero and this supplies the gap.
 */
.ojas-hscroll-foot { padding-block: var(--ojas-space-xl) var(--ojas-section-y-large); }
/*
 * Nothing on top, pinned or not.
 *
 * This was scoped to `.is-pinned`, on the reasoning that an unpinned section
 * keeps its own bottom padding and the foot should open flush after it. That is
 * exactly the problem: *both* paddings then applied, and the button sat 120px
 * (phone) to 150px (laptop) below the cards it belongs to, in the middle of an
 * empty band. Pinning is the exception, not the rule — it needs a pointer, a
 * wide enough window and a tall enough one, so most readers never see it.
 */
.ojas-hscroll + .ojas-hscroll-foot { padding-top: 0; }

/*
 * And the section itself stops short when it is not pinned, so the gap between
 * the cards and the button is one deliberate space rather than two accidental
 * ones. Pinned, the script owns this padding and sets it to zero.
 */
.ojas-hscroll:not(.is-pinned) { padding-bottom: var(--ojas-space-xl); }

/* ---------- 4. Lenis smooth scroll ------------------------------------------- */

html.lenis, html.lenis body { height: auto; }
.lenis.lenis-smooth { scroll-behavior: auto !important; }
.lenis.lenis-smooth [data-lenis-prevent] { overscroll-behavior: contain; }
.lenis.lenis-stopped { overflow: hidden; }

@media (prefers-reduced-motion: reduce) {
  .ojas-js .ojas-wipe { clip-path: none; transition: none; }
}

/* ==========================================================================
   Catering information components: services, steps, checklist, facts,
   dietary legend, FAQ, service choice in the form
   ========================================================================== */

.ojas-service .ojas-card__body { gap: var(--ojas-space-md); }
.ojas-service__best { margin: 0; font-size: var(--ojas-size-ui); }
.ojas-service__label {
  display: block; margin-bottom: 2px;
  font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow);
}

/*
 * Service cards: line the bands up across the row, structurally.
 *
 * Flexbox can only pin a card's last block to the bottom, so every band in
 * between drifts with the length of the copy above it -- edit one excerpt to a
 * different number of lines and "Best for", the checklist and the facts rule
 * all go ragged across the row. Subgrid fixes that properly: the cards share
 * the grid's rows, so each band is as tall as the tallest card's version of it
 * and they all start on the same line.
 *
 * Each band is placed on an explicit row rather than auto-flowed, so a card
 * missing one (no photo, no excerpt, no minimum) leaves that row empty instead
 * of shifting everything below it up a line. A row no card uses collapses to
 * zero and costs nothing.
 *
 *   1 media  2 title  3 excerpt  4 best for  5 checklist  6 facts  7 footer
 *
 * Opted into per grid with .ojas-grid--bands, not matched on the cards: search
 * and the mixed archives put service cards in the same grid as posts and
 * events, and there a 7-row card next to 1-row cards would scatter the layout.
 *
 * Without subgrid the whole block is skipped and the flex rules above still
 * give a tidy card with its footer pinned -- just the older behaviour.
 */
@supports (grid-template-rows: subgrid) {
  .ojas-grid--bands { grid-template-rows: repeat(7, auto); }

  .ojas-grid--bands > .ojas-service {
    display: grid;
    grid-template-rows: subgrid;
    grid-row: span 7;
    row-gap: 0;                       /* the grid's 32px gutter is between cards, not inside one */
  }

  .ojas-grid--bands > .ojas-service > .ojas-card__media { grid-row: 1; }

  .ojas-grid--bands > .ojas-service > .ojas-card__body {
    display: grid;
    grid-template-rows: subgrid;
    grid-row: 2 / span 6;
    row-gap: var(--ojas-space-md);
  }

  /*
   * Rows here are the body's own 1-6, i.e. the card's 2-7. Scoped to the grid
   * like everything else above: the margin-top resets below undo the flex
   * bottom-pinning, which cards outside a bands grid still rely on.
   */
  .ojas-grid--bands .ojas-card__body > .ojas-card__title   { grid-row: 1; }
  .ojas-grid--bands .ojas-card__body > .ojas-card__excerpt { grid-row: 2; }
  .ojas-grid--bands .ojas-card__body > .ojas-service__best { grid-row: 3; }
  .ojas-grid--bands .ojas-card__body > .ojas-checklist     { grid-row: 4; align-self: start; }
  .ojas-grid--bands .ojas-card__body > .ojas-facts         { grid-row: 5; margin-top: 0; align-self: end; }
  .ojas-grid--bands .ojas-card__body > .ojas-card__footer  { grid-row: 6; margin-top: 0; }
}

.ojas-checklist { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--ojas-space-xs); }
.ojas-checklist li { position: relative; padding-left: 26px; margin: 0; font-size: var(--ojas-size-ui); }
.ojas-checklist li::before {
  content: ""; position: absolute; left: 0; top: 4px;
  width: 16px; height: 16px; border-radius: 0 8px 0 8px;
  background: var(--ojas-jasmine);
}
.ojas-checklist li::after {
  content: ""; position: absolute; left: 5px; top: 7px;
  width: 5px; height: 8px; border: solid var(--ojas-ink); border-width: 0 2px 2px 0; transform: rotate(45deg);
}

.ojas-facts {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(90px, 1fr)); gap: var(--ojas-space-sm);
  margin: 0; padding: var(--ojas-space-sm) 0 0; border-top: 1px solid var(--ojas-border);
}
/*
 * In a row of cards the facts row is the band the eye lines up on -- it carries
 * a rule across the card. Only .ojas-card__footer took the slack, so a card
 * whose checklist wrapped an extra line pushed its facts row below its
 * neighbours'. Give the slack to the facts row instead; the footer then follows
 * it. Both cannot claim it: flexbox splits free space between auto margins.
 */
.ojas-card__body > .ojas-facts { margin-top: auto; }
.ojas-card__body > .ojas-facts ~ .ojas-card__footer { margin-top: 0; }
.ojas-facts dt { font-size: var(--ojas-size-micro); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-muted); }
.ojas-facts dd { margin: 2px 0 0; font-weight: var(--ojas-weight-semibold); color: var(--ojas-amazon); }

/* Steps */
.ojas-steps {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: var(--ojas-grid-gap);
  grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr));
  counter-reset: step;
}
.ojas-step {
  position: relative; margin: 0;
  padding: var(--ojas-space-lg);
  background: var(--ojas-white); border-radius: var(--ojas-radius-lg); box-shadow: var(--ojas-shadow-sm);
}
.ojas-step__number {
  display: inline-grid; place-items: center; width: 44px; height: 44px;
  margin-bottom: var(--ojas-space-md);
  border-radius: 0 16px 0 16px; background: var(--ojas-amazon); color: var(--ojas-white);
  font-family: var(--ojas-font-display); font-size: 20px;
}
.ojas-step__title { margin: 0 0 var(--ojas-space-xs); }   /* type comes from the shared card-title rule */
.ojas-step__text { margin: 0; color: var(--ojas-muted); }
@media (min-width: 1025px) {
  .ojas-step:not(:last-child)::after {           /* connector between steps */
    content: ""; position: absolute; top: 46px; right: calc(var(--ojas-grid-gap) * -1);
    width: var(--ojas-grid-gap); height: 2px; background: var(--ojas-border);
  }
}

/* Dietary legend */
.ojas-legend {
  display: grid; gap: var(--ojas-space-sm);
  padding: var(--ojas-space-md) var(--ojas-space-lg);
  background: var(--ojas-white); border: 1px solid var(--ojas-border); border-radius: var(--ojas-radius);
}
.ojas-legend__title { font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow); }
.ojas-legend__note { margin: 0; font-size: var(--ojas-size-ui); color: var(--ojas-muted); }

/* Menu at a glance */
.ojas-glance { display: grid; gap: var(--ojas-grid-gap); grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr)); }
.ojas-glance__chapter {
  display: block; padding: var(--ojas-space-md) var(--ojas-space-lg);
  background: var(--ojas-white); border-radius: var(--ojas-radius); text-decoration: none; color: inherit;
  box-shadow: var(--ojas-shadow-sm); transition: transform var(--ojas-transition), box-shadow var(--ojas-transition);
}
.ojas-glance__chapter:hover { transform: translateY(-3px); box-shadow: var(--ojas-shadow); color: inherit; }
.ojas-glance__label { display: block; font-size: var(--ojas-size-micro); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow); }
.ojas-glance__title { display: block; margin: 2px 0 4px; font-family: var(--ojas-font-display); font-size: var(--ojas-size-h4); color: var(--ojas-amazon); }
.ojas-glance__count { font-size: var(--ojas-size-meta); color: var(--ojas-muted); }

/* FAQ */
.ojas-faq { border-top: 1px solid var(--ojas-border); }
.ojas-faq__item { border-bottom: 1px solid var(--ojas-border); }
.ojas-faq__q {
  display: flex; align-items: center; justify-content: space-between; gap: var(--ojas-space-md);
  padding: var(--ojas-space-md) 0; cursor: pointer; list-style: none;
  font-family: var(--ojas-font-display); font-size: var(--ojas-size-h4); color: var(--ojas-amazon);
}
.ojas-faq__q::-webkit-details-marker { display: none; }
.ojas-faq__q::after {
  content: ""; flex: 0 0 auto; width: 10px; height: 10px;
  border: solid var(--ojas-amazon); border-width: 0 2px 2px 0; transform: rotate(45deg);
  transition: transform var(--ojas-transition);
}
.ojas-faq__item[open] .ojas-faq__q::after { transform: rotate(-135deg); }
.ojas-faq__a { padding: 0 0 var(--ojas-space-md); color: var(--ojas-muted); max-width: 62ch; }

/* Service choice radios in the enquiry form */
.ojas-choice { border: 0; padding: 0; margin: var(--ojas-space-sm) 0 var(--ojas-space-md); min-width: 0; }
.ojas-choice__options { display: grid; gap: var(--ojas-space-sm); grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr)); }
.ojas-choice__option {
  display: grid; gap: 2px; padding: var(--ojas-space-sm) var(--ojas-space-md);
  background: var(--ojas-white); border: 1.5px solid var(--ojas-border); border-radius: var(--ojas-radius-sm); cursor: pointer;
}
.ojas-choice__option:has(:checked) { border-color: var(--ojas-amazon); box-shadow: inset 0 0 0 1px var(--ojas-amazon); }
.ojas-choice__option input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ojas-choice__option:has(:focus-visible) { outline: 2px solid var(--ojas-amazon); outline-offset: 2px; }
.ojas-choice__title { font-weight: var(--ojas-weight-semibold); color: var(--ojas-ink); }
.ojas-choice__text { font-size: var(--ojas-size-meta); color: var(--ojas-muted); }

/* Two-path closing CTA */
.ojas-paths { display: grid; gap: var(--ojas-grid-gap); grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr)); }
.ojas-path { padding: var(--ojas-space-xl); background: rgba(255, 255, 255, 0.55); border-radius: var(--ojas-radius-lg); }
.ojas-path__title { margin: 0 0 var(--ojas-space-xs); font-size: var(--ojas-size-h3); }
.ojas-path__text { margin: 0 0 var(--ojas-space-md); }

/* ==========================================================================
   Restaurant menu and holiday menu
   ========================================================================== */

.ojas-switch { display: inline-flex; gap: 4px; margin-top: var(--ojas-space-lg); padding: 4px; background: var(--ojas-white); border-radius: var(--ojas-radius-pill); border: 1px solid var(--ojas-border); }
.ojas-switch__item { padding: 10px 18px; border-radius: var(--ojas-radius-pill); font-size: 14px; font-weight: var(--ojas-weight-semibold); text-decoration: none; color: var(--ojas-ink); }
.ojas-switch__item[aria-current="page"] { background: var(--ojas-amazon); color: var(--ojas-white); }

.ojas-order-links { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: var(--ojas-space-xs); margin-top: var(--ojas-space-lg); }
.ojas-order-links__label { width: 100%; font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow); }

.ojas-menu-nav { position: sticky; top: var(--ojas-header-h); z-index: calc(var(--ojas-z-header) - 1); background: rgba(248, 247, 246, 0.94); backdrop-filter: blur(10px); border-bottom: 1px solid var(--ojas-border); }
.ojas-menu-nav__inner { display: flex; gap: var(--ojas-space-md); overflow-x: auto; scrollbar-width: none; padding-block: var(--ojas-space-sm); }
.ojas-menu-nav__inner::-webkit-scrollbar { display: none; }
/*
 * The rail hides its scrollbar, so the only thing telling you there is more
 * menu off the edge is this fade. theme.js sets data-overflow to whichever
 * side still has something beyond it, so the fade is never a smudge over an
 * edge you have already reached.
 */
.ojas-menu-nav { position: sticky; }
.ojas-menu-nav::before,
.ojas-menu-nav::after {
  content: ""; position: absolute; top: 0; bottom: 0; width: 48px;
  pointer-events: none; opacity: 0; transition: opacity var(--ojas-transition);
}
.ojas-menu-nav::before { left: 0; background: linear-gradient(to right, rgba(248, 247, 246, 0.96), rgba(248, 247, 246, 0)); }
.ojas-menu-nav::after { right: 0; background: linear-gradient(to left, rgba(248, 247, 246, 0.96), rgba(248, 247, 246, 0)); }
.ojas-menu-nav[data-overflow="end"]::after,
.ojas-menu-nav[data-overflow="both"]::after { opacity: 1; }
.ojas-menu-nav[data-overflow="start"]::before,
.ojas-menu-nav[data-overflow="both"]::before { opacity: 1; }
@media (prefers-reduced-motion: reduce) {
  .ojas-menu-nav::before, .ojas-menu-nav::after { transition: none; }
}
.ojas-menu-nav a { flex: 0 0 auto; padding: 8px 14px; border-radius: var(--ojas-radius-pill); font-size: 14px; font-weight: var(--ojas-weight-semibold); text-decoration: none; color: var(--ojas-amazon); }
.ojas-menu-nav a:hover { background: var(--ojas-vanilla); }
.ojas-menu-section { margin-bottom: var(--ojas-space-3xl); scroll-margin-top: calc(var(--ojas-header-h) + 64px); }
.ojas-menu-section .ojas-section-head { margin-bottom: var(--ojas-space-md); }

.ojas-dish__size { margin-left: var(--ojas-space-xs); font-family: var(--ojas-font-body); font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-medium); color: var(--ojas-muted); }
.ojas-dish__only { font-size: var(--ojas-size-micro); font-weight: var(--ojas-weight-semibold); letter-spacing: 0.06em; text-transform: uppercase; color: var(--ojas-muted); }
.ojas-menu-item__diet:empty { display: none; }

/* --------------------------------------------------------------------------
   Be the creator — build your own bowl
   A real set of radios and checkboxes, styled as menu options, with a summary
   that keeps up. The native inputs stay in the accessibility tree and carry
   keyboard behaviour and focus for free; :has() does the visual state.
   -------------------------------------------------------------------------- */

.ojas-creator__layout {
  display: grid;
  gap: var(--ojas-grid-gap);
  grid-template-columns: minmax(0, 1fr) minmax(300px, 380px);
  align-items: start;
}
@media (max-width: 900px) { .ojas-creator__layout { grid-template-columns: 100%; } }

.ojas-creator__steps { display: grid; gap: var(--ojas-space-md); }
.ojas-creator__step {
  margin: 0; min-width: 0;
  padding: var(--ojas-space-lg);
  border: 0;
  background: var(--ojas-white);
  border-radius: var(--ojas-radius);
  box-shadow: var(--ojas-shadow-sm);
}
.ojas-section--band .ojas-creator__step { background: var(--ojas-white); }

.ojas-creator__legend {
  display: flex; flex-wrap: wrap; align-items: baseline;
  gap: var(--ojas-space-xs) var(--ojas-space-sm);
  padding: 0; margin-bottom: var(--ojas-space-md); float: left; width: 100%;
}
.ojas-creator__num {
  display: grid; place-items: center; width: 34px; height: 34px;
  border-radius: 0 12px 0 12px;
  background: var(--ojas-jasmine); color: var(--ojas-ink);
  font-family: var(--ojas-font-display); font-size: 15px;
}
.ojas-creator__name { font-family: var(--ojas-font-display); font-size: var(--ojas-size-h4); color: var(--ojas-heading); }
.ojas-creator__hint {
  margin-inline-start: auto;
  font-size: var(--ojas-size-meta); color: var(--ojas-muted);
}

.ojas-creator__options { display: flex; flex-wrap: wrap; gap: var(--ojas-space-xs); clear: both; }
.ojas-creator__option {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 9px 16px 9px 12px;
  border: 1.5px solid var(--ojas-border); border-radius: var(--ojas-radius-pill);
  background: var(--ojas-white); cursor: pointer;
  font-size: var(--ojas-size-ui); color: var(--ojas-ink);
  transition: border-color var(--ojas-transition), background var(--ojas-transition), transform var(--ojas-transition);
}
.ojas-creator__option input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ojas-creator__swatch {
  width: 16px; height: 16px; flex: none;
  border: 1.5px solid var(--ojas-border); background: var(--ojas-white);
  border-radius: var(--ojas-radius-circle);
  transition: background var(--ojas-transition), border-color var(--ojas-transition);
}
/* A checkbox is a square so "one of these" and "any of these" look different. */
.ojas-creator__option:has(input[type="checkbox"]) .ojas-creator__swatch { border-radius: 5px; }
.ojas-creator__option:hover { border-color: var(--ojas-jasmine); }
.ojas-creator__option:has(:checked) {
  border-color: var(--ojas-amazon);
  background: var(--ojas-vanilla);
  font-weight: var(--ojas-weight-medium);
}
.ojas-creator__option:has(:checked) .ojas-creator__swatch {
  background: var(--ojas-amazon); border-color: var(--ojas-amazon);
  box-shadow: inset 0 0 0 3px var(--ojas-white);
}
.ojas-creator__option:has(:focus-visible) { outline: 2px solid var(--ojas-focus); outline-offset: 2px; }
.ojas-creator__option:active { transform: scale(0.97); }

/* ---- the panel -------------------------------------------------------- */

.ojas-creator__panel {
  position: sticky; top: calc(var(--ojas-header-h) + var(--ojas-space-md));
  padding: var(--ojas-space-lg);
  background: var(--ojas-amazon); color: var(--ojas-text-on-dark);
  border-radius: var(--ojas-radius-lg);
  box-shadow: var(--ojas-shadow-lg);
}
@media (max-width: 900px) { .ojas-creator__panel { position: static; } }

.ojas-creator__eyebrow {
  margin: 0 0 var(--ojas-space-xs);
  font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase;
  color: var(--ojas-eyebrow-on-dark);
}

/*
 * The dial that used to live here — a conic-gradient ring filling as the three
 * "pick one" steps were answered — is gone. It showed how near a bowl was
 * without showing the bowl. The vessel does both.
 */
.ojas-creator__count {
  position: relative; font-family: var(--ojas-font-display);
  font-size: 34px; line-height: 1; color: var(--ojas-white);
}
.ojas-creator__unit {
  position: relative; font-size: var(--ojas-size-micro); letter-spacing: var(--ojas-track-label);
  text-transform: uppercase; color: var(--ojas-text-on-dark);
}

.ojas-creator__naming { margin-bottom: var(--ojas-space-md); }
.ojas-creator__naming .ojas-label { color: var(--ojas-text-on-dark); }
.ojas-creator__naming input {
  background: rgba(255, 255, 255, 0.1); border-color: rgba(255, 255, 255, 0.3);
  color: var(--ojas-white);
}
.ojas-creator__naming input::placeholder { color: rgba(248, 247, 246, 0.6); }

.ojas-creator__list { margin: 0 0 var(--ojas-space-md); display: grid; gap: 2px; }
.ojas-creator__list dt {
  font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase;
  color: var(--ojas-eyebrow-on-dark);
}
.ojas-creator__list dd { margin: 0 0 var(--ojas-space-sm); color: var(--ojas-white); }
.ojas-creator__empty { margin: 0; color: var(--ojas-text-on-dark); }

.ojas-creator__actions { display: flex; flex-wrap: wrap; gap: var(--ojas-space-xs); align-items: center; }
.ojas-creator__actions .ojas-btn--ghost { border-color: rgba(255, 255, 255, 0.4); color: var(--ojas-white); }
.ojas-creator__actions .ojas-btn--ghost:hover { background: rgba(255, 255, 255, 0.12); color: var(--ojas-white); }
.ojas-creator__actions .ojas-btn--text { color: var(--ojas-text-on-dark); }

.ojas-creator__note { margin: var(--ojas-space-md) 0 0; font-size: var(--ojas-size-meta); color: var(--ojas-text-on-dark); }
.ojas-creator__status { margin: var(--ojas-space-xs) 0 0; min-height: 1.4em; font-size: var(--ojas-size-meta); color: var(--ojas-lemon); }

/*
 * The quote button is a live link from the start — an empty bowl still leaves
 * you at the quote form, which is where it should leave you. Once there is
 * something in the bowl the link carries it across; the panel lifting is the
 * only signal needed that the state changed.
 */
.ojas-creator__panel { transition: box-shadow 0.4s var(--ojas-ease-entrance); }
.ojas-creator.is-complete .ojas-creator__panel { box-shadow: 0 24px 56px rgba(14, 79, 40, 0.38); }

/* ---- the mobile bar --------------------------------------------------- */

.ojas-creator__bar { display: none; }
@media (max-width: 900px) {
  .ojas-creator.is-live .ojas-creator__bar:not([hidden]) {
    display: flex; align-items: center; justify-content: space-between;
    gap: var(--ojas-space-sm);
    position: sticky; bottom: var(--ojas-space-sm); z-index: 5;
    margin: var(--ojas-space-md) var(--ojas-gutter) 0;
    padding: 10px 10px 10px var(--ojas-space-md);
    background: var(--ojas-white); border: 1px solid var(--ojas-border);
    border-radius: var(--ojas-radius-pill); box-shadow: var(--ojas-shadow-lg);
  }
  .ojas-creator__bar-text { font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-medium); }
}

@media (prefers-reduced-motion: reduce) {
  .ojas-creator__option { transition: none; }
}

.ojas-page-header--holiday { background: var(--ojas-amazon); color: var(--ojas-white); }
.ojas-page-header--holiday h1 { color: var(--ojas-white); }
.ojas-page-header--holiday .ojas-eyebrow { color: var(--ojas-eyebrow-on-dark); }
.ojas-page-header--holiday .ojas-page-header__text { color: var(--ojas-text-on-dark); }
.ojas-holiday-status { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--ojas-space-xs) var(--ojas-space-md); margin-top: var(--ojas-space-lg); padding: var(--ojas-space-sm) var(--ojas-space-lg); border-radius: var(--ojas-radius-pill); background: var(--ojas-lemon); color: var(--ojas-ink); font-size: var(--ojas-size-ui); }
.ojas-holiday-status.is-closed { background: var(--ojas-vanilla); }
.ojas-package .ojas-card__body { gap: var(--ojas-space-sm); }
.ojas-package__top { display: flex; flex-wrap: wrap; gap: var(--ojas-space-xs); }
.ojas-package__price { font-family: var(--ojas-font-display); font-size: var(--ojas-size-h3); }

/* "More from Ojas" band on the front page */
.ojas-more { display: grid; gap: var(--ojas-grid-gap); grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 1fr)); }
.ojas-more__card { display: grid; gap: var(--ojas-space-xs); padding: var(--ojas-space-xl); border-radius: var(--ojas-radius-lg); text-decoration: none; color: inherit; background: var(--ojas-white); box-shadow: var(--ojas-shadow-sm); transition: transform var(--ojas-transition), box-shadow var(--ojas-transition); }
.ojas-more__card:hover { transform: translateY(-3px); box-shadow: var(--ojas-shadow-lg); color: inherit; }
.ojas-more__card--holiday { background: var(--ojas-amazon); color: var(--ojas-white); }
.ojas-more__card--holiday .ojas-eyebrow { color: var(--ojas-eyebrow-on-dark); }
.ojas-more__card h3 { margin: 0; font-size: var(--ojas-size-h3); color: inherit; }
.ojas-more__card p { margin: 0; color: var(--ojas-muted); }
.ojas-more__card--holiday p { color: var(--ojas-text-on-dark); }
.ojas-more__card .ojas-btn--text { justify-self: start; margin-top: var(--ojas-space-sm); }
.ojas-more__card--holiday .ojas-btn--text { color: var(--ojas-vanilla); }

/* ==========================================================================
   About / Our story
   ========================================================================== */

.ojas-story .ojas-entry-content { font-size: var(--ojas-size-lead); line-height: 1.6; }
.ojas-promises { margin-top: var(--ojas-space-lg); }
.ojas-media--leaf-placeholder { background: linear-gradient(135deg, var(--ojas-jasmine), var(--ojas-amazon)); }

.ojas-stats { display: grid; gap: var(--ojas-grid-gap); grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr)); margin: var(--ojas-space-2xl) 0 0; padding-top: var(--ojas-space-2xl); border-top: 1px solid var(--ojas-glass-border); }
/* The stats row is built to follow something: a top margin, a rule, then the
   numbers. Opening a section with it — Commitments does — makes that margin a
   second copy of the padding the section already has, and 204px of flat green
   opens up between the lead paragraph and the first number. The rule itself
   stays: on that page the header and the section are the same colour, so the
   hairline is the only thing saying where one ends. */
.ojas-stats:first-child { margin-top: 0; }
.ojas-stat { text-align: center; }
/*
 * Vanilla, not Jasmine. The impact figures sit on two different greens and
 * Jasmine was too close to both: 2.94:1 on the Amazon ground of the Commitments
 * page, which fails even the 3:1 that large text is allowed, and 4.74:1 on the
 * deeper green. Vanilla is 4.83:1 and 7.80:1 on the same two — clear of the
 * large-text bar on both, and clear of the 4.5:1 for ordinary text as well.
 *
 * The token, not the #f2e7b0 it was eyedropped as: one point per channel apart,
 * the same colour, and this way it follows the palette.
 */
.ojas-stat__value { font-family: var(--ojas-font-display); font-size: var(--ojas-size-h2); line-height: 1; color: var(--ojas-vanilla); }
.ojas-stat__label { margin: var(--ojas-space-xs) 0 0; font-size: var(--ojas-size-ui); color: var(--ojas-text-on-dark); }

/* ==========================================================================
   Contact page
   ========================================================================== */

.ojas-paths--three { grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr)); }
.ojas-path--card { display: grid; gap: var(--ojas-space-xs); background: var(--ojas-white); box-shadow: var(--ojas-shadow-sm); text-decoration: none; color: inherit; transition: transform var(--ojas-transition), box-shadow var(--ojas-transition); }
.ojas-path--card:hover { transform: translateY(-3px); box-shadow: var(--ojas-shadow-lg); color: inherit; }
.ojas-path--card .ojas-path__title { font-size: var(--ojas-size-h4); }
.ojas-path--card .ojas-path__text { margin-bottom: var(--ojas-space-xs); color: var(--ojas-muted); }
.ojas-path--card .ojas-btn--text { justify-self: start; }
.ojas-path--accent { background: var(--ojas-amazon); color: var(--ojas-white); }
.ojas-path--accent .ojas-eyebrow { color: var(--ojas-eyebrow-on-dark); }
.ojas-path--accent .ojas-path__title { color: var(--ojas-white); }
.ojas-path--accent .ojas-path__text { color: var(--ojas-text-on-dark); }
.ojas-path--accent .ojas-btn--text { color: var(--ojas-vanilla); }

.ojas-contact { display: grid; gap: clamp(var(--ojas-space-lg), 5vw, var(--ojas-space-3xl)); grid-template-columns: minmax(0, 1.6fr) minmax(280px, 1fr); align-items: start; }
@media (max-width: 900px) { .ojas-contact { grid-template-columns: 1fr; } .ojas-contact__side { position: static; } }
.ojas-contact__side { display: grid; gap: var(--ojas-space-lg); position: sticky; top: calc(var(--ojas-header-h) + var(--ojas-space-md)); }
.ojas-contact__note { padding: 0 var(--ojas-space-md); }
.ojas-contact__note .ojas-h6 { margin-bottom: var(--ojas-space-sm); }
.ojas-location .ojas-card__body { gap: var(--ojas-space-md); }

/* ==========================================================================
   Locations
   ========================================================================== */

.ojas-places { display: grid; gap: var(--ojas-space-3xl); }
.ojas-place { scroll-margin-top: calc(var(--ojas-header-h) + var(--ojas-space-md)); }
.ojas-place__placeholder { aspect-ratio: 4 / 3; background: linear-gradient(135deg, var(--ojas-jasmine), var(--ojas-amazon)); }
.ojas-place__body { display: grid; gap: var(--ojas-space-md); align-content: start; }
.ojas-place__title { margin: 0; font-size: var(--ojas-size-h2); }
.ojas-place__title a { text-decoration: none; color: inherit; }
.ojas-place__title a:hover { color: var(--ojas-jasmine-text); }
.ojas-place__intro { margin: 0; font-size: var(--ojas-size-lead); color: var(--ojas-muted); }
.ojas-place__details { grid-template-columns: repeat(auto-fit, minmax(min(180px, 100%), 1fr)); }
.ojas-place__actions { margin: 0; }
.ojas-place__order { display: grid; gap: var(--ojas-space-xs); padding-top: var(--ojas-space-md); border-top: 1px solid var(--ojas-border); }
.ojas-place__order .ojas-order-links__label { width: auto; }

/* ==========================================================================
   CSR — commitments
   ========================================================================== */

.ojas-commitments { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--ojas-space-2xl); counter-reset: commitment; }
.ojas-commitment { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--ojas-space-lg); margin: 0; padding-bottom: var(--ojas-space-2xl); border-bottom: 1px solid var(--ojas-border); scroll-margin-top: calc(var(--ojas-header-h) + var(--ojas-space-md)); }
.ojas-commitment:last-child { border-bottom: 0; padding-bottom: 0; }
.ojas-commitment__mark { display: grid; gap: var(--ojas-space-xs); justify-items: center; }
.ojas-commitment__number { font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); color: var(--ojas-eyebrow); }
.ojas-commitment__icon { display: grid; place-items: center; width: 72px; height: 72px; border-radius: 0 26px 0 26px; background: var(--ojas-jasmine); color: var(--ojas-ink); line-height: 1; }
.ojas-commitment__body { display: grid; gap: var(--ojas-space-sm); align-content: start; }
.ojas-commitment__title { margin: 0; font-size: var(--ojas-size-h3); }
.ojas-commitment__lead { margin: 0; font-size: var(--ojas-size-lead); color: var(--ojas-ink); }
.ojas-commitment__text { margin: 0; max-width: 68ch; color: var(--ojas-muted); }
.ojas-commitment__actions { margin-top: var(--ojas-space-xs); }
@media (max-width: 600px) {
  .ojas-commitment { grid-template-columns: 1fr; gap: var(--ojas-space-md); }
  .ojas-commitment__mark { justify-items: start; grid-auto-flow: column; justify-content: start; align-items: center; gap: var(--ojas-space-sm); }
  .ojas-commitment__icon { width: 56px; height: 56px; }
  .ojas-commitment__icon .ojas-icon { width: 26px; height: 26px; }
}

/* The CSR header sits on the leaf pattern rather than a photo. */
/*
 * The light tint is for the leaf pattern on its own. With a photograph behind
 * it, 0.35 leaves white text at roughly 2:1 — so the photo case keeps the
 * measured scrim and only the pattern-only case stays light.
 */
.ojas-page-header--media.ojas-pattern-leaves:not(:has(.ojas-page-header__media))::after { background: rgba(14, 79, 40, 0.35); }

/* ==========================================================================
   Blog
   ========================================================================== */

.ojas-lead-post { display: block; }
.ojas-lead-post__body { display: grid; gap: var(--ojas-space-sm); align-content: center; justify-items: start; }
.ojas-lead-post__title { margin: 0; font-size: var(--ojas-size-h2); }
.ojas-lead-post__title a { text-decoration: none; color: inherit; }
.ojas-lead-post__title a:hover { color: var(--ojas-jasmine-text); }
.ojas-lead-post__excerpt { margin: 0; font-size: var(--ojas-size-lead); color: var(--ojas-muted); }
.ojas-lead-post .ojas-media--rounded { display: block; }

.ojas-byline { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--ojas-space-xs) var(--ojas-space-md); margin: var(--ojas-space-md) 0 0; font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow); }
.ojas-page-header--amazon .ojas-byline,
.ojas-page-header--deep .ojas-byline { color: var(--ojas-vanilla); }
.ojas-byline span + span::before { content: "·"; margin-right: var(--ojas-space-md); color: currentColor; opacity: 0.6; }

/* Long-form reading: larger type, generous rhythm, pull-quotes that breathe. */
.ojas-prose { font-size: var(--ojas-size-lead); line-height: 1.7; }
.ojas-prose > * + * { margin-top: var(--ojas-space-md); }
.ojas-prose :is(h2, h3) { margin-top: var(--ojas-space-2xl); }
.ojas-prose h2 { font-size: var(--ojas-size-h3); }
.ojas-prose h3 { font-size: var(--ojas-size-h4); }
.ojas-prose blockquote { margin-block: var(--ojas-space-xl); }
.ojas-prose :is(ul, ol) { padding-left: 1.4em; }
.ojas-prose li + li { margin-top: var(--ojas-space-xs); }
.ojas-prose img, .ojas-prose figure { border-radius: var(--ojas-radius); }

.ojas-share { display: grid; gap: var(--ojas-space-xs); margin-top: var(--ojas-space-2xl); padding-top: var(--ojas-space-lg); border-top: 1px solid var(--ojas-border); }
.ojas-share .ojas-order-links__label { width: auto; }

/* ==========================================================================
   Gallery
   ========================================================================== */

.ojas-gallery {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: var(--ojas-grid-gap);
  grid-template-columns: repeat(auto-fill, minmax(min(280px, 100%), 1fr));
  grid-auto-rows: 240px;
}
.ojas-gallery__item { margin: 0; }
@media (min-width: 768px) {
  .ojas-gallery__item--wide { grid-column: span 2; }
  .ojas-gallery__item--tall { grid-row: span 2; }
}
.ojas-gallery__button {
  position: relative; display: block; width: 100%; height: 100%; padding: 0;
  border: 0; border-radius: var(--ojas-radius); overflow: hidden;
  background: var(--ojas-vanilla); cursor: zoom-in;
}
.ojas-gallery__button img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.6s var(--ojas-ease); }
.ojas-gallery__button:hover img { transform: scale(1.05); }
.ojas-gallery__overlay {
  position: absolute; inset: auto 0 0 0;
  display: grid; gap: 2px; padding: var(--ojas-space-lg) var(--ojas-space-md) var(--ojas-space-md);
  background: linear-gradient(to top, rgba(14, 79, 40, 0.85), rgba(14, 79, 40, 0));
  text-align: left; opacity: 0; transform: translateY(8px);
  transition: opacity var(--ojas-transition), transform var(--ojas-transition);
}
.ojas-gallery__button:hover .ojas-gallery__overlay,
.ojas-gallery__button:focus-visible .ojas-gallery__overlay { opacity: 1; transform: none; }
.ojas-gallery__caption { font-family: var(--ojas-font-display); font-size: var(--ojas-size-h5); color: var(--ojas-white); }
.ojas-gallery__label { font-size: var(--ojas-size-micro); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-jasmine); }
.ojas-gallery__empty { margin-top: var(--ojas-space-2xl); text-align: center; color: var(--ojas-muted); }

/* Filter buttons reuse .ojas-filter; they are <button>s here, not links. */
.ojas-filter[aria-pressed="true"] { background: var(--ojas-amazon); border-color: var(--ojas-amazon); color: var(--ojas-white); }

/* ---------- Lightbox ------------------------------------------------------- */

.ojas-lightbox {
  width: min(1100px, 92vw); max-width: none; max-height: 92vh;
  padding: 0; border: 0; border-radius: var(--ojas-radius-lg);
  background: var(--ojas-offwhite); color: var(--ojas-ink);
  overflow: visible;
}
.ojas-lightbox::backdrop { background: rgba(14, 79, 40, 0.82); backdrop-filter: blur(4px); }
.ojas-lightbox:not([open]) { display: none; }
.ojas-lightbox__figure { margin: 0; display: grid; }
.ojas-lightbox__figure img { width: 100%; max-height: 76vh; object-fit: contain; background: var(--ojas-ink); border-radius: var(--ojas-radius-lg) var(--ojas-radius-lg) 0 0; }
.ojas-lightbox__caption { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--ojas-space-sm); padding: var(--ojas-space-md) var(--ojas-space-lg); font-family: var(--ojas-font-display); font-size: var(--ojas-size-h5); color: var(--ojas-amazon); }
.ojas-lightbox__close {
  position: absolute; top: -18px; right: -18px; z-index: 1;
  width: 44px; height: 44px; display: grid; place-items: center;
  border: 0; border-radius: 50%; background: var(--ojas-white); color: var(--ojas-ink);
  font-size: 26px; line-height: 1; cursor: pointer; box-shadow: var(--ojas-shadow);
}
.ojas-lightbox__nav {
  position: absolute; top: 50%; transform: translateY(-50%);
  width: 48px; height: 48px; display: grid; place-items: center;
  border: 0; border-radius: 50%; background: var(--ojas-white); color: var(--ojas-amazon);
  font-size: 30px; line-height: 1; cursor: pointer; box-shadow: var(--ojas-shadow);
}
.ojas-lightbox__nav--prev { left: -22px; }
.ojas-lightbox__nav--next { right: -22px; }
@media (max-width: 700px) {
  .ojas-lightbox__close { top: 8px; right: 8px; }
  .ojas-lightbox__nav--prev { left: 8px; }
  .ojas-lightbox__nav--next { right: 8px; }
  .ojas-lightbox__caption { font-size: var(--ojas-size-h6); }
}

/* ==========================================================================
   FAQs page
   ========================================================================== */

.ojas-faq-layout { display: grid; gap: clamp(var(--ojas-space-lg), 5vw, var(--ojas-space-3xl)); grid-template-columns: minmax(200px, 260px) minmax(0, 1fr); align-items: start; }
@media (max-width: 900px) { .ojas-faq-layout { grid-template-columns: 1fr; } }

.ojas-faq-nav { position: sticky; top: calc(var(--ojas-header-h) + var(--ojas-space-md)); display: grid; gap: var(--ojas-space-sm); }
@media (max-width: 900px) { .ojas-faq-nav { position: static; } }
.ojas-faq-nav__title { font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow); }
.ojas-faq-nav ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; }
.ojas-faq-nav li { margin: 0; }
/*
 * Scoped to the topic list, not to every link in the nav. Unscoped, these three
 * lines also landed on the "Ask us" button sitting under the list — a two-part
 * selector outranks `.ojas-btn--primary` — and took it apart: ink instead of
 * white on the Amazon ground (2.48:1, under AA), `display: block` so the arrow
 * lost its flex gap, a 12px radius where every other button is a pill, and the
 * wrong padding. One button on the site looked like a different theme.
 */
.ojas-faq-nav li a { display: block; padding: var(--ojas-space-xs) var(--ojas-space-sm); border-radius: var(--ojas-radius-sm); font-weight: var(--ojas-weight-medium); text-decoration: none; color: var(--ojas-ink); }
.ojas-faq-nav li a:hover { background: var(--ojas-vanilla); color: var(--ojas-amazon); }
.ojas-faq-nav__help { margin-top: var(--ojas-space-md); padding: var(--ojas-space-md); background: var(--ojas-vanilla); border-radius: var(--ojas-radius); display: grid; gap: var(--ojas-space-xs); justify-items: start; }
.ojas-faq-nav__help p { margin: 0; font-weight: var(--ojas-weight-semibold); color: var(--ojas-ink); }

.ojas-faq-groups { display: grid; gap: var(--ojas-space-2xl); }
.ojas-faq-group { scroll-margin-top: calc(var(--ojas-header-h) + var(--ojas-space-md)); }
.ojas-faq-group__title { margin: 0 0 var(--ojas-space-sm); font-size: var(--ojas-size-h3); }

/* ==========================================================================
   Store locator
   ========================================================================== */

.ojas-locator-nav { border-block: 1px solid var(--ojas-border); background: var(--ojas-white); }
.ojas-locator-nav__inner { display: flex; gap: var(--ojas-space-md); overflow-x: auto; scrollbar-width: none; padding-block: var(--ojas-space-sm); }
.ojas-locator-nav__inner::-webkit-scrollbar { display: none; }
.ojas-locator-nav a { flex: 0 0 auto; padding: 8px 14px; border-radius: var(--ojas-radius-pill); font-size: 14px; font-weight: var(--ojas-weight-semibold); text-decoration: none; color: var(--ojas-amazon); }
.ojas-locator-nav a:hover { background: var(--ojas-vanilla); }

.ojas-locator { scroll-margin-top: calc(var(--ojas-header-h) + var(--ojas-space-md)); }
.ojas-locator__grid { display: grid; gap: clamp(var(--ojas-space-lg), 4vw, var(--ojas-space-2xl)); grid-template-columns: minmax(0, 1.15fr) minmax(320px, 1fr); align-items: start; }
@media (max-width: 900px) { .ojas-locator__grid { grid-template-columns: 1fr; } }

.ojas-locator__map { position: relative; border-radius: var(--ojas-radius-lg); overflow: hidden; background: var(--ojas-vanilla); min-height: 380px; }
.ojas-locator__map iframe { display: block; width: 100%; height: 100%; min-height: 380px; border: 0; }
.ojas-locator__map img { width: 100%; height: 100%; object-fit: cover; }
@media (max-width: 900px) { .ojas-locator__map, .ojas-locator__map iframe { min-height: 300px; } }

.ojas-locator__card { display: grid; gap: var(--ojas-space-md); align-content: start; padding: var(--ojas-space-xl); background: var(--ojas-white); border-radius: var(--ojas-radius-lg); box-shadow: var(--ojas-shadow-sm); }
.ojas-locator__title { margin: 0; font-size: var(--ojas-size-h3); }
.ojas-locator__intro { margin: 0; color: var(--ojas-muted); }
.ojas-locator__getting { display: grid; gap: var(--ojas-space-xs); }
.ojas-locator__block { display: grid; gap: var(--ojas-space-xs); padding-top: var(--ojas-space-md); border-top: 1px solid var(--ojas-border); }
.ojas-locator__block.ojas-cluster { display: flex; align-items: center; }
.ojas-locator__block .ojas-order-links__label { width: auto; }

/* ==========================================================================
   Explore menu options — filter rail + menu cards with stations
   ========================================================================== */

/* The filter bar sticks under the header so the count and Clear all stay
   reachable while scrolling a long list, clearing the fixed site header. */
.ojas-explore__bar {
  position: sticky; top: var(--ojas-header-h); z-index: calc(var(--ojas-z-header) - 1);
  background: var(--ojas-offwhite);
  border-bottom: 1px solid var(--ojas-border);
  padding-block: var(--ojas-space-sm);
  margin-bottom: var(--ojas-space-xl);
}
.ojas-explore__bar-inner { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ojas-space-sm) var(--ojas-space-md); }
.ojas-explore__search { flex: 1 1 260px; min-width: 0; }
.ojas-explore__search input {
  width: 100%; min-height: 46px; padding: 0 var(--ojas-space-md);
  border: 1px solid var(--ojas-border); border-radius: var(--ojas-radius-pill);
  background: var(--ojas-white); color: var(--ojas-ink);
  font: inherit; font-size: var(--ojas-size-ui);
}
.ojas-explore__search input:focus-visible { outline: 2px solid var(--ojas-amazon); outline-offset: 2px; }
.ojas-explore__count {
  margin: 0; flex: 0 0 auto;
  font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow);
}
.ojas-explore__clear { flex: 0 0 auto; }

/*
 * `minmax(0, 1fr)`, not the implicit `auto` this had.
 *
 * Below the breakpoint this is a one-column grid, and an implicit column is
 * auto-sized — it grows to its content. A grid item's default `min-width: auto`
 * then refuses to shrink below the widest thing inside it, so on a 320px phone
 * the results column laid out at 562px and hung 242px off the right. The page
 * did not scroll, because <body> clips: the menu cards were simply cut in half
 * with nothing to show they had been.
 */
.ojas-explore__layout { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--ojas-grid-gap); align-items: start; }
@media (min-width: 900px) {
  .ojas-explore__layout { grid-template-columns: 250px minmax(0, 1fr); gap: var(--ojas-space-xl); }
  /* Offset by the filter bar so the rail never hides beneath it. */
  .ojas-explore__filters { position: sticky; top: calc(var(--ojas-header-h) + 96px); }
}

.ojas-explore__filters { display: grid; gap: var(--ojas-space-lg); }
.ojas-explore__group { margin: 0; padding: 0; border: 0; }
.ojas-explore__legend {
  padding: 0; margin-bottom: var(--ojas-space-xs);
  font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow);
}
.ojas-explore__options { display: flex; flex-wrap: wrap; gap: 6px; }
.ojas-explore__option {
  display: inline-flex; align-items: center; gap: 7px;
  min-height: 34px; padding: 0 12px;
  border: 1px solid var(--ojas-border); border-radius: var(--ojas-radius-pill);
  background: var(--ojas-white);
  font-size: var(--ojas-size-ui); line-height: 1.2; cursor: pointer;
  transition: background var(--ojas-transition), border-color var(--ojas-transition);
}
.ojas-explore__option:hover { border-color: var(--ojas-amazon); }
.ojas-explore__option input { width: 15px; height: 15px; margin: 0; accent-color: var(--ojas-amazon); flex: none; }
.ojas-explore__option:has(input:checked) { background: var(--ojas-amazon); border-color: var(--ojas-amazon); color: var(--ojas-white); }
.ojas-explore__option:has(input:focus-visible) { outline: 2px solid var(--ojas-ink); outline-offset: 2px; }

.ojas-explore__key { display: grid; gap: var(--ojas-space-xs); padding-top: var(--ojas-space-md); border-top: 1px solid var(--ojas-border); }

.ojas-explore__grid { display: grid; gap: var(--ojas-grid-gap); grid-template-columns: repeat(auto-fill, minmax(min(300px, 100%), 1fr)); }
.ojas-explore__empty { margin: var(--ojas-space-xl) 0 0; text-align: center; color: var(--ojas-muted); }

.ojas-emenu {
  display: flex; flex-direction: column; gap: var(--ojas-space-md);
  padding: var(--ojas-space-lg);
  background: var(--ojas-white); border-radius: var(--ojas-radius);
  box-shadow: var(--ojas-shadow-sm);
}
/*
 * The photo band. Kept shallow — 16:9 rather than the card's usual 4:3 — because
 * an explore card is mostly its station list, and a tall photo would push the
 * food itself below the fold on a phone.
 */
.ojas-emenu__media {
  margin: calc(var(--ojas-space-lg) * -1) calc(var(--ojas-space-lg) * -1) 0;
  border-radius: var(--ojas-radius) var(--ojas-radius) 0 0;
  overflow: hidden; background: var(--ojas-vanilla);
}
.ojas-emenu__media img { display: block; width: 100%; aspect-ratio: 16 / 9; object-fit: cover; }
.ojas-emenu__media--empty img { object-fit: cover; opacity: 0.85; }

.ojas-emenu__head { display: grid; gap: var(--ojas-space-xs); }
.ojas-emenu__eyebrow {
  margin: 0; font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow);
}
.ojas-emenu__title { margin: 0; }   /* type comes from the shared card-title rule */
.ojas-emenu__notes { margin-top: 2px; }

.ojas-emenu__stations { display: grid; gap: var(--ojas-space-md); }
.ojas-station { display: grid; gap: 6px; padding-top: var(--ojas-space-sm); border-top: 1px solid var(--ojas-border); }
.ojas-station:first-child { padding-top: 0; border-top: 0; }
.ojas-station__name {
  margin: 0; font-family: var(--ojas-font-body);
  font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-jasmine-text);
}
.ojas-station__items { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.ojas-station__items li { margin: 0; font-size: var(--ojas-size-ui); line-height: 1.45; }

.ojas-mark {
  display: inline-block; margin-left: 4px; padding: 0 5px;
  border-radius: 4px; background: var(--ojas-vanilla); color: var(--ojas-ink);
  font-size: var(--ojas-size-micro); font-weight: var(--ojas-weight-semibold); letter-spacing: 0.06em;
  text-decoration: none; vertical-align: 1px; cursor: help;
}

.ojas-emenu__foot { margin-top: auto; padding-top: var(--ojas-space-sm); }

/* ==========================================================================
   Reviews
   ========================================================================== */

/*
 * CSS columns, not a grid. The quotes run from one line to six, and a grid
 * would stretch every card in a row to the tallest — leaving a one-line review
 * sitting in a box of white space. Columns let each card be its own height.
 * The reading order becomes top-to-bottom per column, which is how people read
 * a wall of reviews anyway.
 */
/*
 * A grid, not CSS columns.
 *
 * Columns were the right call when the quotes ran from one line to six and the
 * text was left-aligned: they let every card be its own height instead of
 * padding a whole row out to the tallest. What they cannot do is line the cards
 * up — a column flows independently, so the second card in one column starts
 * twenty-odd pixels above or below its neighbour, and with four centred cards
 * that stagger reads as a mistake rather than as a masonry wall.
 *
 * So: equal rows, and the byline pinned to the bottom of each card (see
 * .ojas-review__by) so the names line up across a row instead of floating
 * wherever the quote happens to end. The whitespace that buys inside a short
 * card is what makes it look deliberate.
 */
.ojas-reviews {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--ojas-grid-gap);
  margin-top: var(--ojas-space-2xl);
}
@media (min-width: 680px)  { .ojas-reviews { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1100px) { .ojas-reviews { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
/* A short set stays at two, so the last row is never left with one card in it. */
@media (min-width: 1100px) { .ojas-reviews--two { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

.ojas-review {
  display: flex;                   /* so the byline can be pushed to the foot */
  flex-direction: column;
  margin: 0;
  padding: var(--ojas-space-lg);
  background: var(--ojas-white);
  border-radius: var(--ojas-radius);
  box-shadow: var(--ojas-shadow-sm);
  /*
   * Centred on the owner's instruction, and it does cost something: centred
   * prose gives every line a ragged left edge, so the eye has to hunt for the
   * start of each one. The mitigation is below — the quotes are held to a
   * short measure so no card runs long enough for that to bite.
   */
  text-align: center;
}

/* One review carries the section: the catering one people should read first. */
.ojas-review--feature {
  background: var(--ojas-amazon);
  color: var(--ojas-text-on-dark);
}
.ojas-review--feature .ojas-review__quote,
.ojas-review--feature .ojas-review__name { color: var(--ojas-white); }
.ojas-review--feature .ojas-review__meta { color: var(--ojas-muted-on-dark); }

.ojas-review__stars {
  /* A span now, so it needs to be told it is a block where it stands alone. */
  display: block;
  margin: 0 0 var(--ojas-space-sm);
  font-size: 17px;
  line-height: 1;
  /* The five are drawn now, so they need the spacing the font used to give. */
  letter-spacing: 0.12em;
  /*
   * Amazon, not the rust the guideline's orange gave them. With the CTAs moved
   * to ink, the stars were the last orange on the site and looked orphaned.
   *
   * Brand colour on both grounds, and the two halves match: the anchor green on
   * the white cards at 6.00:1 — better than the 4.47:1 the rust managed — and
   * the highlight Lemon on the green feature panel. Jasmine and Island were the
   * obvious "greener" picks and both fail at this size, 2.04:1 and 3.17:1.
   */
  color: var(--ojas-amazon);
}
.ojas-review__stars > span:first-child { display: inline-flex; gap: 3px; vertical-align: -3px; }
.ojas-review--feature .ojas-review__stars { color: var(--ojas-lemon); }

.ojas-review__quote {
  margin: 0 0 var(--ojas-space-md);
  padding: 0;
  border: 0;
  /* The base blockquote is set in Quitos for pull-quotes; a paragraph of
     someone's review needs the body face to stay readable. */
  font-family: var(--ojas-font-body);
  font-size: var(--ojas-size-ui);
  font-style: normal;
  line-height: 1.6;
  color: var(--ojas-ink);
  /*
   * A short measure, centred in the card. Centred text is read line by line
   * from a moving left edge, which is tiring over a long line — holding it to
   * roughly forty characters keeps the hunt short. It only bites on a wide
   * single-column card; inside the two- and three-column layouts the column is
   * already narrower than this.
   */
  max-width: 40ch;
  margin-inline: auto;
}

/* Centred with the card, and the stars sit in the middle rather than the left. */
.ojas-review__stars { text-align: center; }

/* margin-top: auto drops this to the foot of the card, so a row of cards has
   its names on one line however long the quotes above them run. */
.ojas-review__by { display: grid; gap: 2px; justify-items: center; margin-top: auto; }
.ojas-review__name { font-weight: var(--ojas-weight-semibold); color: var(--ojas-heading); }
.ojas-review__meta {
  font-size: var(--ojas-size-meta); letter-spacing: var(--ojas-track-label);
  text-transform: uppercase; color: var(--ojas-muted);
}

.ojas-reviews__more { margin-top: var(--ojas-space-lg); }

/* ==========================================================================
   Speciality landing pages
   ========================================================================== */

.ojas-page-header__actions { justify-content: center; margin-top: var(--ojas-space-lg); }

/* The three things that matter for this occasion. */
.ojas-note {
  padding: var(--ojas-space-xl);
  background: var(--ojas-white);
  border-radius: var(--ojas-radius-lg);
  box-shadow: var(--ojas-shadow-sm);
}
.ojas-note__num {
  display: block; margin-bottom: var(--ojas-space-sm);
  font-family: var(--ojas-font-display); font-size: 30px; line-height: 1;
  color: var(--ojas-jasmine-text);
}
.ojas-note__title { margin: 0 0 var(--ojas-space-xs); font-size: var(--ojas-size-h4); }
.ojas-note__text { margin: 0; color: var(--ojas-muted); }

/* --------------------------------------------------------------------------
   The booking call to action
   Two real paths side by side — the form for people who are planning, the
   phone for people who already have a date. On the dark ground the assurances
   sit on Vanilla, which is 4.83:1 there.
   -------------------------------------------------------------------------- */

.ojas-cta__inner {
  display: grid; gap: var(--ojas-space-xl) var(--ojas-space-3xl);
  grid-template-columns: minmax(0, 1.35fr) minmax(260px, 0.65fr);
  align-items: center;
}
@media (max-width: 860px) { .ojas-cta__inner { grid-template-columns: 100%; } }

.ojas-cta__title { margin: 0 0 var(--ojas-space-sm); }
.ojas-cta__text  { margin: 0 0 var(--ojas-space-lg); max-width: 52ch; }
.ojas-section--dark .ojas-cta__text { color: var(--ojas-text-on-dark); }

.ojas-cta__assurances {
  display: flex; flex-wrap: wrap; gap: var(--ojas-space-xs) var(--ojas-space-lg);
  list-style: none; margin: 0; padding: 0;
  font-size: var(--ojas-size-meta);
}
.ojas-cta__assurances li { display: flex; align-items: baseline; gap: 8px; }
.ojas-cta__assurances li::before { content: "\2713"; color: var(--ojas-jasmine); }
.ojas-section--dark .ojas-cta__assurances { color: var(--ojas-eyebrow-on-dark); }
.ojas-section--accent .ojas-cta__assurances li::before,
.ojas-section--band .ojas-cta__assurances li::before { color: var(--ojas-amazon); }

.ojas-cta__do { display: grid; justify-items: start; gap: var(--ojas-space-md); }
@media (max-width: 860px) { .ojas-cta__do { justify-items: stretch; } }

.ojas-cta__phone { display: grid; gap: 2px; text-decoration: none; }
.ojas-cta__phone-label {
  font-size: var(--ojas-size-meta); letter-spacing: var(--ojas-track-label);
  text-transform: uppercase; color: var(--ojas-muted);
}
.ojas-cta__phone-number {
  font-family: var(--ojas-font-display); font-size: var(--ojas-size-h3);
  line-height: 1.1; color: var(--ojas-heading);
}
.ojas-section--dark .ojas-cta__phone-label  { color: var(--ojas-eyebrow-on-dark); }
.ojas-section--dark .ojas-cta__phone-number { color: var(--ojas-white); }
.ojas-cta__phone:hover .ojas-cta__phone-number { text-decoration: underline; }

/* --------------------------------------------------------------------------
   Related content
   A landing page that ends in one button is a cul-de-sac. These are the ways
   out, each with a picture so they read as places rather than links.
   -------------------------------------------------------------------------- */

.ojas-related {
  display: grid; gap: var(--ojas-grid-gap);
  grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
}
.ojas-related__card {
  display: grid; grid-template-rows: auto 1fr;
  overflow: hidden; text-decoration: none; color: inherit;
  background: var(--ojas-white); border-radius: var(--ojas-radius-lg);
  box-shadow: var(--ojas-shadow-sm);
  transition: transform var(--ojas-transition), box-shadow var(--ojas-transition);
}
.ojas-related__card:hover { transform: translateY(-3px); box-shadow: var(--ojas-shadow-lg); color: inherit; }
.ojas-related__media { display: block; aspect-ratio: 16 / 10; overflow: hidden; }
.ojas-related__media img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.6s var(--ojas-ease-entrance); }
.ojas-related__card:hover .ojas-related__media img { transform: scale(1.04); }
/*
 * A cut-out plate cropped to 16:10 lost the top and bottom of its rim and
 * stopped reading as round. It gets a square well instead, is contained rather
 * than covered, and carries the same silhouette shadow as everywhere else —
 * the padding is what gives that shadow somewhere to fall, since the media box
 * clips. On hover the plate rises out of the card rather than zooming into it.
 */
.ojas-related__media--plate {
  aspect-ratio: 1; display: grid; place-items: center;
  background: var(--ojas-white);
  /*
   * The well stops clipping so the shadow can fall past it onto the card body,
   * the way a plate's shadow falls on the table beyond the plate. The card's
   * own overflow still holds everything inside the rounded corners.
   */
  overflow: visible;
  --ojas-plate-shadow: drop-shadow(0 16px 16px rgba(26, 45, 32, 0.20)) drop-shadow(0 3px 5px rgba(26, 45, 32, 0.12));
}
/*
 * The plate is a circle in a 500x356 file with a third of the width empty on
 * either side, so `contain` in a square well leaves it at 71% and the card
 * looks half full. Scaled up it reaches 87% — the transparent margins are what
 * get clipped, never the food — and the remaining 6% of air is what keeps the
 * shadow inside the well, which clips.
 */
.ojas-related__media--plate img {
  width: 100%; height: 100%; object-fit: contain;
  transform: scale(1.22);
  filter: var(--ojas-plate-shadow);
  transition: transform 0.5s var(--ojas-ease-entrance), filter 0.5s var(--ojas-ease-entrance);
}
.ojas-related__card:hover .ojas-related__media--plate img {
  transform: translateY(-7px) scale(1.27);
  filter: drop-shadow(0 26px 24px rgba(26, 45, 32, 0.24)) drop-shadow(0 5px 7px rgba(26, 45, 32, 0.14));
}
.ojas-related__body { display: grid; align-content: start; gap: var(--ojas-space-xs); padding: var(--ojas-space-lg); }
.ojas-related__label {
  font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase;
  color: var(--ojas-eyebrow);
}
/*
 * Bigger than the other two. Everything else — the face, the weight, the
 * leading — comes from the shared card-title rule; only the size differs,
 * because a related card is a signpost off the end of a page rather than one
 * of twelve items in a grid, and it should read as the larger invitation.
 */
.ojas-related__title { font-size: var(--ojas-size-h4); color: var(--ojas-heading); }
.ojas-related__text  { color: var(--ojas-muted); font-size: var(--ojas-size-ui); }
/*
 * Three cards are a sample, not the shelf. The button under them says so, and
 * keeps the section from reading as everything there is.
 */
.ojas-related__more { margin: var(--ojas-space-xl) 0 0; text-align: center; }

@media (prefers-reduced-motion: reduce) {
  .ojas-related__card, .ojas-related__media img, .ojas-dish__media img { transition: none; }
  .ojas-related__card:hover { transform: none; }
  .ojas-related__card:hover .ojas-related__media img { transform: none; }
  /* The depth stays — it is not motion. Only the lift goes. */
  .ojas-related__card:hover .ojas-related__media--plate img { transform: scale(1.22); }
}

/* The "We cook this for" label introduces a list after a paragraph; it needs
   the air a heading would get, which the inline service label does not carry. */
.ojas-suits__label { margin-top: var(--ojas-space-lg); }

/* ==========================================================================
   Reading options
   A preferences panel, not an accessibility overlay: it changes this site's own
   tokens and claims nothing about conformance. See template-parts/a11y.php.
   ========================================================================== */

.ojas-a11y { position: fixed; left: var(--ojas-space-md); bottom: var(--ojas-space-md); z-index: var(--ojas-z-header); }

.ojas-a11y__toggle {
  display: inline-flex; align-items: center; gap: 8px;
  min-height: 48px; padding: 10px 18px 10px 14px;
  border: 1.5px solid var(--ojas-border); border-radius: var(--ojas-radius-pill);
  background: var(--ojas-white); color: var(--ojas-ink);
  font-family: var(--ojas-font-body); font-size: var(--ojas-size-ui);
  font-weight: var(--ojas-weight-medium); cursor: pointer;
  box-shadow: var(--ojas-shadow-sm);
}
.ojas-a11y__toggle:hover { border-color: var(--ojas-amazon); }
.ojas-a11y__icon { display: grid; place-items: center; color: var(--ojas-amazon); }
@media (max-width: 600px) {
  /* Room is scarce; the icon alone still has its accessible name from the text. */
  .ojas-a11y__toggle-text { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .ojas-a11y__toggle { padding: 12px; }
}

.ojas-a11y__panel {
  position: absolute; bottom: calc(100% + 10px); left: 0;
  width: 340px;
  max-height: min(72vh, 620px); overflow-y: auto;
  padding: var(--ojas-space-lg);
  background: var(--ojas-white); color: var(--ojas-ink);
  border: 1px solid var(--ojas-border); border-radius: var(--ojas-radius);
  box-shadow: var(--ojas-shadow-lg);
}

.ojas-a11y__head { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--ojas-space-sm); }
.ojas-a11y__title { margin: 0; font-size: var(--ojas-size-h4); }
.ojas-a11y__close {
  border: 0; background: none; cursor: pointer; color: var(--ojas-muted);
  font-size: 26px; line-height: 1; padding: 0 4px; min-height: 44px; min-width: 44px;
}
.ojas-a11y__close:hover { color: var(--ojas-ink); }
.ojas-a11y__intro { margin: 0 0 var(--ojas-space-md); font-size: var(--ojas-size-meta); color: var(--ojas-muted); }

.ojas-a11y__group { border: 0; padding: 0; margin: 0 0 var(--ojas-space-md); min-width: 0; }
.ojas-a11y__legend {
  padding: 0; margin-bottom: var(--ojas-space-xs);
  font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-ink);
}
.ojas-a11y__choices { display: flex; flex-wrap: wrap; gap: 6px; }
.ojas-a11y__choice {
  display: inline-flex; align-items: center; min-height: 40px; padding: 8px 14px;
  border: 1.5px solid var(--ojas-border); border-radius: var(--ojas-radius-pill);
  cursor: pointer; font-size: var(--ojas-size-ui);
}
.ojas-a11y__choice input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ojas-a11y__choice:has(:checked) { background: var(--ojas-amazon); border-color: var(--ojas-amazon); color: var(--ojas-white); }
.ojas-a11y__choice:has(:focus-visible) { outline: 2px solid var(--ojas-focus); outline-offset: 2px; }

.ojas-a11y__switches { list-style: none; margin: 0 0 var(--ojas-space-md); padding: 0; display: grid; gap: var(--ojas-space-xs); }
.ojas-a11y__switch { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 10px; align-items: start; cursor: pointer; padding: 6px 0; }
.ojas-a11y__switch input { width: 20px; height: 20px; margin: 2px 0 0; accent-color: var(--ojas-amazon); }
.ojas-a11y__switch-text { display: grid; gap: 2px; }
.ojas-a11y__switch-label { font-size: var(--ojas-size-ui); font-weight: var(--ojas-weight-medium); }
.ojas-a11y__switch-hint { font-size: var(--ojas-size-meta); color: var(--ojas-muted); }

.ojas-a11y__foot { display: flex; justify-content: flex-start; }
.ojas-a11y__status { margin: var(--ojas-space-xs) 0 0; min-height: 1.3em; font-size: var(--ojas-size-meta); color: var(--ojas-jasmine-text); }

@media (max-width: 700px) {
  /*
   * Pinned to both edges rather than sized from the viewport. 100vw includes
   * the scrollbar, so on any browser that reserves one the panel came out
   * wider than the space it had and hung off the side. This rule has to sit
   * after the panel's own width, not beside the toggle's, or it loses.
   */
  .ojas-a11y__panel {
    position: fixed; left: var(--ojas-space-md); right: var(--ojas-space-md);
    bottom: calc(var(--ojas-space-md) + 58px); width: auto;
  }
}

/* ---- what the preferences actually do -------------------------------- */

:root[data-ojas-links="underline"] :is(.ojas-entry-content, .ojas-page-header__text, p, li) a { text-decoration: underline; text-underline-offset: 2px; }

:root[data-ojas-spacing="loose"] :is(p, li, dd, .ojas-card__excerpt, .ojas-feature__text) {
  line-height: 1.85;
  letter-spacing: 0.012em;
  word-spacing: 0.06em;
}

:root[data-ojas-motion="reduce"] *,
:root[data-ojas-motion="reduce"] *::before,
:root[data-ojas-motion="reduce"] *::after {
  animation-duration: 0.001ms !important;
  animation-iteration-count: 1 !important;
  transition-duration: 0.001ms !important;
  scroll-behavior: auto !important;
}
:root[data-ojas-motion="reduce"] .ojas-reveal { opacity: 1 !important; transform: none !important; }
:root[data-ojas-motion="reduce"] .ojas-wipe { clip-path: none !important; }

/* The higher-contrast setting should also harden the focus ring. */
:root[data-ojas-contrast="high"] :focus-visible { outline: 3px solid var(--ojas-focus); outline-offset: 3px; }

/* ==========================================================================
   The floating order widget
   Bottom-right, opposite the reading options. On a phone the two sit as a pair
   above the thumb, and neither covers the other.
   ========================================================================== */

.ojas-order { position: fixed; right: var(--ojas-space-md); bottom: var(--ojas-space-md); z-index: var(--ojas-z-header); }

.ojas-order__toggle {
  display: inline-flex; align-items: center; gap: 8px;
  min-height: 48px; padding: 11px 22px 11px 18px;
  border: 0; border-radius: var(--ojas-radius-pill);
  background: var(--ojas-ink); color: var(--ojas-white);
  font-family: var(--ojas-font-body); font-size: var(--ojas-size-ui);
  font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-button);
  cursor: pointer; box-shadow: var(--ojas-shadow-lg);
}
.ojas-order__toggle:hover { background: var(--ojas-amazon); color: var(--ojas-white); }
.ojas-order__icon { display: grid; place-items: center; }

.ojas-order__panel {
  position: absolute; right: 0; bottom: calc(100% + 10px);
  width: min(340px, calc(100vw - var(--ojas-space-lg)));
  max-height: min(74vh, 640px); overflow-y: auto;
  padding: var(--ojas-space-lg);
  background: var(--ojas-white); color: var(--ojas-ink);
  border: 1px solid var(--ojas-border); border-radius: var(--ojas-radius);
  box-shadow: var(--ojas-shadow-lg);
}

.ojas-order__head { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--ojas-space-sm); margin-bottom: var(--ojas-space-sm); }
.ojas-order__title { margin: 0; font-size: var(--ojas-size-h4); }
.ojas-order__close {
  border: 0; background: none; cursor: pointer; color: var(--ojas-muted);
  font-size: 26px; line-height: 1; padding: 0 4px; min-height: 44px; min-width: 44px;
}
.ojas-order__close:hover { color: var(--ojas-ink); }
.ojas-order__where { margin: 0 0 var(--ojas-space-sm); font-size: var(--ojas-size-meta); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow); }

.ojas-order__tabs { display: flex; gap: 4px; margin-bottom: var(--ojas-space-md); padding: 4px; background: var(--ojas-bg); border-radius: var(--ojas-radius-pill); }
.ojas-order__tab {
  flex: 1; min-height: 40px; padding: 8px 12px; border: 0; cursor: pointer;
  border-radius: var(--ojas-radius-pill); background: none; color: var(--ojas-ink);
  font-family: var(--ojas-font-body); font-size: 14px; font-weight: var(--ojas-weight-semibold);
}
.ojas-order__tab[aria-selected="true"] { background: var(--ojas-amazon); color: var(--ojas-white); }

.ojas-order__list { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.ojas-order__link {
  display: grid; grid-template-columns: 40px minmax(0, 1fr) auto; gap: 12px; align-items: center;
  min-height: 56px; padding: 8px 12px;
  border: 1.5px solid var(--ojas-border); border-radius: var(--ojas-radius-sm);
  text-decoration: none; color: var(--ojas-ink);
  transition: border-color var(--ojas-transition), background var(--ojas-transition);
}
.ojas-order__link:hover { border-color: var(--ojas-amazon); background: var(--ojas-bg); color: var(--ojas-ink); }
.ojas-order__logo { width: 40px; height: 40px; object-fit: contain; border-radius: 9px; }
.ojas-order__initial {
  display: grid; place-items: center; width: 40px; height: 40px;
  border-radius: 9px; background: var(--ojas-vanilla); color: var(--ojas-amazon);
  font-family: var(--ojas-font-display); font-size: 19px; line-height: 1;
}
.ojas-order__link-text { display: grid; gap: 1px; min-width: 0; }
.ojas-order__link-name { font-weight: var(--ojas-weight-semibold); font-size: var(--ojas-size-ui); }
.ojas-order__link-note { font-size: var(--ojas-size-meta); color: var(--ojas-muted); }
.ojas-order__go { color: var(--ojas-amazon); }
.ojas-order__foot { margin: var(--ojas-space-md) 0 0; }

@media (max-width: 600px) {
  /* The label goes; the button keeps its accessible name from the same text. */
  .ojas-order__toggle-text { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .ojas-order__toggle { padding: 13px; }
  /*
   * Pinned to both edges rather than sized with 100vw. 100vw includes the
   * scrollbar, so on any browser that reserves one the panel was three pixels
   * wider than the space it had and hung off the side of the screen.
   */
  .ojas-order__panel {
    position: fixed; left: var(--ojas-space-md); right: var(--ojas-space-md);
    bottom: calc(var(--ojas-space-md) + 58px); width: auto;
  }
}

@media (prefers-reduced-motion: reduce) { .ojas-order__link { transition: none; } }

/* --------------------------------------------------------------------------
   A locations grid with one kitchen in it
   Vertically stacked, a lone card puts a 4:3 photograph above three lines of
   address and runs to 650px — a whole screen for one street. On its own it
   takes the full measure and lays out sideways instead, which is both shorter
   and a better use of the room. Two or more and it is the ordinary card grid.
   -------------------------------------------------------------------------- */

.ojas-grid--places:has(> .ojas-card:only-child) { grid-template-columns: minmax(0, 1fr); }

@media (min-width: 760px) {
  .ojas-grid--places > .ojas-card:only-child {
    display: grid;
    grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
    align-items: stretch;
  }
  .ojas-grid--places > .ojas-card:only-child .ojas-card__media {
    aspect-ratio: auto;
    height: 100%;
    min-height: 280px;
  }
  /*
   * The photograph is wrapped in a link, and the img fills the link rather than
   * the media box. Without a height on the anchor it collapsed and the card
   * showed a flat vanilla panel where the picture should be.
   */
  .ojas-grid--places > .ojas-card:only-child .ojas-card__media > a { display: block; height: 100%; }
  .ojas-grid--places > .ojas-card:only-child .ojas-card__media img { height: 100%; object-fit: cover; }
  .ojas-grid--places > .ojas-card:only-child .ojas-card__body {
    justify-content: center;
    padding: var(--ojas-space-xl);
  }
}

/* --------------------------------------------------------------------------
   Footer columns
   The grid is content-led rather than a fixed column count: the brand block
   takes a wider track and the link columns share what is left, so four columns
   or six both sit properly.
   -------------------------------------------------------------------------- */

.ojas-footer__brand { max-width: 34ch; }
.ojas-footer__blurb { margin: var(--ojas-space-sm) 0 0; }
.ojas-footer__address {
  display: grid; gap: 2px; margin-top: var(--ojas-space-md);
  font-style: normal; font-size: var(--ojas-size-meta); color: var(--ojas-text-on-dark);
}
.ojas-footer__hours { color: var(--ojas-eyebrow-on-dark); }

.ojas-footer__col ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.ojas-footer__title--sub { margin-top: var(--ojas-space-lg); }


/* The comment spam check: a sum, not an image challenge. */
.ojas-comment-sum__input { max-width: 140px; }
.ojas-comment-sum .ojas-form-note { display: block; margin-top: 6px; }

/* --------------------------------------------------------------------------
   A single catering menu
   The stations sit in two columns where there is room — a breakfast spread is
   five or six short lists, and one column of them is a very long page.
   -------------------------------------------------------------------------- */

.ojas-menu-page__heading { margin-top: var(--ojas-space-2xl); }
.ojas-menu-page__stations {
  columns: 2;
  column-gap: var(--ojas-space-2xl);
  margin-top: var(--ojas-space-lg);
}
.ojas-menu-page__stations .ojas-station { break-inside: avoid; margin-bottom: var(--ojas-space-xl); }
/*
 * A menu with a single station filled the left column and left the right one
 * empty — 382px of nothing beside a five-line list, with the lines wrapping
 * early for no reason. On its own it gets the whole measure.
 */
.ojas-menu-page__stations:has(> .ojas-station:only-child) { columns: 1; }
@media (max-width: 700px) { .ojas-menu-page__stations { columns: 1; } }

.ojas-menu-page__key {
  margin-top: var(--ojas-space-xl);
  padding: var(--ojas-space-lg);
  background: var(--ojas-white);
  border-radius: var(--ojas-radius);
  box-shadow: var(--ojas-shadow-sm);
}
.ojas-menu-page__key .ojas-chips { margin-top: var(--ojas-space-xs); }

/*
 * The way off the page. A single menu is a leaf reached from a card, and
 * without this the only route onward is the back button.
 */
.ojas-menu-page__more {
  margin-top: var(--ojas-space-2xl);
  padding-top: var(--ojas-space-lg);
  border-top: 1px solid var(--ojas-border);
}

/*
 * A single dish. The square photo is the menu-row image at page size, so it is
 * capped rather than stretched to the column — a 500px file blown up to 640
 * only looks soft.
 */
.ojas-split__media .ojas-dish__media {
  max-width: 460px; margin-inline: auto;
  --ojas-plate-shadow: drop-shadow(0 26px 26px rgba(26, 45, 32, 0.22)) drop-shadow(0 6px 8px rgba(26, 45, 32, 0.12));
}
.ojas-dish__diet:not(:empty) { margin-bottom: var(--ojas-space-lg); }
.ojas-dish__where { margin: var(--ojas-space-lg) 0 0; color: var(--ojas-muted); }
.ojas-dish__where .ojas-service__label { display: block; margin-bottom: 2px; }
.ojas-dish__where a { color: var(--ojas-amazon); }

/* --------------------------------------------------------------------------
   Social profiles
   Icon links with a real accessible name each; the icon is decorative and the
   name is in screen-reader text, so nothing depends on recognising a glyph.
   -------------------------------------------------------------------------- */

.ojas-social { display: flex; flex-wrap: wrap; gap: var(--ojas-space-xs); list-style: none; margin: 0; padding: 0; }
.ojas-social__link {
  display: grid; place-items: center; width: 44px; height: 44px;
  border: 1.5px solid var(--ojas-border); border-radius: var(--ojas-radius-circle);
  color: var(--ojas-amazon);
  transition: background var(--ojas-transition), border-color var(--ojas-transition), color var(--ojas-transition);
}
.ojas-social__link:hover { background: var(--ojas-amazon); border-color: var(--ojas-amazon); color: var(--ojas-white); }
/*
 * The footer's blanket list rules reach the social row and undo it: the
 * `.ojas-footer ul` reset outranks a single class, so the row's top margin was
 * being zeroed and the icons sat flush under the opening hours, and
 * `.ojas-footer li` hung 8px off the bottom of every icon. Both are scoped back
 * out here rather than loosened there, where they are right for the link
 * columns.
 */
.ojas-footer .ojas-social--footer { margin-top: var(--ojas-space-md); }
.ojas-footer .ojas-social li { margin-bottom: 0; }
.ojas-social--footer .ojas-social__link { border-color: var(--ojas-glass-border); color: var(--ojas-vanilla); }
.ojas-social--footer .ojas-social__link:hover { background: var(--ojas-jasmine); border-color: var(--ojas-jasmine); color: var(--ojas-ink); }
@media (prefers-reduced-motion: reduce) { .ojas-social__link { transition: none; } }

/* --------------------------------------------------------------------------
   The chefs
   -------------------------------------------------------------------------- */

.ojas-team {
  display: grid; gap: var(--ojas-grid-gap);
  /* 460, not 520: two 520s plus the gap exceed the container and wrapped to
     one column on a 1320px page. */
  grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 460px));
  justify-content: center;
}
.ojas-chef {
  display: grid; grid-template-columns: 140px minmax(0, 1fr); gap: var(--ojas-space-lg);
  align-items: start;
  padding: var(--ojas-space-lg);
  background: var(--ojas-white); border-radius: var(--ojas-radius-lg); box-shadow: var(--ojas-shadow-sm);
}
@media (max-width: 520px) { .ojas-chef { grid-template-columns: 100px minmax(0, 1fr); gap: var(--ojas-space-md); padding: var(--ojas-space-md); } }

.ojas-chef__media { aspect-ratio: 1; border-radius: var(--ojas-radius-circle); overflow: hidden; }
.ojas-chef__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.ojas-chef__media--monogram {
  display: grid; place-items: center;
  background: linear-gradient(140deg, var(--ojas-jasmine), var(--ojas-amazon));
  color: var(--ojas-white); font-family: var(--ojas-font-display); font-size: 54px; line-height: 1;
}
@media (max-width: 520px) { .ojas-chef__media--monogram { font-size: 38px; } }

.ojas-chef__body { display: grid; gap: var(--ojas-space-2xs); }
.ojas-chef__name { margin: 0; font-size: var(--ojas-size-h4); }
.ojas-chef__role {
  margin: 0; font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow);
}
.ojas-chef__bio { margin: var(--ojas-space-xs) 0 0; color: var(--ojas-muted); }
.ojas-chef__quote {
  margin: var(--ojas-space-sm) 0 0; padding-left: var(--ojas-space-md);
  border-left: 2px solid var(--ojas-jasmine);
  font-family: var(--ojas-font-display); font-size: var(--ojas-size-h5); line-height: 1.4; color: var(--ojas-heading);
}

/* --------------------------------------------------------------------------
   Gift cards
   -------------------------------------------------------------------------- */

.ojas-gift { display: grid; gap: var(--ojas-space-2xl); }
.ojas-gift__ways {
  display: grid; gap: var(--ojas-grid-gap);
  grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr));
}
.ojas-gift__way {
  padding: var(--ojas-space-xl);
  background: var(--ojas-white); border-radius: var(--ojas-radius-lg); box-shadow: var(--ojas-shadow-sm);
  display: grid; gap: var(--ojas-space-xs); align-content: start;
}
.ojas-gift__num { font-family: var(--ojas-font-display); font-size: 28px; line-height: 1; color: var(--ojas-jasmine-text); }
.ojas-gift__title { margin: 0; font-size: var(--ojas-size-h3); }
.ojas-gift__text { margin: 0 0 var(--ojas-space-sm); color: var(--ojas-muted); }
.ojas-gift__small { margin: 0; text-align: center; font-size: var(--ojas-size-meta); color: var(--ojas-muted); }
.ojas-gift__amounts { margin: 0 0 var(--ojas-space-sm); font-weight: var(--ojas-weight-semibold); color: var(--ojas-jasmine-text); }

/*
 * The card — both sides, on screen exactly as they download.
 *
 * Side by side where there is room, stacked on a phone. The faces are labelled
 * because two green rectangles with no explanation is a puzzle, and the labels
 * are the one part that never prints or downloads.
 */
.ojas-giftcard {
  display: grid; gap: var(--ojas-space-lg); justify-content: center;
  grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr));
  /*
   * Equal rows, not just equal columns. Side by side the two faces matched
   * already; stacked on a phone they are separate rows and the front collapsed
   * to 200px against the back's 353 — two halves of one object, visibly
   * different sizes.
   */
  grid-auto-rows: 1fr;
  align-items: stretch;
  max-width: 1100px; margin-inline: auto;
}
.ojas-giftcard__side { margin: 0; display: grid; grid-template-rows: 1fr auto; gap: var(--ojas-space-sm); justify-items: center; }
.ojas-giftcard__face {
  font-size: var(--ojas-size-meta); letter-spacing: var(--ojas-track-label);
  text-transform: uppercase; color: var(--ojas-muted);
}

/*
 * The front. The leaf is the clip path the home-page video uses, so the shape
 * on the card is the shape in the logo — the site never shows two leaves that
 * do not match. It sits behind the wordmark rather than beside it, which is
 * what keeps the card a card and not a poster.
 */
.ojas-giftcard__leaf {
  position: absolute; z-index: 0;
  left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: 58%; aspect-ratio: 1.1434;
  clip-path: url(#ojas-leaf-clip);
  background: var(--ojas-island);
}
.ojas-giftcard__leaf img { width: 100%; height: 100%; object-fit: cover; display: block; }
/*
 * The leaf sits in the middle of the card with the photograph inside it, and
 * the writing runs up the left edge — the wordmark never crosses the
 * photograph, so nothing needs a scrim to survive it. Its tip stays inside the
 * card: the tip is the most recognisable part of the shape and cropping it
 * turned the leaf into an anonymous curve.
 *
 * No leaf pattern on this face. The ground behind a photograph does not need
 * texture as well, and the pattern was competing with the thing it framed.
 */
.ojas-giftcard__inner--front {
  position: relative; isolation: isolate; overflow: hidden;
  align-content: space-between;
}
/*
 * Compound, because the base .ojas-giftcard__inner rule is declared after this
 * block and sets background-image at the same 0,1,0 weight — a plain
 * .ojas-giftcard__inner--front lost the cascade and the pattern stayed on.
 */
.ojas-giftcard__inner.ojas-giftcard__inner--front { background-image: none; }
.ojas-giftcard__inner--front > *:not(.ojas-giftcard__leaf) { position: relative; z-index: 1; max-width: 42%; }
.ojas-giftcard__inner {
  /*
   * min-height rather than a fixed aspect ratio: at 1.6 the four rows had no
   * room to breathe and the "Gift card" label sat on the wordmark. The card
   * keeps a card-ish shape and grows if the address runs long.
   */
  width: min(520px, 100%); min-height: 330px; height: 100%; padding: var(--ojas-space-xl);
  display: grid; align-content: space-between; gap: var(--ojas-space-md);
  background: var(--ojas-amazon-deep); color: var(--ojas-white);
  border-radius: var(--ojas-radius-lg);
  background-image:
    linear-gradient(var(--ojas-leaf-veil), var(--ojas-leaf-veil)),
    var(--ojas-leaf-pattern, none);
  background-size: auto, var(--ojas-leaf-pattern-size, 520px 520px);
}
.ojas-giftcard__brand .ojas-lockup { --ojas-lockup-h: 40px; align-items: flex-start; }
.ojas-giftcard__label {
  margin: 0; font-size: var(--ojas-size-meta); letter-spacing: var(--ojas-track-label);
  text-transform: uppercase; color: var(--ojas-eyebrow-on-dark);
}
.ojas-giftcard__fields { display: grid; gap: var(--ojas-space-md); margin: 0; }
.ojas-giftcard__fields > div { display: grid; grid-template-columns: 74px minmax(0, 1fr); align-items: end; gap: var(--ojas-space-sm); }
.ojas-giftcard__fields dt { font-size: var(--ojas-size-meta); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow-on-dark); }
.ojas-giftcard__fields dd { margin: 0; border-bottom: 1px solid var(--ojas-glass-border); min-height: 24px; }
.ojas-giftcard__note { margin: 0; font-size: var(--ojas-size-meta); color: var(--ojas-text-on-dark); }

@media (max-width: 480px) {
  .ojas-giftcard__inner { min-height: 0; padding: var(--ojas-space-lg); gap: var(--ojas-space-lg); }
}

/*
 * Printing the card. Everything but the card is hidden, the ground is forced
 * to print (browsers drop backgrounds by default, and a gift card with no
 * background is a sheet of paper with three words on it), and the page is
 * landscape so the card is not shrunk to a corner of A4.
 */
@media print {
  body.page-template-page-gift-cards > *:not(.ojas-main),
  body.page-template-page-gift-cards .ojas-main > *:not(#gift),
  body.page-template-page-gift-cards #gift .ojas-gift__ways,
  body.page-template-page-gift-cards #gift .ojas-gift__small,
  body.page-template-page-gift-cards .ojas-page-header { display: none !important; }

  /* Two sides now: one per sheet, so neither is shrunk to fit beside the other. */
  body.page-template-page-gift-cards .ojas-giftcard { display: block; max-width: none; }
  body.page-template-page-gift-cards .ojas-giftcard__face { display: none !important; }
  body.page-template-page-gift-cards .ojas-giftcard__side { break-inside: avoid; }
  body.page-template-page-gift-cards .ojas-giftcard__side + .ojas-giftcard__side { break-before: page; }

  body.page-template-page-gift-cards .ojas-giftcard__inner {
    width: 100%; max-width: 170mm; min-height: 105mm;
    -webkit-print-color-adjust: exact;
    print-color-adjust: exact;
    box-shadow: none;
  }
  @page { size: landscape; margin: 12mm; }
}

/* Why Ojas — reasons, three up. */
.ojas-why {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: var(--ojas-grid-gap);
  grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr));
}
.ojas-why__item { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--ojas-space-md); align-items: start; margin: 0; }
.ojas-why__tick {
  display: grid; place-items: center; width: 34px; height: 34px; flex: none;
  border-radius: var(--ojas-radius-circle); background: var(--ojas-jasmine); color: var(--ojas-ink);
  line-height: 1;
}
.ojas-why__title { margin: 4px 0 var(--ojas-space-2xs); font-size: var(--ojas-size-h5); }
.ojas-why__text { margin: 0; color: var(--ojas-muted); }
.ojas-section--dark .ojas-why__text { color: var(--ojas-text-on-dark); }

/* The studio credit, quietest thing in the footer. */
.ojas-footer__credit { margin: 0; }
.ojas-footer__credit a { color: var(--ojas-vanilla); text-decoration: none; border-bottom: 1px solid var(--ojas-glass-border); }
.ojas-footer__credit a:hover { color: var(--ojas-white); border-bottom-color: currentColor; }

/* ---------- Dough Therapy -------------------------------------------------- */
/*
 * A sub-brand inside the Ojas site. It borrows the container, the buttons, the
 * chips, the section rhythm and the menu rows; what it does not borrow is the
 * voice, which is louder than anything else here — a yellow "Hangry?" over a
 * black answer, the way the printed menu and the original site set it.
 *
 * Lemon, not jasmine, for the shout: the guideline already carries lemon as the
 * highlight, and it is the nearest thing in the Ojas palette to the yellow the
 * Dough Therapy brand uses. Nothing new was added to the palette for this.
 */
/*
 * The hero is dark, and that is a contrast decision rather than a taste one.
 * Dough Therapy shouts in yellow, but measured on this site's off-white ground
 * the brand yellow is 1.89:1 and the lemon token 1.19:1 — a large heading needs
 * 3:1. The only gold that passes there is a darkgoldenrod that reads as mud and
 * is not the brand's yellow at all. On the deep green the real lemon clears it
 * several times over, the pizza lifts off the ground, and the page opens the
 * way a pizza shop at night looks.
 */
.ojas-dough__hero {
  position: relative;
  padding-block: var(--ojas-section-y) 0;
  text-align: center;
  background-color: var(--ojas-amazon-deep);
  color: var(--ojas-text-on-dark);
  overflow: hidden;
}
.ojas-dough__eyebrow {
  margin: 0 0 var(--ojas-space-sm);
  font-size: var(--ojas-size-ui); font-weight: var(--ojas-weight-semibold);
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--ojas-eyebrow-on-dark);
}
.ojas-dough__title { margin: 0; line-height: 1.02; }
.ojas-dough__hangry,
.ojas-dough__remedy { display: block; font-family: var(--ojas-font-display); }
.ojas-dough__hangry { font-size: var(--ojas-size-h1); color: var(--ojas-lemon); }
.ojas-dough__remedy { font-size: var(--ojas-size-h1); color: var(--ojas-white); }

/* The stage: a square the pie sits in, with the toppings falling around it. */
.ojas-dough__stage {
  position: relative;
  width: min(62vw, 460px); aspect-ratio: 1;
  margin: var(--ojas-space-lg) auto var(--ojas-space-md);
}
.ojas-dough__pie {
  /*
   * The pie is smaller than the stage on purpose: the stage is the orbit, and
   * at 100% the falling toppings landed on the cheese instead of around it.
   */
  position: absolute; inset: 11%;
  width: 78%; height: 78%; display: block;
  /*
   * `contain`, so this slot takes a photograph as happily as the drawing. A
   * square top-down shot on a board fits the round stage whole instead of being
   * cropped into, and a transparent cut-out keeps its own edge.
   */
  object-fit: contain;
  filter: drop-shadow(0 18px 26px rgba(26, 45, 32, 0.22)) drop-shadow(0 3px 6px rgba(26, 45, 32, 0.14));
  /*
   * The turn is driven from JS as a custom property rather than a keyframe,
   * because it follows the scroll position rather than a clock. --dough-spin
   * is degrees; without JS it stays 0 and the pie is simply a pie.
   */
  transform: rotate(var(--dough-spin, 0deg));
  will-change: transform;
}
.ojas-dough__flyer {
  position: absolute; width: 34px; height: 34px;
  background-repeat: no-repeat; background-size: contain;
  animation: ojas-dough-fall 3.8s var(--ojas-ease-entrance) infinite;
}
.ojas-dough__flyer--basil  { background-image: url("../images/pizza/flyer-basil.svg"); }
.ojas-dough__flyer--tomato { background-image: url("../images/pizza/flyer-tomato.svg"); }
.ojas-dough__flyer--olive  { background-image: url("../images/pizza/flyer-olive.svg"); }

@keyframes ojas-dough-fall {
  0%        { transform: translate3d(0, -14px, 0) rotate(0deg);    opacity: 0; }
  12%       { opacity: 1; }
  50%       { transform: translate3d(0, 14px, 0) rotate(180deg); }
  88%       { opacity: 1; }
  100%      { transform: translate3d(0, -14px, 0) rotate(360deg); opacity: 0; }
}

.ojas-dough__where { margin: 0; font-size: var(--ojas-size-lead); color: var(--ojas-white); }
.ojas-dough__hours {
  display: inline-block; margin: var(--ojas-space-xs) 0 var(--ojas-space-lg);
  padding: 4px 14px; background: var(--ojas-lemon); color: var(--ojas-ink);
  font-weight: var(--ojas-weight-semibold);
}
.ojas-dough__actions { justify-content: center; padding-bottom: var(--ojas-section-y); }

/* The rating band, and the three things people actually wrote. */
.ojas-dough-rating { background: var(--ojas-vanilla); }
.ojas-dough-rating__inner { display: grid; gap: var(--ojas-space-lg); }
.ojas-dough-rating__score {
  display: flex; flex-wrap: wrap; align-items: baseline; justify-content: center;
  gap: var(--ojas-space-sm); margin: 0;
}
.ojas-dough-rating__number { font-family: var(--ojas-font-display); font-size: var(--ojas-size-h2); line-height: 1; color: var(--ojas-heading); }
.ojas-dough-rating__score .ojas-review__stars { margin: 0; }
.ojas-dough-rating__count { font-size: var(--ojas-size-ui); color: var(--ojas-muted); }
/* The bespoke quote card is gone: the pizza page uses .ojas-review, like
   every other review on the site. */

/* Two medleys side by side, the way the printed menu sets them. */
.ojas-dough__medleys {
  display: grid; gap: var(--ojas-space-2xl) var(--ojas-grid-gap);
  grid-template-columns: repeat(auto-fit, minmax(min(420px, 100%), 1fr));
  margin-top: var(--ojas-space-xl);
}
.ojas-dough__medley-head { margin-bottom: var(--ojas-space-md); padding-bottom: var(--ojas-space-sm); border-bottom: 2px solid var(--ojas-lemon); }
.ojas-dough__medley-name {
  margin: 0; font-family: var(--ojas-font-body); font-size: var(--ojas-size-h6);
  font-weight: var(--ojas-weight-semibold); letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ojas-heading);
}
.ojas-dough__medley-note { margin: var(--ojas-space-2xs) 0 0; font-size: var(--ojas-size-ui); color: var(--ojas-muted); }

/*
 * A pizza is a photograph-shaped thing, not a cut-out on nothing, so it takes
 * the plate shadow but not the 1.22 upscale the bowls use — its drawing already
 * fills its own square.
 */
.ojas-dish__media--pizza img { transform: none; filter: var(--ojas-plate-shadow); }

/*
 * What the pizza actually is, under its name. It borrowed .ojas-dish__size at
 * first, which is the restaurant menu's portion label — right for "250ml" sat
 * inline, wrong for "Chipotle chicken & cabbage", which on a phone trailed off
 * the second line of a wrapped name and read as part of it.
 */
.ojas-dough__plain {
  display: block; margin: 2px 0 0;
  font-family: var(--ojas-font-body); font-size: var(--ojas-size-meta);
  font-weight: var(--ojas-weight-medium); letter-spacing: var(--ojas-track-label);
  text-transform: uppercase; color: var(--ojas-eyebrow);
}
@media (min-width: 783px) {
  /* Room for it beside the name once the column is wide enough. */
  .ojas-dough__plain { display: inline; margin-left: var(--ojas-space-xs); }
}

/* Add-ons: four lists on the deep ground, set tight like the printed sheet. */
.ojas-dough-addons__grid {
  display: grid; gap: var(--ojas-space-xl) var(--ojas-grid-gap);
  grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr));
  margin-top: var(--ojas-space-xl);
}
.ojas-dough-addons__name {
  margin: 0 0 var(--ojas-space-sm); padding-bottom: var(--ojas-space-xs);
  border-bottom: 1px solid rgba(241, 233, 51, 0.5);
  font-family: var(--ojas-font-body); font-size: var(--ojas-size-h6);
  font-weight: var(--ojas-weight-semibold); letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ojas-white);
}
.ojas-dough-addons__list { margin: 0; padding: 0; list-style: none; display: grid; gap: 6px; }
.ojas-dough-addons__list li { font-size: var(--ojas-size-ui); color: var(--ojas-text-on-dark); }

@media (max-width: 782px) {
  .ojas-dough__stage { width: min(78vw, 320px); }
  .ojas-dough__flyer { width: 26px; height: 26px; }
}

/*
 * Asking for less motion stops the falling toppings and the scroll-driven turn
 * together — theme.js reads the same query before it starts driving --dough-spin.
 */
@media (prefers-reduced-motion: reduce) {
  .ojas-dough__flyer { animation: none; opacity: 1; }
  .ojas-dough__pie { transform: none; }
}

/* The Dough Therapy band on the front page. */
.ojas-dough-band { background-color: var(--ojas-amazon-deep); color: var(--ojas-text-on-dark); }
.ojas-dough-band__inner {
  display: grid; gap: var(--ojas-space-xl) var(--ojas-space-2xl); align-items: center;
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1fr);
}
.ojas-dough-band__stage { margin: 0; width: 100%; max-width: 420px; }
.ojas-dough-band__title { margin: 0 0 var(--ojas-space-md); line-height: 1.05; }
.ojas-dough-band__title .ojas-dough__hangry,
.ojas-dough-band__title .ojas-dough__remedy { font-size: var(--ojas-size-h2); }
.ojas-dough-band__text { margin: 0 0 var(--ojas-space-md); color: var(--ojas-text-on-dark); max-width: 54ch; }
.ojas-dough-band__rating {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--ojas-space-sm);
  margin: 0 0 var(--ojas-space-lg); font-size: var(--ojas-size-ui); color: var(--ojas-text-on-dark);
}
.ojas-dough-band__rating .ojas-review__stars { margin: 0; color: var(--ojas-lemon); }
/*
 * These two wrappers are <div>, not <p>. ojas_review_stars() prints its own
 * <p>, and a <p> may not contain one — the parser closes the outer tag at the
 * inner one's start, which left the wrapper empty and its flex rules applying
 * to nothing while the stars floated out as a sibling.
 */

@media (max-width: 860px) {
  /* The pie leads on a phone: it is the thing that says "pizza" before any word does. */
  .ojas-dough-band__inner { grid-template-columns: 1fr; justify-items: center; text-align: center; }
  .ojas-dough-band__stage { max-width: 300px; }
  .ojas-dough-band__text { margin-inline: auto; }
  .ojas-dough-band__rating, .ojas-dough-band__actions { justify-content: center; }
}


/* ---------- Dough Therapy: build your own ---------------------------------- */
/*
 * Light ground on purpose. The four add-on lists used to sit on the deep green,
 * which put green, beige, green in a row with the CTA and the footer under it.
 * A builder is also a tool rather than a poster, and a tool full of checkboxes
 * reads better on paper than on a wall.
 */
.ojas-pizza { background-color: var(--ojas-bg); }
.ojas-pizza__layout {
  display: grid; gap: var(--ojas-space-xl) var(--ojas-space-2xl);
  grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
  align-items: start; margin-top: var(--ojas-space-xl);
}
.ojas-pizza__steps { display: grid; gap: var(--ojas-space-lg); }
.ojas-pizza__step { margin: 0; padding: 0; border: 0; }
.ojas-pizza__legend {
  display: flex; align-items: baseline; gap: var(--ojas-space-sm);
  width: 100%; margin-bottom: var(--ojas-space-sm);
  padding-bottom: var(--ojas-space-xs); border-bottom: 2px solid var(--ojas-lemon);
}
.ojas-pizza__num { font-family: var(--ojas-font-display); font-size: var(--ojas-size-h6); color: var(--ojas-jasmine-text); }
.ojas-pizza__name {
  font-family: var(--ojas-font-body); font-size: var(--ojas-size-h6);
  font-weight: var(--ojas-weight-semibold); letter-spacing: 0.16em;
  text-transform: uppercase; color: var(--ojas-heading);
}
.ojas-pizza__options { display: flex; flex-wrap: wrap; gap: var(--ojas-space-xs); }

/* Each option is its own tap target: the label is the control. */
.ojas-pizza__option {
  display: inline-flex; align-items: center; gap: 8px;
  min-height: 40px; padding: 6px 14px 6px 8px;
  background: var(--ojas-white); border: 1px solid var(--ojas-border);
  border-radius: var(--ojas-radius-pill); cursor: pointer;
  transition: border-color var(--ojas-transition), background var(--ojas-transition);
}
.ojas-pizza__option:hover { border-color: var(--ojas-jasmine); }
.ojas-pizza__option input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ojas-pizza__mark {
  display: grid; place-items: center; width: 28px; height: 28px; flex: none;
  border-radius: var(--ojas-radius-circle); background: var(--ojas-bg);
  transition: background var(--ojas-transition);
}
.ojas-pizza__mark svg { display: block; opacity: 0.55; transition: opacity var(--ojas-transition); }
.ojas-pizza__text { font-size: var(--ojas-size-ui); color: var(--ojas-ink); }

.ojas-pizza__option:has(input:checked) { background: var(--ojas-vanilla); border-color: var(--ojas-amazon); }
.ojas-pizza__option:has(input:checked) .ojas-pizza__mark { background: var(--ojas-white); }
.ojas-pizza__option:has(input:checked) .ojas-pizza__mark svg { opacity: 1; }
.ojas-pizza__option:has(input:checked) .ojas-pizza__text { font-weight: var(--ojas-weight-semibold); }
/* Keyboard focus has to land on the label, since the input itself is hidden. */
.ojas-pizza__option:has(input:focus-visible) { outline: var(--ojas-focus-width) solid var(--ojas-focus); outline-offset: 2px; }

/* The pizza, and the pile on it. */
.ojas-pizza__side { position: sticky; top: var(--ojas-space-xl); }
.ojas-pizza__panel {
  padding: var(--ojas-space-lg); background: var(--ojas-white);
  border-radius: var(--ojas-radius); box-shadow: var(--ojas-shadow-card);
}
.ojas-pizza__pie { position: relative; width: 100%; max-width: 320px; margin: 0 auto var(--ojas-space-md); aspect-ratio: 1; }
.ojas-pizza__pie img { width: 100%; height: 100%; object-fit: contain; display: block; }
.ojas-pizza__drops { position: absolute; inset: 0; }
.ojas-pizza__drop {
  position: absolute; width: 13%; height: 13%;
  transform: translate(-50%, -50%) rotate(var(--drop-turn, 0deg));
  animation: ojas-pizza-drop 0.42s var(--ojas-ease-entrance) both;
  animation-delay: var(--drop-delay, 0ms);
  filter: drop-shadow(0 2px 3px rgba(26, 45, 32, 0.28));
}
.ojas-pizza__drop svg { width: 100%; height: 100%; }
@keyframes ojas-pizza-drop {
  from { opacity: 0; transform: translate(-50%, -190%) rotate(var(--drop-turn, 0deg)) scale(0.7); }
  to   { opacity: 1; transform: translate(-50%, -50%) rotate(var(--drop-turn, 0deg)) scale(1); }
}

.ojas-pizza__count { display: flex; align-items: baseline; gap: 8px; margin: 0 0 var(--ojas-space-sm); }
.ojas-pizza__count > [data-pizza-total] { font-family: var(--ojas-font-display); font-size: var(--ojas-size-h3); line-height: 1; color: var(--ojas-heading); }
.ojas-pizza__unit { font-size: var(--ojas-size-ui); color: var(--ojas-muted); }
.ojas-pizza__list { margin: 0 0 var(--ojas-space-md); padding: 0; list-style: none; display: grid; gap: 4px; max-height: 210px; overflow-y: auto; }
.ojas-pizza__empty { font-size: var(--ojas-size-ui); color: var(--ojas-muted); }
.ojas-pizza__chosen { display: flex; gap: 8px; align-items: baseline; font-size: var(--ojas-size-ui); }
.ojas-pizza__chosen-group { flex: none; font-size: var(--ojas-size-micro); font-weight: var(--ojas-weight-semibold); letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow); }
.ojas-pizza__chosen-name { color: var(--ojas-ink); }
.ojas-pizza__actions { display: flex; flex-wrap: wrap; gap: var(--ojas-space-xs); }
.ojas-pizza__note { margin: var(--ojas-space-md) 0 0; font-size: var(--ojas-size-meta); color: var(--ojas-muted); }
.ojas-pizza__status { margin: var(--ojas-space-xs) 0 0; font-size: var(--ojas-size-meta); color: var(--ojas-jasmine-text); min-height: 1.2em; }

@media (max-width: 900px) {
  .ojas-pizza__layout { grid-template-columns: 1fr; }
  /* The pizza leads on a phone: you want to see what you are building. */
  .ojas-pizza__side { position: static; order: -1; }
  .ojas-pizza__pie { max-width: 240px; }
  .ojas-pizza__list { max-height: none; }
}

@media (prefers-reduced-motion: reduce) {
  .ojas-pizza__drop { animation: none; }
}

/* ---------- The bowl fills as you build it -------------------------------- */
/*
 * It used to be a dial with a number in it, which told you how many things you
 * had picked but never what you were making. Same mechanic as the pizza
 * builder: the thing you are building is the thing you look at.
 */
.ojas-creator__vessel { position: relative; width: 100%; max-width: 300px; margin: 0 auto var(--ojas-space-md); aspect-ratio: 1; }
.ojas-creator__vessel img { width: 100%; height: 100%; object-fit: contain; display: block;
  filter: drop-shadow(0 8px 14px rgba(26, 45, 32, 0.16)); }
.ojas-creator__drops { position: absolute; inset: 0; }
.ojas-creator__drop {
  position: absolute; width: 13%; height: 13%;
  transform: translate(-50%, -50%) rotate(var(--drop-turn, 0deg));
  animation: ojas-pizza-drop 0.4s var(--ojas-ease-entrance) both;
  animation-delay: var(--drop-delay, 0ms);
  filter: drop-shadow(0 1px 2px rgba(26, 45, 32, 0.22));
}
.ojas-creator__drop svg { width: 100%; height: 100%; }

.ojas-creator__tally { display: flex; align-items: baseline; justify-content: center; gap: 8px; margin: 0 0 var(--ojas-space-md); }
.ojas-creator__tally .ojas-creator__count { font-family: var(--ojas-font-display); font-size: var(--ojas-size-h3); line-height: 1; color: var(--ojas-heading); }
.ojas-creator__tally .ojas-creator__unit { font-size: var(--ojas-size-ui); color: var(--ojas-muted); }

/* The swatch holds the ingredient's own drawing now, not a flat colour chip. */
.ojas-creator__swatch { display: grid; place-items: center; overflow: hidden; }
.ojas-creator__swatch svg { display: block; opacity: 0.5; transition: opacity var(--ojas-transition); }
.ojas-creator__option input:checked ~ .ojas-creator__swatch svg { opacity: 1; }

@media (max-width: 782px) {
  .ojas-creator__vessel { max-width: 220px; }
}
@media (prefers-reduced-motion: reduce) {
  .ojas-creator__drop { animation: none; }
}

/*
 * The base fills the bottom half of the well. A half-disc rather than a ring or
 * a tint: "half the bowl is rice" is a thing you can see at a glance, and it is
 * what a bowl actually looks like before the rest goes on.
 *
 * Clipped to a circle the size of the well, then cut in half — so it follows the
 * crockery's curve instead of sitting in it as a straight-edged block.
 */
.ojas-creator__bed {
  position: absolute; left: 50%; top: 50%;
  width: 76%; height: 76%;
  transform: translate(-50%, -50%);
  border-radius: var(--ojas-radius-circle);
  background: linear-gradient(to bottom, transparent 0 50%, var(--ojas-vanilla) 50% 100%);
  animation: ojas-bed-in 0.45s var(--ojas-ease-entrance) both;
}
@keyframes ojas-bed-in {
  from { opacity: 0; transform: translate(-50%, -42%); }
  to   { opacity: 1; transform: translate(-50%, -50%); }
}

/* An option you cannot pick because the step is full. */
.ojas-creator__option.is-disabled { opacity: 0.42; cursor: not-allowed; }
.ojas-creator__option.is-disabled .ojas-creator__text { text-decoration: line-through; }
.ojas-creator__hint.is-full { color: var(--ojas-lemon); font-weight: var(--ojas-weight-semibold); }

@media (prefers-reduced-motion: reduce) {
  .ojas-creator__bed { animation: none; }
}


/* ---------- Explore: the station list folds away on a phone ---------------- */
/*
 * Twenty-one cards each printing their whole menu made this page 27,000px tall
 * at 375pt. The list is a <details> now, opened by theme.js on anything wider
 * than a phone, so the desktop reader still sees everything at once.
 */
.ojas-emenu__summary {
  display: flex; align-items: center; justify-content: space-between; gap: var(--ojas-space-sm);
  padding: var(--ojas-space-sm) 0; cursor: pointer; list-style: none;
  font-size: var(--ojas-size-meta); font-weight: var(--ojas-weight-semibold);
  letter-spacing: var(--ojas-track-label); text-transform: uppercase; color: var(--ojas-eyebrow);
  border-top: 1px solid var(--ojas-border);
}
.ojas-emenu__summary::-webkit-details-marker { display: none; }
.ojas-emenu__summary::after {
  content: ""; flex: none; width: 9px; height: 9px;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform var(--ojas-transition);
}
[data-emenu-stations][open] > .ojas-emenu__summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
.ojas-emenu__summary:focus-visible { outline: var(--ojas-focus-width) solid var(--ojas-focus); outline-offset: 2px; }

/*
 * Above the phone breakpoint theme.js opens every one of them, so the toggle is
 * noise — the list is simply the card's contents again.
 */
@media (min-width: 783px) {
  .ojas-emenu__summary { display: none; }
}
@media (prefers-reduced-motion: reduce) {
  .ojas-emenu__summary::after { transition: none; }
}

/* The CTA's second route: a WhatsApp mark beside the number, so it is obvious
   before you tap it that this opens a chat rather than the dialler. */
.ojas-cta__phone--chat { display: grid; grid-template-columns: auto 1fr; gap: 0 var(--ojas-space-sm); align-items: center; }
.ojas-cta__phone-mark { grid-row: 1 / 3; display: grid; place-items: center; width: 40px; height: 40px;
  border-radius: var(--ojas-radius-circle); background: var(--ojas-jasmine); color: var(--ojas-ink); }

/* The contact card leads with WhatsApp; the list beneath it keeps the dialler,
   the email and the hours, so nothing was taken away to make room. */
.ojas-contact__chat { margin-bottom: var(--ojas-space-md); }

/* The hero's rating: a summary that links down to the reviews themselves. */
.ojas-dough__rating { margin: var(--ojas-space-sm) 0 var(--ojas-space-lg); }
.ojas-dough__rating a {
  display: inline-flex; align-items: center; gap: var(--ojas-space-sm);
  padding: 6px 16px; border-radius: var(--ojas-radius-pill);
  background: rgba(255, 255, 255, 0.10); border: 1px solid rgba(241, 233, 51, 0.38);
  color: var(--ojas-white); text-decoration: none;
  font-size: var(--ojas-size-ui);
  transition: background var(--ojas-transition), border-color var(--ojas-transition);
}
.ojas-dough__rating a:hover { background: rgba(255, 255, 255, 0.18); border-color: var(--ojas-lemon); }
.ojas-dough__rating .ojas-review__stars { margin: 0; color: var(--ojas-lemon); }
@media (prefers-reduced-motion: reduce) { .ojas-dough__rating a { transition: none; } }

/* The hero's proof line: a rating somebody else wrote, linking to the rest. */
.ojas-hero__rating { margin-top: var(--ojas-space-lg); }
.ojas-hero__rating a,
.ojas-hero__rating > .ojas-review__stars {
  display: inline-flex; align-items: center; gap: var(--ojas-space-sm);
  padding: 8px 18px; border-radius: var(--ojas-radius-pill);
  background: var(--ojas-white); border: 1px solid var(--ojas-border);
  color: var(--ojas-ink); text-decoration: none;
  box-shadow: var(--ojas-shadow-card);
  transition: border-color var(--ojas-transition), transform var(--ojas-transition);
}
.ojas-hero__rating a:hover { border-color: var(--ojas-jasmine); transform: translateY(-1px); }
.ojas-hero__rating .ojas-review__stars { display: inline-flex; margin: 0; color: var(--ojas-amazon); }
.ojas-hero__rating-text { font-size: var(--ojas-size-ui); color: var(--ojas-muted); }
.ojas-hero__rating-text strong { font-family: var(--ojas-font-display); font-size: var(--ojas-size-h5); color: var(--ojas-heading); }
.ojas-hero--dark .ojas-hero__rating a { background: rgba(255,255,255,0.10); border-color: rgba(255,255,255,0.28); color: var(--ojas-white); box-shadow: none; }
.ojas-hero--dark .ojas-hero__rating-text { color: var(--ojas-text-on-dark); }
.ojas-hero--dark .ojas-hero__rating-text strong { color: var(--ojas-white); }
.ojas-hero--dark .ojas-hero__rating .ojas-review__stars { color: var(--ojas-lemon); }
@media (prefers-reduced-motion: reduce) { .ojas-hero__rating a { transition: none; } }

/* The reviews page's headline score. */
/*
 * The header centres its text, but this row is a flex container, and
 * text-align does not reach a flex container's own items — so the score sat
 * hard left under a centred headline while every other line above and below it
 * was centred. justify-content is the property that does reach them.
 */
.ojas-reviews-page__score { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: center; gap: var(--ojas-space-sm); margin-top: var(--ojas-space-md); }
.ojas-reviews-page__score .ojas-review__stars { display: inline-flex; margin: 0; }
.ojas-reviews-page__number { font-family: var(--ojas-font-display); font-size: var(--ojas-size-h2); line-height: 1; color: var(--ojas-heading); }
.ojas-reviews-page__count { font-size: var(--ojas-size-ui); color: var(--ojas-muted); }
.ojas-reviews-page__note { max-width: 58ch; margin: 0 auto var(--ojas-space-md); color: var(--ojas-muted); }


/* ==========================================================================
   Inside an Elementor document
   Elementor's stylesheet resets every <img> to border-radius: 0, and it loads
   after this one, so a theme rule of equal specificity loses the tie and a
   circle comes out square. Every image-rounding rule above is repeated here
   with the .elementor ancestor so it wins where it is drawn.
   ========================================================================== */
.elementor .ojas-dish__media--photo img { border-radius: 50%; }
.elementor .ojas-entry-content img { border-radius: var(--ojas-radius); }
.elementor .ojas-comments .comment-author img { border-radius: var(--ojas-radius-circle); }
.elementor .ojas-prose img, .elementor .ojas-prose figure { border-radius: var(--ojas-radius); }
.elementor .ojas-lightbox__figure img { border-radius: var(--ojas-radius-lg) var(--ojas-radius-lg) 0 0; }

/* On a phone the gallery's category labels are read, not hovered: 12px, not 11. */
@media (max-width: 782px) { .ojas-gallery__label { font-size: var(--ojas-size-meta); } }

/* ==========================================================================
   Adjacent grounds
   Two vanilla bands in a row read as one wide band with a seam in it; a dark
   band against the dark footer reads as no footer at all. A call to action
   that lands on the same ground as its neighbour steps onto the page ground.
   ========================================================================== */
.ojas-section--band + .ojas-cta.ojas-section--band,
.ojas-cta.ojas-section--band:has(+ .ojas-section--band) { background: var(--ojas-bg); }
/* Inside an Elementor document each section sits in its own container, so the
   neighbour is the next container's first section, not the next sibling. */
.ojas-dough-rating + .ojas-cta.ojas-section--band,
.e-con:has(> .elementor-widget .ojas-dough-rating) + .e-con .ojas-cta.ojas-section--band,
.e-con:has(> .elementor-widget .ojas-section--band) + .e-con .ojas-cta.ojas-section--band,
.e-con:has(> .elementor-widget .ojas-cta.ojas-section--band):has(+ .e-con .ojas-section--band) .ojas-cta.ojas-section--band { background: var(--ojas-bg); }
.ojas-section--dark + .ojas-cta.ojas-section--dark,
.ojas-pattern-leaves + .ojas-cta.ojas-section--dark { background: var(--ojas-bg-alt); color: var(--ojas-text); }


/* ==========================================================================
   Clients — the trusted-by row
   Two copies of the list on one track; the track slides by exactly one copy
   and loops, left to right. Pauses under the pointer. Under reduced motion it
   stands still and wraps, and the second copy is dropped.
   ========================================================================== */
.ojas-clients { padding-block: var(--ojas-space-2xl); }
.ojas-clients__head { margin-bottom: var(--ojas-space-lg); }
.ojas-clients__head h2 { margin: 0; }
.ojas-clients__viewport { overflow: hidden; mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent); -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent); }
.ojas-clients__track { display: flex; width: max-content; animation: ojas-clients-scroll var(--clients-speed, 40s) linear infinite; }
.ojas-clients__viewport:hover .ojas-clients__track,
.ojas-clients__viewport:focus-within .ojas-clients__track { animation-play-state: paused; }
.ojas-clients__list { display: flex; gap: var(--ojas-space-2xl); list-style: none; margin: 0; padding: 0 calc(var(--ojas-space-2xl) / 2); }
.ojas-clients__item { flex: 0 0 auto; display: flex; align-items: center; height: 64px; }
.ojas-clients__link { display: inline-flex; align-items: center; height: 100%; text-decoration: none; color: var(--ojas-heading); }
.ojas-clients__logo, .elementor .ojas-clients__logo { display: block; height: 48px; width: auto; max-width: 200px; object-fit: contain; filter: grayscale(1); opacity: 0.75; transition: filter var(--ojas-dur, 200ms) var(--ojas-ease), opacity var(--ojas-dur, 200ms) var(--ojas-ease); }
.ojas-clients__link:hover .ojas-clients__logo { filter: none; opacity: 1; }
.ojas-clients__name { font-family: var(--ojas-font-display); font-weight: var(--ojas-weight-display); font-size: var(--ojas-size-h4); letter-spacing: var(--ojas-track-display); white-space: nowrap; color: var(--ojas-heading); opacity: 0.85; }
.ojas-clients__link:hover .ojas-clients__name { opacity: 1; }
@keyframes ojas-clients-scroll { from { transform: translateX(-50%); } to { transform: translateX(0); } }
@media (prefers-reduced-motion: reduce) {
  .ojas-clients__track { animation: none; width: auto; justify-content: center; }
  .ojas-clients__list { flex-wrap: wrap; justify-content: center; row-gap: var(--ojas-space-md); }
  .ojas-clients__list[aria-hidden] { display: none; }
  .ojas-clients__viewport { mask-image: none; -webkit-mask-image: none; }
}
:root[data-ojas-motion="reduce"] .ojas-clients__track { animation: none !important; }

/* The Thursday line under the dough facts. */
.ojas-dough__thursday { margin: var(--ojas-space-xl) auto 0; max-width: 60ch; display: flex; gap: var(--ojas-space-sm); align-items: center; justify-content: center; flex-wrap: wrap; }
