/* ============================================================
   Janison Insights help — brand overrides for MkDocs Material
   Tuned to match the content-page prototype:
   white topbar with teal accent, lighter typography, soft
   admonitions, and Janison area colour accents.
   ============================================================ */

/* iOS Safari rubber-band overscroll fix.
   When the user scrolls past the bottom of the page, the area below
   the footer shows the <html> element's background. By default that's
   white, which gives an ugly empty rectangle. Setting it to the
   footer's midnight colour makes the overscroll area look like the
   footer simply extending downward. */
html {
  background-color: #002C41;
}
[data-md-color-scheme="slate"] html {
  background-color: #0F1620;
}

/* ----- Font stack matches the prototype:
   Segoe UI on Windows, San Francisco on Mac, Roboto on Android. ----- */
body,
.md-typeset,
.md-header,
.md-tabs,
.md-search,
.md-search__input,
.md-nav,
input, button, select, textarea {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
               "Helvetica Neue", Arial, sans-serif;
}
.md-typeset code,
.md-typeset pre,
.md-typeset kbd {
  font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
}

:root {
  /* Janison brand colours */
  --jn-midnight:    #002C41;
  --jn-midnight-2:  #003A56;
  --jn-teal:        #00A88D;
  --jn-teal-dark:   #007A67;
  --jn-teal-light:  #6FE3CC;
  --jn-teal-tint:   #E6F7F3;

  /* Neutrals (matching the prototype) */
  --jn-ink:         #1A2421;
  --jn-ink-2:       #4A5856;
  --jn-ink-3:       #8A9593;
  --jn-bg:          #F7F8F8;
  --jn-border:      rgba(0, 0, 0, 0.08);
  --jn-border-2:    rgba(0, 0, 0, 0.15);

  /* Area accents (from colour-scheme.md) */
  --jn-people-bg:      #E6F6F4;
  --jn-people-fg:      #00A88D;
  --jn-author-bg:      #E6EAED;
  --jn-author-fg:      #002C41;
  --jn-deliver-bg:     #EDF7F8;
  --jn-deliver-fg:     #41B0B4;
  --jn-mark-bg:        #FDF0ED;
  --jn-mark-fg:        #F15C3C;
  --jn-report-bg:      #FDE9ED;
  --jn-report-fg:      #EE2B4B;
  --jn-integration-bg: #EEEAF8;
  --jn-integration-fg: #6B4FA0;

  /* Academy area aliases. Mapped to existing Insights hues so the brand
     palette stays unified across products. Change these here only if
     Academy needs to diverge visually from Insights. */
  --jn-learning-bg:    var(--jn-deliver-bg);
  --jn-learning-fg:    var(--jn-deliver-fg);
  --jn-design-bg:      var(--jn-author-bg);
  --jn-design-fg:      var(--jn-author-fg);
  --jn-social-bg:      var(--jn-mark-bg);
  --jn-social-fg:      var(--jn-mark-fg);
  --jn-settings-bg:    #EAEEF2;
  --jn-settings-fg:    #2E5266;

  /* Map Material's palette to a MIDNIGHT topbar (matches janison.com brand).
     In Material's variable naming: --md-primary-fg-color is the SURFACE
     colour of the header (background), --md-primary-bg-color is the TEXT
     colour on it. The names look backwards but that's Material's convention. */
  --md-primary-fg-color:            var(--jn-midnight);
  --md-primary-fg-color--light:     #1B2330;
  --md-primary-fg-color--dark:      #00131D;
  --md-primary-bg-color:            #ffffff;
  --md-primary-bg-color--light:     rgba(255, 255, 255, 0.7);

  --md-accent-fg-color:             var(--jn-teal);
  --md-accent-fg-color--transparent: var(--jn-teal-tint);
  --md-accent-bg-color:             #ffffff;

  --md-default-fg-color:            var(--jn-ink);
  --md-default-fg-color--light:     var(--jn-ink-2);
  --md-default-fg-color--lighter:   var(--jn-ink-3);
  --md-default-fg-color--lightest:  var(--jn-border);

  --md-typeset-a-color:             var(--jn-teal-dark);
}

/* ============================================================
   Custom search modal (replaces Material's built-in search).
   Matches the search prototype: synonym hints, AI row, section
   filters, prototype-styled result cards.
   ============================================================ */
.jn-search-modal-bg {
  position: fixed; inset: 0;
  background: rgba(10, 30, 25, 0.4);
  backdrop-filter: blur(2px);
  display: none;
  align-items: flex-start;
  justify-content: center;
  padding: 80px 16px 16px;
  z-index: 1000;
}
.jn-search-modal-bg.open { display: flex; }
.jn-search-modal {
  background: #ffffff;
  border-radius: 14px;
  width: 100%;
  max-width: 640px;
  max-height: calc(100vh - 100px);
  display: flex;
  flex-direction: column;
  overflow: hidden;
  box-shadow: 0 30px 60px -20px rgba(0, 30, 25, 0.25), 0 10px 20px -10px rgba(0, 30, 25, 0.15);
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}
.jn-search-input-wrap {
  padding: 14px 16px;
  border-bottom: 1px solid var(--jn-border);
  display: flex;
  align-items: center;
  gap: 12px;
}
.jn-search-icon { width: 20px; height: 20px; fill: var(--jn-ink-3); flex-shrink: 0; }
.jn-search-modal input {
  flex: 1;
  border: none;
  outline: none;
  font-size: 16px;
  color: var(--jn-ink);
  background: transparent;
  font-family: inherit;
}
/* Rendered as a <button> so touch readers have a visible way to close the
   modal, while it still reads as the keyboard hint on desktop. */
.jn-kbd {
  font-size: 11px;
  padding: 2px 6px;
  background: var(--jn-bg);
  border: 1px solid var(--jn-border);
  border-radius: 4px;
  color: var(--jn-ink-2);
  font-family: inherit;
  line-height: 1.4;
  cursor: pointer;
}
.jn-kbd:hover { border-color: var(--jn-border-2); color: var(--jn-ink); }
.jn-search-filters {
  padding: 10px 16px;
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  border-bottom: 1px solid var(--jn-border);
}
.jn-search-chip {
  font-size: 12px;
  padding: 4px 10px;
  background: #ffffff;
  border: 1px solid var(--jn-border);
  border-radius: 999px;
  color: var(--jn-ink-2);
  cursor: pointer;
  font-family: inherit;
}
.jn-search-chip:hover { border-color: var(--jn-border-2); }
.jn-search-chip.active { background: var(--jn-teal); color: #ffffff; border-color: var(--jn-teal); }
.jn-search-chip-count { margin-left: 4px; opacity: 0.7; font-size: 11px; }
.jn-search-results {
  flex: 1;
  overflow-y: auto;
  padding: 8px 8px 12px;
}
.jn-search-note {
  font-size: 11px;
  color: var(--jn-ink-3);
  padding: 6px 12px;
}
.jn-search-result {
  padding: 10px 12px;
  margin: 2px 4px;
  border-radius: 8px;
  cursor: pointer;
  display: flex;
  gap: 12px;
  align-items: flex-start;
  text-decoration: none !important;
  color: inherit;
}
.jn-search-result:hover { background: var(--jn-bg); text-decoration: none; }
/* Keyboard position in the result list. Arrow keys move this, so it has to
   read as clearly as :hover does. */
.jn-search-result--active { background: var(--jn-bg); text-decoration: none; box-shadow: inset 2px 0 0 var(--jn-teal); }

/* Matching headings within a result, so a hit lands on the heading it matched
   rather than the top of the page. Indented to line up with the title above.
   moveActive() applies .jn-search-result--active to whichever row is the
   keyboard position, heading rows included, so the rule above covers both. */
.jn-search-sections {
  margin: 0 4px 6px 66px;
  display: flex;
  flex-direction: column;
}
.jn-search-section {
  display: flex;
  gap: 8px;
  padding: 5px 10px;
  border-radius: 6px;
  border-left: 2px solid var(--jn-border);
  color: var(--jn-ink-2);
  text-decoration: none !important;
}
.jn-search-section:hover {
  background: var(--jn-bg);
  border-left-color: var(--jn-teal);
}
.jn-search-section__hash {
  color: var(--jn-ink-3);
  font-size: 12px;
  line-height: 1.6;
  flex-shrink: 0;
}
.jn-search-section__body { min-width: 0; }
.jn-search-section__title {
  display: block;
  font-size: 13px;
  color: var(--jn-ink);
}
.jn-search-section__snippet {
  display: block;
  font-size: 12px;
  color: var(--jn-ink-3);
  line-height: 1.45;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.jn-search-section--hidden { display: none; }
.jn-search-more {
  align-self: flex-start;
  margin: 3px 0 0 12px;
  padding: 2px 8px;
  font-family: inherit;
  font-size: 11px;
  background: none;
  border: none;
  border-radius: 4px;
  color: var(--jn-teal-dark);
  cursor: pointer;
}
.jn-search-more:hover { background: var(--jn-teal-tint); }
.jn-search-thumb {
  width: 38px; height: 38px;
  border-radius: 8px;
  background: var(--jn-bg);
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
  color: var(--jn-ink-2);
}
.jn-search-thumb svg { width: 18px; height: 18px; fill: currentColor; }
.jn-search-thumb.video { background: #fff3e0; color: #a16410; }
.jn-search-body { flex: 1; min-width: 0; }
.jn-search-title { font-size: 14px; font-weight: 500; color: var(--jn-ink); margin: 0 0 2px; }
.jn-search-snippet { font-size: 12.5px; color: var(--jn-ink-2); line-height: 1.5; }
.jn-search-snippet mark,
.jn-search-title mark {
  background: rgba(0, 168, 141, 0.18);
  color: inherit;
  padding: 0 2px;
  border-radius: 2px;
}
.jn-search-meta {
  display: flex; align-items: center; gap: 8px; margin-top: 6px;
  flex-wrap: wrap;
}
.jn-search-badge {
  font-size: 10px; padding: 2px 8px; border-radius: 999px;
  background: var(--jn-bg); color: var(--jn-ink-2);
  text-transform: uppercase; letter-spacing: 0.05em; font-weight: 600;
}
.jn-search-badge.video { background: #fff3e0; color: #a16410; }
.jn-search-url {
  font-size: 11px; color: var(--jn-ink-3);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.jn-search-empty {
  text-align: center; padding: 32px 16px;
  color: var(--jn-ink-3); font-size: 13px;
}
.jn-search-empty .q { color: var(--jn-ink); font-weight: 500; }
.jn-search-hint { font-size: 12px; margin-top: 8px; color: var(--jn-ink-3); }
.jn-search-footer {
  padding: 10px 16px;
  border-top: 1px solid var(--jn-border);
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 11px;
  color: var(--jn-ink-3);
  background: var(--jn-bg);
}
.jn-search-brand { display: flex; align-items: center; gap: 6px; }
.jn-search-dot {
  width: 8px; height: 8px; background: var(--jn-teal); border-radius: 50%;
}

/* ============================================================
   Dark mode (Material's "slate" scheme)
   Redefines our brand variables for a dark palette so all the
   custom CSS that uses var(--jn-*) automatically adapts. Plus a
   few targeted overrides for places where we'd hardcoded white.
   ============================================================ */
[data-md-color-scheme="slate"] {
  /* Brand: brighten teal slightly so it pops against dark backgrounds */
  --jn-midnight:    #F1F4F7;        /* now the "primary text" colour in dark mode */
  --jn-midnight-2:  #2A3340;
  --jn-teal:        #3DC9AE;
  --jn-teal-light:  #A8E8DA;
  --jn-teal-dark:   #7DDFC8;        /* lighter, not darker, so it reads on dark */
  --jn-teal-tint:   rgba(61, 201, 174, 0.16);

  /* Neutrals — inverted for dark mode */
  --jn-ink:         #E2E7EB;        /* body text */
  --jn-ink-2:       #B0B8BF;        /* secondary text */
  --jn-ink-3:       #7B848E;        /* tertiary / labels */
  --jn-bg:          #1C242F;        /* subtle surface */
  --jn-border:      rgba(255, 255, 255, 0.10);
  --jn-border-2:    rgba(255, 255, 255, 0.18);

  /* Map Material's palette away from the WHITE topbar of light mode */
  --md-primary-fg-color:            #0F1620;
  --md-primary-fg-color--light:     #1B2330;
  --md-primary-fg-color--dark:      #0A0F18;
  --md-primary-bg-color:            var(--jn-ink);
  --md-accent-bg-color:             #0F1620;
  --md-default-bg-color:            #141C26;
  --md-default-fg-color:            var(--jn-ink);
  --md-default-fg-color--light:     var(--jn-ink-2);
  --md-default-fg-color--lighter:   var(--jn-ink-3);
  --md-typeset-a-color:             var(--jn-teal-dark);
}

/* Override the explicit white backgrounds in dark mode */
[data-md-color-scheme="slate"] .md-header {
  background-color: #0F1620 !important;
  color: var(--jn-ink) !important;
}
[data-md-color-scheme="slate"] .md-tabs {
  background-color: #0F1620 !important;
  color: var(--jn-ink-2) !important;
  border-bottom: 1px solid var(--jn-border) !important;
}
[data-md-color-scheme="slate"] .md-tabs__item a {
  color: var(--jn-ink-2) !important;
}
[data-md-color-scheme="slate"] .md-tabs__item--active a,
[data-md-color-scheme="slate"] .md-tabs__link--active {
  color: var(--jn-teal) !important;
}
[data-md-color-scheme="slate"] .md-search__input {
  background-color: var(--jn-bg) !important;
  color: var(--jn-ink) !important;
}

/* The custom search modal. Its panel is hardcoded white in light mode, and
   several of its parts sit on var(--jn-bg), which flips to a dark surface under
   slate - so without these the modal was near-white text on a white panel
   (about 1.25:1) and the hover state was invisible. Surfaces match .jn-card
   and .jn-tile so the modal reads as part of the same dark theme. */
[data-md-color-scheme="slate"] .jn-search-modal-bg {
  background: rgba(0, 0, 0, 0.6);
}
[data-md-color-scheme="slate"] .jn-search-modal {
  background: #1C242F;
  box-shadow: 0 30px 60px -20px rgba(0, 0, 0, 0.6), 0 10px 20px -10px rgba(0, 0, 0, 0.5);
}
[data-md-color-scheme="slate"] .jn-kbd,
[data-md-color-scheme="slate"] .jn-search-chip {
  background: #141C26;
  border-color: rgba(255, 255, 255, 0.12);
}
/* The bright dark-mode teal needs dark text on it, not white. */
[data-md-color-scheme="slate"] .jn-search-chip.active {
  background: var(--jn-teal);
  color: #0F1620;
  border-color: var(--jn-teal);
}
/* var(--jn-bg) equals the panel colour under slate, so hover and the keyboard
   position would both be invisible. */
[data-md-color-scheme="slate"] .jn-search-result:hover,
[data-md-color-scheme="slate"] .jn-search-result--active {
  background: rgba(255, 255, 255, 0.06);
}
[data-md-color-scheme="slate"] .jn-search-section:hover {
  background: rgba(255, 255, 255, 0.06);
}
[data-md-color-scheme="slate"] .jn-search-badge {
  background: rgba(255, 255, 255, 0.09);
  color: var(--jn-ink-2);
}
[data-md-color-scheme="slate"] .jn-search-snippet mark,
[data-md-color-scheme="slate"] .jn-search-title mark {
  background: rgba(61, 201, 174, 0.28);
}
[data-md-color-scheme="slate"] .jn-search-footer {
  background: #141C26;
  border-top-color: rgba(255, 255, 255, 0.10);
}

/* Sidebar background and sticky labels in dark mode */
[data-md-color-scheme="slate"] .md-sidebar--primary {
  background: var(--md-default-bg-color) !important;
}

/* Hero in dark mode — needs an explicit dark background because the
   --jn-midnight variable has been inverted to a light text colour for
   dark mode. The teal accent on "help" still pops nicely against this. */
[data-md-color-scheme="slate"] .jn-hero {
  background-color: #0F1620 !important;
  color: #ffffff !important;
}
[data-md-color-scheme="slate"] .jn-hero h1 {
  color: #ffffff;
}
[data-md-color-scheme="slate"] .jn-hero p.jn-hero-sub {
  color: rgba(255, 255, 255, 0.78);
}
[data-md-color-scheme="slate"] .jn-hero-chips {
  color: rgba(255, 255, 255, 0.7);
}
[data-md-color-scheme="slate"] .jn-chip {
  background: rgba(255, 255, 255, 0.08);
  border-color: rgba(255, 255, 255, 0.2);
  color: rgba(255, 255, 255, 0.9);
}
[data-md-color-scheme="slate"] .jn-chip:hover {
  background: rgba(61, 201, 174, 0.18);
  border-color: var(--jn-teal);
  color: #ffffff;
}
/* Hero search bar still white in dark mode — it's a contrasting card.
   But the placeholder text needs to read against the white bg. */
[data-md-color-scheme="slate"] .jn-hero-searchbar {
  background: #ffffff;
}
[data-md-color-scheme="slate"] .jn-hero-searchbar__placeholder {
  color: #6B7280;
}

/* Homepage area cards in dark mode — switch from white to dark surface
   so the description text reads with proper contrast. */
[data-md-color-scheme="slate"] .jn-card {
  background: #1C242F;
  border-color: rgba(255, 255, 255, 0.08);
}
[data-md-color-scheme="slate"] .jn-card:hover {
  border-color: var(--jn-teal);
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.4);
}
[data-md-color-scheme="slate"] .jn-card h3 {
  color: #F1F4F7;
}
[data-md-color-scheme="slate"] .jn-card p {
  color: #C2C9D0;
}
[data-md-color-scheme="slate"] .jn-card-count {
  color: var(--jn-teal);
}
[data-md-color-scheme="slate"] .md-nav .md-nav .md-nav__title,
[data-md-color-scheme="slate"] .md-nav__item--nested > .md-nav > .md-nav__title {
  background: var(--md-default-bg-color) !important;
  color: var(--jn-ink-3) !important;
}

/* Admonitions: keep the brand-tinted backgrounds but make them readable */
[data-md-color-scheme="slate"] .md-typeset .admonition,
[data-md-color-scheme="slate"] .md-typeset details {
  background: rgba(255, 255, 255, 0.04);
  color: var(--jn-ink);
}
[data-md-color-scheme="slate"] .md-typeset .admonition.tip,
[data-md-color-scheme="slate"] .md-typeset .admonition.note {
  background: rgba(61, 201, 174, 0.10);
  color: var(--jn-ink);
}
[data-md-color-scheme="slate"] .md-typeset .admonition.tip > .admonition-title,
[data-md-color-scheme="slate"] .md-typeset .admonition.note > .admonition-title {
  color: var(--jn-teal-dark);
}
[data-md-color-scheme="slate"] .md-typeset .admonition.warning,
[data-md-color-scheme="slate"] .md-typeset .admonition.important {
  background: rgba(240, 180, 41, 0.10);
  color: #F5D896;
  border-color: #F0B429;
}
[data-md-color-scheme="slate"] .md-typeset .admonition.warning > .admonition-title,
[data-md-color-scheme="slate"] .md-typeset .admonition.important > .admonition-title {
  color: #F5D896;
}

/* Tiles & cards in dark mode */
[data-md-color-scheme="slate"] .md-typeset a.jn-subarea-card,
[data-md-color-scheme="slate"] .md-typeset a.jn-subarea-card:visited {
  background: var(--jn-bg);
  border-color: var(--jn-border);
}
[data-md-color-scheme="slate"] .md-typeset .jn-subarea-card__title {
  color: var(--jn-midnight);
}
[data-md-color-scheme="slate"] .md-typeset .jn-subarea-card__desc {
  color: var(--jn-ink-2);
}
[data-md-color-scheme="slate"] .md-typeset .jn-subarea-card__icon {
  background: rgba(61, 201, 174, 0.15);
  color: var(--jn-teal);
}

/* Code blocks readability in dark mode */
[data-md-color-scheme="slate"] .md-typeset code {
  background: rgba(255, 255, 255, 0.08);
  color: var(--jn-ink);
}

/* Table borders / header in dark mode */
[data-md-color-scheme="slate"] .md-typeset table:not([class]) {
  border-color: var(--jn-border);
}
[data-md-color-scheme="slate"] .md-typeset table:not([class]) th {
  background: var(--jn-bg);
  color: var(--jn-midnight);
}

/* Belt-and-braces: force markdown content links visible. Something is
   causing plain link text inside bullet lists to render as white on
   some pages (only shows on hover). Pinning the colour explicitly here
   bypasses whatever's winning the cascade. */
.md-content .md-typeset a:not(.jn-subarea-card):not(.md-button):not(.md-content__button),
.md-content .md-typeset a:not(.jn-subarea-card):not(.md-button):not(.md-content__button):visited {
  color: var(--jn-teal-dark);
}
.md-content .md-typeset a:not(.jn-subarea-card):not(.md-button):not(.md-content__button):hover {
  color: var(--jn-teal);
}

/* ============================================================
   Top header (white with teal accent stripe)
   ============================================================ */

/* Dark midnight header — matches janison.com brand treatment. */
.md-header {
  color: #ffffff;
  background-color: var(--jn-midnight);
  border-bottom: 0;
  box-shadow: none;
}
.md-header[data-md-state="shadow"] {
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
}
.md-header__title {
  font-weight: 500;
  color: #ffffff;
}
.md-header__topic:first-child {
  font-weight: 500;
  color: #ffffff;
}
.md-header__topic .md-ellipsis {
  color: #ffffff;
}
.md-header__button {
  color: #ffffff;
}
.md-header__button:hover {
  color: var(--jn-teal);
}

/* Custom "Release notes" and "Contact support" links injected via extra.js */
.md-header .jn-header-link {
  color: #ffffff;
  font-size: 14px;
  text-decoration: none;
  padding: 8px 14px;
  border-radius: 6px;
  white-space: nowrap;
  margin-left: 4px;
  transition: color 0.15s ease, background 0.15s ease;
}
.md-header .jn-header-link:hover {
  color: var(--jn-teal);
  background: rgba(255, 255, 255, 0.06);
}
/* Hide them on narrow viewports — search/hamburger take precedence. */
@media screen and (max-width: 60em) {
  .md-header .jn-header-link {
    display: none;
  }
}

/* Search input — dark themed for the midnight header */
.md-search__input {
  background-color: rgba(255, 255, 255, 0.10);
  color: #ffffff;
  border: 1px solid rgba(255, 255, 255, 0.15);
  border-radius: 8px;
}
.md-search__input::placeholder {
  color: rgba(255, 255, 255, 0.6);
}
.md-search__input + .md-search__icon {
  color: rgba(255, 255, 255, 0.7);
}
.md-search__form {
  background: transparent;
}
.md-search__form:hover {
  background: transparent;
}
[data-md-toggle="search"]:checked ~ .md-header .md-search__form {
  background: transparent;
}

/* Tabs row (top nav under the header) — also midnight to flow with header */
.md-tabs {
  background-color: var(--jn-midnight);
  color: rgba(255, 255, 255, 0.85);
  border-bottom: 0;
}
.md-tabs__list { padding-left: 0; }
.md-tabs__item a {
  color: rgba(255, 255, 255, 0.85);
  opacity: 1;
}
.md-tabs__item--active a,
.md-tabs__link--active {
  color: var(--jn-teal) !important;
  font-weight: 500;
}
.md-tabs__link:hover {
  color: var(--jn-teal);
}

/* Tabs row visible at every viewport — Material hides it on phone widths
   by default, but on a mobile-first help site users need constant
   area-switching access (especially on landing pages where the drawer
   is intentionally hidden). On narrow viewports the row becomes
   horizontally scrollable so the seven tabs don't crowd the header. */
.md-tabs {
  display: block !important;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;       /* Firefox */
}
.md-tabs::-webkit-scrollbar {
  display: none;                /* Chrome/Safari */
}
.md-tabs__list {
  display: flex !important;
  flex-wrap: nowrap !important;
  padding-left: 0;
}

@media screen and (min-width: 60em) {
  /* When tabs are showing, the hamburger button is redundant — it opens
     a drawer that contains the same items that are already visible as
     tabs. Hide it to remove a dead-end interaction. Multiple selectors
     for robustness across Material versions. */
  .md-header__button[for="__drawer"],
  label.md-header__button[for="__drawer"],
  .md-header__button.md-icon[for="__drawer"],
  [for="__drawer"].md-header__button {
    display: none !important;
    visibility: hidden !important;
  }
}

/* ============================================================
   Sidebar (left nav) — matches the prototype's treatment
   ============================================================ */

.md-sidebar {
  font-size: 13.5px;
}
.md-sidebar--primary {
  border-right: 1px solid var(--jn-border);
}

/* Mobile drawer is handled by Material's own CSS. Our earlier heavy-
   handed overrides here were causing layout issues on phone viewports
   (the sidebar was reserving space in the grid even when off-screen).
   Now that the sidebar is back in the DOM (we stopped suppressing the
   site_nav block in home.html), Material's native drawer mechanism
   does the right thing on its own. */

/* Section title inside an expanded section — "MARK" uppercase style.
   Scoped to the INNER nav title (data-md-level="1"+) so we don't disturb
   the top-level title that Material hides on desktop.
   display: block !important is required to override Material's default of
   hiding nested nav titles on desktop (they're normally just toggle labels).
   position: sticky + a solid background keeps the label pinned to the top
   of the sidebar as the menu scrolls, with menu items scrolling *under*
   the label rather than over it. */
.md-nav .md-nav .md-nav__title,
.md-nav__item--nested > .md-nav > .md-nav__title {
  display: block !important;
  position: sticky !important;
  top: 0 !important;
  z-index: 2 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.08em !important;
  text-align: left !important;
  font-size: 11px !important;
  font-weight: 600 !important;
  color: var(--jn-ink-3) !important;
  padding: 12px 12px 8px !important;
  margin: 0 !important;
  background: #ffffff !important;
  box-shadow: none !important;
  height: auto !important;
  line-height: 1.4;
}

/* Hide the chevron inside the section title — pushes the label rightward. */
.md-nav .md-nav .md-nav__title .md-nav__icon,
.md-nav__item--nested > .md-nav > .md-nav__title .md-nav__icon {
  display: none !important;
}

/* Disable sticky positioning on the section title at mobile widths.
   In the mobile drawer, sticky behaves unpredictably (the title gets
   pinned partway down the scroll area, overlapping menu items). The
   drawer is short enough that scrolling the title with the items
   reads fine. */
@media screen and (max-width: 60em) {
  .md-nav .md-nav .md-nav__title,
  .md-nav__item--nested > .md-nav > .md-nav__title {
    position: static !important;
    top: auto !important;
    z-index: auto !important;
  }
}

/* Hide all chevron / toggle icons in the primary sidebar. With our
   nav structure (tabs at top + scoped sidebar showing only the active
   sub-area's pages), nothing in the sidebar needs to be expanded or
   collapsed — every visible item is a direct page link. The chevrons
   are vestigial and were leaving empty visual gaps. */
.md-sidebar--primary .md-nav__icon {
  display: none !important;
}

/* Hide the toggle-label elements (the <label for="__nav_N"> siblings
   of section links). The icon hide above only removed the visual chevron;
   the label itself is still a clickable area that would collapse the
   section's nested nav. Removing it prevents accidental click-to-collapse
   which would leave the user without a visible menu. */
.md-sidebar--primary label.md-nav__link[for^="__nav_"] {
  display: none !important;
}

/* Hide the level-0 sidebar title ("Janison Insights help") on desktop.
   Material's default does this but my earlier `display: block !important`
   was overriding it — restoring the intended behaviour explicitly. */
@media screen and (min-width: 76.25em) {
  .md-sidebar--primary .md-nav--primary > .md-nav__title {
    display: none !important;
  }
}

/* Hide the redundant level-0 section link ("Mark") in the sidebar —
   the section name is already shown as a tab at the top, so showing it
   again above its own children is duplication.
   Scoped to ≥60em so this ONLY fires when tabs are visible. Below 60em
   the tabs are hidden and the hamburger drawer needs these level-0
   items because the drawer is the only way to navigate between areas. */
@media screen and (min-width: 60em) {
  .md-sidebar--primary .md-nav--primary > .md-nav__list > .md-nav__item--section > .md-nav__container,
  .md-sidebar--primary .md-nav--primary > .md-nav__list > .md-nav__item--section > .md-nav__link.md-nav__container {
    display: none !important;
  }
}

/* Hide the redundant section title at level 2+ — when a sub-section
   (e.g. Author → Guides related to tests) is active, its name already
   appears as the active link in the parent nav. Repeating the name
   below as a section header is pure duplication. The level-1 title
   (the area label like "MARK" / "AUTHOR") stays visible. */
@media screen and (min-width: 60em) {
  .md-sidebar--primary nav.md-nav[data-md-level="2"] > .md-nav__title,
  .md-sidebar--primary nav.md-nav[data-md-level="3"] > .md-nav__title,
  .md-sidebar--primary nav.md-nav[data-md-level="4"] > .md-nav__title {
    display: none !important;
  }
}

/* When inside a sub-section (e.g. Author → Tests), hide inactive
   siblings of that sub-section so the user only sees pages from the
   sub-area they're currently in. The user switches sub-areas via the
   parent area's landing tiles.
   The class on a "has children" item is `md-nav__item--nested` (not
   `--section` as I'd initially guessed — confirmed by inspecting the
   rendered DOM). The :has() check ensures this only fires when the
   parent area contains an active nested sub-section, so Mark's
   flat-children case (sub-pages are leaves, not nested) is unaffected. */
.md-sidebar--primary nav.md-nav:has(> ul > .md-nav__item--nested.md-nav__item--active) > ul > .md-nav__item:not(.md-nav__item--active) {
  display: none !important;
}

.md-nav__list {
  padding: 0;
  margin: 0;
}

.md-nav__item {
  padding: 0 8px 0 0;
  margin: 0;
}

/* All nav links — base state (matches prototype's plain item) */
.md-nav__link,
.md-nav__item > .md-nav__link {
  display: block !important;
  color: var(--jn-ink-2) !important;
  padding: 6px 12px !important;
  margin: 1px 0 !important;
  border-radius: 6px !important;
  border-left: 2px solid transparent !important;
  font-size: 13.5px !important;  /* matches prototype left-nav size */
  font-weight: 400 !important;
  line-height: 1.4 !important;
  text-decoration: none;
  transition: background 0.12s ease, color 0.12s ease;
}

/* Hover state — soft grey background, dark text */
.md-nav__link:hover,
.md-nav__link:focus {
  background: var(--jn-bg) !important;
  color: var(--jn-midnight) !important;
  text-decoration: none;
}

/* Active page — green-tinted pill with teal stripe and dark teal text.
   Scoped to <a> only — Material also renders a <label> on the active item
   to toggle an in-sidebar TOC, which would otherwise pick up this pill
   styling and visually duplicate the active entry. */
a.md-nav__link--active,
a.md-nav__link--active:hover,
a.md-nav__link--active:focus,
a[aria-current="page"].md-nav__link {
  background: var(--jn-teal-tint) !important;
  color: var(--jn-teal-dark) !important;
  font-weight: 600 !important;
  border-left: 2px solid var(--jn-teal) !important;
  border-radius: 0 6px 6px 0 !important;
}

/* Hide the in-sidebar TOC toggle (label + nested nav) on the active page.
   The "On this page" TOC is shown on the right of the content via toc.follow,
   so the sidebar copy is redundant and is what produces the duplicate active
   item. Hiding it leaves a single clean active link. */
.md-sidebar--primary label.md-nav__link[for="__toc"] {
  display: none !important;
}
.md-sidebar--primary .md-nav__item--active > nav.md-nav--secondary {
  display: none !important;
}

/* Right TOC ("On this page") — subtler treatment */
.md-sidebar--secondary .md-nav__title {
  color: var(--jn-ink-3) !important;
}
.md-sidebar--secondary .md-nav__link {
  border-left: 2px solid transparent !important;
  background: transparent !important;
  padding: 4px 12px !important;
}
.md-sidebar--secondary .md-nav__link:hover {
  background: transparent !important;
  color: var(--jn-midnight) !important;
  border-left-color: var(--jn-border-2) !important;
}
.md-sidebar--secondary .md-nav__link--active,
.md-sidebar--secondary .md-nav__link--active:hover {
  color: var(--jn-teal-dark) !important;
  background: transparent !important;
  border-left: 2px solid var(--jn-teal) !important;
  border-radius: 0 !important;
  font-weight: 500 !important;
}

/* ============================================================
   Content typography (matches prototype sizes)
   ============================================================ */

.md-typeset {
  font-size: 16px;               /* matches prototype body size */
  line-height: 1.65;
  color: var(--jn-ink);
}

/* Breadcrumbs (navigation.path) — sit above the H1 */
.md-path,
.md-path__list,
.md-path__item,
.md-path__link {
  font-size: 13px !important;
}
.md-typeset h1,
.md-typeset h2,
.md-typeset h3,
.md-typeset h4 {
  color: var(--jn-midnight);
  font-weight: 600;
  letter-spacing: -0.01em;
}
.md-typeset h1 {
  font-size: 30px;               /* matches prototype */
  margin: 0 0 0.4em;
  line-height: 1.2;
}
.md-typeset h2 {
  font-size: 22px;               /* matches prototype */
  margin: 1.2em 0 0.5em;         /* tightened — was 2em, felt too airy */
  scroll-margin-top: 100px;      /* header (~38px) + sticky tabs (~38px) + buffer */
}
.md-typeset h3 {
  font-size: 17px;               /* proportional to h1/h2 */
  margin: 1.6em 0 0.5em;
  scroll-margin-top: 100px;
}
.md-typeset h4 {
  font-size: 15px;
  margin: 1.4em 0 0.4em;
  scroll-margin-top: 100px;
}
.md-typeset p {
  margin: 0 0 0.9em;
}
.md-typeset strong {
  color: var(--jn-midnight);
  font-weight: 600;
}
.md-typeset ul,
.md-typeset ol {
  margin: 0 0 1em;
  padding-left: 1.5em;
}
.md-typeset li {
  margin-bottom: 0.3em;
}

[data-md-color-scheme="slate"] .md-typeset h1,
[data-md-color-scheme="slate"] .md-typeset h2,
[data-md-color-scheme="slate"] .md-typeset h3,
[data-md-color-scheme="slate"] .md-typeset h4 {
  color: var(--jn-teal-light);
}

/* ============================================================
   Admonitions (tip/warning/info — match the prototype)
   ============================================================ */

.md-typeset .admonition,
.md-typeset details {
  border: 0;
  border-left: 4px solid;
  border-radius: 0 8px 8px 0;
  padding: 14px 18px;
  font-size: 14.5px;            /* matches prototype */
  line-height: 1.55;
  background: var(--jn-bg);
  box-shadow: none;
}
.md-typeset .admonition > .admonition-title,
.md-typeset details > summary {
  display: flex;                /* matches prototype: icon + label inline */
  align-items: center;
  gap: 8px;
  font-weight: 600;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin: 0 0 6px;
  padding: 0;
  background: transparent;
  border: 0;
}
/* Show the Material SVG icon, sized and colour-matched to the label.
   Material normally absolute-positions this ::before — we override to
   relative so it flows as a flex child of the title, sitting next to the
   text with the gap defined on the title. Background-color (not transparent)
   carries the mask-image's tint, picked up from currentColor. */
.md-typeset .admonition > .admonition-title::before,
.md-typeset details > summary::before {
  background-color: currentColor !important;
  width: 16px !important;
  height: 16px !important;
  position: relative !important;
  top: auto !important;
  left: auto !important;
  margin: 0 !important;
  flex-shrink: 0;
}
.md-typeset .admonition p:last-child,
.md-typeset details p:last-child {
  margin-bottom: 0;
}

/* Tip (default brand) */
.md-typeset .admonition.tip,
.md-typeset details.tip,
.md-typeset .admonition.note,
.md-typeset details.note {
  border-color: var(--jn-teal);
  background: var(--jn-teal-tint);
  color: var(--jn-midnight);
}
.md-typeset .admonition.tip > .admonition-title,
.md-typeset .admonition.note > .admonition-title { color: var(--jn-teal-dark); }

/* Warning / important */
.md-typeset .admonition.warning,
.md-typeset details.warning,
.md-typeset .admonition.important,
.md-typeset details.important {
  border-color: #F0B429;
  background: #FFF8E6;
  color: #5A4500;
}
.md-typeset .admonition.warning > .admonition-title,
.md-typeset .admonition.important > .admonition-title { color: #5A4500; }

/* Info */
.md-typeset .admonition.info,
.md-typeset details.info {
  border-color: var(--jn-deliver-fg);
  background: var(--jn-deliver-bg);
}
.md-typeset .admonition.info > .admonition-title { color: var(--jn-deliver-fg); }

/* Danger */
.md-typeset .admonition.danger,
.md-typeset details.danger {
  border-color: var(--jn-report-fg);
  background: var(--jn-report-bg);
}
.md-typeset .admonition.danger > .admonition-title { color: var(--jn-report-fg); }

/* ============================================================
   Review admonitions — hot pink so they stand out from content
   notes during the review/approval workflow.
   Types: changed  (pencil icon)
          added    (plus icon)
          removed  (bin icon — for suggested removals and missing images)
   ============================================================ */
:root {
  --md-admonition-icon--changed: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z'/%3E%3C/svg%3E");
  --md-admonition-icon--added:   url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z'/%3E%3C/svg%3E");
  --md-admonition-icon--removed: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z'/%3E%3C/svg%3E");
}
.md-typeset .admonition.changed,
.md-typeset .admonition.added,
.md-typeset .admonition.removed {
  border-color: #d81b60;
  background: #fce4ef;
}
.md-typeset .admonition.changed > .admonition-title,
.md-typeset .admonition.added > .admonition-title,
.md-typeset .admonition.removed > .admonition-title {
  background-color: rgba(216, 27, 96, 0.12);
  color: #880e4f;
}
.md-typeset .admonition.changed > .admonition-title::before {
  background-color: #d81b60;
  -webkit-mask-image: var(--md-admonition-icon--changed);
          mask-image: var(--md-admonition-icon--changed);
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-size: contain;
          mask-size: contain;
}
.md-typeset .admonition.added > .admonition-title::before {
  background-color: #d81b60;
  -webkit-mask-image: var(--md-admonition-icon--added);
          mask-image: var(--md-admonition-icon--added);
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-size: contain;
          mask-size: contain;
}
.md-typeset .admonition.removed > .admonition-title::before {
  background-color: #d81b60;
  -webkit-mask-image: var(--md-admonition-icon--removed);
          mask-image: var(--md-admonition-icon--removed);
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-size: contain;
          mask-size: contain;
}
/* Dark mode */
[data-md-color-scheme="slate"] .md-typeset .admonition.changed,
[data-md-color-scheme="slate"] .md-typeset .admonition.added,
[data-md-color-scheme="slate"] .md-typeset .admonition.removed {
  background: rgba(216, 27, 96, 0.10);
  color: var(--jn-ink);
}
[data-md-color-scheme="slate"] .md-typeset .admonition.changed > .admonition-title,
[data-md-color-scheme="slate"] .md-typeset .admonition.added > .admonition-title,
[data-md-color-scheme="slate"] .md-typeset .admonition.removed > .admonition-title {
  color: #f48fb1;
}

/* ============================================================
   Code & tables
   ============================================================ */

.md-typeset code {
  background: #F0F2F3;
  color: var(--jn-midnight);
  padding: 1px 6px;
  border-radius: 4px;
  font-size: 0.85em;
}
.md-typeset pre {
  background: var(--jn-bg);
  border: 1px solid var(--jn-border);
  border-radius: 8px;
}
.md-typeset pre > code {
  background: transparent;
  padding: 0;
}

.md-typeset__table,
.md-typeset table:not([class]) {
  font-size: 16px !important;     /* match body, override Material's 0.64rem default */
}
.md-typeset table:not([class]) {
  border: 1px solid var(--jn-border);
  border-radius: 8px;
  overflow: hidden;
}
.md-typeset table:not([class]) th {
  background: var(--jn-bg);
  color: var(--jn-midnight);
  font-weight: 600;
}
.md-typeset table:not([class]) td,
.md-typeset table:not([class]) th {
  border-color: var(--jn-border);
}

/* ============================================================
   "Last updated" footer date — subtle pill style
   ============================================================ */

.md-source-file__fact,
.md-source-file {
  font-size: 12px;
  color: var(--jn-ink-3);
}

/* The "Last updated" row injected by extra.js under the H1.
   Matches the content-page prototype: 12px grey, calendar icon, optional
   "Up to date" pill in the same green-tint treatment as the active nav state. */
.jn-last-updated {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: var(--jn-ink-3);
  margin: 0 0 24px;
}
.jn-last-updated__icon {
  width: 14px;
  height: 14px;
  fill: currentColor;
  flex-shrink: 0;
}
.jn-last-updated__pill {
  background: var(--jn-teal-tint);
  color: var(--jn-teal-dark);
  padding: 2px 8px;
  border-radius: 999px;
  font-weight: 500;
  margin-left: 4px;
}

/* ============================================================
   Content images — a 1px frame on every <img> inside content.
   Uses box-shadow rather than border so the image's content box
   isn't shrunk by 2px (Material uses box-sizing: border-box, which
   would cause the browser to scale a 600px image down to 598px and
   make screenshots — particularly any with text — look blurry).
   Excludes emoji/icon images, which would look wrong with a frame. */
.md-typeset img:not(.emojione):not(.twemoji):not(.gemoji) {
  box-shadow: 0 0 0 1px var(--jn-border);
  border-radius: 4px;
  max-width: 100%;
  height: auto;
}
.md-typeset .twemoji img,
.md-typeset .emojione img,
.md-typeset .gemoji img {
  box-shadow: none;
  border-radius: 0;
}

/* ============================================================
   Generic tile grid — "pick one of these to go to" pattern.
   Mirrors the homepage area-card design (.jn-card): tinted icon
   square at the top, bold title with a period, one-line
   description, teal text-link CTA at the bottom.

   Authoring pattern:

     <div class="jn-tile-grid" markdown>

     <div class="jn-tile" markdown>

     <div class="jn-tile__icon jn-tile__icon--users" markdown>
     :material-account-group:
     </div>

     **Users.**

     User accounts, groups, orgs, roles, and membership.

     [Open Swagger →](https://...){ .jn-tile__cta }

     </div>

     </div>

   Use a modifier class on .jn-tile__icon to pick the tint —
   --users / --events / --author exist here; add new ones below
   if other pages need different colours.

   3 columns on desktop, 1 column on mobile (skips the 2-column
   breakpoint — three tiles isn't enough to need it).
   ============================================================ */
.jn-tile-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
  margin: 24px 0 32px;
}

.jn-tile {
  position: relative;            /* anchor for stretched-link ::after */
  background: #ffffff;
  border: 1px solid var(--jn-border);
  border-radius: 12px;
  padding: 28px;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
  display: flex;
  flex-direction: column;
  transition: box-shadow 0.15s, transform 0.15s;
}
.jn-tile:hover {
  box-shadow: 0 8px 24px -8px rgba(0, 0, 0, 0.12);
  transform: translateY(-2px);
}

/* Standalone variant — a single tile in the middle of an article
   (e.g. the practice-test tile on item-type pages). The whole tile
   is clickable via a stretched ::after on .jn-tile__cta; the visible
   "Open practice test →" link stays in place for an obvious cue.
   .jn-tile already has position: relative, so the absolutely-positioned
   pseudo anchors to the tile, not to the link. */
.jn-tile--standalone {
  max-width: 640px;
  margin: 32px 0;
  cursor: pointer;
}

/* The pseudo-element on the CTA covers the entire tile. */
.jn-tile--standalone .jn-tile__cta::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
}

/* Everything else inside the tile (icon, title, description) sits
   above the click overlay so text remains selectable. The CTA itself
   is left at z-index: auto so its pseudo can escape to the tile. */
.jn-tile--standalone > *:not(.jn-tile__cta) {
  position: relative;
  z-index: 2;
}

/* Icon box — tinted rounded square at the top of the tile.
   Modifier classes set the tint via the area-colour tokens we
   already have for the homepage cards. */
.jn-tile__icon {
  width: 44px;
  height: 44px;
  border-radius: 8px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  margin: 0 0 22px;
  flex-shrink: 0;
}
.jn-tile__icon .twemoji {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
}
.jn-tile__icon .twemoji svg {
  width: 22px;
  height: 22px;
  fill: currentColor;
}
.jn-tile__icon--users    { background: var(--jn-people-bg);   color: var(--jn-people-fg); }
.jn-tile__icon--events   { background: var(--jn-mark-bg);     color: var(--jn-mark-fg); }
.jn-tile__icon--author   { background: var(--jn-author-bg);   color: var(--jn-author-fg); }
.jn-tile__icon--deliver  { background: var(--jn-deliver-bg);  color: var(--jn-deliver-fg); }
.jn-tile__icon--report   { background: var(--jn-report-bg);   color: var(--jn-report-fg); }
.jn-tile__icon--integration { background: var(--jn-integration-bg); color: var(--jn-integration-fg); }
/* Practice-test tiles use the Janison teal (same palette as the People
   area card) — signals "interactive / try it" without being too loud. */
.jn-tile__icon--practice { background: var(--jn-people-bg);   color: var(--jn-people-fg); }

/* First paragraph (just bold text) becomes the tile title.
   Matches the homepage .jn-card h3 sizing. */
.jn-tile > p:first-of-type {
  font-size: 22px;
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: -0.3px;
  color: var(--jn-ink);
  margin: 0 0 8px;
}
.jn-tile > p:first-of-type strong {
  font-weight: 600;
}

/* Description (the second paragraph). flex-grow pushes the CTA
   to the bottom so all three CTAs sit on the same baseline even
   if descriptions are uneven lengths. */
.jn-tile > p:nth-of-type(2) {
  color: var(--jn-ink-2);
  font-size: 15px;
  line-height: 1.55;
  margin: 0 0 20px;
  flex-grow: 1;
}

/* Teal text-link CTA — matches the homepage "N articles" treatment. */
.jn-tile__cta {
  display: inline-block;
  align-self: flex-start;
  color: var(--jn-teal-dark) !important;
  font-weight: 500;
  font-size: 14px;
  text-decoration: none !important;
  border-bottom: 0 !important;
  transition: color 0.15s;
}
.jn-tile__cta:hover {
  color: var(--jn-teal) !important;
}
.jn-tile__cta:focus {
  outline: 2px solid var(--jn-teal);
  outline-offset: 2px;
  border-radius: 2px;
}

/* Dark mode */
[data-md-color-scheme="slate"] .jn-tile {
  background: #1C242F;
  border-color: rgba(255, 255, 255, 0.08);
}
[data-md-color-scheme="slate"] .jn-tile > p:first-of-type {
  color: #ffffff;
}
[data-md-color-scheme="slate"] .jn-tile > p:nth-of-type(2) {
  color: rgba(255, 255, 255, 0.78);
}
[data-md-color-scheme="slate"] .jn-tile__cta {
  color: var(--jn-teal-light, var(--jn-teal)) !important;
}

/* Mobile — single column stack, tighter padding. */
@media screen and (max-width: 60em) {
  .jn-tile-grid {
    grid-template-columns: 1fr;
    gap: 16px;
  }
  .jn-tile {
    padding: 24px;
  }
  .jn-tile:hover {
    transform: none;  /* no lift on touch devices */
  }
  .jn-tile > p:first-of-type {
    font-size: 20px;
  }
}

/* ============================================================
   Related documents — styled grid of card-links used at the
   bottom of help pages.

   Authoring pattern:

     ## Related documents

     <div class="jn-related-docs" markdown>

     - [Add audio to an item](../items/audio.md)
     - [Stimuli](../items/stimuli.md)
     - [External page on WP](https://help.janison.com/...)

     </div>

   The CSS turns the bulleted list into a 2-column grid of
   card-links with a small arrow on the right. Internal links
   get a "→" and external links get a "↗" — this is detected
   automatically via the link's href, so authors don't have to
   tag links manually. External links also open in a new tab
   via the openExternalCtasInNewTab JS hook.
   ============================================================ */
/* The wrapper div gets a soft tinted background so the white cards sit
   on a visually distinct band, matching the design prototype. The H2
   above stays on the white page background — the contrast against the
   tinted section makes the "Related documents" heading visually anchor
   the band below it. */
.md-typeset .jn-related-docs {
  background: #F4F6F9;
  border-radius: 12px;
  padding: 24px;
  margin: 16px 0 24px;
}

/* Selectors are prefixed with `.md-typeset` so they win the specificity
   battle against Material's default `.md-typeset ul` / `.md-typeset li`
   rules. Without the prefix the bulleted list shape leaks through. */
.md-typeset .jn-related-docs ul {
  list-style: none !important;
  padding: 0 !important;
  margin: 0 !important;
  display: grid !important;
  grid-template-columns: repeat(2, 1fr) !important;
  /* Every row matches the tallest row's height — so a wrapping card in
     row 1 doesn't leave row 2's single-line cards looking stunted. */
  grid-auto-rows: 1fr !important;
  gap: 16px !important;
}

.md-typeset .jn-related-docs ul li {
  margin: 0 !important;
  padding: 0 !important;
}
/* Strip Material's default `::before` bullet that it applies via pseudo */
.md-typeset .jn-related-docs ul li::before {
  display: none !important;
  content: none !important;
}

/* Each list item becomes a card-link with a right-aligned arrow. */
.md-typeset .jn-related-docs ul li a {
  display: flex !important;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 20px 24px;
  /* Fill the grid cell — without this the <a> is sized to its content
     and short-text cards look stunted next to wrapping ones, even when
     the grid cells themselves are equal heights via grid-auto-rows: 1fr. */
  height: 100%;
  background: #ffffff;
  border: 1px solid var(--jn-border);
  border-radius: 8px;
  color: var(--jn-ink) !important;
  font-weight: 500;
  font-size: 15px;
  line-height: 1.4;
  text-decoration: none !important;
  border-bottom: 0 !important;             /* override Material's link underline */
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);  /* subtle default lift */
  transition: border-color 0.15s, transform 0.15s, box-shadow 0.15s;
}

.md-typeset .jn-related-docs ul li a:hover {
  border-color: var(--jn-teal);
  transform: translateY(-2px);
  box-shadow: 0 8px 24px -8px rgba(0, 0, 0, 0.12);
  color: var(--jn-ink) !important;
}
.md-typeset .jn-related-docs ul li a:focus {
  outline: 2px solid var(--jn-teal);
  outline-offset: 2px;
}

/* Arrow indicator — internal links get →, links to another site get ↗.
   The external ones are tagged with .jn-external by extra.js, which compares
   hostname. CSS cannot do that itself, and a URL-segment match no longer
   works: each product now lives at the same path its WordPress site used,
   so matching the segment flagged every internal link as external. */
.md-typeset .jn-related-docs ul li a::after {
  content: "→" !important;
  color: var(--jn-teal) !important;
  font-size: 18px !important;
  line-height: 1 !important;
  flex-shrink: 0 !important;
  transition: transform 0.15s !important;
  /* Reset any Material defaults on the pseudo */
  background: none !important;
  width: auto !important;
  height: auto !important;
  margin: 0 !important;
  vertical-align: baseline !important;
}
.md-typeset .jn-related-docs ul li a.jn-external::after {
  content: "↗" !important;
}
.md-typeset .jn-related-docs ul li a:hover::after {
  transform: translateX(2px) !important;
}
.md-typeset .jn-related-docs ul li a.jn-external:hover::after {
  transform: translate(2px, -2px) !important;
}

/* Dark mode */
[data-md-color-scheme="slate"] .md-typeset .jn-related-docs {
  background: rgba(255, 255, 255, 0.03);
}
[data-md-color-scheme="slate"] .md-typeset .jn-related-docs ul li a {
  background: #1C242F;
  border-color: rgba(255, 255, 255, 0.08);
  color: #ffffff !important;
}
[data-md-color-scheme="slate"] .md-typeset .jn-related-docs ul li a:hover {
  border-color: var(--jn-teal);
}

/* Mobile — single column, tighter padding on the container */
@media screen and (max-width: 48em) {
  .md-typeset .jn-related-docs {
    padding: 18px;
  }
  .md-typeset .jn-related-docs ul {
    grid-template-columns: 1fr !important;
    gap: 12px !important;
  }
}

/* ============================================================
   Release notes — vertical timeline of release cards.
   Each card has a version pill, date, headline, area-tagged
   sections, and a "Read full notes" link. */

.md-typeset .jn-release-meta {
  font-size: 13px;
  color: var(--jn-ink-2);
  background: var(--jn-bg);
  border: 1px solid var(--jn-border);
  border-radius: 8px;
  padding: 10px 14px;
  margin: 20px 0 0;
}

.md-typeset .jn-release {
  border: 1px solid var(--jn-border);
  border-radius: 14px;
  padding: 24px 26px;
  margin: 28px 0;
  background: #ffffff;
  position: relative;
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.md-typeset .jn-release:hover {
  border-color: var(--jn-border-2);
  box-shadow: 0 6px 18px rgba(0, 44, 65, 0.05);
}

.md-typeset .jn-release__head {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
  margin: 0 0 4px;
}
.md-typeset .jn-release__version {
  background: var(--jn-teal-tint);
  color: var(--jn-teal-dark);
  font-size: 13px;
  font-weight: 600;
  padding: 4px 12px;
  border-radius: 999px;
  font-feature-settings: "tnum";
}
.md-typeset .jn-release__date {
  font-size: 13px;
  color: var(--jn-ink-3);
}
.md-typeset .jn-release__pill--latest {
  background: var(--jn-teal);
  color: #ffffff;
  font-size: 11px;
  font-weight: 600;
  padding: 3px 9px;
  border-radius: 999px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.md-typeset .jn-release h2 {
  font-size: 22px;
  margin: 6px 0 8px;
  letter-spacing: -0.01em;
  color: var(--jn-midnight);
}

.md-typeset .jn-release__sections {
  display: grid;
  grid-template-columns: 1fr;
  gap: 18px;
  margin: 18px 0 8px;
}
@media screen and (min-width: 48em) {
  .md-typeset .jn-release__sections {
    grid-template-columns: repeat(2, 1fr);
  }
}

.md-typeset .jn-release__section {
  background: var(--jn-bg);
  border-radius: 10px;
  padding: 14px 16px;
}
.md-typeset .jn-release__section ul {
  margin: 0;
  padding-left: 1.1em;
}
.md-typeset .jn-release__section li {
  font-size: 14px;
  margin-bottom: 4px;
}

.md-typeset .jn-release__tag {
  display: inline-block;
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  padding: 3px 10px;
  border-radius: 999px;
  margin-bottom: 10px;
  background: var(--jn-bg);
  color: var(--jn-ink-2);
}
/* Per-area accent colour — matches colour-scheme.md */
.md-typeset .jn-release__tag[data-area="people"]      { background: #E6F6F4; color: #00A88D; }
.md-typeset .jn-release__tag[data-area="author"]      { background: #E6EAED; color: #002C41; }
.md-typeset .jn-release__tag[data-area="deliver"]     { background: #EDF7F8; color: #41B0B4; }
.md-typeset .jn-release__tag[data-area="mark"]        { background: #FDF0ED; color: #F15C3C; }
.md-typeset .jn-release__tag[data-area="report"]      { background: #FDE9ED; color: #EE2B4B; }
.md-typeset .jn-release__tag[data-area="integration"] { background: #EEEAF8; color: #6B4FA0; }
.md-typeset .jn-release__tag[data-area="platform"]    { background: #ECEEF0; color: #4A5A6A; }

/* Highlighted feature section — for "New" features that deserve more
   visual weight than a bug fix or improvement. */
.md-typeset .jn-release__section.jn-release__section--feature {
  background: var(--jn-teal-tint);
  border: 1px solid rgba(0, 168, 141, 0.25);
  grid-column: 1 / -1;        /* span full width even when sections are 2-up */
}
.md-typeset .jn-release__section.jn-release__section--feature strong {
  color: var(--jn-midnight);
}
.md-typeset .jn-release__pill--new {
  background: var(--jn-teal);
  color: #ffffff;
  font-size: 11px;
  font-weight: 600;
  padding: 3px 9px;
  border-radius: 999px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  margin-left: 6px;
}

.md-typeset a.jn-release__readmore {
  display: inline-block;
  margin-top: 10px;
  font-size: 14px;
  font-weight: 500;
  color: var(--jn-teal-dark);
  text-decoration: none;
}
.md-typeset a.jn-release__readmore:hover {
  text-decoration: underline;
}

/* Dark mode — invert card to dark surface, keep section blocks slightly darker */
[data-md-color-scheme="slate"] .md-typeset .jn-release {
  background: #1C242F;
  border-color: rgba(255, 255, 255, 0.08);
}
[data-md-color-scheme="slate"] .md-typeset .jn-release:hover {
  border-color: rgba(255, 255, 255, 0.18);
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.4);
}
[data-md-color-scheme="slate"] .md-typeset .jn-release h2 {
  color: #F1F4F7;
}
[data-md-color-scheme="slate"] .md-typeset .jn-release__section {
  background: rgba(255, 255, 255, 0.04);
}
[data-md-color-scheme="slate"] .md-typeset .jn-release-meta {
  background: rgba(255, 255, 255, 0.04);
  border-color: rgba(255, 255, 255, 0.08);
  color: var(--jn-ink-2);
}

/* ============================================================
   Sub-area tile grid — used on landing pages where an area has
   multiple sub-divisions (e.g. Author → Tests / Items / Item types).
   The whole card is a single anchor so any click on the tile navigates. */

.md-typeset .jn-subarea-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 18px;
  margin: 28px 0 32px;
}
@media screen and (min-width: 48em) {
  .md-typeset .jn-subarea-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}
@media screen and (min-width: 64em) {
  .md-typeset .jn-subarea-grid {
    grid-template-columns: repeat(3, 1fr);
  }
}

.md-typeset a.jn-subarea-card,
.md-typeset a.jn-subarea-card:visited {
  display: flex;
  gap: 18px;
  align-items: flex-start;
  height: 100%;                  /* equal-height tiles even when descriptions differ in length */
  padding: 22px 22px 20px;
  background: var(--jn-bg);
  border: 1px solid var(--jn-border);
  border-radius: 12px;
  text-decoration: none;
  color: inherit;
  transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
}
.md-typeset a.jn-subarea-card:hover {
  border-color: var(--jn-teal);
  box-shadow: 0 4px 14px rgba(0, 44, 65, 0.08);
  transform: translateY(-1px);
  text-decoration: none;
}
.md-typeset .jn-subarea-card__icon {
  flex-shrink: 0;
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--jn-teal-tint);
  border-radius: 10px;
  color: var(--jn-teal-dark);
}
.md-typeset .jn-subarea-card__icon svg {
  width: 24px;
  height: 24px;
  fill: currentColor;
}
.md-typeset .jn-subarea-card__body {
  flex: 1;
  display: block;
}
.md-typeset .jn-subarea-card__title {
  display: block;
  margin: 0 0 8px;
  color: var(--jn-midnight);
  font-size: 18px;
  font-weight: 600;
  letter-spacing: -0.005em;
  line-height: 1.3;
}
.md-typeset .jn-subarea-card__desc {
  display: block;
  margin: 0 0 12px;
  color: var(--jn-ink-2);
  font-size: 14.5px;
  line-height: 1.55;
}
.md-typeset .jn-subarea-card__link {
  display: inline-block;
  color: var(--jn-teal-dark);
  font-weight: 500;
  font-size: 14px;
}
.md-typeset a.jn-subarea-card:hover .jn-subarea-card__link {
  text-decoration: underline;
}

/* ============================================================
   Footer (Material's site footer / nav)
   ============================================================ */

.md-footer {
  background-color: var(--jn-midnight);
  color: rgba(255, 255, 255, 0.85);
}
.md-footer-meta {
  background-color: var(--jn-midnight);
}
.md-footer__title { color: rgba(255, 255, 255, 0.85); }
.md-footer__link:hover .md-footer__title { color: var(--jn-teal-light); }

/* Dark mode can't use --jn-midnight here. It's deliberately repurposed as a
   light TEXT colour in the slate block above (#F1F4F7), so the two rules above
   would paint the footer near-white and leave white text invisible on it. Pin
   both bars to the dark-mode topbar colour instead, so the header and footer
   bookend the page the same way they do in light mode. */
[data-md-color-scheme="slate"] .md-footer,
[data-md-color-scheme="slate"] .md-footer-meta {
  background-color: var(--md-primary-fg-color);
}

/* The copyright line carries the "Change cookie settings" link. Both footers
   are dark, so the link must not inherit --md-typeset-a-color: in light mode
   that resolves to #007A67 on #002C41, a contrast ratio of about 2.8:1. */
.md-footer-meta .md-copyright a {
  color: rgba(255, 255, 255, 0.85);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.md-footer-meta .md-copyright a:hover,
.md-footer-meta .md-copyright a:focus {
  color: var(--jn-teal-light);
}

/* ============================================================
   Cookie consent
   ============================================================ */

/* The banner offers a single cookie category (analytics), so Material's
   per-category checkbox list says nothing that Accept/Decline does not already
   say, and it is not part of the approved wording. Hide it. The checkbox stays
   checked underneath, so Accept still stores {"analytics": true} and Decline
   still stores {} — see the Analytics section of
   shared/maintaining-the-help-site.md. */
.md-consent__settings {
  display: none;
}

/* Material gives Accept and Decline the same .md-button--primary class, so out
   of the box they render as two identical filled buttons and neither reads as
   the secondary choice. Demote Decline (the type="reset" one) to an outline. */
.md-consent__controls button[type="reset"] {
  background-color: transparent;
  border-color: var(--md-default-fg-color--lighter);
  color: var(--md-default-fg-color);
}
.md-consent__controls button[type="reset"]:hover,
.md-consent__controls button[type="reset"]:focus {
  background-color: transparent;
  border-color: var(--jn-teal);
  color: var(--jn-teal);
}

/* In dark mode --md-primary-fg-color is #0F1620, near enough to the banner's
   own background that a filled Accept button vanishes into it. Use the brand
   teal there instead. Light mode keeps the navy, which reads fine. */
[data-md-color-scheme="slate"] .md-consent__controls button:not([type="reset"]) {
  background-color: var(--jn-teal);
  border-color: var(--jn-teal);
  color: #0F1620;
}

/* ============================================================
   Homepage hero, area cards, Start here / What's new
   (scoped to .jn-home so they don't leak)
   ============================================================ */

.jn-home {
  /* No custom max-width — when paired with .md-grid (in home.html),
     Material's grid system controls width so the hero content aligns
     with the header/nav and content pages. */
  padding: 0;
}

.jn-hero {
  /* Solid midnight — same as header/tabs so the whole top of the page is
     one continuous dark band with no visible seams or clashing gradients.
     Horizontal padding is zero so the inner .md-grid centers within the
     full viewport, matching the header's .md-grid exactly. The visible
     left/right gutter is provided by .md-grid itself. */
  background: var(--jn-midnight);
  color: #ffffff;
  padding: 56px 0 64px;
  margin: 0 0 32px;
  border-radius: 0;
  position: relative;
  overflow: hidden;
}
/* Tighter padding on phone-sized screens so the hero doesn't dominate */
@media screen and (max-width: 48em) {
  .jn-hero {
    padding: 40px 0 44px;
  }
  .jn-hero h1 { font-size: 32px !important; }
}
.jn-hero-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: rgba(0, 168, 141, 0.18);
  color: var(--jn-teal-light);
  border: 1px solid rgba(0, 168, 141, 0.35);
  padding: 5px 12px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.4px;
  margin-bottom: 18px;
}
.jn-hero h1 {
  font-size: 44px;
  font-weight: 600;
  line-height: 1.1;
  margin: 0 0 12px;
  letter-spacing: -1px;
  color: #ffffff;
  max-width: 820px;
}
.jn-hero h1 .jn-accent { color: var(--jn-teal); }
.jn-hero p.jn-hero-sub {
  font-size: 17px;
  color: rgba(255, 255, 255, 0.78);
  margin: 0 0 28px;
  max-width: 680px;
  font-weight: 300;
}
/* Big search bar in the hero — mimics the prototype's white pill with
   a teal Search button. Acts as a button: clicking anywhere opens the
   custom search modal we already wire up in search.js. */
.jn-hero-searchbar {
  display: flex;
  align-items: center;
  gap: 12px;
  background: #ffffff;
  border-radius: 12px;
  padding: 8px 8px 8px 22px;
  margin: 8px 0 22px;
  max-width: 720px;
  cursor: pointer;
  box-shadow: 0 8px 24px -8px rgba(0, 0, 0, 0.25);
  transition: box-shadow 0.15s ease, transform 0.15s ease;
}
.jn-hero-searchbar:hover {
  box-shadow: 0 10px 28px -8px rgba(0, 0, 0, 0.35);
  transform: translateY(-1px);
}
.jn-hero-searchbar:focus { outline: 2px solid var(--jn-teal); outline-offset: 2px; }
.jn-hero-searchbar__icon {
  width: 20px; height: 20px;
  fill: var(--jn-ink-3);
  flex-shrink: 0;
}
.jn-hero-searchbar__placeholder {
  flex: 1;
  color: var(--jn-ink-3);
  font-size: 15px;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.jn-hero-searchbar__btn {
  background: var(--jn-teal);
  color: #ffffff;
  font-weight: 500;
  font-size: 14px;
  padding: 10px 28px;
  border-radius: 8px;
  flex-shrink: 0;
}
.jn-hero-searchbar:hover .jn-hero-searchbar__btn {
  background: var(--jn-teal-dark);
}

.jn-hero-chips {
  display: flex; flex-wrap: wrap; gap: 8px;
  font-size: 13px;
  color: rgba(255, 255, 255, 0.65);
  align-items: center;
}
.jn-hero-chips strong { font-weight: 500; margin-right: 4px; }
.jn-chip {
  background: rgba(255, 255, 255, 0.08);
  border: 1px solid rgba(255, 255, 255, 0.18);
  color: rgba(255, 255, 255, 0.88);
  padding: 4px 12px;
  border-radius: 999px;
  font-size: 13px;
  text-decoration: none;
}
.jn-chip:hover {
  background: rgba(0, 168, 141, 0.20);
  border-color: var(--jn-teal);
  color: #ffffff;
  text-decoration: none;
}

/* Section heading inside the homepage */
.jn-section { padding: 2.5rem 0; }
/* First section directly under the hero — tighten the top padding so
   there isn't an awkward empty band between the hero's dark panel and
   the first content section. */
.jn-section:first-of-type { padding-top: 2rem; }
.jn-home > .jn-section,
.md-content__inner > .jn-home > .jn-section { padding-left: 32px; padding-right: 32px; }
@media screen and (max-width: 48em) {
  .jn-home > .jn-section,
  .md-content__inner > .jn-home > .jn-section { padding-left: 20px; padding-right: 20px; }
}
.jn-eyebrow {
  color: var(--jn-teal-dark);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 1px;
  text-transform: uppercase;
  margin: 0 0 8px;
}
.jn-section h2 {
  font-size: 28px;
  margin: 0 0 10px;
  color: var(--jn-midnight);
  letter-spacing: -0.3px;
}
.jn-section .jn-lead {
  color: var(--jn-ink-2);
  font-size: 15px;
  margin: 0 0 28px;
  max-width: 680px;
}

/* Area cards */
.jn-card-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 18px;
}
.jn-card {
  background: #ffffff;
  border: 1px solid var(--jn-border);
  border-radius: 10px;
  padding: 22px 20px;
  text-decoration: none !important;
  display: flex; flex-direction: column; gap: 6px;
  transition: all 0.18s ease;
}
.jn-card:hover {
  border-color: var(--jn-teal);
  box-shadow: 0 6px 18px rgba(0, 44, 65, .08);
  transform: translateY(-2px);
}
.jn-card-icon {
  width: 44px; height: 44px;
  border-radius: 10px;
  display: grid; place-items: center;
  font-size: 22px;
  margin-bottom: 6px;
}
.jn-card h3 {
  margin: 0;
  font-size: 16px;
  font-weight: 600;
  color: var(--jn-midnight);
}
.jn-card p {
  margin: 0;
  font-size: 13px;
  color: var(--jn-ink-2);
  line-height: 1.5;
}
.jn-card-count {
  margin-top: 8px;
  font-size: 12px;
  color: var(--jn-teal-dark);
  font-weight: 500;
}

/* Two-column row (Start here + What's new) */
.jn-two-col {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 48px;
}
.jn-list-item {
  display: flex; align-items: flex-start;
  gap: 14px;
  padding: 14px 0;
  border-bottom: 1px solid var(--jn-border);
}
.jn-list-item:last-child { border-bottom: 0; }
.jn-list-icon {
  color: var(--jn-teal-dark);
  font-size: 18px;
  margin-top: 2px;
  flex-shrink: 0;
}
.jn-list-body { flex: 1; min-width: 0; }
.jn-list-title {
  font-weight: 500;
  font-size: 14.5px;
  color: var(--jn-midnight);
  margin: 0 0 3px;
  text-decoration: none;
  display: block;
}
.jn-list-title:hover { color: var(--jn-teal-dark); text-decoration: none; }
.jn-list-meta {
  font-size: 12.5px;
  color: var(--jn-ink-2);
}
.jn-list-tag {
  display: inline-block;
  background: #EBF0F2;
  color: var(--jn-midnight);
  padding: 1px 8px;
  border-radius: 4px;
  font-size: 11px;
  font-weight: 500;
  margin-right: 6px;
}
.jn-dot { margin: 0 6px; }
.jn-rn-link {
  display: inline-block;
  margin-top: 14px;
  font-size: 13px;
  font-weight: 500;
  color: var(--jn-teal-dark);
}

/* Mobile homepage */
@media (max-width: 1024px) {
  .jn-card-grid { grid-template-columns: repeat(2, 1fr); }
  .jn-two-col   { grid-template-columns: 1fr; gap: 32px; }
}
@media (max-width: 640px) {
  /* No negative margins here — they were pulling the hero outside the
     viewport and causing horizontal overflow on phone. The main .jn-hero
     rule already handles padding/margin responsively. */
  .jn-card-grid { grid-template-columns: 1fr; }
}

/* ============================================================
   Test-takers homepage tiles — 2-column grid with optional
   thumbnail images on each tile. Matches the WP design where
   some tiles show a screenshot at the top, others are text
   only. The whole tile is a single clickable card.
   ============================================================ */
.jn-tt-hero {
  background: linear-gradient(180deg, var(--jn-midnight) 0%, var(--jn-midnight-2) 100%);
  color: #ffffff;
  padding: 48px 16px 40px;
}
.jn-tt-hero__inner {
  max-width: 880px;
  margin: 0 auto;
  text-align: center;
}
.jn-tt-hero h1 {
  font-size: 1.75rem;
  line-height: 1.2;
  margin: 0 0 12px;
  color: #ffffff;
  font-weight: 600;
}
.jn-tt-hero__sub {
  color: rgba(255,255,255,0.85);
  margin: 0 auto 14px;
  font-size: 0.95rem;
  line-height: 1.55;
  max-width: 600px;
}
.jn-tt-hero__wish {
  color: var(--jn-teal-light);
  font-style: italic;
  font-size: 0.95rem;
  margin: 14px 0 0;
}

.jn-tt-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 20px;
  margin: 36px 0 16px;
}
@media (max-width: 720px) {
  .jn-tt-grid { grid-template-columns: 1fr; }
}

.jn-tt-tile {
  display: flex;
  flex-direction: column;
  background: #ffffff;
  border: 1px solid var(--jn-border);
  border-radius: 12px;
  text-decoration: none;
  color: var(--jn-ink);
  overflow: hidden;
  transition: box-shadow .2s ease, transform .2s ease, border-color .2s ease;
}
.jn-tt-tile:hover {
  box-shadow: 0 10px 24px -10px rgba(0,30,25,.18);
  transform: translateY(-1px);
  border-color: var(--jn-border-2);
}
.jn-tt-tile:hover .jn-tt-tile__cta { color: var(--jn-teal); }

.jn-tt-tile__image {
  width: 100%;
  height: 170px;
  object-fit: cover;
  display: block;
  background: var(--jn-bg);
  border-bottom: 1px solid var(--jn-border);
}

.jn-tt-tile__body {
  padding: 18px 22px 20px;
  flex: 1;
  display: flex;
  flex-direction: column;
}
.jn-tt-tile h3 {
  margin: 0 0 8px;
  font-size: 18px;
  font-weight: 600;
  color: var(--jn-ink);
  line-height: 1.3;
}
.jn-tt-tile p {
  margin: 0 0 14px;
  color: var(--jn-ink-2);
  font-size: 14.5px;
  line-height: 1.5;
  flex: 1;
}
.jn-tt-tile__cta {
  color: var(--jn-teal-dark);
  font-weight: 600;
  font-size: 14px;
  letter-spacing: 0.01em;
  transition: color .2s ease;
}
