/* KustomAI landing (2026-08-23, refined):
     * Text (headings / body / labels)  → BLACK on WHITE
     * Royal Blue                       → buttons + header/hero chrome only
   Hierarchy on the white plate is expressed as opacity of pure black;
   the hero + primary button remain Royal Blue and use White ink.
   Fonts (Ubuntu, Instrument Serif, Noto Sans Khmer) are loaded via
   a direct `<link>` in every marketing page's <head> so they hit the
   first paint without waiting on this stylesheet to parse. */

:root {
  /* Canonical brand pair — never override these two. */
  --royal-blue: #0a42ba;
  --pure-white: #ffffff;
  --pure-black: #000000;

  /* ------------------------------------------------------------------
     Landing redesign palette (2026-08-29). Deep Navy + Gold primary,
     with the four tagline hues doing double-duty as section accents.
     ------------------------------------------------------------------ */
  --brand-navy:     #0a42ba;  /* primary chrome, hero, footer plate    */
  --brand-navy-2:   #072F86;  /* deeper royal-blue for gradient stops   */
  --brand-gold:     #F59E0B;  /* accent CTAs, underlines, price tags   */
  --brand-gold-2:   #D97706;  /* gold hover                            */
  --brand-emerald:  #10B981;  /* "Embrace" · growth, delivery success  */
  --brand-blue:     #0a42ba;  /* "Dream" · vision, storefront cards    */
  --brand-orange:   #F97316;  /* "Persistent" · energy, action         */
  --brand-purple:   #7C3AED;  /* "Discipline" · process, mastery       */
  --brand-slate:    #94A3B8;  /* muted dividers, eyebrow separators    */
  --brand-charcoal: #111827;  /* body text on light plates             */

  /* White body + Black ink. Text hierarchy is black at
     100% / 78% / 55% opacity for heading / body / mute.
     Lines are near-black hairlines. */
  --ink: var(--pure-black);
  --ink-body: rgba(0, 0, 0, 0.78);
  --mute: rgba(0, 0, 0, 0.55);
  --line: rgba(0, 0, 0, 0.10);
  --paper: var(--pure-white);
  --surface-tint: rgba(0, 0, 0, 0.03);  /* a hair of black on White for card fills */
  --font: "Ubuntu", "Noto Sans", "Noto Sans Khmer", system-ui, sans-serif;
  /* One-family lockdown — everything is Ubuntu. The `--font-serif`
     alias is retained (points at the same Ubuntu stack) so existing
     rules that reference it continue to render without churn. */
  --font-serif: var(--font);

  /* Chrome plate — Deep Navy from the redesign palette. Hero, footer,
     and any dark plate resolve here so the site-wide repaint pivots
     from one token. */
  --ka-hero: var(--brand-navy);
  --ka-hero-deep: var(--brand-navy);

  /* Primary action — Gold accent on White body (premium CTA), White
     fill on the Navy hero (inverted). Handled further down. */
  --ka-highlight: var(--brand-navy);
  --ka-highlight-hover: var(--brand-navy-2);
  --ka-highlight-ink: var(--pure-white);

  /* On-Royal-Blue counterparts — White at graded opacities. */
  --ink-on-dark: var(--pure-white);
  --ink-on-dark-mute: rgba(255, 255, 255, 0.78);
  --line-on-dark: rgba(255, 255, 255, 0.20);

  /* -----------------------------------------------------------------
     KustomAI brand palette (60 / 30 / 10). Prefer these tokens over
     ad-hoc hexes in every new component so the branding stays coherent.

     60% chrome  → --ka-navy for backgrounds, nav, headers, logo mass
     30% mid     → --ka-cobalt or --ka-indigo for key text, cards,
                    non-AI filled buttons, primary iconography
     10% accent  → --ka-cyan / --ka-orange / --ka-violet for the
                    highest-priority interactive moment on a screen —
                    AI action buttons, live badges, status pips. Used
                    sparingly so the pops stay pops.
     ----------------------------------------------------------------- */
  --ka-navy: #0f172a;
  --ka-cobalt: #2563eb;
  --ka-indigo: #4f46e5;
  --ka-cyan: #06b6d4;
  --ka-orange: #f97316;
  --ka-violet: #8b5cf6;

  /* Button roles — declared as separate tokens (not aliases into the
     palette) so the marketing team can retune button hues without
     re-mapping the 60/30/10 chrome. Primary is a mint accent that
     reads as "action"; secondary is a deep violet that reads as
     "supporting action". Hover shades stay in the same hue for
     tactile feedback. */
  --ka-primary: #4ff7d1;
  --ka-primary-hover: #34e5bc;
  --ka-primary-ink: #0f172a;   /* Navy text on the mint fill — WCAG AAA */

  --ka-secondary: #8847b9;
  --ka-secondary-hover: #7238a1;
  --ka-secondary-ink: #ffffff;  /* White text on the violet fill — WCAG AA */
}

.os {
  margin: 0;
  color: var(--ink-body);
  background: var(--paper);
  font-family: var(--font);
  font-size: 16px;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
}

/* Headings own the darker ink so they anchor against the softer
   purple-tinted body copy — same tone-splitting Fly uses. */
.os h1, .os h2, .os h3, .os h4, .os h5 {
  color: var(--ink);
}

.os *,
.os *::before,
.os *::after {
  box-sizing: border-box;
}

.os a:not(.os-btn):not(.os-brand):not(.bot-cta) {
  color: var(--ink-body);
  text-decoration: underline;
  text-decoration-color: rgba(5, 32, 102, 0.35);
  text-underline-offset: 3px;
  font-weight: 600;
  transition: color 120ms ease, text-decoration-color 120ms ease;
}

.os a:not(.os-btn):not(.os-brand):not(.bot-cta):hover {
  color: var(--ink);
  text-decoration-color: var(--ink-body);
  opacity: 1;
}

.os :lang(km) {
  font-family: "Noto Sans Khmer", var(--font);
}

.os-wrap {
  width: min(920px, calc(100% - 40px));
  margin-inline: auto;
}

.skip {
  position: absolute;
  left: -999px;
  top: 8px;
  background: var(--paper);
  padding: 8px 12px;
  z-index: 80;
}

.skip:focus {
  left: 8px;
}

/* Sticky nav lives on Pure White (matches interior surface).
   Backdrop blur smooths the transition when the Royal Blue hero
   scrolls behind it — the ribbon reads as a bright plate over blue. */
.os-bar {
  position: sticky;
  top: 0;
  z-index: 40;
  background: rgba(255, 255, 255, 0.92);
  backdrop-filter: saturate(140%) blur(10px);
  -webkit-backdrop-filter: saturate(140%) blur(10px);
  border-bottom: 1px solid var(--line);
}

.os-bar-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: 64px;
}

.os-brand {
  display: inline-flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
  color: var(--ink);
  font-weight: 600;
  text-decoration: none !important;
  letter-spacing: -0.02em;
}

.os-brand:hover {
  opacity: 0.85;
  color: var(--brand-navy);
}

.os-brand img {
  display: block;
}

/* Sits on its own line under "logo + KustomAI" — flex-basis: 100%
   wraps it below inside the .os-brand inline-flex row. Each word
   carries its own brand hue via .tagline-{word} — Dream Blue,
   Persistent Orange, Discipline Purple, Embrace Emerald — with
   Slate-gray dot separators tying them together. */
.os-brand-tagline {
  flex-basis: 100%;
  margin-top: -4px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.02em;
}

.os-brand-tagline .tagline-word { font-weight: 700; }
.os-brand-tagline .tagline-dream      { color: var(--brand-blue); }
.os-brand-tagline .tagline-persist    { color: var(--brand-orange); }
.os-brand-tagline .tagline-discipline { color: var(--brand-purple); }
.os-brand-tagline .tagline-embrace    { color: var(--brand-emerald); }

.os-brand-tagline .tagline-sep {
  color: #94A3B8;
  margin: 0 4px;
  font-weight: 400;
}

.os-nav {
  display: flex;
  align-items: center;
  gap: 22px;
}

.os-nav a:not(.os-btn) {
  font-size: 14px;
  font-weight: 500;
  text-decoration: none;
  color: var(--ink);
  transition: color 120ms ease;
}

.os-nav a:not(.os-btn):hover {
  color: var(--royal-blue);
  opacity: 0.72;
}

.os-nav a.is-current {
  color: var(--royal-blue);
  font-weight: 700;
}

/* Base pill — transparent, inherits color from context. Filled
   variants (.os-btn-fill / .os-btn-soft) paint over the top. This
   means an unadorned `.os-btn` in the nav reads as a subtle outline
   on Navy, and a plain `.os-btn` inside a light section reads as a
   soft slate chip. */
.os-btn,
a.os-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 40px;
  padding: 0 18px;
  border: 1px solid currentColor;
  border-radius: 999px;
  background: transparent;
  color: inherit;
  font-family: inherit;
  font-size: 14px;
  font-weight: 600;
  text-decoration: none;
  cursor: pointer;
  transition: background 120ms ease, color 120ms ease, border-color 120ms ease, transform 60ms ease;
}

.os-btn:hover,
a.os-btn:hover {
  opacity: 1;
  background: rgba(255, 255, 255, 0.08);
}

.os-btn:active,
a.os-btn:active {
  transform: translateY(1px);
}

/* Primary CTA — Royal Blue fill, White label. Never black ink on
   a blue plate. Inverts to White fill + Navy label on the Navy hero. */
.os-btn-fill,
a.os-btn-fill {
  background: var(--royal-blue);
  color: var(--pure-white);
  border-color: transparent;
  box-shadow: 0 6px 20px rgba(10, 66, 186, 0.28);
}

.os-btn-fill:hover,
a.os-btn-fill:hover {
  background: var(--brand-navy-2);
  color: var(--pure-white);
  box-shadow: 0 8px 24px rgba(7, 47, 134, 0.36);
}

/* On the Navy hero, invert so the primary CTA reads as a solid
   White pill on Navy — same contrast direction, Gold reserved for
   inline emphasis instead of the button surface. */
.os-hero .os-btn-fill,
.os-hero a.os-btn-fill {
  background: var(--pure-white);
  color: var(--brand-navy);
  box-shadow: 0 6px 22px rgba(255, 255, 255, 0.22);
}
.os-hero .os-btn-fill:hover,
.os-hero a.os-btn-fill:hover {
  background: rgba(255, 255, 255, 0.92);
  color: var(--brand-navy);
  box-shadow: 0 10px 28px rgba(255, 255, 255, 0.30);
}

/* Secondary CTA — outlined pill using currentColor so the same
   markup adapts to any surface. On White it draws a Navy outline;
   on Navy it draws a White outline. */
.os-btn-soft,
a.os-btn-soft {
  background: transparent;
  color: var(--brand-navy);
  border: 1px solid rgba(10, 66, 186, 0.35);
  box-shadow: none;
}

.os-btn-soft:hover,
a.os-btn-soft:hover {
  background: rgba(10, 66, 186, 0.06);
  color: var(--brand-navy);
  border-color: var(--brand-navy);
  box-shadow: none;
}

.os-hero .os-btn-soft,
.os-hero a.os-btn-soft {
  background: transparent;
  color: var(--pure-white);
  border: 1px solid rgba(255, 255, 255, 0.35);
}
.os-hero .os-btn-soft:hover,
.os-hero a.os-btn-soft:hover {
  background: rgba(255, 255, 255, 0.08);
  color: var(--pure-white);
  border-color: var(--pure-white);
}

.os-btn-lg {
  min-height: 48px;
  padding: 0 20px;
}

.os-btn-block {
  width: 100%;
}

/* Language switcher pills — sit inline in the top nav. */
.os-lang {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 0;
  background: transparent;
}

.os-lang-btn {
  width: 26px;
  height: 20px;
  padding: 0;
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
}

.os-lang-btn .lang-flag {
  display: block;
  width: 22px;
  height: auto;
  border-radius: 2px;
  filter: grayscale(0.7);
  opacity: 0.6;
  transition: filter 150ms ease, opacity 150ms ease;
}

.os-lang-btn:hover .lang-flag,
.os-lang-btn.is-on .lang-flag {
  filter: grayscale(0);
  opacity: 1;
}

html[lang="km"] body.os {
  font-family: "Noto Sans Khmer", "Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

html[lang="ja"] body.os {
  font-family: "Noto Sans JP", "Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

.os-btn:focus-visible,
.os a:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.2);
}

/* Hero — Deep Navy plate with a whisper of Purple in the top-right
   corner (echoes the "Discipline" hue at the tagline). Dot pattern
   stays White at low opacity so brand chrome dominates. */
.os-hero {
  position: relative;
  padding: 128px 0 112px;
  background:
    radial-gradient(1200px 600px at 100% 0%, rgba(124, 58, 237, 0.35) 0%, transparent 60%),
    radial-gradient(900px 500px at 0% 100%, rgba(10, 66, 186, 0.25) 0%, transparent 55%),
    linear-gradient(160deg, var(--brand-navy) 0%, var(--brand-navy-2) 100%);
  color: var(--ink-on-dark);
  border-bottom: 0;
  overflow: hidden;
}

.os-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  opacity: 0.30;
  background-image:
    radial-gradient(circle, rgba(255, 255, 255, 0.18) 1.1px, transparent 1.2px),
    radial-gradient(circle, rgba(255, 255, 255, 0.10) 1.1px, transparent 1.2px);
  background-size: 22px 22px, 22px 22px;
  background-position: 0 0, 11px 11px;
  -webkit-mask-image: linear-gradient(180deg, rgba(0,0,0,1) 55%, rgba(0,0,0,0) 100%);
  mask-image: linear-gradient(180deg, rgba(0,0,0,1) 55%, rgba(0,0,0,0) 100%);
}

.os-hero > * {
  position: relative;
  z-index: 1;
}

.os-hero h1 {
  margin: 0 0 20px;
  font-family: var(--font-serif);
  font-size: clamp(48px, 8vw, 112px);
  font-weight: 500;
  letter-spacing: -0.025em;
  line-height: 0.98;
  color: var(--pure-white);
}

/* Editorial detail — italic `<em>` inside the headline sits at
   softened white so it reads as an emphasis inflection, not a
   different colour (palette purity). */
.os-hero h1 em,
.os-serif-em {
  font-style: italic;
  color: rgba(255, 255, 255, 0.72);
}

.os-block h2,
.os-end h2 {
  margin: 0 0 20px;
  font-family: var(--font-serif);
  font-size: clamp(32px, 4vw, 56px);
  font-weight: 400;
  letter-spacing: -0.02em;
  line-height: 1.08;
}

.os-lead,
.os-lede {
  margin: 0 0 28px;
  max-width: 34rem;
  color: var(--mute);
  font-size: 19px;
  line-height: 1.55;
}

/* Hero lead — White at 78% opacity, reads as body without dropping
   to bald white. */
.os-hero .os-lead,
.os-hero .os-note {
  color: var(--ink-on-dark-mute);
  font-size: 20px;
  max-width: 38rem;
}

/* Text links inside the hero — Pure White with a softer underline
   trail. Palette-pure. */
.os-hero a:not(.os-btn):not(.os-brand) {
  color: var(--pure-white);
  font-weight: 600;
  text-decoration: underline;
  text-decoration-color: rgba(255, 255, 255, 0.45);
  text-underline-offset: 3px;
}
.os-hero a:not(.os-btn):not(.os-brand):hover {
  color: var(--pure-white);
  text-decoration-color: var(--pure-white);
  opacity: 1;
}

.os-cta {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}

.os-helps {
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}

.os-helps-inner {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}

.os-helps p {
  margin: 0;
  padding: 28px 24px 28px 0;
  border-right: 1px solid var(--line);
  font-size: 16px;
}

.os-helps p:last-child {
  border-right: 0;
  padding-right: 0;
}

.os-block {
  padding: 80px 0;
}

.os-block-line {
  border-top: 1px solid var(--line);
}

.os-list {
  margin: 36px 0 0;
  padding: 0;
}

.os-list > div {
  display: grid;
  grid-template-columns: 200px 1fr;
  gap: 24px;
  padding: 16px 0;
  border-top: 1px solid var(--line);
}

.os-list > div:last-child {
  border-bottom: 1px solid var(--line);
}

.os-list dt {
  margin: 0;
  font-weight: 600;
}

.os-list dd {
  margin: 0;
  color: var(--mute);
}

/* Product page — small uppercase kicker above a section heading.
   Hero-purple so the kicker doubles as a section-brand pip. */
.os-eyebrow {
  margin: 0 0 8px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-body);
}

/* Product page — module tile grid. Each tile is a link into a per-module
   deep section (or elsewhere in the site). Auto-fill so the grid reflows
   from 4 columns on desktop down to 1 on mobile. */
.os-modules {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 14px;
  margin: 32px 0 0;
}

.os-mod {
  display: flex;
  flex-direction: column;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: 12px;
  text-decoration: none;
  color: inherit;
  overflow: hidden;
  transition: border-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
}

.os-mod:hover {
  border-color: var(--royal-blue);
  transform: translateY(-1px);
  box-shadow: 0 10px 24px rgba(10, 66, 186, 0.14);
}

/* Hero image — 320x200 SVG concept illustration. Aspect locked so
   the grid stays tidy no matter how tall descriptions get. */
.os-mod-hero {
  display: block;
  width: 100%;
  aspect-ratio: 320 / 200;
  object-fit: cover;
  background: #f4f4f5;
  border-bottom: 1px solid var(--line);
}

.os-mod-body {
  padding: 16px 18px 20px;
}

/* Legacy small-icon fallback (kept for callers still using it). */
.os-mod-icon {
  display: inline-flex;
  width: 40px;
  height: 40px;
  align-items: center;
  justify-content: center;
  background: #f4f4f5;
  border-radius: 10px;
  margin: 20px 20px 14px;
  color: #111;
}

.os-mod-icon svg,
.os-mod-icon .nav-icon {
  width: 22px;
  height: 22px;
  color: currentColor;
}

.os-mod h3 {
  margin: 0 0 6px;
  font-size: 16px;
  font-weight: 600;
  letter-spacing: -0.005em;
}

.os-mod p {
  margin: 0;
  color: var(--mute);
  font-size: 14px;
  line-height: 1.5;
}

/* Flat "all modules" catalog grid — icon on top, module name, tiny tag.
   Denser than .os-modules; ~5-6 columns on desktop, 2 on mobile. */
.os-mod-list {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
  gap: 12px;
  margin: 32px 0 0;
}

.os-mod-lite {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-start;
  text-align: center;
  padding: 20px 12px 16px;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: 10px;
  text-decoration: none;
  color: inherit;
  transition: border-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
}

.os-mod-lite:hover {
  border-color: #111;
  transform: translateY(-1px);
  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.05);
}

.os-mod-lite-img {
  display: block;
  width: 72px;
  height: 72px;
  object-fit: contain;
  margin-bottom: 12px;
}

.os-mod-lite h3 {
  margin: 0 0 2px;
  font-size: 14px;
  font-weight: 600;
  letter-spacing: -0.005em;
  line-height: 1.25;
}

.os-mod-lite p {
  margin: 0;
  color: var(--mute);
  font-size: 12px;
  line-height: 1.35;
}

/* ============================================================
   Play Store-style product catalog + detail pages
   ============================================================ */

/* --- Category tab bar (All / Sell / Operate / …) --- */
.ps-cat-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 24px 0 0;
}
.ps-cat-tab {
  display: inline-flex;
  align-items: center;
  padding: 8px 16px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: #fff;
  color: #111;
  font-size: 13px;
  font-weight: 500;
  text-decoration: none;
  transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.ps-cat-tab:hover {
  border-color: var(--royal-blue);
}
.ps-cat-tab.is-on {
  background: var(--royal-blue);
  color: var(--pure-white);
  border-color: var(--royal-blue);
  font-weight: 600;
}

/* Beat `.os a:not(.os-btn)…` (black body links) so the active
   "All businesses" chip stays white on royal blue. */
.os a.ps-cat-tab:not(.os-btn):not(.os-brand):not(.bot-cta) {
  color: var(--royal-blue);
  text-decoration: none;
  text-decoration-color: transparent;
}
.os a.ps-cat-tab:not(.os-btn):not(.os-brand):not(.bot-cta):hover {
  color: var(--royal-blue);
  border-color: var(--royal-blue);
}
.os a.ps-cat-tab.is-on:not(.os-btn):not(.os-brand):not(.bot-cta),
.os a.ps-cat-tab.is-on:not(.os-btn):not(.os-brand):not(.bot-cta):hover {
  background: var(--royal-blue);
  color: var(--pure-white);
  border-color: var(--royal-blue);
}

/* --- Catalog grid card (Play Store app tile) --- */
.ps-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 16px;
  margin: 28px 0 0;
}
.ps-card {
  display: flex;
  flex-direction: column;
  padding: 18px 16px;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: 14px;
  text-decoration: none;
  color: inherit;
  transition: border-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
}
.ps-card:hover {
  border-color: #111;
  transform: translateY(-2px);
  box-shadow: 0 8px 22px rgba(0, 0, 0, 0.06);
}
.ps-card-icon {
  display: block;
  width: 56px;
  height: 56px;
  object-fit: contain;
  background: #f4f4f5;
  border-radius: 12px;
  margin-bottom: 12px;
  padding: 6px;
}
.ps-card-name {
  margin: 0 0 4px;
  font-size: 15px;
  font-weight: 600;
  letter-spacing: -0.005em;
  line-height: 1.25;
}
.ps-card-summary {
  margin: 0 0 10px;
  color: var(--mute);
  font-size: 12.5px;
  line-height: 1.4;
}
.ps-card-meta {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-top: auto;
  color: var(--mute);
  font-size: 12px;
}
.ps-card-star {
  color: #f5a623;
  font-size: 13px;
  line-height: 1;
}
.ps-card-rate {
  color: #111;
  font-weight: 600;
}

/* --- Detail page header --- */
.ps-detail-back {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin: 24px 0 8px;
  color: var(--mute);
  font-size: 13px;
  text-decoration: none;
}
.ps-detail-back:hover { color: var(--royal-blue); }

.ps-detail-header {
  display: grid;
  grid-template-columns: 128px 1fr;
  gap: 24px;
  align-items: center;
  padding: 8px 0 24px;
}
.ps-detail-icon {
  width: 128px;
  height: 128px;
  object-fit: contain;
  background: #f4f4f5;
  border-radius: 24px;
  padding: 14px;
}
.ps-detail-title {
  margin: 0 0 6px;
  font-size: 28px;
  font-weight: 700;
  letter-spacing: -0.015em;
}
.ps-detail-cat {
  margin: 0 0 12px;
  color: var(--mute);
  font-size: 14px;
}
.ps-detail-meta-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 20px;
  margin: 0 0 16px;
  color: var(--mute);
  font-size: 13px;
}
.ps-detail-meta-item {
  display: inline-flex;
  flex-direction: column;
  gap: 2px;
}
.ps-detail-meta-item strong {
  color: #111;
  font-size: 14px;
  font-weight: 600;
}
.ps-detail-cta {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 4px;
}

/* --- Screenshots gallery --- */
.ps-gallery {
  display: flex;
  gap: 12px;
  padding: 4px 0 20px;
  margin: 12px 0 32px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
}
.ps-gallery-img {
  flex: 0 0 auto;
  width: 320px;
  aspect-ratio: 320 / 200;
  object-fit: cover;
  background: #f4f4f5;
  border: 1px solid var(--line);
  border-radius: 12px;
  scroll-snap-align: start;
}

/* --- Detail content sections --- */
.ps-section {
  padding: 28px 0;
  border-top: 1px solid var(--line);
}
.ps-section h2 {
  margin: 0 0 14px;
  font-size: 20px;
  font-weight: 700;
  letter-spacing: -0.01em;
}
.ps-desc {
  color: #333;
  font-size: 15px;
  line-height: 1.6;
  max-width: 720px;
}
.ps-highlights {
  margin: 16px 0 0;
  padding: 0;
  list-style: none;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 10px;
}
.ps-highlights li {
  position: relative;
  padding: 8px 12px 8px 32px;
  background: #f8f8f9;
  border-radius: 8px;
  font-size: 14px;
  color: #111;
}
.ps-highlights li::before {
  content: "✓";
  position: absolute;
  left: 12px;
  top: 8px;
  color: #16a34a;
  font-weight: 700;
}

/* --- Ratings & reviews --- */
.ps-rating-summary {
  display: grid;
  grid-template-columns: 160px 1fr;
  gap: 32px;
  align-items: center;
  margin: 12px 0 24px;
}
.ps-rating-big {
  text-align: center;
}
.ps-rating-big-num {
  font-size: 48px;
  font-weight: 700;
  line-height: 1;
  color: #111;
}
.ps-rating-big-stars {
  color: #f5a623;
  font-size: 16px;
  letter-spacing: 2px;
  margin: 6px 0 4px;
}
.ps-rating-big-count {
  color: var(--mute);
  font-size: 13px;
}
.ps-rating-bars {
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-width: 340px;
}
.ps-rating-bar {
  display: grid;
  grid-template-columns: 16px 1fr 36px;
  gap: 10px;
  align-items: center;
  font-size: 12px;
  color: var(--mute);
}
.ps-rating-bar-track {
  height: 8px;
  background: #f2f2f3;
  border-radius: 999px;
  overflow: hidden;
}
.ps-rating-bar-fill {
  height: 100%;
  background: #f5a623;
  border-radius: 999px;
}

.ps-reviews {
  display: flex;
  flex-direction: column;
  gap: 20px;
  margin: 12px 0 0;
}
.ps-review {
  padding: 16px 0;
  border-bottom: 1px solid var(--line);
}
.ps-review:last-child { border-bottom: 0; }
.ps-review-head {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 8px;
}
.ps-review-avatar {
  width: 36px;
  height: 36px;
  border-radius: 999px;
  background: #f2f2f3;
  color: #111;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
  font-weight: 600;
}
.ps-review-name {
  font-size: 14px;
  font-weight: 600;
  color: #111;
}
.ps-review-date {
  font-size: 12px;
  color: var(--mute);
}
.ps-review-stars {
  color: #f5a623;
  font-size: 13px;
  letter-spacing: 1px;
  margin-bottom: 6px;
}
.ps-review-text {
  color: #333;
  font-size: 14px;
  line-height: 1.55;
  margin: 0;
}
.ps-reviews-note {
  margin: 20px 0 0;
  color: var(--mute);
  font-size: 12px;
  font-style: italic;
}

/* --- Share buttons --- */
.ps-share {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 8px 0 0;
}
.ps-share-btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 14px;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: 999px;
  color: #111;
  font-size: 13px;
  font-weight: 500;
  text-decoration: none;
  cursor: pointer;
  transition: border-color 0.15s ease, background 0.15s ease;
}
.ps-share-btn:hover {
  border-color: #111;
  background: #f8f8f9;
}
.ps-share-btn svg {
  width: 14px;
  height: 14px;
}

/* --- Related modules --- */
.ps-related {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 14px;
  margin: 12px 0 0;
}

/* --- Responsive tweaks for detail page --- */
@media (max-width: 640px) {
  .ps-detail-header {
    grid-template-columns: 88px 1fr;
    gap: 16px;
  }
  .ps-detail-icon {
    width: 88px;
    height: 88px;
    border-radius: 18px;
    padding: 10px;
  }
  .ps-detail-title { font-size: 22px; }
  .ps-gallery-img { width: 260px; }
  .ps-rating-summary {
    grid-template-columns: 1fr;
    gap: 16px;
    text-align: left;
  }
  .ps-rating-big { text-align: left; }
}

.os-sub {
  margin: 36px 0 12px;
  font-size: 15px;
  font-weight: 600;
  letter-spacing: -0.01em;
}

.os-bullets {
  margin: 0;
  padding: 0;
  list-style: none;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px 24px;
}

.os-bullets li {
  color: var(--mute);
  padding-left: 18px;
  position: relative;
}

.os-bullets li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.7em;
  width: 8px;
  height: 1px;
  background: var(--ink);
}

.os-tiers {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 12px;
}

.os-tiers article {
  display: flex;
  flex-direction: column;
  padding: 22px 20px;
  border: 1px solid var(--line);
  border-radius: 16px;
}

.os-tiers .is-on {
  background: var(--royal-blue);
  color: var(--pure-white);
  border-color: var(--royal-blue);
}

.os-tiers h3 {
  margin: 0 0 10px;
  font-size: 16px;
  font-weight: 600;
}

/* `.os h1–h5` paints black globally. On royal-blue plates that
   rule beats inherited white, so headings here are forced light. */
.os .os-tiers .is-on h3,
.os .os-tiers .is-on .os-price,
.os .os-tiers .is-on .os-price b {
  color: var(--pure-white);
}

.os-price {
  margin: 0 0 8px;
  font-size: 14px;
}

.os-price b {
  font-size: 22px;
  font-weight: 600;
}

.os-tiers p {
  margin: 0 0 20px;
  font-size: 14px;
  color: var(--mute);
}

.os-tiers .is-on p {
  color: rgba(255, 255, 255, 0.78);
}

.os-tiers .os-btn {
  margin-top: auto;
}

.os-tiers .is-on .os-btn-fill,
.os-tiers .is-on a.os-btn-fill {
  background: var(--pure-white);
  color: var(--royal-blue);
}

.os-tiers .is-on .os-btn-fill:hover,
.os-tiers .is-on a.os-btn-fill:hover {
  background: rgba(255, 255, 255, 0.92);
  color: var(--royal-blue);
}

.os-tiers .is-on .os-btn-soft,
.os-tiers .is-on a.os-btn-soft {
  background: transparent;
  color: var(--pure-white);
  border-color: rgba(255, 255, 255, 0.4);
}

.os-note {
  margin: 20px 0 0;
  color: var(--mute);
  font-size: 14px;
}

/* Closing section — stays on cream paper so the piece reads like an
   article you're finishing rather than a marketing wall. The
   Instrument Serif h2 does the emphasis lifting. */
.os-end {
  padding: 112px 0 120px;
  background: var(--surface-tint);
  border-top: 1px solid var(--line);
  color: var(--ink);
}

.os-end .os-lead,
.os-end .os-note,
.os-end p {
  color: var(--mute);
}

.os-end a:not(.os-btn):not(.os-brand) {
  color: var(--ink-body);
  font-weight: 600;
}
.os-end a:not(.os-btn):not(.os-brand):hover {
  color: var(--ink);
  opacity: 1;
}

/* Footer closes on Deep Navy with Ice-Blue-tinted ink — mirrors the
   hero plate at the bottom of the fold, forming Navy bookends
   around the Cool Gray interior. */
.os-foot {
  background: var(--ka-hero-deep);
  border-top: 0;
  padding: 40px 0 48px;
  color: var(--ink-on-dark-mute);
  font-size: 13px;
}

.os-foot-inner {
  display: flex;
  justify-content: space-between;
  gap: 16px;
}

/* Bumped specificity with `:not(...)` chain so this wins over the
   global `.os a:not(.os-btn):not(.os-brand):not(.bot-cta)` rule
   that paints interior text links dark — otherwise footer links
   inherit the dark ink colour and vanish against the royal-blue
   footer bg. The chain length must match or exceed the global
   rule's :not() count. */
.os-foot a:not(.os-btn):not(.os-brand):not(.bot-cta) {
  margin-left: 16px;
  text-decoration: none;
  color: var(--ink-on-dark);
  font-weight: 500;
  transition: color 120ms ease;
}

.os-foot a:not(.os-btn):not(.os-brand):not(.bot-cta):hover {
  color: var(--pure-white);
  opacity: 1;
}

.os-foot p {
  margin: 0;
}

@media (max-width: 800px) {
  .os-helps-inner,
  .os-tiers,
  .os-list > div,
  .os-bullets,
  .os-foot-inner {
    grid-template-columns: 1fr;
  }

  .os-helps p {
    border-right: 0;
    border-bottom: 1px solid var(--line);
    padding: 18px 0;
  }

  .os-helps p:last-child {
    border-bottom: 0;
  }

  .os-nav a:not(.os-btn):not(.os-lang-btn):not(.os-nav-keep) {
    display: none;
  }

  .os-lang {
    order: -1;
  }

  .os-hero {
    padding: 56px 0 48px;
  }

  .os-block,
  .os-end {
    padding: 56px 0;
  }

  .os-foot-inner {
    display: grid;
    gap: 8px;
  }

  .os-foot a {
    margin-left: 0;
    margin-right: 16px;
  }
}

/* ============================================================
   Business-app catalog: larger cards, hero image on top, feature
   preview. Layered on top of .ps-* base styles via .ps-*-biz.
   ============================================================ */

/* --- Grid: two cards wide on desktop, one on mobile --- */
.ps-grid-biz {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
  gap: 24px;
  margin: 28px 0 0;
}

/* --- Card: hero on top, body underneath --- */
.ps-card-biz {
  display: flex;
  flex-direction: column;
  padding: 0;
  overflow: hidden;
  border-radius: 18px;
  background: #fff;
  border: 1px solid var(--line);
  transition: border-color 0.18s ease, transform 0.18s ease, box-shadow 0.18s ease;
}
.ps-card-biz:hover {
  border-color: #111;
  transform: translateY(-3px);
  box-shadow: 0 14px 36px rgba(0, 0, 0, 0.08);
}

.ps-card-hero {
  width: 100%;
  aspect-ratio: 320 / 200;
  background: #f4f4f5;
  overflow: hidden;
  display: flex;
  align-items: center;
  justify-content: center;
}
.ps-card-hero img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.ps-card-body {
  display: flex;
  flex-direction: column;
  padding: 20px 22px 22px;
  gap: 10px;
  flex: 1;
}
.ps-card-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
}
.ps-card-biz .ps-card-name {
  margin: 0;
  font-size: 20px;
  font-weight: 700;
  letter-spacing: -0.01em;
  line-height: 1.2;
}
.ps-card-avail {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  padding: 3px 10px;
  border-radius: 999px;
  background: #dcfce7;
  color: #14532d;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.01em;
  white-space: nowrap;
}
.ps-card-biz .ps-card-summary {
  margin: 0;
  color: var(--mute);
  font-size: 14px;
  line-height: 1.45;
}

/* Feature preview: 3 short pills */
.ps-card-feats {
  margin: 4px 0 6px;
  padding: 0;
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.ps-card-feats li {
  position: relative;
  padding: 0 0 0 20px;
  color: #333;
  font-size: 13px;
  line-height: 1.4;
}
.ps-card-feats li::before {
  content: "✓";
  position: absolute;
  left: 0;
  top: 0;
  color: #16a34a;
  font-weight: 700;
}

.ps-card-biz .ps-card-meta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-top: auto;
  padding-top: 10px;
  border-top: 1px solid var(--line);
  color: var(--mute);
  font-size: 12.5px;
}
.ps-card-rating {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  color: #111;
}
.ps-card-rating strong { font-weight: 700; }
.ps-card-count { color: var(--mute); font-weight: 400; }
.ps-card-cat {
  color: var(--mute);
  font-size: 12.5px;
}

/* --- Detail page hero: big media + info side-by-side --- */
.ps-hero-detail {
  display: grid;
  grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr);
  gap: 40px;
  align-items: center;
  padding: 16px 0 32px;
}
.ps-hero-media {
  width: 100%;
  aspect-ratio: 320 / 200;
  background: #f4f4f5;
  border-radius: 22px;
  overflow: hidden;
  border: 1px solid var(--line);
}
.ps-hero-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.ps-hero-info { display: flex; flex-direction: column; gap: 12px; }
.ps-hero-cat {
  margin: 0;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: var(--mute);
}
.ps-hero-cat a { color: inherit; text-decoration: none; }
.ps-hero-cat a:hover { color: var(--royal-blue); }
.ps-hero-title {
  margin: 0;
  font-size: 40px;
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.1;
}
.ps-hero-sub {
  margin: 0;
  color: #333;
  font-size: 17px;
  line-height: 1.5;
  max-width: 46ch;
}
.ps-hero-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 14px;
  margin-top: 4px;
  color: var(--mute);
  font-size: 13px;
}
.ps-hero-badge {
  display: inline-flex;
  align-items: center;
  padding: 4px 12px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 600;
}
.ps-hero-badge.is-avail {
  background: #dcfce7;
  color: #14532d;
}
.ps-hero-rating {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  color: #111;
}
.ps-hero-rating strong { font-weight: 700; }
.ps-hero-updated { color: var(--mute); }
.ps-hero-cta {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  margin-top: 8px;
}

/* --- Features section: emphasised over other sections --- */
.ps-features-section {
  background: #fafafa;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  padding: 32px 24px;
  border-radius: 18px;
  margin: 24px 0;
}
.ps-features-section h2 {
  margin: 0 0 18px;
  font-size: 22px;
}
.ps-features {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 12px;
}
.ps-feature {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 14px 16px;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: 12px;
  font-size: 14.5px;
  line-height: 1.45;
  color: #111;
}
.ps-feature-mark {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 999px;
  background: #dcfce7;
  color: #14532d;
  font-size: 13px;
  font-weight: 700;
}

/* --- Responsive: stack on narrow screens --- */
@media (max-width: 780px) {
  .ps-hero-detail {
    grid-template-columns: 1fr;
    gap: 20px;
  }
  .ps-hero-title { font-size: 30px; }
  .ps-hero-sub { font-size: 15.5px; }
  .ps-features-section { padding: 24px 16px; }
}
@media (max-width: 520px) {
  .ps-grid-biz {
    grid-template-columns: 1fr;
    gap: 18px;
  }
  .ps-card-body { padding: 18px 18px 20px; }
  .ps-card-biz .ps-card-name { font-size: 18px; }
  .ps-hero-title { font-size: 26px; }
}

/* =========================================================================
   App-store product page: hero + search, featured strip, chip band,
   grid header, Cambodia band. Additive only — leaves existing .ps-*
   classes alone.
   ========================================================================= */

.os-hero-app {
  padding-top: 56px;
  padding-bottom: 40px;
}
.os-hero-app h1 {
  max-width: 20ch;
  margin-bottom: 14px;
}
.os-hero-app .os-lead {
  max-width: 62ch;
  margin-bottom: 26px;
}

.ps-search {
  display: flex;
  align-items: center;
  gap: 8px;
  max-width: 720px;
  padding: 8px 8px 8px 14px;
  background: #fff;
  border: 1px solid rgba(17, 17, 17, 0.12);
  border-radius: 14px;
  box-shadow: 0 6px 22px rgba(17, 17, 17, 0.06);
}
.ps-search-icon {
  font-size: 18px;
  color: #7a7a7a;
  line-height: 1;
}
.ps-search input[type="search"] {
  flex: 1;
  min-width: 0;
  height: 44px;
  padding: 0 8px;
  border: 0;
  outline: 0;
  background: transparent;
  font: inherit;
  font-size: 16px;
  color: #111;
}
.ps-search input[type="search"]::placeholder {
  color: #8a8a8a;
}
.ps-search .os-btn {
  height: 40px;
  padding: 0 18px;
  border-radius: 10px;
  flex-shrink: 0;
}

.ps-chip-band {
  padding-top: 22px;
  padding-bottom: 8px;
  position: sticky;
  top: 0;
  z-index: 20;
  background: rgba(250, 250, 250, 0.92);
  backdrop-filter: saturate(160%) blur(8px);
  border-bottom: 1px solid rgba(17, 17, 17, 0.06);
}
.ps-chip-band .ps-cat-tabs {
  overflow-x: auto;
  scrollbar-width: none;
  flex-wrap: nowrap;
  padding-bottom: 4px;
}
.ps-chip-band .ps-cat-tabs::-webkit-scrollbar { display: none; }
.ps-chip-band .ps-cat-tab { white-space: nowrap; }

.ps-featured {
  padding-top: 40px;
}
.ps-featured-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 20px;
  margin-bottom: 22px;
  flex-wrap: wrap;
}
.ps-featured-head h2 {
  margin: 0;
  display: flex;
  align-items: center;
  gap: 10px;
}
.ps-featured-head .ps-star {
  color: #f5a623;
  font-size: 22px;
}
.ps-featured-head p {
  margin: 0;
  color: var(--mute, #666);
  font-size: 15px;
}
.ps-featured-strip {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 16px;
}
.ps-feat-card {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 18px;
  background: linear-gradient(180deg, #fff 0%, #fafafa 100%);
  border: 1px solid rgba(17, 17, 17, 0.09);
  border-radius: 14px;
  text-decoration: none;
  color: inherit;
  transition: transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease;
}
.ps-feat-card:hover {
  transform: translateY(-2px);
  border-color: rgba(17, 17, 17, 0.22);
  box-shadow: 0 12px 32px rgba(17, 17, 17, 0.08);
}
.ps-feat-icon {
  width: 56px;
  height: 56px;
  border-radius: 12px;
  background: #f3f3f3;
  display: grid;
  place-items: center;
  padding: 8px;
}
.ps-feat-icon img {
  width: 100%;
  height: 100%;
  object-fit: contain;
}
.ps-feat-body h3 {
  margin: 0;
  font-size: 17px;
  font-weight: 700;
  line-height: 1.25;
}
.ps-feat-body p {
  margin: 4px 0 8px;
  font-size: 14px;
  color: var(--mute, #666);
  line-height: 1.45;
}
.ps-feat-cat {
  display: inline-block;
  font-size: 12px;
  padding: 3px 8px;
  border-radius: 999px;
  background: #f3f3f3;
  color: #444;
}

.ps-grid-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
  margin: 26px 0 18px;
  flex-wrap: wrap;
}
.ps-grid-head h2 {
  margin: 0;
  display: inline-flex;
  align-items: baseline;
  gap: 10px;
}
.ps-grid-head h2 em {
  font-style: normal;
  color: #111;
  border-bottom: 2px solid #111;
}
.ps-grid-count {
  font-size: 14px;
  font-weight: 500;
  color: var(--mute, #666);
  padding: 2px 10px;
  border-radius: 999px;
  background: #f0f0f0;
}
.ps-grid-clear {
  font-size: 14px;
  font-weight: 600;
  color: #111;
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
}
.ps-empty {
  text-align: center;
  color: var(--mute, #666);
  margin: 60px 0;
  font-size: 15px;
}

/* Built for Cambodia band */
.os-cambodia-band {
  background: linear-gradient(160deg, var(--brand-navy) 0%, var(--brand-navy-2) 100%);
  color: var(--ink-on-dark-mute);
  padding-top: 56px;
  padding-bottom: 56px;
  margin-top: 40px;
}
.os .os-cambodia-band h2,
.os .os-cambodia-band h3,
.os .os-cambodia-band .ps-cam-tile h3 {
  color: var(--pure-white);
}
.os-cambodia-band h2 {
  margin: 0 0 12px;
}
.os .os-cambodia-band .os-lede,
.os .os-cambodia-band .ps-cam-tile p {
  color: var(--ink-on-dark-mute);
  margin: 0 0 26px;
}
.os .os-cambodia-band .ps-cam-tile p {
  margin: 0;
}
.ps-cam-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 18px;
}
.ps-cam-tile {
  padding: 22px;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: 14px;
}
.ps-cam-emoji {
  font-size: 28px;
  line-height: 1;
  margin-bottom: 12px;
}
.ps-cam-tile h3 {
  margin: 0 0 6px;
  color: var(--pure-white);
  font-size: 16px;
  font-weight: 700;
}
.ps-cam-tile p {
  margin: 0;
  color: rgba(242, 242, 242, 0.72);
  font-size: 14px;
  line-height: 1.5;
}

@media (max-width: 980px) {
  .ps-featured-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ps-cam-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 560px) {
  .ps-featured-strip { grid-template-columns: 1fr; }
  .ps-cam-grid { grid-template-columns: 1fr; }
  .os-hero-app h1 { font-size: 30px; }
  .ps-search { padding: 6px 6px 6px 12px; }
  .ps-search .os-btn { padding: 0 12px; }
}

/* =========================================================================
   Business-app showroom (2026-08-21)
   Complete products, grouped by trade — not a module wall.
   Signature: navy product windows with royal-blue "live" marks.
   ========================================================================= */

.os-wrap-wide {
  width: min(1160px, calc(100% - 40px));
  margin-inline: auto;
}

.os-catalog {
  --laterite: var(--royal-blue);
  --bezel: #071a52;
  --screen: #f5f7fc;
  font-family: var(--font);
}

.os-catalog .os-bar {
  background: var(--pure-white);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

.ps-sticky-chrome {
  position: sticky;
  top: 0;
  z-index: 45;
  background: var(--pure-white);
  border-bottom: 1px solid var(--line);
}

.ps-sticky-chrome .os-bar {
  position: static;
  border-bottom: 0;
  background: var(--pure-white);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

.ps-sticky-chrome .ps-chip-band {
  position: static;
  top: auto;
  z-index: auto;
  padding-top: 0;
  padding-bottom: 12px;
  background: var(--pure-white);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border-bottom: 0;
}

.os-catalog #local,
.os-catalog #pricing {
  scroll-margin-top: 168px;
}

.os-catalog #pricing {
  background: var(--paper);
}

.os-catalog a.ps-app:hover,
.os-catalog a.ps-trade:hover,
.os-catalog .ps-flag-shot:hover,
.os-catalog .ps-flag-name a:hover {
  opacity: 1;
}

.os-catalog a.os-btn-fill,
.os-catalog .os-btn-fill {
  color: var(--pure-white);
}

/* --- Hero --- */
.ps-show-hero {
  padding: 56px 0 28px;
  background:
    radial-gradient(1200px 280px at 10% -20%, rgba(10, 66, 186, 0.10), transparent 60%),
    #fff;
}
.ps-show-hero--ind { padding-bottom: 36px; }
.ps-eyebrow {
  margin: 0 0 12px;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--laterite);
}
.ps-show-hero h1 {
  margin: 0 0 16px;
  font-size: clamp(32px, 4.4vw, 52px);
  font-weight: 700;
  letter-spacing: -0.03em;
  line-height: 1.08;
  max-width: 18ch;
}
.ps-show-hero h1 span {
  display: block;
  color: #444;
  font-weight: 600;
}
.ps-show-hero .os-lead {
  max-width: 62ch;
  margin: 0 0 28px;
  font-size: 17px;
}
.ps-hero-note {
  margin: 8px 0 0;
  color: var(--mute);
  font-size: 15px;
}

.os-catalog .ps-search {
  max-width: 640px;
}

.ps-steps {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 18px;
  margin: 36px 0 0;
  padding: 0;
  list-style: none;
  counter-reset: none;
}
.ps-steps li {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding-top: 14px;
  border-top: 2px solid var(--royal-blue);
}
.ps-steps strong {
  font-size: 15px;
  letter-spacing: -0.01em;
}
.ps-steps span {
  color: var(--mute);
  font-size: 13.5px;
  font-weight: 400;
  line-height: 1.45;
}

.os-catalog .ps-chip-band {
  background: var(--pure-white);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
.os-catalog .ps-cat-tab.is-on {
  background: var(--royal-blue);
  color: var(--pure-white);
  border-color: var(--royal-blue);
}
.os-catalog .ps-cat-tab:hover { opacity: 1; }

.ps-section-head {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-bottom: 22px;
}
.ps-section-head h2,
.ps-ind-head h2 {
  margin: 0;
  font-size: 26px;
  letter-spacing: -0.02em;
}
.ps-section-head p,
.ps-ind-head p {
  margin: 0;
  color: var(--mute);
  max-width: 62ch;
}

/* --- Industry tiles --- */
.ps-trades { padding-top: 36px; }
.ps-trades-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 12px;
}
.ps-trade {
  display: grid;
  grid-template-columns: 48px 1fr auto;
  align-items: center;
  gap: 14px;
  padding: 16px 16px 16px 14px;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: 14px;
  text-decoration: none !important;
  font-weight: 400 !important;
  transition: border-color 160ms ease, transform 160ms ease, box-shadow 160ms ease;
}
.ps-trade:hover {
  border-color: var(--royal-blue);
  transform: translateY(-2px);
  box-shadow: 0 10px 28px rgba(10, 66, 186, 0.12);
}
.ps-trade-mark {
  width: 48px;
  height: 48px;
  border-radius: 12px;
  background: #f4f4f4;
  display: grid;
  place-items: center;
}
.ps-trade-mark img { width: 28px; height: 28px; object-fit: contain; }
.ps-trade-copy { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ps-trade-copy strong {
  font-size: 15px;
  letter-spacing: -0.01em;
}
.ps-trade-copy em {
  font-style: normal;
  color: var(--mute);
  font-size: 12.5px;
  font-weight: 400;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.ps-trade-n {
  font-size: 12px;
  font-weight: 600;
  color: #666;
  background: #f3f3f3;
  padding: 3px 8px;
  border-radius: 999px;
}

/* --- Flagship product cards --- */
.ps-top { padding-top: 24px; }
.ps-top-grid,
.ps-flag-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 20px;
}
.ps-flag-grid.is-single { grid-template-columns: 1fr; }

.ps-flag {
  display: grid;
  grid-template-columns: 1fr;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: 20px;
  overflow: hidden;
  transition: border-color 160ms ease, box-shadow 160ms ease, transform 160ms ease;
}
.ps-flag.is-lead {
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
}
.ps-flag:hover {
  border-color: var(--royal-blue);
  box-shadow: 0 16px 40px rgba(10, 66, 186, 0.12);
  transform: translateY(-2px);
}
.ps-flag-shot {
  display: block;
  background: #ececec;
  text-decoration: none !important;
  font-weight: 400 !important;
}
.ps-flag-body {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 22px 24px 24px;
}
.ps-flag-who {
  margin: 0;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--laterite);
}
.ps-flag-name {
  margin: 0;
  font-size: 24px;
  letter-spacing: -0.02em;
  line-height: 1.15;
}
.ps-flag-name a { text-decoration: none !important; font-weight: 700 !important; }
.ps-flag-tag {
  margin: 0;
  font-size: 16px;
  line-height: 1.45;
  color: #333;
}
.ps-loop {
  margin: 6px 0 0;
  padding: 0;
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.ps-loop li {
  position: relative;
  padding-left: 28px;
  font-size: 14px;
  line-height: 1.4;
  color: #222;
}
.ps-loop li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 5px;
  width: 16px;
  height: 16px;
  border-radius: 999px;
  border: 2px solid var(--royal-blue);
  background: #fff;
}
.ps-loop li:first-child::before { background: var(--laterite); border-color: var(--laterite); }
.ps-loop-lg { margin-top: 12px; }
.ps-loop-lg li { font-size: 16px; padding-left: 32px; padding-bottom: 10px; }

/* CMS-authored Markdown containers (description / loop / features).
   Earmark emits stock <p>/<ul>/<ol>/<h*> — tone them down so they
   sit inside the surrounding sections without visual noise. */
.ps-desc :first-child { margin-top: 0; }
.ps-desc :last-child { margin-bottom: 0; }
.ps-desc p { margin: 0 0 12px; }
.ps-desc a { color: var(--laterite); text-decoration: underline; }
.ps-loop-md, .ps-features-md {
  color: #222;
  font-size: 15px;
  line-height: 1.55;
  max-width: 720px;
}
.ps-loop-md ol, .ps-loop-md ul,
.ps-features-md ol, .ps-features-md ul {
  margin: 6px 0 0;
  padding-left: 22px;
}
.ps-loop-md li, .ps-features-md li { margin: 4px 0; }
.ps-loop-md p, .ps-features-md p { margin: 0 0 10px; }
.ps-loop-md a, .ps-features-md a { color: var(--laterite); text-decoration: underline; }

.ps-with {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin-top: 4px;
  font-size: 12.5px;
}
.ps-with span { color: var(--mute); font-weight: 500; }
.ps-with a {
  padding: 4px 10px;
  border-radius: 999px;
  background: #f3f3f3;
  font-weight: 600 !important;
  font-size: 12.5px;
  text-decoration: none !important;
}
.ps-with a:hover { background: var(--royal-blue); color: #fff; opacity: 1; }

.ps-flag-cta {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: auto;
  padding-top: 12px;
}

/* --- Compact app cards --- */
.ps-apps {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 16px;
}
.ps-app {
  display: flex;
  flex-direction: column;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: 16px;
  overflow: hidden;
  text-decoration: none !important;
  font-weight: 400 !important;
  color: inherit;
  transition: border-color 160ms ease, transform 160ms ease, box-shadow 160ms ease;
}
.ps-app:hover {
  border-color: var(--royal-blue);
  transform: translateY(-2px);
  box-shadow: 0 12px 28px rgba(10, 66, 186, 0.12);
}
.ps-app-shot { background: #ececec; }
.ps-app-body {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 16px 18px 18px;
  flex: 1;
}
.ps-app-who {
  margin: 0;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--laterite);
}
.ps-app-name {
  margin: 0;
  font-size: 17px;
  font-weight: 700;
  letter-spacing: -0.015em;
  line-height: 1.2;
}
.ps-app-tag {
  margin: 0;
  color: var(--mute);
  font-size: 13.5px;
  line-height: 1.4;
}
.ps-app-go {
  margin-top: auto;
  padding-top: 10px;
  font-size: 13px;
  font-weight: 600;
  color: var(--royal-blue);
}

.ps-ind {
  padding-top: 28px;
  padding-bottom: 12px;
}
.ps-ind-head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 20px;
  margin-bottom: 22px;
}
.ps-ind-all {
  flex-shrink: 0;
  font-size: 14px;
  color: var(--royal-blue) !important;
  text-decoration: none !important;
  font-weight: 600 !important;
}
.ps-ind-all:hover {
  color: var(--brand-navy-2) !important;
}
.ps-more { margin-top: 28px; }
.ps-more h3 {
  margin: 0 0 14px;
  font-size: 16px;
  font-weight: 600;
}

.ps-hero-buyer {
  margin: 0;
  color: var(--mute);
  font-size: 14px;
}
.ps-section-lede {
  margin: -8px 0 18px;
  color: var(--mute);
}
.ps-day .ps-desc { margin-top: 20px; }

.ps-hero-detail .ps-hero-media {
  background: #ececec;
  display: flex;
  align-items: stretch;
  aspect-ratio: auto;
  min-height: 280px;
}
.ps-hero-detail .ps-win { width: 100%; height: 100%; }

/* --- Product window --- */
.ps-win {
  height: 100%;
  min-height: 220px;
  padding: 16px;
  background:
    linear-gradient(180deg, #dcdcdc 0%, #cfcfcf 100%);
}
.ps-win.is-compact { min-height: 150px; padding: 12px; }
.ps-win-bezel {
  height: 100%;
  background: var(--bezel);
  border-radius: 12px;
  padding: 8px 8px 10px;
  display: flex;
  flex-direction: column;
  box-shadow: 0 12px 28px rgba(0, 0, 0, 0.18);
}
.ps-win-chrome {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 2px 6px 8px;
}
.ps-win-dots { display: flex; gap: 4px; }
.ps-win-dots i {
  display: block;
  width: 7px;
  height: 7px;
  border-radius: 999px;
  background: #3a3a3a;
}
.ps-win-dots i:first-child { background: var(--laterite); }
.ps-win-label {
  color: #bdbdbd;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.ps-win-screen {
  flex: 1;
  background: var(--screen);
  border-radius: 6px;
  overflow: hidden;
  min-height: 0;
}
.ps-win-photo {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.sc {
  height: 100%;
  padding: 10px;
  font-size: 11px;
  color: #111;
}

.sc-floor {
  display: grid;
  grid-template-columns: 1.1fr 0.9fr;
  gap: 8px;
}
.sc-floor-map {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
  align-content: center;
}
.sc-floor-map i {
  display: block;
  aspect-ratio: 1;
  border-radius: 999px;
  border: 2px solid #ccc;
  background: #fff;
}
.sc-floor-map i.on {
  background: var(--laterite);
  border-color: var(--laterite);
}
.sc-slip {
  display: flex;
  flex-direction: column;
  gap: 4px;
  background: #fff;
  border: 1px dashed #ccc;
  border-radius: 6px;
  padding: 8px;
  font-size: 10.5px;
}
.sc-slip b { font-size: 12px; }

.sc-kds { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
.sc-tix {
  background: #fff;
  border-radius: 6px;
  padding: 8px 6px;
  border-top: 4px solid #16a34a;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.sc-tix.age-warn { border-top-color: #ca8a04; }
.sc-tix.age-hot { border-top-color: var(--laterite); }
.sc-tix em { color: var(--mute); font-style: normal; font-size: 10px; }

.sc-host { display: grid; grid-template-columns: 1.2fr 0.8fr; gap: 8px; }
.sc-plan {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 6px;
  align-content: center;
}
.sc-plan i {
  display: block;
  height: 28px;
  border-radius: 4px;
  background: #fff;
  border: 1px solid #ddd;
}
.sc-plan i.booked { background: rgba(10, 66, 186, 0.16); border-color: var(--laterite); }
.sc-plan i.seated { background: var(--laterite); }
.sc-book { display: flex; flex-direction: column; gap: 6px; font-size: 10.5px; }

.sc-retail, .sc-ledger, .sc-paye, .sc-tax, .sc-garage, .sc-factory,
.sc-recipe, .sc-proj, .sc-prop, .sc-campus, .sc-fleet, .sc-school {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.sc-lines, .sc-rows {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 4px 10px;
  font-size: 11px;
}
.sc-pay, .sc-kpi, .sc-form, .sc-job, .sc-att, .sc-wo {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  background: #fff;
  border-radius: 6px;
  padding: 8px 10px;
}
.sc-kpi strong, .sc-pay strong { font-size: 18px; letter-spacing: -0.03em; }
.sc-pay em {
  font-style: normal;
  font-weight: 700;
  color: var(--laterite);
  letter-spacing: 0.04em;
}

.sc-crm { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
.sc-col {
  background: #fff;
  border-radius: 6px;
  padding: 6px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.sc-col em { font-style: normal; font-size: 10px; font-weight: 700; color: var(--mute); }
.sc-col i { display: block; height: 18px; border-radius: 3px; background: #eee; }
.sc-col.on i { background: rgba(10, 66, 186, 0.16); }

.sc-shop {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
  height: 100%;
}
.sc-shop i {
  display: block;
  border-radius: 6px;
  background: #fff;
  border: 1px solid #e6e6e6;
}
.sc-shop i.on { border-color: var(--laterite); box-shadow: inset 0 0 0 2px var(--laterite); }

.sc-hotel { height: 100%; }
.sc-chart {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 4px;
  height: 100%;
  align-content: center;
}
.sc-chart i { display: block; height: 22px; border-radius: 3px; background: #fff; border: 1px solid #e6e6e6; }
.sc-chart i.in { background: var(--laterite); border-color: var(--laterite); }
.sc-chart i.arr { background: rgba(10, 66, 186, 0.16); }
.sc-chart i.dep { background: #ddd; }

.sc-kids {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 6px;
}
.sc-kids i { display: block; height: 22px; border-radius: 4px; background: #dcfce7; }
.sc-kids i.no { background: #fecaca; }
.sc-kids i.late { background: #fde68a; }

.sc-bar {
  height: 6px;
  background: #e5e5e5;
  border-radius: 99px;
  overflow: hidden;
  margin-top: 6px;
}
.sc-bar i { display: block; height: 100%; background: var(--laterite); }

.sc-salon, .sc-cowork { display: flex; flex-direction: column; gap: 6px; }
.sc-slot {
  display: flex;
  justify-content: space-between;
  background: #fff;
  border-radius: 6px;
  padding: 7px 8px;
  font-size: 11px;
}
.sc-slot.on { border-left: 3px solid var(--laterite); }

.sc-clinic { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
.sc-q {
  background: #fff;
  border-radius: 6px;
  padding: 10px 6px;
  text-align: center;
}
.sc-q.now { background: rgba(10, 66, 186, 0.16); }
.sc-q b { display: block; font-size: 16px; }

.sc-phone {
  display: flex;
  flex-direction: column;
  gap: 8px;
  justify-content: center;
}
.sc-msg {
  align-self: flex-start;
  background: #fff;
  border-radius: 10px 10px 10px 2px;
  padding: 8px 10px;
  max-width: 80%;
}
.sc-msg.me {
  align-self: flex-end;
  background: rgba(10, 66, 186, 0.16);
  border-radius: 10px 10px 2px 10px;
}

.sc-wh {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
  height: 100%;
  align-content: center;
}
.sc-wh i {
  display: grid;
  place-items: center;
  height: 44px;
  border-radius: 6px;
  background: #fff;
  border: 1px solid #e6e6e6;
  font-size: 12px;
  font-weight: 700;
}
.sc-wh i::after { content: attr(data-n); }
.sc-wh i.low { background: #fde68a; }
.sc-wh i.out { background: #fecaca; }

.os-catalog .os-cambodia-band { margin-top: 8px; }

@media (max-width: 980px) {
  .ps-trades-grid,
  .ps-top-grid,
  .ps-flag-grid,
  .ps-flag-grid.is-single,
  .ps-apps,
  .ps-steps {
    grid-template-columns: 1fr 1fr;
  }
  .ps-flag.is-lead { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
  .ps-show-hero { padding-top: 36px; }
  .ps-show-hero h1 { max-width: none; }
  .ps-trades-grid,
  .ps-top-grid,
  .ps-flag-grid,
  .ps-apps,
  .ps-steps {
    grid-template-columns: 1fr;
  }
  .ps-ind-head { align-items: flex-start; flex-direction: column; }
  .ps-win { min-height: 180px; }
  .os-catalog .ps-chip-band { top: auto; }
}

@media (prefers-reduced-motion: reduce) {
  .ps-trade,
  .ps-flag,
  .ps-app,
  .ps-feat-card,
  .ps-card-biz {
    transition: none;
  }
  .ps-trade:hover,
  .ps-flag:hover,
  .ps-app:hover {
    transform: none;
  }
}

/* -----------------------------------------------------------------
   Hero platform-name rotator
   Cycles the highlighted brand in "Sell on ______." through Telegram
   → Messenger → WhatsApp → Line every 2s (8s total loop). The ghost
   span reserves the width of the longest word so the h1 doesn't
   reflow between swaps; the sr-only span carries the whole list for
   assistive tech so screen readers hear the full multi-platform
   message instead of just the currently-visible word.
   ----------------------------------------------------------------- */

.os-rotator {
  position: relative;
  display: inline-block;
  vertical-align: baseline;
  overflow: hidden;
  line-height: inherit;
}

.os-rotator__sr {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.os-rotator__ghost {
  visibility: hidden;
  white-space: nowrap;
}

.os-rotator__word {
  position: absolute;
  inset: 0 auto auto 0;
  white-space: nowrap;
  opacity: 0;
  transform: translateY(100%);
  animation: os-rotator-cycle 8s cubic-bezier(0.22, 1, 0.36, 1) infinite;
  will-change: transform, opacity;
}

/* Colored from the KustomAI palette: one Cobalt anchor from the 30%
   tier + the three 10% accents. Skipping the platforms' own brand
   hues (Telegram cyan-blue, WhatsApp green, etc.) is a deliberate
   palette-purity choice — the rotator here is a KustomAI moment, not
   a logo strip. */
/* Two-colour palette: rotator words on the Royal Blue hero cycle
   through White at 100 / 82 / 60 / 40% opacity so each frame reads
   as a distinct tempo without introducing a third hue. */
.os-rotator__word--tg { animation-delay: 0s;   color: rgba(255, 255, 255, 1.00); }
.os-rotator__word--mg { animation-delay: 2s;   color: rgba(255, 255, 255, 0.82); }
.os-rotator__word--wa { animation-delay: 4s;   color: rgba(255, 255, 255, 0.60); }
.os-rotator__word--ln { animation-delay: 6s;   color: rgba(255, 255, 255, 0.40); }

@keyframes os-rotator-cycle {
  /* Each word owns 25% of the 8s cycle: brief entry, ~1.6s hold,
     brief exit, then parks off-screen until the next turn. */
  0%   { opacity: 0; transform: translateY(100%); }
  3%   { opacity: 1; transform: translateY(0); }
  22%  { opacity: 1; transform: translateY(0); }
  25%  { opacity: 0; transform: translateY(-100%); }
  100% { opacity: 0; transform: translateY(-100%); }
}

@media (prefers-reduced-motion: reduce) {
  .os-rotator__word {
    animation: none;
  }
  /* Freeze the first brand in place — no motion, no cycling. */
  .os-rotator__word--tg {
    opacity: 1;
    transform: translateY(0);
  }
}

/* -----------------------------------------------------------------
   Compact social row for marketing footers. Muted gray by default,
   nudges toward brand ink on hover. Icons only (14px SVG). See
   `KustomaiWeb.MarketingComponents.os_socials/1` for markup.
   ----------------------------------------------------------------- */
.os-socials {
  display: inline-flex;
  align-items: center;
  gap: 10px;
}

.os-socials a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  color: #9ca3af;                 /* zinc-400: muted enough to sit quietly next to text links */
  transition: color 0.15s ease;
  border-radius: 4px;
  /* Undo the `.os-foot a { margin-left: 16px }` default so our own
     `.os-socials { gap }` controls spacing between the icons. */
  margin-left: 0;
}

/* Small nudge so the icon row sits away from the last text link. */
.os-foot .os-socials {
  margin-left: 16px;
}

.os-socials a:hover,
.os-socials a:focus-visible {
  color: var(--ka-navy, #0f172a);
}

/* When the socials live inside the Navy footer, invert the resting
   and hover colours so they read as light icons that brighten on
   hover instead of trying to darken to Navy on Navy. */
.os-foot .os-socials a {
  color: rgba(255, 255, 255, 0.55);
}

.os-foot .os-socials a:hover,
.os-foot .os-socials a:focus-visible {
  color: #ffffff;
}

/* -----------------------------------------------------------------
   Auth / demo form fields — inputs across sign-in, register, and the
   demo request page. Palette-aligned focus rings + Cobalt border on
   hover; inline HEEx styles set the base geometry. This overrides the
   `#111` focus that used to live per-page.
   ----------------------------------------------------------------- */
.auth-input,
.os-form input:not([type="checkbox"]):not([type="radio"]),
.os-form textarea,
.os-form select {
  border: 1px solid var(--line);
  background: #ffffff;
  color: var(--ink);
  border-radius: 10px;
  transition: border-color 120ms ease, box-shadow 120ms ease;
}

.auth-input:hover,
.os-form input:not([type="checkbox"]):not([type="radio"]):hover,
.os-form textarea:hover,
.os-form select:hover {
  border-color: #94a3b8;   /* slate-400 */
}

.auth-input:focus,
.auth-input:focus-visible,
.os-form input:focus,
.os-form textarea:focus,
.os-form select:focus {
  outline: none;
  border-color: var(--royal-blue);
  box-shadow: 0 0 0 3px rgba(10, 66, 186, 0.22);
}

.auth-field-label a {
  color: var(--ink-body);
}

.auth-alt a {
  color: var(--ink-body);
  font-weight: 600;
}

/* -----------------------------------------------------------------
   Auth plate — /sign-in, /register.
   Black-text-on-white per the palette rule (Royal Blue is reserved
   for the top nav bar + the primary CTA button below the form).
   The old `.os-hero .auth-*` overrides that painted labels white for
   the Royal Blue plate are removed — auth pages no longer sit inside
   the hero.
   ----------------------------------------------------------------- */
.auth-plate {
  padding: 88px 0 80px;
  background: var(--paper);
  color: var(--ink);
}
.auth-plate h1 {
  margin: 0 0 16px;
  font-family: var(--font-serif);
  font-size: clamp(40px, 5vw, 64px);
  font-weight: 500;
  letter-spacing: -0.025em;
  line-height: 1.02;
  color: var(--ink);
}
.auth-plate h1 em,
.auth-plate .os-serif-em {
  font-style: italic;
  color: rgba(0, 0, 0, 0.55);
}
.auth-plate .os-lead {
  margin: 0 0 24px;
  color: var(--ink-body);
  font-size: 18px;
  line-height: 1.55;
  max-width: 34rem;
}
/* Body links on the auth plate — black underlined (affordance from
   underline, not from a chrome hue). */
.auth-plate a:not(.os-btn):not(.os-brand):not(.bot-cta) {
  color: var(--ink);
  font-weight: 600;
  text-decoration: underline;
  text-decoration-color: rgba(0, 0, 0, 0.35);
  text-underline-offset: 3px;
}
.auth-plate a:not(.os-btn):not(.os-brand):not(.bot-cta):hover {
  text-decoration-color: var(--ink);
}

/* Focus rings — Royal Blue tinted, same anchor as the primary CTA. */
.os-btn:focus-visible,
.os a:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(10, 66, 186, 0.40);
}

.os-socials svg {
  display: block;
}

/* ============================================================
   Team grid — four portraits, grayscale by default, full colour
   on hover. Portraits are square SVGs (1:1) inside a rounded
   frame; the desaturation lives on the <img>, not the wrapper,
   so the name / role label stays fully readable at rest.
   ============================================================ */
.os-team {
  list-style: none;
  margin: 36px 0 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 24px;
}

.os-team-card {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 12px;
}

.os-team-card img {
  display: block;
  width: 100%;
  aspect-ratio: 1 / 1;
  border-radius: 999px;
  background: var(--surface-tint);
  filter: grayscale(100%);
  transition: filter 300ms ease, transform 300ms ease;
}

.os-team-card:hover img,
.os-team-card:focus-within img {
  filter: grayscale(0);
  transform: translateY(-2px);
}

.os-team-name {
  font-weight: 600;
  color: var(--ink);
}

.os-team-role {
  color: var(--mute);
  font-size: 14px;
}

@media (max-width: 800px) {
  .os-team {
    grid-template-columns: repeat(2, 1fr);
    gap: 16px;
  }
}

/* ================================================================
   ─────── REDESIGN 2026-08-29 ───────
   Landing repaint: Deep Navy + Gold primary palette, with the four
   tagline hues (Blue / Orange / Purple / Emerald) doing double-duty
   as section accents. New tokens live in :root as `--brand-*`. This
   block adds:
     · gold underline behind the hero rotator word
     · per-section eyebrows in the tagline palette
     · tinted pillar cards for the "Three things" list
     · numbered process chips for the "Flow" list
   Everything below is additive — earlier rules keep their layout
   contract, this section paints the accent hues on top.
   ================================================================ */

/* --- Hero rotator: Gold underline behind the current word --------
   Anchors the eye on the rotating platform name; the underline
   doesn't rotate with the word so the strip feels stable. */
.os-hero .os-rotator {
  position: relative;
  display: inline-block;
  padding: 0 4px;
}
.os-hero .os-rotator::after {
  content: "";
  position: absolute;
  left: 4px;
  right: 4px;
  bottom: 0.10em;
  height: 0.14em;
  background: var(--brand-gold);
  border-radius: 999px;
  opacity: 0.85;
  z-index: -1;
}

/* --- Section eyebrows -------------------------------------------
   Small uppercase kicker above the section h2. Each home section
   carries one tagline hue so scrolling walks Dream → Persistent →
   Discipline → Embrace. Add via `<p class="os-eyebrow os-eyebrow-{hue}">
   Word</p>` right before the section's h2. */
.os-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 14px;
  padding: 0;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--brand-slate);
}
.os-eyebrow::before {
  content: "";
  width: 24px;
  height: 2px;
  border-radius: 2px;
  background: currentColor;
}
/* Doubled class chain bumps specificity above `.os-end p` and other
   section-scoped `p` rules that would otherwise repaint the eyebrow
   to `--mute`. */
.os-eyebrow.os-eyebrow-blue     { color: var(--brand-blue); }
.os-eyebrow.os-eyebrow-orange   { color: var(--brand-orange); }
.os-eyebrow.os-eyebrow-purple   { color: var(--brand-purple); }
.os-eyebrow.os-eyebrow-emerald  { color: var(--brand-emerald); }
.os-eyebrow.os-eyebrow-gold     { color: var(--brand-gold-2); }
.os-eyebrow.os-eyebrow-navy     { color: var(--brand-navy); }

/* --- Pillar cards ------------------------------------------------
   Replaces the 2-column dt/dd row for the "Three things" section
   with three color-tinted cards. Each card carries a left border in
   its assigned hue plus a tinted number badge, so the three
   pillars read as distinct capabilities rather than a bulleted list.
   Markup:
     <dl class="os-pillars">
       <div class="os-pillar os-pillar-blue">
         <div class="os-pillar-num">1</div>
         <dt>...</dt><dd>...</dd>
       </div>
       ...
     </dl>
*/
.os-pillars {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
  margin: 36px 0 0;
  padding: 0;
}
.os-pillar {
  display: block;
  padding: 24px 22px;
  background: var(--pure-white);
  border: 1px solid var(--line);
  border-left: 4px solid currentColor;
  border-radius: 14px;
  box-shadow: 0 1px 0 rgba(17, 24, 39, 0.02), 0 8px 24px rgba(17, 24, 39, 0.04);
  color: var(--brand-charcoal);
  transition: transform 140ms ease, box-shadow 140ms ease;
}
.os-pillar:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 8px rgba(17, 24, 39, 0.03), 0 18px 40px rgba(17, 24, 39, 0.08);
}
.os-pillar-blue     { color: var(--brand-blue); }
.os-pillar-orange   { color: var(--brand-orange); }
.os-pillar-purple   { color: var(--brand-purple); }
.os-pillar-emerald  { color: var(--brand-emerald); }
.os-pillar-gold     { color: var(--brand-gold-2); }

.os-pillar-num {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  margin-bottom: 14px;
  border-radius: 10px;
  background: color-mix(in srgb, currentColor 14%, transparent);
  color: currentColor;
  font-weight: 700;
  font-size: 14px;
}

.os-pillar dt {
  margin: 0 0 8px;
  font-family: var(--font);
  font-size: 20px;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--brand-charcoal);
}

.os-pillar dd {
  margin: 0;
  color: var(--mute);
  font-size: 15px;
  line-height: 1.55;
}

@media (max-width: 900px) {
  .os-pillars {
    grid-template-columns: 1fr;
    gap: 16px;
  }
}

/* --- Process flow (`.os-bullets` variant) ------------------------
   `.os-flow-bullets` gives each numbered step a gradient chip in the
   tagline palette so the five-step sequence reads as a journey. Use
   in place of `.os-bullets` when the list represents a process. */
.os-flow-bullets {
  counter-reset: os-flow;
  list-style: none;
  padding: 0;
  margin: 36px 0 0;
  display: grid;
  gap: 14px;
}
.os-flow-bullets li {
  counter-increment: os-flow;
  display: grid;
  grid-template-columns: 42px 1fr;
  gap: 16px;
  align-items: start;
  padding: 16px 18px;
  background: var(--pure-white);
  border: 1px solid var(--line);
  border-radius: 12px;
  font-size: 16px;
  color: var(--ink-body);
  transition: transform 120ms ease, box-shadow 120ms ease;
}
.os-flow-bullets li:hover {
  transform: translateX(2px);
  box-shadow: 0 6px 18px rgba(17, 24, 39, 0.05);
}
.os-flow-bullets li::before {
  content: counter(os-flow);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 10px;
  color: var(--pure-white);
  font-weight: 700;
  font-size: 14px;
  background: var(--brand-slate);
}
.os-flow-bullets li:nth-child(1)::before { background: var(--brand-blue); }
.os-flow-bullets li:nth-child(2)::before { background: var(--brand-orange); }
.os-flow-bullets li:nth-child(3)::before { background: var(--brand-purple); }
.os-flow-bullets li:nth-child(4)::before { background: var(--brand-emerald); }
.os-flow-bullets li:nth-child(5)::before { background: var(--brand-gold-2); }

/* --- Section separator: color rhythm strip ----------------------
   A thin strip of the four tagline hues can go between sections to
   punctuate the palette rhythm. Optional — use where the layout
   feels flat. `<div class="os-color-rule"></div>`. */
.os-color-rule {
  height: 3px;
  background: linear-gradient(
    to right,
    var(--brand-blue) 0 25%,
    var(--brand-orange) 25% 50%,
    var(--brand-purple) 50% 75%,
    var(--brand-emerald) 75% 100%
  );
  border-radius: 999px;
  margin: 0 auto;
  max-width: 220px;
  opacity: 0.85;
}

/* --- Closing CTA plate: soft Navy → Purple gradient -------------
   The final `.os-end` section previously used the plain body plate.
   Replace with a rich brand gradient that echoes the hero without
   repeating it. */
.os-end {
  background:
    radial-gradient(600px 300px at 100% 0%, rgba(245, 158, 11, 0.14) 0%, transparent 60%),
    radial-gradient(600px 300px at 0% 100%, rgba(16, 185, 129, 0.12) 0%, transparent 60%),
    linear-gradient(160deg, #F8FAFC 0%, #EEF2FF 100%);
  border-top: 1px solid var(--line);
}

.os-end h2 {
  color: var(--brand-navy);
}

/* Gold accent under the closing h2 for the "action" pulse. */
.os-end h2::after {
  content: "";
  display: block;
  width: 64px;
  height: 3px;
  margin-top: 14px;
  background: var(--brand-gold);
  border-radius: 999px;
}
