/* LocalModels.com — Profile page desktop styles (Phase 2.1 → Round 2)
   Adapted from designs/styles-v2.css. All custom variables prefixed --lm-*.
*/

/* ══════════════════════════════════════════════════════════════
   SNGINE CHROME OVERRIDE — hide Sngine sidebar/topbar everywhere
   Fires for any page that has <html class="lm-active lm-chrome-active">
   Profile-only specific rules use .lm-profile-active.
   ══════════════════════════════════════════════════════════════ */
/* R7 #1: scrollbar gutter mirrored on both edges keeps frame centered at >1440px */
html.lm-active {
  /* `stable` reserves the right scrollbar gutter so layout doesn't shift
     when content grows past the viewport. We previously used `both-edges`
     which ALSO reserved a gutter on the LEFT — that left gutter showed
     the html background as a vertical strip ~17px wide, and on every
     scroll the browser repainted it (visible flicker, scroll-triggered).
     Right-edge-only `stable` removes the left strip entirely. */
  scrollbar-gutter: stable;
}
html.lm-chrome-active .x-sidebar-width,
html.lm-chrome-active .x-sidebar-fixed,
html.lm-chrome-active .x-sidebar-width + *[class*="x-sidebar"] {
  display: none !important;
}
html.lm-chrome-active .x-content-width {
  width: 100% !important;
  max-width: 100% !important;
  flex: 1 1 100% !important;
}
/* Remove Sngine's content-column top border + 5px row gap on chrome pages.
   The fixed .lm-topbar already draws the top frame line; the legacy
   .col-lg-* border-top (style.css) was stacking just below it as a visible
   "double line" under the header (contact / home / booking / about, etc.). */
html.lm-chrome-active .x-content-width > .x_content_row { margin-top: 0 !important; }
html.lm-chrome-active .x-content-width > .x_content_row > .col-lg-8,
html.lm-chrome-active .x-content-width > .x_content_row > .col-lg-12 { border-top: none !important; }
html.lm-chrome-active .main-wrapper {
  padding-right: 0 !important;
}
html.lm-chrome-active .top-bar {
  display: none !important;
}
/* NOTE: .bottom-bar is the admin "logged in as / Switch Back" banner — it must
   stay visible under the LM chrome. Center it within the content area (clear of
   the 240px sidebar on desktop) and lift it above the mobile bottom nav. */
html.lm-chrome-active .bottom-bar {
  left: calc(50% + 120px);
  z-index: 1100;
}
@media (max-width: 768px) {
  html.lm-chrome-active .bottom-bar {
    left: 50%;
    bottom: 76px; /* clear the mobile bottom nav */
  }
}
/* Hide Sngine's topbar search wrapper */
html.lm-chrome-active .search-wrapper-prnt,
html.lm-chrome-active .hdr_multi_btns,
html.lm-chrome-active .x_upgrade_btn_wrp {
  display: none !important;
}
/* R15 #5: Hide ONLY the right-side online users widget. Keep chat-sidebar so opening chat works. */
html.lm-chrome-active [class*="x_online"],
html.lm-chrome-active [class*="online_users"] {
  display: none !important;
}
/* Chat sidebar: keep visible (Sngine handles its own slide-in/out) but ensure it's pinned to viewport bottom */
html.lm-chrome-active .chat-sidebar {
  bottom: 0 !important;
  z-index: 250;
}
/* Prevent Sngine's row from adding spacing */
html.lm-chrome-active .row.m-0 {
  display: block !important;
}
/* R17 fix v2: body itself is gray (outside frame). body::after paints white centered 1440px frame on top. */
html.lm-chrome-active body {
  background: #eef2f6 !important;
}
/* Reset container padding/max-width inside non-profile pages */
html.lm-chrome-active .container {
  max-width: none !important;
  padding: 0 !important;
}
/* Global chrome layout — sidebar 240px + topbar 64px reserved */
html.lm-chrome-active body { padding-left: max(240px, calc((100vw - 1440px) / 2 + 240px)); padding-right: max(0px, calc((100vw - 1440px) / 2)); padding-top: 64px; }
/* R18 fix: body bg gray; body::after paints white centered frame WITH border-box so
   the 1px borders sit INSIDE the 1440 width (visible even when viewport == 1440) */
html.lm-chrome-active body::before { display: none; }
html.lm-chrome-active body::after {
  content: ""; display: block; position: fixed; top: 0; bottom: 0;
  left: max(0px, calc((100vw - 1440px) / 2));
  width: min(1440px, 100vw);
  background: #ffffff;
  border-left: 1px solid #cbd5e1;
  border-right: 1px solid #cbd5e1;
  box-sizing: border-box;
  z-index: -1;
}
/* R17 fix: profile page also uses chrome-active body::before/::after — DON'T hide them.
   Profile page padding is handled by .lm-profile-page itself, so reset body padding for profile only. */
html.lm-profile-active body { padding-left: 0 !important; padding-right: 0 !important; padding-top: 0 !important; }

/* ══════════════════════════════════════════════════════════════
   CENTERED FRAME — entire app max-width 1440px centered
   At viewports > 1440px: equal whitespace on both sides
   ══════════════════════════════════════════════════════════════ */
/* The sidebar and topbar use CSS calc() to offset from viewport center */
/* At ≤1440px: margin = 0, sidebar at left:0, topbar at left:240px        */
/* At >1440px: margin = (vw-1440)/2, elements shift right proportionally  */

/* ══════════════════════════════════════════════════════════════
   LM SIDEBAR (240px, position: fixed)
   ══════════════════════════════════════════════════════════════ */
.lm-sidebar {
  position: fixed;
  /* Center the frame: sidebar starts at (viewport - 1440px)/2, min 0 */
  left: max(0px, calc((100vw - 1440px) / 2));
  top: 0; bottom: 0;
  width: 240px;
  background: #fff;
  /* R20b: explicit left+right borders so frame edges stay visible at top
     (above topbar/sidebar would otherwise hide body::after's borders) */
  border-left: 1px solid var(--lm-border);
  border-right: 1px solid var(--lm-border);
  display: flex;
  flex-direction: column;
  padding: 18px 12px 14px;
  gap: 8px;
  overflow: visible auto;
  z-index: 200;
  scrollbar-width: none;
}
.lm-sidebar::-webkit-scrollbar { display: none; }
.lm-sidebar > .lm-account-wrap { flex-shrink: 0; margin-top: auto; }
.lm-sidebar > .lm-nav { flex-shrink: 0; }
.lm-sidebar > .lm-create-wrap { flex-shrink: 0; }
.lm-sidebar > .lm-brand { flex-shrink: 0; }
.lm-sidebar > .lm-sidebar-spacer { flex: 1 1 0; min-height: 0; }
.lm-sidebar::-webkit-scrollbar { display: none; }

/* Brand */
/* R20b: no divider between logo and nav; logo sits naturally with small top breathing room */
.lm-brand {
  display: flex; align-items: center; gap: 10px;
  padding: 6px 6px 8px;
  border-bottom: none;
  margin-bottom: 4px;
  color: var(--lm-text);
  text-decoration: none;
}
.lm-brand:hover { text-decoration: none; color: var(--lm-text); }
.lm-brand-mark {
  display: grid; place-items: center;
  width: 36px; height: 36px;
  border-radius: 10px;
  background: var(--lm-primary-soft);
  color: var(--lm-primary-strong);
  border: 1px solid var(--lm-primary-soft-2);
  flex-shrink: 0;
}
.lm-brand-name { font-weight: 700; font-size: 20px; letter-spacing: -0.01em; color: var(--lm-text); line-height: 1.2; }
.lm-brand-name span { color: var(--lm-muted-2); font-weight: 600; font-size: 0.72em; }
.lm-brand-name .lm-brand-tm { font-size: 0.58em; vertical-align: super; font-weight: 600; color: var(--lm-muted-2); margin-left: 1px; line-height: 0; }
.lm-brand-tag { font-size: 10.5px; color: var(--lm-muted); font-family: var(--lm-font-mono); letter-spacing: 0.02em; }

/* Nav */
.lm-nav { display: flex; flex-direction: column; gap: 2px; }
.lm-nav-item {
  display: flex; align-items: center; gap: 12px;
  padding: 9px 10px;
  border-radius: 8px;
  color: var(--lm-text);
  font-weight: 500; font-size: 13.5px;
  position: relative; cursor: pointer;
}
.lm-nav-item:hover { background: var(--lm-primary-soft); text-decoration: none; color: var(--lm-text); }
.lm-nav-item.is-active { background: var(--lm-primary-soft); color: var(--lm-primary-strong); }
.lm-nav-item.is-active::before {
  content: ""; position: absolute; left: -12px; top: 8px; bottom: 8px;
  width: 3px; background: var(--lm-primary-strong); border-radius: 0 3px 3px 0;
}

/* ── Brands nav: inline-accordion submenu (mirrors the "More"
   button pattern above). The Brands row has the main nav-item +
   a chevron caret; click on the caret toggles `.is-open` on the
   wrap and the submenu expands inline, pushing siblings down. */
.lm-nav-row-wrap { position: relative; }
.lm-nav-row {
  display: flex;
  align-items: stretch;
  gap: 2px;
}
.lm-nav-row .lm-nav-item-grow { flex: 1; min-width: 0; }
.lm-nav-row-caret {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 36px;
  background: transparent;
  border: none;
  border-radius: 8px;
  color: var(--lm-muted);
  cursor: pointer;
  flex: none;
  transition: background .12s, color .12s, transform .15s;
}
.lm-nav-row-caret:hover {
  background: var(--lm-primary-soft, #f3f8f5);
  color: var(--lm-text);
}
.lm-nav-row-caret svg { transition: transform .15s ease; }
.lm-nav-row-caret.is-open svg { transform: rotate(180deg); }
/* Submenu — reuses the .lm-nav-submenu / .lm-nav-subitem styles
   already defined for the More button, plus a few additions for
   the picture thumbnails specific to the Brands submenu. */
.lm-nav-row-wrap .lm-nav-submenu { display: none; }
.lm-nav-row-wrap.is-open .lm-nav-submenu { display: block; }
.lm-nav-subitem-primary {
  color: var(--lm-primary-strong, #00363f) !important;
  font-weight: 600 !important;
}
.lm-nav-subitem-primary strong { color: inherit; font-weight: 700; }
.lm-nav-subitem-pic {
  width: 22px;
  height: 22px;
  border-radius: 5px;
  object-fit: cover;
  background: var(--lm-surface-2, #f1f5f9);
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: 11px;
  color: var(--lm-text);
}
.lm-nav-subitem-create {
  color: var(--lm-primary-strong, #00363f) !important;
  font-weight: 600 !important;
}
.lm-nav-subitem-create svg { color: currentColor; }
.lm-nav-badge {
  margin-left: auto; font-size: 11px; font-weight: 600;
  background: var(--lm-primary); color: #fff;
  padding: 1px 7px; border-radius: 999px;
}
.lm-nav-badge-gold { background: var(--lm-gold); }

/* More submenu */
/* R9 quick: remove default <button> border around "More" trigger */
.lm-nav-more-trigger {
  display: flex; align-items: center; gap: 12px;
  padding: 9px 10px; width: 100%;
  border: none !important;
  background: transparent !important;
  outline: none;
  border-radius: 8px; font-weight: 500; font-size: 13.5px;
  color: var(--lm-text); cursor: pointer;
}
.lm-nav-more-trigger:hover { background: var(--lm-primary-soft) !important; }
.lm-nav-more-trigger:focus-visible { box-shadow: 0 0 0 2px var(--lm-primary-soft-2); }
.lm-nav-more-trigger svg:last-child { margin-left: auto; transition: transform .15s; }
.lm-nav-more-trigger.is-open svg:last-child { transform: rotate(180deg); }
/* Phase H R69: sidebar More submenu is now an INLINE accordion — sits
   directly below the trigger inside the nav wrap, pushing Create and the
   account row down when open. No fixed positioning, no body-hoist. */
.lm-nav-submenu {
  display: none;
  margin: 2px 0 6px 22px;
  padding: 4px 0 4px 16px;
  /* soft green vertical guide line on the left (instead of a filled panel) */
  border-left: 2px solid var(--lm-primary-soft-2, #b7e0c9);
}
.lm-nav-submenu.is-open { display: block; }
.lm-nav-subitem {
  display: flex !important; align-items: center; gap: 10px;
  width: 100%;
  padding: 7px 10px !important; border-radius: 6px;
  font-size: 12.5px; color: var(--lm-text); font-weight: 500;
  white-space: nowrap;
  text-decoration: none;
}
.lm-nav-subitem:hover { background: var(--lm-primary-soft, #f3f8f5); text-decoration: none; }
.lm-nav-subdivider { height: 1px; background: var(--lm-border); margin: 6px 8px; }
/* Phase B1.b — count badge inside a sub-item link (e.g. Services Pending). */
.lm-nav-subitem-badge {
  margin-left: auto;
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 20px; height: 18px;
  padding: 0 6px;
  font-size: 10.5px; font-weight: 700; line-height: 1;
  color: #fff;
  background: #f59e0b;
  border-radius: 10px;
  font-variant-numeric: tabular-nums;
}

/* Sidebar spacer */
.lm-sidebar-spacer { flex: 1; min-height: 8px; }

/* Account area at bottom */
.lm-account-area {
  margin: 0 -12px -14px;
  border-top: 1px solid var(--lm-border);
  padding: 10px 12px;
  display: flex; align-items: center; gap: 10px;
  cursor: pointer;
  transition: background .12s;
}
.lm-account-area:hover { background: var(--lm-surface); }
.lm-account-avatar { width: 36px; height: 36px; border-radius: 50%; overflow: hidden; flex-shrink: 0; background: var(--lm-surface); }
.lm-account-avatar img { width: 100%; height: 100%; object-fit: cover; }
.lm-account-meta { flex: 1; min-width: 0; }
.lm-account-name { font-weight: 600; font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.lm-account-handle { font-size: 11px; color: var(--lm-muted); font-family: var(--lm-font-mono); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* ══════════════════════════════════════════════════════════════
   LM TOPBAR (64px fixed, starts right of sidebar)
   ══════════════════════════════════════════════════════════════ */
.lm-topbar {
  position: fixed;
  /* Starts right of sidebar (240px from frame left), ends at frame right */
  left: max(240px, calc((100vw - 1440px) / 2 + 240px));
  right: max(0px, calc((100vw - 1440px) / 2));
  top: 0;
  height: 64px;
  background: rgba(255,255,255,0.96);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  /* R20b: right border so frame line shows at top 64px; sidebar's border-left covers left frame */
  border-right: 1px solid var(--lm-border);
  border-bottom: 1px solid var(--lm-border);
  display: flex; align-items: center; gap: 12px;
  padding: 0 24px;
  z-index: 199;
}
/* Search bar — R8 #1: ⌘K as small pill INSIDE input area.
   v2.2m — max-width REMOVED so the bar stretches to the available gap
   between brand area and right-side actions on any viewport. */
.lm-topbar-search {
  flex: 1 1 0; min-width: 0;
  display: flex; align-items: center; gap: 10px;
  padding: 9px 12px 9px 14px;
  background: var(--lm-surface);
  border: 1px solid var(--lm-border);
  border-radius: 10px;
  color: var(--lm-muted);
  cursor: pointer;
  transition: border-color .12s;
}
.lm-topbar-search:hover { border-color: var(--lm-muted-2); }
.lm-topbar-search > svg { flex: 0 0 auto; }
.lm-topbar-search-text { font-size: 13px; flex: 1 1 auto; min-width: 0; color: var(--lm-muted); }
.lm-topbar-kbd {
  flex: 0 0 auto !important;
  display: inline-flex; align-items: center; justify-content: center;
  background: #F1F5F9 !important;
  color: var(--lm-muted) !important;
  border: 1px solid var(--lm-border-2) !important;
  padding: 2px 6px !important;
  border-radius: 4px !important;
  font-size: 11px !important;
  font-family: var(--lm-font-mono);
  height: 20px;
  line-height: 1;
  pointer-events: none;
  letter-spacing: 0.02em;
  white-space: nowrap;
}
/* Right actions */
.lm-topbar-right { display: flex; align-items: center; gap: 8px; margin-left: auto; }
.lm-topbar-upgrade {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 7px 14px;
  background: var(--lm-gold);
  color: #fff; border-radius: 999px;
  font-size: 12.5px; font-weight: 700;
  border: none; cursor: pointer; white-space: nowrap;
}
.lm-topbar-upgrade:hover { background: #b8923f; text-decoration: none; color: #fff; }
.lm-topbar-action {
  width: 38px; height: 38px;
  display: grid; place-items: center;
  border-radius: 8px; color: var(--lm-text);
  background: none; border: none; cursor: pointer;
  position: relative;
}
.lm-topbar-action:hover { background: var(--lm-surface-2); }
.lm-topbar-badge {
  position: absolute; top: 4px; right: 4px;
  min-width: 16px; height: 16px; border-radius: 999px;
  background: #e11d48; color: #fff;
  font-size: 9px; font-weight: 700;
  display: flex; align-items: center; justify-content: center;
  padding: 0 4px;
  border: 2px solid #fff;
  pointer-events: none;
}

/* ══════════════════════════════════════════════════════════════
   PROFILE PAGE BODY OFFSET (push below topbar + sidebar)
   ══════════════════════════════════════════════════════════════ */

/* ── CSS Tokens ──────────────────────────────────────────── */
:root {
  --lm-bg:           #ffffff;
  --lm-surface:      #f8fafc;
  --lm-surface-2:    #f1f5f9;
  --lm-text:         #0f172a;
  --lm-muted:        #64748b;
  --lm-muted-2:      #94a3b8;
  --lm-border:       #e2e8f0;
  --lm-border-2:     #eef2f6;
  --lm-primary:      #0f6f4f;
  --lm-primary-strong: #0a5439;
  --lm-primary-soft: #f3f8f5;
  --lm-primary-soft-2: #dcebe2;
  --lm-primary-text: #0a5439;
  --lm-primary-bright: #34D399;       /* dark mode accent */
  --lm-gold:         #C6A15B;
  --lm-gold-soft:    #fef7d6;
  --lm-gold-soft-2:  #f5deb3;
  --lm-elite-bg:     #0F172A;
  --lm-shadow-sm:    0 1px 2px rgba(15,23,42,0.04), 0 1px 0 rgba(15,23,42,0.02);
  --lm-shadow-md:    0 1px 2px rgba(15,23,42,0.04), 0 8px 24px rgba(15,23,42,0.06);
  --lm-shadow-lg:    0 12px 32px rgba(15,23,42,0.12), 0 2px 6px rgba(15,23,42,0.05);
  --lm-r-card:       12px;
  --lm-r-btn:        8px;
  --lm-font:         "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --lm-font-mono:    "JetBrains Mono", ui-monospace, "SFMono-Regular", monospace;
}

/* ── Page wrapper ────────────────────────────────────────── */
/* R17 fix: .lm-profile-page transparent so the white centered frame (body::after) shows through */
.lm-profile-page {
  background: transparent !important;
  font-family: var(--lm-font);
  font-size: 14px;
  line-height: 1.5;
  color: var(--lm-text);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  /* Offset for fixed sidebar (240px) and topbar (64px), plus center the frame */
  padding-left: max(240px, calc((100vw - 1440px) / 2 + 240px));
  padding-right: max(0px, calc((100vw - 1440px) / 2));
  padding-top: 64px;
  min-height: 100vh;
  position: relative;
}
/* R17 fix: profile-active overrides REMOVED — chrome-active body::before/::after (white frame + dark borders) is now the single source of truth on every page */
.lm-profile-page *, .lm-profile-page *::before, .lm-profile-page *::after {
  box-sizing: border-box;
}
.lm-profile-page button { font: inherit; cursor: pointer; border: 0; background: none; color: inherit; }
.lm-profile-page a { color: inherit; text-decoration: none; }

/* ── Content layout ──────────────────────────────────────── */
.lm-content {
  display: grid;
  /* R19b: design-exact — main 765px + gap 24 + rail 360 + 48 padding = 1197 */
  grid-template-columns: minmax(0, 1fr) 360px;
  gap: 24px;
  max-width: 1197px;
  width: 100%;
  margin: 0 auto;
  padding: 22px 24px 80px;
}
.lm-content-center { min-width: 0; max-width: 765px; }
/* R19b: rail is plain — no vertical divider between main and rail (per user) */
.lm-rail {
  display: flex; flex-direction: column; gap: 14px;
  align-self: stretch;
  min-height: calc(100vh - 80px);
}

@media (max-width: 1100px) {
  .lm-profile-page { padding-left: 80px; } /* collapsed Sngine sidebar at this breakpoint */
  .lm-content { grid-template-columns: 1fr; }
  .lm-rail { position: static; padding-bottom: 0; }
  /* On narrow screens rail collapses below main content — return footer to
     normal flow at the bottom of the page. */
  .lm-rail-footer {
    position: static;
    width: auto;
    right: auto;
    border-top: 0;
  }
  .lm-topbar { left: 80px; }
  .lm-sidebar { width: 80px; }
  .lm-brand-name, .lm-brand-tag, .lm-nav-item span, .lm-nav-badge,
  .lm-account-meta, .lm-topbar-upgrade span,
  .lm-nav-more-trigger span,
  .lm-nav-more-trigger svg:last-child { display: none; }
  /* Collapsed sidebar: hide chevron arrow on More trigger; center the icon */
  .lm-nav-more-trigger { justify-content: center; padding: 9px 0 !important; }
  /* Mini-profile: collapse to avatar-only (text/handle/caret hidden) */
  .lm-mini-profile { padding: 10px !important; justify-content: center; }
  .lm-mini-meta, .lm-mini-caret { display: none !important; }
  .lm-mini-avatar { width: 40px !important; height: 40px !important; }
}
@media (max-width: 768px) {
  .lm-profile-page { padding-left: 0; padding-top: 56px; }
  .lm-topbar { left: 0; }
  .lm-sidebar { display: none; }
}

/* ── Buttons ─────────────────────────────────────────────── */
.lm-profile-page .lm-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  padding: 10px 16px;
  border-radius: var(--lm-r-btn);
  font-weight: 600; font-size: 13.5px;
  border: 1px solid transparent;
  transition: background .12s, border-color .12s, transform .06s;
  white-space: nowrap; cursor: pointer;
}
.lm-profile-page .lm-btn:active { transform: translateY(1px); }
.lm-profile-page .lm-btn-primary {
  background: var(--lm-primary); color: #fff;
  box-shadow: 0 1px 0 rgba(0,0,0,0.06), inset 0 -1px 0 rgba(0,0,0,0.12);
}
.lm-profile-page .lm-btn-primary:hover { background: var(--lm-primary-strong); }
.lm-profile-page .lm-btn-secondary {
  background: #fff; color: var(--lm-text); border-color: var(--lm-border);
}
.lm-profile-page .lm-btn-secondary:hover { border-color: var(--lm-primary); color: var(--lm-primary-strong); }
.lm-profile-page .lm-btn-ghost {
  background: #fff; color: var(--lm-text); border: 1px solid var(--lm-border);
}
.lm-profile-page .lm-btn-ghost:hover { border-color: var(--lm-primary); color: var(--lm-primary-text); }
.lm-profile-page .lm-btn-sm { padding: 7px 12px; font-size: 12.5px; border-radius: 7px; }
.lm-profile-page .lm-btn-xs { padding: 5px 10px; font-size: 11.5px; border-radius: 6px; }

/* R12: Action buttons strictly icon-only — but SVG must stay visible */
.lm-profile-page .lm-icon-btn-lg {
  width: 40px !important; height: 40px !important;
  min-width: 40px !important; max-width: 40px !important;
  flex-shrink: 0;
  display: inline-flex !important; align-items: center !important; justify-content: center !important;
  padding: 0 !important;
  border-radius: 8px !important;
  color: var(--lm-text);
  background: #fff !important;
  border: 1px solid var(--lm-border);
  transition: border-color .12s, color .12s, background .12s;
  cursor: pointer;
  /* keep an explicit font-size for the visible glyph if browser falls back to text */
  font-size: 0;
  line-height: 1;
  white-space: nowrap;
  overflow: hidden;
}
/* SVG explicitly sized so font-size:0 on parent doesn't hide it */
.lm-profile-page .lm-icon-btn-lg svg {
  width: 18px !important; height: 18px !important;
  flex-shrink: 0;
  display: block !important;
  font-size: 18px;
}
/* hide any TEXT children (label/span/text), keep SVG visible */
.lm-profile-page .lm-icon-btn-lg > span,
.lm-profile-page .lm-icon-btn-lg > .label,
.lm-profile-page .lm-icon-btn-lg > .text { display: none !important; }
.lm-profile-page .lm-icon-btn-lg:hover { border-color: var(--lm-primary); color: var(--lm-primary-strong); }
/* R14 #5: Follow active state — match all Sngine markers */
.lm-profile-page .lm-icon-btn-lg.is-on,
.lm-profile-page .lm-icon-btn-lg.js_unfollow,
.lm-profile-page button.js_unfollow.lm-icon-btn-lg,
.lm-profile-page .lm-save-btn.is-on,
.lm-icon-btn-lg.is-on,
.lm-icon-btn-lg.js_unfollow,
button.js_unfollow.lm-icon-btn-lg {
  color: var(--lm-primary-strong) !important;
  border: 1px solid var(--lm-primary) !important;
  background: var(--lm-primary-soft) !important;
}
.lm-profile-page .lm-icon-btn-lg.is-on svg,
.lm-profile-page .lm-icon-btn-lg.js_unfollow svg,
.lm-icon-btn-lg.is-on svg,
.lm-icon-btn-lg.js_unfollow svg,
button.js_unfollow.lm-icon-btn-lg svg {
  color: var(--lm-primary-strong) !important;
  stroke: var(--lm-primary-strong) !important;
  fill: none !important;
  display: block !important;
  width: 18px !important; height: 18px !important;
}

/* ── Hero ────────────────────────────────────────────────── */
.lm-hero {
  background: #fff;
  border: 1px solid var(--lm-border);
  border-radius: 16px;
  overflow: hidden;
  box-shadow: var(--lm-shadow-sm);
  margin-bottom: 8px;
  /* Establish positioning context for the LM hero dropdowns that need
     to escape the overflow boundary. They sit visually inside the hero
     but live as siblings of .lm-hero in DOM, anchored to it via
     absolute positioning on the .lm-profile-page wrapper below. */
  position: relative;
}
.lm-hero-cover {
  position: relative;
  /* Switched from fixed height:200px to aspect-ratio so the cover
     shrinks proportionally with the viewport (same behaviour as the
     brand page hero). min-height kept so on very narrow viewports it
     doesn't collapse to nothing. */
  width: 100%;
  aspect-ratio: 16 / 5;
  min-height: 140px;
  max-height: 280px;
  background: linear-gradient(135deg, #0a5439 0%, #0f6f4f 50%, #1a9a6e 100%);
  overflow: hidden;
}
/* Specific selector to beat Sngine's
   `.profile-cover-wrapper img.js_position-cover-full { height: auto }`
   in style.css — without this our cover image collapses to natural
   height and the banner shows green padding below the photo. */
.lm-hero-cover img,
.lm-hero-cover.profile-cover-wrapper img.js_position-cover-full,
.lm-hero-cover.profile-cover-wrapper img.js_position-cover-cropped {
  width: 100%; height: 100%;
  object-fit: cover; object-position: center;
  display: block;
}
.lm-hero-cover-overlay {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(15,23,42,0) 30%, rgba(15,23,42,0.45) 100%);
  pointer-events: none;
}
/* (lm-cover-edit-btn — definitive rule below in R7 section) */

.lm-hero-body { position: relative; padding: 0 24px 22px; }
/* Avatar wrap is the positioning anchor — same size as the visible
   circle. Camera button + dropdown are positioned absolutely against
   this wrap and intentionally placed at the avatar's edge so they're
   visible but don't bleed beyond the wrap (which would clip due to
   .lm-hero's overflow:hidden). The dropdown uses
   data-bs-strategy="fixed" so Bootstrap escapes the overflow chain. */
.lm-avatar-wrap {
  position: absolute; top: -68px; left: 24px;
  width: 132px; height: 132px;
}
/* The avatar itself — round, clipped, holds the image / gradient. */
.lm-avatar {
  width: 132px; height: 132px;
  border-radius: 50%;
  border: 4px solid #fff;
  box-shadow: 0 4px 12px rgba(15,23,42,0.12);
  background: #e2e8f0;
  display: block; position: relative;
  overflow: hidden;
}
/* All direct children of .lm-avatar fill the circle.
   !important is needed because Sngine's style.css gives
   .profile-avatar-wrapper a fixed `width: 130px; height: 130px;
   margin-top: -70px` which pushes our wrapper out of the circle and
   leaves the avatar background showing — that's the "huge half-bowl
   under a tiny photo" bug. */
.lm-avatar > img,
.lm-avatar > .profile-avatar-wrapper {
  width: 100% !important;
  height: 100% !important;
  margin: 0 !important;
  padding: 0 !important;
  display: block;
  position: absolute; inset: 0;
}
.lm-avatar > .lm-avatar-gradient {
  width: 100% !important;
  height: 100% !important;
  margin: 0 !important;
  padding: 0 !important;
}
.lm-avatar > .profile-avatar-wrapper { border-radius: 0 !important; }

/* Image fills the circle and is cropped center. */
.lm-avatar > img,
.lm-avatar .profile-avatar-wrapper > img {
  width: 100% !important;
  height: 100% !important;
  display: block;
  object-fit: cover; object-position: center;
  border-radius: 0; /* clipping done by parent .lm-avatar */
  margin: 0 !important;
}

/* Camera button — positioned BOTTOM-LEFT of the avatar (user request),
   sitting partly over the white border ring. Color uses the LM primary
   green tone (deeper than the bright green) so it reads as our brand. */
.lm-avatar-cam-wrap {
  position: absolute;
  bottom: 0; left: 0;
  z-index: 5;
}
/* Camera button — light green tint background, dark green LM-primary
   icon. Reads as a friendly "edit" affordance without overpowering the
   photo. On hover the bg deepens slightly. */
.lm-avatar-cam-btn {
  width: 32px; height: 32px;
  display: grid; place-items: center;
  background: #d6efe2;        /* light tint of LM primary */
  color: var(--lm-primary, #2f8a5f);
  border: 2px solid #fff;
  border-radius: 50%;
  cursor: pointer;
  box-shadow: 0 2px 6px rgba(15,23,42,0.20);
  padding: 0; line-height: 1;
  transition: background .15s ease, transform .15s ease;
}
/* Hover: keep the same light-green background (no darken). Only a
   subtle scale tells the user the button is interactive — no color
   shift, since the previous darker hover made the icon harder to read. */
.lm-avatar-cam-btn:hover {
  transform: scale(1.06);
}
.lm-avatar-cam-btn:active { transform: scale(0.97); }
.lm-avatar-cam-btn:focus-visible {
  outline: 2px solid var(--lm-primary, #2f8a5f);
  outline-offset: 2px;
}
.lm-avatar-cam-btn svg {
  color: var(--lm-primary, #2f8a5f) !important;
  fill: currentColor !important;
  display: block;
}
/* Dark theme: the light theme's dark drop-shadow reads as a soft translucent
   circle around the camera button; on the dark background that dark shadow
   vanishes. Restore the ring with a translucent WHITE halo so the circle is
   visible in dark too. */
html[data-lm-theme="dark"] .lm-avatar-cam-btn {
  box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.12), 0 2px 6px rgba(0, 0, 0, 0.45);
}

/* Dropdown menu — Bootstrap absolutes it relative to .lm-avatar-cam-wrap.
   Force above everything below the hero. */
.lm-avatar-cam-wrap .dropdown-menu.action-dropdown-menu {
  z-index: 1050;
  min-width: 220px;
  padding: 6px;
  border-radius: 10px;
  box-shadow: 0 8px 24px rgba(15,23,42,0.18);
  border: 1px solid var(--lm-border, #e2e8f0);
  background: #fff;
  margin-top: 6px;
}
.lm-avatar-cam-wrap .dropdown-menu.action-dropdown-menu .dropdown-item {
  font-family: var(--lm-font-sans, inherit);
  font-size: 13px;
  font-weight: 500;
  color: var(--lm-text, #0f172a);
  padding: 8px 10px;
  border-radius: 7px;
  cursor: pointer;
}
.lm-avatar-cam-wrap .dropdown-menu.action-dropdown-menu .dropdown-item:hover {
  background: var(--lm-bg-2, #f1f5f9);
  color: var(--lm-text, #0f172a);
}
.lm-avatar-cam-wrap .dropdown-menu.action-dropdown-menu .dropdown-item .action {
  font-size: 13px; font-weight: 500;
}
.lm-avatar-cam-wrap .dropdown-menu.action-dropdown-menu .dropdown-item .action-desc {
  font-size: 11.5px; font-weight: 400;
  color: var(--lm-muted, #64748b);
  margin-top: 2px;
}

/* Upload progress loader — clipped to the avatar circle. Lives inside
   .lm-avatar-wrap, sits over .lm-avatar via absolute positioning. */
.lm-avatar-wrap .profile-avatar-change-loader {
  position: absolute;
  inset: 0;
  width: 132px; height: 132px;
  border-radius: 50%;
  background: rgba(0,0,0,0.5);
  display: grid; place-items: center;
  z-index: 4;
  overflow: hidden;
}
.lm-avatar-wrap .profile-avatar-change-loader .progress {
  width: 70%;
}

/* ─────────────────────────────────────────────────────────────────
   Crop Picture / Crop Cover modal (Sngine-native, rcrop-based)
   The default Sngine markup uses `.modal-body.text-center` which
   inline-centers the <img>; rcrop wraps it in a positioned
   container, but the wrapper inherits text-align that nudges
   handles off-grid. Plus the alert + tight padding make the modal
   feel cramped. These rules give the cropper room to breathe and
   prevent the wrapper from shifting on resize. */
#modal .modal-body #cropped-profile-picture,
#modal .modal-body #cropped-profile-cover {
  /* rcrop measures width()/height() on the <img>. Make sure the
     image is fully laid out (max-width capped, height auto) before
     rcrop runs. */
  max-width: 100%;
  height: auto;
  display: inline-block;
}
#modal .rcrop-wrapper {
  display: inline-block;
  text-align: left;        /* counter the modal-body text-center */
  margin: 0 auto;
  user-select: none;
}
#modal .rcrop-wrapper img { display: block; max-width: 100%; height: auto; }
/* Crop modal: widen for the picture cropper so the image isn't tiny. */
#modal .modal-dialog:has(#cropped-profile-picture) {
  max-width: 560px;
}
#modal .modal-dialog:has(#cropped-profile-cover) {
  max-width: 960px;
}
/* Tame the info alert at the top of the cropper. */
#modal .modal-body .alert.alert-primary {
  font-size: 12.5px;
  padding: 8px 12px;
  margin-bottom: 14px;
  border-radius: 8px;
  text-align: left;
}
/* Online dot — bottom-right. Sits ON TOP of the white border ring of
   the avatar (not inside it), at the 4-o'clock position of the circle.
   Position math: avatar wrap is 132×132, the dot is 16×16 with a 3px
   white ring → its center should be at roughly (right: 8px, bottom: 8px)
   to overlap the white border. Color = LM primary (deeper green than
   the previous bright #22c55e). */
.lm-avatar-online {
  position: absolute;
  right: 8px; bottom: 8px;
  width: 16px; height: 16px;
  border-radius: 50%;
  background: var(--lm-primary, #2f8a5f);
  border: 3px solid #fff;
  cursor: help;
  z-index: 6;
  box-shadow: 0 1px 3px rgba(15,23,42,0.18);
}
.lm-avatar-online.offline { background: var(--lm-muted-2); }
/* R8 #4: tooltip on hover (data-tooltip attr) */
.lm-avatar-online::after {
  content: attr(data-tooltip);
  position: absolute;
  bottom: calc(100% + 8px);
  left: 50%;
  transform: translateX(-50%);
  background: #0F172A;
  color: #FFFFFF;
  padding: 6px 10px;
  border-radius: 6px;
  font-size: 12px;
  font-weight: 500;
  white-space: nowrap;
  opacity: 0;
  pointer-events: none;
  transition: opacity .15s ease;
  z-index: 50;
  box-shadow: 0 4px 12px rgba(15,23,42,0.18);
}
.lm-avatar-online::before {
  content: "";
  position: absolute;
  bottom: calc(100% + 2px);
  left: 50%;
  transform: translateX(-50%);
  border: 4px solid transparent;
  border-top-color: #0F172A;
  opacity: 0;
  pointer-events: none;
  transition: opacity .15s ease;
  z-index: 50;
}
.lm-avatar-online:hover::after,
.lm-avatar-online:hover::before { opacity: 1; }

/* Action bar */
.lm-hero-action-bar {
  margin-left: 148px;
  padding-top: 16px;
  min-height: 64px;
  display: flex; align-items: center; justify-content: flex-end;
  gap: 6px; flex-wrap: nowrap; overflow: visible;
}
/* Compress icon buttons inside the action bar only */
.lm-hero-action-bar .lm-icon-btn-lg {
  width: 36px; height: 36px;
}
.lm-hero-action-bar .lm-btn-primary {
  padding: 9px 13px; font-size: 13px;
}

/* More menu — R11 #3: portaled to body, position:fixed via JS, fixed width */
.lm-more-wrap { position: relative; }
.lm-menu {
  width: 220px; background: #fff;
  border: 1px solid var(--lm-border); border-radius: 10px;
  box-shadow: var(--lm-shadow-lg); padding: 4px;
  animation: lm-menu-in .12s ease;
  display: none;
}
.lm-menu-item-link, .lm-menu .lm-menu-item, .lm-menu a.lm-menu-item { width: 100%; }
@keyframes lm-menu-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
.lm-menu-item {
  display: flex; align-items: center; gap: 8px;
  width: 100%; padding: 8px 10px; font-size: 12.5px;
  color: var(--lm-text);
  background: transparent !important;
  border: none !important; outline: none !important;
  border-radius: 6px; text-align: left;
  cursor: pointer;
  font-family: var(--lm-font);
}
.lm-menu-item:hover { background: var(--lm-surface-2); }
.lm-menu-item svg { color: var(--lm-muted); }
.lm-menu-item.is-danger { color: #b91c1c; }
.lm-menu-item.is-danger svg { color: #b91c1c; }
.lm-menu-item.is-danger:hover { background: #fef2f2; }
.lm-menu-divider { height: 1px; background: var(--lm-border); margin: 4px 0; }

/* Hero info */
.lm-hero-info { padding-top: 18px; }
.lm-hero-title-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; flex-wrap: wrap; }
.lm-hero-name {
  margin: 0; font-size: 24px; font-weight: 700; letter-spacing: -0.02em;
  display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap; line-height: 1.2;
}
.lm-verified { color: var(--lm-primary); display: inline-flex; align-items: center; }

/* Tier badges */
/* R20h: taller pill — matches prototype's chunkier look */
.lm-tier {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 5px 10px;
  font-size: 11px; font-weight: 700;
  letter-spacing: 0.06em; text-transform: uppercase;
  background: var(--lm-gold); color: #fff;
  border-radius: 5px; border: 1px solid #b8923f;
  font-family: var(--lm-font-mono);
  line-height: 1;
}
.lm-tier-pro { background: #0f6f4f; border-color: #0a5439; color: #fff; }
/* R20g: VIP — gradient cream-gold pill with dark brown crown + text (user-provided spec) */
.lm-tier-vip {
  background: linear-gradient(135deg, #fef7d6, #f5deb3);
  border: 1px solid #d4a93f;
  color: #6e4a04;
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.6), 0 1px 2px rgba(180, 83, 9, 0.15);
}
.lm-tier-vip svg { color: #6e4a04 !important; fill: #6e4a04 !important; }
/* R20g: ELITE — gradient navy pill with light gold crown + text */
.lm-tier-elite {
  background: linear-gradient(135deg, #1f2937, #0f172a);
  border: 1px solid #d4a93f;
  color: #f5deb3;
}
.lm-tier-elite svg { color: #f5deb3 !important; fill: #f5deb3 !important; }
.lm-tier-verified { background: var(--lm-primary-soft); border-color: var(--lm-primary-soft-2); color: var(--lm-primary-strong); }
/* Phase H R69: business-side tiers (buyer accounts) — calm blue palette
   to read distinctly from the talent gold/cream gradient set without
   competing with the primary green CTA color. */
/* Business — brand teal (#00363f), matching the Business badge on the
   membership/upgrade plan page (lm-brand-pricing.css), NOT the old generic
   blue. Distinct from the green primary CTA + the talent gold set. */
.lm-tier-business {
  background: rgba(0, 54, 63, 0.10);
  border: 1px solid rgba(0, 54, 63, 0.30);
  color: #00363f;
}
/* Premium badge — CANONICAL look = the membership "Change plan" Premium
   badge (.lm-mb-tier--premium): near-black bg, GOLD text + GOLD diamond,
   light-gold border. The diamond is now an INLINE SVG inside the span
   (like pro/vip/elite/business) — NOT a ::before — so the glyph↔word gap
   comes from `.lm-tier` gap (consistent everywhere) and scales with size.
   Same badge appears everywhere a Premium account is surfaced. */
.lm-tier-premium {
  background: #14161C;
  color: #D4A93F;
  border-color: #EAD9A8;
}
html[data-lm-theme="dark"] .lm-tier-business { background: rgba(0, 54, 63, 0.32); color: #7fb3bd; border-color: rgba(127, 179, 189, 0.40); }
html[data-lm-theme="dark"] .lm-tier-premium { background: #0B0D12; color: #E2BB55; border-color: rgba(226, 187, 85, 0.45); }
.lm-tier:not(.lm-tier-vip):not(.lm-tier-elite) svg { color: inherit !important; }
/* R20E: NO dark-mode flip — VIP badge keeps light cream-gold look in both
   themes everywhere it appears (profile header, account popup, sidebar,
   account-switcher menu). Discover cards use .dc-card-tier.is-vip — a
   separate selector — so they remain governed by their own rules. */
/* R20h: small tier variant — slightly taller for legibility in sidebar/menu */
.lm-tier-sm {
  padding: 3px 7px;
  font-size: 9.5px;
  letter-spacing: 0.05em;
  border-radius: 4px;
  gap: 4px;
}
.lm-tier-sm svg { width: 9px; height: 9px; }

/* R20V Phase 3.4: hero @handle — Twitter/X-style line under name.
   Block-level, full reset of native button chrome, no extra spacing. */
.lm-hero-handle,
button.lm-hero-handle {
  display: block !important;
  margin: 0 !important;
  padding: 0 !important;
  background: transparent !important;
  border: 0 !important;
  outline: 0 !important;
  box-shadow: none !important;
  text-align: left !important;
  font-family: var(--lm-font-mono, ui-monospace, "SF Mono", Menlo, monospace) !important;
  font-size: 13px !important;
  font-weight: 400 !important;
  color: var(--lm-muted) !important;
  cursor: pointer;
  letter-spacing: 0.01em;
  line-height: 1.25 !important;
  transition: color .12s;
}
.lm-hero-handle:hover,
button.lm-hero-handle:hover {
  color: var(--lm-text) !important;
  background: transparent !important;
}
@media (max-width: 720px) {
  .lm-hero-handle,
  button.lm-hero-handle { font-size: 11.5px !important; }
}

.lm-hero-subtitle { margin: 5px 0 10px; font-size: 14px; color: var(--lm-muted); display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
/* Phase D.1.a — pin SVG, city/country text, and flag emoji on the SAME
   baseline. Without inline-flex + align-items:center the SVG sits ~2px low
   and the emoji glyph sits even lower (baseline rules vary per font). */
.lm-hero-location {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  line-height: 1.2;
}
.lm-hero-loc-pin {
  flex-shrink: 0;
  display: block;
}
.lm-hero-loc-flag {
  display: inline-flex;
  align-items: center;
  font-size: 16px;        /* match the city/country text optical height */
  line-height: 1;
}
.lm-hero-loc-flag .emoji {
  vertical-align: middle;
  display: inline-block;
}

/* Stats row */
.lm-hero-stats {
  display: flex; align-items: center; flex-wrap: wrap;
  gap: 10px; font-size: 13px; color: var(--lm-muted);
}
.lm-hero-stats strong { color: var(--lm-text); font-weight: 600; }
.lm-dot { width: 3px; height: 3px; border-radius: 50%; background: var(--lm-muted-2); flex-shrink: 0; }
.lm-rating { display: inline-flex; align-items: center; gap: 5px; color: #b45309; font-weight: 500; }
.lm-rating svg { color: #f59e0b; }
.lm-rating .lm-muted { color: var(--lm-muted-2); }

/* Trust signals */
.lm-trust-signals {
  display: flex; align-items: center; flex-wrap: wrap;
  gap: 10px; margin-top: 8px; font-size: 12px; color: var(--lm-muted);
}
.lm-trust-signals span { display: inline-flex; align-items: center; gap: 4px; }
.lm-trust-signals strong { color: var(--lm-text); font-weight: 600; }
.lm-trust-signals svg { color: var(--lm-primary); }
.lm-dot-soft { width: 3px; height: 3px; border-radius: 50%; background: var(--lm-border); flex-shrink: 0; }

/* Phase D.1.b — Location sits BETWEEN @handle and stats row. Margin-top
   creates visible breathing room above so the line doesn't read as a
   continuation of the @handle. Margin-bottom is small (4px) so location
   feels grouped with the stats row immediately below it.
   margin-left: -2px nudges the pin icon flush with the optical left edge
   of @handle / stats text (the icon's internal padding makes it appear
   indented otherwise). */
.lm-hero-location-stack {
  margin-top: 14px;
  margin-bottom: 4px;
  margin-left: -2px;
  font-size: 13px;
  color: var(--lm-muted);
}
.lm-hero-location-stack .lm-hero-location { font-size: 13px; }

/* Social bar */
.lm-social-bar { display: flex; flex-direction: column; gap: 8px; margin-top: 18px; }
/* R10 #7: empty-state for 0 platforms (owner only — viewers see nothing) */
.lm-social-bar-empty { margin-top: 14px; }
.lm-social-add-empty {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 7px 14px;
  background: var(--lm-primary-soft);
  color: var(--lm-primary-strong);
  border: 1px dashed var(--lm-primary-soft-2);
  border-radius: 999px;
  font-size: 12.5px; font-weight: 600;
  cursor: pointer;
  transition: background .12s, border-color .12s;
  text-decoration: none;
}
.lm-social-add-empty:hover { background: #E2F0E8; border-color: var(--lm-primary); text-decoration: none; color: var(--lm-primary-strong); }
.lm-social-bar-caption {
  display: inline-flex; align-items: center; gap: 6px;
  font-family: var(--lm-font-mono); font-size: 11px; font-weight: 500;
  color: var(--lm-muted); letter-spacing: 0.04em; text-transform: uppercase;
}
.lm-social-bar-caption svg { color: var(--lm-primary); }
.lm-social-bar-caption strong { color: var(--lm-primary-strong); font-size: 13px; font-weight: 700; text-transform: none; }
.lm-social-list { display: flex; flex-wrap: wrap; gap: 6px; }
.lm-social {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 8px 12px;
  border: 1px solid var(--lm-border); border-radius: 10px;
  font-size: 12.5px; font-weight: 500; color: var(--lm-text); background: #fff;
  transition: border-color .12s, transform .12s;
}
.lm-social:hover { border-color: var(--lm-primary-soft-2); box-shadow: var(--lm-shadow-sm); }  /* cursor-fix v3: removed translateY(-1px) — hover-shift caused Yandex hit-test flicker */
/* social-tier-gate: below-VIP talent social links render (icon + follower count = social
   proof) but the click is dead. Scoped to platform links only — Telegram/WhatsApp
   (.lm-social-bigicon) and owner add-buttons (.lm-social-add) are excluded and keep working. */
.lm-social-list.is-locked .lm-social:not(.lm-social-bigicon) { pointer-events: none; cursor: default; }
.lm-social svg { color: var(--lm-muted); }
.lm-social[data-net="ig"] svg { color: #c13584; }
/* Phase A — TikTok and X are black-on-white brands; flip to white in dark theme. */
.lm-social[data-net="tt"] svg { color: #0f172a; }
.lm-social[data-net="x"]  svg { color: #0f172a; }
html[data-lm-theme="dark"] .lm-social[data-net="tt"] svg,
html[data-lm-theme="dark"] .lm-social[data-net="x"]  svg { color: #ffffff; }
.lm-social[data-net="fb"] svg { color: #1877f2; }
.lm-social[data-net="yt"] svg { color: #ff0000; }   /* Phase A — YouTube brand red */
.lm-social[data-net="tw"] svg { color: #9146ff; }   /* Twitch */
/* Phase F.5e — Telegram + WhatsApp brand colors. Visible only when
   $profile['can_see_telegram'] / 'can_see_whatsapp' is true (gated by
   owner tier ≥ VIP + privacy level + viewer eligibility). */
.lm-social[data-net="tg"] svg { color: #229ED9; }   /* Telegram blue */
.lm-social[data-net="wa"] svg { color: #25D366; }   /* WhatsApp green */

/* Phase F.5e — TG/WA in social bar. Optical equalization:
   - Telegram glyph (paper plane) has ~25% inner padding inside viewBox
     → render at 22px so it visually matches Instagram etc.
   - WhatsApp glyph fills its viewBox → render at 18px for the same
     visual weight. */
.lm-social.lm-social-bigicon[data-net="tg"] svg { width: 22px; height: 22px; }
.lm-social.lm-social-bigicon[data-net="wa"] svg { width: 18px; height: 18px; }

/* Owner-preview state — talent has a contact saved but their tier
   doesn't allow publishing (or privacy=private). Visible only to
   owner + admin. Dashed muted border + lock icon overlay so the talent
   sees "saved but invisible to clients". */
.lm-social.is-owner-preview {
  border-style: dashed;
  border-color: var(--lm-muted-2, #cbd5e1);
  opacity: 0.78;
  position: relative;
}
.lm-social.is-owner-preview .lm-social-name {
  color: var(--lm-muted, #8a8a93);
}
.lm-social-hidden-tag {
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 1px 5px;
  margin-left: 4px;
  background: var(--lm-muted-2, #e2e8f0);
  color: var(--lm-muted, #6b7280);
  border-radius: 999px;
  vertical-align: 1px;
}
html[data-lm-theme="dark"] .lm-social.is-owner-preview {
  border-color: #404550;
}
html[data-lm-theme="dark"] .lm-social-hidden-tag {
  background: #2a2d33;
  color: #c4c4cc;
}

/* Phase F.5e — inline contact icons in the hero stats row.
   Used when the talent has NO social platforms (Instagram/TikTok/etc)
   but DOES have a visible TG/WA — saves a dedicated social-bar row.
   Sits inline with "0 events · 0 collabs · ⭐0 (0)". Brand-colored by
   default (TG blue, WA green) so they read as actionable, not muted. */
.lm-stat-contact {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  transition: background .15s, transform .08s;
  text-decoration: none;
  vertical-align: middle;
  position: relative;
}
/* Optical equalization: TG paper-plane glyph has air around it →
   render larger; WA fills its viewBox → render smaller. Both end up
   visually the same weight. */
.lm-stat-contact[href*="t.me"] svg { width: 24px; height: 24px; display: block; color: #229ED9; }
.lm-stat-contact[href*="wa.me"] svg { width: 18px; height: 18px; display: block; color: #25D366; }
.lm-stat-contact:hover { background: rgba(0,0,0,0.04); transform: scale(1.08); }
html[data-lm-theme="dark"] .lm-stat-contact:hover { background: rgba(255,255,255,0.08); }

/* Owner-preview overlay (lock icon). Tiny chip on the bottom-right
   of the contact icon. Only renders when .is-owner-preview is set. */
.lm-stat-contact.is-owner-preview { opacity: 0.7; }
.lm-stat-contact.is-owner-preview::before {
  content: '';
  position: absolute;
  inset: 0;
  border: 1.5px dashed var(--lm-muted-2, #cbd5e1);
  border-radius: 50%;
  pointer-events: none;
}
.lm-stat-contact-lock {
  position: absolute;
  right: -3px;
  bottom: -3px;
  width: 13px;
  height: 13px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--lm-muted, #6b7280);
  color: #fff;
  border: 1.5px solid var(--lm-bg, #fff);
  border-radius: 50%;
}
.lm-stat-contact-lock svg { width: 7px; height: 7px; }
html[data-lm-theme="dark"] .lm-stat-contact.is-owner-preview::before {
  border-color: #404550;
}
html[data-lm-theme="dark"] .lm-stat-contact-lock {
  background: #6b7280;
  border-color: #15171b;
}
/* Mirror brand colours on the owner-only "+ Add X" placeholder buttons. */
.lm-social-add[data-net="ig"] svg { color: #c13584; }
.lm-social-add[data-net="tt"] svg { color: #0f172a; }
.lm-social-add[data-net="x"]  svg { color: #0f172a; }
html[data-lm-theme="dark"] .lm-social-add[data-net="tt"] svg,
html[data-lm-theme="dark"] .lm-social-add[data-net="x"]  svg { color: #ffffff; }
.lm-social-add[data-net="fb"] svg { color: #1877f2; }
.lm-social-add[data-net="yt"] svg { color: #ff0000; }
.lm-social-add[data-net="tw"] svg { color: #9146ff; }
.lm-social-num { font-family: var(--lm-font-mono); font-weight: 700; font-size: 12.5px; }
/* Phase 1 tweak — the platform icon already identifies the network, so the
   text label next to the count is redundant. Show just [icon] [count] [✓]. */
.lm-social-name { display: none; }
/* Phase 0/1 (social followers) — ownership-verified ✓ + "updating" state.
   Clean check: a bare green tick, no circle/background. */
.lm-social-vrf {
  display: inline-flex; align-items: center; justify-content: center;
  margin-left: 1px; color: var(--lm-primary, #0f6f4f); flex: none;
}
.lm-social-vrf svg { width: 12px; height: 12px; }
.lm-social-updating {
  font-weight: 600; font-size: 11px;
  color: var(--lm-muted); font-style: italic;
}

/* ── Flag ────────────────────────────────────────────────── */
/* R20N: full rectangular flags everywhere — no rounding, no clipping,
   no outer ring/shadow that could crop the SVG corners. */
.lm-flag {
  display: inline-flex; align-items: center;
  border-radius: 0;
  overflow: visible;
  box-shadow: none;
  background: transparent;
  flex-shrink: 0;
  vertical-align: middle;
}
.lm-flag svg { display: block; border-radius: 0; }

/* ── Tabs (R18: no frame around tabs, only gray bottom line) ──────── */
.lm-tabs-wrap {
  /* Framed-card top — mirrors the dark theme (card border + rounded top). */
  background: var(--lm-surface, #fff);
  border: 1px solid var(--lm-border);
  border-radius: 12px 12px 0 0;
  padding: 0 6px;
}
.lm-tabs { display: flex; gap: 24px; overflow-x: auto; overflow-y: hidden; scrollbar-width: none; padding-left: 8px; }
.lm-tabs::-webkit-scrollbar { display: none; }
/* R8 #5: Tabs — green 3px underline active, 12px/8px padding, 24px gap */
.lm-profile-page .lm-tab,
.lm-tab {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 12px 12px 8px;
  font-size: 13.5px; font-weight: 500;
  color: var(--lm-muted);
  border-bottom: 3px solid transparent !important;
  margin-bottom: -1px;
  white-space: nowrap; cursor: pointer;
  background: none !important; border-top: 0; border-left: 0; border-right: 0;
}
.lm-tab:hover { color: var(--lm-text); }
.lm-profile-page .lm-tab.is-active,
.lm-tab.is-active {
  color: #0F172A !important;
  border-bottom-color: #0F6F4F !important;
  font-weight: 700 !important;
}
.lm-tab-count {
  font-size: 11px; color: var(--lm-muted-2);
  background: var(--lm-surface-2); padding: 1px 7px;
  border-radius: 999px;
  font-family: inherit;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  line-height: 1.5;
}
.lm-tab.is-active .lm-tab-count { background: var(--lm-primary-soft); color: var(--lm-primary-strong); }

/* R18: tab body is white, no frame border (tabs sit on naked frame) */
.lm-tab-body {
  /* Framed-card bottom — connects to .lm-tabs-wrap above (no top border). */
  background: var(--lm-surface, #ffffff);
  border: 1px solid var(--lm-border);
  border-top: none;
  border-radius: 0 0 12px 12px;
  padding: 18px;
  min-height: 400px;
}

/* Tab panels */
.lm-tab-panel { display: none; }
.lm-tab-panel.is-active { display: block; }

/* ── Portfolio ───────────────────────────────────────────── */
.lm-port-controls {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin-bottom: 14px;
}
.lm-port-filter { display: flex; gap: 6px; flex-wrap: wrap; }
/* R9 quick: sub-filter buttons — design-exact (white default, green-soft active) */
.lm-port-filter { display: flex; gap: 6px; flex-wrap: wrap; }
.lm-profile-page .lm-port-filter-btn,
.lm-port-filter-btn {
  display: inline-flex !important; align-items: center; gap: 5px;
  /* Phase 2.9 — compacter: was 7×12, now 4×10. Combined with the
     smaller font-size + tighter gap the pill is ~24px tall vs ~32px. */
  padding: 4px 10px !important;
  font-size: 11.5px !important; font-weight: 500 !important;
  line-height: 1.3 !important;
  color: var(--lm-muted) !important;
  background: #fff !important;
  border: 1px solid var(--lm-border) !important;
  border-radius: 999px !important;
  cursor: pointer;
  transition: background .12s, color .12s, border-color .12s;
  outline: none;
}
/* Phase 2.9 — uniform icon sizing for the category pills (was per-svg
   widths that varied). 12px sits nicely against the 11.5px text. */
.lm-port-filter-btn > svg {
  width: 12px; height: 12px;
  flex-shrink: 0;
}
/* All-caps pill labels — matches the lm-bpf-cat / lm-bpf-date overlay
   styling on the cards themselves, so the filter row reads the same
   typographic register as the grid below. Letter-spacing tightens
   uppercase so it doesn't look stretched. */
.lm-port-filter-btn {
  text-transform: uppercase;
  letter-spacing: .04em;
}
.lm-profile-page .lm-port-filter-btn:hover,
.lm-port-filter-btn:hover { color: var(--lm-text) !important; border-color: var(--lm-muted-2) !important; }
.lm-profile-page .lm-port-filter-btn.is-active,
.lm-port-filter-btn.is-active {
  color: var(--lm-primary-text) !important;
  background: var(--lm-primary-soft) !important;
  border-color: var(--lm-primary-soft-2) !important;
}
.lm-port-filter-count {
  font-family: var(--lm-font-mono);
  font-size: 10.5px;
  padding: 1px 6px;
  border-radius: 999px;
  background: var(--lm-surface);
  color: var(--lm-muted);
}
.lm-port-filter-btn.is-active .lm-port-filter-count { background: #fff; color: var(--lm-primary-text); }
.lm-port-filter-count {
  font-family: var(--lm-font-mono); font-size: 10.5px;
  padding: 1px 6px; border-radius: 999px;
  background: var(--lm-surface); color: var(--lm-muted);
}
.lm-port-filter-btn.is-active .lm-port-filter-count { background: #fff; color: var(--lm-primary-text); }

/* ──────────────────────────────────────────────────────────────────────
 * Phase 7.10 P3 — Two-group filter row, horizontally scrollable.
 *   .lm-port-filter-scroll — overflow-x wrapper, both groups + divider
 *   .lm-port-filter-media  — Posts/Photos/Videos (media-type group)
 *   .lm-port-filter-cat    — Category group (UGC, Editorial, etc.)
 * Media group uses a softer surface bg so it visually reads as a
 * different kind of filter than the categories.
 * ────────────────────────────────────────────────────────────────────── */
/* Phase 7.10 P3 — keep filters + Sort on the same row. .lm-port-controls
   defaults to flex-wrap:wrap which pushed Sort to the next line as soon
   as the filter row was wide enough; with the scroll wrapper absorbing
   overflow we want nowrap so Sort stays pinned to the right. */
.lm-port-controls {
  flex-wrap: nowrap !important;
}
.lm-portfolio-sort-wrap {
  flex-shrink: 0 !important;
  flex-grow: 0 !important;
}

.lm-port-filter-scroll {
  display: flex;
  align-items: center;
  /* No parent gap — each group controls its own spacing. The category
     group's margin-left sets the distance from the media group; the
     divider sits inside the category group's padding-left. */
  gap: 0;
  overflow-x: auto;
  overflow-y: hidden;
  flex: 1 1 auto;
  min-width: 0;
  padding: 2px;
  -webkit-overflow-scrolling: touch;
  /* Scroll works on wheel/touch/keyboard but the scrollbar itself is
     never drawn — user wanted a strip-free row. */
  scrollbar-width: none;     /* Firefox */
  -ms-overflow-style: none;  /* old Edge / IE */
}
.lm-port-filter-scroll::-webkit-scrollbar { display: none; }  /* WebKit */

/* Higher specificity (3 classes + !important) to beat the legacy rule
   `.lm-port-controls .lm-port-filter { flex: 1 }` further down in the
   file, which was making each group eat 50 % of the row and centering
   UGC visually when the category group had a single pill. */
.lm-port-controls .lm-port-filter-scroll .lm-port-filter {
  flex: 0 0 auto !important;
  flex-wrap: nowrap !important;
}
.lm-port-filter-scroll {
  /* Pack groups to the LEFT so the divider hugs the media group. */
  justify-content: flex-start;
}
.lm-port-filter-scroll .lm-port-filter-btn { flex: none; white-space: nowrap; }

/* Media-type group → rectangular (rounded-rect, not pills). User asked
   to distinguish Posts/Photos/Videos visually from the round category
   pills. Same surface bg as before. */
.lm-port-filter-scroll .lm-port-filter-media .lm-port-filter-btn {
  border-radius: 8px !important;
}

/* Icon-only variant — tighter padding so the icon+count chip stays
   compact (no leading text means the standard 12px padding looks
   over-fed). */
.lm-port-filter-scroll .lm-port-filter-btn-icon {
  padding: 7px 10px !important;
  gap: 5px;
}

/* Visual separator between media + category groups — divider sits close
   to the media group (small margin-left) with more breathing room on the
   right (padding-left). Collapses to zero width when the category group
   is :empty (no category has count > 0). */
.lm-port-filter-scroll .lm-port-filter-cat {
  position: relative;
  margin-left: 5px;    /* gap from Videos to the divider line */
  padding-left: 12px;  /* gap from divider line to the first category pill */
}
.lm-port-filter-scroll .lm-port-filter-cat:empty {
  padding-left: 0;
  margin-left: 0;
}
.lm-port-filter-scroll .lm-port-filter-cat::before {
  content: '';
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
  width: 1px;
  height: 22px;
  background: var(--lm-border, #e2e8f0);
}
/* Hide the group divider when the category group has no pills. :empty fails
   because the Smarty {foreach} leaves whitespace text nodes inside the div,
   so key off the absence of an actual filter button instead. */
.lm-port-filter-scroll .lm-port-filter-cat:not(:has(.lm-port-filter-btn))::before { display: none; }

/* Media group — softer surface so Photos/Videos read as a distinct
   filter type (not a portfolio category). */
.lm-port-filter-scroll .lm-port-filter-media .lm-port-filter-btn {
  background: var(--lm-surface-2, #f1f5f9) !important;
  border-color: transparent !important;
  color: var(--lm-text-secondary, #475569) !important;
}
.lm-port-filter-scroll .lm-port-filter-media .lm-port-filter-btn:hover {
  background: var(--lm-surface, #f8fafc) !important;
  border-color: var(--lm-border, #e2e8f0) !important;
  color: var(--lm-text, #0f172a) !important;
}
.lm-port-filter-scroll .lm-port-filter-media .lm-port-filter-btn.is-active {
  background: var(--lm-primary-soft, #d8f3e7) !important;
  border-color: var(--lm-primary-soft-2, #b6e6cf) !important;
  color: var(--lm-primary-text, #0a6b46) !important;
}

/* Dark theme parity */
html[data-lm-theme="dark"] .lm-port-filter-scroll .lm-port-filter-media .lm-port-filter-btn {
  background: rgba(255, 255, 255, .04) !important;
  color: var(--lm-text-secondary, #8b949e) !important;
}
html[data-lm-theme="dark"] .lm-port-filter-scroll .lm-port-filter-media .lm-port-filter-btn.is-active {
  background: rgba(110, 231, 168, .14) !important;
  border-color: rgba(110, 231, 168, .3) !important;
  color: #6ee7a8 !important;
}

/* R10 #4 / R11 #10: Portfolio Sort dropdown — match design typography */
.lm-port-controls { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 14px; }
.lm-port-controls .lm-port-filter { flex: 1; }
.lm-portfolio-sort-wrap { position: relative; margin-left: auto; flex-shrink: 0; }
.lm-profile-page .lm-portfolio-sort,
.lm-portfolio-sort {
  display: inline-flex !important; align-items: center; gap: 6px;
  padding: 7px 12px !important;
  background: #fff !important;
  border: 1px solid var(--lm-border) !important;
  border-radius: 999px !important;
  font-family: var(--lm-font) !important;
  font-size: 12.5px !important; font-weight: 500 !important;
  color: var(--lm-muted) !important;
  cursor: pointer;
  transition: border-color .12s, background .12s, color .12s;
  outline: none;
}
.lm-portfolio-sort:hover { border-color: var(--lm-muted-2) !important; background: var(--lm-surface) !important; color: var(--lm-text) !important; }
.lm-portfolio-sort svg { color: var(--lm-muted); flex-shrink: 0; }
.lm-portfolio-sort > span { white-space: nowrap; font-family: var(--lm-font); }
.lm-portfolio-sort > span > span { font-weight: 600; color: var(--lm-text); }
.lm-portfolio-sort-menu {
  position: absolute; top: calc(100% + 6px); right: 0;
  min-width: 180px;
  background: #fff;
  border: 1px solid var(--lm-border);
  border-radius: 10px;
  box-shadow: 0 12px 32px -8px rgba(15,23,42,0.20), 0 4px 12px -4px rgba(15,23,42,0.10);
  padding: 4px;
  z-index: 50;
  display: none;
  animation: lm-menu-pop .14s ease;
}
.lm-portfolio-sort-menu.is-open { display: block; }
.lm-portfolio-sort-item {
  display: flex; align-items: center; gap: 8px;
  width: 100%; padding: 8px 12px;
  background: transparent; border: none; border-radius: 6px;
  font-family: var(--lm-font);
  font-size: 13px; font-weight: 600;
  color: var(--lm-text);
  text-align: left; cursor: pointer;
  transition: background .12s;
}
.lm-portfolio-sort-item:hover { background: var(--lm-surface); }
.lm-portfolio-sort-item.is-active { color: var(--lm-primary-strong); font-weight: 700; }
.lm-portfolio-sort-item svg { color: var(--lm-muted); flex-shrink: 0; }
.lm-portfolio-sort-item.is-active svg { color: var(--lm-primary-strong); }

/* R10 #5: Demo masonry placeholders for empty portfolio */
.lm-masonry-demo .lm-portfolio-card-demo {
  position: relative;
  break-inside: avoid;
  margin-bottom: 12px;
  border-radius: 12px;
  overflow: hidden;
  cursor: pointer;
  transition: transform .15s, box-shadow .15s;
  display: block;
}
.lm-masonry-demo .lm-portfolio-card-demo:hover {
  transform: translateY(-2px);
  box-shadow: 0 12px 28px -8px rgba(15,23,42,0.18);
}
.lm-portfolio-thumb-1 { background: linear-gradient(135deg, #d4e9d8 0%, #a8c5b0 100%); }
.lm-portfolio-thumb-2 { background: linear-gradient(135deg, #d8d4e9 0%, #b0a8c5 100%); }
.lm-portfolio-thumb-3 { background: linear-gradient(135deg, #e9d8d4 0%, #c5b0a8 100%); }
.lm-portfolio-thumb-4 { background: linear-gradient(135deg, #d4e1e9 0%, #a8b9c5 100%); }
.lm-portfolio-thumb-5 { background: linear-gradient(135deg, #e9e4d4 0%, #c5bea8 100%); }
.lm-portfolio-thumb-6 { background: linear-gradient(135deg, #ded4e9 0%, #b6a8c5 100%); }
.lm-portfolio-thumb-7 { background: linear-gradient(135deg, #d4e9e2 0%, #a8c5bd 100%); }
.lm-portfolio-thumb-8 { background: linear-gradient(135deg, #e9d4e2 0%, #c5a8b9 100%); }
.lm-portfolio-thumb-9 { background: linear-gradient(135deg, #d4d8e9 0%, #a8b0c5 100%); }
.lm-portfolio-card-demo .lm-port-tag {
  position: absolute; top: 10px; left: 10px;
  padding: 4px 8px;
  background: rgba(15,23,42,0.65);
  color: #fff;
  font-size: 10px; font-weight: 700;
  letter-spacing: 0.04em;
  border-radius: 4px;
  backdrop-filter: blur(4px);
}
.lm-portfolio-card-demo .lm-port-pin {
  position: absolute; top: 10px; right: 10px;
  width: 24px; height: 24px;
  display: grid; place-items: center;
  background: rgba(15,23,42,0.65);
  color: #fff;
  border-radius: 6px;
  backdrop-filter: blur(4px);
}
.lm-portfolio-card-demo .lm-port-watermark {
  position: absolute; bottom: 10px; left: 10px;
  font-size: 11px;
  color: #fff;
  text-shadow: 0 1px 4px rgba(0,0,0,0.4);
  letter-spacing: 0.01em;
}
.lm-portfolio-card-demo .lm-port-watermark-brand { font-weight: 700; }

.lm-portfolio-empty-cta {
  margin-top: 20px;
  text-align: center;
  background: transparent;
  border: 0;
  padding: 0;
}
.lm-portfolio-empty-cta p { font-size: 12.5px; color: var(--lm-muted); margin: 0 0 10px; }

/* R20V Phase 3.4: row-first masonry. Cards in DOM order (pinned first,
   then by sort) are positioned absolutely by JS so reading order is
   left-to-right, top-to-bottom — but each new card lands in the column
   with the lowest current bottom edge, eliminating gaps under tall
   neighbors. CSS just sizes the cards to a column width and gives the
   container a position context; JS does the layout in
   LM.layoutPortfolioMasonry(). */
.lm-masonry {
  position: relative;
  /* Default column width; JS may recompute on resize. */
  --lm-masonry-cols: 3;
  --lm-masonry-gap: 12px;
}
@media (max-width: 720px) {
  .lm-masonry { --lm-masonry-cols: 2; }
}
.lm-masonry .lm-portfolio-card {
  position: absolute;
  width: calc((100% - (var(--lm-masonry-cols) - 1) * var(--lm-masonry-gap)) / var(--lm-masonry-cols));
  margin: 0;
  /* Pre-layout state: cards are positioned via JS-applied
     `transform: translate(x, y)`. We hide them with visibility until the
     first layout pass completes (JS adds .is-laid-out on the grid), and we
     disable transitions so the move from (0,0) → assigned slot is instant
     instead of a 150ms slide that makes everything appear to fly in. */
  visibility: hidden;
  transition: none;
}
.lm-masonry.is-laid-out .lm-portfolio-card {
  visibility: visible;
  /* After layout, only animate the hover lift (translate) and shadow.
     NOT transform — it's reserved for the layout matrix. */
  transition: translate .15s, box-shadow .15s;
}
.lm-masonry .lm-portfolio-card:hover { translate: 0 -2px; box-shadow: var(--lm-shadow-md); }
/* R20V Phase 3.4: portfolio cards have NO background — the photo IS the
   card. Removed: gradient fallbacks, nth-child color/height cycle, fixed
   min-height (forced cards taller than the photo and revealed gradient
   underneath), the ::after dark overlay. Card now sizes to its image
   natural aspect via masonry break-inside, photo fills it edge-to-edge. */
.lm-portfolio-card {
  /* Vertical spacing for CSS-column masonry (column-gap handles
     horizontal). break-inside avoid keeps a card from splitting
     across columns. */
  margin: 0 0 12px; border-radius: 12px; overflow: hidden;
  border: 1px solid var(--lm-border); position: relative;
  break-inside: avoid; display: block;
  transition: transform .15s, box-shadow .15s; cursor: pointer;
  background: transparent;
}
.lm-portfolio-card:hover { box-shadow: var(--lm-shadow-md); }
/* Outside the masonry container (legacy/demo grids) the lift uses transform
   since translate isn't tied to a parent layout system. Inside .lm-masonry
   the hover lift uses CSS `translate:` (set above) so it doesn't fight the
   JS-applied layout `transform: translate(x,y)`. */
.lm-masonry .lm-portfolio-card:hover { /* lift handled via translate */ }
:not(.lm-masonry) > .lm-portfolio-card:hover { /* cursor-fix v3: removed translateY(-2px) — hover-shift was causing cursor flicker on every clickable card */ }
.lm-portfolio-card img { display: block; width: 100%; height: auto; object-fit: cover; }
.lm-portfolio-card video {
  display: block; width: 100%; height: auto;
  object-fit: cover;
  /* Disable native picture-in-picture / overlay UI on Safari + iOS so
     the play overlay reads cleanly; the lightbox is the actual player. */
  pointer-events: none;
  background: #0f172a;
}
/* Video cards reserve a minimum height before metadata loads so the
   masonry layout has something measurable on the first pass. Once
   loadedmetadata fires, JS relays out and the card snaps to the video's
   real aspect ratio. */
.lm-portfolio-card .lm-portfolio-card-video {
  min-height: 200px;
  aspect-ratio: 16 / 9;
}
.lm-portfolio-card .lm-portfolio-card-video[poster] {
  min-height: 0;
  aspect-ratio: auto;
}
.lm-portfolio-card.has-broken img,
.lm-portfolio-card img[data-broken="1"] { display: none; }
/* R11 #11: hidden state for cards beyond 12 (revealed by Show More button) */
.lm-portfolio-card-hidden { display: none !important; }
.lm-portfolio-loadmore { display: flex; justify-content: center; margin-top: 16px; }
.lm-profile-page .lm-portfolio-loadmore .lm-btn { gap: 6px; }
/* Owner-only "Add more" button at the bottom of a populated portfolio.
   Uses the primary green so it reads as the next action; sits below the
   View More button (when present) with a tighter gap. */
.lm-portfolio-addmore { display: flex; justify-content: center; margin-top: 18px; }
.lm-portfolio-addmore .lm-btn { gap: 6px; }
.lm-portfolio-loadmore + .lm-portfolio-addmore { margin-top: 10px; }
/* Hide Add more / View More until masonry layout is settled. Without
   this they're rendered immediately after the .lm-masonry block but
   the masonry's height keeps changing as images / video metadata
   load — the button visibly jumps up and down during page load. */
.lm-masonry:not(.is-laid-out) ~ .lm-portfolio-loadmore,
.lm-masonry:not(.is-laid-out) ~ .lm-portfolio-addmore {
  visibility: hidden;
}
.lm-portfolio-card .lm-port-watermark,
.lm-portfolio-card .lm-port-tag,
.lm-portfolio-card .lm-port-pin,
.lm-portfolio-card .lm-port-overlay { z-index: 2; }
.lm-portfolio-card-placeholder {
  width: 100%; background: linear-gradient(135deg, #e2e8f0 0%, #f1f5f9 100%);
  display: flex; align-items: center; justify-content: center;
  color: var(--lm-muted-2);
}
.lm-port-tag {
  position: absolute; top: 10px; left: 10px;
  font-family: var(--lm-font-mono); font-size: 10px; font-weight: 600;
  padding: 3px 7px; background: rgba(255,255,255,0.92);
  color: #0f172a; border-radius: 4px; letter-spacing: 0.04em;
  pointer-events: none;
}
.lm-port-pin {
  position: absolute; top: 10px; right: 10px;
  width: 22px; height: 22px; display: grid; place-items: center;
  background: var(--lm-primary); color: #fff;
  border-radius: 50%; box-shadow: 0 2px 6px rgba(15,111,79,0.3);
  pointer-events: none;
}
/* Centered play badge for video portfolio cards. Translucent dark disc
   with a white triangle — reads as "video" at a glance. */
.lm-port-play {
  position: absolute; top: 50%; left: 50%;
  width: 52px; height: 52px;
  transform: translate(-50%, -50%);
  display: grid; place-items: center;
  background: rgba(0,0,0,0.5);
  color: #fff;
  border-radius: 50%;
  box-shadow: 0 2px 10px rgba(0,0,0,0.25);
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
  pointer-events: none;
  z-index: 2;
  /* Slightly inset SVG so the triangle visually centers (it has more
     mass on the left edge). */
  padding-left: 3px;
}
.lm-port-play svg { display: block; }
.lm-port-overlay {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, transparent 40%, rgba(15,23,42,0.65) 100%);
  display: flex; align-items: flex-end; justify-content: space-between;
  padding: 10px; opacity: 0; transition: opacity .15s; pointer-events: none;
}
.lm-portfolio-card:hover .lm-port-overlay { opacity: 1; }
.lm-port-stats-left, .lm-port-stats-right { display: flex; gap: 8px; }
.lm-port-stat {
  display: inline-flex; align-items: center; gap: 3px;
  font-family: var(--lm-font-mono); font-size: 11px; font-weight: 600;
  color: #fff;
}
.lm-port-watermark {
  position: absolute; bottom: 12px; left: 12px;
  font-size: 11px; color: #fff;
  display: flex; align-items: center; gap: 4px; pointer-events: none;
  text-shadow: 0 1px 4px rgba(0,0,0,0.45);
  letter-spacing: 0.01em;
}
.lm-port-watermark-brand { font-weight: 700; }
.lm-port-watermark-dot { opacity: 0.7; }

/* Empty state */
.lm-empty {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  padding: 60px 20px; gap: 10px; color: var(--lm-muted);
  text-align: center;
}
.lm-empty-icon { color: var(--lm-muted-2); margin-bottom: 4px; }
.lm-empty-title { font-size: 14px; font-weight: 600; color: var(--lm-text); }
.lm-empty-desc { font-size: 12.5px; }

/* ── Services ────────────────────────────────────────────── */
.lm-services { display: flex; flex-direction: column; gap: 10px; }
.lm-service {
  display: flex; align-items: center; gap: 24px;
  padding: 18px 20px; background: #fff;
  border: 1px solid var(--lm-border); border-radius: 12px;
  transition: border-color .12s, box-shadow .12s, transform .12s;
}
.lm-service:hover { border-color: var(--lm-primary-soft-2); box-shadow: var(--lm-shadow-md); }  /* cursor-fix v3: removed translateY(-1px) */
.lm-service-main { flex: 1; min-width: 0; }
.lm-service-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.lm-service-title { margin: 0; font-size: 15px; font-weight: 600; letter-spacing: -0.005em; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* Phase B1.b — status badge + reject reason on talent's own profile.
   Pending/rejected service rows are filtered out of public view server-side
   (profile.php), so these styles only ever surface for the row's owner. */
.lm-service-status-badge {
  display: inline-flex; align-items: center;
  padding: 2px 8px;
  font-family: var(--lm-font-mono, ui-monospace, monospace);
  font-size: 9.5px; font-weight: 700;
  letter-spacing: 0.05em; text-transform: uppercase;
  border-radius: 4px;
  border: 1px solid transparent;
  white-space: nowrap;
}
.lm-service-status-badge.is-pending {
  background: rgba(245,158,11,.15);
  color: #92400e;
  border-color: rgba(245,158,11,.40);
}
.lm-service-status-badge.is-rejected {
  background: rgba(192,57,43,.15);
  color: #b91c1c;
  border-color: rgba(192,57,43,.40);
}
html[data-lm-theme="dark"] .lm-service-status-badge.is-pending {
  color: #fbbf24;
}
html[data-lm-theme="dark"] .lm-service-status-badge.is-rejected {
  color: #ff7b6f;
}

/* Phase B1.c5 — Featured (pinned) service indicator on public profile.
   Small gold pill that sits inline next to the category tag (Event/Digital/Other).
   Same vertical baseline as .lm-service-kind so the two pills align. */
/* Phase B1.c5 — wrapper for kind + featured pill; both live on the same row. */
.lm-service-tags {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  margin-top: 4px;
}
.lm-service-pin {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 7px;
  background: rgba(212, 169, 63, 0.14);
  color: #6e4a04;
  border: 1px solid rgba(212, 169, 63, 0.45);
  border-radius: 4px;
  font-family: var(--lm-font-mono, ui-monospace, monospace);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  white-space: nowrap;
}
/* When kind sits inside .lm-service-tags wrapper its own margin-top is
   redundant (the wrapper already provides it). */
.lm-service-tags .lm-service-kind {
  margin-top: 0;
}
.lm-service-pin svg { flex-shrink: 0; }
.lm-service.is-pinned {
  border-color: rgba(212, 169, 63, 0.45);
  box-shadow: 0 0 0 1px rgba(212, 169, 63, 0.12) inset;
}
html[data-lm-theme="dark"] .lm-service-pin {
  background: rgba(212, 169, 63, 0.16);
  color: #f5deb3;
  border-color: rgba(212, 169, 63, 0.50);
}
html[data-lm-theme="dark"] .lm-service.is-pinned {
  border-color: rgba(212, 169, 63, 0.45);
  box-shadow: 0 0 0 1px rgba(212, 169, 63, 0.18) inset;
}
.lm-service.is-unreviewed {
  opacity: 0.78;
  background: var(--lm-surface, #fafafa);
}
html[data-lm-theme="dark"] .lm-service.is-unreviewed {
  background: var(--lm-surface, #151b23);
}
.lm-service-reject-reason {
  margin: 8px 0 0;
  padding: 8px 12px;
  background: rgba(192,57,43,.06);
  border-left: 3px solid #c0392b;
  border-radius: 0 6px 6px 0;
  font-size: 13px;
  color: var(--lm-text, #0f172a);
}
html[data-lm-theme="dark"] .lm-service-reject-reason {
  background: rgba(192,57,43,.12);
  color: var(--lm-text, #e6edf3);
}
.lm-service-reject-reason strong { color: #c0392b; margin-right: 4px; }
html[data-lm-theme="dark"] .lm-service-reject-reason strong { color: #ff7b6f; }
.lm-service-desc { margin: 4px 0 10px; font-size: 13px; color: var(--lm-muted); }
.lm-service-meta { display: flex; flex-wrap: wrap; gap: 14px; font-size: 12px; color: var(--lm-muted); }
.lm-service-meta span { display: inline-flex; align-items: center; gap: 5px; }
.lm-service-meta svg { color: var(--lm-primary); }
.lm-service-side { display: flex; flex-direction: column; align-items: flex-end; gap: 10px; flex-shrink: 0; min-width: 150px; }
.lm-service-price { display: flex; align-items: baseline; gap: 4px; }
.lm-service-amount { font-size: 18px; font-weight: 700; letter-spacing: -0.01em; }
.lm-service-unit { font-size: 12px; color: var(--lm-muted); }

.lm-chip {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 3px 8px; font-size: 11.5px; font-weight: 500;
  background: var(--lm-surface); border: 1px solid var(--lm-border);
  border-radius: 999px; color: var(--lm-text);
}
.lm-chip-accent { background: var(--lm-primary-soft); border-color: var(--lm-primary-soft-2); color: var(--lm-primary-strong); }

.lm-service-kind {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 2px 7px;
  font-family: var(--lm-font-mono); font-size: 10.5px; font-weight: 600;
  letter-spacing: 0.04em; text-transform: uppercase;
  border-radius: 4px; border: 1px solid var(--lm-border);
  color: var(--lm-muted); background: var(--lm-bg, #fff);
  /* Phase A — tag now sits BELOW the title as its own block, so margin-top
     gives it air. align-self keeps it left-aligned inside the flex column. */
  align-self: flex-start;
  margin-top: 4px;
}
.lm-service-kind.is-event   { border-color: var(--lm-primary-soft-2); color: var(--lm-primary-text); background: var(--lm-primary-soft); }
.lm-service-kind.is-content { border-color: #fde9c4; color: #92400e; background: #fff8eb; }
.lm-service-kind.is-other   { border-color: var(--lm-border, #e2e8f0); color: var(--lm-text, #0f172a); background: var(--lm-surface-2, #f1f5f9); }
html[data-lm-theme="dark"] .lm-service-kind.is-other {
  background: var(--lm-surface-2, #1c232c);
  color: var(--lm-text, #e6edf3);
  border-color: var(--lm-border, #2a3038);
}
/* Phase A — Services tab empty state. */
.lm-services-empty {
  padding: 40px 24px;
  font-size: 14px;
  color: var(--lm-muted, #6b7280);
  font-style: italic;
  text-align: center;
  border: 1px dashed var(--lm-border, #e2e8f0);
  border-radius: 12px;
  background: var(--lm-surface, #fafafa);
}
html[data-lm-theme="dark"] .lm-services-empty {
  border-color: var(--lm-border, #2a3038);
  background: var(--lm-surface, #151b23);
  color: var(--lm-muted, #8b949e);
}

/* ── Activity feed ───────────────────────────────────────── */
.lm-activity-section h3 {
  font-size: 13px; font-weight: 600; color: var(--lm-muted);
  text-transform: uppercase; letter-spacing: 0.05em;
  margin: 0 0 16px; font-family: var(--lm-font-mono);
}
.lm-feed { display: flex; flex-direction: column; gap: 0; position: relative; }
.lm-feed::before {
  content: ""; position: absolute; left: 19px; top: 18px; bottom: 18px;
  width: 2px;
  background: linear-gradient(180deg, var(--lm-border) 0%, var(--lm-border) 70%, transparent 100%);
}
.lm-feed-item { display: grid; grid-template-columns: 40px 1fr; gap: 14px; padding: 14px 0; position: relative; }
.lm-feed-icon {
  width: 40px; height: 40px; border-radius: 50%; background: #fff;
  border: 1px solid var(--lm-border); display: grid; place-items: center;
  color: var(--lm-primary-text); position: relative; z-index: 1;
}
.lm-feed-icon.is-event { background: var(--lm-primary-soft); border-color: var(--lm-primary-soft-2); }
.lm-feed-icon.is-content { background: #fff8eb; border-color: #fde9c4; color: #92400e; }
.lm-feed-body {
  background: #fff; border: 1px solid var(--lm-border); border-radius: 12px; padding: 14px 16px;
}
.lm-feed-head { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; margin-bottom: 4px; }
.lm-feed-title { margin: 0; font-size: 14px; font-weight: 600; }
.lm-feed-date { font-family: var(--lm-font-mono); font-size: 11px; color: var(--lm-muted); white-space: nowrap; }
.lm-feed-text { margin: 0 0 10px; font-size: 13px; color: var(--lm-muted); line-height: 1.55; }
.lm-feed-meta { display: flex; flex-wrap: wrap; gap: 6px; }
.lm-feed-thumbs { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; margin-top: 10px; border-radius: 8px; overflow: hidden; }
.lm-feed-thumb { border-radius: 6px; overflow: hidden; }
.lm-feed-thumb img { width: 100%; height: 80px; object-fit: cover; display: block; }

/* Sngine posts in Activity tab */
.lm-activity-posts { margin-top: 24px; }
.lm-activity-posts-label {
  font-family: var(--lm-font-mono); font-size: 10.5px; font-weight: 600;
  color: var(--lm-muted); text-transform: uppercase; letter-spacing: 0.05em;
  margin-bottom: 12px; padding-bottom: 10px; border-bottom: 1px solid var(--lm-border-2);
}

/* ── Reviews ─────────────────────────────────────────────── */
.lm-reviews { display: flex; flex-direction: column; gap: 12px; }
.lm-reviews-summary-v2 {
  display: grid; grid-template-columns: 220px 1fr; gap: 28px;
  padding: 22px 24px;
  background: linear-gradient(135deg, #fafdfb 0%, var(--lm-primary-soft) 100%);
  border-radius: 14px; border: 1px solid var(--lm-primary-soft-2);
}
@media (max-width: 600px) { .lm-reviews-summary-v2 { grid-template-columns: 1fr; } }
.lm-reviews-overall {
  display: flex; flex-direction: column; align-items: flex-start; gap: 4px;
  padding-right: 28px; border-right: 1px solid var(--lm-primary-soft-2);
}
@media (max-width: 600px) { .lm-reviews-overall { padding-right: 0; border-right: 0; border-bottom: 1px solid var(--lm-primary-soft-2); padding-bottom: 16px; } }
.lm-reviews-num { font-size: 44px; font-weight: 700; letter-spacing: -0.025em; line-height: 1; color: var(--lm-text); }
.lm-reviews-stars { color: #f59e0b; display: flex; gap: 2px; margin-top: 6px; }
.lm-reviews-count { font-size: 11.5px; color: var(--lm-muted); margin-top: 4px; font-family: var(--lm-font-mono); }
.lm-rebook-pill {
  margin-top: 14px; display: inline-flex; align-items: center; gap: 5px;
  font-size: 11.5px; color: var(--lm-primary-strong);
  background: rgba(15,111,79,0.08); padding: 5px 9px; border-radius: 6px; flex-wrap: wrap;
}
.lm-rebook-pill svg { color: var(--lm-primary-strong); flex-shrink: 0; }
.lm-rebook-pill .lm-muted { font-family: var(--lm-font-mono); font-size: 10.5px; }
.lm-reviews-criteria { display: flex; flex-direction: column; gap: 4px; justify-content: center; }
.lm-criterion-row { display: grid; grid-template-columns: 130px 1fr 38px; gap: 12px; align-items: center; padding: 1px 0; }
.lm-criterion-label { font-size: 12.5px; font-weight: 500; color: var(--lm-text); line-height: 1.2; }
.lm-criterion-bar { height: 5px; background: rgba(15,23,42,0.06); border-radius: 999px; overflow: hidden; }
.lm-criterion-bar-fill {
  height: 100%; background: linear-gradient(90deg, var(--lm-primary) 0%, var(--lm-primary-strong) 100%);
  border-radius: 999px; transition: width .4s cubic-bezier(.2,.8,.2,1);
}
.lm-criterion-score { font-family: var(--lm-font-mono); font-size: 12px; font-weight: 600; color: var(--lm-primary-strong); text-align: right; }

.lm-review { padding: 18px 20px; background: #fff; border: 1px solid var(--lm-border); border-radius: 12px; }
.lm-review-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; margin-bottom: 10px; }
.lm-review-brand { display: flex; gap: 12px; align-items: center; min-width: 0; }
.lm-review-id { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.lm-review-brandname { font-weight: 600; font-size: 13.5px; display: inline-flex; align-items: center; gap: 5px; line-height: 1.25; flex-wrap: wrap; }
.lm-review-brandname svg { color: var(--lm-primary); }
.lm-review-role { font-size: 12px; color: var(--lm-muted); margin-top: 1px; line-height: 1.2; }
/* Phase H R68: reviewer avatar — sized to match the 2-row name+date stack
   so the row reads as a tight identity card. Square (rounded) for brand
   Pages, round for individual users. Clickable wrapper opens reviewer
   profile/Page in the same tab. */
.lm-review-avatar {
  width: 38px; height: 38px;
  flex-shrink: 0;
  background: var(--lm-surface-2, #f1f5f9);
  overflow: hidden;
  display: block;
  text-decoration: none;
}
.lm-review-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; border-radius: inherit; }
.lm-review-avatar--user { border-radius: 50%; }
.lm-review-avatar--page { border-radius: 7px; }
.lm-review-namelink { color: inherit; text-decoration: none; }
.lm-review-namelink:hover { color: var(--lm-primary); }
.lm-review-roletag {
  display: inline-flex; align-items: center;
  padding: 1px 7px;
  font-size: 10.5px; font-weight: 600; letter-spacing: .02em;
  color: var(--lm-primary-strong, #0f6f4f);
  background: rgba(15, 111, 79, 0.10);
  border-radius: 999px;
  text-transform: uppercase;
}
html[data-lm-theme="dark"] .lm-review-roletag { color: #6ee7b7; background: rgba(110, 231, 183, 0.12); }
.lm-review-stars { color: #f59e0b; display: inline-flex; gap: 2px; align-items: center; line-height: 1; }
.lm-review-stars svg { display: block; height: 13px; width: 13px; }
.lm-review-rating {
  margin-left: 6px; font-family: var(--lm-font-mono); font-size: 12.5px; font-weight: 700;
  color: var(--lm-text); letter-spacing: -0.01em;
}
.lm-review-text-wrap { margin: 0 0 10px; line-height: 1.5; }
.lm-review-text { margin: 0; font-size: 13.5px; color: var(--lm-text); white-space: pre-wrap; }
.lm-review-text-more {
  display: inline;
  background: none; border: 0; padding: 0;
  color: var(--lm-primary, #0a8a4f) !important;
  font-size: inherit; font-weight: 600;
  font-family: inherit;
  line-height: inherit;
  cursor: pointer;
  margin: 0;
  vertical-align: baseline;
}
.lm-review-text-more:hover { text-decoration: underline; color: var(--lm-primary, #0a8a4f) !important; }
.lm-review-foot {
  display: flex; align-items: center; justify-content: space-between;
  gap: 10px; padding-top: 10px; border-top: 1px solid var(--lm-border-2); flex-wrap: wrap;
  /* Phase H R68: whole row is clickable to toggle criteria scores. */
  cursor: pointer;
}
.lm-review-foot:hover .lm-review-toggle { color: var(--lm-primary-strong); }
.lm-review-toggle,
.lm-review-toggle:hover,
.lm-review-toggle:focus,
.lm-review-toggle:focus-visible,
.lm-review-toggle:active {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 11.5px !important; color: var(--lm-muted); font-weight: 500; padding: 4px 0;
  cursor: pointer; background: none !important; border: none !important;
  outline: none !important; box-shadow: none !important;
  -webkit-tap-highlight-color: transparent;
}
.lm-review-toggle:hover { color: var(--lm-primary-strong); }
.lm-review-toggle svg { color: currentColor; flex-shrink: 0; }
.lm-review-rebook {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 11.5px; font-weight: 600; color: var(--lm-primary-strong);
  background: rgba(15,111,79,0.08); padding: 4px 8px; border-radius: 6px;
}
.lm-review-criteria {
  display: none; flex-direction: column; gap: 7px;
  margin-top: 12px; padding: 14px;
  background: var(--lm-surface); border-radius: 8px;
}
.lm-review-criteria.is-open { display: flex; }
.lm-review-criterion { display: grid; grid-template-columns: 110px 1fr 30px; gap: 10px 10px; align-items: center; }
.lm-review-criterion-label { font-size: 12px; color: var(--lm-text); }
.lm-review-criterion-stars { display: flex; gap: 1px; color: #f59e0b; }
.lm-review-criterion-score { font-family: var(--lm-font-mono); font-size: 11px; font-weight: 600; color: var(--lm-primary-strong); text-align: right; }
/* Phase H R68: per-criterion note appears on a second row spanning all 3 cols.
   Muted/italic so it reads as supporting context, not as the primary rating. */
.lm-review-criterion-note {
  grid-column: 1 / -1;
  margin-top: -2px;
  font-size: 11.5px; line-height: 1.35;
  color: var(--lm-muted, #64748b);
  font-style: italic;
}
.lm-ph-square { width: 36px; height: 36px; border-radius: 8px; flex-shrink: 0; }

/* ── Right rail cards ────────────────────────────────────── */
.lm-card {
  background: #fff; border: 1px solid var(--lm-border);
  border-radius: 12px; padding: 16px 18px;
  box-shadow: var(--lm-shadow-sm); min-width: 0;
}
.lm-card-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; gap: 8px; }
.lm-card-title { margin: 0; font-size: 13.5px; font-weight: 600; letter-spacing: -0.005em; }
.lm-card-link { font-size: 12px; color: var(--lm-muted); }
.lm-card-link:hover { color: var(--lm-primary-strong); }
.lm-card-pct { font-family: var(--lm-font-mono); font-size: 12px; font-weight: 600; color: var(--lm-primary-strong); }

.lm-progress { height: 6px; background: var(--lm-surface-2); border-radius: 999px; overflow: hidden; margin-bottom: 12px; }
.lm-progress-fill { height: 100%; background: linear-gradient(90deg, var(--lm-primary), var(--lm-primary-strong)); border-radius: 999px; }
.lm-completion { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.lm-completion li { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--lm-text); padding: 4px 0; }
.lm-completion li.is-done { color: var(--lm-muted); text-decoration: line-through; }
.lm-completion-dot {
  width: 18px; height: 18px; border-radius: 50%; display: grid; place-items: center;
  background: var(--lm-surface); color: var(--lm-muted);
  border: 1px solid var(--lm-border); flex-shrink: 0;
}
.lm-completion li.is-done .lm-completion-dot { background: var(--lm-primary-soft); color: var(--lm-primary-strong); border-color: var(--lm-primary-soft-2); }

.lm-kyc {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 11px; font-weight: 600; padding: 3px 7px;
  background: var(--lm-primary-soft); color: var(--lm-primary-strong);
  border-radius: 999px; font-family: var(--lm-font-mono);
}

.lm-bio { font-size: 14px; color: var(--lm-text); margin: 0; line-height: 1.55; }

/* v2.2m — collapsible bio (About / right rail). Up to 5 lines visible
   when collapsed; "Show more" button expands inline with a smooth
   transition. .is-collapsible wrapper carries state; .is-expanded
   flips clamp + rotates the chevron. Short bios skip this wrapper. */
.lm-bio-wrap { margin: 0 0 10px; }
.lm-bio-wrap.is-collapsible .lm-bio {
  display: -webkit-box;
  -webkit-line-clamp: 5;
  -webkit-box-orient: vertical;
  overflow: hidden;
  transition: -webkit-line-clamp 240ms ease;
}
.lm-bio-wrap.is-collapsible.is-expanded .lm-bio {
  -webkit-line-clamp: unset;
  display: block;
  overflow: visible;
}
.lm-bio-toggle {
  margin-top: 4px;
  display: inline-flex;
  align-items: center;
  gap: 3px;
  padding: 2px 0;
  background: transparent;
  border: none;
  color: var(--lm-primary-text, #0a5439);
  /* v2.2m — explicit font properties (no `font: inherit` shorthand which
     pulled in the parent's font-size). !important + small size to keep
     the toggle visibly LESS prominent than the bio text it belongs to. */
  font-family: inherit;
  font-size: 12px !important;
  font-weight: 600;
  line-height: 1.2;
  cursor: pointer;
  transition: color 120ms;
}
.lm-bio-toggle:hover { color: var(--lm-primary, #0f6f4f); }
.lm-bio-toggle svg { width: 10px; height: 10px; transition: transform 200ms ease; }
.lm-bio-wrap.is-expanded .lm-bio-toggle svg { transform: rotate(180deg); }
.lm-bio-meta { display: flex; flex-direction: column; gap: 9px; padding-top: 12px; border-top: 1px solid var(--lm-border-2); }
.lm-bio-meta-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 9px 16px; padding-top: 0; border-top: 0; }
.lm-bio-row { display: flex; justify-content: space-between; gap: 8px; font-size: 12px; min-width: 0; }
/* R8 #2: labels muted regular, values bold dark (override browser default dt:bold) */
.lm-profile-page .lm-bio-row dt,
.lm-bio-row dt {
  color: #64748B !important;
  font-weight: 400 !important;
  flex-shrink: 0;
}
.lm-profile-page .lm-bio-row dd,
.lm-bio-row dd {
  margin: 0;
  color: #0F172A !important;
  font-weight: 500 !important;
  min-width: 0; text-align: right;
}
.lm-mono { font-family: var(--lm-font-mono); font-size: 11.5px; }

/* ════════════════════════════════════════════════════════════════════
   Phase H R14 — LM tier badge (PRO/VIP/ELITE) inline pill.
   Mirrors .dc-card-tier from lm-discover.css so the badge renders the
   same way OUTSIDE the people page (messages, search, profile…).
   ════════════════════════════════════════════════════════════════════ */
.dc-card-tier {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 3px 7px;
  background: rgba(255,255,255,0.95);
  border: 1px solid var(--lm-border);
  color: var(--lm-text);
  border-radius: 6px;
  font-size: 10px; font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  font-family: var(--lm-font-mono);
  line-height: 1;
  vertical-align: middle;
}
.dc-card-tier.is-pro {
  background: var(--lm-primary-soft);
  border-color: var(--lm-primary-soft-2);
  color: var(--lm-primary-text);
}
.dc-card-tier.is-vip {
  background: linear-gradient(135deg, var(--lm-gold-soft, #fef3c7), var(--lm-gold-soft-2, #fde68a));
  border-color: #d4a93f;
  color: #6e4a04;
}
.dc-card-tier.is-elite {
  background: linear-gradient(135deg, #1f2937, var(--lm-elite-bg, #0f172a));
  border-color: #d4a93f;
  color: #f5deb3;
}
.dc-card-tier.is-elite svg { color: #f5deb3; }
.dc-card-tier.is-vip svg { color: #6e4a04; }
.dc-card-tier svg { color: currentColor; }

/* ════════════════════════════════════════════════════════════════════
   Phase H R14 — /messages page polish.
   1. Conversation row name + LM-style verified ✓ + tier badge inline
      with consistent spacing (gap, vertical alignment).
   2. Active conversation column: ensure chat-form (input + send button)
      stays pinned at the bottom — never scrolled below the fold. The
      legacy data-slimScroll-height="420px" was removed in the template;
      this CSS forces the messages area to flex-fill so the form floats
      correctly above it.
   ════════════════════════════════════════════════════════════════════ */
.lm-msg-name-row {
  display: flex;
  align-items: center;
  gap: 6px;
  min-width: 0;
}
.lm-msg-name-text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
}
.lm-msg-name-row .lm-verified,
.lm-msg-name-row .pro-badge,
.lm-msg-name-row .dc-card-tier {
  flex: 0 0 auto;
}

/* Phase H R15: tighten the column-3 header gap. Bootstrap's `gap-3`
   = 1rem = 16px which pushed verified ✓ and tier badge way too far
   from the name. Override to 6px to match the column-2 row spacing. */
html.lm-messages-active .x_msg_user_name {
  gap: 6px !important;
}
html.lm-messages-active .x_msg_user_name .lm-verified,
html.lm-messages-active .x_msg_user_name .dc-card-tier {
  display: inline-flex;
  align-items: center;
  vertical-align: middle;
  flex: 0 0 auto;
}
/* Drop the giant 32px back-arrow's left margin so the name sits up
   close to the row start, not pushed by an invisible svg. */
html.lm-messages-active .x_msg_user_name .x_menu_sidebar_back {
  margin-right: -8px;
}

/* Phase H R15: column header padding — push "Messenger" + name+trash
   down a bit from the top edge so they don't kiss the topbar. */
html.lm-messages-active .x_menu_sidebar.msg > .d-flex.align-items-center,
html.lm-messages-active .x_menu_sidebar_content.msg .panel-messages > .d-flex.align-items-center {
  padding-top: 12px !important;
  padding-bottom: 12px !important;
  border-bottom: 1px solid var(--lm-border-2);
}

/* Phase H R15: selected conversation row stays highlighted (gray bg)
   even when the cursor is no longer over it. Same shade as :hover. */
.feeds-item.side_item_hover.is-active {
  background: rgb(0 0 0 / 4%);
  position: relative;
}
.feeds-item.side_item_hover.is-active::before {
  /* Left accent stripe to make the selection state pop visually. */
  content: "";
  position: absolute;
  left: 0; top: 6px; bottom: 6px;
  width: 3px;
  background: var(--lm-primary);
  border-radius: 0 2px 2px 0;
}
html.lm-dark .feeds-item.side_item_hover.is-active,
html[data-lm-theme="dark"] .feeds-item.side_item_hover.is-active {
  /* Stronger contrast in dark — 3% white was barely visible. */
  background: rgb(255 255 255 / 12%);
}

/* Phase H R15: dark theme — name text color in BOTH columns.
   Sngine's body-color + js_user-popover anchor inherit from body which
   is dark in night mode, making names invisible against the dark
   sidebar surface.

   Phase H R16: scoped narrowly — only the name TEXT (`.lm-msg-name-text`
   in col 2, the popover anchor in col 3) gets recolored. The previous
   `.x_user_info.body-color *` wildcard caught the badges too, breaking
   the "VIP/✓ never flip in dark" rule. Badges have their own palette
   set by `.lm-tier-*` and `.lm-verified` — leave them alone. */
html.lm-dark .lm-msg-name-text,
html[data-lm-theme="dark"] .lm-msg-name-text {
  color: var(--lm-text) !important;
}
/* Column 3 active conversation header — name link only (NOT badges,
   which are siblings of the popover, not descendants). */
html.lm-dark .x_msg_user_name .js_user-popover,
html.lm-dark .x_msg_user_name .js_user-popover a,
html[data-lm-theme="dark"] .x_msg_user_name .js_user-popover,
html[data-lm-theme="dark"] .x_msg_user_name .js_user-popover a {
  color: var(--lm-text) !important;
}
/* Defensive: badge palette MUST NOT inherit from any name override.

   Phase H R22 — match the deeper-gold gradient used by the booking CTA
   in dark mode. The light gradient (135deg, #fef7d6, #f5deb3) reads as
   "all light" against the dark page; the LEFT cream → RIGHT rich-gold
   gradient (135deg, #fef7d6, #d4a93f) restores the same light/rich
   contrast you see in light mode. Box-shadow is also nuked so the inset
   highlight from the base rule doesn't add a brighter glow on top. */
html.lm-dark .lm-tier-vip,
html[data-lm-theme="dark"] .lm-tier-vip {
  background: linear-gradient(135deg, #fef7d6, #e6c468) !important;
  color: #6e4a04 !important;
  border-color: #d4a93f !important;
  box-shadow: none !important;
}
html.lm-dark .lm-tier-vip svg,
html[data-lm-theme="dark"] .lm-tier-vip svg {
  color: #6e4a04 !important;
  fill: #6e4a04 !important;
}
html.lm-dark .lm-tier-elite,
html[data-lm-theme="dark"] .lm-tier-elite {
  background: linear-gradient(135deg, #1f2937, #0f172a) !important;
  color: #f5deb3 !important;
  border-color: #d4a93f !important;
}
html.lm-dark .lm-tier-elite svg,
html[data-lm-theme="dark"] .lm-tier-elite svg {
  color: #f5deb3 !important;
  fill: #f5deb3 !important;
}
html.lm-dark .lm-tier-pro,
html[data-lm-theme="dark"] .lm-tier-pro {
  background: #0f6f4f !important;
  color: #fff !important;
  border-color: #0a5439 !important;
}
/* Verified ✓ — always brand green, never flips. */
html.lm-dark .lm-verified,
html[data-lm-theme="dark"] .lm-verified {
  color: var(--lm-primary) !important;
}

/* Always-visible chat input + footer on /messages (column 3).
   Strategy: pin the chat shell to viewport rather than fight the
   complex Bootstrap container/row chain that wraps it.

   On html.lm-messages-active (/messages page only):

   1. The chat row wrapper (`.w-100.overflow-hidden.d-flex.bg-white`
      direct child of the right column) gets a fixed height equal to
      the viewport minus the LM topbar. No more spillover below the
      fold; the page no longer scrolls vertically (chat is the whole
      experience on this page).

   2. The inner messages scroller (.chat-conversations) gets an inline
      `height: 280px` (or 420px) from Sngine's slimScroll init in
      user.js. !important here overrides the inline style so the
      element flex-fills the remaining space inside its panel column
      (parent is `card-body flex-1 d-flex flex-column`).

   3. The page-footer scripts/modals from Sngine's _footer.tpl render
      below the row but they're in the body's normal flow under the
      pinned chat — not visible on this page (acceptable: chat IS the
      view here). */
/* Sngine's base CSS sets BOTH `min-height: 100dvh` AND `height: 100dvh`
   on these elements — `min-height` wins over our smaller `height`. We
   explicitly nuke min-height so our calculated height takes effect.

   Phase H R15: subtract the page footer height too (~50px) so the
   .lm-page-footer is visible underneath the chat panel without
   scrolling. Total chrome to subtract: 64 (topbar) + 50 (footer) = 114. */
html.lm-messages-active .x_menu_sidebar.msg,
html.lm-messages-active .x_menu_sidebar_content.msg {
  height: calc(100dvh - 114px) !important;
  max-height: calc(100dvh - 114px) !important;
  min-height: 0 !important;
  /* Sticky keeps the columns visible if the outer page scrolls. */
  position: sticky;
  top: 64px;
}
/* The page-wrapper that holds both chat columns must also drop the
   100dvh constraint — it's `display: flex` with `overflow: hidden`,
   so without an explicit height of its own, it grows to encompass
   any taller child. Pin it to the same calc() and the children
   become bound by it. */
html.lm-messages-active .x_menu_sidebar.msg,
html.lm-messages-active .x_menu_sidebar_content.msg,
html.lm-messages-active body > .main-wrapper .container > .row .x-content-width {
  /* extend the constraint to the right column wrapper if needed */
}
html.lm-messages-active .main-wrapper { min-height: 0 !important; }
/* On mobile / collapsed topbar (<520px), Sngine reduces topbar to 49px.
   Footer also collapses padding on mobile; reserve 40px for it. */
@media (max-width: 520px) {
  html.lm-messages-active .x_menu_sidebar.msg,
  html.lm-messages-active .x_menu_sidebar_content.msg {
    height: calc(100dvh - 89px) !important;
    max-height: calc(100dvh - 89px) !important;
    min-height: 0 !important;
    top: 49px;
  }
}
/* Inner scroller: kill slimScroll's inline height and let it flex-fill. */
.panel-messages .panel-messages-no-slim {
  height: auto !important;
  max-height: none !important;
  flex: 1 1 auto !important;
  min-height: 0 !important;
  overflow-y: auto !important;
}
/* Defensive — the outer panel itself must let inner flex children take
   over height. h-100 on .panel-messages relies on parent height being
   set, which we just ensured above. */
html.lm-messages-active .panel-messages {
  height: 100% !important;
  min-height: 0 !important;
}

/* Phase H R13: language pills inside the profile bio rows.
   Mirrors .dc-lang-pill / .lm-lang-pill-row from lm-discover.css so the
   profile page (loaded WITHOUT lm-discover.css) renders pills with the
   same look as Quick Profile + Discover cards. Without this rule the
   pills slammed together with no spacing on /administrator etc. */
.lm-bio-row dd .lm-lang-pill-row {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 4px;
  justify-content: flex-end;
}
.lm-bio-row dd .dc-lang-pill {
  display: inline-block;
  padding: 2px 7px;
  font-family: var(--lm-font-mono);
  font-size: 10.5px; font-weight: 600;
  letter-spacing: 0.04em;
  background: var(--lm-surface);
  border: 1px solid var(--lm-border);
  border-radius: 4px;
  color: var(--lm-muted);
}
html[data-lm-theme="dark"] .lm-bio-row dd .dc-lang-pill {
  background: var(--lm-surface-2);
  border-color: var(--lm-border);
  color: var(--lm-text);
}

.lm-about-extra { max-height: 0; overflow: hidden; opacity: 0; transition: max-height .35s ease, opacity .25s ease; }
.lm-about-extra.is-open { max-height: 1200px; opacity: 1; padding-top: 12px; }
.lm-about-section-label {
  font-family: var(--lm-font-mono); font-size: 10.5px; font-weight: 600;
  color: var(--lm-muted); text-transform: uppercase; letter-spacing: 0.05em;
  margin: 14px 0 6px; padding-top: 12px; border-top: 1px solid var(--lm-border-2);
}
.lm-about-extra > .lm-about-section-label:first-child { margin-top: 4px; padding-top: 0; border-top: 0; }
/* Design-exact values: bg #F3F8F5, color #0A5439, border #DCEBE2 1px, padding 8px, radius 8px, 12px/600 */
.lm-profile-page .lm-about-toggle,
.lm-about-toggle {
  margin-top: 12px; width: 100%;
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  padding: 8px;
  font-size: 12px; font-weight: 600;
  color: #0A5439 !important;
  background: #F3F8F5 !important;
  border: 1px solid #DCEBE2 !important;
  border-radius: 8px;
  transition: background .12s; cursor: pointer;
}
.lm-profile-page .lm-about-toggle:hover,
.lm-about-toggle:hover { background: #DCEBE2 !important; }

.lm-travel-chips { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 14px; }
.lm-travel-chip {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 4px 8px; font-size: 11.5px; font-weight: 500;
  background: var(--lm-surface); border: 1px solid var(--lm-border);
  border-radius: 999px; color: var(--lm-text);
}
.lm-travel-chip.is-confirmed { background: var(--lm-primary-soft); border-color: var(--lm-primary-soft-2); color: var(--lm-primary-text); }
.lm-travel-zones { display: flex; flex-direction: column; gap: 6px; margin-bottom: 8px; }
.lm-travel-zones-label {
  font-family: var(--lm-font-mono); font-size: 10.5px; font-weight: 600;
  color: var(--lm-muted); letter-spacing: 0.05em; text-transform: uppercase;
}
.lm-travel-zones-list { display: flex; flex-wrap: wrap; gap: 6px; }
.lm-travel-zone {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 9px 5px 6px; font-size: 12px; font-weight: 500;
  background: var(--lm-surface); border: 1px solid var(--lm-border-2);
  border-radius: 6px; color: var(--lm-text);
}

.lm-recent { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.lm-recent li { display: flex; gap: 10px; align-items: flex-start; }
.lm-recent-icon {
  width: 28px; height: 28px; border-radius: 8px;
  display: grid; place-items: center;
  background: var(--lm-primary-soft); color: var(--lm-primary-strong); flex-shrink: 0;
}
.lm-recent-brand { font-weight: 600; font-size: 12.5px; display: inline-flex; align-items: center; gap: 4px; }
.lm-recent-brand svg { color: var(--lm-primary); }
.lm-recent-event { font-size: 11.5px; color: var(--lm-muted); margin-top: 1px; }

.lm-clients-list { display: flex; flex-direction: column; gap: 6px; }
.lm-client-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 12.5px; padding: 6px 0; border-bottom: 1px solid var(--lm-border-2); }
.lm-client-row:last-child { border-bottom: 0; }
.lm-client-name { font-weight: 500; }
.lm-client-count { font-family: var(--lm-font-mono); font-size: 11px; color: var(--lm-muted); }

.lm-agency-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.lm-agency-item { display: flex; gap: 10px; align-items: flex-start; }
.lm-agency-mark { width: 32px; height: 32px; border-radius: 6px; overflow: hidden; flex-shrink: 0; background: var(--lm-surface); border: 1px solid var(--lm-border); }
.lm-agency-mark img { width: 100%; height: 100%; object-fit: cover; }
.lm-agency-name { font-weight: 600; font-size: 12.5px; display: inline-flex; align-items: center; gap: 4px; }
.lm-agency-name svg { color: var(--lm-primary); }
.lm-agency-meta { font-size: 11.5px; color: var(--lm-muted); margin-top: 1px; }

.lm-similar-row { display: flex; flex-direction: column; gap: 8px; padding: 4px 0; }
.lm-similar-card-item {
  display: grid; grid-template-columns: 56px 1fr auto;
  gap: 12px; align-items: center;
  padding: 8px 10px 8px 8px;
  border: 1px solid var(--lm-border-2); border-radius: 10px;
  background: #fff; transition: border-color .12s, background .12s;
}
.lm-similar-card-item:hover { border-color: var(--lm-primary-soft-2); background: var(--lm-surface); }
.lm-similar-thumb { width: 56px; height: 56px; border-radius: 8px; overflow: hidden; border: 1px solid var(--lm-border); flex-shrink: 0; background: var(--lm-surface); }
.lm-similar-thumb img { width: 100%; height: 100%; object-fit: cover; }
.lm-similar-info { min-width: 0; }
.lm-similar-name { font-size: 13px; font-weight: 600; display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
.lm-similar-name svg { color: var(--lm-primary); flex-shrink: 0; }
.lm-similar-role { font-size: 11.5px; color: var(--lm-muted); margin: 1px 0 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.lm-similar-rate { font-family: var(--lm-font-mono); font-size: 11.5px; font-weight: 700; color: var(--lm-primary-strong); }

/* ── Sticky CTA — R11 #7: center within main column (not viewport) ──── */
.lm-sticky-cta {
  position: fixed; bottom: 24px;
  /* Frame: 1440 wide centered. Sidebar 240 + 24 padding + main col half (780/2=390). Center of main col = sidebar_offset + 24 + 390 = +654 from frame-left. */
  left: calc(max(240px, (100vw - 1440px) / 2 + 240px) + 414px);
  transform: translateX(-50%) translateY(20px);
  z-index: 50; display: flex; align-items: center; gap: 12px;
  padding: 10px 14px 10px 12px;
  background: #fff; border: 1px solid var(--lm-border);
  border-radius: 14px; box-shadow: var(--lm-shadow-lg);
  opacity: 0; pointer-events: none;
  transition: opacity .25s, transform .25s;
}
.lm-sticky-cta.is-visible { opacity: 1; transform: translateX(-50%); pointer-events: auto; }
@media (max-width: 1100px) {
  .lm-sticky-cta { left: 50%; }
}
.lm-sticky-cta-info { display: flex; align-items: center; gap: 10px; }
.lm-sticky-cta-avatar { width: 36px; height: 36px; border-radius: 50%; overflow: hidden; border: 2px solid var(--lm-primary-soft-2); flex-shrink: 0; }
.lm-sticky-cta-avatar img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; }
.lm-sticky-cta-name { font-size: 12.5px; font-weight: 600; display: inline-flex; align-items: center; gap: 4px; }
.lm-sticky-cta-name svg { color: var(--lm-primary); }
.lm-sticky-cta-meta { font-size: 11px; color: var(--lm-muted); margin-top: 1px; }
.lm-sticky-cta-actions { display: flex; gap: 6px; }

/* ── Modals ──────────────────────────────────────────────── */
.lm-modal-scrim {
  position: fixed;
  /* Phase H R23 fix: explicit top/left/width/height instead of `inset: 0`.
     `inset: 0` resolves against the containing block, which on the profile
     page is `.lm-profile-page` (it has body padding-left:240px+ for the
     fixed sidebar). That made the scrim think its width was viewport-240
     and `place-items: center` then centered the modal inside that
     reduced area — making it look ~300px wide on a 14" screen. Using
     viewport units (100vw / 100dvh) bypasses any ancestor's geometry. */
  top: 0; left: 0; width: 100vw; height: 100dvh;
  background: rgba(15,23,42,0.42);
  backdrop-filter: blur(4px); display: grid; place-items: center;
  z-index: 500; padding: 24px; animation: lm-fade .15s ease;
}
@keyframes lm-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes lm-pop { from { opacity: 0; transform: translateY(8px) scale(0.985); } to { opacity: 1; transform: none; } }
.lm-modal {
  /* Phase H R23: bumped default max-width 560 → 720 because the smaller
     modals (Switch Accounts, Email this profile, etc.) felt cramped on
     14"+ MacBooks. The previous 720 "lg" variant is now the default;
     `.lm-modal-lg` is kept for backwards compat (no width difference). */
  background: #fff; border-radius: 16px; width: 100%; max-width: 720px;
  max-height: calc(100vh - 48px); overflow: auto;
  box-shadow: 0 24px 60px rgba(15,23,42,0.25); animation: lm-pop .18s ease;
}
.lm-modal-lg { max-width: 720px; }
/* Phase H R24: brute-force lock width on the 4 LM modals that were
   reported "too narrow" — Switch Accounts, Email this profile, Report,
   Block. Targets via id selectors so specificity beats every other
   .lm-modal rule sitewide (incl. 3rd-party stylesheets).
   On wide screens cap at 600px; on narrow screens (<900px) use almost
   full viewport width (12px gutter each side). */
#lm-email-scrim .lm-modal,
#lm-report-scrim .lm-modal,
#lm-block-scrim .lm-modal,
#lm-share-scrim .lm-modal {
  width: min(600px, calc(100vw - 24px)) !important;
  max-width: min(600px, calc(100vw - 24px)) !important;
}
/* Narrow viewports (tablet / small laptop / mobile portrait) — drop the
   600px cap so the modal goes nearly edge-to-edge. */
@media (max-width: 900px) {
  #lm-email-scrim .lm-modal,
  #lm-report-scrim .lm-modal,
  #lm-block-scrim .lm-modal,
  #lm-share-scrim .lm-modal {
    width: calc(100vw - 24px) !important;
    max-width: calc(100vw - 24px) !important;
  }
}
/* Reduce the scrim's outer padding on small screens so the modal can
   actually reach the edge. The base 24px padding eats the gutter. */
@media (max-width: 900px) {
  .lm-modal-scrim { padding: 12px !important; }
}
@media (max-width: 767px) {
  .lm-modal-scrim { padding: 0 !important; }
}

/* Compact form fields inside Email/Report/Block modals — base .lm-input
   is 13.5px which is fine, but the placeholder text wraps on narrow
   widths; tighten padding and lock font down. */
#lm-email-scrim .lm-input,
#lm-email-scrim .lm-textarea,
#lm-report-scrim .lm-input,
#lm-report-scrim .lm-textarea,
#lm-block-scrim .lm-input,
#lm-block-scrim .lm-textarea {
  font-size: 13.5px !important;
  padding: 8px 10px !important;
}
#lm-email-scrim .lm-field-label,
#lm-report-scrim .lm-field-label,
#lm-block-scrim .lm-field-label {
  font-size: 12px !important;
}
#lm-email-scrim .lm-help,
#lm-report-scrim .lm-help,
#lm-block-scrim .lm-help {
  font-size: 11px !important;
}
/* Phase H R69: switch-accounts list is narrower content (avatar + name) —
   trim it down so the modal doesn't feel oversized for a short menu. */
#lm-switch-scrim .lm-modal {
  width: min(480px, calc(100vw - 48px)) !important;
  max-width: min(480px, calc(100vw - 48px)) !important;
}

/* ════════════════════════════════════════════════════════════════════
   Phase H R25/R41 — Connect Accounts modal (Sngine #account-connector)
   restyled in LM design language. Sngine mounts EVERY ad-hoc modal
   into a single shared `#modal` element via core.js renderModal();
   the previous selector `#account-modal` never matched anything, so
   the modal stayed at Bootstrap's default ~720px width. Detect by the
   presence of `.lm-cnct-form` inside .modal-content so the size
   override applies only to OUR Connect Accounts modal — not to other
   Sngine-managed modals (Email Activation, Password Reset, etc.).
   ════════════════════════════════════════════════════════════════════ */
#modal .modal-dialog:has(.lm-cnct-form) {
  max-width: min(440px, calc(100vw - 48px)) !important;
}
#modal .modal-content:has(.lm-cnct-form) {
  border: none !important;
  border-radius: 16px !important;
  box-shadow: 0 24px 60px rgba(15,23,42,0.25) !important;
  overflow: hidden;
  background: #fff;
}

.lm-cnct-head {
  display: flex !important;
  align-items: flex-start !important;
  justify-content: space-between !important;
  gap: 12px;
  padding: 22px 24px 6px !important;
  border-bottom: none !important;
}
.lm-cnct-head-text { min-width: 0; }
.lm-cnct-title {
  margin: 0;
  font-size: 18px;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--lm-text);
}
.lm-cnct-sub {
  margin-top: 4px;
  font-size: 13px;
  color: var(--lm-muted);
}
.lm-cnct-close {
  width: 32px; height: 32px;
  display: grid; place-items: center;
  border: 0; padding: 0;
  background: transparent;
  border-radius: 8px;
  color: var(--lm-muted);
  cursor: pointer;
  flex-shrink: 0;
  transition: background .12s, color .12s;
}
.lm-cnct-close:hover { background: var(--lm-surface-2); color: var(--lm-text); }

.lm-cnct-body { padding: 14px 24px 22px !important; }
.lm-cnct-form { display: flex; flex-direction: column; gap: 14px; }
.lm-cnct-field { display: flex; flex-direction: column; gap: 6px; }
.lm-cnct-label {
  font-size: 12.5px; font-weight: 600;
  color: var(--lm-text);
  letter-spacing: 0.01em;
}
.lm-cnct-input-wrap {
  position: relative;
  display: flex; align-items: center;
  background: #fff;
  border: 1px solid var(--lm-border);
  border-radius: 10px;
  transition: border-color .12s, box-shadow .12s;
}
.lm-cnct-input-wrap:focus-within {
  border-color: var(--lm-primary);
  box-shadow: 0 0 0 3px var(--lm-primary-soft);
}
.lm-cnct-input-icon {
  display: grid; place-items: center;
  width: 38px; height: 40px;
  color: var(--lm-muted);
  flex-shrink: 0;
}
.lm-cnct-input {
  flex: 1; min-width: 0;
  height: 40px;
  padding: 0 12px 0 0;
  background: transparent;
  border: 0; outline: 0;
  font-size: 14px;
  color: var(--lm-text);
  font-family: var(--lm-font);
}
.lm-cnct-input::placeholder { color: var(--lm-muted); }

.lm-cnct-submit {
  margin-top: 4px;
  width: 100%;
  display: inline-flex; align-items: center; justify-content: center;
  gap: 8px;
  padding: 11px 16px;
  background: var(--lm-primary);
  color: #fff;
  font-size: 14px; font-weight: 600;
  border: 0;
  border-radius: 10px;
  cursor: pointer;
  transition: background .12s, transform .06s;
}
.lm-cnct-submit:hover { background: var(--lm-primary-strong); }
.lm-cnct-submit:active { transform: translateY(1px); }

.lm-cnct-error {
  margin: 0;
  padding: 10px 12px;
  font-size: 13px;
  background: rgba(239, 68, 68, 0.08);
  color: #b91c1c;
  border: 1px solid rgba(239, 68, 68, 0.25);
  border-radius: 8px;
}

/* Dark theme parity. */
html[data-lm-theme="dark"] #modal .modal-content:has(.lm-cnct-form) {
  background: var(--lm-surface) !important;
  border: 1px solid var(--lm-border) !important;
}
html[data-lm-theme="dark"] .lm-cnct-title,
html[data-lm-theme="dark"] .lm-cnct-label,
html[data-lm-theme="dark"] .lm-cnct-input { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-cnct-sub,
html[data-lm-theme="dark"] .lm-cnct-input-icon,
html[data-lm-theme="dark"] .lm-cnct-close { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-cnct-input-wrap {
  background: var(--lm-surface-2);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .lm-cnct-close:hover { background: var(--lm-surface-2); color: var(--lm-text); }
/* Chrome autofill repaints the field with a light background, which made the
   "Email or Username" input render white inside the dark modal. Force the
   autofill fill + text colour to the dark surface. */
html[data-lm-theme="dark"] .lm-cnct-input:-webkit-autofill,
html[data-lm-theme="dark"] .lm-cnct-input:-webkit-autofill:hover,
html[data-lm-theme="dark"] .lm-cnct-input:-webkit-autofill:focus,
html[data-lm-theme="dark"] .lm-cnct-input:-webkit-autofill:active {
  -webkit-text-fill-color: var(--lm-text);
  -webkit-box-shadow: 0 0 0 1000px var(--lm-surface-2) inset;
  box-shadow: 0 0 0 1000px var(--lm-surface-2) inset;
  caret-color: var(--lm-text);
}
.lm-modal-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 18px 22px; border-bottom: 1px solid var(--lm-border);
}
.lm-modal-title-wrap { display: flex; align-items: center; gap: 12px; }
/* Icon (28x28 rounded square) aligned to the visual baseline of the title text.
   With a single-line h3 the icon previously sat ~2px above baseline; nudge down. */
.lm-modal-title-wrap > .lm-recent-icon {
  width: 32px;
  height: 32px;
  align-self: center;
}
.lm-modal-title { margin: 0 !important; font-size: 16px; font-weight: 600; letter-spacing: -0.01em; }
.lm-modal-sub { font-size: 12px; color: var(--lm-muted); margin-top: 2px; }
.lm-modal-close {
  width: 32px; height: 32px; display: grid; place-items: center;
  border-radius: 8px; color: var(--lm-muted); cursor: pointer;
  background: none; border: 0; padding: 0;
}
.lm-modal-close:hover { background: var(--lm-surface-2); color: var(--lm-text); }

/* R20w: Switch Accounts modal renders globally (incl. non-profile pages where
   .lm-profile-page button reset doesn't apply). Style its action buttons
   directly so they don't get the default browser button border. */
.lm-modal-scrim .lm-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  padding: 10px 16px;
  border-radius: var(--lm-r-btn, 10px);
  font-weight: 600; font-size: 13.5px;
  border: 1px solid transparent;
  cursor: pointer; white-space: nowrap;
  font-family: inherit;
}
.lm-modal-scrim .lm-btn-ghost {
  background: var(--lm-surface, #f7f7f8);
  color: var(--lm-text);
  border: 1px solid var(--lm-border);
}
.lm-modal-scrim .lm-btn-ghost:hover {
  background: var(--lm-surface-2, #eef0f3);
  border-color: var(--lm-border);
  color: var(--lm-text);
}
.lm-modal-scrim .lm-btn-sm { padding: 9px 12px; font-size: 13px; border-radius: 8px; }
.lm-modal-body { padding: 20px 22px; }
.lm-modal-foot {
  display: flex; justify-content: space-between; align-items: center;
  gap: 12px; padding: 16px 22px; border-top: 1px solid var(--lm-border);
  background: var(--lm-surface); border-radius: 0 0 16px 16px;
}
.lm-modal-foot-info { font-size: 12px; color: var(--lm-muted); }
.lm-modal-foot .lm-btn-row { display: flex; gap: 8px; }

/* ── Responsive adjustments ──────────────────────────────── */
@media (max-width: 768px) {
  .lm-hero-action-bar { margin-left: 0; padding-top: 8px; justify-content: flex-start; }
  .lm-hero-name { font-size: 20px; }
  .lm-reviews-summary-v2 { grid-template-columns: 1fr; }
  .lm-service { flex-direction: column; align-items: flex-start; }
  .lm-service-side { align-items: flex-start; width: 100%; }

  /* Mobile only: center the profile name + handle + subtitle (role/location).
     Action bar stays left-aligned (set above). Tier badge / verified inline with name. */
  .lm-hero-info { text-align: center; }
  .lm-hero-title-row { justify-content: center; }
  /* Switch name from inline-flex to flex with center alignment so badges wrap centered */
  .lm-hero-name { display: flex; justify-content: center; flex-wrap: wrap; }
  /* Handle is display:block !important — override to inline-block centered via auto margins */
  .lm-hero-handle,
  button.lm-hero-handle {
    display: inline-block !important;
    text-align: center !important;
    margin-left: auto !important;
    margin-right: auto !important;
  }
  .lm-hero-subtitle { justify-content: center; }
}

/* ── Portfolio lightbox ──────────────────────────────────── */
.lm-lightbox-scrim {
  position: fixed; inset: 0; background: rgba(0,0,0,0.88);
  z-index: 200; display: grid; place-items: center; padding: 24px;
  animation: lm-fade .15s ease;
}
.lm-lightbox {
  background: #fff; border-radius: 16px;
  width: 100%; max-width: 1000px; max-height: calc(100vh - 48px);
  overflow: hidden; display: grid; grid-template-columns: 1fr 380px;
  box-shadow: 0 24px 60px rgba(0,0,0,0.5);
  animation: lm-pop .18s ease;
}
.lm-lightbox-media {
  background: #0a0a0a; display: flex; align-items: center; justify-content: center;
  position: relative; min-height: 400px;
}
.lm-lightbox-media img { max-width: 100%; max-height: 80vh; object-fit: contain; display: block; }
.lm-lightbox-close {
  position: absolute; top: 12px; right: 12px;
  width: 36px; height: 36px; border-radius: 50%;
  background: rgba(255,255,255,0.15); color: #fff; border: 0;
  display: grid; place-items: center; cursor: pointer;
  backdrop-filter: blur(4px);
}
.lm-lightbox-close:hover { background: rgba(255,255,255,0.25); }
.lm-lightbox-nav {
  position: absolute; top: 50%; transform: translateY(-50%);
  width: 36px; height: 36px; border-radius: 50%;
  background: rgba(255,255,255,0.15); color: #fff; border: 0;
  display: grid; place-items: center; cursor: pointer;
}
.lm-lightbox-nav:hover { background: rgba(255,255,255,0.3); }
.lm-lightbox-prev { left: 12px; }
.lm-lightbox-next { right: 12px; }
.lm-lightbox-side {
  overflow-y: auto; display: flex; flex-direction: column;
  border-left: 1px solid #e2e8f0;
}
.lm-lightbox-side-head { padding: 16px; border-bottom: 1px solid #e2e8f0; display: flex; align-items: center; gap: 10px; }
.lm-lightbox-side-body { padding: 16px; flex: 1; overflow-y: auto; }
.lm-lightbox-action-bar {
  padding: 12px 16px; border-top: 1px solid #e2e8f0;
  display: flex; align-items: center; gap: 14px;
}
.lm-lightbox-action { display: inline-flex; align-items: center; gap: 5px; font-size: 12.5px; color: var(--lm-muted); cursor: pointer; background: none; border: none; }
.lm-lightbox-action:hover { color: var(--lm-text); }
.lm-lightbox-action.is-liked { color: #e11d48; }
.lm-lightbox-action.is-liked svg { fill: #e11d48; }

/* ── Utility ─────────────────────────────────────────────── */
.lm-divider { height: 1px; background: var(--lm-border); margin: 16px 0; }
.lm-muted { color: var(--lm-muted); }
.lm-muted-2 { color: var(--lm-muted-2); }
.lm-sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); border: 0; }

/* availability pill */
.lm-availability {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 8px; border-radius: 999px;
  font-size: 11.5px; font-weight: 600; font-family: var(--lm-font-mono);
}
.lm-availability::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; flex-shrink: 0; }
.lm-availability.is-available { color: #166534; background: #dcfce7; }
.lm-availability.is-booked { color: #991b1b; background: #fee2e2; }
.lm-availability.is-away { color: #92400e; background: #fef3c7; }

/* ── Trust signals empty state ────────────────────────────── */
.lm-trust-placeholder { color: var(--lm-muted-2); font-style: italic; font-size: 11.5px; }

/* ── Social bar empty state ──────────────────────────────── */
.lm-social-add {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 8px 12px;
  border: 1px dashed var(--lm-border); border-radius: 10px;
  font-size: 12px; font-weight: 500; color: var(--lm-muted);
  transition: border-color .12s, color .12s; background: transparent;
  cursor: pointer;
}
.lm-social-add:hover { border-color: var(--lm-primary); color: var(--lm-primary); text-decoration: none; }

/* Social reach total badge */
.lm-social-reach {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 8px 12px;
  background: var(--lm-primary-soft); border: 1px solid var(--lm-primary-soft-2);
  border-radius: 10px;
  font-size: 12.5px;
}
.lm-social-reach strong { font-weight: 700; color: var(--lm-primary-strong); font-family: var(--lm-font-mono); font-size: 13px; }
.lm-social-reach em { color: var(--lm-muted); font-style: normal; font-size: 11.5px; }

/* ── About card — structured fields ──────────────────────── */
.lm-about-field-empty { color: var(--lm-muted-2); font-style: italic; }
.lm-kyc-badge {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 10.5px; font-weight: 700; padding: 2px 8px;
  background: var(--lm-primary-soft); color: var(--lm-primary-strong);
  border-radius: 999px; font-family: var(--lm-font-mono);
  text-transform: uppercase; letter-spacing: 0.05em;
  border: 1px solid var(--lm-primary-soft-2);
}

/* ── Rail footer — pinned to viewport bottom under the rail column.
   .lm-profile-page is centered inside the 1440px frame:
     padding-right = (100vw - 1440)/2  (clamped to 0)
   .lm-content inside the page is max-width 1197px, centered, with padding-right 24px.
   So right edge of the rail column = page_padding_right + content_padding_right
   = (100vw - 1440)/2 + 24px.
   Rail width = 360px. ── */
/* Rail footer — pinned to the bottom-right of the viewport (position:fixed),
   ALWAYS visible at the bottom of the screen. Its left + width are set by the
   small aligner in _lm_rail_footer.tpl to match whatever the third column is
   on the current page (castings 340px, profile, the fluid brands 1fr column),
   so it lines up under that column without a hardcoded width. The right/width
   below are no-JS fallbacks. Background matches the content frame (var(--lm-bg)
   in both themes) — no border line. */
.lm-rail-footer {
  position: fixed;
  bottom: 0;
  right: max(24px, calc((100vw - 1440px) / 2 + 24px));
  width: 340px;
  padding: 8px 12px 10px;
  background: var(--lm-bg);
  border-top: 0;
  font-size: 11px;
  color: var(--lm-muted);
  z-index: 10;
}
/* Reserve space so the last rail card isn't covered by the fixed footer. */
.lm-rail { padding-bottom: 80px; }
.lm-rail-footer-links { display: flex; flex-wrap: wrap; gap: 6px 18px; margin-top: 8px; font-size: 11.5px; }
.lm-rail-footer-links a { color: var(--lm-muted); font-size: 11.5px; }
.lm-rail-footer-links a:hover { color: var(--lm-primary); }
.lm-rail-footer-bottom { display: flex; align-items: center; justify-content: space-between; margin-top: 4px; gap: 8px; flex-wrap: wrap; }
.lm-lang-select {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 11px; color: var(--lm-muted); cursor: pointer; background: none; border: none; padding: 0;
}
.lm-lang-select:hover { color: var(--lm-text); }
.lm-theme-toggle {
  width: 28px; height: 28px; display: grid; place-items: center;
  border-radius: 6px; color: var(--lm-muted); cursor: pointer; background: none; border: none;
}
.lm-theme-toggle:hover { background: var(--lm-surface-2); color: var(--lm-text); }

/* ── Profile completion (right rail) ─────────────────────── */
.lm-completion-item { display: flex; align-items: center; gap: 8px; font-size: 12.5px; padding: 5px 0; }
.lm-completion-item + .lm-completion-item { border-top: 1px solid var(--lm-border-2); }
.lm-completion-item.done { color: var(--lm-muted); text-decoration: line-through; }
.lm-completion-item.todo { color: var(--lm-text); }
.lm-completion-icon {
  width: 20px; height: 20px; border-radius: 50%; display: grid; place-items: center;
  flex-shrink: 0;
}
.lm-completion-item.done .lm-completion-icon { background: var(--lm-primary-soft); color: var(--lm-primary-strong); border: 1px solid var(--lm-primary-soft-2); }
.lm-completion-item.todo .lm-completion-icon { background: var(--lm-surface); color: var(--lm-muted); border: 1px solid var(--lm-border); }

/* ── Recent bookings ─────────────────────────────────────── */
.lm-bookings-list { display: flex; flex-direction: column; gap: 10px; }
.lm-booking-item { display: flex; gap: 10px; align-items: flex-start; }
.lm-booking-icon {
  width: 30px; height: 30px; border-radius: 8px; display: grid; place-items: center;
  background: var(--lm-primary-soft); color: var(--lm-primary-strong); flex-shrink: 0;
  border: 1px solid var(--lm-primary-soft-2);
}
.lm-booking-brand { font-weight: 600; font-size: 12.5px; display: flex; align-items: center; gap: 5px; }
.lm-booking-brand svg { color: var(--lm-primary); }
.lm-booking-event { font-size: 11.5px; color: var(--lm-muted); margin-top: 2px; }
.lm-empty-bookings { display: flex; align-items: flex-start; gap: 10px; padding: 4px 0; }
.lm-empty-bookings-icon {
  width: 30px; height: 30px; border-radius: 8px; display: grid; place-items: center;
  background: var(--lm-surface); color: var(--lm-muted-2); flex-shrink: 0;
  border: 1px solid var(--lm-border);
}
.lm-empty-bookings-title { font-size: 12.5px; font-weight: 500; color: var(--lm-muted); }
.lm-empty-bookings-desc { font-size: 11.5px; color: var(--lm-muted-2); margin-top: 2px; }

/* ── Hero cover height ─────────────────────────────────────
   Keep this in sync with the rcrop minSize aspect in user.js
   (init_picture_position) — currently 765:222. Width follows the
   parent card, so the banner aspect on a 765px-wide card is exactly
   765:222. */
.lm-hero-cover { height: 222px; }

/* ── "Not measured" trust signals placeholder ─────────────── */
.lm-trust-na { color: var(--lm-muted-2); font-style: italic; }

/* ── TikTok platform color ───────────────────────────────── */
.lm-social[data-net="tt"] svg { color: #0f172a; }

/* ══════════════════════════════════════════════════════════════
   ROUND 4 — Pixel-perfect design match additions
   ══════════════════════════════════════════════════════════════ */

/* Upgrade Premium button — exact design gradient */
.lm-upgrade-pill {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 8px 14px; border-radius: 8px;
  white-space: nowrap;
  background: linear-gradient(135deg, #d8b56a, #b8860b);
  color: #fff; font-weight: 600; font-size: 12.5px;
  letter-spacing: -0.005em;
  box-shadow: 0 2px 8px rgba(184,134,11,0.25);
  transition: transform .12s, box-shadow .12s;
  border: none; cursor: pointer;
  text-decoration: none;
}
.lm-upgrade-pill:hover { box-shadow: 0 4px 12px rgba(184,134,11,0.35); color: #fff; text-decoration: none; }  /* cursor-fix v3: removed translateY(-1px) */
.lm-upgrade-pill svg { color: #fff; }

/* Notification / inbox dots */
.lm-topbar-action { position: relative; }
.lm-icon-dot {
  position: absolute; top: 7px; right: 8px;
  width: 8px; height: 8px; border-radius: 50%;
  background: #ef4444; border: 2px solid #fff;
  pointer-events: none;
}
.lm-icon-dot-blue { background: #2563eb !important; }

/* Tooltip wrapper */
.lm-tt-wrap { position: relative; display: inline-flex; }
.lm-tt {
  position: absolute; top: 100%; right: 0;
  margin-top: 6px; padding: 6px 10px;
  background: #0f172a; color: #fff;
  font-size: 11.5px; font-weight: 500;
  border-radius: 6px; white-space: nowrap;
  opacity: 0; pointer-events: none;
  transform: translateY(-3px);
  transition: opacity .14s, transform .14s; z-index: 60;
}
.lm-tt-wrap:hover .lm-tt { opacity: 1; transform: translateY(0); }

/* Topbar icon size match design: 38×38 */
.lm-topbar .lm-icon-btn-lg { width: 38px; height: 38px; border-radius: 8px; }

/* v2.2m — flex rules moved to the canonical .lm-topbar-search block
   above (line ~257). This stub kept as a marker so future cascade edits
   know where the search-bar definition lives. */

/* Social reach badge — exact design: column, margin-left:auto */
.lm-social-reach {
  display: inline-flex; flex-direction: column; align-items: center;
  padding: 4px 12px; border-radius: 8px;
  background: var(--lm-primary-soft); color: var(--lm-primary-strong);
  border: 1px solid var(--lm-primary-soft-2);
  margin-left: auto; line-height: 1.1;
}
.lm-social-reach strong {
  font-size: 18px; font-weight: 800; letter-spacing: -0.02em; color: var(--lm-text); line-height: 1;
}
.lm-social-reach em {
  font-size: 10.5px; font-style: normal; font-weight: 500;
  text-transform: uppercase; letter-spacing: 0.06em; opacity: 0.85; margin-top: 1px;
}

/* Account menu — body-level fixed dropdown anchored to mini-profile trigger
   (top/left set by JS so it isn't clipped by sidebar overflow). */
.lm-account-menu {
  position: fixed;
  width: 260px;
  background: #fff; border: 1px solid var(--lm-border);
  border-radius: 10px;
  box-shadow: 0 20px 50px -10px rgba(15,23,42,0.30), 0 6px 18px -6px rgba(15,23,42,0.14);
  padding: 4px; z-index: 1000;
  animation: lm-menu-pop .14s ease;
  display: none;
}
.lm-account-menu.is-open { display: block; }
@keyframes lm-menu-pop { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } }
.lm-account-menu-header {
  display: flex; gap: 10px; align-items: center; padding: 9px 10px 11px;
  color: var(--lm-text); text-decoration: none;
  border-radius: 8px;
  transition: background .12s;
}
.lm-account-menu-header:hover { background: var(--lm-surface); text-decoration: none; color: var(--lm-text); }
.lm-account-menu-avatar { width: 36px; height: 36px; border-radius: 50%; overflow: hidden; flex-shrink: 0; border: 2px solid var(--lm-primary-soft-2); background: var(--lm-surface); }
.lm-account-menu-avatar img { width: 100%; height: 100%; object-fit: cover; }
.lm-account-menu-id { min-width: 0; flex: 1; overflow: hidden; }
.lm-account-menu-name {
  display: flex; align-items: center; gap: 4px;
  font-weight: 600; font-size: 13px; color: var(--lm-text);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.lm-account-menu-name svg { color: var(--lm-primary); flex-shrink: 0; }
.lm-account-menu-name .lm-tier { flex-shrink: 0; }

/* Sidebar bottom mini-profile name — same single-line truncation as the
   account-menu header so "LocalModels" + verified + VIP fit one row.
   Inline template style sets display:inline-flex, override to flex+nowrap. */
.lm-mini-profile { color: inherit; }
.lm-mini-name {
  display: flex !important; align-items: center; gap: 4px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  min-width: 0;
  color: var(--lm-text, #111);
}
.lm-mini-name > svg, .lm-mini-name > .lm-tier { flex-shrink: 0; }
.lm-mini-name-text {
  display: block;
  flex: 1 1 0;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.lm-account-menu-handle { font-size: 10.5px; color: var(--lm-muted); font-family: var(--lm-font-mono); margin: 1px 0 5px; }
.lm-account-type { display: inline-flex; align-items: center; gap: 3px; font-size: 10px; font-weight: 600; padding: 2px 6px; border-radius: 4px; letter-spacing: 0.02em; }
.lm-account-type-brand { background: #00363f; color: #fff; border: 1px solid #00363f; }
.lm-account-type-talent { background: var(--lm-primary, #0a8a4f); color: #fff; border: 1px solid var(--lm-primary, #0a8a4f); }
/* Admin variant — orange/amber, signals operator-level access. */
.lm-account-type-admin  { background: #fff3e0; color: #b54708; border: 1px solid #fde6c5; }
html[data-lm-theme="dark"] .lm-account-type-admin { background: #2a1d10; color: #f59e0b; border-color: #4a3220; }
.lm-account-menu-divider { height: 1px; background: var(--lm-border-2); margin: 3px 4px; }
.lm-account-menu-section { display: flex; flex-direction: column; padding: 1px 0; }
.lm-account-menu-item { display: flex; align-items: center; gap: 9px; width: 100%; padding: 7px 10px; font-size: 12.5px; font-weight: 500; color: var(--lm-text); background: transparent; border-radius: 6px; text-align: left; cursor: pointer; transition: background .12s; border: none; }
.lm-account-menu-item:hover { background: var(--lm-surface); }
.lm-account-menu-item svg { color: var(--lm-muted); flex-shrink: 0; }
.lm-account-menu-item:hover svg { color: var(--lm-primary-strong); }
.lm-account-menu-label { flex: 1; }
.lm-account-menu-caret { color: var(--lm-muted-2) !important; }
.lm-account-menu-signout { color: #b91c1c !important; }
.lm-account-menu-signout svg { color: #b91c1c !important; }
.lm-account-menu-signout:hover { background: #fef2f2 !important; }
.lm-wallet-balance { font-family: var(--lm-font-mono); font-size: 11.5px; font-weight: 700; color: var(--lm-primary-strong); background: var(--lm-primary-soft); border: 1px solid var(--lm-primary-soft-2); padding: 2px 7px; border-radius: 5px; }
/* On hover, FILL the balance pill green with white text (was a hardcoded white
   bg that looked harsh — especially in dark theme). Reads as an active state in
   both themes. */
.lm-account-menu-wallet:hover .lm-wallet-balance { background: var(--lm-primary); border-color: var(--lm-primary); color: #fff; }

/* Mini profile caret animation */
.lm-account-area .lm-mini-caret { transition: transform .15s; flex-shrink: 0; }
.lm-account-area.is-open .lm-mini-caret { transform: rotate(180deg); }

/* Create button in sidebar */
.lm-create-btn {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; padding: 10px 14px;
  background: var(--lm-primary); color: #fff;
  border: none; border-radius: 8px;
  font-size: 13.5px; font-weight: 600; cursor: pointer;
  transition: background .12s, transform .06s;
  margin-top: 4px;
}
.lm-create-btn:hover { background: var(--lm-primary-strong); }
.lm-create-btn:active { transform: translateY(1px); }

/* Phase H R68: anon Sign In / Sign Up CTA block in sidebar. Primary
   button mirrors .lm-create-btn (green fill), secondary is outlined. */
.lm-auth-cta {
  display: flex; flex-direction: column; gap: 8px;
  padding: 12px;
  border-top: 1px solid var(--lm-border);
  margin: 0 -12px -14px;
}
.lm-auth-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; padding: 9px 14px;
  border-radius: 8px;
  font-size: 13.5px; font-weight: 600;
  text-decoration: none; cursor: pointer;
  transition: background .12s, transform .06s, border-color .12s, color .12s;
  box-sizing: border-box;
}
.lm-auth-btn--primary {
  background: var(--lm-primary); color: #fff; border: 1px solid var(--lm-primary);
}
.lm-auth-btn--primary:hover { background: var(--lm-primary-strong); border-color: var(--lm-primary-strong); color: #fff; }
.lm-auth-btn--primary:active { transform: translateY(1px); }
.lm-auth-btn--secondary {
  background: transparent; color: var(--lm-text);
  border: 1px solid var(--lm-border);
}
.lm-auth-btn--secondary:hover { border-color: var(--lm-primary); color: var(--lm-primary); }
.lm-auth-btn--secondary:active { transform: translateY(1px); }

/* v2.2m — Topbar guest auth buttons (Sign Up green + Sign In). Mirrors
   the sidebar lm-auth-btn pair but inline-sized and compact for the
   header context. */
.lm-topbar-auth {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
.lm-topbar-auth-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 14px;
  border-radius: 8px;
  font-size: 13px;
  font-weight: 600;
  text-decoration: none;
  cursor: pointer;
  border: 1px solid transparent;
  white-space: nowrap;
  transition: background .12s, border-color .12s, color .12s;
}
.lm-topbar-auth-btn--primary {
  background: var(--lm-primary);
  color: #fff;
  border-color: var(--lm-primary);
  /* ~30% wider than the secondary button (wider horizontal padding) per request. */
  padding-left: 26px;
  padding-right: 26px;
}
.lm-topbar-auth-btn--primary:hover {
  background: var(--lm-primary-strong);
  border-color: var(--lm-primary-strong);
  color: #fff;
  text-decoration: none;
}
.lm-topbar-auth-btn--secondary {
  background: transparent;
  color: var(--lm-text);
  border-color: var(--lm-border);
}
.lm-topbar-auth-btn--secondary:hover {
  border-color: var(--lm-primary);
  color: var(--lm-primary);
}
@media (max-width: 767px) {
  /* Narrow viewports: hide labels, keep only icons */
  .lm-topbar-auth-btn span { display: none; }
  .lm-topbar-auth-btn { padding: 8px 10px; }
}

/* Phase H R68: Sign In modal for anonymous visitors. Reuses .lm-modal-scrim
   from booking/review modals; specific tweaks here keep it tight (~440px
   wide) and form fields styled like the rest of the LM UI. */
#lm-signin-scrim { display: none; align-items: center; justify-content: center; }
.lm-signin-modal {
  width: min(440px, calc(100vw - 32px));
  background: var(--lm-card, #fff);
  border-radius: 14px;
  box-shadow: 0 14px 40px rgba(15, 23, 42, 0.18);
  display: flex; flex-direction: column;
  max-height: calc(100vh - 40px);
}
#lm-signin-scrim .lm-modal-body { padding: 20px 22px 22px; display: flex; flex-direction: column; gap: 14px; }

/* Social sign-in inside the modal — mirrors the /signin page's .lm-social row
   (lm-auth.css), restated here with literal colors because lm-auth.css is NOT
   loaded site-wide and the modal is injected on every page via _footer.tpl.
   Keep the two visually in sync. One row, never wraps: Google is the labeled
   flexible button; other providers are fixed icon-only squares. */
.lm-signin-modal .lm-social { display: flex; flex-wrap: nowrap; gap: 8px; margin: 2px 0; }
.lm-signin-modal .lm-social-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  flex: 0 0 44px; width: 44px; height: 44px; padding: 0;
  background: #fff; border: 1px solid #E2E8F0; border-radius: 10px;
  color: #0F172A; font-family: inherit; font-size: 13px; font-weight: 600;
  text-decoration: none; cursor: pointer;
  transition: background 120ms, border-color 120ms;
}
.lm-signin-modal .lm-social-btn--labeled { flex: 1 1 0; width: auto; min-width: 0; padding: 0 14px; }
.lm-signin-modal .lm-social-btn:hover { background: #F8FAFC; border-color: #CBD5E1; }
.lm-signin-modal .lm-social-btn svg { display: block; flex: 0 0 auto; }
.lm-signin-modal .lm-social-btn .lbl { display: none; }
.lm-signin-modal .lm-social-btn--labeled .lbl { display: inline; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lm-signin-or { display: flex; align-items: center; gap: 10px; color: #94A3B8; font-size: 12px; }
.lm-signin-or::before, .lm-signin-or::after { content: ""; flex: 1; height: 1px; background: #E2E8F0; }
.lm-signin-or span { white-space: nowrap; }

.lm-signin-field { display: flex; flex-direction: column; gap: 6px; }
.lm-signin-field label { font-size: 12.5px; font-weight: 500; color: var(--lm-muted); }
.lm-signin-field input[type="text"],
.lm-signin-field input[type="password"] {
  width: 100%; box-sizing: border-box;
  padding: 10px 12px;
  font-family: inherit; font-size: 14px;
  background: var(--lm-bg, #fff); color: var(--lm-text);
  border: 1px solid var(--lm-border, #d6d6d6); border-radius: 8px;
}
.lm-signin-field input:focus { outline: none; border-color: var(--lm-primary); box-shadow: 0 0 0 3px rgba(16,185,129,0.12); }
.lm-signin-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; font-size: 12.5px; flex-wrap: wrap; }
.lm-signin-check { display: inline-flex; align-items: center; gap: 6px; color: var(--lm-text); cursor: pointer; }
.lm-signin-link { color: var(--lm-primary); text-decoration: none; }
.lm-signin-link:hover { text-decoration: underline; }
.lm-signin-alert {
  padding: 10px 12px;
  font-size: 12.5px; line-height: 1.35;
  color: #991b1b;
  background: #fef2f2; border: 1px solid #fecaca;
  border-radius: 8px;
}
/* Sign-in submit — green button (talent-side primary). The signin modal lives
   in _footer.tpl globally; lm-brand.css scopes its teal .lm-btn-primary to
   .lm-brand-page only, so this rule paints the modal button green everywhere.

   R14 fix: selector bumped from `.lm-signin-submit` (0,1,0) to
   `.lm-modal-scrim .lm-btn.lm-signin-submit` (0,3,0). The generic
   `.lm-modal-scrim .lm-btn` rule (0,2,0) was overriding the border + there's
   no `.lm-modal-scrim .lm-btn-primary` rule at all, so the button rendered
   unstyled grey on pages that don't load lm-bookings.css. Higher specificity
   guarantees the green wins everywhere the signin modal appears. */
.lm-modal-scrim .lm-btn.lm-signin-submit {
  width: 100%;
  padding: 11px 14px;
  font-size: 14px;
  font-weight: 600;
  border-radius: 8px;
  border: 1px solid var(--lm-primary);
  background: var(--lm-primary);
  color: #fff;
  cursor: pointer;
  transition: background 120ms, border-color 120ms;
}
.lm-modal-scrim .lm-btn.lm-signin-submit:hover {
  background: var(--lm-primary-strong);
  border-color: var(--lm-primary-strong);
  color: #fff;
}
.lm-signin-switch { text-align: center; font-size: 12.5px; color: var(--lm-muted); }
.lm-signin-switch a { color: var(--lm-primary); font-weight: 600; text-decoration: none; }
.lm-signin-switch a:hover { text-decoration: underline; }
html[data-lm-theme="dark"] .lm-signin-modal { background: var(--lm-card, #161b22); }
html[data-lm-theme="dark"] .lm-signin-field input { background: var(--lm-bg, #0d1117); color: var(--lm-text); border-color: var(--lm-border, #2a3038); }
html[data-lm-theme="dark"] .lm-signin-alert { background: rgba(220,38,38,0.12); color: #fca5a5; border-color: rgba(220,38,38,0.35); }

/* R7 #5: Edit cover button — design-exact dark transparent w/ white icon+text */
.lm-hero-cover .profile-cover-change.lm-cover-edit-btn-wrap {
  /* Proportional offsets — same gap from the top as from the right
     edge (14px / 14px) so the button reads as visually balanced. */
  position: absolute !important; right: 14px !important; top: 14px !important; z-index: 3 !important;
}
.lm-profile-page .lm-cover-edit-btn,
.lm-cover-edit-btn {
  position: static !important;
  display: inline-flex !important; align-items: center !important; gap: 6px !important;
  padding: 7px 11px !important;
  background: rgba(0,0,0,0.6) !important;
  border: 1px solid rgba(255,255,255,0.2) !important;
  border-radius: 8px !important;
  font-size: 12px !important; font-weight: 600 !important;
  color: #ffffff !important;
  backdrop-filter: blur(8px) !important;
  -webkit-backdrop-filter: blur(8px) !important;
  cursor: pointer !important;
  transition: background .15s ease, border-color .15s ease !important;
  text-shadow: none !important;
  box-shadow: none !important;
  line-height: 1.2 !important;
}
.lm-profile-page .lm-cover-edit-btn svg,
.lm-cover-edit-btn svg { color: #ffffff !important; stroke: #ffffff !important; }
.lm-profile-page .lm-cover-edit-btn:hover,
.lm-cover-edit-btn:hover { background: rgba(0,0,0,0.8) !important; border-color: rgba(255,255,255,0.3) !important; }

/* Both Cover-edit and Avatar-camera dropdowns use Bootstrap 5
   data-bs-strategy="fixed" so Popper positions them via position:fixed,
   which ignores parent overflow:hidden and works inside the
   .lm-hero card without being clipped. We only style the visuals
   below — Popper owns position/transform. */

/* Shared styling for both LM hero dropdowns — compact size + LM type. */
.lm-hero-cover .profile-cover-change .dropdown-menu.action-dropdown-menu,
.lm-avatar-wrap .lm-avatar-cam-wrap .dropdown-menu.action-dropdown-menu {
  min-width: 200px;
  padding: 5px;
  border-radius: 9px;
  box-shadow: 0 12px 28px rgba(15,23,42,0.22);
  border: 1px solid var(--lm-border, #e2e8f0);
  background: #fff;
  font-family: var(--lm-font-sans, "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif) !important;
}
.lm-hero-cover .profile-cover-change .dropdown-menu.action-dropdown-menu .dropdown-item,
.lm-avatar-wrap .lm-avatar-cam-wrap .dropdown-menu.action-dropdown-menu .dropdown-item {
  font-family: inherit !important;
  font-size: 12.5px !important;
  font-weight: 500;
  color: var(--lm-text, #0f172a);
  padding: 6px 9px !important;
  border-radius: 6px;
  cursor: pointer;
  line-height: 1.35;
}
.lm-hero-cover .profile-cover-change .dropdown-menu.action-dropdown-menu .dropdown-item:hover,
.lm-avatar-wrap .lm-avatar-cam-wrap .dropdown-menu.action-dropdown-menu .dropdown-item:hover {
  background: var(--lm-bg-2, #f1f5f9);
}
.lm-hero-cover .profile-cover-change .dropdown-menu.action-dropdown-menu .dropdown-item .action,
.lm-avatar-wrap .lm-avatar-cam-wrap .dropdown-menu.action-dropdown-menu .dropdown-item .action {
  font-family: inherit;
  font-size: 12.5px;
  font-weight: 600;
  line-height: 1.3;
}
.lm-hero-cover .profile-cover-change .dropdown-menu.action-dropdown-menu .dropdown-item .action-desc,
.lm-avatar-wrap .lm-avatar-cam-wrap .dropdown-menu.action-dropdown-menu .dropdown-item .action-desc {
  font-family: inherit;
  font-size: 11px;
  font-weight: 400;
  color: var(--lm-muted, #64748b);
  margin-top: 1px;
  line-height: 1.3;
}
.lm-hero-cover .profile-cover-change .dropdown-menu.action-dropdown-menu .dropdown-divider,
.lm-avatar-wrap .lm-avatar-cam-wrap .dropdown-menu.action-dropdown-menu .dropdown-divider {
  margin: 4px 2px;
  border-color: var(--lm-border, #e2e8f0);
}

/* Bookings badge in nav */
.lm-nav-badge-bookings {
  background: var(--lm-primary); color: #fff;
  font-size: 11px; font-weight: 700;
  padding: 2px 7px; border-radius: 999px;
  margin-left: auto;
}
/* Admin escalated-disputes badge — red palette to signal admin attention. */
.lm-nav-badge.lm-nav-badge-dispute,
.lm-m-nav-badge.lm-m-nav-badge-dispute {
  background: #c0392b; color: #fff;
}

/* Social list should be flex-wrap to accommodate all 5 platforms */
.lm-social-list { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }

/* ── Gradient avatar placeholder (no photo) ─────────────── */
.lm-avatar-gradient {
  width: 100%; height: 100%;
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: 36px; font-weight: 700; color: #fff;
  letter-spacing: -0.02em;
  text-shadow: 0 1px 2px rgba(0,0,0,0.15);
  user-select: none;
  position: relative;
}

/* R8 #3: Country flag emoji inline.
   R20N: explicit no-rounding/no-clipping defaults so the full rectangular
   flag is always visible — applies in hero, About, footer, language picker,
   travel chips, anywhere. */
.lm-flag-emoji {
  display: inline-block;
  font-size: 14px;
  line-height: 1;
  vertical-align: -1px;
  margin-right: 2px;
  font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", system-ui, sans-serif;
  border-radius: 0;
  overflow: visible;
  box-shadow: none;
  background: transparent;
}

/* R20N: Sngine emojify wraps text emoji in <span class="emoji"> with global
   border-radius: 50% (style.css:6879) — that turns country flags into circles.
   Force flags to stay rectangular wherever they appear, while keeping the
   round shape for actual reaction emoji (.reactions_item .emoji etc). */
.lm-flag-emoji .emoji,
.lm-hero-loc-flag .emoji,
.lm-lang-flag.emoji,
.lm-lang-flag .emoji,
.lm-travel-zone .emoji,
.user_country_flag .emoji,
.lm-bio-row dd .emoji {
  border-radius: 0 !important;
  overflow: visible !important;
  box-shadow: none !important;
  background: transparent !important;
}

/* ── About card — language/industry chips ────────────────── */
.lm-lang-chips, .lm-industry-chips {
  display: flex; flex-wrap: wrap; gap: 4px;
}
.lm-lang-chip, .lm-industry-chip {
  display: inline-flex; align-items: center;
  padding: 2px 7px; border-radius: 999px;
  font-size: 11.5px; font-weight: 600;
  font-family: var(--lm-font-mono);
}
.lm-lang-chip { background: var(--lm-surface); color: var(--lm-text); border: 1px solid var(--lm-border); }
.lm-industry-chip { background: var(--lm-primary-soft); color: var(--lm-primary-strong); border: 1px solid var(--lm-primary-soft-2); font-family: var(--lm-font); font-weight: 500; font-size: 11.5px; }

/* ── About card — measurements 2-col grid ────────────────── */
.lm-bio-meta-cols .lm-bio-row { font-size: 11.5px; }

/* ── Past clients — chips layout ────────────────────────── */
.lm-clients-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.lm-client-chip {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 4px 10px; border-radius: 999px;
  font-size: 12px; font-weight: 500;
  background: var(--lm-surface); color: var(--lm-text);
  border: 1px solid var(--lm-border);
}
.lm-client-chip:hover { border-color: var(--lm-primary); color: var(--lm-primary-strong); }

/* ── Modeling agencies ───────────────────────────────────── */
.lm-agency-signed-label, .lm-agency-past-label {
  font-family: var(--lm-font-mono); font-size: 10px; font-weight: 600;
  color: var(--lm-muted); text-transform: uppercase; letter-spacing: 0.05em;
  margin: 8px 0 6px;
}
.lm-agency-signed-label:first-child { margin-top: 0; }
.lm-agency-country-flag { display: inline-block; margin-right: 4px; }

/* ── Similar talent horizontal carousel ─────────────────── */
.lm-similar-scroll {
  display: flex; gap: 10px;
  overflow-x: auto; padding-bottom: 4px;
  scrollbar-width: none; -ms-overflow-style: none;
}
.lm-similar-scroll::-webkit-scrollbar { display: none; }
.lm-similar-scroll .lm-similar-card-item {
  min-width: 160px; flex-shrink: 0;
  display: flex; flex-direction: column; gap: 6px;
  padding: 0; border: 1px solid var(--lm-border-2);
  border-radius: 12px; background: #fff;
  overflow: hidden;
  transition: border-color .12s, box-shadow .12s;
}
.lm-similar-scroll .lm-similar-card-item:hover { border-color: var(--lm-primary-soft-2); box-shadow: var(--lm-shadow-sm); text-decoration: none; }

/* Phase H R18 — mini Discover photo block in the rail. Reuses the dc-card
   carousel JS by keeping the .dc-card-photo / .dc-photo-frame classes;
   we just constrain the size and override the dc-card aspect ratio for
   the narrow rail (3:4 portrait, ~160w × ~213h). */
.lm-similar-scroll .lm-similar-photo {
  position: relative;
  width: 100%;
  aspect-ratio: 3 / 4;
  border-radius: 10px 10px 0 0;
  overflow: hidden;
  background: var(--lm-surface);
}
.lm-similar-scroll .lm-similar-photo .dc-photo-frame {
  position: absolute; inset: 0;
  background-size: cover; background-position: center;
  opacity: 0;
  /* No transition — instant frame swap on first paint AND on mousemove
     carousel. Discover (/people) cards use opacity .15s fade because
     the cards are large; in this 160px rail the fade reads as flicker /
     zoom-in pulse, especially when 5 cards load near-simultaneously. */
}
.lm-similar-scroll .lm-similar-photo .dc-photo-frame.is-active { opacity: 1; }
/* Disable the .dc-card:hover lift (translateY(-2px)) inside the narrow
   rail — the small cards visibly bounce when the cursor crosses them
   while horizontal-scrolling, which reads as "zoom in/out" jitter. */
.lm-similar-scroll .lm-similar-card-item:hover {
  transform: none;
}
.lm-similar-scroll .lm-similar-photo .dc-photo-dots {
  position: absolute; left: 0; right: 0; bottom: 6px;
  display: flex; justify-content: center; gap: 3px;
  pointer-events: none; z-index: 2;
}
.lm-similar-scroll .lm-similar-photo .dc-photo-dot {
  width: 4px; height: 4px; border-radius: 50%;
  background: rgba(255,255,255,0.55);
  box-shadow: 0 0 2px rgba(0,0,0,0.3);
}
.lm-similar-scroll .lm-similar-photo .dc-photo-dot.is-active { background: #fff; }
.lm-similar-scroll .lm-similar-photo .dc-card-tr {
  position: absolute; top: 6px; right: 6px;
  z-index: 3;
  display: inline-flex; gap: 4px; align-items: center;
}

.lm-similar-scroll .lm-similar-info { text-align: left; padding: 8px 10px 10px; }

/* Phase H R20 — three stacked rows: name, location, price. Cards are too
   narrow (160px) to fit name+price on one row without ellipsing the price,
   so the price gets its own line beneath the location. */
.lm-similar-scroll .lm-similar-name {
  font-size: 12.5px; font-weight: 600;
  display: inline-flex; align-items: center; gap: 4px;
  max-width: 100%;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.lm-similar-scroll .lm-similar-loc {
  display: flex; align-items: center; gap: 4px;
  font-size: 11px; color: var(--lm-muted);
  margin-top: 3px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%;
}
/* Flag — square, no avatar-style rounding. Sngine wraps emoji in
   <img class="emoji"> with a global border-radius:50% rule that turns
   country flags into circles. Same fix as .dc-flag (lm-discover.css:710). */
.lm-similar-scroll .lm-similar-flag {
  display: inline-flex; align-items: center;
  font-size: 12px; line-height: 1;
  flex-shrink: 0;
  border-radius: 0;
  background: transparent;
  overflow: visible;
  font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", "Twemoji Mozilla", system-ui, sans-serif;
}
.lm-similar-scroll .lm-similar-flag .emoji,
.lm-similar-scroll .lm-similar-flag img,
.lm-similar-scroll .lm-similar-flag svg {
  border-radius: 0 !important;
  overflow: visible !important;
  box-shadow: none !important;
  background: transparent !important;
  height: 12px !important;
  width: auto !important;
  display: inline-block;
  vertical-align: middle;
}
.lm-similar-scroll .lm-similar-price {
  margin-top: 5px;
  font-family: var(--lm-font-mono);
  font-size: 11.5px;
  color: var(--lm-text);
  white-space: nowrap;
}
.lm-similar-scroll .lm-similar-price strong { font-weight: 700; }
.lm-similar-scroll .lm-similar-price-from {
  color: var(--lm-muted);
  font-weight: 500;
  font-size: 10.5px;
}

/* R20V Phase 3.5 — Similar Talent widget enhancements:
   snap-scroll behavior + side arrow buttons (desktop only). */
.lm-similar-widget .lm-similar-scroll-wrap {
  position: relative;
}
.lm-similar-widget .lm-similar-scroll {
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  scroll-padding-left: 4px;
}
.lm-similar-widget .lm-similar-scroll .lm-similar-card-item {
  scroll-snap-align: start;
}
/* Arrow buttons — circular, subtle background, only show on desktop. */
.lm-similar-arrow {
  position: absolute;
  top: 50%; transform: translateY(-50%);
  width: 28px; height: 28px;
  display: grid; place-items: center;
  background: #fff;
  color: var(--lm-text, #0f172a);
  border: 1px solid var(--lm-border, #e2e8f0);
  border-radius: 50%;
  cursor: pointer;
  box-shadow: 0 2px 8px rgba(15,23,42,0.10);
  z-index: 5;
  padding: 0; line-height: 1;
  transition: background .15s, border-color .15s, opacity .15s;
}
.lm-similar-arrow:hover {
  background: var(--lm-bg-2, #f1f5f9);
  border-color: var(--lm-primary, #2f8a5f);
}
.lm-similar-arrow:disabled {
  opacity: 0;
  pointer-events: none;
}
.lm-similar-arrow-prev { left: -10px; }
.lm-similar-arrow-next { right: -10px; }
.lm-similar-arrow svg { color: currentColor; display: block; }
@media (max-width: 768px) {
  /* Touch swipe is fine on mobile — no need for arrows. */
  .lm-similar-arrow { display: none; }
  .lm-similar-widget .lm-similar-scroll .lm-similar-card-item { min-width: 140px; }
}
/* Dark mode parity for cards + arrows. */
html[data-lm-theme="dark"] .lm-similar-scroll .lm-similar-card-item {
  background: var(--lm-surface);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .lm-similar-arrow {
  background: var(--lm-surface);
  color: var(--lm-text);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .lm-similar-arrow:hover {
  background: var(--lm-bg-2);
}

/* ── Booking modal (R7 — design-exact: calendar+form 2-col, xl) ────────── */
.lm-booking-modal-scrim {
  position: fixed; inset: 0;
  background: rgba(15,23,42,0.45);
  backdrop-filter: blur(4px);
  display: grid; place-items: center;
  z-index: 600; padding: 24px;
  animation: lm-fade .15s ease;
}
/* R20G: booking modal uses flex-column at every viewport so the body scrolls
   and the head + foot stick. Previously only mobile (<768px) had this layout
   and desktop relied on a single .lm-booking-modal{overflow:auto}, which made
   the foot scroll out of view on tall content. */
.lm-booking-modal {
  background: #fff; border-radius: 16px;
  width: 100%; max-width: 1000px;
  max-height: calc(100vh - 48px);
  display: flex; flex-direction: column;
  box-shadow: 0 24px 60px rgba(15,23,42,0.25);
  animation: lm-pop .18s ease;
  /* Phase H R37: visible (was hidden) so the "Your offer" unit dropdown
     popup can hang past the modal's bottom edge. The body scroller
     (.lm-booking-body { overflow-y:auto }) still clips inner scroll —
     but the modal frame must let the popup escape. The 16px radius is
     preserved on the head + foot since the body's bg covers them. */
  overflow: visible;
}
.lm-booking-modal-xl { max-width: 1000px; }
#lm-booking-form-state, #lm-booking-confirm-state {
  display: flex; flex-direction: column;
  flex: 1 1 auto; min-height: 0;
}
/* Confirmation state shrinks to content so the modal isn't taller than needed. */
#lm-booking-confirm-state { flex: 0 1 auto; }
#lm-booking-confirm-state .lm-booking-body { flex: 0 1 auto; }
.lm-booking-head-wrap { display: flex; align-items: center; gap: 12px; }
.lm-booking-head-ic {
  width: 32px; height: 32px; border-radius: 8px;
  background: var(--lm-primary-soft);
  border: 1px solid var(--lm-primary-soft-2);
  color: var(--lm-primary-strong);
  display: grid; place-items: center; flex-shrink: 0;
}
.lm-booking-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 18px 22px; border-bottom: 1px solid var(--lm-border);
  background: #fff;
  border-radius: 16px 16px 0 0;
  flex: 0 0 auto;
}
.lm-booking-title { margin: 0; font-size: 16px; font-weight: 600; letter-spacing: -0.01em; }
.lm-booking-subtitle { font-size: 12px; color: var(--lm-muted); margin-top: 2px; }
.lm-booking-close {
  width: 32px; height: 32px; display: grid; place-items: center;
  border-radius: 8px; color: var(--lm-muted); cursor: pointer; background: none; border: none;
}
.lm-booking-close:hover { background: var(--lm-surface-2); color: var(--lm-text); }
.lm-booking-body {
  padding: 20px 22px 12px;
  display: flex; flex-direction: column; gap: 14px;
  flex: 1 1 auto; min-height: 0;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  /* Hide scrollbar — content still scrolls */
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.lm-booking-body::-webkit-scrollbar { display: none; width: 0; height: 0; }
.lm-booking-foot {
  padding: 14px 22px; border-top: 1px solid var(--lm-border);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  background: var(--lm-surface); border-radius: 0 0 16px 16px;
  flex: 0 0 auto;
  flex-wrap: nowrap;
}
/* R20O: helper text takes the available space on the LEFT, single row,
   shrinks before pushing buttons. Buttons stay together on the RIGHT. */
.lm-booking-foot > .lm-booking-foot-info {
  flex: 1 1 auto; min-width: 0;
  margin: 0;
}
.lm-booking-foot > div[style*="display:flex"],
.lm-booking-foot > div[style*="display: flex"],
.lm-booking-foot > .lm-booking-confirm-actions {
  flex: 0 0 auto;
  display: flex !important; gap: 8px;
  justify-content: flex-end;
}
.lm-booking-foot-info {
  font-size: 12px; color: var(--lm-muted);
  display: inline-flex; align-items: center; gap: 5px;
  line-height: 1.4;
}
.lm-booking-foot-info svg { flex-shrink: 0; }
.lm-booking-foot-info-strong { font-weight: 600; color: var(--lm-text); }
.lm-booking-foot-info-stack { display: contents; }
.lm-booking-foot-info-detail { color: var(--lm-muted); }

/* Form fields */
.lm-field { display: flex; flex-direction: column; gap: 5px; }
.lm-field-label { font-size: 12.5px; font-weight: 600; color: var(--lm-text); }
.lm-field-label.required::after { content: " *"; color: #e11d48; }
.lm-input, .lm-select, .lm-textarea {
  width: 100%; padding: 10px 12px;
  border: 1.5px solid var(--lm-border);
  border-radius: 8px; font: inherit;
  font-size: 13.5px; color: var(--lm-text);
  background: #fff; outline: none;
  transition: border-color .12s;
}
.lm-input:focus, .lm-select:focus, .lm-textarea:focus { border-color: var(--lm-primary); }
.lm-textarea { resize: vertical; min-height: 80px; }
.lm-input::placeholder, .lm-textarea::placeholder { color: var(--lm-muted-2); }
.lm-help { font-size: 11.5px; color: var(--lm-muted); margin-top: 3px; }

/* Date display bar */
.lm-booking-dates-bar {
  display: flex; align-items: center; justify-content: space-between;
  padding: 12px 14px;
  background: var(--lm-primary-soft);
  border: 1px solid var(--lm-primary-soft-2);
  border-radius: 10px; font-size: 13.5px; font-weight: 500;
  color: var(--lm-primary-strong);
}
.lm-booking-dates-bar.is-empty { background: var(--lm-surface); border-color: var(--lm-border); color: var(--lm-muted); }
.lm-booking-dates-hint { font-size: 11.5px; color: var(--lm-muted); margin-top: 6px; }
.lm-booking-date-clear { background: none; border: none; cursor: pointer; color: var(--lm-muted); }
.lm-booking-date-clear:hover { color: #e11d48; }

/* Full day toggle row */
.lm-fullday-row {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 12px; border: 1.5px solid var(--lm-border); border-radius: 8px;
  cursor: pointer; user-select: none; font-size: 13px;
}
.lm-fullday-row.is-on { border-color: var(--lm-primary); background: var(--lm-primary-soft); color: var(--lm-primary-strong); }
.lm-fullday-check {
  width: 18px; height: 18px; border-radius: 4px;
  border: 1.5px solid var(--lm-border);
  display: grid; place-items: center; flex-shrink: 0;
}
.lm-fullday-row.is-on .lm-fullday-check { background: var(--lm-primary); border-color: var(--lm-primary); }
.lm-time-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }

/* R7 #4: Booking — 2-col grid + calendar (design lm-booking-grid spec) */
/* R9 quick: booking right column locked to 560px width */
.lm-booking-grid {
  display: grid; grid-template-columns: minmax(0, 1fr) 560px; gap: 24px; align-items: stretch;
}
.lm-booking-cal { min-width: 0; display: flex; flex-direction: column; }
.lm-booking-right { width: 560px; min-width: 0; display: flex; flex-direction: column; gap: 10px; }
.lm-booking-row-2 {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 10px;
}
/* minmax(0,1fr) floors both tracks at 0 so the long "Book as" label can't push
   its column wider and shrink Event city - the columns stay an even 50/50 (like
   the Selected dates / Time row). min-width:0 lets the cdrop button shrink so its
   label truncates via the existing .lm-cdrop-has-pic .lm-cdrop-label ellipsis. */
.lm-booking-row-2 .lm-field { margin: 0; min-width: 0; }
.lm-booking-row-2 .lm-cdrop,
.lm-booking-row-2 .lm-cdrop-btn { min-width: 0; max-width: 100%; }
.lm-booking-form { display: flex; flex-direction: column; gap: 10px; }
.lm-booking-form .lm-field { margin: 0; }
.lm-booking-dates {
  font-variant-numeric: tabular-nums;
  display: flex; align-items: center; justify-content: space-between;
  background: var(--lm-surface);
}
.lm-fullday-display { background: var(--lm-surface); display: flex; align-items: center; }
/* R20j: row layout for Time + Full day toggle. Float removed so the wrapping
   element doesn't accidentally extend the click target. */
.lm-field-label-row {
  display: flex; align-items: center; justify-content: space-between;
  gap: 8px;
}
.lm-fullday-inline {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 11px; font-weight: 500; color: var(--lm-muted);
  cursor: pointer; user-select: none;
}
.lm-fullday-inline input { accent-color: var(--lm-primary); margin: 0; width: 12px; height: 12px; }
.lm-booking-time-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.4fr);
  gap: 6px;
}
.lm-booking-note-field { flex: 1 1 auto; display: flex; flex-direction: column; gap: 6px; min-height: 0; }
.lm-booking-note { flex: 1 1 auto; min-height: 110px; resize: vertical; box-sizing: border-box; }
.lm-card-link {
  background: none; border: 0; padding: 0; cursor: pointer;
  font-size: 12px; font-weight: 600; color: var(--lm-primary-strong);
}
.lm-card-link:hover { text-decoration: underline; }

/* ── Calendar ──────────────────────────────────────── */
.lm-cal { border: 1px solid var(--lm-border); border-radius: 12px; padding: 14px; background: #fff; }
.lm-cal-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }
.lm-cal-month { font-weight: 600; font-size: 14px; color: var(--lm-text); }
.lm-cal-nav-btn {
  width: 28px; height: 28px; border-radius: 6px;
  background: transparent; border: 1px solid var(--lm-border);
  color: var(--lm-muted); cursor: pointer;
  display: grid; place-items: center;
  transition: background .12s, border-color .12s;
}
.lm-cal-nav-btn:hover { background: var(--lm-surface-2); border-color: var(--lm-muted-2); color: var(--lm-text); }
.lm-cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
.lm-cal-dow { font-family: var(--lm-font-mono); font-size: 10px; font-weight: 600; color: var(--lm-muted); text-align: center; padding: 6px 0; letter-spacing: 0.04em; }
.lm-cal-day { aspect-ratio: 1; display: grid; place-items: center; font-size: 12.5px; border-radius: 8px; position: relative; cursor: pointer; user-select: none; }
.lm-cal-day:hover:not(.is-disabled):not(.is-out) { background: var(--lm-primary); color: #fff; }
.lm-cal-day.is-out { color: var(--lm-muted-2); cursor: default; }
.lm-cal-day.is-disabled { color: var(--lm-muted-2); text-decoration: line-through; cursor: not-allowed; }
.lm-cal-day.is-today { font-weight: 600; }
.lm-cal-day.is-today::after { content: ""; position: absolute; bottom: 4px; width: 3px; height: 3px; border-radius: 50%; background: var(--lm-primary); }
.lm-cal-day.is-selected { background: var(--lm-primary); color: #fff; font-weight: 600; }
.lm-cal-day.is-in-range { background: var(--lm-primary-soft-2); color: var(--lm-primary-strong); border-radius: 0; }
.lm-cal-day.is-range-start { border-radius: 8px 0 0 8px; }
.lm-cal-day.is-range-end { border-radius: 0 8px 8px 0; }
.lm-cal-legend { display: flex; gap: 14px; flex-wrap: wrap; margin-top: 12px; font-size: 11px; color: var(--lm-muted); font-family: var(--lm-font-mono); }
.lm-cal-legend-item { display: inline-flex; align-items: center; gap: 5px; }
.lm-cal-swatch { width: 10px; height: 10px; border-radius: 3px; background: var(--lm-primary); }
.lm-cal-swatch.is-disabled { background: repeating-linear-gradient(45deg, var(--lm-surface-2) 0 4px, var(--lm-border) 4px 5px); }
/* Phase 10.4 — accepted-booking availability markers on the Check Availability calendar.
   Full-day booked dates reuse .is-disabled (gray + line-through + not-allowed). Partial
   (hourly) dates stay selectable, tinted, with a gold dot. */
.lm-cal-swatch.is-partial { background: var(--lm-gold, #C6A15B); }
.lm-cal-day.is-booked-partial:not(.is-selected):not(.is-in-range) { background: var(--lm-gold-soft, #fef7d6); }
.lm-cal-pdot { position: absolute; top: 3px; right: 3px; width: 5px; height: 5px; border-radius: 50%; background: var(--lm-gold, #C6A15B); pointer-events: none; }
.lm-cal-day.is-selected .lm-cal-pdot { background: #fff; }
/* Phase 10.4b — Full-day disabled hint on partially-booked days */
.lm-fullday-hint { margin-top: 6px; font-size: 11px; line-height: 1.4; color: var(--lm-gold-text, #7a5e2e); background: var(--lm-gold-soft, #fef7d6); border: 1px solid var(--lm-gold-soft-2, #f5deb3); border-radius: 7px; padding: 6px 9px; }
.lm-fullday-hint[hidden] { display: none; }
#lm-fullday-check:disabled + span { opacity: .45; }

/* ── Confirmation state — centered success layout (R20H) ──────────
   Title sits top-left in the head; everything in the body is centered
   (icon → title → subtitle → full-width info card). Buttons stack
   vertically full-width. */
.lm-booking-head.lm-booking-head-confirm {
  /* Title sits top-left, close button top-right (default flex layout) */
  padding: 18px 22px;
}
.lm-booking-body.lm-booking-body-confirm {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 14px;
  padding: 20px 16px 8px;
}
.lm-booking-confirm-hero {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  margin: 0;
}
.lm-booking-confirm-hero-ic {
  width: 56px; height: 56px;
  display: grid; place-items: center;
  background: #10b981; color: #fff;
  border-radius: 50%;
  box-shadow: 0 8px 20px -6px rgba(16,185,129,0.45);
}
.lm-booking-confirm-hero-title {
  font-size: 17px;
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--lm-text);
}
.lm-booking-confirm-hero-sub {
  font-size: 13px;
  color: var(--lm-muted);
  line-height: 1.45;
  max-width: 380px;
  display: flex;
  flex-direction: column;
  gap: 1px;
}
/* Footer for confirmation state — stacked vertical buttons full-width */
.lm-booking-foot.lm-booking-foot-confirm {
  flex-direction: column;
  align-items: stretch;
  padding: 14px 22px 18px;
}
.lm-booking-foot.lm-booking-foot-confirm > .lm-booking-foot-info {
  justify-content: center;
  margin: 0 0 10px;
}
.lm-booking-foot.lm-booking-foot-confirm > .lm-booking-foot-info-stack,
.lm-booking-foot.lm-booking-foot-confirm .lm-booking-foot-info-stack {
  align-items: center;
  text-align: left;
}
.lm-booking-foot.lm-booking-foot-confirm > .lm-booking-confirm-actions {
  display: flex !important;
  flex-direction: column !important;
  flex: 1 1 100%;
  gap: 12px;
  width: 100%;
}
.lm-booking-foot.lm-booking-foot-confirm > .lm-booking-confirm-actions .lm-btn {
  width: 100% !important;
  min-height: 48px !important;
  height: 48px !important;
  font-size: 14px !important;
  font-weight: 600;
  border-radius: 10px !important;
  flex: 0 0 auto !important;
}

/* Legacy banner styles kept for safety (not used in new markup) */
.lm-booking-confirm { display: flex; flex-direction: column; gap: 16px; }
.lm-booking-confirm-banner {
  display: flex; align-items: flex-start; gap: 12px;
  padding: 14px 16px;
  background: #ecfdf5; border: 1px solid #bbf7d0;
  border-radius: 12px;
}
.lm-booking-confirm-banner-ic {
  width: 36px; height: 36px; flex: 0 0 36px;
  display: grid; place-items: center;
  background: #10b981; color: #fff;
  border-radius: 10px;
}
.lm-booking-confirm-banner-title { font-size: 14px; font-weight: 600; color: #064e3b; letter-spacing: -0.01em; }
.lm-booking-confirm-banner-sub { font-size: 12.5px; color: #047857; margin-top: 2px; }
.lm-booking-confirm-summary {
  border: 1px solid var(--lm-border);
  border-radius: 12px;
  background: var(--lm-surface);
  overflow: hidden;
  display: block;
  padding: 0;
  /* Override the centered body context so internal rows align left */
  text-align: left;
  width: 100%;
}
.lm-booking-confirm-row {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 10px; padding: 10px 14px;
  font-size: 13px;
  border-bottom: 1px solid var(--lm-border);
}
.lm-booking-confirm-row:last-child { border-bottom: none; }
.lm-booking-confirm-row.lm-booking-confirm-row-note {
  align-items: flex-start;
}
.lm-booking-confirm-ic {
  flex: 0 0 22px;
  display: inline-flex; align-items: center;
  color: var(--lm-muted);
}
.lm-booking-confirm-row-note .lm-booking-confirm-ic { padding-top: 2px; }
.lm-booking-confirm-ic svg { color: var(--lm-muted); flex: 0 0 auto; }
.lm-booking-confirm-k {
  display: inline-flex; align-items: center; gap: 8px;
  color: var(--lm-muted); font-weight: 500;
  flex: 0 0 160px;
}
.lm-booking-confirm-k svg { color: var(--lm-muted); flex: 0 0 auto; }
.lm-booking-confirm-v {
  color: var(--lm-text); font-weight: 500;
  flex: 1 1 auto; min-width: 0;
  word-break: break-word; overflow-wrap: anywhere;
  white-space: normal;
}
/* Note row value wraps freely, no truncation, min 2 lines worth of breathing */
.lm-booking-confirm-row-note .lm-booking-confirm-v {
  line-height: 1.5;
  white-space: pre-wrap;
}

@media (max-width: 1100px) {
  .lm-booking-grid { grid-template-columns: 1fr; }
  .lm-booking-row-2 { grid-template-columns: 1fr; }
}

/* ── 1920px responsive rules ─────────────────────────────── */
@media (max-width: 1100px) {
  .lm-similar-scroll .lm-similar-card-item { min-width: 140px; }
}

/* ══════════════════════════════════════════════════════════════
   ROUND 5 — Full interactive dropdown / modal system
   ══════════════════════════════════════════════════════════════ */

/* Create button + menu — exact design CSS */
.lm-create-wrap { position: relative; }
.lm-sidebar .lm-create-btn,
.lm-create-btn {
  width: 100%;
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  padding: 11px 14px;
  background: #0F6F4F !important;
  color: #fff !important;
  border-radius: 10px !important;
  font-weight: 700 !important;
  font-size: 13.5px !important;
  border: 1px solid #0a5439 !important;
  box-shadow: 0 2px 6px rgba(15,111,79,0.25), inset 0 -1px 0 rgba(0,0,0,0.12);
  letter-spacing: 0.01em;
  cursor: pointer;
}
.lm-create-btn:hover { background: #0a5439 !important; }
.lm-create-menu {
  position: fixed;
  /* Position at right of sidebar (240px) + 8px gap; vertical position set by JS */
  left: calc(max(0px, (100vw - 1440px) / 2) + 248px);
  width: 230px;
  background: #fff;
  color: var(--lm-text);
  border: 1px solid var(--lm-border);
  border-radius: 12px;
  box-shadow: 0 20px 50px -10px rgba(15,23,42,0.25), 0 6px 18px -6px rgba(15,23,42,0.10);
  padding: 6px;
  z-index: 9999;
  animation: lm-menu-pop .14s ease;
  display: none;
}
.lm-create-menu.is-open { display: block; }
/* R8 #6: Create menu items — design-spec 12px padding + #F8FAFC hover bg + dividers */
.lm-profile-page .lm-create-menu-item,
.lm-create-menu-item {
  display: flex !important; align-items: center; gap: 10px;
  width: 100%; padding: 10px 12px !important;
  font-size: 13px !important; font-weight: 500;
  color: var(--lm-text) !important;
  background: transparent !important; border: none; border-radius: 8px;
  text-align: left; cursor: pointer; transition: background .12s, color .12s;
  text-decoration: none !important;
}
.lm-create-menu-item:hover {
  background: #F8FAFC !important;
  color: var(--lm-primary-strong) !important;
  text-decoration: none !important;
}
.lm-create-menu-item svg { color: var(--lm-muted); flex-shrink: 0; }
.lm-create-menu-item:hover svg { color: var(--lm-primary-strong); }
.lm-create-menu-divider { height: 1px; background: #E2E8F0; margin: 4px 8px; }

/* Icon popup button (topbar bell/bookmark/inbox) */
.lm-icon-btn-pop {
  width: 38px; height: 38px;
  display: grid; place-items: center;
  border-radius: 8px; color: var(--lm-text);
  background: #fff; border: 1px solid var(--lm-border);
  position: relative; transition: border-color .12s, color .12s;
  cursor: pointer;
}
.lm-icon-btn-pop:hover { border-color: var(--lm-primary); color: var(--lm-primary-strong); }
.lm-icon-btn-pop.is-open { border-color: var(--lm-primary); color: var(--lm-primary-strong); background: var(--lm-primary-soft); }
.lm-icon-btn-badge {
  position: absolute; top: -4px; right: -4px;
  min-width: 16px; height: 16px; padding: 0 4px;
  background: #dc2626; color: #fff;
  border: 2px solid #fff; border-radius: 999px;
  font-size: 9.5px; font-weight: 700;
  display: grid; place-items: center;
  font-family: var(--lm-font-mono); pointer-events: none;
}

/* Icon dropdown wrapper */
.lm-icon-dropdown-wrap { position: relative; display: inline-flex; }

/* Popup panel (notifications, bookmarks) */
.lm-pop-panel {
  position: absolute; top: calc(100% + 8px); right: 0;
  width: 360px; background: #fff;
  border: 1px solid var(--lm-border); border-radius: 12px;
  box-shadow: 0 16px 40px -10px rgba(15,23,42,0.18), 0 4px 12px -4px rgba(15,23,42,0.10);
  z-index: 300; animation: lm-menu-pop .14s ease; overflow: hidden;
  display: none;
}
.lm-pop-panel.is-open { display: block; }
.lm-pop-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 14px; border-bottom: 1px solid var(--lm-border); }
.lm-pop-title { font-size: 13.5px; font-weight: 700; }
.lm-pop-sub { font-size: 11px; color: var(--lm-muted); margin-top: 1px; }
.lm-pop-action { font-size: 11.5px; color: var(--lm-primary-strong); font-weight: 500; cursor: pointer; background: none; border: none; }
.lm-pop-action:disabled { opacity: 0.4; cursor: not-allowed; }
.lm-pop-tabs { display: flex; padding: 6px 8px 0; border-bottom: 1px solid var(--lm-border); }
.lm-pop-tab { padding: 8px 10px; font-size: 12px; font-weight: 500; color: var(--lm-muted); border-bottom: 2px solid transparent; margin-bottom: -1px; cursor: pointer; background: none; border-top: 0; border-left: 0; border-right: 0; }
.lm-pop-tab.is-active { color: var(--lm-primary-strong); border-bottom-color: var(--lm-primary); font-weight: 600; }
.lm-pop-list { max-height: 360px; overflow-y: auto; margin: 0; padding: 0; list-style: none; }
.lm-pop-foot { padding: 8px 14px; border-top: 1px solid var(--lm-border); text-align: center; }
.lm-pop-foot a { font-size: 12px; color: var(--lm-primary-strong); font-weight: 600; }
.lm-pop-foot a:hover { text-decoration: underline; }
.lm-pop-empty { padding: 24px; text-align: center; color: var(--lm-muted); font-size: 12.5px; }

/* Notification items */
.lm-pop-item {
  display: grid; grid-template-columns: 32px 1fr auto;
  gap: 10px; padding: 10px 14px;
  border-bottom: 1px solid var(--lm-border-2);
  align-items: flex-start; cursor: pointer;
}
.lm-pop-item:last-child { border-bottom: 0; }
.lm-pop-item:hover { background: var(--lm-surface); }
.lm-pop-item.is-unread { background: rgba(15,111,79,0.04); }
.lm-pop-item.is-unread:hover { background: rgba(15,111,79,0.08); }
.lm-pop-icon {
  width: 32px; height: 32px; border-radius: 8px;
  background: var(--lm-primary-soft); color: var(--lm-primary-strong);
  display: grid; place-items: center; margin-top: 2px; flex-shrink: 0;
}
.lm-pop-icon.tone-blue { background: #dbeafe; color: #1d4ed8; }
.lm-pop-icon.tone-amber { background: #fef3c7; color: #92400e; }
.lm-pop-icon.tone-gold { background: #fef7d6; color: #b45309; }
.lm-pop-icon.tone-slate { background: var(--lm-surface-2); color: var(--lm-muted); }
.lm-pop-text { font-size: 12.5px; color: var(--lm-text); line-height: 1.4; }
.lm-pop-text strong { font-weight: 600; }
.lm-pop-time { font-family: var(--lm-font-mono); font-size: 10.5px; color: var(--lm-muted); white-space: nowrap; padding-top: 2px; }
.lm-pop-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--lm-primary); margin-top: 8px; flex-shrink: 0; }

/* Saved (bookmarks) items */
.lm-saved-item {
  display: grid; grid-template-columns: 40px 1fr auto;
  gap: 10px; padding: 8px 14px; align-items: center; cursor: pointer;
}
.lm-saved-item:hover { background: var(--lm-surface); }
.lm-saved-thumb { width: 40px; height: 40px; border-radius: 8px; overflow: hidden; background: var(--lm-surface); border: 1px solid var(--lm-border); flex-shrink: 0; }
.lm-saved-thumb img { width: 100%; height: 100%; object-fit: cover; }
.lm-saved-name { font-size: 13px; font-weight: 600; color: var(--lm-text); }
.lm-saved-meta { font-size: 11.5px; color: var(--lm-muted); margin-top: 1px; }
.lm-saved-x { width: 24px; height: 24px; border-radius: 6px; display: grid; place-items: center; background: transparent; color: var(--lm-muted-2); border: none; cursor: pointer; }
.lm-saved-x:hover { background: var(--lm-surface-2); color: var(--lm-text); }

/* R7 #3: Share modal — design-exact (lm-share-net + lm-share-qr) */
.lm-share-link { display: flex; gap: 8px; align-items: center; }
.lm-share-link .lm-input { flex: 1; font-family: var(--lm-font-mono); font-size: 12px; }
.lm-share-link-text { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.lm-share-group-label {
  font-size: 11px; font-weight: 600; text-transform: uppercase;
  letter-spacing: 0.06em; color: var(--lm-muted); margin: 4px 0 8px; font-family: var(--lm-font-mono);
}
.lm-share-net { display: grid; gap: 8px; margin-bottom: 12px; }
.lm-share-net-6 { grid-template-columns: repeat(6, 1fr); }
.lm-share-net-4 { grid-template-columns: repeat(4, 1fr); }
.lm-share-net-6 .lm-share-net-btn { padding: 8px 4px; font-size: 10px; gap: 4px; }
.lm-share-net-6 .lm-share-net-ic { width: 32px; height: 32px; border-radius: 7px; }
.lm-profile-page .lm-share-net-btn,
.lm-share-net-btn {
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  padding: 10px 6px;
  border-radius: 10px;
  border: 1px solid var(--lm-border) !important;
  background: #fff !important;
  font-size: 11px; color: var(--lm-text);
  font-weight: 500;
  cursor: pointer;
  transition: border-color .12s, transform .08s;
  text-align: center;
  line-height: 1.2;
  min-width: 0;
}
.lm-share-net-btn:hover { border-color: var(--lm-primary) !important; }  /* cursor-fix v3: removed translateY(-1px) */
.lm-share-net-ic {
  width: 36px; height: 36px;
  display: grid; place-items: center;
  border-radius: 8px;
  color: #fff;
  flex-shrink: 0;
}
.lm-share-net-btn span:last-child {
  display: -webkit-box;
  -webkit-line-clamp: 1;
  line-clamp: 1;
  -webkit-box-orient: vertical;
  overflow: hidden;
  word-break: break-word;
}

.lm-share-qr {
  display: grid; grid-template-columns: 144px 1fr; gap: 16px; align-items: start;
  margin-bottom: 4px;
}
.lm-share-qr-box {
  display: grid; place-items: center;
  width: 144px; height: 144px;
  border: 1px solid var(--lm-border);
  background: #fff;
  border-radius: 10px;
  color: var(--lm-text);
}
.lm-share-qr-img { width: 120px; height: 120px; display: grid; place-items: center; }
/* qr-code-styling renders a 480px <canvas> into this box — scale it down. */
.lm-share-qr-img canvas,
.lm-share-qr-img img { width: 120px !important; height: 120px !important; display: block; }
.lm-share-qr-meta { display: flex; flex-direction: column; gap: 8px; }
.lm-share-qr-title { font-family: var(--lm-font-mono); font-size: 12px; color: var(--lm-primary-strong); font-weight: 600; }

/* R20b: Theme toggle — PILL (round) per prototype design */
.lm-profile-page .lm-theme-toggle,
.lm-rail-footer .lm-theme-toggle,
.lm-theme-toggle {
  width: 38px !important; height: 22px !important;
  background: var(--lm-surface-2) !important;
  border: 1px solid var(--lm-border) !important;
  border-radius: 999px !important;
  cursor: pointer !important;
  position: relative !important;
  transition: background .15s, border-color .15s;
  padding: 0 !important; flex-shrink: 0;
  outline: none !important;
}
.lm-profile-page .lm-theme-toggle:hover,
.lm-theme-toggle:hover { background: #eef2f6 !important; border-color: var(--lm-muted-2) !important; }
.lm-theme-knob {
  position: absolute;
  top: 1px; left: 1px;
  width: 18px; height: 18px; border-radius: 50%;
  background: #fff;
  box-shadow: 0 1px 3px rgba(15,23,42,0.18);
  display: grid; place-items: center;
  color: #b45309;
  transition: transform .22s cubic-bezier(.5,0,.4,1.4), color .15s, background .15s;
}
/* R20n: Knob position + icon visibility driven by html[data-lm-theme] attribute,
   which is set synchronously by inline head script — zero flash on refresh.
   Default (light): show sun, hide moon, knob at left.
   Dark: show moon, hide sun, knob shifted right. */
.lm-theme-icon-light { display: block; }
.lm-theme-icon-dark { display: none; }
html[data-lm-theme="dark"] .lm-theme-knob { transform: translateX(16px); }
html[data-lm-theme="dark"] .lm-theme-icon-light { display: none; }
html[data-lm-theme="dark"] .lm-theme-icon-dark { display: block; }
/* Legacy class-based fallback (kept for backwards compat with prior JS) */
.lm-theme-knob.is-dark {
  transform: translateX(16px);
  color: #1e293b;
  background: #f1f5f9;
}
html[data-lm-theme="dark"] .lm-theme-toggle { background: var(--lm-primary-soft); border-color: var(--lm-primary-soft-2); }

/* R10 #3: Language selector — RECTANGULAR (8px radius), not pill */
.lm-lang-wrap { position: relative; }
.lm-profile-page .lm-lang-trigger,
.lm-rail-footer .lm-lang-trigger,
.lm-lang-trigger {
  display: inline-flex !important; align-items: center !important; gap: 6px !important;
  padding: 6px 12px !important;
  background: #F8FAFC !important;
  border: 1px solid #E2E8F0 !important;
  border-radius: 8px !important;
  cursor: pointer !important;
  transition: background .15s, border-color .15s;
  font-size: 11.5px !important; font-weight: 500 !important;
  color: var(--lm-text) !important;
  outline: none !important;
  height: auto !important;
  line-height: 1.2 !important;
}
.lm-profile-page .lm-lang-trigger:hover,
.lm-lang-trigger:hover { background: #F1F5F9 !important; border-color: #CBD5E1 !important; color: var(--lm-primary-strong) !important; }
.lm-lang-flag { font-size: 13px; line-height: 1; }
.lm-lang-label { font-size: 11px; }
.lm-lang-menu {
  position: absolute; bottom: calc(100% + 4px); right: 0;
  min-width: 140px; background: #fff;
  border: 1px solid var(--lm-border); border-radius: 10px;
  box-shadow: 0 -8px 24px rgba(15,23,42,0.12);
  padding: 4px; z-index: 200; animation: lm-menu-in .12s ease;
  display: none;
}
.lm-lang-menu.is-open { display: block; }
.lm-lang-item {
  display: flex; align-items: center; gap: 8px;
  padding: 7px 10px; border-radius: 6px; font-size: 12px;
  color: var(--lm-text); cursor: pointer; background: none; border: none; width: 100%; text-align: left;
}
.lm-lang-item:hover { background: var(--lm-surface); }
.lm-lang-item.is-active { color: var(--lm-primary-strong); font-weight: 600; }
.lm-lang-item svg { color: var(--lm-primary); margin-left: auto; }

/* ══════════════════════════════════════════════════════════════
   R9: PORTFOLIO LIGHTBOX (pl-*) — design-exact
   ══════════════════════════════════════════════════════════════ */
.pl-scrim {
  position: fixed; inset: 0; z-index: 1000;
  background: rgba(8, 12, 18, 0.92);
  display: none;
  align-items: center; justify-content: center;
  /* R19: centered modal with breathing space; counter pinned higher so it doesn't crowd modal */
  padding: 56px 80px 24px;
  animation: pl-fadein 180ms ease-out;
}
.pl-scrim.is-open { display: flex; }
@keyframes pl-fadein { from { opacity: 0; } to { opacity: 1; } }

.pl-frame {
  display: grid;
  grid-template-columns: minmax(420px, 1fr) 440px;
  width: 100%;
  max-width: 1180px;
  height: calc(100vh - 80px);
  max-height: 820px;
  background: #fff;
  border-radius: 18px;
  overflow: hidden;
  box-shadow: 0 30px 80px rgba(0, 0, 0, 0.5);
  animation: pl-zoomin 220ms cubic-bezier(0.16, 1, 0.3, 1);
  margin: 0 auto;
}
@keyframes pl-zoomin {
  from { opacity: 0; transform: scale(0.96); }
  to   { opacity: 1; transform: scale(1); }
}

/* R16: Close button — high contrast white circle, always visible top-right */
.pl-close-btn {
  position: fixed !important; top: 16px !important; right: 16px !important;
  width: 40px !important; height: 40px !important;
  border-radius: 50% !important;
  background: rgba(255, 255, 255, 0.16) !important;
  border: 1px solid rgba(255, 255, 255, 0.22) !important;
  color: #fff !important; cursor: pointer;
  display: grid !important; place-items: center;
  backdrop-filter: blur(10px);
  transition: background 120ms;
  z-index: 1010 !important;
  outline: none;
}
.pl-close-btn:hover { background: rgba(255, 255, 255, 0.30) !important; }
.pl-close-btn svg { color: #fff; width: 20px; height: 20px; }

/* R13 #4: nav arrows — larger contrast circles always visible on dark scrim */
.pl-nav {
  position: fixed;
  top: 50%; transform: translateY(-50%);
  width: 44px; height: 44px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.14) !important;
  border: 1px solid rgba(255, 255, 255, 0.18) !important;
  color: #fff !important; cursor: pointer;
  display: grid !important; place-items: center;
  backdrop-filter: blur(8px);
  transition: background 120ms;
  z-index: 1001;
  outline: none;
}
.pl-nav svg { color: #fff; width: 22px; height: 22px; }
.pl-nav:hover { background: rgba(255, 255, 255, 0.28) !important; }
.pl-nav-prev { left: 24px; }
.pl-nav-next { right: 24px; }

/* Phase 2.9 / 8.2.5 — when the embedded iframe (YouTube/Vimeo/etc.)
   is in native fullscreen mode, the browser promotes the iframe to
   its own top layer but our position:fixed lightbox chrome can still
   paint a thin flicker strip at the screen edge. Force ALL the
   surrounding chrome to display:none (corrected selectors —
   .pl-close-btn was the wrong .pl-close before, same with the
   .pl-media-gallery vs the non-existent .pl-gallery). The body gets
   .lm-pl-fs from LM.initLightboxFullscreenGuard. */
body.lm-pl-fs .pl-nav,
body.lm-pl-fs .pl-close-btn,
body.lm-pl-fs .pl-counter,
body.lm-pl-fs .pl-dots,
body.lm-pl-fs .pl-side,
body.lm-pl-fs .pl-media-gallery,
body.lm-pl-fs .pl-media-edit,
body.lm-pl-fs .pl-media-tag,
body.lm-pl-fs .pl-media-cat,
body.lm-pl-fs .pl-media-date,
body.lm-pl-fs #lm-pl-counter {
  display: none !important;
}
/* Drop the frame's chrome (border-radius/shadow/two-column grid) so
   the iframe sits edge-to-edge with no gap or rounded corners
   leaking the scrim through. */
body.lm-pl-fs .pl-frame {
  grid-template-columns: 1fr !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  background: #000 !important;
  max-width: none !important;
  height: 100vh !important;
  max-height: none !important;
}
body.lm-pl-fs .pl-media {
  background: #000 !important;
}
/* Scrim itself: kill padding + bg so nothing peeks behind the
   fullscreen iframe. */
body.lm-pl-fs .pl-scrim {
  padding: 0 !important;
  background: #000 !important;
  overflow: hidden !important;
}
body.lm-pl-fs { overflow: hidden !important; }
/* Phase 8.2.5b — kill the right-edge scrollbar GUTTER that shows
   through even with overflow:hidden in some browsers (Chrome on
   macOS reserves a few px for the classic scrollbar even when it
   shouldn't render one). Both <html> and <body> need the override
   since either can own the viewport scroll context. */
html.lm-pl-fs,
body.lm-pl-fs {
  overflow: hidden !important;
  scrollbar-width: none !important;     /* Firefox */
  -ms-overflow-style: none !important;  /* IE/Edge */
  padding-right: 0 !important;
  margin-right: 0 !important;
}
html.lm-pl-fs::-webkit-scrollbar,
body.lm-pl-fs::-webkit-scrollbar,
body.lm-pl-fs .pl-scrim::-webkit-scrollbar { display: none !important; }

/* R19: counter pinned at top with safe gap between it and centered modal */
.pl-counter {
  position: fixed;
  top: 16px; left: 50%; transform: translateX(-50%);
  padding: 3px 12px;
  background: rgba(255, 255, 255, 0.10);
  border: 1px solid rgba(255, 255, 255, 0.14);
  border-radius: 999px;
  backdrop-filter: blur(10px);
  color: rgba(255, 255, 255, 0.95);
  font-size: 11.5px; font-weight: 500;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.04em;
  z-index: 1010;
}

/* Media pane — flex centering instead of grid so max-height: 100% on the
   <img> resolves to the actual pane height. With grid place-items: center,
   percentage max-* on the image resolves against the auto-sized track,
   which lets tall portraits push past 820px and crop to the centered area
   (= face only). Flex column with center alignment + min-height: 0 makes
   the inline max-width/max-height: 100% on the img clamp correctly. */
.pl-media {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  background: #0f172a;
  min-width: 0;
  min-height: 0;
}
.pl-media-stripes {
  /* R20V Phase 3.4: real photos render now — diagonal stripe overlay
     was a placeholder texture; hide it so the photo shows cleanly. */
  display: none;
}
.pl-media-tag {
  position: absolute; top: 14px; left: 14px;
  padding: 5px 10px;
  background: rgba(0, 0, 0, 0.55);
  color: #fff;
  font-size: 11px; font-weight: 600;
  letter-spacing: 0.05em;
  border-radius: 6px;
  backdrop-filter: blur(4px);
  z-index: 2;
}

/* R20V Phase 3.4: gallery badge — top-right of media pane, vertically
   aligned with .pl-media-tag (same `top: 14px`). Same dark-translucent
   chip + photo-count, plus optional album title underneath. */
/* Phase 7.10 P3 — lightbox overlay chips reuse the .lm-bpf-cat /
   .lm-bpf-date base styles from the talent grid, but need different
   positioning + bigger text since the lightbox photo is much larger.
   Category top-left, date bottom-right. */
.pl-media .pl-media-cat {
  position: absolute;
  /* Phase 2.9 — also moved to bottom-left to mirror the grid change.
     The top-right gallery/album badge can be long; keeping category
     bottom-left avoids the collision. */
  bottom: 14px;
  left: 14px;
  top: auto;          /* explicitly reset any inherited top */
  z-index: 3;
  font-size: 11px;
  padding: 5px 10px;
}
.pl-media .pl-media-date {
  position: absolute;
  right: 14px;
  bottom: 14px;
  z-index: 3;
  font-size: 11px;
  padding: 5px 10px;
  gap: 6px;
}
.pl-media .pl-media-date svg { width: 11px; height: 11px; }

/* Phase 2.9 — album-name pill bottom-LEFT of lightbox photo. Mirror
   .pl-media-date chip styling so both bottom corners feel symmetric.
   Same dark-transparent + blur as the rest of the overlay chips. */
.pl-media .pl-media-album-pill {
  position: absolute;
  left: 14px;
  bottom: 14px;
  z-index: 3;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 5px 10px;
  border-radius: 6px;
  background: rgba(15, 23, 42, .65);
  color: #fff;
  font-size: 11px;
  font-weight: 600;
  max-width: 60%;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border: 1px solid rgba(255, 255, 255, .18);
}
.pl-media .pl-media-album-pill svg { flex: none; opacity: .9; }

/* Phase 7.10 P3 — Edit overlay: top-right of media pane, sibling to the
   gallery indicator. When the gallery indicator is visible we offset it
   to sit BELOW the edit button so they don't collide. */
.pl-media-edit {
  position: absolute;
  top: 14px;
  right: 14px;
  z-index: 3;
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  background: rgba(0, 0, 0, .55);
  color: #fff;
  border: 1px solid rgba(255, 255, 255, .18);
  border-radius: 8px;
  cursor: pointer;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  transition: background .15s, border-color .15s, transform .12s;
}
.pl-media-edit:hover {
  background: rgba(0, 0, 0, .75);
  border-color: rgba(255, 255, 255, .35);
  transform: scale(1.04);
}
.pl-media-edit svg { color: #fff; }
/* Phase 2.9 — combined album indicator pill: ALBUM NAME | icon N/M
   on one horizontal row, top-right, LEFT of the pencil edit overlay.
   Mirrors the grid stack-badge layout (.lm-pf-stack-badge) so the
   look reads the same in grid and lightbox. */
.pl-media-gallery {
  position: absolute;
  top: 14px;
  right: 60px;                /* leave 46px for the 34px pencil at right:14px + gap */
  z-index: 2;
  display: inline-flex;       /* one row, not column */
  flex-direction: row;
  align-items: center;
  gap: 0;                     /* divider handled by border-right on title */
  max-width: 320px;
  pointer-events: none;
  padding: 5px 10px;
  background: rgba(0, 0, 0, .65);
  border-radius: 8px;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  color: #fff;
  font-family: var(--lm-font-mono, ui-monospace, monospace);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .04em;
  text-transform: uppercase;
  border: 1px solid rgba(255, 255, 255, .15);
}
/* When pencil overlay is hidden (non-owner), pill snaps to the corner. */
.pl-media-edit[hidden] ~ .pl-media-gallery { right: 14px; }

.pl-media-gallery-title {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 200px;
  padding-right: 7px;
  border-right: 1px solid rgba(255, 255, 255, .25);
  margin-right: 7px;
}
.pl-media-gallery-icon {
  display: inline-flex;
  align-items: center;
  gap: 5px;
}
.pl-media-gallery-icon svg { display: block; opacity: .9; }
.pl-media-gallery-count { line-height: 1; }

/* Hide title/divider when there's no album name to show (count-only). */
.pl-media-gallery-title:empty { display: none; }
.pl-media-gallery-title:empty + .pl-media-gallery-icon { padding-left: 0; }
.pl-media-watermark {
  position: absolute; bottom: 18px; left: 18px;
  color: rgba(255, 255, 255, 0.85);
  font-size: 13px; letter-spacing: 0.02em;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
  z-index: 2;
}
.pl-media-watermark-brand { font-weight: 600; }

/* Sidebar */
.pl-side {
  display: grid;
  grid-template-rows: auto auto auto 1fr auto auto;
  background: #fff;
  border-left: 1px solid var(--lm-border);
  min-height: 0;
}
.pl-side-head {
  display: flex; align-items: center; gap: 10px;
  padding: 14px 16px;
  border-bottom: 1px solid var(--lm-border);
}
.pl-side-head-id { flex: 1; min-width: 0; }
.pl-side-head-name {
  display: flex; align-items: center; gap: 6px;
  font-size: 14px; font-weight: 600; color: var(--lm-text);
}
.pl-side-head-meta {
  font-size: 12px; color: var(--lm-muted);
  margin-top: 1px;
}
.pl-side-head-meta span { color: var(--lm-text); font-weight: 500; }
.pl-side-head-more-wrap {
  position: relative;
  flex: 0 0 auto;     /* don't let the head-id flexbox squeeze it out */
  z-index: 4;          /* above .pl-side-caption etc. so click always lands */
}
.pl-side-head-more {
  width: 36px; height: 36px;     /* slightly bigger hit-area — was sometimes hard to hit */
  border-radius: 50%;
  border: none;
  background: transparent;
  color: var(--lm-muted);
  cursor: pointer;
  display: grid; place-items: center;
  position: relative;
  z-index: 5;
}
.pl-side-head-more:hover { background: var(--lm-surface-2); color: var(--lm-text); }
.pl-side-head-more:active { background: var(--lm-surface, #f8fafc); }

/* R20V Phase 3.4: post-actions dropdown menu (3-dots) */
.lm-pl-more-menu {
  position: absolute;
  top: 100%;
  right: 0;
  margin-top: 6px;
  min-width: 240px;
  background: var(--lm-bg, #fff);
  border: 1px solid var(--lm-border, #e2e8f0);
  border-radius: 12px;
  box-shadow: 0 12px 32px rgba(15, 23, 42, 0.12), 0 2px 6px rgba(15, 23, 42, 0.06);
  padding: 6px;
  z-index: 100;
  font-size: 14px;
  animation: lm-pl-more-fadein 140ms ease-out;
}
@keyframes lm-pl-more-fadein {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: translateY(0); }
}
.lm-pl-more-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 9px 12px;
  border-radius: 8px;
  color: var(--lm-text, #0f172a);
  cursor: pointer;
  font-weight: 500;
  text-decoration: none;
  transition: background .1s;
}
.lm-pl-more-item:hover {
  background: var(--lm-surface, #f8fafc);
  color: var(--lm-text, #0f172a);
  text-decoration: none;
}
.lm-pl-more-item svg {
  flex: 0 0 auto;
  color: var(--lm-muted, #64748b);
}
.lm-pl-more-item:hover svg {
  color: var(--lm-text, #0f172a);
}
.lm-pl-more-item-danger {
  color: #dc2626;
}
.lm-pl-more-item-danger svg { color: #dc2626; }
.lm-pl-more-item-danger:hover {
  background: #fef2f2;
  color: #b91c1c;
}
.lm-pl-more-item-danger:hover svg { color: #b91c1c; }

/* Phase 8.2.6 — armed state for the two-step "Confirm delete?" pattern
   on lightbox more-menu Delete Post item. Full red fill, pulsing ring,
   to make the second click feel decisive. JS toggles
   .lm-pl-more-item-armed and swaps the label text. */
.lm-pl-more-item.lm-pl-more-item-armed {
  background: var(--lm-danger, #c0392b) !important;
  color: #fff !important;
  animation: lm-pl-armed-pulse 1.1s ease-in-out infinite;
}
.lm-pl-more-item.lm-pl-more-item-armed svg { color: #fff !important; }
.lm-pl-more-item.lm-pl-more-item-armed:hover {
  background: var(--lm-danger, #c0392b) !important;
  color: #fff !important;
}
@keyframes lm-pl-armed-pulse {
  0%, 100% { box-shadow: inset 0 0 0 0 rgba(255, 255, 255, .25); }
  50%      { box-shadow: inset 0 0 0 3px rgba(255, 255, 255, .35); }
}
.lm-pl-more-divider {
  height: 1px;
  background: var(--lm-border, #e2e8f0);
  margin: 4px 8px;
}
.lm-pl-more-label { flex: 1 1 auto; }

/* R20V Phase 3.4: side-pane needs position:relative so the repost
   mini-menu (positioned absolute) anchors inside the side panel. */
.pl-side.post { position: relative; }

/* R20V Phase 3.4: like button is a Sngine .reactions-wrapper now —
   layout it like a normal action button. .reactions-container popover
   uses position:fixed (Sngine renders it that way) so no extra anchor
   needed here. The icon + count keep our .pl-act styling. */
.pl-act.pl-act-reaction.reactions-wrapper {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  user-select: none;
}
.pl-act.pl-act-reaction .reaction-btn { display: inline-flex; align-items: center; }
.pl-act.pl-act-reaction .reaction-btn-icon { display: inline-flex; align-items: center; line-height: 0; }
.pl-act.pl-act-reaction .reaction-btn-name { display: none; }
.pl-act.pl-act-reaction.reactions-wrapper.js_unreact-post .reaction-btn-icon svg { fill: currentColor; }

/* Repost mini-menu — anchored above the action bar, aligned under the
   repost icon (3rd action button). */
.lm-pl-repost-menu {
  position: absolute;
  z-index: 100;
  bottom: 80px;  /* above .pl-side-actions + composer */
  left: 130px;   /* under the repost icon */
  background: var(--lm-bg, #fff);
  border: 1px solid var(--lm-border, #e2e8f0);
  border-radius: 12px;
  box-shadow: 0 12px 32px rgba(15, 23, 42, 0.12), 0 2px 6px rgba(15, 23, 42, 0.06);
  padding: 6px;
  min-width: 200px;
  animation: lm-pl-more-fadein 140ms ease-out;
}
.lm-pl-repost-item {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  padding: 9px 12px;
  border: 0;
  background: transparent;
  border-radius: 8px;
  color: var(--lm-text, #0f172a);
  font-family: inherit;
  font-size: 14px;
  font-weight: 500;
  cursor: pointer;
  text-align: left;
  transition: background .1s;
}
.lm-pl-repost-item:hover {
  background: var(--lm-surface, #f8fafc);
}
.lm-pl-repost-item svg {
  flex: 0 0 auto;
  color: var(--lm-muted, #64748b);
}

.pl-side-caption {
  padding: 12px 16px;
  border-bottom: 1px solid var(--lm-border);
}
.pl-side-caption-text {
  font-size: 13px; line-height: 1.5; color: var(--lm-text);
  text-wrap: pretty;
}
/* Migration 076 — title shown bold + slightly larger so the user can
   distinguish it from the longer description body underneath. Block-
   level so the description sits on its own line below — no <br> needed
   in the JS render (a <br> after a block produces a visible empty line). */
.lm-pl-caption-title {
  display: block;
  font-weight: 700;
  font-size: 14px;
  color: var(--lm-text);
  line-height: 1.3;
  margin-bottom: 1px;
}
.pl-side-caption-name { font-weight: 600; color: var(--lm-text); margin-right: 2px; }
.pl-side-caption-tags { color: var(--lm-primary); font-weight: 500; font-size: 12px; }
.pl-side-caption-meta {
  display: flex; align-items: center; gap: 6px;
  margin-top: 6px;
  font-size: 11px; color: var(--lm-muted);
}
.pl-side-caption-meta svg { vertical-align: -1px; }
.pl-side-pinned {
  display: inline-flex; align-items: center; gap: 3px;
  color: var(--lm-primary); font-weight: 500;
}

.pl-side-sortrow {
  display: flex; align-items: center; justify-content: space-between;
  padding: 8px 16px;
  border-bottom: 1px solid var(--lm-border);
  background: var(--lm-surface);
}
.pl-side-cmtcount {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 12px; font-weight: 500; color: var(--lm-muted);
}
.pl-side-sort { position: relative; }
.pl-side-sort-btn {
  display: inline-flex !important; align-items: center; gap: 5px;
  padding: 5px 9px !important;
  background: #fff !important;
  border: 1px solid var(--lm-border) !important;
  border-radius: 6px !important;
  font-size: 11px !important; font-weight: 500 !important;
  color: var(--lm-text) !important; cursor: pointer;
  transition: border-color 120ms;
  outline: none;
}
.pl-side-sort-btn:hover { border-color: var(--lm-muted-2) !important; }
.pl-side-sort-btn svg { color: var(--lm-muted); flex-shrink: 0; }
/* R16: Sort dropdown pop (design-exact) */
.pl-side-sort-pop {
  position: absolute; top: calc(100% + 4px); right: 0;
  width: 180px;
  background: #fff;
  border: 1px solid var(--lm-border);
  border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
  z-index: 10;
  overflow: hidden;
  display: none;
  animation: lm-menu-pop .14s ease;
}
.pl-side-sort.is-open .pl-side-sort-pop { display: block; }
.pl-side-sort-item {
  width: 100%;
  display: flex !important; align-items: center; gap: 8px;
  padding: 8px 12px;
  background: transparent !important;
  border: none !important;
  font-family: var(--lm-font);
  font-size: 12px; color: var(--lm-text);
  cursor: pointer;
  text-align: left;
}
.pl-side-sort-item:hover { background: var(--lm-surface) !important; }
.pl-side-sort-item.is-on { color: var(--lm-primary-strong); font-weight: 600; }
.pl-side-sort-item span { flex: 1; }
.pl-side-sort-item svg { color: var(--lm-muted); flex-shrink: 0; }
.pl-side-sort-item.is-on > svg:first-child { color: var(--lm-primary-strong); }
.pl-side-sort-item .lm-pl-sort-check { color: var(--lm-primary-strong); margin-left: auto; opacity: 0; }
.pl-side-sort-item.is-on .lm-pl-sort-check { opacity: 1; }

.pl-side-cmts {
  overflow-y: auto;
  padding: 12px 16px;
  display: flex; flex-direction: column; gap: 14px;
  min-height: 0;
}
/* Comments come from __feeds_comment.tpl wrapped in <li>, but this container is
   a <div> (not a <ul>) — so the orphan <li> would show its default list bullet.
   Kill the marker. */
.pl-side-cmts li { list-style: none; }
.pl-side-cmts > li { display: block; }
.pl-side-cmts::-webkit-scrollbar { width: 6px; }
.pl-side-cmts::-webkit-scrollbar-thumb { background: var(--lm-border); border-radius: 3px; }
.pl-side-cmts-empty {
  text-align: center;
  padding: 32px 0;
  color: var(--lm-muted);
  font-size: 13px;
}

/* Avatar */
.pl-avatar {
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: 50%;
  color: #fff; font-weight: 600;
  letter-spacing: 0.02em;
  flex-shrink: 0;
  user-select: none;
  overflow: hidden;
}

/* Single comment */
.pl-cmt { display: flex; gap: 10px; align-items: flex-start; }
.pl-cmt-body { flex: 1; min-width: 0; }
.pl-cmt-bubble {
  background: var(--lm-surface);
  border: 1px solid var(--lm-border-2);
  border-radius: 14px;
  padding: 8px 12px 10px;
}
.pl-cmt-head {
  display: flex; align-items: center; gap: 6px;
  flex-wrap: wrap;
  margin-bottom: 2px;
}
.pl-cmt-name {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 13px; font-weight: 600; color: var(--lm-text);
}
.pl-cmt-check {
  display: inline-flex;
  color: var(--lm-primary);
  vertical-align: -1px;
}
.pl-cmt-vip {
  display: inline-flex; align-items: center; gap: 2px;
  padding: 1px 6px 1px 5px;
  background: linear-gradient(135deg, #fef9c3, #fde68a);
  color: #92400e;
  border-radius: 4px;
  font-size: 9px; font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.pl-cmt-vip svg { color: #b8860b; }
/* R15 #4: tier variants */
.pl-cmt-elite { background: linear-gradient(135deg, #0F172A, #334155); color: #FFD580; }
.pl-cmt-elite svg { color: #FFD580; }
.pl-cmt-pro { background: var(--lm-primary-soft); color: var(--lm-primary-strong); }
.pl-cmt-author {
  padding: 1px 6px;
  background: var(--lm-primary-soft);
  color: var(--lm-primary-strong);
  border-radius: 4px;
  font-size: 9px; font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.pl-cmt-handle { font-size: 11px; color: var(--lm-muted); }
.pl-cmt-text {
  font-size: 13px; line-height: 1.45; color: var(--lm-text);
  word-wrap: break-word;
}

.pl-cmt-reactions {
  display: flex; gap: 4px; flex-wrap: wrap;
  margin-top: 6px;
}
.pl-cmt-react-pill {
  display: inline-flex; align-items: center; gap: 3px;
  padding: 2px 7px;
  background: #fff;
  border: 1px solid var(--lm-border);
  border-radius: 12px;
  font-size: 11px; font-weight: 500;
  color: var(--lm-text);
}

.pl-cmt-meta {
  display: flex; align-items: center; gap: 12px;
  margin-top: 4px;
  padding: 0 6px;
  font-size: 11px; color: var(--lm-muted);
}
.pl-cmt-meta-btn {
  display: inline-flex; align-items: center; gap: 3px;
  background: transparent; border: none;
  font-size: 11px; color: var(--lm-muted);
  font-weight: 500; cursor: pointer; padding: 0;
}
.pl-cmt-meta-btn:hover { color: var(--lm-text); }
.pl-cmt-meta-btn.is-on { color: #e11d48; }
.pl-cmt-meta-time { color: var(--lm-muted-2); font-weight: normal; }

.pl-cmt-replies {
  margin-top: 10px;
  padding-left: 12px;
  border-left: 2px solid var(--lm-border-2);
  display: flex; flex-direction: column; gap: 10px;
}
.pl-cmt.is-reply .pl-cmt-bubble { background: #fff; border-color: var(--lm-border-2); }
.pl-cmt.is-reply .pl-cmt-name { font-size: 12px; }
.pl-cmt.is-reply .pl-cmt-text { font-size: 12px; }

/* Action bar */
.pl-side-actions {
  display: flex; align-items: center; gap: 4px;
  padding: 10px 12px;
  border-top: 1px solid var(--lm-border);
  background: #fff;
}
.pl-act {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 7px 10px;
  background: transparent; border: none;
  border-radius: 8px;
  font-size: 12px; font-weight: 500;
  color: var(--lm-muted);
  cursor: pointer;
  transition: background 120ms, color 120ms;
  font-variant-numeric: tabular-nums;
}
.pl-act:hover { background: var(--lm-surface); color: var(--lm-text); }
.pl-act.is-on.is-like { color: #e11d48; background: #fef2f2; }
.pl-act.is-on.is-repost { color: #16a34a; background: #f0fdf4; }
.pl-act.is-on.is-bookmark {
  color: var(--lm-primary, #2f8a5f);
  background: rgba(47, 138, 95, 0.10);
}
/* R20V Phase 3.4: Bookmark stays green whenever its count span shows
   "Saved" — CSS-only state independent of class toggles, so reopening
   the lightbox or re-running render() can't lose the green fill. */
#lm-pl-bookmark:has(#lm-pl-bookmark-count:not(:empty)) {
  color: var(--lm-primary, #2f8a5f) !important;
  background: rgba(47, 138, 95, 0.10) !important;
}
#lm-pl-bookmark:has(#lm-pl-bookmark-count:not(:empty)) svg {
  fill: var(--lm-primary, #2f8a5f) !important;
  stroke: var(--lm-primary, #2f8a5f) !important;
}
/* R20V Phase 3.4: fill the bookmark / like / repost SVGs when active so
   the icon visually flips state (outline → solid), like Twitter/IG. */
.pl-act.is-on svg { fill: currentColor; stroke: currentColor; }
.pl-act-spacer { flex: 1; }
.pl-act-share { padding: 7px; gap: 0; }

/* R20V Phase 3.4: Pin action button — owner-only, before Share. When
   pinned (is-on), the icon turns LM-green so the active state is clear. */
.pl-act-pin { padding: 7px; gap: 0; }
.pl-act-pin.is-on {
  color: var(--lm-primary, #2f8a5f);
  background: rgba(47, 138, 95, 0.10);
}
.pl-act-pin.is-on svg {
  fill: var(--lm-primary, #2f8a5f);
}

/* Composer */
.pl-side-composer {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 14px 14px;
  border-top: 1px solid var(--lm-border);
  background: var(--lm-surface);
}
.pl-composer-input-wrap {
  flex: 1;
  position: relative;
  display: flex; align-items: center;
  background: #fff;
  border: 1px solid var(--lm-border);
  border-radius: 18px;
  padding-right: 6px;
  transition: border-color 120ms;
}
.pl-composer-input-wrap:focus-within { border-color: var(--lm-primary); }
.pl-composer-input {
  flex: 1; height: 36px;
  padding: 0 14px;
  background: transparent; border: none;
  font-size: 13px; color: var(--lm-text);
  outline: none;
}
.pl-composer-tools { display: flex; gap: 2px; }
.pl-composer-tool {
  width: 28px; height: 28px;
  background: transparent !important;
  border: none !important;
  border-radius: 50% !important;
  color: var(--lm-muted) !important;
  cursor: pointer;
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  white-space: nowrap;
  overflow: hidden;
  padding: 0 !important;
}
.pl-composer-tool:hover { background: var(--lm-surface) !important; color: var(--lm-text) !important; }
.pl-composer-tool > span { display: inline-block; line-height: 1; white-space: nowrap; }
/* R13 #5: GIF letters single-line uppercase tight */
.pl-composer-tool[title="GIF"] > span {
  font-size: 9px !important;
  font-weight: 700 !important;
  letter-spacing: 0.5px !important;
  white-space: nowrap !important;
  display: inline-block !important;
}

/* R13 #5: Post button — green and visible when active */
.pl-side-composer .pl-composer-send,
.pl-composer-send {
  padding: 8px 16px !important;
  background: var(--lm-primary) !important;
  color: #fff !important;
  border: 1px solid var(--lm-primary) !important;
  border-radius: 18px !important;
  font-size: 13px !important; font-weight: 600 !important;
  cursor: pointer;
  opacity: 0.4;
  transition: opacity 120ms, background 120ms;
}
.pl-composer-send.is-active { opacity: 1 !important; }
.pl-composer-send:hover.is-active { background: var(--lm-primary-strong) !important; }
.pl-composer-send:disabled { cursor: not-allowed; }

/* Responsive */
@media (max-width: 960px) {
  .pl-scrim { padding: 0; }
  .pl-frame {
    grid-template-columns: 1fr;
    grid-template-rows: 50vh 1fr;
    border-radius: 0;
    height: 100vh;
    max-height: none;
  }
  .pl-nav { display: none; }
  .pl-close-btn { background: rgba(0,0,0,0.5); }
}

/* R11 #5: Danger button (Report submit, Block confirm) */
.lm-profile-page .lm-btn-danger,
.lm-btn-danger {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  background: #b91c1c !important;
  color: #fff !important;
  border: 1px solid #b91c1c !important;
  font-weight: 600 !important;
  cursor: pointer;
  transition: background .12s, border-color .12s;
}
.lm-profile-page .lm-btn-danger:hover,
.lm-btn-danger:hover { background: #991b1b !important; border-color: #991b1b !important; color: #fff !important; }

/* R12: Custom dropdown (lm-cdrop) — used inside booking modal where native <select> misbehaves */
.lm-cdrop { position: relative; }
/* R13 #7: gray border in resting state — same look as other modal inputs */
.lm-cdrop-btn {
  display: flex !important; align-items: center; justify-content: space-between; gap: 8px;
  width: 100%; padding: 10px 12px !important;
  background: #fff !important;
  border: 1.5px solid var(--lm-border) !important;
  border-radius: 8px !important;
  font: inherit;
  font-size: 13.5px !important; color: var(--lm-text) !important;
  cursor: pointer;
  outline: none;
  transition: border-color .12s;
}
.lm-cdrop-btn:hover { border-color: var(--lm-muted-2) !important; }
.lm-cdrop-btn:focus-visible,
.lm-cdrop.is-open .lm-cdrop-btn { border-color: var(--lm-primary) !important; }
.lm-cdrop-label[data-placeholder="1"] { color: var(--lm-muted-2); }
.lm-cdrop-btn svg { color: var(--lm-muted); flex-shrink: 0; transition: transform .15s; }
.lm-cdrop.is-open .lm-cdrop-btn svg { transform: rotate(180deg); }
.lm-cdrop-menu {
  position: absolute; top: calc(100% + 4px); left: 0; right: 0;
  background: #fff;
  border: 1px solid var(--lm-border);
  border-radius: 10px;
  box-shadow: 0 12px 32px -8px rgba(15,23,42,0.20), 0 4px 12px -4px rgba(15,23,42,0.10);
  padding: 4px;
  z-index: 60;
  max-height: 240px;
  overflow-y: auto;
  display: none;
  animation: lm-menu-pop .14s ease;
}
.lm-cdrop.is-open .lm-cdrop-menu { display: block; }
.lm-cdrop-item {
  display: block; width: 100%;
  padding: 9px 12px;
  background: transparent;
  border: none;
  border-radius: 6px;
  font-size: 13px; font-weight: 500;
  color: var(--lm-text);
  text-align: left;
  cursor: pointer;
  transition: background .1s;
}
.lm-cdrop-item:hover { background: var(--lm-surface); }
.lm-cdrop-item.is-active { color: var(--lm-primary-strong); font-weight: 600; background: var(--lm-primary-soft); }

/* Avatar slots for the Book-as picker — opt-in via .lm-cdrop-has-pic
   on the .lm-cdrop root + .lm-cdrop-item-pic on each option. Other
   cdrop usages (service, offer unit, etc.) don't include the markup
   so they're unaffected. */
.lm-cdrop-has-pic .lm-cdrop-pic {
  width: 24px;
  height: 24px;
  border-radius: 6px;
  object-fit: cover;
  flex: none;
  background: var(--lm-surface);
  border: 1px solid var(--lm-border-2, var(--lm-border));
}
.lm-cdrop-has-pic .lm-cdrop-btn { padding-left: 10px !important; }
.lm-cdrop-has-pic .lm-cdrop-label {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.lm-cdrop-item-pic {
  width: 22px;
  height: 22px;
  border-radius: 5px;
  object-fit: cover;
  flex: none;
  background: var(--lm-surface);
  border: 1px solid var(--lm-border-2, var(--lm-border));
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 11px;
  font-weight: 700;
  color: var(--lm-muted);
}
.lm-cdrop-item-pic-glyph { padding: 0; }
/* Phase 8.4.5 — flex-row layout applies whenever an item contains
   a .lm-cdrop-item-pic, regardless of where the menu currently
   lives in the DOM. The old selector was scoped to .lm-cdrop-has-pic
   on the WRAP, which the menu loses when portaled to <body>. */
.lm-cdrop-has-pic .lm-cdrop-item,
.lm-cdrop-item:has(.lm-cdrop-item-pic) {
  display: flex !important;
  align-items: center;
  gap: 10px;
}
.lm-cdrop-item-text {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.lm-cdrop-item-self {
  border-top: 1px solid var(--lm-border-2, var(--lm-border));
  margin-top: 4px;
  padding-top: 10px;
}

/* Phase B1.c — divider between catalog services and "Custom request" option. */
.lm-cdrop-divider {
  height: 1px;
  background: var(--lm-border, #e2e8f0);
  margin: 4px 0;
}
html[data-lm-theme="dark"] .lm-cdrop-divider { background: var(--lm-border, #2a3038); }
.lm-cdrop-item-custom {
  color: var(--lm-primary-text, #0f6f4f);
  font-weight: 600;
}
.lm-cdrop-item-custom:hover {
  background: var(--lm-primary-soft, #f3f8f5) !important;
}

/* Custom request inline form — title input + description textarea + help. */
.lm-custom-svc-fields {
  margin-top: 4px;
  padding: 12px 14px;
  background: var(--lm-primary-soft, #f3f8f5);
  border: 1px dashed var(--lm-primary-soft-2, #c8e6d4);
  border-radius: 8px;
}
.lm-custom-svc-fields .lm-input,
.lm-custom-svc-fields .lm-textarea {
  margin-bottom: 8px;
}
.lm-custom-svc-fields .lm-textarea {
  resize: vertical;
  min-height: 70px;
}
.lm-custom-svc-fields .lm-help {
  margin-top: 4px;
  font-size: 12px;
  color: var(--lm-muted, #6b7280);
}
html[data-lm-theme="dark"] .lm-custom-svc-fields {
  background: rgba(46,161,111,.10);
  border-color: rgba(46,161,111,.40);
}

/* Custom-service badge shown next to the booking's service title.
   Used in: booking_detail.tpl meta cell + bookings.tpl card meta line. */
.lm-custom-svc-badge {
  display: inline-flex; align-items: center;
  margin-left: 6px;
  padding: 1px 7px;
  font-family: var(--lm-font-mono, ui-monospace, monospace);
  font-size: 10px; font-weight: 700;
  letter-spacing: .04em; text-transform: uppercase;
  border-radius: 3px;
  background: var(--lm-surface-2, #f1f5f9);
  color: var(--lm-text-secondary, #475569);
  border: 1px solid var(--lm-border, #e2e8f0);
}
.lm-custom-svc-badge-inline { font-size: 9.5px; padding: 0 5px; }
html[data-lm-theme="dark"] .lm-custom-svc-badge {
  background: var(--lm-surface-2, #1c232c);
  color: var(--lm-text, #e6edf3);
  border-color: var(--lm-border, #2a3038);
}
/* Phase 10.4 — casting-originated bookings get a soft, muted purple badge
   (distinct from the gray "Custom" pill) so the casting origin reads at a glance. */
.lm-custom-svc-badge--casting {
  background: #f2ecfb;
  color: #6b4fa0;
  border-color: #e4d8f5;
}
html[data-lm-theme="dark"] .lm-custom-svc-badge--casting {
  background: rgba(141, 110, 204, .16);
  color: #c6b4ee;
  border-color: rgba(141, 110, 204, .34);
}
.lm-custom-svc-blurb {
  margin-top: 6px;
  font-size: 13.5px;
  color: var(--lm-muted, #6b7280);
  line-height: 1.5;
  font-style: italic;
}
html[data-lm-theme="dark"] .lm-custom-svc-blurb { color: var(--lm-muted, #8b949e); }

/* Phase B1.c2 — service + your-offer side-by-side row inside booking modal.
   Service field takes ~2/3 width, offer field ~1/3. Stacks on narrow screens. */
.lm-booking-srow {
  display: flex;
  gap: 12px;
  align-items: flex-start;
}
.lm-booking-srow-svc   { flex: 2 1 0; min-width: 0; }
.lm-booking-srow-offer { flex: 1 1 0; min-width: 0; }
/* Tablet/narrow desktop — keep side-by-side but give offer slightly more room so amount stays tappable */
@media (max-width: 720px) and (min-width: 481px) {
  .lm-booking-srow-svc   { flex: 3 1 0; }
  .lm-booking-srow-offer { flex: 2 1 0; }
}
/* Phone — stack vertically; offer-row goes full-width which makes amount input plenty wide */
@media (max-width: 480px) {
  .lm-booking-srow { flex-direction: column; gap: 14px; }
  .lm-booking-srow-svc, .lm-booking-srow-offer { flex: 1 1 auto; width: 100%; }
}
.lm-field-hint {
  font-weight: 400;
  color: var(--lm-muted, #6b7280);
  font-size: 11px;
}
.lm-offer-row {
  /* Phase H R28: match .lm-cdrop-btn (Select Service on the left of the
     same row) — border 1.5px, padding 10px 12px, full height to align
     baselines. The thin 1px border + 38px height felt visually weaker
     than the Select Service dropdown next to it. */
  display: flex;
  align-items: center;
  gap: 4px;
  min-height: 44px;
  padding: 4px 12px;
  background: var(--lm-bg, #fff);
  border: 1.5px solid var(--lm-border, #e5e7eb);
  border-radius: 8px;
  transition: border-color .15s, box-shadow .15s;
  /* Allow inner cdrop popup to escape via overflow:visible */
  overflow: visible;
  position: relative;
}
.lm-offer-row:focus-within,
.lm-offer-row:has(.lm-cdrop.is-open) {
  border-color: var(--lm-primary, #0f6f4f);
  box-shadow: 0 0 0 3px rgba(15, 111, 79, 0.12);
}
.lm-offer-currency {
  font-weight: 600;
  color: var(--lm-text, #111);
  font-size: 14px;
  flex-shrink: 0;
  line-height: 1;
}
.lm-offer-amount {
  /* Phase H R34: tight 50px width on DESKTOP — fits "99,999" with no
     runway, so the slash + "day" dropdown sit close to the amount
     instead of being pushed to the right edge. */
  flex: 0 0 auto;
  width: 50px;
  min-width: 44px;
  height: 28px;
  padding: 0 2px;
  border: 0;
  outline: none;
  /* appearance:none kills the browser's own dark field chrome in dark mode, so
     the input shares ONE background with the .lm-offer-row (no darker inner box). */
  -webkit-appearance: none;
  appearance: none;
  background: transparent !important;
  font-size: 14px;
  color: var(--lm-text, #111);
  -moz-appearance: textfield;
}
@media (max-width: 767px) {
  /* Phase H R45/R47: split the row 50/50 — left half = amount input,
     right half = unit dropdown. Inside the right half, the trigger
     button centers "day" + chevron close to the slash (justify-content:
     flex-start with no padding-left) so the cluster reads as one unit
     instead of pinning the chevron to the right border. */
  .lm-offer-amount {
    flex: 1 1 0 !important;
    width: auto !important;
    min-width: 0 !important;
  }
  .lm-offer-unit-cdrop {
    flex: 1 1 0 !important;
    min-width: 0 !important;
    max-width: none !important;
  }
  .lm-offer-unit-cdrop .lm-cdrop-btn {
    /* Phase H R48: pull "day" + chevron to the LEFT edge of the right
       half so they sit right next to the slash. Centering looked off
       because the popup anchored to the trigger center fell into empty
       space; left-align brings everything into one tight cluster. */
    justify-content: flex-start !important;
    padding: 0 4px 0 0 !important;
  }
}
.lm-offer-amount::-webkit-outer-spin-button,
.lm-offer-amount::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.lm-offer-amount::placeholder { color: var(--lm-muted, #9ca3af); opacity: 1; }
/* Phase 8.4.6 — force transparent in EVERY state. Browser autofill
   (Chrome's yellow/dark-mode-blue), focus ring, and -webkit-appearance
   defaults all paint a different shade behind the input which on dark
   theme reads as a separate "card" inside the .lm-offer-row. */
.lm-offer-amount,
.lm-offer-amount:focus,
.lm-offer-amount:hover,
.lm-offer-amount:active {
  background: transparent !important;
  background-color: transparent !important;
  box-shadow: none !important;
  -webkit-appearance: none !important;
  appearance: none !important;
}
/* Autofill specifically — Chrome paints a colored rectangle that sits
   BEHIND the text. Override via the inset box-shadow trick (the only
   reliable way to neutralise -webkit-autofill backgrounds). */
.lm-offer-amount:-webkit-autofill,
.lm-offer-amount:-webkit-autofill:hover,
.lm-offer-amount:-webkit-autofill:focus,
.lm-offer-amount:-webkit-autofill:active {
  -webkit-box-shadow: 0 0 0 1000px var(--lm-bg-2, #0d1117) inset !important;
  -webkit-text-fill-color: var(--lm-text, #e6edf3) !important;
  transition: background-color 9999s ease-in-out 0s;
}
.lm-offer-slash { color: var(--lm-muted, #9ca3af); font-size: 14px; flex-shrink: 0; line-height: 1; }
/* lm-cdrop variant — sits inline inside the offer row instead of being a full-width field. */
.lm-offer-unit-cdrop {
  /* Phase H R32: same as R31 but WITHOUT overflow:hidden — that hid the
     popup .lm-cdrop-menu (absolute, position outside the wrapper). The
     chevron-clip-on-long-labels protection is moved to the inner
     button instead (overflow:hidden on .lm-cdrop-btn). */
  flex: 0 1 auto;
  min-width: 0;
  max-width: 140px;
  position: relative;
}
.lm-offer-unit-cdrop .lm-cdrop-btn {
  /* Phase H R26: !important forced because the generic .lm-cdrop-btn
     rule (line 4556) sets border + background + padding with !important.
     Phase H R27: dropped the hover/open background entirely.
     Phase H R29: gap 6px between label + arrow so the chevron has air
     around it instead of hugging the parent's right border. */
  height: 28px !important;
  padding: 0 4px 0 6px !important;
  border: 0 !important;
  background: transparent !important;
  font-size: 13px !important;
  color: var(--lm-text, #111);
  cursor: pointer;
  outline: none;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: 6px !important;
  width: 100% !important;
  border-radius: 0 !important;
  white-space: nowrap;
  overflow: hidden;
}
.lm-offer-unit-cdrop .lm-cdrop-btn:hover,
.lm-offer-unit-cdrop.is-open .lm-cdrop-btn,
.lm-offer-unit-cdrop .lm-cdrop-btn:focus-visible {
  border: 0 !important;
  background: transparent !important;
}
.lm-offer-unit-cdrop .lm-cdrop-label {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
  /* Phase H R31: label takes available space and ellipsizes long names
     so the chevron stays inside the parent border. flex: 1 + min-width:0
     is the canonical "truncate inside flexbox" pattern. */
  flex: 1 1 auto;
}
.lm-offer-unit-cdrop .lm-cdrop-btn svg { flex-shrink: 0; opacity: .6; }
/* Popup menu — anchored to the cdrop, opens DOWN by default; up-modifier flips it.
   Position relative to the cdrop wrapper, not the row, so it lines up with the unit text. */
.lm-offer-unit-cdrop .lm-cdrop-menu {
  position: absolute;
  top: calc(100% + 6px);
  /* Anchor to the right edge so the popup sits over the unit (where user tapped),
     not far to the left. Width auto-fits content but capped so it never exceeds the modal. */
  right: -8px;
  left: auto;
  min-width: 130px;
  max-width: calc(100vw - 32px);
  max-height: 240px;
  overflow-y: auto;
  background: var(--lm-surface, #fff);
  border: 1px solid var(--lm-border, #e5e7eb);
  border-radius: 10px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
  padding: 4px;
  /* Phase H R35: bumped z-index 10 → 100 so the popup overlays the
     sticky "Send availability request" button at the bottom of the
     booking modal. The footer has its own stacking context (sticky +
     background) and was eating the popup at z:10. */
  z-index: 100;
  display: none;
}
.lm-offer-unit-cdrop.is-open .lm-cdrop-menu { display: block; }
.lm-offer-unit-cdrop.lm-cdrop-up .lm-cdrop-menu {
  top: auto;
  bottom: calc(100% + 6px);
}
.lm-offer-unit-cdrop .lm-cdrop-item {
  display: block;
  width: 100%;
  padding: 9px 12px;
  border: 0;
  background: transparent;
  text-align: left;
  font-size: 13px;
  color: var(--lm-text, #111);
  border-radius: 6px;
  cursor: pointer;
}
.lm-offer-unit-cdrop .lm-cdrop-item:hover { background: var(--lm-surface-2, #f3f4f6); }
.lm-offer-unit-cdrop .lm-cdrop-item.is-active {
  background: var(--lm-primary, #0f6f4f);
  color: #fff;
  font-weight: 600;
}
html[data-lm-theme="dark"] .lm-offer-row {
  /* Match every OTHER field (.lm-input/.lm-cdrop-btn use --lm-surface-2) so the
     whole "Your offer" box is the same lighter surface — not darker than its
     siblings. The input itself is transparent, so the field reads as one shade. */
  background: var(--lm-surface-2, #1c232c) !important;
  border-color: var(--lm-border, #2a3038);
}
html[data-lm-theme="dark"] .lm-offer-row:focus-within,
html[data-lm-theme="dark"] .lm-offer-row:has(.lm-cdrop.is-open) {
  border-color: var(--lm-primary, #0f6f4f);
  box-shadow: 0 0 0 3px rgba(15, 111, 79, 0.18);
}
html[data-lm-theme="dark"] .lm-offer-currency,
html[data-lm-theme="dark"] .lm-offer-amount,
html[data-lm-theme="dark"] .lm-offer-unit-cdrop .lm-cdrop-btn,
html[data-lm-theme="dark"] .lm-offer-unit-cdrop .lm-cdrop-item { color: var(--lm-text, #e6edf3); }
/* Phase 8.4.4 — unit-dropdown trigger should blend with the parent
   .lm-offer-row instead of looking like a separate pill. Strip its
   own background + border + padding so the whole field reads as one
   continuous control. Applies both themes — light variant also looked
   like a nested chip before. */
.lm-offer-unit-cdrop .lm-cdrop-btn,
html[data-lm-theme="dark"] .lm-offer-unit-cdrop .lm-cdrop-btn {
  background: transparent !important;
  border: 0 !important;
  padding: 0 4px !important;
  width: auto !important;
  box-shadow: none !important;
}
.lm-offer-unit-cdrop .lm-cdrop-btn:hover,
.lm-offer-unit-cdrop.is-open .lm-cdrop-btn {
  border: 0 !important;
  box-shadow: none !important;
}
html[data-lm-theme="dark"] .lm-offer-unit-cdrop .lm-cdrop-menu {
  background: var(--lm-surface-2, #1c2128);
  border-color: var(--lm-border, #2a3038);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
}
html[data-lm-theme="dark"] .lm-offer-unit-cdrop .lm-cdrop-item:hover { background: rgba(255, 255, 255, 0.06); }
html[data-lm-theme="dark"] .lm-offer-unit-cdrop .lm-cdrop-item.is-active {
  background: var(--lm-primary, #0f6f4f);
  color: #fff;
}

/* R20i: cdrop variant — opens upward (used inside Buy modal so the menu doesn't
   overflow below the modal boundary) */
.lm-cdrop-up .lm-cdrop-menu {
  top: auto;
  bottom: calc(100% + 4px);
}

/* Service dropdown in the Check Availability modal: cap to ~4 visible rows + visible scrollbar.
   Each item is ~36px (9px+9px padding + ~18px line). 4 × 36 + 8 padding = 152px. */
#lm-service-cdrop .lm-cdrop-menu {
  max-height: 152px;
  overflow-y: auto;
  /* keep scrollbar visible so users know there are more options below */
  scrollbar-width: thin;
}
#lm-service-cdrop .lm-cdrop-menu::-webkit-scrollbar {
  width: 8px;
}
#lm-service-cdrop .lm-cdrop-menu::-webkit-scrollbar-thumb {
  background: var(--lm-border, #d8d8dc);
  border-radius: 4px;
}
#lm-service-cdrop .lm-cdrop-menu::-webkit-scrollbar-thumb:hover {
  background: var(--lm-muted, #8a8a93);
}
#lm-service-cdrop .lm-cdrop-menu::-webkit-scrollbar-track {
  background: transparent;
}

/* R20e: Multi-select checkbox style for cdrop (Buy Content "Intended use") */
.lm-cdrop-multi .lm-cdrop-menu { padding: 6px; max-height: 280px; }
.lm-cdrop-check {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 9px 10px;
  border-radius: 6px;
  cursor: pointer;
  transition: background .1s;
  user-select: none;
}
.lm-cdrop-check:hover { background: var(--lm-surface); }
.lm-cdrop-check.is-selected { background: var(--lm-primary-soft); }
.lm-cdrop-check input[type="checkbox"] { display: none; }
.lm-cdrop-check-box {
  width: 16px; height: 16px;
  flex-shrink: 0;
  border: 1.5px solid var(--lm-border);
  border-radius: 4px;
  background: #fff;
  display: grid; place-items: center;
  color: #fff;
  margin-top: 1px;
  transition: background .12s, border-color .12s;
}
.lm-cdrop-check-box svg { opacity: 0; transition: opacity .12s; }
.lm-cdrop-check.is-selected .lm-cdrop-check-box {
  background: var(--lm-primary-strong);
  border-color: var(--lm-primary-strong);
}
.lm-cdrop-check.is-selected .lm-cdrop-check-box svg { opacity: 1; }
.lm-cdrop-check-label {
  font-size: 13px; font-weight: 500; color: var(--lm-text);
  line-height: 1.35;
  display: flex; flex-direction: column; gap: 1px;
}
.lm-cdrop-check.is-selected .lm-cdrop-check-label { color: var(--lm-primary-strong); font-weight: 600; }
.lm-cdrop-check-hint {
  font-size: 11px; font-weight: 400; color: var(--lm-muted);
}
.lm-cdrop-check.is-selected .lm-cdrop-check-hint { color: var(--lm-primary-strong); opacity: 0.75; }
.lm-cdrop-help {
  font-size: 11px; color: var(--lm-muted);
  margin-top: 6px;
}
/* R14: time-grid cdrops are tighter */
.lm-cdrop-time .lm-cdrop-btn { padding: 8px 10px !important; font-size: 13px !important; }
.lm-cdrop-time .lm-cdrop-menu { max-height: 200px; }

/* R12: Report modal radio-card list (design-exact) */
.lm-report-reasons { display: flex; flex-direction: column; gap: 6px; }
.lm-report-reason {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 14px;
  border-radius: 10px;
  border: 1px solid var(--lm-border);
  cursor: pointer;
  font-size: 13.5px; font-weight: 500;
  color: var(--lm-text);
  background: #fff;
  transition: border-color .12s, background .12s, color .12s;
}
.lm-report-reason input[type="radio"] {
  appearance: none; -webkit-appearance: none;
  width: 16px; height: 16px;
  border: 1.5px solid var(--lm-muted-2);
  border-radius: 50%;
  margin: 0; flex-shrink: 0;
  position: relative;
  cursor: pointer;
}
.lm-report-reason input[type="radio"]:checked {
  border-color: var(--lm-primary);
  background: #fff;
}
.lm-report-reason input[type="radio"]:checked::after {
  content: "";
  position: absolute;
  inset: 3px;
  border-radius: 50%;
  background: var(--lm-primary);
}
.lm-report-reason:hover { border-color: var(--lm-primary); background: var(--lm-primary-soft); }
.lm-report-reason.is-active,
.lm-report-reason:has(input:checked) {
  border-color: var(--lm-primary);
  background: var(--lm-primary-soft);
  color: var(--lm-primary-strong);
}

/* R12: Block modal checklist (design-exact) */
.lm-block-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.lm-block-list li {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 11px 14px;
  border-radius: 10px;
  border: 1px solid var(--lm-border-2);
  background: var(--lm-surface);
  font-size: 13.5px; line-height: 1.45;
  color: var(--lm-text);
}
.lm-block-list li svg { flex-shrink: 0; color: var(--lm-muted); margin-top: 2px; }
.lm-block-list li:nth-child(1) svg,
.lm-block-list li:nth-child(2) svg { color: var(--lm-primary); }

/* R12: Toast helper */
.lm-toast-r11 {
  position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%);
  background: #0F172A; color: #fff;
  padding: 10px 18px;
  border-radius: 999px;
  font-size: 13px; font-weight: 500;
  display: inline-flex; align-items: center; gap: 8px;
  white-space: nowrap;
  box-shadow: 0 10px 30px rgba(15,23,42,0.30);
  z-index: 100000;
  animation: lm-toast-in .3s ease;
}
.lm-toast-r11 svg { color: #34D399; flex-shrink: 0; }
.lm-toast-r11.is-out { opacity: 0; transition: opacity .3s; }
@keyframes lm-toast-in { from { opacity: 0; transform: translate(-50%, 12px); } to { opacity: 1; transform: translate(-50%, 0); } }

/* Switch Accounts modal */
.lm-switch-list { list-style: none; margin: 0; padding: 0; }
.lm-switch-item {
  display: grid; grid-template-columns: 44px 1fr auto;
  gap: 12px; align-items: center;
  padding: 12px 22px; cursor: pointer; transition: background .12s;
}
.lm-switch-item:hover { background: var(--lm-surface); }
.lm-switch-item.is-active { background: var(--lm-primary-soft); }
.lm-switch-avatar { width: 44px; height: 44px; border-radius: 50%; overflow: hidden; flex-shrink: 0; background: var(--lm-surface); border: 2px solid var(--lm-border); }
.lm-switch-avatar img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; }
.lm-switch-info { min-width: 0; flex: 1; }
.lm-switch-name { font-size: 13.5px; font-weight: 600; display: inline-flex; align-items: center; gap: 4px; margin-bottom: 2px; }
.lm-switch-name svg { color: var(--lm-primary); }
.lm-switch-handle { font-size: 11px; color: var(--lm-muted); font-family: var(--lm-font-mono); }
/* Phase H R69: row #2 — @handle + account-type pill side by side. */
.lm-switch-handle-row {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: nowrap;
  min-width: 0;
}
.lm-switch-handle-row .lm-switch-handle { flex-shrink: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.lm-switch-handle-row .lm-account-type { flex-shrink: 0; vertical-align: middle; }
.lm-switch-active { width: 20px; height: 20px; border-radius: 50%; background: var(--lm-primary); color: #fff; display: grid; place-items: center; flex-shrink: 0; }

/* Phase H R69: switching overlay sits INSIDE the modal card (not over
   the whole page) and covers the list while Sngine's users/switch
   endpoint runs. Sngine's bare #modal-loading flicker is hidden via the
   .lm-switching marker on <html>. */
#lm-switch-scrim .lm-modal { position: relative; overflow: hidden; }
.lm-switch-overlay {
  position: absolute; inset: 0; z-index: 5;
  display: flex; align-items: center; justify-content: center;
  background: rgba(255, 255, 255, 0.96);
  backdrop-filter: blur(3px);
  border-radius: inherit;
  opacity: 0; pointer-events: none;
  transition: opacity .18s ease;
}
.lm-modal.is-switching .lm-switch-overlay {
  opacity: 1;
  pointer-events: auto;
}
/* Hide Sngine's Bootstrap modal (#modal) only while OUR switching
   overlay is up. The template content of #modal-loading (a spinner) is
   rendered INTO #modal by the modal() helper, so hiding #modal is what
   actually removes the grey rectangle. Backdrop also goes invisible so
   nothing peeks behind our overlay. */
html.lm-switching #modal,
html.lm-switching #modal.show,
html.lm-switching #modal .modal-dialog,
html.lm-switching .modal-backdrop.show {
  opacity: 0 !important;
  visibility: hidden !important;
  pointer-events: none !important;
}
.lm-switch-overlay-card {
  display: flex; flex-direction: column; align-items: center;
  gap: 8px; padding: 12px 20px;
  animation: lm-switch-pop .25s ease both;
}
@keyframes lm-switch-pop {
  from { opacity: 0; transform: translateY(6px) scale(.98); }
  to   { opacity: 1; transform: none; }
}
.lm-switch-overlay-avatar {
  position: relative;
  width: 72px; height: 72px;
}
.lm-switch-overlay-avatar img {
  width: 100%; height: 100%;
  border-radius: 50%; object-fit: cover;
  background: var(--lm-surface);
  display: block;
}
.lm-switch-overlay-spinner {
  position: absolute; inset: -6px;
  border-radius: 50%;
  border: 3px solid transparent;
  border-top-color: var(--lm-primary, #10b981);
  border-right-color: var(--lm-primary, #10b981);
  animation: lm-switch-spin .8s linear infinite;
}
@keyframes lm-switch-spin { to { transform: rotate(360deg); } }
.lm-switch-overlay-title {
  font-size: 14.5px; color: var(--lm-text); margin-top: 6px;
  font-weight: 500;
}
.lm-switch-overlay-title strong { font-weight: 700; }
.lm-switch-overlay-sub {
  font-size: 12px; color: var(--lm-muted, #6b7280);
}
html[data-lm-theme="dark"] .lm-switch-overlay { background: rgba(15, 23, 42, 0.92); }
html[data-lm-theme="dark"] .lm-switch-overlay-avatar img { background: rgba(255,255,255,0.04); }

/* ══════════════════════════════════════════════════════════════
   R20k: DARK THEME — full override based on prototype tokens
   Toggled via document.documentElement.dataset.lmTheme = "dark"
   ══════════════════════════════════════════════════════════════ */
html[data-lm-theme="dark"] {
  --lm-bg:              #0d1117;
  --lm-surface:         #151b23;
  --lm-surface-2:       #1c232c;
  --lm-text:            #e6edf3;
  --lm-muted:           #8b949e;
  --lm-muted-2:         #6e7681;
  --lm-border:          #2a3038;
  --lm-border-2:        #21272f;
  --lm-primary:         #2ea16f;
  --lm-primary-strong:  #3cb47e;
  --lm-primary-soft:    rgba(46,161,111,0.12);
  --lm-primary-soft-2:  rgba(46,161,111,0.28);
  --lm-primary-text:    #5fcc94;
  --lm-shadow-sm: 0 1px 2px rgba(0,0,0,0.4), 0 1px 0 rgba(0,0,0,0.25);
  --lm-shadow-md: 0 1px 2px rgba(0,0,0,0.4), 0 8px 24px rgba(0,0,0,0.45);
  --lm-shadow-lg: 0 12px 32px rgba(0,0,0,0.55), 0 2px 6px rgba(0,0,0,0.4);
  /* Override Sngine's --border-divider (defined for body.night-mode only).
     Our LM dark theme toggles via html[data-lm-theme="dark"] without setting
     body.night-mode, so without this the divider stays its light-theme color
     (#E5E7E8) and reads as a bright vertical line on the dark background. */
  --border-divider:     #2a3038;
  --border-divider-2:   #21272f;
}

/* Body + chrome */
html[data-lm-theme="dark"] body { background: #0a0d12 !important; color: var(--lm-text); }
html[data-lm-theme="dark"] body::after {
  background: var(--lm-bg) !important;
  border-left-color: var(--lm-border) !important;
  border-right-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .lm-sidebar {
  background: var(--lm-surface);
  border-left-color: var(--lm-border);
  border-right-color: var(--lm-border);
}
html[data-lm-theme="dark"] .lm-topbar {
  background: rgba(13,17,23,0.85);
  backdrop-filter: blur(8px);
  border-right-color: var(--lm-border);
  border-bottom-color: var(--lm-border);
}

/* Sidebar nav */
html[data-lm-theme="dark"] .lm-brand { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-brand-mark {
  background: var(--lm-primary-soft);
  color: var(--lm-primary-text);
  border-color: var(--lm-primary-soft-2);
}
html[data-lm-theme="dark"] .lm-brand-name { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-brand-name span { color: var(--lm-muted-2); }
html[data-lm-theme="dark"] .lm-brand-tag { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-nav-item { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-nav-item:hover { background: var(--lm-primary-soft); }
html[data-lm-theme="dark"] .lm-nav-item.is-active {
  background: var(--lm-primary-soft);
  color: var(--lm-primary-text);
}
html[data-lm-theme="dark"] .lm-nav-more-trigger { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-nav-more-trigger:hover { background: var(--lm-primary-soft) !important; }
html[data-lm-theme="dark"] .lm-nav-submenu {
  /* no panel — just a soft green left guide line */
  background: none;
  border-left-color: rgba(110, 231, 183, 0.35);
}
html[data-lm-theme="dark"] .lm-nav-subitem { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-nav-subitem:hover { background: var(--lm-primary-soft); }
html[data-lm-theme="dark"] .lm-nav-subdivider { background: var(--lm-border); }

/* Account area + dropdown */
html[data-lm-theme="dark"] .lm-account-wrap { border-top-color: var(--lm-border); }
html[data-lm-theme="dark"] .lm-mini-profile:hover,
html[data-lm-theme="dark"] .lm-mini-profile.is-open { background: var(--lm-surface-2); }
html[data-lm-theme="dark"] .lm-mini-name { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-mini-handle { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-mini-caret { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-account-menu {
  background: var(--lm-surface);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .lm-account-menu-header:hover { background: var(--lm-surface-2); }
html[data-lm-theme="dark"] .lm-account-menu-name { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-account-menu-handle { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-account-menu-item { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-account-menu-item:hover { background: var(--lm-surface-2); }
html[data-lm-theme="dark"] .lm-account-menu-divider { background: var(--lm-border-2); }
/* Default dark fallback for the base class; per-variant rules override below. */
html[data-lm-theme="dark"] .lm-account-type {
  background: var(--lm-primary-soft);
  border-color: var(--lm-primary-soft-2);
  color: var(--lm-primary-text);
}
/* Per-variant dark overrides — keep in sync with the light-theme rules above. */
html[data-lm-theme="dark"] .lm-account-type.lm-account-type-brand  { background: #0d5a68; color: #fff; border-color: #0d5a68; }
html[data-lm-theme="dark"] .lm-account-type.lm-account-type-talent { background: var(--lm-primary, #0a8a4f); color: #fff; border-color: var(--lm-primary, #0a8a4f); }
html[data-lm-theme="dark"] .lm-account-type.lm-account-type-admin  { background: #2a1d10; color: #f59e0b; border-color: #4a3220; }
html[data-lm-theme="dark"] .lm-wallet-balance {
  background: var(--lm-primary-soft);
  border-color: var(--lm-primary-soft-2);
  color: var(--lm-primary-text);
}

/* Topbar */
html[data-lm-theme="dark"] .lm-topbar-search {
  background: var(--lm-surface-2);
  border-color: var(--lm-border);
  color: var(--lm-muted);
}
html[data-lm-theme="dark"] .lm-topbar-search:hover { border-color: var(--lm-muted-2); }
html[data-lm-theme="dark"] .lm-topbar-search-text { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-topbar-kbd {
  background: var(--lm-surface) !important;
  border-color: var(--lm-border) !important;
  color: var(--lm-muted) !important;
}
html[data-lm-theme="dark"] .lm-topbar-action { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-topbar-action:hover { background: var(--lm-surface-2); }

/* Page wrapper */
html[data-lm-theme="dark"] .lm-profile-page { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-content-center { color: var(--lm-text); }

/* Cards / hero / tabs */
html[data-lm-theme="dark"] .lm-hero,
html[data-lm-theme="dark"] .lm-card,
html[data-lm-theme="dark"] .lm-review,
html[data-lm-theme="dark"] .lm-service,
html[data-lm-theme="dark"] .lm-switch-item {
  background: var(--lm-surface);
  color: var(--lm-text);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .lm-tab-body { background: transparent; color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-tabs-wrap { background: transparent; border-bottom-color: var(--lm-border); }
html[data-lm-theme="dark"] .lm-tab { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-tab:hover { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-tab.is-active { color: var(--lm-text); border-bottom-color: var(--lm-primary-strong); }
html[data-lm-theme="dark"] .lm-tab-count { background: var(--lm-surface-2); color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-tab.is-active .lm-tab-count {
  background: var(--lm-primary-soft);
  color: var(--lm-primary-text);
}

/* Hero text */
html[data-lm-theme="dark"] .lm-hero-name { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-hero-subtitle { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-hero-meta { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-hero-meta-num { color: var(--lm-text); }

/* Card titles + text */
html[data-lm-theme="dark"] .lm-card-title { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-card .lm-muted { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-section-title { color: var(--lm-text); }

/* Buttons */
html[data-lm-theme="dark"] .lm-btn-secondary,
html[data-lm-theme="dark"] .lm-btn-ghost {
  background: var(--lm-surface);
  color: var(--lm-text);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .lm-btn-secondary:hover,
html[data-lm-theme="dark"] .lm-btn-ghost:hover {
  border-color: var(--lm-primary);
  color: var(--lm-primary-text);
}
html[data-lm-theme="dark"] .lm-icon-btn-lg {
  background: var(--lm-surface);
  color: var(--lm-text);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .lm-icon-btn-lg:hover { border-color: var(--lm-primary); color: var(--lm-primary-text); }

/* Social pills */
html[data-lm-theme="dark"] .lm-social,
html[data-lm-theme="dark"] .lm-social-add {
  background: var(--lm-surface);
  color: var(--lm-text);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .lm-social[data-net="x"] svg,
html[data-lm-theme="dark"] .lm-social[data-net="tt"] svg { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-social-num { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-social-name { color: var(--lm-muted); }

/* Portfolio filter buttons */
html[data-lm-theme="dark"] .lm-port-filter-btn {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .lm-port-filter-btn.is-active {
  background: var(--lm-primary-soft) !important;
  border-color: var(--lm-primary-soft-2) !important;
  color: var(--lm-primary-text) !important;
}

/* Reviews */
html[data-lm-theme="dark"] .lm-reviews-summary-v2 {
  background: linear-gradient(135deg, var(--lm-surface) 0%, var(--lm-primary-soft) 100%);
  border-color: var(--lm-primary-soft-2);
}
html[data-lm-theme="dark"] .lm-criterion-bar { background: rgba(255,255,255,0.06); }
html[data-lm-theme="dark"] .lm-review-criteria { background: var(--lm-surface-2); }
html[data-lm-theme="dark"] .lm-review-toggle { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-review-toggle:hover { color: var(--lm-primary-text); }
html[data-lm-theme="dark"] .lm-review-text { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-review-brandname { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-review-role { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-reviews-num { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-reviews-count { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-criterion-label { color: var(--lm-text); }

/* Services & buy modal */
html[data-lm-theme="dark"] .lm-service-title { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-service-desc { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-service-meta { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-service-amount { color: var(--lm-text); }
/* Phase A — dark mode: is-event green, is-content amber/gold (distinct from event).
   The previous override was un-namespaced and turned BOTH variants green. */
html[data-lm-theme="dark"] .lm-service-kind.is-event {
  background: rgba(46,161,111,.15);
  border-color: rgba(46,161,111,.40);
  color: #5fcc94;
}
html[data-lm-theme="dark"] .lm-service-kind.is-content {
  background: rgba(245,158,11,.14);
  border-color: rgba(245,158,11,.40);
  color: #fbbf24;
}
html[data-lm-theme="dark"] .lm-buy-modal { background: var(--lm-surface); color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-buy-head { border-bottom-color: var(--lm-border); background: var(--lm-surface); }
html[data-lm-theme="dark"] .lm-buy-title { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-buy-subtitle,
html[data-lm-theme="dark"] .lm-buy-desc,
html[data-lm-theme="dark"] .lm-buy-label,
html[data-lm-theme="dark"] .lm-buy-escrow { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-buy-summary { background: var(--lm-surface-2); border-color: var(--lm-border); color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-buy-summary-divider { background: var(--lm-border); }
html[data-lm-theme="dark"] .lm-buy-total { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-buy-includes li { color: var(--lm-text); }

/* Inputs / dropdowns */
html[data-lm-theme="dark"] input[type="text"],
html[data-lm-theme="dark"] input[type="email"],
html[data-lm-theme="dark"] input[type="search"],
html[data-lm-theme="dark"] input[type="number"],
html[data-lm-theme="dark"] input[type="password"],
html[data-lm-theme="dark"] textarea,
html[data-lm-theme="dark"] select,
html[data-lm-theme="dark"] .lm-input,
html[data-lm-theme="dark"] .lm-textarea {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] input::placeholder,
html[data-lm-theme="dark"] textarea::placeholder { color: var(--lm-muted-2); }
html[data-lm-theme="dark"] .lm-cdrop-btn {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
/* Chat popup avatar fallback — initials centred in the avatar circle when a
   conversation party (e.g. a brand Page) has no picture, instead of a broken img. */
.lm-chat-avatar-initials {
  position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: center;
  width: 100%; height: 100%;
  border-radius: 50%;
  background: linear-gradient(135deg, #0a2a30, #00363f);
  color: #fff; font-weight: 700; font-size: 13px; line-height: 1;
  text-transform: uppercase; letter-spacing: .02em;
}
html[data-lm-theme="dark"] .lm-cdrop-menu {
  background: var(--lm-surface);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .lm-cdrop-item { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-cdrop-item:hover { background: var(--lm-surface-2); }
html[data-lm-theme="dark"] .lm-cdrop-item.is-active {
  background: var(--lm-primary-soft);
  color: var(--lm-primary-text);
}

/* Modals */
html[data-lm-theme="dark"] .lm-booking-modal,
html[data-lm-theme="dark"] .lm-modal {
  background: var(--lm-surface);
  color: var(--lm-text);
}
html[data-lm-theme="dark"] .lm-modal-scrim,
html[data-lm-theme="dark"] .lm-booking-modal-scrim,
html[data-lm-theme="dark"] .lm-buy-scrim { background: rgba(0,0,0,0.7); }
html[data-lm-theme="dark"] .lm-modal-title,
html[data-lm-theme="dark"] .lm-booking-title { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-modal-sub,
html[data-lm-theme="dark"] .lm-booking-subtitle { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-modal-head,
html[data-lm-theme="dark"] .lm-booking-head { border-bottom-color: var(--lm-border); background: var(--lm-surface); }
html[data-lm-theme="dark"] .lm-modal-foot { border-top-color: var(--lm-border); background: var(--lm-surface-2); }

/* Sticky CTA bar */
html[data-lm-theme="dark"] .lm-sticky-cta {
  background: var(--lm-surface);
  border-color: var(--lm-border);
  box-shadow: 0 12px 32px -8px rgba(0,0,0,0.55);
}
html[data-lm-theme="dark"] .lm-sticky-cta-name { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-sticky-cta-meta { color: var(--lm-muted); }

/* Footer (rail + page) */
html[data-lm-theme="dark"] .lm-rail-footer { background: var(--lm-bg); color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-rail-footer-links a { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-rail-footer-links a:hover { color: var(--lm-primary-text); }
/* Dark-mode footer — !important wins over the html.lm-chrome-active rule
   defined later in the file (same specificity, later source wins by
   default; we need this to win regardless of order). */
html[data-lm-theme="dark"] .lm-page-footer,
html[data-lm-theme="dark"].lm-chrome-active .lm-page-footer {
  background: var(--lm-surface) !important;
  border-top-color: var(--lm-border) !important;
  color: var(--lm-muted);
}
html[data-lm-theme="dark"] .lm-page-footer-links a { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-page-footer-links a:hover { color: var(--lm-primary-text); }
html[data-lm-theme="dark"] .lm-page-footer-copy { color: var(--lm-muted); }

/* Theme toggle — knob shows moon icon visible against navy bg */
html[data-lm-theme="dark"] .lm-theme-toggle { background: var(--lm-surface-2) !important; border-color: var(--lm-border) !important; }
html[data-lm-theme="dark"] .lm-theme-knob {
  background: #1e293b;
  color: #cbd5e1;
  box-shadow: 0 1px 3px rgba(0,0,0,0.5);
}
html[data-lm-theme="dark"] .lm-theme-knob.is-dark { color: #fbbf24; background: #0f172a; }
html[data-lm-theme="dark"] .lm-theme-knob.is-dark svg { color: #fbbf24 !important; stroke: #fbbf24 !important; }

/* Topbar 3 icon buttons (notif/saved/inbox) — dark surface */
html[data-lm-theme="dark"] .lm-icon-btn-pop {
  background: var(--lm-surface-2) !important;
  border-color: var(--lm-border) !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .lm-icon-btn-pop:hover {
  border-color: var(--lm-primary) !important;
  color: var(--lm-primary-text) !important;
}
html[data-lm-theme="dark"] .lm-icon-btn-pop.is-open {
  border-color: var(--lm-primary) !important;
  color: var(--lm-primary-text) !important;
  background: var(--lm-primary-soft) !important;
}

/* Sort: Recent pill */
html[data-lm-theme="dark"] .lm-portfolio-sort {
  background: var(--lm-surface) !important;
  border-color: var(--lm-border) !important;
  color: var(--lm-muted) !important;
}
html[data-lm-theme="dark"] .lm-portfolio-sort:hover {
  background: var(--lm-surface-2) !important;
  border-color: var(--lm-muted-2) !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .lm-portfolio-sort > span > span { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-portfolio-sort-menu {
  background: var(--lm-surface);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .lm-portfolio-sort-item { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-portfolio-sort-item:hover { background: var(--lm-surface-2); }
html[data-lm-theme="dark"] .lm-portfolio-sort-item.is-active { color: var(--lm-primary-text); background: var(--lm-primary-soft); }

/* Edit Profile / Btn-secondary / Btn-ghost — override .lm-profile-page-scoped rules */
html[data-lm-theme="dark"] .lm-profile-page .lm-btn-secondary,
html[data-lm-theme="dark"] .lm-profile-page .lm-btn-ghost {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .lm-profile-page .lm-btn-secondary:hover,
html[data-lm-theme="dark"] .lm-profile-page .lm-btn-ghost:hover {
  border-color: var(--lm-primary) !important;
  color: var(--lm-primary-text) !important;
}

/* About-toggle (View details) — keep green tone but on darker surface */
html[data-lm-theme="dark"] .lm-profile-page .lm-about-toggle,
html[data-lm-theme="dark"] .lm-about-toggle {
  background: var(--lm-primary-soft) !important;
  color: var(--lm-primary-text) !important;
  border-color: var(--lm-primary-soft-2) !important;
}
html[data-lm-theme="dark"] .lm-profile-page .lm-about-toggle:hover,
html[data-lm-theme="dark"] .lm-about-toggle:hover {
  background: var(--lm-primary-soft-2) !important;
}

/* Cover edit btn — already glass-dark, slight tweak for dark theme cover */
html[data-lm-theme="dark"] .lm-cover-edit-btn { background: rgba(0,0,0,0.7) !important; }

/* Lang trigger override — match other pills */
html[data-lm-theme="dark"] .lm-lang-trigger { background: var(--lm-surface-2); }

/* Stars in reviews — keep yellow but slightly muted in dark */
html[data-lm-theme="dark"] .lm-reviews-stars,
html[data-lm-theme="dark"] .lm-review-stars { color: #f59e0b; }

/* KYC verified badge — brighter primary in dark */
html[data-lm-theme="dark"] .lm-kyc-badge {
  background: var(--lm-primary-soft);
  border-color: var(--lm-primary-soft-2);
  color: var(--lm-primary-text);
}

/* Search bar focus state — dark surface */
html[data-lm-theme="dark"] .lm-topbar-search:focus-within {
  border-color: var(--lm-primary);
  background: var(--lm-surface);
}

/* R20m: HIGH-SPECIFICITY dark overrides for hardcoded #fff/#F8FAFC backgrounds */

/* 5 icon buttons next to Check Availability (chat/follow/save/share/more) */
html[data-lm-theme="dark"] .lm-profile-page .lm-icon-btn-lg,
html[data-lm-theme="dark"] .lm-icon-btn-lg {
  background: var(--lm-surface) !important;
  border-color: var(--lm-border) !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .lm-profile-page .lm-icon-btn-lg:hover,
html[data-lm-theme="dark"] .lm-icon-btn-lg:hover {
  border-color: var(--lm-primary) !important;
  color: var(--lm-primary-text) !important;
}

/* Create dropdown menu (right of Create button) */
html[data-lm-theme="dark"] .lm-create-menu {
  background: var(--lm-surface);
  border-color: var(--lm-border);
  box-shadow: 0 20px 50px -10px rgba(0,0,0,0.55), 0 6px 18px -6px rgba(0,0,0,0.3);
}
html[data-lm-theme="dark"] .lm-profile-page .lm-create-menu-item,
html[data-lm-theme="dark"] .lm-create-menu-item {
  color: var(--lm-text) !important;
  background: transparent !important;
}
html[data-lm-theme="dark"] .lm-create-menu-item:hover {
  background: var(--lm-surface-2) !important;
  color: var(--lm-primary-text) !important;
}
html[data-lm-theme="dark"] .lm-create-menu-item svg { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-create-menu-item:hover svg { color: var(--lm-primary-text); }
html[data-lm-theme="dark"] .lm-create-menu-divider { background: var(--lm-border); }

/* Language picker trigger — bright text in dark */
html[data-lm-theme="dark"] .lm-profile-page .lm-lang-trigger,
html[data-lm-theme="dark"] .lm-lang-trigger {
  background: var(--lm-surface-2) !important;
  border-color: var(--lm-border) !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .lm-profile-page .lm-lang-trigger:hover,
html[data-lm-theme="dark"] .lm-lang-trigger:hover {
  background: var(--lm-surface) !important;
  border-color: var(--lm-muted-2) !important;
  color: var(--lm-primary-text) !important;
}
html[data-lm-theme="dark"] .lm-lang-label { color: var(--lm-text); }

/* Tabs — Portfolio / Services / Activity / Reviews — active is white, inactive muted */
html[data-lm-theme="dark"] .lm-profile-page .lm-tab,
html[data-lm-theme="dark"] .lm-tab { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-profile-page .lm-tab:hover,
html[data-lm-theme="dark"] .lm-tab:hover { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-profile-page .lm-tab.is-active,
html[data-lm-theme="dark"] .lm-tab.is-active {
  color: var(--lm-text) !important;
  border-bottom-color: var(--lm-primary-strong) !important;
}
html[data-lm-theme="dark"] .lm-tab-count { background: var(--lm-surface-2); color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-tab.is-active .lm-tab-count { background: var(--lm-primary-soft); color: var(--lm-primary-text); }

/* Hero subtitle — make city/role text readable instead of barely-muted */
html[data-lm-theme="dark"] .lm-hero-subtitle {
  color: var(--lm-text);
}
html[data-lm-theme="dark"] .lm-hero-subtitle svg { color: var(--lm-muted); }

/* Section titles inside cards (Portfolio strip, etc.) */
html[data-lm-theme="dark"] .lm-portfolio-section-title,
html[data-lm-theme="dark"] .lm-section-heading { color: var(--lm-text); }

/* Sticky CTA buttons inside (chat icon button etc.) */
html[data-lm-theme="dark"] .lm-sticky-cta .lm-btn-secondary {
  background: var(--lm-surface-2) !important;
  border-color: var(--lm-border) !important;
  color: var(--lm-text) !important;
}

/* Create button — match Check Availability green tone (use --lm-primary tokens, not hardcoded forest green) */
html[data-lm-theme="dark"] .lm-sidebar .lm-create-btn,
html[data-lm-theme="dark"] .lm-create-btn {
  background: var(--lm-primary) !important;
  border-color: var(--lm-primary-strong) !important;
  color: #ffffff !important;
  box-shadow: 0 2px 6px rgba(46,161,111,0.30), inset 0 -1px 0 rgba(0,0,0,0.18);
}
html[data-lm-theme="dark"] .lm-sidebar .lm-create-btn:hover,
html[data-lm-theme="dark"] .lm-create-btn:hover { background: var(--lm-primary-strong) !important; }

/* About card field values — labels muted, values bright text */
html[data-lm-theme="dark"] .lm-profile-page .lm-bio-row dt,
html[data-lm-theme="dark"] .lm-bio-row dt {
  color: var(--lm-muted) !important;
}
html[data-lm-theme="dark"] .lm-profile-page .lm-bio-row dd,
html[data-lm-theme="dark"] .lm-bio-row dd {
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .lm-about-section-label { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-bio { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-flag-emoji { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-mono { color: var(--lm-text); }

/* R20o: Tabs wrap + body — navy surface card (dark). Light theme mirrors
   this same framed-card look in the base rules. */
html[data-lm-theme="dark"] .lm-tabs-wrap {
  background: var(--lm-surface);
  border: 1px solid var(--lm-border);
  border-radius: 12px 12px 0 0;
}
html[data-lm-theme="dark"] .lm-tab-body {
  background: var(--lm-surface);
  border: 1px solid var(--lm-border);
  border-top: none;
  border-radius: 0 0 12px 12px;
  padding: 18px;
}

/* Booking modal calendar */
html[data-lm-theme="dark"] .lm-cal {
  background: var(--lm-surface-2);
  border-color: var(--lm-border);
  color: var(--lm-text);
}
html[data-lm-theme="dark"] .lm-cal-month { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-cal-nav-btn {
  background: var(--lm-surface);
  border-color: var(--lm-border);
  color: var(--lm-text);
}
html[data-lm-theme="dark"] .lm-cal-nav-btn:hover {
  background: var(--lm-bg);
  border-color: var(--lm-muted-2);
}
html[data-lm-theme="dark"] .lm-cal-dow { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-cal-day { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-cal-day:hover:not(.is-disabled):not(.is-out) { background: var(--lm-primary); color: #fff; }
html[data-lm-theme="dark"] .lm-cal-day.is-out { color: var(--lm-muted-2); }
html[data-lm-theme="dark"] .lm-cal-day.is-disabled { color: var(--lm-muted-2); }
html[data-lm-theme="dark"] .lm-booking-cal-legend { color: var(--lm-muted); }

/* Lightbox sidebar — Most Recent dropdown + actions + composer */
html[data-lm-theme="dark"] .pl-side-sort-btn {
  background: var(--lm-surface-2) !important;
  border-color: var(--lm-border) !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .pl-side-sort-btn:hover { border-color: var(--lm-muted-2) !important; }
html[data-lm-theme="dark"] .pl-side-sort-pop {
  background: var(--lm-surface);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .pl-side-sort-item { color: var(--lm-text); }
html[data-lm-theme="dark"] .pl-side-sort-item:hover { background: var(--lm-surface-2); }
html[data-lm-theme="dark"] .pl-side-sort-item.is-on { color: var(--lm-primary-text); background: var(--lm-primary-soft); }
html[data-lm-theme="dark"] .pl-side-sortrow { background: var(--lm-surface-2); border-color: var(--lm-border); }
html[data-lm-theme="dark"] .pl-side-cmtcount { color: var(--lm-muted); }
html[data-lm-theme="dark"] .pl-side-cmts-empty { color: var(--lm-muted); }
html[data-lm-theme="dark"] .pl-side-actions {
  background: var(--lm-surface);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .pl-side-action {
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .pl-side-composer {
  background: var(--lm-surface);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .pl-composer-input-wrap {
  background: var(--lm-surface-2);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .pl-composer-input { color: var(--lm-text); }
html[data-lm-theme="dark"] .pl-composer-input::placeholder { color: var(--lm-muted-2); }
html[data-lm-theme="dark"] .pl-composer-tool { color: var(--lm-muted); }
html[data-lm-theme="dark"] .pl-composer-tool:hover { background: var(--lm-bg) !important; color: var(--lm-text) !important; }
html[data-lm-theme="dark"] .pl-side-head { background: var(--lm-surface); border-color: var(--lm-border); }
html[data-lm-theme="dark"] .pl-side-head-name { color: var(--lm-text); }
html[data-lm-theme="dark"] .pl-side-head-meta { color: var(--lm-muted); }
html[data-lm-theme="dark"] .pl-side-caption { background: var(--lm-surface); border-color: var(--lm-border); }
html[data-lm-theme="dark"] .pl-side-caption-text { color: var(--lm-text); }
html[data-lm-theme="dark"] .pl-side-caption-name { color: var(--lm-text); }
html[data-lm-theme="dark"] .pl-side-caption-meta { color: var(--lm-muted); }

/* ══════════════════════════════════════════════════════════════
   Sngine default-theme pages (Wallet, Settings, etc.) — dark override
   These pages use Bootstrap classes like .main, .card, .form-control,
   .list-group-item, .nav-tabs etc. that have hardcoded white backgrounds.
   ══════════════════════════════════════════════════════════════ */
html[data-lm-theme="dark"] .main,
html[data-lm-theme="dark"] .card:not(.lm-card) {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .card:not(.lm-card) .card-header,
html[data-lm-theme="dark"] .card:not(.lm-card) .card-body,
html[data-lm-theme="dark"] .card:not(.lm-card) .card-footer {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .nav-tabs,
html[data-lm-theme="dark"] .nav-tabs .nav-link {
  background: var(--lm-surface) !important;
  color: var(--lm-muted) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .nav-tabs .nav-link.active {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) var(--lm-border) var(--lm-surface-2) !important;
}
html[data-lm-theme="dark"] .list-group,
html[data-lm-theme="dark"] .list-group-item {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .list-group-item.active,
html[data-lm-theme="dark"] .list-group-item-action.active {
  background: var(--lm-primary-soft) !important;
  color: var(--lm-primary-text) !important;
  border-color: var(--lm-primary-soft-2) !important;
}
html[data-lm-theme="dark"] .list-group-item-action:hover {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .table {
  color: var(--lm-text) !important;
  background: var(--lm-surface) !important;
}
html[data-lm-theme="dark"] .table thead,
html[data-lm-theme="dark"] .table thead th {
  background: var(--lm-surface-2) !important;
  color: var(--lm-muted) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .table td,
html[data-lm-theme="dark"] .table th {
  border-color: var(--lm-border) !important;
  background: transparent !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .table-hover tbody tr:hover { background: var(--lm-surface-2) !important; }
html[data-lm-theme="dark"] .form-control,
html[data-lm-theme="dark"] .form-select,
html[data-lm-theme="dark"] .input-group-text {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .form-control:focus,
html[data-lm-theme="dark"] .form-select:focus {
  border-color: var(--lm-primary) !important;
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  box-shadow: 0 0 0 0.2rem rgba(46,161,111,0.20) !important;
}
html[data-lm-theme="dark"] .form-control::placeholder { color: var(--lm-muted-2) !important; }
html[data-lm-theme="dark"] .form-label,
html[data-lm-theme="dark"] .form-floating > label { color: var(--lm-muted) !important; }
html[data-lm-theme="dark"] .form-floating > .form-control:focus ~ label,
html[data-lm-theme="dark"] .form-floating > .form-control:not(:placeholder-shown) ~ label { color: var(--lm-muted) !important; }
/* Phase A — Bootstrap's floating label gets a white background pill when it
   "floats up". For consistency with other inputs (which DON'T show any pill),
   make the label background fully transparent in dark theme. The label text
   itself stays floating above the input with no chip. */
html[data-lm-theme="dark"] .form-floating > label,
html[data-lm-theme="dark"] .form-floating > label::after {
  background: transparent !important;
  background-color: transparent !important;
}
html[data-lm-theme="dark"] .alert-info,
html[data-lm-theme="dark"] .alert-warning,
html[data-lm-theme="dark"] .alert-secondary {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .text-muted,
html[data-lm-theme="dark"] .text-secondary { color: var(--lm-muted) !important; }
html[data-lm-theme="dark"] .text-dark { color: var(--lm-text) !important; }
/* Sngine's dark --body-color (#dcdcdc) is scoped to the LEGACY `body.night-mode`
   selector, which the LM dark theme (html[data-lm-theme="dark"]) doesn't use —
   so .body-color text stayed at the light-theme #212529 and was unreadable in
   dark (e.g. blocked-user names on /settings/blocking, the live-notification
   toast message). Map --body-color to the LM text colour for the active theme. */
html[data-lm-theme="dark"], html.lm-dark { --body-color: var(--lm-text, #dcdcdc); }
html[data-lm-theme="dark"] .bg-white { background: var(--lm-surface) !important; }
html[data-lm-theme="dark"] .bg-light { background: var(--lm-surface-2) !important; }
html[data-lm-theme="dark"] .border,
html[data-lm-theme="dark"] .border-top,
html[data-lm-theme="dark"] .border-bottom,
html[data-lm-theme="dark"] .border-start,
html[data-lm-theme="dark"] .border-end { border-color: var(--lm-border) !important; }
html[data-lm-theme="dark"] hr { border-color: var(--lm-border) !important; }
/* Wallet credit big number / settings titles */
html[data-lm-theme="dark"] h1,
html[data-lm-theme="dark"] h2,
html[data-lm-theme="dark"] h3,
html[data-lm-theme="dark"] h4,
html[data-lm-theme="dark"] h5,
html[data-lm-theme="dark"] h6,
html[data-lm-theme="dark"] .main-title,
html[data-lm-theme="dark"] .main-title-page { color: var(--lm-text) !important; }
/* Wallet "Your Credit" card */
html[data-lm-theme="dark"] .credit-card,
html[data-lm-theme="dark"] .wallet-credit { background: var(--lm-surface) !important; color: var(--lm-text) !important; border-color: var(--lm-border) !important; }
/* Tabs in settings (left-side menu) */
html[data-lm-theme="dark"] .settings-menu,
html[data-lm-theme="dark"] .settings-sidebar {
  background: var(--lm-surface) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .dropdown-menu {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .dropdown-item { color: var(--lm-text) !important; }
html[data-lm-theme="dark"] .dropdown-item:hover { background: var(--lm-surface-2) !important; color: var(--lm-text) !important; }
html[data-lm-theme="dark"] .dropdown-divider { border-top-color: var(--lm-border) !important; }
html[data-lm-theme="dark"] .modal-content {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .modal-header,
html[data-lm-theme="dark"] .modal-footer { border-color: var(--lm-border) !important; }
html[data-lm-theme="dark"] .btn-close { filter: invert(1) brightness(2); }
html[data-lm-theme="dark"] .pagination .page-link {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .pagination .page-item.active .page-link {
  background: var(--lm-primary) !important;
  border-color: var(--lm-primary-strong) !important;
  color: #fff !important;
}
/* Sngine container backgrounds */
html[data-lm-theme="dark"] .row.m-0 > .col,
html[data-lm-theme="dark"] .col-md-9,
html[data-lm-theme="dark"] .col-md-3 { color: var(--lm-text); }

/* Lang selector */
html[data-lm-theme="dark"] .lm-lang-trigger {
  background: var(--lm-surface-2);
  border-color: var(--lm-border);
  color: var(--lm-text);
}
html[data-lm-theme="dark"] .lm-lang-menu { background: var(--lm-surface); border-color: var(--lm-border); }
html[data-lm-theme="dark"] .lm-lang-item { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-lang-item:hover { background: var(--lm-surface-2); }

/* Lightbox + portfolio */
html[data-lm-theme="dark"] .pl-frame { background: var(--lm-surface); }
html[data-lm-theme="dark"] .pl-side { background: var(--lm-surface); border-left-color: var(--lm-border); }
html[data-lm-theme="dark"] .pl-side-head,
html[data-lm-theme="dark"] .pl-side-caption,
html[data-lm-theme="dark"] .pl-side-sortrow,
html[data-lm-theme="dark"] .pl-side-actions,
html[data-lm-theme="dark"] .pl-side-composer { border-color: var(--lm-border); }

/* Image fallback gradients on portfolio */
html[data-lm-theme="dark"] .lm-port-tile { background: var(--lm-surface-2); }

/* Service cards inner */
html[data-lm-theme="dark"] .lm-service { color: var(--lm-text); }

/* Empty states */
html[data-lm-theme="dark"] .lm-empty { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-empty-title { color: var(--lm-text); }

/* About section in rail */
html[data-lm-theme="dark"] .lm-about-field-label { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-about-field-value { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-about-field-empty { color: var(--lm-muted-2); }

/* Profile completion list */
html[data-lm-theme="dark"] .lm-completion li { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-completion li.is-done { color: var(--lm-muted-2); }
html[data-lm-theme="dark"] .lm-completion-dot {
  background: var(--lm-surface-2);
  border-color: var(--lm-border);
  color: var(--lm-muted);
}
html[data-lm-theme="dark"] .lm-completion li.is-done .lm-completion-dot {
  background: var(--lm-primary-soft);
  border-color: var(--lm-primary-soft-2);
  color: var(--lm-primary-text);
}

/* Progress bar */
html[data-lm-theme="dark"] .lm-progress { background: var(--lm-surface-2); }

/* Action menu (more dropdown) */
html[data-lm-theme="dark"] .lm-menu {
  background: var(--lm-surface);
  border-color: var(--lm-border);
}
html[data-lm-theme="dark"] .lm-menu-item { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-menu-item:hover { background: var(--lm-surface-2); }

/* Notifications + saved + inbox panels */
html[data-lm-theme="dark"] .lm-pop-panel {
  background: var(--lm-surface);
  border-color: var(--lm-border);
  color: var(--lm-text);
}
html[data-lm-theme="dark"] .lm-pop-head { border-bottom-color: var(--lm-border); }
html[data-lm-theme="dark"] .lm-pop-item:hover { background: var(--lm-surface-2); }
html[data-lm-theme="dark"] .lm-pop-title { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-pop-sub { color: var(--lm-muted); }

/* Create button stays primary green — no override needed */

/* Report modal */
.lm-report-form { display: flex; flex-direction: column; gap: 12px; }

/* ══════════════════════════════════════════════════════════════
   R19: BUY CONTENT MODAL
   ══════════════════════════════════════════════════════════════ */
.lm-buy-scrim {
  position: fixed; inset: 0;
  background: rgba(15,23,42,0.45);
  backdrop-filter: blur(4px);
  /* R20h: centered vertically; scrim still scrolls if window very short.
     `safe center` keeps top reachable when content overflows. */
  display: flex;
  align-items: safe center;
  justify-content: center;
  overflow-y: auto;
  z-index: 600; padding: 32px 24px;
  animation: lm-fade .15s ease;
}
.lm-buy-modal {
  background: #fff; border-radius: 16px;
  width: 100%; max-width: 880px;
  overflow: visible;
  box-shadow: 0 24px 60px rgba(15,23,42,0.25);
  animation: lm-pop .18s ease;
}
.lm-buy-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 18px 22px; border-bottom: 1px solid var(--lm-border);
  position: sticky; top: 0; background: #fff; z-index: 1;
  border-radius: 16px 16px 0 0;
}
.lm-buy-head-wrap { display: flex; align-items: center; gap: 12px; }
.lm-buy-head-ic {
  width: 32px; height: 32px; border-radius: 8px;
  background: var(--lm-primary-soft);
  border: 1px solid var(--lm-primary-soft-2);
  color: var(--lm-primary-strong);
  display: grid; place-items: center; flex-shrink: 0;
}
.lm-buy-title { margin: 0; font-size: 16px; font-weight: 600; letter-spacing: -0.01em; }
.lm-buy-subtitle { font-size: 12px; color: var(--lm-muted); margin-top: 2px; }
.lm-buy-close {
  width: 32px; height: 32px; display: grid; place-items: center;
  border-radius: 8px; color: var(--lm-muted); cursor: pointer; background: none; border: none;
}
.lm-buy-close:hover { background: var(--lm-surface-2); color: var(--lm-text); }
.lm-buy-body { padding: 22px; }
.lm-buy-grid {
  display: grid;
  grid-template-columns: minmax(0,1fr) 320px;
  gap: 24px;
}
@media (max-width: 760px) { .lm-buy-grid { grid-template-columns: 1fr; } }
.lm-buy-preview {
  width: 100%; height: 230px; margin: 0 0 14px;
  border-radius: 10px; border: 1px solid var(--lm-border);
  overflow: hidden; background: var(--lm-surface-2, #f4f5f7);
}
.lm-buy-preview[hidden] { display: none; }   /* no banner -> omit the slot */
.lm-buy-preview-img { width: 100%; height: 100%; object-fit: cover; display: block; }
.lm-buy-fee-rate { color: var(--lm-muted); font-weight: 400; }
.lm-buy-desc { margin: 12px 0 0; font-size: 13px; color: var(--lm-text); line-height: 1.5; }
.lm-buy-field { margin-top: 16px; }
.lm-buy-label {
  display: block; font-size: 11.5px; font-weight: 600;
  color: var(--lm-muted); letter-spacing: 0.04em; text-transform: uppercase;
  margin-bottom: 6px;
}
.lm-buy-includes {
  margin: 16px 0 0; padding: 0; list-style: none;
  display: flex; flex-direction: column; gap: 7px;
}
.lm-buy-includes li {
  display: flex; align-items: center; gap: 8px;
  font-size: 12.5px; color: var(--lm-text);
}
.lm-buy-includes li svg { color: var(--lm-primary-strong); flex-shrink: 0; }
.lm-buy-summary {
  background: var(--lm-surface);
  border: 1px solid var(--lm-border);
  border-radius: 12px; padding: 16px;
  display: flex; flex-direction: column; gap: 8px;
}
.lm-buy-summary-row {
  display: flex; align-items: center; justify-content: space-between;
  font-size: 13px; color: var(--lm-text);
}
.lm-buy-summary-val { font-family: var(--lm-font-mono); font-weight: 500; }
.lm-buy-summary-divider { height: 1px; background: var(--lm-border); margin: 4px 0; }
.lm-buy-total-row { font-size: 14px; font-weight: 600; }
.lm-buy-total {
  font-family: var(--lm-font-mono); font-weight: 700; font-size: 18px;
  color: var(--lm-text);
}
.lm-buy-pay-btn {
  width: 100%; margin-top: 6px;
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
}
.lm-buy-escrow {
  margin: 8px 0 0; font-size: 11px; color: var(--lm-muted); text-align: center;
}


/* ══════════════════════════════════════════════════════════════
   R20d: Global LM page footer (non-profile pages)
   Horizontal bar pinned at bottom of main-wrapper content area.
   Aligned with the centered 1440 frame so it sits inside chrome.
   ══════════════════════════════════════════════════════════════ */
/* R20z: full-viewport-width footer band — copyright extreme-left,
   controls extreme-right. Drops the prior chrome-frame margin-left
   that pushed the footer to start at the sidebar's right edge. */
html.lm-chrome-active .lm-page-footer {
  background: #fff;
  border-top: 1px solid var(--lm-border);
  margin: 0;
  padding: 14px 24px 16px;
  width: 100%;
  position: relative;
  z-index: 5;
}
/* LM: settings-style pinned footer on simple single-column pages
   (body.lm-pin-footer set in _header.tpl for support/contact/static/about/
   notifications/saved). The wrapper becomes a full-height flex column so the
   footer drops to the viewport bottom when content is short; sticky keeps it
   visible while scrolling. Also kills dead-scroll: min-height makes the page
   exactly one viewport tall when content fits. Multi-column pages (feed/
   profile/discover) lack the class, so they're untouched. */
body.lm-pin-footer .main-wrapper {
  min-height: calc(100vh - 64px);
  display: flex;
  flex-direction: column;
}
body.lm-pin-footer .main-wrapper > .lm-page-footer {
  margin-top: auto;
  position: sticky;
  bottom: 0;
}
/* Dark theme: the footer hard-codes a white bg — match the surface instead. */
html[data-lm-theme="dark"] body.lm-pin-footer .main-wrapper > .lm-page-footer {
  background: var(--lm-surface);
  border-top-color: var(--lm-border);
}
/* Kill dead-scroll: these page wrappers hard-code a viewport-fill min-height
   (.lm-bookings-page → calc(100vh-60px) on notifications/saved; .lms-app →
   100vh on support), which — stacked with the 64px header + 58px footer —
   forces ~120px of empty scroll on short content. Cap them to exactly
   viewport − header − footer so the bg still fills to the footer but the page
   is no taller than one screen when content fits. Long content still scrolls. */
body.lm-pin-footer .lm-bookings-page,
body.lm-pin-footer .lms-page .lms-app,
body.lm-pin-footer .x_content_row > .col-lg-12,
body.lm-pin-footer .x_content_row > .col-lg-8 {
  min-height: calc(100vh - 64px - 58px);
}
.lm-page-footer-inner { max-width: none; margin: 0; width: 100%; }
.lm-page-footer-row {
  display: flex; align-items: center;
  justify-content: space-between;   /* push left and right apart */
  gap: 18px; flex-wrap: nowrap;     /* single horizontal row */
  font-size: 11.5px; color: var(--lm-muted);
}
.lm-page-footer-left {
  display: flex; align-items: center; gap: 18px;
  flex: 1 1 auto;
  min-width: 0;
  flex-wrap: nowrap;
  overflow: hidden;
}
.lm-page-footer-copy {
  font-family: var(--lm-font-mono);
  letter-spacing: 0.01em;
  color: var(--lm-muted);
  flex-shrink: 0;
  white-space: nowrap;
}
.lm-page-footer-links {
  display: flex; gap: 18px;
  font-size: 11.5px;
  flex-wrap: nowrap;
  overflow: hidden;
}
.lm-page-footer-links a { color: var(--lm-muted); white-space: nowrap; }
.lm-page-footer-links a:hover { color: var(--lm-primary); }
.lm-page-footer-controls {
  display: flex; align-items: center; gap: 10px;
  flex-shrink: 0;                   /* never compress the controls */
}

@media (max-width: 768px) {
  /* Stack vertically on mobile: copy + links above, controls below */
  .lm-page-footer-row {
    flex-direction: column;
    gap: 6px;
    text-align: center;
    flex-wrap: wrap;
  }
  .lm-page-footer-left {
    flex-direction: column;
    gap: 4px;
    flex-wrap: wrap;
    overflow: visible;
  }
  .lm-page-footer-links { flex-wrap: wrap; justify-content: center; gap: 4px 14px; }
  .lm-page-footer-controls { margin-left: 0; }
  /* R20A: compact mobile footer. padding-bottom = bottom-bar height (70px)
     + iOS safe-area, just enough to keep the footer content scrollable
     above the fixed .footer-bottom-bar without extra dead space. */
  html.lm-chrome-active .lm-page-footer {
    /* padding: 20px 0px 20px 0px; */
  }
}

/* ══════════════════════════════════════════════════════════════
   R20p: Sngine — chat popup, post publisher, floating menus,
   message thread, all remaining bootstrap-styled UI in dark mode
   ══════════════════════════════════════════════════════════════ */

/* Chat popup window (when you click chat with someone) */
html[data-lm-theme="dark"] .panel-messages,
html[data-lm-theme="dark"] .chat-floating-box,
html[data-lm-theme="dark"] .x_chat_box {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .panel-messages .card-header,
html[data-lm-theme="dark"] .panel-messages .card-body,
html[data-lm-theme="dark"] .panel-messages .card-footer {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .panel-messages textarea,
html[data-lm-theme="dark"] .js_post-message {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .chat-message,
html[data-lm-theme="dark"] .message {
  color: var(--lm-text) !important;
}
/* Chat bubbles — incoming = surface-2, outgoing = primary keeps */
html[data-lm-theme="dark"] .chat-message-text,
html[data-lm-theme="dark"] .message-text,
html[data-lm-theme="dark"] .x_chat_msg_in,
html[data-lm-theme="dark"] .message_in {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .chat-time,
html[data-lm-theme="dark"] .message-time { color: var(--lm-muted) !important; }

/* Post publisher (Create Post — the textarea modal) */
html[data-lm-theme="dark"] .publisher-overlay { background: rgba(0,0,0,0.7) !important; }
html[data-lm-theme="dark"] .publisher,
html[data-lm-theme="dark"] .publisher-box,
html[data-lm-theme="dark"] .publisher-content {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .publisher-message,
html[data-lm-theme="dark"] .publisher-message textarea,
html[data-lm-theme="dark"] .publisher-tools-input,
html[data-lm-theme="dark"] .publisher textarea,
html[data-lm-theme="dark"] .post-message-text {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .publisher textarea::placeholder,
html[data-lm-theme="dark"] .publisher-message::placeholder { color: var(--lm-muted-2) !important; }
html[data-lm-theme="dark"] .publisher-tools,
html[data-lm-theme="dark"] .publisher-actions {
  background: var(--lm-surface) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .publisher-tool,
html[data-lm-theme="dark"] .publisher-action {
  color: var(--lm-muted) !important;
}
html[data-lm-theme="dark"] .publisher-tool:hover,
html[data-lm-theme="dark"] .publisher-action:hover {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .publisher-close { color: var(--lm-muted) !important; }
html[data-lm-theme="dark"] .publisher-close:hover { color: var(--lm-text) !important; }

/* Floating action menus (settings cog at bottom-right with Manage Blocking, etc.) */
html[data-lm-theme="dark"] .x_user_menu_dropdown,
html[data-lm-theme="dark"] .x_user_setting_menu,
html[data-lm-theme="dark"] .floating-menu,
html[data-lm-theme="dark"] .action-dropdown-menu {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .x_user_menu_dropdown a,
html[data-lm-theme="dark"] .x_user_menu_dropdown .dropdown-item,
html[data-lm-theme="dark"] .floating-menu .dropdown-item {
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .x_user_menu_dropdown a:hover,
html[data-lm-theme="dark"] .floating-menu .dropdown-item:hover {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .dropdown-header,
html[data-lm-theme="dark"] .dropdown-subheader { color: var(--lm-muted) !important; }
html[data-lm-theme="dark"] .dropdown-item-icon-wrap,
html[data-lm-theme="dark"] .dropdown-item-icon { color: var(--lm-text) !important; }

/* Floating Action Button (FAB) at bottom-right (settings cog + new message) */
html[data-lm-theme="dark"] .float-action-btn,
html[data-lm-theme="dark"] .x_floating_btn,
html[data-lm-theme="dark"] .new-msg-btn {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}

/* Packages / pricing page */
html[data-lm-theme="dark"] .package,
html[data-lm-theme="dark"] .package-box,
html[data-lm-theme="dark"] .pricing-table,
html[data-lm-theme="dark"] .pricing-card {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .package-name,
html[data-lm-theme="dark"] .package-price,
html[data-lm-theme="dark"] .package-feature,
html[data-lm-theme="dark"] .package-features li { color: var(--lm-text) !important; }
html[data-lm-theme="dark"] .package-feature .feat-label,
html[data-lm-theme="dark"] .package-features-light { color: var(--lm-muted) !important; }
html[data-lm-theme="dark"] .package-period-tabs,
html[data-lm-theme="dark"] .pricing-period-toggle {
  background: var(--lm-surface-2) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .package-tag,
html[data-lm-theme="dark"] .package-recommended {
  background: var(--lm-primary-soft) !important;
  color: var(--lm-primary-text) !important;
  border-color: var(--lm-primary-soft-2) !important;
}

/* Generic: any direct white-bg utilities */
html[data-lm-theme="dark"] .bg-white,
html[data-lm-theme="dark"] .bg-light,
html[data-lm-theme="dark"] [style*="background: #fff"],
html[data-lm-theme="dark"] [style*="background:#fff"],
html[data-lm-theme="dark"] [style*="background: white"] {
  background: var(--lm-surface) !important;
}

/* New Message recipient picker modal */
html[data-lm-theme="dark"] .modal-dialog .modal-content,
html[data-lm-theme="dark"] .modal-content { background: var(--lm-surface) !important; color: var(--lm-text) !important; }
html[data-lm-theme="dark"] .modal-title { color: var(--lm-text) !important; }
html[data-lm-theme="dark"] .modal .form-control,
html[data-lm-theme="dark"] .x_chat_recipients_input {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .modal-body,
html[data-lm-theme="dark"] .modal-header,
html[data-lm-theme="dark"] .modal-footer { background: var(--lm-surface) !important; }

/* Buttons inside Sngine pages — secondary/ghost variants */
html[data-lm-theme="dark"] .btn-light,
html[data-lm-theme="dark"] .btn-outline-secondary,
html[data-lm-theme="dark"] .btn-outline-light {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .btn-light:hover,
html[data-lm-theme="dark"] .btn-outline-secondary:hover {
  background: var(--lm-bg) !important;
  border-color: var(--lm-muted-2) !important;
  color: var(--lm-text) !important;
}

/* Input groups */
html[data-lm-theme="dark"] .input-group-text { background: var(--lm-surface-2) !important; color: var(--lm-text) !important; border-color: var(--lm-border) !important; }

/* R20q: Report + Block modal radio/checkbox cards in dark mode */
html[data-lm-theme="dark"] .lm-report-reason {
  background: var(--lm-surface-2);
  border-color: var(--lm-border);
  color: var(--lm-text);
}
html[data-lm-theme="dark"] .lm-report-reason:hover {
  background: var(--lm-primary-soft);
  border-color: var(--lm-primary-soft-2);
  color: var(--lm-primary-text);
}
html[data-lm-theme="dark"] .lm-report-reason:has(input:checked),
html[data-lm-theme="dark"] .lm-report-reason.is-active {
  background: var(--lm-primary-soft);
  border-color: var(--lm-primary-soft-2);
  color: var(--lm-primary-text);
}
html[data-lm-theme="dark"] .lm-report-reason input[type="radio"] {
  background: var(--lm-surface-2);
  border-color: var(--lm-muted-2);
}
html[data-lm-theme="dark"] .lm-report-reason input[type="radio"]:checked {
  border-color: var(--lm-primary);
  background: var(--lm-surface-2);
}

/* Block modal checklist items */
html[data-lm-theme="dark"] .lm-block-list li {
  color: var(--lm-text);
  background: transparent;
}
html[data-lm-theme="dark"] .lm-block-list li svg { color: var(--lm-primary-text); }

/* Modal recent-icon badges (red/blue tinted boxes that hold svg) keep their tint
   but text below uses dark-theme tokens */
html[data-lm-theme="dark"] .lm-modal-title-wrap > div h3,
html[data-lm-theme="dark"] .lm-modal-title { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-modal-sub { color: var(--lm-muted); }

/* Textarea inside report/block modal */
html[data-lm-theme="dark"] .lm-textarea,
html[data-lm-theme="dark"] textarea.lm-textarea {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .lm-textarea::placeholder { color: var(--lm-muted-2) !important; }
html[data-lm-theme="dark"] .lm-field-label { color: var(--lm-muted); }
html[data-lm-theme="dark"] .lm-input { background: var(--lm-surface-2) !important; color: var(--lm-text) !important; border-color: var(--lm-border) !important; }

/* ══════════════════════════════════════════════════════════════
   R20r: Final dark cleanup — chat name, FABs, toggles, Post btn,
   packages, modal close buttons
   ══════════════════════════════════════════════════════════════ */

/* Chat panel header — name link uses Bootstrap .text-dark which is invisible in dark */
html[data-lm-theme="dark"] .panel-messages .card-header,
html[data-lm-theme="dark"] .panel-messages .card-header a,
html[data-lm-theme="dark"] .panel-messages .card-header a.text-dark {
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .panel-messages .card-header { font-weight: 600; }

/* Chat sidebar (right floating column with cog FAB + new chat FAB) */
html[data-lm-theme="dark"] .chat-sidebar,
html[data-lm-theme="dark"] .chat-sidebar-footer {
  /* background: var(--lm-bg); */
  /* border-color: var(--lm-border); */
}
html[data-lm-theme="dark"] .btn-chat,
html[data-lm-theme="dark"] .btn.btn-chat {
  background: var(--lm-surface) !important;
  border: 1px solid var(--lm-border) !important;
  color: var(--lm-text) !important;
  box-shadow: 0 2px 8px rgba(0,0,0,0.3);
}
html[data-lm-theme="dark"] .btn-chat:hover,
html[data-lm-theme="dark"] .btn.btn-chat:hover {
  background: var(--lm-surface-2) !important;
  border-color: var(--lm-primary) !important;
  color: var(--lm-primary-text) !important;
}
html[data-lm-theme="dark"] .btn-chat .main-icon,
html[data-lm-theme="dark"] .btn.btn-chat .main-icon,
html[data-lm-theme="dark"] .btn-chat svg { color: var(--lm-text) !important; }

/* Bootstrap form-switch toggles (Schedule Post, Anonymous Post) — dark thumb instead of bright white */
html[data-lm-theme="dark"] .form-switch .form-check-input {
  background-color: var(--lm-surface-2) !important;
  border-color: var(--lm-border) !important;
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%238b949e'/%3e%3c/svg%3e") !important;
}
html[data-lm-theme="dark"] .form-switch .form-check-input:checked {
  background-color: var(--lm-primary) !important;
  border-color: var(--lm-primary-strong) !important;
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e") !important;
}
html[data-lm-theme="dark"] .form-check-input { background-color: var(--lm-surface-2) !important; border-color: var(--lm-border) !important; }
html[data-lm-theme="dark"] .form-check-input:checked { background-color: var(--lm-primary) !important; border-color: var(--lm-primary-strong) !important; }
html[data-lm-theme="dark"] .form-check-label { color: var(--lm-text) !important; }

/* Post button — Bootstrap btn-primary should use LM primary green */
html[data-lm-theme="dark"] .btn-primary,
html[data-lm-theme="dark"] .btn.btn-primary {
  background: var(--lm-primary) !important;
  border-color: var(--lm-primary-strong) !important;
  color: #fff !important;
}
html[data-lm-theme="dark"] .btn-primary:hover,
html[data-lm-theme="dark"] .btn.btn-primary:hover {
  background: var(--lm-primary-strong) !important;
  border-color: var(--lm-primary-strong) !important;
}

/* Bootstrap btn-close (the X button on modals) — ensure white in dark */
html[data-lm-theme="dark"] .btn-close,
html[data-lm-theme="dark"] button.btn-close {
  filter: invert(1) brightness(2) !important;
  opacity: 0.85 !important;
}
html[data-lm-theme="dark"] .btn-close:hover { opacity: 1 !important; }
html[data-lm-theme="dark"] .publisher-close,
html[data-lm-theme="dark"] .post-publisher-close,
html[data-lm-theme="dark"] [class*="close"] svg {
  color: var(--lm-text) !important;
  opacity: 0.7;
}
html[data-lm-theme="dark"] [class*="close"]:hover svg { opacity: 1; }

/* Packages page — clean up card layout in dark */
html[data-lm-theme="dark"] .package,
html[data-lm-theme="dark"] .package-box,
html[data-lm-theme="dark"] .pricing-card,
html[data-lm-theme="dark"] .pricing-table,
html[data-lm-theme="dark"] .package-current,
html[data-lm-theme="dark"] .package-recommended,
html[data-lm-theme="dark"] .package-tag {
  background: var(--lm-surface) !important;
  border: 1px solid var(--lm-border) !important;
}
html[data-lm-theme="dark"] .package-current,
html[data-lm-theme="dark"] .package-recommended {
  border-color: var(--lm-primary-soft-2) !important;
}
html[data-lm-theme="dark"] .package h2,
html[data-lm-theme="dark"] .package h3,
html[data-lm-theme="dark"] .package h4,
html[data-lm-theme="dark"] .package h5,
html[data-lm-theme="dark"] .package-name,
html[data-lm-theme="dark"] .package-price,
html[data-lm-theme="dark"] .package-features li,
html[data-lm-theme="dark"] .package-billing,
html[data-lm-theme="dark"] .package-feature-name,
html[data-lm-theme="dark"] .package-feature-value { color: var(--lm-text) !important; }
html[data-lm-theme="dark"] .package-billing,
html[data-lm-theme="dark"] .package-period,
html[data-lm-theme="dark"] .package-savings { color: var(--lm-muted) !important; }
html[data-lm-theme="dark"] .package-feature {
  border-color: var(--lm-border-2) !important;
}
html[data-lm-theme="dark"] .package-feature-row,
html[data-lm-theme="dark"] .package-features li {
  border-color: var(--lm-border-2) !important;
}
/* Period toggle (Yearly/Quarterly/Monthly) — segmented control */
html[data-lm-theme="dark"] .package-period-toggle,
html[data-lm-theme="dark"] .pricing-period-toggle,
html[data-lm-theme="dark"] .package-period-tabs {
  background: var(--lm-surface-2) !important;
  border: 1px solid var(--lm-border) !important;
}
html[data-lm-theme="dark"] .package-period-toggle a,
html[data-lm-theme="dark"] .pricing-period-toggle a { color: var(--lm-muted) !important; }
html[data-lm-theme="dark"] .package-period-toggle a.active,
html[data-lm-theme="dark"] .pricing-period-toggle a.active {
  background: var(--lm-primary) !important;
  color: #fff !important;
}
/* Yearly/Quarterly/Monthly inactive pills (white pills in screenshot) */
html[data-lm-theme="dark"] .nav-pills .nav-link,
html[data-lm-theme="dark"] .pricing-tabs .nav-link {
  background: transparent !important;
  color: var(--lm-muted) !important;
}
html[data-lm-theme="dark"] .nav-pills .nav-link.active,
html[data-lm-theme="dark"] .pricing-tabs .nav-link.active {
  background: var(--lm-primary) !important;
  color: #fff !important;
}

/* Generic Bootstrap close icon — white-on-dark */
html[data-lm-theme="dark"] .modal .btn-close,
html[data-lm-theme="dark"] .publisher .btn-close { filter: invert(1) brightness(2) !important; }

/* Chat avatar status indicator inside conversation */
html[data-lm-theme="dark"] .chat-avatar-online { border-color: var(--lm-surface) !important; }

/* ══════════════════════════════════════════════════════════════
   R20s: Specificity-busting overrides for Sngine Bootstrap defaults
   - .btn-primary uses :not(:disabled):not(.disabled) selectors which
     out-specificity our simpler html[data-lm-theme] selector
   - .conversation-body .text + chat-widget head live in different
     class trees than .panel-messages we targeted earlier
   ══════════════════════════════════════════════════════════════ */

/* Chat widget popup (the one that pops up when you click chat with someone) */
html[data-lm-theme="dark"] .chat-widget,
html[data-lm-theme="dark"] .chat-widget.chat-box {
  background: var(--lm-surface) !important;
  border-color: var(--lm-border) !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .chat-widget-head {
  background: var(--lm-surface) !important;
  border-bottom: 1px solid var(--lm-border) !important;
}
html[data-lm-theme="dark"] .chat-widget-head .name,
html[data-lm-theme="dark"] .chat-widget-head .name span,
html[data-lm-theme="dark"] .chat-user-card,
html[data-lm-theme="dark"] .chat-user-card .name,
html[data-lm-theme="dark"] .chat-user-card .name span {
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .chat-widget-content { background: var(--lm-surface) !important; }
html[data-lm-theme="dark"] .chat-widget-input,
html[data-lm-theme="dark"] .chat-widget-input textarea {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .chat-head-btn { color: var(--lm-text) !important; }
html[data-lm-theme="dark"] .chat-head-btn:hover { background: var(--lm-surface-2) !important; }

/* Incoming chat bubble (.conversation-body .text) — was hardcoded #f0f2f5 */
html[data-lm-theme="dark"] .conversation-body .text,
html[data-lm-theme="dark"] body.night-mode .conversation-body .text {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .conversation.right .conversation-body .text {
  /* outgoing keeps brand link color but ensure white text */
  color: #fff !important;
}

/* Bootstrap btn-primary — higher specificity to beat Sngine's :not(:disabled):not(.disabled) */
html[data-lm-theme="dark"] .btn-primary,
html[data-lm-theme="dark"] .btn.btn-primary,
html[data-lm-theme="dark"] .btn-primary:not(:disabled):not(.disabled),
html[data-lm-theme="dark"] .btn-primary:not(:disabled):not(.disabled).active,
html[data-lm-theme="dark"] .btn-primary:not(:disabled):not(.disabled):active,
html[data-lm-theme="dark"] .show > .btn-primary.dropdown-toggle {
  background-color: var(--lm-primary) !important;
  background: var(--lm-primary) !important;
  border-color: var(--lm-primary-strong) !important;
  color: #fff !important;
  box-shadow: none !important;
}
html[data-lm-theme="dark"] .btn-primary:hover,
html[data-lm-theme="dark"] .btn.btn-primary:hover,
html[data-lm-theme="dark"] .btn-primary:not(:disabled):not(.disabled):hover {
  background-color: var(--lm-primary-strong) !important;
  background: var(--lm-primary-strong) !important;
  border-color: var(--lm-primary-strong) !important;
  color: #fff !important;
}

/* Bootstrap btn-light (Public pill, FABs, etc.) — same specificity treatment */
html[data-lm-theme="dark"] .btn-light,
html[data-lm-theme="dark"] .btn.btn-light,
html[data-lm-theme="dark"] .btn-light:not(:disabled):not(.disabled),
html[data-lm-theme="dark"] .btn-light:not(:disabled):not(.disabled).active,
html[data-lm-theme="dark"] .btn-light:not(:disabled):not(.disabled):active,
html[data-lm-theme="dark"] .show > .btn-light.dropdown-toggle {
  background-color: var(--lm-surface-2) !important;
  background: var(--lm-surface-2) !important;
  border-color: var(--lm-border) !important;
  color: var(--lm-text) !important;
  box-shadow: none !important;
}
html[data-lm-theme="dark"] .btn-light:hover,
html[data-lm-theme="dark"] .btn-light:not(:disabled):not(.disabled):hover {
  background-color: var(--lm-bg) !important;
  border-color: var(--lm-muted-2) !important;
  color: var(--lm-text) !important;
}

/* btn-close (X on publisher modal) — Sngine + Bootstrap: SVG-as-bg-image,
   filter inverts to white. Make sure it's visible AND positioned right. */
html[data-lm-theme="dark"] .btn-close,
html[data-lm-theme="dark"] button.btn-close,
html[data-lm-theme="dark"] .publisher-close .btn-close {
  filter: invert(1) brightness(1.5) !important;
  opacity: 0.9 !important;
  display: block !important;
  width: 1em !important;
  height: 1em !important;
}
html[data-lm-theme="dark"] .btn-close:hover { opacity: 1 !important; }
html[data-lm-theme="dark"] .publisher-close { z-index: 10 !important; }

/* Publisher .colored-text-wrapper textarea bg */
html[data-lm-theme="dark"] .publisher .colored-text-wrapper,
html[data-lm-theme="dark"] .publisher-message,
html[data-lm-theme="dark"] .publisher-message textarea {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
}

/* Chat widget close icon */
html[data-lm-theme="dark"] .chat-head-btn svg,
html[data-lm-theme="dark"] .chat-widget-head svg { color: var(--lm-text) !important; }

/* Generic Bootstrap dropdowns inside Sngine — make sure dropdown-toggle in dark uses surface */
html[data-lm-theme="dark"] .dropdown-toggle.btn-light,
html[data-lm-theme="dark"] .btn.dropdown-toggle.btn-light {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}

/* ══════════════════════════════════════════════════════════════
   R20t: Share modal social buttons + QR + chat recipient chip
   ══════════════════════════════════════════════════════════════ */

/* Share modal — social/messenger buttons (lm-share-net-btn was hardcoded #fff) */
html[data-lm-theme="dark"] .lm-profile-page .lm-share-net-btn,
html[data-lm-theme="dark"] .lm-share-net-btn {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .lm-share-net-btn:hover {
  background: var(--lm-surface-2) !important;
  border-color: var(--lm-primary) !important;
}
html[data-lm-theme="dark"] .lm-share-net-btn span:last-child { color: var(--lm-text); }

/* QR code box keeps light bg (QR codes need contrast for scanning) but border to dark */
html[data-lm-theme="dark"] .lm-share-qr-box {
  /* Dark theme: the QR itself is inverted (dark field + light-green modules,
     drawn by qr-code-styling), so the plate matches the modal surface instead
     of a glaring white square. */
  background: var(--lm-surface, #161b22);
  border-color: var(--lm-border, #2a3038);
}
html[data-lm-theme="dark"] .lm-share-qr-meta { color: var(--lm-text); }
html[data-lm-theme="dark"] .lm-share-qr-title { color: var(--lm-primary-text) !important; }
html[data-lm-theme="dark"] .lm-share-qr p,
html[data-lm-theme="dark"] .lm-share-qr-meta p { color: var(--lm-muted); }

/* Profile URL input (Copy link row) */
html[data-lm-theme="dark"] .lm-share-url-input,
html[data-lm-theme="dark"] .lm-share-input {
  background: var(--lm-surface-2) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}

/* Section labels in share modal */
html[data-lm-theme="dark"] .lm-share-label,
html[data-lm-theme="dark"] .lm-share-section-label { color: var(--lm-muted); }

/* New Message recipient chip (Sngine .tags li) — keep name + × on one line */
.tags li {
  display: inline-flex !important;
  align-items: center !important;
  gap: 4px !important;
  float: none !important;
  vertical-align: middle;
}
.tags li .btn-close {
  display: inline-flex !important;
  flex-shrink: 0;
  width: 14px !important;
  height: 14px !important;
  font-size: 8px;
  padding: 0 !important;
  margin: 0 !important;
  opacity: 0.5;
}

/* Dark theme overrides for .tags chips */
html[data-lm-theme="dark"] .tags li {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border: 1px solid var(--lm-border);
}
html[data-lm-theme="dark"] .tags li .btn-close {
  filter: invert(1) brightness(1.5) !important;
  opacity: 0.8;
}
html[data-lm-theme="dark"] .typeahead input {
  background: transparent !important;
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .chat-to .to { color: var(--lm-muted) !important; }
html[data-lm-theme="dark"] .chat-to { border-color: var(--lm-border) !important; }

/* Typeahead suggestion dropdown (the list with Alberto Parisian, Caleb Yundt, etc.) */
html[data-lm-theme="dark"] .typeahead-results,
html[data-lm-theme="dark"] .twitter-typeahead .tt-menu,
html[data-lm-theme="dark"] .tt-menu,
html[data-lm-theme="dark"] .tt-dropdown-menu {
  background: var(--lm-surface) !important;
  color: var(--lm-text) !important;
  border-color: var(--lm-border) !important;
}
html[data-lm-theme="dark"] .tt-suggestion,
html[data-lm-theme="dark"] .typeahead-result {
  color: var(--lm-text) !important;
  background: transparent !important;
}
html[data-lm-theme="dark"] .tt-suggestion:hover,
html[data-lm-theme="dark"] .tt-suggestion.tt-cursor {
  background: var(--lm-surface-2) !important;
}

/* ══════════════════════════════════════════════════════════════
   R20u: Settings titles, typeahead hover, filter count badge,
   Request sent confirmation banner
   ══════════════════════════════════════════════════════════════ */

/* Settings page — section titles + heading-small in right column */
html[data-lm-theme="dark"] .heading-small,
html[data-lm-theme="dark"] .card-header,
html[data-lm-theme="dark"] .card-header.with-icon,
html[data-lm-theme="dark"] .card-header.with-nav {
  color: var(--lm-text) !important;
}
html[data-lm-theme="dark"] .heading-small { color: var(--lm-muted) !important; }
/* Side nav items in settings */
html[data-lm-theme="dark"] .side-nav a,
html[data-lm-theme="dark"] .side-nav .static { color: var(--lm-text) !important; }
html[data-lm-theme="dark"] .side-nav a:hover { background: var(--lm-surface-2) !important; color: var(--lm-text) !important; }
html[data-lm-theme="dark"] .side-nav .active a,
html[data-lm-theme="dark"] .side-nav li.active a {
  background: var(--lm-primary-soft) !important;
  color: var(--lm-primary-text) !important;
}

/* Filter count badge — was hardcoded #fff in active state */
html[data-lm-theme="dark"] .lm-port-filter-count {
  background: var(--lm-surface-2) !important;
  color: var(--lm-muted) !important;
}
html[data-lm-theme="dark"] .lm-port-filter-btn.is-active .lm-port-filter-count {
  background: var(--lm-primary-soft-2) !important;
  color: var(--lm-primary-text) !important;
}
/* Same for tab-count circles */
html[data-lm-theme="dark"] .lm-tab-count {
  background: var(--lm-surface-2) !important;
  color: var(--lm-muted) !important;
}
html[data-lm-theme="dark"] .lm-tab.is-active .lm-tab-count {
  background: var(--lm-primary-soft-2) !important;
  color: var(--lm-primary-text) !important;
}
/* Light mode — also fix the active count which was hardcoded #fff (looked weird against green pill) */
.lm-port-filter-btn.is-active .lm-port-filter-count {
  background: var(--lm-primary-soft-2) !important;
  color: var(--lm-primary-strong) !important;
}

/* Typeahead suggestion hover — surface-2 surface in dark, surface in light */
.tt-suggestion:hover,
.tt-suggestion.tt-cursor,
.tt-dropdown-menu .tt-suggestion:hover {
  background: var(--lm-surface) !important;
}
html[data-lm-theme="dark"] .tt-suggestion:hover,
html[data-lm-theme="dark"] .tt-suggestion.tt-cursor,
html[data-lm-theme="dark"] .tt-dropdown-menu .tt-suggestion:hover {
  background: var(--lm-surface-2) !important;
}
/* Suggestion text contrast */
.tt-suggestion { color: var(--lm-text); }

/* Request sent confirmation banner — in dark, the bright #ecfdf5 was too glaring */
html[data-lm-theme="dark"] .lm-booking-confirm-banner {
  background: var(--lm-primary-soft) !important;
  border-color: var(--lm-primary-soft-2) !important;
}
html[data-lm-theme="dark"] .lm-booking-confirm-banner-title { color: var(--lm-primary-text) !important; }
html[data-lm-theme="dark"] .lm-booking-confirm-banner-sub { color: var(--lm-primary-text) !important; opacity: 0.85; }
html[data-lm-theme="dark"] .lm-booking-confirm-banner-ic { background: var(--lm-primary-strong) !important; color: #fff !important; }

/* ════════════════════════════════════════════════════════════
   R20M: Tier-themed booking CTAs (ELITE / VIP)
   Applies to ALL booking CTAs:
   - Hero "Check Availability"
   - Service "Request Booking" / mobile "Book"
   - Sticky bottom-bar Request Booking
   - Booking modal submit (#lm-booking-submit)
   Buttons visually match the user's tier badge so the booking
   experience reads as premium. Targets only `.lm-open-booking` and
   `#lm-booking-submit` so other primary CTAs (Share, Email, Buy,
   Report) keep their default green styling.
   ──────────────────────────────────────────────────────────── */

/* ───── ELITE: black/navy bg + gold border + gold text+icon ───── */
.lm-profile-page.is-tier-elite .lm-btn-primary.lm-open-booking,
.lm-profile-page.is-tier-elite #lm-booking-submit {
  background: linear-gradient(135deg, #1f2937, #0f172a) !important;
  color: #f5deb3 !important;
  border: 1px solid #d4a93f !important;
  box-shadow: 0 1px 0 rgba(0,0,0,0.25), inset 0 1px 0 rgba(245,222,179,0.08) !important;
}
.lm-profile-page.is-tier-elite .lm-btn-primary.lm-open-booking:hover,
.lm-profile-page.is-tier-elite #lm-booking-submit:hover {
  background: linear-gradient(135deg, #273548, #131c2e) !important;
  border-color: #e0b966 !important;
}
.lm-profile-page.is-tier-elite .lm-btn-primary.lm-open-booking svg,
.lm-profile-page.is-tier-elite #lm-booking-submit svg {
  color: #f5deb3 !important;
  stroke: #f5deb3 !important;
}

/* ───── VIP: cream-gold gradient + dark brown text+icon ───── */
.lm-profile-page.is-tier-vip .lm-btn-primary.lm-open-booking,
.lm-profile-page.is-tier-vip #lm-booking-submit {
  background: linear-gradient(135deg, #fef7d6, #f5deb3) !important;
  color: #6e4a04 !important;
  border: 1px solid #d4a93f !important;
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.6), 0 1px 2px rgba(180, 83, 9, 0.15) !important;
}
.lm-profile-page.is-tier-vip .lm-btn-primary.lm-open-booking:hover,
.lm-profile-page.is-tier-vip #lm-booking-submit:hover {
  background: linear-gradient(135deg, #fff3b8, #ecd194) !important;
  border-color: #b8923f !important;
}
.lm-profile-page.is-tier-vip .lm-btn-primary.lm-open-booking svg,
.lm-profile-page.is-tier-vip #lm-booking-submit svg {
  color: #6e4a04 !important;
  stroke: #6e4a04 !important;
  fill: none !important; /* booking icon is line-style; preserve outline */
}

/* R20E: VIP-tier CTA on profile page keeps LIGHT cream-gold in dark mode.

   Phase H R22 — fix "looks all-light in dark" feedback: the cream→pale-gold
   gradient (135deg, #fef7d6, #f5deb3) reads correctly in light mode because
   the LEFT cream merges into the white page (subtle) while the RIGHT pale
   gold pops. In dark mode BOTH cream + pale-gold contrast strongly with
   the dark page → entire button reads as one flat light blob.

   Fix: in dark mode, deepen the right side of the gradient to a darker
   gold (#d4a93f) so the button reads LIGHT-on-LEFT + RICH-on-RIGHT — same
   visual rhythm as light mode. Text/border/icon stay identical. */
html[data-lm-theme="dark"] .lm-profile-page.is-tier-vip .lm-btn-primary.lm-open-booking,
html[data-lm-theme="dark"] .lm-profile-page.is-tier-vip #lm-booking-submit {
  background: linear-gradient(135deg, #fef7d6, #e6c468) !important;
  color: #6e4a04 !important;
  border: 1px solid #d4a93f !important;
  box-shadow: none !important;
}
html[data-lm-theme="dark"] .lm-profile-page.is-tier-vip .lm-btn-primary.lm-open-booking:hover,
html[data-lm-theme="dark"] .lm-profile-page.is-tier-vip #lm-booking-submit:hover {
  background: linear-gradient(135deg, #fff3b8, #ecd194) !important;
  border-color: #b8923f !important;
}
html[data-lm-theme="dark"] .lm-profile-page.is-tier-vip .lm-btn-primary.lm-open-booking svg,
html[data-lm-theme="dark"] .lm-profile-page.is-tier-vip #lm-booking-submit svg {
  color: #6e4a04 !important;
  stroke: #6e4a04 !important;
}

/* Service "Book" button — ensure icon-LEFT alignment + consistent
   internal padding so the button content reads cleanly inside its
   tier-styled box. Mirrors mobile ::before swap so order is icon→text. */
.lm-profile-page.is-tier-elite .lm-service-side .lm-btn.lm-open-booking,
.lm-profile-page.is-tier-vip .lm-service-side .lm-btn.lm-open-booking {
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  gap: 8px !important;
}
.lm-profile-page.is-tier-elite .lm-service-side .lm-btn.lm-open-booking > svg,
.lm-profile-page.is-tier-vip .lm-service-side .lm-btn.lm-open-booking > svg {
  order: 0 !important;  /* icon LEFT */
  flex-shrink: 0 !important;
}

/* ══════════════════════════════════════════════════════════════
   R20V Phase 3.4 — Portfolio gallery + lightbox extensions
   ══════════════════════════════════════════════════════════════ */
/* Top-right badge row on portfolio cards. Holds gallery indicator
   (multi-photo) and pin badge (pinned to portfolio). Both flow
   horizontally; gallery is first, pin is to its right. */
.lm-port-badges {
  position: absolute;
  top: 8px; right: 8px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  z-index: 3;
  pointer-events: none;
}
.lm-port-gallery-badge {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 4px 8px;
  background: rgba(0,0,0,0.65);
  color: #fff;
  border-radius: 12px;
  font-family: var(--lm-font-mono, monospace);
  font-size: 11px;
  font-weight: 600;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
}
.lm-port-gallery-badge svg { color: #fff; }

/* Pin badge — indicates a portfolio post is pinned to the top.
   Same chip styling as gallery badge but with LM primary green tint
   so it reads as a positive state. */
.lm-port-pin-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 4px 6px;
  background: var(--lm-primary, #2f8a5f);
  color: #fff;
  border-radius: 12px;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
}
.lm-port-pin-badge svg { color: #fff; display: block; }

/* Lightbox dot indicators — show sibling position within current post */
.pl-dots {
  position: absolute;
  top: 56px; left: 50%;
  transform: translateX(-50%);
  display: flex; gap: 6px;
  z-index: 10;
  padding: 6px 10px;
  background: rgba(0,0,0,0.45);
  border-radius: 999px;
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
}
.pl-dot {
  width: 7px; height: 7px;
  border: 0;
  border-radius: 50%;
  background: rgba(255,255,255,0.4);
  cursor: pointer;
  padding: 0;
  transition: background .12s, transform .12s;
}
.pl-dot:hover { background: rgba(255,255,255,0.7); }
.pl-dot.is-active {
  background: #fff;
  transform: scale(1.3);
}

/* Disabled prev/next buttons at boundaries */
.pl-nav:disabled,
.pl-nav[disabled] {
  opacity: 0.3;
  cursor: not-allowed;
  pointer-events: none;
}

/* Portfolio empty state (when user has zero portfolio posts) */
.lm-portfolio-empty {
  padding: 60px 24px;
  text-align: center;
}
.lm-portfolio-empty .lm-empty-state-title { font-size: 18px; }
/* Soft green rounded tile behind the empty-state glyph so it reads as a
   styled badge rather than a bare dark icon. Self-centres (lm-discover.css,
   which carries the shared centering rules, isn't loaded on the profile). */
.lm-portfolio-empty .lm-empty-state-icon {
  display: grid;
  place-items: center;
  width: 88px;
  height: 88px;
  border-radius: 22px;
  background: var(--lm-primary-soft, #eef7f1);
  color: var(--lm-primary, #0f6f4f);
  margin: 0 auto 22px;
}
.lm-portfolio-empty .lm-empty-state-icon svg { width: 40px; height: 40px; }
html[data-lm-theme="dark"] .lm-portfolio-empty .lm-empty-state-icon {
  background: rgba(15, 111, 79, .16);
  color: var(--lm-primary-text, #5fcc94);
}

/* ══════════════════════════════════════════════════════════════
   R20V Phase 3.4 — Publisher destination + category block
   ══════════════════════════════════════════════════════════════ */
/* R20V Phase 3.4: compact one-line layout — label · radios · (category select).
   Sits inline within the publisher footer flex row instead of stacking. */
.lm-pub-destination {
  margin: 0 8px;
  padding: 6px 12px;
  background: var(--lm-surface, #f8fafc);
  border: 1px solid var(--lm-border, #e2e8f0);
  border-radius: 8px;
  display: inline-flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 12px;
  line-height: 1.2;
}
.lm-pub-dest-label {
  font-size: 11px;
  font-weight: 600;
  color: var(--lm-muted, #64748b);
  margin: 0;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  white-space: nowrap;
}
.lm-pub-dest-radios {
  display: inline-flex; gap: 12px;
  align-items: center;
}
.lm-pub-dest-radio {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 13px;
  color: var(--lm-text, #0f172a);
  cursor: pointer;
  white-space: nowrap;
}
.lm-pub-dest-radio input[type="radio"] {
  margin: 0;
  accent-color: var(--lm-primary, #2f8a5f);
}

/* R20V Phase 3.4: Edit Post modal — destination + tag editor.
   Single-row layout matching the publisher footer: label + radios on
   the left, tag block on the right. Wraps to 2 rows only on narrow
   modals (mobile / shrunk viewport). */
.lm-edit-destination {
  margin-top: 14px;
  padding-top: 14px;
  border-top: 1px solid var(--lm-border, #e2e8f0);
  display: flex; flex-wrap: wrap; align-items: center;
  gap: 10px 14px;
}
.lm-edit-dest-label {
  font-size: 11px;
  font-weight: 700;
  color: var(--lm-muted, #64748b);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin: 0;
  white-space: nowrap;
}
.lm-edit-dest-radios {
  display: inline-flex; flex-wrap: wrap; gap: 4px 16px;
  align-items: center;
}
.lm-edit-dest-radio {
  display: inline-flex; align-items: center; gap: 6px;
  margin: 0; cursor: pointer;
  font-size: 14px;
  white-space: nowrap;
}
.lm-edit-dest-radio input[type="radio"] {
  margin: 0;
  accent-color: var(--lm-primary, #2f8a5f);
}
.lm-edit-dest-tag {
  display: inline-flex; align-items: center; gap: 8px;
  margin-left: auto;
  padding-left: 14px;
  border-left: 1px solid var(--lm-border, #e2e8f0);
}
.lm-edit-dest-tag[hidden] { display: none; }
.lm-edit-dest-tag-label {
  font-size: 12px; font-weight: 600;
  color: var(--lm-muted, #64748b);
  text-transform: uppercase; letter-spacing: 0.04em;
  margin: 0;
}
.lm-edit-dest-tag-select {
  padding: 4px 22px 4px 10px;
  border: 1px solid var(--lm-border, #e2e8f0);
  border-radius: 5px;
  background: var(--lm-bg, #fff);
  color: var(--lm-text, #0f172a);
  font-size: 13px;
  font-family: inherit;
  cursor: pointer;
  height: 30px;
  min-width: 110px;
}
.lm-pub-dest-category {
  margin: 0;
  padding: 0 0 0 10px;
  border-top: 0;
  border-left: 1px solid var(--lm-border, #e2e8f0);
  display: inline-flex; align-items: center; gap: 8px;
}
.lm-pub-dest-cat-label {
  font-size: 12px;
  font-weight: 600;
  color: var(--lm-muted, #64748b);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  margin: 0;
}
.lm-pub-dest-cat-select {
  padding: 3px 22px 3px 8px;
  border: 1px solid var(--lm-border, #e2e8f0);
  border-radius: 5px;
  background: var(--lm-bg, #fff);
  color: var(--lm-text, #0f172a);
  font-size: 13px;
  font-family: inherit;
  cursor: pointer;
  height: 28px;
  width: auto;
  min-width: 100px;
}

/* ══════════════════════════════════════════════════════════════
   R20V Phase 3.4 — Publisher polish (Post button + X remover + hide More)
   ══════════════════════════════════════════════════════════════ */

/* Post button: green (LM primary), normal size. Stays green even when the
   publisher isn't focused, just dimmed so it reads as inactive without
   becoming washed-out gray. Sngine's base sets line-height:38px and
   min-width:100px — we don't override sizing, only colors + opacity. */
.publisher .publisher-footer-buttons .btn.btn-main,
.publisher .publisher-footer-buttons .js_publisher-btn,
.publisher .publisher-footer-buttons .btn.btn-main:focus,
.publisher .publisher-footer-buttons .btn.btn-main:focus-visible {
  background: var(--lm-primary, #2f8a5f) !important;
  border-color: var(--lm-primary, #2f8a5f) !important;
  color: #fff !important;
}
.publisher .publisher-footer-buttons .btn.btn-main:hover,
.publisher .publisher-footer-buttons .btn.btn-main:active {
  background: var(--lm-primary-strong, #246c4a) !important;
  border-color: var(--lm-primary-strong, #246c4a) !important;
  color: #fff !important;
}
/* When publisher is idle (no text, no focus): keep the green color but
   fade the button so it looks ready-but-not-yet-clickable. Sngine's
   default rule sets opacity:0.4 → we soften to 0.55 so the green still
   reads as the brand colour. */
body:not(.publisher-focus) .publisher .publisher-footer-buttons .btn.btn-main,
body:not(.publisher-focus) .publisher .publisher-footer-buttons .js_publisher-btn {
  opacity: 0.55 !important;
}

/* Photo preview "X" remover: Sngine's .btn-close inside .attachments li.item
   was a nearly-invisible black dot (background-size:11px clipped the X
   inside a 16px button). Make it a proper round close button: black
   circle, clear white X, ~22px so it reads as a control rather than
   debris in the corner. */
.publisher .attachments li.item button,
.publisher .attachments li.item button.btn-close,
.publisher-attachments li.item button,
.publisher-attachments li.item button.btn-close {
  width: 22px;
  height: 22px;
  padding: 0;
  background-color: rgba(0, 0, 0, 0.7);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat;
  background-position: center;
  background-size: 12px 12px !important;
  border-radius: 50%;
  border: 0;
  opacity: 1;
  top: 4px;
  right: 4px;
  cursor: pointer;
  transition: background-color .12s;
}
.publisher .attachments li.item button:hover,
.publisher .attachments li.item button.btn-close:hover,
.publisher-attachments li.item button:hover,
.publisher-attachments li.item button.btn-close:hover {
  background-color: rgba(0, 0, 0, 0.9);
  opacity: 1;
}

/* "More" dropdown is hidden directly via inline style in the template
   (lm-pub-more-hidden class) — :has() was unreliable on some browsers. */
.publisher .lm-pub-more-hidden,
.publisher .dropdown.lm-pub-more-hidden {
  display: none !important;
}

/* R20V Phase 3.4 (top-row layout): icons photo/album/video/audio/poll/
   location/file moved into the top toolbar alongside GIF/Feelings.
   Bump SVG size 20 → 24 so the row reads as primary actions. Same size
   when icons are parked in the bottom-footer idle row. */
.publisher .publisher-tools-tabs .publisher-tools-tab > svg,
.lm-pub-tools-parking .publisher-tools-tab > svg {
  width: 24px;
  height: 24px;
}

/* Vertical divider before "Options" — separates media/upload tools (left)
   from the Options gear (right). Auto-margin pushes Options to the row's
   end. Inert if Options block is not rendered (no flex item to push). */
.publisher .lm-pub-tool-divider {
  width: 1px;
  height: 22px;
  background: var(--lm-border, #e2e8f0);
  margin: 0 8px 0 auto;
  align-self: center;
  flex: 0 0 auto;
}

/* Post button sticks to the right edge of the publisher footer even when
   the "Where to publish?" block is hidden (only Post present). Without
   this, justify-content:between with one child anchors it to the left. */
.publisher .publisher-footer .publisher-footer-buttons {
  margin-left: auto;
}

/* R20V Phase 3.4 (tools-shuttle): the 7 LM upload-tool icons live wrapped
   in .lm-pub-tools-group. The wrapper is display:contents so its presence
   doesn't add a flex level — children become direct flex items of whichever
   container they're inside (top toolbar OR bottom-footer parking). */
.lm-pub-tools-group {
  display: contents;
}

/* The parking spot in the bottom footer renders icons in a horizontal row
   when the publisher is idle. When publisher is focused, lm-publisher.js
   shuttles the group back into the top toolbar — the parking becomes empty
   but stays in the DOM so the shuttle can park into it again on blur. */
.lm-pub-tools-parking {
  display: inline-flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 2px;
}
.lm-pub-tools-parking:empty {
  display: none;
}

/* R20V Phase 3.4: Album meta strip — compact layout with an inline
   "Add photos" CTA so the flow is "click Album → name it → click Add
   photos" without hunting for the separate Photos icon. */
.lm-pub-album-meta {
  padding: 6px 0;
}
.lm-pub-album-row {
  display: flex;
  align-items: center;
  gap: 10px;
  max-width: 560px;
}
.lm-pub-album-title {
  flex: 1 1 auto;
  min-width: 0;
  padding: 8px 12px;
  border: 1px solid var(--lm-border, #e2e8f0);
  border-radius: 8px;
  background: var(--lm-surface, #f8fafc);
  color: var(--lm-text, #0f172a);
  font-size: 14px;
  font-family: inherit;
}
.lm-pub-album-title:focus {
  outline: none;
  border-color: var(--lm-primary, #2f8a5f);
  background: #fff;
}
/* High-specificity + !important so the button keeps its green styling
   even inside Bootstrap modals (where Sngine and Bootstrap's .btn-close /
   .modal scoped rules can otherwise reset background/border to defaults). */
button.lm-pub-album-addphotos,
.publisher button.lm-pub-album-addphotos,
.modal button.lm-pub-album-addphotos {
  flex: 0 0 auto !important;
  display: inline-flex !important;
  align-items: center !important;
  gap: 6px !important;
  padding: 8px 14px !important;
  border: 1px solid var(--lm-primary, #2f8a5f) !important;
  border-radius: 8px !important;
  background: var(--lm-primary, #2f8a5f) !important;
  color: #fff !important;
  font-size: 13px !important;
  font-weight: 600 !important;
  font-family: inherit !important;
  cursor: pointer !important;
  white-space: nowrap !important;
  transition: background .12s, border-color .12s, opacity .12s !important;
  opacity: 0.55 !important;  /* idle = pale green */
  text-decoration: none !important;
  line-height: 1.2 !important;
  box-shadow: none !important;
}
/* Ready state: title typed → button becomes fully saturated. */
button.lm-pub-album-addphotos.is-ready,
.publisher button.lm-pub-album-addphotos.is-ready,
.modal button.lm-pub-album-addphotos.is-ready {
  opacity: 1 !important;
}
button.lm-pub-album-addphotos.is-ready:hover,
.publisher button.lm-pub-album-addphotos.is-ready:hover,
.modal button.lm-pub-album-addphotos.is-ready:hover {
  background: var(--lm-primary-strong, #246c4a) !important;
  border-color: var(--lm-primary-strong, #246c4a) !important;
}
/* Disabled (no title yet): same pale green look, no pointer. */
button.lm-pub-album-addphotos:disabled,
.publisher button.lm-pub-album-addphotos:disabled,
.modal button.lm-pub-album-addphotos:disabled {
  cursor: not-allowed !important;
  opacity: 0.55 !important;
  background: var(--lm-primary, #2f8a5f) !important;
  border-color: var(--lm-primary, #2f8a5f) !important;
  color: #fff !important;
}
button.lm-pub-album-addphotos svg,
.publisher button.lm-pub-album-addphotos svg,
.modal button.lm-pub-album-addphotos svg {
  flex: 0 0 auto !important;
  color: #fff !important;
  stroke: #fff !important;
}
.lm-pub-album-hint {
  margin-top: 6px;
  font-size: 12px;
  color: var(--lm-muted, #64748b);
  max-width: 560px;
}

/* R20V Phase 3.4: Portfolio AJAX filter — subtle "loading" state on the
   pane while category fetches. Just a soft fade; no spinner needed since
   the swap is fast (< 300ms typically). */
#lm-portfolio-pane.is-loading {
  opacity: 0.55;
  pointer-events: none;
  transition: opacity .12s;
}

/* ══════════════════════════════════════════════════════════════
   R20V Phase 3.4 — LM datepicker (replaces native datetime-local)
   ══════════════════════════════════════════════════════════════ */

/* Wrapper. The hidden native input lives inside but is fully invisible —
   we only use it as the form value carrier so existing Sngine submission
   code (post.js .js_publisher-schedule-date.val()) keeps working. */
.lm-pub-schedule-wrap {
  position: relative;
}
.lm-pub-schedule-hidden-input {
  position: absolute !important;
  opacity: 0 !important;
  pointer-events: none !important;
  width: 1px !important;
  height: 1px !important;
  overflow: hidden !important;
  clip: rect(0 0 0 0) !important;
  border: 0 !important;
  padding: 0 !important;
  margin: 0 !important;
}

/* Visible trigger button — entire field area is clickable. */
.lm-pub-schedule-trigger {
  display: flex;
  align-items: center;
  gap: 12px;
  width: 100%;
  padding: 12px 14px;
  background: var(--lm-bg, #fff);
  border: 1px solid var(--lm-border, #e2e8f0);
  border-radius: 10px;
  color: var(--lm-text, #0f172a);
  font-size: 14px;
  font-family: inherit;
  text-align: left;
  cursor: pointer;
  transition: border-color .15s, box-shadow .15s, background .15s;
}
.lm-pub-schedule-trigger:hover {
  border-color: var(--lm-primary, #2f8a5f);
  background: var(--lm-surface, #f8fafc);
}
.lm-pub-schedule-trigger:focus-visible {
  outline: none;
  border-color: var(--lm-primary, #2f8a5f);
  box-shadow: 0 0 0 3px rgba(47, 138, 95, 0.15);
}
.lm-pub-schedule-trigger-label {
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--lm-muted, #64748b);
  flex: 0 0 auto;
}
.lm-pub-schedule-trigger-value {
  flex: 1 1 auto;
  color: var(--lm-muted, #64748b);
  font-size: 14px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.lm-pub-schedule-wrap.has-value .lm-pub-schedule-trigger-value {
  color: var(--lm-text, #0f172a);
  font-weight: 500;
}
.lm-pub-schedule-trigger-icon {
  flex: 0 0 auto;
  color: var(--lm-primary, #2f8a5f);
  width: 20px;
  height: 20px;
  /* Vertical alignment — explicit so it sits dead-center in the row
     regardless of font line-box shifts. */
  display: block;
  align-self: center;
}
.lm-pub-schedule-hint {
  font-size: 12px;
  color: var(--lm-muted, #64748b);
  margin-top: 6px;
  padding-left: 2px;
}

/* Popover */
.lm-dp-pop {
  position: absolute;
  z-index: 10000;
  width: 320px;
  padding: 14px;
  background: var(--lm-bg, #fff);
  border: 1px solid var(--lm-border, #e2e8f0);
  border-radius: 14px;
  box-shadow: 0 12px 32px rgba(15, 23, 42, 0.12), 0 2px 6px rgba(15, 23, 42, 0.06);
  font-family: inherit;
  font-size: 14px;
  color: var(--lm-text, #0f172a);
  user-select: none;
  animation: lm-dp-fadein 140ms ease-out;
}
@keyframes lm-dp-fadein {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: translateY(0); }
}

.lm-dp-head {
  display: flex;
  align-items: center;
  gap: 4px;
  margin-bottom: 10px;
}
.lm-dp-month-label {
  flex: 1 1 auto;
  background: transparent;
  border: 0;
  padding: 6px 10px;
  font-family: inherit;
  font-size: 14px;
  font-weight: 600;
  color: var(--lm-text, #0f172a);
  cursor: pointer;
  border-radius: 6px;
  text-align: center;
  transition: background .12s;
}
.lm-dp-month-label:hover {
  background: var(--lm-surface, #f8fafc);
}
.lm-dp-nav {
  flex: 0 0 auto;
  width: 30px; height: 30px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 0;
  border-radius: 6px;
  color: var(--lm-muted, #64748b);
  cursor: pointer;
  transition: background .12s, color .12s;
}
.lm-dp-nav:hover {
  background: var(--lm-surface, #f8fafc);
  color: var(--lm-text, #0f172a);
}

.lm-dp-weekdays {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 2px;
  margin-bottom: 4px;
}
.lm-dp-weekdays > span {
  text-align: center;
  font-size: 11px;
  font-weight: 600;
  color: var(--lm-muted, #64748b);
  padding: 6px 0 4px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.lm-dp-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 2px;
}
.lm-dp-day {
  aspect-ratio: 1 / 1;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 0;
  border-radius: 8px;
  font-family: inherit;
  font-size: 13px;
  color: var(--lm-text, #0f172a);
  cursor: pointer;
  transition: background .1s, color .1s;
}
.lm-dp-day:hover:not(.is-out) {
  background: var(--lm-surface, #f8fafc);
}
.lm-dp-day.is-out {
  color: #cbd5e1;
  cursor: default;
}
.lm-dp-day.is-today {
  font-weight: 700;
  color: var(--lm-primary, #2f8a5f);
}
.lm-dp-day.is-selected,
.lm-dp-day.is-selected:hover {
  background: var(--lm-primary, #2f8a5f);
  color: #fff;
  font-weight: 600;
}

.lm-dp-time {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-top: 14px;
  padding-top: 12px;
  border-top: 1px solid var(--lm-border, #e2e8f0);
}
.lm-dp-time-label {
  font-size: 11px;
  font-weight: 600;
  color: var(--lm-muted, #64748b);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  margin-right: auto;
}
.lm-dp-time-input {
  width: 56px;
  padding: 6px 8px;
  font-family: inherit;
  font-size: 14px;
  color: var(--lm-text, #0f172a);
  background: var(--lm-bg, #fff);
  border: 1px solid var(--lm-border, #e2e8f0);
  border-radius: 6px;
  text-align: center;
  -moz-appearance: textfield;
}
.lm-dp-time-input::-webkit-outer-spin-button,
.lm-dp-time-input::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
.lm-dp-time-input:focus {
  outline: none;
  border-color: var(--lm-primary, #2f8a5f);
  box-shadow: 0 0 0 3px rgba(47, 138, 95, 0.15);
}
.lm-dp-time-sep {
  font-weight: 600;
  color: var(--lm-muted, #64748b);
}

.lm-dp-actions {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-top: 14px;
}
.lm-dp-btn {
  padding: 7px 14px;
  font-family: inherit;
  font-size: 13px;
  font-weight: 500;
  border-radius: 7px;
  cursor: pointer;
  border: 1px solid transparent;
  transition: background .12s, border-color .12s, color .12s;
}
.lm-dp-btn-ghost {
  background: transparent;
  color: var(--lm-muted, #64748b);
}
.lm-dp-btn-ghost:hover {
  background: var(--lm-surface, #f8fafc);
  color: var(--lm-text, #0f172a);
}
.lm-dp-btn-primary {
  background: var(--lm-primary, #2f8a5f);
  border-color: var(--lm-primary, #2f8a5f);
  color: #fff;
  font-weight: 600;
  margin-left: auto;
}
.lm-dp-btn-primary:hover {
  background: var(--lm-primary-strong, #246c4a);
  border-color: var(--lm-primary-strong, #246c4a);
}


/* ════════════════════════════════════════════════════════════════
   LM Cursor fix (2026-05-10) — stable hand pointer across browsers.
   Diagnosis: Chrome wasn't showing hand on <div>+onclick wrappers
   (browsers only do this for <a>/<button> nativly); Yandex flickered
   because lm-discover.js mousemove on .dc-card-photo was changing the
   DOM stack under the cursor every frame, triggering hit-test churn.
   This block + pointer-events:none on photo-frame children solve both.
   ════════════════════════════════════════════════════════════════ */

a,
button,
[role="button"],
[onclick],
input[type="submit"],
input[type="button"],
input[type="checkbox"],
input[type="radio"],
input[type="reset"],
label[for],
select,
summary,
[data-toggle],
[data-action],
[data-pop-toggle],
[data-modal-close],
.js_click,
.js_action,
.js_login-as,
.js_admin-review-toggle,
.js_review-rebook,
.js_lm-open-review-modal,
.js_lm-remove-agency,
.js_connected-account-switch,
.lm-card-clickable,
.lm-tile-clickable,
.lm-action,
.lm-tab,
.lm-pill,
.lm-btn,
.lm-mpill,
.lm-mlist-item[data-href],
.dc-card,
.dc-card-bookmark,
.dc-pop-item,
.dc-photo-dot {
  cursor: pointer;
}

/* Disabled state — overrides above */
button:disabled,
[disabled],
.disabled,
.is-disabled,
.lm-btn:disabled,
.lm-btn.is-disabled {
  cursor: not-allowed;
}

/* Photo carousel: prevent hit-test churn under .dc-card-photo mousemove.
   The mousemove listener swaps .is-active on .dc-photo-frame children every
   pixel; if those children received pointer events, the cursor would
   recompute hit-target each frame and Yandex would flicker arrow/hand. */
.dc-card-photo .dc-photo-frame,
.dc-card-photo .dc-photo-frame *,
.dc-card-photo .dc-photo-counter {
  pointer-events: none;
}
/* Bookmark + dots remain interactive — re-enable explicitly */
.dc-card-photo .dc-card-bookmark,
.dc-card-photo .dc-photo-dot {
  pointer-events: auto;
}

/* ════════════════════════════════════════════════════════════════════
   Phase D.1.a — Google Places Autocomplete dropdown (.pac-container)
   dark theme overrides. Google injects this element directly into <body>
   (outside any LM container) so we target it with global selectors and
   activate only when html[data-lm-theme="dark"] is set.
   ════════════════════════════════════════════════════════════════════ */
html[data-lm-theme="dark"] .pac-container {
  background: #1c232c;
  border: 1px solid #2a3038;
  box-shadow: 0 12px 32px rgba(0, 0, 0, 0.55), 0 2px 6px rgba(0, 0, 0, 0.4);
  color: #e6edf3;
}
html[data-lm-theme="dark"] .pac-item {
  background: transparent;
  color: #c9d1d9;
  border-top: 1px solid #21272f;
  padding: 8px 12px;
}
html[data-lm-theme="dark"] .pac-item:first-child {
  border-top: 0;
}
html[data-lm-theme="dark"] .pac-item:hover,
html[data-lm-theme="dark"] .pac-item-selected,
html[data-lm-theme="dark"] .pac-item-selected:hover {
  background: rgba(255, 255, 255, 0.06);
}
html[data-lm-theme="dark"] .pac-item-query {
  color: #e6edf3;
}
html[data-lm-theme="dark"] .pac-matched {
  color: #5fcc94;            /* primary green for the matched substring */
  font-weight: 700;
}
html[data-lm-theme="dark"] .pac-icon {
  /* Google ships pin sprites as light grey on light bg; invert so they
     read on dark surface. */
  filter: invert(0.85) brightness(0.9);
}
html[data-lm-theme="dark"] .pac-logo:after {
  /* "powered by Google" footer — invert the logo image so it doesn't
     glare on dark. */
  filter: invert(0.85);
  background-color: transparent;
}

/* ════════════════════════════════════════════════════════════════════
   Phase D.1.a — Age verified ✓ on full profile (mirrors lm-discover.css).
   Without this rule the SVG would inherit dt/dd's near-black color, so
   the check reads as a vague glyph instead of a clear green badge.
   ════════════════════════════════════════════════════════════════════ */
.lm-age-verified-check {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 14px;
  height: 14px;
  color: var(--lm-primary, #0f6f4f);
  flex-shrink: 0;
  vertical-align: -2px;
  margin-left: 6px;
}
html[data-lm-theme="dark"] .lm-age-verified-check { color: #5fcc94; }
.lm-age-verified-check svg { width: 100%; height: 100%; }

/* ════════════════════════════════════════════════════════════════════════
   LM CHAT FAB — collapsed-by-default avatar stack in bottom-right.
   ════════════════════════════════════════════════════════════════════════
   Replaces Sngine's full-height right-side .chat-sidebar (60px wide column
   from top:0 to bottom:0, which on 14" screens overlapped the top-right
   action bar — Inbox / Bookmarks / Notifications). Now:

     - Default state: only .lm-chat-fab-trigger (~52px bubble) visible at
       bottom-right. Shows up to 3 stacked avatar previews of the most
       recent contacts (pulled from existing .chat-avatar-wrapper imgs).
     - On click: .is-open class added → expanded panel slides up,
       contacts list anchors above the trigger. flex-direction:
       column-reverse so the FIRST item in markup (most-recent due to
       sidebar_friends ORDER BY user_last_seen DESC) lands at the BOTTOM,
       directly above the trigger. Latest = closest = easiest to reach.
     - Footer (New Chat + Settings cog) is part of the expanded panel,
       hidden when collapsed.
   ════════════════════════════════════════════════════════════════════════ */

/* Outer container — bottom-right FAB. Width fixed so all children
   (trigger preview + expanded avatars + footer buttons) line up on the
   same vertical axis. Bottom offset 64px raises the FAB above the
   viewport edge — feels floating, not glued. */
.chat-sidebar.lm-chat-fab,
html.lm-chrome-active .chat-sidebar.lm-chat-fab {
  display: flex !important;
  flex-direction: column;
  align-items: center;
  width: 56px !important;
  top: auto !important;
  left: auto !important;
  right: 12px !important;
  bottom: 28px !important;
  padding: 0 !important;
  z-index: 1000;
  pointer-events: none;
}

/* Expanded panel — hidden by default. Shows when parent has .is-open. */
.lm-chat-fab .lm-chat-fab-expanded {
  display: none;
  width: 56px;
  max-height: calc(100vh - 200px);
  overflow: visible;
  padding: 0;
  margin: 0 0 8px;
  pointer-events: auto;
}
.lm-chat-fab.is-open .lm-chat-fab-expanded { display: block; }

/* Avatar list inside expanded panel: render in REVERSE so the first
   markup item (most-recent contact) ends up at the visual bottom. */
.lm-chat-fab .lm-chat-fab-expanded .js_scroller {
  display: flex;
  flex-direction: column-reverse;
  gap: 0;
  max-height: calc(100vh - 240px);
  overflow-y: auto;
  scrollbar-width: thin;
  align-items: center;
  width: 56px;
}
.lm-chat-fab .js_chat-contacts-online,
.lm-chat-fab .js_chat-contacts-offline {
  display: flex;
  flex-direction: column-reverse;
  gap: 0;
  align-items: center;
  width: 100%;
}
/* Each avatar: vertical gap, no horizontal margin so it stays on axis. */
.lm-chat-fab .chat-avatar-wrapper {
  margin: 4px 0;
  filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.18));
}

/* Footer — sits ABOVE the avatar list (visually at top of stack when
   open). The .lm-chat-fab outer container is flex-direction:column with
   markup order [expanded, footer, trigger]. We want visual order
   [footer, expanded, trigger] so the New Chat + Settings buttons appear
   first, then contacts (oldest→latest), then trigger at the very bottom.
   Use flex `order` to lift the footer above the expanded list. */
.lm-chat-fab .chat-sidebar-footer {
  display: none;
  order: -1;
  padding: 0;
  margin: 0 0 8px;
  pointer-events: auto;
  width: 56px;
  text-align: center;
}
.lm-chat-fab.is-open .chat-sidebar-footer { display: block; }
/* Footer's two buttons (New chat + Settings cog) — keep stacked, centered. */
.lm-chat-fab .chat-sidebar-footer .btn-chat {
  display: block;
  margin: 0 auto 8px;
  width: 40px;
  height: 40px;
}

/* ───────── Trigger — VERTICAL stack of avatars, NO outer bubble.
   Three avatar circles overlapping each other top-to-bottom. The whole
   stack itself acts as the click target; no white wrapper, no big circle.
   Each avatar gets a thin white ring + drop-shadow to read as separate
   elements floating on the page. ───────── */
.lm-chat-fab-trigger {
  appearance: none;
  border: 0;
  background: transparent;
  padding: 0;
  display: block;
  cursor: pointer;
  pointer-events: auto;
  filter: drop-shadow(0 4px 10px rgba(0, 0, 0, 0.18));
  transition: transform .18s ease;
}
.lm-chat-fab-trigger:hover { transform: translateY(-2px); }
.lm-chat-fab-trigger:focus-visible {
  outline: 2px solid var(--lm-primary, #2d8a66);
  outline-offset: 4px;
  border-radius: 28px;
}

/* Avatar stack — vertical, but visually REVERSED so the first contact
   (most recent / online) ends up at the bottom of the stack instead of
   the top. `column-reverse` flips the visual order without touching the
   DOM order; the `+` sibling margin still applies in DOM order, which
   produces the desired bottom-to-top -18px overlap. */
.lm-chat-fab-stack {
  display: flex;
  flex-direction: column-reverse;
  align-items: center;
}
.lm-chat-fab-stack-img {
  width: 38px;
  height: 38px;
  border-radius: 50%;
  border: 2px solid #fff;
  object-fit: cover;
  background: #e9ecf3;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
/* With column-reverse: DOM order is [1, 2, 3], visual order is [3, 2, 1]
   from top to bottom. To make EVERY avatar (including the topmost
   visual one) overlap with its neighbour below, every image except the
   FIRST in DOM (which is the BOTTOM visual one — sits flat) needs a
   negative margin-bottom. Using `:not(:first-child)` covers the
   topmost-visual avatar that previously had no overlap. */
.lm-chat-fab-stack-img:not(:first-child) { margin-bottom: -18px; }

/* Empty-state SVG (no contacts yet) — stand-alone bubble, smaller. */
.lm-chat-fab-stack > svg {
  width: 32px;
  height: 32px;
  color: var(--lm-text, #1a1a1f);
  background: #fff;
  border-radius: 50%;
  padding: 6px;
}

/* When expanded — trigger preview disappears completely. The expanded
   list itself becomes the click surface; clicking outside or Escape
   closes it. Without this rule the user saw both the expanded list AND
   the duplicate avatar stack at the very bottom. */
.lm-chat-fab.is-open .lm-chat-fab-trigger { display: none; }

/* Phase H R56: keep the chat FAB stack visible on mobile too. The
   trigger uses the same JS, just moves up (bottom:96px) so it sits
   above the bottom-nav / Send buttons commonly pinned at viewport
   bottom on mobile booking/profile screens. */
@media (max-width: 991px) {
  .chat-sidebar.lm-chat-fab,
  html.lm-chrome-active .chat-sidebar.lm-chat-fab {
    display: flex !important;
    bottom: 77px !important;
    right: 0 !important;
  }
}

/* Disabled state — Sngine's "Active Status: off" greys the panel. Apply
   to the trigger too so it's obvious. */
.chat-sidebar.lm-chat-fab.disabled .lm-chat-fab-trigger { opacity: 0.5; }

/* Dark theme — give the stack-img ring + empty-state bubble a dark
   background so they don't punch a white hole in the dark page. */
html[data-lm-theme="dark"] .lm-chat-fab-stack-img { border-color: #15171b; }
html[data-lm-theme="dark"] .lm-chat-fab-stack > svg {
  color: #e9ecf3;
  background: #2a2d33;
}

/* ════════════════════════════════════════════════════════════════════
   Phase F.5e — chat widget polish (open + collapsed states).
   ════════════════════════════════════════════════════════════════════
   - Verified ✓ + tier pill rendered next to the chat header name.
     Injected by lm-chat-enhance.js (MutationObserver on .chat-widget).
   - Message font: tighter line-height, system-ui stack — readable on
     macOS/Windows/Linux without the Sngine default Roboto-ish vibe.
   - Toolbar bottom icons: stroke style + LM primary green for the
     send action (was generic Bootstrap blue).
   ════════════════════════════════════════════════════════════════════ */

/* Badge cluster injected into .chat-user-card .name. flex so the
   badges sit on the baseline alongside the name. */
.chat-user-card .name {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
/* Inline verified SVG — sized like the .lm-tier-sm badge it sits next to. */
svg.lm-chat-verified {
  width: 14px;
  height: 14px;
  color: #2d8a66;
  flex-shrink: 0;
  margin-left: 4px;
}
html[data-lm-theme="dark"] svg.lm-chat-verified { color: #5fcc94 !important; }

/* Tier pill in chat — force the .lm-tier-sm size even if some
   ancestor (e.g. .chat-widget-head) inherits a bigger font. !important
   needed because Sngine's chat header sets font-size on .name children. */
.chat-widget .lm-tier.lm-tier-sm {
  font-size: 9.5px !important;
  line-height: 1 !important;
  padding: 3px 7px !important;
  margin-left: 4px;
  flex-shrink: 0;
}
.chat-widget .lm-tier.lm-tier-sm svg {
  width: 9px !important;
  height: 9px !important;
}

/* Message font — apply system stack + tighter rhythm. */
.chat-conversations,
.chat-conversations .text,
.chat-conversations .conversation-body .text,
.chat-form textarea,
.chat-form .chat-form-message {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  font-size: 14px;
  line-height: 1.45;
  letter-spacing: 0.005em;
}
.chat-conversations .conversation-body .text {
  border-radius: 18px;
  padding: 8px 12px;
}
.chat-conversations .conversation-body .time {
  font-size: 11px;
  color: var(--lm-muted, #8a8a93);
  margin-top: 2px;
}
/* Don't blanket-set font-size on .name span — that cascade was inflating
   the .lm-tier .lm-tier-sm pill (since it lives inside .name). The badge
   has its own font-size rule above. The plain text span inherits the
   chat header's default (~14px from .chat-widget-head). */
.chat-widget-head .chat-user-card .name > span:first-child {
  font-weight: 600;
}

/* Send button (round green) — Sngine uses a generic .btn-send blue
   circle by default. Restyle to LM primary so it visually pops. */
.chat-form .x-form-tools-send,
.chat-form .js_x-form-send,
.chat-form button.js_send,
.x-form-tools-list .x-form-tools-send {
  background: var(--lm-primary, #2d8a66) !important;
  color: #fff !important;
  border: 0;
  border-radius: 50%;
  transition: background .15s, transform .08s;
}
.chat-form .x-form-tools-send:hover,
.chat-form button.js_send:hover {
  background: var(--lm-primary-strong, #1f4d3a) !important;
  transform: scale(1.05);
}

/* Toolbar icon buttons (photo + emoji) — softer color + hover. */
.chat-form .x-form-tools-list > li {
  color: var(--lm-muted, #8a8a93);
  transition: color .15s, background .15s;
  border-radius: 6px;
}
.chat-form .x-form-tools-list > li:hover {
  color: var(--lm-primary, #2d8a66);
  background: rgba(45, 138, 102, 0.08);
}
html[data-lm-theme="dark"] .chat-form .x-form-tools-list > li:hover {
  color: #5fcc94;
  background: rgba(95, 204, 148, 0.10);
}

/* Collapsed chat-friends bar — badge sizes shrink so they fit the
   narrow strip. */
.chat-friends .lm-chat-badges {
  margin-left: 2px;
}
.chat-friends .lm-chat-tier {
  height: 16px;
  padding: 0 5px;
  font-size: 9px;
}

/* ─────────────────────────────────────────────────────────────────────
   Theme-swap: suppress per-element transitions during theme flip.
   JS adds `lm-no-transition` to <html>, swaps theme attr, then removes
   on next frame (lm-profile.js initThemeToggle). Keeps recolor instant
   instead of animating each element's `transition: background .12s`. */
.lm-no-transition,
.lm-no-transition *,
.lm-no-transition *::before,
.lm-no-transition *::after {
  transition: none !important;
  animation-duration: 0s !important;
  animation-delay: 0s !important;
}

/* Dark-theme scrollbar palette only (layout-neutral on macOS overlay). */
html.lm-dark,
html[data-lm-theme="dark"] {
  scrollbar-color: #4b5563 #1f2937;
  scrollbar-width: thin;
}

/* ════════════════════════════════════════════════════════════════════
   Phase H R69 — Header notifications dropdown (LM theming overlay on
   top of Bootstrap dropdown markup that Sngine wires up for live
   counters). Reuses .lm-notif-row styles defined in lm-bookings.css —
   the dropdown body just constrains them to ~360px wide.
   ════════════════════════════════════════════════════════════════════ */
.lm-notif-pop-menu.dropdown-menu.dropdown-widget {
  width: 380px;
  max-width: calc(100vw - 24px);
  padding: 0;
  background: var(--lm-card, #fff);
  border: 1px solid var(--lm-border, #e3e3e3);
  border-radius: 14px;
  box-shadow: 0 20px 50px -10px rgba(15,23,42,0.25), 0 6px 18px -6px rgba(15,23,42,0.10);
  overflow: hidden;
}
.lm-notif-pop-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 10px;
  padding: 14px 18px;
  border-bottom: 1px solid var(--lm-border-2, #f0f0f0);
}
.lm-notif-pop-title { font-size: 15px; font-weight: 700; color: var(--lm-text); }
.lm-notif-pop-count {
  font-size: 11px; font-weight: 600;
  color: var(--lm-primary-strong, #0a8a4f);
  background: var(--lm-primary-soft, rgba(15,111,79,0.10));
  padding: 3px 8px; border-radius: 999px;
}
.lm-notif-pop-body { max-height: 460px; overflow-y: auto; }
.lm-notif-pop-body .js_scroller { max-height: none; }
.lm-notif-pop-list {
  border: 0; border-radius: 0;
  background: transparent;
}
.lm-notif-pop-list .lm-notif-row { border-radius: 0; }
.lm-notif-pop-list .lm-notif-link { padding: 12px 14px; }
.lm-notif-pop-list .lm-notif-avatar { width: 40px; height: 40px; }
.lm-notif-pop-list .lm-notif-line { font-size: 12.5px; }
.lm-notif-pop-empty {
  text-align: center;
  padding: 40px 20px;
  color: var(--lm-muted, #6b7280);
}
.lm-notif-pop-empty svg { color: var(--lm-muted-2, #94a3b8); margin-bottom: 8px; opacity: .6; }
.lm-notif-pop-empty p { margin: 0; font-size: 13px; }
.lm-notif-pop-footer {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  padding: 12px;
  border-top: 1px solid var(--lm-border-2, #f0f0f0);
  font-size: 13px; font-weight: 600;
  color: var(--lm-primary, #10b981);
  text-decoration: none;
  background: var(--lm-card, #fff);
  transition: background .12s;
}
.lm-notif-pop-footer:hover { background: var(--lm-surface, #f9fafb); color: var(--lm-primary-strong, #0a8a4f); text-decoration: none; }

html[data-lm-theme="dark"] .lm-notif-pop-menu.dropdown-menu.dropdown-widget { background: var(--lm-card, #161b22); border-color: var(--lm-border, #2a3038); }
html[data-lm-theme="dark"] .lm-notif-pop-head { border-bottom-color: var(--lm-border, #2a3038); }
html[data-lm-theme="dark"] .lm-notif-pop-footer { background: var(--lm-card, #161b22); border-top-color: var(--lm-border, #2a3038); }
html[data-lm-theme="dark"] .lm-notif-pop-footer:hover { background: rgba(255,255,255,0.03); }
html[data-lm-theme="dark"] .lm-notif-pop-count { background: rgba(110,231,183,0.10); color: #6ee7b7; }

/* Counter pill on the bell itself — keep Sngine's red pill but nudge size. */
.lm-notif-pop .counter {
  background: #ef4444 !important;
  color: #fff !important;
  font-size: 10.5px !important;
  min-width: 18px; height: 18px;
  line-height: 18px;
  padding: 0 5px;
  right: -4px; top: -4px;
  font-weight: 700;
}

/* ════════════════════════════════════════════════════════════════════
   Phase H R69 — Notifications: row styles live in lm-profile.css so
   the topbar popup (which loads on every page) renders correctly even
   on pages that don't include lm-bookings.css. The /notifications page
   adds its own shell + header on top via .lm-notif-shell.
   ════════════════════════════════════════════════════════════════════ */

/* Standalone /notifications page shell. */
.lm-notif-shell { max-width: 720px; margin: 0 auto; padding: 24px 0 60px; }
.lm-notif-header {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 16px; margin-bottom: 18px; flex-wrap: wrap;
}
.lm-notif-title { margin: 0; font-size: 22px; font-weight: 700; color: var(--lm-text); letter-spacing: -.01em; }
.lm-notif-subtitle { margin: 2px 0 0; font-size: 13px; color: var(--lm-muted, #6b7280); }
.lm-notif-actions { display: flex; align-items: center; gap: 12px; }
.lm-notif-sound {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 8px 12px; border-radius: 10px;
  background: var(--lm-card, #fff); border: 1px solid var(--lm-border, #e3e3e3);
  font-size: 12.5px; color: var(--lm-text); cursor: pointer;
}
.lm-notif-sound svg { color: var(--lm-muted, #6b7280); }
.lm-notif-sound input[type="checkbox"] { margin: 0; cursor: pointer; }

/* List wrapper — page version (rounded card). Popup variant overrides below. */
.lm-notif-list {
  list-style: none; padding: 0; margin: 0;
  background: var(--lm-card, #fff);
  border: 1px solid var(--lm-border, #e3e3e3);
  border-radius: 12px;
  overflow: hidden;
}

/* Row component — used in BOTH popup and page list. */
.lm-notif-row {
  display: flex; align-items: center; gap: 4px;
  border-bottom: 1px solid var(--lm-border-2, #f0f0f0);
  position: relative;
  transition: background .12s;
}
.lm-notif-row:last-child { border-bottom: 0; }
.lm-notif-row:hover { background: var(--lm-surface, #f9fafb); }
.lm-notif-row.is-unread,
.lm-notif-row.unread { background: var(--lm-primary-soft, rgba(15,111,79,0.05)); }
.lm-notif-row.is-unread::before,
.lm-notif-row.unread::before {
  content: "";
  position: absolute; left: 0; top: 0; bottom: 0;
  width: 3px; background: var(--lm-primary, #10b981);
}
.lm-notif-link {
  display: flex; align-items: center; gap: 14px;
  flex: 1; min-width: 0;
  padding: 14px 16px;
  color: inherit; text-decoration: none;
}
.lm-notif-link:hover { text-decoration: none; color: inherit; }

.lm-notif-avatar-wrap { position: relative; flex-shrink: 0; }
.lm-notif-avatar {
  width: 44px; height: 44px;
  border-radius: 50%; object-fit: cover;
  background: var(--lm-surface-2, #f1f5f9);
  display: block;
}
.lm-notif-avatar--system {
  border-radius: 10px; padding: 6px;
  background: linear-gradient(135deg, #e0e7ff, #c7d2fe);
}
.lm-notif-icon-badge {
  position: absolute; right: -3px; bottom: -3px;
  width: 22px; height: 22px;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: 50%;
  background: var(--lm-muted-2, #94a3b8); color: #fff;
  border: 2px solid var(--lm-card, #fff);
  box-shadow: 0 2px 6px rgba(0,0,0,0.08);
}
.lm-notif-icon-badge--positive { background: var(--lm-primary, #10b981); }
.lm-notif-icon-badge--negative { background: #ef4444; }
.lm-notif-icon-badge--warning  { background: #f59e0b; }
.lm-notif-icon-badge--info     { background: #3b82f6; }

.lm-notif-body { flex: 1; min-width: 0; }
.lm-notif-line {
  display: inline-flex; align-items: center; gap: 6px;
  flex-wrap: wrap;
  font-size: 13.5px; line-height: 1.4;
  color: var(--lm-text);
}
.lm-notif-name { font-weight: 600; }
.lm-notif-verified { color: var(--lm-primary, #10b981); flex-shrink: 0; }
.lm-notif-msg { color: var(--lm-text); font-weight: 400; }
.lm-notif-time {
  margin-top: 2px;
  font-size: 11.5px;
  color: var(--lm-muted, #6b7280);
}
.lm-notif-delete {
  flex-shrink: 0;
  margin-right: 8px;
  width: 32px; height: 32px;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent; color: var(--lm-muted, #6b7280);
  border: 0; border-radius: 8px;
  cursor: pointer; opacity: 0;
  transition: opacity .12s, background .12s, color .12s;
}
.lm-notif-row:hover .lm-notif-delete { opacity: 1; }
.lm-notif-delete:hover { background: rgba(239,68,68,0.08); color: #ef4444; }
.lm-notif-more {
  margin-top: 14px; text-align: center; padding: 12px;
  background: var(--lm-card, #fff); border: 1px solid var(--lm-border, #e3e3e3);
  border-radius: 10px;
  color: var(--lm-text); font-size: 13px; font-weight: 500; cursor: pointer;
}
.lm-notif-more:hover { background: var(--lm-surface, #f9fafb); }
.lm-notif-empty {
  text-align: center; padding: 60px 20px;
  background: var(--lm-card, #fff); border: 1px solid var(--lm-border, #e3e3e3);
  border-radius: 12px; color: var(--lm-muted, #6b7280);
}
.lm-notif-empty svg { color: var(--lm-muted-2, #94a3b8); margin-bottom: 12px; opacity: .7; }
.lm-notif-empty h3 { margin: 0 0 4px; font-size: 16px; font-weight: 600; color: var(--lm-text); }
.lm-notif-empty p { margin: 0; font-size: 13px; }

/* Popup variant — list lives INSIDE the .lm-pop-panel which already
   provides its own card frame. Drop the inner border/radius/bg so we
   don't get a double-frame look, tighten the row paddings. */
.lm-pop-panel .lm-notif-list {
  background: transparent;
  border: 0;
  border-radius: 0;
  overflow: visible;
  max-height: 460px;
  overflow-y: auto;
}
.lm-pop-panel .lm-notif-row { border-bottom: 1px solid var(--lm-border-2, #f0f0f0); }
.lm-pop-panel .lm-notif-row:last-child { border-bottom: 0; }
.lm-pop-panel .lm-notif-link { padding: 11px 14px; gap: 10px; }
.lm-pop-panel .lm-notif-avatar { width: 38px; height: 38px; }
.lm-pop-panel .lm-notif-icon-badge { width: 18px; height: 18px; right: -2px; bottom: -2px; }
.lm-pop-panel .lm-notif-icon-badge svg { width: 9px; height: 9px; }
.lm-pop-panel .lm-notif-line { font-size: 12.5px; }
.lm-pop-panel .lm-notif-msg { font-size: 12.5px; }
.lm-pop-panel .lm-notif-time { font-size: 10.5px; }
.lm-pop-panel .lm-notif-delete { opacity: 1; margin-right: 4px; width: 28px; height: 28px; }
.lm-notif-pop-empty {
  text-align: center; padding: 36px 20px;
  color: var(--lm-muted, #6b7280);
}
.lm-notif-pop-empty svg { color: var(--lm-muted-2, #94a3b8); margin-bottom: 8px; opacity: .6; }
.lm-notif-pop-empty p { margin: 0; font-size: 13px; }

html[data-lm-theme="dark"] .lm-notif-list { background: var(--lm-card, #161b22); border-color: var(--lm-border, #2a3038); }
html[data-lm-theme="dark"] .lm-notif-row { border-bottom-color: var(--lm-border, #2a3038); }
html[data-lm-theme="dark"] .lm-notif-row:hover { background: rgba(255,255,255,0.03); }
html[data-lm-theme="dark"] .lm-notif-row.is-unread,
html[data-lm-theme="dark"] .lm-notif-row.unread { background: rgba(110,231,183,0.06); }
html[data-lm-theme="dark"] .lm-notif-icon-badge { border-color: var(--lm-card, #161b22); }
html[data-lm-theme="dark"] .lm-notif-sound { background: var(--lm-card, #161b22); border-color: var(--lm-border, #2a3038); }
html[data-lm-theme="dark"] .lm-notif-avatar { background: rgba(255,255,255,0.04); }
html[data-lm-theme="dark"] .lm-notif-empty,
html[data-lm-theme="dark"] .lm-notif-more {
  background: var(--lm-card, #161b22); border-color: var(--lm-border, #2a3038);
}
html[data-lm-theme="dark"] .lm-pop-panel .lm-notif-row { border-bottom-color: var(--lm-border, #2a3038); }

@media (max-width: 640px) {
  .lm-notif-shell { padding: 16px 12px 60px; }
  .lm-notif-avatar { width: 40px; height: 40px; }
  .lm-notif-link { padding: 12px 14px; gap: 10px; }
  .lm-notif-delete { opacity: 1; }
}

/* ════════════════════════════════════════════════════════════════════
   Phase H R69 — Saved items (topbar popup + /saved page)
   ════════════════════════════════════════════════════════════════════ */

/* Popup panes — only the active one shows. */
.lm-saved-pane { display: none; }
.lm-saved-pane.is-active { display: block; }
.lm-saved-pane[hidden] { display: none !important; }

/* Compact list inside the popup. Three tabs share the same layout. */
.lm-saved-list { list-style: none; padding: 0; margin: 0; max-height: 360px; overflow-y: auto; }
.lm-saved-row { border-bottom: 1px solid var(--lm-border-2, #f0f0f0); }
.lm-saved-row:last-child { border-bottom: 0; }
.lm-saved-link {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 14px;
  color: inherit; text-decoration: none;
  transition: background .12s;
}
.lm-saved-link:hover { background: var(--lm-surface, #f9fafb); color: inherit; text-decoration: none; }
.lm-saved-pic {
  width: 36px; height: 36px;
  object-fit: cover; flex-shrink: 0;
  background: var(--lm-surface-2, #f1f5f9);
}
.lm-saved-pic--round  { border-radius: 50%; }
.lm-saved-pic--square { border-radius: 8px; }
/* Phase 9 — casting calls have no avatar; show the category emoji centred
   in the same 36px square chrome as a brand/photo thumbnail. */
.lm-saved-cast-emoji { display: flex; align-items: center; justify-content: center; font-size: 18px; line-height: 1; }
.lm-saved-info { min-width: 0; flex: 1; }
.lm-saved-name { display: inline-flex; align-items: center; gap: 4px; font-size: 13px; font-weight: 600; color: var(--lm-text); flex-wrap: wrap; }
.lm-saved-meta { font-size: 11px; color: var(--lm-muted, #6b7280); margin-top: 1px; }

/* Photo grid inside popup. */
.lm-saved-photogrid {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px;
  padding: 10px;
  max-height: 360px; overflow-y: auto;
}
.lm-saved-photo {
  display: block; aspect-ratio: 1 / 1; overflow: hidden; border-radius: 8px;
  background: var(--lm-surface-2, #f1f5f9);
  position: relative;
}
.lm-saved-photo img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .25s; }
.lm-saved-photo:hover img { transform: scale(1.04); }

/* /saved page shell — match notifications page width. */
.lm-saved-shell { max-width: 880px; margin: 0 auto; padding: 24px 0 60px; }
.lm-saved-page-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 18px; flex-wrap: wrap; }

.lm-saved-tabs-bar {
  display: flex; gap: 4px;
  background: var(--lm-card, #fff);
  border: 1px solid var(--lm-border, #e3e3e3);
  border-radius: 12px;
  padding: 4px;
  margin-bottom: 18px;
}
.lm-saved-tab-link {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 9px 14px;
  font-size: 13px; font-weight: 600; color: var(--lm-muted, #6b7280);
  text-decoration: none;
  border-radius: 8px;
  transition: background .12s, color .12s;
}
.lm-saved-tab-link:hover { color: var(--lm-text); text-decoration: none; }
.lm-saved-tab-link.is-active { background: var(--lm-primary, #10b981); color: #fff; }
.lm-saved-tab-link.is-active:hover { color: #fff; }
.lm-saved-tab-count {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 18px; padding: 0 5px; height: 16px; line-height: 16px;
  font-size: 10.5px; font-weight: 700;
  background: rgba(0,0,0,0.08); border-radius: 9px;
}
.lm-saved-tab-link.is-active .lm-saved-tab-count { background: rgba(255,255,255,0.22); color: #fff; }

/* Save-cap display: "used / limit" — the "/ N" (or "/ ∞") part rides inside the
   count pill in a lighter weight so the used number still reads as primary. */
.lm-saved-tab-lim { font-weight: 600; opacity: 0.7; margin-left: 2px; }
.lm-saved-tab-link.is-active .lm-saved-tab-lim { opacity: 0.85; }
/* Tier pill beside the page title (explains why the limit is what it is). */
.lm-saved-tier-pill { vertical-align: middle; margin-left: 8px; }
/* Short note next to the bookmarked count, e.g. "· up to 10 saves of each type". */
.lm-saved-cap-note { color: var(--lm-text-muted, #6b7280); font-weight: 500; }
/* Free-tier pill: neutral grey (lm-profile.css has no .lm-tier-free of its own;
   mirror the lm-settings.css definition so the saved page can render it). */
.lm-tier.lm-tier-free {
  background: var(--lm-border, #e2e6ec); color: var(--lm-text, #475569);
  border: none; font-weight: 700;
}
html[data-lm-theme="dark"] .lm-tier.lm-tier-free { background: #2a2d33; color: #c4c4cc; }

/* Page-level grid of saved cards. */
.lm-saved-grid--cards {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 12px;
}
/* Phase 9 — saved casting calls reuse the full discovery card
   (_lm_casting_card.tpl), which is taller than talent/brand cards. */
.lm-saved-grid--castings {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 14px;
  align-items: start;
}
@media (max-width: 560px) {
  .lm-saved-grid--castings { grid-template-columns: 1fr; }
}
.lm-saved-card {
  display: flex; align-items: center; gap: 12px;
  padding: 14px;
  background: var(--lm-card, #fff);
  border: 1px solid var(--lm-border, #e3e3e3);
  border-radius: 12px;
  text-decoration: none; color: inherit;
  transition: border-color .12s, box-shadow .12s;
  position: relative;
}
.lm-saved-card:hover { border-color: var(--lm-primary, #10b981); box-shadow: 0 4px 14px -4px rgba(15,23,42,0.08); text-decoration: none; color: inherit; }
.lm-saved-card-avatar { width: 52px; height: 52px; flex-shrink: 0; border-radius: 50%; overflow: hidden; background: var(--lm-surface-2, #f1f5f9); }
.lm-saved-card-avatar--square { border-radius: 10px; }
.lm-saved-card-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.lm-saved-card-body { flex: 1; min-width: 0; }
.lm-saved-card-name { display: inline-flex; align-items: center; gap: 5px; font-size: 14px; font-weight: 600; color: var(--lm-text); flex-wrap: wrap; }
.lm-saved-card-meta { font-size: 12px; color: var(--lm-muted, #6b7280); margin-top: 2px; }
.lm-saved-card-remove {
  position: absolute; top: 8px; right: 8px;
  width: 28px; height: 28px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--lm-card, #fff);
  border: 1px solid var(--lm-border, #e3e3e3);
  border-radius: 8px;
  cursor: pointer;
  color: var(--lm-primary, #10b981);
  transition: background .12s, color .12s;
}
.lm-saved-card-remove:hover { background: rgba(239,68,68,0.08); color: #ef4444; border-color: rgba(239,68,68,0.3); }

/* Page-level photo grid (bigger thumbs). */
.lm-saved-photogrid--page {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 8px;
}
.lm-saved-photo--lg { aspect-ratio: 1 / 1; border-radius: 10px; }
.lm-saved-photo-remove {
  position: absolute; top: 6px; right: 6px;
  width: 26px; height: 26px;
  display: inline-flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,0.92);
  border: 0; border-radius: 6px;
  color: var(--lm-primary, #10b981);
  cursor: pointer;
}
.lm-saved-photo-remove:hover { background: rgba(239,68,68,0.92); color: #fff; }

.lm-saved-empty {
  text-align: center; padding: 60px 20px;
  background: var(--lm-card, #fff); border: 1px solid var(--lm-border, #e3e3e3);
  border-radius: 12px; color: var(--lm-muted, #6b7280);
}
.lm-saved-empty svg { color: var(--lm-muted-2, #94a3b8); margin-bottom: 12px; opacity: .7; }
.lm-saved-empty h3 { margin: 0 0 4px; font-size: 16px; font-weight: 600; color: var(--lm-text); }
.lm-saved-empty p { margin: 0 0 14px; font-size: 13px; }

/* Bookmark button visual: filled green when is-saved. */
/* Phase H R69: filled bookmark when saved. !important needed because the
   inline SVG markup carries fill="none" (works for outline state); the
   attribute beats a plain CSS rule without !important. Same for stroke. */
.dc-card-bookmark.is-saved svg,
.dc-card-bookmark.is-saved svg path { fill: var(--lm-primary, #10b981) !important; stroke: var(--lm-primary, #10b981) !important; }
.dc-card-bookmark.is-saved { color: var(--lm-primary, #10b981); }

html[data-lm-theme="dark"] .lm-saved-tabs-bar,
html[data-lm-theme="dark"] .lm-saved-card,
html[data-lm-theme="dark"] .lm-saved-empty { background: var(--lm-card, #161b22); border-color: var(--lm-border, #2a3038); }
html[data-lm-theme="dark"] .lm-saved-tab-count { background: rgba(255,255,255,0.10); }
html[data-lm-theme="dark"] .lm-saved-row { border-bottom-color: var(--lm-border, #2a3038); }
html[data-lm-theme="dark"] .lm-saved-link:hover { background: rgba(255,255,255,0.04); }
html[data-lm-theme="dark"] .lm-saved-card-remove { background: var(--lm-card, #161b22); border-color: var(--lm-border, #2a3038); }
html[data-lm-theme="dark"] .lm-saved-photo-remove { background: rgba(13,17,23,0.85); }

@media (max-width: 640px) {
  .lm-saved-shell { padding: 16px 12px 60px; }
  .lm-saved-grid--cards { grid-template-columns: 1fr; }
}

/* ── Saved-media lightbox (R14) ───────────────────────────────────────
   Standalone full-image viewer opened from the /saved page Media tab and
   the topbar Saved popup. Markup is injected into <body> by
   LM.initSavedPhotoLightbox(); these rules style it. */
.lm-photo-lightbox {
  position: fixed;
  inset: 0;
  z-index: 9999;
  display: flex;
  align-items: center;
  justify-content: center;
}
.lm-photo-lightbox[hidden] { display: none; }
.lm-photo-lightbox-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(8, 11, 16, 0.82);
  -webkit-backdrop-filter: blur(2px);
          backdrop-filter: blur(2px);
}
.lm-photo-lightbox-body {
  position: relative;
  z-index: 1;
  max-width: min(92vw, 1100px);
  max-height: 92vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  animation: lm-photo-lightbox-in 160ms ease;
}
@keyframes lm-photo-lightbox-in {
  from { opacity: 0; transform: scale(0.97); }
  to   { opacity: 1; transform: scale(1); }
}
.lm-photo-lightbox-img {
  max-width: 100%;
  max-height: calc(92vh - 48px);
  border-radius: 12px;
  box-shadow: 0 24px 60px -12px rgba(0, 0, 0, 0.6);
  object-fit: contain;
  background: #0b0e13;
}
.lm-photo-lightbox-close {
  position: absolute;
  top: -14px;
  right: -14px;
  width: 36px;
  height: 36px;
  border-radius: 999px;
  border: 1px solid rgba(255, 255, 255, 0.22);
  background: rgba(15, 23, 42, 0.62);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
  color: #fff;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.4);
  transition: transform 120ms ease, background 120ms ease;
}
.lm-photo-lightbox-close:hover { transform: scale(1.08); background: rgba(15, 23, 42, 0.85); }
.lm-photo-lightbox-owner {
  font-size: 13px;
  font-weight: 600;
  color: #e6edf3;
  text-decoration: none;
  padding: 4px 12px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.1);
  transition: background 120ms ease;
}
.lm-photo-lightbox-owner:hover { background: rgba(255, 255, 255, 0.18); text-decoration: none; }
.lm-photo-lightbox-owner[hidden] { display: none; }
/* Lock background scroll while the lightbox is open. */
body.lm-photo-lightbox-open { overflow: hidden; }
@media (max-width: 600px) {
  .lm-photo-lightbox-close { top: -10px; right: -6px; }
}

/* Report / Block modal — dark theme icon override.
   Inline style uses hardcoded light-mode colors (#fef2f2 bg, #b91c1c text).
   In dark mode swap to a muted dark-red surface so the icon is legible. */
html[data-lm-theme="dark"] #lm-report-scrim .lm-recent-icon,
html[data-lm-theme="dark"] #lm-block-scrim .lm-recent-icon {
  background: rgba(185, 28, 28, 0.18) !important;
  color: #f87171 !important;
  border-color: rgba(185, 28, 28, 0.35) !important;
}


/* ──────────────────────────────────────────────────────────────────────
 * Phase 7.10 P3 — extend overlay rules to the talent-profile portfolio
 * card (`.lm-portfolio-card`). The visual design is identical to the
 * brand-page version; we just attach a parallel selector so the same
 * category chip / date chip render on talent thumbnails. Pin badge on
 * talent profile stays at `.lm-port-pin-badge` (legacy class — user
 * likes the existing icon there, so we don't replace it with .lm-bpf-pin).
 * ────────────────────────────────────────────────────────────────────── */

/* Phase 7.10 P3 — base overlay chip styles, UNSCOPED so they work in
   every context where they appear:
     • talent profile grid (.lm-portfolio-card)
     • brand portfolio grid (.lm-brand-portfolio-cell)
     • LM lightbox media pane (.pl-media)
     • Sngine post-card photo gallery (.pg_wrapper)
   Parent just needs position:relative for the absolute positioning to
   anchor correctly. */
.lm-bpf-cat {
  position: absolute;
  /* Phase 2.9 — moved from top-left to BOTTOM-left so it never
     collides with the variable-length album badge top-right. Date
     stays bottom-right; category chip mirrors it on the left. */
  bottom: 8px; left: 8px;
  z-index: 3;
  font-family: var(--lm-font-mono, ui-monospace, monospace);
  font-size: 9.5px;
  font-weight: 700;
  letter-spacing: .04em;
  text-transform: uppercase;
  padding: 4px 8px;
  border-radius: 6px;
  background: rgba(15, 23, 42, .6);
  color: #fff;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border: 1px solid rgba(255, 255, 255, .15);
  /* Phase 8.1 — defensive constraints so the chip can never be
     stretched by an outer flex/grid container or a long category
     label. Width fits content; long labels truncate with ellipsis
     instead of wrapping into a tall block. */
  display: inline-flex !important;
  align-items: center;
  width: auto !important;
  height: auto !important;
  max-width: 70%;
  max-height: 26px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  line-height: 1.2;
}
/* Uniform overlay chip per user direction: all categories use the same
   dark-transparent background + white text (no per-category tinting). */

.lm-bpf-date {
  position: absolute;
  right: 8px; bottom: 8px;
  z-index: 3;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 3px 7px;
  border-radius: 5px;
  background: rgba(15, 23, 42, .65);
  color: #fff;
  font-family: var(--lm-font-mono, ui-monospace, monospace);
  font-size: 9px;
  font-weight: 700;
  letter-spacing: .04em;
  text-transform: uppercase;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border: 1px solid rgba(255, 255, 255, .18);
}
.lm-bpf-date svg { opacity: .85; flex: none; }

/* Phase 2.9 — respect the [hidden] attribute on overlay chips. Without
   this `display: inline-flex`/`block` from the base rule beat the UA
   `[hidden] { display: none }` rule (same specificity, author wins),
   so JS-controlled visibility didn't actually hide the chip. */
.lm-bpf-cat[hidden],
.lm-bpf-date[hidden],
.lm-bpf-album[hidden],
.pl-media-cat[hidden],
.pl-media-date[hidden] {
  display: none !important;
}

/* Phase 2.9 — album-name pill INSIDE the top-right .lm-port-badges
   flex row (sits LEFT of gallery-count / pin badges for read order).
   Same chip language as the other badges; text truncates on long
   album names so the badge doesn't crowd the card. */
.lm-port-album-badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 4px 8px;
  border-radius: 12px;
  background: rgba(0, 0, 0, .65);
  color: #fff;
  font-family: var(--lm-font-mono, ui-monospace, monospace);
  font-size: 10.5px;
  font-weight: 600;
  max-width: 130px;
  white-space: nowrap;
  overflow: hidden;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
}
.lm-port-album-badge > span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.lm-port-album-badge svg { flex: none; opacity: .9; }

/* Existing legacy badges sit top-right (.lm-port-badges) and stay
   there — the chip is top-left so they don't collide. */

/* ──────────────────────────────────────────────────────────────────────
 * Phase 7.10 P3 — Add-more tile (first cell of the talent portfolio
 * masonry). Owner-only, dashed-border placeholder with centered "+"
 * icon and label. Hover lifts + colours the border green.
 * ────────────────────────────────────────────────────────────────────── */
/* Add tile carries BOTH .lm-portfolio-card (so masonry JS positions it
   as a regular column slot, otherwise absolutely-positioned cards
   render OVER it) AND .lm-portfolio-add-tile (tile-specific paint). */
.lm-masonry .lm-portfolio-card.lm-portfolio-add-tile {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
  /* width is set by .lm-portfolio-card (column width via calc()).
     min-height gives the tile presence even when empty. */
  min-height: 240px;
  padding: 24px 16px;
  border: 2px dashed var(--lm-border-strong, #cbd5e1) !important;
  border-radius: 12px;
  background: var(--lm-surface, #f8fafc) !important;
  color: var(--lm-text-secondary, #64748b);
  font: inherit;
  cursor: pointer;
  transition: border-color .15s, background .15s, color .15s, transform .15s;
}
.lm-masonry .lm-portfolio-card.lm-portfolio-add-tile:hover {
  border-color: var(--lm-primary, #2ea16f) !important;
  background: var(--lm-primary-soft, #d8f3e7) !important;
  color: var(--lm-primary-strong, #0a6b46);
  /* Override the .lm-portfolio-card hover lift (translate: 0 -2px)
     which would fight the masonry JS-applied `transform: translate()`. */
  translate: 0 -2px;
}
.lm-portfolio-add-tile-icon {
  width: 56px;
  height: 56px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: rgba(46, 161, 111, .08);
  color: var(--lm-primary, #2ea16f);
}
.lm-portfolio-add-tile:hover .lm-portfolio-add-tile-icon {
  background: rgba(46, 161, 111, .18);
}
.lm-portfolio-add-tile-label {
  font-size: 14px;
  font-weight: 700;
  margin-top: 4px;
}
.lm-portfolio-add-tile-sub {
  font-size: 11.5px;
  color: var(--lm-muted, #94a3b8);
  font-weight: 500;
}

/* Dark theme */
html[data-lm-theme="dark"] .lm-portfolio-add-tile {
  background: rgba(255, 255, 255, .02);
  border-color: var(--lm-border, #30363d);
  color: var(--lm-text-secondary, #8b949e);
}
html[data-lm-theme="dark"] .lm-portfolio-add-tile:hover {
  border-color: #6ee7a8;
  background: rgba(110, 231, 168, .08);
  color: #6ee7a8;
}

/* ──────────────────────────────────────────────────────────────────────
 * Phase 7.10 P3 — empty-portfolio side-by-side layout:
 *   [ Add tile ][ icon + title + description ]
 * Standalone (no .lm-masonry parent) so the masonry JS engine ignores
 * the tile. Stacks vertically on small viewports.
 * ────────────────────────────────────────────────────────────────────── */
.lm-portfolio-empty-row {
  display: flex;
  align-items: stretch;
  gap: 28px;
  padding: 8px 0;
}
@media (max-width: 720px) {
  .lm-portfolio-empty-row {
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: 18px;
  }
}

/* Solo (non-masonry) variant — fixed square, overrides the
   .lm-portfolio-card chrome (position:absolute + visibility:hidden)
   that would otherwise hide it. */
.lm-portfolio-add-tile.lm-portfolio-add-tile-solo {
  position: static !important;
  visibility: visible !important;
  width: 260px;
  height: 260px;
  flex: 0 0 260px;
  margin: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding: 24px 16px;
  border: 2px dashed var(--lm-border-strong, #cbd5e1) !important;
  border-radius: 14px;
  background: var(--lm-surface, #f8fafc) !important;
  color: var(--lm-text-secondary, #64748b);
  font: inherit;
  cursor: pointer;
  transition: border-color .15s, background .15s, color .15s, translate .15s;
}
.lm-portfolio-add-tile.lm-portfolio-add-tile-solo:hover {
  border-color: var(--lm-primary, #2ea16f) !important;
  background: var(--lm-primary-soft, #d8f3e7) !important;
  color: var(--lm-primary-strong, #0a6b46);
  translate: 0 -2px;
}

/* Hint block on the right — icon centered on top, title + description
   below, all centred horizontally. */
.lm-portfolio-empty-hint {
  flex: 1 1 auto;
  min-width: 0;
  max-width: 460px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  gap: 8px;
  padding: 8px 0;
}
.lm-portfolio-empty-hint-icon {
  width: 52px;
  height: 52px;
  display: grid;
  place-items: center;
  border-radius: 12px;
  background: var(--lm-primary-soft, #d8f3e7);
  color: var(--lm-primary, #2ea16f);
  margin-bottom: 6px;
}
.lm-portfolio-empty-hint-title {
  font-size: 17px;
  font-weight: 700;
  margin: 0;
  color: var(--lm-text, #0f172a);
}
.lm-portfolio-empty-hint-desc {
  font-size: 13.5px;
  line-height: 1.6;
  color: var(--lm-muted, #64748b);
  margin: 0;
}
.lm-portfolio-empty-hint-desc strong {
  color: var(--lm-text, #0f172a);
  font-weight: 600;
}

/* Dark theme */
html[data-lm-theme="dark"] .lm-portfolio-add-tile.lm-portfolio-add-tile-solo {
  background: rgba(255, 255, 255, .02) !important;
  border-color: var(--lm-border, #30363d) !important;
  color: var(--lm-text-secondary, #8b949e);
}
html[data-lm-theme="dark"] .lm-portfolio-add-tile.lm-portfolio-add-tile-solo:hover {
  border-color: #6ee7a8 !important;
  background: rgba(110, 231, 168, .08) !important;
  color: #6ee7a8;
}
html[data-lm-theme="dark"] .lm-portfolio-empty-hint-icon {
  background: rgba(110, 231, 168, .14);
  color: #6ee7a8;
}
html[data-lm-theme="dark"] .lm-portfolio-empty-hint-title { color: var(--lm-text, #e6edf3); }
html[data-lm-theme="dark"] .lm-portfolio-empty-hint-desc  { color: var(--lm-text-secondary, #8b949e); }
html[data-lm-theme="dark"] .lm-portfolio-empty-hint-desc strong { color: var(--lm-text, #e6edf3); }

/* ──────────────────────────────────────────────────────────────────────
 * Phase 2.9 — Album stack card. Renders a single collapsed card for
 * portfolio_albums where feature_mode='entire'. Visual cues:
 *   • two offset semi-transparent layers behind the cover (stack effect)
 *   • stack-icon + count badge top-right
 *   • album title pill at bottom
 * Inherits masonry positioning from .lm-portfolio-card (already set).
 * ────────────────────────────────────────────────────────────────────── */
.lm-portfolio-card-stack {
  /* The two "layers behind" the cover — pseudo-elements that peek out
     from under the figure giving it the "stack of cards" silhouette. */
  overflow: visible !important;  /* let the offset layers peek out */
}
.lm-portfolio-card-stack > img {
  position: relative;
  z-index: 2;
  border-radius: 12px;
  display: block;
  width: 100%;
  height: auto;
  background: #0f172a;
}
.lm-pf-stack-layers {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
}
.lm-pf-stack-layers::before,
.lm-pf-stack-layers::after {
  content: "";
  position: absolute;
  left: 0; right: 0; top: 0; bottom: 0;
  border: 1px solid var(--lm-border, #e2e8f0);
  border-radius: 12px;
  background: var(--lm-surface-2, #f1f5f9);
}
.lm-pf-stack-layers::before {
  transform: translate(4px, 4px);
  opacity: .85;
  z-index: 0;
}
.lm-pf-stack-layers::after {
  transform: translate(8px, 8px);
  opacity: .55;
  z-index: -1;
}
/* Stack-icon + item-count badge — top-right corner, same dark-blur
   chip language as the other overlays. */
.lm-pf-stack-badge {
  position: absolute;
  top: 8px; right: 8px;
  z-index: 3;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 5px 9px;
  border-radius: 7px;
  background: rgba(15, 23, 42, .6);
  color: #fff;
  font-family: var(--lm-font-mono, ui-monospace, monospace);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .03em;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border: 1px solid rgba(255, 255, 255, .18);
}
.lm-pf-stack-badge svg { flex: none; }

/* PIN overlay button — sits TOP-LEFT of any portfolio card (album-stack
   on talent + brand grids AND individual brand-portfolio cell), owner-only.
   Click toggles pinned state via the matching endpoint:
     data-lm-album-pin → ajax/lm/portfolio/album_pin.php
     data-lm-post-pin  → ajax/profile/portfolio_pin.php
   When .is-on, icon turns LM-green. */
.lm-portfolio-card-stack .lm-pf-album-pin-btn,
.lm-brand-portfolio-cell .lm-pf-album-pin-btn {
  position: absolute;
  top: 8px; left: 8px;
  z-index: 4;
  width: 28px; height: 28px;
  display: inline-flex; align-items: center; justify-content: center;
  padding: 0;
  border-radius: 7px;
  background: rgba(15, 23, 42, .55);
  color: #fff;
  border: 1px solid rgba(255, 255, 255, .18);
  cursor: pointer;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  transition: background .15s ease, color .15s ease, transform .12s ease;
}
.lm-portfolio-card-stack .lm-pf-album-pin-btn:hover,
.lm-brand-portfolio-cell .lm-pf-album-pin-btn:hover { transform: translateY(-1px); }
.lm-portfolio-card-stack .lm-pf-album-pin-btn.is-on,
.lm-brand-portfolio-cell .lm-pf-album-pin-btn.is-on {
  background: var(--lm-primary, #2f8a5f);
  color: #fff;
  border-color: rgba(255, 255, 255, .35);
}
.lm-portfolio-card-stack .lm-pf-album-pin-btn.is-on svg,
.lm-brand-portfolio-cell .lm-pf-album-pin-btn.is-on svg { fill: currentColor; }
/* Phase 2.9 — album-name span inside the stack badge. Sits to the
   LEFT of the icon + count, truncates on overflow. */
.lm-pf-stack-badge-name {
  font-family: var(--lm-font-mono, ui-monospace, monospace);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .04em;
  text-transform: uppercase;
  max-width: 130px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  padding-right: 4px;
  border-right: 1px solid rgba(255, 255, 255, .25);
  margin-right: 2px;
}
/* Bottom album-label removed — name now lives in the top-right badge. */
.lm-pf-stack-label { display: none !important; }
/* Album-title pill — bottom-left, sized to TEXT WIDTH (not stretched
   full-width). Lower-opacity backdrop + softer border so the title
   floats over the photo without dominating it. Text-shadow keeps it
   legible against light photos even with the dimmer background. */
.lm-pf-stack-label {
  position: absolute;
  left: 8px; bottom: 8px;
  /* no `right` — width hugs the text, capped so very long titles
     don't blow out of the cell. */
  max-width: calc(100% - 16px);
  z-index: 3;
  padding: 4px 9px;
  border-radius: 6px;
  background: rgba(15, 23, 42, .35);
  color: #fff;
  font-size: 12px;
  font-weight: 600;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  border: 1px solid rgba(255, 255, 255, .12);
  text-shadow: 0 1px 2px rgba(0, 0, 0, .45);
}
/* Hover — lift the WHOLE stack including layers. The masonry JS
   already translates the figure; we layer ::after offsets on top. */
.lm-masonry.is-laid-out .lm-portfolio-card-stack:hover {
  translate: 0 -3px;
}
.lm-portfolio-card-stack:hover .lm-pf-stack-layers::before { transform: translate(5px, 5px); }
.lm-portfolio-card-stack:hover .lm-pf-stack-layers::after  { transform: translate(10px, 10px); }

/* Dark theme parity for the stack layers */
html[data-lm-theme="dark"] .lm-pf-stack-layers::before,
html[data-lm-theme="dark"] .lm-pf-stack-layers::after {
  background: var(--lm-surface, #161b22);
  border-color: var(--lm-border, #30363d);
}

/* ──────────────────────────────────────────────────────────────────────
 * Phase 2.9 — Manage button + per-card delete X on talent portfolio.
 * Parity with brand-page manage mode (.lm-brand-portfolio-manage +
 * .lm-bpf-del). Button styled like Sort pill, X overlay shows only
 * when .lm-masonry has .is-managing.
 * ────────────────────────────────────────────────────────────────────── */
/* Manage pill — bumped specificity (.lm-port-controls scope) so the
   legacy global `.lm-port-controls button` rule doesn't strip styles.
   Backdrop white + slate border in idle state; turns red when active. */
.lm-port-controls .lm-portfolio-manage {
  display: inline-flex !important;
  align-items: center;
  gap: 6px;
  padding: 7px 14px !important;
  background: #fff !important;
  border: 1px solid var(--lm-border, #e2e8f0) !important;
  border-radius: 999px !important;
  font-size: 12.5px !important;
  font-weight: 500 !important;
  color: var(--lm-text-secondary, #475569) !important;
  cursor: pointer;
  /* Phase 2.9 — parent .lm-port-controls has flex `gap: 12px`. Pull
     manage back 10px so the actual visual gap between trash icon and
     Sort pill is ~2px. The negative margin doesn't affect upstream
     siblings (filter pills) because we use right-direction. */
  margin-right: -10px;
  flex-shrink: 0;
  transition: background .12s, color .12s, border-color .12s, box-shadow .12s;
}
/* Icon-only variant — compact round button, just the trash glyph.
   Same colour states as the labelled version (idle/hover/active). */
.lm-port-controls .lm-portfolio-manage-icon {
  gap: 0;
  padding: 7px !important;
  width: 32px;
  height: 32px;
  justify-content: center;
  /* Migration 076 — relative anchor for the left-side fade gradient.
     The ::before extends ~36px LEFT with a transparent-to-bg gradient
     so filter pills scrolling past slide UNDER the trash button cleanly
     instead of being chopped off at a hard edge. */
  position: relative;
  z-index: 2;
}
.lm-port-controls .lm-portfolio-manage-icon::before {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  right: 100%;
  width: 40px;
  pointer-events: none;
  background: linear-gradient(to right,
    rgba(255, 255, 255, 0) 0,
    var(--lm-bg, #fff) 100%);
}
html[data-lm-theme="dark"] .lm-port-controls .lm-portfolio-manage-icon::before {
  background: linear-gradient(to right,
    rgba(13, 17, 23, 0) 0,
    var(--lm-surface, #0d1117) 100%);
}
.lm-port-controls .lm-portfolio-manage-icon svg {
  width: 16px;
  height: 16px;
  display: block;
}
.lm-port-controls .lm-portfolio-manage:hover {
  color: var(--lm-text, #0f172a) !important;
  border-color: var(--lm-muted-2, #cbd5e1) !important;
  box-shadow: 0 1px 3px rgba(15, 23, 42, .08);
}
.lm-port-controls .lm-portfolio-manage.is-active {
  background: var(--lm-danger, #c0392b) !important;
  color: #fff !important;
  border-color: var(--lm-danger, #c0392b) !important;
}
/* Dark-mode parity — same dark surface as Sort pill. */
html[data-lm-theme="dark"] .lm-port-controls .lm-portfolio-manage {
  background: var(--lm-surface, #0d1117) !important;
  color: var(--lm-text-secondary, #8b949e) !important;
  border-color: var(--lm-border, #30363d) !important;
}
html[data-lm-theme="dark"] .lm-port-controls .lm-portfolio-manage:hover {
  background: rgba(255, 255, 255, .04) !important;
  color: var(--lm-text, #e6edf3) !important;
  border-color: var(--lm-muted, #4b5666) !important;
}

/* Per-card X — same dark-blur-chip language as the other overlays
   (.lm-bpf-date, .lm-pf-stack-badge). NOT bright red — that looked
   like a fire alarm. Hover gives a red tint; pending state (after
   first click) goes red + pulse to indicate "click again to confirm". */
.lm-portfolio-card .lm-port-del-btn {
  position: absolute !important;
  top: 8px !important;
  right: 8px !important;
  z-index: 6 !important;
  display: none;
  width: 26px !important;
  height: 26px !important;
  border-radius: 7px !important;
  background: rgba(15, 23, 42, .6) !important;
  color: #fff !important;
  border: 1px solid rgba(255, 255, 255, .22) !important;
  cursor: pointer;
  padding: 0 !important;
  place-items: center;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  transition: background .15s, color .15s, border-color .15s, transform .12s;
}
.lm-portfolio-card .lm-port-del-btn svg {
  width: 13px !important; height: 13px !important;
  display: block; color: inherit !important;
}
.lm-masonry.is-managing .lm-portfolio-card .lm-port-del-btn { display: grid !important; }
.lm-portfolio-card .lm-port-del-btn:hover {
  background: rgba(192, 57, 43, .85) !important;
  border-color: rgba(255, 255, 255, .35) !important;
  transform: scale(1.06);
}
/* Pending state — armed for the confirm click. Expands into a wider
   pill with explicit "Tap again" label so user sees the affordance
   change clearly (the previous tiny pulse was too easy to miss). */
.lm-portfolio-card .lm-port-del-btn.is-pending {
  width: auto !important;
  padding: 0 12px !important;
  background: var(--lm-danger, #c0392b) !important;
  border-color: #fff !important;
  animation: lm-port-del-pulse 1.1s ease-in-out infinite;
}
.lm-portfolio-card .lm-port-del-btn.is-pending svg { display: none !important; }
.lm-portfolio-card .lm-port-del-btn.is-pending::before {
  content: "Confirm delete?";
  color: #fff;
  font-family: var(--lm-font-mono, ui-monospace, monospace);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .04em;
  text-transform: uppercase;
  white-space: nowrap;
}
@keyframes lm-port-del-pulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(192, 57, 43, .6); }
  50%      { box-shadow: 0 0 0 8px rgba(192, 57, 43, 0); }
}

/* When manage-mode is on, push top-right elements LEFT so they don't
   sit under the X button. Covers BOTH the regular gallery/pin badges
   AND the album-stack count badge (different markup). */
.lm-masonry.is-managing .lm-portfolio-card .lm-port-badges,
.lm-masonry.is-managing .lm-portfolio-card.lm-portfolio-card-stack .lm-pf-stack-badge {
  right: 42px !important;
}

/* Manage mode hover hint — soft red border on cards so the X reads as
   "delete affordance" instead of just hovering. */
.lm-masonry.is-managing .lm-portfolio-card { cursor: default; }
.lm-masonry.is-managing .lm-portfolio-card:hover { border-color: var(--lm-danger, #c0392b); }

/* ============================================================
   Phase 11.2 — BRAND ACCOUNTS: navy brand identity in the sidebar.
   For business accounts (html.lm-acct-brand), the sidebar's green accents
   (active nav highlight, nav icons, the "+ Create" button) become the brand
   teal-navy (#00363f) to match the brand pricing page. The active-nav/icon
   greens are var-based, so remapping --lm-primary* on the sidebar flips them;
   the "+ Create" button is hardcoded green, so it gets an explicit override.
   Talent / admin accounts are unaffected (no lm-acct-brand class).
   ============================================================ */
html.lm-acct-brand .lm-sidebar{--lm-primary:#00363f;--lm-primary-text:#00363f;--lm-primary-strong:#002429;--lm-primary-soft:rgba(0,54,63,.10);--lm-primary-soft-2:rgba(0,54,63,.28)}
html.lm-acct-brand .lm-sidebar .lm-create-btn,
html.lm-acct-brand .lm-create-btn{background:#00363f !important;border-color:#002429 !important;box-shadow:0 2px 6px rgba(0,54,63,0.28), inset 0 -1px 0 rgba(0,0,0,0.12)}
html.lm-acct-brand .lm-sidebar .lm-create-btn:hover,
html.lm-acct-brand .lm-create-btn:hover{background:#002429 !important}
/* Dark theme: #00363f is invisible on the dark sidebar — use the lighter brand
   teal (#318b99, same as the brand directory's dark accent) so the active nav,
   logo mark, icons and "+ Create" button stay legible. */
html[data-lm-theme="dark"].lm-acct-brand .lm-sidebar{--lm-primary:#318b99;--lm-primary-text:#b5d8e0;--lm-primary-strong:#45a8b8;--lm-primary-soft:rgba(49,139,153,.22);--lm-primary-soft-2:rgba(49,139,153,.42)}
html[data-lm-theme="dark"].lm-acct-brand .lm-sidebar .lm-create-btn,
html[data-lm-theme="dark"].lm-acct-brand .lm-create-btn{background:#1d6470 !important;border-color:#318b99 !important}
html[data-lm-theme="dark"].lm-acct-brand .lm-sidebar .lm-create-btn:hover,
html[data-lm-theme="dark"].lm-acct-brand .lm-create-btn:hover{background:#256d7a !important}

/* ════════════════════════════════════════════════════════════════════
   Lightbox comment composer — emoji / photo / GIF wiring (2026-05).
   Emoji + GIF pickers float ABOVE the input (open upward). The attachment
   preview (uploaded photo or chosen GIF) also floats above. Dark-mode aware.
   ════════════════════════════════════════════════════════════════════ */
.pl-composer-pop {
  position: absolute;
  left: 0; bottom: calc(100% + 8px);
  z-index: 30;
  background: #fff;
  border: 1px solid var(--lm-border);
  border-radius: 12px;
  box-shadow: 0 8px 28px rgba(0,0,0,.18);
  padding: 8px;
}
.pl-emoji-pop {
  width: 264px; max-height: 196px; overflow-y: auto;
  display: flex; flex-wrap: wrap; gap: 2px;
}
.pl-emoji-pop button {
  border: 0; background: transparent; cursor: pointer;
  width: 30px; height: 30px; border-radius: 8px;
  font-size: 19px; line-height: 1; padding: 0;
}
.pl-emoji-pop button:hover { background: var(--lm-surface); }
.pl-gif-pop { width: 300px; }
.pl-gif-search {
  width: 100%; box-sizing: border-box;
  border: 1px solid var(--lm-border); border-radius: 8px;
  padding: 7px 10px; font-size: 13px; margin-bottom: 8px;
  background: var(--lm-surface); color: var(--lm-text);
}
.pl-gif-results {
  display: grid; grid-template-columns: 1fr 1fr; gap: 6px;
  max-height: 240px; overflow-y: auto;
}
.pl-gif-results img {
  width: 100%; height: 86px; object-fit: cover;
  border-radius: 8px; cursor: pointer; display: block; background: var(--lm-surface);
}
.pl-gif-results img:hover { outline: 2px solid var(--lm-primary); }
.pl-gif-hint { font-size: 12px; color: var(--lm-muted); padding: 10px 4px; line-height: 1.4; }
/* attachment preview — a polished floating card above the input */
.pl-composer-attach {
  position: absolute; left: 0; bottom: calc(100% + 10px); z-index: 120;
  display: inline-block; padding: 6px;
  background: #fff;
  border: 1px solid var(--lm-border);
  border-radius: 14px;
  box-shadow: 0 10px 30px rgba(15,23,42,.16);
}
/* little pointer tail toward the input */
.pl-composer-attach::after {
  content: ""; position: absolute; left: 22px; top: 100%;
  width: 12px; height: 12px; margin-top: -6px;
  background: #fff; border-right: 1px solid var(--lm-border); border-bottom: 1px solid var(--lm-border);
  transform: rotate(45deg);
}
.pl-composer-attach-img {
  display: block; width: 132px; height: 132px;
  object-fit: cover; border-radius: 10px; background: var(--lm-surface);
}
.pl-composer-attach-x {
  position: absolute; top: -9px; right: -9px;
  width: 26px; height: 26px; border-radius: 50%;
  border: 2px solid #fff; background: #111827; color: #fff; cursor: pointer;
  display: grid; place-items: center; padding: 0;
  box-shadow: 0 2px 6px rgba(0,0,0,.35);
  transition: background .12s, transform .12s;
}
.pl-composer-attach-x:hover { background: #dc2626; transform: scale(1.08); }
html[data-lm-theme="dark"] .pl-composer-attach { background: #1c2230; border-color: var(--lm-border, #30363d); box-shadow: 0 10px 30px rgba(0,0,0,.55); }
html[data-lm-theme="dark"] .pl-composer-attach::after { background: #1c2230; border-color: var(--lm-border, #30363d); }
html[data-lm-theme="dark"] .pl-composer-attach-x { border-color: #1c2230; }

/* Save Post (kebab menu) — saved state: green icon + label swaps to "Saved Post". */
.lm-pl-more-item.is-saved svg { color: var(--lm-primary, #0f6f4f); fill: var(--lm-primary, #0f6f4f); }

/* Dark mode for the composer pickers + attachment. */
html[data-lm-theme="dark"] .pl-composer-pop { background: #1c2230; border-color: var(--lm-border, #30363d); box-shadow: 0 8px 28px rgba(0,0,0,.55); }
html[data-lm-theme="dark"] .pl-emoji-pop button:hover { background: #2a3240; }
html[data-lm-theme="dark"] .pl-gif-search { background: #161b22; border-color: var(--lm-border, #30363d); color: var(--lm-text, #e6edf3); }
html[data-lm-theme="dark"] .pl-composer-attach-img { border-color: var(--lm-border, #30363d); }

/* ============================================================
   LM — Promo points review modal (admin-only, profile More menu)
   ============================================================ */
.lm-promo-list { display: flex; flex-direction: column; gap: 12px; }
.lm-promo-item {
  border: 1px solid var(--lm-border, #e2e8f0);
  border-radius: 12px;
  padding: 14px 16px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.lm-promo-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.lm-promo-badge {
  display: inline-flex; align-items: center;
  font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  padding: 3px 9px; border-radius: 999px;
  color: var(--lm-primary, #0f6f4f); background: var(--lm-primary-soft, #f3f8f5);
  border: 1px solid var(--lm-primary-soft-2, #dcebe2);
}
.lm-promo-badge.is-review { color: #7c5817; background: #fef7d6; border-color: #f5deb3; }
.lm-promo-badge.is-ugc { color: #075985; background: #e0f2fe; border-color: #bae6fd; }
.lm-promo-date { font-size: 12px; color: var(--lm-muted, #64748b); font-variant-numeric: tabular-nums; }
.lm-promo-url {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 13.5px; color: var(--lm-primary, #0f6f4f); font-weight: 600;
  text-decoration: none; word-break: break-all;
}
.lm-promo-url:hover { text-decoration: underline; }
.lm-promo-tiers { display: flex; flex-wrap: wrap; gap: 8px; }
.lm-promo-tier {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 13px; color: var(--lm-text, #0f172a);
  border: 1px solid var(--lm-border, #e2e8f0); border-radius: 8px; padding: 6px 10px; cursor: pointer;
}
.lm-promo-tier:has(input:checked) { border-color: var(--lm-primary, #0f6f4f); background: var(--lm-primary-soft, #f3f8f5); }
.lm-promo-wait { font-size: 12.5px; color: var(--lm-warning, #b45309); }
.lm-promo-actions { display: flex; justify-content: flex-end; gap: 8px; }
/* promo review modal — reject reason box */
.lm-promo-reject-form { width: 100%; margin-top: 4px; }
.lm-promo-reason { width: 100%; min-height: 52px; border: 1px solid var(--lm-border, #e2e8f0); border-radius: 8px; padding: 8px 10px; font: inherit; font-size: 13px; resize: vertical; }

/* ════════════════════════════════════════════════════════════════════
   Phase 14.4 — Publish to Directory: owner button states + confirm scrim.
   ════════════════════════════════════════════════════════════════════ */
.lm-publish-state { cursor: default; pointer-events: none; }
.lm-btn-success { background: #0F6F4F; border-color: #0F6F4F; color: #fff; }
.js_publish-directory.is-disabled { opacity: .55; cursor: not-allowed; }

.lm-publish-scrim {
  position: fixed; inset: 0; z-index: 4000;
  display: flex; align-items: center; justify-content: center;
  background: rgba(15, 23, 42, .55); padding: 20px;
}
.lm-publish-scrim[hidden] { display: none; }
.lm-publish-modal {
  width: 100%; max-width: 420px; background: var(--lm-surface, #fff);
  border-radius: 14px; padding: 22px; box-shadow: 0 18px 48px rgba(15,23,42,.28);
}
.lm-publish-modal-title { margin: 0 0 8px; font-size: 17px; font-weight: 700; color: var(--lm-text, #0f172a); }
.lm-publish-modal-text { margin: 0 0 12px; font-size: 14px; color: var(--lm-muted, #475569); line-height: 1.5; }
.lm-publish-modal-reason {
  background: var(--lm-surface-2, #f1f5f9); border-radius: 8px; padding: 9px 12px;
  font-size: 13px; color: var(--lm-text, #0f172a); margin-bottom: 12px;
}
.lm-publish-modal-err {
  background: #fee2e2; color: #b91c1c; border-radius: 8px; padding: 9px 12px;
  font-size: 13px; margin-bottom: 12px;
}
.lm-publish-modal-actions { display: flex; justify-content: flex-end; gap: 10px; }
html[data-lm-theme="dark"] .lm-publish-modal { background: #1b212b; }
html[data-lm-theme="dark"] .lm-publish-modal-reason { background: #232932; color: #e6edf3; }

/* Phase 14.4 — Profile-completion checklist rows are links to each edit section
   (Cover/Portfolio stay non-link). Flex moved from <li> to the row anchor. */
.lm-completion li { display: block; padding: 0; }
.lm-completion-row { display: flex; align-items: center; gap: 8px; padding: 4px 0; color: inherit; text-decoration: none; }
.lm-completion li.is-done .lm-completion-row { text-decoration: line-through; }
a.lm-completion-row { cursor: pointer; }
a.lm-completion-row:hover { color: var(--lm-primary); }
a.lm-completion-row:hover .lm-completion-chev { opacity: 1; }
.lm-completion-label { flex: 1 1 auto; }
.lm-completion-chev { flex: 0 0 auto; margin-left: auto; color: var(--lm-muted); opacity: .5; }
/* Publish-to-Directory button sits under the checklist, full-width. */
.lm-publish-row { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--lm-border-2, #eef2f6); display: flex; }
.lm-publish-row > .lm-btn,
.lm-publish-row > .lm-publish-state { width: 100%; justify-content: center; }

/* Phase 14.4 — completion row rendered as a <button> (Portfolio → Add-More modal). */
button.lm-completion-row { width: 100%; border: 0; background: none; font: inherit; text-align: left; cursor: pointer; }
button.lm-completion-row:hover { color: var(--lm-primary); }
button.lm-completion-row:hover .lm-completion-chev { opacity: 1; }

/* Phase 14.5 — not-done REQUIRED checklist items (publish-mandatory: cover, bio,
   languages, portfolio, services) get a green plus-circle as a "needed to publish"
   hint. Optional not-done items (measurements, KYC) keep the neutral grey circle;
   done items keep the green check (.is-done rule above). */
.lm-completion-dot.is-required {
  background: var(--lm-primary-soft, #e6f4ee);
  color: var(--lm-primary-strong, #0f6f4f);
  border-color: var(--lm-primary-soft-2, #bfe3d2);
}
html[data-lm-theme="dark"] .lm-completion-dot.is-required {
  background: rgba(46,161,111,.18);
  color: #6ee7a8;
  border-color: rgba(46,161,111,.4);
}
/* Optional not-done items — explicit GREY plus ("not critical", doesn't gate
   publishing). The base dot is already neutral; this locks the intent in so the
   required (green) vs optional (grey) split stays obvious. */
.lm-completion-dot.is-optional {
  background: var(--lm-surface, #fff);
  color: var(--lm-muted, #94a3b8);
  border-color: var(--lm-border, #e5e7eb);
}
html[data-lm-theme="dark"] .lm-completion-dot.is-optional {
  background: var(--lm-surface, #161b22);
  color: var(--lm-muted-2, #8b949e);
  border-color: var(--lm-border, #2a3038);
}

/* Admin convenience: pin the LM sidebar "More" submenu permanently open so the
   admin sees every section at a glance. CSS-forced (display:block !important) so
   the JS toggle / outside-click-close (lm-profile.js initSidebarMore) can't
   collapse it; the "More" trigger is hidden since it's always expanded. Added
   via .lm-more-admin-pinned on .lm-nav-more-wrap when user_group == 1. */
.lm-more-admin-pinned .lm-nav-submenu { display: block !important; }
.lm-more-admin-pinned > .lm-nav-more-trigger { display: none !important; }

/* Travel-region "Worldwide" chip on the public profile (migration 102) —
   replaces former inline styles on the worldwide travel-zone span. */
.lm-travel-zone.is-worldwide { display: inline-flex; align-items: center; gap: 5px; background: var(--lm-primary-soft); border-color: var(--lm-primary-soft-2); color: var(--lm-primary-strong); }

/* ── TOTAL REACH plaque — first item IN the talent's social row ───────────
   Big bold reach total with the "TOTAL REACH" label STACKED UNDERNEATH it, in
   the same bg-plaque style as the Discover card. Sized to match the height of
   the social pills beside it (the card's full version with per-platform pills
   lives in lm-discover.css). Scoped to .lm-social-list so it never hits the card.
   `display:block` on the two lines forces the label under the number. */
/* TOTAL REACH plaque — soft-green "View Details" look: light-green field +
   dark-green number/label. Uses --lm-primary-* tokens, which are redefined
   under html[data-lm-theme="dark"], so it adapts to dark mode automatically. */
.lm-social-list .dc-reach {
  display: inline-flex; flex-direction: column; justify-content: center; gap: 1px; flex: none;
  margin: 0;
  padding: 4px 12px;
  border: 1px solid var(--lm-primary-soft-2, #dcebe2);
  border-radius: 10px;
  background: var(--lm-primary-soft, #f3f8f5);
}
.lm-social-list .dc-reach-total { display: block; font-size: 15px; font-weight: 800; letter-spacing: -0.02em; color: var(--lm-primary-text, #0a5439); line-height: 1.1; }
.lm-social-list .dc-reach-label { display: block; font-size: 8px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--lm-primary-text, #0a5439); opacity: .72; line-height: 1; }

/* Brand/Page verified mark in Recent-bookings rows — teal shield chip
   (same as the brand page .lm-bv-shield), distinct from the green user seal. */
.lm-mlist-bverified {
  display: inline-grid; place-items: center;
  width: 16px; height: 16px;
  border-radius: 4px;
  background: var(--lm-client, #00363f);
  color: #fff;
  vertical-align: -3px;
  flex: none;
}
.lm-mlist-bverified svg { width: 10px; height: 10px; }
