/* =========================================================================
   Cliento Design System
   -------------------------------------------------------------------------
   یک لایه‌ی مستقل و بدون وابستگی خارجی روی کل سایت.
   - RTL-first: از ویژگی‌های منطقی (inline-start/end) استفاده می‌کند.
   - Light/Dark: با prefers-color-scheme و data-theme روی <html>.
   - بدون CDN، بدون فونت خارجی، بدون جاوااسکریپت اجباری.
   ========================================================================= */

/* ---------- 1. Fonts ---------------------------------------------------- */

@font-face {
  font-family: 'IranYekan';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url('../fonts/2-IranYekan/iranyekanweblight.woff2') format('woff2'),
       url('../fonts/2-IranYekan/iranyekanweblight.woff') format('woff');
}

@font-face {
  font-family: 'IranYekan';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/2-IranYekan/iranyekanwebregular.woff2') format('woff2'),
       url('../fonts/2-IranYekan/iranyekanwebregular.woff') format('woff');
}

@font-face {
  font-family: 'IranYekan';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/2-IranYekan/iranyekanwebbold.woff2') format('woff2'),
       url('../fonts/2-IranYekan/iranyekanwebbold.woff') format('woff');
}

/* ---------- 2. Tokens --------------------------------------------------- */

:root {
  /* Brand - بر پایه‌ی بنفش اصلی برند #6A49F2 */
  --c-brand-50:  #F4F1FE;
  --c-brand-100: #EDE9FE;
  --c-brand-200: #DFDAF3;
  --c-brand-300: #C3B7F9;
  --c-brand-400: #9B84F6;
  --c-brand-500: #6A49F2;
  --c-brand-600: #5734D8;
  --c-brand-700: #4526AE;
  --c-brand-800: #32236F;
  --c-brand-900: #221749;

  /* Accent - نارنجی برند */
  --c-accent-400: #FFB245;
  --c-accent-500: #FC9400;
  --c-accent-600: #DB7A00;

  /* Semantic */
  --c-success-500: #12A150;
  --c-success-100: #DCF5E7;
  --c-warn-500:    #C97A00;
  --c-warn-100:    #FDF0DA;
  --c-danger-500:  #D42B44;
  --c-danger-100:  #FBE1E5;

  /* Neutrals */
  --c-ink-900: #14121F;
  --c-ink-800: #221F33;
  --c-ink-700: #3E3F66;
  --c-ink-600: #56547A;
  --c-ink-500: #74729A;
  --c-ink-400: #9E9CBB;
  --c-ink-300: #C7C5DA;
  --c-ink-200: #E4E2EF;
  --c-ink-100: #F1F0F7;
  --c-ink-50:  #F8F8FC;

  /* Surfaces (light) */
  --bg:            #FFFFFF;
  --bg-subtle:     var(--c-ink-50);
  --bg-muted:      var(--c-brand-50);
  --surface:       #FFFFFF;
  --surface-2:     var(--c-ink-50);
  --surface-inset: var(--c-ink-100);
  --border:        var(--c-ink-200);
  --border-strong: var(--c-ink-300);

  --text:        var(--c-ink-900);
  --text-muted:  var(--c-ink-600);
  --text-subtle: var(--c-ink-500);
  --text-invert: #FFFFFF;

  --brand:       var(--c-brand-500);
  --brand-hover: var(--c-brand-600);
  --brand-soft:  var(--c-brand-100);
  --on-brand:    #FFFFFF;

  /* Glass */
  --glass-bg:     rgba(255, 255, 255, 0.72);
  --glass-border: rgba(255, 255, 255, 0.6);

  /* Typography - سیال بین موبایل و دسکتاپ */
  --font-sans: 'IranYekan', 'Vazirmatn', 'Segoe UI', Tahoma, system-ui, sans-serif;

  --fs-xs:   0.78rem;
  --fs-sm:   0.875rem;
  --fs-base: 1rem;
  --fs-md:   clamp(1.05rem, 0.99rem + 0.30vw, 1.19rem);
  --fs-lg:   clamp(1.20rem, 1.09rem + 0.55vw, 1.50rem);
  --fs-xl:   clamp(1.45rem, 1.25rem + 1.00vw, 2.00rem);
  --fs-2xl:  clamp(1.80rem, 1.45rem + 1.75vw, 2.75rem);
  --fs-3xl:  clamp(2.15rem, 1.60rem + 2.75vw, 3.75rem);
  /* پله‌ی «نمایشی» - فقط برای تیتر اصلی صفحه‌ی خانه.
     یک پله بالاتر از 3xl که در بقیه‌ی صفحات بزرگ‌ترین است. اگر همان 3xl
     می‌ماند، هیرو از یک سربرگ بخش قابل تشخیص نبود؛ و همین «همه‌چیز هم‌اندازه»
     است که یک صفحه را شبیه قالب آماده می‌کند. */
  --fs-display: clamp(2.4rem, 1.35rem + 4.6vw, 4.75rem);

  --lh-tight: 1.25;
  --lh-snug:  1.45;
  --lh-base:  1.85;
  /* متن‌های بزرگ (لید هیرو، توضیح سربرگ بخش) با ۱.۸۵ خیلی باز می‌شوند و بند
     به‌جای یک بلوک، چند سطر جدا از هم دیده می‌شود. هرچه فونت بزرگ‌تر، فاصله‌ی
     سطر کمتر. */
  --lh-lede:  1.7;

  /* Spacing */
  --s-1: 0.25rem;
  --s-2: 0.5rem;
  --s-3: 0.75rem;
  --s-4: 1rem;
  --s-5: 1.5rem;
  --s-6: 2rem;
  --s-7: 3rem;
  --s-8: 4rem;
  --s-9: 6rem;

  --section-y: clamp(3.5rem, 2rem + 6vw, 7rem);
  /* بخش‌های «پیوسته» - بخشی که ادامه‌ی بخش قبل است و نباید مثل یک فصل تازه
     از آن فاصله بگیرد (مثل نوار آمار زیر هیرو). */
  --section-y-sm: clamp(2rem, 1.25rem + 3vw, 3.5rem);
  --container:  1200px;
  --container-narrow: 820px;
  /* قاب پهن - فقط برای ردیف کارت‌های پلن.
     یک ردیف چهارتایی داخل ۱۲۰۰ پیکسل به کارت‌های ۲۷۰ پیکسلی می‌رسد و «قیمت +
     چند سقف عددی» در آن عرض دو خطی می‌شکند. با ۱۳۶۰ همان ردیف به کارت ۳۱۰
     پیکسلی می‌رسد، که عرضِ متعارف صفحه‌های تعرفه‌ی SaaS است. */
  --container-wide: 1360px;
  --gutter: clamp(1rem, 0.5rem + 2vw, 2rem);

  /* Radius */
  --r-sm: 8px;
  --r-md: 14px;
  --r-lg: 20px;
  --r-xl: 28px;
  --r-full: 999px;

  /* Shadows - نرم و لایه‌ای.
     هر پله یک سایه‌ی «تماس» تنگ دارد و یک سایه‌ی «ارتفاع» باز؛ همان چیزی که
     یک سطح را روی سطح دیگر می‌نشاند به‌جای اینکه فقط تارش کند. رنگ سایه از
     بنفشِ برند گرفته شده، نه از مشکی خالص. */
  --sh-xs: 0 1px 2px rgba(34, 23, 73, 0.06);
  --sh-sm: 0 2px 8px rgba(34, 23, 73, 0.06), 0 1px 2px rgba(34, 23, 73, 0.04);
  --sh-md: 0 8px 24px rgba(34, 23, 73, 0.08), 0 2px 6px rgba(34, 23, 73, 0.04);
  --sh-lg: 0 20px 48px rgba(34, 23, 73, 0.12), 0 4px 12px rgba(34, 23, 73, 0.06);
  --sh-xl: 0 32px 64px rgba(34, 23, 73, 0.16), 0 8px 20px rgba(34, 23, 73, 0.07);
  --sh-brand:      0 10px 24px rgba(106, 73, 242, 0.26), 0 2px 6px rgba(106, 73, 242, 0.18);
  --sh-brand-lift: 0 18px 38px rgba(106, 73, 242, 0.34), 0 4px 10px rgba(106, 73, 242, 0.22);

  /* خط نور بالای سطوح روشن. جزئیات کوچکی که لبه‌ی کارت را به‌جای یک خط خشک،
     یک لبه‌ی نوردیده نشان می‌دهد. در تم تیره کنار گذاشته می‌شود. */
  --edge-light: inset 0 1px 0 rgba(255, 255, 255, 0.85);

  /* Motion - یک ریتم واحد برای کل سایت */
  --ease: cubic-bezier(0.22, 1, 0.36, 1);
  --dur-fast: 140ms;
  --dur: 260ms;
  --dur-slow: 520ms;
  --dur-reveal: 620ms;   /* ظاهرشدن هنگام اسکرول */
  --stagger: 80ms;       /* فاصله‌ی زمانی بین عناصر یک گروه */

  --header-h: 76px;
}

/* Dark theme - هم با تنظیم سیستم و هم با data-theme دستی */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme='light']) {
    --bg:            #0D0B16;
    --bg-subtle:     #12101E;
    --bg-muted:      #171429;
    --surface:       #181530;
    --surface-2:     #201C3B;
    --surface-inset: #262147;
    --border:        #2E2952;
    --border-strong: #3D3768;

    --text:        #F3F1FB;
    --text-muted:  #B9B4D6;
    --text-subtle: #8F8AB4;
    --text-invert: #14121F;

    --brand:       #9B84F6;
    --brand-hover: #B09DF8;
    --brand-soft:  #262147;
    --on-brand:    #14121F;

    --glass-bg:     rgba(24, 21, 48, 0.72);
    --glass-border: rgba(255, 255, 255, 0.08);

    --sh-xs: 0 1px 2px rgba(0, 0, 0, 0.4);
    --sh-sm: 0 2px 8px rgba(0, 0, 0, 0.4);
    --sh-md: 0 8px 24px rgba(0, 0, 0, 0.45);
    --sh-lg: 0 20px 48px rgba(0, 0, 0, 0.55);
    --sh-xl: 0 32px 64px rgba(0, 0, 0, 0.62);
    --sh-brand:      0 10px 24px rgba(106, 73, 242, 0.32);
    --sh-brand-lift: 0 18px 38px rgba(106, 73, 242, 0.42);

    /* روی سطح تیره، خط نورِ سفید مثل یک خط چرک دیده می‌شود؛ به‌جایش لبه فقط
       کمی روشن‌تر از خود سطح می‌شود. */
    --edge-light: inset 0 1px 0 rgba(255, 255, 255, 0.06);
  }
}

:root[data-theme='dark'] {
  --bg:            #0D0B16;
  --bg-subtle:     #12101E;
  --bg-muted:      #171429;
  --surface:       #181530;
  --surface-2:     #201C3B;
  --surface-inset: #262147;
  --border:        #2E2952;
  --border-strong: #3D3768;

  --text:        #F3F1FB;
  --text-muted:  #B9B4D6;
  --text-subtle: #8F8AB4;
  --text-invert: #14121F;

  --brand:       #9B84F6;
  --brand-hover: #B09DF8;
  --brand-soft:  #262147;
  --on-brand:    #14121F;

  --glass-bg:     rgba(24, 21, 48, 0.72);
  --glass-border: rgba(255, 255, 255, 0.08);

  --sh-xs: 0 1px 2px rgba(0, 0, 0, 0.4);
  --sh-sm: 0 2px 8px rgba(0, 0, 0, 0.4);
  --sh-md: 0 8px 24px rgba(0, 0, 0, 0.45);
  --sh-lg: 0 20px 48px rgba(0, 0, 0, 0.55);
  --sh-xl: 0 32px 64px rgba(0, 0, 0, 0.62);
  --sh-brand:      0 10px 24px rgba(106, 73, 242, 0.32);
  --sh-brand-lift: 0 18px 38px rgba(106, 73, 242, 0.42);

  /* روی سطح تیره، خط نورِ سفید مثل یک خط چرک دیده می‌شود؛ به‌جایش لبه فقط
     کمی روشن‌تر از خود سطح می‌شود. */
  --edge-light: inset 0 1px 0 rgba(255, 255, 255, 0.06);
}

/* ---------- 3. Base ----------------------------------------------------- */

*,
*::before,
*::after { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--header-h) + 1rem);
}

body.cl {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-sans);
  font-size: var(--fs-base);
  line-height: var(--lh-base);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  overflow-x: hidden;
}

/* فارسی خط متصل است: فاصله‌ی منفی بین حروف، اتصال‌ها را روی هم می‌آورد و در
   اندازه‌های بزرگ به‌وضوح دیده می‌شود. پس letter-spacing دست‌نخورده می‌ماند و
   فشردگیِ تیتر فقط از line-height می‌آید.

   `text-wrap: balance` سطرهای تیتر را هم‌اندازه می‌کند و جلوی «یک واژه در سطر
   آخر» را می‌گیرد - همان چیزی که بیش از هر چیز، تیتر را دست‌ساز نشان می‌دهد. */
.cl h1, .cl h2, .cl h3, .cl h4, .cl h5, .cl h6 {
  margin: 0 0 var(--s-3);
  line-height: var(--lh-tight);
  font-weight: 700;
  color: var(--text);
  letter-spacing: normal;
  text-wrap: balance;
}

.cl h1 { font-size: var(--fs-3xl); }
.cl h2 { font-size: var(--fs-2xl); }
.cl h3 { font-size: var(--fs-xl); }
.cl h4 { font-size: var(--fs-lg); }

/* تیترهای کوتاه‌تر (h3 و پایین‌تر) به فضای تنفس بیشتری نیاز دارند تا با متنِ
   زیرشان یکی نشوند. */
.cl h3, .cl h4, .cl h5, .cl h6 { line-height: var(--lh-snug); }

.cl p { margin: 0 0 var(--s-4); color: var(--text-muted); text-wrap: pretty; }
.cl a { color: var(--brand); text-decoration: none; transition: color var(--dur-fast) var(--ease); }
.cl a:hover { color: var(--brand-hover); }
.cl img, .cl svg { max-width: 100%; height: auto; display: block; }
.cl ul, .cl ol { margin: 0; padding: 0; list-style: none; }
.cl strong, .cl b { font-weight: 700; color: var(--text); }

/* اعداد فارسی در متن جاری با tabular-nums بهتر می‌نشینند */
.cl .num { font-variant-numeric: tabular-nums; }

/* دسترس‌پذیری: حالت فوکوس واضح و یکسان */
.cl :focus-visible {
  outline: 3px solid var(--brand);
  outline-offset: 2px;
  border-radius: var(--r-sm);
}

.skip-link {
  position: absolute;
  inset-inline-start: var(--s-4);
  top: -100px;
  z-index: 2000;
  padding: var(--s-3) var(--s-5);
  background: var(--brand);
  color: var(--on-brand);
  border-radius: 0 0 var(--r-md) var(--r-md);
  font-weight: 700;
  transition: top var(--dur) var(--ease);
}
.skip-link:focus { top: 0; color: var(--on-brand); }

.sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

/* ---------- 4. Layout --------------------------------------------------- */

.container {
  width: 100%;
  max-width: var(--container);
  margin-inline: auto;
  padding-inline: var(--gutter);
}
.container-narrow { max-width: var(--container-narrow); }
/* حاشیه‌ی کناری هم کمتر می‌شود: قاب پهن برای این است که کارت‌ها جا باز کنند،
   نه اینکه همان کارت‌ها را با درز بیشتری نگه دارد. */
.container-wide {
  max-width: var(--container-wide);
  padding-inline: clamp(1rem, 0.75rem + 1vw, 1.5rem);
}

.section { padding-block: var(--section-y); position: relative; }
.section-tight { padding-block: var(--section-y-sm); }
.section-subtle { background: var(--bg-subtle); }
.section-muted  { background: var(--bg-muted); }

/* درز بین دو نوارِ هم‌رنگ.
   وقتی یک بخشِ سفید و یک بخشِ خاکستری کنار هم می‌نشینند، خودِ تغییر رنگ مرز
   را نشان می‌دهد. ولی دو بخشِ هم‌رنگِ پشت‌سرهم به یک بلوکِ بلندِ بی‌ریتم
   تبدیل می‌شوند. یک خط مو در محل تماس، بی‌آنکه به چشم بیاید، مرز را
   برمی‌گرداند. */
.section:not(.section-subtle):not(.section-muted) + .section:not(.section-subtle):not(.section-muted),
.section-subtle + .section-subtle {
  border-block-start: 1px solid var(--border);
}

.stack > * + * { margin-block-start: var(--s-4); }

.grid { display: grid; gap: var(--s-5); }
.grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.grid-auto { grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr)); }

.flex { display: flex; gap: var(--s-4); }
.flex-center { align-items: center; }
.flex-between { justify-content: space-between; }
.flex-wrap { flex-wrap: wrap; }

@media (max-width: 900px) {
  .grid-3, .grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 640px) {
  .grid-2, .grid-3, .grid-4 { grid-template-columns: minmax(0, 1fr); }
}

/* ---------- 4b. Breadcrumbs ---------------------------------------------- */

/* مسیر راهنما بالای صفحات داخلی. ارتفاعش ثابت است و پیش از تیتر رندر می‌شود،
   پس چیزی را جابه‌جا نمی‌کند (بدون CLS). */
.breadcrumbs { margin-block-end: var(--s-4); }
.breadcrumbs ol {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-2);
  margin: 0;
  padding: 0;
  list-style: none;
}
.breadcrumbs li { display: inline-flex; align-items: center; gap: var(--s-2); }
.breadcrumbs a { color: inherit; }
.breadcrumbs a:hover { color: var(--brand); }
.breadcrumbs [aria-current="page"] { color: var(--text); }

/* ناوبری دسته‌های وبلاگ */
.blog-cats {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--s-2);
  margin-block-start: var(--s-5);
}
.blog-cats a { text-decoration: none; }
.blog-cats a:hover { border-color: var(--brand); }

/* ---------- 5. Section headers ------------------------------------------ */

.section-head {
  max-width: 720px;
  margin-inline: auto;
  margin-block-end: var(--s-7);
  text-align: center;
}
.section-head.is-start { text-align: start; margin-inline: 0; }
.section-head p {
  font-size: var(--fs-md);
  line-height: var(--lh-lede);
  /* بند توضیح از تیتر باریک‌تر است تا سطرها به هم نچسبند و بلوک متن یک شکل
     مشخص داشته باشد، نه یک مستطیل پر. */
  max-width: 58ch;
  margin-inline: auto;
  margin-block-end: 0;
}
.section-head.is-start p { margin-inline: 0; }

.eyebrow {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  padding: 0.4rem 0.9rem;
  margin-block-end: var(--s-4);
  border-radius: var(--r-full);
  background: var(--brand-soft);
  color: var(--brand);
  font-size: var(--fs-sm);
  font-weight: 700;
  border: 1px solid transparent;
}
:root[data-theme='dark'] .eyebrow { border-color: var(--border); }

.text-gradient {
  background: linear-gradient(120deg, var(--c-brand-500), var(--c-brand-400) 45%, var(--c-accent-500));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
:root[data-theme='dark'] .text-gradient {
  background: linear-gradient(120deg, #B09DF8, #9B84F6 45%, var(--c-accent-400));
  -webkit-background-clip: text;
  background-clip: text;
}

/* ---------- 6. Buttons -------------------------------------------------- */

.btn {
  --btn-bg: var(--brand);
  --btn-fg: var(--on-brand);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--s-2);
  padding: 0.8rem 1.6rem;
  border: 1px solid transparent;
  border-radius: var(--r-full);
  background: var(--btn-bg);
  color: var(--btn-fg);
  font-family: inherit;
  font-size: var(--fs-base);
  font-weight: 700;
  line-height: 1.4;
  cursor: pointer;
  text-align: center;
  transition: transform var(--dur-fast) var(--ease),
              box-shadow var(--dur) var(--ease),
              background-color var(--dur-fast) var(--ease),
              border-color var(--dur-fast) var(--ease),
              color var(--dur-fast) var(--ease);
}
.btn:active { transform: translateY(0); }

/* قاعده‌ی `.cl a` ویژگی (0,1,1) دارد و از `.btn-secondary` با ویژگی (0,1,0)
   قوی‌تر است؛ به همین دلیل هر دکمه‌ای که با تگ <a> ساخته می‌شد رنگ عمومی لینک
   (بنفش برند) را می‌گرفت، نه رنگ خودش. روی پس‌زمینه‌ی سفید این یعنی نسبت
   کنتراست ۲.۹۹ که از حد WCAG AA پایین‌تر است.
   هر واریانت رنگ متن خود را در `--btn-fg` می‌گذارد و این قاعده با ویژگی
   بالاتر آن را اعمال می‌کند، فارغ از اینکه دکمه <a> باشد یا <button>. */
.cl a.btn,
.cl button.btn,
.cl .btn:hover,
.cl .btn:focus-visible,
.cl .btn:active { color: var(--btn-fg); }

.cl .btn:hover { transform: translateY(-2px); }

/* دکمه‌ی اصلی. سایه‌ی برند هنگام هاور *رشد* می‌کند؛ بالا رفتن بدون بزرگ شدن
   سایه، حس شناور شدن نمی‌دهد و فقط شبیه یک پرش است. خط نور بالای دکمه هم
   لبه‌ی گرادیان را برجسته نگه می‌دارد. */
.btn-primary {
  --btn-fg: #fff;
  background: linear-gradient(135deg, var(--c-brand-500), var(--c-brand-600));
  box-shadow: var(--sh-brand), inset 0 1px 0 rgba(255, 255, 255, 0.22);
}
.btn-primary:hover {
  background: linear-gradient(135deg, var(--c-brand-600), var(--c-brand-700));
  box-shadow: var(--sh-brand-lift), inset 0 1px 0 rgba(255, 255, 255, 0.22);
}
.btn-primary:active {
  background: linear-gradient(135deg, var(--c-brand-700), var(--c-brand-800));
  box-shadow: var(--sh-brand);
}

/* دکمه‌ی ثانویه - همان دکمه‌ای که «پنل کاربری» و «دموی رایگان» از آن استفاده
   می‌کنند. متن با رنگ اصلی متن سایت است تا در تم روشن کاملاً خوانا بماند. */
.btn-secondary {
  --btn-fg: var(--text);
  background: var(--surface);
  border-color: var(--border-strong);
  box-shadow: var(--sh-xs);
}
.btn-secondary:hover {
  background: var(--surface-2);
  border-color: var(--brand);
  box-shadow: var(--sh-sm);
}
.btn-secondary:active { background: var(--surface-inset); }

.btn-ghost {
  --btn-fg: var(--text);
  background: transparent;
}
.btn-ghost:hover { background: var(--surface-2); }
.btn-ghost:active { background: var(--surface-inset); }

.btn-accent {
  --btn-fg: #2A1B00;
  background: linear-gradient(135deg, var(--c-accent-400), var(--c-accent-500));
  box-shadow: 0 10px 24px rgba(252, 148, 0, 0.30), inset 0 1px 0 rgba(255, 255, 255, 0.32);
}
.btn-accent:hover {
  background: linear-gradient(135deg, var(--c-accent-500), var(--c-accent-600));
  box-shadow: 0 18px 38px rgba(252, 148, 0, 0.38), inset 0 1px 0 rgba(255, 255, 255, 0.32);
}
.btn-accent:active { background: var(--c-accent-600); box-shadow: 0 10px 24px rgba(252, 148, 0, 0.30); }

/* اندازه‌ها. دکمه‌ی بزرگ کمی بلندتر از قبل است تا در هیرو و نوار فراخوان،
   وزنش با تیترهای درشت هم‌تراز شود. */
.btn-lg { padding: 1.05rem 2.2rem; font-size: var(--fs-md); }
.btn-sm { padding: 0.55rem 1.1rem; font-size: var(--fs-sm); }
.btn-block { width: 100%; }

.btn[disabled], .btn[aria-disabled='true'] {
  opacity: 0.55;
  cursor: not-allowed;
  transform: none;
  box-shadow: none;
}

/* ---------- 7. Cards ---------------------------------------------------- */

.card {
  position: relative;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: var(--s-5);
  box-shadow: var(--sh-sm), var(--edge-light);
  transition: transform var(--dur) var(--ease),
              box-shadow var(--dur) var(--ease),
              border-color var(--dur) var(--ease);
}
/* بند آخر هر کارت نباید فاصله‌ی اضافه بگذارد؛ بدون این، پایین کارت‌ها
   ناهم‌تراز می‌شود چون بعضی با <p> تمام می‌شوند و بعضی با <ul>. */
.card > :last-child { margin-block-end: 0; }

.card-hover:hover {
  transform: translateY(-4px);
  box-shadow: var(--sh-lg), var(--edge-light);
  border-color: var(--c-brand-300);
}

.card-glass {
  background: var(--glass-bg);
  backdrop-filter: blur(16px) saturate(140%);
  -webkit-backdrop-filter: blur(16px) saturate(140%);
  border: 1px solid var(--glass-border);
}

.icon-tile {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 52px;
  border-radius: var(--r-md);
  background: var(--brand-soft);
  color: var(--brand);
  font-size: 1.5rem;
  margin-block-end: var(--s-4);
  flex-shrink: 0;
  transition: transform var(--dur) var(--ease), background-color var(--dur) var(--ease);
}
.icon-tile-accent { background: #FFF2DE; color: var(--c-accent-600); }
:root[data-theme='dark'] .icon-tile-accent { background: #3A2A0E; color: var(--c-accent-400); }

/* ریزتعامل: با هاورِ کارت، آیکون هم کمی جان می‌گیرد. بدون این، کارت بالا
   می‌رود ولی محتوایش کاملاً بی‌حرکت می‌ماند و حرکت مصنوعی به نظر می‌رسد. */
.card-hover:hover .icon-tile { transform: scale(1.08) rotate(-3deg); }
@media (prefers-reduced-motion: reduce) {
  .card-hover:hover .icon-tile { transform: none; }
}

/* ---------- 8. Badges / pills ------------------------------------------- */

.badge {
  display: inline-flex;
  align-items: center;
  gap: var(--s-1);
  padding: 0.25rem 0.7rem;
  border-radius: var(--r-full);
  font-size: var(--fs-xs);
  font-weight: 700;
  background: var(--surface-inset);
  color: var(--text-muted);
}
.badge-brand   { background: var(--brand-soft);      color: var(--brand); }
.badge-success { background: var(--c-success-100);   color: var(--c-success-500); }
.badge-accent  { background: #FFF2DE;                color: var(--c-accent-600); }
:root[data-theme='dark'] .badge-success { background: #10331F; color: #5BD98D; }
:root[data-theme='dark'] .badge-accent  { background: #3A2A0E; color: var(--c-accent-400); }

/* ---------- 9. Header / nav --------------------------------------------- */

.site-header {
  position: sticky;
  top: 0;
  z-index: 1000;
  background: var(--glass-bg);
  backdrop-filter: blur(18px) saturate(160%);
  -webkit-backdrop-filter: blur(18px) saturate(160%);
  border-block-end: 1px solid transparent;
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.site-header.is-stuck {
  border-block-end-color: var(--border);
  box-shadow: var(--sh-sm);
}

.nav {
  display: flex;
  align-items: center;
  gap: var(--s-5);
  min-height: var(--header-h);
}

.nav-brand { display: flex; align-items: center; gap: var(--s-2); flex-shrink: 0; }
.nav-brand img { height: 31px; width: auto; }

/* لوگو در ابتدای محور (سمت راست در RTL) می‌ماند و بقیه‌ی هدر به انتهای محور
   (سمت چپ) می‌رود. برای این کار به‌جای حاشیه‌ی auto - که به‌عنوان حاشیه‌ی
   ابتدای محور، فضای خالی را جذب نمی‌کرد و نتیجه‌اش یک حفره‌ی ۲۲۰ پیکسلی در
   لبه‌ی چپ بود - خودِ فهرست کشیده می‌شود و محتوایش به انتهای محور می‌چسبد.
   بنابراین آیتم‌های ناوبری و دکمه‌های ورود یک بلوک به‌هم‌پیوسته می‌سازند که از
   لبه‌ی چپ هدر شروع می‌شود. */
.nav-links {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  flex: 1;
  justify-content: flex-end;
}
.nav-links a {
  position: relative;
  padding: 0.5rem 0.85rem;
  border-radius: var(--r-full);
  color: var(--text-muted);
  font-weight: 700;
  font-size: var(--fs-sm);
  transition: background-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
.nav-links a:hover,
.nav-links a[aria-current='page'] { background: var(--surface-2); color: var(--text); }
/* صفحه‌ی جاری فقط با پس‌زمینه‌ی خاکستری از هاور قابل تشخیص نبود - هر دو یک
   شکل بودند. یک نقطه‌ی برند زیر آیتم، حالت «اینجا هستید» را از حالت «موس
   اینجاست» جدا می‌کند. */
.nav-links a[aria-current='page']::after {
  content: '';
  position: absolute;
  inset-block-end: 2px;
  inset-inline-start: 50%;
  transform: translateX(50%);
  width: 5px; height: 5px;
  border-radius: var(--r-full);
  background: var(--brand);
}

.nav-actions { display: flex; align-items: center; gap: var(--s-3); flex-shrink: 0; }

.theme-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px; height: 40px;
  border-radius: var(--r-full);
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--text-muted);
  cursor: pointer;
  transition: color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
}
.theme-toggle:hover { color: var(--brand); border-color: var(--brand); }
.theme-toggle .icon-moon { display: none; }
:root[data-theme='dark'] .theme-toggle .icon-moon { display: block; }
:root[data-theme='dark'] .theme-toggle .icon-sun { display: none; }

.nav-toggle {
  display: none;
  width: 44px; height: 44px;
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  background: var(--surface);
  color: var(--text);
  cursor: pointer;
}

@media (max-width: 1024px) {
  .nav-toggle { display: inline-flex; align-items: center; justify-content: center; }
  .nav-links {
    position: fixed;
    inset-block-start: var(--header-h);
    inset-inline: 0;
    flex: 0 1 auto;
    flex-direction: column;
    align-items: stretch;
    justify-content: flex-start;
    gap: var(--s-1);
    padding: var(--s-4) var(--gutter) var(--s-6);
    background: var(--bg);
    border-block-end: 1px solid var(--border);
    box-shadow: var(--sh-lg);
    transform: translateY(-12px);
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--dur) var(--ease), transform var(--dur) var(--ease), visibility var(--dur);
    max-height: calc(100dvh - var(--header-h));
    overflow-y: auto;
  }
  .nav-links.is-open { transform: translateY(0); opacity: 1; visibility: visible; }
  .nav-links a { padding: var(--s-3) var(--s-4); font-size: var(--fs-base); }
  .nav-actions .btn-nav-cta { display: none; }
  .nav-links .btn { margin-block-start: var(--s-3); }
}

/* ---------- 10. Hero ---------------------------------------------------- */

.hero {
  position: relative;
  padding-block: clamp(3rem, 1.5rem + 6vw, 6rem) var(--section-y);
  overflow: hidden;
}
/* پس‌زمینه‌ی هیرو سه لایه است: یک تورِ خیلی کم‌رنگ که به فضا بافت می‌دهد، و
   دو هاله‌ی رنگی که تور را در لبه‌ها محو می‌کنند. تور به‌تنهایی خشک است و
   هاله به‌تنهایی خالی؛ کنار هم عمق می‌سازند.
   `mask` باعث می‌شود تور از بالا به پایین محو شود و خطِ پایانِ ناگهانی
   نداشته باشد. */
.hero-bg {
  position: absolute;
  inset: 0;
  z-index: -1;
  background:
    radial-gradient(60rem 32rem at 85% -10%, rgba(106, 73, 242, 0.16), transparent 60%),
    radial-gradient(44rem 28rem at 5% 10%, rgba(252, 148, 0, 0.10), transparent 60%);
  pointer-events: none;
}
.hero-bg::before {
  content: '';
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(to left, rgba(34, 23, 73, 0.05) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(34, 23, 73, 0.05) 1px, transparent 1px);
  background-size: 68px 68px;
  mask-image: radial-gradient(72rem 40rem at 70% 0%, #000 20%, transparent 78%);
  -webkit-mask-image: radial-gradient(72rem 40rem at 70% 0%, #000 20%, transparent 78%);
}
:root[data-theme='dark'] .hero-bg {
  background:
    radial-gradient(60rem 32rem at 85% -10%, rgba(155, 132, 246, 0.20), transparent 60%),
    radial-gradient(44rem 28rem at 5% 10%, rgba(252, 148, 0, 0.10), transparent 60%);
}
:root[data-theme='dark'] .hero-bg::before {
  background-image:
    linear-gradient(to left, rgba(255, 255, 255, 0.045) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(255, 255, 255, 0.045) 1px, transparent 1px);
}

.hero-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr);
  gap: clamp(2rem, 1rem + 4vw, 4rem);
  align-items: center;
}
@media (max-width: 980px) {
  .hero-grid { grid-template-columns: minmax(0, 1fr); }
}

.hero h1 { margin-block-end: var(--s-4); }
.hero-lede {
  font-size: var(--fs-md);
  line-height: var(--lh-lede);
  color: var(--text-muted);
  max-width: 54ch;
  margin-block-end: var(--s-6);
}
/* فاصله‌ی بیشتر بین دکمه‌ها و نشانه‌های اعتماد: این دو گروه یک چیز نیستند و
   نباید مثل یک بلوک پیوسته دیده شوند. */
.hero-cta { display: flex; flex-wrap: wrap; gap: var(--s-3); margin-block-end: var(--s-6); }
@media (max-width: 480px) {
  .hero-cta { flex-direction: column; align-items: stretch; }
  .hero-cta .btn { width: 100%; }
}

.hero-trust {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-2) var(--s-5);
  font-size: var(--fs-sm);
  color: var(--text-subtle);
}
.hero-trust li { display: flex; align-items: center; gap: var(--s-2); }
.hero-trust svg { color: var(--c-success-500); flex-shrink: 0; }

/* ---------- 10b. هیروی سینمایی (فقط صفحه‌ی خانه) ------------------------

   چرا یک واریانت جدا و نه تغییر خودِ .hero:
   کلاس .hero در صفحه‌ی امکانات، راهکارها، تعرفه و دمو هم استفاده می‌شود و
   آن‌ها یک سربرگ‌اند، نه یک صحنه. بزرگ کردن همه‌شان، «بزرگ» را بی‌معنی
   می‌کرد.

   ترکیب‌بندی: یک ستون متنِ وسط‌چین با عرض محدود (قابِ خوانش)، و زیرش ماکاپ
   در قابِ پهن. چشم از بالا به پایین یک مسیر دارد، نه دو ستونِ رقیب. */
.hero-cinematic {
  padding-block: clamp(3.5rem, 2rem + 8vw, 7.5rem) 0;
  text-align: center;
}

.hero-stage {
  max-width: 62rem;
  margin-inline: auto;
}
.hero-cinematic .eyebrow { margin-inline: auto; }

.hero-title {
  font-size: var(--fs-display);
  line-height: 1.22;
  /* فارسی خط متصل است؛ در این اندازه، فاصله‌ی پیش‌فرضِ حروف تیتر را باز
     نشان می‌دهد. -0.01em نه آنقدر است که اتصال‌ها روی هم بیفتد، نه آنقدر کم
     که تیتر پراکنده دیده شود. */
  letter-spacing: -0.01em;
  margin-block: var(--s-4) var(--s-5);
  /* تیتر دو یا سه سطری باید سطرهای هم‌وزن داشته باشد، نه یک سطر بلند و یک
     کلمه‌ی تنها در سطر دوم. */
  text-wrap: balance;
}

.hero-cinematic .hero-lede {
  margin-inline: auto;
  max-width: 58ch;
  font-size: var(--fs-lg);
  margin-block-end: var(--s-6);
}
.hero-cinematic .hero-cta { justify-content: center; }
.hero-cinematic .hero-trust {
  justify-content: center;
  gap: var(--s-2) var(--s-5);
}
.hero-audience {
  max-width: 52ch;
  margin-inline: auto;
  margin-block: var(--s-5) 0;
}

/* پس‌زمینه‌ی هیروی سینمایی: همان سه لایه‌ی .hero-bg، ولی بلندتر و با یک
   هاله‌ی اضافه دقیقاً پشت تیتر. هدف عمق است، نه رنگ بیشتر - برای همین
   هاله‌ها کم‌رنگ‌اند و هیچ‌کدام لبه‌ی مشخصی ندارند. */
.hero-cinematic .hero-bg {
  background:
    radial-gradient(38rem 24rem at 50% 0%, rgba(106, 73, 242, 0.13), transparent 65%),
    radial-gradient(60rem 34rem at 88% 8%, rgba(106, 73, 242, 0.12), transparent 62%),
    radial-gradient(46rem 30rem at 6% 22%, rgba(252, 148, 0, 0.09), transparent 62%);
}
.hero-cinematic .hero-bg::before {
  mask-image: linear-gradient(to bottom, #000 8%, rgba(0, 0, 0, 0.35) 55%, transparent 92%);
  -webkit-mask-image: linear-gradient(to bottom, #000 8%, rgba(0, 0, 0, 0.35) 55%, transparent 92%);
}
:root[data-theme='dark'] .hero-cinematic .hero-bg {
  background:
    radial-gradient(38rem 24rem at 50% 0%, rgba(155, 132, 246, 0.18), transparent 65%),
    radial-gradient(60rem 34rem at 88% 8%, rgba(155, 132, 246, 0.14), transparent 62%),
    radial-gradient(46rem 30rem at 6% 22%, rgba(252, 148, 0, 0.08), transparent 62%);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme='light']) .hero-cinematic .hero-bg {
    background:
      radial-gradient(38rem 24rem at 50% 0%, rgba(155, 132, 246, 0.18), transparent 65%),
      radial-gradient(60rem 34rem at 88% 8%, rgba(155, 132, 246, 0.14), transparent 62%),
      radial-gradient(46rem 30rem at 6% 22%, rgba(252, 148, 0, 0.08), transparent 62%);
  }
}

/* ---- قاب نمایش محصول ----
   ماکاپ از پایین برش می‌خورد و محو می‌شود. دلیلش روایی است: صفحه‌ی پنل
   «ادامه دارد» و بازدیدکننده باید همین را حس کند، نه اینکه یک تصویر کامل و
   بسته ببیند. لبه‌ی محوشده هم مرز بین هیرو و بخش بعدی را نرم می‌کند. */
.hero-showcase {
  position: relative;
  margin-block-start: clamp(2.5rem, 1.5rem + 4vw, 4.5rem);
  /* ماکاپ بلند است و نباید تمام قدِ صفحه را بگیرد؛ بخشِ بریده‌شده همان چیزی
     است که «ادامه دارد» را می‌سازد. */
  max-height: 30rem;
  overflow: hidden;
  mask-image: linear-gradient(to bottom, #000 62%, transparent 100%);
  -webkit-mask-image: linear-gradient(to bottom, #000 62%, transparent 100%);
}
.hero-showcase .mockup {
  box-shadow: var(--sh-xl);
  /* شیبِ خیلی ملایم. بیشتر از این، متن داخل ماکاپ را ناخوانا و صفحه را
     «افکت‌زده» می‌کند. */
  transform: perspective(1600px) rotateX(3deg);
  transform-origin: top center;
}
@media (max-width: 700px) {
  .hero-showcase { max-height: 20rem; }
  .hero-showcase .mockup { transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .hero-showcase .mockup { transform: none; }
}

/* ---------- 11. Stats / counters ---------------------------------------- */

.stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
  gap: var(--s-4);
}
.stat {
  text-align: center;
  padding: var(--s-5) var(--s-4);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-xs), var(--edge-light);
  transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.stat:hover { transform: translateY(-3px); box-shadow: var(--sh-md), var(--edge-light); }
.stat-value {
  display: block;
  font-size: var(--fs-2xl);
  font-weight: 700;
  color: var(--brand);
  line-height: 1.1;
  font-variant-numeric: tabular-nums;
  /* عدد و پسوندش («+»، «٪») باید مثل یک واحد خوانده شوند، نه دو تکه. */
  letter-spacing: normal;
}
.stat-label {
  font-size: var(--fs-sm);
  line-height: var(--lh-snug);
  color: var(--text-muted);
  margin-block-start: var(--s-2);
}

/* ---------- 12. Product mockup (pure CSS, no images) -------------------- */

.mockup {
  position: relative;
  border-radius: var(--r-xl);
  background: var(--surface);
  border: 1px solid var(--border);
  box-shadow: var(--sh-lg);
  overflow: hidden;
  container-type: inline-size;
}
.mockup-bar {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  padding: 0.7rem var(--s-4);
  background: var(--surface-2);
  border-block-end: 1px solid var(--border);
}
.mockup-dot { width: 10px; height: 10px; border-radius: var(--r-full); background: var(--border-strong); }
.mockup-dot:nth-child(1) { background: #FF5F57; }
.mockup-dot:nth-child(2) { background: #FEBC2E; }
.mockup-dot:nth-child(3) { background: #28C840; }
.mockup-title {
  margin-inline-start: auto;
  font-size: var(--fs-xs);
  color: var(--text-subtle);
  font-weight: 700;
}

.mockup-body { display: grid; grid-template-columns: 168px minmax(0, 1fr); min-height: 300px; }
@container (max-width: 560px) {
  .mockup-body { grid-template-columns: minmax(0, 1fr); }
  .mockup-side { display: none; }
}

.mockup-side {
  padding: var(--s-4);
  background: var(--surface-2);
  border-inline-end: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  gap: var(--s-1);
}
.mockup-navitem {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  padding: 0.5rem 0.65rem;
  border-radius: var(--r-sm);
  font-size: var(--fs-xs);
  color: var(--text-muted);
  font-weight: 700;
}
.mockup-navitem.is-active { background: var(--brand-soft); color: var(--brand); }
.mockup-navitem i { width: 16px; text-align: center; }

.mockup-main { padding: var(--s-4); display: flex; flex-direction: column; gap: var(--s-4); }

.mockup-kpis { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s-3); }
.mockup-kpi {
  padding: var(--s-3);
  border-radius: var(--r-md);
  background: var(--surface-inset);
  border: 1px solid var(--border);
}
.mockup-kpi small { display: block; font-size: 0.68rem; color: var(--text-subtle); margin-block-end: 2px; }
.mockup-kpi span { font-size: var(--fs-base); font-weight: 700; color: var(--text); font-variant-numeric: tabular-nums; }
.mockup-kpi .delta { font-size: 0.66rem; font-weight: 700; color: var(--c-success-500); }

.mockup-chart {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 4%;
  height: 116px;
  padding: var(--s-3);
  border-radius: var(--r-md);
  background: var(--surface-inset);
  border: 1px solid var(--border);
}
.mockup-chart span {
  flex: 1;
  border-radius: 4px 4px 0 0;
  background: linear-gradient(180deg, var(--c-brand-400), var(--c-brand-500));
  animation: bar-rise var(--dur-slow) var(--ease) backwards;
}
.mockup-chart span:last-child { background: linear-gradient(180deg, var(--c-accent-400), var(--c-accent-500)); }

@keyframes bar-rise { from { height: 0 !important; opacity: 0; } }

.mockup-rows { display: flex; flex-direction: column; gap: var(--s-2); }
.mockup-row {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  padding: 0.5rem var(--s-3);
  border-radius: var(--r-sm);
  background: var(--surface-inset);
  font-size: var(--fs-xs);
}
.mockup-avatar {
  width: 24px; height: 24px;
  border-radius: var(--r-full);
  background: linear-gradient(135deg, var(--c-brand-400), var(--c-brand-600));
  color: #fff;
  display: grid;
  place-items: center;
  font-size: 0.6rem;
  font-weight: 700;
  flex-shrink: 0;
}
.mockup-row .name { font-weight: 700; color: var(--text); }
.mockup-row .meta { color: var(--text-subtle); margin-inline-start: auto; font-variant-numeric: tabular-nums; }

/* ---- واریانت «فهرست مشتریان» ----
   ماکاپ دوم صفحه نباید همان ماکاپ اول باشد. تکرار عین یک تصویر در دو بخش،
   دقیقاً همان چیزی است که یک صفحه را ساختگی نشان می‌دهد. */
.mockup-toolbar {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  flex-wrap: wrap;
  margin-block-end: var(--s-3);
}
.mockup-search {
  flex: 1 1 40%;
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 6px 10px;
  border-radius: var(--r-sm);
  background: var(--surface-inset);
  border: 1px solid var(--border);
  color: var(--text-subtle);
  font-size: 0.68rem;
}
.mockup-chip {
  padding: 5px 9px;
  border-radius: var(--r-full);
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--text-subtle);
  font-size: 0.66rem;
  font-weight: 700;
}
.mockup-chip.is-on { background: var(--brand-soft); border-color: transparent; color: var(--brand); }

.mockup-rows.is-list .mockup-row { align-items: center; }
.mockup-row .name .sub {
  display: block;
  font-size: 0.64rem;
  font-weight: 400;
  font-style: normal;
  color: var(--text-subtle);
  line-height: 1.6;
}
.mockup-pill {
  margin-inline-start: auto;
  padding: 3px 9px;
  border-radius: var(--r-full);
  font-size: 0.64rem;
  font-weight: 700;
  background: var(--surface-inset);
  color: var(--text-subtle);
}
.mockup-pill.is-ok   { background: var(--c-success-100); color: var(--c-success-500); }
.mockup-pill.is-warn { background: var(--c-warn-100); color: var(--c-warn-500); }
:root[data-theme='dark'] .mockup-pill.is-ok   { background: #10331F; color: #5BD98D; }
:root[data-theme='dark'] .mockup-pill.is-warn { background: #3A2A0E; color: var(--c-accent-400); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme='light']) .mockup-pill.is-ok   { background: #10331F; color: #5BD98D; }
  :root:not([data-theme='light']) .mockup-pill.is-warn { background: #3A2A0E; color: var(--c-accent-400); }
}

/* ---------- 13. Pricing ------------------------------------------------- */

.billing-toggle {
  display: inline-flex;
  gap: var(--s-1);
  padding: var(--s-1);
  border-radius: var(--r-full);
  background: var(--surface-2);
  border: 1px solid var(--border);
  margin-inline: auto;
  flex-wrap: wrap;
  justify-content: center;
}
.billing-toggle button {
  position: relative;
  padding: 0.55rem 1.1rem;
  border: 0;
  border-radius: var(--r-full);
  background: transparent;
  color: var(--text-muted);
  font-family: inherit;
  font-size: var(--fs-sm);
  font-weight: 700;
  cursor: pointer;
  transition: background-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
  white-space: nowrap;
}
.billing-toggle button:hover { color: var(--text); }
.billing-toggle button[aria-selected='true'] {
  background: var(--surface);
  color: var(--brand);
  box-shadow: var(--sh-xs);
}
.billing-toggle .save {
  display: inline-block;
  margin-inline-start: var(--s-1);
  padding: 0 0.4rem;
  border-radius: var(--r-full);
  background: var(--c-success-100);
  color: var(--c-success-500);
  font-size: 0.68rem;
}
:root[data-theme='dark'] .billing-toggle .save { background: #10331F; color: #5BD98D; }

/* چیدمان کارت‌های پلن.

   تعداد پلن‌ها داده است، نه ثابتِ کد: امروز پنج رده داریم و فردا ممکن است
   چهار یا شش تا باشد. با ۴ ستون ثابت، پنج کارت به «۴ + ۱» می‌شکست و آن کارتِ
   تنها، چسبیده به ابتدای ردیف می‌ماند.

   ترفند: شبکه دو برابرِ ستون‌های واقعی «نیم‌ستون» دارد و هر کارت دقیقاً دو
   نیم‌ستون می‌گیرد. تنها با همین یک نیم‌ستون اضافه می‌شود ردیف ناقصِ پایانی
   را با CSS Grid درست وسط چید، بدون اینکه عرض کارت‌ها با هم فرق کند و بدون
   اینکه جایی عرض ثابت هارد‌کد شود.

     ۵ کارت → ۳ + ۲ (ردیف دوم وسط‌چین)
     ۷ کارت → ۳ + ۳ + ۱ (وسط‌چین)

   جای شروع اولین کارتِ ردیف ناقص از این رابطه می‌آید:
     offset = (ستون‌ها − باقی‌مانده) نیم‌ستون. */
.plan-grid {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));   /* ۳ ستون واقعی */
  gap: var(--s-5);
  align-items: stretch;
  margin-inline: auto;
}
.plan-grid > * {
  grid-column: span 2;
  min-width: 0;
}

/* دقیقاً چهار کارت → یک ردیفِ چهارتایی، نه «۳ + ۱».
   بخش ارتقا در پنل کاربری همیشه *کمتر از* تعداد کل رده‌هاست (رده‌های پایین‌تر
   و رده‌ی فعلی حذف می‌شوند)، پس ۴ و ۲ و ۱ کارتی حالت‌های عادیِ آن هستند، نه
   استثنا. با ۳ ستون، چهار کارت به یک ردیفِ سه‌تایی و یک کارتِ تنها می‌شکست:
   ردیف دوم نصفِ ارتفاع ردیف اول را خالی می‌گذاشت و مقایسه‌ی چشمی را می‌شکست.
   هشت نیم‌ستون یعنی همان «هر کارت دو نیم‌ستون»، فقط چهار ستون واقعی. */
.plan-grid:has(> :nth-child(4):last-child) {
  grid-template-columns: repeat(8, minmax(0, 1fr));
}

/* ردیف ناقص پایانی - دسکتاپ، ۳ ستون واقعی.
   توضیح هر انتخابگر عمداً *بالای* قاعده است و نه دنبالش: تست چیدمان،
   انتخابگرها را با تقسیم روی «،» جدا می‌کند و یک توضیحِ دنباله‌رو به بخش
   بعدی می‌چسبد و آن بخش را از بررسی جا می‌اندازد.

     ۵ کارت → ۳ + ۲، و ۸ کارت → ۳ + ۳ + ۲ */
.plan-grid:has(> :nth-child(5):last-child) > :nth-child(4),
.plan-grid:has(> :nth-child(8):last-child) > :nth-child(7) { grid-column: 2 / span 2; }

/* ۷ کارت → ۳ + ۳ + ۱ */
.plan-grid:has(> :nth-child(7):last-child) > :nth-child(7) { grid-column: 3 / span 2; }

/* یک یا دو کارت - حالتِ پرتکرارِ بخشِ ارتقا.

   ✨ اینجا باگ بود: شبکه سقف عرض می‌گرفت ولی کارت‌ها همچنان «۲ از ۶ نیم‌ستون»
   می‌ماندند. یعنی دو کارت داخل ۷۶۰ پیکسل هرکدام ~۲۴۰ پیکسل می‌شدند و یک ستون
   کامل خالی می‌ماند، و یک کارتِ تنها داخل ۴۲۰ پیکسل به ~۱۳۰ پیکسل می‌رسید -
   باریک‌تر از دکمه‌ی داخل خودش. سقف عرض حالا با *سهمِ* کارت هماهنگ است: دو
   کارت هرکدام نیمی از شبکه، و یک کارت تمامِ آن. */
.plan-grid:has(> :nth-child(2):last-child) { max-width: 900px; }
.plan-grid:has(> :nth-child(2):last-child) > * { grid-column: span 3; }

.plan-grid:has(> :only-child) { max-width: 460px; }
.plan-grid:has(> :only-child) > :only-child { grid-column: 1 / -1; }

/* ردیف چهارتایی فقط وقتی که واقعاً جا دارد.
   زیر این عرض، سهم هر کارت به ~۲۸۰ پیکسل می‌رسد و سطرِ «برچسب: عدد» در فهرست
   امکانات دو خطی می‌شود. دو در دو با کارت‌های ~۴۲۰ پیکسلی خواناتر است.
   جای این بلوک پیش از دو بلوک باریک‌تر است تا آن‌ها بتوانند رویش بنویسند. */
@media (max-width: 1280px) {
  .plan-grid:has(> :nth-child(4):last-child) {
    grid-template-columns: repeat(4, minmax(0, 1fr));
    max-width: 880px;
  }
}

/* تبلت: ۲ ستون واقعی، تکِ پایانی وسط‌چین (۲ + ۲ + ۱) */
@media (max-width: 1100px) {
  .plan-grid,
  .plan-grid:has(> :nth-child(4):last-child) {
    grid-template-columns: repeat(4, minmax(0, 1fr));
    max-width: 880px;
  }
  /* هر انتخابگرِ دسکتاپ باید صریحاً خنثی شود، وگرنه offsetِ سه‌ستونه اینجا
     کارت را به ستونی می‌برد که دیگر وجود ندارد. */
  .plan-grid > *,
  .plan-grid:has(> :nth-child(5):last-child) > :nth-child(4),
  .plan-grid:has(> :nth-child(8):last-child) > :nth-child(7),
  .plan-grid:has(> :nth-child(7):last-child) > :nth-child(7),
  .plan-grid:has(> :nth-child(2):last-child) > * { grid-column: span 2; }

  /* تعداد فرد → آخرین کارت تنها می‌ماند، پس وسط می‌نشیند.
     ✨ `:not(:only-child)` لازم است: یک کارتِ تنها هم «فردِ پایانی» است، و این
     انتخابگر از قاعده‌ی تک‌کارتیِ زیرش ویژگی بیشتری دارد. بدون آن، تنها کارتِ
     بخش ارتقا روی تبلت نصفِ شبکه‌ی ۴۶۰ پیکسلی می‌شد - یعنی ۲۱۸ پیکسل. */
  .plan-grid:has(> :nth-child(odd):last-child) > :last-child:not(:only-child) { grid-column: 2 / span 2; }
  .plan-grid:has(> :only-child) > :only-child { grid-column: 1 / -1; }
}

/* گوشی: تک‌ستونه.
   اینجا هم مثل تبلت، *هر* انتخابگرِ چیدمانِ بالاتر باید صریحاً خنثی شود.
   `.plan-grid > *` به‌تنهایی کافی نیست: انتخابگرهای :has() ویژگی بالاتری
   دارند و کارتی که span 2 مانده بود، یک ستونِ ضمنیِ صفرپیکسلی می‌ساخت و
   عرضش با بقیه فرق می‌کرد. */
@media (max-width: 640px) {
  .plan-grid,
  .plan-grid:has(> :nth-child(4):last-child) {
    grid-template-columns: minmax(0, 1fr);
    max-width: 440px;
    gap: var(--s-4);
  }
  .plan-grid > *,
  .plan-grid:has(> :nth-child(5):last-child) > :nth-child(4),
  .plan-grid:has(> :nth-child(8):last-child) > :nth-child(7),
  .plan-grid:has(> :nth-child(7):last-child) > :nth-child(7),
  .plan-grid:has(> :nth-child(2):last-child) > *,
  /* دقیقاً همان انتخابگرِ بلوک تبلت. مدیا کوئری به ویژگی چیزی اضافه نمی‌کند،
     پس اگر اینجا `:not(:only-child)` نباشد، قاعده‌ی تبلت - که یک درجه
     ویژه‌تر است - روی گوشی هم برنده می‌ماند و آخرین کارتِ یک شبکه‌ی
     سه‌تایی را به ستون دوم یک شبکه‌ی تک‌ستونه می‌فرستد. */
  .plan-grid:has(> :nth-child(odd):last-child) > :last-child:not(:only-child),
  .plan-grid:has(> :only-child) > :only-child { grid-column: 1 / -1; }
}

.plan {
  position: relative;
  display: flex;
  flex-direction: column;
  height: 100%;
  /* فاصله‌ی داخلی با عرضِ کارت بالا و پایین می‌رود: در ردیف چهارتایی کارت
     ~۳۱۰ پیکسل است و ۲ رِم حاشیه‌ی افقی یعنی متن روی ~۲۱۰ پیکسل، ولی یک کارتِ
     تنها ۴۶۰ پیکسل عرض دارد و همان حاشیه آنجا کم به نظر می‌رسد. */
  padding: var(--s-6) clamp(var(--s-5), 1rem + 1.4vw, var(--s-6));
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  box-shadow: var(--sh-sm), var(--edge-light);
  transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease), border-color var(--dur) var(--ease);
}
.plan:hover {
  transform: translateY(-4px);
  box-shadow: var(--sh-lg), var(--edge-light);
  border-color: var(--c-brand-300);
}

/* رده‌ی پیشنهادی باید در یک نگاه از بقیه جدا شود، ولی نه با بزرگ‌تر شدن -
   بزرگ کردنش ردیف را ناهم‌تراز می‌کند. به‌جایش: قاب برند، سایه‌ی برند، و یک
   نوار نازک رنگی روی لبه‌ی بالایی. */
.plan.is-recommended {
  border-color: var(--brand);
  box-shadow: var(--sh-brand), var(--edge-light);
  /* قابِ برند و سایه در ردیفِ چهارتایی - که کارت‌ها باریک‌ترند و کنار هم
     فشرده‌اند - به‌تنهایی کم‌رنگ می‌شد. یک تهِ رنگِ خیلی ملایم، بدون تغییر
     اندازه، رده‌ی پیشنهادی را از فاصله هم جدا نگه می‌دارد. */
  background: linear-gradient(180deg, var(--brand-soft), var(--surface) 42%);
}
.plan.is-recommended:hover { box-shadow: var(--sh-brand-lift), var(--edge-light); }
.plan.is-recommended::after {
  content: '';
  position: absolute;
  inset-block-start: 0;
  /* inset-inline: 0;
  height: 4px;
  border-start-start-radius: var(--r-xl);
  border-start-end-radius: var(--r-xl);
  background: linear-gradient(to left, var(--c-brand-500), var(--c-accent-500)); */
}
.plan.is-recommended::before {
  content: attr(data-badge);
  position: absolute;
  inset-block-start: -14px;
  inset-inline-start: 50%;
  transform: translateX(50%);
  padding: 0.3rem 1rem;
  border-radius: var(--r-full);
  background: linear-gradient(135deg, var(--c-brand-500), var(--c-brand-600));
  color: #fff;
  font-size: var(--fs-xs);
  font-weight: 700;
  white-space: nowrap;
  box-shadow: var(--sh-md);
  z-index: 1;
}

/* بلوکِ یک مدت - قیمت، دکمه و فهرست امکاناتِ همان مدت، که با هم نمایان و با
   هم پنهان می‌شوند.

   کارت پلن یک ستونِ فلکس است و `.plan-features` با `flex-grow` ته کارت را پر
   می‌کند تا کارت‌های یک ردیف هم‌ارتفاع بمانند. حالا که فهرست امکانات داخل این
   بلوک است، خودِ بلوک باید همان ستونِ کشیده باشد؛ وگرنه `flex-grow` روی
   فرزندِ یک بلوکِ ساده بی‌اثر می‌شود و ته کارت‌ها ناهم‌تراز می‌ماند. */
.plan > [data-plan-duration] {
  display: flex;
  flex-direction: column;
  flex-grow: 1;
}
/* `display: flex` بالا بر پیش‌فرضِ `hidden` می‌چربد. بدون این خط، کلید دوره‌ی
   صورتحساب هر چهار مدت را هم‌زمان نشان می‌دهد. */
.plan > [data-plan-duration][hidden] { display: none; }

.plan-name { font-size: var(--fs-lg); margin-block-end: var(--s-1); }
.plan-tagline {
  font-size: var(--fs-sm);
  line-height: var(--lh-snug);
  color: var(--text-subtle);
  /* هم‌ترازی قیمت‌ها در ردیف: بدون یک کف مشترک، هر کارت قیمتش را در ارتفاع
     دیگری نشان می‌دهد و چشم برای مقایسه باید بالا و پایین برود. */
  min-height: 3.2em;
  margin-block-end: var(--s-5);
}

.plan-price { display: flex; align-items: baseline; gap: var(--s-2); flex-wrap: wrap; }
.plan-price .amount {
  font-size: var(--fs-2xl);
  font-weight: 700;
  color: var(--text);
  line-height: 1.1;
  font-variant-numeric: tabular-nums;
}
.plan-price .unit { font-size: var(--fs-sm); color: var(--text-subtle); }
.plan-period { font-size: var(--fs-xs); color: var(--text-subtle); margin-block: var(--s-2) var(--s-5); min-height: 2.4em; }
.plan-period .strike { text-decoration: line-through; opacity: 0.75; }

.plan-features { display: flex; flex-direction: column; gap: var(--s-3); margin-block-end: var(--s-5); flex-grow: 1; }
.plan-features li { display: flex; align-items: flex-start; gap: var(--s-2); font-size: var(--fs-sm); color: var(--text-muted); }
/* بدون این دو، یک برچسبِ بلند («صادرات اکسل مخاطبان») ستون را از عرضِ سهمش
   پهن‌تر می‌کرد و کارت‌های یک ردیف دیگر هم‌عرض نمی‌ماندند. */
.plan-features li > span { min-width: 0; overflow-wrap: anywhere; }
.plan-features svg { flex-shrink: 0; margin-block-start: 0.35em; }
.plan-features .yes { color: var(--c-success-500); }
.plan-features .no  { color: var(--c-ink-400); }
.plan-features li.is-off { opacity: 0.55; }
.plan-features b { color: var(--text); font-variant-numeric: tabular-nums; }

/* شرطِ یک قابلیت در جدول مقایسه («فقط در پلن‌های ۶ ماهه و ۱۲ ماهه»).
   خطِ دومِ همان خانه است، نه یک ستون تازه؛ پس تیک بالا معنایش را نگه می‌دارد. */
.compare-note {
  display: block;
  margin-block-start: var(--s-1);
  font-size: var(--fs-xs);
  line-height: var(--lh-snug);
  color: var(--text-subtle);
}

/* جدول مقایسه */
.compare-wrap {
  overflow-x: auto;
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  background: var(--surface);
  -webkit-overflow-scrolling: touch;
}
.compare {
  width: 100%;
  min-width: 680px;
  border-collapse: collapse;
  font-size: var(--fs-sm);
}
.compare th, .compare td {
  padding: var(--s-3) var(--s-4);
  text-align: start;
  border-block-end: 1px solid var(--border);
}
.compare thead th {
  position: sticky;
  top: 0;
  background: var(--surface-2);
  color: var(--text);
  font-weight: 700;
  z-index: 1;
}
.compare tbody th { font-weight: 400; color: var(--text-muted); }
.compare td { color: var(--text); font-variant-numeric: tabular-nums; }
.compare tbody tr:hover { background: var(--surface-2); }
.compare tr:last-child th, .compare tr:last-child td { border-block-end: 0; }
.compare .col-featured { background: var(--brand-soft); }

/* ---------- 14. FAQ (details/summary - بدون جاوااسکریپت) ---------------- */

.faq { display: flex; flex-direction: column; gap: var(--s-3); }
.faq-item {
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  background: var(--surface);
  overflow: hidden;
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.faq-item[open] { border-color: var(--c-brand-300); box-shadow: var(--sh-sm); }
.faq-item summary {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  padding: var(--s-4) var(--s-5);
  cursor: pointer;
  font-weight: 700;
  line-height: var(--lh-snug);
  color: var(--text);
  list-style: none;
  transition: background-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
/* پرسشِ باز، خودش عنوان پاسخ است؛ رنگ برند این نقش را نشان می‌دهد. */
.faq-item[open] summary { color: var(--brand); }
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::after {
  content: '';
  margin-inline-start: auto;
  width: 10px; height: 10px;
  border-inline-end: 2px solid var(--text-subtle);
  border-block-end: 2px solid var(--text-subtle);
  transform: rotate(45deg);
  transition: transform var(--dur) var(--ease);
  flex-shrink: 0;
}
.faq-item[open] summary::after { transform: rotate(-135deg); border-color: var(--brand); }
.faq-item summary:hover { background: var(--surface-2); }
.faq-answer {
  padding: 0 var(--s-5) var(--s-5);
  color: var(--text-muted);
  line-height: var(--lh-base);
  max-width: 72ch;
}
.faq-answer > :last-child { margin-block-end: 0; }

/* ---------- 15. Testimonials -------------------------------------------- */

.quote-card {
  display: flex;
  flex-direction: column;
  gap: var(--s-4);
  height: 100%;
  padding: var(--s-6) var(--s-5);
}
.quote-card blockquote {
  margin: 0;
  color: var(--text-muted);
  font-size: var(--fs-base);
  text-wrap: pretty;
}
/* گیومه‌ی بازِ درشت. رنگش کم‌رنگ است تا یک عنصر تزئینی بماند و با متن نقل‌قول
   رقابت نکند؛ اندازه‌اش درشت است تا کارت را از یک «کارت متنی» به یک نقل‌قول
   تبدیل کند. */
.quote-card blockquote::before {
  content: '\201D';
  display: block;
  font-size: 3.2rem;
  line-height: 0.55;
  color: var(--c-brand-300);
  margin-block-end: var(--s-4);
}
:root[data-theme='dark'] .quote-card blockquote::before { color: var(--c-brand-400); }

/* خط جداکننده‌ی نقل‌قول از گوینده - بدون آن، نام مثل ادامه‌ی جمله خوانده
   می‌شود. */
.quote-person {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  margin-block-start: auto;
  padding-block-start: var(--s-4);
  border-block-start: 1px solid var(--border);
}
.quote-avatar {
  width: 44px; height: 44px;
  border-radius: var(--r-full);
  background: linear-gradient(135deg, var(--c-brand-400), var(--c-brand-600));
  color: #fff;
  display: grid; place-items: center;
  font-weight: 700;
  flex-shrink: 0;
}
.quote-person .name { font-weight: 700; color: var(--text); font-size: var(--fs-sm); }
.quote-person .role { font-size: var(--fs-xs); color: var(--text-subtle); }

/* ---------- 16. Steps / workflow ---------------------------------------- */

.steps { counter-reset: step; display: grid; gap: var(--s-5); }
.step { position: relative; padding-inline-start: 64px; }
.step::before {
  counter-increment: step;
  content: counter(step);
  position: absolute;
  inset-inline-start: 0;
  inset-block-start: 0;
  width: 44px; height: 44px;
  display: grid; place-items: center;
  border-radius: var(--r-full);
  background: var(--brand-soft);
  color: var(--brand);
  font-weight: 700;
}
.step h3, .step h4 { margin-block-end: var(--s-2); font-size: var(--fs-md); }
.step p { margin-block-end: 0; font-size: var(--fs-sm); }

/* ---------- 17. Footer -------------------------------------------------- */

.site-footer {
  position: relative;
  background: var(--bg-subtle);
  border-block-start: 1px solid var(--border);
  padding-block: 0 var(--s-5);
  margin-block-start: var(--section-y);
}

/* ---- نوار تماس و ساعات کاری -------------------------------------------
   یک بخش مستقل در بالای فوتر، نه یک ستون ششم.

   دلیلش رفتاری است نه زیبایی‌شناختی: «تلفن‌تان چند است» و «کی باز هستید»
   دو سؤالی است که بازدیدکننده *با قصد* دنبالشان می‌آید. یک قلم دیگر در
   فهرست لینک‌ها، همان‌قدر دیده می‌شود که بقیه - یعنی وقتی لازم است، دیده
   نمی‌شود.

   سطح خودش را دارد (surface روی bg-subtle) تا مثل یک بلوک تصمیم‌گیری
   خوانده شود و نه ادامه‌ی متن پایانی صفحه. */
.footer-contact {
  background: var(--surface);
  border-block-end: 1px solid var(--border);
  padding-block: var(--s-7);
  margin-block-end: var(--s-8);
}
:root[data-theme='dark'] .footer-contact { background: var(--bg-muted); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme='light']) .footer-contact { background: var(--bg-muted); }
}

.contact-grid {
  display: grid;
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.35fr);
  gap: clamp(1.5rem, 1rem + 3vw, 3.5rem);
  align-items: center;
}
@media (max-width: 900px) {
  .contact-grid { grid-template-columns: minmax(0, 1fr); }
}

.contact-lead h2 {
  font-size: var(--fs-xl);
  margin-block: var(--s-3) var(--s-3);
}
.contact-lead p {
  color: var(--text-muted);
  font-size: var(--fs-sm);
  max-width: 46ch;
}

/* دو ستون روی دسکتاپ. چهار کارت در یک ردیف، هر کدام را به یک نوار باریک
   تبدیل می‌کرد که عدد تلفن در آن می‌شکست. */
.contact-cards {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--s-3);
}
@media (max-width: 560px) {
  .contact-cards { grid-template-columns: minmax(0, 1fr); }
}

.contact-card {
  display: flex;
  align-items: flex-start;
  gap: var(--s-3);
  padding: var(--s-4);
  background: var(--surface-2);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  transition: border-color var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.contact-card:hover { border-color: var(--border-strong); transform: translateY(-2px); }

/* کارت تلفن اصلی تنها کارتی است که رنگ برند می‌گیرد. اگر هر چهارتا برجسته
   شوند، هیچ‌کدام برجسته نیست و بازدیدکننده باید خودش تصمیم بگیرد کدام
   شماره را بگیرد. */
.contact-card.is-primary {
  background: var(--brand-soft);
  border-color: transparent;
  box-shadow: var(--sh-sm);
}
.contact-card.is-primary .contact-ic { background: var(--brand); color: var(--on-brand); }

.contact-ic {
  flex-shrink: 0;
  display: grid;
  place-items: center;
  width: 42px;
  height: 42px;
  border-radius: var(--r-sm);
  background: var(--surface);
  border: 1px solid var(--border);
  color: var(--brand);
}
.contact-card.is-primary .contact-ic { border-color: transparent; }

.contact-label {
  display: block;
  font-size: var(--fs-xs);
  color: var(--text-subtle);
  line-height: var(--lh-snug);
}
.contact-value {
  display: block;
  font-size: var(--fs-md);
  font-weight: 700;
  color: var(--text);
  line-height: 1.5;
  text-decoration: none;
  letter-spacing: normal;
}
a.contact-value:hover { color: var(--brand); }
a.contact-value:focus-visible { outline: 2px solid var(--brand); outline-offset: 3px; border-radius: 4px; }
.contact-meta {
  display: block;
  font-size: var(--fs-xs);
  color: var(--text-subtle);
  line-height: var(--lh-snug);
}
/* عدد تلفن در یک بند راست‌به‌چپ باید به‌عنوان یک واحد چپ‌به‌راست بنشیند،
   وگرنه خط تیره و اجزای شماره جابه‌جا دیده می‌شوند. */
.contact-value[dir='ltr'],
.contact-meta[dir='ltr'] { text-align: start; unicode-bidi: isolate; }
/* خط رنگی برند روی لبه‌ی بالای فوتر - تنها جایی در صفحه که رنگ برند به‌صورت
   یک نوار تمام‌عرض ظاهر می‌شود، و همان یک خط پایان صفحه را عمدی نشان می‌دهد
   به‌جای اینکه محتوا صرفاً تمام شود. */
.site-footer::before {
  content: '';
  position: absolute;
  inset-block-start: -1px;
  inset-inline: 0;
  height: 3px;
  background: linear-gradient(to left, var(--c-brand-500), var(--c-brand-400) 45%, var(--c-accent-500));
  opacity: 0.9;
}
/* آخرین ستون «مجوزات» است و فقط به اندازه‌ی کارت نماد عرض می‌گیرد (auto)،
   تا ستون‌های لینک عرض خود را از دست ندهند. چون آخرین فرزند است، در چیدمان
   RTL چپ‌ترین ستون فوتر می‌شود. */
.footer-grid {
  display: grid;
  grid-template-columns: 1.5fr repeat(3, 1fr) auto;
  gap: var(--s-6) var(--s-5);
  margin-block-end: var(--s-7);
}
@media (max-width: 980px) {
  /* زیر این عرض، پنج ستون بیش از حد باریک می‌شوند: معرفی برند تمام عرض را
     می‌گیرد و چهار ستون دیگر دو‌به‌دو زیر آن می‌نشینند. */
  .footer-grid { grid-template-columns: repeat(2, 1fr); }
  .footer-grid .footer-about { grid-column: 1 / -1; }
}
@media (max-width: 560px) {
  .footer-grid { grid-template-columns: 1fr; }
  .footer-grid .footer-about { grid-column: auto; }
}

/* تیتر ستون‌های فوتر: کوچک، ضخیم و با فاصله‌ی حروف بیشتر. در این اندازه،
   تنها راه اینکه تیتر از لینک‌های زیرش جدا دیده شود همین است - نه رنگ بیشتر
   و نه اندازه‌ی بزرگ‌تر. */
.footer-col h5 {
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  margin-block-end: var(--s-4);
  color: var(--text);
}
.footer-col li { margin-block-end: var(--s-2); }
/* هاور لینک فوتر کمی هم به سمت متن حرکت می‌کند؛ در RTL یعنی به چپ. */
.footer-col a {
  display: inline-block;
  color: var(--text-muted);
  font-size: var(--fs-sm);
  transition: color var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease);
}
.footer-col a:hover { color: var(--brand); transform: translateX(-3px); }
@media (prefers-reduced-motion: reduce) {
  .footer-col a:hover { transform: none; }
}
.footer-about p { font-size: var(--fs-sm); max-width: 38ch; }
.footer-brand img { height: 31px; width: auto; margin-block-end: var(--s-4); }

.footer-social { display: flex; gap: var(--s-2); }
.footer-social a {
  width: 38px; height: 38px;
  display: grid; place-items: center;
  border-radius: var(--r-full);
  background: var(--surface);
  border: 1px solid var(--border);
  color: var(--text-muted);
}
.footer-social a:hover { color: var(--brand); border-color: var(--brand); }

.footer-bottom {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-3);
  align-items: center;
  justify-content: space-between;
  padding-block-start: var(--s-5);
  border-block-start: 1px solid var(--border);
  font-size: var(--fs-xs);
  color: var(--text-subtle);
}

/* ناوبری ثانویه‌ی نوار پایانی: لینک سیاست‌ها و ورود به پنل مدیریت. */
.footer-legal {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-3) var(--s-5);
}
.footer-legal a {
  /* `--text-subtle` که نوار کپی‌رایت از آن استفاده می‌کند، در این اندازه به
     نسبت تضاد ۴٫۵:۱ نمی‌رسد. متن ثابت را می‌شود کم‌رنگ گذاشت، لینک را نه. */
  color: var(--text-muted);
  font-size: var(--fs-xs);
  transition: color var(--dur-fast) var(--ease);
}
.footer-legal a:hover,
.footer-legal a[aria-current='page'] { color: var(--brand); }

/* دکمه‌ی پنل مدیریت. عمداً خنثا و کم‌کنتراست است: باید برای مدیری که دنبالش
   است پیدا باشد، اما شبیه اقدام اصلی صفحه نباشد تا مشتری به‌اشتباه به‌جای
   «شارژ حساب» رویش کلیک نکند. */
.footer-admin {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  padding: var(--s-2) var(--s-3);
  border: 1px solid var(--border);
  border-radius: var(--r-full);
  background: var(--surface);
  transition: color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
}
.footer-admin:hover { border-color: var(--brand); }

/* نماد اعتماد ستون مخصوص خودش («مجوزات») را دارد و زیر تیتر همان ستون
   می‌نشیند؛ نه در نوار کپی‌رایت و نه ضمیمه‌ی ستون پشتیبانی. */
.footer-badges {
  display: flex;
  gap: var(--s-3);
  align-items: flex-start;
  flex-wrap: wrap;
}
.footer-licenses { min-width: 0; }

/* نماد اعتماد الکترونیکی.
   تصویر از سرور enamad می‌آید و پس‌زمینه‌ی سفید دارد؛ کارت روشن پشت آن باعث
   می‌شود در تم تیره هم درست دیده شود، بدون اینکه تصویر دستکاری شود. */
.enamad-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: var(--s-2);
  background: #fff;
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  box-shadow: var(--sh-xs);
  transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.enamad-badge:hover { transform: translateY(-2px); box-shadow: var(--sh-md); }
.enamad-badge img {
  display: block;
  width: auto;
  height: 96px;
  max-width: 100%;
}

@media (max-width: 560px) {
  .footer-bottom { justify-content: center; text-align: center; }
  /* تک‌ستونه: نماد وسط‌چین می‌شود تا زیر تیتر ستون معلق نماند */
  .footer-licenses { text-align: center; }
  .footer-badges { justify-content: center; }
  .enamad-badge img { height: 84px; }
}

/* ---------- 18. CTA band ------------------------------------------------ */

.cta-band {
  position: relative;
  padding: clamp(2.5rem, 1.5rem + 4vw, 4.5rem) var(--gutter);
  border-radius: var(--r-xl);
  background: linear-gradient(135deg, var(--c-brand-700), var(--c-brand-500) 55%, var(--c-brand-400));
  color: #fff;
  text-align: center;
  overflow: hidden;
  box-shadow: var(--sh-lg);
}
.cta-band::after {
  content: '';
  position: absolute;
  inset: 0;
  background:
    radial-gradient(30rem 18rem at 80% 0%, rgba(255, 255, 255, 0.18), transparent 60%),
    radial-gradient(24rem 16rem at 8% 110%, rgba(252, 148, 0, 0.22), transparent 65%);
  pointer-events: none;
}
.cta-band h2, .cta-band p { color: #fff; position: relative; z-index: 1; }
.cta-band h2 { font-size: var(--fs-2xl); }
.cta-band p {
  opacity: 0.92;
  line-height: var(--lh-lede);
  max-width: 56ch;
  margin-inline: auto;
}
.cta-band .btn { position: relative; z-index: 1; }
.cta-band .btn-secondary {
  --btn-fg: #fff;
  background: rgba(255, 255, 255, 0.16);
  border-color: rgba(255, 255, 255, 0.55);
  box-shadow: none;
}
.cta-band .btn-secondary:hover {
  background: rgba(255, 255, 255, 0.28);
  border-color: #fff;
}
.cta-band .btn-secondary:active { background: rgba(255, 255, 255, 0.36); }
/* روی پس‌زمینه‌ی بنفش، حلقه‌ی فوکوس بنفش دیده نمی‌شود */
.cta-band .btn:focus-visible { outline-color: #fff; }

/* ---------- 19. Scroll reveal ------------------------------------------- */

/*
  فقط `opacity` و `transform` متحرک می‌شوند؛ هر دو روی لایه‌ی ترکیب اجرا
  می‌شوند، پس نه چیدمان دوباره محاسبه می‌شود و نه جابه‌جایی محتوا (CLS) رخ
  می‌دهد. عنصر فضای خودش را از ابتدا اشغال کرده و فقط ظاهر می‌شود.
*/
.reveal,
.reveal-fade,
.reveal-scale,
.reveal-start,
.reveal-end {
  opacity: 0;
  transition:
    opacity var(--dur-reveal) var(--ease) var(--reveal-delay, 0ms),
    transform var(--dur-reveal) var(--ease) var(--reveal-delay, 0ms);
}

.reveal        { transform: translate3d(0, 22px, 0); }
.reveal-fade   { transform: none; }
.reveal-scale  { transform: scale(0.96); }
.reveal-start  { transform: translate3d(-24px, 0, 0); }  /* از ابتدای محور (راست در RTL) */
.reveal-end    { transform: translate3d(24px, 0, 0); }

.reveal.is-visible,
.reveal-fade.is-visible,
.reveal-scale.is-visible,
.reveal-start.is-visible,
.reveal-end.is-visible {
  opacity: 1;
  transform: none;
}

/* will-change فقط تا پایان انیمیشن نگه داشته می‌شود؛ ماندگارکردن آن روی
   ده‌ها عنصر، حافظه‌ی گرافیکی را بی‌دلیل اشغال می‌کند. */
.reveal:not(.is-visible),
.reveal-fade:not(.is-visible),
.reveal-scale:not(.is-visible),
.reveal-start:not(.is-visible),
.reveal-end:not(.is-visible) { will-change: opacity, transform; }

.is-revealed { will-change: auto; }

/* ظاهر شدن نرم تصاویر پس از بارگذاری */
.img-fade {
  opacity: 0;
  transition: opacity var(--dur-slow) var(--ease);
}
.img-fade.is-loaded { opacity: 1; }

/* تأکید ملایم روی فراخوان پایانی وقتی وارد دید می‌شود */
.cta-band.is-visible { animation: cta-lift 900ms var(--ease); }
@keyframes cta-lift {
  0%   { box-shadow: var(--sh-md); }
  55%  { box-shadow: 0 26px 60px rgba(106, 73, 242, 0.34); }
  100% { box-shadow: var(--sh-lg); }
}

/* اگر جاوااسکریپت اجرا نشد، محتوا باید دیده شود */
.no-js .reveal,
.no-js .reveal-fade,
.no-js .reveal-scale,
.no-js .reveal-start,
.no-js .reveal-end { opacity: 1; transform: none; }
.no-js .img-fade { opacity: 1; }

/* ---------- 20. Forms --------------------------------------------------- */

.field { display: flex; flex-direction: column; gap: var(--s-2); margin-block-end: var(--s-4); }
.field label { font-size: var(--fs-sm); font-weight: 700; color: var(--text); }
.input, .cl input[type='text'], .cl input[type='tel'], .cl input[type='email'],
.cl input[type='password'], .cl input[type='number'], .cl select, .cl textarea {
  width: 100%;
  padding: 0.75rem 1rem;
  border: 1px solid var(--border-strong);
  border-radius: var(--r-md);
  background: var(--surface);
  color: var(--text);
  font-family: inherit;
  font-size: var(--fs-base);
  transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.input:focus, .cl input:focus, .cl select:focus, .cl textarea:focus {
  outline: none;
  border-color: var(--brand);
  box-shadow: 0 0 0 4px var(--brand-soft);
}
.field-hint { font-size: var(--fs-xs); color: var(--text-subtle); }
.field-error { font-size: var(--fs-xs); color: var(--c-danger-500); }

/* ---------- 21. Utilities ----------------------------------------------- */

.text-center { text-align: center; }
.text-start  { text-align: start; }
.text-muted  { color: var(--text-muted); }
.text-subtle { color: var(--text-subtle); }
.fw-bold     { font-weight: 700; }
.fs-sm { font-size: var(--fs-sm); }
.fs-md { font-size: var(--fs-md); }
.mb-0 { margin-block-end: 0; }
.mt-4 { margin-block-start: var(--s-4); }
.mt-5 { margin-block-start: var(--s-5); }
.mt-6 { margin-block-start: var(--s-6); }
.mt-7 { margin-block-start: var(--s-7); }
.mx-auto { margin-inline: auto; }
.w-full { width: 100%; }
.hide { display: none !important; }

/* آیکون‌های درون‌خطی */
.ic { display: inline-block; vertical-align: -0.15em; flex-shrink: 0; }
.ic-brand { color: var(--brand); }
.ic-accent { color: var(--c-accent-500); }

/* جابه‌جایی ستون‌ها برای چیدمان یک‌درمیان.
   در موبایل باید متن همیشه بالای تصویر بماند، پس ترتیب بازنشانی می‌شود. */
.order-last { order: 2; }
@media (max-width: 980px) { .order-last { order: 0; } }

@media (max-width: 640px) { .hide-sm { display: none !important; } }
@media (min-width: 641px) { .only-sm { display: none !important; } }

/* ---------- 22. Modal shell ---------------------------------------------
   پوسته‌ی مشترک همه‌ی مودال‌های سایت.

   ⚠️ این قاعده‌ها تا امروز *دو بار* نوشته شده بودند: یک نسخه داخل
   `partials/_checkout_modal.html` و یک نسخه‌ی کلمه‌به‌کلمه داخل
   `profile.html`. چون آن partial از `base.html` و *پس از* `extra_head`
   رندر می‌شد، نسخه‌اش همیشه برنده بود - یعنی هر تلاشی برای تغییر ظاهرِ مودال
   از خودِ صفحه بی‌صدا بی‌اثر می‌ماند (مثلاً `max-width` مودال ارتقا در صفحه‌ی
   پروفایل روی ۴۳۰ پیکسل قفل شده بود).

   حالا تعریف یک جاست و در `<head>` بارگذاری می‌شود، پس هر صفحه‌ای می‌تواند
   با قاعده‌ی خودش رویش بنویسد.                                            */

.cl-modal {
  position: fixed;
  inset: 0;
  z-index: 1500;
  display: grid;
  place-items: center;
  padding: var(--s-4);
}

.cl-modal[hidden] { display: none; }

.cl-modal-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(20, 18, 31, 0.6);
  backdrop-filter: blur(4px);
}

.cl-modal-panel {
  position: relative;
  width: 100%;
  max-width: 430px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  padding: var(--s-6);
  box-shadow: var(--sh-lg);
  max-height: calc(100dvh - 2rem);
  overflow-y: auto;
}

.cl-modal-close {
  position: absolute;
  inset-block-start: var(--s-4);
  inset-inline-end: var(--s-4);
  width: 36px;
  height: 36px;
  display: grid;
  place-items: center;
  border: 0;
  border-radius: var(--r-full);
  background: var(--surface-2);
  color: var(--text-muted);
  cursor: pointer;
}

.cl-modal-close:hover { color: var(--text); }

/* ---------- 23. Changelog timeline --------------------------------------
   خط‌زمانی صفحه‌ی «تغییرات و بروزرسانی‌ها».
   - موبایل: تک‌ستونی، ستون فقرات نزدیک لبه‌ی ابتدای محور.
   - دسکتاپ: کارت‌های یک‌درمیان دو طرف یک خط مرکزی.
   همه‌جا از ویژگی‌های منطقی (inline-start/end) استفاده شده تا در RTL بدون
   هیچ وارونه‌سازی دستی درست بنشیند.
   ------------------------------------------------------------------------ */

.timeline {
  position: relative;
  margin-block-start: var(--s-6);
}

/* ستون فقرات. با ماسک محو در دو انتها تا خط ناگهانی قطع نشود. */
.timeline::before {
  content: '';
  position: absolute;
  inset-block: 0;
  inset-inline-start: 21px;
  width: 2px;
  background: linear-gradient(
    to bottom,
    transparent,
    var(--border-strong) 6%,
    var(--border-strong) 94%,
    transparent
  );
}

/* ---- تیتر سال ---- */

.tl-year {
  position: relative;
  display: flex;
  justify-content: flex-start;
  padding-inline-start: 60px;
  margin-block: var(--s-6) var(--s-5);
}

.tl-year span {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  padding: 0.35rem 1.1rem;
  border-radius: var(--r-full);
  background: var(--surface);
  border: 1px solid var(--border);
  box-shadow: var(--sh-sm);
  font-size: var(--fs-sm);
  font-weight: 700;
  color: var(--text-muted);
  letter-spacing: 0.02em;
}

/* ---- آیتم ---- */

.tl-item {
  position: relative;
  padding-inline-start: 60px;
  margin-block-end: var(--s-5);

  /* پیش‌فرض رنگ گره؛ با data-tone بازنویسی می‌شود */
  --tl: var(--brand);
  --tl-soft: var(--brand-soft);
}

.tl-item:last-child { margin-block-end: 0; }

/* پالت گره‌ها به‌صورت توکن تعریف می‌شود، نه مستقیم روی کلاس. بنابراین برای
   تم تیره فقط همین توکن‌ها بازتعریف می‌شوند و نگاشت «دسته → رنگ» یک‌بار
   نوشته می‌ماند. هر دو مسیر تم پوشش داده شده‌اند: انتخاب دستی کاربر
   (data-theme) و ترجیح سیستم‌عامل (prefers-color-scheme). */
/* رنگ‌های روشن عمداً تیره‌تر از رنگ خام برند انتخاب شده‌اند: همین رنگ روی
   تراشه‌ی دسته به‌عنوان متن ۱۲ پیکسلی هم می‌نشیند و باید روی پس‌زمینه‌ی کم‌رنگ
   خودش دست‌کم نسبت کنتراست ۴.۵ را بدهد (معیار AA برای متن عادی). */
:root {
  --tone-brand:   #5734D8;  --tone-brand-soft:   #EDE9FE;
  --tone-violet:  #5B2FC4;  --tone-violet-soft:  #EDE7FE;
  --tone-sky:     #0A6491;  --tone-sky-soft:     #DCEFFA;
  --tone-teal:    #076358;  --tone-teal-soft:    #D3F0EC;
  --tone-accent:  #8F5000;  --tone-accent-soft:  #FFF2DE;
  --tone-success: #0B6B37;  --tone-success-soft: #DCF5E7;
  --tone-rose:    #B02138;  --tone-rose-soft:    #FBE1E5;
}

/* در تم تیره پس‌زمینه‌های روشن خیره‌کننده می‌شوند: نسخه‌ی کم‌نور جایگزین
   می‌شود و خود رنگ روشن‌تر می‌رود تا کنتراست متن روی آن حفظ شود. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme='light']) {
    --tone-brand:   #9B84F6;  --tone-brand-soft:   #251A4D;
    --tone-violet:  #A98BF8;  --tone-violet-soft:  #2A1F52;
    --tone-sky:     #5EB8E8;  --tone-sky-soft:     #10293A;
    --tone-teal:    #4FC7B8;  --tone-teal-soft:    #0D2E2A;
    --tone-accent:  #FFB245;  --tone-accent-soft:  #3A2A0E;
    --tone-success: #5BD98D;  --tone-success-soft: #10331F;
    --tone-rose:    #F2809A;  --tone-rose-soft:    #3A1620;
  }
}

:root[data-theme='dark'] {
  --tone-brand:   #9B84F6;  --tone-brand-soft:   #251A4D;
  --tone-violet:  #A98BF8;  --tone-violet-soft:  #2A1F52;
  --tone-sky:     #5EB8E8;  --tone-sky-soft:     #10293A;
  --tone-teal:    #4FC7B8;  --tone-teal-soft:    #0D2E2A;
  --tone-accent:  #FFB245;  --tone-accent-soft:  #3A2A0E;
  --tone-success: #5BD98D;  --tone-success-soft: #10331F;
  --tone-rose:    #F2809A;  --tone-rose-soft:    #3A1620;
}

.tl-item[data-tone='brand']   { --tl: var(--tone-brand);   --tl-soft: var(--tone-brand-soft); }
.tl-item[data-tone='violet']  { --tl: var(--tone-violet);  --tl-soft: var(--tone-violet-soft); }
.tl-item[data-tone='sky']     { --tl: var(--tone-sky);     --tl-soft: var(--tone-sky-soft); }
.tl-item[data-tone='teal']    { --tl: var(--tone-teal);    --tl-soft: var(--tone-teal-soft); }
.tl-item[data-tone='accent']  { --tl: var(--tone-accent);  --tl-soft: var(--tone-accent-soft); }
.tl-item[data-tone='success'] { --tl: var(--tone-success); --tl-soft: var(--tone-success-soft); }
.tl-item[data-tone='rose']    { --tl: var(--tone-rose);    --tl-soft: var(--tone-rose-soft); }

/* ---- گره ---- */

.tl-node {
  position: absolute;
  inset-inline-start: 0;
  top: 6px;
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--r-full);
  background: var(--tl-soft);
  color: var(--tl);
  border: 2px solid var(--surface);
  /* حلقه‌ی بیرونی گره را از ستون فقرات جدا می‌کند */
  box-shadow: 0 0 0 1px var(--border), var(--sh-sm);
  transition: transform var(--dur) var(--ease),
              box-shadow var(--dur) var(--ease);
  z-index: 1;
}

/* ---- کارت ---- */

.tl-card {
  position: relative;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: var(--s-5);
  box-shadow: var(--sh-sm), var(--edge-light);
  transition: transform var(--dur) var(--ease),
              box-shadow var(--dur) var(--ease),
              border-color var(--dur) var(--ease);
}

/* نوار رنگی نازک لبه‌ی ابتدای کارت - امضای دسته بدون شلوغی بصری */
.tl-card::before {
  content: '';
  position: absolute;
  inset-block: var(--s-5);
  inset-inline-start: 0;
  width: 0px;
  border-radius: var(--r-full);
  background: var(--tl);
  opacity: 0;
  transition: opacity var(--dur) var(--ease), inset-block var(--dur) var(--ease);
}

.tl-item:hover .tl-card {
  transform: translateY(-3px);
  box-shadow: var(--sh-lg), var(--edge-light);
  border-color: var(--tl);
}

.tl-item:hover .tl-card::before { opacity: 1; inset-block: var(--s-4); }

.tl-item:hover .tl-node {
  transform: scale(1.08);
  box-shadow: 0 0 0 4px var(--tl-soft), var(--sh-sm);
}

/* ---- محتوای کارت ---- */

.tl-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-2) var(--s-3);
  margin-block-end: var(--s-3);
}

.tl-date {
  display: inline-flex;
  align-items: center;
  gap: var(--s-1);
  font-size: var(--fs-sm);
  font-weight: 700;
  color: var(--text);
  font-variant-numeric: tabular-nums;
}

.tl-cat {
  display: inline-flex;
  align-items: center;
  gap: var(--s-1);
  padding: 0.2rem 0.65rem;
  border-radius: var(--r-full);
  background: var(--tl-soft);
  color: var(--tl);
  font-size: var(--fs-xs);
  font-weight: 700;
}

.tl-title {
  font-size: var(--fs-lg);
  line-height: var(--lh-tight);
  margin-block: 0 var(--s-3);
}

.tl-desc {
  font-size: var(--fs-sm);
  line-height: var(--lh-base);
  color: var(--text-muted);
  margin-block-end: 0;
}

/* ---- چیدمان دسکتاپ: یک‌درمیان دو طرف خط مرکزی ---- */

@media (min-width: 981px) {
  .timeline::before {
    inset-inline-start: calc(50% - 1px);
  }

  .tl-year {
    justify-content: center;
    padding-inline-start: 0;
    margin-block: var(--s-7) var(--s-6);
  }

  .tl-item {
    width: 50%;
    padding-inline-start: 0;
    margin-block-end: var(--s-6);
  }

  /* سمت ابتدای محور (در RTL: راست) */
  .tl-item--start { padding-inline-end: 44px; }
  .tl-item--start .tl-node { inset-inline-start: auto; inset-inline-end: -22px; }

  /* سمت انتهای محور (در RTL: چپ) */
  .tl-item--end {
    margin-inline-start: 50%;
    padding-inline-start: 44px;
  }
  .tl-item--end .tl-node { inset-inline-start: -22px; }

  /* نوار رنگی همیشه سمت خط مرکزی بماند تا زیگزاگ خوانا شود */
  .tl-item--start .tl-card::before { inset-inline-start: auto; inset-inline-end: 0; }
}

/* ---- خلاصه‌ی بالای صفحه ---- */

.tl-summary {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--s-3);
  margin-block-start: var(--s-5);
}

.tl-summary span {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  padding: 0.45rem 1rem;
  border-radius: var(--r-full);
  background: var(--surface);
  border: 1px solid var(--border);
  box-shadow: var(--sh-sm);
  font-size: var(--fs-sm);
  color: var(--text-muted);
}

.tl-summary b { color: var(--text); font-variant-numeric: tabular-nums; }

/* ---- انتهای فهرست: بارگذاری بیشتر / پایان ----
   هر سه حالت (در حال بارگذاری، پایان فهرست، تلاش دوباره) در یک نگهدارنده با
   ارتفاع کمینه‌ی ثابت می‌نشینند تا جابه‌جا شدنشان صفحه را بالا و پایین نپراند.
   خود نگهدارنده هم مثل بقیه‌ی خط‌زمانی روی محور منطقی است، پس در RTL بدون
   وارونه‌سازی درست می‌نشیند. */

.tl-more {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 64px;
  margin-block-start: var(--s-6);
  text-align: center;
}

/* سه حالت این ناحیه با صفت hidden جابه‌جا می‌شوند و هر سه display دارند؛
   قاعده‌ی پیش‌فرض مرورگر برای [hidden] از آن‌ها ضعیف‌تر است و بدون این خط،
   پنهان‌کردن اثری نمی‌کند. */
.tl-more [hidden] { display: none; }

.tl-loading,
.tl-end {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  margin: 0;
  font-size: var(--fs-sm);
  color: var(--text-muted);
}

.tl-end {
  padding: 0.45rem 1rem;
  border-radius: var(--r-full);
  background: var(--surface);
  border: 1px solid var(--border);
  box-shadow: var(--sh-sm);
}

.tl-end .ic { color: var(--tone-success); }

.tl-spinner {
  width: 18px;
  height: 18px;
  flex: none;
  border-radius: var(--r-full);
  border: 2px solid var(--border-strong);
  border-inline-start-color: var(--brand);
  animation: tl-spin 700ms linear infinite;
}

@keyframes tl-spin {
  to { transform: rotate(360deg); }
}

@media (prefers-reduced-motion: reduce) {
  .tl-spinner { animation: none; opacity: 0.6; }
}

/* ---------- 24. Legal / policy document ---------------------------------
   صفحه‌ی «حریم خصوصی و شرایط استفاده». برخلاف صفحات بازاریابی، اینجا متن
   خوانده می‌شود نه اسکن؛ پس ستون متن باریک نگه داشته می‌شود و فهرست بخش‌ها
   در دسکتاپ کنار آن می‌چسبد.
------------------------------------------------------------------------- */

/* داخل `.section-head` قرار می‌گیرد و باید از قاعده‌ی `.section-head p`
   (اندازه‌ی بند مقدمه) سنگین‌تر باشد؛ وگرنه این نشان به‌اندازه‌ی متن lede
   رندر می‌شود. */
.cl .policy-updated {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  margin-block: var(--s-5) 0;
  padding: var(--s-2) var(--s-4);
  border: 1px solid var(--border);
  border-radius: var(--r-full);
  background: var(--surface);
  font-size: var(--fs-sm);
  line-height: var(--lh-snug);
  color: var(--text-muted);
}
.policy-updated .ic { color: var(--brand); }
.policy-updated time { font-variant-numeric: tabular-nums; color: var(--text); font-weight: 700; }

/* فهرست اول می‌آید تا در موبایل (تک‌ستونه) بالای متن بنشیند و خواننده پیش از
   شروع بداند صفحه چند بخش دارد. در دسکتاپ با ترتیب گرید کنار متن می‌رود. */
/* عرض کل بلوک محدود می‌شود، نه فقط ستون متن. اگر سقف عرض را روی خودِ متن
   بگذاریم، ستون متن به فهرست می‌چسبد و یک نوار خالی بزرگ در سمت دیگر
   می‌ماند؛ این‌طوری هر دو ستون با هم وسط‌چین می‌شوند. */
.policy-layout {
  display: grid;
  grid-template-columns: 260px minmax(0, 1fr);
  gap: var(--s-6);
  align-items: start;
  max-width: 940px;
  margin-inline: auto;
}
@media (max-width: 980px) {
  .policy-layout { grid-template-columns: 1fr; gap: var(--s-5); }
}

.policy-toc {
  position: sticky;
  /* ارتفاع هدر چسبان + کمی فاصله، تا تیتر زیر نوار بالا نرود */
  inset-block-start: calc(var(--header-h) + var(--s-4));
  padding: var(--s-5);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-xs);
}
@media (max-width: 980px) {
  .policy-toc { position: static; }
}
/* با سلکتور تک‌کلاسی، قاعده‌ی `.cl h2` برنده می‌شد و تیتر فهرست به اندازه‌ی
   تیتر اصلی صفحه رندر می‌شد. نام ظرف اضافه شده تا وزن سلکتور کافی باشد. */
.policy-toc .policy-toc-title {
  font-size: var(--fs-xs);
  letter-spacing: 0.06em;
  font-weight: 700;
  margin-block-end: var(--s-4);
  color: var(--text);
}
.policy-toc ol { counter-reset: policy-toc; }
.policy-toc li { counter-increment: policy-toc; margin-block-end: var(--s-2); }
.policy-toc li:last-child { margin-block-end: 0; }
.policy-toc a {
  display: flex;
  gap: var(--s-2);
  font-size: var(--fs-sm);
  color: var(--text-muted);
  line-height: var(--lh-snug);
}
.policy-toc a::before {
  content: counter(policy-toc, persian) '.';
  color: var(--text-subtle);
  font-variant-numeric: tabular-nums;
  flex: none;
}
.policy-toc a:hover { color: var(--brand); }
.policy-toc a:hover::before { color: var(--brand); }

.policy-section {
  padding: var(--s-6);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-xs);
}
.policy-section + .policy-section { margin-block-start: var(--s-5); }
@media (max-width: 560px) {
  .policy-section { padding: var(--s-5) var(--s-4); }
}

.policy-section h2 {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  font-size: var(--fs-lg);
  margin-block-end: var(--s-4);
}
.policy-section-icon {
  width: 40px;
  height: 40px;
  margin: 0;
  flex: none;
}

/* بند نخست هر بخش پررنگ‌تر از بدنه است تا خواننده‌ای که فقط صفحه را مرور
   می‌کند، جان کلام هر بخش را بگیرد. `.cl` برای غلبه بر رنگ پیش‌فرض `.cl p`. */
.cl .policy-lead { font-size: var(--fs-md); color: var(--text); }
.policy-section p:last-child { margin-block-end: 0; }

.policy-points { margin-block: var(--s-4); }
.policy-points li {
  display: flex;
  gap: var(--s-3);
  margin-block-end: var(--s-3);
  color: var(--text-muted);
  line-height: var(--lh-base);
}
.policy-points li:last-child { margin-block-end: 0; }
.policy-points .ic { flex: none; margin-block-start: 0.45em; color: var(--c-success-500); }

/* جعبه‌ی تأکید: همان چیزی که در متن حقوقی معمولاً پررنگ می‌شود، اینجا با یک
   نوار رنگی در ابتدای بلوک از بدنه جدا می‌شود - نه با حروف بزرگ‌تر. */
.policy-note {
  display: flex;
  gap: var(--s-3);
  margin-block-start: var(--s-5);
  padding: var(--s-4);
  background: var(--surface-2);
  border-radius: var(--r-md);
  border-inline-start: 3px solid var(--brand);
}
.policy-note p { font-size: var(--fs-sm); color: var(--text-muted); }
.policy-note-icon { color: var(--brand); flex: none; line-height: 1; }

.policy-contact {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));
  gap: var(--s-4);
  margin-block: var(--s-5) var(--s-4);
}
.policy-contact li {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  padding: var(--s-4);
  background: var(--surface-2);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
}
.policy-contact .icon-tile { width: 40px; height: 40px; margin: 0; flex: none; }
.policy-contact b { display: block; font-size: var(--fs-xs); color: var(--text-muted); font-weight: 400; }
.policy-contact a { font-weight: 700; word-break: break-word; }

/* ---------- 25. Discount field ------------------------------------------
   بخش کد تخفیف در مسیرهای پرداخت.

   عمداً «فرمِ اضافه‌شده» به نظر نمی‌رسد: همان توکن‌های سطح، حاشیه و شعاعِ
   بقیه‌ی صفحه را می‌گیرد و تا وقتی مشتری کلیدش را نزده، فقط یک خطِ آرام است.
   کسی که کد ندارد نباید حس کند چیزی را از دست می‌دهد.

   یک تعریف برای همه‌ی مسیرها (صفحه‌ی تأیید خرید و مودال ارتقا)، چون همان
   اشتباهِ قدیمیِ «پوسته‌ی مودال در دو فایل» اینجا هم قابل تکرار بود.
   ------------------------------------------------------------------------ */

.discount {
  margin-block: var(--s-5);
  padding-block-start: var(--s-4);
  border-block-start: 1px solid var(--border);
}

.discount-toggle {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  font-size: var(--fs-sm);
  font-weight: 700;
  color: var(--text);
  cursor: pointer;
  user-select: none;
}
.discount-toggle input {
  /* چک‌باکس از قاعده‌ی عمومیِ `width: 100%` ورودی‌ها مستثناست. */
  width: 1.05rem;
  height: 1.05rem;
  margin: 0;
  flex: none;
  accent-color: var(--brand);
  cursor: pointer;
}
.discount-toggle span { display: inline-flex; align-items: center; gap: var(--s-2); }

.discount-panel { margin-block-start: var(--s-4); }
.discount-panel[hidden] { display: none; }

/* ورودی و دکمه کنار هم. در RTL، `flex` جهت را از خودِ سند می‌گیرد و نیازی
   به وارونه‌کردن دستی نیست. */
.discount-row {
  display: flex;
  gap: var(--s-3);
  align-items: stretch;
  flex-wrap: wrap;
}
.discount-row input[type='text'] {
  /* قاعده‌ی عمومیِ ورودی‌ها `width: 100%` است؛ داخل یک flex آن مقدار پایه‌ی
     انعطاف را تمام‌عرض می‌کند و دکمه را به سطر بعد می‌اندازد. */
  width: auto;
  flex: 1 1 11rem;
  min-width: 0;
}
.discount-row .btn { flex: 0 0 auto; white-space: nowrap; }

@media (max-width: 420px) {
  .discount-row .btn { flex: 1 1 100%; }
}

.discount-status {
  margin-block: var(--s-3) 0;
  font-size: var(--fs-sm);
  line-height: 1.7;
}
.discount-status[hidden] { display: none; }
.discount-status.is-ok { color: var(--c-success-500); }
.discount-status.is-error { color: var(--c-danger-500); }

.discount-total {
  margin-block: var(--s-3) 0;
  padding: var(--s-3) var(--s-4);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  background: var(--surface-2);
  font-size: var(--fs-sm);
  color: var(--text-muted);
  line-height: 1.9;
}
.discount-total[hidden] { display: none; }
.discount-total b { color: var(--text); }

/* ---------- 26. Motion preferences -------------------------------------- */

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    transition-delay: 0ms !important;
    scroll-behavior: auto !important;
  }
  /* محتوا بدون هیچ حرکتی بلافاصله دیده می‌شود */
  .reveal, .reveal-fade, .reveal-scale, .reveal-start, .reveal-end,
  .img-fade {
    opacity: 1 !important;
    transform: none !important;
  }
  .float-card { animation: none !important; }
  .cta-band.is-visible { animation: none !important; }
  /* روی خط‌زمانی، بازخورد هاور به رنگ و سایه محدود می‌شود و جابه‌جایی حذف. */
  .tl-item:hover .tl-card,
  .tl-item:hover .tl-node { transform: none !important; }
}

/* ---------- 27. Print --------------------------------------------------- */

@media print {
  .site-header, .site-footer, .cta-band, .theme-toggle, .nav-toggle { display: none !important; }
  body.cl { background: #fff; color: #000; }
  .card, .plan { box-shadow: none; border-color: #ccc; }
  /* روی کاغذ، فهرست لنگرهای صفحه‌ی سیاست‌ها به کار نمی‌آید و متن باید تمام
     عرض را بگیرد. */
  .policy-toc { display: none !important; }
  .policy-layout { display: block !important; max-width: none; }
  .policy-section { box-shadow: none; border-color: #ccc; break-inside: avoid; }
}
