/* TRADEIZ custom overrides - monochrome black/white theme
 * [UPDATE] 2026-04-29 — palette aligned with Chart page (app.css):
 *   page bg #141414, surface #1e1e1e, link #aaaaaa, text-primary #d0d0d0. */

/* Unified dark black background for all pages */
body.theme--dark,
.theme--dark .bg--white-100,
.theme--dark #page {
  /* [UPDATE] 2026-05-11 — pure black background per user request
   * (was #141414). Aligns with --tt-bg-0 in tradeiz-home.css. */
  background-color: #000000 !important;
  --text-primary: #d0d0d0;
}

/* Global link color — chart --text-muted #aaaaaa for soft on dark */
.theme--dark a:not(.tz-btn) { color: #aaaaaa; }
.theme--dark a:not(.tz-btn):hover { color: #ffffff !important; }
.theme--dark .bg--white-300,
.theme--dark .bg--white-400,
.theme--dark .bg--purple-100,
.theme--dark .shape--purple-100:after,
.theme--dark .shape--white-500:after,
.theme--dark .shape--white-400:after,
.theme--dark .shape--white-300:after,
.theme--dark .shape--white-200:after {
  background-color: #1e1e1e !important;
}
.theme--dark .gr--smoke,
.theme--dark .gr--ghost,
.theme--dark .gr--whitesmoke,
.theme--dark .bg--02,
.theme--dark .bg--04,
.theme--dark .shape--whitesmoke:after,
.theme--dark .shape--gr-whitesmoke:after {
  /* [UPDATE] 2026-05-11 — pure black site-wide. */
  background-color: #000000 !important;
  background-image: none !important;
}
.theme--dark #login,
.theme--dark #signup {
  background: #000000 !important;
  background-image: none !important;
}
.theme--dark #login .register-page-wrapper:after,
.theme--dark #signup .register-page-wrapper:after {
  background-color: #1e1e1e !important;
}
/* [REMOVED 2026-05-11] dark-theme footer override — footer is now
 * theme-agnostic via #footer-3 / .footer rules below. Keeping this
 * block as an empty marker for git history readability. */
/* [UPDATE] 2026-04-29 — sticky header on scroll: keep page bg colour to
 * avoid the dark-on-dark "shelf" effect; preserve a 1px bottom border in the
 * previous scroll-state colour (#1e1e1e) so there is still a clear visual
 * separator between header and content. */
.theme--dark .tra-menu .wsmainfull.scroll,
.theme--dark .white-menu .wsmainfull.scroll,
.theme--dark .dark-menu .wsmainfull.scroll,
.theme--dark .tra-menu.white-scroll .wsmainfull.scroll {
  /* [UPDATE] 2026-05-11 — pure black bg + darker separator (#1e1e1e -> #0a0a0a)
   * to keep the original 4% luminance step against the new #000 surface
   * (was bg #141414 + border #1e1e1e). Without this the old #1e1e1e
   * separator would now read as a too-bright grey line on pure black. */
  background-color: #000000 !important;
  border-bottom: 1px solid #0a0a0a !important;
  box-shadow: none !important;
}
/* [FIX] 2026-05-14 — dark theme also needs to override the menu.css
 * default `.wsmainfull { background-color: #fff !important }` for the
 * NON-scrolled state, otherwise the top bar flashes white at the page
 * top and only turns black after scrolling — a visible theme break. */
.theme--dark .tra-menu .wsmainfull,
.theme--dark .white-menu .wsmainfull,
.theme--dark .dark-menu .wsmainfull,
.theme--dark .tra-menu.white-scroll .wsmainfull {
  background-color: #000000 !important;
}

/* Header bar is always #000 — scope --text-primary so functional icons
 * reference var(--text-primary) instead of hard-coded #ffffff. */
.tra-menu .wsmainfull,
.tra-menu .wsmobileheader,
.tra-menu .wsmenu {
  --text-primary: #d0d0d0;
  --web-icon-size: 24px;
  --web-hypercharts-icon-size: 28px;
  --web-icon-stroke: 1.6;
}

/* Theme color overrides: purple -> Binance yellow */
.btn--theme {
  color: #ffffff !important;
  border-color: transparent !important;
  background-color: #333333 !important;
}
.hover--theme:hover,
.white-scroll .scroll .hover--theme:hover,
.black-scroll .scroll .hover--theme:hover,
.theme--dark .white-scroll .scroll .hover--theme:hover,
.theme--dark .white-scroll .hover--theme:hover {
  color: #ffffff !important;
  border-color: transparent !important;
  background-color: #222222 !important;
}
.color--theme,
.color--theme h1, .color--theme h2, .color--theme h3,
.color--theme h4, .color--theme h5, .color--theme h6,
.color--theme p, .color--theme a, .color--theme li,
.color--theme i, .color--theme span,
.color--white .color--theme { color: #ffffff !important; }
.loading--theme .loader { border-color: transparent #ffffff; }
.loading--theme .loader::after { border-color: transparent rgba(255, 255, 255, 0.12); }
.nav-theme .sm-info { background-color: #ffffff; }
.wsmenu > .wsmenu-list.nav-theme > li > ul.sub-menu > li > a:hover,
.wsmenu > .wsmenu-list.nav-theme > li > .wsmegamenu.w-75 ul.link-list > li > a:hover,
.wsmenu > .wsmenu-list.nav-theme > li > .wsmegamenu.halfmenu ul.link-list > li > a:hover {
  color: #ffffff !important;
}
.switch-wrap input:checked + .switcher.switcher--theme {
  background-color: #ffffff !important;
  border-color: #ffffff !important;
}
.hero-section .quick-form .form-control:focus,
.newsletter-section .form-control:focus {
  border-color: rgba(255, 255, 255, 0.5) !important;
}
.shape-ico.color--theme path { fill: var(--text-primary) !important; }
/* Hero blur: subtle dark overlay */
.hero-section.blur--purple:after {
  background-image: none !important;
  background: radial-gradient(ellipse at center, transparent 0%, rgba(10, 10, 12, 0.3) 70%) !important;
}

/*
 * Marketing site (#page): normal copy 16px. Headings keep template h1-h6 and .s-4x+ display sizes.
 */
#page.font--jakarta {
  font-size: 16px;
  line-height: 1.55;
}
#page.font--jakarta p {
  font-size: 16px !important;
}
#page.font--jakarta p.p-sm,
#page.font--jakarta p.p-md,
#page.font--jakarta p.p-xl {
  font-size: 16px !important;
}
#page.font--jakarta p.s-21,
#page.font--jakarta .section-title p.s-21,
#page.font--jakarta .section-title p.color--grey,
#page.font--jakarta .section-title p.s-21.color--grey {
  font-size: 16px !important;
}
#page.font--jakarta .section-id {
  font-size: 16px !important;
}
#page.font--jakarta .cbox-1-txt p,
#page.font--jakarta .fbox-txt p,
#page.font--jakarta .fbox-txt p.p-sm,
#page.font--jakarta .txt-block p,
#page.font--jakarta .txt-box p,
#page.font--jakarta .simple-list .list-item p,
#page.font--jakarta .cbox-4-txt p,
#page.font--jakarta .in_tool-txt p,
#page.font--jakarta .in_tool-txt p.p-sm,
#page.font--jakarta .review-txt p,
#page.font--jakarta .review-txt p.p-sm,
#page.font--jakarta .statistic-block-txt p,
#page.font--jakarta .rating-title h5,
#page.font--jakarta .img-block-btn .advantages p,
#page.font--jakarta .img-block-btn .btn-txt,
#page.font--jakarta .banner-7-txt .btn-txt {
  font-size: 16px !important;
}
#page.font--jakarta #footer-3 .foo-links a,
#page.font--jakarta #footer-3 .foo-links p,
#page.font--jakarta #footer-3 .footer-mail-link a,
#page.font--jakarta #footer-3 .footer-socials {
  font-size: 14px !important;
}
#page.font--jakarta a.btn,
#page.font--jakarta button.btn {
  font-size: 16px !important;
}
#page.font--jakarta .tra-link,
#page.font--jakarta .txt-block-tra-link a {
  font-size: 16px !important;
}
#page.font--jakarta .star-rating {
  font-size: 16px !important;
}
#page.font--jakarta .pricing-features li p,
#page.font--jakarta .pricing-table-header .price > p,
#page.font--jakarta .pricing-table-header .btn-txt,
#page.font--jakarta .toggle-btn .toggler-txt,
#page.font--jakarta .toggle-btn p.color--theme {
  font-size: 16px !important;
}
#page.font--jakarta .form-control,
#page.font--jakarta input.form-control,
#page.font--jakarta textarea.form-control {
  font-size: 16px !important;
}
#page.font--jakarta .form-message {
  font-size: 16px !important;
}

/* Wider layout - max 2800px with side padding */
@media (min-width: 992px) {
  .container { max-width: 1280px !important; padding-left: 40px !important; padding-right: 40px !important; }
  .wsmainwp { max-width: 1280px !important; padding-left: 40px !important; padding-right: 40px !important; }
}
@media (min-width: 1200px) {
  .container { max-width: 1600px !important; padding-left: 48px !important; padding-right: 48px !important; }
  .wsmainwp { max-width: 1600px !important; padding-left: 48px !important; padding-right: 48px !important; }
}
@media (min-width: 1400px) {
  .container { max-width: 1800px !important; padding-left: 56px !important; padding-right: 56px !important; }
  .wsmainwp { max-width: 1800px !important; padding-left: 56px !important; padding-right: 56px !important; }
}
@media (min-width: 1800px) {
  .container { max-width: 2200px !important; padding-left: 64px !important; padding-right: 64px !important; }
  .wsmainwp { max-width: 2200px !important; padding-left: 64px !important; padding-right: 64px !important; }
}
@media (min-width: 2200px) {
  .container { max-width: 2800px !important; padding-left: 80px !important; padding-right: 80px !important; }
  .wsmainwp { max-width: 2800px !important; padding-left: 80px !important; padding-right: 80px !important; }
}
.desktoplogo img[alt="TRADEIZ"],
.smllogo img[alt="TRADEIZ"],
.logo-black img[alt="TRADEIZ"],
.logo-white img[alt="TRADEIZ"] {
  height: 36px;
  width: auto;
  max-height: 36px;
}
img.footer-logo[alt="TRADEIZ"] {
  height: 32px;
  max-height: 32px;
  width: auto;
}

/* Inline logo: icon SVG + text span */
/* Reset smllogo line-height on mobile to prevent container expansion */
.smllogo {
  line-height: 1;
}

/* Logo link: single DOM node, colour controlled via currentColor + CSS vars */
a.logo-inline {
  display: inline-flex;
  align-items: center;
  gap: 1px;
  text-decoration: none;
  line-height: 1;
}

a.logo-inline svg {
  flex-shrink: 0;
  display: block;
  align-self: center;
}

a.logo-inline .logo-wordmark {
  font-family: 'Montserrat', 'Plus Jakarta Sans', 'Inter', sans-serif;
  font-weight: 700;
  letter-spacing: 0.02em;
  line-height: 1;
  margin: 0;
  padding: 0;
  display: inline-block;
}

/* tz-logo-wrap: preserves template line-height:70px for vertical centring;
   inner <a> uses inline-flex to align icon and wordmark */
.tz-logo-wrap {
  line-height: 70px;
}

/* Stretch <a> to full container height; flex centres content inside */
.tz-logo-wrap a.logo-inline {
  height: 70px;
}

/* Dark header default: white logo */
.navbar-dark .tz-logo-adaptive,
.theme--dark .navbar-dark .tz-logo-adaptive {
  color: #ffffff;
}
.navbar-dark .tz-logo-adaptive .logo-wordmark,
.theme--dark .navbar-dark .tz-logo-adaptive .logo-wordmark {
  color: #ffffff;
}

/* After scroll, white-scroll active: dark logo */
.tra-menu.white-scroll.scroll .tz-logo-adaptive {
  color: #000000;
}
.tra-menu.white-scroll.scroll .tz-logo-adaptive .logo-wordmark {
  color: #000000;
}

/* Full lockup SVG (icon + TRADEIZ paths): wide aspect ~5:1 */
.logo-inline--md svg.tz-logo-full {
  width: auto;
  height: 32px;
  max-width: min(210px, 40vw);
}
.logo-inline--sm svg.tz-logo-full {
  width: auto;
  height: 26px;
  max-width: min(175px, 52vw);
}
.logo-inline--lg svg.tz-logo-full {
  width: auto;
  height: 38px;
  max-width: 240px;
}
.logo-inline--md .logo-wordmark { font-size: 32px; }
.logo-inline--sm .logo-wordmark { font-size: 26px; }
.logo-inline--lg .logo-wordmark { font-size: 38px; }

/* colors */
a.logo-inline.logo-inline--white {
  color: #ffffff;
}
.logo-inline--white .logo-wordmark { color: #ffffff; }
.logo-inline--dark  .logo-wordmark { color: #000000; }

/* Trusted data from 10+ exchanges - large logos */
#brands-1 .brands-carousel--large .brand-logo img {
  max-height: 90px;
  width: auto;
  min-height: 50px;
  object-fit: contain;
}
/* Dark theme: white logos */
.theme--dark #brands-1:not(.brands--light-bg) .brands-carousel--large .brand-logo img {
  filter: brightness(0) invert(1);
}
#brands-1.brands--light-bg .brands-carousel--large .brand-logo img {
  filter: invert(1);
}
/* Light theme: dark logos (no filter or grayscale) */
.theme--light #brands-1 .brands-carousel--large .brand-logo img {
  filter: grayscale(100%) brightness(0.3) !important;
}
/* Light theme brands title */
.theme--light #brands-1 .brands-title h5,
.theme--light .brands-section .brands-title h5 {
  color: #000000 !important;
}

#footer-3,
.footer {
  --text-primary: #d0d0d0;
}

/* Footer - compact spacing */
#footer-3.pt-100 { padding-top: 50px !important; padding-bottom: 40px !important; }
/* Bootstrap row cols use min-width:auto; narrow xl cols + non-wrapping social row spilled into Product */
#footer-3 .row > [class*="col-"] { min-width: 0; }
#footer-3 .footer-info { max-width: 100%; }
#footer-3 .footer-info a.logo-inline { max-width: 100%; }
#footer-3 .footer-info,
#footer-3 .footer-links { margin-bottom: 12px !important; }
#footer-3 .foo-links li { margin: 0 !important; padding: 2px 0 !important; }
#footer-3 .foo-links li p { margin: 0 !important; padding: 0 !important; line-height: 1.25 !important; }
#footer-3 .footer-info .logo-inline--md svg.tz-logo-full { height: 28px !important; }
#footer-3 .footer-info .logo-inline--md .logo-wordmark { font-size: 28px !important; }
#footer-3 .footer-info .footer-mail-link { margin-top: 8px !important; margin-bottom: 8px !important; }
#footer-3 .footer-info .footer-socials { margin-top: 0 !important; }
#footer-3 .tz-social-icons { list-style: none; padding: 0; margin: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 12px; row-gap: 10px; }
#footer-3 .tz-social-icons li { margin: 0 !important; padding: 0 !important; float: none !important; }
#footer-3 .tz-social-icons > li > a,
#footer-3 .tz-social-icons > li.tt-footer-tg > .tt-footer-tg__trigger {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  margin: 0 !important;
  padding: 0;
  opacity: .6;
  transition: opacity .2s;
}
#footer-3 .tz-social-icons > li > a:hover,
#footer-3 .tz-social-icons > li.tt-footer-tg > .tt-footer-tg__trigger:hover { opacity: 1; }
#footer-3 .tz-social-icons svg { width: 24px; height: 24px; }
#footer-3 .tt-footer-tg {
  position: relative;
  z-index: 1;
}
#footer-3 .tt-footer-tg__trigger {
  box-sizing: border-box;
  border: none;
  background: transparent;
  color: inherit;
  font: inherit;
  line-height: 0;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
}
#footer-3 .tt-footer-tg__trigger:hover,
#footer-3 .tt-footer-tg__trigger:focus-visible,
#footer-3 .tt-footer-tg.is-open .tt-footer-tg__trigger { opacity: 1; }
#footer-3 .tt-footer-tg__trigger:focus-visible { outline: 2px solid #2962ff; outline-offset: 2px; }
#footer-3 .tt-footer-tg__trigger svg { width: 24px; height: 24px; }
#footer-3 .tt-footer-tg__panel {
  position: absolute;
  left: 100%;
  top: 100%;
  margin-top: 0;
  margin-left: 4px;
  transform: translateY(8px);
  z-index: 1090;
  width: min(92vw, 440px);
  padding: 12px;
  border-radius: 12px;
  background: #0b0d12;
  border: 1px solid #3a4050;
  box-shadow: 0 12px 40px rgba(0, 0, 0, .55);
}
#footer-3 .tt-footer-tg__panel::before {
  content: '';
  position: absolute;
  left: -16px;
  right: -16px;
  bottom: 100%;
  height: 12px;
}
#footer-3 .tt-footer-tg__panel[hidden] { display: none !important; }
#footer-3 .tt-footer-tg__grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}
#footer-3 .tt-footer-tg__item {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  min-width: 0;
  padding: 8px;
  border-radius: 8px;
  background: #11141c;
}
#footer-3 .tt-footer-tg__link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  width: auto;
  height: auto;
  min-width: 0;
  font-size: 12px;
  line-height: 1.35;
  font-weight: 600;
  color: #4da3ff !important;
  text-decoration: none;
  white-space: nowrap;
  opacity: 1;
}
#footer-3 .tt-footer-tg__link:hover,
#footer-3 .tt-footer-tg__link:focus-visible { color: #2962ff !important; text-decoration: underline; }
#footer-3 .tt-footer-tg__link-icon {
  flex-shrink: 0;
  width: 17px;
  height: 17px;
  color: inherit;
}
#footer-3 .tt-footer-tg__link-text {
  flex: 0 1 auto;
  min-width: min-content;
  white-space: nowrap;
}
#footer-3 .tt-footer-tg__qr-link {
  display: block;
  align-self: center;
  line-height: 0;
  text-decoration: none;
  border-radius: 4px;
  transition: opacity .2s;
}
#footer-3 .tt-footer-tg__qr-link:hover,
#footer-3 .tt-footer-tg__qr-link:focus-visible { opacity: .85; outline: 2px solid #2962ff; outline-offset: 2px; }
#footer-3 .tt-footer-tg__qr {
  display: block;
  width: 96px;
  height: 96px;
  border-radius: 4px;
  background: #ffffff;
  cursor: pointer;
}
@media (max-width: 480px) {
  #footer-3 .tt-footer-tg__panel {
    left: auto;
    right: 0;
    margin-left: 0;
    width: min(92vw, 320px);
  }
  #footer-3 .tt-footer-tg__grid { grid-template-columns: 1fr; }
}
/* [UPDATE] 2026-05-11 — footer-divider is theme-agnostic. Color tuned
 * for the new pure-#000 footer surface: #555 was set when footer bg
 * was #141414, but on #000 it now reads as a too-bright grey bar.
 * #1e1e1e gives a similar low-emphasis "barely-there" divider that
 * preserves brand minimalism while still separating the brand row
 * from the legal block. */
#footer-3 > .footer-divider {
  width: 100% !important;
  margin: 0 0 48px !important;
  border: none !important;
  border-top: 2px solid #1e1e1e !important;
}
#page.font--jakarta #footer-3 .footer-copyright-text,
#footer-3 .footer-copyright-text { font-size: 12px !important; color: var(--text-tertiary, #888) !important; margin-top: 14px !important; margin-bottom: 0 !important; line-height: 1.6 !important; }
#footer-3 .footer-copyright-text a { color: var(--text-tertiary, #888) !important; text-decoration: underline; transition: color .2s; }
#footer-3 .footer-copyright-text a:hover { color: var(--text-primary, #fff) !important; }

/* Third-party attribution (LightweightCharts License compliance) — single line, aligned with Legal heading */
#page #footer-3 p.footer-attribution,
#footer-3 p.footer-attribution {
  margin: 0 !important;
  font-size: 12px !important;
  font-weight: 400 !important;
  line-height: 1.4 !important;
  color: var(--text-tertiary, #888) !important;
  white-space: nowrap;
}
#page #footer-3 p.footer-attribution a,
#footer-3 p.footer-attribution a {
  font-size: 12px !important;
  font-weight: 400 !important;
  color: var(--text-tertiary, #888) !important;
  text-decoration: none;
  transition: color .2s;
}
#page #footer-3 p.footer-attribution a:hover,
#footer-3 p.footer-attribution a:hover {
  color: var(--text-primary, #fff) !important;
  text-decoration: underline;
}

#footer-3 .footer-links .foo-links,
#footer-3 .footer-links .foo-links a,
#footer-3 .footer-mail-link,
#footer-3 .footer-mail-link a,
#footer-3 .footer-socials {
  font-size: 14px !important;
  color: #fff !important;
}

/* [ADD v2] 2026-05-11 — Brand-column tagline: short value-prop sentence
 *   sitting between the logo and the email link. Tertiary color so it
 *   does not compete with the wordmark. */
#footer-3 .footer-info .footer-tagline {
  margin: 8px 0 12px 0 !important;
  font-size: 13px !important;
  font-weight: 400 !important;
  line-height: 1.5 !important;
  color: var(--text-tertiary, #888) !important;
  max-width: 320px;
}

#login, #signup, #verify-email, #verify-alert-email, #reset-password { padding-top: 180px !important; }
#page.page { display: flex; flex-direction: column; min-height: 100vh; }
#page.page > footer { margin-top: auto; }

/* Footer column titles — uppercase grey labels, distinctly less
 * prominent than the link list to follow TradingView / Coinglass
 * footer hierarchy. New EJS uses `.footer-col-title`; old `s-17 w-700`
 * pair has been removed from the markup (it violated the styling
 * font-size whitelist; 12 / 14 / 16 / 18 / 22 / 28 are allowed). */
#footer-3 .footer-links h6,
#footer-3 .footer-col-title,
.footer .footer-col-title {
  font-size: 12px !important;
  font-weight: 600 !important;
  margin-bottom: 12px !important;
  color: #888888 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.08em !important;
}

/* [ADD v5-footer] 2026-05-11 — Brand column (col-xl-4) sits left in its
 *   original position; sitemap (col-xl-8) sits right, internally laid out
 *   as a 4-column × 2-row grid via Bootstrap row inside .footer-sitemap-col.
 *   Brand carries logo + tagline + email + socials + legal block (copyright,
 *   TradingView attribution, Privacy / Terms / Disclaimer). The dedicated
 *   bottom strip from v2..v4 is deleted — legal lives back inside Brand.
 *   Each link column has consistent vertical rhythm so all 8 cells align. */
#footer-3 .footer-main-row { /* nothing extra — Bootstrap row handles layout */ }
#footer-3 .footer-brand-col {
  /* No special layout, but mark for selectors below. */
}
#footer-3 .footer-sitemap-col .footer-sitemap-grid {
  margin: 0; /* nested rows already inherit Bootstrap negative margin */
}
#footer-3 .footer-links {
  margin-bottom: 28px;
}
#footer-3 .footer-links .foo-links li {
  margin-bottom: 6px;
}

/* Legal block — re-attached under Brand in v5. Visually identical to the
 * v2..v4 footer-bottom strip but stacked vertically, since it lives inside
 * a narrow col-xl-4 column rather than a full-width strip. */
#footer-3 .footer-legal {
  margin-top: 20px;
  padding-top: 16px;
  border-top: 1px solid rgba(120, 123, 134, 0.25);
}
#footer-3 .footer-legal p {
  margin: 0 0 4px 0 !important;
  font-size: 12px !important;
  line-height: 1.6 !important;
  color: var(--text-tertiary, #888) !important;
}
#footer-3 .footer-legal__links {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 4px 6px;
  margin-top: 6px !important;
}
#footer-3 .footer-legal__sep {
  opacity: 0.5;
  user-select: none;
}
#footer-3 .footer-legal a {
  color: var(--text-tertiary, #888) !important;
  text-decoration: none;
  transition: color .2s;
}
#footer-3 .footer-legal a:hover {
  color: var(--text-primary, #fff) !important;
  text-decoration: underline;
}

@media (max-width: 1199.98px) {
  /* Below xl, Brand stacks above the sitemap (col-12 takes over). Add
   * top padding to separate sitemap from Brand block. */
  #footer-3 .footer-sitemap-col { padding-top: 24px; }
}
@media (max-width: 991.98px) {
  /* On tablet/mobile, give the link cells slightly tighter rhythm. */
  #footer-3 .footer-links { margin-bottom: 20px; }
}

/* Remove template's 20px top/bottom padding from the main nav bar */
.tra-menu .wsmainfull {
  padding: 0 !important;
}

/* Dark theme: nav dropdown/megamenu background - desktop + mobile */
.theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu,
.theme--dark .wsmenu > .wsmenu-list > li > .wsmegamenu,
.theme--dark .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu {
  /* [UPDATE] 2026-05-11 — pure black to align site-wide --tt-bg-0. */
  background-color: #000000 !important;
}

/* [UPDATE] 2026-05-11 — desktop light-theme sub-menu / megamenu now
 * use #e0e0e0 (slightly darker than the parent #ededed nav) so the
 * dropdown sits visibly above the parent menu. This pairs with the
 * mobile rule further below. */
.theme--light .wsmenu > .wsmenu-list > li > ul.sub-menu,
.theme--light .wsmenu > .wsmenu-list > li > .wsmegamenu,
.theme--light .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu {
  background-color: #000000 !important;
}

/* Sub-menu container - remove side padding so item hover reaches full width */
.theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu,
.theme--light .wsmenu > .wsmenu-list > li > ul.sub-menu {
  padding-left: 0 !important;
  padding-right: 0 !important;
}

/* [FIX] 2026-05-14 (v8) — Hamburger drawer must not occlude the page's
   own scrollbar. Two-part root cause:
   1) menu.css L1316 puts `overflow-y: scroll` on `.wsactive .wsmenu` (the
      fixed 100%-wide overlay). On Windows/Chromium that paints a 17px
      scrollbar at viewport `right: 0`, exactly where the 350px-wide
      `.wsmenu-list` sits — the drawer's own scrollbar gets visually
      eaten by the white sidebar's right edge.
   2) menu.css does NOT lock body scroll when the drawer is open. With
      `.wsactive .wsmenucontainer { margin-right: 300px }` the body shifts
      left and its own scrollbar (still at viewport right) ends up hidden
      under the 350px drawer. User sees "the menu invades the scrollbar
      area" — exactly this.
   Fix:
     • `.wsactive .wsmenu` → `overflow: hidden` (drop the overlay's
       outer scroll layer)
     • `.wsmenu-list` → `overflow-y: auto` + `max-height: 100svh` (paint
       the scrollbar INSIDE the 350px sidebar, not on the viewport edge)
     • `body.wsactive` → `overflow: hidden` (kill the page's own
       scrollbar so the drawer doesn't have to cover it)
     • `scrollbar-gutter: stable` keeps the sidebar width identical
       whether the thumb is visible or not (avoids a 17px content shift
       when the menu list is short). */
@media (max-width: 1279px) {
  /* [FIX] 2026-05-14 (v12) — three-bar button must NOT occlude the
     page scrollbar.
     Root cause chain (verified in menu.css):
       L770 `html { overflow: hidden }` — html cannot scroll
       L776 `body { overflow-y: auto }` — page scrollbar lives on BODY
       L1130 `.wsmobileheader { position: fixed; width: 100%; right: 0 }`
       L1198 `.wsanimated-arrow { position: absolute; right: 0 }`
     Because the page scrollbar is on body (not html), it paints at
     body's right edge = viewport's right edge (body width = 100vw).
     The fixed wsmobileheader at `width: 100%; right: 0` is sized
     against the viewport (ICB) = also 100vw. So the hamburger button
     anchored at right:0 sits ON TOP of the body scrollbar's right 17px
     — user clicking the rightmost 17px of the button hits scrollbar
     instead of the button, AND visually the scrollbar is masked by the
     header bg.
     Fix: move the scrollbar from BODY to HTML.
       html { overflow-y: auto; overflow-x: hidden }
       body { overflow: visible }
     Now html owns the viewport scrollbar — by CSS spec a fixed
     element's `width: 100%` against the ICB excludes the html
     scrollbar gutter, so `.wsmobileheader { width: 100% }` automatically
     resolves to `viewport - scrollbar` and stops at the gutter's left
     edge. Scrollbar is fully visible to the right of the header.
     Side effects to mind:
       • `position: fixed` elements that previously stretched to 100vw
         (e.g. the drawer overlay `.wsmenu`) now also stop at the
         scrollbar gutter — that is the DESIRED behaviour (drawer
         doesn't have to cover the scrollbar either).
       • `body { height: 100% }` from menu.css L777 still works because
         html now defines the scrollable height. */
  html {
    overflow: hidden !important;
    overflow-y: auto !important;
    overflow-x: hidden !important;
  }
  body {
    overflow: visible !important;
    height: auto !important;
  }
  body.wsactive {
    overflow: hidden !important;
  }
  /* Also lock html scroll while drawer is open so the drawer is the
     only scrollable surface on screen. */
  html.wsactive,
  html:has(body.wsactive) {
    overflow: hidden !important;
  }
  .wsactive .wsmenu {
    overflow: hidden !important;
  }
  .wsmenu > .wsmenu-list {
    overflow-y: auto !important;
    overflow-x: hidden !important;
    max-height: 100vh;
    max-height: 100svh;
    scrollbar-gutter: stable;
  }
  /* [FIX] 2026-05-14 (v10) — drawer row vertical rhythm. Root cause:
     crocus-theme.css L2525 `.wsmenu > .wsmenu-list > li > a { line-height:
     50px; margin: 0 7px; padding: 10px 15px }` has NO media-query gate,
     so the desktop 70px-tall row height leaks into the hamburger drawer.
     User: "上下间距过大". Restore menu.css L841 drawer-only values
     (`padding: 12px 32px 12px 17px`, `line-height: 25px`) by overriding
     under the drawer breakpoint. Margin 0 wins the row off the 7px-
     centred desktop look (the drawer's full-width row should NOT have
     side margin — that creates a column of "no hover" gutter on both
     sides). */
  .wsmenu > .wsmenu-list > li > a,
  .wsmenu > .wsmenu-list > li > a.h-link {
    line-height: 25px !important;
    padding: 12px 32px 12px 17px !important;
    margin: 0 !important;
    /* [FIX] 2026-05-14 (v11) — kill the inter-item separator line.
       menu.css L848 puts `border-bottom: 1px solid rgba(0,0,0,0.13)` on
       every drawer <a>, and responsive.css L1502 / L2900 swaps the
       color to `rgba(255,255,255,.13)` under `.black-scroll`. Against
       the locked-black drawer bg this paints a faint white hairline
       between every row, which the user sees as "弹出区域的边框有颜色"
       (the separator line bleeds into the sub-menu seam between DEX
       and its first child). Removing the border-bottom from every
       drawer <a> gives a clean continuous black surface. */
    border-bottom: none !important;
  }
  /* [REVERT] 2026-05-20 (v12) — Remove the v10 wsarrow:after force-show.
     Root cause re-investigation:
       • Mobile drawer ALREADY has a chevron painted by menu.css
         L1350-1369 `.wsmenu > .wsmenu-list > li > .wsmenu-click > i`
         + `:before` (an 8×8 right-angle border rotated -225°,
         turning -45° when the parent gets `.ws-activearrow` from
         menu.js click handler).
       • That chevron lives on `<span class="wsmenu-click">` which
         menu.js PREPENDs at runtime to every <li> that has a
         sub-menu — Derivatives / Sentiment / DEX / Platform all
         qualify.
       • menu.css L869 hides `.wsarrow:after` on mobile because the
         filled triangle from L192 is the desktop affordance only;
         the drawer uses the proper chevron above.
       • v10 (2026-05-14) saw "no arrow" and force-painted the
         desktop triangle on mobile — that was a symptom fix that
         ALSO created the two-arrow overlap (filled triangle visually
         dominating the chevron underneath). User now reports
         "实心三角不对,要折叠箭头" → restore the original chevron-only
         design by REMOVING the v10 force-show. menu.css L869 then
         hides the triangle, only the chevron from wsmenu-click
         remains, and it already has open/closed animation built in.
     If the chevron is invisible after this revert, the real fix is
     elsewhere (z-index / color / wsmenu-click rendering) — not
     re-introducing v10's two-arrow overlay. */
}

/* [FIX] 2026-05-14 (v11) — sub-menu / wsmegamenu visual chrome must be
   completely flat (NO border of any color, NO outline, NO box-shadow,
   NO border-radius) in every theme and every breakpoint. User
   (dark theme): "弹出的区域的边框不能有颜色".
   Sources of any visible rim around the dropdown card:
   A) menu.css L341/L467/L523 — `border: solid 1px #eee` (desktop only).
   B) crocus-theme.css L2698-2700 / L2735-2737 / L2777-2779 — `box-shadow:
      0 2px 3px rgba(96,96,96,.1)` on sub-menu / wsmegamenu / halfmenu /
      megamenu containers, NO media-query gate, so it leaks into the
      hamburger drawer at ~1279px viewport AND into the dark navbar.
      Faint but visible against #000000.
   C) crocus-theme.css L2695/L2710/L2733 — `border-radius: 6px`.
   D) Default browser focus ring `outline: auto -webkit-focus-ring-color`
      on the open dropdown card when user reaches it via keyboard.
   Fix (no media-query gate; applies in BOTH desktop dropdown and mobile
   drawer; applies in BOTH dark and light themes):
     • border / outline / box-shadow → none
     • border-radius → 0 */
.wsmenu > .wsmenu-list > li > ul.sub-menu,
.wsmenu > .wsmenu-list > li > .wsmegamenu,
.wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu {
  border: none !important;
  outline: none !important;
  box-shadow: none !important;
  -webkit-box-shadow: none !important;
  -moz-box-shadow: none !important;
  border-radius: 0 !important;
  -webkit-border-radius: 0 !important;
  -moz-border-radius: 0 !important;
}

/* [FIX] 2026-05-14 (v11) — desktop dropdown flush-with-navbar geometry. */
@media (min-width: 1280px) {
  .wsmenu > .wsmenu-list > li > ul.sub-menu,
  .wsmenu > .wsmenu-list > li > .wsmegamenu,
  .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu {
    top: 100% !important;
    margin-top: 0 !important;
    padding-top: 0 !important;
    padding-bottom: 8px !important;
  }
  /* [UPDATE] 2026-05-28 — Desktop top-menu border matches chart user
     dropdown border color (#2b2b2b). Mobile remains borderless.
     [FIX] 2026-07-22 — Light theme must share the same border: the
     header/dropdown surface stays #000 in both themes, but the border
     was scoped to .theme--dark only so white theme lost the outline. */
  .theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu,
  .theme--dark .wsmenu > .wsmenu-list > li > .wsmegamenu,
  .theme--dark .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu,
  .theme--light .wsmenu > .wsmenu-list > li > ul.sub-menu,
  .theme--light .wsmenu > .wsmenu-list > li > .wsmegamenu,
  .theme--light .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu {
    border: 1px solid #2b2b2b !important;
  }
}

/* [FIX] 2026-05-14 (v11) — Hamburger drawer (≤1279px): the giant gap
   between DEX and its dropdown is caused by crocus-theme.css L2690
   `.wsmenu > .wsmenu-list > li > ul.sub-menu { top: 62px; padding:
   12px 10px; ... }` which has NO media-query gate. menu.css L884
   already puts the drawer sub-menu at `position: relative`, so the
   crocus `top: 62px` becomes a 62px vertical offset pushing the
   dropdown down 62px from its parent DEX row. Combined with the
   12px container padding-top, total visible gap was ~74px → user
   reported "DEX 和子菜单间距太大".
   Same root for crocus L2725 / L2729 wsmegamenu top: 62px — push
   them flush too.
   Fix at drawer breakpoint:
     • top: 0 (no offset — sub-menu sits immediately under DEX <a>)
     • padding: 0 (drop the crocus 12px outer pad; individual <li>
       links keep their own 12px padding from menu.css L841)
     • margin: 0 (defensive against any template transient offset) */
@media (max-width: 1279px) {
  .wsmenu > .wsmenu-list > li > ul.sub-menu,
  .wsmenu > .wsmenu-list > li > .wsmegamenu,
  .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu {
    top: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
  }
}
/* Sub-menu item - restore text padding, remove radius and margin */
.theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu > li > a,
.theme--light .wsmenu > .wsmenu-list > li > ul.sub-menu > li > a {
  padding-left: 14px !important;
  padding-right: 14px !important;
  border-radius: 0 !important;
  margin: 0 !important;
}
/* Dark theme hover */
.theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu > li > a:hover {
  background-color: rgba(255,255,255,0.08) !important;
  color: #ffffff !important;
}
/* Light theme hover */
.theme--light .wsmenu > .wsmenu-list > li > ul.sub-menu > li > a:hover {
  background-color: rgba(255,255,255,0.1) !important;
  color: #ffffff !important;
}

.theme--light .wsmenu > .wsmenu-list > li > ul.sub-menu > li > a {
  color: #ffffff !important;
}

/* [FIX] 2026-05-20 (v12) — Mobile drawer sub-menu visual unification.
   Four user-reported defects fixed in one cohesive block (everything
   is gated by @media (max-width: 1279px) so desktop dropdown chrome
   is untouched):

   1) Sub-menu items must be indented further right than the parent
      `.h-link` row (Derivatives / Sentiment / DEX / Platform) so the
      visual hierarchy reads as "parent ─ child ─ grandchild". The
      previous L730-731 override left padding-left at 14px, which is
      LESS than the 17px parent-row padding, so child rows ended up
      visually OUTDENT-ed from their parent — exactly the opposite of
      hierarchy. iOS Settings / GitHub mobile / Linear: child rows
      are inset 16-32px more than the parent. Pick 32px (parent
      icon width + parent gap) so children align under the parent
      LABEL, not under the parent icon.

   2) Black-theme sub-menu must have NO border-bottom. Root cause:
      responsive.css L1546 `.black-scroll … sub-menu { border-bottom:
      1px solid rgba(255,255,255,.13) !important }` (specificity
      (0,0,4,2) + !important). v11's `border: none !important` at
      `.wsmenu > .wsmenu-list > li > ul.sub-menu` is (0,0,3,2) +
      !important — it LOSES on specificity, so the dark hairline is
      still painted between the sub-menu and the next drawer item.
      Fix: a (0,0,4,2) + !important rule scoped by `.theme--dark`
      explicitly nulls every border on the sub-menu container.

   3) Top-level menu right-side arrow must be a chevron (folding
      arrow) NOT a filled triangle. Root cause was a v10 (2026-05-14)
      symptom-fix that force-painted the desktop ▼ triangle inside
      the mobile drawer on top of the existing chevron (menu.css
      L1350-1369 .wsmenu-click > i :before). v12 reverts the v10
      override (see the `[REVERT] 2026-05-20 (v12)` block above
      around L654) so menu.css L869's default display:none on the
      triangle is reinstated and only the proper chevron remains.
      No additional rule needed in this @media block for the arrow.

   4) Theme-toggle / lang-switcher icons must be 32×32 just like
      the `.h-link-icon` icons on the rows above. Currently
      `.theme-toggle svg` (L1276) is 22×22 globally. Inside the
      drawer override the size to 32×32 so the icon column reads as
      a single uniform stack. */
@media (max-width: 1279px) {
  /* (1) Inset every sub-menu child row by 32px more than its parent
         row. Three-class selector (0,0,4,2) beats both the menu.css
         default (0,0,3,2) and any earlier custom override at the
         same level. */
  .wsmenu > .wsmenu-list > li > ul.sub-menu > li > a {
    padding-left: 32px !important;
  }
  .theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu > li > a,
  .theme--light .wsmenu > .wsmenu-list > li > ul.sub-menu > li > a {
    padding-left: 32px !important;
  }
  /* Grouped sub-menu (Derivatives) group labels follow the same
     32px indent so the label aligns with the icon column of the
     items beneath it. */
  .wsmenu > .wsmenu-list > li > ul.sub-menu--grouped > li.sub-menu-group-label {
    padding-left: 32px !important;
    padding-right: 32px !important;
  }

  /* (2) Kill EVERY border in the dark-theme drawer sub-menu.
         (a) container border (responsive.css L1546 black-scroll
             scope and any future theme css that adds border-bottom);
         (b) per-child border (defensive — no current rule paints it
             but several theme files have history of doing so, e.g.
             menu.css L848 for the parent row had this exact issue).
         Both selectors carry .theme--dark to take precedence over
         .black-scroll and over un-scoped responsive rules. */
  .theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu,
  .theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu--icons,
  .theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu--grouped,
  .theme--dark .wsmenu > .wsmenu-list > li > .wsmegamenu,
  .theme--dark .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu {
    border-top: none !important;
    border-bottom: none !important;
    border-left: none !important;
    border-right: none !important;
    box-shadow: none !important;
  }
  .theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu > li,
  .theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu > li > a,
  .theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu--grouped > li.sub-menu-group-label {
    border-top: none !important;
    border-bottom: none !important;
    border-left: none !important;
    border-right: none !important;
  }

  /* (3) wsarrow:after triangle removal handled by v12 REVERT
         above (around L654) — no rule needed here. The proper
         chevron from `.wsmenu-click > i :before` (menu.css L1350)
         remains as the sole open/closed indicator with its own
         -45°/-225° animation.

         (3b) [FIX 2026-05-20 v12.1] Light-theme chevron color.
              menu.css L1365 paints the chevron border with
              rgba(0,0,0,0.40) by default. responsive.css L1648
              overrides to white under .theme--dark, but NEVER
              added a .theme--light counterpart. Because the
              entire mobile drawer / navbar background is locked
              to #000000 in BOTH themes (tradeiz-custom L1226
              .theme--light .tra-menu.white-scroll .wsmainfull),
              the default black chevron is invisible against a
              black background in light theme — user reported
              "白色主题下折叠箭头不显示".
              Fix: paint the chevron white (matching the dark-
              theme rule) under .theme--light too. Same
              specificity (0,0,4,3) as L1648, runs AFTER
              responsive.css → wins the cascade. */
  .theme--light .wsmenu > .wsmenu-list > li > .wsmenu-click > i:before {
    border-color: rgba(255, 255, 255, 1) !important;
  }

  /* (4) Theme-toggle / lang-switcher icons → 24×24 to match
         the .h-link-icon column above. Higher specificity than
         L1276 .theme-toggle svg (0,0,2,1) — we use
         .wsmenu-list .theme-toggle-li .theme-toggle svg (0,0,4,1)
         and likewise for lang-switcher.
         [UPDATE] 2026-05-21 — drawer icon stack shrunk 32 → 24 per user
         request: "弹出的菜单的图标太大了". Aligned with the matching
         shrink on .h-link-icon (L931) and .nav-sub-icon drawer override
         (added below). 24px keeps icons clearly tappable while reducing
         the visual weight closer to Coinglass / Binance drawer style. */
  .wsmenu-list .theme-toggle-li .theme-toggle svg,
  .wsmenu-list .lang-switcher-li .lang-switcher svg {
    width: var(--web-icon-size) !important;
    height: var(--web-icon-size) !important;
  }

  /* (5) Sub-menu icons handled by a separate rule placed AFTER the
         global 32px definition (see ~L935 below) — CSS source order
         requires our drawer override to come later than the global
         to win, and `@media` queries do NOT add specificity. */
}

/* [ADD] 2026-05-01 — icon-style sub-menu (Markets dropdown)
 * Inline 32px lucide-style SVG before each item label. Uses flex row so the
 * icon stays vertically centred regardless of label wrapping; stroke colour
 * inherits from currentColor to follow theme + hover states. */
.wsmenu > .wsmenu-list > li > ul.sub-menu--icons { min-width: 220px; }
.wsmenu > .wsmenu-list > li > ul.sub-menu--icons > li > a {
  display: flex !important;
  align-items: center;
  gap: 12px;
  padding-top: 8px !important;
  padding-bottom: 8px !important;
}
.wsmenu > .wsmenu-list > li > ul.sub-menu--icons .nav-sub-icon {
  width: var(--web-icon-size);
  height: var(--web-icon-size);
  flex-shrink: 0;
  color: currentColor;
  stroke: var(--text-primary);
  stroke-width: var(--web-icon-stroke);
  display: block;
}

/* [ADD] 2026-05-21 — drawer-only sub-menu icon shrink to 24×24.
 * MUST be placed AFTER the global 32px rule above (L912) because both
 * selectors carry identical specificity (0,0,4,2) and `@media` queries
 * do NOT contribute to specificity — only source order breaks the tie.
 * Originally tried putting this inside the @media block at L805 but the
 * cascade made the global 32px win, leaving icons unchanged. */
@media (max-width: 1279px) {
  .wsmenu > .wsmenu-list > li > ul.sub-menu--icons .nav-sub-icon {
    width: var(--web-icon-size);
    height: var(--web-icon-size);
  }
}

/* [ADD] 2026-05-19 — top-level menu leading icons (.h-link-icon)
 * Hidden by default; only shown inside the mobile hamburger drawer
 * (≤1279). Inside the drawer every top-level entry (Hyper Charts /
 * Derivatives / Sentiment / DEX / Platform / Pricing) gets a 24px
 * leading SVG matching the sub-menu icon size for a unified visual
 * scale. Reason: per user request — every drawer row should read as
 * "[icon] [label]", not a mix of plain-text top-level and icon-prefixed
 * sub-menu rows.
 *
 * [UPDATE] 2026-05-21 — leading icon shrunk 32 → 24 per user request:
 * "弹出的菜单的图标太大了". Coordinated with the matching shrink on
 * .nav-sub-icon (L883 block above) and theme-toggle / lang-switcher
 * SVGs so every column of icons in the drawer reads at the same 24px
 * weight, similar to the Coinglass / Binance mobile drawers.
 *
 * Desktop nav (≥1280) intentionally keeps top-level entries text-only
 * to preserve the tight 1280px row capacity (see L1429-1462). Only
 * Hyper Charts shows its gradient icon on desktop via the dedicated
 * `.nav-charts-link svg` rule below. */
.h-link-icon { display: none; }
@media (max-width: 1279px) {
  .wsmenu > .wsmenu-list > li > a.h-link {
    display: flex !important;
    align-items: center;
    gap: 12px;
  }
  .wsmenu > .wsmenu-list > li > a.h-link .h-link-icon {
    display: block;
    width: var(--web-icon-size);
    height: var(--web-icon-size);
    flex-shrink: 0;
    stroke: var(--text-primary);
    stroke-width: var(--web-icon-stroke);
  }
  /* icon-nav-hyper-charts: canonical OHLC bar (chart.ejs toolbar.bar).
     WEB §3.1 outline · §3.9.4 ≤6 segments · no circle/rect · 28px render. */
  .wsmenu > .wsmenu-list > li > a.nav-charts-link .h-link-icon--charts {
    width: var(--web-hypercharts-icon-size);
    height: var(--web-hypercharts-icon-size);
    stroke: currentColor;
    stroke-width: var(--web-icon-stroke);
    fill: none;
  }
}

/* [ADD] 2026-05-11 — grouped sub-menu (Derivatives: Scan / Activity / Asset / Discovery)
 * The group label is a non-interactive heading that visually separates clusters
 * of links inside a single dropdown. Uses the existing menu typography so it
 * auto-adapts to dark/light themes (header is excluded from the home/agg
 * font-color whitelist; header.ejs/footer.ejs are explicitly out of scope per
 * web_app_styling rules).
 *
 * Alignment:
 *   - Sub-menu link <a> uses padding 9px (from menu.css base rule).
 *   - Group label uses padding-left 12px so it visually aligns with the icon's
 *     left edge of the link row underneath, matching Coinglass/Binance pattern.
 *   - text-align: left is forced to override any inherited centered alignment
 *     from the wsmenu reset cascade. */
.wsmenu > .wsmenu-list > li > ul.sub-menu--grouped { min-width: 240px; padding-bottom: 6px; }
.wsmenu > .wsmenu-list > li > ul.sub-menu--grouped > li.sub-menu-group-label {
  display: block;
  padding: 10px 12px 4px 12px;
  margin: 10px 0 0 0;
  text-align: left !important;
  font-size: 12px;
  line-height: 1.4;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  opacity: 0.55;
  pointer-events: none;
  cursor: default;
  white-space: nowrap;
}
.wsmenu > .wsmenu-list > li > ul.sub-menu--grouped > li.sub-menu-group-label:first-child {
  margin-top: 0;
  padding-top: 4px;
}
.wsmenu > .wsmenu-list > li > ul.sub-menu--grouped > li.sub-menu-group-label + li > a {
  padding-top: 6px !important;
}
/* Mobile: keep group label left-aligned and visible inside the slide-down panel.
 * [UPDATE] 2026-05-20 (v12) — padding-left raised from 22px to 32px so
 *   the Scan / Activity / Asset / Discovery group labels align with the
 *   child rows under them (which are now indented 32px per v12 BUG #1
 *   fix). 22px would leave the labels visually OUTDENT-ed from the
 *   children — confusing hierarchy. */
@media (max-width: 1279px) {
  .wsmenu > .wsmenu-list > li > ul.sub-menu--grouped > li.sub-menu-group-label {
    padding: 12px 32px 4px 32px;
    text-align: left !important;
  }
}

/* Mobile: top bar and slide menu - dark black theme
   [UPDATE] 2026-05-13 — Was `(max-width: 991px)` → `1199px` → `1279px`.
   Aligned with hamburger breakpoint shift to ≤1279 so the mobile dark
   theme palette applies across the whole mobile menu range. */
@media (max-width: 1279px) {
  /* [UPDATE] 2026-05-11 — dark-theme mobile header + menu list now
   * use pure black, matching --tt-bg-0 site-wide. */
  .theme--dark .wsmobileheader,
  .theme--dark .tra-menu .wsmobileheader,
  .theme--dark .white-menu .wsmobileheader {
    background-color: #000000 !important;
  }
  .theme--dark .wsmenu > .wsmenu-list,
  .theme--dark .dark-menu .wsmenu > .wsmenu-list,
  .theme--dark .black-scroll .wsmenu > .wsmenu-list {
    background-color: #000000 !important;
  }
  .theme--dark .wsmenu > .wsmenu-list > li > ul.sub-menu,
  .theme--dark .wsmenu > .wsmenu-list > li > .wsmegamenu,
  .theme--dark .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu {
    background-color: #000000 !important;
  }
}

/* Mobile: footer-3 — brand full width; Product | Resources | Legal in one flex row, wrap when narrow.
 *
 * [FIX] 2026-05-20 — Selectors restricted to the OUTER `.footer-main-row`
 *   children only. Previously the `:first-child` / `:not(:first-child)`
 *   rules used the generic `#footer-3 .row > [class*="col-"]` descendant
 *   selector, which also matched the NESTED row `.footer-sitemap-grid`
 *   (which now hosts 9 sitemap link columns since the v5 redesign).
 *   The consequence was that the FIRST sitemap column (Markets) was
 *   forced to `width: 100%` and the other 8 cells fell back to the
 *   flex auto-fit path — producing the observed "row1: Markets alone,
 *   row2..4: 2-up" mobile footer layout that the user reported.
 * Reason: the rules were authored for v2/v3/v4 footer (1 Brand col +
 *   3 link cols, flat single row). v5 introduced a nested row for the
 *   sitemap grid (1 Brand col + 1 sitemap col with 9 nested cells).
 *   The unqualified descendant selector unintentionally cascaded.
 * Change: replace `#footer-3 .row > [class*="col-"]` with
 *   `#footer-3 .footer-main-row > [class*="col-"]`. The nested
 *   `.footer-sitemap-grid > .col-6` cells now keep Bootstrap's native
 *   50%/50% behaviour (2-up on mobile), giving the intended 2×5 grid
 *   for all 9 sitemap columns.
 * Warning: do NOT relax this selector back to `#footer-3 .row >`.
 *   The nested sitemap grid will regress to "Markets alone in row 1"
 *   and the bug will reappear silently. */
@media (max-width: 767px) {
  #footer-3 .container {
    padding-left: max(20px, env(safe-area-inset-left)) !important;
    padding-right: max(20px, env(safe-area-inset-right)) !important;
  }
  #footer-3 .row {
    display: flex !important;
    flex-direction: row !important;
    flex-wrap: wrap !important;
    align-items: flex-start !important;
    column-gap: 20px !important;
    row-gap: 28px !important;
    padding-left: 0 !important;
    padding-right: 0 !important;
    margin-left: 0 !important;
    margin-right: 0 !important;
  }
  #footer-3 .footer-main-row > [class*="col-"]:first-child {
    flex: 1 1 100% !important;
    width: 100% !important;
    max-width: 100% !important;
    margin: 0 !important;
    padding: 0 !important;
  }
  #footer-3 .footer-main-row > [class*="col-"]:not(:first-child) {
    flex: 1 1 100% !important;
    width: 100% !important;
    max-width: 100% !important;
    margin: 0 !important;
    padding: 0 !important;
  }
  /* Nested sitemap grid: keep Bootstrap col-6 → 50%/50% (2-up).
   * column-gap/row-gap inherited from `#footer-3 .row` above provide
   * the visual rhythm; flex-basis 50% minus half the column-gap keeps
   * exactly two cells per row regardless of label length. */
  #footer-3 .footer-sitemap-grid > [class*="col-"] {
    flex: 0 0 calc(50% - 10px) !important;
    max-width: calc(50% - 10px) !important;
    width: calc(50% - 10px) !important;
    min-width: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
  }
  #footer-3 .footer-info,
  #footer-3 .footer-links {
    margin-bottom: 0 !important;
    text-align: left !important;
  }
  #footer-3 .footer-info .logo-inline {
    display: inline-flex;
  }
  #footer-3 .footer-links h6,
  #footer-3 .footer-links .foo-links,
  #footer-3 .footer-links .foo-links li,
  #footer-3 .footer-links .foo-links li p,
  #footer-3 .footer-links .foo-links li a {
    text-align: left !important;
  }
  #footer-3 .footer-mail-link {
    text-align: left !important;
  }
  #footer-3 .tz-social-icons {
    justify-content: flex-start !important;
    flex-wrap: wrap !important;
  }
  #footer-3 .footer-copyright-text {
    text-align: left !important;
    margin-top: 8px !important;
  }
  #footer-3 > .footer-divider {
    margin-bottom: 32px !important;
  }
}

@media (max-width: 480px) {
  #footer-3 .container {
    padding-left: max(16px, env(safe-area-inset-left)) !important;
    padding-right: max(16px, env(safe-area-inset-right)) !important;
  }
}

/* ========================================
   LIGHT THEME (theme--light)
   ======================================== */

/* Light theme backgrounds */
body.theme--light,
.theme--light .bg--white-100,
.theme--light #page {
  background-color: #ffffff !important;
  --text-primary: #181818;
}
.theme--light .bg--white-300,
.theme--light .bg--white-400,
.theme--light .bg--purple-100,
.theme--light .shape--purple-100:after,
.theme--light .shape--white-500:after,
.theme--light .shape--white-400:after,
.theme--light .shape--white-300:after,
.theme--light .shape--white-200:after {
  background-color: #f8f9fa !important;
}
.theme--light .gr--smoke,
.theme--light .gr--ghost,
.theme--light .gr--whitesmoke,
.theme--light .bg--02,
.theme--light .bg--04,
.theme--light .shape--whitesmoke:after,
.theme--light .shape--gr-whitesmoke:after {
  background-color: #f5f5f7 !important;
  background-image: none !important;
}
.theme--light #login,
.theme--light #signup {
  background: #ffffff !important;
  background-image: none !important;
}
.theme--light #login .register-page-wrapper:after,
.theme--light #signup .register-page-wrapper:after {
  background-color: #f8f9fa !important;
}
/* [UPDATE 2026-05-11] Footer is theme-agnostic: same dark surface and
 * same text colors in both light and dark mode. The user's UA tested
 * that switching theme on a chart-bearing page should not also flip the
 * footer's color, since the footer carries brand/legal links that need
 * stable contrast and consistent recognition.
 *
 * [HISTORY] Previously the footer used #141414 (a near-black). Pure #000
 * was rejected in 2026-04-24 because it created a hard contrast cliff
 * against light-mode body. With the 2026-05-11 site-wide move to pure
 * black backgrounds (--tt-bg-0 in tradeiz-home.css), the footer can now
 * also be #000 since it merges seamlessly with the dark page; in light
 * mode the contrast cliff is now an intentional visual divider. */
#footer-3,
.footer {
  background-color: #000000 !important;
}

/* [UPDATE 2026-05-11] Footer column titles use grey #888 to demote
 * them from the link list visually. Previously they were #ffffff at
 * 100% white, which made them indistinguishable from the 75%-white
 * link list — the user's eye saw "two columns of white text" instead
 * of "title + items". Grey title (53% luminance) + white links (75%)
 * follow TradingView / Coinglass footer conventions where titles act
 * as low-emphasis section labels, not the same weight as links.
 * Reason this rule even exists: the earlier #888 set on line ~436
 * was previously overridden by a theme-agnostic `color: #ffffff` block
 * during the 2026-05-11 footer-theme-agnostic refactor. We now drop
 * `.footer-links h6` from this override so the #888 above wins, and
 * keep the override only for non-link h6 (e.g. brand banner area) by
 * making it grey too — there is no place in the new footer where a
 * pure-white h6 makes sense on the #000 surface. */
#footer-3 h6,
.footer h6 {
  color: #888888 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.08em !important;
}
#footer-3 .foo-links a,
.footer .foo-links a,
#footer-3 .footer-links p,
.footer .footer-links p {
  color: rgba(255, 255, 255, 0.75) !important;
}
#footer-3 .foo-links a:hover,
.footer .foo-links a:hover {
  color: #ffffff !important;
}
#footer-3 .footer-info p,
.footer .footer-info p,
#footer-3 .footer-socials-links a,
.footer .footer-socials-links a {
  color: rgba(255, 255, 255, 0.75) !important;
}
#footer-3 .footer-copyright-text {
  color: rgba(255, 255, 255, 0.6) !important;
}
/* Legal block (copyright + privacy + tos + disclaimer) inside the brand
 * column — keep the same fixed contrast regardless of body theme. */
#footer-3 .footer-legal p {
  color: rgba(255, 255, 255, 0.6) !important;
}
#footer-3 .footer-legal a {
  color: rgba(255, 255, 255, 0.75) !important;
}
#footer-3 .footer-legal a:hover {
  color: #ffffff !important;
}
/* Mailto link in brand column — keep the same fixed contrast too. */
#footer-3 .footer-mail-link a,
.footer .footer-mail-link a {
  color: rgba(255, 255, 255, 0.85) !important;
}
#footer-3 .footer-mail-link a:hover,
.footer .footer-mail-link a:hover {
  color: #ffffff !important;
}
/* Social icons — fixed white-ish regardless of theme. */
#footer-3 .footer-socials > li > a,
#footer-3 .tz-social-icons > li > a,
#footer-3 .tz-social-icons > li.tt-footer-tg > .tt-footer-tg__trigger,
.footer .footer-socials > li > a,
.footer .tz-social-icons > li > a {
  color: var(--text-primary) !important;
  opacity: 0.7;
}
#footer-3 .footer-socials > li > a:hover,
#footer-3 .tz-social-icons > li > a:hover,
#footer-3 .tz-social-icons > li.tt-footer-tg > .tt-footer-tg__trigger:hover,
.footer .footer-socials > li > a:hover,
.footer .tz-social-icons > li > a:hover {
  color: var(--text-primary) !important;
  opacity: 1;
}
/* Footer tagline — fixed contrast. */
#footer-3 .footer-tagline,
.footer .footer-tagline {
  color: rgba(255, 255, 255, 0.6) !important;
}

/* Light theme nav scroll state.
 * [FIX] 2026-05-14 (v3) — user requirement: top menu stays black in all themes.
 * Keep light-theme navbar black for both scrolled and non-scrolled states. */
.theme--light .tra-menu .wsmainfull.scroll,
.theme--light .white-menu .wsmainfull.scroll,
.theme--light .dark-menu .wsmainfull.scroll,
.theme--light .tra-menu.white-scroll .wsmainfull.scroll {
  background-color: #000000 !important;
  border-bottom: 1px solid #0a0a0a !important;
  box-shadow: none !important;
}

/* [FIX] 2026-05-14 (v2) — light theme also needs the NON-scrolled state
 * locked to white. crocus L2483 sets `.tra-menu .wsmainfull { background:
 * transparent !important }`, which lets the hero's #000 (LOCK from 2026-
 * 05-11, now unlocked per-theme below) bleed through the navbar at the
 * very top of the page — users saw "the top stays black even in light
 * theme". Painting the navbar #fff in light theme makes the top of the
 * page actually track body.theme--light. */
.theme--light .tra-menu .wsmainfull,
.theme--light .white-menu .wsmainfull,
.theme--light .dark-menu .wsmainfull,
.theme--light .tra-menu.white-scroll .wsmainfull {
  background-color: #000000 !important;
}

/* Light theme text colors */
.theme--light h1, .theme--light h2, .theme--light h3,
.theme--light h4, .theme--light h5, .theme--light h6 {
  color: #000000 !important;
}
.theme--light p,
.theme--light .p-lg,
.theme--light .p-md,
.theme--light .p-sm,
.theme--light .p-xl,
.theme--light .s-18,
.theme--light .s-17,
.theme--light .s-16,
.theme--light .s-15,
.theme--light .s-14 {
  color: #666666 !important;
}
.theme--light .color--white,
.theme--light .white--color {
  color: #000000 !important;
}
.theme--light .color--grey,
.theme--light .grey--color {
  color: #666666 !important;
}
/* Light theme icon colors */
.theme--light .flaticon-check,
.theme--light .flaticon-check::before,
.theme--light .ico-50 [class^="flaticon-"]::before,
.theme--light .ico-55 [class^="flaticon-"]::before,
.theme--light .ico-60 [class^="flaticon-"]::before {
  color: #000000 !important;
}
.theme--light .shape-ico.color--theme path {
  fill: var(--text-primary) !important;
}

/* Light theme hero section */
.theme--light .hero-section {
  background-color: #000000 !important;
}
.theme--light .hero-section.blur--purple:after {
  background-image: none !important;
  background: radial-gradient(ellipse at center, transparent 0%, rgba(0, 0, 0, 0.5) 72%) !important;
}

/* Light theme header - initially dark text for light bg hero */
.theme--light .navbar-dark .tz-logo-adaptive,
.theme--light .navbar-dark .tz-logo-adaptive .logo-wordmark {
  color: #ffffff;
}
.theme--light .navbar-dark .h-link {
  color: #ffffff !important;
}
.theme--light .navbar-dark .h-link:hover {
  color: #ffffff !important;
}

/* [FIX] 2026-06-27 — dark-theme header nav hover must stay readable on #000 bar.
 * Root cause: crocus-theme `.navbar-dark .wsmenu-list > li > a.h-link:hover`
 * forces #1d222f; on our pure-black header that reads as invisible black-on-black.
 * Match light-theme behaviour above: hover colour = resting colour (no flip). */
body.theme--dark #header .wsmenu > .wsmenu-list > li > a.h-link:hover {
  color: #ffffff !important;
}
body.theme--dark #header .wsmainfull.scroll .wsmenu > .wsmenu-list > li > a.h-link:hover {
  color: #aaaaaa !important;
}

/* [FIX] 2026-07-05 — light-theme header nav + logo hover on locked #000 bar.
 * Root cause: crocus white-scroll.scroll paints h-link #000 and h-link:hover
 * #1d222f; `.theme--light .navbar-dark .h-link:hover` loses on specificity.
 * Mirror the body.theme--dark #header overrides above so both themes behave
 * identically on the always-black top bar. */
body.theme--light #header .wsmenu > .wsmenu-list > li > a.h-link,
body.theme--light #header .wsmainfull.scroll .wsmenu > .wsmenu-list > li > a.h-link {
  color: #ffffff !important;
}
body.theme--light #header .wsmenu > .wsmenu-list > li > a.h-link:hover {
  color: #ffffff !important;
}
body.theme--light #header .wsmainfull.scroll .wsmenu > .wsmenu-list > li > a.h-link:hover {
  color: #aaaaaa !important;
}
body.theme--light #header a.tz-logo-adaptive,
body.theme--light #header .wsmainfull.scroll a.tz-logo-adaptive {
  color: #ffffff !important;
}
body.theme--light #header a.tz-logo-adaptive:hover {
  color: #ffffff !important;
}
body.theme--light #header .wsmainfull.scroll a.tz-logo-adaptive:hover {
  color: #aaaaaa !important;
}

.theme--light .tra-menu.white-scroll.scroll .tz-logo-adaptive,
.theme--light .tra-menu.white-scroll.scroll .tz-logo-adaptive .logo-wordmark {
  color: #ffffff !important;
}

/* Light theme mobile header.
 * [UPDATE] 2026-05-11 — softened mobile header + slide-out menu from
 * pure white #ffffff to #ededed for the same anti-glare reason as the
 * desktop nav scroll state.
 * [UPDATE] 2026-05-13 — Was `(max-width: 991px)` → `1199px` → `1279px`.
 * Aligned with hamburger breakpoint shift to ≤1279 so the light-theme
 * mobile header palette applies across the whole mobile menu range. */
@media (max-width: 1279px) {
  .theme--light .wsmobileheader,
  .theme--light .tra-menu .wsmobileheader,
  .theme--light .white-menu .wsmobileheader {
    background-color: #000000 !important;
  }
  .theme--light .wsmobileheader .smllogo .logo-inline {
    color: #ffffff !important;
  }
  .theme--light .wsmobileheader .smllogo .logo-wordmark {
    color: #ffffff !important;
  }
  .theme--light .wsmobileheader .smllogo .logo-inline {
    color: #ffffff !important;
  }
  .theme--light .wsmobileheader .smllogo svg path {
    fill: currentColor !important;
  }
  /* [REMOVED 2026-05-19] Theme-specific hamburger color rules deleted.
   * Single source of truth now lives at L3617 (`body #header
   * .wsanimated-arrow span`) which forces white in ALL theme states. */
  .theme--light .wsmenu > .wsmenu-list,
  .theme--light .dark-menu .wsmenu > .wsmenu-list,
  .theme--light .black-scroll .wsmenu > .wsmenu-list {
    background-color: #000000 !important;
  }
  .theme--light .wsmenu > .wsmenu-list > li > a {
    color: #ffffff !important;
  }
  /* Sub-menu / megamenu: slightly darker than the parent #ededed
   * (#e0e0e0) to give a clear visual layer over the parent menu. */
  .theme--light .wsmenu > .wsmenu-list > li > ul.sub-menu,
  .theme--light .wsmenu > .wsmenu-list > li > .wsmegamenu,
  .theme--light .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu,
  .theme--light .black-scroll .wsmenu > .wsmenu-list > li > ul.sub-menu,
  .theme--light .black-scroll .wsmenu > .wsmenu-list > li > .wsmegamenu,
  .theme--light .black-scroll .wsmenu > .wsmenu-list > li > .wsmegamenu.halfmenu {
    background-color: #000000 !important;
  }
}

/* Light theme cards and boxes */
.theme--light .sbox-txt,
.theme--light .cbox,
.theme--light .tbox,
.theme--light .ibox {
  background-color: #ffffff;
  border: 1px solid #e8e8e8;
}
.theme--light .fbox-txt {
  background-color: transparent;
  border: none;
}
.theme--light .sbox-txt:hover,
.theme--light .cbox:hover {
  box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
}

/* Light theme form inputs */
.theme--light .form-control,
.theme--light .quick-form .form-control,
.theme--light input[type="text"],
.theme--light input[type="email"],
.theme--light textarea {
  background-color: #ffffff !important;
  border-color: #e0e0e0 !important;
  color: #000000 !important;
}
.theme--light .form-control:focus,
.theme--light .quick-form .form-control:focus {
  border-color: #000000 !important;
  box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.08) !important;
}
.theme--light .form-control::placeholder {
  color: #999999 !important;
}

/* ========================================
   THEME TOGGLE BUTTON
   ======================================== */
.theme-toggle {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border: none;
  background: transparent;
  cursor: pointer;
  border-radius: 8px;
  transition: background-color 0.2s ease;
  margin-left: 12px;
}
.theme-toggle:hover {
  background-color: rgba(255, 255, 255, 0.08);
}
.theme-toggle svg {
  width: var(--web-icon-size);
  height: var(--web-icon-size);
  color: var(--text-primary);
  stroke: var(--text-primary);
  stroke-width: var(--web-icon-stroke);
  fill: none;
  transition: transform 0.3s ease;
}
.theme-toggle:hover svg {
  transform: rotate(15deg);
}

/* Dark theme: show sun icon (for switching to light) */
.theme--dark .theme-toggle .icon-sun { display: block; }
.theme--dark .theme-toggle .icon-moon { display: none; }
.theme--dark .theme-toggle svg { color: var(--text-primary); }

/* Light theme: show moon icon (for switching to dark).
 * [FIX] 2026-05-14 (v4) — header is locked black in all themes; the toggle
 * icon must stay white so it remains visible. Do not paint it #000 in light
 * theme — it would become invisible on the locked black bar. */
.theme--light .theme-toggle .icon-sun { display: none; }
.theme--light .theme-toggle .icon-moon { display: block; }
.theme--light .theme-toggle svg { color: var(--text-primary) !important; }

/* Scrolled header adjustments — header stays black, icon stays white. */
.tra-menu.white-scroll.scroll .theme-toggle svg {
  color: var(--text-primary) !important;
}
.theme--dark .tra-menu.white-scroll.scroll .theme-toggle svg {
  color: var(--text-primary) !important;
}
.theme--light .tra-menu.white-scroll.scroll .theme-toggle svg {
  color: var(--text-primary) !important;
}

/* ===========================================================================
   Hyper Charts nav link — flagship entry, flat treatment (2026-05-13)
   ---------------------------------------------------------------------------
   The leftmost top-nav entry is the site's flagship CTA (opens /chart).
   Visual intent: pure flat. The decoration is applied only to the glyphs
   (icon stroke + text fill) via a cobalt → magenta linear gradient, matching
   the site's `tt-btn-skew--nebula` palette. No background fill, no border,
   no padding override, no blur, no glow, no shadow, no animation. Hover
   nudges opacity for a subtle response without motion.

   Text gradient is painted via `background-clip: text` + transparent fill;
   icon gradient is applied as an inline SVG `stroke` referencing a per-link
   `<linearGradient>` defined in the markup (see header-index.ejs). The CSS
   here only colours stroke="url(#tt-nav-charts-grad)" via the parent text
   colour cascade — see the SVG `stroke` attribute fallback. */
/* Universal styling for nav-charts-link (applies on both desktop nav
   and inside the mobile drawer): the gradient text fill must paint
   consistently in both layouts. Box-model properties (display,
   padding, border) are intentionally NOT set here so the link
   inherits the appropriate template behaviour in each context
   (inline-flex via the @media block below for desktop, plain
   `display: block` from menu.css L126-127 for the drawer). */
.nav-charts-link {
  font-size: 16px !important;
  /* [UPDATE] 2026-07-10 — plain white, matching the sibling nav links. */
  background-color: transparent !important;
  background-image: none !important;
  -webkit-text-fill-color: var(--text-primary) !important;
  color: var(--text-primary) !important;
  transition: opacity 0.15s ease;
}
/* Desktop-only box model — keeps the single-line layout, removes
   the row separator border (no border in the desktop nav), and
   tightens letter-spacing to match the rest of the .h-link entries.
   [UPDATE] 2026-05-13 — was previously unscoped, which broke the
   in-drawer rendering: `display: inline-flex` + `border: none` made
   Hyper Charts appear as a small inline pill without a separator
   between it and the next drawer row. Scoped here so the drawer
   falls back to the template default `display: block` + 1px
   border-bottom for visual parity with Derivatives / Sentiment /
   DEX / Platform / Pricing inside the hamburger panel. */
@media (min-width: 1280px) {
  .nav-charts-link {
    display: inline-flex !important;
    align-items: center;
    gap: 8px;
    border: none !important;
    letter-spacing: 0.3px;
    white-space: nowrap;
  }
}
/* font-weight must beat the generic
   `.wsmenu > .wsmenu-list > li > a { font-weight: 500 !important }` sweep
   (specificity 0,3,3 with !important). Match its tag/class depth and add
   the `.nav-charts-link` class so we end up at 0,4,3 with !important
   and win. */
.wsmenu > .wsmenu-list > li > a.nav-charts-link {
  font-weight: 800 !important;
}
/* Desktop-only icon — 28px is the right size to balance the 16px
   text in the horizontal nav row. The default `.h-link-icon` rule
   (display: none) above hides ALL top-level icons by default, so
   Hyper Charts must explicitly opt back in here.
   [UPDATE] 2026-05-19 — added `display: block` because the new
   default `.h-link-icon { display: none }` would otherwise hide the
   gradient icon on desktop. The drawer keeps its own 24px override
   inside the mobile media block (was 32px until 2026-05-21). */
@media (min-width: 1280px) {
  .nav-charts-link .h-link-icon--charts,
  .nav-charts-link svg {
    display: block;
    width: var(--web-hypercharts-icon-size);
    height: var(--web-hypercharts-icon-size);
    flex-shrink: 0;
    stroke: currentColor;
    stroke-width: var(--web-icon-stroke);
    fill: none;
  }
}
/* [UPDATE] 2026-05-19 — drawer SVG used to be hidden here so Hyper
   Charts read as a gradient-text row only. With every top-level entry
   now showing a 24px leading icon (.h-link-icon rule above, was 32px
   until 2026-05-21), Hyper Charts joins the unified "[icon] [label]"
   pattern for visual parity across all drawer rows — its SVG is no
   longer hidden in the drawer. */
.nav-charts-link:hover {
  opacity: 0.85;
}
.nav-charts-link:focus-visible {
  outline: 2px solid rgba(255, 255, 255, 0.6);
  outline-offset: 4px;
  border-radius: 4px;
}

/* Light theme — header bar is locked dark site-wide, so the same gradient
   reads correctly. Nothing to override; left explicit for symmetry with the
   neighbouring `body.theme--light #header .h-link` rules further down. */
.theme--light .nav-charts-link,
.theme--dark  .nav-charts-link {
  color: #ffffff !important;
  -webkit-text-fill-color: #ffffff !important;
}

/* Scrolled header — header stays dark, white text. */
.scroll .nav-charts-link { color: #ffffff !important; -webkit-text-fill-color: #ffffff !important; }

/* Higher-specificity overrides — defeat the generic
   `body.theme--{light,dark} #header .nav-charts-link[:hover] { color: #fff/#aaa }`
   sweep further down this file so the gradient text fill is not stomped to
   solid white. The grey hover is correct for the surrounding "Derivatives /
   Sentiment / DEX / ..." entries — only this entry opts out.
   [FIX] 2026-05-14 (v6) — extra selectors with .wsmenu > .wsmenu-list lineage
   to beat `.theme--light .wsmenu > .wsmenu-list > li > a { color: #fff }`
   (specificity 0,2,4) which previously forced Hyper Charts solid white inside
   the mobile drawer, breaking the gradient and making it look different from
   the desktop nav. */
body.theme--light #header .nav-charts-link,
body.theme--dark  #header .nav-charts-link,
body.theme--light #header .nav-charts-link:hover,
body.theme--dark  #header .nav-charts-link:hover,
body.theme--light .wsmenu > .wsmenu-list > li > a.nav-charts-link,
body.theme--dark  .wsmenu > .wsmenu-list > li > a.nav-charts-link,
body.theme--light .wsmenu > .wsmenu-list > li > a.nav-charts-link:hover,
body.theme--dark  .wsmenu > .wsmenu-list > li > a.nav-charts-link:hover {
  color: #ffffff !important;
  -webkit-text-fill-color: #ffffff !important;
  background-image: none !important;
}

/* Nav menu font weight */
.wsmenu > .wsmenu-list > li > a,
.wsmenu > .wsmenu-list > li > ul.sub-menu > li > a,
.wsmenu > .wsmenu-list > li > .wsmegamenu .link-list li a {
  font-weight: 500 !important;
}

/* Header nav: 16px font-size baseline (applies in both desktop nav
   and mobile drawer for consistent typography) */
.wsmenu > .wsmenu-list > li > a.h-link {
  font-size: 16px !important;
}
.wsmenu > .wsmenu-list > li > ul.sub-menu > li > a {
  font-size: 16px !important;
  line-height: 1.35 !important;
}
.wsmenu > .wsmenu-list > li > .wsmegamenu .link-list li a {
  font-size: 16px !important;
}

/* Desktop-only nav padding/letter-spacing tightening.
   [UPDATE] 2026-05-13 — Originally placed outside any media query so
   it applied in both desktop nav and the hamburger drawer. That
   broke the in-drawer alignment: Sign in / Pricing / Hyper Charts /
   Derivatives etc. (all `.h-link`) ended up with 10px left-padding
   while sibling drawer items (no `.h-link`) used the template default
   17px left-padding, producing a jagged left edge inside the drawer.
   Scope: now wrapped in `@media (min-width: 1280px)` so the tighten
   only happens when the desktop 3-column layout is active. Inside
   the drawer, `.h-link` falls back to the template default
   `padding: 12px 32px 12px 17px` (menu.css L841) and aligns with the
   rest of the menu items.
   Reason for the desktop tightening: six top-level entries (Hyper
   Charts / Derivatives / Sentiment / DEX / Platform / Pricing) +
   logo + Sign in / Sign up would not fit on one row in 1200-1400
   viewports, causing `flex-wrap` to fold the nav to two rows just
   before the hamburger kicked in. Combined savings: padding
   −12px × 6 = −72px, letter-spacing −0.1px × ~48 chars = −5px. Total
   nav row width drops from ~745 to ~625, which fits within 1184px
   inner at viewport 1280 with ~19px headroom.
   Padding-right minimum is bound by the absolute-positioned wsarrow
   (right: 15px + ~8px arrow width). The wsarrow inside `.h-link` is
   `position: absolute; right: 15px` so it overlays the right padding
   rather than consuming inline width — 14px right-padding is OK
   because the arrow is anchored to the right edge of the box and
   the text never reaches that far.
   Warning: do not raise padding-left below 10px — would crowd the
   leading character. Do not lower padding-right below 14px —
   wsarrow alignment becomes visually flush with text. */
@media (min-width: 1280px) {
  .wsmenu > .wsmenu-list > li > a.h-link {
    padding: 10px 14px 10px 10px !important;
    letter-spacing: 0.2px !important;
  }
}
/* In-drawer (hamburger) menu styling.
   [UPDATE] 2026-05-14 (v5) — Was `(max-width: 991px)` → `1199px` →
   `1279px`. Aligned with the hamburger / desktop-actions breakpoint
   shift to 1279/1280.
   The Sign-up CTA in the drawer was previously displayed as a 130×38
   inline-flex pill anchored to the `<li>`'s left padding (17px),
   giving the user a tiny floating button on the left edge of an
   otherwise full-width 350px-wide menu list — out of visual scale
   with everything around it.
   Fixed by:
   1. Re-sizing the in-drawer Sign-up CTA to 210×52 using the
      `.tt-btn-skew--sm` clip-path (existing tuned path that already
      preserves the down-skew angle at this size — see L4216-4221).
      We can't simply set `width: 100%` because `.tt-btn-skew` uses
      `clip-path: path()` with absolute pixel coordinates that don't
      respond to box resize, so the clip-path MUST match the box
      size exactly or the silhouette will be wrong.
   2. Left-anchoring the button with `display: flex` +
      `margin-left: 7px; margin-right: auto`. The 7px left margin
      mirrors the horizontal margin crocus-theme.css L2525 applies
      to every other `<a>` row in the drawer (`margin: 0 7px`), so
      the CTA's left edge lines up with the Sign in / Pricing /
      Hyper Charts rows above it. `margin-right: auto` parks the
      remaining ~133px of row width to the right of the button
      without forcing the CTA to stretch.
      Switching `inline-flex` → `flex` is what makes the auto
      margin take effect (margin: auto only works on block-level or
      flex/grid containers). The base `.tt-btn-skew` already
      provides `align-items: center` and `justify-content: center`
      (L4170-4171), so the inner "Sign up" label remains vertically
      centred inside the 52px box.
   Sign in remains a regular drawer row that inherits the template
   default 17px left-padding (now that the desktop-only `.h-link`
   padding tightening is scoped to `min-width: 1280px`). */
@media only screen and (max-width: 1279px) {
  /* All drawer link rows share the same 16px font baseline. */
  .wsmenu > .wsmenu-list > li > a,
  .wsmenu > .wsmenu-list > li >a {
    font-size: 16px !important;
  }
  /* Sign-up CTA: re-size from .tt-btn-skew--header (130×38) to the
     .tt-btn-skew--sm geometry (210×52) so the button reads as a
     proper CTA inside the drawer. The clip-path is copied verbatim
     from .tt-btn-skew--sm (L4220) and MUST stay in sync with the
     210×52 box — do not change one without the other.
     Alignment strategy: left-anchored to match the rest of the
     drawer rows. `display: flex` (block-level flex container) makes
     margin work for horizontal positioning; `margin-left: 7px`
     mirrors the 7px horizontal margin crocus-theme.css L2525
     applies to every other `.wsmenu-list > li > a` row, so the CTA
     box sits flush with the Sign in / Pricing / etc. rows above
     it. `margin-right: auto` keeps the box at 210px without
     stretching to full row width. `align-items: center` +
     `justify-content: center` are still inherited from the base
     `.tt-btn-skew` (L4170-4171) so the "Sign up" text label stays
     vertically centred inside the 52px box. */
  .wsmenu > .wsmenu-list > li > a.tt-btn-skew {
    display: flex !important;
    width: 210px !important;
    height: 52px !important;
    font-size: 14px !important;
    padding: 0 16px !important;
    line-height: 1 !important;
    margin: 8px auto 8px 7px !important;
    clip-path: path('M12 6 H181 Q186 6 188 9 L202 43 Q205 50 198 51 H12 Q7 51 7 46 V11 Q7 6 12 6 Z') !important;
    background: linear-gradient(90deg, #2962ff 0%, #2962ff 70%, #2962ff 100%);
    border-bottom: none !important;
  }
  /* The Sign in `<li>` carries `.mobile-last-link` (header-index.ejs
     L170) which the template uses to signal "last text-link row
     before the Sign-up CTA — don't draw a separator below me".
     responsive.css already enforces this for viewports ≤991 and
     ≤767, but not for the 992-1279 hamburger range we introduced.
     Mirror the rule here so the divider above the Sign-up CTA does
     not appear at any viewport. */
  .wsmenu > .wsmenu-list > li.mobile-last-link > a {
    border-bottom: none !important;
  }
  /* The Sign in `<li>` also carries `.reg-fst-link` (header-index.ejs
     L170). crocus-theme.css L2565 adds `margin-left: 30px` to that
     class to offset desktop "register-first" CTA pills (a template
     convention), but inside the drawer that 30px makes Sign in's
     left edge sit 23px to the right of every other drawer row (the
     base crocus `margin: 0 7px` is 7px). Reset it back to 7px here
     so Sign in's left edge lines up flush with Pricing / Hyper
     Charts / Derivatives etc. above.
     [FIX] 2026-05-14 (v6) — also normalise padding-left to match the
     Sign-up CTA's visual text origin: Sign-up uses tt-btn-skew with
     `padding: 0 16px` and an internal clip-path that starts at X=12px,
     so its "Sign up" label visually begins ~16px from the button's
     left edge. The neighbouring Sign-in row used the template's
     17px left padding (menu.css L842) PLUS our 7px li margin = 24px
     from the drawer edge, while Sign-up sat at 7+0=7px from the
     edge (the button itself is offset 0 inside its `<li>`). Result:
     Sign in appeared visibly indented to the right of Sign up. Lock
     padding-left to 9px so Sign-in's text starts at 7+9=16px — the
     same X-coordinate as Sign-up's "Sign up" glyph. */
  .wsmenu > .wsmenu-list > li.reg-fst-link > a {
    margin-left: 7px !important;
    margin-right: 7px !important;
    padding-left: 9px !important;
    text-align: left !important;
  }
}

/* Desktop three-column layout: logo(left) | nav(center) | actions(right)
   [UPDATE] 2026-05-13 — Breakpoint raised from 992 → 1200 → 1280 in
   two passes to align with the hamburger menu breakpoint (also at
   ≤1279 in menu.css and menu.js). History:
   • Original 992 caused Sign-up button to co-render with hamburger
     at 992-1199.
   • Intermediate 1200 fix removed that co-render but the 6 top-level
     nav entries + logo + actions still could not fit in 1200-1399
     viewports, so `flex-wrap: wrap` folded the nav into two rows
     immediately before the hamburger kicked in at ≤1199 — the user
     reported "menu wraps to two lines, then becomes hamburger".
   • Final 1280 + flex-wrap: nowrap removes the wrap entirely. 13"
     laptop 1280×800 is the cutoff: 1280+ shows the desktop nav,
     ≤1279 shows the hamburger. Matches the physical row capacity
     after padding shrink to 28px horizontal per entry.
   Warning: do not lower this breakpoint below 1280 without also
   shrinking nav padding further OR reducing the nav entry count
   — current sizing is tuned to fit 1280 inner width (1184px) with
   ~10px headroom. */
@media (min-width: 1280px) {
  .wsmainwp {
    display: flex !important;
    align-items: center !important;
  }
  .desktoplogo {
    float: none !important;
    flex-shrink: 0 !important;
  }
  nav.wsmenu {
    float: none !important;
    flex: 1 1 auto !important;
    display: flex !important;
    justify-content: center !important;
  }
  /* [UPDATE] 2026-05-13 — `flex-wrap: wrap` → `nowrap`. With six
     top-level entries the wrap fallback would fold the nav into two
     rows in the 1200-1399 viewport range. Since the hamburger now
     kicks in at ≤1279, this block only runs at ≥1280 where the
     padding sizing above guarantees the nav fits on one row.
     `nowrap` is the belt-and-braces guard so even if some user
     enlarges the font via OS zoom or a CSS user style, the worst
     outcome is horizontal compression — never a two-row menu. */
  nav.wsmenu > .wsmenu-list {
    float: none !important;
    display: flex !important;
    flex-wrap: nowrap !important;
    justify-content: center !important;
    align-items: center !important;
  }
  nav.wsmenu > .wsmenu-list > li {
    flex: 0 0 auto !important;
  }
  .mobile-only-nav {
    display: none !important;
  }
  .header-actions {
    flex-shrink: 0 !important;
    display: flex !important;
    align-items: center !important;
    gap: 8px;
    line-height: 70px;
    white-space: nowrap;
  }
  .header-action-signin {
    padding: 6px 12px;
    font-size: 16px;
    line-height: 70px;
  }
  /* .header-action-signup sizing/colour now come from tt-btn-skew
     component (--nebula gradient + --header size). The `header-action-signup`
     class is kept on the anchor purely as a JS hook for `.nav-guest` show/
     hide logic and for keeping the anchor in the desktop actions row. */
  .header-actions .theme-toggle {
    display: flex;
    align-items: center;
    padding: 4px;
  }
  .header-actions .theme-toggle svg {
    width: 22px;
    height: 22px;
  }
  .header-actions .lang-switcher {
    font-size: 16px;
    padding: 4px 6px;
  }
  .header-actions .lang-switcher svg {
    width: 20px;
    height: 20px;
  }
  .header-actions .lang-code {
    font-size: 16px;
  }
  .header-actions .nav-user-avatar {
    width: 28px;
    height: 28px;
    min-width: 28px;
  }
  .header-actions .lang-switcher-li {
    position: relative;
  }
}
/* [UPDATE] 2026-05-13 — Was `(max-width: 991px)` → `1199px` → `1279px`.
   Paired with the `(min-width: 1280px)` desktop layout block above and
   the menu.css `(max-width: 1279px)` hamburger block. All three rules
   now flip states at the same 1279/1280 boundary so there is no
   intermediate viewport range where the hamburger and the Sign-up
   button both render, and no intermediate range where the nav wraps
   to two rows just before becoming a hamburger. */
@media (max-width: 1279px) {
  .header-actions {
    display: none !important;
  }
}

/* Header actions colors - mirror nav link colors (palette aligned to chart) */
.navbar-dark .header-action-signin {
  color: #ffffff;
  text-decoration: none;
}
.navbar-dark .header-action-signin:hover {
  color: #aaaaaa !important;
}
.navbar-dark.white-scroll .scroll .header-action-signin {
  color: #000000;
}
/* [FIX] 2026-05-14 (v4) — header is locked black; sign-in link must stay
 * light in both themes to remain readable on the black header bar. */
.theme--light .header-action-signin {
  color: #aaaaaa !important;
}
.theme--light .header-action-signin:hover {
  color: #ffffff !important;
}
.theme--dark .header-action-signin {
  color: #aaaaaa !important;
}
.theme--dark .header-action-signin:hover {
  color: #ffffff !important;
}
.theme--dark .scroll .header-action-signin {
  color: #aaaaaa !important;
}

/* Mobile nav: theme toggle & language switcher - match menu item sizing
   [UPDATE] 2026-05-13 — Was `(max-width: 991px)` → `1199px` → `1279px`.
   Aligned with the hamburger breakpoint shift to ≤1279, so the in-drawer
   theme toggle and language switcher styling spans the whole mobile menu
   range. */
@media (max-width: 1279px) {
  /* Drawer bg is #000 in both themes — separator must stay light. */
  .wsmenu-list .theme-toggle-li,
  .wsmenu-list .lang-switcher-li {
    padding: 0;
    border-top: 1px solid rgba(255, 255, 255, 0.13);
  }
  /* [FIX] 2026-05-14 (v8) — theme-toggle / lang-switcher buttons must
     left-align to the same X coordinate as the rest of the drawer rows.
     Plain drawer rows (Hyper Charts / Derivatives / ...) come from
     menu.css L841 `padding: 12px 32px 12px 17px` on the <a> — text
     starts at 17px from the drawer left edge (the parent <li> has no
     padding, no margin; crocus's 7px <a> margin only applies at
     desktop ≥1280px so it does NOT exist inside the drawer).
     Original bug: `.theme-toggle` base rule (1110) has `margin-left:
     12px` for the desktop header layout, but that 12px is harmful in
     the drawer (it pushes the button 12px to the right of the menu
     text above). Fix: lock margin to 0 + padding-left to 17px so the
     leading glyph (sun/moon, globe) starts at the same X=17 as every
     menu text row above. */
  .wsmenu-list .theme-toggle-li .theme-toggle,
  .wsmenu-list .lang-switcher-li .lang-switcher {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    gap: 8px;
    width: 100%;
    height: auto !important;
    margin: 0 !important;
    padding: 10px 17px 10px 17px !important;
    font-size: 16px;
    line-height: 1.35;
    text-align: left;
  }
  .wsmenu {
    overflow-x: hidden !important;
  }
  .wsmenu > .wsmenu-list {
    overflow-x: hidden !important;
  }
  /* [FIX] 2026-07-16 — mobile drawer lang dropdown visibility
     Reason: drawer bg is #000 in both themes but light-theme
     .lang-item .lang-name was black; dropdown had transparent bg.
     Change: drawer-scoped white text + subtle bordered surface.
     Warning: do not revert to theme--light black .lang-name inside drawer. */
  .wsmenu-list .lang-switcher-li .lang-dropdown {
    position: static;
    display: none;
    margin-top: 8px;
    margin-left: 30px;
    margin-right: 20px;
    box-shadow: none;
    border: 1px solid rgba(255, 255, 255, 0.12);
    border-radius: 8px;
    padding: 0;
    margin-bottom: 8px;
    min-width: auto;
    width: auto;
    background-color: rgba(255, 255, 255, 0.06);
  }
  .wsmenu-list .lang-switcher-li.active .lang-dropdown {
    display: block;
  }
  .wsmenu-list .lang-switcher-li .lang-item .lang-name,
  .theme--light .wsmenu-list .lang-switcher-li .lang-item .lang-name,
  .theme--dark .wsmenu-list .lang-switcher-li .lang-item .lang-name {
    color: rgba(255, 255, 255, 0.85) !important;
    -webkit-text-fill-color: rgba(255, 255, 255, 0.85) !important;
  }
  .wsmenu-list .lang-switcher-li .lang-item.active .lang-name,
  .theme--light .wsmenu-list .lang-switcher-li .lang-item.active .lang-name {
    color: #ffffff !important;
    -webkit-text-fill-color: #ffffff !important;
  }
  .theme--light .wsmenu-list .lang-switcher-li .lang-item:hover,
  .theme--dark .wsmenu-list .lang-switcher-li .lang-item:hover,
  .wsmenu-list .lang-switcher-li .lang-item:hover {
    background-color: rgba(255, 255, 255, 0.08);
  }
  .theme--light .wsmenu-list .lang-switcher-li .lang-dropdown {
    background-color: rgba(255, 255, 255, 0.06) !important;
    box-shadow: none !important;
  }
}

/* ========================================
   NAV AUTH STATE
   Auth elements hidden by default; toggled by updateNavAuth() in custom.js
   [FIX] 2026-05-19 — added wsmenu-list-scoped variant because the
   mobile drawer rebuild placed `.nav-auth` directly on <li> children
   of `.wsmenu-list`. The menu.css rule
   `.wsmenu > .wsmenu-list > li { display: block }` (specificity 0,1,2)
   beats the bare `.nav-auth { display: none }` (specificity 0,1,0),
   leaving the auth-only items visible in the drawer for guest users.
   This higher-specificity rule guarantees the default-hidden state.
   jQuery `.show()` from auth.js still wins via inline style after the
   user logs in. Cannot use !important here because that would defeat
   `.show()` entirely. Specificity (0,1,3 = 1 class + 1 class + 1 li +
   1 class) is enough: it beats `.wsmenu-list > li` cleanly. */
.nav-auth { display: none; }
.wsmenu > .wsmenu-list > li.nav-auth { display: none; }

/* [ADD] 2026-05-20 r12 — Authenticated user avatar nebula gradient.
   Single source of truth for every signed-in avatar across home /
   movers / sentiment / liquidations and any future aggregation page.
   Mirrors the chart-page token in app.css so the same user reads as
   the same colour everywhere on the platform.
   Stops:
     #2962ff (Material Blue A700) — same as the chart-page accent and
       the AI Assistant sparkle icon's blue stop, anchors the auth
       identity on the brand blue.
     #7c3aed (violet-600) — mid-stop, "nebula dust" feel.
     #e53935 (Material Red 600) — matches the AI sparkle red stop.
   Pattern: radial-gradient anchored at 28% 28% (upper-left) — blue
   star burning through nebula gas towards the red giant at the
   bottom-right. Text on this surface MUST be #ffffff (white). All
   three stops pass WCAG AA contrast against white at font-weight
   600+ with sizes >= 13px (covers all four avatar sizes below). */
/* User avatar circle button - reuses lang-switcher-li hover mechanism. */
/* [FIX] 2026-08-08 — img avatar: drop letter-avatar white fill; clip circle on button. */
.nav-user-avatar {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: transparent;
  border: none;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  flex-shrink: 0;
  padding: 0;
  overflow: hidden;
}
.nav-user-avatar:focus {
  outline: none;
}
.nav-user-avatar:focus-visible {
  outline: 2px solid var(--tt-fg-0, #ffffff);
  outline-offset: 2px;
}
.nav-user-avatar-img {
  width: 100%;
  height: 100%;
  border-radius: inherit;
  object-fit: cover;
  display: block;
}
/* User dropdown panel - isolated from wsmenu/menu.css global ul/li styles */
.nav-user-dropdown {
  display: none;
  position: absolute;
  top: 100%;
  right: 0;
  /* [FIX] 2026-08-08 — min-width aligned with chart page app.css .nav-user-dropdown */
  min-width: 280px;
  background: #000000;
  border: 1px solid #2b2b2b;
  border-radius: 10px;
  box-shadow: 0 8px 32px rgba(0,0,0,0.3);
  list-style: none !important;
  padding: 6px 0 !important;
  margin: 0 !important;
  z-index: 1000;
  /* [FIX] 2026-07-24 — Desktop shell clones this menu to body (#tt-shell-account-dropdown-host),
     outside .tra-menu .wsmenu where --web-icon-size is scoped. Self-host tokens so SVG sizing
     survives the clone on account/auth pages that omit tradeiz-home.css / app.css. */
  --web-icon-size: 24px;
  --web-icon-stroke: 1.6;
  --text-primary: #d0d0d0;
}
.nav-user-li:hover .nav-user-dropdown { display: block; }
.nav-user-dropdown li {
  list-style: none !important;
  float: none !important;
  display: block !important;
  width: 100% !important;
  margin: 0 !important;
  padding: 0 !important;
  line-height: normal !important;
  border: none !important;
  background: none !important;
}

/* Identity block.
   [FIX] 2026-07-02 — two-row grid: row1 = avatar + username (aligned),
   row2 = tier pill starting from the avatar's LEFT edge (col 1). The pill is
   a direct child of .nud-identity (no longer nested in .nud-identity-text) so
   it can occupy its own row left-aligned to the avatar. */
.nav-user-dropdown .nud-identity {
  display: grid !important;
  grid-template-columns: auto 1fr;
  align-items: center;
  column-gap: 10px;
  row-gap: 8px;
  padding: 14px !important;
  border-bottom: 1px solid rgba(255,255,255,0.08) !important;
  margin-bottom: 4px !important;
  height: auto !important;
}
.nud-avatar-sm {
  flex-shrink: 0;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  display: block;
  overflow: hidden;
  object-fit: cover;
}
/* Username occupies row 1 / column 2 (next to the avatar). */
.nud-identity-text {
  min-width: 0;
  align-self: center;
}
.nud-username {
  min-width: 0;
  font-size: 14px;
  font-weight: 500;
  color: #ffffff;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* Membership tier pill — row 2 / column 1, left edge aligned to the avatar.
   Styling rule: text color stays var(--tt-fg-0) (neutral high-contrast), 12px
   from the size whitelist. The per-tier accent lives ONLY in border/background
   (decorative, exempt) — never the text colour. Compact ~20px pill height with
   an optional leading dot for a refined, tiered look. */
.nud-tier {
  grid-column: 1 / -1;
  justify-self: start;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 20px;
  padding: 0 9px;
  border-radius: 999px;
  border: 1px solid rgba(255,255,255,0.16);
  background: rgba(255,255,255,0.05);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.01em;
  line-height: 1;
  color: var(--tt-fg-0);
  white-space: nowrap;
}
/* Guests: pill is emitted with [hidden] and no tier — the inline-flex above
   would otherwise reveal an empty pill, so keep [hidden] authoritative. */
.nud-tier[hidden] { display: none; }
/* Leading accent dot (flex item) — the ONLY place the per-tier colour appears
   (decorative). Free has no dot (neutral). */
.nud-tier--basic::before,
.nud-tier--plus::before,
.nud-tier--pro::before,
.nud-tier--ultimate::before {
  content: '';
  width: 6px;
  height: 6px;
  border-radius: 50%;
  flex-shrink: 0;
}
/* Per-tier accent: dot + border tint + subtle background wash (all decorative,
   styling-rule exempt). Higher tiers read progressively richer. */
.nud-tier--basic::before { background: #3b82f6; }
.nud-tier--basic { border-color: rgba(59,130,246,0.45); background: rgba(59,130,246,0.10); }
.nud-tier--plus::before { background: #a855f7; }
.nud-tier--plus { border-color: rgba(168,85,247,0.45); background: rgba(168,85,247,0.10); }
.nud-tier--pro::before { background: #f59e0b; }
.nud-tier--pro { border-color: rgba(245,158,11,0.50); background: rgba(245,158,11,0.12); }
.nud-tier--ultimate::before { background: linear-gradient(135deg,#fde68a 0%,#f59e0b 100%); box-shadow: 0 0 4px rgba(245,158,11,0.65); }
.nud-tier--ultimate {
  border-color: rgba(245,158,11,0.55);
  background: linear-gradient(135deg, rgba(253,230,138,0.14) 0%, rgba(245,158,11,0.14) 100%);
}

/* Group label */
.nav-user-dropdown .nud-group-label {
  padding: 10px 14px 4px !important;
  font-size: 10px !important;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.3) !important;
  cursor: default;
  line-height: 1.2 !important;
  height: auto !important;
}

/* Menu item */
.nav-user-dropdown .nud-item a {
  display: flex !important;
  align-items: center;
  gap: 10px;
  padding: 8px 14px !important;
  font-size: 16px !important;
  color: rgba(255,255,255,0.75) !important;
  text-decoration: none !important;
  transition: background-color 0.15s;
  height: auto !important;
  line-height: 1.4 !important;
}
.nav-user-dropdown .nud-item a svg {
  width: var(--web-icon-size);
  height: var(--web-icon-size);
  flex-shrink: 0;
  color: inherit;
  stroke: var(--text-primary);
  stroke-width: var(--web-icon-stroke);
  fill: none;
}
.nav-user-dropdown .nud-item a:hover { background-color: rgba(255,255,255,0.08) !important; }

/* Sign out row */
.nav-user-dropdown .nud-signout { border-top: 1px solid rgba(255,255,255,0.08) !important; margin-top: 4px !important; }
.nav-user-dropdown .nud-signout a {
  display: flex !important;
  align-items: center;
  gap: 10px;
  padding: 8px 14px !important;
  font-size: 16px !important;
  color: rgba(255,100,100,0.85) !important;
  text-decoration: none !important;
  transition: background-color 0.15s;
  height: auto !important;
  line-height: 1.4 !important;
}
.nav-user-dropdown .nud-signout a svg {
  width: 16px;
  height: 16px;
  flex-shrink: 0;
  color: inherit;
  stroke: currentColor;
  fill: none;
}
.nav-user-dropdown .nud-signout a:hover { background-color: rgba(255,80,80,0.08) !important; color: #ff6464 !important; }

/* Light theme overrides */
.theme--light .nav-user-dropdown {
  background: #ffffff;
  box-shadow: 0 8px 32px rgba(0,0,0,0.12);
  border: 1px solid rgba(0,0,0,0.08);
  --text-primary: #181818;
}
.theme--light .nav-user-dropdown .nud-identity { border-bottom-color: rgba(0,0,0,0.08) !important; }
.theme--light .nud-username { color: #000000; }
.theme--light .nud-tier {
  color: #000000;
  border-color: rgba(0,0,0,0.16);
  background: rgba(0,0,0,0.04);
}
/* Light-theme per-tier accents (border/bg only; text stays #000). Dot colours
   are unchanged — they already contrast on white. */
.theme--light .nud-tier--basic { border-color: rgba(59,130,246,0.40); background: rgba(59,130,246,0.08); }
.theme--light .nud-tier--plus { border-color: rgba(168,85,247,0.40); background: rgba(168,85,247,0.08); }
.theme--light .nud-tier--pro { border-color: rgba(245,158,11,0.45); background: rgba(245,158,11,0.10); }
.theme--light .nud-tier--ultimate {
  border-color: rgba(217,119,6,0.55);
  background: linear-gradient(135deg, rgba(253,230,138,0.30) 0%, rgba(245,158,11,0.18) 100%);
}
.theme--light .nav-user-dropdown .nud-group-label { color: rgba(0,0,0,0.3) !important; }
.theme--light .nav-user-dropdown .nud-item a { color: rgba(0,0,0,0.7) !important; }
.theme--light .nav-user-dropdown .nud-item a:hover { background-color: rgba(0,0,0,0.05) !important; color: #000000 !important; }
.theme--light .nav-user-dropdown .nud-signout { border-top-color: rgba(0,0,0,0.08) !important; }
.theme--light .nav-user-dropdown .nud-signout a { color: rgba(200,50,50,0.85) !important; }
.theme--light .nav-user-dropdown .nud-signout a:hover { background-color: rgba(200,50,50,0.06) !important; color: #c83232 !important; }

/* ========================================
   MOBILE DRAWER — STRUCTURED LAYOUT (4 sections)
   [REDESIGN] 2026-05-19 — Mobile drawer is now physically segmented
   into clearly-separated regions so the user understands which links
   belong to "site features" vs "my account" vs "notifications".
   Layout (top-to-bottom):
     • User identity card        (.tt-mob-user-li,    auth-only)
     • SECTION 1: Site primary menu (Hyper Charts / Derivatives / ...)
     • Section divider           (.tt-mob-section-divider, auth-only)
     • SECTION 2: My Account     (.tt-mob-section-heading 'My Account' + 8 links)
     • Section divider           (.tt-mob-section-divider, auth-only)
     • SECTION 3: Notifications  (.tt-mob-section-heading 'Notifications' + 2 links)
     • Section divider           (.tt-mob-section-divider, auth/guest)
     • SECTION 4: Session row    (Sign in/up for guest, Sign out for auth)
   The desktop avatar dropdown keeps its compact 240px panel — that is
   not affected by this redesign.
   ======================================== */
.tt-mob-user-li,
.tt-mob-section-divider,
.tt-mob-section-heading,
.tt-mob-signout-li {
  display: none; /* default: hidden on desktop */
}
@media (max-width: 1279px) {
  /* User identity card — sits at the top of the drawer for logged-in
   * users. Override default <li> border / padding from menu.css L824
   * so the card reads as a visual block, not another menu row. */
  .wsmenu > .wsmenu-list > li.tt-mob-user-li {
    display: block;
    border-bottom: 1px solid rgba(255, 255, 255, 0.13) !important;
    padding: 0 !important;
  }
  /* [UPDATE] 2026-05-19 (v2) — Tightened avatar-to-name spacing per
   * user feedback ("名字要往左靠"). Changes:
   *   • gap 12px → 10px         (matches Binance/Coinbase mobile drawer)
   *   • avatar size 40 → 36px   (smaller circle = less visual weight)
   *   • name margin-left: 0     (lock to flex gap, no extra inline offset)
   *   • justify-content: flex-start on the card (explicit left-pack to
   *     prevent any inherited centering from `text-align: center` that
   *     menu.css L816 sets on `.wsmenu-list` parent) */
  /* [FIX] 2026-07-02 — two-row grid: row1 = avatar + name, row2 = tier pill
     starting from the avatar's left edge (col 1). Mirrors the desktop
     dropdown identity layout. */
  .tt-mob-user-card {
    display: grid;
    grid-template-columns: auto 1fr;
    align-items: center;
    column-gap: 10px;
    row-gap: 8px;
    padding: 14px 17px;
    text-align: left;
  }
  .tt-mob-user-avatar {
    flex-shrink: 0;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    display: block;
    object-fit: cover;
    overflow: hidden;
  }
  /* Name occupies row 1 / column 2 (next to the avatar). */
  .tt-mob-user-text {
    min-width: 0;
    align-self: center;
  }
  .tt-mob-user-name {
    min-width: 0;
    margin: 0;
    padding: 0;
    font-size: 16px;
    font-weight: 600;
    color: var(--tt-fg-0);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    text-align: left;
  }
  /* Membership tier pill — row 2 / column 1, left edge aligned to the avatar.
     Text stays neutral high-contrast (var(--tt-fg-0)); the per-tier accent is
     border/background/dot only (decorative). Shares .nud-tier--<tier> accent
     rules with the desktop dropdown. */
  .tt-mob-user-tier {
    grid-column: 1 / -1;
    justify-self: start;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    height: 20px;
    padding: 0 9px;
    border-radius: 999px;
    border: 1px solid rgba(255,255,255,0.16);
    background: rgba(255,255,255,0.05);
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.01em;
    line-height: 1;
    color: var(--tt-fg-0);
    white-space: nowrap;
  }
  /* Guests: hidden pill must stay hidden despite the inline-flex above. */
  .tt-mob-user-tier[hidden] { display: none; }

  /* Section divider — a thick horizontal break that visually separates
   * the four logical regions of the drawer. Renders as 8px of empty
   * space + a 1px border-top, both painted on a single empty <li>.
   * The <li> element is intentionally childless in markup.
   * NOTE: do NOT put `!important` on `display` — that would defeat
   * jQuery's `.hide()` (called via auth.js `.nav-guest.hide()` after
   * login), leaving guest dividers visible while authenticated. The
   * default <li> `display: list-item` already produces the desired
   * block-level layout; the height/border attributes do all the work. */
  .wsmenu > .wsmenu-list > li.tt-mob-section-divider {
    height: 8px;
    padding: 0 !important;
    margin: 8px 0 0 0 !important;
    border-top: 1px solid rgba(255, 255, 255, 0.13) !important;
    border-bottom: none !important;
    background: transparent;
    pointer-events: none;
    list-style: none;
  }

  /* Section heading row — non-clickable uppercase title above each
   * sub-section ("My Account", "Notifications"). Mirrors the desktop
   * dropdown's `.nud-group-label` typography for visual consistency. */
  .wsmenu > .wsmenu-list > li.tt-mob-section-heading {
    display: block;
    border-bottom: none !important;
    padding: 0 !important;
  }
  /* [FIX] 2026-05-19 — explicit text-align:left on the heading span.
   * Reason: menu.css L119 sets `.wsmenu > .wsmenu-list > li { text-align:
   *   center }` as the global mobile <li> default. Without an explicit
   *   override the heading span (which is `display:block;width:100%`)
   *   inherits center alignment, so the "MY ACCOUNT" / "NOTIFICATIONS"
   *   labels visually float in the middle of the row instead of lining
   *   up with the menu items below them.
   * Change: hard-set `text-align: left` on the inner span. The padding
   *   17px keeps the label flush with `.h-link` items (also 17px left
   *   padding from menu.css L842). */
  .wsmenu > .wsmenu-list > li.tt-mob-section-heading > span {
    display: block;
    padding: 14px 17px 4px 17px;
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: rgba(255, 255, 255, 0.45);
    line-height: 1.4;
    text-align: left;
    pointer-events: none;
    cursor: default;
  }

  /* Sign out — danger-tone link mirroring the desktop dropdown's
   * Sign-out treatment. Visible only when authenticated. */
  .wsmenu > .wsmenu-list > li.tt-mob-signout-li {
    display: block;
  }
  .wsmenu > .wsmenu-list > li.tt-mob-signout-li > a {
    color: rgba(220, 60, 60, 0.92) !important;
  }
  .wsmenu > .wsmenu-list > li.tt-mob-signout-li > a .h-link-icon {
    stroke: currentColor; /* [EXCEPTION] inherits sign-out red from parent anchor */
  }
  .wsmenu > .wsmenu-list > li.tt-mob-signout-li > a:hover {
    color: #ff6464 !important;
  }
}

/* ========================================
   LANGUAGE SWITCHER
   ======================================== */
.lang-switcher-li {
  position: relative;
}
.lang-switcher {
  display: flex;
  align-items: center;
  gap: 6px;
  background: transparent;
  border: none;
  cursor: pointer;
  padding: 6px 8px;
  border-radius: 8px;
  transition: background-color 0.2s ease;
  line-height: normal;
}
.lang-switcher:hover {
  background-color: rgba(255, 255, 255, 0.08);
}
.lang-switcher svg {
  width: var(--web-icon-size);
  height: var(--web-icon-size);
  color: var(--text-primary);
  stroke: var(--text-primary);
  stroke-width: var(--web-icon-stroke);
  fill: none;
}
.lang-switcher .lang-code {
  font-family: 'Inter', sans-serif !important;
  font-size: 16px;
  font-weight: 600 !important;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

/* Dark theme */
.theme--dark .lang-switcher svg,
.theme--dark .lang-switcher .lang-code {
  color: var(--text-primary);
}

/* Light theme — header is locked black; keep lang switcher icon/text white. */
.theme--light .lang-switcher svg,
.theme--light .lang-switcher .lang-code {
  color: var(--text-primary) !important;
}

/* Language dropdown */
.lang-dropdown {
  display: none;
  position: absolute;
  top: 100%;
  right: 0;
  min-width: 240px;
  background-color: #000000;
  border: 1px solid #2b2b2b;
  border-radius: 10px;
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
  padding: 6px 0;
  margin-top: 0;
  z-index: 1000;
  list-style: none;
}
.lang-switcher-li:hover .lang-dropdown,
.lang-switcher-li.active .lang-dropdown {
  display: block;
}
.lang-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 48px !important;
  padding: 0 14px !important;
  cursor: pointer;
  transition: background-color 0.15s;
}
/* [UPDATE] 2026-05-13 — Was `(max-width: 991px)` → `1199px` → `1279px`.
   Aligned with hamburger breakpoint shift to ≤1279 so the in-drawer
   language item padding applies throughout the mobile menu viewport
   range. */
@media (max-width: 1279px) {
  .lang-item {
    padding: 8px 16px !important;
  }
}
.lang-item:hover {
  background-color: rgba(255, 255, 255, 0.08);
}
.lang-item .lang-name {
  font-size: 16px;
  line-height: 1.4;
  color: rgba(255, 255, 255, 0.85);
}
.lang-item .lang-check {
  color: #ffffff;
  font-size: 14px;
  display: none;
}
.lang-item.active .lang-check {
  display: inline;
}
.lang-item.active .lang-name {
  color: #ffffff;
  font-weight: 500;
}

/* Light theme dropdown */
.theme--light .lang-dropdown {
  background-color: #ffffff;
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);
  border: 1px solid rgba(0, 0, 0, 0.08);
}
.theme--light .lang-item:hover {
  background-color: rgba(0, 0, 0, 0.05);
}
.theme--light .lang-item .lang-name {
  color: rgba(0, 0, 0, 0.75);
}
.theme--light .lang-item.active .lang-name {
  color: #000000;
}
.theme--light .lang-item.active .lang-check {
  color: #000000;
}

/* Desktop alignment - handled by .header-actions */

/* CTA Banner - theme adaptive */
.tz-banner-cta {
  background-color: #000000;
}
.tz-banner-cta .banner-1-txt h2,
.tz-banner-cta .banner-1-txt p {
  color: #ffffff;
}
.theme--light .tz-banner-cta {
  background-color: #f5f5f7;
}
.theme--light .tz-banner-cta .banner-1-txt h2,
.theme--light .tz-banner-cta .banner-1-txt p {
  color: #000000;
}

/* Login/signup page text - keep white on dark background */
.theme--light .register-page-txt.color--white h2,
.theme--light .register-page-txt.color--white p {
  color: #ffffff !important;
}
.theme--light .register-page-txt .logo-inline--white .logo-wordmark {
  color: #ffffff !important;
}
.theme--light .register-page-txt .logo-inline--white {
  color: #ffffff !important;
}
.theme--light .register-page-txt .logo-inline--white svg path {
  fill: currentColor !important;
}

/* Login / Signup: cap wrapper width so it stops growing on wide screens;
   the text col fills the left, the form col stays fixed on the right */
.register-page-wrapper {
  max-width: 1600px;
  margin-left: auto;
  margin-right: auto;
}

/* Form validation styles */
.form-control.is-invalid {
  border-color: #ff5555 !important;
  box-shadow: 0 0 0 2px rgba(255, 85, 85, 0.2) !important;
}
.field-error {
  font-size: 16px;
  color: #ff5555 !important;
}
.form-message {
  border-radius: 8px;
  padding: 12px 16px;
  font-size: 16px;
}
.form-message.alert-success {
  background-color: rgba(72, 175, 75, 0.15);
  border: 1px solid rgba(72, 175, 75, 0.3);
  color: #48af4b;
}
.form-message.alert-danger {
  background-color: rgba(255, 85, 85, 0.15);
  border: 1px solid rgba(255, 85, 85, 0.3);
  color: #ff5555;
}

/* Auth pages: two-column layout on large screens, single column on mobile */
#login.tz-auth-page,
#signup.tz-auth-page,
#verify-email.tz-auth-page,
#verify-alert-email.tz-auth-page,
#reset-password.tz-auth-page {
  min-height: 100vh !important;
  height: 100vh !important;
  max-height: 100vh !important;
  overflow: hidden !important;
  display: flex !important;
  align-items: stretch !important;
  padding: 0 !important;
}
.theme--dark #login.tz-auth-page,
.theme--dark #signup.tz-auth-page,
.theme--dark #verify-email.tz-auth-page,
.theme--dark #verify-alert-email.tz-auth-page,
.theme--dark #reset-password.tz-auth-page {
  background: #000000 !important;
}
.theme--light #login.tz-auth-page,
.theme--light #signup.tz-auth-page,
.theme--light #verify-email.tz-auth-page,
.theme--light #verify-alert-email.tz-auth-page,
.theme--light #reset-password.tz-auth-page {
  background: #f0f1f5 !important;
}
#login.tz-auth-page .container,
#signup.tz-auth-page .container,
#verify-email.tz-auth-page .container,
#verify-alert-email.tz-auth-page .container,
#reset-password.tz-auth-page .container {
  max-width: 100% !important;
  width: 100% !important;
  height: 100% !important;
  min-height: 0 !important;
  padding: 0 !important;
  display: flex !important;
  align-items: stretch !important;
  flex: 1 !important;
}
/* Top-level two-column shell only — do NOT hit nested form .row grids */
#login.tz-auth-page .container > .row,
#signup.tz-auth-page .container > .row,
#verify-email.tz-auth-page .container > .row,
#verify-alert-email.tz-auth-page .container > .row,
#reset-password.tz-auth-page .container > .row {
  margin: 0 !important;
  flex: 1 !important;
  width: 100% !important;
  height: 100% !important;
  min-height: 0 !important;
  align-items: stretch !important;
  justify-content: flex-start !important;
  display: flex !important;
  flex-direction: row !important;
  flex-wrap: nowrap !important;
}

/* Left brand panel — TradingView-style full-bleed cover (viewport-responsive crop) */
.tz-auth-brand {
  display: none;
  flex: 1 1 0;
  min-width: 0;
  min-height: 0;
  height: 100%;
  max-height: 100vh;
  align-self: stretch;
  box-sizing: border-box;
  flex-direction: column;
  justify-content: stretch;
  padding: 0;
  overflow: hidden;
}
.theme--dark .tz-auth-brand {
  background: #000000;
}
.theme--light .tz-auth-brand {
  background: #000000;
}

.tz-auth-brand-visual {
  position: relative;
  flex: 1 1 auto;
  width: 100%;
  height: 100%;
  min-height: 0;
  overflow: hidden;
  background: #000000;
}

/* ponytail: TV login pattern — CSS bg fallback + optional video; no <img> (no right-click save) */
.tz-auth-brand-visual__bg {
  position: absolute;
  inset: 0;
  z-index: 0;
  background-color: #000000;
  background-repeat: no-repeat;
  background-size: cover;
  background-position: center 58%;
  /* PNG fallback first; WebP (5120w) preferred where supported */
  background-image: url('/images/auth/auth-brand-hero.png?v=20260710i');
  background-image: -webkit-image-set(
    url('/images/auth/auth-brand-hero.webp?v=20260710i') type('image/webp'),
    url('/images/auth/auth-brand-hero.png?v=20260710i') type('image/png'));
  background-image: image-set(
    url('/images/auth/auth-brand-hero.webp?v=20260710i') type('image/webp'),
    url('/images/auth/auth-brand-hero.png?v=20260710i') type('image/png'));
}

.tz-auth-brand-visual__vignette {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background:
    linear-gradient(to right, #000000 0%, transparent 14%),
    linear-gradient(to left, #000000 0%, transparent 14%),
    linear-gradient(to bottom, #000000 0%, transparent 12%),
    linear-gradient(to top, #000000 0%, transparent 10%),
    radial-gradient(ellipse 72% 68% at 50% 50%, transparent 60%, rgba(0, 0, 0, 0.35) 82%, #000000 100%);
}

.tz-auth-brand-overlay {
  position: absolute;
  /* [UPDATE] 2026-07-10 — nudged tagline 60px lower total per design. */
  top: clamp(148px, calc(11vh + 60px), 188px);
  left: 0;
  right: 0;
  z-index: 2;
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 0 clamp(20px, 3vw, 40px);
  pointer-events: none;
  text-align: center;
  -webkit-user-select: none;
  user-select: none;
}

#page.font--jakarta .tz-auth-brand .tz-auth-brand-overlay__tagline {
  margin: 0;
  color: #ffffff;
  -webkit-text-fill-color: #ffffff;
  /* [UPDATE] 2026-07-10 — match the home hero tagline font stack/metrics. */
  font-family: 'Inter', 'Plus Jakarta Sans', sans-serif;
  font-size: 60px !important;
  font-weight: 800;
  line-height: 1.06;
  letter-spacing: -0.035em;
  text-shadow: 0 4px 22px rgba(0, 0, 0, 0.75);
  filter: drop-shadow(0 10px 28px rgba(0, 0, 0, 0.55));
  pointer-events: none;
  -webkit-user-select: none;
  user-select: none;
}

#page.font--jakarta .tz-auth-mobile-tagline {
  display: none;
  margin: 0;
  color: #ffffff;
  -webkit-text-fill-color: #ffffff;
  font-family: Plus Jakarta Sans, Inter, system-ui, sans-serif;
  font-size: 38px !important;
  font-weight: 800;
  line-height: 1.18;
  letter-spacing: -0.022em;
  text-shadow: 0 4px 16px rgba(0, 0, 0, 0.6);
  pointer-events: none;
  -webkit-user-select: none;
  user-select: none;
  text-align: center;
}

.tz-auth-brand-visual__fade {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 1;
  height: 22%;
  pointer-events: none;
  background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.45) 50%, #000000 100%);
}

/* Wider window → show more horizontal scene (natural cover behavior + focal nudge) */
@media (min-width: 1200px) {
  .tz-auth-brand-visual__bg { background-position: center 54%; }
}
@media (min-width: 1600px) {
  .tz-auth-brand-visual__bg { background-position: center 50%; }
}
@media (min-width: 2000px) {
  .tz-auth-brand-visual__bg { background-position: center 48%; }
}

@media (max-height: 820px) {
  .tz-auth-brand-visual__bg { background-position: center 62%; }
}
@media (max-height: 700px) {
  .tz-auth-brand-visual__bg { background-position: center 68%; }
}

@media (min-width: 960px) and (max-width: 1100px) {
  .tz-auth-brand-visual__bg { background-position: center 60%; }
}

/* Right form panel */
/* Right form panel — same vertical padding scheme as the left brand panel
   so both sides share the same true vertical centerline */
.tz-auth-form-panel {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 0;
  height: 100%;
  overflow-y: auto;
  padding: clamp(112px, 12vh, 144px) 32px clamp(60px, 8vh, 96px);
  width: 100%;
}
.tz-auth-form-panel .tz-auth-card {
  max-width: 600px;
  width: 100%;
}

@media (min-width: 960px) {
  .tz-auth-brand { display: flex; }
  .tz-auth-form-panel {
    max-width: 560px;
    flex-shrink: 0;
    padding-left: 48px;
    padding-right: 48px;
  }
}
@media (min-width: 1200px) {
  .tz-auth-form-panel { max-width: 620px; }
}
@media (min-width: 1400px) {
  .tz-auth-form-panel { max-width: 680px; }
}
@media (min-width: 1800px) {
  .tz-auth-form-panel { max-width: 740px; }
}

/* Small screen: single column centered */
@media (max-width: 959px) {
  .tz-auth-mobile-tagline {
    display: block;
    margin: 0 0 18px;
  }
  .tz-auth-form-panel {
    max-width: 520px;
    padding-left: 20px;
    padding-right: 20px;
  }
}

.tz-auth-card {
  border-radius: 12px;
  width: 100%;
}
.theme--dark .tz-auth-card {
  background: #000000;
  border: 1px solid rgba(255, 255, 255, 0.08);
}
.theme--light .tz-auth-card {
  background: #ffffff;
  border: 1px solid rgba(0, 0, 0, 0.1);
}

.tz-auth-card .register-page-form {
  padding: 2rem 1.5rem 1.75rem !important;
  position: relative;
  z-index: 1;
}
@media (min-width: 576px) {
  .tz-auth-card .register-page-form {
    padding: 2.5rem 2.25rem 2rem !important;
  }
}


.tz-auth-card .register-form-title {
  text-align: left !important;
  margin-bottom: 1.75rem !important;
}
.tz-auth-card .register-form-title h3 {
  font-size: 1.5rem !important;
}
.theme--dark .tz-auth-card .register-form-title h3 {
  color: #f4f4f6 !important;
  letter-spacing: -0.02em;
  line-height: 1.2 !important;
}
.theme--light .tz-auth-card .register-form-title h3 {
  color: #000000 !important;
}
.theme--dark .tz-auth-sub {
  color: rgba(255, 255, 255, 0.55) !important;
  font-size: 16px !important;
}
.theme--light .tz-auth-sub {
  color: #5c6370 !important;
  font-size: 16px !important;
}
.tz-auth-card .reset-password-link p {
  font-size: 16px !important;
}

.theme--dark .tz-auth-card .register-page-form p.input-header {
  color: rgba(255, 255, 255, 0.72) !important;
  font-size: 16px !important;
  font-weight: 400 !important;
}
.theme--light .tz-auth-card .register-page-form p.input-header {
  color: #3d4451 !important;
  font-size: 16px !important;
  font-weight: 400 !important;
}
.tz-auth-card .separator-line {
  font-size: 16px !important;
}
.theme--dark .tz-auth-card .form-data span,
.theme--light .tz-auth-card .form-data span {
  font-size: 14px !important;
}

.theme--dark .tz-auth-card .register-page-form .form-control {
  height: 52px !important;
  background-color: #181818 !important;
  border: 1px solid rgba(255, 255, 255, 0.1) !important;
  color: #e5e5e5 !important;
  border-radius: 10px !important;
  margin-bottom: 1.15rem !important;
  font-size: 16px !important;
}
.theme--dark .tz-auth-card .register-page-form .form-control:focus {
  border-color: rgba(255, 255, 255, 0.35) !important;
  box-shadow: none !important;
}
.theme--light .tz-auth-card .register-page-form .form-control {
  height: 52px !important;
  background-color: #f5f5f5 !important;
  border: 1px solid rgba(0, 0, 0, 0.1) !important;
  color: #000000 !important;
  border-radius: 10px !important;
  margin-bottom: 1.15rem !important;
  font-size: 16px !important;
}
.theme--light .tz-auth-card .register-page-form .form-control:focus {
  border-color: rgba(0, 0, 0, 0.4) !important;
  box-shadow: none !important;
}

.theme--dark .tz-auth-card .register-page-form .btn-google,
.theme--light .tz-auth-card .register-page-form .btn-google {
  font-size: 1rem !important;
  line-height: 1.3 !important;
  border-radius: 10px !important;
  min-height: 44px !important;
}
.theme--dark .tz-auth-card .register-page-form .btn-google {
  color: #e5e5e5 !important;
  background-color: #1e1e1e !important;
  border: 1px solid rgba(255, 255, 255, 0.12) !important;
}
.theme--dark .tz-auth-card .register-page-form .btn-google:hover {
  border-color: rgba(255, 255, 255, 0.25) !important;
  background-color: #2a2a2a !important;
}
.tz-auth-card .register-page-form .btn-google img {
  width: 18px !important;
  height: 18px !important;
}

#login.tz-auth-page .sign-in-form .btn.submit,
#signup.tz-auth-page .register-page-form .btn.submit {
  height: auto !important;
  margin-top: 12px !important;
}
#login.tz-auth-page .forgot-password-form .btn.submit {
  margin-top: 0 !important;
}
.tz-auth-card .register-page-form .btn.submit {
  width: 100% !important;
  border-radius: 10px !important;
  padding: 0.65rem 1rem !important;
  font-size: 1rem !important;
  font-weight: 400 !important;
  line-height: 1.35 !important;
  margin-top: 0.25rem;
}

/* Email OTP / 2FA / resend-verify panels use .btn-primary (auth.js).
   crocus-theme .btn { background: transparent } loads after bootstrap and
   strips the primary fill — invisible on light theme white card. */
/* [EXCEPTION] CTA buttons — white label on brand-blue background */
.tz-auth-card .btn.btn-primary {
  background-color: #2962ff !important;
  color: #ffffff !important;
  border-color: transparent !important;
  border-radius: 10px !important;
  font-size: 1rem !important;
  font-weight: 400 !important;
  line-height: 1.35 !important;
  padding: 0.65rem 1rem !important;
}
.tz-auth-card .btn.btn-primary:hover:not(:disabled),
.tz-auth-card .btn.btn-primary:focus-visible:not(:disabled) {
  background-color: #1e4dd6 !important;
  color: #ffffff !important;
  border-color: transparent !important;
}
.tz-auth-card .btn.btn-primary:disabled {
  background-color: rgba(41, 98, 255, 0.45) !important;
  color: #ffffff !important;
  opacity: 1 !important;
}

.theme--dark .tz-auth-card .separator-line {
  color: rgba(255, 255, 255, 0.45) !important;
}
.theme--light .tz-auth-card .separator-line {
  color: #6b7280 !important;
}

.theme--dark .tz-auth-card .form-data span {
  color: rgba(255, 255, 255, 0.5) !important;
  line-height: 1.5 !important;
}
.theme--dark .tz-auth-card .form-data span a {
  color: rgba(255, 255, 255, 0.85) !important;
  text-decoration: underline;
}
.theme--light .tz-auth-card .form-data span {
  color: #5c6370 !important;
}
.theme--light .tz-auth-card .form-data span a {
  color: #000000 !important;
  text-decoration: underline;
}

/* Login: in-card forgot password panel (no modal) */
.tz-auth-forgot-desc {
  margin-top: 0.25rem;
}
.tz-auth-forgot-actions {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}
.tz-auth-forgot-actions .btn {
  width: 100%;
}

/* Auth card: fix color--theme links (overridden by global #ffffff) */
.theme--dark .tz-auth-card a.color--theme,
.theme--dark .tz-auth-card .color--theme a {
  color: #aaaaaa !important;
}
.theme--dark .tz-auth-card a.color--theme:hover,
.theme--dark .tz-auth-card .color--theme a:hover {
  color: #ffffff !important;
}
.theme--light .tz-auth-card a.color--theme,
.theme--light .tz-auth-card .color--theme a {
  color: #333333 !important;
}
.theme--light .tz-auth-card a.color--theme:hover,
.theme--light .tz-auth-card .color--theme a:hover {
  color: #000000 !important;
}

.tz-auth-card .wrap-input .btn-show-pass {
  top: 50%;
  transform: translateY(-50%);
  height: auto;
  display: flex;
  align-items: center;
}

#verify-email .spinner-border,
#verify-alert-email .spinner-border {
  color: #ffffff;
  border-width: 2px;
}
.theme--light #verify-email .spinner-border,
.theme--light #verify-alert-email .spinner-border {
  color: #333333;
}

/* Scrollbar — front pages only. Chart page body has no theme class, unaffected.
 * Chrome: page scrollbar lives on <html>; sub-element scrollbars hidden until hover.
 * Firefox: scrollbar-color on html for page bar; sub-elements use * selector. */

/* Dark theme scrollbar colors */
body.theme--dark { --sb-page: #555560; --sb-page-hov: #6e6e7a; }
/* Light theme scrollbar colors */
body.theme--light { --sb-page: #b0b0bc; --sb-page-hov: #8a8a98; }

/* Sub-element scrollbars: hidden until hover.
 * CRITICAL: standard `scrollbar-color` overrides ::-webkit-scrollbar in Chrome 145+,
 * so we MUST exclude html/body from the * selector — otherwise transparent value
 * here would void all html/body scrollbar styles below. */
*:not(html):not(body)::-webkit-scrollbar            { width: 4px !important; height: 4px !important; }
*:not(html):not(body)::-webkit-scrollbar-track      { background: transparent !important; }
*:not(html):not(body)::-webkit-scrollbar-thumb      { background: transparent !important; border-radius: 999px !important; transition: background .18s ease !important; }
*:not(html):not(body)::-webkit-scrollbar-button,
*:not(html):not(body)::-webkit-scrollbar-corner     { display: none !important; width: 0 !important; height: 0 !important; }
body.theme--dark *:not(html):not(body):hover::-webkit-scrollbar-thumb,
body.theme--light *:not(html):not(body):hover::-webkit-scrollbar-thumb  { background: rgba(120,120,130,0.6) !important; }
body.theme--dark *:not(html):not(body)::-webkit-scrollbar-thumb:hover,
body.theme--light *:not(html):not(body)::-webkit-scrollbar-thumb:hover  { background: rgba(150,150,160,0.85) !important; }
*:not(html):not(body) { scrollbar-width: thin; scrollbar-color: transparent transparent; }
body.theme--dark *:not(html):not(body):hover,
body.theme--light *:not(html):not(body):hover { scrollbar-color: rgba(120,120,130,0.6) transparent; }

/* Page-level scrollbar on html/body — uses standard scrollbar-color (Chrome 145+ priority).
 * Force overflow-y:scroll so browser always shows a real (non-overlay) scrollbar. */
html { overflow-y: scroll; scrollbar-width: thin; }
body.theme--dark, html.theme--dark, html:has(body.theme--dark)  { scrollbar-color: #6e6e7a transparent; }
body.theme--light, html.theme--light, html:has(body.theme--light) { scrollbar-color: #b0b0bc transparent; }
/* Webkit fallback (older Chrome) */
html::-webkit-scrollbar         { width: 8px !important; }
html::-webkit-scrollbar-track   { background: transparent !important; }
html::-webkit-scrollbar-thumb   { background: #6e6e7a !important; border-radius: 999px !important; }
html::-webkit-scrollbar-thumb:hover { background: #8a8a98 !important; }
body.theme--light html::-webkit-scrollbar-thumb,
html:has(body.theme--light)::-webkit-scrollbar-thumb { background: #b0b0bc !important; }

/* ── TT home landing (ti · #tt-home-landing / .tt-ti-landing) ───────────────
 * [UPDATE] 2026-04-29 — palette aligned with Chart page (app.css):
 *   bg #141414/#fff · sub #999/#666 · main #fff/#000 · border #1e1e1e/#e8e8e8
 * [UPDATE] 2026-05-12 — Hero is bare: no backdrop image, no copy panel.
 *   Section is a flat #000 band that contains only the product screenshot card
 *   (.tt-ti-landing__visual) and the bottom stats bar (.tt-ti-landing__bar).
 */
.tt-ti-landing {
  background: var(--tt-bg-0, #000000);
  /* min-height: full viewport — content may grow vertically on shorter screens */
  min-height: 100vh;
  min-height: 100svh;
  display: flex;
  flex-direction: column;
  position: relative;
  overflow: hidden;
  /* Overrides theme/responsive #tt-home-landing padding-top for TZ layout */
  padding-top: 0;
  padding-bottom: 0;
}

/* [FIX] 2026-05-14 (v4) — per user requirement, LANDING section is locked
 * to the brand-night surface in ALL themes. Theme toggle no longer flips
 * background or text colour inside #tt-home-landing. This re-locks the
 * surface variables so any descendant rule reading var(--tt-fg-0) /
 * var(--tt-bg-0) stays on the dark palette in light theme too. */
body.theme--light .tt-ti-landing {
  background: #000000 !important;
  --tt-bg-0: #000000;
  --tt-fg-0: #d0d0d0;
  --tt-fg-1: #cccccc;
  --tt-line: #1e1e1e;
}
body.theme--light .tt-ti-landing h1,
body.theme--light .tt-ti-landing h2,
body.theme--light .tt-ti-landing h3,
body.theme--light .tt-ti-landing h4,
body.theme--light .tt-ti-landing h5,
body.theme--light .tt-ti-landing h6,
body.theme--light .tt-ti-landing p,
body.theme--light .tt-ti-landing span,
body.theme--light .tt-ti-landing a {
  color: var(--tt-fg-0) !important;
}

/* split: software shot + copy (see index.ejs .tt-ti-landing__main).
 * [UPDATE] 2026-05-12 — content sits tight against the header so the 80px
 * tagline anchors the hero; CTA still gets generous breathing room via
 * .tt-ti-landing__cta margin-top. */
.tt-ti-landing__main {
  flex: 1;
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: flex-start;
  width: 100%;
  padding-top: 0;
  margin-top: 0;
  padding-bottom: 0;
  box-sizing: border-box;
}

/* Desktop: same max-width + horizontal padding as .wsmainwp / .container (logo column start). */
@media (min-width: 992px) {
  .tt-ti-landing__main-body,
  .tt-ti-landing__bar-inner {
    max-width: 1280px !important;
    margin-left: auto !important;
    margin-right: auto !important;
    padding-left: max(40px, env(safe-area-inset-left)) !important;
    padding-right: 40px !important;
    box-sizing: border-box !important;
  }
}
@media (min-width: 1200px) {
  .tt-ti-landing__main-body,
  .tt-ti-landing__bar-inner {
    max-width: 1600px !important;
    padding-left: max(48px, env(safe-area-inset-left)) !important;
    padding-right: 48px !important;
  }
}
@media (min-width: 1400px) {
  .tt-ti-landing__main-body,
  .tt-ti-landing__bar-inner {
    max-width: 1800px !important;
    padding-left: max(56px, env(safe-area-inset-left)) !important;
    padding-right: 56px !important;
  }
}
@media (min-width: 1800px) {
  .tt-ti-landing__main-body,
  .tt-ti-landing__bar-inner {
    max-width: 2200px !important;
    padding-left: max(64px, env(safe-area-inset-left)) !important;
    padding-right: 64px !important;
  }
}
@media (min-width: 2200px) {
  .tt-ti-landing__main-body,
  .tt-ti-landing__bar-inner {
    max-width: 2800px !important;
    padding-left: max(80px, env(safe-area-inset-left)) !important;
    padding-right: 80px !important;
  }
}

/* Desktop: screenshot width cap relative to grid cell */
@media (min-width: 992px) {
  .tt-ti-landing__shot-stack {
    max-width: 100%;
    width: 100%;
  }
}

/* Product shot: front-facing card + recessed plate (no angled perspective).
 * [UPDATE] 2026-05-12 — width tightened (visual+plate read smaller and more
 * focused now that the hero contains only the screenshot card). */
.tt-ti-landing__visual {
  /* [UPDATE] 2026-05-13 — element changed from <div> to <a> (clickable
     screenshot → /app). Force block-level flex layout and suppress the
     browser default <a> styling so the visual treatment is identical to
     the previous div, while the entire screenshot card becomes a single
     keyboard-focusable hit target. */
  text-decoration: none !important;
  color: inherit !important;
  cursor: pointer;
  position: relative;
  display: flex;
  justify-content: center;
  align-items: flex-start;
  padding-right: 0;
  margin-right: 0;
  min-width: 0;
  width: 100%;
  max-width: min(1240px, 96%);
  margin-left: auto;
  margin-right: auto;
  margin-top: -10px;
}

.tt-ti-landing__shot-stack {
  position: relative;
  width: 100%;
  max-width: none;
  padding-bottom: 16px;
  box-sizing: border-box;
  /* Allow shooting-star pseudo-elements to spill outside the card on both
   * sides without being clipped. */
  overflow: visible;
}

/* Static aurora ribbons: two heavily blurred multi-stop colour fields that
 * spill outside the screenshot card on the left and right. Pure decoration —
 * no animation, no JS, no extra DOM.
 *
 * Recipe for "richer + smoother":
 *   - more layers (5 radial blobs per side at varied scale & position) build
 *     organic colour temperature transitions instead of a single solid blob
 *   - each blob's colour spans the full nebula palette family (cobalt /
 *     violet / magenta / amber / cyan accent) so neighbours blend optically
 *   - heavier blur (72px) + saturate(1.15) gives the smooth gaseous feel
 *   - vertical mask fades the top and bottom 20% to nothing → ribbons feel
 *     like they emerge from and dissolve into the dark void
 *   - z-index 0 keeps them behind the screenshot frame; pointer-events:none
 */
.tt-ti-landing__shot-stack::before,
.tt-ti-landing__shot-stack::after {
  content: "";
  position: absolute;
  top: -10%;
  bottom: -10%;
  width: clamp(180px, 22vw, 320px);
  z-index: 0;
  pointer-events: none;
  filter: blur(48px) saturate(1.05);
  opacity: 0.85;
}

/* Left ribbon — cobalt + violet, anchored just outside the card's left edge.
 * Multiple radial-gradients stacked vertically build a wavy aurora silhouette. */
.tt-ti-landing__shot-stack::before {
  left: clamp(-260px, -16vw, -160px);
  background:
    radial-gradient(60% 30% at 60% 18%, rgba(91, 140, 255, 0.85), transparent 70%),
    radial-gradient(70% 28% at 40% 48%, rgba(123, 61, 245, 0.85), transparent 70%),
    radial-gradient(60% 32% at 65% 78%, rgba(41, 98, 255, 0.70),  transparent 70%);
}

/* Right ribbon — magenta + amber, anchored just outside the card's right edge. */
.tt-ti-landing__shot-stack::after {
  right: clamp(-260px, -16vw, -160px);
  background:
    radial-gradient(60% 30% at 40% 22%, rgba(232, 76, 184, 0.12), transparent 70%),
    radial-gradient(70% 28% at 60% 52%, rgba(123, 61, 245, 0.65), transparent 70%),
    radial-gradient(60% 32% at 35% 80%, rgba(255, 154, 60, 0.18),  transparent 70%);
}

@media (max-width: 991px) {
  /* On tablets/phones the card already takes nearly all the width; the
   * ribbons would crowd the screenshot, so collapse them. */
  .tt-ti-landing__shot-stack::before,
  .tt-ti-landing__shot-stack::after {
    display: none;
  }
}

.tt-ti-landing__shot-plate {
  position: absolute;
  pointer-events: none;
  border-radius: var(--tt-radius);
}

/* rear plate: wider rear card + nebula rim glow.
 * [UPDATE] 2026-05-12 — wider reach, brighter default state, multi-hue glow:
 *   left → cobalt blue, top → violet, right → magenta, bottom → amber. The
 *   colours mix optically into a "nebula" wash without tinting the global
 *   landing background. Hover keeps the same hues but lifts intensity. */
.tt-ti-landing__shot-plate--rear {
  z-index: 0;
  top: clamp(8px, 1.3vw, 14px);
  left: clamp(-58px, -7.4vw, -28px);
  right: clamp(-58px, -7.4vw, -28px);
  bottom: clamp(-8px, -1vw, -2px);
  width: auto;
  height: auto;
  box-sizing: border-box;
  background:
    radial-gradient(60% 90% at 0% 50%,    rgba(41, 98, 255, 0.22), transparent 70%),
    radial-gradient(60% 80% at 50% 0%,    rgba(123, 61, 245, 0.20), transparent 70%),
    radial-gradient(60% 90% at 100% 50%,  rgba(232, 76, 184, 0.18), transparent 70%),
    radial-gradient(60% 80% at 50% 100%,  rgba(255, 154, 60, 0.04), transparent 70%),
    linear-gradient(180deg, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0));
  border: 1px solid rgba(123, 61, 245, 0.55);
  box-shadow:
    0 0 0 1px rgba(41, 98, 255, 0.32),
    0 0 36px rgba(41, 98, 255, 0.55),
    0 0 64px rgba(123, 61, 245, 0.42),
    0 0 110px rgba(232, 76, 184, 0.10),
    0 0 160px rgba(255, 154, 60, 0.12),
    inset 0 1px 0 rgba(255, 255, 255, 0.18),
    0 26px 48px -16px rgba(0, 0, 0, 0.6);
  opacity: 0.92;
  transform: translateY(14px);
  transition:
    transform 0.35s ease,
    opacity 0.35s ease,
    border-color 0.35s ease,
    box-shadow 0.45s ease;
}

body.theme--light .tt-ti-landing__shot-plate--rear {
  /* Same nebula rim glow as dark theme (product shot card lives only on homepage). */
  background:
    radial-gradient(60% 90% at 0% 50%,    rgba(41, 98, 255, 0.22), transparent 70%),
    radial-gradient(60% 80% at 50% 0%,    rgba(123, 61, 245, 0.20), transparent 70%),
    radial-gradient(60% 90% at 100% 50%,  rgba(232, 76, 184, 0.18), transparent 70%),
    radial-gradient(60% 80% at 50% 100%,  rgba(255, 154, 60, 0.04), transparent 70%),
    linear-gradient(180deg, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0));
  border-color: rgba(123, 61, 245, 0.55);
  box-shadow:
    0 0 0 1px rgba(41, 98, 255, 0.32),
    0 0 36px rgba(41, 98, 255, 0.55),
    0 0 64px rgba(123, 61, 245, 0.42),
    0 0 110px rgba(232, 76, 184, 0.10),
    0 0 160px rgba(255, 154, 60, 0.12),
    inset 0 1px 0 rgba(255, 255, 255, 0.18),
    0 26px 48px -16px rgba(0, 0, 0, 0.6);
}

.tt-ti-landing__shot-frame {
  position: relative;
  z-index: 1;
  border-radius: var(--tt-radius);
  overflow: hidden;
  isolation: isolate;
  box-sizing: border-box;
  border: 1px solid var(--tt-line);
  transform: translateY(0);
  transition: transform 0.35s ease, box-shadow 0.35s ease;
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.06) inset,
    0 32px 64px -16px rgba(0, 0, 0, 0.7),
    0 14px 24px -8px rgba(0, 0, 0, 0.45);
}

/* Landing 锁定黑底：light 主题 shot-frame 阴影与 dark 一致 */
body.theme--light .tt-ti-landing__shot-frame {
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.06) inset,
    0 32px 64px -16px rgba(0, 0, 0, 0.7),
    0 14px 24px -8px rgba(0, 0, 0, 0.45);
}

@media (hover: hover) and (pointer: fine) {
  .tt-ti-landing__visual:hover .tt-ti-landing__shot-frame {
    transform: translateY(-6px);
    box-shadow:
      0 1px 0 rgba(255, 255, 255, 0.07) inset,
      0 44px 88px -20px rgba(0, 0, 0, 0.75),
      0 22px 36px -10px rgba(0, 0, 0, 0.5);
  }

  body.theme--light .tt-ti-landing__visual:hover .tt-ti-landing__shot-frame {
    box-shadow:
      0 1px 0 rgba(255, 255, 255, 0.07) inset,
      0 44px 88px -20px rgba(0, 0, 0, 0.75),
      0 22px 36px -10px rgba(0, 0, 0, 0.5);
  }

  .tt-ti-landing__visual:hover .tt-ti-landing__shot-plate--rear,
  body.theme--light .tt-ti-landing__visual:hover .tt-ti-landing__shot-plate--rear {
    transform: translateY(16px);
    opacity: 1;
    border-color: rgba(232, 76, 184, 0.28);
    box-shadow:
      0 0 0 1px rgba(41, 98, 255, 0.45),
      0 0 48px rgba(41, 98, 255, 0.72),
      0 0 84px rgba(123, 61, 245, 0.55),
      0 0 140px rgba(232, 76, 184, 0.14),
      0 0 200px rgba(255, 154, 60, 0.06),
      inset 0 1px 0 rgba(255, 255, 255, 0.24),
      0 32px 56px -14px rgba(0, 0, 0, 0.55);
  }
}

.tt-ti-landing__shot-img {
  display: block;
  width: 100%;
  height: auto;
  vertical-align: top;
}

/* [ADD] 2026-05-12 — Hero tagline above the workspace screenshot.
 * [EXCEPTION] color #ffffff — hero sits on dark nebula/astronaut imagery
 *   regardless of site theme; must not flip with --tt-fg-0 on theme toggle.
 * [EXCEPTION] 2026-05-12 — font-size 80px / 56px / 36px is OUTSIDE the
 *   {12,14,16,18,20,22} body-text whitelist in web_app_styling.mdc.
 *   User explicitly authorised the override for this single hero display
 *   element ("使用 80PX, 不管约束"). Rule scope (typography on home/aggregation
 *   pages) is otherwise still enforced — do NOT propagate this size to other
 *   selectors. WEB-320 mistakenly clamped these to 22px; restored 2026-08-30. */
/* ID selector beats every theme/responsive `h2 { ... }` rule on the cascade. */
#tt-home-landing .tt-ti-landing__hero-top .tt-ti-landing__hero-copy {
  position: absolute;
  left: 50%;
  top: clamp(120px, 28vh, 420px);
  transform: translateX(-50%);
  display: flex;
  flex-direction: column;
  align-items: center;
  /* [FIX] 2026-07-10 — never exceed viewport: long translations (RU/DE) were
   * forced single-line by `nowrap` + `max-content` and overflowed the screen.
   * Cap width to the viewport and let long copy wrap; short EN stays 1 line. */
  width: auto;
  max-width: min(1100px, 92vw);
  margin: 0;
  z-index: 2;
  pointer-events: none;
}
#tt-home-landing .tt-ti-landing__hero-top h2#tt-home-tagline.tt-ti-landing__tagline {
  position: static;
  left: auto;
  top: auto;
  transform: none;
  width: auto;
  max-width: min(1100px, 92vw);
  margin: 0;
  pointer-events: none;
  font-family: 'Inter', 'Plus Jakarta Sans', sans-serif;
  /* [EXCEPTION] hero display tagline — product-authorized 80/56/36px (see block comment above). */
  font-size: 80px;
  font-weight: 800;
  line-height: 1.06;
  letter-spacing: -0.035em;
  /* [EXCEPTION] hero tagline on dark imagery — always white, not --tt-fg-0. */
  color: #ffffff;
  white-space: normal;
  overflow-wrap: break-word;
  text-align: center;
  text-shadow:
    0 2px 18px rgba(0, 0, 0, 0.55),
    0 1px 4px rgba(0, 0, 0, 0.45);
}
@media (max-width: 1279.98px) {
  #tt-home-landing .tt-ti-landing__hero-top .tt-ti-landing__hero-copy {
    top: clamp(100px, 26vh, 396px);
  }
}
@media (max-width: 991px) {
  #tt-home-landing .tt-ti-landing__hero-top h2#tt-home-tagline.tt-ti-landing__tagline {
    /* [EXCEPTION] hero display tagline tablet — product-authorized 56px. */
    font-size: 56px;
    line-height: 1.08;
    white-space: normal;
  }
}
@media (max-width: 575.98px) {
  #tt-home-landing .tt-ti-landing__hero-top .tt-ti-landing__hero-copy {
    top: clamp(88px, 22vh, 300px);
  }
  #tt-home-landing .tt-ti-landing__hero-top h2#tt-home-tagline.tt-ti-landing__tagline {
    /* [EXCEPTION] hero display tagline mobile — product-authorized 36px. */
    font-size: 36px;
    line-height: 1.12;
  }
}

/* [ADD] 2026-05-12 — Hero CTA below the workspace screenshot.
 * Rectangular pill with two diagonal chamfer corners (top-left + bottom-right)
 * via clip-path — gives a hard-edged sci-fi look that pairs with the nebula
 * glow from .tt-ti-landing__shot-plate--rear. The clip-path hides the regular
 * border, so a second filled element (::before) paints a 1px coloured edge by
 * sitting behind the foreground content. Colours used here are decorative
 * (background / box-shadow / border) and exempt from the body-text rule. */
/* CTA: a high-conviction primary button.
 * Visual recipe (kept deliberately simple after several over-designed iterations):
 *   - vertical gradient (#3b6dff → #2354dd) so the body has dimension under
 *     the dark hero without looking flat
 *   - 8px radius reads as a modern button (TradingView/Stripe scale)
 *   - inner top-edge highlight (1px white inset) + inner bottom shadow gives
 *     the surface a subtle bevel
 *   - outer blue glow (drop-shadow) + soft drop shadow grounds the button
 *   - hover lifts +2px, deepens shadow, slightly brightens the gradient
 *   - active sinks +1px so click feels physical
 *   - focus-visible exposes a high-contrast white ring for keyboard users
 */
@media (prefers-reduced-motion: reduce) {
  .tt-ti-landing__shot-frame,
  .tt-ti-landing__shot-plate--rear {
    transition: none;
  }

  .tt-ti-landing__visual:hover .tt-ti-landing__shot-frame {
    transform: none;
  }

  .tt-ti-landing__visual:hover .tt-ti-landing__shot-plate--rear {
    transform: translateY(14px);
    opacity: 0.66;
  }

  body.theme--light .tt-ti-landing__visual:hover .tt-ti-landing__shot-plate--rear {
    transform: translateY(14px);
  }
}

/* [REMOVED] 2026-05-12 — download/platform pills (.tt-ti-landing__downloads,
 *   .tt-ti-landing__dl-group, .tt-ti-landing__platform-*) removed by product. The
 *   client-download row is now exclusively on /downloads. */

/* bottom stats bar — margin-top: auto pins it to second-screen bottom */
.tt-ti-landing__bar {
  margin-top: auto;
  width: 100%;
  position: relative;
  z-index: 1;
  border-top: 1px solid var(--tt-line, #0a0a0a);
  background: var(--tt-bg-0, #000000);
}
body.theme--light .tt-ti-landing__bar {
  border-top-color: #1e1e1e !important;
  background: #000000 !important;
}

.tt-ti-landing__bar-inner {
  width: 100%;
  height: 64px;
  display: flex;
  align-items: center;
  gap: 0;
}

.tt-ti-landing__stat {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
  padding: 0 32px;
}
.tt-ti-landing__stat:first-child { padding-left: 0; }

.tt-ti-landing__stat-num {
  font-size: 18px;
  font-weight: 700;
  /* [EXCEPTION] dark strip on landing — always white on #000 bar */
  color: #ffffff;
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.01em;
  line-height: 1;
  white-space: nowrap;
}

.tt-ti-landing__stat-lbl {
  font-size: 12px;
  /* [EXCEPTION] dark strip on landing — always white on #000 bar */
  color: #ffffff;
  opacity: 0.72;
  font-weight: 500;
  white-space: nowrap;
}

.tt-ti-landing__bar-sep {
  width: 1px;
  height: 28px;
  background: var(--tt-line, #0a0a0a);
  flex-shrink: 0;
}
body.theme--light .tt-ti-landing__bar-sep { background: #1e1e1e !important; }

@media (max-width: 1199px) {
  .tt-ti-landing__stat { padding: 0 20px; }
  /* [FIX] 2026-05-13 — Was `gap: 18px clamp(40px, 5vw, 72px)`. The 18px
     row-gap inside the column flex container forced an 18px empty band
     between the screenshot and the "Explore the App" CTA, so the
     button visibly detached from the image the instant the viewport
     crossed 1199px (≥1200px had no gap — button sat tight under the
     screenshot like a pedestal — and ≤1199px slammed in a row gap,
     producing the jump the user reported). The CTA already controls
     its distance from the image via its own scaled `margin-top`
     (≈46px @ scale=1, shrinks with viewport); the container row-gap
     was double-counting that spacing. Reason this was originally set:
     a leftover from when .tt-ti-landing__main was a 2-column grid
     (screenshot left, copy right) that needed both row and column
     gaps; the layout has since been collapsed to a single column at
     all sizes so row-gap is just dead weight that breaks the pedestal
     silhouette. Change: keep `padding-top` / `padding-bottom` (those
     control the section's top/bottom breathing room — independent of
     image-to-CTA distance) but drop the gap shorthand. */
  .tt-ti-landing__main-body {
    padding-top: 48px;
    padding-bottom: 0;
  }
}

@media (max-width: 991px) {
  .tt-ti-landing__bar-inner {
    margin-left: auto;
    margin-right: auto;
    padding-left: max(20px, env(safe-area-inset-left));
    padding-right: max(20px, env(safe-area-inset-right));
  }
  .tt-ti-landing__stat { padding: 0 16px; }
  .tt-ti-landing__main-body {
    grid-template-columns: 1fr;
    align-items: center;
    margin-left: auto;
    margin-right: auto;
    padding-top: 48px;
    padding-bottom: 0;
    padding-left: max(18px, env(safe-area-inset-left));
    padding-right: 18px;
    /* [FIX] 2026-05-13 — Was `gap: 18px`. Same pedestal-break bug as the
       1199px breakpoint: a row-gap inside the column flex container
       was forcing 18px of empty space between the screenshot and the
       CTA, splitting the visual "image-sits-on-button" silhouette.
       The CTA's own scaled `margin-top` already provides the right
       spacing; container gap would double-count it. Tagline-to-image
       spacing is independently governed by the tagline's own
       `margin-bottom: clamp(56px, 6vw, 84px)` so removing the gap
       does NOT collapse the tagline-to-image distance — verified by
       reading `h2#tt-home-tagline.tt-ti-landing__tagline { margin: 24px
       auto clamp(56px, 6vw, 84px) }` earlier in this file. */
    text-align: center;
  }
  .tt-ti-landing__visual {
    justify-content: center;
    padding-right: 0;
    margin-right: 0;
  }
  /* [UPDATE] 2026-05-13 — Removed the previous `max-width: min(720px, 96vw)`
     ceiling on the screenshot stack below 992px. Reason: the CTA below the
     screenshot tracks `96vw / 1240` to stay visually proportional to the
     workspace image (see .tt-ti-landing__cta). If the image gets clamped
     to 720px at viewport 800–991 while the CTA keeps shrinking with vw,
     the desktop-authored image-to-CTA size ratio breaks. Letting the
     screenshot follow the same `min(1240px, 96%)` rule as on desktop
     keeps the entire hero stack visually congruent across the full
     viewport range. The screenshot's intrinsic 3299x1885 PNG is still
     downscaled crisply by the browser at any width. */
  .tt-ti-landing__shot-stack {
    margin: 0 auto;
  }
  .tt-ti-landing__shot-frame {
    transform: translateY(0);
  }
  .tt-ti-landing__shot-plate--rear {
    left: clamp(-34px, -7.4vw, -18px);
    right: clamp(-34px, -7.4vw, -18px);
    top: clamp(7px, 1.8vw, 12px);
    /* [FIX] 2026-05-13 — was `clamp(-6px, -1.1vw, -2px)`. At ≤991 the
       rear-plate's downward extension shrank from 8px (desktop ≥992,
       `clamp(-8px, -1vw, -2px)`) to 6px — a 25% loss of the purple
       nebula "pedestal" glow that visually anchors the CTA to the
       screenshot. User saw this as the button "detaching" from the
       image at exactly the 992→991 crossover (the gap to the CTA
       suddenly grew 2px AND the connecting glow shrank 2px =
       cumulative ~4px detachment signal). Pulling the bottom value
       back to -8px matches the desktop baseline so the pedestal stays
       continuous across the breakpoint. Left/right/top remain
       smaller because they only control sideways/upward spillover
       which doesn't affect the image-to-CTA bond. */
    bottom: clamp(-8px, -1vw, -2px);
    transform: translateY(14px);
    opacity: 0.62;
  }
}

@media (max-width: 767px) {
  .tt-ti-landing__main-body {
    padding-top: 46px;
    padding-bottom: 0;
    padding-left: max(14px, env(safe-area-inset-left));
    padding-right: max(14px, env(safe-area-inset-right));
  }
  .tt-ti-landing__shot-frame {
    transform: translateY(0);
  }
  .tt-ti-landing__shot-plate--rear {
    left: clamp(-24px, -7vw, -14px);
    right: clamp(-24px, -7vw, -14px);
    top: clamp(6px, 2.2vw, 10px);
    /* [FIX] 2026-05-13 — was `clamp(-4px, -1.2vw, -1px)`. Same
       pedestal-detachment fix as the 991 breakpoint: keeping bottom
       at -8px (matching desktop ≥992) makes the purple nebula glow
       continue to extend visibly below the screenshot frame on
       phones, preserving the "image-on-button pedestal" silhouette
       at every viewport instead of having the connecting glow
       evaporate as the user crosses 768→767. */
    bottom: clamp(-8px, -1vw, -2px);
    transform: translateY(14px);
  }
  .tt-ti-landing__stat--secondary { display: none; }
  .tt-ti-landing__bar-sep--secondary { display: none; }
  .tt-ti-landing__bar-inner {
    height: auto;
    display: flex;
    flex-direction: row;
    justify-content: space-between;
    padding: 14px 20px;
    gap: 0;
  }
  .tt-ti-landing__bar-sep { display: none; }
  .tt-ti-landing__stat {
    flex: 1;
    padding: 0;
    align-items: center;
    /* [UPDATE 2026-05-11] right divider synced #1e1e1e -> #0a0a0a. */
    border-right: 1px solid var(--tt-line, #0a0a0a);
  }
  .tt-ti-landing__stat:last-of-type { border-right: none; }
  .tt-ti-landing__stat-num { font-size: 16px; }
  /* [UPDATE] 2026-05-11 — whitelist min 12px (was 10px). */
  .tt-ti-landing__stat-lbl { font-size: 12px; }
}
body.theme--light .tt-ti-landing__bar-inner .tt-ti-landing__stat { border-right-color: #0a0a0a !important; }

/* [ADD v2-footer] 2026-05-11 — Corporate static-page body typography
 *   shared by /about, /blog and /disclaimer. Keeps headings on the
 *   12/14/16/18/22/28 size whitelist (web_app_styling.mdc — these
 *   pages are NOT in the rule's exclusion list, so they must comply).
 *   Color is `--tt-fg-0` (the only allowed body color), de-emphasis is
 *   achieved with opacity on auxiliary lines. */
.corp-page .corp-page__body {
  font-size: 16px;
  line-height: 1.7;
  color: var(--tt-fg-0);
}
.corp-page .corp-page__body p { margin: 0 0 14px; }
.corp-page .corp-page__body h2 {
  font-size: 22px;
  line-height: 1.3;
  margin: 28px 0 10px;
  color: var(--tt-fg-0);
}
.corp-page .corp-page__body ul {
  margin: 0 0 14px;
  padding-left: 22px;
}
.corp-page .corp-page__body ul li { margin: 0 0 6px; }
.corp-page .corp-page__body ul li p { margin: 0; }
.corp-page .corp-page__body a {
  color: var(--tt-fg-0);
  text-decoration: underline;
}
.corp-page .corp-page__body a:hover { opacity: 0.75; }
.corp-page .corp-page__sub {
  font-size: 18px;
  line-height: 1.6;
  color: var(--tt-fg-0);
  opacity: 0.7;
}
.corp-page .corp-page__note {
  font-size: 12px;
  line-height: 1.6;
  color: var(--tt-fg-0);
  opacity: 0.65;
}
/* [ADD] 2026-05-11 — Corporate page hero title.
 * Replaces template's `.s-44` (44px out-of-whitelist) with the largest
 * allowed body size (28px) per web_app_styling.mdc. */
.corp-page .corp-page__title {
  font-size: 22px;
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--tt-fg-0);
  margin: 0;
  max-width: 100%;
  overflow-wrap: break-word;
  word-wrap: break-word;
  hyphens: auto;
}

/* [ADD] 2026-09-02 — Display-scale footer-linked corp hero titles.
 * Root cause: fixed 88px/56px overflowed on narrow viewports; #page { overflow:hidden }
 * (crocus-theme) clipped spill instead of wrapping. Fluid clamp + wrap guards below. */
.tt-faq,
.tt-legal,
.tt-glos,
#page.tt-newsroom,
#page.tt-about,
#page.tt-manifesto,
.tt-whats-new-page,
.tt-status-page {
  --tt-corp-hero-title-size: clamp(28px, 5.5vw + 0.75rem, 88px);
}

.corp-page .inner-page-hero .section-title {
  max-width: 100%;
  min-width: 0;
}

.tt-faq .corp-page .section-title .corp-page__title,
.tt-legal .corp-page .section-title .corp-page__title,
.tt-glos .corp-page .section-title .corp-page__title,
#page.tt-newsroom .corp-page .section-title .corp-page__title,
#page.tt-about .corp-page .section-title .corp-page__title,
#page.tt-manifesto .corp-page .section-title .corp-page__title,
.tt-wn-hero__title,
.tt-status-page-title {
  font-size: var(--tt-corp-hero-title-size, clamp(28px, 5.5vw + 0.75rem, 88px));
  line-height: 1.15;
  letter-spacing: -0.02em;
  font-weight: 700;
  max-width: 100%;
  overflow-wrap: break-word;
  word-wrap: break-word;
  hyphens: auto;
}
/* [ADD] 2026-05-11 — Acknowledgements list. Slight wider gap between
 * items than the default body ul, since each line cites a project +
 * license link and is information-dense. */
.corp-page .corp-page__list {
  margin: 0 0 18px 0;
  padding-left: 22px;
  list-style: disc;
}
.corp-page .corp-page__list li {
  margin: 0 0 8px 0;
  font-size: 14px;
  line-height: 1.65;
  color: var(--tt-fg-0);
}
.corp-page .corp-page__list li strong {
  font-weight: 600;
}
.corp-page .corp-page__list a {
  color: var(--tt-fg-0);
  text-decoration: underline;
}
.corp-page .corp-page__list a:hover {
  opacity: 0.75;
}
.corp-page .corp-page__body h3 {
  font-size: 18px;
  line-height: 1.4;
  margin: 22px 0 10px;
  color: var(--tt-fg-0);
}
.corp-page .corp-page__body code {
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  font-size: 14px;
  padding: 1px 6px;
  border-radius: 4px;
  border: 1px solid rgba(120, 123, 134, 0.25);
  background: transparent;
}

/* [FIX] 2026-05-14 (v2) — Mobile hamburger icon: full ☰ → ✕ rotation.
 * Reason: responsive.css L1491-1493 and L2889-2891 (loaded AFTER menu.css)
 * stomped on menu.css's correct X animation. responsive.css writes:
 *     .wsactive .wsanimated-arrow span:before { width: 28px; top: 0; }
 *     .wsactive .wsanimated-arrow span:after  { width: 28px; top: 0; }
 * but does NOT rotate them. Result: all three bars collapse to y=0
 * stacked horizontally — user sees "☰ + X overlaid" (actually 3 flat
 * bars on top of each other, no diagonal lines at all).
 * Change: re-apply the menu.css rotation with !important so it wins
 * the cascade race against responsive.css's incomplete rule. Also
 * unifies dark + light theme color (white on dark hero, slate on light)
 * and locks the close-state middle bar to transparent so the X is clean.
 *
 * [FIX] 2026-05-19 — light-theme hamburger color was #1a1a1a (dark grey)
 * but `.wsmobileheader` background is locked to #000000 in light theme
 * (see L1149). Dark icon on dark bg = invisible. Force white in BOTH
 * themes since the header bar is now black in both.
 *
 * [FIX] 2026-05-19 (v3) — User requested: hamburger icon must be ALWAYS
 * white, never tracking theme switches. Refactored selectors to NOT
 * depend on `.theme--light` / `.theme--dark` classes at all, so the
 * hamburger color is theme-agnostic by design. The `body` ancestor is
 * kept only to win the cascade against `responsive.css` (loaded after
 * this file) which sets `.theme--dark .wsanimated-arrow span { bg:
 * #aaaaaa }` at specificity 0,2,2 inside `(max-width: 991px)` — our
 * 0,2,3 + !important handily wins, regardless of which theme class is
 * present on body. Header bar (`.wsmobileheader`) is locked to black
 * in both themes (see L1149 and L862-866), so white is correct in
 * 100% of cases. */
@media (max-width: 1279px) {
  /* Close state — three horizontal bars, ALWAYS WHITE. The body prefix
   * boosts specificity to 0,2,3 to defeat responsive.css's
   * `.theme--dark .wsanimated-arrow span { background: #aaaaaa }`
   * (0,2,2) without relying on theme class matching. !important is
   * required because crocus-theme.css and other vendor sheets also
   * touch this property without media-query gating. */
  body #header .wsanimated-arrow span,
  body #header .wsanimated-arrow span::before,
  body #header .wsanimated-arrow span::after {
    background-color: #ffffff !important;
  }

  /* Open state — middle bar disappears, top/bottom rotate to ✕.
   * NOTE: menu.js attaches `.wsactive` to <body> itself (not a descendant),
   * so selectors must use `body.wsactive` (no space). The earlier draft
   * mistakenly used `body .wsactive` (descendant combinator), which never
   * matched because there is no `.wsactive` element inside <body>. */
  body.wsactive #header .wsanimated-arrow span {
    background-color: transparent !important;
  }
  body.wsactive #header .wsanimated-arrow span::before {
    top: 0 !important;
    bottom: auto !important;
    transform: rotate(45deg) !important;
    -webkit-transform: rotate(45deg) !important;
  }
  body.wsactive #header .wsanimated-arrow span::after {
    top: 0 !important;
    bottom: auto !important;
    transform: rotate(-45deg) !important;
    -webkit-transform: rotate(-45deg) !important;
  }
}

/* =====================================================================
   [UPDATE 2026-05-14] TT home landing (#tt-home-landing) — follows theme.
   Reason: prior LOCK (2026-05-11/12) forced #tt-home-landing to #000 in
   both themes. With site-wide theme toggle, light theme users saw the
   top of the page (hero block + transparent .tra-menu .wsmainfull on top)
   permanently render black even after switching to light, because the
   hero's #000 bled through the fixed navbar's transparent surface.
   Change: keep dark-theme hero unchanged (preserves brand-night feel),
   but paint the hero white-on-near-black-text in light theme so the
   entire viewport tracks body.theme--*. The Explore-stack visual stays
   centered with neutral chrome that works on either background.
   Scope: only #tt-home-landing (homepage hero) — does not affect chart
   page or marketing inner pages. */

/* --- Dark theme hero (preserves the original 2026-05-11 surface) --- */
body.theme--dark #tt-home-landing,
body.theme--dark #tt-home-landing.tt-ti-landing {
  background: #000000 !important;
  --tt-bg-0: #000000;
  --tt-fg-0: #d0d0d0;
  --tt-fg-1: #cccccc;
  --tt-fg-2: #787b86;
  --tt-line: #1e1e1e;
}
/* Dark stats strip — always white on #000 bar in every site theme. */
body.theme--light #tt-home-landing .tt-ti-landing__bar .tt-ti-landing__stat-num,
body.theme--dark #tt-home-landing .tt-ti-landing__bar .tt-ti-landing__stat-num,
body.theme--light #tt-home-landing .tt-ti-landing__bar .tt-ti-landing__stat-lbl,
body.theme--dark #tt-home-landing .tt-ti-landing__bar .tt-ti-landing__stat-lbl {
  /* [EXCEPTION] dark strip on landing — always white on #000 bar */
  color: #ffffff !important;
}
body.theme--light #tt-home-landing .tt-ti-landing__bar .tt-ti-landing__dl-btn,
body.theme--dark #tt-home-landing .tt-ti-landing__bar .tt-ti-landing__dl-btn {
  /* [EXCEPTION] dark strip on landing — always white on #000 bar */
  color: #ffffff !important;
}
body.theme--light #tt-home-landing .tz-btn--primary {
  background: #ffffff !important; color: #000000 !important; border-color: #ffffff !important;
}
body.theme--light #tt-home-landing .tz-btn--primary:hover {
  background: #cccccc !important; border-color: #cccccc !important; color: #000000 !important;
}
body.theme--light #tt-home-landing .tz-btn--ghost {
  background: transparent !important; color: #ffffff !important; border-color: #1e1e1e !important;
}
body.theme--light #tt-home-landing .tz-btn--ghost:hover {
  border-color: #ffffff !important; color: #ffffff !important;
}
body.theme--light #tt-home-landing .tt-ti-landing__bar {
  background: #000000 !important; border-top-color: #1e1e1e !important;
}
body.theme--light #tt-home-landing .tt-ti-landing__bar-sep { background: #1e1e1e !important; }
body.theme--light #tt-home-landing .tt-ti-landing__bar-inner .tt-ti-landing__stat {
  border-right-color: #1e1e1e !important;
}
/* Hero tagline stays white on dark nebula imagery in every site theme. */
body.theme--light #tt-home-landing #tt-home-tagline.tt-ti-landing__tagline,
body.theme--dark #tt-home-landing #tt-home-tagline.tt-ti-landing__tagline {
  /* [EXCEPTION] hero tagline — fixed white, independent of --tt-fg-0. */
  color: #ffffff !important;
}
/* Second-screen tagline + subtitle stay white on nebula imagery in every theme. */
body.theme--light #tt-home-landing #tt-home-second-screen h2.tt-ti-landing__second-tagline,
body.theme--dark #tt-home-landing #tt-home-second-screen h2.tt-ti-landing__second-tagline,
body.theme--light #tt-home-landing #tt-home-second-screen p.tt-ti-landing__second-subtitle,
body.theme--dark #tt-home-landing #tt-home-second-screen p.tt-ti-landing__second-subtitle {
  /* [EXCEPTION] second-screen hero copy — fixed white, independent of --tt-fg-0. */
  color: #ffffff !important;
}

/* =====================================================================
   [UPDATE 2026-07-31] Header scroll states (TradingView-style).
   Scope: all theme--dark / theme--light shell pages (home, apps, docs…).
   Chart uses dark-theme/light-theme and is excluded.
   Top (scroll=0): solid #000 navbar. Scrolled: transparent bar + top
   gradient scrim so nav text stays readable over page content. */
body.theme--dark #header .header-wrapper::before,
body.theme--light #header .header-wrapper::before {
  content: '';
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 150px;
  background: linear-gradient(
    180deg,
    rgba(0, 0, 0, 0.55) 0%,
    rgba(0, 0, 0, 0.28) 45%,
    rgba(0, 0, 0, 0) 100%
  );
  pointer-events: none;
  z-index: -1;
  opacity: 0;
  transition: opacity 450ms ease-in-out;
}
body.theme--dark #header:has(.wsmainfull.scroll) .header-wrapper::before,
body.theme--light #header:has(.wsmainfull.scroll) .header-wrapper::before {
  opacity: 1;
}
body.theme--dark #header .wsmainfull:not(.scroll),
body.theme--light #header .wsmainfull:not(.scroll) {
  background-color: #000000 !important;
  border-bottom: 1px solid #0a0a0a !important;
  box-shadow: none !important;
}
body.theme--dark #header:has(.wsmainfull.scroll) .wsmainfull.scroll,
body.theme--light #header:has(.wsmainfull.scroll) .wsmainfull.scroll {
  background-color: transparent !important;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border-bottom: none !important;
  box-shadow: none !important;
}
@media (max-width: 1279px) {
  body.theme--dark #header .wsmobileheader,
  body.theme--light #header .wsmobileheader {
    background-color: #000000 !important;
  }
  body.theme--dark #header:has(.wsmainfull.scroll) .wsmobileheader,
  body.theme--light #header:has(.wsmainfull.scroll) .wsmobileheader {
    background-color: transparent !important;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
}

body.theme--dark #tt-home-landing .tt-ti-landing__shot-frame {
  border-color: #1e1e1e !important;
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.06) inset,
    0 32px 64px -16px rgba(0, 0, 0, 0.7),
    0 14px 24px -8px rgba(0, 0, 0, 0.45) !important;
}
body.theme--light #tt-home-landing .tt-ti-landing__shot-frame {
  border-color: #1e1e1e !important;
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.06) inset,
    0 32px 64px -16px rgba(0, 0, 0, 0.7),
    0 14px 24px -8px rgba(0, 0, 0, 0.45) !important;
}
body.theme--dark #tt-home-landing .tt-ti-landing__shot-plate--rear {
  border-color: rgba(41, 98, 255, 0.48) !important;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0)) !important;
  box-shadow:
    0 0 0 1px rgba(41, 98, 255, 0.2) !important,
    0 0 32px rgba(41, 98, 255, 0.32) !important,
    0 0 64px rgba(41, 98, 255, 0.18) !important,
    0 0 112px rgba(41, 98, 255, 0.08) !important,
    inset 0 1px 0 rgba(255, 255, 255, 0.14) !important,
    0 22px 40px -14px rgba(0, 0, 0, 0.58) !important;
}
body.theme--dark #tt-home-landing .tt-ti-landing__visual:hover .tt-ti-landing__shot-plate--rear {
  border-color: rgba(41, 98, 255, 0.78) !important;
  opacity: 0.82 !important;
  box-shadow:
    0 0 0 1px rgba(41, 98, 255, 0.38) !important,
    0 0 42px rgba(41, 98, 255, 0.48) !important,
    0 0 88px rgba(41, 98, 255, 0.28) !important,
    0 0 160px rgba(41, 98, 255, 0.12) !important,
    inset 0 1px 0 rgba(255, 255, 255, 0.2) !important,
    0 28px 48px -14px rgba(0, 0, 0, 0.48) !important;
}

/* [FIX] 2026-05-14 (v6) — landing 区不跟随主题，light 主题下星云配色
   必须与 dark 完全一致，否则切到 light 时颜色被冲淡发白。 */
body.theme--light #tt-home-landing .tt-ti-landing__shot-plate--rear {
  border-color: rgba(41, 98, 255, 0.48) !important;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0)) !important;
  box-shadow:
    0 0 0 1px rgba(41, 98, 255, 0.2) !important,
    0 0 32px rgba(41, 98, 255, 0.32) !important,
    0 0 64px rgba(41, 98, 255, 0.18) !important,
    0 0 112px rgba(41, 98, 255, 0.08) !important,
    inset 0 1px 0 rgba(255, 255, 255, 0.14) !important,
    0 22px 40px -14px rgba(0, 0, 0, 0.58) !important;
}

body.theme--light #tt-home-landing .tt-ti-landing__visual:hover .tt-ti-landing__shot-plate--rear {
  border-color: rgba(41, 98, 255, 0.78) !important;
  opacity: 0.82 !important;
  box-shadow:
    0 0 0 1px rgba(41, 98, 255, 0.38) !important,
    0 0 42px rgba(41, 98, 255, 0.48) !important,
    0 0 88px rgba(41, 98, 255, 0.28) !important,
    0 0 160px rgba(41, 98, 255, 0.12) !important,
    inset 0 1px 0 rgba(255, 255, 255, 0.2) !important,
    0 28px 48px -14px rgba(0, 0, 0, 0.48) !important;
}

/* [ADD] 2026-05-12 — /pricing comparison table (single source of truth)
   Reason: previous 4-card layout duplicated every feature per tier and
           gave no clear way to see ✓ / ✗ across plans. Replaced with one
           comparison table — left column = full feature list, right four
           columns = plan availability per tier.
   v3 (2026-05-12): theme-aware text colours. pricing.ejs is excluded from
           tradeiz-home --tt-fg-* variables (those are scoped to .tt-home /
           .tt-agg only), so we drive colours from .theme--light / .theme--dark
           directly to guarantee both themes render readable text. */

/* [ADD] 2026-05-13 — /pricing top CTA card
   Reason: replaces the bottom pt-100 pb-100 banner-1 section (~260px tall
           with s-45 huge heading) with a compact top-of-page card that
           still hosts the primary CTA but lives above the comparison
           table rather than at the very bottom.
   Layout: panel spans full .container width; inner content uses
           justify-content: center so heading + CTA cluster sit in the
           middle of the card with comfortable side gutters instead of
           being pushed to the two edges via space-between.
   Visual: plain white (light) / subtle translucent (dark) background —
           no gradients or accent glow — neutral grey pill badges, single
           blue CTA button as the only colour accent, plus a small
           secondary "Compare plans →" link.
   Placement: above section-title, inside .inner-page-hero (180px top
           pad already provides breathing room below site header). */
/* Two-column horizontal layout: copy block on the left (heading + single-line
   lead with inline middot badge), CTA cluster on the right (button + small
   secondary link). Wide silhouette, single visual row — avoids the stubby
   stacked look. */
#pricing-1 .tt-pricing-topcta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 24px 56px;
  margin-bottom: 56px;
  padding: 28px 36px;
  border: 1px solid rgba(120, 123, 134, 0.20);
}
.theme--light #pricing-1 .tt-pricing-topcta {
  background: transparent;
  border-color: rgba(0, 0, 0, 0.18);
}
.theme--dark #pricing-1 .tt-pricing-topcta {
  background: transparent;
  border-color: rgba(255, 255, 255, 0.20);
}

#pricing-1 .tt-pricing-topcta__copy {
  flex: 1 1 auto;
  min-width: 0;
  max-width: 680px;
}
#pricing-1 .tt-pricing-topcta__title {
  margin: 0 0 12px 0;
  font-size: 22px;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--tt-fg-0);
}


/* Three-line value-prop list under the title. Uses a thin vertical
   accent bar instead of bullet dots so the points read as compact,
   on-brand statements without visual clutter. */
#pricing-1 .tt-pricing-topcta__points {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 6px;
}
#pricing-1 .tt-pricing-topcta__points li {
  position: relative;
  padding-left: 14px;
  font-size: 14px;
  font-weight: 500;
  line-height: 1.5;
  color: var(--tt-fg-0);
}
#pricing-1 .tt-pricing-topcta__points li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.45em;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: #2962ff;
}



#pricing-1 .tt-pricing-topcta__actions {
  flex: 0 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
}
#pricing-1 .tt-pricing-topcta__price {
  display: inline-flex;
  align-items: baseline;
  gap: 4px;
  font-size: 14px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  white-space: nowrap;
  line-height: 1;
  color: var(--tt-fg-0);
}


#pricing-1 .tt-pricing-topcta__price-zero {
  font-size: 22px;
  font-weight: 800;
  letter-spacing: -0.02em;
  line-height: 1;
  font-feature-settings: 'tnum' 1, 'lnum' 1;
}
#pricing-1 .tt-pricing-topcta__note {
  font-size: 12px;
  font-weight: 400;
  line-height: 1.3;
  letter-spacing: 0.01em;
  white-space: nowrap;
}
#pricing-1 .tt-pricing-topcta__note { color: var(--tt-fg-0); opacity: 0.62; }


@media (max-width: 767px) {
  #pricing-1 .tt-pricing-topcta {
    margin-bottom: 40px;
    padding: 24px 22px;
    gap: 20px;
  }
  #pricing-1 .tt-pricing-topcta__title { font-size: 22px; margin-bottom: 10px; }
  #pricing-1 .tt-pricing-topcta__copy { flex: 1 1 100%; max-width: none; }
  #pricing-1 .tt-pricing-topcta__actions {
    width: 100%;
    align-items: center;
  }
}

/* Section title under .pricing-section — make heading & sub copy theme-aware */
.theme--light #pricing-1 .section-title h2 { color: #0d0f12; }
.theme--dark  #pricing-1 .section-title h2 { color: #ffffff; }
.theme--light #pricing-1 .section-title > p { color: rgba(0,0,0,0.62); }
.theme--dark  #pricing-1 .section-title > p { color: rgba(255,255,255,0.65); }
.theme--light #pricing-1 .toggle-btn .toggler-txt { color: #0d0f12; }
.theme--dark  #pricing-1 .toggle-btn .toggler-txt { color: #ffffff; }
/* Override the 'Save about 17%' tag which inherits .color--theme purple/white */
.theme--dark #pricing-1 .toggle-btn p.color--theme { color: #4d8bff !important; }
.theme--light #pricing-1 .toggle-btn p.color--theme { color: #0d0f12 !important; }

#pricing-1 .tt-plan-table-wrap {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  border: 1px solid rgba(120, 123, 134, 0.22);
}
.theme--light #pricing-1 .tt-plan-table-wrap {
  background: #ffffff;
  border-color: rgba(0,0,0,0.10);
  box-shadow: 0 12px 28px rgba(0,0,0,0.05);
}
/* Dark theme: keep page-black background, only use thin border + subtle
   row dividers to delineate the table. No grey panel. */
.theme--dark #pricing-1 .tt-plan-table-wrap {
  background: transparent;
  border-color: rgba(255,255,255,0.12);
  box-shadow: none;
}
#pricing-1 .tt-plan-table {
  width: 100%;
  min-width: 1080px;
  border-collapse: collapse;
  table-layout: fixed;
  font-feature-settings: 'tnum' 1, 'lnum' 1;
}
#pricing-1 .tt-plan-table__col--feat { width: 24%; }
#pricing-1 .tt-plan-table__col--tier { width: 15.2%; }
/* API pricing uses four paid tiers + feature column (100% = 24 + 4×19). */
#pricing-1 .tt-plan-table--4tier .tt-plan-table__col--tier { width: 19%; }
#pricing-1 .tt-plan-table--4tier { min-width: 920px; }

/* Header row — fixed-height slots so all four columns align horizontally
   regardless of which one carries the "Most popular" badge.
   Layout slots top-down:
     · badge      28px
     · name       28px
     · price      56px
     · CTA        44px
   The featured column places its badge at the top of the same slot, so
   none of the other rows shift down. */
#pricing-1 .tt-plan-table thead th {
  padding: 24px 16px 22px;
  vertical-align: top;
  text-align: center;
  background: transparent;
  position: sticky;
  top: 0;
  z-index: 3;
}
.theme--light #pricing-1 .tt-plan-table thead th {
  border-bottom: 1px solid rgba(0,0,0,0.08);
  background: #ffffff;
}
.theme--dark #pricing-1 .tt-plan-table thead th {
  border-bottom: 1px solid rgba(255,255,255,0.10);
  background: #0d0f12;
}
.theme--light #pricing-1 .tt-plan-table__featured-head { background: rgba(41, 98, 255, 0.06) !important; }
.theme--dark  #pricing-1 .tt-plan-table__featured-head { background: rgba(41, 98, 255, 0.10) !important; }

#pricing-1 .tt-plan-table__feat-head {
  text-align: left !important;
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--tt-fg-0);
}



#pricing-1 .tt-plan-table__featured-head {
  position: relative;
}

/* Plan-head structure: every column gets the same vertical layout slots,
   so the price line, CTA line, and note line align across all four heads. */
#pricing-1 .tt-plan-head {
  display: grid;
  grid-template-rows:
    [badge] 28px
    [name] 28px
    [price] minmax(56px, auto)
    [save] 28px
    [cta] 44px;
  align-items: center;
  justify-items: center;
  row-gap: 5px;
  width: 100%;
}

/* Most popular badge — pinned to the badge slot of its own column. */
/* [EXCEPTION] status badge — white label on brand-blue pill */
#pricing-1 .tt-plan-head__badge {
  grid-row: badge;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 3px 10px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  border-radius: 999px;
  background: #2962ff;
  color: #ffffff;
  white-space: nowrap;
}
/* When badge sits as a sibling of .tt-plan-head (Pro column markup), pull it
   into the same grid by re-anchoring via absolute positioning at the top of
   the th. Other columns simply leave the badge slot empty. */
#pricing-1 .tt-plan-table__featured-head .tt-plan-head__badge {
  position: absolute;
  top: 24px;
  left: 50%;
  transform: translateX(-50%);
}

#pricing-1 .tt-plan-head__name {
  grid-row: name;
  font-size: 16px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  line-height: 1;
  color: var(--tt-fg-0);
}



#pricing-1 .tt-plan-head__price {
  grid-row: price;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
#pricing-1 .tt-plan-head__amount {
  display: block;
  line-height: 1;
}
#pricing-1 .tt-plan-head__amount span {
  font-size: 22px;
  font-weight: 700;
  font-feature-settings: 'tnum' 1, 'lnum' 1;
}
.theme--light #pricing-1 .tt-plan-head__amount,
.theme--light #pricing-1 .tt-plan-head__amount span,
.theme--light #pricing-1 .tt-plan-head__amount sup,
.theme--dark #pricing-1 .tt-plan-head__amount,
.theme--dark #pricing-1 .tt-plan-head__amount span,
.theme--dark #pricing-1 .tt-plan-head__amount sup { color: var(--tt-fg-0); }
#pricing-1 .tt-plan-head__amount sup {
  font-size: 16px;
  font-weight: 600;
  vertical-align: super;
}
#pricing-1 .tt-plan-head__amount sup.validity {
  font-size: 14px;
  font-weight: 500;
  opacity: 0.7;
  margin-left: 4px;
}

/* [UPDATE] 2026-05-28 — move annual savings out of the price line.
   User requested "Save $X" not to appear inside the amount area. We now
   render a dedicated save-chip row between price and CTA. */
/* [EXCEPTION] funding-rate-style savings chip highlight colors */
#pricing-1 .tt-plan-head__save-chip {
  grid-row: save;
  display: inline-block;
  width: fit-content;
  justify-self: center;
  padding: 5px 11px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.02em;
  line-height: 1;
  white-space: nowrap;
  background: rgba(252, 213, 53, 0.16);
  color: #fcd535;
  border: 1px solid rgba(252, 213, 53, 0.42);
}
/* [EXCEPTION] funding-rate-style savings chip — dark theme */
.theme--dark #pricing-1 .tt-plan-head__save-chip {
  background: rgba(252, 213, 53, 0.16);
  color: #fcd535;
  border-color: rgba(252, 213, 53, 0.42);
}
/* [EXCEPTION] funding-rate-style savings chip — light theme */
.theme--light #pricing-1 .tt-plan-head__save-chip {
  background: rgba(245, 158, 11, 0.14);
  color: #b45309;
  border-color: rgba(245, 158, 11, 0.50);
}
.price1.tt-plan-head__save-chip { display: none; }

#pricing-1 .tt-plan-head__cta {
  grid-row: cta;
  width: 100%;
  max-width: 200px;
  font-size: 16px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
#pricing-1 .tt-plan-head__cta--free {
  border: 1px solid rgba(120, 123, 134, 0.36);
  border-radius: 10px;
  font-weight: 600;
  letter-spacing: 0.02em;
  min-height: 44px;
  padding: 10px 12px;
}
.theme--light #pricing-1 .tt-plan-head__cta--free,
.theme--dark #pricing-1 .tt-plan-head__cta--free {
  color: var(--tt-fg-0);
}
.theme--light #pricing-1 .tt-plan-head__cta--free {
  background: rgba(0, 0, 0, 0.03);
}
.theme--dark #pricing-1 .tt-plan-head__cta--free {
  background: rgba(255, 255, 255, 0.05);
}
#pricing-1 .tt-plan-head__cta--free.is-current-plan {
  border-color: rgba(41, 98, 255, 0.55);
  box-shadow: inset 0 0 0 1px rgba(41, 98, 255, 0.2);
}
/* Body rows */
#pricing-1 .tt-plan-table tbody th[scope="row"] {
  text-align: left;
  padding: 14px 16px;
  font-size: 14px;
  font-weight: 500;
  background: transparent;
}
.theme--light #pricing-1 .tt-plan-table tbody th[scope="row"],
.theme--dark #pricing-1 .tt-plan-table tbody th[scope="row"] {
  color: var(--tt-fg-0);
}
.theme--light #pricing-1 .tt-plan-table tbody th[scope="row"] {
  border-bottom: 1px solid rgba(0,0,0,0.06);
}
.theme--dark #pricing-1 .tt-plan-table tbody th[scope="row"] {
  border-bottom: 1px solid rgba(255,255,255,0.08);
}
#pricing-1 .tt-plan-table tbody td {
  text-align: center;
  padding: 14px 12px;
  font-size: 14px;
  vertical-align: middle;
}
.theme--light #pricing-1 .tt-plan-table tbody td,
.theme--dark #pricing-1 .tt-plan-table tbody td {
  color: var(--tt-fg-0);
}
.theme--light #pricing-1 .tt-plan-table tbody td {
  border-bottom: 1px solid rgba(0,0,0,0.06);
}
.theme--dark #pricing-1 .tt-plan-table tbody td {
  border-bottom: 1px solid rgba(255,255,255,0.08);
}
.theme--light #pricing-1 .tt-plan-table tbody tr:hover th[scope="row"],
.theme--light #pricing-1 .tt-plan-table tbody tr:hover td {
  background: rgba(41, 98, 255, 0.04);
}
.theme--dark #pricing-1 .tt-plan-table tbody tr:hover th[scope="row"],
.theme--dark #pricing-1 .tt-plan-table tbody tr:hover td {
  background: rgba(41, 98, 255, 0.10);
}

/* Featured (Pro) column highlight */
.theme--light #pricing-1 .tt-plan-cell--featured { background: rgba(41, 98, 255, 0.06); }
.theme--dark  #pricing-1 .tt-plan-cell--featured { background: rgba(41, 98, 255, 0.10); }

/* Group rows */
#pricing-1 .tt-plan-table__group th {
  text-align: left;
  padding: 18px 16px 8px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--tt-fg-0);
  opacity: 0.66;
}
.theme--light #pricing-1 .tt-plan-table__group th {
  background: rgba(0,0,0,0.04);
  border-top: 1px solid rgba(0,0,0,0.08);
  border-bottom: 1px solid rgba(0,0,0,0.08);
}
.theme--dark #pricing-1 .tt-plan-table__group th {
  background: transparent;
  border-top: 1px solid rgba(255,255,255,0.10);
  border-bottom: 1px solid rgba(255,255,255,0.10);
}

#pricing-1 .tt-plan-table__group--sub th {
  padding: 12px 16px 6px 24px;
  font-size: 12px;
  letter-spacing: 0.08em;
  text-transform: none;
}
.theme--light #pricing-1 .tt-plan-table__group--sub th {
  color: var(--tt-fg-0);
  background: rgba(0,0,0,0.02);
  border-top: none;
}
.theme--dark #pricing-1 .tt-plan-table__group--sub th {
  color: var(--tt-fg-0);
  opacity: 0.75;
  background: rgba(255,255,255,0.03);
  border-top: none;
}

#pricing-1 .tt-plan-table__endpoint-row th[scope="row"] {
  padding: 10px 16px 10px 24px;
  font-size: 12px;
  font-weight: 400;
}
#pricing-1 .tt-plan-endpoint {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 4px;
  min-width: 0;
}
#pricing-1 .tt-plan-endpoint__name {
  font-size: 14px;
  font-weight: 500;
  line-height: 1.35;
  color: var(--tt-fg-0);
}
#pricing-1 .tt-plan-endpoint__route {
  display: flex;
  align-items: baseline;
  gap: 8px;
  width: 100%;
  min-width: 0;
}
#pricing-1 .tt-plan-endpoint__method {
  flex: 0 0 auto;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--tt-fg-0);
  opacity: 0.75;
}
#pricing-1 .tt-plan-endpoint__path {
  flex: 1 1 auto;
  min-width: 0;
  font-family: 'JetBrains Mono', 'Fira Code', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
  font-size: 12px;
  line-height: 1.45;
  color: var(--tt-fg-0);
  background: rgba(127, 140, 170, 0.12);
  padding: 3px 8px;
  border-radius: 4px;
  word-break: break-all;
}
.theme--light #pricing-1 .tt-plan-endpoint__path {
  background: rgba(0, 0, 0, 0.06);
}
.theme--dark #pricing-1 .tt-plan-endpoint__path {
  background: rgba(255, 255, 255, 0.08);
}
.theme--light #pricing-1 .tt-plan-table__endpoint-row:nth-child(even) th[scope="row"],
.theme--light #pricing-1 .tt-plan-table__endpoint-row:nth-child(even) td {
  background: rgba(0, 0, 0, 0.015);
}
.theme--dark #pricing-1 .tt-plan-table__endpoint-row:nth-child(even) th[scope="row"],
.theme--dark #pricing-1 .tt-plan-table__endpoint-row:nth-child(even) td {
  background: rgba(255, 255, 255, 0.02);
}

/* ✓ / ✗ glyphs */
#pricing-1 .tt-plan-cell-check,
#pricing-1 .tt-plan-cell-x {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  font-size: 14px;
  font-weight: 700;
  line-height: 1;
}
/* ✓ uses the site brand blue (#2962ff — same as Pro badge / CTA);
   ✗ uses the chart-page down red (#ef5350 — pairs with #26a69a up green). */
#pricing-1 .tt-plan-cell-check {
  background: rgba(41, 98, 255, 0.14);
  color: #2962ff;
}
.theme--dark #pricing-1 .tt-plan-cell-check {
  background: rgba(41, 98, 255, 0.20);
  color: #4d8bff;
}
#pricing-1 .tt-plan-cell-x {
  background: rgba(239, 83, 80, 0.14);
  color: #ef5350;
}
.theme--dark #pricing-1 .tt-plan-cell-x {
  background: rgba(239, 83, 80, 0.18);
  color: #ef5350;
}
#pricing-1 .tt-plan-cell-num {
  font-size: 14px;
  font-weight: 700;
  color: var(--tt-fg-0);
}



/* Footer CTA row */
#pricing-1 .tt-plan-table__foot-row td,
#pricing-1 .tt-plan-table__foot-row .tt-plan-table__feat-foot {
  padding: 22px 12px 26px;
  text-align: center;
  vertical-align: middle;
}
#pricing-1 .tt-plan-table__feat-foot {
  text-align: left !important;
  padding-left: 16px !important;
  font-size: 14px;
  font-weight: 600;
  color: var(--tt-fg-0);
}


#pricing-1 .tt-plan-foot-cta {
  width: 100%;
  max-width: 146px;
  min-width: 124px;
  font-size: 12px;
  line-height: 1.15;
  padding: 7px 8px;
  white-space: nowrap;
}
#pricing-1 .tt-plan-foot-free {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  max-width: 146px;
  min-width: 124px;
  min-height: 34px;
  border-radius: 8px;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.02em;
  border: 1px solid rgba(120, 123, 134, 0.36);
}
.theme--light #pricing-1 .tt-plan-foot-free,
.theme--dark #pricing-1 .tt-plan-foot-free {
  color: var(--tt-fg-0);
}
.theme--light #pricing-1 .tt-plan-foot-free {
  background: rgba(0, 0, 0, 0.03);
}
.theme--dark #pricing-1 .tt-plan-foot-free {
  background: rgba(255, 255, 255, 0.05);
}
#pricing-1 .tt-plan-foot-free.is-current-plan {
  border-color: rgba(41, 98, 255, 0.55);
  box-shadow: inset 0 0 0 1px rgba(41, 98, 255, 0.2);
}
#pricing-1 .tt-pricing-matrix-note {
  margin-bottom: 0;
  font-size: 14px;
  color: var(--tt-fg-0);
  opacity: 0.65;
}
.theme--light #pricing-1 .tt-pricing-matrix-note {
  color: var(--tt-fg-0);
  opacity: 0.65;
}

/* Responsive: keep table scrollable on small screens */
@media (max-width: 1199.98px) {
  /* [FIX] 2026-05-28 — tablet layout stabilization for /pricing.
     Root causes:
     1) top CTA remained in desktop side-by-side mode on tablets, causing
        a cramped two-column block.
     2) tier CTA buttons (180px) were wider than each tier column in the
        5-column comparison table, which caused overlap/clipping around
        768–1199px.
     Changes:
     - Stack top CTA copy/actions on tablets.
     - Use a wider tier-share ratio (18%) and compact CTA geometry (160x44)
       to keep controls fully inside each column.
     - Slightly reduce heading/price typography and table padding for
       denser but readable tablet rendering. */
  #pricing-1 .tt-pricing-topcta {
    justify-content: flex-start;
    gap: 18px;
  }
  #pricing-1 .tt-pricing-topcta__copy {
    flex: 1 1 100%;
    max-width: none;
  }
  #pricing-1 .tt-pricing-topcta__actions {
    width: 100%;
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: flex-start;
    align-items: center;
    gap: 10px 14px;
  }

  #pricing-1 .tt-plan-table {
    min-width: 1040px;
  }
  #pricing-1 .tt-plan-table__col--feat { width: 22%; }
  #pricing-1 .tt-plan-table__col--tier { width: 15.6%; }
  #pricing-1 .tt-plan-table thead th { padding: 20px 12px 18px; }
  #pricing-1 .tt-plan-table tbody th[scope="row"] { padding: 12px 12px; }
  #pricing-1 .tt-plan-table tbody td { padding: 12px 10px; }

  #pricing-1 .tt-plan-head__amount span { font-size: 22px; }
  #pricing-1 .tt-plan-head__amount sup { font-size: 14px; }
  #pricing-1 .tt-plan-head__amount sup.validity { font-size: 12px; }
  #pricing-1 .tt-plan-head__name { font-size: 14px; }

  #pricing-1 .tt-plan-head__cta.tt-btn-skew--md {
    width: 160px !important;
    height: 44px !important;
    max-width: 160px !important;
    font-size: 14px;
    letter-spacing: 0.2px;
    clip-path: path('M10 5 H137 Q141 5 143 8 L153 33 Q156 38 151 40 H10 Q5 40 5 36 V10 Q5 5 10 5 Z');
  }
}
@media (max-width: 767.98px) {
  #pricing-1 .tt-pricing-topcta {
    margin-bottom: 40px;
    padding: 24px 22px;
    gap: 20px;
  }
  #pricing-1 .tt-pricing-topcta__title { font-size: 22px; margin-bottom: 10px; }
  #pricing-1 .tt-pricing-topcta__price-zero { font-size: 22px; }
  #pricing-1 .tt-pricing-topcta__actions {
    justify-content: center;
    align-items: center;
    gap: 10px;
  }

  #pricing-1 .tt-plan-table-wrap { border-radius: 0; }
  #pricing-1 .tt-plan-table { min-width: 1040px; }
  #pricing-1 .tt-plan-head__cta { max-width: 160px; }
  #pricing-1 .tt-plan-foot-cta { max-width: 140px; }
}

/* Toggle button (monthly/yearly) — keep using existing pricing-toggle.js
   selectors `.price1 / .price2`. We display them stacked inside the head. */
#pricing-1 .tt-plan-head__amount.price1 { display: none; }
#pricing-1 .tt-plan-head__amount.price2 { display: block; }

/* Pricing CTA buttons — override the global dark-grey .btn--theme so the
   four plan CTAs and the Enterprise CTA all use the brand blue (#2962ff)
   instead of #333. Scoped to #pricing-1 only so other pages keep the
   neutral grey theme button. */
/* [EXCEPTION] CTA buttons — white label on brand-blue background */
#pricing-1 .tt-plan-head__cta.btn,
#pricing-1 .tt-plan-foot-cta.btn,
#pricing-1 .tt-pricing-extras-cta.btn {
  background-color: #2962ff !important;
  color: #ffffff !important;
  border-color: transparent !important;
  font-weight: 600;
  letter-spacing: 0.02em;
  transition: background-color 0.18s ease, transform 0.18s ease;
}
/* [UPDATE] 2026-05-28 — bottom "Choose" labels should be regular weight,
   not bold, per user request. */
#pricing-1 .tt-plan-foot-cta.btn {
  font-weight: 400;
  letter-spacing: 0;
}
#pricing-1 .tt-plan-head__cta.btn:hover,
#pricing-1 .tt-plan-foot-cta.btn:hover,
#pricing-1 .tt-pricing-extras-cta.btn:hover,
#pricing-1 .tt-plan-head__cta.btn:focus-visible,
#pricing-1 .tt-plan-foot-cta.btn:focus-visible,
#pricing-1 .tt-pricing-extras-cta.btn:focus-visible {
  background-color: #1e4dd6 !important;
  color: #ffffff !important;
  border-color: transparent !important;
}

/* [ADD] 2026-05-12 — Enterprise / billing notes side-by-side block (v2)
   v2: equal 6/6 columns, vertically centred content, balanced inner padding,
       eyebrow chip stays centred on the CTA card and left-aligned on notes. */
#pricing-1 .tt-pricing-extras {
  margin-bottom: 24px;
}
#pricing-1 .tt-pricing-extras .tt-pricing-extras-card {
  border: 1px solid rgba(120, 123, 134, 0.20);
  box-sizing: border-box;
  display: flex;
  align-items: stretch;
  min-height: 280px;
  overflow: hidden;
}
.theme--dark #pricing-1 .tt-pricing-extras .tt-pricing-extras-card {
  border-color: rgba(255, 255, 255, 0.10);
}

#pricing-1 .tt-pricing-extras .tt-pricing-extras-card__inner {
  width: 100%;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 18px;
  padding: 48px 56px;
  box-sizing: border-box;
}

@media (max-width: 1199.98px) {
  #pricing-1 .tt-pricing-extras .tt-pricing-extras-card__inner { padding: 40px 44px; }
}
@media (max-width: 767.98px) {
  #pricing-1 .tt-pricing-extras .tt-pricing-extras-card__inner { padding: 32px 28px; }
  #pricing-1 .tt-pricing-extras .tt-pricing-extras-card { min-height: 0; }
}

/* CTA card — accented, centered */
.theme--light #pricing-1 .tt-pricing-extras-card--cta {
  background: linear-gradient(135deg, rgba(41, 98, 255, 0.06), rgba(41, 98, 255, 0.02));
  border-color: rgba(41, 98, 255, 0.25);
}
/* Dark theme: very subtle blue tint instead of grey panel — keeps the CTA
   card feeling distinct without breaking the all-black aesthetic. */
.theme--dark #pricing-1 .tt-pricing-extras-card--cta {
  background: linear-gradient(135deg, rgba(41, 98, 255, 0.08), rgba(41, 98, 255, 0.02));
  border-color: rgba(41, 98, 255, 0.28);
}
#pricing-1 .tt-pricing-extras-card--cta .tt-pricing-extras-card__inner {
  align-items: center;
  text-align: center;
}

/* Notes card — softly framed, left-aligned but well padded.
   Dark theme: stay on black with a thin border. */
.theme--light #pricing-1 .tt-pricing-extras-card--notes { background: #f7f8fa; }
.theme--dark  #pricing-1 .tt-pricing-extras-card--notes {
  background: transparent;
  border-color: rgba(255,255,255,0.10);
}
#pricing-1 .tt-pricing-extras-card--notes .tt-pricing-extras-card__inner {
  align-items: flex-start;
  text-align: left;
}

/* Eyebrow chip */
#pricing-1 .tt-pricing-extras-eyebrow {
  display: inline-block;
  margin: 0;
  font-family: 'Plus Jakarta Sans', Inter, system-ui, sans-serif;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  padding: 5px 12px;
  border-radius: 999px;
}
.theme--light #pricing-1 .tt-pricing-extras-eyebrow {
  color: #2962ff;
  background: rgba(41, 98, 255, 0.10);
}
.theme--dark #pricing-1 .tt-pricing-extras-eyebrow {
  color: #4d8bff;
  background: rgba(41, 98, 255, 0.14);
}

/* Title + lead text on CTA card */
#pricing-1 .tt-pricing-extras-title {
  margin: 0;
  font-family: 'Plus Jakarta Sans', Inter, system-ui, sans-serif;
  font-size: 22px;
  font-weight: 700;
  line-height: 1.2;
  color: var(--tt-fg-0);
}



#pricing-1 .tt-pricing-extras-lead {
  margin: 0;
  max-width: 460px;
  font-size: 14px;
  line-height: 1.6;
}
#pricing-1 .tt-pricing-extras-lead { color: var(--tt-fg-0); opacity: 0.66; }


/* CTA button: do NOT stretch */
#pricing-1 .tt-pricing-extras-cta {
  align-self: center;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 12px 28px;
  font-size: 14px;
  margin-top: 4px;
}

/* Notes list */
#pricing-1 .tt-pricing-notes {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 14px;
  width: 100%;
}
#pricing-1 .tt-pricing-notes li {
  position: relative;
  padding: 0 0 0 22px;
  margin: 0;
  font-size: 14px;
  line-height: 1.55;
}
#pricing-1 .tt-pricing-notes li { color: var(--tt-fg-0); opacity: 0.72; }

#pricing-1 .tt-pricing-notes li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.55em;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: rgba(41, 98, 255, 0.75);
}

/* ===========================================================================
   tt-btn-skew — reusable shaped CTA button (2026-05-13)
   ---------------------------------------------------------------------------
   Site-wide CTA component with a soft down-skew silhouette. The shape is
   produced by `clip-path: path()` on a standard <a>/<button>, so all native
   semantics (href, focus order, screen-reader text) are preserved.

   Usage:
     <a href="/signup" class="tt-btn-skew tt-btn-skew--blue">Sign up</a>
     <button type="submit" class="tt-btn-skew tt-btn-skew--blue">Start trial</button>

   Geometry: fixed-size button (240 x 64 by default). Path coords are absolute
   pixels so the element MUST be sized via .tt-btn-skew (or a size modifier
   below). If you need a different physical size, add a new size modifier
   that overrides both width/height AND clip-path (path coords scale with
   size). Don't try to make it fluid — clip-path: path() does not respond
   to box resize.

   Colour variants:
     .tt-btn-skew--blue           brand accent #2962ff (default action colour, white text)
     .tt-btn-skew--nebula         blue → red gradient (site header signup CTA)
     .tt-btn-skew--nebula-mirror  red → blue → red symmetric gradient (hero bi-slant CTA)
     .tt-btn-skew--ghost          low-opacity neutral fill with white text — works on
                                  both dark and light themes

   Shape variants:
     (default)              single down-skew on the bottom-right corner
     .tt-btn-skew--bislant  bi-slant: bottom-right + top-left cuts mirrored
                            through the geometric centre (hero emphasis only)

   Size modifiers:
     (default)              240 x 64 — desktop hero / landing primary CTA (14px)
     .tt-btn-skew--xl       360 x 64 — extra-long hero CTA (1.5× default, 14px)
     .tt-btn-skew--sm       210 x 52 — denser layouts / mobile (14px)
     .tt-btn-skew--md       180 x 52 — pricing table tier CTA (14px)
     .tt-btn-skew--xs       160 x 44 — in-table CTA cells / narrow columns (12px)
     .tt-btn-skew--header   130 x 38 — compact site-header signup CTA (14px)

   States: hover (lift + slight opacity dim), focus-visible (3px inset
   ring inside the silhouette — clip-path also clips outer outline /
   box-shadow so the focus indicator must be drawn inside the shape),
   active (settle + tiny scale). Honours prefers-reduced-motion.
   =========================================================================== */
.tt-btn-skew {
  --tt-btn-skew-fill: #2563eb;
  --tt-btn-skew-fg: #ffffff;
  --tt-btn-skew-focus: rgba(255, 255, 255, 0.85);

  position: relative;
  isolation: isolate;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 240px;
  height: 64px;
  padding: 0 16px;
  margin: 0;
  background: var(--tt-btn-skew-fill);
  color: var(--tt-btn-skew-fg) !important;
  font-family: inherit;
  font-size: 14px;
  font-weight: 400;
  letter-spacing: 0.3px;
  line-height: 1;
  text-align: center;
  text-decoration: none;
  white-space: nowrap;
  border: 0;
  border-radius: 0;
  outline: none;
  cursor: pointer;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
  clip-path: path('M14 8 H206 Q212 8 215 12 L230 48 Q234 56 226 58 H14 Q8 58 8 52 V14 Q8 8 14 8 Z');
  transition: transform 0.18s ease, opacity 0.18s ease, background-color 0.18s ease;
}
.tt-btn-skew:hover,
.tt-btn-skew:focus,
.tt-btn-skew:active,
.tt-btn-skew:visited {
  color: var(--tt-btn-skew-fg) !important;
  text-decoration: none;
}
.tt-btn-skew:hover {
  transform: translateY(-2px);
  opacity: 0.92;
}
.tt-btn-skew:active {
  transform: translateY(0) scale(0.985);
  opacity: 1;
}
/* Focus ring: clip-path also clips outline/box-shadow of the element
   itself, so we draw the focus indicator as an inset box-shadow (which
   lives inside the clipped silhouette). Renders as a soft 3px inner ring
   in the brand-blue half-tone — visible only via keyboard focus. */
.tt-btn-skew:focus-visible {
  outline: none;
  box-shadow: inset 0 0 0 3px var(--tt-btn-skew-focus);
}

.tt-btn-skew--blue {
  --tt-btn-skew-fill: #2962ff;
  --tt-btn-skew-fg: #ffffff;
  --tt-btn-skew-focus: rgba(255, 255, 255, 0.85);
}
/* Nebula variant: brand blue → red gradient used on the site-header signup
   CTA. Because clip-path requires a single `background` property to render
   the gradient (not background-color), we set it directly on the variant. */
.tt-btn-skew--nebula {
  --tt-btn-skew-fg: #ffffff;
  --tt-btn-skew-focus: rgba(255, 255, 255, 0.85);
  /* [UPDATE] 2026-07-10 — solid blue signup CTA (red stop removed per design). */
  background: linear-gradient(90deg, #2962ff 0%, #2962ff 70%, #2962ff 100%);
}
.tt-btn-skew--nebula:hover { filter: brightness(1.08); }

/* Nebula-mirror variant: symmetric red → blue → red gradient. Echoes the
   single-side nebula colour story but balances visual weight across both
   short edges of a bi-slant hero CTA (landing "Explore the App"). Red
   bands sit on the slanted ends to draw the eye outward in both
   directions. */
.tt-btn-skew--nebula-mirror {
  --tt-btn-skew-fg: #ffffff;
  --tt-btn-skew-focus: rgba(255, 255, 255, 0.85);
  background: linear-gradient(
    90deg,
    #e53935 0%,
    #2962ff 18%,
    #2962ff 82%,
    #e53935 100%
  );
}
.tt-btn-skew--nebula-mirror:hover { filter: brightness(1.08); }
/* Ghost variant: white text on a low-opacity dark fill, suitable on both
   themes since the foreground is always white. Adjust the fill in light
   theme to a darker tone so the white text stays readable. */
.tt-btn-skew--ghost {
  --tt-btn-skew-fill: rgba(255, 255, 255, 0.10);
  --tt-btn-skew-fg: #ffffff;
  --tt-btn-skew-focus: rgba(255, 255, 255, 0.55);
}
.theme--light .tt-btn-skew--ghost {
  --tt-btn-skew-fill: rgba(13, 15, 18, 0.72);
  --tt-btn-skew-fg: #ffffff;
  --tt-btn-skew-focus: rgba(255, 255, 255, 0.85);
}

/* Size modifier: small (210 x 52). Path derived from the default by
   keeping all corner-radius control points and stretching only the
   horizontal mid-segments so the down-skew angle stays consistent. */
.tt-btn-skew--sm {
  width: 210px;
  height: 52px;
  font-size: 14px;
  clip-path: path('M12 6 H181 Q186 6 188 9 L202 43 Q205 50 198 51 H12 Q7 51 7 46 V11 Q7 6 12 6 Z');
}

/* Size modifier: extra-small (160 x 44). Designed for in-table CTA cells
   where horizontal column width is limited (~17% of 1140px container).
   `!important` on width/height is required to win over higher-specificity
   ID selectors like `#pricing-1 .tt-plan-head__cta { width: 100%; max-width: 200px }`. */
.tt-btn-skew--xs {
  width: 160px !important;
  height: 44px !important;
  max-width: 160px !important;
  font-size: 12px;
  letter-spacing: 0.2px;
  clip-path: path('M10 5 H137 Q141 5 143 8 L153 33 Q156 38 151 40 H10 Q5 40 5 36 V10 Q5 5 10 5 Z');
}

/* Size modifier: medium (180 x 52). Mid-step between xs and sm, sized to
   fit pricing-table tier columns (~17% of 1140 = ~193px) with comfortable
   margins. Same down-skew angle, control points scaled from the 240x64
   default. */
.tt-btn-skew--md {
  width: 180px !important;
  height: 52px !important;
  max-width: 180px !important;
  font-size: 14px;
  clip-path: path('M11 6 H154 Q159 6 161 9 L172 39 Q175 46 169 47 H11 Q6 47 6 42 V11 Q6 6 11 6 Z');
}

/* Size modifier: header (130 x 38). Compact CTA for the site header right-
   side action area where total header height is 71px. Smaller corners and
   skew offsets to keep the silhouette visually identifiable at this size. */
.tt-btn-skew--header {
  width: 130px;
  height: 38px;
  font-size: 14px;
  letter-spacing: 0.2px;
  clip-path: path('M8 4 H110 Q114 4 116 6 L124 29 Q126 34 121 35 H8 Q4 35 4 31 V8 Q4 4 8 4 Z');
}

/* Size modifier: extra-large (360 x 64). 1.5x the default width — used for
   high-emphasis hero CTAs (landing area "Explore"). Only x-axis scales;
   height/corner-radius stay identical to the default so the silhouette
   reads as the same family at different lengths. */
.tt-btn-skew--xl {
  width: 360px;
  height: 64px;
  font-size: 14px;
  clip-path: path('M14 8 H326 Q332 8 335 12 L350 48 Q354 56 346 58 H14 Q8 58 8 52 V14 Q8 8 14 8 Z');
}

/* ---------------------------------------------------------------------------
   Shape variant: bi-slant (`--bislant`)
   ---------------------------------------------------------------------------
   The default silhouette is an asymmetric trapezoid: the top-right corner
   is cut, so the top edge is shorter than the bottom edge. `--bislant`
   adds a mirrored cut on the top-left corner, producing a symmetric
   isosceles trapezoid (short top, long bottom, both top corners cut
   inward by the same amount). The bottom edge and the corner-radius
   family are kept identical to the single-skew variant so the two read
   as one family.

   Path coordinates are hand-tuned per size because `clip-path: path()`
   does not auto-scale. Provided for the default (240x64) and --xl
   (360x64); other sizes fall back to the single-skew silhouette. */
.tt-btn-skew--bislant {
  clip-path: path('M25 12 Q28 8 34 8 H206 Q212 8 215 12 L230 48 Q234 56 226 58 H14 Q6 58 10 48 Z');
}
.tt-btn-skew--bislant.tt-btn-skew--xl {
  clip-path: path('M25 12 Q28 8 34 8 H326 Q332 8 335 12 L350 48 Q354 56 346 58 H14 Q6 58 10 48 Z');
}

@media (prefers-reduced-motion: reduce) {
  .tt-btn-skew { transition: none; }
  .tt-btn-skew:hover,
  .tt-btn-skew:active { transform: none; }
}

/* ─────────────────────────────────────────────────────────────────────────
   Cookie consent banner (2026-05-22)
   Rendered by footer-index.ejs. English only at this stage (corporate
   homepage / footer pages are English only). The banner is fixed to the
   bottom of the viewport, dark surface w/ pill buttons, mobile-stacks
   action row beneath copy. Buttons use the project's two reserved
   font-size whitelist values (14px desktop / 12px mobile) and only
   `var(--tt-fg-0)` for text (rule web_app_styling — fixed sizes 12/14/16
   /18/22/28, fixed colour fg-0). Container width matches the corp-page
   max-width.
   ───────────────────────────────────────────────────────────────────── */
/* [CHG] 2026-05-22 — Cookie banner pinned to a single dark theme.
 *   Decision (user 2026-05-22): the banner must NOT follow the site-wide
 *   theme toggle; keep it pure black with a visible outline at all times.
 *   Rationale: GDPR / ePrivacy guidance recommends the consent surface read
 *   as a deliberate, sticky overlay rather than blending with whichever
 *   theme the user happens to be in — consistent with Stripe / Vercel /
 *   GitHub patterns where consent UI is theme-locked.
 *
 *   Black-on-page contrast: previous build used #14171f (very dark blue-
 *   grey) which on a light page rendered as "not quite black". Now we use
 *   a true near-black surface (#0b0d12) and a brighter outline (#3a4050,
 *   ~25% lighter than the surface) so the edge reads clearly against
 *   either dark or light page backgrounds.
 *
 *   ALL theme--light / theme--dark overrides for the banner are removed
 *   so the surface stays the same regardless of body class. Text colour
 *   is force-set (not var(--tt-fg-0)) so the banner is not pulled into
 *   the theme variable cascade.
 * [EXCEPTION] cookie banner — white copy on fixed dark overlay (GDPR readability)
 */
.tt-cookie-banner {
  position: fixed;
  left: 16px;
  right: 16px;
  bottom: 16px;
  z-index: 1080;
  background: #0b0d12;
  border: 1px solid #3a4050;
  border-radius: 14px;
  box-shadow: 0 12px 40px rgba(0,0,0,.55);
  padding: 16px 18px;
  color: #ffffff;
  font-family: 'Plus Jakarta Sans','Inter','Helvetica Neue',Arial,sans-serif;
}
.tt-cookie-banner[hidden] { display: none !important; }
.tt-cookie-banner__inner {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  max-width: 1240px;
  margin: 0 auto;
}
.tt-cookie-banner__copy { flex: 1 1 auto; min-width: 0; }
/* [FIX] 2026-05-22 — Pure-white text on banner regardless of body theme.
 *   Reason: crocus-theme.css sets `body.theme--dark { color:#aaaaaa }`,
 *   whose (0,1,1) specificity beats a bare `.tt-cookie-banner__text`
 *   (0,1,0); the banner copy inherited the grey body colour and read as
 *   faded on a black surface.
 *   Change: explicit `color: #ffffff !important` for title / body / links,
 *   plus a belt-and-braces `.tt-cookie-banner p { color: #ffffff !important }`
 *   safeguard so any future global `<p>` rule (e.g. `body.theme--dark p`,
 *   `.footer p`) cannot pull the banner back into a theme cascade.
 *   Warning: do NOT remove the !important — without it, the body-level
 *   theme rule wins and the GDPR-required readability is silently lost.
 */
.tt-cookie-banner p { color: #ffffff !important; }
.tt-cookie-banner__title {
  margin: 0 0 4px;
  font-size: 16px;
  font-weight: 700;
  color: #ffffff !important;
}
.tt-cookie-banner__text {
  margin: 0;
  font-size: 14px;
  line-height: 1.45;
  color: #ffffff !important;
}
.tt-cookie-banner__text a {
  color: #ffffff !important;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.tt-cookie-banner__text a:hover { color: #2962ff !important; }
.tt-cookie-banner__actions {
  display: flex;
  flex-direction: row;
  gap: 8px;
  flex-shrink: 0;
}
.tt-cookie-banner__btn {
  appearance: none;
  border: 1px solid transparent;
  border-radius: 999px;
  padding: 10px 18px;
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
  transition: background .15s ease, border-color .15s ease;
  background: transparent;
  color: #ffffff;
  white-space: nowrap;
}
.tt-cookie-banner__btn--reject {
  border-color: #4a5060;
  background: transparent;
}
.tt-cookie-banner__btn--reject:hover { border-color: #7a8090; }
.tt-cookie-banner__btn--accept {
  background: #2962ff;
  border-color: #2962ff;
  color: #ffffff;
}
.tt-cookie-banner__btn--accept:hover {
  background: #1e4dd1;
  border-color: #1e4dd1;
}
@media (max-width: 720px) {
  .tt-cookie-banner {
    left: 12px;
    right: 12px;
    bottom: 12px;
    padding: 14px 14px;
  }
  .tt-cookie-banner__inner {
    flex-direction: column;
    align-items: stretch;
    gap: 12px;
  }
  .tt-cookie-banner__actions {
    flex-direction: row;
    justify-content: stretch;
  }
  .tt-cookie-banner__btn {
    flex: 1 1 50%;
    padding: 10px 12px;
    font-size: 12px;
  }
  .tt-cookie-banner__title { font-size: 14px; }
  .tt-cookie-banner__text { font-size: 12px; }
}

/* ─────────────────────────────────────────────────────────────────────────
   Corp pages — list / meta typography (2026-05-22)
   Shared visual treatment used by the long-form legal pages
   (privacy.ejs / terms.ejs / disclaimer.ejs / risk-disclosure.ejs /
   cookie-policy.ejs). Heading and body sizes stay within the whitelist
   (12 / 14 / 16 / 18 / 22 / 28) and all text uses --tt-fg-0.
   ───────────────────────────────────────────────────────────────────── */
.corp-page__meta {
  font-size: 12px;
  color: var(--tt-fg-0);
  opacity: .85;
}
.corp-page__list {
  margin: 8px 0 12px;
  padding-left: 22px;
}
.corp-page__list > li {
  font-size: 16px;
  line-height: 1.55;
  color: var(--tt-fg-0);
  margin-bottom: 6px;
}
.corp-page__body code {
  font-family: 'JetBrains Mono','Fira Code','SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;
  font-size: 14px;
  background: rgba(127,140,170,.14);
  padding: 1px 6px;
  border-radius: 4px;
  color: var(--tt-fg-0);
}

/* ── API pricing — full endpoint catalog (#pricing-1) ── */
#pricing-1 .tt-api-endpoints-catalog {
  padding: 32px 28px;
  border: 1px solid rgba(127, 140, 170, 0.22);
  background: rgba(127, 140, 170, 0.06);
}
.theme--light #pricing-1 .tt-api-endpoints-catalog {
  background: rgba(0, 0, 0, 0.03);
  border-color: rgba(0, 0, 0, 0.1);
}
.theme--dark #pricing-1 .tt-api-endpoints-catalog {
  background: rgba(255, 255, 255, 0.03);
  border-color: rgba(255, 255, 255, 0.1);
}

#pricing-1 .tt-api-endpoints-catalog__title {
  font-size: 22px;
  color: var(--tt-fg-0);
  margin-bottom: 12px;
}
#pricing-1 .tt-api-endpoints-catalog__subtitle {
  font-size: 14px;
  color: var(--tt-fg-0);
  max-width: 720px;
  margin-left: auto;
  margin-right: auto;
}
#pricing-1 .tt-api-endpoints-catalog__total {
  font-size: 12px;
  color: var(--tt-fg-0);
  opacity: 0.85;
  margin: 0;
}

#pricing-1 .tt-api-endpoints-tier {
  margin-top: 28px;
  padding-top: 24px;
  border-top: 1px solid rgba(127, 140, 170, 0.18);
}
#pricing-1 .tt-api-endpoints-tier:first-of-type {
  margin-top: 0;
  padding-top: 0;
  border-top: none;
}
#pricing-1 .tt-api-endpoints-tier__head {
  margin-bottom: 14px;
}
#pricing-1 .tt-api-endpoints-tier__title {
  font-size: 18px;
  font-weight: 700;
  color: var(--tt-fg-0);
  margin: 0 0 6px;
}
#pricing-1 .tt-api-endpoints-tier__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 16px;
  margin: 0;
  font-size: 12px;
  color: var(--tt-fg-0);
  opacity: 0.85;
}
#pricing-1 .tt-api-endpoints-tier__count {
  font-feature-settings: 'tnum' 1, 'lnum' 1;
}

#pricing-1 .tt-api-endpoints-tier__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 6px;
}
@media (min-width: 768px) {
  #pricing-1 .tt-api-endpoints-tier__list {
    grid-template-columns: 1fr 1fr;
    gap: 6px 20px;
  }
}
@media (min-width: 1200px) {
  #pricing-1 .tt-api-endpoints-tier__list {
    grid-template-columns: 1fr 1fr 1fr;
  }
}

#pricing-1 .tt-api-endpoints-tier__item {
  display: flex;
  align-items: baseline;
  gap: 8px;
  min-width: 0;
  font-size: 14px;
}
#pricing-1 .tt-api-endpoints-tier__method {
  flex: 0 0 auto;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--tt-fg-0);
  opacity: 0.75;
}
#pricing-1 .tt-api-endpoints-tier__path {
  flex: 1 1 auto;
  min-width: 0;
  font-family: 'JetBrains Mono', 'Fira Code', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
  font-size: 12px;
  line-height: 1.45;
  color: var(--tt-fg-0);
  background: rgba(127, 140, 170, 0.12);
  padding: 3px 8px;
  border-radius: 4px;
  word-break: break-all;
}
.theme--light #pricing-1 .tt-api-endpoints-tier__path {
  background: rgba(0, 0, 0, 0.06);
}
.theme--dark #pricing-1 .tt-api-endpoints-tier__path {
  background: rgba(255, 255, 255, 0.08);
}

/* Avatar ring — white halo in dark and light themes; PNG assets ship halo-free. */
:is(
  .nav-user-avatar,
  .nud-avatar-sm,
  .tt-mob-user-avatar
) {
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.85);
}

/* Hub pages (/currencies, /heatmap): same max-width + padding as homepage .container */
@media (min-width: 992px) {
  .tt-agg.tt-cur-hub .container,
  .tt-agg.tt-mkt-heat .container {
    max-width: 1280px !important;
    padding-left: max(40px, env(safe-area-inset-left)) !important;
    padding-right: 40px !important;
    box-sizing: border-box !important;
  }
}
@media (min-width: 1200px) {
  .tt-agg.tt-cur-hub .container,
  .tt-agg.tt-mkt-heat .container {
    max-width: 1600px !important;
    padding-left: max(48px, env(safe-area-inset-left)) !important;
    padding-right: 48px !important;
  }
}
@media (min-width: 1400px) {
  .tt-agg.tt-cur-hub .container,
  .tt-agg.tt-mkt-heat .container {
    max-width: 1800px !important;
    padding-left: max(56px, env(safe-area-inset-left)) !important;
    padding-right: 56px !important;
  }
}
@media (min-width: 1800px) {
  .tt-agg.tt-cur-hub .container,
  .tt-agg.tt-mkt-heat .container {
    max-width: 2200px !important;
    padding-left: max(64px, env(safe-area-inset-left)) !important;
    padding-right: 64px !important;
  }
}
@media (min-width: 2200px) {
  .tt-agg.tt-cur-hub .container,
  .tt-agg.tt-mkt-heat .container {
    max-width: 2800px !important;
    padding-left: max(80px, env(safe-area-inset-left)) !important;
    padding-right: 80px !important;
  }
}
.tt-mkt-heat,
.tt-cur-hub {
  width: 100%;
  align-self: stretch;
  overflow-x: clip;
}
.tt-cur-hub__toolbar { margin-bottom: 0; }
.tt-cur-hub__search { min-width: 180px; flex: 1 1 200px; max-width: 360px; }
.tt-cur-hub__layout {
  display: flex;
  flex-direction: column;
  gap: 12px;
  margin-top: 4px;
}
.tt-cur-hub__main { min-width: 0; width: 100%; }
.tt-cur-hub__alpha {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  gap: 4px;
  padding: 8px 10px;
  border: 1px solid var(--tt-border, rgba(255,255,255,0.08));
  border-radius: 8px;
  background: rgba(255,255,255,0.03);
  overflow-x: auto;
  overflow-y: hidden;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
  position: sticky;
  top: 64px;
  z-index: 5;
}
.tt-cur-hub__alpha::-webkit-scrollbar { display: none; }
.tt-cur-hub__alpha-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  min-width: 28px;
  height: 28px;
  padding: 0 6px;
  border: 0;
  border-radius: 6px;
  background: transparent;
  font-size: 12px;
  font-weight: 600;
  font-family: inherit;
  color: var(--tt-fg-0);
  opacity: 0.75;
  cursor: pointer;
  transition: opacity 150ms ease, background 150ms ease, color 150ms ease;
}
.tt-cur-hub__alpha-btn:hover:not(.is-disabled),
.tt-cur-hub__alpha-btn:focus-visible:not(.is-disabled) {
  opacity: 1;
  background: rgba(41, 98, 255, 0.12);
  color: #2962ff;
}
.tt-cur-hub__alpha-btn.is-disabled {
  opacity: 0.3;
  cursor: default;
  pointer-events: none;
}
.tt-cur-hub__row[id^="tt-cur-hub-jump-"] { scroll-margin-top: 120px; }
.tt-cur-hub__empty {
  margin: 16px 0 0;
  padding: 20px 12px;
  text-align: center;
  font-size: 14px;
  color: var(--tt-fg-0);
  opacity: 0.75;
}
@media (min-width: 992px) {
  .tt-cur-hub__layout {
    flex-direction: row;
    align-items: flex-start;
    gap: 16px;
  }
  .tt-cur-hub__main { flex: 1 1 auto; order: 1; }
  .tt-cur-hub__alpha {
    flex-direction: column;
    flex-wrap: nowrap;
    order: 2;
    width: 36px;
    flex: 0 0 36px;
    max-height: calc(100vh - 96px);
    overflow-x: hidden;
    overflow-y: auto;
    position: sticky;
    top: 72px;
    padding: 10px 4px;
  }
  .tt-cur-hub__alpha-btn {
    width: 28px;
    min-width: 28px;
    padding: 0;
  }
  .tt-cur-hub__row[id^="tt-cur-hub-jump-"] { scroll-margin-top: 88px; }
}
.tt-cur-hub__table {
  margin: 20px auto 12px;
  border: 1px solid var(--tt-border, rgba(255,255,255,0.08));
  border-radius: 12px;
  overflow: hidden;
  min-width: 0;
  display: block;
  width: 100%;
  max-width: 100%;
  box-sizing: border-box;
}
.tt-cur-hub__body {
  display: flex;
  flex-direction: column;
  width: 100%;
}
.tt-cur-hub__row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  grid-template-areas: "sym links";
  align-items: center;
  gap: 12px 24px;
  padding: 12px 16px;
  border-bottom: 1px solid var(--tt-border, rgba(255,255,255,0.06));
  color: var(--tt-fg-0);
  min-width: 0;
  width: 100%;
  box-sizing: border-box;
}
.tt-cur-hub__row:last-child { border-bottom: none; }
.tt-cur-hub__row--head {
  background: rgba(255,255,255,0.03);
  font-size: 12px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--tt-fg-0);
  opacity: 0.75;
}
.tt-cur-hub__row:not(.tt-cur-hub__row--head):hover {
  background: rgba(41,98,255,0.08);
}
.tt-cur-hub__col { min-width: 0; }
.tt-cur-hub__col--sym { grid-area: sym; }
.tt-cur-hub__col--links {
  grid-area: links;
  text-align: end;
  justify-self: end;
}
.tt-cur-hub__sym-link {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
  text-decoration: none;
  color: var(--tt-fg-0);
}
.tt-cur-hub__sym-link:hover { color: var(--tt-fg-0); }
.tt-cur-hub__sym-link .tt-coin-icon { flex-shrink: 0; }
.tt-cur-hub__name {
  font-size: 16px;
  font-weight: 700;
  color: var(--tt-fg-0);
  white-space: nowrap;
}
.tt-cur-hub__links {
  display: inline-flex;
  flex-wrap: nowrap;
  align-items: center;
  justify-content: flex-end;
  gap: 4px;
  font-size: 12px;
  color: var(--tt-fg-0);
  white-space: nowrap;
}
.tt-cur-hub__link {
  color: var(--tt-fg-0);
  text-decoration: none;
  opacity: 0.85;
}
.tt-cur-hub__link:hover {
  opacity: 1;
  color: #2962ff;
}
.tt-cur-hub__sep {
  color: var(--tt-fg-0);
  opacity: 0.45;
  user-select: none;
}
.tt-cur-hub__foot { font-size: 14px; color: var(--tt-fg-0); opacity: 0.85; margin: 0; text-align: center; }
.tt-mkt-heat__stack {
  display: flex;
  flex-direction: column;
  gap: 28px;
  margin-top: 8px;
  min-width: 0;
  width: 100%;
}
.tt-mkt-heat__card {
  min-width: 0;
  width: 100%;
  padding: 16px;
  border: 1px solid var(--tt-border, rgba(255,255,255,0.08));
  border-radius: 12px;
  background: rgba(255,255,255,0.02);
  box-sizing: border-box;
}
.tt-mkt-heat__card-head {
  margin-top: 4px;
  margin-bottom: 14px;
  min-width: 0;
}
.tt-mkt-heat__card:first-child .tt-mkt-heat__card-head {
  margin-top: 0;
}
.tt-mkt-heat__card-title {
  margin: 0;
  font-size: 18px;
  font-weight: 700;
  color: var(--tt-fg-0);
}
.tt-mkt-heat__card-sub {
  margin: 6px 0 0;
  font-size: 12px;
  color: var(--tt-fg-0);
  opacity: 0.8;
}
.tt-mkt-heat__rsi-meta {
  display: block;
  margin-top: 6px;
  font-size: 12px;
  color: var(--tt-fg-0);
  opacity: 0.8;
}
.tt-mkt-heat__card-head .tt-mkt-heat__legend {
  margin-top: 10px;
  margin-bottom: 0;
}
.tt-mkt-heat__legend {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px 16px;
  margin-bottom: 12px;
  font-size: 12px;
  color: var(--tt-fg-0);
}
.tt-mkt-heat__legend-item {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.tt-mkt-heat__legend-item::before {
  content: '';
  width: 12px;
  height: 12px;
  border-radius: 3px;
  flex-shrink: 0;
}
.tt-mkt-heat__legend-item--up::before { background: rgba(38,166,154,0.65); }
.tt-mkt-heat__legend-item--down::before { background: rgba(239,83,80,0.65); }
.tt-mkt-heat__legend-item--neutral::before { background: rgba(120,123,134,0.35); }
.tt-mkt-heat__legend-size {
  margin-inline-start: auto;
  opacity: 0.8;
}
.tt-mkt-heat__map {
  width: 100%;
  min-height: 260px;
  border-radius: 8px;
  overflow: hidden;
}
.tt-mkt-heat__liq {
  position: relative;
  width: 100%;
  min-height: 200px;
  border-radius: 8px;
  overflow: hidden;
}
.tt-mkt-heat__fund-treemap {
  position: relative;
  width: 100%;
  min-height: 240px;
  border-radius: 8px;
  overflow: hidden;
}
.tt-mkt-heat__fund-heat {
  width: 100%;
  min-width: 0;
  overflow-x: auto;
}
.tt-mkt-heat__map .tt-mov-treemap__cell {
  text-decoration: none;
  color: var(--tt-fg-0);
  cursor: pointer;
}
.tt-mov-treemap__sr {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
@media (max-width: 767.98px) {
  .tt-cur-hub__row { padding: 10px 12px; gap: 8px; }
  .tt-mkt-heat__legend-size { margin-inline-start: 0; width: 100%; }
  .tt-mkt-heat__card { padding: 12px; }
}
@media (max-width: 575.98px) {
  .tt-cur-hub__row {
    grid-template-columns: 1fr;
    grid-template-areas:
      "sym"
      "links";
    gap: 6px;
    padding: 10px 12px;
  }
  .tt-cur-hub__col--links {
    text-align: start;
    justify-self: start;
  }
  .tt-cur-hub__links { justify-content: flex-start; }
}
@media (max-width: 399.98px) {
  .tt-cur-hub__row { padding: 10px; }
}
.tt-sent-base__tile { padding: 16px; border: 1px solid rgba(255,255,255,0.08); border-radius: 12px; }
.tt-sent-base__tile-title { font-size: 16px; color: var(--tt-fg-0); margin-bottom: 10px; }
.tt-sent-base__bar { height: 12px; background: rgba(255,255,255,0.08); border-radius: 999px; overflow: hidden; }
.tt-sent-base__bar span { display: block; height: 100%; background: var(--tt-up); }
.tt-sent-base__meta { font-size: 14px; color: var(--tt-fg-0); margin-top: 8px; }
.tt-mov-detail__bar { height: 16px; background: rgba(255,255,255,0.08); border-radius: 8px; overflow: hidden; }
.tt-mov-detail__bar-fill { height: 100%; }
.tt-mov-detail__note { font-size: 14px; color: var(--tt-fg-0); margin-top: 12px; }
