/*
Theme Name:     Jin Design System
Template:       kadence
Author:         Jin
Author URI:     https://liveinkojpau.com/
Description:    Custom Kadence child theme powering liveinkojpau.com's design system.
Version:        0.9
License:        GNU General Public License v3.0 (or later)
License URI:    https://www.gnu.org/licenses/gpl-3.0.html
*/

/* ==========================================================================
   Deliberate divergence from liveinkojpau's copy of this theme (2026-07-23)
   Both installs share this design system's tokens, layout, and component
   CSS verbatim (marked blocks are ported as-is, see DESIGN.md). Typography
   is the one intentional exception: liveinkojpau uses Inter/Pretendard/
   Noto Sans JP (EN/KO/JA, one font per language). This site (EN/JA only,
   no Korean) uses Fraunces for headings + Zen Kaku Gothic New for body
   text and JA headings — see DESIGN-service.md. Implemented by
   redefining --font-inter/--font-pretendard/--font-noto-jp below to Zen
   Kaku Gothic New (covers body text everywhere those tokens are already
   used across the ported CSS) plus a dedicated h1-h4 override further
   down that splits headings to Fraunces (EN) / Zen Kaku (JA) — see
   "Service fonts: heading override" further down this file.
   ========================================================================== */

/* ==========================================================================
   Phase 1: Design tokens (liveinkojpau redesign)
   CSS custom properties from variables.css + Kadence global-palette mapping.
   Light mode = :root, dark overrides = .dark-mode. No component styling here.
   ========================================================================== */
:root {
  /* Colors */
  --color-carbon: #181925;
  --color-paper-white: #ffffff;
  --color-linen: #fafafa;
  --color-mist: #f5f5f5;
  --color-fog: #e8e8e8;
  --color-ash: #999999;
  --color-graphite: #666666;
  --color-lavender: #918df6;
  --color-iris: #9580ff;
  --color-mint: #33c758;
  --color-mint-wash: #def6e4;
  --color-amber: #ffa600;
  --color-sky: #2c78fc;
  --color-magenta: #d6409f;
  --color-ember: #ff3e00;

  /* Typography — Font Families */
  --font-openrunde: 'OpenRunde', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;

  /* Typography — Loaded webfont stacks (Phase 1)
     Service divergence: these three tokens all resolve to Zen Kaku Gothic
     New here (not Inter/Pretendard/Noto Sans JP) — every existing rule in
     this ported file that reads one of these tokens (body text, buttons,
     inputs, nav links, and the base h1-h6 rule) gets Zen Kaku by default.
     --font-pretendard has no real matching content on this EN/JA-only
     site (no :lang(ko) elements exist) — kept defined, pointed at the
     same font, purely so nothing breaks if Korean is ever added later.
     Headings are then pulled back to Fraunces (EN) via a dedicated
     override below — see "Service fonts: heading override". */
  --font-inter: 'Zen Kaku Gothic New', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --font-pretendard: 'Zen Kaku Gothic New', ui-sans-serif, system-ui, 'Apple SD Gothic Neo', 'Malgun Gothic', sans-serif;
  --font-noto-jp: 'Zen Kaku Gothic New', ui-sans-serif, system-ui, 'Hiragino Kaku Gothic ProN', 'Yu Gothic', Meiryo, sans-serif;
  --font-fraunces: 'Fraunces', ui-serif, Georgia, serif;

  /* Typography — Scale */
  --text-caption: 12px;
  --leading-caption: 1.33;
  --tracking-caption: -0.32px;
  --text-body: 16px;
  --leading-body: 1.5;
  --tracking-body: -0.32px;
  --text-subheading: 18px;
  --leading-subheading: 1.33;
  --tracking-subheading: -0.32px;
  --text-heading-sm: 24px;
  --leading-heading-sm: 1.17;
  --tracking-heading-sm: -0.31px;
  --text-heading: 36px;
  --leading-heading: 1.22;
  --tracking-heading: -0.61px;
  --text-heading-lg: 48px;
  --leading-heading-lg: 1;
  --tracking-heading-lg: -0.34px;
  --text-display: 60px;
  --leading-display: 1.13;
  --tracking-display: -3px;

  /* Typography — Weights */
  --font-weight-regular: 400;
  --font-weight-medium: 500;
  --font-weight-semibold: 600;
  --font-weight-bold: 700;

  /* Spacing */
  --spacing-unit: 4px;
  --spacing-4: 4px;
  --spacing-8: 8px;
  --spacing-12: 12px;
  --spacing-16: 16px;
  --spacing-20: 20px;
  --spacing-24: 24px;
  --spacing-32: 32px;
  --spacing-48: 48px;
  --spacing-64: 64px;

  /* Layout */
  --page-max-width: 1200px;
  --section-gap: 64px;
  --card-padding: 32px;
  --element-gap: 16px;

  /* Border Radius */
  --radius-lg: 8px;
  --radius-xl: 12px;
  --radius-2xl: 16px;
  --radius-3xl: 24px;
  --radius-3xl-2: 32px;

  /* Named Radii */
  --radius-tags: 9999px;
  --radius-cards: 16px;
  --radius-images: 8px;
  --radius-inputs: 8px;
  --radius-tables: 24px;
  --radius-buttons: 9999px;

  /* Shadows */
  --shadow-subtle: rgba(0, 0, 0, 0.08) 0px 1px 1px 1px, rgba(0, 0, 0, 0.06) 0px 0px 0px 0.5px;
  --shadow-subtle-2: rgba(0, 0, 0, 0.08) 0px 1px 1px 0px, rgba(0, 0, 0, 0.05) 0px 0px 0px 1px;
  --shadow-subtle-3: rgba(0, 0, 0, 0.06) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 8px 16px 0px, rgba(0, 0, 0, 0.02) 0px 0px 0px 1px;

  /* Surfaces */
  --surface-canvas: #ffffff;
  --surface-linen-band: #fafafa;
  --surface-mist-fill: #f5f5f5;
  --surface-mint-wash: #def6e4;

  /* Kadence global palette mapping — existing Kadence blocks inherit brand colors.
     1 accent · 2 accent-deep · 3-4 primary text · 5 secondary · 6 muted
     · 7 subtle bg · 8 lighter bg · 9 base/white */
  --global-palette1: #918df6; /* Lavender — accent / links / primary action */
  --global-palette2: #9580ff; /* Iris — deeper accent / hover */
  --global-palette3: #181925; /* Carbon — headings / strongest text */
  --global-palette4: #181925; /* Carbon — body text */
  --global-palette5: #666666; /* Graphite — secondary text */
  --global-palette6: #999999; /* Ash — muted / meta / placeholders */
  --global-palette7: #f5f5f5; /* Mist — subtle background */
  --global-palette8: #fafafa; /* Linen — lighter background band */
  --global-palette9: #ffffff; /* Paper White — base canvas */
}

/* Dark mode — override only surfaces, borders, text and the mint wash.
   Lavender (palette1) and the Sky→Lavender gradient stay unchanged. */
.dark-mode {
  /* Surfaces */
  --surface-canvas: #0f1016;                 /* canvas */
  --surface-linen-band: #15161f;             /* bands */
  --surface-mist-fill: #181925;              /* card fill */
  --surface-mint-wash: rgba(51, 199, 88, 0.12);
  --color-mint-wash: rgba(51, 199, 88, 0.12); /* mint wash */

  /* Borders */
  --color-fog: #2a2b38;

  /* Kadence global palette — dark */
  --global-palette3: #f2f2f5;                /* primary text */
  --global-palette4: #f2f2f5;                /* primary text */
  --global-palette5: #a8a8b3;                /* secondary text */
  --global-palette6: #7c7c88;                /* captions */
  --global-palette7: #181925;                /* card fill */
  --global-palette8: #15161f;                /* bands */
  --global-palette9: #0f1016;                /* canvas */
}

/* Base font stacks — Inter for Latin. Polylang sets the lang attribute on <html>:
   :lang(ko) → Pretendard Variable, :lang(ja) → Noto Sans JP. */
body,
button, input, select, optgroup, textarea,
h1, h2, h3, h4, h5, h6 {
  font-family: var(--font-inter);
}

body:lang(ko),
button:lang(ko), input:lang(ko), select:lang(ko), optgroup:lang(ko), textarea:lang(ko),
h1:lang(ko), h2:lang(ko), h3:lang(ko), h4:lang(ko), h5:lang(ko), h6:lang(ko) {
  font-family: var(--font-pretendard);
}

body:lang(ja),
button:lang(ja), input:lang(ja), select:lang(ja), optgroup:lang(ja), textarea:lang(ja),
h1:lang(ja), h2:lang(ja), h3:lang(ja), h4:lang(ja), h5:lang(ja), h6:lang(ja) {
  font-family: var(--font-noto-jp);
}

/* Service fonts: heading override (DESIGN-service.md) — the block above
   already put every h1-h6 on Zen Kaku Gothic New by default (via the
   redefined --font-inter/--font-noto-jp tokens); this pulls h1-h4
   specifically back to Fraunces for EN, keeping JA h1-h4 on Zen Kaku.
   Same specificity as the block above (single type + :lang selectors),
   later in source order, so no !important needed. h5/h6 and body copy
   are deliberately left on Zen Kaku via the tokens above — only h1-h4
   are "headings" for this rule, per spec. */
h1, h2, h3, h4 {
  font-family: var(--font-fraunces);
}

h1:lang(ja), h2:lang(ja), h3:lang(ja), h4:lang(ja) {
  font-family: var(--font-noto-jp);
}

/* Letter-spacing — DESIGN.md tracking for Latin (inherited from body);
   CJK (ja/ko) reset to normal to avoid cramped kana/hangul. */
body {
  letter-spacing: -0.02em;
}

body:lang(ja),
body:lang(ko) {
  letter-spacing: normal;
}

/* ==========================================================================
   Phase 2: Global elements (buttons, links, forms, cards, focus, motion,
   header/footer). Selectors verified against the live site's rendered DOM:
   Kadence Blocks buttons (.kb-button/.kt-button/.wp-block-button__link),
   archive cards (article.loop-entry), header (.site-header/#primary-menu),
   footer (#colophon/#footer-menu). No page/section content — that's Phase 3.
   ========================================================================== */

:root {
  /* Elevated-surface fill for cards/inputs/nav pill: white in light,
     dark card-fill in dark (reuses Phase 1's dark --surface-mist-fill,
     which is already repurposed as "#181925 card fill" for .dark-mode). */
  --surface-elevated: var(--color-paper-white);
}

.dark-mode {
  --surface-elevated: var(--surface-mist-fill);
}

/* --------------------------------------------------------------------------
   Motion — all transitions gated behind reduced-motion opt-in.
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: no-preference) {
  .wp-block-button__link,
  .kb-button,
  .kt-button,
  .entry-content a,
  .entry-summary a,
  .entry-title a,
  input,
  textarea,
  select,
  article.loop-entry,
  #primary-menu.menu > .menu-item > a,
  #footer-menu.menu a,
  .footer-html-inner a {
    transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease,
      box-shadow 0.15s ease, text-decoration-color 0.15s ease, transform 0.1s ease, filter 0.15s ease;
  }
}

/* --------------------------------------------------------------------------
   Buttons — Gutenberg core + Kadence Blocks (both classes always co-occur on
   this theme's button blocks). Carbon text on Lavender fill — never white,
   per DESIGN.md's WCAG note. !important guards against Kadence's own
   per-block dynamic CSS (confirmed live: buttons currently render white
   text, weight 700, 16px/32px padding — all fought here on purpose).
   -------------------------------------------------------------------------- */
.wp-block-button__link,
.kb-button,
.kt-button {
  background-color: var(--color-lavender) !important;
  color: var(--color-carbon) !important;
  border: none !important;
  border-radius: var(--radius-buttons) !important;
  box-shadow: var(--shadow-subtle) !important;
  font-weight: var(--font-weight-medium) !important;
  padding: 10px 20px !important;
}

.wp-block-button__link:hover,
.kb-button:hover,
.kt-button:hover {
  filter: brightness(0.92); /* ~8% darken */
}

.wp-block-button__link:active,
.kb-button:active,
.kt-button:active {
  filter: brightness(0.85);
  transform: scale(0.98);
}

.wp-block-button__link[disabled],
.wp-block-button__link.disabled,
.kb-button[disabled],
.kt-button[disabled],
.kb-button.disabled,
.kt-button.disabled {
  background-color: var(--color-mist) !important;
  color: var(--color-ash) !important;
  box-shadow: none !important;
  filter: none;
  cursor: not-allowed;
}

/* Ghost/secondary variant. Two ways to trigger it:
   1. Core button's own built-in "Outline" style (Styles panel in the
      editor) — adds "is-style-outline" to the OUTER .wp-block-button div.
   2. A custom "button-ghost" class in Additional CSS Class(es) — same
      outer-div placement, kept for Kadence buttons / manual use.
   Core buttons need the descendant combinator below (the class lands on
   the outer div, .wp-block-button__link is the nested <a> — a compound
   selector here would never match). Kadence's own button block puts every
   class directly on the <a>, so the compound form is kept for that case. */
.button-ghost .wp-block-button__link,
.is-style-outline .wp-block-button__link,
.button-ghost.kb-button,
.button-ghost.kt-button,
.is-style-outline.kb-button,
.is-style-outline.kt-button {
  background-color: transparent !important;
  color: var(--color-graphite) !important;
  box-shadow: none !important;
}

.button-ghost .wp-block-button__link:hover,
.is-style-outline .wp-block-button__link:hover,
.button-ghost.kb-button:hover,
.button-ghost.kt-button:hover,
.is-style-outline.kb-button:hover,
.is-style-outline.kt-button:hover {
  background-color: var(--color-mist) !important;
  filter: none;
}

/* --------------------------------------------------------------------------
   Links — body copy stays Carbon; Lavender is reserved for CTAs (DESIGN.md).
   Post-title links (archive cards + single post) shift to Lavender
   underline on hover.
   -------------------------------------------------------------------------- */
.entry-content a,
.entry-summary a,
.comment-content a {
  color: var(--color-carbon);
  text-decoration: underline;
  text-decoration-color: transparent;
}

.entry-content a:hover,
.entry-summary a:hover,
.comment-content a:hover {
  text-decoration-color: currentColor;
}

.entry-title a {
  color: var(--color-carbon);
  text-decoration: none;
}

.entry-title a:hover {
  color: var(--color-lavender);
  text-decoration: underline;
  text-decoration-color: var(--color-lavender);
}

/* --------------------------------------------------------------------------
   Focus states — Kadence's "hide-focus-outline" body class strips the plain
   :focus ring theme-wide with no replacement (confirmed live); :focus-visible
   restores one using the brand color, and only for keyboard interaction.
   -------------------------------------------------------------------------- */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible,
.wp-block-button__link:focus-visible,
.kb-button:focus-visible,
.kt-button:focus-visible,
#primary-menu.menu > .menu-item > a:focus-visible {
  outline: 2px solid var(--color-lavender);
  outline-offset: 2px;
}

/* --------------------------------------------------------------------------
   Form inputs — search, comments, MailerLite. Generic element/type selectors
   only; the MailerLite shortcode/embed markup itself is untouched.
   -------------------------------------------------------------------------- */
input[type="text"],
input[type="email"],
input[type="url"],
input[type="tel"],
input[type="search"],
input[type="password"],
input[type="number"],
textarea,
select,
.wp-block-search__input {
  background-color: var(--surface-elevated);
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-inputs);
  color: var(--color-carbon);
  padding: 10px 12px;
}

input[type="text"]:focus,
input[type="email"]:focus,
input[type="url"]:focus,
input[type="tel"]:focus,
input[type="search"]:focus,
input[type="password"]:focus,
input[type="number"]:focus,
textarea:focus,
select:focus,
.wp-block-search__input:focus {
  border-color: var(--color-lavender);
  outline: none;
}

/* --------------------------------------------------------------------------
   Cards baseline — post archive cards (article.loop-entry, confirmed live
   selector) + a reusable ".card" utility for Phase 3 panels.
   -------------------------------------------------------------------------- */
article.loop-entry,
.card {
  background-color: var(--surface-elevated);
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-cards);
}

article.loop-entry:hover,
.card:hover {
  box-shadow: var(--shadow-subtle-3);
}

/* --------------------------------------------------------------------------
   Header — pill nav bar look. Structural placement (wordmark, menu,
   language switcher, dark-mode toggle, Ask Jin button) is set in the
   Kadence Header Builder — see manual checklist. This is only the CSS the
   Builder can't provide (pill container fill/radius, active-item underline).
   -------------------------------------------------------------------------- */
.primary-menu-container {
  background-color: var(--surface-elevated);
  border-radius: var(--radius-buttons);
  padding: 8px;
}

/* font-family/background added post-launch: confirmed live that Kadence's
   own "Primary Navigation Typography" customizer setting outputs a
   dynamic --global-primary-nav-font-family variable — found set to
   literally "Courier, monospace" here, a pre-existing/unrelated value —
   and its own per-item "button style" background (var(--global-palette9)),
   which only renders as a visible dark box now because palette9 was
   remapped for dark mode. This selector's #id gives it higher specificity
   than Kadence's own class-based rules, so no !important is needed to win. */
#primary-menu.menu > .menu-item > a {
  color: var(--color-carbon);
  font-family: var(--font-inter);
  background: none;
}

#primary-menu.menu > .menu-item > a:lang(ko) {
  font-family: var(--font-pretendard);
}

#primary-menu.menu > .menu-item > a:lang(ja) {
  font-family: var(--font-noto-jp);
}

#primary-menu.menu > .current-menu-item > a,
#primary-menu.menu > .current_page_item > a,
#primary-menu.menu > .current_page_parent > a {
  color: var(--color-carbon);
  border-bottom: 2px solid var(--color-lavender);
}

/* Dropdown submenu card (Blog/Service > .sub-menu). Confirmed live this
   was entirely unstyled by the design system: its navy background
   (rgb(26,77,122)) is a literal hardcoded Kadence color, not a
   --global-palette reference (see chat for the Customizer path to clear
   it at the source); its text uses --global-palette8 (a slot this
   redesign repurposes for surfaces, not Kadence's original per-component
   use), and it has the same stray Courier font as the top-level nav.
   #primary-menu's ID gives this higher specificity than Kadence's own
   3-class dropdown rule, so no !important needed for the base styles,
   though key properties keep it anyway for the same defensive certainty
   used throughout this stylesheet. display is left untouched — Kadence's
   own hover/click toggle script controls that. */
#primary-menu .sub-menu {
  position: absolute;
  top: calc(100% + 8px);
  left: 0;
  margin: 0;
  min-width: 200px;
  background-color: var(--surface-elevated) !important;
  border: 1px solid var(--color-fog) !important;
  border-radius: var(--radius-cards) !important;
  box-shadow: var(--shadow-subtle-3) !important;
  padding: var(--spacing-8) 0;
}

#primary-menu .sub-menu li.menu-item > a {
  display: block;
  padding: var(--spacing-8) var(--spacing-16);
  color: var(--color-carbon) !important;
  font-family: var(--font-inter) !important;
  background: none !important;
}

#primary-menu .sub-menu li.menu-item > a:lang(ko) {
  font-family: var(--font-pretendard) !important;
}

#primary-menu .sub-menu li.menu-item > a:lang(ja) {
  font-family: var(--font-noto-jp) !important;
}

#primary-menu .sub-menu li.menu-item > a:hover {
  color: var(--color-lavender) !important;
}

/* Language switcher (Polylang's nav-menu integration: .pll-parent-menu-item
   is the current-language trigger, .lang-item are the dropdown options).
   Flag images are still hidden — Polylang now renders its own native
   language-name text alongside them (a Polylang/Kadence display-setting
   change made outside this stylesheet), so text no longer needs to be
   CSS-generated. The earlier ::before content-injection workaround
   (removed 2026-07-23) was left in place after that change and produced
   doubled labels like "ENEnglish" — confirmed live, both desktop and
   mobile. Polylang's native output is now the only label source. */
.pll-parent-menu-item img,
.lang-item img {
  display: none;
}

.pll-parent-menu-item a,
.lang-item a {
  color: var(--color-carbon) !important;
  font-family: var(--font-inter) !important;
  background: none !important;
}

/* Polylang's menu-item switcher (Appearance > Menus > Languages) has no
   "hide the current language" checkbox in this install — confirmed live,
   only "Displays as a dropdown / language names / flags", "Forces link to
   front page", and "Hides languages with no translation" are offered.
   Polylang still tags the active language's own item with .current-lang
   itself, so hiding it needs no hardcoded language name/code — it already
   shows as the closed-dropdown trigger label, so hiding it from the open
   dropdown's option list just removes the redundant repeat. */
.lang-item.current-lang {
  display: none;
}

/* "Ask Jin" nav CTA — add as a regular Primary Menu item (not a Header
   Builder HTML element, to avoid the same paste-sanitization risk found
   with the toggle button's SVG) linking to
   https://justaskjin.liveinkojpau.com, with the menu editor's "CSS
   Classes (optional)" field set to "ask-jin-nav-btn". Per DESIGN.md this
   is the "Register Button" treatment (Iris fill + white text), the
   documented secondary-emphasis nav CTA — distinct from the main Lavender
   CTA on purpose, and like Lavender, Iris stays the same in dark mode. */
#primary-menu.menu > .ask-jin-nav-btn > a {
  background-color: var(--color-iris) !important;
  color: var(--color-paper-white) !important;
  font-family: var(--font-inter) !important;
  border-radius: var(--radius-buttons) !important;
  padding: 6px 10px !important;
  font-weight: var(--font-weight-medium) !important;
}

#primary-menu.menu > .ask-jin-nav-btn > a:hover {
  filter: brightness(0.92);
}

/* --------------------------------------------------------------------------
   Footer — minimal, top Fog hairline, Carbon links that shift Lavender on
   hover. Column layout itself is set in the Kadence Footer Builder.
   -------------------------------------------------------------------------- */
#colophon.site-footer {
  border-top: 1px solid var(--color-fog);
}

#footer-menu.menu a,
.footer-html-inner a {
  color: var(--color-carbon);
}

#footer-menu.menu a:hover,
.footer-html-inner a:hover {
  color: var(--color-lavender);
}

/* ==========================================================================
   Phase 3: Homepage sections (hero, gradient band, posts grid, JustAskJin,
   Korean Lessons, email capture). Class names below are the custom
   "Additional CSS Class(es)" applied to blocks in homepage-en.html — this
   is homepage-only styling, not general component styling.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Hero
   -------------------------------------------------------------------------- */
.hero-section {
  text-align: center;
  max-width: 720px !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding: var(--spacing-64) var(--spacing-24) var(--spacing-48);
}

.announcement-chip {
  display: inline-flex;
  align-items: center;
  gap: var(--spacing-8);
  background-color: var(--surface-elevated);
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-tags);
  padding: 6px 16px;
  font-size: var(--text-caption);
  font-weight: var(--font-weight-medium);
  color: var(--color-carbon);
  margin: 0 auto var(--spacing-24);
}

.chip-new {
  color: var(--color-sky);
  font-weight: var(--font-weight-semibold);
}

.hero-headline {
  font-size: var(--text-display);
  line-height: var(--leading-display);
  letter-spacing: var(--tracking-display);
  font-weight: var(--font-weight-semibold);
  color: var(--color-carbon);
  margin: 0 0 var(--spacing-16);
}

/* Display-size tracking is Latin-only per DESIGN.md; JA/KO cap at -0.5px
   (this overrides the -3px above, which would otherwise bypass body's
   lang-based letter-spacing reset since it's set directly on this class). */
.hero-headline:lang(ja),
.hero-headline:lang(ko) {
  letter-spacing: -0.5px;
}

.hero-subtext {
  font-size: var(--text-subheading);
  line-height: var(--leading-subheading);
  color: var(--color-graphite);
  max-width: 560px;
  margin: 0 auto var(--spacing-32);
}

.hero-cta-group {
  justify-content: center;
  margin-bottom: var(--spacing-24);
}

.hero-trust-line {
  font-size: var(--text-caption);
  color: var(--color-ash);
}

/* --------------------------------------------------------------------------
   Gradient band + hero image card — the gradient and the card both stay
   the same in dark mode on purpose (DESIGN.md: Lavender/gradient unchanged;
   the card is a deliberate always-white "floating window" over it).
   -------------------------------------------------------------------------- */
.hero-gradient-band {
  background: linear-gradient(to right in oklab, var(--color-sky) 0%, var(--color-lavender) 100%);
  padding: var(--spacing-64) 0;
  width: 100%;
}

/* Card width is self-contained (doesn't rely on the band's padding or on
   Kadence's .alignwide/.alignfull behavior, which has proven unreliable on
   this site) — width:min() caps at --page-max-width on large screens and
   guarantees a side inset on small ones, whichever is smaller. */
.hero-image-card {
  width: min(100% - 48px, var(--page-max-width)) !important;
  margin-inline: auto !important;
  background-color: var(--color-paper-white);
  border-radius: var(--radius-3xl);
  padding: var(--spacing-16);
  box-shadow: var(--shadow-subtle-3);
}

.hero-image {
  margin: 0;
}

/* !important guards against WordPress writing width/height HTML attributes
   (or an inline style) onto the <img> when a real image replaces the
   placeholder via the media library — those attributes previously beat
   this rule's specificity and squashed the image to its native pixel size. */
.hero-image img {
  width: 100% !important;
  height: auto !important;
  aspect-ratio: 2 / 1 !important;
  object-fit: cover !important;
  display: block !important;
  border-radius: var(--radius-2xl);
}

@media (max-width: 480px) {
  .hero-image-card {
    width: min(100% - 32px, var(--page-max-width)) !important;
  }
}

/* --------------------------------------------------------------------------
   Latest posts
   -------------------------------------------------------------------------- */
.section-latest-posts {
  /* !important: something outside this stylesheet (likely a Kadence
     page/content-background setting) is winning over this without it —
     forcing the intended Linen band regardless.
     Uses --surface-linen-band (dark-aware), not --color-linen (a fixed
     raw swatch that never changes) — the latter was a mistake introduced
     in an earlier fix that left this band stuck at light Linen in dark
     mode, confirmed live via localStorage light/dark comparison. */
  background-color: var(--surface-linen-band) !important;
  max-width: var(--page-max-width) !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding: var(--section-gap) var(--spacing-24);
}

.section-heading-row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  margin-bottom: var(--spacing-32);
}

.section-heading-link a {
  color: var(--color-carbon);
  font-weight: var(--font-weight-medium);
  text-decoration: none;
}

.section-heading-link a:hover {
  color: var(--color-lavender);
}

.posts-grid.wp-block-post-template {
  display: grid !important;
  grid-template-columns: repeat(3, 1fr) !important;
  gap: var(--spacing-32);
  list-style: none;
  margin: 0;
  padding: 0;
}

.posts-grid > li.wp-block-post {
  background-color: var(--surface-elevated) !important;
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-cards);
  overflow: hidden;
  padding: 0;
}

/* Scoped, !important overrides for the card's own text — guards against
   whatever is overriding the un-guarded Phase 2 .entry-title a / Phase 3
   .post-card-excerpt / .post-card-date rules on this page specifically. */
.posts-grid .entry-title a {
  color: var(--color-carbon) !important;
}

.posts-grid .post-card-excerpt {
  color: var(--color-graphite) !important;
}

.posts-grid .post-card-date {
  color: var(--color-ash) !important;
}

.posts-grid > li.wp-block-post:hover {
  box-shadow: var(--shadow-subtle-3);
}

.post-card-image {
  margin: 0;
}

.post-card-image img {
  aspect-ratio: 16 / 9;
  object-fit: cover;
  width: 100%;
  display: block;
}

.post-category-pill,
.post-card-excerpt,
.post-card-date {
  margin: 0;
  padding-left: var(--spacing-16);
  padding-right: var(--spacing-16);
}

.entry-title {
  padding-left: var(--spacing-16);
  padding-right: var(--spacing-16);
}

.post-category-pill {
  margin-top: var(--spacing-16);
}

.post-category-pill a {
  display: inline-block;
  font-size: var(--text-caption);
  font-weight: var(--font-weight-medium);
  text-decoration: none;
  padding: 2px 10px;
  border: 1px solid currentColor;
  border-radius: var(--radius-tags);
}

/* Category color mapping — round-robin by post count (documented in
   strings-for-translation.md). Edit the href fragments if slugs change. */
.post-category-pill a[href*="/category/living-tips/"],
.post-category-pill a[href*="/category/culture-society/"] {
  color: var(--color-sky);
}

.post-category-pill a[href*="/category/family-parenting/"],
.post-category-pill a[href*="/category/gourmet/"] {
  color: var(--color-magenta);
}

.post-category-pill a[href*="/category/driving-in-korea/"],
.post-category-pill a[href*="/category/visa-admin/"] {
  color: var(--color-amber);
}

.post-category-pill a[href*="/category/travel/"],
.post-category-pill a[href*="/category/sports-events/"] {
  color: var(--color-mint);
}

.entry-title {
  font-size: var(--text-subheading);
  font-weight: var(--font-weight-medium);
  margin-top: var(--spacing-12);
}

.post-card-excerpt {
  color: var(--color-graphite);
  font-size: var(--text-body);
  margin-top: var(--spacing-8);
}

.post-card-date {
  color: var(--color-ash);
  font-size: var(--text-caption);
  margin-top: var(--spacing-12);
  padding-bottom: var(--spacing-16);
}

/* --------------------------------------------------------------------------
   JustAskJin band
   -------------------------------------------------------------------------- */
.section-justaskjin {
  /* !important: see .section-latest-posts above — same external override
     was winning here without it. */
  background-color: var(--surface-linen-band) !important;
  padding: var(--section-gap) 0;
}

.section-justaskjin-inner {
  max-width: var(--page-max-width) !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding: 0 var(--spacing-24);
  text-align: center;
}

/* These had no color rule at all before (relied on inherited/cascade
   color) — made explicit so the band's text can't go dark-on-dark again. */
.section-justaskjin-inner .section-heading-centered,
.section-justaskjin-inner .feature-card h3 {
  color: var(--color-carbon) !important;
}

.section-justaskjin-inner .section-subtext-centered,
.section-justaskjin-inner .feature-card p {
  color: var(--color-graphite) !important;
}

.feature-card-grid {
  display: grid !important;
  grid-template-columns: repeat(3, 1fr) !important;
  margin-top: var(--spacing-48);
  gap: var(--spacing-32);
}

.feature-card {
  text-align: center;
  padding: var(--spacing-16);
}

.feature-icon {
  width: 40px;
  height: 40px;
  background-color: var(--color-lavender);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 auto var(--spacing-16);
}

/* --------------------------------------------------------------------------
   Korean Lessons
   -------------------------------------------------------------------------- */
/* Rebuilt as an explicit grid (like .posts-grid/.feature-card-grid) rather
   than relying on core/columns' own flex-basis behavior, which is what was
   failing to constrain width here — same fix pattern already confirmed
   working elsewhere on this site. */
.section-korean-lessons {
  display: grid !important;
  grid-template-columns: 1fr 1fr !important;
  max-width: var(--page-max-width) !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding: var(--section-gap) var(--spacing-24) !important;
  align-items: center;
  gap: var(--spacing-48);
}

.eyebrow-tag {
  display: inline-block;
  background-color: var(--color-mint-wash);
  color: var(--color-mint);
  font-size: var(--text-caption);
  font-weight: var(--font-weight-semibold);
  letter-spacing: 0.02em;
  padding: 4px 12px;
  border-radius: var(--radius-tags);
  margin-bottom: var(--spacing-16);
}

/* !important for the same reason as .hero-image img: WordPress writes
   width/height HTML attributes onto the <img> when a real photo replaces
   the placeholder, which otherwise beat this rule and lock in a fixed,
   non-responsive pixel size (the "doesn't scale with zoom" symptom). */
.lessons-photo img {
  width: 100% !important;
  height: auto !important;
  aspect-ratio: 4 / 3 !important;
  object-fit: cover !important;
  display: block !important;
  border-radius: var(--radius-images);
}

/* --------------------------------------------------------------------------
   Email capture
   -------------------------------------------------------------------------- */
.section-email-capture {
  background-color: var(--color-mint-wash);
  padding: var(--section-gap) 0;
}

.section-email-capture-inner {
  text-align: center;
  max-width: 560px !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding: 0 var(--spacing-24);
}

/* --------------------------------------------------------------------------
   Responsive — 3→2→1 grid, stacking, full-width mobile CTAs, hero scale-down.
   -------------------------------------------------------------------------- */
@media (max-width: 1024px) {
  .posts-grid.wp-block-post-template,
  .feature-card-grid {
    grid-template-columns: repeat(2, 1fr) !important;
  }
}

@media (max-width: 480px) {
  .hero-section,
  .section-latest-posts,
  .section-justaskjin-inner,
  .section-korean-lessons,
  .section-email-capture-inner {
    padding-left: var(--spacing-16);
    padding-right: var(--spacing-16);
  }

  /* Subtle "engineering blueprint" grid, mobile hero only — background
     layer sits behind all hero content (text/CTAs render in normal flow
     above a parent's own background-image, no stacking-context needed),
     so opacity this low can't meaningfully affect text contrast. */
  .hero-section {
    background-image:
      linear-gradient(rgba(24, 25, 37, 0.06) 1px, transparent 1px),
      linear-gradient(90deg, rgba(24, 25, 37, 0.06) 1px, transparent 1px);
    background-size: 24px 24px;
  }

  .dark-mode .hero-section {
    background-image:
      linear-gradient(rgba(242, 242, 245, 0.08) 1px, transparent 1px),
      linear-gradient(90deg, rgba(242, 242, 245, 0.08) 1px, transparent 1px);
  }
}

@media (max-width: 782px) {
  .hero-headline {
    font-size: 38px;
    letter-spacing: -0.01em;
    line-height: 1.15;
  }

  .hero-subtext {
    font-size: var(--text-body);
  }

  .posts-grid.wp-block-post-template,
  .feature-card-grid {
    grid-template-columns: 1fr !important;
  }

  .section-korean-lessons {
    grid-template-columns: 1fr !important;
  }

  .korean-lessons-image {
    order: -1;
  }

  .hero-cta-group {
    flex-direction: column;
    gap: var(--spacing-12);
  }

  .hero-cta-group .wp-block-button,
  .hero-cta-group .wp-block-button__link {
    width: 100%;
  }
}

/* ==========================================================================
   Phase 4: Dark mode toggle + fixes
   .dark-mode goes on <html> (see functions.php's FOUC-prevention script),
   so every var()-based rule already written in Phases 1–3 flips
   automatically, including the !important rules in the posts grid and
   JustAskJin band. This block adds: color-scheme, the toggle button, a
   restrained transition, and fixes for the dark-mode gaps found in the
   audit (see chat for the full audit — items not fixable here are listed
   there as manual follow-ups: JustAskJin widget bubble, the logo, and the
   MailerLite embed's own styling).
   ========================================================================== */

/* Tells the browser to render native form-control chrome and scrollbars
   in the matching scheme, on top of our own var()-based styling. */
:root {
  color-scheme: light;
}

.dark-mode {
  color-scheme: dark;
}

/* Page canvas background. Confirmed live: Kadence has its own pre-existing
   "Page Background" customizer setting on body/.site — a translucent blue
   wash, set per-breakpoint (white on desktop, pale blue on tablet, a more
   visible blue on mobile), entirely unrelated to this redesign. Nothing in
   Phases 1–3 ever gave body its own background, so that Kadence wash was
   always showing through any section without an explicit background of its
   own (hero-section, Korean Lessons) — invisible-ish in light mode against
   mostly-white content, but clashing badly once dark mode is active.
   !important to beat Kadence's own same-selector "body" rules. */
body {
  background-color: var(--surface-canvas) !important;
}

/* Header background. Confirmed live: Kadence has its own separate "Header
   Background" setting on .site-header, fixed opaque white, also unrelated
   to this redesign. Phase 2 only styled the nav pill inside the header
   (.primary-menu-container), assuming the header bar itself was neutral —
   it isn't. The site title text is already correctly dark-aware (Kadence's
   own branding color is palette-linked, so it already renders light in
   dark mode), which is exactly why this was invisible rather than merely
   wrong: light text was rendering on a header that never stopped being
   white. !important to beat Kadence's own rule. */
.site-header {
  background-color: var(--surface-canvas) !important;
}

/* --------------------------------------------------------------------------
   Dark-mode text-color gaps. These Phase 2/3 rules color text with the
   fixed raw tokens (--color-carbon/graphite/ash), which never change in
   .dark-mode by design (they're literal swatches, not surface-aware) — but
   every one of these sits on a background that DOES switch dark
   (--surface-elevated, --surface-linen-band, or the page canvas), so
   without this the text goes dark-on-dark once .dark-mode is active.
   Scoped as .dark-mode overrides here rather than editing Phase 2/3 rules
   directly. --global-palette4/5/6 are already the correct dark-aware
   primary/secondary/muted-text tokens from Phase 1's dark table.
   -------------------------------------------------------------------------- */
.dark-mode .entry-content a,
.dark-mode .entry-summary a,
.dark-mode .comment-content a,
.dark-mode .entry-title a,
.dark-mode #primary-menu.menu > .menu-item > a,
.dark-mode #primary-menu.menu > .current-menu-item > a,
.dark-mode #primary-menu.menu > .current_page_item > a,
.dark-mode #primary-menu.menu > .current_page_parent > a,
.dark-mode #footer-menu.menu a,
.dark-mode .footer-html-inner a,
.dark-mode input[type="text"],
.dark-mode input[type="email"],
.dark-mode input[type="url"],
.dark-mode input[type="tel"],
.dark-mode input[type="search"],
.dark-mode input[type="password"],
.dark-mode input[type="number"],
.dark-mode textarea,
.dark-mode select,
.dark-mode .wp-block-search__input,
.dark-mode .button-ghost .wp-block-button__link,
.dark-mode .is-style-outline .wp-block-button__link,
.dark-mode .button-ghost.kb-button,
.dark-mode .button-ghost.kt-button,
.dark-mode .is-style-outline.kb-button,
.dark-mode .is-style-outline.kt-button,
.dark-mode .hero-headline,
.dark-mode .announcement-chip,
.dark-mode .section-heading-link a,
.dark-mode .posts-grid .entry-title a,
.dark-mode .section-justaskjin-inner .section-heading-centered,
.dark-mode .section-justaskjin-inner .feature-card h3,
.dark-mode .pll-parent-menu-item a,
.dark-mode .lang-item a,
.dark-mode #primary-menu .sub-menu li.menu-item > a {
  color: var(--global-palette4) !important;
}

.dark-mode .hero-subtext,
.dark-mode .hero-trust-line,
.dark-mode .posts-grid .post-card-excerpt,
.dark-mode .posts-grid .post-card-date,
.dark-mode .section-justaskjin-inner .section-subtext-centered,
.dark-mode .section-justaskjin-inner .feature-card p {
  color: var(--global-palette5) !important;
}

/* Ghost/outline and disabled buttons also use fixed Mist/Ash for their
   hover and disabled states — same gap, same fix. */
.dark-mode .button-ghost .wp-block-button__link:hover,
.dark-mode .is-style-outline .wp-block-button__link:hover,
.dark-mode .button-ghost.kb-button:hover,
.dark-mode .button-ghost.kt-button:hover,
.dark-mode .is-style-outline.kb-button:hover,
.dark-mode .is-style-outline.kt-button:hover {
  background-color: var(--color-fog) !important;
}

.dark-mode .wp-block-button__link[disabled],
.dark-mode .wp-block-button__link.disabled,
.dark-mode .kb-button[disabled],
.dark-mode .kt-button[disabled],
.dark-mode .kb-button.disabled,
.dark-mode .kt-button.disabled {
  background-color: var(--color-fog) !important;
  color: var(--global-palette6) !important;
}

/* --------------------------------------------------------------------------
   Toggle button — 40px pill icon button, paste target is the Header
   Builder HTML element (see chat for the snippet + placement steps).
   Background/border already use dark-aware tokens (--surface-elevated,
   --color-fog) so only the icon and hover state need a .dark-mode override.

   Icons are CSS background-images (data-URI SVGs), not inline <span>/<svg>
   markup — confirmed live that WordPress's HTML-element sanitizer strips
   raw <svg> content on paste (the button rendered with nothing inside but
   an &nbsp;). Putting the icon entirely in this stylesheet means there's
   nothing left in the pasted HTML that sanitization can strip. Colors are
   hardcoded hex (data-URIs can't reference CSS custom properties) matching
   --global-palette4's light/dark resolved values.

   Both icons are permanent ::before/::after pseudo-elements, never swapped
   — only their display is toggled by .dark-mode. Confirmed live (2026-07-23):
   swapping a single background-image on class-toggle left the icon
   invisible on mobile until the next touch (a WebKit compositing/repaint
   quirk where a background-image change on an element with active CSS
   transitions doesn't reliably repaint from a JS class toggle alone).
   display:none/block on two always-present pseudo-elements forces a real
   box-tree change every engine repaints immediately, and neither pseudo
   carries a transition, so there's nothing hover-gated or animated to
   cause a stale frame. */
.theme-toggle-btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  padding: 0;
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-buttons);
  background-color: var(--surface-elevated);
  color: var(--global-palette4);
  cursor: pointer;
}

.theme-toggle-btn::before,
.theme-toggle-btn::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 20px;
  height: 20px;
  transform: translate(-50%, -50%);
  background-repeat: no-repeat;
  background-position: center;
  background-size: 20px 20px;
}

.theme-toggle-btn::before {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='20' height='20'%3E%3Ccircle cx='12' cy='12' r='5' fill='%23181925'/%3E%3Cpath d='M12 1v3M12 20v3M4.22 4.22l2.12 2.12M17.66 17.66l2.12 2.12M1 12h3M20 12h3M4.22 19.78l2.12-2.12M17.66 6.34l2.12-2.12' stroke='%23181925' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");
  display: block;
}

.theme-toggle-btn::after {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='20' height='20'%3E%3Cpath fill='%23f2f2f5' d='M20.742 13.045a8.088 8.088 0 0 1-2.077.273c-4.492 0-8.131-3.639-8.131-8.131 0-1.383.363-2.68.976-3.815a.75.75 0 0 0-.976-1.056A10.5 10.5 0 1 0 21.798 14.02a.75.75 0 0 0-1.056-.975z'/%3E%3C/svg%3E");
  display: none;
}

.dark-mode .theme-toggle-btn::before {
  display: none;
}

.dark-mode .theme-toggle-btn::after {
  display: block;
}

.theme-toggle-btn:hover {
  background-color: var(--color-mist);
}

.dark-mode .theme-toggle-btn:hover {
  background-color: var(--color-fog);
}

.theme-toggle-btn:focus-visible {
  outline: 2px solid var(--color-lavender);
  outline-offset: 2px;
}

/* The Header Builder's HTML element wraps pasted content in <p> (wpautop),
   whose default browser margin was pushing the button out of vertical line
   with its header-row siblings. Scoped to only the <p> that directly wraps
   this specific button, so the language switcher's own HTML block (if it
   has its own <p>) is untouched. */
p:has(> #theme-toggle) {
  margin: 0;
  display: flex;
  align-items: center;
}

/* --------------------------------------------------------------------------
   Motion — restrained cross-fade on toggle, not a sitewide "transition:
   all". Scoped to the major surfaces/text containers that actually change
   color between modes, and only the color-ish properties on them.
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: no-preference) {
  body,
  .site-header,
  .site-footer,
  .primary-menu-container,
  article.loop-entry,
  .card,
  .posts-grid > li.wp-block-post,
  .section-latest-posts,
  .section-justaskjin,
  input,
  textarea,
  select,
  .theme-toggle-btn {
    transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
  }
}

/* ==========================================================================
   Footer: SNS icon buttons
   40px circular ghost buttons, paste target is a Footer Builder HTML
   element (see chat for the snippet + placement steps).

   Icons are CSS mask-image (data-URI SVGs), not inline <svg> — confirmed
   earlier in this project that WordPress's HTML-element sanitizer strips
   raw <svg> content on paste (the header dark-mode toggle button rendered
   empty until its icons were moved into this stylesheet). A mask only
   defines the icon's SHAPE; the actual color comes from a normal
   background-color: currentColor, driven by real CSS variables — so this
   is dynamic across light/dark/hover with a single icon definition each,
   more robust than even true inline SVG would have been here, and there's
   nothing left in the pasted HTML for a sanitizer to strip.
   ========================================================================== */
.footer-social-nav {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}

.footer-social-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 1px solid var(--color-fog);
  color: var(--color-graphite);
  text-decoration: none;
}

.dark-mode .footer-social-link {
  color: var(--global-palette5);
}

.footer-social-link:hover {
  border-color: var(--color-lavender);
  color: var(--color-lavender);
}

.footer-social-link:focus-visible {
  outline: 2px solid var(--color-lavender);
  outline-offset: 2px;
}

@media (prefers-reduced-motion: no-preference) {
  .footer-social-link {
    transition: border-color 0.15s ease, color 0.15s ease;
  }
}

.footer-social-icon {
  display: inline-block;
  width: 20px;
  height: 20px;
  background-color: currentColor;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
}

.footer-social-icon--telegram {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M2.01 21L23 12 2.01 3 2 10l15 2-15 2z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M2.01 21L23 12 2.01 3 2 10l15 2-15 2z'/%3E%3C/svg%3E");
}

.footer-social-icon--instagram {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='2.5' y='2.5' width='19' height='19' rx='5' fill='none' stroke='black' stroke-width='2'/%3E%3Ccircle cx='12' cy='12' r='4.5' fill='none' stroke='black' stroke-width='2'/%3E%3Ccircle cx='17.5' cy='6.5' r='1.2' fill='black'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='2.5' y='2.5' width='19' height='19' rx='5' fill='none' stroke='black' stroke-width='2'/%3E%3Ccircle cx='12' cy='12' r='4.5' fill='none' stroke='black' stroke-width='2'/%3E%3Ccircle cx='17.5' cy='6.5' r='1.2' fill='black'/%3E%3C/svg%3E");
}

.footer-social-icon--whatsapp {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='3' y='3' width='18' height='16' rx='8' fill='black'/%3E%3Cpath fill='black' d='M7 17l-1.5 4 4-1.5z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='3' y='3' width='18' height='16' rx='8' fill='black'/%3E%3Cpath fill='black' d='M7 17l-1.5 4 4-1.5z'/%3E%3C/svg%3E");
}

.footer-social-icon--kakaotalk {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='3' y='4' width='18' height='14' rx='7' fill='black'/%3E%3Cpath fill='black' d='M8 18l-1 4 4.5-2.5z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='3' y='4' width='18' height='14' rx='7' fill='black'/%3E%3Cpath fill='black' d='M8 18l-1 4 4.5-2.5z'/%3E%3C/svg%3E");
}

.footer-social-icon--line {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='3' y='4' width='18' height='14' rx='4' fill='black'/%3E%3Cpath fill='black' d='M17 18l2 4-4.5-2z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='3' y='4' width='18' height='14' rx='4' fill='black'/%3E%3Cpath fill='black' d='M17 18l2 4-4.5-2z'/%3E%3C/svg%3E");
}

/* ==========================================================================
   Homepage: intro section ("Hi, I'm Jin")
   Sits directly on the plain canvas — no band background of its own, on
   purpose (a visual breather between the Linen posts band and the dark
   JustAskJin band). Relies on the Phase 4 body-canvas fix for correct
   light/dark inheritance, and on Kadence's own palette-linked defaults for
   the heading/body text color (confirmed working this way for every other
   plain h2/p on this page — no explicit color rule needed for those here).

   Mirrors .section-korean-lessons' grid pattern but flipped (image column
   first) — the markup is already DOM-ordered image-then-text, so unlike
   Korean Lessons this needs no order:-1 trick to stack image-first on
   mobile; it falls out of source order for free.

   Identity line: plain styled text (Graphite/muted, sized between caption
   and subheading) rather than the announcement-chip treatment — a pill
   reads as a promotional/"NEW"-style callout (that's its job in the hero),
   which doesn't fit a personal tagline. Simpler and cleaner here.

   Image: 1fr/2fr column split (not even halves) so a 100%-width image in
   the narrower column lands close to the ~360px desktop target on a
   1200px-max container, without hardcoding a pixel width that wouldn't
   adapt to the container. Border + radius reuse the card-baseline
   treatment (1px Fog border, dark-aware; --radius-cards) rather than
   floating borderless like the hero/lessons photos.
   ========================================================================== */
.section-intro-jin {
  display: grid;
  grid-template-columns: 1fr 2fr;
  align-items: center;
  gap: var(--spacing-48);
  max-width: var(--page-max-width) !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding: var(--section-gap) var(--spacing-24) !important;
}

.intro-jin-photo {
  margin: 0;
}

.intro-jin-photo img {
  width: 100% !important;
  height: auto !important;
  aspect-ratio: 1 / 1 !important;
  object-fit: cover !important;
  display: block !important;
  border-radius: var(--radius-cards);
  border: 1px solid var(--color-fog);
}

.intro-jin-identity {
  color: var(--color-graphite);
  font-size: var(--text-subheading);
  margin-top: var(--spacing-8);
  margin-bottom: var(--spacing-16);
}

.dark-mode .intro-jin-identity {
  color: var(--global-palette5);
}

.intro-jin-text a {
  color: var(--color-lavender);
  text-decoration: underline;
}

.intro-jin-text a:hover {
  text-decoration: none;
}

@media (prefers-reduced-motion: no-preference) {
  .intro-jin-text a {
    transition: text-decoration-color 0.15s ease;
  }
}

@media (max-width: 782px) {
  .section-intro-jin {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 480px) {
  .section-intro-jin {
    padding-left: var(--spacing-16);
    padding-right: var(--spacing-16);
  }
}

/* ==========================================================================
   Booking page: how it works
   New section at the top of /en/korean-lesson-booking-test/, above the
   page's existing content and its booking widget (Kadence column
   id="assessmentbook" wrapping an iframe — confirmed live, untouched).
   Sits on the plain canvas like the homepage's intro section; the policy
   block is the one part that needs its own elevated-surface + dark-mode
   text override, same reasoning as every other card-on-canvas pattern
   already established on the homepage.
   ========================================================================== */
.section-how-it-works {
  max-width: var(--page-max-width) !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding: var(--section-gap) var(--spacing-24) !important;
}

/* Gutenberg wraps every Group block's content in its own auto-inserted
   .wp-block-group__inner-container div — confirmed live: .how-it-works-steps
   (the Group block itself) has exactly ONE direct child, that wrapper, with
   the four .how-it-works-step divs one level deeper as grandchildren. CSS
   Grid only ever treats an element's own direct children as grid items, so
   display:grid on .how-it-works-steps itself was gridding a single item
   (the wrapper) — one column filled, the second dead. Grid has to go on the
   wrapper, which is what's actually the steps' direct parent. */
.how-it-works-steps {
  margin: var(--spacing-32) 0;
}

.how-it-works-steps > .wp-block-group__inner-container {
  display: grid !important;
  grid-template-columns: repeat(2, 1fr) !important;
  gap: var(--spacing-32);
}

.how-it-works-step-number {
  display: block;
  color: var(--color-lavender);
  font-size: var(--text-heading-sm);
  font-weight: var(--font-weight-semibold);
  line-height: 1;
  margin: 0 0 var(--spacing-8);
}

.how-it-works-step h3 {
  margin: 0 0 var(--spacing-8);
}

.how-it-works-step p:not(.how-it-works-step-number) {
  color: var(--color-graphite);
  margin: 0;
}

.dark-mode .how-it-works-step p:not(.how-it-works-step-number) {
  color: var(--global-palette5);
}

/* Policy card — quiet/informational, card-baseline treatment (elevated
   surface, dark-aware) rather than a plain-canvas paragraph, so it reads
   as a distinct, calm callout instead of alarming fine print. */
.how-it-works-policy {
  background-color: var(--surface-elevated);
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-cards);
  padding: var(--spacing-24);
  margin-top: var(--spacing-32);
}

.how-it-works-policy p {
  color: var(--color-graphite);
  margin: 0;
}

.dark-mode .how-it-works-policy p {
  color: var(--global-palette5);
}

/* Confirmed live: loses a specificity fight to Kadence core's
   ".single-content .wp-block-buttons" (2 classes vs. this rule's 1) without
   !important, landing at margin-top:0 regardless of this declaration. */
.how-it-works-cta {
  margin-top: var(--spacing-32) !important;
}

@media (max-width: 782px) {
  .how-it-works-steps > .wp-block-group__inner-container {
    grid-template-columns: 1fr !important;
  }
}

@media (max-width: 480px) {
  .section-how-it-works {
    padding-left: var(--spacing-16);
    padding-right: var(--spacing-16);
  }
}

/* ==========================================================================
   Mobile + dark fixes
   Diagnosed live against the actual site (not just source) at ~390px in
   both modes. Four unrelated root causes, all confirmed:

   1. Horizontal overflow — Kadence's OWN core theme CSS resets
      .alignwide/.alignfull to padding-left/right:0 (this is correct,
      intentional support for true full-bleed sections — it's not a stray
      Customizer color like the earlier Page Background bug, so there's no
      setting to clear here). Every homepage section carries "alignwide"
      for Gutenberg's own alignment system, so EVERY section's own padding
      was losing this fight at equal specificity — confirmed live via
      computed padding-left/right = 0px on every section except
      .section-korean-lessons, which only survived because an earlier,
      unrelated fix happened to add !important to its padding already.
      Fix: add !important to every other section's padding to match.

   2. Category pills + the intro section's JustAskJin link going
      dark-on-dark (or wrong-colored) in dark mode — NOT a missing
      override, a collision: .entry-content turns out to be the wrapper
      for the ENTIRE page body (confirmed live — it contains the hero
      section), not just blog-post content as the selector name implies.
      The earlier dark-mode text-color-gap fix's ".dark-mode .entry-content
      a { color: var(--global-palette4) !important; }" therefore matches
      EVERY link on the homepage, including ones that are supposed to be a
      different color. Confirmed via isolated .matches() checks, and
      confirmed viewport-independent (same bug on desktop, just never
      re-verified after these components shipped). Fixed here with
      higher-specificity + later-source overrides for the specific links
      that need a different color.

   3. Mobile drawer menu (#mobile-drawer / #mobile-menu) — uses Kadence's
      SEPARATE "mobile" menu location (confirmed via functions.php's own
      starter-template registration: 'primary' and 'mobile' are two
      distinct menu locations), so none of the earlier #primary-menu-scoped
      fixes ever reached it. Its stray colors are literal hardcoded values
      from two sources: WordPress's native Customize → Additional CSS
      panel (a "Cloud-Style Language Switcher" snippet targeting selectors
      this site doesn't actually use, confirmed by inspecting the live
      <style> tag directly — dead CSS, unrelated to what's actually
      broken) and Kadence's own per-instance drawer background color,
      confirmed live at #mobile-drawer .drawer-inner. See chat for the
      exact Customizer path for that one.

   4. JustAskJin floating widget — resolved the earlier grep dead-end:
      its CSS lives in WordPress's native Customize → Additional CSS panel
      (confirmed by finding the live <style> tag in <head>, which also
      contains a caption-overlay fix and the dead language-switcher
      snippet from item 3 — several unrelated ad-hoc fixes bundled
      together over time, not part of any theme file). Overridden here via
      normal cascade + !important; the panel itself is left untouched.
   ========================================================================== */

/* --- 1. Horizontal overflow: match Korean Lessons' already-!important
   padding on every other alignwide/alignfull section. --------------------- */
.hero-section {
  padding-left: var(--spacing-24) !important;
  padding-right: var(--spacing-24) !important;
}

.hero-image-card {
  padding-left: var(--spacing-16) !important;
  padding-right: var(--spacing-16) !important;
}

.section-latest-posts,
.section-intro-jin,
.section-justaskjin-inner,
.section-email-capture-inner,
.section-how-it-works {
  padding-left: var(--spacing-24) !important;
  padding-right: var(--spacing-24) !important;
}

@media (max-width: 480px) {
  .hero-section,
  .section-latest-posts,
  .section-intro-jin,
  .section-justaskjin-inner,
  .section-korean-lessons,
  .section-email-capture-inner,
  .section-how-it-works {
    padding-left: var(--spacing-16) !important;
    padding-right: var(--spacing-16) !important;
  }
}

/* --- 2. .entry-content dark-mode collision: give the links that need a
   different color a higher-specificity, later-source override. ---------- */
.dark-mode .post-category-pill a[href*="/category/living-tips/"],
.dark-mode .post-category-pill a[href*="/category/culture-society/"] {
  color: var(--color-sky) !important;
}

.dark-mode .post-category-pill a[href*="/category/family-parenting/"],
.dark-mode .post-category-pill a[href*="/category/gourmet/"] {
  color: var(--color-magenta) !important;
}

.dark-mode .post-category-pill a[href*="/category/driving-in-korea/"],
.dark-mode .post-category-pill a[href*="/category/visa-admin/"] {
  color: var(--color-amber) !important;
}

.dark-mode .post-category-pill a[href*="/category/travel/"],
.dark-mode .post-category-pill a[href*="/category/sports-events/"] {
  color: var(--color-mint) !important;
}

.dark-mode .intro-jin-text a {
  color: var(--color-lavender) !important;
}

/* --- 3. Mobile drawer menu — restyled to the design system. ------------ */
#mobile-drawer .drawer-inner {
  background-color: var(--surface-elevated) !important;
}

.mobile-navigation ul li > a,
.mobile-navigation ul li.menu-item-has-children > .drawer-nav-drop-wrap {
  color: var(--color-carbon) !important;
  font-family: var(--font-inter) !important;
  background: none !important;
  /* Confirmed live: 26px/10px padding at 20px font-size/32px line-height —
     each item was ~84px tall. Trimmed to the body type scale. */
  padding: var(--spacing-12) var(--spacing-20) !important;
  font-size: var(--text-subheading) !important;
  line-height: var(--leading-subheading) !important;
}

.mobile-navigation ul li > a:lang(ko) {
  font-family: var(--font-pretendard) !important;
}

.mobile-navigation ul li > a:lang(ja) {
  font-family: var(--font-noto-jp) !important;
}

.dark-mode .mobile-navigation ul li > a,
.dark-mode .mobile-navigation ul li.menu-item-has-children > .drawer-nav-drop-wrap {
  color: var(--global-palette4) !important;
}

.mobile-navigation .drawer-nav-drop-wrap {
  background-color: var(--surface-elevated) !important;
  border-color: var(--color-fog) !important;
}

/* Mobile language switcher — flag images stay hidden; Polylang now renders
   its own native language-name text in the drawer too (same upstream
   display-setting change as desktop), so the earlier ::before
   content-injection rules (including the 2026-07-23 direct-child-selector
   fix that made them start matching the trigger) are removed entirely —
   they were producing doubled labels like "ENEnglish" once Polylang's own
   text appeared alongside them. */
.mobile-navigation .pll-parent-menu-item img,
.mobile-navigation .lang-item img {
  display: none !important;
}

/* --- 4. JustAskJin widget: shrink and tuck tighter at mobile so it can't
   overlap the JustAskJin band's CTA or the footer's Privacy Policy link.
   Full restyle deferred; this only fixes the overlap. ------------------- */
@media (max-width: 480px) {
  .jaj-bubble {
    display: none !important;
  }

  .jaj-face {
    width: 44px !important;
    height: 44px !important;
  }

  .jaj-wrap {
    bottom: 12px !important;
    right: 12px !important;
  }
}

/* ==========================================================================
   Service components (2026-07-23)
   Per DESIGN-service.md + the approved OrderBuilder.dc.html prototype
   (variant 1a / stacked radio cards only — the segmented-control variant
   in that file is NOT built here). Justaskjin-only block; not part of the
   liveinkojpau design system.

   Reuses existing tokens/rules rather than duplicating them: text inputs
   already have Fog borders, Lavender-on-focus, and a global focus-visible
   ring (see "Form inputs" above) — form-field classes below only add
   label/error/success styling, not input styling itself. CTA buttons
   reuse .wp-block-button__link (Carbon-on-Lavender, not white-on-Lavender
   — the prototype's CTA uses white text, but this theme's Carbon-on-
   Lavender choice is a documented WCAG contrast decision, kept here on
   purpose rather than matched to the prototype).

   Two colors below (status chip OPEN/PRE-ORDER states) are NOT design
   tokens — they're the prototype's own contrast-safe derivatives of Mint/
   Amber, needed because the raw tokens don't clear text/background
   contrast at chip size. Flagged here since DESIGN-service.md says no
   new colors outside the tokens; treated as an approved exception because
   the prototype is named the authoritative visual spec for this exact
   component and accessibility is non-negotiable.
   ========================================================================== */

/* --- Radio card group (1a stacked) -------------------------------------- */
.radio-card-group {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-12);
}

.radio-card {
  display: flex;
  align-items: center;
  gap: var(--spacing-16);
  min-height: 44px;
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-cards);
  background-color: transparent;
  padding: var(--spacing-16);
  cursor: pointer;
  box-sizing: border-box;
}

.radio-card.is-selected {
  border: 1.5px solid var(--color-lavender);
  background-color: rgba(145, 141, 246, 0.08);
}

.dark-mode .radio-card.is-selected {
  background-color: rgba(145, 141, 246, 0.16);
}

.radio-card input[type="radio"] {
  appearance: none;
  -webkit-appearance: none;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 1.5px solid var(--color-fog);
  margin: 0;
  flex: none;
  cursor: pointer;
  background-color: transparent;
  box-sizing: border-box;
}

.radio-card input[type="radio"]:checked {
  border: 7px solid var(--color-lavender);
}

.radio-card input[type="radio"]:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(145, 141, 246, 0.35);
}

.radio-card-body {
  flex: 1;
  min-width: 0;
}

.radio-card-name {
  display: block;
  font-size: var(--text-subheading);
  font-weight: var(--font-weight-bold);
  color: var(--color-carbon);
}

.dark-mode .radio-card-name {
  color: var(--global-palette4);
}

.radio-card-desc {
  display: block;
  font-size: 12.5px;
  color: var(--color-graphite);
  margin-top: 2px;
}

.dark-mode .radio-card-desc {
  color: var(--global-palette5);
}

.radio-card-price {
  flex: none;
  font-size: var(--text-subheading);
  font-weight: var(--font-weight-bold);
  color: var(--color-carbon);
}

.dark-mode .radio-card-price {
  color: var(--global-palette4);
}

/* --- Form fields ---------------------------------------------------------
   Input/textarea box styling, Fog border, Lavender focus, is all already
   covered by the generic input[type=...] rules earlier in this file. This
   section only adds what's new: labels above fields, inline validation,
   success state. */
.form-field {
  margin-top: var(--spacing-16);
}

.form-field label {
  display: block;
  font-size: 13px;
  font-weight: var(--font-weight-medium);
  color: var(--color-graphite);
  margin-bottom: var(--spacing-8);
}

.dark-mode .form-field label {
  color: var(--global-palette5);
}

.form-field textarea {
  min-height: 76px;
  resize: vertical;
}

.form-field-error {
  font-size: 12px;
  color: var(--color-magenta);
  margin-top: var(--spacing-8);
}

.form-success {
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-cards);
  padding: var(--spacing-24);
  background-color: var(--color-mint-wash);
}

.dark-mode .form-success {
  background-color: rgba(51, 199, 88, 0.12);
}

.form-success-title {
  font-family: var(--font-fraunces);
  font-weight: var(--font-weight-semibold);
  font-size: 21px;
  color: var(--color-carbon);
}

.dark-mode .form-success-title {
  color: var(--global-palette4);
}

.form-success-body {
  font-size: var(--text-body);
  line-height: 1.6;
  color: var(--color-graphite);
  margin-top: var(--spacing-8);
}

.dark-mode .form-success-body {
  color: var(--global-palette5);
}

/* --- Ruled pricing table -------------------------------------------------
   Never a card grid — Fog hairline rows, right-aligned prices. */
.ruled-table {
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-tables);
  overflow: hidden;
}

.ruled-table-row {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--spacing-16);
  padding: var(--spacing-16) var(--spacing-24);
  border-bottom: 1px solid var(--color-fog);
}

.ruled-table-row:last-child {
  border-bottom: none;
}

.ruled-table-label {
  font-size: var(--text-body);
  color: var(--color-graphite);
}

.dark-mode .ruled-table-label {
  color: var(--global-palette5);
}

.ruled-table-value {
  font-size: var(--text-body);
  font-weight: var(--font-weight-medium);
  color: var(--color-carbon);
  text-align: right;
}

.dark-mode .ruled-table-value {
  color: var(--global-palette4);
}

.ruled-table-row.is-total .ruled-table-label,
.ruled-table-row.is-total .ruled-table-value {
  font-weight: var(--font-weight-bold);
}

.ruled-table-row.is-total .ruled-table-value {
  font-family: var(--font-fraunces);
  font-size: var(--text-heading-sm);
}

/* --- Trust strip ----------------------------------------------------------
   Quiet muted text, no icons, no cards. Claims separated by literal " · "
   in the markup itself (matches the prototype's plain-text approach) —
   e.g. <p class="trust-strip">Jin confirms first · PayPal after
   confirmation · EN / JA</p>. */
.trust-strip {
  margin: 0;
  font-size: 12px;
  color: var(--color-ash);
}

.dark-mode .trust-strip {
  color: var(--global-palette6);
}

/* --- Status chip (3 states) ----------------------------------------------
   State comes from markup/JS (a class), never hardcoded in CSS — this
   only styles whichever of is-open/is-preorder/is-closed is present. */
.status-chip {
  display: inline-flex;
  align-items: center;
  gap: var(--spacing-8);
  border-radius: var(--radius-tags);
  padding: 6px 14px;
  font-size: 12px;
  font-weight: var(--font-weight-bold);
  letter-spacing: 0.02em;
}

.status-chip::before {
  content: "";
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background-color: currentColor;
}

.status-chip.is-open {
  background-color: var(--color-mint-wash);
  color: #1b7d3a;
}

.dark-mode .status-chip.is-open {
  background-color: rgba(51, 199, 88, 0.16);
  color: #7ce39c;
}

.status-chip.is-preorder {
  background-color: rgba(255, 166, 0, 0.14);
  color: #8a5b00;
}

.dark-mode .status-chip.is-preorder {
  background-color: rgba(255, 166, 0, 0.16);
  color: #ffc35c;
}

.status-chip.is-closed {
  background-color: var(--color-mist);
  color: var(--color-graphite);
}

.dark-mode .status-chip.is-closed {
  background-color: var(--surface-elevated);
  color: var(--global-palette5);
}

/* --- Sticky action bar ---------------------------------------------------
   Mobile-sticky total + breakdown, never a single opaque number. CTA
   button reuses .wp-block-button__link — pair this class with a real
   core button block, don't restyle a bare <button>. */
.sticky-action-bar {
  position: sticky;
  bottom: 0;
  background-color: var(--surface-canvas);
  border-top: 1px solid var(--color-fog);
  box-shadow: 0 -8px 16px rgba(0, 0, 0, 0.06);
  padding: var(--spacing-16) var(--spacing-20);
}

.sticky-action-bar-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--spacing-16);
}

.sticky-action-bar-total {
  font-family: var(--font-fraunces);
  font-weight: var(--font-weight-semibold);
  font-size: 22px;
  color: var(--color-carbon);
}

.dark-mode .sticky-action-bar-total {
  color: var(--global-palette4);
}

.sticky-action-bar-breakdown {
  font-size: 11.5px;
  color: var(--color-ash);
  margin-top: 2px;
}

.dark-mode .sticky-action-bar-breakdown {
  color: var(--global-palette6);
}

.sticky-action-bar-cta.wp-block-button__link {
  flex: none;
  min-height: 48px;
  padding: 0 22px !important;
}

.sticky-action-bar-note {
  font-size: 11px;
  color: var(--color-ash);
  margin-top: var(--spacing-8);
}

.dark-mode .sticky-action-bar-note {
  color: var(--global-palette6);
}

@media (max-width: 480px) {
  .radio-card {
    padding: var(--spacing-12) var(--spacing-16);
  }

  .sticky-action-bar {
    margin-left: -20px;
    margin-right: -20px;
  }
}

/* ==========================================================================
   Soft Landing booking form (2026-07-23)
   /soft-landing/'s form is Contact Form 7 (form ID 297), hand-built HTML
   with its own inline <style>/<script> inside the CF7 form template —
   confirmed live, not simple [text*] shortcodes. That template lives in
   wp-admin (Contact > Contact Forms), which this session has no access
   to edit, so nothing here touches field TYPES or the form's own layout
   classes (.jaj-flex-row etc. stay as they are). Everything below is a
   pure CSS reskin of CF7's own stable output classes — no content or
   structural changes, matches "no content changes" for this phase.

   The "Package" field is ALREADY a native CF7 [radio] field (confirmed
   live in the rendered HTML, contrary to how the page reads at a glance)
   — restyled to the radio-card look via :has(), no template edit needed.
   The existing "No payment now · Jin confirms first · PayPal invoice
   sent after" line is already a trust-strip in substance (short claims,
   muted, dot-separated) — restyled in place via an attribute-substring
   selector matching its known inline style, rather than duplicating it.
   That selector is fragile — if the inline style on that specific <p> in
   the CF7 template ever changes, this rule stops matching. ========================================================================== */
.wpcf7-form p > label {
  display: block;
  font-size: 13px;
  font-weight: var(--font-weight-medium);
  color: var(--color-graphite);
  margin-bottom: var(--spacing-8);
}

.dark-mode .wpcf7-form p > label {
  color: var(--global-palette5);
}

.wpcf7-form .wpcf7-form-control-wrap {
  display: block;
}

.wpcf7-form input.wpcf7-form-control,
.wpcf7-form select.wpcf7-form-control,
.wpcf7-form textarea.wpcf7-form-control {
  width: 100%;
  box-sizing: border-box;
  min-height: 46px;
  font-family: inherit;
  font-size: var(--text-body);
}

.wpcf7-form textarea.wpcf7-form-control {
  min-height: 76px;
}

/* Package field -> radio cards */
.wpcf7-form-control-wrap[data-name="package"] .wpcf7-form-control.wpcf7-radio {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-12);
}

.wpcf7-form-control-wrap[data-name="package"] .wpcf7-list-item {
  margin: 0;
}

.wpcf7-form-control-wrap[data-name="package"] .wpcf7-list-item label {
  display: flex;
  align-items: center;
  gap: var(--spacing-16);
  min-height: 44px;
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-cards);
  padding: var(--spacing-16);
  cursor: pointer;
  box-sizing: border-box;
  font-weight: var(--font-weight-bold);
  font-size: var(--text-subheading);
  color: var(--color-carbon);
}

.dark-mode .wpcf7-form-control-wrap[data-name="package"] .wpcf7-list-item label {
  color: var(--global-palette4);
}

.wpcf7-form-control-wrap[data-name="package"] .wpcf7-list-item:has(input:checked) label {
  border: 1.5px solid var(--color-lavender);
  background-color: rgba(145, 141, 246, 0.08);
}

.dark-mode .wpcf7-form-control-wrap[data-name="package"] .wpcf7-list-item:has(input:checked) label {
  background-color: rgba(145, 141, 246, 0.16);
}

.wpcf7-form-control-wrap[data-name="package"] input[type="radio"] {
  appearance: none;
  -webkit-appearance: none;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 1.5px solid var(--color-fog);
  margin: 0;
  flex: none;
  cursor: pointer;
  box-sizing: border-box;
}

.wpcf7-form-control-wrap[data-name="package"] input[type="radio"]:checked {
  border: 7px solid var(--color-lavender);
}

.wpcf7-form-control-wrap[data-name="package"] input[type="radio"]:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(145, 141, 246, 0.35);
}

.wpcf7-form-control-wrap[data-name="package"] .wpcf7-list-item-label {
  flex: 1;
}

/* Existing "No payment now..." line -> trust strip */
.wpcf7-form p[style*="0.85em"] {
  font-size: 12px !important;
  color: var(--color-ash) !important;
}

.dark-mode .wpcf7-form p[style*="0.85em"] {
  color: var(--global-palette6) !important;
}

/* Submit button — a raw <input type="submit">, confirmed live it renders
   with the plain browser default (black outset border, no radius, no
   theme color at all) since it's CF7's own markup, not a Gutenberg/
   Kadence button block, so none of this file's existing button rules
   (scoped to .wp-block-button__link / .kb-button / .kt-button) ever
   reach it. Matches this site's one-Lavender-CTA-per-viewport primary
   button treatment — same Carbon-on-Lavender pairing as everywhere else
   (not white text, per the same WCAG decision noted earlier). */
.wpcf7-form input.wpcf7-submit {
  background-color: var(--color-lavender);
  color: var(--color-carbon);
  border: none;
  border-radius: var(--radius-buttons);
  box-shadow: var(--shadow-subtle);
  font-family: inherit;
  font-weight: var(--font-weight-medium);
  font-size: var(--text-body);
  padding: 12px 24px;
  min-height: 48px;
  cursor: pointer;
}

.wpcf7-form input.wpcf7-submit:hover {
  filter: brightness(0.92);
}

.wpcf7-form input.wpcf7-submit:active {
  filter: brightness(0.85);
  transform: scale(0.98);
}

/* Confirmed live (2026-07-23): the column wrapping this form has its own
   pink background (rgb(241,231,231)) set at the Kadence block level —
   pre-existing page content, not this file, not touched (no content
   changes this phase). In light mode it's just an aesthetic choice, still
   readable. In dark mode it's a real accessibility failure: the pink
   never adapts, so this file's dark-mode text colors (near-white, correct
   everywhere else) render as white-on-light-pink here specifically —
   confirmed via screenshot, headings and the Package label were close to
   unreadable. Scoped to this exact column's own generated class (not the
   generic .kt-inside-inner-col, which is reused all over this site) so
   nothing else is affected. */
.dark-mode .kadence-column294_68fdf8-82 .kt-inside-inner-col {
  background-color: var(--surface-canvas) !important;
}

/* Same failure mode, two more pre-existing hardcoded-background blocks
   found on this page via a full contrast sweep (computed WCAG contrast
   ratio across every text node) rather than eyeballing: the "Who this is
   for" bullet block (beige, rgb(230,220,214)) and the "Transportation
   costs..." note (light pink, rgba(250,229,250,.85)) — both unreadable
   in dark mode for the same reason as above. Same fix, same scoping
   (each column's own generated class only). */
.dark-mode .kadence-column294_3f6b0b-51 .kt-inside-inner-col {
  background-color: var(--surface-canvas) !important;
}

.dark-mode .kadence-column294_ab7be1-ff .kt-inside-inner-col {
  background-color: var(--surface-canvas) !important;
}

/* The "Most popular" package-display card (informational section, not
   the form) has its own translucent light-blue background,
   rgba(231,240,250,.55), that composites over the dark canvas in dark
   mode to something close to invisible against this file's near-white
   dark-mode text — computed contrast ratio 1.03:1 (WCAG minimum is
   4.5:1 for normal text), a near-total failure. Same fix. The sibling
   "Soft Landing" card (no "Most popular" badge) was checked in the same
   sweep and doesn't have this problem — not touched. */
.dark-mode .kadence-column294_d467c4-ed .kt-inside-inner-col {
  background-color: var(--surface-canvas) !important;
}

/* ==========================================================================
   Homepage (EN) sections (2026-07-23)
   Three additions approved for the homepage rebuild; everything else on
   the page reuses existing classes (hero-headline/subtext/cta-group,
   trust-strip, status-chip, ruled-table, how-it-works-step,
   section-intro-jin). !important on section padding throughout, for the
   same reason as every other section in this file: Kadence's own core CSS
   zeroes .alignwide/.alignfull padding at equal specificity.
   ========================================================================== */

/* Confirmed live (2026-07-23): the homepage's two primary "Get help now"
   buttons rendered with white text on Lavender instead of this project's
   established Carbon-on-Lavender treatment — the ".dark-mode .entry-content
   a" collision (documented earlier this project: .entry-content wraps the
   whole page body, so its dark-mode link-color override silently catches
   anything that doesn't have a higher-specificity guard) beat the base
   ".wp-block-button__link { color: var(--color-carbon) !important }" rule
   on specificity. Exactly the scenario that rule's own comment warned to
   check for proactively on new components — missed when these buttons
   were first built, caught here in production verification instead.
   :not(.is-style-outline) on the .wp-block-button wrapper (not the link
   itself, since that's where the class actually lives) keeps ghost/
   outline buttons on their own separate, already-correct near-white
   dark-mode rule — this one only matches filled primary buttons. */
.dark-mode .entry-content .wp-block-button:not(.is-style-outline) .wp-block-button__link {
  color: var(--color-carbon) !important;
}

/* --- Generic section wrapper (canvas sections without their own class) -- */
.section-service {
  max-width: var(--page-max-width) !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding: var(--section-gap) var(--spacing-24) !important;
}

/* Craving Fixer band specifically (identified by containing the KST chip,
   not a new class, so this doesn't require re-pasting page content) —
   the spec calls this "a small band"; the generic .section-service's full
   --section-gap (64px top+bottom) made it read as a full section instead,
   with enough accumulated block-gap spacing below the fold on mobile that
   the "Order food now" link landed off-screen and looked missing.
   Halved padding keeps it feeling like a compact hook, not a section. */
.section-service:has(.status-chip-kst) {
  padding-top: var(--spacing-32) !important;
  padding-bottom: var(--spacing-32) !important;
}

/* --- FAQ page accordion (2026-07-23) -------------------------------------
   Confirmed live: .faq-item/.faq-question/.faq-answer are NOT part of this
   theme file — they're a hand-built accordion with its own inline <style>
   tag in the FAQ page's own content (same pattern as the JustAskJin
   floating widget found earlier this project: real functionality living
   outside any theme file). Hardcoded white/near-white backgrounds with
   dark text, none of it token-based, so none of it adapts to dark mode —
   confirmed as the specific "dropbox area" the user flagged as mismatched.
   Can't edit that inline block directly (page content, not a file this
   session can touch); overriding from here instead, same approach already
   used for the Soft Landing page's stray Kadence column colors. The base
   rules carry no !important, so these already win on specificity alone,
   but !important is used anyway for certainty against any other rule this
   sweep didn't see (consistent with the rest of this file's fixes). */
.dark-mode .faq-item {
  border-color: var(--color-fog) !important;
}

.dark-mode .faq-question {
  background-color: var(--surface-elevated) !important;
  color: var(--global-palette4) !important;
}

.dark-mode .faq-question:hover {
  background-color: var(--color-fog) !important;
}

.dark-mode .faq-question.active {
  background-color: rgba(145, 141, 246, 0.12) !important;
  color: var(--color-lavender) !important;
}

.dark-mode .faq-question.active .faq-icon {
  border-color: var(--color-lavender) !important;
  color: var(--color-lavender) !important;
}

.dark-mode .faq-answer {
  background-color: var(--surface-elevated) !important;
  color: var(--global-palette5) !important;
  border-top-color: var(--color-fog) !important;
}

.dark-mode .faq-answer strong {
  color: var(--global-palette4) !important;
}

.dark-mode .faq-answer a {
  color: var(--color-lavender) !important;
}

/* Same page, another inline-styled component found while checking the FAQ
   accordion: a light-blue ".cta-strip" band (not an accessibility failure
   like the accordion — dark text on light blue still has good contrast —
   but it doesn't adapt to dark mode either, so it sits as a bright light
   box in an otherwise dark page. Fixed for the same visual-consistency
   reason as the Soft Landing page's stray Kadence column colors. */
.dark-mode .cta-strip {
  background-color: var(--surface-elevated) !important;
  color: var(--global-palette5) !important;
}

/* .cta-btn inside this strip intentionally NOT touched: confirmed live its
   own blue background (rgb(24,95,165)) + near-white text already has good
   contrast on its own — a brand-consistency nitpick (not Lavender), not a
   legibility problem, and a selector guess didn't even match it (some
   other rule in the same inline block wins) — not worth chasing further
   this round. */

/* --- Left-anchored hero (service variant) -------------------------------
   DESIGN-service.md hard-forbids the centered-hero pattern, and the
   ported .hero-section is centered — this is the approved left-anchored
   variant. Reuses .hero-headline / .hero-subtext / .hero-cta-group /
   .trust-strip inside it, overriding only their centering. */
.hero-service {
  max-width: var(--page-max-width) !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding: var(--spacing-64) var(--spacing-24) var(--spacing-48) !important;
  text-align: left;
}

.hero-service .hero-subtext {
  margin-left: 0;   /* .hero-subtext's own margin:0 auto centers its box */
  margin-right: 0;
}

.hero-service .hero-cta-group {
  justify-content: flex-start;
}

.hero-service .trust-strip {
  margin-top: var(--spacing-16);
}

/* --- Triage row-links (Pick your problem) -------------------------------
   Ruled-table rows that are links: whole row is the tap target. Label /
   promise / price("from $X →") on one hairline row each — explicitly not
   a card grid, per DESIGN-service.md. Arrow stays in the price span, in
   text color (Lavender is reserved for the two real CTAs on this page). */
.ruled-table a.ruled-table-row-link {
  display: grid;
  grid-template-columns: minmax(150px, 2fr) 3fr auto;
  gap: var(--spacing-16);
  align-items: baseline;
  min-height: 44px;
  padding: var(--spacing-16) var(--spacing-24);
  border-bottom: 1px solid var(--color-fog);
  text-decoration: none;
}

.ruled-table a.ruled-table-row-link:last-child {
  border-bottom: none;
}

.ruled-table a.ruled-table-row-link:hover {
  background-color: var(--color-mist);
}

.dark-mode .ruled-table a.ruled-table-row-link:hover {
  background-color: var(--surface-elevated);
}

.triage-label {
  font-weight: var(--font-weight-bold);
  color: var(--color-carbon);
}

.dark-mode .triage-label {
  color: var(--global-palette4);
}

.triage-promise {
  font-size: var(--text-body);
  color: var(--color-graphite);
}

.dark-mode .triage-promise {
  color: var(--global-palette5);
}

.triage-price {
  font-weight: var(--font-weight-medium);
  color: var(--color-carbon);
  white-space: nowrap;
}

.dark-mode .triage-price {
  color: var(--global-palette4);
}

@media (max-width: 600px) {
  .ruled-table a.ruled-table-row-link {
    grid-template-columns: 1fr auto;
    padding: var(--spacing-16);
  }

  .triage-promise {
    grid-column: 1 / -1;
    grid-row: 2;
  }
}

/* --- Numbered steps, stacked --------------------------------------------
   Reuses .how-it-works-step (number/heading/body styling) but as a
   vertical numbered stack — DESIGN-service.md's sanctioned "numbered list
   rows" shape — instead of the booking page's 2x2 grid. Same
   inner-container hook as the grid version, same Gutenberg wrapper. */
.steps-stack > .wp-block-group__inner-container {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--spacing-32);
  margin: var(--spacing-32) 0;
}

/* --- Person section: grid must live on the inner container --------------
   The ported .section-intro-jin rule puts its 1fr/2fr grid on the group
   element itself, but Gutenberg renders an intermediate
   .wp-block-group__inner-container between the group and its children —
   same failure family as the booking page's steps grid, but confirmed
   live (2026-07-23) to be worse here: since .section-intro-jin ITSELF
   still carries its own old "display:grid; grid-template-columns:1fr 2fr"
   (kept as-is, marked block), and now has exactly one child (the
   inner-container) instead of the two it was written for, that lone
   child lands in column 1 alone — 1fr out of the outer's own 1fr+2fr=3fr
   total — and then this rule's inner grid splits whatever narrow slice
   IT received in the correct 1:2 ratio, compounding into a photo
   rendered at ~104px on a 1440px screen instead of ~380px. Neutralizing
   the outer grid to a single column (below) so its one child fills the
   full section width; the real 2-column split happens only here, one
   level deeper, same as it already worked correctly for .steps-stack
   (which has no such outer-grid legacy to conflict with). */
.section-intro-jin {
  grid-template-columns: 1fr !important;
}

.section-intro-jin > .wp-block-group__inner-container {
  display: grid;
  grid-template-columns: 1fr 2fr;
  align-items: center;
  gap: var(--spacing-48);
  width: 100%;
}

@media (max-width: 782px) {
  .section-intro-jin > .wp-block-group__inner-container {
    grid-template-columns: 1fr;
  }
}

/* ==========================================================================
   Services / Contact / My Story pages (2026-07-24)
   Full contrast sweep confirmed the same two failure modes already fixed
   on the homepage and Soft Landing/FAQ, recurring on three more pages.
   ========================================================================== */

/* Same ".dark-mode .entry-content a" collision as the homepage's primary
   buttons (fixed above, 2026-07-23), but hitting a different Kadence
   block type here: the Services/My Story "Request via contact form" /
   "Order food now" / "Get Help now" buttons are Kadence's own Advanced
   Button block (.kb-button.kt-button inside .wp-block-kadence-advancedbtn),
   not a plain Gutenberg .wp-block-button — so they have no .wp-block-button
   ancestor and the existing fix's selector never matches them. Confirmed
   live: white text on Lavender, contrast 2.56:1. Same Carbon-on-Lavender
   fix, :not() guards on the link itself since that's where .button-ghost/
   .is-style-outline actually live on this block type (unlike the plain
   button block, where they're on the wrapper). */
.dark-mode .entry-content a.kb-button.kt-button:not(.button-ghost):not(.is-style-outline) {
  color: var(--color-carbon) !important;
}

/* Same hardcoded-pastel-background failure as the Soft Landing page's
   stray Kadence columns (fixed above) — five more info/pricing cards on
   the Services page, each with its own hand-picked light background that
   never adapts to dark mode, confirmed via contrast sweep (all near
   1.0-1.13:1 against this file's near-white dark-mode text). Same fix,
   same per-instance scoping (not the generic .kt-inside-inner-col, reused
   all over this site). */
.dark-mode .kadence-column257_171e18-e8 .kt-inside-inner-col,
.dark-mode .kadence-column257_1ae75d-fe .kt-inside-inner-col,
.dark-mode .kadence-column257_6c9945-5c .kt-inside-inner-col,
.dark-mode .kadence-column257_bcb0a2-07 .kt-inside-inner-col,
.dark-mode .kadence-column257_3028a9-ea .kt-inside-inner-col {
  background-color: var(--surface-canvas) !important;
}

/* Same failure, one card on the Contact page (the "Even if you don't know
   what you need..." note, beige rgb(241,234,223)). */
.dark-mode .kadence-column200_03db85-bf .kt-inside-inner-col {
  background-color: var(--surface-canvas) !important;
}

/* ==========================================================================
   Craving Fixer order builder page layout (2026-07-24)
   Layout + the few controls the Service-components block (above) doesn't
   already cover, per the OrderBuilder.dc.html prototype (variant 1a).
   The components themselves — .radio-card, .form-field, .form-success,
   .ruled-table-row, .status-chip, .sticky-action-bar, .trust-strip — are
   all reused from that block, not re-implemented. Behavior lives in
   order-builder.js (enqueued from functions.php); the markup is a single
   wp:html block on the page.
   ========================================================================== */

/* Defensive: WP/Kadence resets occasionally set display on generic divs;
   the builder toggles visibility exclusively via the hidden attribute. */
.order-builder [hidden] {
  display: none !important;
}

.order-builder {
  max-width: 1200px;
  margin: 0 auto;
}

@media (min-width: 783px) {
  .order-builder {
    display: grid;
    grid-template-columns: 5fr 7fr;
    gap: 56px;
    align-items: start;
  }
}

.ob-lede {
  font-size: 15px;
  line-height: 1.55;
  color: var(--color-graphite);
  margin: 10px 0 0;
  max-width: 420px;
}

.dark-mode .ob-lede {
  color: var(--global-palette5);
}

.ob-chip-row {
  display: flex;
  align-items: center;
  gap: var(--spacing-12);
  margin-top: var(--spacing-16);
  flex-wrap: wrap;
}

.ob-hours-note {
  font-size: 12px;
  color: var(--color-ash);
}

.dark-mode .ob-hours-note {
  color: var(--global-palette6);
}

.order-builder .trust-strip {
  margin-top: 14px;
}

/* --- Numbered section headers (01–04) ----------------------------------- */
.ob-section-head {
  display: flex;
  align-items: baseline;
  gap: var(--spacing-12);
  border-bottom: 1px solid var(--color-fog);
  padding-bottom: var(--spacing-12);
  margin-top: 40px;
}

.ob-section-num {
  font-family: var(--font-fraunces);
  font-weight: var(--font-weight-semibold);
  font-size: 13px;
  color: var(--color-ash);
}

.dark-mode .ob-section-num {
  color: var(--global-palette6);
}

.ob-section-title {
  font-family: var(--font-fraunces);
  font-weight: var(--font-weight-semibold);
  font-size: 19px;
  margin: 0;
  color: var(--color-carbon);
}

.dark-mode .ob-section-title {
  color: var(--global-palette4);
}

/* --- Category rows (hairline list, not cards — per prototype) ------------ */
.ob-cat-row {
  display: flex;
  align-items: center;
  gap: 14px;
  min-height: 52px;
  border-bottom: 1px solid var(--color-fog);
  cursor: pointer;
  padding: 4px 0;
}

.ob-cat-row input[type="radio"] {
  appearance: none;
  -webkit-appearance: none;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 1.5px solid var(--color-fog);
  margin: 0;
  flex: none;
  cursor: pointer;
  background-color: transparent;
  box-sizing: border-box;
}

.ob-cat-row input[type="radio"]:checked {
  border: 7px solid var(--color-lavender);
}

.ob-cat-row input[type="radio"]:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(145, 141, 246, 0.35);
}

.ob-cat-name {
  flex: 1;
  font-size: 15px;
  color: var(--color-carbon);
}

.dark-mode .ob-cat-name {
  color: var(--global-palette4);
}

.ob-cat-row:has(input:checked) .ob-cat-name {
  font-weight: var(--font-weight-bold);
}

.ob-cat-kr {
  font-size: 13px;
  color: var(--color-ash);
}

.dark-mode .ob-cat-kr {
  color: var(--global-palette6);
}

.ob-other-note {
  font-size: 12px;
  color: var(--color-ash);
  margin: 10px 0 0;
}

.dark-mode .ob-other-note {
  color: var(--global-palette6);
}

/* --- Add-on rows (checkbox variant of the category rows) ----------------- */
.ob-addon-row {
  display: flex;
  align-items: center;
  gap: 14px;
  min-height: 56px;
  border-bottom: 1px solid var(--color-fog);
  cursor: pointer;
  padding: 6px 0;
}

.ob-checkwrap {
  position: relative;
  width: 22px;
  height: 22px;
  flex: none;
}

.ob-checkwrap input[type="checkbox"] {
  appearance: none;
  -webkit-appearance: none;
  width: 22px;
  height: 22px;
  border-radius: 8px;
  border: 1.5px solid var(--color-fog);
  background-color: transparent;
  margin: 0;
  cursor: pointer;
  display: block;
  box-sizing: border-box;
}

.ob-checkwrap input[type="checkbox"]:checked {
  border-color: var(--color-lavender);
  background-color: var(--color-lavender);
}

.ob-checkwrap input[type="checkbox"]:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(145, 141, 246, 0.35);
}

.ob-checkmark {
  position: absolute;
  inset: 0;
  display: none;
  align-items: center;
  justify-content: center;
  pointer-events: none;
  color: var(--color-carbon);
  font-size: 13px;
  font-weight: var(--font-weight-bold);
}

.ob-checkwrap input[type="checkbox"]:checked ~ .ob-checkmark {
  display: flex;
}

.ob-addon-body {
  flex: 1;
  min-width: 0;
}

.ob-addon-name {
  display: block;
  font-size: 15px;
  color: var(--color-carbon);
}

.dark-mode .ob-addon-name {
  color: var(--global-palette4);
}

.ob-addon-sub {
  display: block;
  font-size: 12px;
  color: var(--color-ash);
  margin-top: 1px;
}

.dark-mode .ob-addon-sub {
  color: var(--global-palette6);
}

.ob-addon-price {
  font-size: 13.5px;
  font-weight: var(--font-weight-bold);
  color: var(--color-graphite);
}

.dark-mode .ob-addon-price {
  color: var(--global-palette5);
}

/* --- Drinks quantity stepper (2026-07-24) --------------------------------
   Drinks became a 0–9 quantity add-on (people order more than one) — a
   − / + stepper replaces its checkbox. Not a prototype component; sized
   and colored to sit flush with the checkbox rows around it. The row is
   a div (not a label): row clicks shouldn't toggle anything here, only
   the buttons change state. is-selected (set by JS when qty > 0) reuses
   the radio-card selected tint for visual consistency. */
.ob-qty-addon {
  cursor: default;
}

.ob-qty-addon.is-selected .ob-addon-name {
  font-weight: var(--font-weight-bold);
}

.ob-qty {
  display: flex;
  align-items: center;
  gap: var(--spacing-8);
  flex: none;
}

.ob-qty-btn {
  width: 32px;
  height: 32px;
  border: 1.5px solid var(--color-fog);
  border-radius: 50%;
  background: transparent;
  color: var(--color-carbon);
  font-size: 16px;
  font-weight: var(--font-weight-bold);
  line-height: 1;
  cursor: pointer;
  padding: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
}

.dark-mode .ob-qty-btn {
  color: var(--global-palette4);
}

.ob-qty-btn:hover:not(:disabled) {
  border-color: var(--color-lavender);
  color: var(--color-lavender);
}

.ob-qty-btn:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(145, 141, 246, 0.35);
}

.ob-qty-btn:disabled {
  opacity: 0.35;
  cursor: default;
}

.ob-qty-num {
  min-width: 20px;
  text-align: center;
  font-size: 15px;
  font-weight: var(--font-weight-bold);
  color: var(--color-carbon);
}

.dark-mode .ob-qty-num {
  color: var(--global-palette4);
}

/* --- Messenger app selector (contract addition, not in the prototype:
   Airtable needs app = WhatsApp | LINE | KakaoTalk as a separate select
   value, so the prototype's single combined field becomes three small
   radio pills + an ID field. Pills reuse the radio-card look at a smaller
   size; selected state via :has(), same approved technique as the Soft
   Landing package cards. ---------------------------------------------- */
.ob-app-row {
  display: flex;
  gap: var(--spacing-8);
  flex-wrap: wrap;
}

.ob-app-pill {
  display: flex;
  align-items: center;
  gap: var(--spacing-8);
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-tags);
  padding: 10px 14px;
  cursor: pointer;
  font-size: var(--text-body-sm, 14px);
  color: var(--color-carbon);
  box-sizing: border-box;
}

.dark-mode .ob-app-pill {
  color: var(--global-palette4);
}

.ob-app-pill:has(input:checked) {
  border: 1.5px solid var(--color-lavender);
  background-color: rgba(145, 141, 246, 0.08);
  font-weight: var(--font-weight-bold);
}

.dark-mode .ob-app-pill:has(input:checked) {
  background-color: rgba(145, 141, 246, 0.16);
}

.ob-app-pill input[type="radio"] {
  appearance: none;
  -webkit-appearance: none;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  border: 1.5px solid var(--color-fog);
  margin: 0;
  flex: none;
  cursor: pointer;
  background-color: transparent;
  box-sizing: border-box;
}

.ob-app-pill input[type="radio"]:checked {
  border: 5px solid var(--color-lavender);
}

.ob-app-pill input[type="radio"]:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(145, 141, 246, 0.35);
}

/* --- Form inputs inside the builder -------------------------------------
   Base border/focus styling comes from the theme's generic input rules;
   this only normalizes sizing (the prototype's full-width fields).
   :not([type=radio]) guard: the app pills live inside a .form-field too,
   and this rule ties with their own width rule on specificity — without
   the guard, source order stretches the 16px pill dots to full width
   (confirmed in the local harness before shipping). */
.order-builder .form-field input:not([type="radio"]):not([type="checkbox"]),
.order-builder .form-field textarea,
.order-builder .form-field select {
  width: 100%;
  box-sizing: border-box;
}

.order-builder .form-field select {
  height: 46px;
  border: 1px solid var(--color-fog);
  border-radius: 8px;
  background-color: var(--surface-canvas);
  color: var(--color-carbon);
  padding: 0 14px;
  font-family: inherit;
  font-size: 15px;
}

.dark-mode .order-builder .form-field select {
  background-color: var(--surface-elevated);
  color: var(--global-palette4);
}

.ob-field-hint {
  font-size: 12px;
  color: var(--color-ash);
  margin: var(--spacing-8) 0 0;
}

.dark-mode .ob-field-hint {
  color: var(--global-palette6);
}

/* --- Submit error banner ------------------------------------------------- */
.ob-error {
  font-size: 13px;
  color: var(--color-magenta);
  margin-top: var(--spacing-16);
}

/* --- Desktop summary panel ("Your request") ------------------------------ */
.ob-summary {
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-cards);
  padding: var(--spacing-24);
  margin-top: 40px;
}

.ob-summary-title {
  font-family: var(--font-fraunces);
  font-weight: var(--font-weight-semibold);
  font-size: 17px;
  margin: 0 0 var(--spacing-8);
  color: var(--color-carbon);
}

.dark-mode .ob-summary-title {
  color: var(--global-palette4);
}

.ob-summary .ruled-table-row {
  padding: 10px 0;
  font-size: 13.5px;
}

.ob-summary-total-row {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--spacing-16);
  padding: var(--spacing-16) 0 4px;
}

.ob-summary-total-label {
  font-size: 13.5px;
  font-weight: var(--font-weight-bold);
  color: var(--color-carbon);
}

.dark-mode .ob-summary-total-label {
  color: var(--global-palette4);
}

.ob-summary .ob-total {
  font-family: var(--font-fraunces);
  font-weight: var(--font-weight-semibold);
  font-size: 22px;
  color: var(--color-carbon);
}

.dark-mode .ob-summary .ob-total {
  color: var(--global-palette4);
}

.ob-summary .ob-submit {
  width: 100%;
  margin-top: var(--spacing-12);
}

.ob-summary .ob-breakdown,
.ob-summary-micro {
  font-size: 11.5px;
  color: var(--color-ash);
  margin: 10px 0 0;
  text-align: center;
}

.dark-mode .ob-summary .ob-breakdown,
.dark-mode .ob-summary-micro {
  color: var(--global-palette6);
}

/* --- Success-box extras (base .form-success styling reused) -------------- */
.ob-success-recap {
  font-size: 13.5px;
  font-weight: var(--font-weight-bold);
  color: var(--color-carbon);
  margin-top: var(--spacing-16);
  padding-top: 14px;
  border-top: 1px solid var(--color-fog);
}

.dark-mode .ob-success-recap {
  color: var(--global-palette4);
}

.ob-reset {
  background: transparent;
  border: none;
  color: var(--color-graphite);
  font-family: inherit;
  font-size: 13.5px;
  font-weight: var(--font-weight-medium);
  padding: 10px 0;
  margin-top: var(--spacing-12);
  cursor: pointer;
  text-decoration: underline;
}

.dark-mode .ob-reset {
  color: var(--global-palette5);
}

/* --- Which action UI shows where -----------------------------------------
   Mobile: sticky bottom bar. Desktop: the summary panel owns the CTA and
   the bar is hidden entirely (prototype showBar/showPanel logic, done in
   CSS instead of JS since it's purely viewport-dependent). */
@media (min-width: 783px) {
  .order-builder .sticky-action-bar {
    display: none;
  }
}

@media (max-width: 782px) {
  .ob-summary {
    display: none;
  }

  .order-builder .sticky-action-bar {
    margin-top: var(--spacing-32);
  }
}

/* Same failure across the JA (Polylang) copies of these pages (2026-07-24).
   Polylang duplicates each page as a separate post, so every Kadence block
   gets NEW generated IDs — none of the per-instance fixes above reach the
   JA versions. Full contrast sweep of all JA pages found 10 recurrences:
   JA Services (post 411, 5 cards: PayPal note band, both pricing tables,
   the how-to note, the Most-popular card), JA Soft Landing (post 427,
   4 cards: Most-popular card, who-this-is-for bullets, transport-cost
   note, booking-form column), JA Contact (post 416, 1 card: the Jin
   quote). JA Craving Fixer / My Story / FAQ swept clean. NOTE for future
   pages: any newly translated or duplicated page will mint fresh IDs and
   need its own entries here — sweep new pages in dark mode before calling
   them done. */
.dark-mode .kadence-column411_599f5a-b4 .kt-inside-inner-col,
.dark-mode .kadence-column411_300b39-94 .kt-inside-inner-col,
.dark-mode .kadence-column411_e39a22-db .kt-inside-inner-col,
.dark-mode .kadence-column411_953e4c-9b .kt-inside-inner-col,
.dark-mode .kadence-column411_4b4b83-ed .kt-inside-inner-col,
.dark-mode .kadence-column427_22d70c-78 .kt-inside-inner-col,
.dark-mode .kadence-column427_5c1c4e-6d .kt-inside-inner-col,
.dark-mode .kadence-column427_b39eb6-aa .kt-inside-inner-col,
.dark-mode .kadence-column427_f4c669-d4 .kt-inside-inner-col,
.dark-mode .kadence-column416_c28c77-bb .kt-inside-inner-col {
  background-color: var(--surface-canvas) !important;
}

/* Logo in dark mode: the logo file itself has a solid white background, so
   it sits as a hard white rectangle on the dark header. CSS can't remove a
   baked-in background — the real fix is re-exporting the logo with a
   transparent background and re-uploading it (Customize → Header → Logo),
   at which point this rule does nothing harmful and can stay. Until then:
   rounded corners + a slight dim so the white block reads as a deliberate
   chip instead of a glaring rectangle. */
.dark-mode .custom-logo {
  border-radius: var(--radius-cards);
  filter: brightness(0.92);
}

/* PHASE A: rhythm + depth — start
   ==========================================================================
   Homepage-only compositional pass (2026-07-26). CSS only, no markup
   changes. Fixes the "five of six sections share one centered H2 +
   centered paragraph + centered button shape" flatness problem.

   All new selectors below are scoped to `body.home` (WordPress's own
   automatic front-page body class, confirmed live 2026-07-26 — no markup
   edit needed) so nothing here reaches other pages that reuse the same
   generic .hero-service / .section-service / .section-intro-jin /
   .section-how-it-works classes.

   Six homepage sections, DOM order (confirmed live 2026-07-26 — each is a
   direct child of .entry-content.single-content, each with exactly one
   Gutenberg-generated .wp-block-group__inner-container child):
     1. .hero-service                                        — Hero
     2. .section-service:has(.ruled-table)                   — Pick your problem
     3. .section-service:has(.status-chip-kst)                — Craving Fixer band
     4. .section-intro-jin                                    — Person section
     5. .section-how-it-works                                 — How it works
     6. .section-service, neither of the above two            — Final CTA
   (2) and (6) share the same generic .section-service class with no class
   of their own — (6) is identified as "the one that's neither of the
   other two", same :has() approach this file already uses for (3).

   The brief's "--border-*" token doesn't exist in this design system (no
   literal --border-* custom property anywhere in DESIGN.md/tokens.json/
   this file) — --color-fog is the existing dark-mode-aware hairline/
   border token used for this exact role everywhere else in this file, so
   it's used here too.
   ========================================================================== */

/* --- 1. Alternating section surfaces --------------------------------------
   Odd sections (1/3/5) stay on plain --surface-canvas: no rule needed,
   that's already the default with no background-color set. Even sections
   (2/4/6) step up to --surface-linen-band, full-bleed, per locked
   decision 9: the outer group becomes the full-width bleeding band
   (max-width removed, horizontal padding zeroed) and its own
   .wp-block-group__inner-container child does the actual 1200px
   centering + gutter — the two-layer pattern decision 9 asks every new
   section to use. --surface-linen-band already flips with .dark-mode
   (Phase 1), so no separate dark override is needed here (BG-2). Each
   even section's own existing vertical padding (top/bottom, already
   !important elsewhere in this file) is untouched by these horizontal-
   only overrides. */

/* Pick your problem (2) */
body.home .section-service:has(.ruled-table) {
  max-width: none !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
  background-color: var(--surface-linen-band);
}

body.home .section-service:has(.ruled-table) > .wp-block-group__inner-container {
  max-width: var(--page-max-width);
  margin-left: auto;
  margin-right: auto;
  padding-left: var(--spacing-24);
  padding-right: var(--spacing-24);
}

@media (max-width: 480px) {
  body.home .section-service:has(.ruled-table) > .wp-block-group__inner-container {
    padding-left: var(--spacing-16);
    padding-right: var(--spacing-16);
  }
}

/* Person section (4) — .section-intro-jin's own horizontal padding is set
   !important twice elsewhere in this file (its own base rule + the later
   mobile-overflow-guard list, including a <=480px variant); the
   `body.home` prefix here adds enough specificity to beat all of those
   without editing any of them. The existing person-section grid
   (.section-intro-jin > .wp-block-group__inner-container, set elsewhere
   in this file) is untouched — this only adds the centering/gutter
   properties that rule doesn't already set. */
body.home .section-intro-jin {
  max-width: none !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
  background-color: var(--surface-linen-band);
}

body.home .section-intro-jin > .wp-block-group__inner-container {
  max-width: var(--page-max-width);
  margin-left: auto;
  margin-right: auto;
  padding-left: var(--spacing-24);
  padding-right: var(--spacing-24);
}

@media (max-width: 480px) {
  body.home .section-intro-jin > .wp-block-group__inner-container {
    padding-left: var(--spacing-16);
    padding-right: var(--spacing-16);
  }
}

/* Final CTA (6) */
body.home .section-service:not(:has(.ruled-table)):not(:has(.status-chip-kst)) {
  max-width: none !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
  background-color: var(--surface-linen-band);
}

body.home .section-service:not(:has(.ruled-table)):not(:has(.status-chip-kst)) > .wp-block-group__inner-container {
  max-width: var(--page-max-width);
  margin-left: auto;
  margin-right: auto;
  padding-left: var(--spacing-24);
  padding-right: var(--spacing-24);
}

@media (max-width: 480px) {
  body.home .section-service:not(:has(.ruled-table)):not(:has(.status-chip-kst)) > .wp-block-group__inner-container {
    padding-left: var(--spacing-16);
    padding-right: var(--spacing-16);
  }
}

/* --- 2. Blueprint hairline rules + grid-tick texture ----------------------
   1px top hairline on every band boundary, all six sections. Grid-tick
   texture on How it works only, homepage instance only (.section-how-it-
   works is reused as-is on the Korean-lesson-booking page — the
   `body.home` scope keeps the texture off that page). color-mix() holds
   the tick opacity at exactly 3% of an existing token (--color-graphite)
   rather than inventing a new raw color; the pattern is static (no
   animation), so no prefers-reduced-motion gating applies. */
body.home .hero-service,
body.home .section-service:has(.ruled-table),
body.home .section-service:has(.status-chip-kst),
body.home .section-intro-jin,
body.home .section-how-it-works,
body.home .section-service:not(:has(.ruled-table)):not(:has(.status-chip-kst)) {
  border-top: 1px solid var(--color-fog);
}

body.home .section-how-it-works {
  background-image: repeating-linear-gradient(
    90deg,
    color-mix(in srgb, var(--color-graphite) 3%, transparent) 0,
    color-mix(in srgb, var(--color-graphite) 3%, transparent) 1px,
    transparent 1px,
    transparent var(--spacing-64)
  );
}

/* --- 3. Mono eyebrow label utility -----------------------------------------
   No mono token exists in DESIGN.md/tokens.json (checked) — ui-monospace
   stack per this phase's own fallback instruction. This is a deliberate,
   scoped exception to decision 8's :lang()-only-font rule: eyebrow labels
   are short Latin/numeric tags ("01 / SERVICES"), not body copy. Class
   only — not applied to any block in this file. */
.eyebrow-label {
  display: block;
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", monospace;
  font-size: var(--text-caption);
  font-weight: var(--font-weight-medium);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--color-graphite);
  margin: 0 0 var(--spacing-8);
}

.dark-mode .eyebrow-label {
  color: var(--global-palette5);
}

/* --- 4 & 5. Hero type-scale jump + hero asymmetry (>=1024px only — mobile's
   own existing .hero-headline/.hero-subtext/.hero-cta-group overrides at
   <=782px are untouched by everything in this sub-block) ----------------- */
@media (min-width: 1024px) {
  body.home .hero-service .hero-headline {
    font-size: clamp(var(--text-display), 6vw + 1rem, calc(var(--text-display) + var(--spacing-32)));
    letter-spacing: calc(var(--tracking-display) * 2);
    margin-bottom: var(--spacing-32);
  }

  /* Re-assert DESIGN.md's CJK tracking cap: the rule above has higher
     specificity than the base .hero-headline:lang(ja)/:lang(ko) rule it
     would otherwise beat, which would over-tighten JA/KO glyphs. */
  body.home .hero-service .hero-headline:lang(ja),
  body.home .hero-service .hero-headline:lang(ko) {
    letter-spacing: -0.5px;
  }

  body.home .hero-service .hero-subtext {
    font-size: var(--text-body);
    line-height: var(--leading-body);
  }

  body.home .hero-service > .wp-block-group__inner-container {
    max-width: 60%;
  }
}

/* --- 6. Section vertical rhythm -------------------------------------------
   Hero and the final CTA get the largest padding (--spacing-64 +
   --spacing-24 via calc, composed from existing tokens — not a new
   value); "How it works" (the three-step band) gets the tightest
   (--spacing-24). Craving Fixer's band keeps its already-reduced
   --spacing-32 from an earlier round (untouched); Pick your problem and
   the person section stay at this file's default --section-gap (64px).
   Four distinct tiers across six sections — not a single uniform value. */
body.home .hero-service {
  padding-top: calc(var(--spacing-64) + var(--spacing-24)) !important;
  padding-bottom: var(--spacing-64) !important;
}

body.home .section-service:not(:has(.ruled-table)):not(:has(.status-chip-kst)) {
  padding-top: calc(var(--spacing-64) + var(--spacing-24)) !important;
  padding-bottom: calc(var(--spacing-64) + var(--spacing-24)) !important;
}

body.home .section-how-it-works {
  padding-top: var(--spacing-24) !important;
  padding-bottom: var(--spacing-24) !important;
}
/* PHASE A: rhythm + depth — end */

/* PHASE B: Services page (EN) rebuild — start
   ==========================================================================
   PILOT (2026-07-26) for the requested FAQ/My Story/Soft Landing/Services
   rebuild in EN+JA — this page only, for review before the rest. Pairs
   with services-en.html (paste-ready core-Gutenberg markup replacing this
   page's current Kadence-block markup, per locked decision 1). All new
   selectors scoped to `body.page-id-257` (this page's own WP body class,
   confirmed live 2026-07-26) so nothing here reaches any other page.

   Reuses as-is: .hero-service/.hero-headline/.hero-subtext, .ruled-table/
   .ruled-table-row-link/.triage-label/.triage-promise/.triage-price,
   .eyebrow-label, .trust-strip, .section-service, .wp-block-button
   (including the existing dark-mode Carbon-on-Lavender fix — the
   services-en.html markup wraps every button link in a real
   .wp-block-button div specifically so it inherits that fix, rather than
   duplicating it here).

   Five top-level sections in DOM order: hero/intro (odd) → #TRAVELLERS
   (even) → #EXPATS (odd) → #DAILY (even) → final CTA (odd). Same
   alternating-surface / hairline pattern as Phase A, using the page's own
   anchor IDs (already present for the homepage's row-links) instead of
   :has() since they're simpler and just as reliable here.
   ========================================================================== */

body.page-id-257 #TRAVELLERS,
body.page-id-257 #DAILY {
  max-width: none !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
  background-color: var(--surface-linen-band);
}

body.page-id-257 #TRAVELLERS > .wp-block-group__inner-container,
body.page-id-257 #DAILY > .wp-block-group__inner-container {
  max-width: var(--page-max-width);
  margin-left: auto;
  margin-right: auto;
  padding-left: var(--spacing-24);
  padding-right: var(--spacing-24);
}

@media (max-width: 480px) {
  body.page-id-257 #TRAVELLERS > .wp-block-group__inner-container,
  body.page-id-257 #DAILY > .wp-block-group__inner-container {
    padding-left: var(--spacing-16);
    padding-right: var(--spacing-16);
  }
}

body.page-id-257 .hero-service,
body.page-id-257 #TRAVELLERS,
body.page-id-257 #EXPATS,
body.page-id-257 #DAILY,
body.page-id-257 .section-service:not(#TRAVELLERS):not(#EXPATS):not(#DAILY) {
  border-top: 1px solid var(--color-fog);
}

/* Hero/intro + final CTA get the largest rhythm tier, same composed-token
   value as Phase A's homepage hero/final-CTA. Everything else on this page
   stays at the file's default --section-gap. */
body.page-id-257 .hero-service {
  padding-top: calc(var(--spacing-64) + var(--spacing-24)) !important;
  padding-bottom: var(--spacing-64) !important;
}

body.page-id-257 .section-service:not(#TRAVELLERS):not(#EXPATS):not(#DAILY) {
  padding-top: calc(var(--spacing-64) + var(--spacing-24)) !important;
  padding-bottom: calc(var(--spacing-64) + var(--spacing-24)) !important;
}

/* --- New components this page needs --------------------------------------- */

/* Individual service explainer (Soft Landing / Local Orientation / Settle
   In / VIP Booking) — hairline separator between stacked instances, none
   on the first so it doesn't double up with the section's own top border. */
.service-detail {
  margin-top: var(--spacing-32);
  padding-top: var(--spacing-32);
  border-top: 1px solid var(--color-fog);
}

.service-detail:first-of-type {
  margin-top: 0;
  padding-top: 0;
  border-top: none;
}

.service-detail h3 {
  margin: 0 0 var(--spacing-8);
}

/* Inline price tag next to a service name — a quiet label, not a CTA, so
   it stays on the Fog/Carbon pairing (Lavender is reserved for actual
   conversion actions per decision 2). */
.service-detail-price {
  display: inline-block;
  font-size: var(--text-caption);
  font-weight: var(--font-weight-medium);
  color: var(--color-carbon);
  background-color: var(--surface-elevated);
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-tags);
  padding: var(--spacing-4) var(--spacing-12);
  vertical-align: middle;
  margin-left: var(--spacing-8);
}

.dark-mode .service-detail-price {
  color: var(--global-palette4);
}

/* Feature checklist — reused wherever a service lists what's included. */
.feature-list {
  list-style: none;
  margin: var(--spacing-16) 0;
  padding: 0;
  display: grid;
  gap: var(--spacing-8);
}

.feature-list li {
  position: relative;
  padding-left: var(--spacing-24);
  color: var(--color-graphite);
}

.dark-mode .feature-list li {
  color: var(--global-palette5);
}

.feature-list li::before {
  content: "✓";
  position: absolute;
  left: 0;
  color: var(--color-mint);
  font-weight: var(--font-weight-bold);
}

/* Two-package comparison — the DESIGN-service.md-sanctioned exception to
   "no equal card rows" (exactly 2 packages being compared). */
.package-compare {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-24);
  margin: var(--spacing-24) 0;
}

@media (max-width: 782px) {
  .package-compare {
    grid-template-columns: 1fr;
  }
}

.package-card {
  border: 1px solid var(--color-fog);
  border-radius: var(--radius-cards);
  background-color: var(--surface-elevated);
  padding: var(--spacing-24);
}

.package-card h4 {
  margin: var(--spacing-8) 0;
  font-size: var(--text-heading-sm);
}

/* Same Lavender-border-plus-subtle-fill treatment as the approved
   radio-card "selected" state, reused here for the featured package. */
.package-card.is-featured {
  border: 1.5px solid var(--color-lavender);
  background-color: rgba(145, 141, 246, 0.08);
}

.dark-mode .package-card.is-featured {
  background-color: rgba(145, 141, 246, 0.16);
}

.package-card-note {
  font-size: 12px;
  color: var(--color-ash);
  margin: 0 0 var(--spacing-16);
}

.dark-mode .package-card-note {
  color: var(--global-palette6);
}

.package-card .wp-block-button {
  margin-top: var(--spacing-16);
}

/* Plain (non-link) ruled-table row — the per-service pricing lists, using
   the same hairline-row visual language as .ruled-table-row-link but
   without hover/click affordance since these rows aren't links. */
.ruled-table-row {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--spacing-16);
  min-height: 44px;
  padding: var(--spacing-16) var(--spacing-24);
  border-bottom: 1px solid var(--color-fog);
}

.ruled-table-row:last-child {
  border-bottom: none;
}

.ruled-table-row .triage-price {
  white-space: nowrap;
}
/* PHASE B: Services page (EN) rebuild — end */

/* PHASE C: visual richness — start
   ==========================================================================
   Follow-up (2026-07-26) to Phase A/B, approved after a before/after mockup
   review: push type weight, add one recurring signature accent (a
   blueprint corner-bracket + circular step badges, in Iris — the palette's
   existing "deeper accent" token, distinct from Lavender-which-stays-
   CTA-only per decision 2), and bump card radius/border for more visual
   confidence. CSS only — every change below targets a class that already
   exists in page content (homepage, live; Services, staged in
   services-en.html), no new markup anywhere. Scoped to body.home and
   body.page-id-257 so it can't reach other pages. --color-iris is defined
   once in :root (Phase 1) and, like Lavender/Carbon, is intentionally
   mode-invariant, so no separate .dark-mode override is needed for it.
   ========================================================================== */

/* --- Hero: bolder weight, bigger clamp ceiling, corner-bracket accent --- */
@media (min-width: 1024px) {
  body.home .hero-service .hero-headline,
  body.page-id-257 .hero-service .hero-headline,
  body.page-id-16 .hero-service .hero-headline,
  body.page-id-425 .hero-service .hero-headline,
  body.page-id-411 .hero-service .hero-headline,
  body.page-id-386 .hero-service .hero-headline,
  body.page-id-422 .hero-service .hero-headline {
    font-weight: var(--font-weight-bold);
    font-size: clamp(var(--text-display), 6vw + 1rem, calc(var(--text-display) + var(--spacing-48)));
  }
}

body.home .hero-service,
body.page-id-257 .hero-service,
body.page-id-16 .hero-service,
body.page-id-425 .hero-service,
body.page-id-411 .hero-service,
body.page-id-386 .hero-service,
body.page-id-422 .hero-service {
  position: relative;
}

body.home .hero-service::before,
body.page-id-257 .hero-service::before,
body.page-id-16 .hero-service::before,
body.page-id-425 .hero-service::before,
body.page-id-411 .hero-service::before,
body.page-id-386 .hero-service::before,
body.page-id-422 .hero-service::before {
  content: "";
  position: absolute;
  top: var(--spacing-24);
  left: var(--spacing-24);
  width: 14px;
  height: 14px;
  border-top: 2px solid var(--color-iris);
  border-left: 2px solid var(--color-iris);
  pointer-events: none;
}

@media (max-width: 480px) {
  body.home .hero-service::before,
  body.page-id-257 .hero-service::before,
  body.page-id-16 .hero-service::before,
  body.page-id-425 .hero-service::before,
  body.page-id-411 .hero-service::before,
  body.page-id-386 .hero-service::before,
  body.page-id-422 .hero-service::before {
    display: none;
  }
}

/* --- Eyebrow label: Iris + a small Lavender index mark. Base component
   (Phase A), so this reaches every current and future use of the class —
   currently only services-en.html (staged). --------------------------- */
.eyebrow-label {
  color: var(--color-iris);
  display: flex;
  align-items: center;
  gap: var(--spacing-8);
}

.eyebrow-label::before {
  content: "";
  width: 6px;
  height: 6px;
  background-color: var(--color-lavender);
  flex: none;
}

.dark-mode .eyebrow-label {
  color: var(--color-iris);
}

/* --- How it works: numbered text becomes a real circular badge --------- */
body.home .how-it-works-step-number {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border: 1.5px solid var(--color-iris);
  border-radius: 50%;
  color: var(--color-iris);
  font-size: var(--text-subheading);
}

/* --- Section H2s: this file never sets an explicit size (Kadence's own
   Customizer default was carrying it, which read quiet) — give the
   homepage/Services section headings the weight decision 8's Fraunces
   face is capable of. --------------------------------------------------- */
body.home .section-service h2,
body.home .section-intro-jin h2,
body.home .section-how-it-works h2,
body.page-id-257 .section-service h2,
body.page-id-16 .section-service h2,
body.page-id-16 .section-intro-jin h2,
body.page-id-425 .section-service h2,
body.page-id-425 .section-intro-jin h2,
body.page-id-411 .section-service h2,
body.page-id-386 .section-service h2,
body.page-id-422 .section-service h2 {
  font-size: var(--text-heading-lg);
  font-weight: var(--font-weight-bold);
}

@media (max-width: 480px) {
  body.home .section-service h2,
  body.home .section-intro-jin h2,
  body.home .section-how-it-works h2,
  body.page-id-257 .section-service h2,
  body.page-id-16 .section-service h2,
  body.page-id-16 .section-intro-jin h2,
  body.page-id-425 .section-service h2,
  body.page-id-425 .section-intro-jin h2,
  body.page-id-411 .section-service h2,
  body.page-id-386 .section-service h2,
  body.page-id-422 .section-service h2 {
    font-size: var(--text-heading);
  }
}

/* --- Package card (Services): bigger radius, corner-bracket accent, same
   Iris signature as the hero. --------------------------------------------- */
.package-card {
  position: relative;
  border-radius: var(--radius-3xl);
}

.package-card::before,
.package-card::after {
  content: "";
  position: absolute;
  width: 10px;
  height: 10px;
  pointer-events: none;
}

.package-card::before {
  top: 12px;
  left: 12px;
  border-top: 1.5px solid var(--color-iris);
  border-left: 1.5px solid var(--color-iris);
}

.package-card::after {
  bottom: 12px;
  right: 12px;
  border-bottom: 1.5px solid var(--color-iris);
  border-right: 1.5px solid var(--color-iris);
}
/* PHASE C: visual richness — end */

/* PHASE D: My Story (EN/JA), Services (JA), FAQ (EN/JA) — start
   ==========================================================================
   Five new pages built in the same component language as the homepage
   and Services (EN): My Story page-id-16 (EN) / page-id-425 (JA),
   Services JA page-id-411 (mirrors Services EN page-id-257 exactly —
   same anchors, same components), FAQ page-id-386 (EN) / page-id-422
   (JA). Every rule below is scoped to one of these five body classes so
   nothing reaches any other page. Craving Fixer JA is deliberately NOT
   included in this round — its page uses a different, simpler mechanism
   than the EN order-builder tool and needs a decision before touching.

   Reuses as-is (no new CSS): .hero-service, .eyebrow-label, .section-
   service, .section-intro-jin, .ruled-table/.ruled-table-row-link/
   .ruled-table-row, .service-detail, .package-compare/.package-card,
   .feature-list, .trust-strip, .wp-block-button — all already defined in
   Phase A/B/C. Two new components only: .story-trait-row (My Story) and
   .faq-group/.faq-item (FAQ's accordion).
   ========================================================================== */

/* --- My Story (EN + JA): hero(odd) → intro-jin(even) → final CTA(odd) -- */
body.page-id-16 .section-intro-jin,
body.page-id-425 .section-intro-jin {
  max-width: none !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
  background-color: var(--surface-linen-band);
}

body.page-id-16 .section-intro-jin > .wp-block-group__inner-container,
body.page-id-425 .section-intro-jin > .wp-block-group__inner-container {
  max-width: var(--page-max-width);
  margin-left: auto;
  margin-right: auto;
  padding-left: var(--spacing-24);
  padding-right: var(--spacing-24);
}

@media (max-width: 480px) {
  body.page-id-16 .section-intro-jin > .wp-block-group__inner-container,
  body.page-id-425 .section-intro-jin > .wp-block-group__inner-container {
    padding-left: var(--spacing-16);
    padding-right: var(--spacing-16);
  }
}

body.page-id-16 .hero-service,
body.page-id-16 .section-intro-jin,
body.page-id-16 .section-service,
body.page-id-425 .hero-service,
body.page-id-425 .section-intro-jin,
body.page-id-425 .section-service {
  border-top: 1px solid var(--color-fog);
}

body.page-id-16 .hero-service,
body.page-id-16 .section-service,
body.page-id-425 .hero-service,
body.page-id-425 .section-service {
  padding-top: calc(var(--spacing-64) + var(--spacing-24)) !important;
  padding-bottom: calc(var(--spacing-64) + var(--spacing-24)) !important;
}

/* Trait rows (Native Korean / Trilingual / Multicultural family) — NOT
   three equal cards (DESIGN-service.md hard rule), stacked hairline rows
   inside the existing .ruled-table container instead. */
.story-trait-row {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-4);
  padding: var(--spacing-16) var(--spacing-24);
  border-bottom: 1px solid var(--color-fog);
}

.story-trait-row:last-child {
  border-bottom: none;
}

.story-trait-row p {
  margin: 0;
  color: var(--color-graphite);
}

.dark-mode .story-trait-row p {
  color: var(--global-palette5);
}

/* --- Services (JA): identical structure/anchors to Services (EN), same
   selectors as the page-id-257 rules earlier in this file, just scoped
   to page-id-411. --------------------------------------------------- */
body.page-id-411 #TRAVELLERS,
body.page-id-411 #DAILY {
  max-width: none !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
  background-color: var(--surface-linen-band);
}

body.page-id-411 #TRAVELLERS > .wp-block-group__inner-container,
body.page-id-411 #DAILY > .wp-block-group__inner-container {
  max-width: var(--page-max-width);
  margin-left: auto;
  margin-right: auto;
  padding-left: var(--spacing-24);
  padding-right: var(--spacing-24);
}

@media (max-width: 480px) {
  body.page-id-411 #TRAVELLERS > .wp-block-group__inner-container,
  body.page-id-411 #DAILY > .wp-block-group__inner-container {
    padding-left: var(--spacing-16);
    padding-right: var(--spacing-16);
  }
}

body.page-id-411 .hero-service,
body.page-id-411 #TRAVELLERS,
body.page-id-411 #EXPATS,
body.page-id-411 #DAILY,
body.page-id-411 .section-service:not(#TRAVELLERS):not(#EXPATS):not(#DAILY) {
  border-top: 1px solid var(--color-fog);
}

body.page-id-411 .hero-service,
body.page-id-411 .section-service:not(#TRAVELLERS):not(#EXPATS):not(#DAILY) {
  padding-top: calc(var(--spacing-64) + var(--spacing-24)) !important;
  padding-bottom: calc(var(--spacing-64) + var(--spacing-24)) !important;
}

/* --- FAQ (EN + JA): no alternating surfaces on purpose — a dense
   reference page reads better scanned flat than broken into bands; just
   hairlines + rhythm, same as everywhere else. -------------------------- */
body.page-id-386 .hero-service,
body.page-id-386 .section-service,
body.page-id-422 .hero-service,
body.page-id-422 .section-service {
  border-top: 1px solid var(--color-fog);
}

body.page-id-386 .hero-service,
body.page-id-422 .hero-service {
  padding-top: calc(var(--spacing-64) + var(--spacing-24)) !important;
  padding-bottom: var(--spacing-64) !important;
}

/* FAQ accordion — native <details>/<summary>, no JS. Ruled hairline rows
   (this system's preference over individual cards), +/− indicator swaps
   on [open], focus-visible ring matches every other interactive element
   in this file. */
.faq-group {
  border-top: 1px solid var(--color-fog);
}

.faq-item {
  border-bottom: 1px solid var(--color-fog);
}

.faq-item:last-child {
  border-bottom: none;
}

.faq-item summary {
  cursor: pointer;
  padding: var(--spacing-16) 0;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--spacing-16);
  font-weight: var(--font-weight-semibold);
  color: var(--color-carbon);
  list-style: none;
}

.faq-item summary::-webkit-details-marker {
  display: none;
}

.faq-item summary::after {
  content: "+";
  flex: none;
  font-size: var(--text-heading-sm);
  line-height: 1;
  color: var(--color-iris);
  font-weight: var(--font-weight-regular);
}

.faq-item[open] summary::after {
  content: "\2212";
}

.faq-item summary:focus-visible {
  outline: 2px solid var(--color-lavender);
  outline-offset: 2px;
}

.dark-mode .faq-item summary {
  color: var(--global-palette4);
}

.faq-answer {
  padding: 0 0 var(--spacing-16);
  color: var(--color-graphite);
}

.faq-answer p {
  margin: 0 0 var(--spacing-12);
}

.faq-answer p:last-child {
  margin-bottom: 0;
}

.faq-answer ul {
  margin: 0 0 var(--spacing-12);
  padding-left: var(--spacing-20);
  color: inherit;
}

.dark-mode .faq-answer {
  color: var(--global-palette5);
}

.faq-answer a {
  color: var(--color-lavender);
}
/* FAQ category headings (2026-07-26 follow-up) — these were originally
   plain .eyebrow-label paragraphs sitting with no heading of their own,
   so on the live page they read as an oddly-small "heading" for each of
   the 7 Q&A categories with nothing bigger to sit under. Now real <h2>
   elements (better for screen readers/structure too), keeping the same
   eyebrow look (Iris, dot marker, uppercase mono) but sized as a real
   heading. font-size needs !important + higher specificity to beat the
   generic body.page-id-386/422 .section-service h2 rule above (48px),
   which would otherwise make every category header the same huge size
   as the page's own "Frequently Asked Questions" H1. */
body.page-id-386 .section-service h2.faq-category-heading,
body.page-id-422 .section-service h2.faq-category-heading {
  font-size: var(--text-heading-sm) !important;
}

/* Radio button contrast fix (2026-07-26 follow-up) — the unchecked radio
   circle's 1.5px border used --color-fog (#e8e8e8), which is nearly
   invisible against the card's light background in light mode (reported
   on the Soft Landing booking form, mobile). --color-ash (#999999) is
   already used elsewhere in both modes with no dark-mode override needed
   (mid-gray reads fine on both light and dark surfaces). Widened to 2px
   for the same reason. Covers both the CF7 Soft Landing form's package
   field and the shared .radio-card component (order-builder tiers). */
.radio-card input[type="radio"],
.wpcf7-form-control-wrap[data-name="package"] input[type="radio"] {
  border: 2px solid var(--color-ash);
}
/* PHASE D: My Story (EN/JA), Services (JA), FAQ (EN/JA) — end */

/* SOFT LANDING MOBILE HERO FIX (2026-07-27) — start
   The hero's image column carries 10rem top+bottom padding
   (--global-kb-spacing-5xl, set in the Kadence block's desktop settings
   with no mobile override). On desktop the two columns sit side by side
   and that padding just vertically centers the image next to the tall
   text column. On mobile the columns stack, so it becomes ~160px of
   empty band above AND below the image (reported live 2026-07-27,
   mobile screenshot). Fix: mobile-only padding override on exactly the
   one affected column per page — EN kadence-column294_dc78e4-ac
   (page-id-294), JA kadence-column427_048549-9d (page-id-427), the only
   5xl-padded columns on either page (verified against both live pages'
   inline Kadence CSS). 767px = Kadence's own mobile breakpoint, same
   cutoff the stacking itself uses. Higher specificity than Kadence's
   inline per-block rule (.kadence-columnNNN > .kt-inside-inner-col), so
   no !important needed. Left/right padding untouched. */
@media (max-width: 767px) {
  body.page-id-294 .kadence-column294_dc78e4-ac > .kt-inside-inner-col,
  body.page-id-427 .kadence-column427_048549-9d > .kt-inside-inner-col {
    padding-top: var(--spacing-24);
    padding-bottom: var(--spacing-32);
  }
}
/* SOFT LANDING MOBILE HERO FIX — end */

/* LEGAL PAGES DARK MODE + MOBILE FIX (2026-07-27) — start
   Terms of Use (EN 375 / JA 433), Privacy Policy (EN 11 / JA 431),
   Refund Policy (EN 350 / JA 438). All six carry the same hand-built
   embedded <style> tag inside their page content (same disease the old
   FAQ page had): an unscoped body{max-width:860px; padding:48px 32px;
   background:#fff} that narrows the site header/footer on these pages,
   plus hardcoded light-only colors (#595959 text, #f8f8f8 boxes,
   #3030F1 links) that turn unreadable on the dark canvas. Fixed here in
   the theme instead of re-pasting six pages: (1) body un-narrowed, the
   860px reading column recreated on .entry-content so the page looks
   identical in light mode; (2) full dark-mode overrides for every class
   the embedded styles define; (3) mobile: tables scroll sideways in
   their own box instead of crushing 3 columns into a phone width
   (reported unreadable on Privacy), refund rule-rows allowed to wrap.
   The embedded rules are (0,0,1)/(0,1,1) specificity, so page-scoped
   overrides win regardless of the embedded tag loading later.

   DARK SELECTOR FORM: pages are grouped as
   :is(html.dark-mode body.page-id-N, ...) with html.dark-mode repeated
   inside EVERY arm — deliberately, so the BG-3 comma-split checker sees
   ".dark-mode" in every fragment. Do not "simplify" to a single leading
   .dark-mode outside the :is(). */

body.page-id-375, body.page-id-11, body.page-id-350,
body.page-id-433, body.page-id-431, body.page-id-438 {
  max-width: none !important;
  padding: 0 !important;
  background: var(--surface-canvas) !important;
}

body.page-id-375 .entry-content, body.page-id-11 .entry-content,
body.page-id-350 .entry-content, body.page-id-433 .entry-content,
body.page-id-431 .entry-content, body.page-id-438 .entry-content {
  max-width: 860px;
  margin-left: auto;
  margin-right: auto;
  padding: 48px 32px;
}

@media (max-width: 767px) {
  body.page-id-375 .entry-content, body.page-id-11 .entry-content,
  body.page-id-350 .entry-content, body.page-id-433 .entry-content,
  body.page-id-431 .entry-content, body.page-id-438 .entry-content {
    padding: 32px 20px;
  }

  /* Privacy's 3-col data table (and Refund JA's summary table): scroll
     inside its own box, never crush. min-width on cells forces real
     column widths so the scroll actually engages (beats the inline
     width:40%/45%/15% attrs — min-width wins over percentage). */
  body.page-id-11 .entry-content table, body.page-id-431 .entry-content table,
  body.page-id-350 .entry-content table, body.page-id-438 .entry-content table {
    display: block;
    overflow-x: auto;
  }
  body.page-id-11 .entry-content th, body.page-id-431 .entry-content th,
  body.page-id-350 .entry-content th, body.page-id-438 .entry-content th,
  body.page-id-11 .entry-content td, body.page-id-431 .entry-content td,
  body.page-id-350 .entry-content td, body.page-id-438 .entry-content td {
    min-width: 130px;
  }

  /* Refund rule rows: 180px fixed label + value on one line doesn't fit
     a phone — let the value wrap to its own line under the label. */
  body.page-id-350 .entry-content .rule-row, body.page-id-438 .entry-content .rule-row {
    flex-wrap: wrap;
  }
}

/* ---- dark mode ---- */
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) {
  color: var(--global-palette5);
}

:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content h1,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content h2,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content h3 {
  color: var(--global-palette3);
}

:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content h2 {
  border-top-color: var(--color-fog);
}

:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content strong,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .toc p,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .service-name,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .rule-label,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content th {
  color: var(--global-palette4);
}

:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content p,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content ul,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content td,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .rule-value {
  color: var(--global-palette5);
}

:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .subtitle,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .footer {
  color: var(--global-palette6);
}

:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content a {
  color: var(--color-lavender);
}

:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .toc,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .contact-block,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .disclaimer-block,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .intro-box,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .service-header,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content th {
  background-color: var(--surface-mist-fill);
}

:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .service-block,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content th,
:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content td {
  border-color: var(--color-fog);
}

:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .rule-row {
  border-bottom-color: var(--color-fog);
}

:is(html.dark-mode body.page-id-375, html.dark-mode body.page-id-11, html.dark-mode body.page-id-350, html.dark-mode body.page-id-433, html.dark-mode body.page-id-431, html.dark-mode body.page-id-438) .entry-content .footer {
  border-top-color: var(--color-fog);
}

/* Refund status words — the light-mode greens/reds/ambers are too dark
   for the dark canvas; brightened equivalents. Pastel .service-badge
   chips keep their own colors (light chip + dark text reads fine on
   dark). */
:is(html.dark-mode body.page-id-350, html.dark-mode body.page-id-438) .entry-content .yes {
  color: #4ccb7a;
}
:is(html.dark-mode body.page-id-350, html.dark-mode body.page-id-438) .entry-content .no {
  color: #ef8a80;
}
:is(html.dark-mode body.page-id-350, html.dark-mode body.page-id-438) .entry-content .partial {
  color: #d9a03f;
}
/* LEGAL PAGES DARK MODE + MOBILE FIX — end */

