/* ==========================================================================
   Ranbix inner pages
   --------------------------------------------------------------------------
   index.html is the theme's own markup, so it needs nothing but a recolour.
   The other seven pages carry content that predates the theme — the real
   price table, the reseller program, the legal text — and that content is
   the reason those pages exist, so it was kept rather than rewritten into
   theme components.

   This file gives those page-specific classes a look built from the theme's
   own tokens: same crimson, same navy, same Sora/Montserrat, same card
   radius and hairline weight as index.html. It is a bridge, not a second
   design system.
   ========================================================================== */

/* ── The theme's palette, named ─────────────────────────────────────────────
   This file was written while the site carried a crimson recolour, and it
   still referred to --rx-red and --rx-navy after that recolour was reverted.
   Those variables no longer existed, so 34 declarations across the price
   cards, the reseller program and the legal pages resolved to nothing and
   five more were left hard-coding crimson — which is why the inner pages read
   as a different site from the home page.

   They are defined here now, from the theme's OWN values: #00a3c8 is the
   accent style.css paints .blue-color with, #004861 the steel blue it sets
   .steelblue-color to, and #333 its body ink. One definition, so the inner
   pages cannot drift from the theme again. */
:root{
  --rx-red:#00a3c8;       /* the theme's accent */
  --rx-red-hi:#00819f;    /* a step down, for hover */
  --rx-navy:#004861;      /* the theme's steel blue — headings */
  --rx-ink:#333;          /* the theme's body ink */
}

/* ── Prose measure ──────────────────────────────────────────────────────────
   The theme's .container is 1140px, which is right for three columns of cards
   and much too wide for a paragraph — legal text set to that measure runs
   about 150 characters a line and is genuinely hard to read. Prose pages get
   a measure; card pages keep the full container. */
.legal .container,
#terms-page .container{ max-width:860px; }

.legal__lede{ font-size:1.06rem;color:var(--rx-navy);margin-bottom:10px; }
.legal__meta{ font-size:.82rem;color:#6b7b93;margin-bottom:34px; }
.legal__meta span + span{ margin-left:18px;padding-left:18px;border-left:1px solid #dfe6ef; }
.legal__body h2{
  font-family:'Sora',sans-serif;font-size:1.34rem;font-weight:700;
  color:var(--rx-navy);margin:36px 0 12px;letter-spacing:-.02em;
}
.legal__body h3{
  font-family:'Sora',sans-serif;font-size:1.06rem;font-weight:700;
  color:var(--rx-navy);margin:24px 0 8px;
}
.legal__body p{ margin-bottom:14px;line-height:1.75; }
.legal__body ul{ margin:0 0 16px 20px; }
.legal__body li{ margin-bottom:7px;line-height:1.7; }
.legal__addr,.legal__also{
  background:#F5F8FC;border:1px solid #E2E8F1;border-radius:12px;
  padding:18px 20px;margin-top:28px;font-size:.92rem;
}

/* ── The price table ────────────────────────────────────────────────────────
   Four plans, built long before the theme. Rebuilt here as cards in the same
   language as the theme's .pricing-table rather than restructured, so the
   real figures and feature lists are untouched. */
.plans,.plan-row{ display:grid;gap:22px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr)); }
.plan{
  position:relative;background:#fff;border:1px solid #E2E8F1;border-radius:16px;
  padding:30px 26px 32px;text-align:center;
  box-shadow:0 1px 2px rgba(13,24,34,.05),0 10px 28px rgba(13,24,34,.06);
  transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease;
}
.plan:hover{ transform:translateY(-4px);border-color:rgba(0,163,200,.34);
  box-shadow:0 20px 44px rgba(11,31,63,.12); }
.plan__flag{
  position:absolute;top:-13px;left:50%;transform:translateX(-50%);
  background:var(--rx-red);color:#fff;font-size:.66rem;font-weight:700;
  letter-spacing:.09em;text-transform:uppercase;padding:5px 14px;border-radius:999px;
}
.plan h3,.plan__name{ font-family:'Sora',sans-serif;font-size:1.32rem;font-weight:800;
  color:var(--rx-navy);margin:6px 0 6px; }
.plan__who{ font-size:.88rem;color:#5A6E8C;min-height:2.6em;margin-bottom:16px; }
.plan__price{ display:flex;align-items:baseline;justify-content:center;gap:2px;margin-bottom:6px; }
.plan__cur{ font-family:'Sora',sans-serif;font-size:1.3rem;font-weight:700;color:var(--rx-navy); }
.plan__amt{ font-family:'Sora',sans-serif;font-size:3rem;font-weight:800;line-height:1;
  color:var(--rx-navy);letter-spacing:-.03em; }
.plan__per{ font-size:.9rem;color:#5A6E8C; }
.plan__billed{ font-size:.8rem;color:#5A6E8C;margin-bottom:20px; }
.plan__cta,.plan__buy{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  width:100%;padding:13px 18px;border-radius:10px;font-weight:700;font-size:.92rem;
  text-decoration:none;border:1px solid var(--rx-red);color:var(--rx-red);background:#fff;
  transition:background .18s ease,color .18s ease;
}
.plan__cta:hover,.plan__buy:hover{ background:var(--rx-red);color:#fff; }
.plan--lead .plan__cta,.plan--lead .plan__buy{ background:var(--rx-red);color:#fff; }
.plan__buy-tag{ font-size:.7rem;opacity:.85;font-weight:600; }
.plan__inc{ margin-top:22px;font-size:.82rem;font-weight:700;letter-spacing:.09em;
  text-transform:uppercase;color:#5A6E8C;text-align:left; }
.plan__feat{ list-style:none;margin:10px 0 0;padding:0;text-align:left; }
.plan__feat li{ position:relative;padding-left:24px;margin-bottom:9px;font-size:.88rem;
  line-height:1.55;color:#22375C; }
.plan__feat li::before{
  content:"";position:absolute;left:0;top:.42em;width:13px;height:13px;border-radius:50%;
  background:rgba(0,163,200,.12);box-shadow:inset 0 0 0 1.5px rgba(0,163,200,.36);
}
.plan__feat li::after{
  content:"";position:absolute;left:4.3px;top:.62em;width:3.4px;height:6.4px;
  border:solid var(--rx-red);border-width:0 2px 2px 0;transform:rotate(42deg);
}
/* ── "Soon", wherever a thing is not built yet ─────────────────────────────
   The menu's roadmap rows, Careers, FAQs, and the footer's app badges all
   carry one of these. The shared .soon rule was lost in 9023729, which was
   removing the retired documentation styles and caught it because the two
   were declared on one line (".doc__soon,.soon{...}"). Forty-eight chips were
   left with no rule at all: transparent background, inheriting the row's grey,
   so the word sat at roughly 2:1 against white and read as a smudge.

   Restored with contrast this time. The tint is the theme's accent, and the
   text is a step down from it so the chip is legible on its own rather than
   relying on the row it sits in. */
.soon{
  display:inline-block;vertical-align:middle;
  font-size:.62rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  line-height:1.5;
  padding:2px 8px;border-radius:5px;margin-left:7px;
  background:#E6F5FA;border:1px solid rgba(0,163,200,.38);color:#00728c;
}

.plan__feat li.is-soon,.tag-soon{ color:#8a99ad; }
.tag-soon{ font-size:.62rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  background:#EEF2F7;color:#6b7b93;padding:2px 7px;border-radius:5px;margin-left:6px; }
.pnote{ font-size:.85rem;color:#5A6E8C;margin-top:22px;text-align:center; }

/* ── The three notes under the module table ────────────────────────────────
   .pnotes had no rules at all and .pnote is the small centred caption above —
   which this block also uses, so the three notes rendered as a 28px heading
   over 13.6px centred grey text, stacked full width. Scoped rather than
   renamed: .pnote is still the caption everywhere else on the site, and only
   inside .pnotes is it a card. */
.pnotes{
  display:grid;gap:20px;margin-top:34px;
  grid-template-columns:repeat(auto-fit,minmax(258px,1fr));
}
.pnotes .pnote{
  margin-top:0;text-align:left;
  background:#fff;border:1px solid #E2E8F1;border-left:4px solid var(--rx-red);
  border-radius:12px;padding:20px 22px;
}
.pnotes .pnote h3{
  font-family:'Lato',sans-serif;font-size:1rem;font-weight:700;
  color:var(--rx-navy);margin:0 0 8px;line-height:1.35;
}
.pnotes .pnote p{ margin:0;font-size:.9rem;line-height:1.65;color:#5A6E8C; }
/* the roadmap warning is a caution, not another fact — amber, not the accent */
.pnotes .pnote--red{ border-left-color:#E0A21A;background:#FFFBF2; }

/* Only shown where the table actually overflows; .mods scrolls below ~800px. */
.mods__hint{
  display:none;margin:0 0 10px;font-size:.82rem;color:#6b7b93;text-align:right;
}
@media (max-width:800px){ .mods__hint{ display:block; } }

/* ── Add-ons ────────────────────────────────────────────────────────────── */
.addons{ display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));margin-top:26px; }
.addon{ background:#fff;border:1px solid #E2E8F1;border-radius:14px;padding:24px 22px; }
.addon__tag{ font-family:'Sora',sans-serif;font-weight:800;color:var(--rx-navy);
  font-size:1.05rem;margin-bottom:6px; }
.addon__price{ font-weight:700;color:var(--rx-red);margin-bottom:10px; }
.addon__body{ font-size:.9rem;color:#22375C;line-height:1.65; }
.addon__pts{ margin:10px 0 0 18px;font-size:.88rem;color:#22375C; }
.addon__pts li{ margin-bottom:6px; }

/* ── The module comparison table ───────────────────────────────────────── */
/* .mods holds the 760px-min table on pricing.html and had no overflow of its
   own. #page is overflow:hidden, so below about 800px the table was not
   scrolling — it was being CLIPPED, silently. On a phone the Elite and
   Enterprise columns simply did not exist: no scrollbar, no horizontal page
   scroll, nothing to drag. The wrapper that .tablewrap gives every other table
   on the site, given to this one. */
.mods{
  overflow-x:auto;
  -webkit-overflow-scrolling:touch;
  /* the fade tells you there is more to the right, since a touch device shows
     no scrollbar until you move it */
  background:
    linear-gradient(to right,#fff 30%,rgba(255,255,255,0)) left/40px 100% no-repeat,
    linear-gradient(to left,#fff 30%,rgba(255,255,255,0)) right/40px 100% no-repeat,
    radial-gradient(farthest-side at 0 50%,rgba(11,31,63,.12),transparent) left/14px 100% no-repeat,
    radial-gradient(farthest-side at 100% 50%,rgba(11,31,63,.12),transparent) right/14px 100% no-repeat;
  background-attachment:local,local,scroll,scroll;
}

.tablewrap{ overflow-x:auto;border:1px solid #E2E8F1;border-radius:14px;background:#fff; }
.modtab{ width:100%;border-collapse:collapse;font-size:.9rem;min-width:760px; }
.modtab th,.modtab td{ padding:13px 16px;text-align:left;border-bottom:1px solid #E2E8F1; }
.modtab thead th{ background:#F5F8FC;font-family:'Sora',sans-serif;font-size:.72rem;
  font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:#5A6E8C; }
.modtab th:not(:first-child),.modtab td:not(:first-child){ text-align:center;width:14%; }
.modtab tbody th{ font-weight:600;color:var(--rx-navy); }
.modtab__plan{ display:block;font-family:'Sora',sans-serif;font-weight:800;color:var(--rx-navy); }
.modtab__cost{ display:block;margin-top:3px;font-size:.75rem;color:#5A6E8C; }
.modtab__ico{ display:inline-grid;place-items:center;width:26px;height:26px;margin-right:10px;
  vertical-align:-8px;border-radius:7px;background:#F5F8FC;color:#5A6E8C; }
.modtab__ico svg{ width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.7; }
.modtab__grp td{ background:#F5F8FC;font-family:'Sora',sans-serif;font-weight:800;
  color:var(--rx-navy);font-size:.82rem;letter-spacing:.05em;text-transform:uppercase; }
.y{ color:var(--rx-red);font-weight:700; }
.n{ color:#c3ccd8; }

/* ── Reseller Program: the numbered steps ────────────────────────────── */
  letter-spacing:.1em;text-transform:uppercase;color:var(--rx-red);margin-bottom:6px; }
  color:#22375C;text-decoration:none; }

/* ── FAQ blocks that came from our pages ──────────────────────────────── */
.faq{ display:grid;gap:1px;background:#E2E8F1;border:1px solid #E2E8F1;border-radius:14px;overflow:hidden; }
.faq__q{ background:#fff; }
.faq__q > summary{ cursor:pointer;list-style:none;padding:15px 18px;
  font-family:'Sora',sans-serif;font-weight:700;color:var(--rx-navy);display:flex;align-items:center; }
.faq__q > summary::-webkit-details-marker{ display:none; }
.faq__q > summary::after{ content:"+";margin-left:auto;color:var(--rx-red);font-size:1.2rem;
  transition:transform .2s ease; }
.faq__q[open] > summary::after{ transform:rotate(45deg); }
.faq__q > p{ margin:0;padding:0 18px 16px;font-size:.92rem;color:#22375C;line-height:1.7; }

/* ── 404 ────────────────────────────────────────────────────────────────── */
.nf__card{ background:#fff;border:1px solid #E2E8F1;border-radius:14px;padding:22px 20px;
  text-decoration:none;display:block;color:inherit;transition:border-color .2s ease,transform .2s ease; }
.nf__card:hover{ border-color:rgba(0,163,200,.34);transform:translateY(-3px); }

/* ── About page blocks ─────────────────────────────────────────────────── */
.abt{ margin-bottom:32px; }
.cal{ display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); }
.cal__t{ font-family:'Sora',sans-serif;font-weight:700;color:var(--rx-navy); }

@media (max-width:640px){
  .legal .container,#terms-page .container{ max-width:none; }
  .plan__amt{ font-size:2.5rem; }
}

/* The reseller program's three-column documentation layout lived here —
   a step nav, the article, and an 'on this page' index. reseller.html was
   rebuilt on the theme's department-single layout (col-lg-8 of
   .content-block against col-lg-4 of .sidebar-div), so nothing referenced
   any of it. Removed rather than left in place, where it would suggest
   this site still has a docs page. It is in git if the layout is wanted
   back. */

/* ── About page: the product blocks ───────────────────────────────────────
   .abt is a card (Ranbix, Nucleus) that lost its grid, its icon tile and its
   link treatment when the old stylesheet went, so the two products rendered
   as flat runs of text with a bare "See what it does" underneath. */
.abt__grid{ display:grid;gap:22px;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));margin-top:8px; }
.abt{
  background:#fff;border:1px solid #E2E8F1;border-radius:16px;padding:28px 26px 30px;
  box-shadow:0 1px 2px rgba(13,24,34,.05),0 10px 28px rgba(13,24,34,.05);
  transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease;
}
.abt:hover{ transform:translateY(-3px);border-color:rgba(0,163,200,.32);
  box-shadow:0 20px 44px rgba(11,31,63,.11); }
.abt--flat{ background:transparent;border:0;box-shadow:none;padding:0; }
.abt--flat:hover{ transform:none;box-shadow:none; }
.abt h3{ font-family:'Sora',sans-serif;font-size:1.42rem;font-weight:800;
  color:var(--rx-navy);margin:0 0 4px;letter-spacing:-.02em; }
.abt__where{
  font-family:'Sora',sans-serif;font-size:.66rem;font-weight:700;letter-spacing:.11em;
  text-transform:uppercase;color:var(--rx-red);margin-bottom:14px;
}
.abt p{ font-size:.94rem;line-height:1.7;color:#22375C;margin-bottom:16px; }
.abt__ico{
  display:grid;place-items:center;width:48px;height:48px;border-radius:13px;
  background:rgba(0,163,200,.12);color:var(--rx-red);margin-bottom:16px;
}
.abt__ico svg{ width:23px;height:23px;fill:none;stroke:currentColor;stroke-width:1.7;
  stroke-linecap:round;stroke-linejoin:round; }
.abt__link{
  display:inline-flex;align-items:center;gap:7px;font-weight:700;font-size:.9rem;
  color:var(--rx-red);text-decoration:none;
}
.abt__link:hover{ color:var(--rx-red-hi);text-decoration:underline; }

/* The page hero some inner pages open with. */
.phero{ padding:20px 0 10px; }
.phero h1{ font-family:'Sora',sans-serif;font-size:clamp(1.8rem,3.4vw,2.6rem);
  font-weight:800;color:var(--rx-navy);letter-spacing:-.028em;margin-bottom:12px; }
.phero p{ font-size:1.04rem;color:#22375C;max-width:66ch; }

/* ── Layout classes the port left behind ───────────────────────────────────
   The port mapped our wrappers onto the theme's .container, but it matched
   whole class attributes only — so `class="wrap"` converted while
   `class="wrap phero__in"` and `class="sec sec--plans"` did not, and every
   block using the two-class form lost its container and ran flush to the
   viewport edge. Rather than re-run the port over hand-checked pages, the
   two classes are simply given the container's behaviour here. */
.wrap{ width:100%;max-width:1140px;margin-inline:auto;padding-inline:26px; }
.wrap--narrow{ max-width:860px; }
.sec{ padding:clamp(46px,6vw,72px) 0; }
.sec--soft{ background:#F5F8FC;border-block:1px solid #E2E8F1; }
.sec--dark{ background:var(--rx-navy);color:#EAF1F9; }
.sec--dark h2,.sec--dark h3{ color:#fff; }

/* ── The breadcrumb band ───────────────────────────────────────────────────
   style.css sets #breadcrumb's background to images/breadcrumb.jpg, another
   of the bundle's grey cards — it rendered as "1920 x 250" behind the page
   title on all seven inner pages. */
/* ── The inner pages' title band ────────────────────────────────────────────
   Seven pages carried an empty strip where the demo has a photograph. This one
   is OUR licensed Envato Elements picture, not the theme's, so unlike every
   other image on the site it can ship as it stands.

   The browser does the cropping. At 1920x250 the band is 7.7:1, and a strip
   cut by hand out of a 3:2 photograph keeps almost none of the subject —
   background-size:cover with a position favouring the counter keeps it. The
   white gradient in front is what makes the type readable: the theme sets the
   page title in navy, which needs a light ground on the left where it sits,
   while the right stays open so the photograph is actually visible. */
#breadcrumb{
  min-height:210px;display:flex;align-items:center;
  background-image:
    linear-gradient(90deg, rgba(255,255,255,.94) 0%, rgba(255,255,255,.66) 40%, rgba(255,255,255,.05) 82%),
    url('../img/slots/breadcrumb.webp') !important;
  background-size:auto, cover !important;
  background-position:center, 60% 40% !important;
  background-repeat:no-repeat !important;
  border-bottom:1px solid #e4e9f0;
  padding:34px 0 30px;
}
#breadcrumb .breadcrumb{ background:none;padding:0;margin-bottom:6px;font-size:.84rem; }
#breadcrumb .breadcrumb a{ color:#5A6E8C;text-decoration:none; }
#breadcrumb .breadcrumb a:hover{ color:var(--rx-red); }
#breadcrumb h4{ margin:0;font-family:'Sora',sans-serif;font-weight:800;
  font-size:clamp(1.5rem,2.6vw,2rem);color:var(--rx-navy);letter-spacing:-.025em; }

/* ── The page hero on pricing ─────────────────────────────────────────── */
.phero{ padding:clamp(36px,5vw,56px) 0 0; }
.phero__lede{ font-size:1.04rem;color:#22375C;max-width:66ch;margin-bottom:22px; }

/* ── The 12 / 24-month term toggle ────────────────────────────────────── */
.term{ display:inline-flex;gap:4px;padding:4px;background:#F0F4F9;
  border:1px solid #E2E8F1;border-radius:999px;margin-bottom:30px; }
.term__btn{
  border:0;background:none;cursor:pointer;font-family:'Sora',sans-serif;
  font-weight:700;font-size:.86rem;color:#5A6E8C;padding:9px 18px;border-radius:999px;
  transition:background .18s ease,color .18s ease;
}
.term__btn:hover{ color:var(--rx-navy); }
.term__btn.is-on,.term__btn[aria-pressed="true"]{ background:var(--rx-red);color:#fff; }
.term__save{ font-size:.74rem;font-weight:600;opacity:.9;margin-left:6px; }

/* ── Licensed photography over the theme's ──────────────────────────────────
   Six surfaces on the home page still paint the theme author's demo
   photographs, which the purchase does not license (see OPEN-QUESTIONS.md).
   These four are now our own Envato Elements pictures instead, which closes
   most of that exposure. Loaded from this stylesheet because it is the last
   one in, so it wins without needing !important on every line.

   Each is matched to what the section says rather than dropped in at random:
   the lab frame behind the hero, the counter behind the two info blocks, and
   the dark vial shot behind the statistics band, where white type sits on it. */
#hero-1.hero-section{
  /* A scrim, not a tint. The theme sets the hero headline in navy, and this
     photograph has a bright gold reflection running straight through where the
     second and third lines fall — without something behind the type, half the
     headline sits on a light ground and half on a dark one. The gradient is
     opaque on the left where the copy is and clears by 72%, so the photograph
     is still the photograph on the right, behind the product shot. */
  background-image:
    linear-gradient(100deg, rgba(255,255,255,.97) 0%, rgba(255,255,255,.90) 38%,
                            rgba(255,255,255,.55) 58%, rgba(255,255,255,.12) 78%),
    url('../img/slots/hero-band.webp') !important;
  background-size:auto, cover !important;
  background-position:center, center 42% !important;
  background-repeat:no-repeat !important;
}
/* The counter photograph moved to #info-2 as an <img>, and #info-6 is only two
   sections below it — cover-cropped into this tall column it framed the same
   hands and the same tray, so the page showed one picture twice. The vial shot
   is the other subject we hold, it is natively portrait (2000x2823) so this
   column crops it barely at all, and its cyan is the theme's own. */
.info-6-img{
  background-image:url('../img/slots/info-6.webp') !important;
  background-size:cover;background-position:center;
}
/* #info-8 drew a white L around a floating card: the photograph starts at 40%
   and the card is shorter than the band, so two fifths of the section was bare
   page — read as an unfinished gap rather than as breathing room. Two changes,
   no re-layout: tint the panel so the space becomes the card's ground, and pull
   the photograph left so the card sits ON it rather than beside it. */
#info-8{
  background:#EFF5F9;
  padding-top:70px;
  padding-bottom:70px;
}
.info-8-img{
  background-image:url('../img/slots/info-8.webp') !important;
  background-size:cover;background-position:center;
  left:32%;
  width:68%;
}
/* Below 992px the photograph has to stop being a background panel and become a
   band under the card. It is absolutely positioned, and the card is static, so
   on a phone it painted straight over the text — "We answer" was a teal box you
   could not read a word of. The theme already does exactly this for its
   siblings (.info-6-img, .info-7-img in responsive.css) and simply never
   listed .info-8-img; this is that missing rule, at the same breakpoint. */
@media (max-width: 991.98px){
  #info-8{ padding-bottom:0; }
  .info-8-img{
    position:relative;
    left:0;
    width:auto;
    height:340px;
    margin-top:40px;
    background-position:center center;
  }
}
#statistic-1,.statistic-section.bg-scroll{
  background-image:
    linear-gradient(rgba(7,26,56,.72), rgba(7,26,56,.72)),
    url('../img/slots/statistic.webp') !important;
  background-size:auto, cover;background-position:center, center 30%;
}

/* The last two demo photographs: the banner bands. Both carry white type, so
   both take the dark treatment the statistics band uses. */
#banner-7,.banner-section.bg-fixed,
.bg-scroll.bg-inner.bg-image{
  background-image:
    linear-gradient(rgba(7,26,56,.68), rgba(7,26,56,.68)),
    url('../img/slots/banner.webp') !important;
  background-size:auto, cover !important;
  background-position:center, center 35% !important;
}


/* ══════════════════════════════════════════════════════════════════════════
   The footer — the theme's #footer-1
   --------------------------------------------------------------------------
   Ported from the template's department-single.html: the teal .bg-image panel,
   four col-lg-3 cells, .foo-socials circles with their per-network hover, and
   the .bottom-footer rule. All of that styling is the theme's own and lives in
   tpl/css/style.css; what follows is only what the theme cannot know about us.

   The previous footer here (dark navy, six columns, inline-SVG social marks)
   is gone with its .foot__* rules — the brief is the theme's footer, not ours
   restyled to look like it.

   tpl/images/footer-bg.jpg is OURS. The bundle ships a grey "1920 x 600"
   placeholder there, and the author's live demo serves a photograph that the
   purchase does not license. This one is built the same way the demo's is — a
   flat teal panel (#1D5E7C) with a photograph ghosted in at low contrast — over
   our own Envato Elements vial picture. tools/build-footer-bg.py rebuilds it.
   ══════════════════════════════════════════════════════════════════════════ */

/* The theme hangs one rule off #footer-1. This site already had #contact on the
   footer and every page links "Partner with us" at reseller.html#contact, so
   the id stays ours and the rule is re-pointed at the class instead. */
.footer-1 .footer-box{ padding-left:10%; }
@media (max-width:991px){ .footer-1 .footer-box{ padding-left:0; } }

/* The theme's slot is a 180x40 wordmark (4.5:1); the Ranbix lockup is 960x291
   (3.3:1), so left at the markup's width it squashes. Height-constrained, as
   the header logo already is — but taller than the header's 44px, because this
   lockup carries three tiers of type and the tagline closes up below ~50px. */
.footer .footer-logo{ height:54px !important;width:auto !important;max-width:100%; }

/* The theme recolours .footer-box p, .footer-info p, .footer-links li a and
   p.footer-copyright for the dark panel — but not a bare <a> inside a <p>,
   which is what the demo link is. Left alone it kept the theme's #333 body ink
   and read as a smudge on the teal. */
.footer.bg-image .footer-box p a{ color:#fff;text-decoration:underline; }
.footer.bg-image .footer-box p a:hover{ color:#fff;opacity:.8; }

/* Our three brand glyphs are narrower than the theme's four, and .foo-socials
   is text-center inside a left-aligned column. */
.footer .foo-socials{ display:flex;gap:0; }

/* ── "Talk to us" ───────────────────────────────────────────────────────────
   Was a line reading "E: sales@…" above a bright green button, with a loose
   "Coming soon" chip under that and two badges under that — four fragments in
   one cell, and that green was the only saturated colour anywhere near the
   teal panel.

   One list now, each channel a row. The WhatsApp mark keeps its green so the
   channel is still recognisable, but the 30px icon carries it rather than a
   filled button competing with the footer. (.foo-wa itself stays: the reseller
   sidebar still uses it, where it sits on white.) */
.foo-reach{ list-style:none;margin:0;padding:0; }
.foo-reach li{
  display:flex;align-items:center;gap:11px;
  border-bottom:1px solid rgba(255,255,255,.12);
}
.foo-reach li:last-child{ border-bottom:0; }
.foo-reach__ico{
  display:grid;place-items:center;width:30px;height:30px;flex:none;
  border-radius:50%;background:rgba(255,255,255,.14);color:#fff;font-size:.86rem;
}
.foo-reach__ico--wa{ background:rgba(37,211,102,.2);color:#5BE39A; }
.foo-reach a{
  /* The link filled 24px of a 52px row, so most of the row was dead space on a
     touch screen. It is the row now: flex:1 across, the padding down. */
  flex:1 1 auto;display:block;padding:14px 0;
  color:#fff;font-size:.94rem;line-height:1.35;
  text-decoration:none;transition:opacity .18s ease;
}
.foo-reach a:hover{ opacity:.78;text-decoration:underline; }
/* the caption is how to use the channel, not part of its name */
.foo-reach a span{
  display:block;font-size:.76rem;color:#c5d1dc;margin-top:3px;text-decoration:none;
}

/* ── The WhatsApp action ────────────────────────────────────────────────────
   The theme's fourth cell sets an emergency phone number large in .h5-xl. The
   number is deliberately not printed anywhere on this site — a printed number
   is a line anybody scraping the page can lift — so the action takes that slot
   and carries the number in its href with a prefilled first message. */
/* The reseller sidebar uses the same button. Scoping it to .footer meant it
   rendered there as plain text. */
.foo-wa,
.footer .foo-wa{
  display:inline-flex;align-items:center;gap:9px;
  margin-top:15px;padding:10px 18px;border-radius:4px;
  background:#25D366;color:#fff !important;
  font-family:'Lato',sans-serif;font-weight:700;font-size:.95rem;
  text-decoration:none !important;
  transition:background .2s ease,transform .2s ease;
}
.foo-wa i,
.footer .foo-wa i{ font-size:1.15rem; }
.foo-wa:hover,
.footer .foo-wa:hover{ background:#1da851;transform:translateY(-2px); }

/* ── The app-store badges ───────────────────────────────────────────────────
   Neither listing exists yet, so these carry no href; the chip is what says so. */
/* Its own block, separated from the contact list by a rule rather than
   floating loose under it. */
.foo-apps{
  margin-top:22px;padding-top:18px;border-top:1px solid rgba(255,255,255,.12);
}
.foo-apps-h{
  display:flex;align-items:center;flex-wrap:wrap;gap:9px;
  font-family:'Lato',sans-serif;font-weight:700;
  font-size:.88rem;color:#fff;margin-bottom:12px;
}
/* Tight enough to sit on the same line as "Mobile apps" in a col-lg-3 cell —
   at the old size the pair wrapped and the chip sat alone on a line of its own. */
.foo-soon{
  font-size:.6rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  padding:3px 8px;border-radius:999px;flex:none;white-space:nowrap;
  background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.3);color:#fff;
}
.foo-stores{
  display:flex;flex-wrap:wrap;gap:10px;list-style:none;margin:0;padding:0;
}
.foo-stores li{ margin:0;padding:0; }
/* Greyed and held back. At full colour a Google Play badge beside an App Store
   badge reads as two buttons no matter what the label above them says, and
   neither listing exists to click. */
.foo-stores img{
  height:32px;width:auto;opacity:.42;filter:grayscale(1);
}

/* ── The bottom bar ─────────────────────────────────────────────────────────
   Two items where the theme has one, so the credit is pushed to the right edge
   on desktop and falls under the copyright on phones. */
.foo-by{
  display:inline-flex;align-items:center;gap:8px;justify-content:flex-end;
  width:100%;
}
/* The PineBix shield is 433x539 — portrait, where the old PineApps mark was a
   220x220 square. Held to the line height of the credit it sits beside. */
.foo-by img{ height:24px !important;width:auto !important; }
@media (max-width:767px){
  .foo-by{ justify-content:flex-start;margin-top:10px; }
}

/* The reseller rate table folds the store range under the tier name, so four
   columns fit the col-lg-8 without the wrapper having to scroll. */
.rate__n{ display:block;font-size:.78rem;font-weight:400;color:#6b7b93;margin-top:2px; }

/* The uppercase lead-in reads as a heading, so it takes the heading colour —
   the theme leaves it in body ink, which made it look like a paragraph that
   had been shouted rather than a title. */
#reseller-page .content-block p.p-md{ color:var(--rx-navy);font-weight:400; }

/* .modtab carries min-width:760px for the pricing page's five plan columns.
   This table has four and lives in a ~700px col-lg-8, so that min-width is what
   was pushing its last column out of sight. */
#reseller-page .modtab{ min-width:0; }

/* The about page's company table is two columns of prose, not five of ticks,
   so the 14% cap that sizes the pricing table's plan columns has to come off —
   it was squeezing "15A, 7th Floor, Spencer Plaza Mall…" into a four-line
   column against a half-empty label cell. */
#about-company .modtab,
#rp-who .modtab{ min-width:0; }
#about-company .modtab th:not(:first-child),
#about-company .modtab td:not(:first-child),
#rp-who .modtab th:not(:first-child),
#rp-who .modtab td:not(:first-child){ width:auto;text-align:left; }
#about-company .modtab th[scope="row"]{ width:32%;white-space:nowrap; }
/* the reseller table's labels are longer, and its second column is a sentence */
#rp-who .modtab th[scope="row"]{ width:34%; }
/* the plan cards here sit in Bootstrap columns, so they fill them */
#rp-packages .plan{ height:100%; }
#reseller-page .modtab th:not(:first-child),
#reseller-page .modtab td:not(:first-child){ width:18%; }

/* ── The "nothing to lose" band ────────────────────────────────────────────
   #trust-1, before the pricing section. A new product has no customers to
   quote, so what carries this band is the terms already published on
   refund.html rather than social proof. Three plain tiles — no card, no
   shadow, nothing that looks like a testimonial. */
.trust__box{ padding:8px 18px 0;text-align:center; }
/* flaticon.css sets font-size:20px on the :before of every flaticon class, so
   sizing the span does nothing — the glyph has to be sized where it is drawn. */
.trust__ico{ display:block;line-height:1;margin-bottom:18px; }
.trust__ico:before{ font-size:52px !important; }
.trust__box h5{ margin-bottom:10px; }
.trust__note{ font-size:.86rem;color:#6b7b93;margin:16px 0 0; }
.trust__note a{ color:var(--rx-red);text-decoration:underline; }
@media (max-width:767px){
  .trust__box{ padding:8px 0 22px; }
}

/* ── The product library's figures ─────────────────────────────────────────
   #library-1 on the home page. The theme has no "three big numbers in a
   column" component — .statistic-block is a row of four on a dark band, which
   is a different job — so this is three stacked figures beside the copy.

   The numbers are read off the product: 744,000 is what
   server/db/load-library.js loads, 392,669 the count of rows with a
   photograph. Set in the theme's own Lato and its accent. */
.lib-figs{ display:grid;gap:14px; }
.lib-fig{
  background:#F5F8FC;border:1px solid #E2E8F1;border-left:4px solid var(--rx-red);
  border-radius:10px;padding:20px 24px;
}
.lib-fig__n{
  display:block;font-family:'Lato',sans-serif;font-weight:900;
  font-size:clamp(1.9rem,3.4vw,2.5rem);line-height:1.05;
  color:var(--rx-navy);letter-spacing:-.02em;
}
.lib-fig__l{
  display:block;font-weight:700;font-size:.95rem;color:var(--rx-red);
  margin-top:2px;
}
.lib-fig__s{ font-size:.88rem;color:#5A6E8C;margin:8px 0 0;line-height:1.6; }

/* ── "In every plan", on the plan cards ────────────────────────────────────
   The library is shared reference data in public.product_library, not
   something provisioned per tenant, so every plan genuinely has it. It sits
   above each card's feature list rather than inside it, because the lists are
   cumulative ("Everything in Core, plus") and a row repeated in all four would
   read as four different things. */
.plan__lib{
  display:flex;align-items:center;gap:9px;
  margin:18px 0 0;padding:10px 12px;
  background:rgba(0,163,200,.08);border:1px solid rgba(0,163,200,.22);
  border-radius:9px;
  font-size:.82rem;font-weight:600;color:var(--rx-navy);text-align:left;
}
.plan__lib b{ color:var(--rx-red);font-weight:800; }
.plan__lib svg{ flex:none;color:var(--rx-red); }

/* ── The quick-facts box under the hero ─────────────────────────────────────
   Four cards, each ending in a button. The theme gives .abox-1 a fixed 300px
   height and nothing else, so each button sat directly under its own paragraph
   — and the paragraphs are three lines, four lines, three lines, four lines.
   The result was a ragged row of buttons at three different heights with 60px
   of empty blue underneath them.

   The cards are a flex column now and the buttons take margin-top:auto, so they
   sit on one line along the bottom of the box whatever the copy above them
   does. Full width as well, which is what makes them read as one row of four
   rather than four pills of four different widths (127, 184, 188 and 253px). */
#about-1 .abox-1{
  display:flex;flex-direction:column;
  /* the theme's 45px top / 40px bottom, now that the button reaches the floor */
  padding-bottom:40px;
}
#about-1 .abox-1 > .btn{
  margin-top:auto;           /* the whole point: push to the floor */
  display:flex;align-items:center;justify-content:center;gap:9px;
  width:100%;padding-left:14px;padding-right:14px;
  text-align:center;
}
/* Between 992 and 1199 the four cards are at their narrowest and "Reseller
   Program" wraps. The theme's 30px side padding is what it is competing
   with, so that is what gives. */
@media (min-width:992px) and (max-width:1199px){
  #about-1 .abox-1{ padding-left:20px;padding-right:20px; }
  #about-1 .abox-1 > .btn{ padding-left:8px;padding-right:8px;font-size:.86rem; }
}

/* ── The "Talk to a person" button ──────────────────────────────────────────
   The number was printed in full on the home page, which is a line anybody
   scraping the page can lift. The button carries the same number in its href
   with a prefilled first message, so a person reaches the same conversation in
   one tap and a crawler gets a link rather than a phone number to harvest.

   It was also the widest of the four at 253px against a 225px card, and it
   carried white-space:nowrap, so it was being clipped by the card's own
   overflow:hidden. The nowrap is gone: at full width it has the room. */
.abox-wa svg{ flex:none; }

/* ── The half menu ──────────────────────────────────────────────────────────
   The theme sizes this panel for labels like "Patient Info Sheets". Ours name
   products, so even shortened they need more room: at the theme's width the
   two columns came out ~210px each and "Laboratory software" ran past the
   panel's right edge into the page. */
.wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu{
  width:600px !important;max-width:calc(100vw - 40px);
  padding:22px 26px !important;
}
.wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu .link-list li a{
  white-space:normal;
}
@media (max-width:991px){
  .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu{
    width:100% !important;padding:0 !important;
  }
}

/* ── Items with no destination yet ──────────────────────────────────────────
   Company and Customer are half menus now, like Products and Resources, and
   two of their items have nowhere to go: Careers has no listings and the
   referral Program is not built. They are plain text with a "Soon" chip
   rather than links — the rule this site already applies to the footer's
   app-store badges, because a row that cannot be clicked is worse than a label
   that says the thing is not out yet.

   Matched to the theme's own .link-list li a metrics (15px/15px padding) so a
   soon row sits on the same rhythm as the links around it. */
.wsmenu > .wsmenu-list > li > .wsmegamenu .link-list li.is-soon{
  padding:15px 0;line-height:18px;font-size:15px;font-weight:400;color:#9aa4b2;
  cursor:default;
  /* "Laboratory software" plus a "Coming soon" chip is wider than the column,
     so this row wraps where the live links above it do not. The theme sets
     nowrap on .link-list li; it has to come off here. */
  white-space:normal;
}

/* A half menu is positioned from the left of its own nav item, so a panel late
   in a right-aligned bar runs off the screen. Measured with all four groups as
   half menus (Company and Customer were plain dropdowns until now), the panel
   left the viewport on every group except Resources below 1280px.

   Two bands, because one rule cannot cover both ends: right-anchoring the FIRST
   item pushes its panel off the left instead, and the bar's items move as the
   viewport changes, so which ones fit is a function of width.

   Below 992 the theme switches to the mobile drawer and the panel is full
   width, so these only have to hold from 992 up. */
.wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu{
  width:600px !important;max-width:calc(100vw - 40px);
  padding:22px 26px !important;
}
.wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu .link-list li a{
  white-space:normal;
}

/* Customer, Resources, Pricing, Book a demo — anchored to their own right edge
   so the panel opens inward. */
.wsmenu > .wsmenu-list > li:nth-last-child(-n+4) > .wsmegamenu.halfmenu{
  left:auto !important;right:0 !important;
}

/* 992-1279: the bar is tighter and a 600px panel no longer fits from Company
   onward, so it narrows and one more group anchors right. Products stays
   left-anchored at both widths — it is the first item, and anchoring it right
   would push its panel off the other edge. */
@media (min-width:992px) and (max-width:1279px){
  .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu{ width:480px !important; }
  .wsmenu > .wsmenu-list > li:nth-last-child(-n+5) > .wsmegamenu.halfmenu{
    left:auto !important;right:0 !important;
  }
}

@media (max-width:991px){
  .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu{
    width:100% !important;padding:0 !important;
  }
  .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu{ left:0 !important;right:auto !important; }
}


/* ══════════════════════════════════════════════════════════════════════════
   The demo enquiry modal
   --------------------------------------------------------------------------
   Brought back with the dialog itself. Its rules lived in the old
   css/styles.css, so on the theme the <dialog> opened correctly and rendered
   as nothing — no card, no background, no form styling.

   Tokens it referenced are given values here, from the theme's palette rather
   than the old crimson one. */
.rxmodal{
  --ink:#0B1F3F; --ink-2:#22375C; --muted:#5A6E8C; --line:#E2E8F1;
  --red:#00a3c8; --red-hi:#00819f; --red-soft:#EAF7FB;
  --canvas:#fff; --soft:#F5F8FC;
  --r:12px; --r-lg:18px; --r-xl:22px;
  --sh-2:0 30px 70px rgba(11,31,63,.22);
  --ease:cubic-bezier(.22,.61,.36,1);
  --display:'Lato',sans-serif; --sans:'Roboto',sans-serif;
  font-family:'Roboto',sans-serif;
}

/* ---------------------------------------------------------------- modal -- */
/* The <dialog> element is the sizing box; .modal__card is the visible surface.
   Keeping padding off the dialog means anything outside the card is backdrop,
   which is what lets the click-outside-to-close test in main.js be a simple
   `e.target === modal`. */
.rxmodal{
  border:0;padding:0;background:transparent;color:var(--ink-2);
  width:min(580px,calc(100vw - 32px));
  max-height:calc(100dvh - 40px);
  overflow:visible;
}

.rxmodal::backdrop{background:rgba(6,13,20,.62);backdrop-filter:blur(3px)}

.rxmodal[open]{animation:modalIn .26s var(--ease) both}

.modal__card{
  position:relative;background:#fff;border-radius:var(--r-xl);
  padding:34px 36px 32px;box-shadow:var(--sh-2);
  max-height:calc(100dvh - 40px);overflow-y:auto;
}

/* ── The dialog, on the theme ───────────────────────────────────────────────
   This came across from the previous design and still looked like it: a plain
   white card with a dark heading and nothing of the site around it, opening
   out of a page that is cyan, Lato and steelblue throughout.

   What it needed was the theme's own section grammar rather than a new
   design — a cyan eyebrow over a steelblue title, the theme's 6px 54px fields,
   and its button. The band across the top is the one addition: a dialog has no
   page around it to say whose it is. */
.rxmodal .modal__head{
  background:linear-gradient(135deg,#00a3c8 0%,#00819f 100%);
  color:#fff;
  /* Breaks out of the card's own padding rather than the card giving its
     padding up — that way nothing below the band has to be re-wrapped, and the
     OTP and confirmation panels keep the inset they already had. */
  margin:-34px -36px 26px;
  padding:30px 36px 26px;
  border-radius:var(--r-xl) var(--r-xl) 0 0;
}
.rxmodal .modal__head .eyebrow{
  font-family:'Lato',sans-serif;font-size:.78rem;font-weight:900;
  text-transform:uppercase;letter-spacing:.09em;
  color:rgba(255,255,255,.82);margin:0 0 8px;
}
.rxmodal .modal__head h2{
  font-family:'Lato',sans-serif;font-weight:900;color:#fff;
  font-size:clamp(1.32rem,3.2vw,1.58rem);line-height:1.25;margin:0;
}
.rxmodal .modal__head .modal__sub{
  color:rgba(255,255,255,.9);margin:12px 0 0;font-size:.92rem;line-height:1.6;
}

/* the close button sits on the band, so it is white-on-cyan not grey-on-white */
.rxmodal .modal__x{
  background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.4);color:#fff;
}
.rxmodal .modal__x:hover{
  background:rgba(255,255,255,.3);border-color:#fff;color:#fff;
}

/* the theme's field: 54px, 6px radius, its accent on focus */
.rxmodal input[type="text"],.rxmodal input[type="email"],.rxmodal input[type="tel"],
.rxmodal input[type="url"],.rxmodal select,.rxmodal textarea{
  height:52px;border:1px solid #ccc;border-radius:6px;
  padding:0 16px;font-size:.98rem;font-weight:300;color:#333;background:#fff;
  transition:border-color .3s ease,box-shadow .3s ease;
}
.rxmodal textarea{ height:auto;min-height:96px;padding:14px 16px; }
.rxmodal input:focus,.rxmodal select:focus,.rxmodal textarea:focus{
  border-color:var(--red);outline:0;box-shadow:0 0 0 3px rgba(0,163,200,.14);
}
.rxmodal .field label{
  font-family:'Lato',sans-serif;font-size:.8rem;font-weight:700;color:var(--ink);
}

/* and the theme's button, rather than the old design system's */
.rxmodal .btn--solid{
  background:var(--red);border:1px solid var(--red);color:#fff;
  font-family:'Lato',sans-serif;font-weight:700;border-radius:6px;
  transition:background .3s ease,border-color .3s ease;
}
.rxmodal .btn--solid:hover{ background:var(--red-hi);border-color:var(--red-hi); }

@media (max-width:600px){
  /* .modal__card drops to 28px/22px below 600, so the break-out matches */
  .rxmodal .modal__head{ margin:-28px -22px 22px;padding:24px 22px 20px; }
}

/* The section h2 scale is built for a full-width band and is far too large inside
   a 580px card. */
.rxmodal h2{font-size:clamp(1.35rem,3.4vw,1.62rem);margin-bottom:12px}

.modal__sub{font-size:.95rem;color:var(--muted)}

.modal__sub a{color:var(--red);font-weight:700}

.modal__x{
  position:absolute;top:15px;right:15px;z-index:1;
  display:grid;place-items:center;width:36px;height:36px;border-radius:50%;
  background:#fff;border:1px solid var(--line);color:var(--muted);cursor:pointer;
  transition:background .2s var(--ease),color .2s var(--ease),border-color .2s var(--ease);
}

.modal__x svg{width:16px;height:16px}

.modal__x:hover{background:var(--soft);color:var(--ink);border-color:#D2DCE6}

.fields{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:24px}

.field{display:flex;flex-direction:column;gap:6px;min-width:0}

.field--wide{grid-column:1/-1}

.field label{font-size:.8rem;font-weight:700;color:var(--ink)}

.field label span{color:var(--red)}

.field input,.field select,.field textarea{
  font-family:inherit;font-size:.94rem;color:var(--ink);width:100%;
  background:#fff;border:1.5px solid var(--line);border-radius:var(--r);padding:11px 13px;
  transition:border-color .18s var(--ease),box-shadow .18s var(--ease);
}

.field textarea{resize:vertical;min-height:84px;line-height:1.5}

.field select{appearance:none;cursor:pointer;
  /* Chevron as a data: URI — an external asset would be blocked on a strict CSP
     and is not worth a network round trip for one 7px mark. */
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5l5-5' fill='none' stroke='%2361748A' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 13px center;background-size:11px;
  padding-right:34px;
}

/* Replaces the global focus ring rather than removing it — drawn as a halo so it
   follows the input's own radius instead of boxing it.
   Deliberately NOT brand red: red is the error colour three lines down, and when
   both used it, a freshly-opened form showed its focused first field looking exactly
   like a field that had already been rejected. */
.field input:focus,.field select:focus,.field textarea:focus{
  outline:0;border-color:var(--ink-2);box-shadow:0 0 0 3px rgba(42,59,74,.13);
}

.field.is-bad input,.field.is-bad select,.field.is-bad textarea{border-color:var(--red)}

/* Focusing a rejected field must not clear the signal that it is still wrong. */
.field.is-bad input:focus,.field.is-bad select:focus,.field.is-bad textarea:focus{
  border-color:var(--red);box-shadow:0 0 0 3px rgba(var(--red-rgb),.15);
}

/* Off-screen rather than display:none — a bot reading the DOM should still see a
   fillable field, which is the whole point of the trap. */
.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}

.modal__err{
  margin-top:16px;padding:11px 14px;border-radius:var(--r);
  background:var(--red-soft);border:1px solid rgba(var(--red-rgb),.22);
  font-size:.88rem;font-weight:600;color:#A8140C;
}

.modal__err[hidden]{display:none}

/* The OTP step. One field, so it gets the room the six digits deserve — wide
   tracking and a tabular face, which is what makes a mistyped code obvious at a
   glance rather than after the server says no. Width is capped in ch so the box
   ends where the code does and does not read as a six-digit answer in a field
   built for a sentence. */
.field--code{margin-top:24px;max-width:15ch}

.field--code input{
  font-variant-numeric:tabular-nums;font-size:1.5rem;font-weight:700;
  letter-spacing:.34em;text-align:center;padding:13px 0 13px .34em;
}

.field--code input::placeholder{letter-spacing:.2em;font-weight:600}

.modal__dot{margin:0 7px;color:var(--line)}

.modal__actions{display:flex;flex-wrap:wrap;align-items:center;gap:14px;margin-top:22px}

.modal__actions .btn{padding:14px 26px}

.modal__alt{font-size:.86rem;color:var(--muted)}

.modal__alt a{color:var(--red);font-weight:700}

#demoSubmit[disabled],#otpSubmit[disabled]{opacity:.6;cursor:progress;transform:none;box-shadow:none}

.modal__tick{
  display:grid;place-items:center;width:52px;height:52px;margin-bottom:18px;
  border-radius:50%;background:var(--green-soft);color:var(--green);
}

.modal__tick svg{width:26px;height:26px}

/* These three are the phone overrides and nothing else. They lost their
   @media wrapper somewhere in the port, so they were applying at every width:
   the card kept its 22px phone padding on a 580px dialog, the two-column field
   grid collapsed to one column on desktop, and the submit button was full
   width everywhere. That is most of why this dialog read as cramped and ran to
   860px before it would fit. */
@media (max-width:600px){
  .modal__card{padding:28px 22px 26px;border-radius:var(--r-lg)}
  .fields{grid-template-columns:1fr}
  .modal__actions .btn{width:100%}
}

#buyModal .modal__card{display:flex;flex-direction:column}
/* …and its panel must not shrink inside that column. The card is capped at
   calc(100dvh - 40px) with overflow-y:auto; as a flex child #buyPanel defaults
   to flex-shrink:1, so on a short viewport it was compressed below its own
   content height and the children then drew over each other — the price
   summary and the Pay button overlapped by 8px. flex:none lets the panel keep
   its height and the CARD do the scrolling, which is what the overflow on it
   is for. */
#buyModal #buyPanel,#buyModal #buyDone{ flex:none; }

.modal__ref{margin-top:10px;font-size:.85rem;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}

.field__opt{font-weight:500;color:var(--muted);font-size:.82em}

.field__note{margin:6px 0 0;font-size:.84rem;color:var(--muted)}

.field__note--ok{color:var(--green);font-weight:700}

.field__note--bad{color:var(--red)}

/* ── The "Pay online" dialog ────────────────────────────────────────────────
   .who, .who__btn, .quote, .buyq__note, .term--modal and .num had NO rules at
   all — they never came across from the old design system, and nobody noticed
   because the dialog only opens on a click. The result: the two buyer-type
   buttons rendered as bare bordered boxes with their label and caption run
   together ("New accountFirst licence"), and the price summary was loose text
   collapsing into the Pay button. */

/* new account / existing account */
.who{ display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:18px 0 4px; }
.who__btn{
  display:block;text-align:left;cursor:pointer;
  padding:12px 14px;border-radius:10px;
  background:#fff;border:1.5px solid var(--line);color:var(--ink-2);
  transition:border-color .18s ease,background .18s ease;
}
.who__btn b{
  display:block;font-family:'Lato',sans-serif;font-size:.92rem;color:var(--ink);
}
.who__btn span{ display:block;font-size:.8rem;color:var(--muted);margin-top:2px; }
.who__btn:hover{ border-color:rgba(0,163,200,.45); }
.who__btn[aria-pressed="true"]{
  border-color:var(--red);background:var(--red-soft);
}
.who__btn[aria-pressed="true"] b{ color:var(--red-hi); }

/* the term switch, inside the dialog */
.term--modal{ margin-bottom:0; }

/* The price summary. NOT .quote — that is the theme's testimonial quote mark
   (60x62, margin-bottom:-30px, position:relative, z-index:3), and our block
   borrowed the name from the old design system and inherited all of it. The
   -30px is what was pulling the Pay button up over the total. */
.buyq{
  margin-top:22px;padding:16px 18px;
  background:var(--soft);border:1px solid var(--line);border-radius:12px;
}
.buyq__row{
  display:flex;align-items:baseline;justify-content:space-between;gap:14px;
  padding:7px 0;font-size:.92rem;color:var(--ink-2);
}
.buyq__row .num{
  font-family:'Lato',sans-serif;font-weight:700;color:var(--ink);
  white-space:nowrap;
}
.buyq__row--off .num{ color:#1b9e63; }
.buyq__row--total{
  margin-top:6px;padding-top:13px;border-top:1px solid var(--line);
  font-size:1rem;
}
.buyq__row--total span{ font-family:'Lato',sans-serif;font-weight:700;color:var(--ink); }
.buyq__row--total .num{ font-size:1.3rem;color:var(--red-hi); }
.buyq__note{ margin:8px 0 0;font-size:.82rem;color:var(--muted); }

/* `hidden` loses to any class that sets display — which is every row and field
   here — so the attribute has to be restated. Without this a hidden discount row
   shows as an empty "Code —" line. */
.buyq__row[hidden],.field[hidden],.who[hidden]{display:none}

/* ── the pharmacy / reseller chooser ──────────────────────────────────────────
   This sits inside `.fields`, which already styles everything it contains on
   the assumption that it is a text input in a two-column grid. Three of those
   assumptions are wrong here, and each has to be undone explicitly:

     .field input { width:100%; padding:11px 13px; border:1.5px solid }

→ stretched the RADIO into a full-width bordered box, which is what the
          empty rectangle in the form was.

     .field label span { color: var(--red) }

→ exists to colour the required asterisk. It also caught the <span>
          holding the option text, turning every label red.

     .fields { grid-template-columns: 1fr 1fr }

→ put the whole question in one narrow column, so the text that had
          escaped the box wrapped a word at a time.

   Specificity is deliberate throughout: `.field input` is (0,1,1) and
   `.field label span` is (0,2,1), so each override here is written to beat the
   rule it is undoing rather than relying on source order. */

/* First question, and it changes what the rest of the form means — full width. */
.field--choice { grid-column: 1 / -1; border: 0; padding: 0; margin: 0; gap: 8px; }

.field--choice legend {
  font: inherit; font-weight: 700; font-size: .8rem; color: var(--ink);
  padding: 0; margin-bottom: 8px;
}

.field--choice legend span { color: var(--red); }

/* Two across where there is room, stacked on a phone. */
.field--choice .choices { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }

.field--choice .choices { grid-template-columns: 1fr; }

/* The whole row is the target — a 16px radio is a poor tap area, and this is
   the first thing the form asks. */
.field--choice .choice {
  display: flex; gap: 11px; align-items: flex-start; cursor: pointer;
  border: 1.5px solid var(--line); border-radius: var(--r);
  padding: 13px 15px; margin: 0;
  transition: border-color .18s var(--ease), background .18s var(--ease);
}

.field--choice .choice:hover { border-color: var(--red); }

/* (0,3,1) — beats `.field input` (0,1,1). */
.field--choice .choice input[type="radio"] {
  width: auto; min-width: 0; flex: none; margin: 2px 0 0;
  padding: 0; border: 0; border-radius: 0; background: none;
  accent-color: var(--red); box-shadow: none;
}

.field--choice .choice input[type="radio"]:focus { box-shadow: none; }

/* (0,3,1) — beats `.field label span` (0,2,1), which is the asterisk rule. */
.field--choice .choice > span { color: var(--ink); font-weight: 400; }

.field--choice .choice b {
  display: block; font-size: .92rem; font-weight: 700; line-height: 1.35; color: var(--ink);
}

.field--choice .choice small {
  display: block; font-size: .78rem; font-weight: 400; color: var(--muted);
  margin-top: 3px; line-height: 1.45;
}

/* :has marks the chosen row. Where it is unsupported the radio still shows the
   state — this is emphasis, never the only signal. */
.field--choice .choice:has(input:checked) {
  border-color: var(--red);
  background: color-mix(in srgb, var(--red) 4%, transparent);
}

.field--choice .choice:has(input:focus-visible) { outline: 2px solid var(--red); outline-offset: 2px; }

@keyframes modalIn{
  from{opacity:0;transform:translateY(14px) scale(.985)}
  to{opacity:1;transform:none}
}

/* ── "What runs where" ──────────────────────────────────────────────────────
   Built on the theme's doctor cards, which put a photograph at the top of each
   one — those were app screenshots, and screenshots of a live pharmacy show
   real stock, real customers and real money. An icon tile says the same thing
   about what the module IS without publishing anybody's counter. */
.module-1{
  background:#fff;border:1px solid #E2E8F1;border-radius:14px;
  padding:30px 24px 26px;height:100%;text-align:center;
  transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease;
}
.module-1:hover{
  transform:translateY(-4px);border-color:rgba(0,163,200,.34);
  box-shadow:0 18px 40px rgba(11,31,63,.10);
}
.module-1-ico{
  display:grid;place-items:center;width:72px;height:72px;margin:0 auto 18px;
  border-radius:50%;background:rgba(0,163,200,.10);color:#00a3c8;
  transition:background .18s ease,color .18s ease;
}
.module-1-ico span{ font-size:34px;line-height:1; }
.module-1:hover .module-1-ico{ background:#00a3c8;color:#fff; }
.module-meta h5{ margin-bottom:4px; }
.module-meta > span{
  display:block;margin-bottom:10px;font-size:.76rem;font-weight:700;
  letter-spacing:.08em;text-transform:uppercase;
}
.module-meta p{ margin-bottom:14px;min-height:3.2em; }
.module-more{
  font-size:.85rem;font-weight:700;color:#00a3c8;text-decoration:none;
}
.module-more:hover{ color:#00819f;text-decoration:underline; }

/* BIXClinic has no page to link to yet, so its card ends in a chip where the
   other two end in a link. .module-meta > span already claims the eyebrow slot
   above, so this has to undo that as well as style itself. */
.module-meta .module-soon{
  display:inline-block;margin:0;
  font-size:.66rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  padding:3px 9px;border-radius:5px;
  background:#E6F5FA;border:1px solid rgba(0,163,200,.38);color:#00728c;
}

/* The CEO's sign-off. Set apart from the body it closes, and in the accent, so
   it reads as a signature rather than as one more paragraph. */
.ceo__sign{
  margin-top:28px;padding-top:18px;border-top:1px solid #E2E8F1;
  font-family:'Lato',sans-serif;font-weight:700;color:var(--rx-red);
}

/* ── Vision and mission ────────────────────────────────────────────────────
   Two statements, side by side on the about page. Not cards: they are the
   company talking, so they take a rule in the accent rather than a box. */
.vm{ padding:6px 0 28px;border-top:3px solid var(--rx-red);margin-top:8px; }
.vm__ico{ display:block;line-height:1;margin:22px 0 14px; }
.vm__ico:before{ font-size:46px !important; }
.vm h5{ margin-bottom:10px; }
.vm p{ margin-bottom:0;max-width:52ch; }
@media (min-width:768px){ .vm{ padding-right:30px; } }

/* The confirmation panel takes the same cyan band as the other two rather than
   a pale variant of it. A light band needed its own close-button colour — the
   white-on-cyan button vanished against it — and one band means one treatment
   that is right on all three panels. */
.rxmodal .modal__head--done{ text-align:center; }
.rxmodal .modal__head--done .modal__tick{
  margin:0 auto 16px;background:rgba(255,255,255,.18);color:#fff;
  border:2px solid rgba(255,255,255,.5);
}
.rxmodal .modal__head--done .modal__sub a{
  color:#fff;font-weight:700;text-decoration:underline;
}


/* ══════════════════════════════════════════════════════════════════════════
   The question dock
   --------------------------------------------------------------------------
   A heart in the corner that beats, and the FAQ answered as a conversation
   when it is opened. Built entirely by js/chat.js — the page carries only an
   empty #chatMount — so everything below exists only once that has run.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── The closing banner ────────────────────────────────────────────────────
   #banner-2 carries the theme's pt-80, which is padding-TOP only, so the band
   ended flush against the footer — 0px between them — and the copy inside it
   sat tight to the band's own edges. It needs the same room below that it has
   above, and the inner block needs its own. */
#banner-2{ padding-bottom:80px; }
#banner-2 .bg-inner{ padding-top:20px;padding-bottom:20px; }
@media (max-width:767px){
  #banner-2{ padding-bottom:56px; }
}

/* The theme's back-to-top button is fixed at right:30px bottom:20px — exactly
   where the chat launcher goes, and it was sitting on top of the heart and
   swallowing the click. It moves to the opposite corner: bottom-right is where
   people look for a chat, and back-to-top is the one that can sit anywhere.
   Stacking them was the first attempt and put it on the open panel instead. */
#scrollUp{ bottom:26px !important;left:26px !important;right:auto !important;z-index:59; }
@media (max-width:480px){ #scrollUp{ bottom:18px !important;left:16px !important; } }

/* ── the heart ─────────────────────────────────────────────────────────────
   An SVG path rather than the two-circles-and-a-rotated-square CSS trick: the
   button has to carry a shadow that follows its own outline and hold a glyph
   centred inside it, and the CSS heart fights both. */
.cbot__beat{
  position:fixed;right:22px;bottom:22px;z-index:60;
  width:76px;height:76px;padding:0;border:0;background:none;cursor:pointer;
  display:grid;place-items:center;
  transition:transform .32s cubic-bezier(.22,.61,.36,1),opacity .32s ease;
}
.cbot__beat.is-away{
  opacity:0;transform:translateY(16px) scale(.9);pointer-events:none;
}

.cbot__heart{
  position:absolute;inset:0;display:block;color:var(--rx-red);
  filter:drop-shadow(0 10px 22px rgba(0,114,140,.42));
  animation:cbotBeat 2.4s ease-in-out infinite;
}
.cbot__heart svg{ width:100%;height:100%;display:block; }
.cbot__beat:hover .cbot__heart{ color:var(--rx-red-hi); }

/* The real rhythm rather than a plain pulse: two quick contractions, then a
   rest about twice as long as the pair. */
@keyframes cbotBeat{
  0%,58%,100%{ transform:scale(1); }
  12%        { transform:scale(1.14); }
  24%        { transform:scale(1); }
  36%        { transform:scale(1.09); }
}

/* The glyph sits in the body of the heart rather than its centre: the point
   pulls a heart's visual mass upward, so a centred mark looks low. */
.cbot__badge{
  position:relative;z-index:1;display:grid;place-items:center;
  width:26px;height:26px;color:#fff;margin-top:-5px;
  filter:drop-shadow(0 1px 2px rgba(0,60,76,.45));
}
.cbot__badge svg{
  grid-area:1/1;width:100%;height:100%;display:block;
  transition:opacity .2s ease,transform .2s ease;
}
.cbot__badge-x{ opacity:0;transform:scale(.5); }
.cbot__beat.is-open .cbot__badge-chat{ opacity:0;transform:scale(.5); }
.cbot__beat.is-open .cbot__badge-x{ opacity:1;transform:scale(1); }
.cbot__beat.is-open .cbot__heart{ animation:none; }
.cbot__beat.is-open .cbot__halo{ animation:none;opacity:0; }

/* The halo: the same path again, behind, pushing out and fading on the beat.
   transform-box:fill-box so the scale happens about the path's own centre and
   not the corner of the SVG's user space. */
.cbot__halo{
  transform-box:fill-box;transform-origin:center;
  animation:cbotHalo 2.4s ease-out infinite;
}
@keyframes cbotHalo{
  0%        { transform:scale(1);opacity:.45; }
  35%,100%  { transform:scale(1.42);opacity:0; }
}

/* ── the panel ─────────────────────────────────────────────────────────── */
.cbot{
  position:fixed;right:22px;bottom:112px;z-index:60;
  width:min(358px,calc(100vw - 32px));
  /* 112 of offset below the panel, the sticky header's 70 above it, and a
     margin. The old calc only counted the offset, so below about 760px tall the
     panel's own cyan bar went under the header — which is the part you need to
     see to close it. With this the top never comes above 88px whatever the
     viewport does. */
  max-height:min(500px,calc(100dvh - 200px));
  display:flex;flex-direction:column;overflow:hidden;
  background:#fff;border:1px solid #E2E8F1;border-radius:16px;
  box-shadow:0 26px 60px rgba(11,31,63,.24);
  animation:cbotIn .24s cubic-bezier(.22,.61,.36,1) both;
}
@keyframes cbotIn{ from{ opacity:0;transform:translateY(12px) scale(.98); } }

.cbot__bar{
  display:flex;align-items:center;gap:11px;flex:none;
  padding:14px 14px 14px 16px;
  background:linear-gradient(135deg,#00a3c8 0%,#00819f 100%);color:#fff;
}
.cbot__av{
  display:grid;place-items:center;width:36px;height:36px;flex:none;
  border-radius:50%;overflow:hidden;background:rgba(255,255,255,.2);color:#fff;
  border:2px solid rgba(255,255,255,.55);
}
.cbot__av svg{ width:19px;height:19px; }
/* The photograph is 224x224; it is shown at 36 and at 26, so it is cropped to
   the circle rather than letterboxed into it. */
.cbot__av img{ width:100%;height:100%;object-fit:cover;display:block; }
.cbot__who{ display:flex;flex-direction:column;line-height:1.3;min-width:0; }
.cbot__who b{ font-family:'Lato',sans-serif;font-size:.96rem; }
.cbot__who > span{ font-size:.72rem;color:rgba(255,255,255,.86);
  display:flex;align-items:center;gap:6px; }
.cbot__dot{
  width:7px;height:7px;border-radius:50%;background:#5BE39A;flex:none;
  box-shadow:0 0 0 3px rgba(91,227,154,.28);
}
.cbot__x{
  margin-left:auto;width:30px;height:30px;flex:none;padding:0;cursor:pointer;
  display:grid;place-items:center;border-radius:50%;
  background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.36);color:#fff;
}
.cbot__x svg{ width:15px;height:15px; }
.cbot__x:hover{ background:rgba(255,255,255,.3); }

/* ── the thread ────────────────────────────────────────────────────────── */
.cbot__thread{
  flex:none;max-height:172px;overflow-y:auto;
  list-style:none;margin:0;padding:16px 16px 6px;background:#F5F8FC;
}
.cmsg{ display:flex;gap:8px;margin-bottom:12px;align-items:flex-end; }
.cmsg__av{
  display:grid;place-items:center;width:28px;height:28px;flex:none;
  border-radius:50%;overflow:hidden;background:rgba(0,163,200,.12);color:var(--rx-red);
  align-self:flex-end;
}
.cmsg__av svg{ width:14px;height:14px; }
.cmsg__av img{ width:100%;height:100%;object-fit:cover;display:block; }
.cmsg__b{
  margin:0;padding:10px 13px;border-radius:14px;font-size:.86rem;line-height:1.55;
  background:#fff;border:1px solid #E2E8F1;color:var(--rx-ink);
  max-width:82%;
}
.cmsg--out{ justify-content:flex-end; }
.cmsg--out .cmsg__b{
  background:var(--rx-red);border-color:var(--rx-red);color:#fff;
  border-bottom-right-radius:5px;
}
.cmsg--in .cmsg__b{ border-bottom-left-radius:5px; }

.cmsg--typing .cmsg__b{ display:flex;gap:4px;padding:13px; }
.cmsg--typing i{
  width:6px;height:6px;border-radius:50%;background:#9aa4b2;
  animation:cbotDot 1s infinite ease-in-out;
}
.cmsg--typing i:nth-child(2){ animation-delay:.16s; }
.cmsg--typing i:nth-child(3){ animation-delay:.32s; }
@keyframes cbotDot{ 0%,60%,100%{ opacity:.3;transform:translateY(0); }
                    30%{ opacity:1;transform:translateY(-3px); } }

/* ── the questions ─────────────────────────────────────────────────────── */
.cbot__asks{
  flex:1 1 auto;min-height:0;overflow-y:auto;
  padding:12px 16px 6px;border-top:1px solid #E2E8F1;
}
.cbot__grp{
  margin:12px 0 7px;font-family:'Lato',sans-serif;
  font-size:.66rem;font-weight:900;letter-spacing:.09em;text-transform:uppercase;
  color:#9aa4b2;
}
.cbot__grp:first-child{ margin-top:0; }
.cbot__ask{
  display:block;width:100%;text-align:left;cursor:pointer;
  margin-bottom:6px;padding:9px 12px;
  font-size:.84rem;line-height:1.45;color:var(--rx-navy);
  background:#fff;border:1px solid #E2E8F1;border-radius:9px;
  transition:background .16s ease,border-color .16s ease,color .16s ease;
}
.cbot__ask:hover{ background:#EAF7FB;border-color:rgba(0,163,200,.4);color:var(--rx-red-hi); }
.cbot__ask.is-asked{ opacity:.5; }

.cbot__foot{
  flex:none;margin:0;padding:12px 16px;
  border-top:1px solid #E2E8F1;background:#F5F8FC;
  font-size:.85rem;color:#5A6E8C;
}
.cbot__foot a{ color:var(--rx-red);font-weight:700; }

@media (max-width:480px){
  .cbot__beat{ right:14px;bottom:14px;width:64px;height:64px; }
  .cbot{
    right:14px;left:14px;bottom:88px;width:auto;
    /* 88 of offset below, plus the sticky header's ~70 and a margin above it —
       at the old 120 the panel ran up under the header and its own cyan bar was
       the part that got covered. */
    max-height:calc(100dvh - 180px);
  }
  .cbot__thread{ max-height:130px; }
}

/* The beat is decoration; the dock still opens and answers without it. */
@media (prefers-reduced-motion:reduce){
  .cbot__heart,.cbot__halo{ animation:none; }
  .cbot__halo{ opacity:0; }
  .cbot{ animation:none; }
  .cmsg--typing i{ animation:none; }
}


/* ══════════════════════════════════════════════════════════════════════════
   Phones: undo the root's own shrink where it takes body copy too small
   --------------------------------------------------------------------------
   responsive.css line 1463 sets `html{font-size:14px}` below 576px. Every rem
   in this stylesheet is therefore 12.5% smaller on a phone than the number
   written against it — so .cbot__foot at .78rem rendered at 10.9px, the chat's
   own question buttons at 11.8px, and several paragraphs at 12.0–12.3px.

   That is fine for the uppercase micro-labels, which are labels and are meant
   to be small. It is not fine for anything somebody has to read a sentence of.
   Set in px here so the root's scaling cannot compound on it again.
   ══════════════════════════════════════════════════════════════════════════ */
@media (max-width:575px){

  /* the question dock — the worst of it, and the part most likely to be read
     on a phone in the first place */
  .cbot__ask{ font-size:13.5px;line-height:1.5;padding:11px 13px; }
  .cbot__grp{ font-size:10.5px; }
  .cmsg__b{ font-size:13.5px; }
  .cbot__foot{ font-size:13px; }
  .cbot__who > span{ font-size:11.5px; }

  /* body copy */
  .lib-fig__s,
  .plan__billed,
  .plan__lib,
  .trust__note,
  .pnote,
  .plan__who,
  .plan__feat li,
  .addon__pts,
  .addon__body,
  .rate__n,
  .legal__meta{ font-size:13.5px; }

  /* an uppercase label, so it can sit below body size — but not at 11.5px */
  .plan__inc{ font-size:12.5px; }

  .foo-reach a{ font-size:14.5px; }
  .foo-reach a span{ font-size:12.5px; }
  .foo-apps-h{ font-size:13px; }

  /* the demo dialog */
  .field label{ font-size:12.5px; }
  .modal__alt,.field__note{ font-size:13px; }
  .modal__sub{ font-size:13.5px; }
}


/* ══════════════════════════════════════════════════════════════════════════
   Prices, while the live list is on its way
   --------------------------------------------------------------------------
   The figures in pricing.html are the last published set, so the page is never
   blank and never wrong if Genome is unreachable. But painting them straight
   away meant a reader saw the old number and then watched it change — a wrong
   price, visibly, on every load.

   <html class="px-wait"> holds the figure back and shows a shimmer in the space
   it will occupy, so nothing moves when the real number arrives. js/prices.js
   removes the class as soon as the list is applied, and after 700ms regardless:
   a slow or dead API has to fall back to the published figure, not to an empty
   card. The class is in the markup because by the time any script runs the
   browser has already painted, which is the flash being removed.
   ══════════════════════════════════════════════════════════════════════════ */
.px-wait .plan__amt,
.px-wait .plan__cur,
.px-wait .plan__per,
.px-wait .plan__billed{ visibility:hidden; }

.px-wait .plan__price{ position:relative; }
.px-wait .plan__price::after,
.px-wait .plan__billed::after{
  content:"";position:absolute;inset:0;border-radius:8px;
  background:linear-gradient(90deg,#EDF2F7 25%,#F7FAFC 50%,#EDF2F7 75%);
  background-size:220% 100%;
  animation:pxShimmer 1.15s linear infinite;
}
.px-wait .plan__billed{ position:relative; }
.px-wait .plan__billed::after{ border-radius:5px; }

@keyframes pxShimmer{ from{ background-position:120% 0; } to{ background-position:-120% 0; } }

/* the module table's column heads carry the same figures */
.px-wait [data-plan-cost]{ visibility:hidden; }
.px-wait .modtab__cost{ position:relative; }
.px-wait .modtab__cost::after{
  content:"";position:absolute;inset:2px 0;border-radius:4px;
  background:#EDF2F7;animation:pxShimmer 1.15s linear infinite;
  background-image:linear-gradient(90deg,#EDF2F7 25%,#F7FAFC 50%,#EDF2F7 75%);
  background-size:220% 100%;
}

/* Somebody who has asked for less motion gets the held state without the
   animation — it is a placeholder either way. */
@media (prefers-reduced-motion:reduce){
  .px-wait .plan__price::after,
  .px-wait .plan__billed::after,
  .px-wait .modtab__cost::after{ animation:none; }
}


/* ── Reveal animations must never be the reason content is missing ─────────
   wow.js hides every .wow element (visibility:hidden) and reveals it as the
   page is scrolled past it. It decides that from window.scrollY — and below
   992px menu.css sets html{overflow:hidden;height:100%}, which makes BODY the
   scrolling element. window.scrollY is then pinned at 0 for the life of the
   page, wow.js concludes nothing has ever come into view, and all 22 elements
   stay hidden: on a phone, most of the home page was blank.

   The animation is decoration; the words are the product. Below the breakpoint
   where the scroll container changes, the elements are simply shown. */
@media (max-width: 991.98px){
  .wow{
    visibility:visible !important;
    animation-name:none !important;
    animation-duration:0s !important;
  }
}


/* The published build, in the footer's copyright line. Quiet on purpose: it is
   read once, when somebody is establishing which version they are looking at,
   and never by a visitor. It stays hidden until js/version.js finds a
   version.json to read, so locally the line reads as it always has. */
/* The theme styles every span inside .footer-copyright as the emphasised brand
   name, which is right for "Ranbix Pharma Soft" and wrong for a build number —
   it made the version the loudest thing on the line. Specific enough to beat
   `.footer.bg-image p.footer-copyright span` without !important. */
.footer p.footer-copyright span#site-ver,
.footer.bg-image p.footer-copyright span#site-ver,
p.footer-copyright span#site-ver{
  font-weight:400;
  color:inherit;
  opacity:.55;
  font-variant-numeric:tabular-nums;
  white-space:nowrap;
}
