/*
 * LimitedHub - Marketplace page styles.
 *
 * This page keeps its own stylesheet (not css/style.css) so it doesn't
 * drag in every home-page section's CSS. The shared "chrome" below
 * (tokens, reset, navbar, mobile menu, account popover, auth modal,
 * buttons, footer) is copied from css/style.css - if you change one of
 * those there, mirror the change here too.
 */

:root {
  /* Tells the browser to render its OWN native UI (select dropdown popups,
     scrollbars, date pickers, etc.) using a dark palette instead of the
     OS/browser default light one - without this, a <select>'s closed box
     picks up our dark .auth-input/.sell-select/etc styling just fine, but
     the popup list of <option>s that appears on click is native browser
     chrome and ignored our CSS entirely, showing up as a jarring white
     dropdown on an otherwise all-dark page. */
  color-scheme: dark;
  --bg: #08080a;
  --border: #1e1e26;
  --border-soft: #16161c;
  --accent: #ff9d2e;
  --accent-dim: #7a4d1c;
  --text: #f4f2ee;
  --text-dim: #8c8b96;
  --text-faint: #55555f;
  --glass-bg: rgba(15, 15, 19, 0.55);
  --avatar-empty: #2b2b33;
  --avatar-empty-ring: #38383f;
  --danger: #ff6b5e;
  --ok: #34d399;
  --font-display: 'Rubik', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --font-mono: 'IBM Plex Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
  --ease: cubic-bezier(0.4, 0, 0.2, 1);
  --ease-premium: cubic-bezier(0.16, 1, 0.3, 1);
}

* {
  box-sizing: border-box;
}

html,
body {
  margin: 0;
  padding: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-display);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

/* ---------- custom scrollbar ---------- */

html {
  scrollbar-width: thin;
  scrollbar-color: var(--accent-dim) var(--bg);
  scroll-behavior: smooth;
}

section[id] {
  scroll-margin-top: 90px;
}

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }
}

::-webkit-scrollbar {
  width: 11px;
  height: 11px;
}

::-webkit-scrollbar-track {
  background: var(--bg);
}

::-webkit-scrollbar-thumb {
  background-color: var(--accent-dim);
  border: 3px solid var(--bg);
  border-radius: 999px;
  transition: background-color 0.2s var(--ease);
}

::-webkit-scrollbar-thumb:hover {
  background-color: var(--accent);
}

::-webkit-scrollbar-corner {
  background: var(--bg);
}

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    transition: none !important;
    animation: none !important;
  }
}

a {
  color: inherit;
  text-decoration: none;
}

button {
  font-family: inherit;
  color: inherit;
  background: none;
  border: none;
  cursor: pointer;
}

.stage {
  position: relative;
  min-height: 100vh;
  width: 100%;
  background-color: var(--bg);
  background-image:
    linear-gradient(rgba(255, 255, 255, 0.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px);
  background-size: 44px 44px;
  background-attachment: fixed;
  display: flex;
  flex-direction: column;
}

/* Grid pattern folded directly into .stage's own background instead of
   a separate .stage::before pseudo-element (that's what used to bleed
   through card backgrounds - see git history/DEPLOY notes). A box's own
   background always paints behind its own content, no matter what -
   there's no stacking-context/z-index class of bug possible here at
   all, which is strictly more robust than the earlier z-index:-1 patch.
   Known, accepted tradeoff: background-attachment: fixed can silently
   fall back to scroll behavior on some older mobile Safari versions -
   there the grid just scrolls with the page instead of staying pinned;
   harmless, and still strictly better than the bug this replaces. Same
   change mirrored into every page's own css/style.css copy - see
   build.js's header comment for why there's no single shared
   stylesheet. */

/* ---------- NAVBAR (glass) ---------- */

.navbar {
  position: sticky;
  top: 0;
  z-index: 50;
  background: var(--glass-bg);
  /* blur radius cut from 22px to 12px - this bar sits sticky at the top
     of every page, so the browser re-computes this blur on every scroll
     frame the whole time you scroll; blur cost roughly scales with the
     radius squared, so this is a large, continuous saving in exchange for
     a barely-noticeable difference in how "frosted" it looks. Originally
     applied only to marketplace/author/css/style.css (Sept 2026) but
     never mirrored to the other copies of this shared chrome - every
     other page kept paying the full 22px cost on every scroll frame
     ever since, which is what made scrolling feel noticeably less smooth
     site-wide compared to that one page. */
  backdrop-filter: blur(12px) saturate(140%);
  -webkit-backdrop-filter: blur(12px) saturate(140%);
  border-bottom: 1px solid var(--border);
}

.nav-inner {
  width: 100%;
  padding: 0 clamp(24px, 5vw, 72px);
  height: 68px;
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: 24px;
}

/* logo */

.logo {
  display: inline-flex;
  align-items: center;
  justify-self: start;
  outline-offset: 6px;
  padding: 4px 0;
}

.logo:focus-visible {
  outline: 1px solid var(--accent);
}

.logo-mark {
  display: block;
  height: 22px;
  width: auto;
  flex: none;
  transition: transform 0.25s var(--ease), filter 0.25s var(--ease);
  filter: drop-shadow(0 0 0 rgba(255, 157, 46, 0));
}

.logo:hover .logo-mark {
  transform: translateY(-1px) scale(1.04);
  filter: drop-shadow(0 0 14px rgba(255, 157, 46, 0.35));
}

.logo:active .logo-mark {
  transform: translateY(0) scale(0.98);
}

/* center nav */

.nav-links {
  list-style: none;
  display: flex;
  align-items: center;
  gap: clamp(4px, 1.4vw, 20px);
  margin: 0;
  padding: 0;
  justify-self: center;
}

.nav-link {
  position: relative;
  display: inline-block;
  padding: 9px 13px 11px;
  font-size: 0.81rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--text-dim);
  transition: color 0.25s var(--ease), letter-spacing 0.25s var(--ease);
}

.nav-link-label {
  display: inline-block;
  transition: transform 0.25s var(--ease);
}

.nav-link::after {
  content: '';
  position: absolute;
  left: 13px;
  right: 13px;
  bottom: 5px;
  height: 2px;
  background: var(--accent);
  opacity: 0;
  transform: scaleX(0);
  transform-origin: center;
  transition: transform 0.25s var(--ease), opacity 0.25s var(--ease);
}

.nav-link:hover,
.nav-link:focus-visible {
  color: var(--text);
  letter-spacing: 0.055em;
}

.nav-link:hover .nav-link-label,
.nav-link:focus-visible .nav-link-label {
  transform: translateY(-1px);
}

.nav-link:hover::after,
.nav-link:focus-visible::after {
  opacity: 0.5;
  transform: scaleX(1);
}

.nav-link:focus-visible {
  outline: none;
}

.nav-link.is-active {
  color: var(--text);
  font-weight: 700;
}

.nav-link.is-active::after {
  opacity: 1;
  transform: scaleX(1);
}

/* avatar + name */

.nav-right {
  justify-self: end;
  position: relative;
  display: flex;
  align-items: center;
  gap: 6px;
}

/* cart icon (shared across all pages) */

.cart-btn {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  flex: none;
  border-radius: 50%;
  color: var(--text-dim);
  transition: background-color 0.25s var(--ease), color 0.25s var(--ease);
}

.cart-btn:hover {
  background-color: rgba(255, 255, 255, 0.045);
  color: var(--text);
}

.cart-btn:focus-visible {
  outline: 1px solid var(--accent);
  outline-offset: 3px;
}

/* .cart-btn sets its own `display: flex` for layout (icon centering),
   which - being an ordinary author-stylesheet class rule - always wins
   over the browser's own `[hidden] { display: none }` default, since
   author rules beat UA rules regardless of selector specificity. Without
   this, any button/link carrying .cart-btn while also `hidden` (e.g. the
   notification bell before js/notifications.js decides whether to show
   it - see #notifBtn) renders anyway, as an empty circle, for every
   visitor including signed-out ones. */
.cart-btn[hidden] {
  display: none;
}

.cart-icon {
  width: 19px;
  height: 19px;
}

.cart-badge {
  position: absolute;
  top: 1px;
  right: 1px;
  min-width: 15px;
  height: 15px;
  padding: 0 3px;
  border-radius: 999px;
  background: var(--accent);
  color: #06070a;
  font-family: var(--font-mono);
  font-size: 0.62rem;
  font-weight: 700;
  line-height: 15px;
  text-align: center;
}

.cart-badge[hidden] {
  display: none;
}

/* hamburger (mobile only) */

.hamburger-btn {
  display: none;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: 5px;
  width: 44px;
  height: 44px;
  flex: none;
  border-radius: 50%;
  transition: background-color 0.25s var(--ease);
}

.hamburger-btn:hover {
  background-color: rgba(255, 255, 255, 0.045);
}

.hamburger-btn:focus-visible {
  outline: 1px solid var(--accent);
  outline-offset: 3px;
}

.hamburger-line {
  display: block;
  width: 19px;
  height: 1.5px;
  background: var(--text);
  transition: transform 0.22s var(--ease), opacity 0.22s var(--ease);
}

.hamburger-btn[aria-expanded='true'] .hamburger-line:nth-child(1) {
  transform: translateY(6.5px) rotate(45deg);
}

.hamburger-btn[aria-expanded='true'] .hamburger-line:nth-child(2) {
  opacity: 0;
}

.hamburger-btn[aria-expanded='true'] .hamburger-line:nth-child(3) {
  transform: translateY(-6.5px) rotate(-45deg);
}

/* mobile dropdown menu */

.mobile-menu {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  display: flex;
  flex-direction: column;
  background: var(--glass-bg);
  /* same 22px -> 12px cut as .navbar above, same reason - mobile GPUs feel
     a large blur radius even more than desktop does. Missed in the first
     propagation pass since that one only matched the .navbar block; caught
     on the follow-up full-site re-check. */
  backdrop-filter: blur(12px) saturate(140%);
  -webkit-backdrop-filter: blur(12px) saturate(140%);
  border-bottom: 1px solid var(--border);
  padding: 0 clamp(24px, 5vw, 72px);
  max-height: 0;
  overflow: hidden;
  opacity: 0;
  transition: max-height 0.28s var(--ease), opacity 0.2s var(--ease);
}

.mobile-menu.is-open {
  max-height: 320px;
  opacity: 1;
  padding-top: 6px;
  padding-bottom: 14px;
}

.mobile-link {
  padding: 14px 4px;
  border-radius: 6px;
  font-size: 0.95rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: var(--text-dim);
  border-bottom: 1px solid var(--border-soft);
  transition: color 0.2s var(--ease), background-color 0.2s var(--ease);
}

.mobile-link:last-child {
  border-bottom: none;
}

.mobile-link:hover {
  color: var(--text);
  background-color: rgba(255, 255, 255, 0.04);
}

.mobile-link.is-active {
  color: var(--text);
  font-weight: 700;
}

.mobile-link:active {
  color: var(--accent);
}

.account-btn {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 4px 10px 4px 4px;
  border-radius: 20px;
  transition: background-color 0.25s var(--ease);
}

.account-btn:hover {
  background-color: rgba(255, 255, 255, 0.045);
}

.account-btn:focus-visible {
  outline: 1px solid var(--accent);
  outline-offset: 3px;
}

.avatar-ring {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  flex: none;
  overflow: hidden;
  border: 1px solid var(--avatar-empty-ring);
  background: var(--avatar-empty);
  transition: border-color 0.25s var(--ease), background 0.25s var(--ease), transform 0.25s var(--ease);
}

.account-btn:hover .avatar-ring {
  border-color: var(--accent-dim);
  transform: scale(1.06);
}

.avatar-glyph {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 500;
  color: var(--text-faint);
}

.avatar-photo {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: none;
}

.avatar-ring[data-photo='1'] .avatar-glyph {
  display: none;
}

.avatar-ring[data-photo='1'] .avatar-photo {
  display: block;
}

.stage[data-auth='in'] .avatar-glyph {
  color: var(--accent);
  font-weight: 600;
}

.account-name {
  font-size: 0.83rem;
  font-weight: 600;
  color: var(--text);
  display: none;
  transition: color 0.25s var(--ease);
}

.account-btn:hover .account-name {
  color: var(--accent);
}

/* state: logged in */

.stage[data-auth='in'] .avatar-ring {
  border-color: var(--accent-dim);
  background: linear-gradient(145deg, rgba(255, 157, 46, 0.22) 0%, rgba(255, 157, 46, 0.03) 100%);
}

.stage[data-auth='in'] .account-name {
  display: inline;
}

/* popover */

.popover {
  position: absolute;
  top: calc(100% + 12px);
  right: 0;
  width: 248px;
  background: #101014;
  border: 1px solid var(--border);
  box-shadow: 0 20px 40px -12px rgba(0, 0, 0, 0.6);
  padding: 18px;
  opacity: 0;
  transform: translateY(-6px);
  pointer-events: none;
  transition: opacity 0.16s var(--ease), transform 0.16s var(--ease);
}

.popover.is-open {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

.popover-eyebrow {
  font-family: var(--font-mono);
  font-size: 0.65rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--text-faint);
  margin: 0 0 10px;
}

.popover-title {
  font-size: 1rem;
  font-weight: 700;
  margin: 0 0 6px;
}

.popover-body {
  font-size: 0.8rem;
  line-height: 1.5;
  color: var(--text-dim);
  margin: 0 0 16px;
}

.popover-user {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 14px;
}

.popover-avatar {
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: linear-gradient(145deg, #3a2c1a 0%, #1c1610 100%);
  border: 1px solid var(--accent-dim);
  flex: none;
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}

.popover-avatar-initial {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  font-weight: 700;
  color: var(--accent);
}

.popover-avatar-photo {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: none;
}

.popover-avatar[data-photo='1'] .popover-avatar-initial {
  display: none;
}

.popover-avatar[data-photo='1'] .popover-avatar-photo {
  display: block;
}

.popover-user-name {
  display: block;
  font-size: 0.85rem;
  font-weight: 600;
}

.popover-user-email {
  font-family: var(--font-mono);
  font-size: 0.68rem;
  color: var(--text-faint);
}

.popover-btn {
  width: 100%;
  padding: 10px 12px;
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  text-align: center;
  transition: background 0.15s var(--ease), color 0.15s var(--ease), border-color 0.15s var(--ease);
}

.popover-btn:focus-visible {
  outline: 1px solid var(--accent);
  outline-offset: 2px;
}

.popover-btn.primary {
  background: var(--accent);
  color: #1a1104;
  border: 1px solid var(--accent);
}

.popover-btn.primary:hover {
  background: #ffb257;
}

.popover-btn.ghost {
  background: transparent;
  color: var(--text-dim);
  border: 1px solid var(--border);
  margin-top: 8px;
}

.popover-btn.ghost:hover {
  color: var(--text);
  border-color: var(--text-faint);
}

.popover-menu {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin-bottom: 4px;
}

.popover-link {
  display: block;
  padding: 8px 6px;
  font-size: 0.8rem;
  color: var(--text-dim);
  border-radius: 2px;
  transition: color 0.15s var(--ease), background 0.15s var(--ease);
}

.popover-link[hidden] {
  display: none;
}

.popover-link:disabled {
  color: var(--text-faint);
  cursor: default;
  pointer-events: none;
}

.popover-link:hover {
  color: var(--text);
  background: var(--border-soft);
}

.popover-link.is-accent {
  color: var(--accent);
  font-weight: 600;
}

.popover-link.is-accent:hover {
  background: rgba(255, 157, 46, 0.1);
}

.popover-divider {
  height: 1px;
  background: var(--border);
  margin: 10px 0;
  border: none;
}

/* ---------- AUTH MODAL (login / register) ---------- */

.auth-overlay {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
  background: rgba(6, 5, 4, 0.5);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  opacity: 0;
  /* visibility (not just opacity/pointer-events) matters here: this class
     is reused by every modal on the site, including the always-present
     sign-in modal's hCaptcha widget. A third-party iframe (hCaptcha's
     checkbox) can re-assert its own `pointer-events: auto` internally,
     which un-does an ancestor's `pointer-events: none` for that iframe
     specifically - opacity/pointer-events alone were not enough to stop
     the CLOSED sign-in modal's captcha from still being clickable through
     whatever modal was actually open on top of it (both share this exact
     class, position and z-index). `visibility: hidden` has no such
     escape hatch - a descendant cannot un-hide itself - so it closes that
     gap for every .auth-overlay on the site, not just this one page.
     Delayed via the transition below so the existing opacity fade-out
     still plays in full before the element actually stops being
     interactive/hit-testable. */
  visibility: hidden;
  pointer-events: none;
  transition: opacity 0.22s var(--ease), visibility 0s linear 0.22s;
}

.auth-overlay.is-open {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transition: opacity 0.22s var(--ease), visibility 0s linear 0s;
}

.auth-modal {
  width: 100%;
  max-width: 400px;
  background: #121216;
  border: 1px solid var(--border);
  border-radius: 22px;
  box-shadow: 0 30px 70px -20px rgba(0, 0, 0, 0.75);
  padding: 30px 30px 28px;
  position: relative;
  transform: translateY(10px) scale(0.98);
  transition: transform 0.3s var(--ease);
}

.auth-modal--tall {
  max-height: min(88vh, 720px);
  overflow-y: auto;
}

.auth-overlay.is-open .auth-modal {
  transform: translateY(0) scale(1);
}

.auth-close {
  position: absolute;
  top: 12px;
  right: 12px;
  width: 40px;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text-faint);
  font-size: 1.2rem;
  line-height: 1;
  border-radius: 50%;
  transition: color 0.2s var(--ease), background-color 0.2s var(--ease);
}

.auth-close:hover {
  color: var(--text);
  background-color: rgba(255, 255, 255, 0.06);
}

/* brand row */

.auth-brand {
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 4px 0 24px;
}

.auth-brand-logo {
  height: 30px;
  width: auto;
  display: block;
}

/* segmented pill switch */

.auth-switch {
  position: relative;
  display: grid;
  grid-template-columns: 1fr 1fr;
  background: #1a1a20;
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 4px;
}

.auth-switch-thumb {
  position: absolute;
  top: 4px;
  left: 4px;
  width: calc(50% - 4px);
  height: calc(100% - 8px);
  background: #f1efe8;
  border-radius: 9px;
  transform: translateX(0);
  transition: transform 0.32s var(--ease);
  will-change: transform;
}

.auth-modal[data-mode='signup'] .auth-switch-thumb {
  transform: translateX(100%);
}

.auth-switch-btn {
  position: relative;
  z-index: 1;
  padding: 13px 12px;
  font-family: var(--font-mono);
  font-size: 0.74rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-align: center;
  color: var(--text-dim);
  transition: color 0.25s var(--ease);
}

.auth-switch-btn.is-active {
  color: #14141a;
}

.auth-switch-btn:focus-visible {
  outline: 1px solid var(--accent);
  outline-offset: 2px;
  border-radius: 8px;
}

/* heading + copy */

.auth-panel {
  margin-top: 22px;
}

.auth-heading {
  font-family: var(--font-display);
  font-size: 1.7rem;
  font-weight: 800;
  line-height: 1.18;
  margin: 0 0 8px;
  white-space: nowrap;
}

.auth-heading-accent {
  color: var(--accent);
  font-style: italic;
  font-weight: 800;
}

.auth-subcopy {
  font-size: 0.85rem;
  line-height: 1.5;
  color: var(--text-dim);
  margin: 0 0 22px;
}

/* form */

.auth-form {
  display: flex;
  flex-direction: column;
}

.auth-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
}

.auth-label {
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--text-dim);
  margin: 12px 0 6px;
}

.auth-label-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin: 12px 0 6px;
}

.auth-label-row .auth-label {
  margin: 0;
}

.auth-forgot-link {
  font-size: 0.72rem;
  font-weight: 600;
  color: var(--text-faint);
  transition: color 0.2s var(--ease);
}

.auth-forgot-link:hover {
  color: var(--accent);
}

.auth-forgot-link:focus-visible {
  outline: 1px solid var(--accent);
  outline-offset: 2px;
  border-radius: 4px;
}

.auth-input {
  width: 100%;
  padding: 12px 14px;
  background: #18181e;
  border: 1px solid transparent;
  border-radius: 10px;
  color: var(--text);
  font-family: var(--font-display);
  font-size: 0.88rem;
  transition: border-color 0.2s var(--ease), box-shadow 0.2s var(--ease);
}

.auth-input::placeholder {
  color: var(--text-faint);
}

.auth-input:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 3px rgba(255, 157, 46, 0.14);
}

/* Chrome/Edge/Safari autofill (a saved email/password, address or payment
   autofill) forcibly repaints an input's background AND text color with
   its own yellow/light-blue styling the moment it's autofilled - this
   completely ignores .auth-input's own `background`/`color` above, and a
   real `background-color` override on `:-webkit-autofill` gets ignored
   by the browser too (this is the "browser overrides our style" bug
   people notice on login/signup/checkout forms). The fix is the standard
   trick: an inset box-shadow big enough to cover the whole field is NOT
   one of the properties the browser locks, so painting our own dark
   color that way (instead of `background-color`) actually sticks, and
   `-webkit-text-fill-color` forces the text back to our own color too.
   The absurdly long `transition` delay defeats Chrome's own animation
   that reveals the yellow tint after a short delay. Applies everywhere
   .auth-input is used (login/signup, checkout, profile editing, "Start a
   Project", tutorials/add, etc.) since they all share this one class. */
.auth-input:-webkit-autofill,
.auth-input:-webkit-autofill:hover,
.auth-input:-webkit-autofill:focus {
  -webkit-text-fill-color: var(--text);
  -webkit-box-shadow: 0 0 0 1000px #18181e inset;
  box-shadow: 0 0 0 1000px #18181e inset;
  transition: background-color 600000s 0s, color 600000s 0s;
}

/* Belt-and-suspenders for the <select> popup on top of `color-scheme: dark`
   above (root of the file) - explicit dark colors on every <option> site-
   wide, in case a browser only partially dark-themes the native dropdown. */
select option {
  background: #18181e;
  color: var(--text);
}

.auth-textarea {
  min-height: 110px;
  resize: vertical;
  font-family: var(--font-display);
  line-height: 1.5;
}

.freelancer-guidelines {
  background: #18181e;
  border: 1px solid var(--border);
  border-radius: 14px;
  padding: 16px 18px;
  margin-bottom: 18px;
}

.freelancer-guidelines p {
  font-size: 0.84rem;
  color: var(--text-dim);
  margin: 0 0 10px;
}

.freelancer-guidelines-list {
  margin: 0 0 10px;
  padding-left: 18px;
  font-size: 0.82rem;
  color: var(--text-dim);
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.freelancer-guidelines-note {
  font-size: 0.76rem;
  color: var(--text-faint);
  margin: 0 !important;
}

/* show/hide password */

.auth-password-wrap {
  position: relative;
}

.auth-password-wrap .auth-input {
  padding-right: 46px;
}

.auth-password-toggle {
  position: absolute;
  top: 50%;
  right: 4px;
  transform: translateY(-50%);
  display: flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: 8px;
  color: var(--text-faint);
  transition: color 0.2s var(--ease), background-color 0.2s var(--ease);
}

.auth-password-toggle:hover {
  color: var(--text-dim);
  background-color: rgba(255, 255, 255, 0.06);
}

.auth-password-toggle:focus-visible {
  outline: 1px solid var(--accent);
  outline-offset: 2px;
}

.auth-password-toggle.is-visible {
  color: var(--accent);
}

.icon-eye {
  display: block;
  width: 18px;
  height: 18px;
  background-color: currentColor;
  -webkit-mask: url('/assets/icons/eye.svg') no-repeat center / contain;
  mask: url('/assets/icons/eye.svg') no-repeat center / contain;
}

.auth-password-toggle.is-visible .icon-eye {
  -webkit-mask-image: url('/assets/icons/eye-slash.svg');
  mask-image: url('/assets/icons/eye-slash.svg');
}

.auth-error {
  font-size: 0.78rem;
  line-height: 1.4;
  color: var(--danger);
  background: rgba(255, 107, 94, 0.08);
  border: 1px solid rgba(255, 107, 94, 0.25);
  border-radius: 8px;
  padding: 9px 11px;
  margin-top: 12px;
}

.auth-success {
  font-size: 0.78rem;
  line-height: 1.4;
  color: var(--ok);
  background: rgba(52, 211, 153, 0.08);
  border: 1px solid rgba(52, 211, 153, 0.25);
  border-radius: 8px;
  padding: 9px 11px;
  margin-top: 12px;
}

.auth-submit {
  margin-top: 18px;
  padding: 13px 16px;
  border-radius: 12px;
  background: var(--accent);
  color: #1a1104;
  font-size: 0.83rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  box-shadow: 0 16px 32px -12px rgba(255, 157, 46, 0.5);
  transition: transform 0.2s var(--ease), box-shadow 0.2s var(--ease), filter 0.2s var(--ease);
}

.auth-submit-arrow {
  transition: transform 0.2s var(--ease);
}

.auth-submit:hover {
  filter: brightness(1.05);
  transform: translateY(-1px);
  box-shadow: 0 20px 38px -12px rgba(255, 157, 46, 0.6);
}

.auth-submit:hover .auth-submit-arrow {
  transform: translateX(3px);
}

.auth-submit:focus-visible {
  outline: 1px solid var(--accent);
  outline-offset: 2px;
}

.auth-submit:disabled {
  opacity: 0.6;
  cursor: default;
  transform: none;
}

/* google */

.auth-divider {
  height: 1px;
  background: var(--border);
  margin: 20px 0 16px;
}

.auth-google-btn {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding: 11px 16px;
  border: 1px solid var(--border);
  border-radius: 12px;
  background: #18181e;
  color: var(--text);
  font-size: 0.85rem;
  font-weight: 600;
  transition: background-color 0.2s var(--ease), border-color 0.2s var(--ease);
}

.auth-google-btn:hover {
  background: #1e1e25;
  border-color: var(--text-faint);
}

.auth-google-btn:focus-visible {
  outline: 1px solid var(--accent);
  outline-offset: 2px;
}

.google-icon {
  flex: none;
  display: block;
}

/* footer lines */

.auth-legal {
  margin: 14px 0 0;
  font-size: 0.72rem;
  line-height: 1.5;
  color: var(--text-faint);
  text-align: center;
}

.auth-legal a {
  color: var(--text-dim);
  text-decoration: underline;
}

.auth-legal a:hover {
  color: var(--text);
}

.auth-consent-row {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  margin: 4px 0 2px;
  font-size: 0.72rem;
  line-height: 1.5;
  color: var(--text-faint);
  cursor: pointer;
}

.auth-consent-checkbox {
  flex-shrink: 0;
  width: 15px;
  height: 15px;
  margin-top: 2px;
  accent-color: var(--accent);
  cursor: pointer;
}

.auth-consent-row a {
  color: var(--text-dim);
  text-decoration: underline;
}

.auth-consent-row a:hover {
  color: var(--text);
}

@media (max-width: 480px) {
  .auth-modal {
    padding: 24px 20px 24px;
    border-radius: 18px;
  }

  .auth-row {
    grid-template-columns: 1fr;
  }
}

/* ---------- shared: wide modal + custom select dropdown ----------
   Added for the "Start a Project" modal (partials/project-inquiry-modal.html,
   see js/site-forms.js) - a full-width modifier and a from-scratch <select>
   re-skin, both promoted to shared chrome since the project inquiry modal
   is injected on every page. If you change one of these, mirror the
   change in every other page's own copy (same rule as the rest of this
   "shared chrome" block - see the comment at the top of this file). */

.auth-modal--wide {
  max-width: 600px;
}

/* A native <select>'s closed box happily takes .auth-input's dark
   styling, but its OPEN popup is OS/browser chrome - `color-scheme: dark`
   (root of this file) gets it part of the way, but the browser still
   paints its own blue highlight on the hovered/selected row and there is
   no CSS hook to change that. So any <select> that opts into this (see
   enhanceSelect() in js/site-forms.js) gets visually hidden via
   `.select-native` below - it stays in the DOM as the real source of
   truth for .value - and a fully custom trigger button + option list is
   layered on top instead, themed with our own accent color. */
.select-native {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.select-wrap {
  position: relative;
}

.select-trigger {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  text-align: left;
  cursor: pointer;
}

.select-value {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.select-value--placeholder {
  color: var(--text-faint);
}

.select-arrow {
  flex: none;
  width: 8px;
  height: 8px;
  border-right: 1px solid var(--text-dim);
  border-bottom: 1px solid var(--text-dim);
  transform: rotate(45deg) translateY(-3px);
  transition: transform 0.2s var(--ease), border-color 0.2s var(--ease);
}

.select-wrap.is-open .select-arrow {
  transform: rotate(-135deg) translateY(1px);
  border-color: var(--accent);
}

.select-list {
  position: absolute;
  left: 0;
  right: 0;
  top: calc(100% + 6px);
  z-index: 20;
  background: #18181e;
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 6px;
  max-height: 220px;
  overflow-y: auto;
  box-shadow: 0 20px 40px -12px rgba(0, 0, 0, 0.6);
}

.select-option {
  padding: 9px 10px;
  border-radius: 7px;
  font-family: var(--font-display);
  font-size: 0.88rem;
  color: var(--text);
  cursor: pointer;
}

.select-option:hover,
.select-option.is-active {
  background: rgba(255, 157, 46, 0.14);
}

.select-option[aria-selected='true'] {
  color: var(--accent);
  font-weight: 600;
}

/* ---------- shared: "Start a Project" modal extras ----------
   Added back alongside the modal itself (partials/project-inquiry-modal.html,
   js/site-forms.js) when "Start a Project" reverted from its own page back
   to a popup. Mirrors the "success panel" pattern already used elsewhere
   (tutorials/add's .admin-gate, the old /start-project page's
   .sp-success-panel) but under its own class names since this modal is
   shared on every page and shouldn't depend on the admin-only .admin-gate
   styling. If you change one of these, mirror the change in every other
   page's own copy (same rule as the rest of this "shared chrome" block). */

/* .auth-form sets `display: flex`, which (being an author-stylesheet rule)
   otherwise wins over the browser's own `[hidden] { display: none }` -
   without this, `someForm.hidden = true` on anything carrying .auth-form
   silently does nothing. */
.auth-form[hidden] {
  display: none;
}

.project-success-panel {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: 180px;
  text-align: center;
  color: var(--text-dim);
  border: 1px solid rgba(52, 211, 153, 0.3);
  border-radius: 16px;
  background: rgba(52, 211, 153, 0.05);
  padding: 32px 24px;
}

.project-success-panel[hidden] {
  display: none;
}

.project-success-panel-title {
  font-size: 1.1rem;
  font-weight: 700;
  color: var(--text);
  margin: 0;
}

.project-success-panel-text {
  font-size: 0.9rem;
  line-height: 1.5;
  margin: 0;
  max-width: 420px;
}

.project-optional {
  text-transform: none;
  font-weight: 400;
  color: var(--text-faint);
  letter-spacing: 0;
}

/* ---------- main content / hero ---------- */

.main-content {
  flex: 1;
}

@media (max-width: 720px) {
  .nav-links {
    display: none;
  }
  .nav-inner {
    grid-template-columns: auto 1fr;
  }
  .account-name {
    display: none !important;
  }
  .hamburger-btn {
    display: flex;
  }
  .popover {
    width: min(280px, calc(100vw - 48px));
  }
}

/* ---------- buttons (shared, copied from css/style.css) ---------- */

.hero-btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 16px 26px;
  border-radius: 10px;
  overflow: hidden;
  font-family: var(--font-mono);
  font-size: 0.8rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  transition: transform 0.2s var(--ease), background-color 0.2s var(--ease), border-color 0.2s var(--ease), filter 0.2s var(--ease), box-shadow 0.2s var(--ease);
}

.hero-btn[hidden] {
  display: none;
}

.hero-btn::before {
  content: '';
  position: absolute;
  top: 0;
  left: -60%;
  width: 40%;
  height: 100%;
  background: linear-gradient(120deg, transparent, rgba(255, 255, 255, 0.35), transparent);
  transform: skewX(-20deg);
  transition: left 0.65s var(--ease-premium);
  pointer-events: none;
}

.hero-btn:hover::before {
  left: 130%;
}

.hero-btn.primary {
  background: var(--accent);
  color: #1a1104;
  box-shadow: 0 20px 40px -18px rgba(255, 157, 46, 0.55);
}

.hero-btn.primary:hover {
  transform: translateY(-1px);
  filter: brightness(1.06);
  box-shadow: 0 24px 46px -16px rgba(255, 157, 46, 0.65);
}

.hero-btn-arrow {
  transition: transform 0.2s var(--ease);
}

.hero-btn.primary:hover .hero-btn-arrow {
  transform: translateX(3px);
}

.hero-btn.outline {
  background: transparent;
  border: 1px solid var(--border);
  color: var(--text);
}

.hero-btn.outline:hover {
  border-color: var(--text-faint);
  background: rgba(255, 255, 255, 0.03);
}

.hero-btn:focus-visible {
  outline: 1px solid var(--accent);
  outline-offset: 2px;
}

/* ---------- footer ---------- */

.footer {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: #000000;
  border-top: 1px solid var(--border);
  padding: 40px clamp(24px, 5vw, 72px) 0;
}

.footer-inner {
  position: relative;
  z-index: 1;
  width: 100%;
}

.footer-top {
  display: grid;
  grid-template-columns: minmax(220px, 320px) 1fr;
  gap: 48px;
  padding-bottom: 32px;
}

.footer-brand {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 13px;
}

.footer-logo {
  display: inline-flex;
  align-items: center;
  gap: 9px;
}

.footer-logo-mark {
  width: 22px;
  height: 22px;
  object-fit: contain;
}

.footer-logo-word {
  font-family: var(--font-display);
  font-weight: 900;
  font-size: 0.98rem;
  letter-spacing: -0.01em;
  color: var(--text);
}

.footer-tagline {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 0.82rem;
  line-height: 1.6;
  color: var(--text-faint);
  margin: 0;
  max-width: 300px;
}

.footer-social {
  display: flex;
  gap: 8px;
  margin-top: 2px;
}

.footer-social-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 8px;
  border: 1px solid var(--border);
  color: var(--text-faint);
  transition: border-color 0.25s var(--ease), color 0.25s var(--ease), transform 0.25s var(--ease-premium);
}

.footer-social-link:hover {
  border-color: var(--accent-dim);
  color: var(--accent);
  transform: translateY(-2px);
}

.footer-social-link svg {
  width: 14px;
  height: 14px;
}

.footer-links {
  display: grid;
  grid-template-columns: repeat(3, minmax(110px, 150px));
  gap: 28px;
  justify-content: end;
}

.footer-col {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 10px;
}

.footer-col-title {
  font-family: var(--font-mono);
  font-size: 0.66rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-dim);
  margin: 0 0 4px;
}

.footer-link {
  font-family: var(--font-display);
  font-size: 0.82rem;
  color: var(--text-faint);
  transition: color 0.2s var(--ease), transform 0.2s var(--ease-premium);
}

.footer-link:hover {
  color: var(--text);
  transform: translateX(2px);
}

.footer-bottom {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  padding: 16px 0;
  border-top: 1px solid var(--border);
  flex-wrap: wrap;
}

.footer-copyright,
.footer-signature {
  font-family: var(--font-mono);
  font-size: 0.7rem;
  color: var(--text-faint);
  margin: 0;
}

.footer-watermark {
  display: block;
  text-align: center;
  font-family: var(--font-display);
  font-weight: 900;
  font-size: clamp(1.8rem, 5vw, 3.2rem);
  line-height: 1;
  letter-spacing: -0.01em;
  color: transparent;
  -webkit-text-stroke: 1px var(--border);
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.025), transparent 90%);
  -webkit-background-clip: text;
  background-clip: text;
  pointer-events: none;
  user-select: none;
  margin-top: 2px;
  padding-bottom: 14px;
  overflow: hidden;
  white-space: nowrap;
}

@media (max-width: 900px) {
  .footer-top {
    grid-template-columns: 1fr;
    gap: 40px;
  }
  .footer-links {
    justify-content: start;
    grid-template-columns: repeat(3, minmax(100px, 1fr));
    gap: 24px;
  }
  .footer-brand {
    max-width: 420px;
  }
}

@media (max-width: 560px) {
  .footer {
    padding-top: 36px;
  }
  .footer-links {
    grid-template-columns: repeat(2, 1fr);
  }
  .footer-bottom {
    flex-direction: column;
    align-items: flex-start;
    gap: 8px;
  }
}


/* ---------- tutorial card (used in "More like this", copied from
   tutorials/css/style.css) ---------- */

.tu-card {
  position: relative;
  display: flex;
  flex-direction: column;
  border-radius: 14px;
  border: 1px solid var(--border);
  background: #0e0e12;
  overflow: hidden;
  color: inherit;
  text-decoration: none;
  opacity: 0;
  transform: translateY(32px);
  transition: opacity 0.7s var(--ease-premium), transform 0.5s var(--ease-premium), border-color 0.3s var(--ease);
}

.tu-card.is-visible {
  opacity: 1;
  transform: translateY(0);
}

.tu-card:hover {
  border-color: var(--accent-dim);
  transform: translateY(-4px);
}

.tu-card.is-visible:hover {
  transform: translateY(-4px);
}

.tu-card-thumb {
  position: relative;
  aspect-ratio: 16 / 9;
  background: linear-gradient(155deg, #1a1a20 0%, #0c0c10 62%);
  overflow: hidden;
}

.tu-card-thumb-grid {
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(rgba(255, 255, 255, 0.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px);
  background-size: 24px 24px;
  -webkit-mask-image: linear-gradient(to top, black, transparent 70%);
  mask-image: linear-gradient(to top, black, transparent 70%);
  opacity: 0.6;
  transition: opacity 0.35s var(--ease);
}

.tu-card:hover .tu-card-thumb-grid {
  opacity: 1;
}

.tu-card-play {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 46px;
  height: 46px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(8, 8, 10, 0.55);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  border: 1px solid rgba(255, 255, 255, 0.18);
  color: #fff;
  transition: background-color 0.2s var(--ease), transform 0.2s var(--ease);
}

.tu-card:hover .tu-card-play {
  background: var(--accent);
  border-color: var(--accent);
  color: #1a1104;
  transform: translate(-50%, -50%) scale(1.08);
}

.tu-card-play-icon {
  width: 16px;
  height: 16px;
  margin-left: 2px;
}

.tu-card-type-badge {
  position: absolute;
  top: 10px;
  left: 10px;
  z-index: 2;
  font-family: var(--font-mono);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 4px 9px;
  border-radius: 999px;
  background: rgba(8, 8, 10, 0.6);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  border: 1px solid rgba(255, 255, 255, 0.14);
  color: #fff;
}

.tu-card-type-badge.is-course {
  color: #7fd4f2;
  border-color: rgba(127, 212, 242, 0.4);
}

.tu-card-meta-badge {
  position: absolute;
  bottom: 10px;
  right: 10px;
  z-index: 2;
  font-family: var(--font-mono);
  font-size: 0.66rem;
  font-weight: 600;
  padding: 3px 8px;
  border-radius: 6px;
  background: rgba(8, 8, 10, 0.65);
  color: var(--text);
  border: 1px solid rgba(255, 255, 255, 0.12);
}

.tu-card-price-badge {
  position: absolute;
  bottom: 10px;
  left: 10px;
  z-index: 2;
  font-family: var(--font-mono);
  font-size: 0.7rem;
  font-weight: 700;
  padding: 4px 9px;
  border-radius: 999px;
  background: rgba(8, 8, 10, 0.65);
  color: var(--accent);
  border: 1px solid rgba(255, 157, 46, 0.35);
}

.tu-card-price-badge.is-free {
  color: #7ee08a;
  border-color: rgba(126, 224, 138, 0.4);
}

.tu-card-body {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 14px 16px 16px;
}

.tu-card-title {
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--text);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.tu-card-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.tu-card-tag {
  font-family: var(--font-mono);
  font-size: 0.62rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-faint);
  padding: 3px 8px;
  border-radius: 999px;
  border: 1px solid var(--border);
}

/* ---------- tutorial watch page ---------- */

.tw-page {
  padding: 32px clamp(24px, 5vw, 72px) 90px;
  max-width: 1180px;
  margin: 0 auto;
}

.tw-back {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--text-dim);
  margin-bottom: 28px;
  transition: color 0.2s var(--ease), transform 0.2s var(--ease);
}

.tw-back:hover {
  color: var(--accent);
  transform: translateX(-2px);
}

.tw-gate {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: 360px;
  text-align: center;
  color: var(--text-dim);
}

.tw-gate[hidden] {
  display: none;
}

.tw-gate-title {
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--text);
  margin: 0;
}

.tw-gate-text {
  font-size: 0.88rem;
  margin: 0;
  max-width: 380px;
}

.tw-gate-btn {
  margin-top: 8px;
}

.tw-gate-btn[hidden] {
  display: none;
}

.tw-content {
  opacity: 0;
  transform: translateY(18px);
  transition: opacity 0.6s var(--ease-premium), transform 0.6s var(--ease-premium);
}

.tw-content[hidden] {
  display: none;
}

.tw-content.is-visible {
  opacity: 1;
  transform: translateY(0);
}

.tw-layout {
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  gap: 48px;
  align-items: start;
}

.tw-main-col {
  display: flex;
  flex-direction: column;
  gap: 24px;
  min-width: 0;
}

.tw-player-wrap {
  position: relative;
}

.tw-player {
  position: relative;
  aspect-ratio: 16 / 9;
  border-radius: 18px;
  border: 1px solid var(--border);
  background: #000;
  overflow: hidden;
}

.tw-player iframe,
.tw-player video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
}

/* Duration "pill" pinned to the bottom-right corner of the player, like a
   YouTube/Vimeo thumbnail - reflects the video currently playing, so for
   courses it updates on every lesson switch (see selectLesson() /
   setPlayerDuration() in js/main.js), not just once on page load. */
.tw-player-duration {
  position: absolute;
  right: 14px;
  bottom: 14px;
  z-index: 2;
  padding: 4px 10px;
  border-radius: 6px;
  background: rgba(8, 8, 10, 0.82);
  border: 1px solid rgba(255, 255, 255, 0.1);
  backdrop-filter: blur(6px);
  font-family: var(--font-mono);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--text);
  pointer-events: none;
}

.tw-player-duration[hidden] {
  display: none;
}

.tw-badges-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
}

.tw-badges-row {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}

.tw-edit-btn {
  display: flex;
  align-items: center;
  gap: 6px;
  font-family: var(--font-mono);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  padding: 5px 12px;
  border-radius: 999px;
  background: rgba(8, 8, 10, 0.6);
  border: 1px solid var(--accent-dim);
  color: var(--accent);
  text-decoration: none;
  transition: border-color 0.2s var(--ease), background-color 0.2s var(--ease);
}

.tw-edit-btn:hover {
  border-color: var(--accent);
  background: rgba(255, 157, 46, 0.14);
}

.tw-edit-btn[hidden] {
  display: none;
}

.tw-edit-btn svg {
  width: 14px;
  height: 14px;
}

.tw-type-badge {
  font-family: var(--font-mono);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--accent);
  margin: 0;
  padding: 4px 12px;
  border-radius: 999px;
  border: 1px solid rgba(255, 157, 46, 0.35);
  background: rgba(255, 157, 46, 0.08);
}

.tw-category {
  font-family: var(--font-mono);
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-faint);
  padding: 4px 12px;
  border-radius: 999px;
  border: 1px solid var(--border);
}

.tw-level-badge {
  font-family: var(--font-mono);
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-dim);
  padding: 3px 10px;
  border-radius: 999px;
  border: 1px solid var(--border);
}

.tw-title {
  font-family: var(--font-display);
  font-weight: 900;
  font-size: clamp(1.5rem, 2.8vw, 2.2rem);
  line-height: 1.15;
  margin: 0;
  color: var(--text);
}

.tw-lesson-current {
  font-size: 0.9rem;
  color: var(--text-dim);
  margin: 0;
}

.tw-section-title {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 1.15rem;
  margin: 0 0 12px;
  color: var(--text);
}

/* Discord-style formatting (twRenderDescriptionMarkdown() in js/main.js) -
   same change as tutorials/course/css/style.css's .cp-description-text:
   <p> -> <div> in the HTML since rendered output can include block-level
   children, white-space: pre-line dropped in favor of real <br>/<p>s. */
.tw-description-text {
  max-width: 720px;
  font-size: 0.95rem;
  line-height: 1.7;
  color: var(--text-dim);
}

.tw-description-text p {
  margin: 0 0 14px;
}

.tw-description-text p:last-child {
  margin-bottom: 0;
}

.tw-description-text .tw-description-list {
  margin: 0 0 14px;
}

.tw-description-subheading {
  font-size: 1rem;
  font-weight: 700;
  color: var(--text);
  margin: 18px 0 8px;
}

.tw-description-subheading:first-child {
  margin-top: 0;
}

.tw-description-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.tw-description-list li {
  position: relative;
  padding-left: 20px;
  font-size: 0.95rem;
  line-height: 1.6;
  color: var(--text-dim);
}

.tw-description-list li::before {
  content: '';
  position: absolute;
  left: 2px;
  top: 0.65em;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accent);
}

.tw-lessons-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
  margin-bottom: 12px;
}

.tw-lessons-head .tw-section-title {
  margin: 0;
}

.tw-lessons-progress {
  font-family: var(--font-mono);
  font-size: 0.72rem;
  font-weight: 600;
  color: var(--text-faint);
  white-space: nowrap;
}

/* "path" list - same numbered-circle-doubles-as-checkbox pattern as the
   course preview modal on /tutorials, connected by a vertical line, so
   checking a lesson off here or from that modal always agrees (both read
   js/progress.js). */
.tw-lessons {
  display: flex;
  flex-direction: column;
}

.tw-lesson-row {
  position: relative;
  display: flex;
  align-items: flex-start;
  gap: 12px;
}

.tw-lesson-row::before {
  content: '';
  position: absolute;
  left: 13px;
  top: 30px;
  bottom: -2px;
  width: 2px;
  background: var(--border);
  transition: background-color 0.25s var(--ease);
}

.tw-lesson-row:last-child::before {
  display: none;
}

.tw-lesson-row.is-done::before {
  background: var(--accent-dim);
}

.tw-lesson-check {
  position: relative;
  z-index: 1;
  flex: none;
  width: 26px;
  height: 26px;
  margin: 6px 0;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #0e0e12;
  border: 1px solid var(--border);
  color: var(--text-dim);
  transition: border-color 0.2s var(--ease), background-color 0.2s var(--ease), color 0.2s var(--ease);
}

.tw-lesson-check:hover {
  border-color: var(--text-faint);
}

.tw-lesson-check-num {
  font-family: var(--font-mono);
  font-size: 0.7rem;
  font-weight: 700;
}

.tw-lesson-check-icon {
  display: none;
  width: 13px;
  height: 13px;
}

.tw-lesson-row.is-done .tw-lesson-check {
  background: var(--accent);
  border-color: var(--accent);
  color: #0e0e12;
}

.tw-lesson-row.is-done .tw-lesson-check-num {
  display: none;
}

.tw-lesson-row.is-done .tw-lesson-check-icon {
  display: block;
}

.tw-lesson-row.is-active .tw-lesson-check {
  border-color: var(--accent);
  color: var(--accent);
}

.tw-lesson-row.is-active.is-done .tw-lesson-check {
  color: #0e0e12;
}

.tw-lesson-select {
  flex: 1;
  min-width: 0;
  display: flex;
  align-items: center;
  width: 100%;
  padding: 10px 14px;
  margin-bottom: 6px;
  border-radius: 10px;
  border: 1px solid var(--border);
  background: #0e0e12;
  text-align: left;
  transition: border-color 0.2s var(--ease), background-color 0.2s var(--ease);
}

.tw-lesson-select:hover {
  border-color: var(--text-faint);
}

.tw-lesson-row.is-active .tw-lesson-select {
  border-color: var(--accent);
  background: rgba(255, 157, 46, 0.06);
}

.tw-lesson-body {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.tw-lesson-title {
  font-size: 0.88rem;
  font-weight: 600;
  color: var(--text);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.tw-lesson-row.is-done .tw-lesson-title {
  color: var(--text-dim);
}

.tw-lesson-duration {
  font-family: var(--font-mono);
  font-size: 0.7rem;
  color: var(--text-faint);
}

.tw-info {
  display: flex;
  flex-direction: column;
  gap: 18px;
}

.tw-price-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 18px 20px;
  border-radius: 14px;
  border: 1px solid var(--border);
  background: #0e0e12;
}

.tw-price {
  font-family: var(--font-mono);
  font-size: 1.6rem;
  font-weight: 700;
  color: var(--accent);
}

.tw-price.is-free {
  color: #7ee08a;
}

.tw-buy-btn {
  width: 100%;
  justify-content: center;
}

.tw-buy-btn[hidden] {
  display: none;
}

.tw-buy-btn.is-in-cart {
  background: transparent;
  border: 1px solid var(--accent);
  color: var(--accent);
}

.tw-stats {
  display: flex;
  gap: 20px;
  flex-wrap: wrap;
}

.tw-stat {
  display: flex;
  align-items: center;
  gap: 8px;
  color: var(--text-dim);
  font-size: 0.85rem;
}

.tw-stat-icon {
  width: 17px;
  height: 17px;
  flex: none;
  color: var(--text-faint);
}

.tw-stat-value {
  font-family: var(--font-mono);
  font-weight: 600;
  color: var(--text);
}

.tw-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.tw-tag {
  font-family: var(--font-mono);
  font-size: 0.68rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-dim);
  padding: 5px 12px;
  border-radius: 999px;
  border: 1px solid var(--border);
}

.tw-details-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  font-size: 0.85rem;
  color: var(--text-dim);
}

.tw-details-row {
  display: flex;
  gap: 8px;
}

.tw-details-row[hidden] {
  display: none;
}

.tw-details-row dt {
  flex: none;
  width: 110px;
  color: var(--text-faint);
}

.tw-details-row dd {
  margin: 0;
  color: var(--text);
}

.tw-related {
  margin-top: 56px;
  padding-top: 40px;
  border-top: 1px solid var(--border);
  opacity: 0;
  transform: translateY(18px);
  transition: opacity 0.6s var(--ease-premium), transform 0.6s var(--ease-premium);
}

.tw-related[hidden] {
  display: none;
}

.tw-related.is-visible {
  opacity: 1;
  transform: translateY(0);
}

.tw-related-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 20px;
}

@media (max-width: 900px) {
  .tw-layout {
    grid-template-columns: 1fr;
  }
}

/* ---------- cookie consent banner (shared chrome, see
   partials/cookie-banner.html + js/cookie-consent.js - if you change one
   of those, mirror the change here too). ---------- */

.cookie-banner {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 200;
  padding: 0 clamp(16px, 4vw, 32px) clamp(16px, 4vw, 32px);
  transform: translateY(120%);
  opacity: 0;
  transition: transform 0.4s var(--ease-premium), opacity 0.3s var(--ease);
  pointer-events: none;
}

.cookie-banner[hidden] {
  display: none;
}

.cookie-banner.is-visible {
  transform: translateY(0);
  opacity: 1;
  pointer-events: auto;
}

.cookie-banner-inner {
  max-width: 920px;
  margin: 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
  flex-wrap: wrap;
  background: #101014;
  border: 1px solid var(--border);
  border-radius: 16px;
  padding: 18px 22px;
  box-shadow: 0 24px 60px -20px rgba(0, 0, 0, 0.65);
}

.cookie-banner-text {
  flex: 1 1 320px;
  font-size: 0.84rem;
  line-height: 1.55;
  color: var(--text-dim);
  margin: 0;
}

.cookie-banner-link {
  color: var(--accent);
  text-decoration: underline;
  text-underline-offset: 2px;
}

.cookie-banner-link:hover {
  color: var(--text);
}

.cookie-banner-actions {
  display: flex;
  align-items: center;
  gap: 10px;
  flex: none;
  flex-wrap: wrap;
}

.cookie-banner-btn {
  font-family: var(--font-mono);
  font-size: 0.76rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  padding: 14px 20px;
  border-radius: 999px;
  white-space: nowrap;
  transition: border-color 0.2s var(--ease), background-color 0.2s var(--ease), color 0.2s var(--ease), filter 0.2s var(--ease);
}

.cookie-banner-btn.ghost {
  background: transparent;
  border: 1px solid var(--border);
  color: var(--text-dim);
}

.cookie-banner-btn.ghost:hover {
  border-color: var(--text-faint);
  color: var(--text);
}

.cookie-banner-btn.primary {
  background: var(--accent);
  border: 1px solid var(--accent);
  color: #1a1104;
}

.cookie-banner-btn.primary:hover {
  filter: brightness(1.06);
}

@media (prefers-reduced-motion: reduce) {
  .cookie-banner {
    transition: none;
  }
}

@media (max-width: 640px) {
  .cookie-banner-inner {
    flex-direction: column;
    align-items: stretch;
    text-align: left;
  }
  .cookie-banner-text {
    flex-basis: auto;
  }
  .cookie-banner-actions {
    justify-content: stretch;
  }
  .cookie-banner-btn {
    flex: 1 1 0;
    text-align: center;
  }
}

/* ---------- text selection highlight (site-wide) - restyled per team
   feedback (Discord: "Wyłączyć zaznaczanie tekstu (lub je uładnić, np.
   lekko pomarańczowe i cieńsze)") to a light, thin accent-orange
   highlight instead of the harsh browser default, rather than disabling
   selection outright - keeping text selectable matters for accessibility
   (copying, screen readers, translation tools), it just needed to look
   intentional instead of default. Same rule copied into every
   css/style.css on the site - see build.js's header comment for why
   there's no single shared stylesheet to add this to instead. ---------- */

::selection {
  background: rgba(255, 157, 46, 0.28);
  color: var(--text);
}

/* ---------- notification bell (js/notifications.js) - shown once
   signed in, a small red dot appears while there's at least one unread
   notification (a REAL one - see notifications_migration.sql - not a
   decorative reuse of some other count). The bell reuses .cart-btn/
   .cart-icon for identical sizing; the dropdown below it is the same
   visual language as .popover, just anchored to the bell itself (not the
   whole .nav-right) via .notif-wrap so it doesn't have to share
   .popover's own right:0 anchor. ---------- */

.notif-wrap {
  position: relative;
  display: flex;
  align-items: center;
}

.notif-dot {
  position: absolute;
  top: 6px;
  right: 6px;
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: #ff6b5e;
  border: 2px solid #06070a;
}

.notif-dot[hidden] {
  display: none;
}

.notif-panel {
  position: absolute;
  top: calc(100% + 12px);
  right: 0;
  width: 320px;
  max-width: calc(100vw - 32px);
  max-height: 420px;
  overflow-y: auto;
  background: #101014;
  border: 1px solid var(--border);
  box-shadow: 0 20px 40px -12px rgba(0, 0, 0, 0.6);
  padding: 14px;
  opacity: 0;
  transform: translateY(-6px);
  pointer-events: none;
  transition: opacity 0.16s var(--ease), transform 0.16s var(--ease);
  z-index: 40;
}

.notif-panel.is-open {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

.notif-panel-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 10px;
}

.notif-panel-title {
  font-family: var(--font-mono);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-faint);
}

.notif-mark-all-btn {
  font-size: 0.74rem;
  font-weight: 600;
  color: var(--accent);
  transition: opacity 0.2s var(--ease);
}

.notif-mark-all-btn:hover {
  opacity: 0.8;
}

.notif-mark-all-btn[hidden] {
  display: none;
}

.notif-list {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.notif-item {
  display: block;
  width: 100%;
  text-align: left;
  padding: 10px;
  border-radius: 8px;
  transition: background-color 0.2s var(--ease);
}

.notif-item:hover {
  background-color: rgba(255, 255, 255, 0.045);
}

.notif-item.is-unread {
  background-color: rgba(255, 157, 46, 0.07);
}

.notif-item-title {
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--text);
  margin: 0 0 3px;
}

.notif-item-body {
  font-size: 0.78rem;
  line-height: 1.4;
  color: var(--text-dim);
  margin: 0 0 4px;
}

.notif-item-time {
  font-family: var(--font-mono);
  font-size: 0.66rem;
  color: var(--text-faint);
}

.notif-empty {
  font-size: 0.82rem;
  color: var(--text-faint);
  text-align: center;
  padding: 18px 6px;
  margin: 0;
}

.notif-empty[hidden] {
  display: none;
}

@media (max-width: 480px) {
  .notif-panel {
    width: calc(100vw - 32px);
    right: -8px;
  }
}

/* ---------- YouTube Shorts: vertical video left, everything else right ----
   .tw-main-col's children are laid out straight into the page grid
   (display: contents) so the player can take the whole left column while
   the title, description and the buy/info box stack on the right. */
.tw-content.is-short .tw-layout {
  grid-template-columns: minmax(260px, 380px) minmax(0, 1fr);
  column-gap: 48px;
  row-gap: 22px;
  align-items: start;
}
.tw-content.is-short .tw-main-col { display: contents; }
.tw-content.is-short .tw-player-wrap {
  grid-column: 1;
  grid-row: 1 / span 20;
  position: sticky;
  top: 96px;
}
.tw-content.is-short .tw-player { aspect-ratio: 9 / 16; }
.tw-content.is-short .tw-main-col > *:not(.tw-player-wrap),
.tw-content.is-short .tw-info { grid-column: 2; }
.tw-content.is-short .tw-info {
  padding: 22px;
  border: 1px solid var(--border);
  border-radius: 18px;
  background: rgba(255, 255, 255, 0.02);
}
@media (max-width: 900px) {
  .tw-content.is-short .tw-layout { grid-template-columns: 1fr; }
  .tw-content.is-short .tw-player-wrap {
    grid-row: auto;
    position: relative;
    top: 0;
    width: min(100%, 380px);
    margin: 0 auto;
  }
  .tw-content.is-short .tw-main-col > *:not(.tw-player-wrap),
  .tw-content.is-short .tw-info { grid-column: 1; }
}
/* keep the whole vertical video on screen */
.tw-content.is-short .tw-player-wrap { width: min(380px, calc((100vh - 150px) * 0.5625)); }

/* ---- tutorial cards v2 (2026-10-31) ---- */
.tu2-card { border-radius: 18px; border-color: #1f1f24; background: #111114; }
.tu2-card .tu-card-price-badge[hidden] { display: none; }
.tu2-card .tu-card-body { gap: 8px; padding: 14px 16px 16px; }
.tu2-kicker { font-family: var(--font-mono); font-size: 0.62rem; letter-spacing: 0.12em; text-transform: uppercase; color: #8f8e98; }
.tu2-card .tu-card-title { font-size: 1rem; font-weight: 700; line-height: 1.3; }
.tu2-foot { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: auto; padding-top: 10px; border-top: 1px solid #1f1f24; }
.tu2-meta { font-size: 0.8rem; color: #a3a2ab; }
.tu2-price { font-size: 1rem; font-weight: 700; color: #f2f1ee; }
.tu2-price.is-free { color: #7fd6a4; }
.tu2-progress { position: absolute; left: 0; right: 0; bottom: 0; z-index: 2; height: 4px; background: rgba(255, 255, 255, 0.15); }
.tu2-progress span { display: block; height: 100%; background: var(--accent); }

/* =====================================================================
   Lesson / watch page v2 (2026-10-31): big player, title + lesson nav
   under it, About + Details cards, sidebar with the course's lessons
   (courses) or "Up next" (quick tutorials).
   ===================================================================== */
.tw-page { max-width: 1480px; padding-left: clamp(16px, 3vw, 40px); padding-right: clamp(16px, 3vw, 40px); }
.tw2-layout { grid-template-columns: minmax(0, 1fr) 390px; gap: 24px; }
.tw2-layout.tw2-no-aside { grid-template-columns: minmax(0, 1fr); max-width: 1120px; margin: 0 auto; }
.tw2-layout.tw2-no-aside .tw2-aside { display: none; }
.tw2-layout .tw-main-col { gap: 18px; }
.tw2-layout .tw-player { border-radius: 20px; border-color: #1f1f24; box-shadow: 0 30px 80px -40px rgba(255,157,46,0.35); }

.tw2-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; flex-wrap: wrap; }
.tw2-head-text { display: flex; flex-direction: column; gap: 8px; min-width: 0; flex: 1 1 360px; }
.tw2-head .tw-lesson-current { font-family: var(--font-mono); font-size: 0.7rem; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase; color: var(--accent); }
.tw2-head .tw-title { font-size: clamp(1.6rem, 2.6vw, 2.1rem); letter-spacing: -0.02em; line-height: 1.1; }
.tw2-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin: 0; font-size: 0.86rem; color: #a3a2ab; }
.tw2-meta:empty { display: none; }
.tw2-meta b { color: var(--text); font-weight: 600; }
.tw2-meta span { white-space: pre; }
.tw2-meta .tw2-meta-avatar { width: 28px; height: 28px; border-radius: 50%; overflow: hidden; display: inline-flex; align-items: center; justify-content: center; background: #1c1c21; border: 1px solid var(--accent); font-size: 0.72rem; font-weight: 700; color: var(--text); white-space: normal; }
.tw2-meta-avatar img { width: 100%; height: 100%; object-fit: cover; }
.tw2-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.tw2-btn { height: 44px; padding: 0 18px; border-radius: 999px; border: 1px solid #2a2a31; background: transparent; color: var(--text); font: 500 0.9rem var(--font-body, inherit); cursor: pointer; transition: border-color 0.2s var(--ease), background-color 0.2s var(--ease); }
.tw2-btn:hover:not(:disabled) { border-color: #4a4a52; }
.tw2-btn:disabled { opacity: 0.4; cursor: default; }
.tw2-btn[hidden] { display: none; }
.tw2-btn--primary { border: 0; background: var(--accent); color: #0b0b0d; font-weight: 600; }
.tw2-btn--primary:hover:not(:disabled) { filter: brightness(1.06); }
.tw2-btn--done { border-color: rgba(127,214,164,0.45); color: #9ff0c2; }
.tw2-btn--done.is-done { background: rgba(127,214,164,0.12); border-color: rgba(127,214,164,0.6); }

.tw2-cards { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); gap: 16px; align-items: start; }
.tw2-side { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.tw2-card { padding: 22px 24px; border: 1px solid #1f1f24; border-radius: 22px; background: linear-gradient(180deg, #121215, #0e0e11); min-width: 0; }
.tw2-card .tw-section-title { font-size: 1.05rem; }
.tw2-card .tw-description-text { font-size: 0.98rem; line-height: 1.75; color: #c9c8c3; }
.tw2-details { gap: 14px; }
.tw2-details .tw-section-title { margin: 0; }
.tw2-details .tw-price-row { padding: 0; border: 0; background: none; }
.tw2-details .tw-price { font-family: var(--font-body, inherit); font-size: 1.8rem; font-weight: 900; letter-spacing: -0.02em; color: #f4f3ef; }
.tw2-details .tw-price.is-free { color: #7fd6a4; }
.tw2-details .tw-buy-btn { border-radius: 999px; height: 46px; font-family: var(--font-body, inherit); font-size: 0.92rem; font-weight: 600; letter-spacing: 0; text-transform: none; }
.tw2-details .tw-stats { display: none; }
.tw2-details .tw-details-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0; border: 1px solid #1f1f24; border-radius: 14px; overflow: hidden; margin: 0; }
.tw2-details .tw-details-row { display: flex; flex-direction: column; gap: 5px; padding: 11px 13px; border-right: 1px solid #1f1f24; border-bottom: 1px solid #1f1f24; }
.tw2-details .tw-details-row[hidden] { display: none; }
.tw2-details .tw-details-row dt { width: auto; font-family: var(--font-mono); font-size: 0.58rem; letter-spacing: 0.12em; text-transform: uppercase; color: #8f8e98; }
.tw2-details .tw-details-row dd { margin: 0; font-size: 0.88rem; color: var(--text); text-transform: capitalize; }

.tw2-deeper { display: flex; flex-direction: column; gap: 6px; padding: 20px 22px; border-radius: 22px; border: 1px solid rgba(255,157,46,0.35); background: linear-gradient(135deg, rgba(255,157,46,0.14), rgba(255,157,46,0.02)); text-decoration: none; color: var(--text); transition: border-color 0.2s var(--ease); }
.tw2-deeper:hover { border-color: rgba(255,157,46,0.7); }
.tw2-deeper[hidden] { display: none; }
.tw2-deeper-kicker { font-family: var(--font-mono); font-size: 0.62rem; letter-spacing: 0.12em; text-transform: uppercase; color: var(--accent); }
.tw2-deeper-title { font-size: 1rem; }
.tw2-deeper-meta { font-size: 0.8rem; color: #c9c8c3; }
.tw2-deeper-link { font-size: 0.82rem; font-weight: 600; color: var(--accent); }

/* sidebar */
.tw2-aside { position: sticky; top: 90px; display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.tw2-panel { border: 1px solid #1f1f24; border-radius: 22px; background: linear-gradient(180deg, #121215, #0e0e11); overflow: hidden; display: flex; flex-direction: column; }
.tw2-panel[hidden] { display: none; }
.tw2-panel-head { padding: 18px 18px 14px; display: flex; flex-direction: column; gap: 8px; border-bottom: 1px solid #1d1d22; }
.tw2-panel-head .tw-section-title { margin: 0; font-size: 1rem; }
.tw2-panel-kicker { font-family: var(--font-mono); font-size: 0.6rem; letter-spacing: 0.12em; text-transform: uppercase; color: #8f8e98; }
.tw2-progress-row { display: flex; justify-content: space-between; font-size: 0.76rem; color: #a3a2ab; }
.tw2-progress-row b { font-family: var(--font-mono); color: var(--accent); }
.tw2-progress-row .tw-lessons-progress { font-family: inherit; font-size: inherit; color: inherit; }
.tw2-progress-track { height: 6px; border-radius: 999px; background: #1d1d22; overflow: hidden; }
.tw2-progress-fill { display: block; width: 0; height: 100%; border-radius: 999px; background: var(--accent); transition: width 0.4s var(--ease); }
.tw2-panel-foot { padding: 14px 18px; border-top: 1px solid #1d1d22; font-size: 0.82rem; font-weight: 600; color: var(--accent); text-decoration: none; }
.tw2-aside .tw-lessons { padding: 8px; max-height: min(640px, calc(100vh - 300px)); overflow: auto; gap: 0; }
.tw2-aside .tw-lesson-row { align-items: center; gap: 4px; padding-left: 6px; border-radius: 12px; }
.tw2-aside .tw-lesson-row::before { display: none; }
.tw2-aside .tw-lesson-check { margin: 0; width: 28px; height: 28px; }
.tw2-aside .tw-lesson-row.is-done .tw-lesson-check { background: rgba(127,214,164,0.15); border-color: transparent; color: #7fd6a4; }
.tw2-aside .tw-lesson-row.is-active .tw-lesson-check { background: var(--accent); border-color: var(--accent); color: #0b0b0d; }
.tw2-aside .tw-lesson-select { margin: 0; border: 0; background: transparent; padding: 11px 10px; border-radius: 12px; }
.tw2-aside .tw-lesson-select:hover { background: #18181c; }
.tw2-aside .tw-lesson-row.is-active { background: #19191d; box-shadow: inset 3px 0 0 var(--accent); }
.tw2-aside .tw-lesson-row.is-active .tw-lesson-select { background: transparent; }
.tw2-upnext { padding: 8px; display: flex; flex-direction: column; }
.tw2-up { display: flex; gap: 12px; padding: 8px; border-radius: 14px; text-decoration: none; color: var(--text); transition: background-color 0.2s var(--ease); }
.tw2-up:hover { background: #18181c; }
.tw2-up-thumb { position: relative; width: 140px; flex: 0 0 auto; aspect-ratio: 16 / 9; border-radius: 10px; background: linear-gradient(140deg,#2b1a0c,#0f0b08) center / cover no-repeat; }
.tw2-up-dur { position: absolute; right: 6px; bottom: 6px; font-family: var(--font-mono); font-size: 0.62rem; padding: 2px 6px; border-radius: 6px; background: rgba(0,0,0,0.75); color: #f2f1ee; }
.tw2-up-body { min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.tw2-up-title { font-size: 0.88rem; font-weight: 600; line-height: 1.3; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.tw2-up-kicker { font-family: var(--font-mono); font-size: 0.6rem; letter-spacing: 0.08em; text-transform: uppercase; color: var(--accent); }
.tw2-up-meta { font-size: 0.74rem; color: #8f8e98; }

@media (max-width: 1100px) {
  .tw2-cards { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 900px) {
  .tw2-layout { grid-template-columns: minmax(0, 1fr); }
  .tw2-layout .tw-main-col { display: contents; }
  .tw2-layout .tw-player-wrap { order: 0; }
  .tw2-layout .tw2-head { order: 1; }
  .tw2-aside { order: 2; position: static; }
  .tw2-layout .tw2-cards { order: 3; }
  .tw2-actions { width: 100%; }
  .tw2-actions .tw2-btn { flex: 1 1 auto; }
  .tw2-aside .tw-lessons { max-height: 420px; }
}
/* head: text full width, lesson buttons on their own row below */
.tw2-head { flex-direction: column; align-items: stretch; gap: 14px; }
.tw2-head-text { flex: 0 0 auto; }
.tw2-meta span { white-space: normal; }

/* ---- v2.1 (2026-10-31): Share/Edit as small tools top-right, tidier
   Details card, proper layout for vertical (Shorts) videos ---- */
.tw2-tools { display: flex; align-items: center; gap: 8px; margin-left: auto; }
.tw2-tool { display: inline-flex; align-items: center; gap: 7px; height: 32px; padding: 0 13px; border-radius: 999px; border: 1px solid #2a2a31; background: transparent; color: var(--text); font: 500 0.8rem var(--font-body, inherit); cursor: pointer; transition: border-color 0.2s var(--ease), color 0.2s var(--ease); }
.tw2-tool svg { width: 14px; height: 14px; }
.tw2-tool:hover { border-color: #4a4a52; }
.tw2-tool.is-copied { border-color: rgba(127,214,164,0.55); color: #9ff0c2; }
.tw2-head .tw-badges-head { flex-wrap: nowrap; align-items: center; }
.tw2-head .tw-badges-row { min-width: 0; }
.tw2-actions[hidden] { display: none; }

.tw2-details { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 14px 12px; }
.tw2-details > * { grid-column: 1 / -1; }
.tw2-details > .tw-section-title { grid-column: 1; }
.tw2-details > .tw-price-row { grid-column: 2; justify-content: flex-end; }
.tw2-details .tw-price { font-size: 1.05rem; font-weight: 800; letter-spacing: 0; padding: 6px 12px; border-radius: 999px; background: #1c1c21; }
.tw2-details .tw-price.is-free { color: #7fd6a4; background: rgba(127,214,164,0.12); }
.tw2-details .tw-tags { display: flex; flex-wrap: wrap; gap: 6px; }
.tw2-details .tw-tags:empty { display: none; }
.tw2-details .tw-details-list { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 8px; border: 0; border-radius: 0; overflow: visible; }
.tw2-details .tw-details-row { border: 1px solid #1f1f24; border-radius: 12px; background: #0f0f12; }

/* vertical video: player | content | (up next) */
.tw-content.is-short .tw2-layout { grid-template-columns: auto minmax(0, 1fr) 360px; column-gap: 32px; row-gap: 18px; max-width: none; }
.tw-content.is-short .tw2-layout.tw2-no-aside { grid-template-columns: auto minmax(0, 1fr); max-width: 1180px; margin: 0 auto; }
.tw-content.is-short .tw2-layout .tw-player-wrap { grid-column: 1; grid-row: 1 / span 20; }
.tw-content.is-short .tw2-layout .tw2-head,
.tw-content.is-short .tw2-layout .tw2-cards { grid-column: 2; }
.tw-content.is-short .tw2-aside { grid-column: 3; grid-row: 1 / span 20; }
.tw-content.is-short .tw2-cards { grid-template-columns: minmax(0, 1fr); }
.tw-content.is-short .tw2-details.tw-info { padding: 22px 24px; border: 1px solid #1f1f24; border-radius: 22px; background: linear-gradient(180deg, #121215, #0e0e11); }
.tw-content.is-short .tw2-head .tw-title { font-size: clamp(1.6rem, 2.4vw, 2.3rem); }
@media (max-width: 1240px) {
  .tw-content.is-short .tw2-layout { grid-template-columns: auto minmax(0, 1fr); }
  .tw-content.is-short .tw2-aside { grid-column: 2; grid-row: auto; position: static; }
}
@media (max-width: 900px) {
  .tw-content.is-short .tw2-layout,
  .tw-content.is-short .tw2-layout.tw2-no-aside { grid-template-columns: minmax(0, 1fr); }
  .tw-content.is-short .tw2-layout .tw-player-wrap { grid-row: auto; }
  .tw-content.is-short .tw2-layout .tw-player-wrap,
  .tw-content.is-short .tw2-layout .tw2-head,
  .tw-content.is-short .tw2-layout .tw2-cards,
  .tw-content.is-short .tw2-aside { grid-column: 1; }
}
.tw2-tool { font-size: 0.8rem; font-family: inherit; }
.tw2-details .tw-details-list { grid-template-columns: repeat(auto-fill, minmax(118px, 1fr)); }
/* Details first, then About this tutorial */
.tw2-cards > .tw2-side { order: -1; }
.tw2-cards { grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr); }
@media (max-width: 1100px) { .tw2-cards { grid-template-columns: minmax(0, 1fr); } }
.tw-content.is-short .tw2-cards { grid-template-columns: minmax(0, 1fr); }
/* single column: Details, About, then "Want to go deeper?" */
.tw-content.is-short .tw2-side { display: contents; }
.tw-content.is-short .tw2-details { order: -1; }
.tw-content.is-short .tw2-deeper { order: 1; }
@media (max-width: 1100px) {
  .tw2-side { display: contents; }
  .tw2-details { order: -1; }
  .tw2-deeper { order: 1; }
}
.tw-content.is-short .tw2-cards .tw-info, .tw-content.is-short .tw2-cards > * { grid-column: auto; }

/* clickable chapter timestamps in the description (2026-11-02) */
.tw-ts { display: inline-flex; align-items: center; height: 22px; padding: 0 8px; margin: 0 1px; border-radius: 999px; border: 1px solid rgba(255,157,46,0.4); background: rgba(255,157,46,0.08); color: var(--accent); font-family: var(--font-mono); font-size: 0.78em; font-weight: 600; vertical-align: 1px; cursor: pointer; transition: background-color 0.2s var(--ease), border-color 0.2s var(--ease); }
.tw-ts:hover { background: rgba(255,157,46,0.18); border-color: var(--accent); }
