/* فونت پیدا — یک‌جا، همین‌جا (خواستهٔ کاربر ۲۰۲۶-۰۹-۰۶: «در تمام سایت از
   فونت پیدا استفاده کن»). قبلا این @font-face در چند فایل جدا تکرار شده بود
   (includes/header.php، admin/layout-top.php) و هر صفحه‌ای که از آن دو
   include عبور نمی‌کرد ولی style.css را مستقیم بار می‌کرد (مثلا
   admin/login.php) اصلا فونت را نمی‌دید — با Tahoma رندر می‌شد، هرچند
   body پایین‌تر درست Peyda می‌خواست. حالا چون همه‌جا همین یک فایل مشترک
   بارگذاری می‌شود، @font-face هم فقط همین‌جا کافی است. */
@font-face {
    font-family: Peyda;
    src: url('https://cdn.mxit.ir/fonts/Peyda/Peyda.woff2') format('woff2'),
         url('https://cdn.mxit.ir/fonts/Peyda/Peyda.woff') format('woff');
    font-display: swap;
}

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

:root {
    --bg-primary: #111827;
    --bg-secondary: #1F2937;
    --bg-card: #1F2937;
    --bg-input: #374151;
    --red-primary: #DC2626;
    --red-hover: #B91C1C;
    --red-light: #EF4444;
    /* رنگ دوم تم (خواستهٔ کاربر: «از ترکیب یک یا چند رنگ بتونم استفاده
       کنم») — پیش‌فرض همان تن هاور قرمز است، یعنی تم پیش‌فرض تک‌رنگ به‌نظر
       می‌رسد، دقیقا مثل الان؛ فقط تم‌های تازه‌تر پایین همین فایل مقدار
       واقعا متفاوتی برایش می‌گذارند. مصرفش عمدا کم و تزیینی نگه داشته شده
       (خط بالای فوتر، حاشیهٔ لوگوی سایدبار ادمین) نه روی دکمه‌ها، چون آن‌ها
       باید رنگ اصلی/برند تم بمانند. */
    --accent-secondary: var(--red-hover);
    /* خواستهٔ کاربر ۲۰۲۶-۰۹-۰۷: «برندها که همه سفیدن، در تم‌های روشن اصلا
       دیده نمی‌شوند» — .mm-brand-icon/.pby-brand-logo لوگوی برند را با
       filter یکدست «سفید» می‌کردند (برای دیده‌شدن روی زمینهٔ تیرهٔ تم
       پیش‌فرض)، ولی این رنگ‌سازی هاردکد بود، نه وابسته به تم؛ روی زمینهٔ
       روشن تم‌های تازه، لوگوی سفید روی زمینهٔ سفید محو می‌شد. راه‌حل کلی و
       آیندهٔ‌نگر: خود «رنگ سیلوئت لوگو» هم یک توکن شد — پیش‌فرض سفید
       (رفتار قبلی)، فقط تم‌های روشن پایین‌تر همین فایل به سیاه برش
       می‌گردانند؛ خود .mm-brand-icon/.pby-brand-logo دیگر رنگ ثابتی
       ندارند، فقط var(--logo-filter) را می‌خوانند. هر تم روشن تازه‌ای هم
       در آینده کافی است همین یک متغیر را در بلوک خودش ست کند. */
    --logo-filter: brightness(0) invert(1);
    --text-primary: #F9FAFB;
    --text-secondary: #D1D5DB;
    --text-muted: #9CA3AF;
    --border-color: #374151;
    --border-light: #4B5563;
    --green: #10B981;
    --green-dark: #059669;
    /* رنگ اختصاصی «قیمت کلی/عمده» (خواستهٔ کاربر ۲۰۲۶-۰۹-۲۳: «رنگ کادرهای
       قیمت رو بهتر کن، خودت یک رنگ و طرح عالی برای هر تمی بذار») — قبلا
       کادر عمده/wholesale همه‌جا رنگ سبز هاردکد rgba(16,185,129,...) داشت،
       کاملا مستقل از تم فعال؛ کادر جزئی/retail هم پس‌زمینه‌اش هاردکد قرمز
       پیش‌فرض بود (فقط متنش var(--red-light) بود). عمدا از var(--green)
       موجود جدا شد، نه هم‌نامش: --green رنگ معنایی «موفقیت» است (وضعیت
       سفارش، پرداخت، موجودی...) و طبق تصمیم قبلی این پروژه عمدا مستقل از
       تم می‌ماند (نگاه کنید به توضیح تم‌های رنگی پایین‌تر)؛ اگر همان توکن
       را برای قیمت هم عوض می‌کردیم، رنگ همهٔ وضعیت‌های موفقیت سایت هم
       ناخواسته تغییر می‌کرد. کادر جزئی/retail نیازی به توکن تازه نداشت،
       چون همین حالا هم var(--red-primary)/var(--red-light) دارد و فقط
       پس‌زمینه/حاشیه‌اش هاردکد بود؛ همان‌ها هم در ادامهٔ همین فایل به
       color-mix() با این متغیرها تبدیل شدند. */
    --price-wholesale: #10B981;
    --shadow: 0 4px 6px -1px rgba(0,0,0,0.3);
    --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.4);
    --radius: 8px;
    --radius-sm: 4px;
    --radius-lg: 12px;
    --transition: 0.2s ease;
}

/* ===================== تم رنگی سایت / پنل مدیریت =====================
   خواستهٔ کاربر ۲۰۲۶-۰۹-۰۷: «یک گزینه در مدیریت برای تم سایت ... چند تا
   تم رنگی کلی ... خیلی هوشمندانه ... دو دسته‌بندی: سمت سایت اصلی و سمت
   مدیریت». هر تم فقط توکن‌های بالا را دوباره تعریف می‌کند — هیچ selector
   دیگری در کل فایل لازم نیست تغییر کند چون همه‌جا (>۹۰۰ مورد) از همین
   var(--...)ها استفاده شده. دو ویژگی مستقل روی <html>:
   data-site-theme (صفحات مشتری: includes/header.php + صفحات پرداخت) و
   data-admin-theme (صفحات ادمین) — با هم تداخلی ندارند، هرکدام مستقل از
   admin/settings.php?sec=theme انتخاب می‌شود. کلیدها/برچسب‌ها/سه‌رنگ
   پیش‌نمایش هرکدام در includes/functions.php → siteThemeCatalog() است؛
   اگر تمی اینجا اضافه/کم شد باید همان‌جا هم هم‌گام بماند. رنگ‌های معنایی
   (سبز موفقیت #10B981/#059669 در :root بالا، زرد «در انتظار»، رنگ‌های
   برند شبکه‌های اجتماعی، کارت‌های رنگی داشبورد ادمین) عمدا خارج از این
   سیستم مانده‌اند و با تغییر تم عوض نمی‌شوند.
   نکتهٔ شناخته‌شده: چند کادر وضعیت «رد شده» (مثل .pchk-panel.is-no) هم از
   همان var(--red-primary) به‌عنوان رنگ خطا استفاده می‌کنند — چون در تم
   پیش‌فرض رنگ اصلی/برند و رنگ خطا هردو تصادفا قرمزند. با تم‌های تازه (مثلا
   نارنجی/آبی) آن کادرها هم رنگ برند تم را می‌گیرند، نه لزوما قرمز هشدار؛
   جدا کردن کامل «رنگ برند» از «رنگ خطا» در کل کدبیس، بازطراحی جداگانه‌ای
   می‌خواهد و عمدا در این فاز انجام نشد. */
html[data-site-theme="blue-white-orange"],
html[data-admin-theme="blue-white-orange"] {
    --bg-primary: #F8FAFC;
    --bg-secondary: #FFFFFF;
    --bg-card: #FFFFFF;
    --bg-input: #F1F5F9;
    --red-primary: #EA580C;
    --red-hover: #C2410C;
    --red-light: #FB923C;
    --accent-secondary: #2563EB;
    --price-wholesale: #2563EB;
    --text-primary: #0F172A;
    --text-secondary: #334155;
    --text-muted: #64748B;
    --border-color: #E2E8F0;
    --border-light: #CBD5E1;
    --shadow: 0 4px 6px -1px rgba(15,23,42,0.08);
    --shadow-lg: 0 10px 15px -3px rgba(15,23,42,0.12);
    --logo-filter: brightness(0);
}
html[data-site-theme="white-gold"],
html[data-admin-theme="white-gold"] {
    --bg-primary: #FFFBEB;
    --bg-secondary: #FFFFFF;
    --bg-card: #FFFFFF;
    --bg-input: #FEF3C7;
    --red-primary: #B45309;
    --red-hover: #92400E;
    --red-light: #D97706;
    --accent-secondary: #78350F;
    --price-wholesale: #0F766E;
    --text-primary: #1C1917;
    --text-secondary: #44403C;
    --text-muted: #78716C;
    --border-color: #F3E1B0;
    --border-light: #E7C989;
    --shadow: 0 4px 6px -1px rgba(28,25,23,0.08);
    --shadow-lg: 0 10px 15px -3px rgba(28,25,23,0.12);
    --logo-filter: brightness(0);
}
html[data-site-theme="navy-blue"],
html[data-admin-theme="navy-blue"] {
    --bg-primary: #0B1220;
    --bg-secondary: #111C33;
    --bg-card: #111C33;
    --bg-input: #1E293B;
    --red-primary: #2563EB;
    --red-hover: #1D4ED8;
    --red-light: #60A5FA;
    --accent-secondary: #38BDF8;
    --price-wholesale: #D97706;
    --text-primary: #F1F5F9;
    --text-secondary: #CBD5E1;
    --text-muted: #94A3B8;
    --border-color: #1E293B;
    --border-light: #334155;
}
html[data-site-theme="charcoal-teal"],
html[data-admin-theme="charcoal-teal"] {
    --bg-primary: #0B1414;
    --bg-secondary: #10201F;
    --bg-card: #10201F;
    --bg-input: #1B2E2C;
    --red-primary: #0D9488;
    --red-hover: #0F766E;
    --red-light: #2DD4BF;
    --accent-secondary: #FBBF24;
    --price-wholesale: #FBBF24;
    --text-primary: #ECFDF5;
    --text-secondary: #CCFBF1;
    --text-muted: #94A3B8;
    --border-color: #1B2E2C;
    --border-light: #24413D;
}
html[data-site-theme="lavender-white"],
html[data-admin-theme="lavender-white"] {
    --bg-primary: #FAF5FF;
    --bg-secondary: #FFFFFF;
    --bg-card: #FFFFFF;
    --bg-input: #F3E8FF;
    --red-primary: #7C3AED;
    --red-hover: #6D28D9;
    --red-light: #A78BFA;
    --accent-secondary: #EC4899;
    --price-wholesale: #059669;
    --text-primary: #1E1B2E;
    --text-secondary: #44403C;
    --text-muted: #6B7280;
    --border-color: #E9D8FD;
    --border-light: #D8B4FE;
    --shadow: 0 4px 6px -1px rgba(30,27,46,0.08);
    --shadow-lg: 0 10px 15px -3px rgba(30,27,46,0.12);
    --logo-filter: brightness(0);
}
/* پنج تم تازه (خواستهٔ کاربر ۲۰۲۶-۰۹-۰۷: «چند تا تم دیگه هم اضافه کن با
   رنگ‌بندی حرفه‌ای و عالی») — کلید هرکدام باید دقیقا با siteThemeCatalog()
   در includes/functions.php یکی بماند. */
html[data-site-theme="forest-cream"],
html[data-admin-theme="forest-cream"] {
    --bg-primary: #FAFAF5;
    --bg-secondary: #FFFFFF;
    --bg-card: #FFFFFF;
    --bg-input: #F1F0E4;
    --red-primary: #15803D;
    --red-hover: #166534;
    --red-light: #22C55E;
    --accent-secondary: #A16207;
    --price-wholesale: #A16207;
    --text-primary: #1C1917;
    --text-secondary: #44403C;
    --text-muted: #78716C;
    --border-color: #E7E5D8;
    --border-light: #D6D3C1;
    --shadow: 0 4px 6px -1px rgba(28,25,23,0.08);
    --shadow-lg: 0 10px 15px -3px rgba(28,25,23,0.12);
    --logo-filter: brightness(0);
}
html[data-site-theme="midnight-gold"],
html[data-admin-theme="midnight-gold"] {
    --bg-primary: #0A0A0A;
    --bg-secondary: #171310;
    --bg-card: #171310;
    --bg-input: #26201A;
    --red-primary: #A16207;
    --red-hover: #854D0E;
    --red-light: #EAB308;
    --accent-secondary: #7C2D12;
    --price-wholesale: #0E7490;
    --text-primary: #FAFAF9;
    --text-secondary: #D6D3D1;
    --text-muted: #A8A29E;
    --border-color: #26201A;
    --border-light: #3B322A;
}
html[data-site-theme="ocean-coral"],
html[data-admin-theme="ocean-coral"] {
    --bg-primary: #ECFEFF;
    --bg-secondary: #FFFFFF;
    --bg-card: #FFFFFF;
    --bg-input: #CFFAFE;
    --red-primary: #0891B2;
    --red-hover: #0E7490;
    --red-light: #22D3EE;
    --accent-secondary: #FB7185;
    --price-wholesale: #FB7185;
    --text-primary: #0C2A33;
    --text-secondary: #334155;
    --text-muted: #64748B;
    --border-color: #CFFAFE;
    --border-light: #A5F3FC;
    --shadow: 0 4px 6px -1px rgba(12,42,51,0.08);
    --shadow-lg: 0 10px 15px -3px rgba(12,42,51,0.12);
    --logo-filter: brightness(0);
}
html[data-site-theme="graphite-lime"],
html[data-admin-theme="graphite-lime"] {
    --bg-primary: #18181B;
    --bg-secondary: #27272A;
    --bg-card: #27272A;
    --bg-input: #3F3F46;
    --red-primary: #4D7C0F;
    --red-hover: #3F6212;
    --red-light: #A3E635;
    --accent-secondary: #06B6D4;
    --price-wholesale: #06B6D4;
    --text-primary: #FAFAFA;
    --text-secondary: #D4D4D8;
    --text-muted: #A1A1AA;
    --border-color: #3F3F46;
    --border-light: #52525B;
}
html[data-site-theme="burgundy-cream"],
html[data-admin-theme="burgundy-cream"] {
    --bg-primary: #FDF8F3;
    --bg-secondary: #FFFFFF;
    --bg-card: #FFFFFF;
    --bg-input: #F5E9DD;
    --red-primary: #9F1239;
    --red-hover: #881337;
    --red-light: #E11D48;
    --accent-secondary: #A16207;
    --price-wholesale: #A16207;
    --text-primary: #1C1917;
    --text-secondary: #44403C;
    --text-muted: #78716C;
    --border-color: #EEDFC9;
    --border-light: #E0C9A6;
    --shadow: 0 4px 6px -1px rgba(28,25,23,0.08);
    --shadow-lg: 0 10px 15px -3px rgba(28,25,23,0.12);
    --logo-filter: brightness(0);
}
/* چهار تم تازهٔ دیگر (خواستهٔ کاربر ۲۰۲۶-۰۹-۰۸: «چند تا رنگ دیگه هم برای
   تم سایت طراحی و اضافه کن، خیلی حرفه‌ای و عالی») — کلید هرکدام باید
   دقیقا با siteThemeCatalog() در includes/functions.php یکی بماند. */
html[data-site-theme="steel-copper"],
html[data-admin-theme="steel-copper"] {
    --bg-primary: #0E1620;
    --bg-secondary: #17212C;
    --bg-card: #17212C;
    --bg-input: #212D3A;
    --red-primary: #4A7FA5;
    --red-hover: #3A6684;
    --red-light: #6FA8D1;
    --accent-secondary: #C97C3D;
    --price-wholesale: #C97C3D;
    --text-primary: #EAF1F7;
    --text-secondary: #C3D2DE;
    --text-muted: #8CA0AF;
    --border-color: #212D3A;
    --border-light: #33424F;
}
html[data-site-theme="royal-plum-gold"],
html[data-admin-theme="royal-plum-gold"] {
    --bg-primary: #140F1B;
    --bg-secondary: #1E1629;
    --bg-card: #1E1629;
    --bg-input: #2B2038;
    --red-primary: #9333EA;
    --red-hover: #7E22CE;
    --red-light: #C084FC;
    --accent-secondary: #D4AF37;
    --price-wholesale: #D4AF37;
    --text-primary: #F5F3FF;
    --text-secondary: #DCD3EE;
    --text-muted: #A79FC4;
    --border-color: #2B2038;
    --border-light: #3D2E4F;
}
html[data-site-theme="rose-quartz"],
html[data-admin-theme="rose-quartz"] {
    --bg-primary: #FFF5F7;
    --bg-secondary: #FFFFFF;
    --bg-card: #FFFFFF;
    --bg-input: #FCE7EC;
    --red-primary: #BE185D;
    --red-hover: #9D174D;
    --red-light: #EC4899;
    --accent-secondary: #334155;
    --price-wholesale: #334155;
    --text-primary: #241620;
    --text-secondary: #513B46;
    --text-muted: #8A7580;
    --border-color: #F7D9E1;
    --border-light: #F0BFCC;
    --shadow: 0 4px 6px -1px rgba(36,22,32,0.08);
    --shadow-lg: 0 10px 15px -3px rgba(36,22,32,0.12);
    --logo-filter: brightness(0);
}
html[data-site-theme="sky-arctic"],
html[data-admin-theme="sky-arctic"] {
    --bg-primary: #F0F9FF;
    --bg-secondary: #FFFFFF;
    --bg-card: #FFFFFF;
    --bg-input: #E0F2FE;
    --red-primary: #0284C7;
    --red-hover: #0369A1;
    --red-light: #38BDF8;
    --accent-secondary: #F97316;
    --price-wholesale: #F97316;
    --text-primary: #0C1B2A;
    --text-secondary: #334155;
    --text-muted: #64748B;
    --border-color: #DCEEFB;
    --border-light: #BFE3FA;
    --shadow: 0 4px 6px -1px rgba(12,27,42,0.08);
    --shadow-lg: 0 10px 15px -3px rgba(12,27,42,0.12);
    --logo-filter: brightness(0);
}
/* تم تازه (خواستهٔ کاربر ۲۰۲۶-۰۹-۱۰: «یک تم ترکیبی با کد رنگ #4a54e8 و
   مشکی بساز») — red-primary دقیقا همان کد رنگ داده‌شده است؛ hover/light
   دو سایهٔ تیره‌تر/روشن‌تر مشتق‌شده از همان رنگ‌اند، نه یک رنگ متفاوت.
   پس‌زمینه مشکی خالص (نه فقط تیره، مطابق درخواست «با مشکی»)؛ چون تیره
   است نیازی به override کردن --logo-filter نیست (پیش‌فرض سفید همین‌جا
   هم درست کار می‌کند). */
html[data-site-theme="indigo-black"],
html[data-admin-theme="indigo-black"] {
    --bg-primary: #0A0A0F;
    --bg-secondary: #131320;
    --bg-card: #131320;
    --bg-input: #1C1C2E;
    --red-primary: #4A54E8;
    --red-hover: #3B43BA;
    --red-light: #777FEE;
    --accent-secondary: #D946EF;
    --price-wholesale: #22D3EE;
    --text-primary: #F1F1FA;
    --text-secondary: #C7C9E8;
    --text-muted: #8F90B5;
    --border-color: #1C1C2E;
    --border-light: #2A2A42;
}
/* چهار تم تازه (خواستهٔ کاربر ۲۰۲۶-۰۹-۱۳: «چند تا تم رنگی خیلی خاص دیگه
   اضافه کن که خیلی متفاوت و محشر باشه») — عمدا رنگ‌های خیلی اشباع/نئونی،
   نه سایه‌ای تازه از همان الگوی کدر/جواهری ۱۶ تم قبلی. */
html[data-site-theme="neon-nightclub"],
html[data-admin-theme="neon-nightclub"] {
    --bg-primary: #0A0510;
    --bg-secondary: #150A1E;
    --bg-card: #150A1E;
    --bg-input: #201230;
    --red-primary: #F72585;
    --red-hover: #C51D6A;
    --red-light: #F966AA;
    --accent-secondary: #00E5FF;
    --price-wholesale: #00E5FF;
    --text-primary: #F5F0FF;
    --text-secondary: #D8C9E8;
    --text-muted: #9A87B0;
    --border-color: #201230;
    --border-light: #302047;
}
html[data-site-theme="lava-forge"],
html[data-admin-theme="lava-forge"] {
    --bg-primary: #0D0806;
    --bg-secondary: #1A0F0A;
    --bg-card: #1A0F0A;
    --bg-input: #26150D;
    --red-primary: #FF4D00;
    --red-hover: #CC3E00;
    --red-light: #FF824D;
    --accent-secondary: #00B4D8;
    --price-wholesale: #00B4D8;
    --text-primary: #FFF3EA;
    --text-secondary: #E8C9B8;
    --text-muted: #A87F6D;
    --border-color: #26150D;
    --border-light: #3A2015;
}
html[data-site-theme="emerald-royale"],
html[data-admin-theme="emerald-royale"] {
    --bg-primary: #06120D;
    --bg-secondary: #0C2018;
    --bg-card: #0C2018;
    --bg-input: #123023;
    --red-primary: #00E6A0;
    --red-hover: #00B880;
    --red-light: #4DEDBC;
    --accent-secondary: #FFC300;
    --price-wholesale: #FFC300;
    --text-primary: #EAFBF3;
    --text-secondary: #B9E5D2;
    --text-muted: #6F9C87;
    --border-color: #123023;
    --border-light: #1C4433;
}
html[data-site-theme="aurora-borealis"],
html[data-admin-theme="aurora-borealis"] {
    --bg-primary: #05081A;
    --bg-secondary: #0A1030;
    --bg-card: #0A1030;
    --bg-input: #101848;
    --red-primary: #00D4FF;
    --red-hover: #00AACC;
    --red-light: #4DE0FF;
    --accent-secondary: #C724FF;
    --price-wholesale: #C724FF;
    --text-primary: #EAF6FF;
    --text-secondary: #C3D9F0;
    --text-muted: #7C93B8;
    --border-color: #101848;
    --border-light: #182468;
}

/* کارت‌های انتخاب تم — admin/settings.php?sec=theme، دو گروه مستقل (سایت/ادمین) */
.theme-picker {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
    gap: 0.85rem;
}
.theme-card {
    position: relative;
    display: block;
    border: 2px solid var(--border-color);
    border-radius: var(--radius);
    padding: 0.85rem 0.85rem 0.85rem 2.1rem;
    cursor: pointer;
    background: var(--bg-secondary);
    transition: border-color var(--transition);
}
.theme-card:hover { border-color: var(--border-light); }
.theme-card.is-active,
.theme-card:has(input:checked) { border-color: var(--red-primary); }
.theme-card input[type="radio"] {
    position: absolute;
    top: 0.9rem;
    inset-inline-start: 0.8rem;
    margin: 0;
}
.theme-swatch-row { display: flex; gap: 0.35rem; margin-bottom: 0.6rem; }
.theme-swatch {
    width: 26px;
    height: 26px;
    border-radius: 50%;
    border: 1px solid rgba(0,0,0,0.15);
    flex: 0 0 auto;
}
.theme-card-label { font-size: 0.85rem; font-weight: 600; color: var(--text-primary); }

body {
    font-family: Peyda, Tahoma, Arial, sans-serif;
    background: var(--bg-primary);
    color: var(--text-primary);
    direction: rtl;
    line-height: 1.6;
    min-height: 100vh;
    display: flex;
    flex-direction: column;
}

/* فرم‌ها (input/button/select/textarea) به‌طور پیش‌فرض font-family بدنه را
   ارث نمی‌برند — مرورگر فونت پیش‌فرض سیستم/رابط‌کاربری خودش را می‌گذارد،
   حتی وقتی body درست Peyda خواسته. تا امروز این یکی‌یکی، هرجا گزارش
   می‌شد، با یک font-family:inherit مجزا رفع می‌شد (مثلا دکمهٔ «همه
   برندها» — [[batch9-fixes]]) — این قاعدهٔ عمومی همان کار را یک‌جا برای
   کل سایت انجام می‌دهد، بدون نیاز به پیدا کردن مورد بعدی. */
input, button, select, textarea {
    font-family: inherit;
}

/* ===== آیکون‌های SVG درون‌خطی (تابع icon() در includes/icons.php) ===== */
.ic {
    width: 1.15em;
    height: 1.15em;
    display: inline-block;
    vertical-align: -0.18em;
    flex: 0 0 auto;
    overflow: visible;
}

.ic-sm  { width: 0.95em; height: 0.95em; }
.ic-lg  { width: 1.4em;  height: 1.4em;  }
.ic-xl  { width: 2em;    height: 2em;    }
.ic-xxl { width: 3.2em;  height: 3.2em;  }

/* رنگ‌های کمکی */
.ic-red    { color: var(--red-light); }
.ic-green  { color: var(--green); }
.ic-amber  { color: #FBBF24; }
.ic-muted  { color: var(--text-muted); }

/* برای ظرف‌هایی که flex/gap ندارند (.btn و .nav-link خودشان gap دارند) */
.ic-gap { margin-inline-end: 0.4em; }

/* آیکون جانشین تصویر (محصول بدون عکس) و آیکون حالت خالی:
   در اندازهٔ بزرگ ضخامت خط کم می‌شود تا توپر و سنگین دیده نشود. */
.product-card-image > .ic,
.product-detail-image > .ic,
.cart-product-img > .ic,
.no-results-icon > .ic { stroke-width: 1.1; opacity: 0.5; }

.product-card-image > .ic   { width: 4.5rem; height: 4.5rem; }
.product-detail-image > .ic { width: 9rem;   height: 9rem;   }
.cart-product-img > .ic     { width: 1.9rem; height: 1.9rem; stroke-width: 1.5; }
.no-results-icon > .ic      { width: 3.4rem; height: 3.4rem; opacity: 0.55; }

a {
    color: var(--red-primary);
    text-decoration: none;
}

a:hover {
    color: var(--red-hover);
}

.site-main {
    flex: 1;
    padding: 1rem 0;
}

/* Header */
.site-header {
    position: sticky;
    top: 0;
    z-index: 1000;
}

.header-top {
    background: var(--bg-secondary);
    border-bottom: 1px solid var(--border-color);
    padding: 0.5rem 0;
}

.header-container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 1rem;
    display: flex;
    align-items: center;
    gap: 1rem;
}

.header-left-group {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-shrink: 0;
}

.logo {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    color: var(--text-primary);
    font-size: 1.1rem;
    font-weight: bold;
    white-space: nowrap;
}

.logo:hover { color: var(--red-primary); }

.logo-icon { font-size: 1.5rem; }
/* لوگوی آپلودی فروشگاه — جایگزین آیکون دندانه‌ای پیش‌فرض، وقتی از پنل
   آپلود شود (خواستهٔ کاربر ۲۰۲۶-۰۹-۱۱). هم‌اندازهٔ همان آیکون قبلی
   (font-size روی .logo-icon، اینجا مستقیم روی خود img چون <img> از
   font-size ارث نمی‌برد). */
.logo-icon img.logo-img { width: 1.5rem; height: 1.5rem; object-fit: contain; display: block; border-radius: 4px; }
.footer-about .logo-icon img.logo-img { width: 1.35rem; height: 1.35rem; }

.header-search {
    flex: 1;
    min-width: 200px;
    display: flex;
}

.search-input {
    flex: 1;
    padding: 0.5rem 0.75rem;
    background: var(--bg-input);
    border: 1px solid var(--border-color);
    border-left: none;
    border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
    color: var(--text-primary);
    font-family: inherit;
    font-size: 0.85rem;
    outline: none;
}

.search-input:focus { border-color: var(--red-primary); }
.search-input::placeholder { color: var(--text-muted); }

.search-btn {
    padding: 0.5rem 1rem;
    background: var(--red-primary);
    border: 1px solid var(--red-primary);
    border-radius: var(--radius-sm) 0 0 var(--radius-sm);
    color: #fff;
    cursor: pointer;
    font-family: inherit;
    font-size: 0.85rem;
    white-space: nowrap;
}

.search-btn:hover { background: var(--red-hover); }

/* ---------- جستجوی زندهٔ نوار بالا (assets/js/search.js) ----------
   .search-live-wrap را خود اسکریپت به‌جای .header-search اضافه می‌کند
   (position:relative لازم است تا دراپ‌داون دقیقا زیر همین نوار بنشیند،
   نه وسط صفحه). دراپ‌داون position:absolute است، پس با flex-بودن
   .header-search تداخلی ندارد — عضو چیدمان flex نمی‌شود. */
.search-live-wrap { position: relative; }
.search-drop {
    position: absolute;
    top: calc(100% + 0.4rem);
    right: 0;
    left: 0;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    box-shadow: var(--shadow-lg);
    overflow: hidden;
    z-index: 500;
}
.search-drop-empty {
    padding: 1rem;
    text-align: center;
    color: var(--text-muted);
    font-size: 0.82rem;
}
.search-drop-row {
    display: flex;
    align-items: center;
    gap: 0.65rem;
    padding: 0.6rem 0.75rem;
    border-bottom: 1px solid var(--border-color);
    color: var(--text-primary);
    text-decoration: none;
    transition: background var(--transition);
}
.search-drop-row:hover, .search-drop-row:focus { background: var(--bg-input); }
.sd-img {
    flex: 0 0 auto;
    width: 42px;
    height: 42px;
    border-radius: var(--radius-sm);
    background: var(--bg-input);
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
    color: var(--text-muted);
    font-size: 1.1rem;
}
.sd-img img { width: 100%; height: 100%; object-fit: cover; display: block; }
.sd-body { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 0.15rem; }
/* نام و «مناسب …» هم‌خط (خواستهٔ کاربر ۲۰۲۶-۰۹-۲۰: «روبروش توی یک خط»):
   نام به اندازهٔ خودش، «مناسب …» فضای باقی‌مانده را می‌گیرد و اگر جا کم بود
   با سه‌نقطه کوتاه می‌شود. */
.sd-head { display: flex; align-items: center; gap: 0.6rem; min-width: 0; }
.sd-name {
    flex: 0 1 auto;
    min-width: 0;
    font-size: 0.9rem;
    font-weight: 700;
    line-height: 1.5;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.sd-name mark { background: rgba(220, 38, 38, 0.25); color: inherit; border-radius: 3px; padding: 0 0.1rem; }
/* «مناسب …» — جایگزین قیمت (۲۰۲۶-۰۹-۲۰، خواستهٔ کاربر): برچسب کوچک هم‌رنگ تم
   + نام خودروهای مناسب + بازهٔ سال، هرکدام فقط اگر ثبت شده باشد. */
.sd-fit {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    flex: 1 1 0;
    min-width: 4.5rem;
    font-size: 0.76rem;
    color: var(--text-secondary);
}
.sd-fit b {
    flex: 0 0 auto;
    font-size: 0.64rem;
    font-weight: 700;
    padding: 0.05rem 0.45rem;
    border-radius: 999px;
    color: var(--red-light);
    background: color-mix(in srgb, var(--red-primary) 16%, transparent);
}
.sd-fit-txt { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sd-years { flex: 0 0 auto; font-size: 0.68rem; color: var(--text-muted); }
.sd-years::before { content: "\00B7"; margin-inline-end: 0.35rem; }
.sd-meta { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; min-width: 0; }
.sd-tags { display: flex; gap: 0.3rem; flex-wrap: wrap; }
.sd-tag {
    font-size: 0.64rem;
    font-weight: 600;
    padding: 0.05rem 0.4rem;
    border-radius: 999px;
    white-space: nowrap;
}
.sd-tag-brand { background: rgba(59, 130, 246, 0.15); color: #93C5FD; }
.sd-tag-cat { background: rgba(234, 179, 8, 0.15); color: #FCD34D; }
.sd-tech { font-size: 0.7rem; color: var(--text-muted); direction: ltr; text-align: right; }
.search-drop-more {
    display: block;
    padding: 0.65rem;
    text-align: center;
    font-size: 0.8rem;
    font-weight: 600;
    color: var(--red-light);
    text-decoration: none;
    background: var(--bg-card);
}
.search-drop-more:hover { background: var(--bg-input); }

@media (max-width: 640px) {
    .search-drop { left: -0.5rem; right: -0.5rem; }
    .sd-tags { display: none; }
}

.header-actions {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.cart-link {
    position: relative;
    display: flex;
    align-items: center;
    color: var(--text-primary);
    padding: 0.5rem;
    border-radius: var(--radius-sm);
}

.cart-link:hover { background: var(--bg-input); color: var(--red-primary); }
.cart-icon { font-size: 1.5rem; }

.cart-badge {
    position: absolute;
    top: -2px;
    right: -4px;
    background: var(--red-primary);
    color: #fff;
    font-size: 0.65rem;
    min-width: 18px;
    height: 18px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    padding: 0 4px;
}

/* Brand logo in header */
.brand-logo-box {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    overflow: hidden;
    border: 2px solid rgba(220, 38, 38, 0.3);
    background: #fff;
    flex-shrink: 0;
    animation: logoSlideIn 0.4s ease;
}

.brand-logo-box:hover { border-color: var(--red-primary); }

.brand-logo-img {
    width: 34px;
    height: 34px;
    object-fit: contain;
    /* یکدست، سیاه‌وسفید (خواسته کاربر: «مثل بی‌ام‌و سیاه باشه») — با
       brightness(0) هر لوگویی، صرف‌نظر از رنگ اصلی‌اش، به یک سیلوئت
       سیاه تبدیل می‌شود.
       ۲۰۲۶-۰۹-۰۳: عمدا سیاه ماند، برخلاف .mm-brand-icon/.pby-brand-logo
       که سفید شدند — این یکی داخل .brand-logo-box با پس‌زمینهٔ #fff
       می‌نشیند (چند خط بالاتر)، پس سیاه همان انتخاب درست است؛ سفید کردنش
       باعث می‌شد لوگو روی زمینهٔ سفید محو شود. */
    filter: brightness(0);
}

@keyframes logoSlideIn {
    from { opacity: 0; transform: scale(0.5); }
    to   { opacity: 1; transform: scale(1); }
}

/* Main navbar */
.main-navbar {
    background: var(--bg-secondary);
    border-bottom: 2px solid var(--red-primary);
    box-shadow: var(--shadow);
}

.main-navbar .header-container {
    padding: 0 1rem;
    gap: 0;
}

.nav-link {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.65rem 0.85rem;
    color: var(--text-secondary);
    font-size: 0.85rem;
    text-decoration: none;
    white-space: nowrap;
    transition: all var(--transition);
    border-bottom: 2px solid transparent;
    margin-bottom: -2px;
}

.nav-link:hover {
    color: var(--text-primary);
    background: rgba(220, 38, 38, 0.08);
}

/* Mega menu */
.nav-mega { position: relative; }

.nav-mega .nav-dropdown-btn {
    background: none;
    border: none;
    cursor: pointer;
    font-family: inherit;
}

.mega-menu {
    display: none;
    position: absolute;
    top: 100%;
    right: 0;
    width: 100vw;
    max-width: 1200px;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-top: 2px solid var(--red-primary);
    box-shadow: var(--shadow-lg);
    border-radius: 0 0 var(--radius) var(--radius);
    z-index: 100;
}

.nav-mega:hover .mega-menu { display: block; }

.mega-menu-inner {
    padding: 1.25rem;
    max-height: 70vh;
    overflow-y: auto;
}

.mega-parts-grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 0.5rem 0.6rem;
}

.mm-col { min-width: 0; }

.mm-brand-head {
    display: flex;
    align-items: center;
    gap: 0.2rem;
    color: var(--red-primary);
    font-weight: 600;
    font-size: 0.73rem;
    text-decoration: none;
    padding: 0.15rem 0;
    margin-bottom: 0.12rem;
    border-bottom: 1px solid rgba(220,38,38,0.12);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.mm-brand-head:hover { color: var(--red-hover); }

.mm-brand-icon {
    width: 17px;
    height: 17px;
    object-fit: contain;
    flex-shrink: 0;
    /* رنگ سیلوئت از تم می‌آید، نه ثابت — نگاه کنید به --logo-filter در
       :root بالای همین فایل. */
    filter: var(--logo-filter);
}

.mm-part-head {
    color: var(--red-primary);
    font-weight: 600;
    font-size: 0.85rem;
    display: block;
    padding: 0.2rem 0;
    margin-bottom: 0.2rem;
    border-bottom: 1px solid rgba(220,38,38,0.15);
}

.mm-sub-list {
    list-style: none;
    padding: 0;
    margin: 0;
}

.mm-sub-list li a {
    display: block;
    padding: 0.18rem 0;
    color: var(--text-muted);
    font-size: 0.78rem;
    text-decoration: none;
}

.mm-sub-list li a:hover { color: var(--text-primary); }

.mm-more {
    color: var(--red-primary) !important;
    font-size: 0.65rem !important;
}

a.mm-part-head {
    text-decoration: none;
    cursor: pointer;
    transition: color 0.15s;
}

a.mm-part-head:hover { color: var(--red-hover); }

/* صفحهٔ دسته‌بندی قطعات (parts.php) */
.parts-crumb {
    font-size: 0.85rem;
    color: var(--text-muted);
    margin-bottom: 0.75rem;
}
.parts-crumb a { color: var(--text-secondary); text-decoration: none; }
.parts-crumb a:hover { color: var(--red-light); }

/* مسیر ناوبری سئو — همان الگوی .parts-crumb، روی product.php/category.php/
   shop.php/parts.php (خواستهٔ کاربر ۲۰۲۶-۰۹-۲۲: «خروجی HTML مناسب» برای
   Breadcrumb). آیتم فعلی (بدون لینک) با متن معمولی، بقیه لینک. */
.seo-breadcrumb {
    font-size: 0.82rem;
    color: var(--text-muted);
    margin-bottom: 0.85rem;
    line-height: 1.9;
}
.seo-breadcrumb a { color: var(--text-secondary); text-decoration: none; }
.seo-breadcrumb a:hover { color: var(--red-light); }
.seo-breadcrumb-sep { opacity: 0.55; margin: 0 0.15rem; }

/* خواستهٔ کاربر ۲۰۲۶-۰۹-۱۹ («مجموعه قطعات تعمیر اساسی موتور» با «...» نصفه
   نمایش داده می‌شد؛ پیگیری بلافاصله: «دو خط نشه») — دور اول با اجازهٔ
   شکستن تا ۲ خط رفع شد، ولی کاربر دوخطی‌شدن را هم نمی‌خواست. رفع نهایی:
   از گرید با ستون‌های هم‌عرض (که مجبور بود عرض هر کارت را به عرض کارت‌های
   کوتاه‌تر کنار خودش گره بزند) به فلکس تبدیل شد — هر کارت دقیقا به‌اندازهٔ
   متن خودش عریض می‌شود (`flex:0 0 auto`)، نه یک سهم مساوی از ردیف؛ کارت‌های
   کوتاه کوچک می‌مانند، کارت بلند خودش بزرگ‌تر می‌شود، هیچ‌کدام مجبور به
   بریدن یا دوخطی‌شدن نیستند. `max-width`+`overflow-wrap` فقط یک سپر ایمنی
   نادر است — تنها وقتی یک نام واقعا از کل عرض صفحهٔ موبایل هم پهن‌تر باشد
   به کار می‌افتد، در حالت عادی هیچ اثری ندارد. */
.parts-cat-grid {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
    margin-bottom: 1.75rem;
}

.parts-cat-tile {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    flex: 0 0 auto;
    max-width: 100%;
    height: 60px;
    padding: 0 1.1rem;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    color: var(--text-primary);
    text-decoration: none;
    transition: border-color 0.15s, transform 0.15s, background 0.15s;
}

.parts-cat-tile:hover {
    border-color: var(--red-primary);
    background: var(--bg-secondary);
    transform: translateY(-2px);
}

.parts-cat-tile-name {
    font-size: 0.9rem;
    font-weight: 600;
    white-space: nowrap;
    overflow-wrap: break-word;
}

/* فهرست سرشاخه‌ها (parts.php بدون cat؟) — «موتور و قطعات موتوری»-وار،
   بدون شمارهٔ زیرشاخه، فقط اسم برند وسط‌چین. کارت سرشاخهٔ باز و کارت
   زیرشاخه‌دار (که هنوز شمارهٔ کالا دارد) هر دو از همین .parts-cat-tile
   می‌آیند، پس این حالت با یک کلاس کمکی روی گرید جدا شده، نه با تغییر
   خود .parts-cat-tile عمومی. */
.parts-cat-grid--top .parts-cat-tile { justify-content: center; }
.parts-cat-grid--top .parts-cat-tile-name { text-align: center; }

.parts-cat-tile-count {
    font-size: 0.72rem;
    color: var(--text-muted);
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: 999px;
    padding: 0.1rem 0.5rem;
    white-space: nowrap;
    flex-shrink: 0;
}

.parts-cat-tile:hover .parts-cat-tile-count { color: var(--red-light); }

/* ---------- مرحلهٔ برند/سال صفحهٔ parts.php (خواستهٔ کاربر) ---------- */
.pby-box {
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 1.1rem;
    margin-bottom: 1.75rem;
}
.pby-title {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--text-primary);
    margin-bottom: 0.9rem;
}
.pby-brands {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
    gap: 0.75rem;
}
/* کاشی برند — عمدا بزرگ‌تر و برجسته‌تر از .parts-cat-tile چون این
   انتخاب، نقطهٔ شروع کل مسیر خرید است (خواستهٔ کاربر: «کلید بزرگ و زیبا»). */
.pby-brand-tile {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    height: 110px;
    padding: 0.75rem 0.5rem;
    background: var(--bg-card);
    border: 2px solid var(--border-color);
    border-radius: var(--radius);
    color: var(--text-primary);
    text-decoration: none;
    text-align: center;
    transition: border-color 0.15s, transform 0.15s, background 0.15s;
}
.pby-brand-tile:hover {
    border-color: var(--red-primary);
    background: var(--bg-secondary);
    transform: translateY(-3px);
}
/* رنگ سیلوئت از تم می‌آید، نه ثابت — نگاه کنید به --logo-filter در :root
   بالای همین فایل (همان دلیل .mm-brand-icon). */
.pby-brand-logo { width: 46px; height: 46px; object-fit: contain; filter: var(--logo-filter); }
.pby-brand-tile span { font-size: 0.82rem; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }

.pby-selrow { display: flex; align-items: center; gap: 1.25rem; flex-wrap: wrap; }
.pby-selbrand { display: flex; align-items: center; gap: 0.6rem; font-size: 0.95rem; }
.pby-selbrand .pby-brand-logo { width: 38px; height: 38px; }
.pby-selbrand b { color: var(--text-primary); }
.pby-change {
    display: inline-flex; align-items: center; gap: 0.3rem;
    font-size: 0.75rem; color: var(--text-muted); text-decoration: none;
    border: 1px solid var(--border-color); border-radius: 999px; padding: 0.15rem 0.6rem;
}
.pby-change:hover { color: var(--red-light); border-color: var(--red-primary); }

/* برند + سال زیر هم (نه کنار هم) — چون کادر چیپ‌های سال حالا می‌تواند
   چند سطر باشد و کنار برند جا نمی‌شد. */
.pby-selrow { display: flex; flex-direction: column; align-items: flex-start; gap: 0.9rem; }

/* مدل و سال هرکدام کادر مجزای خودشان (خواستهٔ کاربر: «توی یک کادر
   مجزا از سال») — قاب+پس‌زمینه، تا مدل و سال به‌وضوح دو بخش جدا دیده
   شوند، نه یک ستون پیوسته. */
.pby-models, .pby-years {
    width: 100%;
    padding: 0.75rem 0.85rem;
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    background: var(--bg-primary);
    /* هدر سایت position:sticky است؛ بدون این، پرش لنگر مقصد را درست
       زیر هدر می‌گذاشت و عملا محتوای کادر پشت هدر پنهان می‌شد — همان
       چیزی که «میپره روی محصول» به‌نظر می‌رسید (کادر سال آن‌قدر کوتاه
       بود که کاملا زیر هدر گم می‌شد). */
    scroll-margin-top: 110px;
}
.pby-modelslabel, .pby-yearslabel { display: flex; align-items: center; gap: 0.35rem; font-size: 0.85rem; color: var(--text-secondary); margin-bottom: 0.6rem; }

/* «همه مدل‌ها»/«همه سال‌ها» — خواستهٔ کاربر: «متفاوت باشه و بالاتر از
   بقیه توی کادر خودش باشه»؛ یک ردیف مجزا، پیش از چیپ‌های تک‌تک مدل/سال،
   با ظاهر متفاوت (خط‌چین/خاکستری، نه توپر هم‌رنگ بقیه) تا واضح باشد این
   یک «پاک‌کن/بازگشت» است، نه یک گزینهٔ هم‌ردیف بقیه. */
.pby-reset-chip {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    padding: 0.5rem 1rem;
    margin-bottom: 0.65rem;
    font-size: 0.82rem;
    font-weight: 700;
    border: 2px dashed var(--border-color);
    border-radius: var(--radius-sm);
    background: var(--bg-secondary);
    color: var(--text-secondary);
    text-decoration: none;
    transition: border-color 0.15s, color 0.15s, background 0.15s;
}
.pby-reset-chip:hover { border-color: var(--red-primary); color: var(--text-primary); }
.pby-reset-chip.is-on { background: var(--red-primary); border-color: var(--red-primary); border-style: solid; color: #fff; }

/* چیپ‌های بزرگ سال به‌جای نوار کشویی (خواستهٔ کاربر) — هر سال یک دکمهٔ
   گرد کلیک‌پذیر مستقل، هم‌شکل با کاشی برند بالا ولی جمع‌وجورتر چون تعدادشان
   بیشتر است. لینک سادهاند، پس بدون جاوااسکریپت هم کار می‌کنند. */
.pby-yearchips { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.pby-yearchip {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 64px;
    padding: 0.55rem 1rem;
    font-size: 0.9rem;
    font-weight: 700;
    border: 2px solid var(--border-color);
    border-radius: 999px;
    background: var(--bg-card);
    color: var(--text-primary);
    text-decoration: none;
    transition: border-color 0.15s, transform 0.15s, background 0.15s, color 0.15s;
}
.pby-yearchip:hover { border-color: var(--red-primary); transform: translateY(-2px); }
.pby-yearchip.is-on { background: var(--red-primary); border-color: var(--red-primary); color: #fff; }

/* خواستهٔ کاربر ۲۰۲۶-۰۹-۱۶: «روی سال خودرو موس نگه می‌دارم می‌خوام عدد
   میلادی هم نمایش داده بشه، هی میلادی هی شمسی از پایین کادر دائم عوض بشه
   تا موس روی کادره» — دو ردیف (شمسی/میلادی) روی‌هم، در جعبه‌ای به‌اندازهٔ
   دقیقا یک ردیف با overflow:hidden؛ فقط ارتفاع همین یک چیپ بزرگ‌تر می‌شود،
   نه کل ردیف چیپ‌ها. */
.pby-yc-clip { display: inline-block; overflow: hidden; height: 1.3em; line-height: 1.3em; vertical-align: middle; }
.pby-yc-stack { display: flex; flex-direction: column; }
.pby-yc-row { height: 1.3em; line-height: 1.3em; }
/* انیمیشن فقط با :hover شروع می‌شود (لینک ساده، بدون جاوااسکریپت) و تا
   وقتی موس روی چیپ است بی‌نهایت تکرار می‌شود — خودش با رفتن موس متوقف
   می‌شود چون کلاس :hover دیگر اعمال نیست. */
.pby-yearchip:hover .pby-yc-stack { animation: pbyYearFlip 2.6s ease-in-out infinite; }
@keyframes pbyYearFlip {
    0%, 42%  { transform: translateY(0); }
    50%, 92% { transform: translateY(-1.3em); }
    100%     { transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
    .pby-yearchip:hover .pby-yc-stack { animation: none; }
}

/* چیپ‌های مدل — خواستهٔ کاربر: «مدل کلید هم بیضی نباشه» — دقیقا همان
   چیپ سال، فقط گوشه‌های گرد معمولی (مستطیل) به‌جای بیضی/کپسولی، تا
   بصری هم از چیپ سال جدا باشد. */
.pby-modelchips { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.pby-modelchip {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 64px;
    padding: 0.55rem 1rem;
    font-size: 0.9rem;
    font-weight: 700;
    border: 2px solid var(--border-color);
    border-radius: 10px;
    background: var(--bg-card);
    color: var(--text-primary);
    text-decoration: none;
    transition: border-color 0.15s, transform 0.15s, background 0.15s, color 0.15s;
}
.pby-modelchip:hover { border-color: var(--red-primary); transform: translateY(-2px); }
.pby-modelchip.is-on { background: var(--red-primary); border-color: var(--red-primary); color: #fff; }

@media (max-width: 640px) {
    .pby-brands { grid-template-columns: repeat(auto-fill, minmax(90px, 1fr)); }
    .pby-brand-tile { height: 90px; }
    .pby-yearchip, .pby-modelchip { min-width: 56px; padding: 0.5rem 0.8rem; font-size: 0.85rem; }
}

.parts-section-title {
    font-size: 1rem;
    font-weight: 600;
    margin: 1.25rem 0 0.75rem;
    color: var(--text-secondary);
}

/* لنگر نهایی کلیک مدل/سال (وقتی سال فعال نیست) — همان دلیل
   scroll-margin-top روی .pby-models/.pby-years بالاتر: هدر sticky است. */
#parts-products { scroll-margin-top: 110px; }


.flash {
    max-width: 1200px;
    margin: 1rem auto;
    padding: 0.75rem 1rem;
    border-radius: var(--radius);
    text-align: center;
    font-size: 0.9rem;
}

.flash-error {
    background: rgba(220, 38, 38, 0.15);
    border: 1px solid var(--red-primary);
    color: var(--red-light);
}

.flash-success {
    background: rgba(16, 185, 129, 0.15);
    border: 1px solid var(--green);
    color: var(--green);
}

/* خنثی از نظر تم — برخلاف flash-error/success قرار نیست هشدار یا موفقیت
   باشد، فقط یک عدد پیش‌نمایش (مثلا مدیریت قیمت‌ها) را نشان می‌دهد؛
   accent-secondary بین تم‌ها خیلی پرتضاد است (از آبی تا قهوه‌ای تیره)،
   پس رنگ خنثی خود متن صفحه امن‌تر است. */
.flash-info {
    background: color-mix(in srgb, var(--text-muted) 12%, transparent);
    border: 1px solid var(--border-color);
    color: var(--text-primary);
}

/* ===== توست پیغام سبد خرید =====
   جای ثابت و اختصاصی، خارج از جریان صفحه (position:fixed) → محتوای صفحه هیچ‌وقت
   با آمدن/رفتن پیغام بالا و پایین نمی‌پرد. روی موبایل تمام‌عرض پایین صفحه می‌نشیند. */
.cart-toast {
    position: fixed;
    bottom: 1.25rem;
    left: 50%;
    z-index: 1200;
    display: flex;
    align-items: center;
    gap: 0.55rem;
    max-width: min(92vw, 460px);
    padding: 0.7rem 0.85rem;
    border-radius: 12px;
    font-size: 0.88rem;
    line-height: 1.5;
    text-align: right;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    box-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);
    transform: translateX(-50%) translateY(0);
    opacity: 1;
    transition: opacity 0.28s ease, transform 0.28s ease, visibility 0.28s;
    animation: cartToastIn 0.28s ease both;
}
@keyframes cartToastIn {
    from { opacity: 0; transform: translateX(-50%) translateY(14px); }
    to   { opacity: 1; transform: translateX(-50%) translateY(0); }
}
.cart-toast.is-hide {
    opacity: 0;
    visibility: hidden;
    transform: translateX(-50%) translateY(14px);
    animation: none;
}
.cart-toast.is-ok  { border-color: var(--green); background: linear-gradient(180deg, rgba(16,185,129,0.16), rgba(16,185,129,0.06)), var(--bg-secondary); color: var(--text-primary); }
.cart-toast.is-err { border-color: var(--red-primary); background: linear-gradient(180deg, rgba(220,38,38,0.16), rgba(220,38,38,0.06)), var(--bg-secondary); color: var(--text-primary); }
.cart-toast-msg { flex: 1; min-width: 0; }
.cart-toast-ic { flex: 0 0 auto; display: inline-flex; }
.cart-toast-ic > .ic { width: 1.3rem; height: 1.3rem; }
.cart-toast.is-ok  .cart-toast-ic > .ic { color: var(--green); }
.cart-toast.is-err .cart-toast-ic > .ic { color: var(--red-light); }
.cart-toast-x {
    flex: 0 0 auto;
    display: inline-flex; align-items: center; justify-content: center;
    width: 26px; height: 26px; padding: 0;
    background: transparent; border: none; cursor: pointer;
    border-radius: 7px; color: var(--text-muted);
    transition: all var(--transition);
}
.cart-toast-x:hover { background: rgba(255, 255, 255, 0.07); color: var(--text-primary); }
.cart-toast-x > .ic { width: 1rem; height: 1rem; }
@media (max-width: 600px) {
    .cart-toast { left: 0.6rem; right: 0.6rem; bottom: 0.6rem; max-width: none; transform: none; animation-name: cartToastInSm; }
    .cart-toast.is-hide { transform: translateY(14px); }
}
@keyframes cartToastInSm {
    from { opacity: 0; transform: translateY(14px); }
    to   { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
    .cart-toast { animation: none; transition: opacity 0.15s linear; }
}

/* Container */
.container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 1rem;
}

/* Page Title */
.page-title {
    font-size: 1.5rem;
    font-weight: bold;
    margin-bottom: 1.5rem;
    color: var(--text-primary);
    border-bottom: 2px solid var(--red-primary);
    padding-bottom: 0.5rem;
    display: inline-block;
}

/* Buttons */
.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 0.6rem 1.25rem;
    border: none;
    border-radius: var(--radius-sm);
    cursor: pointer;
    font-family: inherit;
    font-size: 0.875rem;
    font-weight: 500;
    transition: all var(--transition);
    text-align: center;
}

.btn-primary {
    background: var(--red-primary);
    color: #fff;
}

.btn-primary:hover {
    background: var(--red-hover);
    color: #fff;
}

/* دکمهٔ «ناموجود» (خواستهٔ کاربر ۲۰۲۶-۰۹-۱۱: «دیگه رنگی نشون نده، خودت
   بی‌رنگش کن مثلا خاکستری») — تا امروز هیچ استایلی برای دکمهٔ disabled
   نبود، پس #addToCartBtn در product.php وقتی جاوااسکریپت با نداشتن موجودی
   آن را disabled و متنش را «ناموجود» می‌کرد، هنوز رنگ قرمز برند
   (`.btn-primary`) را داشت — انگار قابل‌کلیک و فعال است. یک قاعدهٔ عمومی
   روی خود `.btn:disabled` (نه فقط primary، هر دکمهٔ غیرفعالی در کل سایت)
   با توکن‌های خنثی همیشه‌موجود سیستم تم (نه یک خاکستری هاردکد) اضافه شد؛
   تا با هر ۱۵ تم رنگی هماهنگ بماند، هم روشن هم تیره. specificity دو
   سلکتوری (`.btn:disabled`) خودش‌به‌خود روی `.btn-primary`/`.btn-secondary`
   (یک سلکتوری) برنده می‌شود، نیازی به !important نبود. */
.btn:disabled,
.btn:disabled:hover {
    background: var(--bg-input);
    color: var(--text-muted);
    cursor: not-allowed;
    opacity: 0.75;
}

.btn-secondary {
    background: var(--bg-input);
    color: var(--text-primary);
}

.btn-secondary:hover {
    background: var(--border-light);
}

.btn-sm {
    padding: 0.35rem 0.75rem;
    font-size: 0.8rem;
}

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

.btn-outline:hover {
    background: var(--red-primary);
    color: #fff;
}

.btn-danger {
    background: var(--red-primary);
    color: #fff;
}

.btn-danger:hover {
    background: var(--red-hover);
}

.btn-success {
    background: var(--green);
    color: #fff;
}

.btn-success:hover {
    background: var(--green-dark);
}

.btn-block {
    display: block;
    width: 100%;
}

/* Product Grid */
.product-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
    gap: 1.25rem;
}

.product-card {
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    overflow: hidden;
    transition: all var(--transition);
    display: flex;
    flex-direction: column;
    /* باگ واقعی موبایل (خواستهٔ کاربر ۲۰۲۶-۰۹-۱۴: «همگام‌سازی کامل سایت
       برای موبایل، هیچ به‌هم‌ریختگی‌ای») — این کارت هم آیتم گرید
       (.product-grid) است هم فرزند فلکس خودش؛ هر دو به‌طور پیش‌فرض
       min-width:auto دارند، یعنی هیچ‌وقت زیر «کوچک‌ترین محتوای تقسیم‌نشدنی»
       (مثلا شمارهٔ فنی لاتین یا چیپ قیمت درازتر) کوچک نمی‌شوند — روی
       شبکهٔ دوستونی موبایل (≤480px، پایین‌تر همین فایل) این یعنی محتوای
       نیمهٔ دوم کارت به‌جای شکستن خط، از کادر (overflow:hidden بالا)
       بیرون و نامرئی می‌زد. min-width:0 اجازهٔ کوچک‌شدن واقعی می‌دهد. */
    min-width: 0;
}

.product-card:hover {
    border-color: var(--red-primary);
    box-shadow: var(--shadow-lg);
    transform: translateY(-2px);
}

/* خواستهٔ کاربر ۲۰۲۶-۰۹-۰۸: «عکس کالاها از حاشیه‌ها زده بیرون» — علت واقعی
   ارتفاع ثابت ۲۰۰px بود روی عرض متغیر ستون گرید (auto-fill با minmax
   260px)؛ عکس‌های محصولات معمولا تقریبا مربعی‌اند (مثلا ۴۱۳×۴۳۸،
   ۴۴۷×۴۴۷ — بررسی‌شده روی چند محصول واقعی)، ولی قاب همیشه یک نسبت
   ابعاد افقی (و هرچه صفحه عریض‌تر، افقی‌تر) داشت — یعنی object-fit:cover
   برای پرکردن آن مجبور بود هرچه بیشتر از بالا/پایین عکس را ببرد؛ روی
   صفحه‌های عریض این برش آن‌قدر شدید می‌شد که موضوع اصلی عکس (مثلا لاستیک)
   انگار از قاب می‌زد بیرون. با aspect-ratio:1/1 قاب همیشه مربع می‌ماند —
   با هر عرض ستونی، نسبت برش با عکس‌های واقعا مربعی هماهنگ و قابل‌پیش‌بینی
   است، دیگر با عریض‌ترشدن صفحه بدتر نمی‌شود. عرض/تعداد ستون‌های گرید
   (`.product-grid`) دست‌نخورده ماند — این فقط ارتفاع خود قاب عکس را از
   یک عدد ثابت به نسبت متناسب با عرض تبدیل کرد. */
.product-card-image {
    width: 100%;
    aspect-ratio: 1 / 1;
    background: var(--bg-input);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 4rem;
    color: var(--text-muted);
    overflow: hidden;
    border-radius: var(--radius) var(--radius) 0 0;
}

.product-card-image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    /* دفاعی: حتی اگر گوشهٔ گرد کارت به هر دلیلی (مرورگر/زوم خاص) لبهٔ
       تیز عکس را کامل نبرد، خود عکس هم گوشهٔ گردش را دارد. */
    border-radius: inherit;
}

.product-card-body {
    padding: 1rem;
    flex: 1;
    display: flex;
    flex-direction: column;
    min-width: 0; /* هم‌دلیل .product-card بالا — بدون این، خودش هم به‌جای کوچک‌شدن، محتوای درازش را از کادر بیرون می‌زد */
}

.product-card-title {
    font-size: 0.95rem;
    font-weight: 600;
    margin-bottom: 0.5rem;
    line-height: 1.4;
    overflow-wrap: anywhere;
}

.product-card-title a {
    color: var(--text-primary);
}

.product-card-title a:hover {
    color: var(--red-primary);
}

.product-card-tech {
    font-size: 0.8rem;
    color: var(--text-muted);
    margin-bottom: 0.75rem;
    /* شمارهٔ فنی معمولا لاتین و بدون فاصله است (مثلا FVN-AUDI-224455) —
       بدون این، روی کارت باریک موبایل به‌جای شکستن خط از کادر بیرون
       می‌زد (نگاه کنید به یادداشت .product-card بالا). */
    overflow-wrap: anywhere;
}

.product-card-prices {
    margin-top: auto;
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin-bottom: 0.75rem;
}

.price-retail,
.price-wholesale {
    font-size: 0.85rem;
    padding: 0.25rem 0.5rem;
    border-radius: var(--radius-sm);
    max-width: 100%;
    overflow-wrap: anywhere;
}

.price-retail {
    background: color-mix(in srgb, var(--red-primary) 10%, transparent);
    color: var(--red-light);
}

.price-wholesale {
    background: color-mix(in srgb, var(--price-wholesale) 12%, transparent);
    color: var(--price-wholesale);
}

/* تخفیف: قیمت قدیمی خط‌خورده + قیمت جدید + نشان درصد */
.price-old {
    text-decoration: line-through;
    color: var(--text-muted);
    opacity: 0.85;
    font-size: 0.82em;
    font-weight: normal;
    margin-left: 0.2rem;
}
.price-new {
    font-weight: bold;
}
.price-badge {
    display: inline-block;
    background: var(--red-primary);
    color: #fff;
    font-size: 0.68rem;
    font-weight: bold;
    padding: 0.05rem 0.45rem;
    border-radius: 999px;
    margin-right: 0.3rem;
    vertical-align: middle;
}

.product-card-stock {
    font-size: 0.8rem;
    color: var(--text-muted);
    margin-bottom: 0.75rem;
}

.product-card-actions {
    display: flex;
    gap: 0.5rem;
}

.product-card-actions .btn {
    flex: 1;
    min-width: 0;
}

/* Product Detail
   ستون تصویر عرض محدود و مشخصی دارد و شبکه align-items:start است؛ وگرنه
   (حالت پیش‌فرض stretch) اسلات تصویر تا ارتفاع ستون گزینه‌ها کشیده می‌شد و
   با اضافه‌شدن گزینه‌ها/واریانت‌ها تصویر بی‌اندازه بزرگ می‌شد. */
.product-detail {
    display: grid;
    grid-template-columns: minmax(0, clamp(240px, 32%, 360px)) minmax(0, 1fr);
    align-items: start;
    gap: 1.5rem;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 1.5rem;
}

.product-detail-image {
    position: relative;
    background: var(--bg-input);
    border-radius: var(--radius);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 8rem;
    color: var(--text-muted);
    /* ابعاد ثابت مربعی: نه با عوض‌شدن تصویر کاروسل صفحه می‌پرد و نه ارتفاع
       تصویر به بلندی ستون گزینه‌ها گره می‌خورد. */
    aspect-ratio: 1 / 1;
    min-height: 220px;
    overflow: hidden;
}

.product-detail-image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.product-detail-info h1 {
    font-size: 1.3rem;
    margin-bottom: 0.5rem;
}

.product-detail-tech {
    display: inline-block;
    background: var(--bg-input);
    padding: 0.35rem 0.75rem;
    border-radius: var(--radius-sm);
    font-size: 0.85rem;
    color: var(--text-secondary);
    margin-bottom: 0.75rem;
}

/* دو انتخابگر کشور/شرکت کنار هم‌اند (چیدمانشان در includes/header.php است)؛
   این‌جا فقط فاصلهٔ اضافی زیرشان برداشته می‌شود تا پنل جمع‌وجور بماند. */
.variant-selects .form-group { margin-bottom: 0; }

.product-detail-cats {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin-bottom: 0.75rem;
}

.cat-tag {
    background: rgba(220, 38, 38, 0.1);
    color: var(--red-light);
    padding: 0.2rem 0.6rem;
    border-radius: var(--radius-sm);
    font-size: 0.8rem;
}

.product-detail-desc {
    color: var(--text-secondary);
    line-height: 1.8;
    margin-bottom: 1rem;
}

.product-detail-prices {
    display: flex;
    gap: 0.75rem;
    margin-bottom: 1rem;
}

.price-box {
    flex: 1;
    padding: 0.75rem;
    border-radius: var(--radius-lg);
    text-align: center;
    cursor: pointer;
    transition: all 0.25s;
    border: 2px solid transparent;
}

.price-box.price-dimmed {
    opacity: 0.4;
    transform: scale(0.96);
    filter: grayscale(0.3);
}

/* خواستهٔ کاربر ۲۰۲۶-۰۹-۲۳: «رنگ کادرهای قیمت رو بهتر کن، خودت یک رنگ و
   طرح عالی برای هر تمی بذار» — قبلا هر دو کادر همیشه قرمز/سبز هاردکد
   بودند، مستقل از تم فعال؛ حالا کادر جزئی از رنگ برند خود تم
   (var(--red-primary)) می‌آید (که در هر تم چیز دیگری‌ست — مثلا در
   navy-blue آبی است، در forest-cream سبز)، و کادر کلی از توکن تازهٔ
   var(--price-wholesale) که برای هر تم دستی و هماهنگ با رنگ برند همان تم
   انتخاب شده (اغلب همان var(--accent-secondary) موجود تم، جایی که کافی
   با رنگ اصلی تم فرق داشت؛ چند تم هم رنگ اختصاصی گرفتند تا با رنگ برندشان
   قاطی نشود — نگاه کنید به تعریف var(--price-wholesale) در :root بالا).
   پس‌زمینه یک گرادیان ملایم دورنگی روی خود var(--bg-card) است (نه یک تن
   صاف روی پس‌زمینهٔ صفحه) تا روی تم‌های روشن و تیره یکسان زیبا بماند. */
.price-box.retail {
    background: linear-gradient(135deg, color-mix(in srgb, var(--red-primary) 16%, var(--bg-card)), color-mix(in srgb, var(--red-primary) 5%, var(--bg-card)));
    border-color: color-mix(in srgb, var(--red-primary) 32%, transparent);
}

.price-box.wholesale {
    background: linear-gradient(135deg, color-mix(in srgb, var(--price-wholesale) 16%, var(--bg-card)), color-mix(in srgb, var(--price-wholesale) 5%, var(--bg-card)));
    border-color: color-mix(in srgb, var(--price-wholesale) 32%, transparent);
}

/* خواستهٔ کاربر: «هیچ کلمهٔ تک/عمده نداشته باشه، فقط قیمت» — محصولی که
   فقط یک نوع قیمت دارد یک کادر ساده و غیرقابل‌کلیک می‌گیرد (product.php)،
   نه دو کادر انتخابی؛ همان تن قرمز برند را دارد ولی بدون cursor:pointer
   چون چیزی برای انتخاب نیست. */
.price-box.price-simple {
    cursor: default;
    background: linear-gradient(135deg, color-mix(in srgb, var(--red-primary) 16%, var(--bg-card)), color-mix(in srgb, var(--red-primary) 5%, var(--bg-card)));
    border-color: color-mix(in srgb, var(--red-primary) 32%, transparent);
}

.price-box.price-active {
    border-color: #fff !important;
    transform: scale(1.02);
}

.price-box.retail.price-active {
    border-color: var(--red-light) !important;
    box-shadow: 0 0 14px color-mix(in srgb, var(--red-primary) 50%, transparent);
    background: linear-gradient(135deg, color-mix(in srgb, var(--red-primary) 30%, var(--bg-card)), color-mix(in srgb, var(--red-primary) 12%, var(--bg-card)));
}

.price-box.wholesale.price-active {
    border-color: var(--price-wholesale) !important;
    box-shadow: 0 0 14px color-mix(in srgb, var(--price-wholesale) 50%, transparent);
    background: linear-gradient(135deg, color-mix(in srgb, var(--price-wholesale) 30%, var(--bg-card)), color-mix(in srgb, var(--price-wholesale) 12%, var(--bg-card)));
}

.price-box-label {
    font-size: 0.8rem;
    color: var(--text-muted);
    margin-bottom: 0.25rem;
}

.price-box-value {
    font-size: 1.15rem;
    font-weight: bold;
}

.price-box.retail .price-box-value,
.price-box.price-simple .price-box-value {
    color: var(--red-light);
}

.price-box.wholesale .price-box-value {
    color: var(--price-wholesale);
}

.price-box-note {
    font-size: 0.75rem;
    color: var(--text-muted);
    margin-top: 0.25rem;
}

.product-detail-stock {
    font-size: 0.9rem;
    color: var(--text-muted);
    margin-bottom: 0.75rem;
}

.product-detail-actions {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

.product-detail-actions input[type="number"] {
    width: 70px;
    padding: 0.5rem;
    background: var(--bg-input);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    color: var(--text-primary);
    text-align: center;
    font-family: inherit;
    font-size: 0.9rem;
}

.product-detail-actions input[type="number"]:focus {
    border-color: var(--red-primary);
    outline: none;
}

/* Search */
.search-container {
    max-width: 800px;
    margin: 0 auto 2rem;
}

.search-form {
    display: flex;
    gap: 0;
}

.search-form .search-input {
    flex: 1;
    padding: 0.75rem 1rem;
    font-size: 1rem;
    border-radius: var(--radius) 0 0 var(--radius);
}

.search-form .search-btn {
    padding: 0.75rem 1.5rem;
    font-size: 1rem;
    border-radius: 0 var(--radius) var(--radius) 0;
}

.search-results-count {
    color: var(--text-muted);
    margin-bottom: 1rem;
    font-size: 0.9rem;
}

.no-results {
    text-align: center;
    padding: 3rem 1rem;
    color: var(--text-muted);
    font-size: 1.1rem;
}

.no-results-icon {
    font-size: 3rem;
    margin-bottom: 1rem;
}

/* صفحهٔ «شرایط و قوانین» — متن آزاد مدیر، فقط با nl2br خط‌شکسته می‌شود؛
   قاب ساده و عریض خواندنی، هم‌رنگ با بقیهٔ کارت‌های سایت. */
.terms-page {
    max-width: 840px;
    margin: 0 auto;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 1.75rem;
}
.terms-body {
    color: var(--text-secondary);
    font-size: 0.92rem;
    line-height: 2.1;
}

/* صفحهٔ «درباره ما» — نقشهٔ جاسازی‌شده (about.php، خواستهٔ کاربر ۲۰۲۶-۰۹-۱۹:
   «لوکیشن رو از روی مپ بهش اضافه کنم»). ۴/۳ نسبت تصویر به‌جای ارتفاع ثابت
   پیکسلی، تا در عرض‌های مختلف (خصوصا موبایل) هیچ‌وقت خیلی کشیده/فشرده
   نشود؛ کادر گوشه‌گرد هم‌شکل بقیهٔ کارت‌های صفحه. */
.about-map {
    margin-top: 1.75rem;
    aspect-ratio: 16 / 9;
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    overflow: hidden;
}
.about-map iframe { width: 100%; height: 100%; border: 0; display: block; }
.about-map-link { margin-top: 1.75rem; text-align: center; }
.about-map-link a {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.6rem 1.2rem;
    background: var(--red-primary);
    color: #fff;
    border-radius: var(--radius);
    font-size: 0.85rem;
    font-weight: 600;
    transition: opacity var(--transition);
}
.about-map-link a:hover { opacity: 0.9; }

/* Category Page */
/* ردیف بالای صفحهٔ دسته‌بندی: متن (دکمهٔ برگشت + عنوان مدل) راست، عکس
   نمونهٔ خودرو (اگر باشد) چپ — خواستهٔ کاربر ۲۰۲۶-۰۹-۱۴. اولین فرزند
   (category-header، متن) طبق قاعدهٔ RTL سمت راست می‌نشیند، دومی
   (category-hero-car) با justify-content:space-between خودکار سمت چپ؛
   کم‌شدن عرض هم عکس را به خط بعد (زیر متن) می‌برد، نه برعکس. */
.category-hero {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 1rem;
    margin-bottom: 2rem;
    flex-wrap: wrap;
}
.category-header {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.5rem;
    margin-bottom: 0;
}
/* بدون حاشیه/بکگراند روی خود جعبه (خواستهٔ کاربر: «هیچ حاشیه‌ای نداشته
   باشه فقط خود ماشین») — تمیزی واقعی از آپلود عکس می‌آید
   (normalizeBrandLogo در admin/car-images.php شفاف/بی‌حاشیه‌اش می‌کند)،
   این‌جا فقط اندازه/جایگاه تنظیم می‌شود. */
.category-hero-car { flex: 0 0 auto; width: 260px; max-width: 100%; height: 160px; }
.category-hero-car img { width: 100%; height: 100%; object-fit: contain; display: block; }
@media (max-width: 700px) {
    .category-hero-car { width: 100%; max-width: 260px; height: 150px; margin: 0 auto; }
}

.variant-section {
    margin-bottom: 1rem;
    padding: 0.75rem;
    background: var(--bg-primary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
}
.variant-section-title {
    font-size: 0.82rem;
    font-weight: 600;
    color: var(--red-light);
    margin-bottom: 0.5rem;
}
.variant-grid {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
}
.variant-card {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    padding: 0.5rem 0.75rem;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    text-decoration: none;
    min-width: 120px;
    transition: all 0.2s;
    cursor: pointer;
    background: var(--bg-card);
}
.variant-card:hover { border-color: var(--red-primary); }
.variant-card.variant-active {
    border-color: var(--red-primary);
    background: rgba(220,38,38,0.1);
    box-shadow: 0 0 0 1px var(--red-primary);
}
.variant-flag { font-size: 0.8rem; color: var(--text-primary); font-weight: 600; }
.variant-maker { font-size: 0.7rem; color: var(--text-muted); }
.variant-price { font-size: 0.78rem; color: var(--red-light); font-weight: 600; }
.variant-stock { font-size: 0.65rem; }
.variant-stock.instock { color: var(--green); }
.variant-stock.outstock { color: var(--red-light); }

/* Brand Stage - Cascade Fade */
.brand-stage {
    position: relative;
    margin-bottom: 1.5rem;
}

.brand-all-row {
    margin-bottom: 0.75rem;
    transition: opacity 0.25s ease, max-height 0.3s ease;
    overflow: hidden;
    max-height: 50px;
}

.brand-all-row.is-hidden {
    opacity: 0;
    max-height: 0;
    margin-bottom: 0;
    pointer-events: none;
}

.brand-tag {
    display: inline-flex;
    align-items: center;
    padding: 0.4rem 1rem;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    color: var(--text-secondary);
    font-family: inherit;
    font-size: 0.85rem;
    cursor: pointer;
    background: var(--bg-card);
    text-decoration: none;
    white-space: nowrap;
    transition: opacity 0.3s ease, transform 0.3s ease, background 0.2s, color 0.2s, border-color 0.2s;
    position: relative;
}

.brand-tags-wrap .brand-tag .brand-fa { display: inline; }
.brand-tags-wrap .brand-tag .brand-en { display: none; text-transform: capitalize; }

/* حالت نمایش نام انگلیسی از admin/categories.php می‌آید (brandEnMode())
   و کلاس ben-off/ben-hover/ben-always روی خود .brand-tags-wrap می‌نشیند.
   پیش‌فرض 'off' است — دیگر هیچ رفتاری اضافه نمی‌شود و برچسب همیشه فارسی
   می‌ماند. قبلا این هاور بدون هیچ کلیدی همیشه روشن بود. */
.brand-tags-wrap.ben-hover .brand-tag:hover .brand-fa { display: none; }
.brand-tags-wrap.ben-hover .brand-tag:hover .brand-en { display: inline; }

.brand-tags-wrap.ben-always .brand-tag .brand-fa { display: none; }
.brand-tags-wrap.ben-always .brand-tag .brand-en { display: inline; }

.brand-tag:hover,
.brand-tag.active {
    border-color: var(--red-primary);
    background: var(--red-primary);
    color: #fff;
}

.brand-tags-wrap {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
}

.brand-tags-wrap .brand-tag {
    opacity: 1;
    transform: scale(1);
    visibility: visible;
}

/* وقتی محو شد: همه تگ‌های ردیف بالا، حتی خود برند فعال/sticky، پنهان
   می‌شوند — تگ فعال دیگر اینجا لازم نیست چون همان اسم، خودش را کنار دکمهٔ
   «همه برندها» به‌صورت #modelsTitle نشان می‌دهد (.brand-tag.active
   .models-title، بالاتر) و نگه‌داشتن هر دو یعنی یک برچسب تکراری روی صفحه.
   قبلا :not(.is-sticky) نگهش می‌داشت — [[batch9-fixes]]. */
.brand-tags-wrap.is-faded .brand-tag:not([data-id="0"]) {
    opacity: 0;
    transform: scale(0.85) translateY(-6px);
    visibility: hidden;
    pointer-events: none;
}

/* Stagger delays: each tag fades with increasing delay based on position */
.brand-tags-wrap.is-faded .brand-tag:nth-child(2)  { transition-delay: 0.00s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(3)  { transition-delay: 0.03s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(4)  { transition-delay: 0.06s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(5)  { transition-delay: 0.09s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(6)  { transition-delay: 0.12s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(7)  { transition-delay: 0.15s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(8)  { transition-delay: 0.18s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(9)  { transition-delay: 0.21s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(10) { transition-delay: 0.24s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(11) { transition-delay: 0.27s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(12) { transition-delay: 0.30s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(13) { transition-delay: 0.33s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(14) { transition-delay: 0.36s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(15) { transition-delay: 0.39s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(16) { transition-delay: 0.42s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(17) { transition-delay: 0.45s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(18) { transition-delay: 0.48s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(19) { transition-delay: 0.51s; }
.brand-tags-wrap.is-faded .brand-tag:nth-child(20) { transition-delay: 0.54s; }

/* Sticky brand stays and pulses */
.brand-tag.is-sticky {
    animation: stickyPulse 0.5s ease;
}

@keyframes stickyPulse {
    0%   { transform: scale(1); }
    40%  { transform: scale(1.08); }
    100% { transform: scale(1); }
}

/* Models reveal */
.models-reveal {
    max-height: 0;
    overflow: hidden;
    opacity: 0;
    margin-top: 0;
    transition: max-height 0.5s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.35s ease 0.1s, margin-top 0.5s ease;
}

.models-reveal.is-open {
    max-height: 400px;
    opacity: 1;
    margin-top: 1rem;
}

.models-head {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    margin-bottom: 0.75rem;
}

/* از یک <span> ساده به یک تگ برند واقعی (.brand-tag.active) تغییر کرد تا
   برند انتخاب‌شده واقعا «بیاید و کنار دکمهٔ همه‌برندها بنشیند» و ثابت
   بماند، نه این‌که فقط یک متن خام باشد — قبلا حرکت پروازی کلیک (در
   assets/js/main.js) به اینجا می‌رسید ولی بعد از رفرش صفحه به شکل متن
   ساده دیده می‌شد، انگار برگشته سرجایش. cursor پیش‌فرض .brand-tag (pointer)
   اینجا گمراه‌کننده است چون این عنصر کلیک‌پذیر نیست. */
.models-title {
    font-weight: bold;
    font-size: 1rem;
    cursor: default;
}

.models-list {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
}

.brand-tag--model {
    animation: popIn 0.4s ease backwards;
}

.models-list .brand-tag--model:nth-child(1)  { animation-delay: 0.05s; }
.models-list .brand-tag--model:nth-child(2)  { animation-delay: 0.10s; }
.models-list .brand-tag--model:nth-child(3)  { animation-delay: 0.15s; }
.models-list .brand-tag--model:nth-child(4)  { animation-delay: 0.20s; }
.models-list .brand-tag--model:nth-child(5)  { animation-delay: 0.25s; }
.models-list .brand-tag--model:nth-child(6)  { animation-delay: 0.30s; }
.models-list .brand-tag--model:nth-child(7)  { animation-delay: 0.35s; }
.models-list .brand-tag--model:nth-child(8)  { animation-delay: 0.40s; }
.models-list .brand-tag--model:nth-child(9)  { animation-delay: 0.45s; }
.models-list .brand-tag--model:nth-child(10) { animation-delay: 0.50s; }

@keyframes popIn {
    from {
        opacity: 0;
        transform: scale(0.7) translateY(8px);
    }
    to {
        opacity: 1;
        transform: scale(1) translateY(0);
    }
}

.brand-tag--back {
    background: var(--bg-input);
    border-color: var(--red-primary);
    color: var(--red-light);
    font-weight: bold;
    cursor: pointer;
}

.brand-tag--back:hover {
    background: var(--red-primary);
    color: #fff;
}

.brand-filter {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
    margin-bottom: 1.5rem;
}

.subcat-filter {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
    margin-bottom: 1.5rem;
}

/* Cart */
/* table-layout:fixed + عرض ثابت روی هر ستون — بدونش، با هر تغییر تعداد
   (کم/زیاد از استپر) طول رقم «جمع» یا برچسب جزئی/کلی عوض می‌شد و کل جدول
   عرض ستون‌ها را دوباره حساب می‌کرد؛ نتیجه‌اش پرش آزاردهندهٔ ردیف (به‌خصوص
   ستون محصول) بود، نه فقط جابه‌جایی همان عدد. عرض ستون‌ها اینجا و در
   .cart-table th/td نگه داشته می‌شود؛ ستون محصول تنها ستون بی‌عرض ثابت است و
   باقی‌ماندهٔ عرض را می‌گیرد. */
.cart-table {
    width: 100%;
    table-layout: fixed;
    border-collapse: collapse;
    background: var(--bg-card);
    border-radius: var(--radius);
    overflow: hidden;
    border: 1px solid var(--border-color);
}

/* ستون ۵ («حذف») یک دکمهٔ متنی است، نه فقط آیکون — عرض قبلی (56px) برایش
   کم بود و با overflow:hidden پایین‌تر نصفه دیده می‌شد. عرضش را از ستون
   قیمت/جمع (که برای عددهای معمولی به آن عرض نیاز نداشتند) قرض گرفتیم.
   ستون «قیمت واحد» هم بعدا عریض‌تر شد (130→190): با قیمت‌های هفت‌رقمی +
   واحد «تومان» + نشان جزئی/کلی بزرگ‌تر، ۱۳۰px کافی نبود و نشان به سطر
   بعد پرت می‌شد. برای جبران، ستون «جمع» به ۱۰۰px تنگ شده بود — ولی جمع
   بولد است (پهن‌تر از عدد معمولی) و در ۱۰۰px با overflow:hidden، خود
   واحد «تومان» بی‌صدا قطع می‌شد. پس «جمع» را هم به‌جای تنگ‌کردن، عریض نگه
   داشتیم و آن اضافه‌عرض یک‌سره از ستون محصول گرفته شد. */
.cart-table th:nth-child(2), .cart-table td:nth-child(2) { width: 190px; }
.cart-table th:nth-child(3), .cart-table td:nth-child(3) { width: 160px; }
.cart-table th:nth-child(4), .cart-table td:nth-child(4) { width: 140px; }
.cart-table th:nth-child(5), .cart-table td:nth-child(5) { width: 96px; }

/* شمارهٔ قیمت + نشان جزئی/کلی همیشه در یک سطر، با فاصلهٔ کم ثابت — بجای
   دو <span> پشت‌سرهم که وقتی جا کم می‌آمد نشان به سطر بعد می‌پرید. */
.cart-price-wrap { display: flex; align-items: baseline; flex-wrap: nowrap; gap: 0.35rem; }

.cart-table th {
    background: var(--bg-secondary);
    padding: 0.75rem;
    text-align: right;
    font-size: 0.85rem;
    color: var(--text-secondary);
    border-bottom: 1px solid var(--border-color);
}

.cart-table td {
    padding: 0.75rem;
    border-bottom: 1px solid var(--border-color);
    vertical-align: middle;
}
/* عمدا overflow:hidden روی خود <td> گذاشته نشده: دو بار (ستون حذف، بعد
   ستون جمع) باعث شد بخشی از محتوا — دکمهٔ حذف، بعد واحد «تومان» — به‌جای
   دیده‌شدن، بی‌صدا قطع و پنهان شود. table-layout:fixed به‌تنهایی برای
   جلوگیری از پرش ستون‌ها کافی است؛ اگر محتوای یک سلول به‌ندرت از عرضش
   بیشتر شود، بهتر است کمی روی سلول کناری بریزد تا این‌که ناپدید شود. */

.cart-unit-price, .cart-subtotal { white-space: nowrap; }

.cart-product-info {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

.cart-product-img {
    width: 60px;
    height: 60px;
    background: var(--bg-input);
    border-radius: var(--radius-sm);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.5rem;
    color: var(--text-muted);
    flex-shrink: 0;
}

.cart-product-img img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    border-radius: var(--radius-sm);
}

/* استپر تعداد سبد خرید — همان اجزای .qty-stepper صفحهٔ محصول، جمع‌وجورتر تا در
   ستون جدول جا شود. دکمه‌های +/− از نوع submit هستند (کارکرد کامل بدون جاوااسکریپت)
   و cart.js کلیک را می‌گیرد تا ردیف بدون رفرش به‌روز شود. */
.cart-update-form { position: relative; }

.cart-stepper { max-width: 100%; }
.cart-stepper .qty-field { width: 52px; font-size: 1rem; padding: 0.45rem 0.2rem; }
.cart-stepper .qty-step { width: 30px; flex: 0 0 30px; font-size: 1.05rem; }
/* در فاصلهٔ رفت‌وبرگشت درخواست، کلیک دوباره پذیرفته نشود */
.cart-stepper.is-busy { opacity: 0.55; pointer-events: none; }

/* دکمهٔ پیش‌فرض نامرئی فرم: Enter داخل فیلد باید تعداد تایپ‌شده را اعمال کند،
   نه دکمهٔ «−» را (اولین دکمهٔ submit، پیش‌فرض فرم است). */
.cart-enter-submit {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    border: 0;
    opacity: 0;
    overflow: hidden;
    pointer-events: none;
}

.cart-apply { margin-top: 0.4rem; }

/* واحد پول با فاصلهٔ خوانا از عدد (خروجی formatPriceUnit) */
.pnum { direction: ltr; unicode-bidi: embed; font-variant-numeric: tabular-nums; }
.tmn {
    display: inline-block;
    margin-right: 0.5rem;
    font-size: 0.82em;
    font-weight: 400;
    color: var(--text-muted);
    white-space: nowrap;
}
.cart-total .tmn, .pi-total .tmn { color: inherit; opacity: 0.75; }

.cart-subtotal {
    font-weight: bold;
    color: var(--red-light);
    white-space: nowrap;
}

.cart-price-type {
    font-size: 0.8rem;
    font-weight: 600;
    padding: 0.15rem 0.4rem;
    border-radius: var(--radius-sm);
    white-space: nowrap;
}

.cart-price-type.retail {
    background: color-mix(in srgb, var(--red-primary) 15%, transparent);
    color: var(--red-light);
}

.cart-price-type.wholesale {
    background: color-mix(in srgb, var(--price-wholesale) 15%, transparent);
    color: var(--price-wholesale);
}

.cart-empty {
    text-align: center;
    padding: 4rem 1rem;
    color: var(--text-muted);
}

.cart-empty-icon {
    font-size: 4rem;
    margin-bottom: 1rem;
}

.cart-empty-icon > .ic {
    width: 4rem; height: 4rem;
    stroke-width: 1.1; opacity: 0.5;
    color: var(--text-muted);
}

.cart-summary {
    margin-top: 1.5rem;
    display: flex;
    justify-content: flex-end;
    align-items: flex-end;
    gap: 1.25rem;
    flex-wrap: wrap;
}

.cart-total {
    font-size: 1.25rem;
    font-weight: bold;
    color: var(--red-light);
}

/* ===== جمع‌بندی سه‌ردیفهٔ سبد =====
   «جمع کالاها + هزینهٔ ارسال = مبلغ قابل پرداخت»، همان‌جا که مشتری روش ارسال
   را انتخاب می‌کند تا تغییر مبلغ را ببیند. مبلغ قابل پرداخت رنگ سومی دارد
   (طلایی) که نه رنگ جمع کالاها است و نه رنگ سبز هزینهٔ ارسال. */
.cart-sum {
    min-width: 268px;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 0.55rem 0.85rem;
}
.cart-sum-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1.25rem;
    padding: 0.3rem 0;
    font-size: 0.85rem;
    color: var(--text-secondary);
}
.cart-sum-row + .cart-sum-row { border-top: 1px solid var(--border-light); }
.cart-sum-row > span:first-child { display: inline-flex; align-items: center; gap: 0.3rem; }
.cart-sum-row > span:first-child > .ic { color: var(--text-muted); }
.cart-sum-row .tmn { color: inherit; opacity: 0.7; }
.cart-sum-row .cart-total-val { color: var(--text-primary); font-weight: 600; }
.cart-sum-row .cart-tax-val { color: var(--text-secondary); font-weight: 600; }
.cart-sum-row .cart-ship-val { color: #4ADE80; font-weight: 600; }
.cart-sum-row .cart-ship-val.is-soft { color: var(--text-muted); font-weight: 400; font-size: 0.92em; }
.cart-sum-row.is-pay {
    padding-top: 0.45rem;
    font-size: 0.95rem;
    font-weight: 700;
    color: var(--text-primary);
}
.cart-sum-row.is-pay .cart-pay-val { color: #FBBF24; font-size: 1.08rem; }

.cart-go { display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; }
.cart-go .btn.is-locked { pointer-events: none; opacity: 0.5; }
.cart-go-hint {
    flex-basis: 100%;
    display: flex;
    align-items: center;
    gap: 0.3rem;
    margin: 0;
    font-size: 0.72rem;
    color: #FBBF24;
}
.cart-go-hint[hidden] { display: none; }

/* ===== انتخاب روش ارسال + برآورد هزینه، در صفحهٔ سبد =====
   شهر از پروفایل، وزن از سبد؛ همان محاسبهٔ صفحهٔ تسویه. فشرده می‌ماند تا
   صفحهٔ سبد کشیده نشود. */
.cart-ship {
    margin-top: 1.25rem;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 0.85rem 1rem;
}
.cart-ship-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.6rem;
    flex-wrap: wrap;
    margin-bottom: 0.6rem;
}
.cart-ship-head b { display: inline-flex; align-items: center; gap: 0.3rem; font-size: 0.9rem; }
.cart-ship-req { color: var(--red-light); font-weight: 700; }
.cart-ship-city {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    font-size: 0.75rem;
    color: var(--text-secondary);
    background: var(--bg-input);
    border: 1px solid var(--border-color);
    border-radius: 999px;
    padding: 0.15rem 0.55rem;
}
.cart-ship-form.is-busy { opacity: 0.6; pointer-events: none; }
.cart-ship-rows {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 0.4rem;
}
.cart-ship-row {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    flex-wrap: wrap;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    padding: 0.4rem 0.55rem;
    font-size: 0.78rem;
    line-height: 1.6;
    cursor: pointer;
    transition: var(--transition);
}
.cart-ship-row:hover { border-color: var(--border-light); }
.cart-ship-row input[type="radio"] {
    flex: 0 0 auto;
    width: 0.95rem;
    height: 0.95rem;
    margin: 0;
    accent-color: var(--red-primary);
    cursor: pointer;
}
.cart-ship-row > .ic { flex: 0 0 auto; color: var(--text-muted); }
.cart-ship-row b { font-weight: 500; color: var(--text-primary); }
/* رنگ سبز برای رقم‌ها (خواستهٔ مدیر: «رنگ متن های قیمتش رو سبز کن») */
.cart-ship-row em { font-style: normal; font-weight: 700; color: #4ADE80; margin-inline-start: auto; }
.cart-ship-row em.is-soft { font-weight: 400; color: var(--text-muted); }
/* نشان محدودیت («مشهد») — زرد، با آیکن لوکیشن */
.cart-ship-row i.csr-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.15rem;
    font-style: normal;
    font-size: 0.66rem;
    font-weight: 600;
    padding: 0.05rem 0.35rem;
    border-radius: 999px;
    background: rgba(234, 179, 8, 0.14);
    border: 1px solid rgba(234, 179, 8, 0.35);
    color: #FBBF24;
    white-space: nowrap;
}
.cart-ship-row i.csr-badge > .ic { width: 0.74rem; height: 0.74rem; }
.cart-ship-row.is-best { border-color: var(--green); }
/* روشی که نرخ معلومی ندارد ولی محدود است: جای رقم را نشانش می‌گیرد */
.cart-ship-row.is-nocost .csr-price { display: none; }
.cart-ship-row.is-nocost i.csr-badge { margin-inline-start: auto; }
/* بعد از .is-best نوشته شده تا انتخاب مشتری بر «کم‌ترین هزینه» بچربد */
.cart-ship-row.is-on {
    border-color: var(--red-primary);
    background: linear-gradient(180deg, rgba(220, 38, 38, 0.10), rgba(220, 38, 38, 0.03));
}
/* روشی که به یک شهر محدود است و با شهر پروفایل مشتری نمی‌خواند: دیده می‌شود
   ولی انتخاب‌شدنی نیست (رادیوی داخلش disabled است، پس کلیک هم نمی‌گیرد) —
   خواستهٔ مدیر: «باید گزینه ارسال با پیک(مشهد) برایم غیر فعال نشون داده بشه».
   بعد از .is-on آمده تا انتخاب قدیمی همین روش رنگ «انتخاب‌شده» نگیرد. */
.cart-ship-row.is-off {
    opacity: 0.45;
    cursor: not-allowed;
    border-color: var(--border-color);
    background: var(--bg-secondary);
}
.cart-ship-row.is-off:hover { border-color: var(--border-color); }
.cart-ship-row.is-off input[type="radio"] { cursor: not-allowed; }
.cart-ship-note {
    display: flex;
    align-items: flex-start;
    gap: 0.35rem;
    margin: 0.55rem 0 0;
    font-size: 0.72rem;
    line-height: 1.8;
    color: var(--text-muted);
}
.cart-ship-note > .ic { flex: 0 0 auto; margin-top: 0.25rem; }
.cart-ship-note a { color: var(--red-light); }
.cart-ship-note b { color: var(--text-secondary); }
/* دلیل غیرفعال‌بودن روش محدود به شهر — همان قرمز ملایم .pay-off-note */
.cart-ship-note.is-off { color: #FCA5A5; }

@media (max-width: 560px) {
    .cart-sum { min-width: 0; width: 100%; }
    .cart-go { width: 100%; }
    .cart-go .btn { flex: 1 1 auto; justify-content: center; }
}

/* Checkout */
/* چیدمان دوستونه (خواستهٔ کاربر): خلاصهٔ سفارش تمام‌عرض بالا، بعد دو ستون —
   راست «مشخصات و آدرس»، چپ «روش پرداخت». روش ارسال از این صفحه برداشته شده و
   در سبد انتخاب می‌شود، پس دکمهٔ ثبت هم به انتهای همان ستون چپ آمده تا صفحه
   از پایین کشیده نشود. */
.checkout-form {
    max-width: 1040px;
    margin: 0 auto;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 1.5rem 2rem;
}
.checkout-cols {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.25rem;
    align-items: start;
    margin-bottom: 0;
}
/* در RTL اولین فرزند گرید سمت راست می‌نشیند، پس ستون مشخصات باید اول بیاید */
.checkout-box {
    background: var(--bg-primary);
    border: 1px solid var(--border-color);
    border-radius: 10px;
    padding: 0.9rem;
}
.checkout-box-title {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.88rem;
    font-weight: 600;
    color: var(--red-light);
    margin-bottom: 0.75rem;
}
.checkout-box .form-group:last-child { margin-bottom: 0; }
/* دکمهٔ ثبت بعد از کارت پرداخت می‌آید و فاصلهٔ خودش را دارد */
.checkout-col-side > .pay-picker { margin-bottom: 0; }
/* استان/شهر کنار هم */
.form-row-2 {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1rem;
}
.form-hint {
    display: flex;
    align-items: flex-start;
    gap: 0.3rem;
    margin-top: 0.35rem;
    font-size: 0.7rem;
    line-height: 1.7;
    color: var(--text-muted);
}
.form-hint > .ic { flex: 0 0 auto; margin-top: 0.2rem; }
/* روی صفحهٔ باریک ستون‌ها روی هم می‌آیند: اول مشخصات، بعد ارسال و پرداخت */
@media (max-width: 860px) {
    .checkout-form { padding: 1.25rem; }
    .checkout-cols { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 480px) {
    .form-row-2 { grid-template-columns: minmax(0, 1fr); gap: 0; }
}

.form-group {
    margin-bottom: 1.25rem;
}

.form-group label {
    display: block;
    margin-bottom: 0.4rem;
    color: var(--text-secondary);
    font-size: 0.9rem;
    font-weight: 500;
}

.form-control {
    width: 100%;
    padding: 0.6rem 0.75rem;
    background: var(--bg-input);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    color: var(--text-primary);
    font-family: inherit;
    font-size: 0.9rem;
    transition: border-color var(--transition);
}

.form-control:focus {
    border-color: var(--red-primary);
    outline: none;
}

textarea.form-control {
    resize: vertical;
    min-height: 100px;
}

.form-control::placeholder {
    color: var(--text-muted);
}

/* «انتخاب فایل» سفارشی — بجای متن انگلیسی مرورگر («No file chosen»/«Choose
   File»)، خود input واقعی نامرئی و دقیقا روی یک جعبهٔ استایل‌خورده کشیده
   می‌شود (کلیک/کیبورد هنوز خود input را می‌زند، پس همه‌جا کار می‌کند).
   با اسکریپت enhanceFilePickers در پایین صفحه (هم در admin/layout-bottom.php
   هم در includes/footer.php) خودکار روی هر input[type=file] اعمال می‌شود. */
.file-pick { position: relative; display: block; width: 100%; }
.file-pick-input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; margin: 0; }
.file-pick-box {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.6rem 0.75rem;
    background: var(--bg-input);
    border: 1px dashed var(--border-color);
    border-radius: var(--radius-sm);
    color: var(--text-muted);
    font-size: 0.85rem;
    transition: border-color var(--transition), color var(--transition);
}
.file-pick-box .ic { width: 1.05rem; height: 1.05rem; flex-shrink: 0; }
.file-pick:hover .file-pick-box { border-color: var(--red-primary); color: var(--text-secondary); }
.file-pick-box.has-file { color: var(--text-primary); border-style: solid; }
.file-pick-box .file-pick-txt { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.checkout-summary {
    background: var(--bg-secondary);
    border-radius: var(--radius);
    padding: 0.85rem 1rem;
    margin-bottom: 1.1rem;
}

.checkout-summary-item {
    display: flex;
    justify-content: space-between;
    padding: 0.5rem 0;
    border-bottom: 1px solid var(--border-color);
    font-size: 0.9rem;
}

.checkout-summary-item:last-child {
    border-bottom: none;
    font-weight: bold;
    color: var(--red-light);
    font-size: 1rem;
}

/* Success */
.success-page {
    text-align: center;
    padding: 4rem 1rem;
}

.success-icon {
    font-size: 5rem;
    color: var(--green);
    margin-bottom: 1rem;
}

.success-icon > .ic { width: 5rem; height: 5rem; stroke-width: 1.4; }

.success-page h2 {
    color: var(--green);
    margin-bottom: 0.5rem;
}

.success-page p {
    color: var(--text-secondary);
    margin-bottom: 1.5rem;
}

/* Admin Layout */
.admin-layout {
    max-width: 1200px;
    margin: 0 auto;
    padding: 1rem;
}

/* admin/orders.php: با عرض ۱۲۰۰px، جدول ۱۴۰۰px-عریض .orders-table داخل
   .tbl-scroll آرام آرام اسکرول می‌شد و ستون عملیات (کلیدهای «جزئیات»/
   «فاکتور»/«پرداخت شد») همیشه بیرون از دید اول می‌ماند — کاربر بدون
   اسکرول افقی آگاهانه اصلا کلیدها را نمی‌دید. با این کلاس کمکی، خود
   قاب صفحه (نه فقط جدول) عریض‌تر می‌شود تا جدول معمولا بدون اسکرول جا شود. */
.admin-layout.admin-layout--wide {
    max-width: 1500px;
}

.admin-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    background: var(--bg-secondary);
    padding: 1rem 1.5rem;
    border-radius: var(--radius);
    margin-bottom: 1.5rem;
    border: 1px solid var(--border-color);
}

.admin-menu {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
    margin-bottom: 1.5rem;
}

.admin-menu a {
    padding: 0.5rem 1rem;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    color: var(--text-secondary);
    font-size: 0.85rem;
    transition: all var(--transition);
}

.admin-menu a:hover,
.admin-menu a.active {
    background: var(--red-primary);
    color: #fff;
    border-color: var(--red-primary);
}

/* Admin Table */
.admin-table {
    width: 100%;
    border-collapse: collapse;
    background: var(--bg-card);
    border-radius: var(--radius);
    overflow: hidden;
    border: 1px solid var(--border-color);
}

.admin-table th {
    background: var(--bg-secondary);
    padding: 0.75rem;
    text-align: right;
    font-size: 0.85rem;
    color: var(--text-secondary);
}

.admin-table td {
    padding: 0.75rem;
    border-top: 1px solid var(--border-color);
    vertical-align: middle;
    font-size: 0.9rem;
}

.admin-table tr:hover td {
    background: rgba(220, 38, 38, 0.05);
}

/* تب‌های سربرگ فهرست (مثلا «همه/پرداخت‌شده/...» در admin/orders.php).
   این کلاس‌ها اصلا در style.css نبودند — فقط در <style> درون‌خطی
   admin/layout-top.php تعریف شده بودند، پس هر صفحهٔ ادمین مستقل (بدون
   layout-top.php، مثل admin/orders.php که <!DOCTYPE> خودش را دارد) این
   کلاس‌ها را بی‌استایل، همه روی یک خط، نشان می‌داد. همان تعریف اینجا هم
   تکرار شده تا هر دو دسته صفحه درست دیده شوند. */
.cust-tabs { display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap; margin-bottom: 1rem; }
.cust-tab { display: inline-flex; align-items: center; gap: 0.4rem; padding: 0.45rem 0.85rem; border: 1px solid var(--border-color); border-radius: 999px; color: var(--text-secondary); text-decoration: none; font-size: 0.82rem; transition: all 0.15s; }
.cust-tab:hover { border-color: var(--red-primary); color: var(--text-primary); }
.cust-tab.active { background: var(--red-primary); border-color: var(--red-primary); color: #fff; }
.cust-tab-n { background: rgba(0, 0, 0, 0.25); border-radius: 999px; padding: 0 0.4rem; font-size: 0.72rem; }

/* جدول پهن داخل قاب خودش اسکرول شود، نه کل صفحه */
.tbl-scroll {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

/* جدول روش‌های ارسال و نرخ‌نامه: ستون‌ها جای نفس‌کشیدن داشته باشند
   («صفحشو کشیده تر کن خیلی رفته توی هم توی هم»). این min-width با قاب
   ۷۰۰ پیکسلی .admin-form-full جا نمی‌شد و نوار اسکرول می‌ساخت؛ حالا بخش
   ارسال کلاس ff-wide دارد (admin/layout-top.php) و قاب تا ۱۳۲۰ باز می‌شود،
   پس اسکرول فقط روی پنجره‌های واقعا باریک می‌ماند. */
.ship-mtable,
.ship-rtable { min-width: 680px; }

/* جدول فهرست سفارش‌ها: ۹ ستون، بعضی‌شان (پرداخت/ارسال) چند خط توضیح کوچک
   هم دارند و ستون عملیات چند دکمه/فرم کنار هم. یک min-width ساده کافی
   نبود — چیدمان auto هنوز عرض را از ستون‌های کوتاه (وضعیت/پرداخت) به نفع
   ستون‌های بلندتر (مشتری/موبایل) می‌گرفت و «در انتظار بررسی» را دو خط
   می‌کرد. حالا table-layout:fixed با عرض صریح هر ستون (کلاس‌های ot-*،
   نه nth-child، چون پرداخت/ارسال شرطی‌اند و ترتیبشان ثابت نیست) — فقط
   ستون «مشتری» عرض ثابت ندارد و باقی‌ماندهٔ عرض را می‌گیرد. قابش هم
   .tbl-scroll است، پس در پنجرهٔ باریک به‌جای فشرده‌شدن، اسکرول افقی می‌خورد. */
/* .ot-actions باز هم عریض‌تر شد: بدترین حالت سه دکمه‌ست («جزئیات» + «فاکتور»
   با آیکون + یکی از «تأیید واریز»/«دریافت چک»/«پرداخت شد» — این آخری‌ها
   طولانی‌ترند) که با ۲۳۰px هنوز جا نمی‌شدند و می‌شکستند. */
.orders-table { table-layout: fixed; min-width: 1400px; }
.orders-table .ot-no     { width: 120px; }
.orders-table .ot-mobile { width: 120px; }
.orders-table .ot-amount { width: 130px; }
.orders-table .ot-status { width: 120px; }
.orders-table .ot-pay    { width: 170px; }
.orders-table .ot-ship   { width: 150px; }
.orders-table .ot-date   { width: 120px; }
.orders-table .ot-actions { width: 340px; }
/* عمدا overflow:hidden روی کل سلول‌ها گذاشته نمی‌شود — طبق تجربهٔ همین
   هفته با جدول سبد خرید ([[batch9-fixes]])، این ترکیب بدون white-space:
   nowrap عملا کاری نمی‌کند ولی جایی که واقعا کاری هم بکند، محتوای واقعی
   را بی‌صدا قطع می‌کند. فقط سلول‌های تک‌خطی کوتاه (شماره/موبایل/مبلغ/تاریخ)
   nowrap می‌گیرند؛ اگر همان‌ها هم به‌ندرت جا کم آوردند، روی ستون کنار
   می‌ریزند، نه این‌که ناپدید شوند. */
.orders-table .ot-no, .orders-table .ot-mobile,
.orders-table .ot-amount, .orders-table .ot-date { white-space: nowrap; }

/* استثنای عمدی روی قاعدهٔ بالا (خواستهٔ کاربر ۲۰۲۶-۰۹-۰۵: «اگر مبلغ یا اسم
   محصول زیاد بشه سطر کشیده و به‌هم نریزه، فلکسیبل باشه»): «مشتری» و «مبلغ»
   هیچ سقفی روی طول محتوایشان ندارند (برخلاف شماره/موبایل/تاریخ که فرمت
   ثابتی دارند) — نام خیلی بلند یا رقم خیلی بزرگ می‌تواند به ستون کناری
   سرریز کند و کل سطر را به‌هم بریزد (دقیقا همان اتفاقی که برای ستون «شماره»
   با فرمت تازه‌اش افتاد). این دو، برخلاف بقیه، با الیپسیس (…) قطع می‌شوند؛
   مقدار کامل با title روی خود سلول هنوز با نگه‌داشتن موس در دسترس است —
   نه گم می‌شود (چون در HTML هست) نه سطر را می‌شکند. */
.orders-table .ot-cust, .orders-table .ot-amount {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ستون عملیات: دکمه‌ها (لینک‌های <a> با آیکون + دکمه‌های داخل فرم) پیش‌تر
   inline-flex بودند و روی خط متن هم‌تراز می‌شدند — دکمه‌ای که آیکون داشت
   (فاکتور) کمی بالاتر/پایین‌تر از دکمهٔ ساده (جزئیات) می‌نشست («کلیدها هم
   تراز نیست»). با یک ردیف flex به‌جای تکیه‌کردن به baseline، همه از وسط
   هم‌تراز می‌شوند. */
.ot-actions-row { display: flex; align-items: center; flex-wrap: wrap; gap: 0.35rem; }
.ot-actions-row form { margin: 0; }

.ship-mtable th,
.ship-rtable th { padding: 0.8rem 0.9rem; white-space: nowrap; }

.ship-mtable td,
.ship-rtable td { padding: 0.9rem; vertical-align: top; }

.ship-mtable .cat-checkbox,
.ship-rtable .cat-checkbox { line-height: 1.7; }

/* استپر واحد وزن در نرخ‌نامه (کم/زیاد با + و −) */
.wt-stepper {
    display: flex;
    align-items: stretch;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    background: var(--bg-input);
    overflow: hidden;
}

.wt-stepper:focus-within { border-color: var(--red-primary); }

.wt-stepper .wt-btn {
    flex: 0 0 30px;
    border: none;
    background: var(--bg-secondary);
    color: var(--text-secondary);
    font-size: 1rem;
    line-height: 1;
    cursor: pointer;
    transition: var(--transition);
}

.wt-stepper .wt-btn:hover {
    background: var(--red-primary);
    color: #fff;
}

.wt-stepper .wt-field {
    flex: 1 1 auto;
    min-width: 0;
    margin: 0 !important;
    border: none !important;
    border-radius: 0 !important;
    background: transparent !important;
    text-align: center;
    padding: 0.45rem 0.25rem !important;
}

.wt-stepper .wt-field:focus { outline: none; }

@media (max-width: 640px) {
    .ship-mtable,
    .ship-rtable { min-width: 620px; }
}

/* ===== بخش «نرخ‌نامه‌های ارسال» (settings.php?sec=shiprate) =====
   خواستهٔ مدیر: «هر چی اضافه می‌کنم رو اضافه می‌کنه توی همون صفحه، این‌جوری
   صفحه خیلی در آینده بزرگ می‌شه… به‌صورت مرتب نشون بده که خیلی طولانی نشه و
   چیدمانش ریزتر باشه». پس این مقیاس عمدا ریز است و ارتفاع فهرست با
   .rt-scroll سقف دارد تا افزودن صد شهر هم صفحه را بلند نکند. */
.rt-card {
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 0.9rem 1rem;
    margin-bottom: 1rem;
}

.rt-top {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    flex-wrap: wrap;
    padding-bottom: 0.6rem;
    margin-bottom: 0.75rem;
    border-bottom: 1px solid var(--border-color);
}

.rt-top h3 {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    font-size: 0.88rem;
    color: var(--red-primary);
    margin: 0;
}

.rt-sum {
    font-size: 0.72rem;
    color: var(--text-muted);
}

.rt-sum b { color: var(--text-primary); }

.rt-jump {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    margin-inline-start: auto;
    font-size: 0.74rem;
    color: var(--red-primary);
    text-decoration: none;
    border: 1px solid rgba(220, 38, 38, 0.35);
    border-radius: 999px;
    padding: 0.2rem 0.6rem;
    transition: var(--transition);
}

.rt-jump:hover { background: var(--red-primary); color: #fff; }

.rt-empty {
    font-size: 0.78rem;
    color: var(--text-secondary);
    line-height: 1.9;
    margin: 0;
}

.rt-empty a { color: var(--red-primary); text-decoration: none; }

/* نوار فیلتر: جستجوی شهر + تراشهٔ هر روش */
.rt-bar {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
    margin-bottom: 0.6rem;
}

.rt-bar .rt-q {
    width: 190px;
    flex: 0 0 auto;
    padding: 0.35rem 0.6rem;
    font-size: 0.78rem;
}

.rt-chips {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    flex-wrap: wrap;
}

.rt-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.22rem 0.55rem;
    background: transparent;
    border: 1px solid var(--border-color);
    border-radius: 999px;
    color: var(--text-secondary);
    font-family: inherit;
    font-size: 0.73rem;
    cursor: pointer;
    transition: var(--transition);
}

.rt-chip:hover { border-color: var(--red-primary); color: var(--text-primary); }

.rt-chip.is-on {
    background: var(--red-primary);
    border-color: var(--red-primary);
    color: #fff;
}

.rt-chip i {
    font-style: normal;
    background: rgba(0, 0, 0, 0.25);
    border-radius: 999px;
    padding: 0 0.32rem;
    font-size: 0.68rem;
}

.rt-chip > .ic { width: 0.9rem; height: 0.9rem; }

/* قاب فهرست: ارتفاع سقف‌دار، پس صفحه با هر شهر تازه بلندتر نمی‌شود */
.rt-scroll {
    max-height: 27rem;
    overflow: auto;
    -webkit-overflow-scrolling: touch;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
}

.rt-table {
    width: 100%;
    min-width: 640px;
    border-collapse: collapse;
    font-size: 0.78rem;
}

.rt-table th {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--bg-card);
    padding: 0.45rem 0.5rem;
    text-align: right;
    white-space: nowrap;
    font-size: 0.72rem;
    font-weight: 600;
    color: var(--text-muted);
    border-bottom: 1px solid var(--border-color);
}

.rt-table td {
    padding: 0.3rem 0.5rem;
    border-top: 1px solid var(--border-color);
    vertical-align: middle;
}

.rt-table tr:hover td { background: rgba(220, 38, 38, 0.05); }

.rt-table .rt-c { text-align: center; width: 1%; white-space: nowrap; }

.rt-m {
    white-space: nowrap;
    color: var(--text-secondary);
}

.rt-m > .ic { vertical-align: -2px; margin-inline-end: 0.25rem; }

.rt-warn {
    font-style: normal;
    display: inline-block;
    margin-inline-start: 0.35rem;
    background: rgba(234, 179, 8, 0.15);
    color: #FBBF24;
    border: 1px solid rgba(234, 179, 8, 0.35);
    border-radius: 999px;
    padding: 0 0.35rem;
    font-size: 0.66rem;
}

/* ورودی‌های ریز درون‌جدولی */
.rt-in {
    padding: 0.3rem 0.45rem !important;
    font-size: 0.78rem !important;
    margin: 0 !important;
}

.rt-cost { max-width: 120px; }

.rt-hint {
    display: block;
    font-style: normal;
    font-size: 0.66rem;
    color: var(--text-muted);
    margin-top: 0.15rem;
}

.rt-ck { width: 15px; height: 15px; cursor: pointer; accent-color: var(--red-primary); }

.rt-del {
    display: inline-flex;
    color: var(--red-light);
    text-decoration: none;
    opacity: 0.75;
    transition: var(--transition);
}

.rt-del:hover { opacity: 1; }

/* استپر ریز درون‌جدولی */
.wt-mini { max-width: 108px; }
.wt-mini .wt-btn { flex: 0 0 24px; font-size: 0.85rem; }
.wt-mini .wt-field { padding: 0.28rem 0.15rem !important; font-size: 0.78rem !important; }

.rt-none,
.rt-foot {
    font-size: 0.72rem;
    color: var(--text-muted);
    line-height: 1.9;
    margin: 0.55rem 0 0;
}

.rt-none > .ic { vertical-align: -2px; }
.rt-foot b { color: var(--text-secondary); }

.rt-note { margin-top: 0.85rem; }

.rt-note label {
    display: block;
    font-size: 0.76rem;
    color: var(--text-secondary);
    margin-bottom: 0.3rem;
}

.rt-note .form-control { max-width: 640px; font-size: 0.82rem; padding: 0.45rem 0.6rem; }

/* راهنمای بلند، تاشده تا صفحه را بلند نکند */
.rt-help { margin-top: 0.85rem; }

.rt-help > summary {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    cursor: pointer;
    font-size: 0.76rem;
    color: var(--red-primary);
    list-style: none;
}

.rt-help > summary::-webkit-details-marker { display: none; }
.rt-help > summary::marker { content: ''; }

.rt-help > div {
    margin-top: 0.5rem;
    padding: 0.7rem 0.85rem;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    font-size: 0.74rem;
    color: var(--text-muted);
    line-height: 2;
}

.rt-help a { color: var(--red-primary); text-decoration: none; }

/* فرم افزودن: همه فیلدها در یک ردیف فشرده */
.rt-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
    gap: 0.55rem 0.7rem;
    align-items: end;
}

.rt-f > label {
    display: block;
    font-size: 0.72rem;
    color: var(--text-secondary);
    margin-bottom: 0.25rem;
}

.rt-f .form-control { padding: 0.35rem 0.5rem; font-size: 0.8rem; }
.rt-req { color: var(--red-light); }
.rt-f-go { align-self: end; }
.rt-f-go .btn { width: 100%; }

@media (max-width: 640px) {
    .rt-bar .rt-q { width: 100%; }
    .rt-scroll { max-height: 22rem; }
}

/* Admin Dashboard */
.dashboard-cards {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 1rem;
    margin-bottom: 1.5rem;
}

.dash-card {
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 1.5rem;
    text-align: center;
}

.dash-card-value {
    font-size: 2rem;
    font-weight: bold;
    color: var(--red-primary);
    margin-bottom: 0.5rem;
}

.dash-card-label {
    color: var(--text-muted);
    font-size: 0.85rem;
}

/* Status Badges */
.status-badge {
    display: inline-block;
    padding: 0.2rem 0.6rem;
    border-radius: var(--radius-sm);
    font-size: 0.8rem;
    font-weight: 500;
    white-space: nowrap;
}

.status-pending {
    background: rgba(251, 191, 36, 0.15);
    color: #FBBF24;
}

.status-confirmed {
    background: rgba(59, 130, 246, 0.15);
    color: #3B82F6;
}

.status-shipped {
    background: rgba(16, 185, 129, 0.15);
    color: var(--green);
}

.status-cancelled {
    background: rgba(220, 38, 38, 0.15);
    color: var(--red-light);
}

/* Login Page */
.login-page {
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
}

.login-form {
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 2rem;
    width: 100%;
    max-width: 400px;
}

.login-form h2 {
    text-align: center;
    margin-bottom: 1.5rem;
}

/* Admin form */
.admin-form {
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 2rem;
    max-width: 700px;
}

.admin-form h2 {
    margin-bottom: 1.5rem;
}

.image-preview {
    width: 150px;
    height: 150px;
    background: var(--bg-input);
    border-radius: var(--radius);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 3rem;
    color: var(--text-muted);
    margin-top: 0.5rem;
    overflow: hidden;
}

.image-preview img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.cat-checkboxes {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
}

.cat-checkbox {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.9rem;
}

.cat-checkbox input[type="checkbox"] {
    accent-color: var(--red-primary);
}

/* نوار اعتماد بالای فوتر (خواستهٔ کاربر ۲۰۲۶-۰۹-۱۹ با تصویر نمونه از یک
   سایت دیگر) — یک نوار کوتاه و کاملا وسط‌چین، بلافاصله بالای خود فوتر
   (نه داخلش؛ includes/footer.php آن را قبل از تگ <footer> رندر می‌کند)،
   با هم‌رنگی کامل با تم فعال سایت: پس‌زمینهٔ --bg-secondary (هم‌رنگ خود
   فوتر) + آیکون‌ها در دایرهٔ کم‌رنگ --red-primary (بدون رنگ ثابت که با
   تم‌های تیره/روشن مختلف ناهماهنگ شود). حداکثر عرض کمی کوچک‌تر از
   .footer-top (۱۱۰۰ به‌جای ۱۲۰۰) و ارتفاع فشرده (padding کم، بدون
   زیرعنوان‌های چندخطی) طبق خواستهٔ صریح «خیلی بزرگ نباشه». */
.feature-bar {
    background: var(--bg-secondary);
    border-bottom: 1px solid var(--border-color);
    padding: 0.7rem 1rem;
}
.feature-bar-inner {
    max-width: 1100px;
    margin: 0 auto;
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
}
.feature-bar-item {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    padding: 0.3rem 1.4rem;
    border-inline-start: 1px solid var(--border-color);
    min-width: 0;
}
.feature-bar-item:first-child { border-inline-start: none; }
.feature-bar-ic {
    flex: 0 0 auto;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    background: color-mix(in srgb, var(--red-primary) 12%, transparent);
    color: var(--red-primary);
    display: flex;
    align-items: center;
    justify-content: center;
}
.feature-bar-ic .ic { width: 19px; height: 19px; }
.feature-bar-text { display: flex; flex-direction: column; gap: 0.1rem; min-width: 0; overflow-wrap: anywhere; }
.feature-bar-text b { font-size: 0.8rem; color: var(--text-primary); font-weight: 600; }
.feature-bar-text span { font-size: 0.7rem; color: var(--text-muted); }

/* Footer */
.site-footer {
    background: var(--bg-secondary);
    border-top: 2px solid var(--accent-secondary);
    margin-top: 1.5rem;
    padding: 1.5rem 1rem 0.85rem;
}

/* خواستهٔ کاربر (دور سوم، ۲۰۲۶-۰۹-۰۷): «متن فوتر رو بردی زیر هم، فوتر
   به‌هم‌ریخته، اون چهار عنوان رو توی یک سطر ببر». علت: دور دوم `.footer-row`
   را CSS Grid کرده بود (`grid-template-columns:minmax(0,1fr) auto`) —
   وقتی یک گرید دیگر (`.footer-container`، همان auto-fit) داخل یک ترک
   grid تودرتو می‌نشیند، اندازه‌گیری خودکار عرض ترک (intrinsic sizing) در
   مرورگرها به‌اندازهٔ کافی قابل‌اعتماد نیست و همان ۴ ستون متن را به هم
   می‌ریخت. جایگزین شد با همان الگوی فلکس ساده و امتحان‌پس‌داده‌ای که خود
   `.footer-container` سال‌ها بی‌مشکل با آن کار می‌کرد — فقط این‌بار
   `.footer-trust` به‌جای این‌که داخل `.footer-top` باشد (دور اول)، کنارش و
   بیرون از max-width قرار گرفت تا هم لبهٔ واقعی فوتر را بگیرد (خواستهٔ دور
   دوم) هم دیگر گرید تودرتو نداشته باشیم. */
.footer-row {
    display: flex;
    align-items: flex-start;
    gap: 1rem;
}
.footer-top {
    flex: 1 1 auto;
    min-width: 0;
    max-width: 1200px;
    margin: 0 auto;
}
/* خواستهٔ کاربر (۲۰۲۶-۰۹-۰۷، چند دور پیاپی): «فوتر خیلی کشیده شده کوتاه‌ترش
   کن»، بعد «تماس با ما رو ببر یکم سمت راست‌تر، ما را دنبال کنید هم همچنین،
   فاصله‌ها یک‌اندازه باشه». دور اول (کاهش minmax/gap گرید) فقط جلوی شکستن
   زودهنگام ردیف را گرفت، ریشهٔ اصلی نابرابری فاصله‌ها را حل نکرد: خود گرید
   auto-fit با ستون‌های 1fr همیشه کل عرض `.footer-container` را پر می‌کند —
   با اسکرین‌شات واقعی معلوم شد چون محتوای هر ستون طول متفاوتی دارد (متن
   کوتاه «فروشگاه برادران» در برابر لیست بلند «دسترسی سریع» در برابر ردیف
   آیکون‌های «ما را دنبال کنید»)، فضای اضافی هر ستون (بعد از پرشدن با محتوای
   خودش) به‌شکل نامساوی بین ستون‌ها پخش می‌شد و فاصلهٔ دیداری هرکدام با
   بغلی‌اش فرق می‌کرد، هرچند خود track ها هم‌عرض بودند. راه‌حل واقعی: از
   گرید کشسان به فلکس با عرض طبیعی (نه ۱fr کشیده) تغییر کرد — هر ستون فقط
   به‌اندازهٔ محتوای خودش عرض می‌گیرد، `gap` یک عدد ثابت بین همهٔ آن‌هاست
   (نه یک نسبت از فضای خالی)، پس فاصلهٔ هر دو ستون کنار هم واقعا یکسان
   می‌شود؛ فضای اضافی هم به‌جای پخش‌شدن بین ستون‌ها، یک‌جا ته صف (چپ‌ترین
   نقطه، کنار نمادهای اعتماد) می‌ماند — چون پیش‌فرض flex بدون justify-content
   از ابتدای محور (راست، در RTL) می‌چیند. */
.footer-container {
    display: flex;
    flex-wrap: wrap;
    gap: 1.75rem 2.5rem;
}
.footer-col {
    flex: 0 1 auto;
    min-width: 140px;
}
.footer-col.footer-about {
    max-width: 260px;
}
/* هر نماد دقیقا ۳×۳ سانتی‌متر (خواستهٔ کاربر، کوچک‌شده از ۴×۴). تعداد
   ستون‌های این گرید از PHP می‌آید (`--ft-cols`، در includes/footer.php:
   حداقل تعداد نماد فعال و ۲) — نه یک عدد ثابت — تا با ۳ یا ۴ نماد دقیقا
   «دوتا بالا دوتا پایین» بشود (auto-flow پیش‌فرض گرید، بدون کد اضافه)، ولی
   با ۱ یا ۲ نماد خانهٔ خالی کنار نماد تنها نماند. `margin-left:4cm` هم
   خواستهٔ کاربر است («یک ۴ سانت از گوشهٔ سمت چپ فوتر فاصله بده») — روی
   `padding-left:1rem` موجود `.site-footer` جمع می‌شود، پس فاصلهٔ واقعی از
   لبهٔ صفحه کمی بیشتر از ۴ سانت است. فقط زیر breakpoint موبایل (۷۶۸px،
   پایین‌تر در همین فایل)، به‌خاطر تنگی عرض، کاشی‌ها زیر متن می‌افتند. */
.footer-trust {
    flex: 0 0 auto;
    align-self: center;
    margin-left: 4cm;
    display: grid;
    grid-template-columns: repeat(var(--ft-cols, 2), 3cm);
    gap: 0.5rem;
}
.footer-trust-item {
    width: 3cm;
    height: 3cm;
    display: flex;
    align-items: center;
    justify-content: center;
    background: #fff;
    border: 1px solid var(--border-color);
    border-radius: 8px;
    padding: 3px;
    overflow: hidden;
    transition: border-color var(--transition);
}
a.footer-trust-item:hover { border-color: var(--red-primary); }
.footer-trust-item img { max-width: 100%; max-height: 100%; object-fit: contain; display: block; }

.footer-col h4 {
    color: var(--text-primary);
    margin-bottom: 0.55rem;
    font-size: 1rem;
}

.footer-col p,
.footer-col a {
    display: flex;
    align-items: flex-start;
    gap: 0.45rem;
    color: var(--text-muted);
    font-size: 0.85rem;
    margin-bottom: 0.28rem;
}

/* آیکون ستون‌های فوتر: هم‌تراز با خط اول متن، متن چندخطی زیر خودش می‌شکند */
.footer-col p > .ic,
.footer-col a > .ic { margin-top: 0.18em; color: var(--text-secondary); }
.footer-col a:hover > .ic { color: var(--red-primary); }
.footer-about h4 { display: flex; align-items: center; gap: 0.4rem; }

.footer-col a:hover {
    color: var(--red-primary);
}

.footer-bottom {
    max-width: 1200px;
    margin: 1rem auto 0;
    padding-top: 0.75rem;
    border-top: 1px solid var(--border-color);
    text-align: center;
    color: var(--text-muted);
    font-size: 0.8rem;
}

/* Footer — social + hours */
.footer-about h4 .logo-icon { color: var(--red-primary); }
.footer-hours { color: var(--text-secondary) !important; }
/* کاشی‌های پیام‌رسان: همیشه در یک خط (nowrap) و دقیقا هم‌اندازه.
   flex:0 1 34px + aspect-ratio:1 → همه با هم و به یک نسبت کوچک می‌شوند، پس هیچ‌وقت اختلاف اندازه ندارند. */
.footer-social {
    display: flex; flex-flow: row nowrap; align-items: center;
    gap: 0.3rem; width: 100%;
}
/* گزینشگر با ‎.footer-social‎ شروع می‌شود چون کاشی‌ها داخل ‎.footer-col‎ هستند و
   قانون ‎.footer-col a‎ (وزن بالاتر) با ‎align-items:flex-start‎ لوگو را به بالای
   کاشی می‌چسباند؛ با این وزن، ‎center‎ برندهٔ هر دو محور می‌شود. */
.footer-social .social-chip {
    display: inline-flex; align-items: center; justify-content: center;
    flex: 0 1 34px; width: 34px; min-width: 0; aspect-ratio: 1 / 1;
    gap: 0; line-height: 0;
    padding: 0; border-radius: 9px; text-decoration: none;
    background: rgba(255, 255, 255, 0.03);
    border: 1px solid var(--border-color);
    color: var(--text-secondary) !important;
    margin-bottom: 0 !important; overflow: hidden;
    transition: all var(--transition);
}
/* برچسب برند فقط برای screen-reader (نامش در title/aria-label هم هست) */
.social-sr {
    position: absolute !important; width: 1px; height: 1px;
    padding: 0; margin: -1px; overflow: hidden;
    clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0;
}
.social-chip:hover { border-color: var(--red-primary); color: var(--red-primary) !important; transform: translateY(-2px); }
.social-instagram:hover { border-color: #E1306C; color: #E1306C !important; }
.social-telegram:hover { border-color: #229ED9; color: #229ED9 !important; }
.social-whatsapp:hover { border-color: #25D366; color: #25D366 !important; }
.social-twitter:hover  { border-color: #1DA1F2; color: #1DA1F2 !important; }
.social-bale:hover     { border-color: #0ACA9B; color: #0ACA9B !important; }
.social-gap:hover      { border-color: #714AE8; color: #714AE8 !important; }
.social-rubika:hover   { border-color: #794387; color: #794387 !important; }
.social-eitaa:hover    { border-color: #FF7A00; color: #FF7A00 !important; }
/* لوگوهای SVG درون کاشی — قاب ثابت و یکسان؛ درصدی تا با کوچک‌شدن کاشی هم نسبت حفظ شود.
   viewBox هر لوگو روی کرانهٔ محتوای خودش تنظیم شده، پس ۶۲٪ برای همه یک نتیجه می‌دهد. */
.social-chip .social-ic {
    width: 62%; height: 62%;
    flex: 0 0 auto; display: block;
    overflow: visible; vertical-align: middle;
}
.social-chip .social-ic text { font-family: inherit; }

/* ===== لایهٔ تزیینی گوشه‌های صفحهٔ اصلی (پشت محتوا) ===== */
.home-decor { position: fixed; inset: 0; z-index: -1; pointer-events: none; overflow: hidden; }
.home-decor .decor-corner {
    position: absolute;
    width: clamp(150px, 19vw, 250px); height: clamp(150px, 19vw, 250px);
    color: var(--red-primary); opacity: 0.13;
    will-change: transform;
}
.home-decor .decor-tl { top: -34px; left: -34px; }
.home-decor .decor-tr { top: -34px; right: -34px; color: var(--text-muted); opacity: 0.10; }
.home-decor .decor-bl { bottom: -34px; left: -34px; color: var(--text-muted); opacity: 0.10; }
.home-decor .decor-br { bottom: -34px; right: -34px; }
.home-decor .decor-spin { animation: decor-spin 60s linear infinite; }
.home-decor .decor-spin-rev { animation: decor-spin 60s linear infinite reverse; }
@keyframes decor-spin { to { transform: rotate(360deg); } }

/* پیستون‌های بالا-پایین‌رو (طرح «موتور و پیستون») */
.home-decor .decor-pump { animation: decor-pump 2.6s ease-in-out infinite; }
.home-decor .decor-br.decor-pump { animation-delay: -1.3s; }
@keyframes decor-pump {
    0%, 100% { transform: translateY(-10px); }
    50%      { transform: translateY(10px); }
}

/* ماشینی که از راست به چپ، از پشت بنرها رد می‌شود */
.home-decor .decor-car {
    position: absolute; left: 0; bottom: clamp(48px, 11vh, 150px);
    width: clamp(190px, 24vw, 330px);
    color: var(--red-primary); opacity: 0.16;
    animation: decor-drive 26s linear infinite;
    will-change: transform;
}
.home-decor .decor-car svg { display: block; width: 100%; height: auto; overflow: visible; }
.home-decor .decor-car .car-wheel {
    transform-box: fill-box; transform-origin: center;
    animation: decor-spin 1.3s linear infinite;
}
@keyframes decor-drive {
    0%   { transform: translateX(106vw) scaleX(-1); }
    100% { transform: translateX(-45vw) scaleX(-1); }
}

/* نوار جادهٔ متحرک (هم‌تراز با خط زمین ماشین) */
.home-decor .decor-road {
    position: absolute; left: 0; right: 0; bottom: clamp(48px, 11vh, 150px);
    height: 4px; overflow: hidden;
    color: var(--red-primary); opacity: 0.14;
}
.home-decor .decor-road::before {
    content: ""; position: absolute; left: 0; right: 0; bottom: 0;
    height: 1px; background: currentColor; opacity: 0.45;
}
.home-decor .decor-road-line {
    position: absolute; top: 0; bottom: 1px; left: 0; width: 200%;
    background: repeating-linear-gradient(90deg, currentColor 0 46px, transparent 46px 104px);
    animation: decor-road-move 2.6s linear infinite;
    will-change: transform;
}
@keyframes decor-road-move { to { transform: translateX(-104px); } }

/* قطعات شناور (پیچ، فنر، قطره روغن…) با شنای آرام */
.home-decor .decor-float {
    position: absolute;
    width: clamp(46px, 5.4vw, 78px); height: clamp(46px, 5.4vw, 78px);
    color: var(--red-primary); opacity: 0.11;
    animation: decor-bob 10s ease-in-out infinite;
    will-change: transform;
}
.home-decor .decor-f1 { top: 16%; left: 4%;   animation-duration: 8s;    animation-delay: -1s; }
.home-decor .decor-f2 { top: 31%; right: 5%;  animation-duration: 11s;   animation-delay: -3s; color: var(--text-muted); opacity: 0.09; }
.home-decor .decor-f3 { top: 53%; left: 7%;   animation-duration: 9.5s;  animation-delay: -5s; }
.home-decor .decor-f4 { top: 66%; right: 8%;  animation-duration: 12s;   animation-delay: -2s; color: var(--text-muted); opacity: 0.09; }
.home-decor .decor-f5 { top: 80%; left: 3%;   animation-duration: 10.5s; animation-delay: -6s; }
.home-decor .decor-f6 { top: 9%;  right: 15%; animation-duration: 13s;   animation-delay: -4s; opacity: 0.08; }
@keyframes decor-bob {
    0%, 100% { transform: translateY(0) rotate(-5deg); }
    50%      { transform: translateY(-26px) rotate(5deg); }
}

/* مدار نئون — خطوط درخشان با جریان متحرک */
.home-decor.decor-neon .decor-corner { opacity: 0.17; filter: drop-shadow(0 0 7px currentColor); }
.home-decor.decor-neon .decor-trace {
    stroke-dasharray: 12 10;
    animation: decor-dash 2.8s linear infinite;
}
@keyframes decor-dash { to { stroke-dashoffset: -66; } }

@media (prefers-reduced-motion: reduce) {
    .home-decor .decor-spin, .home-decor .decor-spin-rev,
    .home-decor .decor-pump, .home-decor .decor-float,
    .home-decor .decor-car .car-wheel,
    .home-decor .decor-road-line,
    .home-decor.decor-neon .decor-trace { animation: none; }
    .home-decor .decor-car { display: none; }
}
@media (max-width: 1100px) { .home-decor { display: none; } }

/* Header — customer account link */
.account-link {
    display: flex; align-items: center; gap: 0.4rem;
    padding: 0.4rem 0.6rem; border-radius: var(--radius-sm);
    color: var(--text-secondary); text-decoration: none;
    font-size: 0.85rem; transition: all var(--transition);
}
.account-link:hover { background: var(--bg-input); color: var(--red-primary); }
.account-icon { font-size: 1.1rem; }
.account-name { max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 640px) { .account-name, .account-link .badge-partner, .account-link .badge-retail, .account-link .badge-pending { display: none; } }

/* Auth (customer login / OTP) */
.auth-card {
    max-width: 420px; margin: 2rem auto;
    background: var(--bg-card); border: 1px solid var(--border-color);
    border-radius: var(--radius-lg); padding: 2rem;
}
.auth-title { font-size: 1.3rem; margin-bottom: 0.4rem; text-align: center; display: flex; align-items: center; justify-content: center; gap: 0.45rem; }
.auth-sub { color: var(--text-muted); font-size: 0.85rem; text-align: center; margin-bottom: 1.25rem; }
.auth-form .form-group { margin-bottom: 1rem; }
.auth-code { letter-spacing: 0.5em; text-align: center; font-size: 1.3rem; font-weight: bold; }
.auth-alt { text-align: center; color: var(--text-muted); font-size: 0.82rem; margin-top: 0.75rem; }
.auth-test { background: rgba(234,179,8,0.12); border: 1px solid rgba(234,179,8,0.35); color: #FBBF24; }

/* Account page */
.account-head { display: flex; justify-content: space-between; align-items: center; gap: 1rem; flex-wrap: wrap; }
.account-grid { display: grid; grid-template-columns: 1.2fr 1fr; gap: 1.25rem; margin-top: 1rem; align-items: start; }
.account-box { background: var(--bg-card); border: 1px solid var(--border-color); border-radius: var(--radius); padding: 1.25rem; }
.account-box-title { font-size: 0.95rem; color: var(--red-primary); margin-bottom: 1rem; }
.account-orders { display: flex; flex-direction: column; gap: 0.6rem; }
.account-order { border: 1px solid var(--border-color); border-radius: var(--radius-sm); padding: 0.6rem 0.75rem; }
.account-order-row { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.25rem; }
.account-order-row:last-child { margin-bottom: 0; }
.order-status { font-size: 0.72rem; padding: 0.15rem 0.5rem; border-radius: 999px; }
.status-pending { background: rgba(234,179,8,0.15); color: #FBBF24; }
.status-confirmed { background: rgba(37,99,235,0.15); color: #3B82F6; }
.status-shipped { background: rgba(16,185,129,0.15); color: var(--green); }
.status-cancelled { background: rgba(220,38,38,0.15); color: var(--red-light); }
@media (max-width: 768px) { .account-grid { grid-template-columns: 1fr; } }

/* Pagination */
.pagination {
    display: flex;
    justify-content: center;
    gap: 0.35rem;
    margin-top: 2rem;
    flex-wrap: wrap;
}

.pagination a,
.pagination span {
    padding: 0.35rem 0.6rem;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    color: var(--text-secondary);
    font-size: 0.78rem;
    text-decoration: none;
    min-width: 32px;
    text-align: center;
}

.pagination a:hover {
    background: var(--red-primary);
    color: #fff;
    border-color: var(--red-primary);
}

.pagination .current {
    background: var(--red-primary);
    color: #fff;
    border-color: var(--red-primary);
}

/* Responsive */
@media (max-width: 768px) {
    .header-container {
        flex-direction: column;
        gap: 0.75rem;
    }

    .header-search {
        width: 100%;
    }

    .product-detail {
        grid-template-columns: 1fr;
        padding: 1rem;
    }

    /* یک‌ستونه: تصویر نباید تمام‌عرض و غول‌آسا شود */
    .product-gallery {
        width: 100%;
        max-width: 360px;
        margin-inline: auto;
    }

    .product-detail-image {
        min-height: 0;
    }

    .product-detail-prices {
        flex-direction: column;
    }

    .cart-table {
        font-size: 0.8rem;
        table-layout: auto;
    }

    /* عرض‌های ثابت دسکتاپ (برای جلوگیری از پرش ستون‌ها) اینجا معنی ندارند —
       هر ردیف در موبایل خودش یک بلوک مستقل و تمام‌عرض می‌شود، نه ستون جدول. */
    .cart-table td:nth-child(2), .cart-table td:nth-child(3),
    .cart-table td:nth-child(4), .cart-table td:nth-child(5) {
        width: auto;
    }

    .cart-table thead {
        display: none;
    }

    .cart-table tr {
        display: block;
        padding: 0.75rem;
        border-bottom: 1px solid var(--border-color);
    }

    .cart-table td {
        display: flex;
        justify-content: space-between;
        align-items: center;
        padding: 0.5rem 0;
        border: none;
    }

    .cart-table td::before {
        content: attr(data-label);
        font-weight: bold;
        color: var(--text-muted);
        font-size: 0.8rem;
    }

    .cart-summary {
        flex-direction: column;
        align-items: stretch;
    }

    /* موبایل: هر ردیف flex است، پس استپر باید عرض ثابت خودش را نگه دارد.
       دکمه‌ها هم کمی بزرگ‌تر می‌شوند تا با انگشت راحت زده شوند. */
    .cart-stepper { flex: 0 0 auto; }
    .cart-stepper .qty-step { width: 38px; flex: 0 0 38px; font-size: 1.15rem; }
    .cart-stepper .qty-field { width: 56px; padding: 0.55rem 0.2rem; }
    .cart-update-form { flex: 0 0 auto; }

    /* کاشی‌های پیام‌رسان در موبایل ستون پهن‌تری دارند → می‌توانند بزرگ‌تر بمانند
       (هم‌وزن قانون پایه، وگرنه به آن می‌بازد) */
    .footer-social .social-chip { flex: 0 1 40px; width: 40px; }

    /* نمادهای اعتماد در موبایل عرض کافی برای «کنار متن» ندارند — ردیف فلکس
       .footer-row می‌شکند، کاشی‌ها زیر متن و وسط‌چین می‌شوند. */
    .footer-row { flex-wrap: wrap; }
    .footer-trust { flex-basis: 100%; justify-content: center; margin: 0.5rem 0 0; }

    /* نوار اعتماد بالای فوتر: در عرض تنگ، ۴ کارت کنار هم با خط جداکننده جا
       نمی‌شود؛ به یک گرید ۲در۲ (بدون خط جداکننده، که بین ردیف‌های شکسته
       بی‌معنا می‌شد) فشرده می‌شود تا هم خوانا بماند هم کوتاه. */
    .feature-bar-inner { display: grid; grid-template-columns: 1fr 1fr; gap: 0.6rem 0.4rem; justify-content: stretch; }
    .feature-bar-item { border-inline-start: none; padding: 0.2rem; justify-content: flex-start; }

    .product-grid {
        grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
    }

    .dashboard-cards {
        grid-template-columns: 1fr 1fr;
    }
}

@media (max-width: 480px) {
    .product-grid {
        grid-template-columns: 1fr 1fr;
        gap: 0.75rem;
    }

    .product-card-image {
        font-size: 3rem;
    }

    .product-card-body {
        padding: 0.75rem;
    }

    .product-card-title {
        font-size: 0.85rem;
    }

    .login-form {
        margin: 0 1rem;
    }
}

select.form-control {
    appearance: auto;
}

select.form-control option {
    background: var(--bg-input);
    color: var(--text-primary);
}

.product-detail-actions form {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
    opacity: 1;
}

/* ================= Home / Banners page ================= */
.banners-page { padding: 1rem 0 2rem; }

.banners-wrap {
    display: flex;
    flex-direction: column;
    gap: 1.25rem;
}

.banners-row {
    display: grid;
    gap: 1.25rem;
}
.banners-row.row-2 { grid-template-columns: repeat(2, 1fr); }
.banners-row.row-4 { grid-template-columns: repeat(4, 1fr); }

.banner {
    display: block;
    position: relative;
    width: 100%;
    min-height: 140px;
    border-radius: var(--radius-lg);
    overflow: hidden;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    transition: transform var(--transition), border-color var(--transition), box-shadow var(--transition);
}
.banner:hover {
    transform: translateY(-3px);
    border-color: var(--red-primary);
    box-shadow: var(--shadow-lg);
}

.banner-img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* جای‌گیر خالی (وقتی تصویری آپلود نشده) */
.banner.is-empty {
    border-style: dashed;
    border-color: var(--border-light);
    background:
        repeating-linear-gradient(45deg, rgba(255,255,255,0.02) 0 12px, transparent 12px 24px),
        linear-gradient(145deg, #1b2333, #141b28);
}
.banner.is-empty:hover { transform: none; box-shadow: none; border-color: var(--red-primary); }

.banner-ph {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    text-align: center;
    padding: 1rem;
    color: var(--text-muted);
}
.banner-ph-icon { font-size: 2rem; opacity: 0.7; line-height: 1; display: block; }
.banner-ph-icon > .ic { width: 2.2rem; height: 2.2rem; vertical-align: 0; stroke-width: 1.4; }
.banner-ph-label { font-size: 1.05rem; font-weight: 700; color: var(--text-secondary); }
.banner-ph-size {
    font-size: 1rem;
    font-weight: 700;
    color: var(--red-light);
    direction: ltr;
    letter-spacing: 0.5px;
}
.banner-ph-file {
    font-size: 0.72rem;
    color: var(--text-muted);
    direction: ltr;
    background: rgba(0,0,0,0.35);
    padding: 0.15rem 0.5rem;
    border-radius: 4px;
}

/* ===== ورود دوبخشی: «ورود مشتری» / «ورود همکار» ===== */
.auth-card-wide { max-width: 520px; }
.auth-tabs {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.5rem;
    margin-bottom: 1.25rem;
}
.auth-tab {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.2rem;
    padding: 0.7rem 0.5rem;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md, 8px);
    background: var(--bg-input);
    color: var(--text-secondary);
    text-decoration: none;
    font-family: inherit;
    font-size: 0.9rem;
    font-weight: 600;
    cursor: pointer;
    transition: all var(--transition);
}
.auth-tab:hover { border-color: var(--red-primary); color: var(--text-primary); }
.auth-tab.active {
    border-color: var(--red-primary);
    background: rgba(220, 38, 38, 0.12);
    color: var(--red-light);
}
.auth-tab-ic { font-size: 1.25rem; line-height: 1; display: block; }
.auth-tab-ic > .ic { width: 1.5rem; height: 1.5rem; vertical-align: 0; }
.auth-tab-sub { font-size: 0.68rem; font-weight: 400; color: var(--text-muted); }
.auth-tab.active .auth-tab-sub { color: var(--text-secondary); }
.auth-note {
    font-size: 0.75rem;
    line-height: 1.7;
    color: var(--text-muted);
    background: rgba(255,255,255,0.03);
    border: 1px solid var(--border-color);
    border-radius: 8px;
    padding: 0.6rem 0.75rem;
    margin-bottom: 1rem;
}
.badge-partner, .badge-retail, .badge-pending {
    display: inline-block;
    font-size: 0.7rem;
    font-weight: 600;
    padding: 0.15rem 0.5rem;
    border-radius: 999px;
    white-space: nowrap;
}
.badge-partner { background: rgba(34,197,94,0.15); color: #4ADE80; border: 1px solid rgba(34,197,94,0.35); }
.badge-retail  { background: rgba(148,163,184,0.15); color: #CBD5E1; border: 1px solid rgba(148,163,184,0.3); }
.badge-pending { background: rgba(234,179,8,0.15); color: #FBBF24; border: 1px solid rgba(234,179,8,0.35); }

/* ---------- صفحهٔ پیگیری تسویهٔ همکاران (admin/partner-settlements.php) ----------
   هر همکار یک ردیف بازشونده — با ترفند چک‌باکس (نه details/summary) چون
   داخل سطر خلاصه یک لینک واقعی («پروندهٔ همکار») هم هست؛ در details تو در تو
   کلیک روی آن لینک هم‌زمان جمع/بازشدن سطر را هم فعال می‌کرد (تجربهٔ
   part-categories.php — [[part-categories-admin-crud]]). این‌جا لینک بیرون
   <label> است، پس فقط خودش کار می‌کند. */
.pset-row { border-bottom: 1px solid var(--border-color); }
.pset-row:last-child { border-bottom: none; }
.pset-sum-wrap { display: flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1rem; }
.pset-sum { flex: 1 1 auto; min-width: 0; display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; cursor: pointer; }
.pset-name { display: flex; align-items: center; gap: 0.5rem; flex: 1 1 220px; min-width: 0; font-size: 0.88rem; color: var(--text-primary); flex-wrap: wrap; }
.pset-company { font-size: 0.72rem; color: var(--text-muted); }
.pset-mobile { font-size: 0.78rem; color: var(--text-muted); direction: ltr; }
.pset-count { font-size: 0.75rem; color: var(--text-muted); white-space: nowrap; }
.pset-debt { font-size: 0.95rem; font-weight: 700; color: var(--red-light); white-space: nowrap; }
.pset-caret { flex: 0 0 auto; color: var(--text-muted); transition: transform 0.15s; }
.pset-toggle:checked ~ .pset-sum-wrap .pset-caret { transform: rotate(180deg); }
.pset-toggle:checked ~ .pset-sum-wrap { background: rgba(220, 38, 38, 0.05); }
.pset-body { display: none; padding: 0 1rem 1rem; }
.pset-toggle:checked ~ .pset-body { display: block; }
@media (max-width: 700px) {
    .pset-sum-wrap { flex-wrap: wrap; }
    .pset-sum { order: 1; }
}

/* ---------- صفحهٔ عکس خودروها (admin/car-images.php) ----------
   یک کارت جدولی برای هر مدل: بندانگشتی + نام + فرم آپلود کوچک + حذف.
   بندانگشتی روی یک پس‌زمینهٔ خط‌چین (نه توپر) نشان داده می‌شود تا خود
   شفافیت عکس (نتیجهٔ normalizeBrandLogo) قابل‌تشخیص باشد. */
.ci-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 0.75rem; padding-bottom: 0.5rem; }
.ci-card { display: flex; flex-direction: column; align-items: center; gap: 0.4rem; padding: 0.75rem; border: 1px solid var(--border-color); border-radius: var(--radius); text-align: center; }
.ci-thumb {
    width: 100%; height: 90px; display: flex; align-items: center; justify-content: center;
    border: 1px dashed var(--border-color); border-radius: var(--radius-sm);
    background-image: linear-gradient(45deg, var(--bg-input) 25%, transparent 25%), linear-gradient(-45deg, var(--bg-input) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--bg-input) 75%), linear-gradient(-45deg, transparent 75%, var(--bg-input) 75%);
    background-size: 16px 16px; background-position: 0 0, 0 8px, 8px -8px, -8px 0;
    color: var(--text-muted);
}
.ci-thumb img { max-width: 100%; max-height: 100%; object-fit: contain; }
.ci-name { font-size: 0.82rem; color: var(--text-primary); }
.ci-form { display: flex; flex-direction: column; gap: 0.35rem; width: 100%; }
.ci-file { font-size: 0.7rem; max-width: 100%; }

/* ===== نمودار فروش (SVG درون‌خطی) ===== */
.chart-wrap { width: 100%; overflow-x: auto; overflow-y: hidden; padding-bottom: 0.25rem; }
.chart-wrap .sales-chart { min-width: 560px; display: block; }
.chart-wrap .sales-chart text { font-family: inherit; }
.chart-empty { padding: 2rem 1rem; text-align: center; color: var(--text-muted); font-size: 0.85rem; }

/* ===== صفحهٔ محصول: راهنمای قیمت کلی خودکار ===== */
.qty-hint {
    margin-top: 0.5rem;
    font-size: 0.78rem;
    line-height: 1.6;
    color: var(--text-muted);
}
.qty-hint.is-wholesale { color: var(--price-wholesale); }
.qty-hint b { color: inherit; }

/* استپر تعداد: فیلد بزرگ‌تر + دکمهٔ کم/زیاد.
   فیلد از نوع text است (نه number) تا ارقام فارسی تایپ‌شده هم خوانده و لاتین شوند. */
.qty-stepper {
    display: inline-flex;
    align-items: stretch;
    flex: 0 0 auto;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    background: var(--bg-input);
    overflow: hidden;
}
.qty-stepper:focus-within { border-color: var(--red-primary); }
.qty-stepper .qty-field {
    width: 62px;
    padding: 0.5rem 0.25rem;
    background: transparent;
    border: none;
    color: var(--text-primary);
    text-align: center;
    font-family: inherit;
    font-size: 1.05rem;
    font-weight: 600;
    letter-spacing: 0.5px;
}
.qty-stepper .qty-field:focus { outline: none; }
.qty-step {
    width: 34px;
    flex: 0 0 34px;
    background: rgba(255, 255, 255, 0.04);
    border: none;
    color: var(--text-secondary);
    font-size: 1.15rem;
    line-height: 1;
    cursor: pointer;
    font-family: inherit;
    transition: all var(--transition);
}
.qty-step:hover { background: var(--red-primary); color: #fff; }
.qty-step:active { transform: scale(0.94); }

/* دکمهٔ میان‌بر «تعداد را به حداقل کلی برسان» */
.qty-jump {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    margin-top: 0.5rem;
    padding: 0.4rem 0.8rem;
    font-family: inherit;
    font-size: 0.78rem;
    cursor: pointer;
    color: var(--price-wholesale);
    background: color-mix(in srgb, var(--price-wholesale) 10%, transparent);
    border: 1px dashed color-mix(in srgb, var(--price-wholesale) 50%, transparent);
    border-radius: 999px;
    transition: all var(--transition);
}
.qty-jump:hover { background: color-mix(in srgb, var(--price-wholesale) 20%, transparent); border-style: solid; }
.qty-jump[hidden] { display: none; }

/* خواستهٔ کاربر ۲۰۲۶-۰۹-۰۸: کادر مبلغ کل حالا بالای کلید «افزودن به سبد
   خرید» است (نه زیرش، ریز و کم‌رنگ مثل قبل) — یک کادر برجسته و مرتب که
   با تغییر تعداد فقط همین عدد زنده به‌روز می‌شود؛ بدون «مجموع X عدد»،
   بدون «واحدی ...» — فقط برچسب کوتاه + مبلغ. */
.qty-total {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.6rem;
    margin: 0.7rem 0;
    padding: 0.85rem 1.1rem;
    border-radius: var(--radius);
    background: color-mix(in srgb, var(--red-primary) 10%, transparent);
    border: 2px solid color-mix(in srgb, var(--red-primary) 30%, transparent);
}
.qty-total:empty { display: none; }
.qty-total .qty-total-lbl { font-size: 0.85rem; color: var(--text-secondary); }
.qty-total .qty-total-num {
    font-size: 1.3rem;
    font-weight: bold;
    color: var(--red-light);
    display: flex;
    align-items: baseline;
    gap: 0.35rem;
}
.qty-total .qty-total-unit { font-size: 0.8rem; font-weight: normal; color: var(--text-muted); }
.qty-total.is-wholesale { border-color: color-mix(in srgb, var(--price-wholesale) 45%, transparent); background: color-mix(in srgb, var(--price-wholesale) 10%, transparent); }
.qty-total.is-wholesale .qty-total-num { color: var(--price-wholesale); }

/* پنج افکت مستقل روی «مبلغ کل» (خواستهٔ کاربر ۲۰۲۶-۰۹-۲۳: چند افکت،
   یک‌هرکدوم انتخاب‌شدنی، بدون باگ) — پیاده‌سازی JS در product.php
   (paintTotal/doRoll/doCount/doFade/doPulse). «غلتش» همان طراحی اثبات‌شدهٔ
   v3 قدیم است (کل عدد یک واحد پیوسته، نه رقم‌به‌رقم — رجوع کنید به
   [[rolling-price-effect]] برای تاریخچهٔ ۳ دور رفع باگ آن)، فقط حالا
   crop/height آن به‌جای خود .qty-total-figure روی کلاس ویژهٔ .is-roll
   است تا وقتی افکت دیگری فعال است این محدودیت‌ها اثری نداشته باشند.
   همیشه چپ‌به‌راست چون خود عدد لاتین است، حتی داخل صفحهٔ راست‌به‌چپ. */
.qty-total-figure { display: inline-block; direction: ltr; vertical-align: bottom; }
.qty-total-figure.is-roll { height: 1.5em; overflow: hidden; position: relative; white-space: nowrap; }
.qty-total-figure.is-roll .roll-col { display: flex; flex-direction: column; transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1); }
.qty-total-figure.is-roll .roll-row { display: block; height: 1.5em; line-height: 1.5; white-space: pre; }

/* «محو و پدیدار شدن» — فقط opacity، بدون تغییر اندازه/چیدمان. */
.qty-total-figure.qty-fade-out { opacity: 0; transition: opacity 0.2s ease; }

/* «پرش + درخشش» — یک پرش کوچک روی خود عدد + یک حلقهٔ نور دور کل کادر. */
@keyframes qtyPulseAnim { 0% { transform: scale(1); } 35% { transform: scale(1.12); } 100% { transform: scale(1); } }
.qty-total-num.qty-pulse-anim { animation: qtyPulseAnim 0.35s ease; }
@keyframes qtyFlashAnim { 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--red-primary) 55%, transparent); } 100% { box-shadow: 0 0 0 10px color-mix(in srgb, var(--red-primary) 0%, transparent); } }
.qty-total.qty-flash-anim { animation: qtyFlashAnim 0.6s ease-out; }
.qty-total.is-wholesale.qty-flash-anim { animation-name: qtyFlashAnimGreen; }
@keyframes qtyFlashAnimGreen { 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--price-wholesale) 55%, transparent); } 100% { box-shadow: 0 0 0 10px color-mix(in srgb, var(--price-wholesale) 0%, transparent); } }

/* نشان «این قیمت اعمال شد» درون جعبهٔ فعال (ارتفاع ثابت تا جعبه‌ها نپرند) */
.price-box-state {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    min-height: 1.3rem;
    margin-top: 0.4rem;
    font-size: 0.73rem;
    font-weight: 600;
    color: var(--text-primary);
}
.price-box-state > .ic { width: 0.95rem; height: 0.95rem; }
.price-box.retail.price-active .price-box-state { color: var(--red-light); }
.price-box.wholesale.price-active .price-box-state { color: var(--price-wholesale); }
.price-box { cursor: pointer; }
.price-box:focus-visible { outline: 2px solid var(--red-light); outline-offset: 2px; }

@media (max-width: 900px) {
    .banners-row.row-4 { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 560px) {
    .banners-row.row-2,
    .banners-row.row-4 { grid-template-columns: 1fr; }
    .banner-ph-label { font-size: 0.95rem; }
}

/* ===== درگاه پرداخت: انتخاب روش، نشان وضعیت، اطلاعات کارت ===== */
/* انتخاب روش پرداخت در صفحهٔ تسویه */
.pay-picker {
    background: var(--bg-primary);
    border: 1px solid var(--border-color);
    border-radius: 10px;
    padding: 0.9rem;
    margin-bottom: 1.25rem;
}
.pay-picker-title {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.88rem;
    font-weight: 600;
    color: var(--red-light);
    margin-bottom: 0.75rem;
}
.pay-opt {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    padding: 0.7rem 0.8rem;
    margin-bottom: 0.5rem;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: 10px;
    cursor: pointer;
    transition: border-color 0.15s, background 0.15s;
}
.pay-opt:last-child { margin-bottom: 0; }
.pay-opt:hover { border-color: var(--red-primary); }
.pay-opt.is-on {
    border-color: var(--red-primary);
    background: linear-gradient(180deg, rgba(220, 38, 38, 0.1), rgba(220, 38, 38, 0.02)), var(--bg-secondary);
}
.pay-opt input[type="radio"] { margin-top: 0.25rem; accent-color: var(--red-primary); flex: 0 0 auto; }
.pay-opt-ic { flex: 0 0 auto; display: inline-flex; color: var(--text-muted); }
.pay-opt-ic > .ic { width: 1.4rem; height: 1.4rem; }
.pay-opt.is-on .pay-opt-ic { color: var(--red-light); }
.pay-opt-body { display: flex; flex-direction: column; gap: 0.15rem; min-width: 0; }
.pay-opt-body b { font-size: 0.88rem; color: var(--text-primary); }
.pay-opt-body small { font-size: 0.75rem; color: var(--text-muted); line-height: 1.7; }

/* شماره‌کارت/به‌نام گزینهٔ «کارت به کارت» — قبلا یک جملهٔ تک‌خطی بود که با
   دو نشان (badge) وسطش (یکی dir=ltr) روی موبایل و در کنار بقیهٔ متن به‌هم
   می‌ریخت. حالا هر مقدار روی سطر خودش، به شکل برچسب/مقدار. */
.pay-card-mini { display: flex; flex-direction: column; gap: 0.2rem; margin: 0.05rem 0 0.1rem; }
.pay-card-mini-row { display: flex; align-items: center; gap: 0.4rem; font-size: 0.72rem; }
/* عرض ثابت روی برچسب («شمارهٔ کارت» بلندتر از «به نام») تا نشان مقدار در
   هر دو سطر از یک نقطه شروع شود؛ قبلا هرکدام با عرض متغیر متن کنارش
   می‌رفت جلو و «نامیزون» به نظر می‌رسید. */
.pay-card-mini-row > span { color: var(--text-muted); flex: 0 0 4.3rem; }
.pay-card-mini-row > b { font-size: 0.75rem; padding: 0.02rem 0.28rem; }

/* قاعدهٔ «ارسال ↔ پرداخت»: روش‌های پرداخت ناسازگار با روش ارسال انتخاب‌شده
   کم‌رنگ و غیرفعال می‌شوند (رادیوی داخلشان disabled است، پس کلیک هم نمی‌گیرند)
   و فقط همان‌ها یک خط توضیح کوچک نشان می‌دهند. */
.pay-rule {
    display: flex;
    align-items: flex-start;
    gap: 0.35rem;
    margin: -0.25rem 0 0.7rem;
    padding: 0.45rem 0.6rem;
    font-size: 0.74rem;
    line-height: 1.8;
    color: #FCD34D;
    background: rgba(234, 179, 8, 0.1);
    border: 1px solid rgba(234, 179, 8, 0.3);
    border-radius: var(--radius-sm);
}
.pay-rule > .ic { flex: 0 0 auto; margin-top: 0.28rem; }
.pay-opt.is-off { opacity: 0.45; cursor: not-allowed; }
.pay-opt.is-off:hover { border-color: var(--border-color); }
.pay-off-note { display: none; }
.pay-opt.is-off .pay-off-note { display: block; color: #FCA5A5; }

/* ===== خلاصهٔ سفارش: نام روش ارسال انتخاب‌شده در سبد + لینک تغییر =====
   انتخاب روش ارسال از این صفحه برداشته شده (خواستهٔ مدیر: «از توی صفحه بعد
   ثبت سفارش بردار که دیگه صفحه بعد فقط ثبت سفارش نهایی باشه»)، پس این‌جا فقط
   نام روش و یک راه برگشت به سبد نشان داده می‌شود. */
.cs-name {
    font-style: normal;
    margin-inline-start: 0.35rem;
    font-size: 0.76rem;
    color: var(--text-secondary);
}
.cs-name > b {
    font-weight: 600;
    color: #FBBF24;
}
.cs-edit {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
    margin-inline-start: 0.4rem;
    font-size: 0.71rem;
    color: var(--text-muted);
    border-bottom: 1px dashed var(--border-color);
}
.cs-edit:hover { color: var(--red-light); border-bottom-color: var(--red-light); }
.cs-edit > .ic { width: 0.8rem; height: 0.8rem; }

/* ===== اطلاعات واریز کارت به کارت، در همین صفحه =====
   خواستهٔ مدیر: «یک گزینه کارت به کارت رو هم بذار که بتونه اطلاعات پرداخت رو
   وارد کنه … 4 رقم آخر کارت . مبلغ و تاریخ». کادر فقط با انتخاب همان گزینه باز
   می‌شود و در دو ستون فشرده می‌نشیند تا صفحه بلند نشود. */
.pay-c2c {
    margin-top: 0.6rem;
    padding: 0.6rem 0.7rem;
    background: rgba(234, 179, 8, 0.07);
    border: 1px solid rgba(234, 179, 8, 0.3);
    border-radius: 8px;
}
.pc2-t {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    margin-bottom: 0.5rem;
    font-size: 0.8rem;
    font-weight: 700;
    color: #FBBF24;
}
.pc2-note {
    display: flex;
    align-items: flex-start;
    gap: 0.3rem;
    margin: 0 0 0.55rem;
    font-size: 0.71rem;
    line-height: 1.85;
    color: var(--text-secondary);
}
.pc2-note > .ic { flex: 0 0 auto; margin-top: 0.3rem; }
.pc2-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0.5rem 0.6rem;
}
.pc2-grid .form-group { margin-bottom: 0; }
.pc2-grid label {
    display: block;
    margin-bottom: 0.25rem;
    font-size: 0.71rem;
    color: var(--text-secondary);
}
.pc2-grid .form-control {
    padding: 0.45rem 0.55rem;
    font-size: 0.8rem;
}
/* شناسهٔ واریز بلندترین مقدار است و تنها می‌ماند */
.pc2-grid .form-group:first-child { grid-column: 1 / -1; }
@media (max-width: 560px) {
    .pc2-grid { grid-template-columns: minmax(0, 1fr); }
}

/* ===== تقویم شمسی «تاریخ واریز» و انتخابگر ساعت =====
   خواستهٔ مدیر: «تاریخ رو از روی تقویم فارسی بهم بده / و زمان رو هم با یک ساعت
   و دقیقه قابل انتخاب». هیچ کتابخانه‌ای در کار نیست؛ این فقط شکل‌دادن به کادر
   بازشوی تقویم و به دو انتخابگر ساعت/دقیقه است. */
.jdp { position: relative; display: flex; align-items: stretch; gap: 0.3rem; }
.jdp .form-control { flex: 1 1 auto; min-width: 0; }
.jdp-btn {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    background: var(--bg-input);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    color: var(--text-secondary);
    cursor: pointer;
    transition: var(--transition);
}
.jdp-btn:hover { color: #FBBF24; border-color: rgba(234, 179, 8, 0.5); }
/* کادر بازشو روی بقیهٔ فرم شناور است تا کارت واریز کوتاه بماند */
.jdp-pop {
    position: absolute;
    z-index: 40;
    top: calc(100% + 0.3rem);
    right: 0;
    width: 15rem;
    padding: 0.5rem;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    box-shadow: var(--shadow-lg);
}
.jdp-pop[hidden] { display: none; }
.jdp-h {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.3rem;
    margin-bottom: 0.4rem;
}
.jdp-h b { font-size: 0.78rem; font-weight: 700; color: var(--text-primary); }
.jdp-nav {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.5rem;
    height: 1.5rem;
    background: var(--bg-input);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    color: var(--text-secondary);
    cursor: pointer;
    transition: var(--transition);
}
.jdp-nav:hover { color: var(--text-primary); border-color: var(--border-light); }
.jdp-nav > .ic { width: 0.85rem; height: 0.85rem; }
/* هفت ستون؛ در RTL خود مرورگر «ش» را سمت راست می‌گذارد */
.jdp-w, .jdp-g { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 0.15rem; }
.jdp-w { margin-bottom: 0.2rem; }
.jdp-w i {
    font-style: normal;
    text-align: center;
    font-size: 0.64rem;
    color: var(--text-muted);
}
.jdp-g button,
.jdp-g span {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 1.65rem;
    font-family: inherit;
    font-size: 0.72rem;
    background: none;
    border: 1px solid transparent;
    border-radius: var(--radius-sm);
    color: var(--text-primary);
}
.jdp-g button { cursor: pointer; transition: var(--transition); }
.jdp-g button:hover { background: var(--bg-input); border-color: var(--border-light); }
/* روزهای آینده: واریز نمی‌تواند در آینده انجام شده باشد */
.jdp-g span.is-off { color: var(--text-muted); opacity: 0.35; }
.jdp-g button.is-today { border-color: rgba(234, 179, 8, 0.5); color: #FBBF24; }
.jdp-g button.is-on {
    background: var(--red-primary);
    border-color: var(--red-primary);
    color: #fff;
    font-weight: 700;
}
.jdp-f { display: flex; gap: 0.3rem; margin-top: 0.45rem; }
.jdp-f button {
    flex: 1 1 0;
    padding: 0.3rem 0;
    font-family: inherit;
    font-size: 0.7rem;
    background: var(--bg-input);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    color: var(--text-secondary);
    cursor: pointer;
    transition: var(--transition);
}
.jdp-f button:hover { color: var(--text-primary); border-color: var(--border-light); }
/* ساعت:دقیقه چپ‌به‌راست خوانده می‌شود (۱۸:۳۰)، پس جهت همین تکه ltr است */
.jtp { display: flex; align-items: center; gap: 0.25rem; direction: ltr; }
.jtp .form-control { flex: 1 1 0; min-width: 0; text-align: center; }
.jtp-sep { flex: 0 0 auto; font-weight: 700; color: var(--text-muted); }

/* ===== دکمهٔ ثبت سفارش =====
   خواستهٔ مدیر: «کلید ثبت سفارش رو هم کوچکتر کن … خیلی کشیده شده». دکمه از
   ردیف تمام‌عرض پایین صفحه به انتهای همین ستون آمده و اندازهٔ معمولی دارد. */
.checkout-actions {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.5rem 0.75rem;
    margin-top: 1rem;
}
.checkout-submit {
    padding: 0.6rem 1.5rem;
    font-size: 0.9rem;
}
.checkout-back {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    font-size: 0.78rem;
    color: var(--text-muted);
}
.checkout-back:hover { color: var(--text-primary); }

/* گیت «تأیید موجودی» زیر «مبلغ قابل پرداخت» در checkout.php — جایگزین
   ریدایرکت به stock-check.php (خواسته کاربر ۲۰۲۶-۰۹-۰۳). زرد چشمک‌زن تا
   تأیید، سبز بعد از تأیید — همان بج‌های .pchk-badge که در stock-check.php
   هم استفاده می‌شوند. */
.checkout-stockgate {
    margin-bottom: 1.1rem;
    padding: 0.85rem 1rem;
    border-radius: var(--radius);
    background: rgba(234, 179, 8, 0.08);
    border: 1px solid rgba(234, 179, 8, 0.3);
    text-align: center;
}
.checkout-stockgate.is-ok { background: rgba(16, 185, 129, 0.08); border-color: rgba(16, 185, 129, 0.32); }
.checkout-stockgate .pchk-badge { justify-content: center; }
.checkout-stockgate p { margin: 0.5rem 0 0; font-size: 0.82rem; line-height: 1.95; color: var(--text-secondary); }
/* روش پرداخت در حالت انتظار: خود گزینه‌ها با همان کلاس is-off کم‌رنگ
   می‌شوند (بدون CSS تازه)؛ این فقط یک تأکید ملایم روی کل جعبه است. */
.pay-picker.is-locked .pay-picker-title { color: var(--text-muted); }

/* «هزینه‌های باربری» از تنظیمات ادمین — فقط زیر روش باربری و فقط اطلاع‌رسانی */
.ship-barbari {
    margin-top: 0.5rem;
    padding: 0.55rem 0.65rem;
    background: rgba(234, 179, 8, 0.08);
    border: 1px solid rgba(234, 179, 8, 0.28);
    border-radius: 8px;
}
.ship-barbari > b {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.75rem;
    color: #FBBF24;
}
.ship-barbari-cost {
    margin-inline-start: 0.4rem;
    font-size: 0.75rem;
    font-weight: 700;
    color: #FCD34D;
}
.ship-barbari > p {
    margin: 0.3rem 0 0;
    font-size: 0.71rem;
    line-height: 1.85;
    color: var(--text-secondary);
}

/* نشان وضعیت پرداخت (سایت + پنل ادمین) */
.pay-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.72rem;
    font-weight: 600;
    padding: 0.15rem 0.5rem;
    border-radius: 999px;
    white-space: nowrap;
}
.pay-badge > .ic { width: 0.9rem; height: 0.9rem; }
.pay-paid     { background: rgba(34, 197, 94, 0.15);  color: #4ADE80; border: 1px solid rgba(34, 197, 94, 0.35); }
.pay-pending  { background: rgba(234, 179, 8, 0.15);  color: #FBBF24; border: 1px solid rgba(234, 179, 8, 0.35); }
.pay-unpaid   { background: rgba(148, 163, 184, 0.15); color: #CBD5E1; border: 1px solid rgba(148, 163, 184, 0.3); }
.pay-failed   { background: rgba(220, 38, 38, 0.15);  color: #F87171; border: 1px solid rgba(220, 38, 38, 0.35); }
.pay-refunded { background: rgba(124, 58, 237, 0.15); color: #A78BFA; border: 1px solid rgba(124, 58, 237, 0.35); }

/* خلاصهٔ پرداخت در صفحهٔ نتیجهٔ سفارش */
.pay-recap {
    text-align: right;
    max-width: 380px;
    margin: 1rem auto;
    padding: 0.85rem 1rem;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: 10px;
    font-size: 0.85rem;
}
.pay-recap div {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 1rem;
    padding: 0.35rem 0;
}
.pay-recap div + div { border-top: 1px dashed var(--border-color); }
.pay-recap span { color: var(--text-muted); }
.pay-recap b { color: var(--text-primary); display: inline-flex; align-items: center; gap: 0.3rem; }

/* اطلاعات کارت به کارت */
.pay-card-info {
    text-align: right;
    max-width: 380px;
    margin: 1rem auto;
    padding: 0.85rem 1rem;
    background: linear-gradient(180deg, rgba(37, 99, 235, 0.1), rgba(37, 99, 235, 0.02)), var(--bg-secondary);
    border: 1px solid rgba(37, 99, 235, 0.3);
    border-radius: 10px;
    font-size: 0.85rem;
}
.pay-card-info-t {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    font-weight: 600;
    color: #60A5FA;
    margin-bottom: 0.5rem;
}
.pay-card-info div {
    display: flex;
    justify-content: space-between;
    gap: 1rem;
    padding: 0.3rem 0;
}
.pay-card-info span { color: var(--text-muted); }
.pay-card-info b { color: var(--text-primary); }
.pay-card-info b.pay-pan { font-size: 1rem; letter-spacing: 1px; user-select: all; }
.pay-card-note { color: var(--text-muted); font-size: 0.75rem; line-height: 1.8; margin: 0.5rem 0 0; }

/* شمارهٔ کارت مقصد، درون گزینهٔ «کارت به کارت» در صفحهٔ تسویه */
.pay-pan-inline {
    display: inline-block;
    letter-spacing: 1px;
    user-select: all;
    color: var(--text-primary);
    background: var(--bg-input);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    padding: 0.05rem 0.3rem;
}

/* نام صاحب کارت، کنار همان شمارهٔ کارت — سفید و پررنگ‌تر از متن توضیح
   تا مشتری نام مقصد واریز را با یک نگاه ببیند. همان قاب .pay-pan-inline را
   دارد ولی letter-spacing ندارد؛ آن فقط برای ارقام لاتین شمارهٔ کارت است. */
.pay-holder-inline {
    display: inline-block;
    font-weight: 700;
    color: var(--text-primary);
    background: var(--bg-input);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    padding: 0.05rem 0.3rem;
}

/* ===== ثبت واریز کارت به کارت (صفحهٔ پس از ثبت سفارش) =====
   چهار موردی که مشتری پر می‌کند: شناسهٔ واریز، مبلغ، چهار رقم آخر کارت مبدأ و
   زمان واریز. جعبه از رنگ سبز «در انتظار تأیید» استفاده می‌کند تا با جعبهٔ
   آبی «اطلاعات کارت برای واریز» بالای خودش اشتباه نشود. */
.c2c-box {
    text-align: right;
    max-width: 560px;
    margin: 1rem auto;
    padding: 0.85rem 1rem;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: 10px;
    font-size: 0.85rem;
}
.c2c-t {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    font-weight: 600;
    color: var(--text-primary);
    margin-bottom: 0.5rem;
}
.c2c-msg {
    display: flex;
    align-items: flex-start;
    gap: 0.35rem;
    font-size: 0.78rem;
    line-height: 1.8;
    margin: 0 0 0.6rem;
    padding: 0.45rem 0.6rem;
    border-radius: var(--radius-sm);
}
.c2c-msg > .ic { flex-shrink: 0; margin-top: 0.25rem; }
.c2c-msg.is-ok   { color: var(--green); background: rgba(16, 185, 129, 0.1); border: 1px solid rgba(16, 185, 129, 0.3); }
.c2c-msg.is-bad  { color: var(--red-light); background: rgba(239, 68, 68, 0.1); border: 1px solid rgba(239, 68, 68, 0.3); }
/* یادآوری خنثی (نه خطا، نه تأیید کامل) — مثل «چک را هم باید ارسال کنید».
   هم‌رنگ کادرهای زرد .pay-c2c در checkout.php تا زبان رنگی سایت یکدست بماند.
   فونت بزرگ‌تر از بقیهٔ .c2c-msg (خواستهٔ کاربر) چون این پیام مهلت ارسال اصل
   چک را می‌گوید و باید در نگاه اول خوانده شود؛ فقط همین حالت را عوض می‌کند تا
   پیام‌های is-ok/is-bad جای دیگر دست‌نخورده بمانند. */
.c2c-msg.is-note { color: var(--text-secondary); background: rgba(234, 179, 8, 0.08); border: 1px solid rgba(234, 179, 8, 0.25); font-size: 1rem; line-height: 2; }

/* کادر سبز «موجودی تایید شد» در order-success.php — بعد از پول خودکار
   (خواسته کاربر: تیک سبز و زیبا بعد از تایید موجودی توسط ادمین). یک
   pop-in ساده، هم‌الگوی .pchk-panel-pop در stock-check.php. */
.stockok-box {
    max-width: 380px;
    margin: 0 auto 1rem;
    padding: 0.75rem 0.9rem;
    border-radius: var(--radius);
    background: rgba(16, 185, 129, 0.1);
    border: 1px solid rgba(16, 185, 129, 0.35);
    color: #4ADE80;
    font-size: 0.85rem;
    line-height: 1.9;
    text-align: center;
    animation: stockokPop 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}
@keyframes stockokPop {
    from { transform: scale(0.9); opacity: 0; }
    to   { transform: scale(1); opacity: 1; }
}
.c2c-note {
    display: flex;
    align-items: flex-start;
    gap: 0.35rem;
    color: var(--text-muted);
    font-size: 0.75rem;
    line-height: 1.8;
    margin: 0.5rem 0 0;
}
.c2c-note > .ic { flex-shrink: 0; margin-top: 0.25rem; }
.c2c-recap { margin-top: 0.6rem; }
.c2c-recap div {
    display: flex;
    justify-content: space-between;
    gap: 1rem;
    padding: 0.3rem 0;
}
.c2c-recap div + div { border-top: 1px dashed var(--border-color); }
.c2c-recap span { color: var(--text-muted); }
.c2c-recap b { color: var(--text-primary); }
.c2c-form { margin-top: 0.8rem; }
.c2c-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 0.5rem 0.8rem;
    margin-bottom: 0.7rem;
}
.c2c-grid .form-group { margin-bottom: 0; }
.c2c-grid label { font-size: 0.78rem; }

/* عکس نمونهٔ چک — راهنمای بصری بالای فرم اطلاعات چک (هم در checkout.php هم
   order-success.php؛ همین یک کلاس هر دو جا استفاده می‌شود). عمدا «تمیز»:
   قاب ساده، سایهٔ ملایم، بدون تزئین اضافه — خواستهٔ کاربر. */
.pc2-sample {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
    margin: 0 0 0.9rem;
    padding: 0.75rem;
    background: var(--bg-primary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
}
.pc2-sample img {
    max-width: 100%;
    max-height: 220px;
    border-radius: 8px;
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
}
.pc2-sample span {
    display: flex;
    align-items: flex-start;
    gap: 0.3rem;
    font-size: 0.74rem;
    line-height: 1.8;
    color: var(--text-muted);
    text-align: center;
}

@media (max-width: 600px) {
    .pay-recap, .pay-card-info, .c2c-box { max-width: none; }
}

/* ===== روند پیگیری سفارش (تایم‌لاین مشتری + فهرست تیک ادمین) ===== */
/* جمع‌شدنی «پیگیری سفارش» درون کارت سفارش در حساب کاربری */
.order-track {
    margin-top: 0.6rem;
    padding-top: 0.6rem;
    border-top: 1px dashed var(--border-color);
}
.order-track > summary {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    cursor: pointer;
    font-size: 0.8rem;
    font-weight: 600;
    color: var(--red-light);
    list-style: none;
    user-select: none;
}
.order-track > summary::-webkit-details-marker { display: none; }
.order-track > summary::after {
    content: '';
    width: 0.42rem;
    height: 0.42rem;
    margin-inline-start: auto;
    border-inline-end: 2px solid currentColor;
    border-block-end: 2px solid currentColor;
    transform: rotate(45deg);
    transition: transform var(--transition);
}
.order-track[open] > summary::after { transform: rotate(-135deg); }
.order-track > summary:focus-visible { outline: 2px solid var(--red-light); outline-offset: 2px; }

/* تایم‌لاین عمودی: نقطه‌ها با یک خط پیوند داده می‌شوند */
.track-timeline {
    list-style: none;
    margin: 0.75rem 0 0;
    padding: 0;
}
.track-timeline.track-empty {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    margin-top: 0.6rem;
    font-size: 0.78rem;
    color: var(--text-muted);
}
.track-step {
    position: relative;
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    padding-bottom: 0.9rem;
}
.track-step:last-child { padding-bottom: 0; }
/* خط اتصال بین نقطه‌ها */
.track-step:not(:last-child)::before {
    content: '';
    position: absolute;
    top: 1.55rem;
    inset-inline-start: 0.72rem;
    width: 2px;
    bottom: 0.1rem;
    background: var(--border-color);
    transform: translateX(50%);
}
.track-step.is-done:not(:last-child)::before { background: rgba(34, 197, 94, 0.45); }
.track-dot {
    flex: 0 0 auto;
    width: 1.5rem;
    height: 1.5rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    border: 1px solid var(--border-color);
    background: var(--bg-secondary);
    color: var(--text-muted);
    position: relative;
    z-index: 1;
}
.track-step.is-done .track-dot {
    border-color: rgba(34, 197, 94, 0.5);
    background: rgba(34, 197, 94, 0.15);
    color: #4ADE80;
}
.track-body {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 0;
    padding-top: 0.15rem;
}
.track-label {
    font-size: 0.82rem;
    font-weight: 600;
    color: var(--text-primary);
    line-height: 1.6;
}
.track-step.is-todo .track-label { color: var(--text-muted); font-weight: 500; }
.track-time { font-size: 0.72rem; color: var(--text-muted); }

/* نام و شمارهٔ پیک زیر مرحلهٔ «تحویل به پیک» */
.track-courier {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem 0.9rem;
    margin-top: 0.35rem;
    padding: 0.45rem 0.6rem;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    font-size: 0.76rem;
}
.track-courier span,
.track-courier a {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    color: var(--text-secondary);
}
.track-courier a { color: var(--red-light); text-decoration: none; }
.track-courier a:hover { text-decoration: underline; }
/* کد رهگیری پست زیر مرحلهٔ «تحویل به پست» — همان قاب، با تأکید روی خود کد */
.track-code b {
    font-family: monospace;
    font-size: 0.84rem;
    color: var(--text-primary);
    letter-spacing: 0.5px;
    user-select: all;
}

/* فهرست تیک‌خور ادمین */
.track-admin-list {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}
.track-admin-row {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    padding: 0.55rem 0.7rem;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    cursor: pointer;
    transition: border-color var(--transition), background var(--transition);
}
.track-admin-row:hover { border-color: var(--red-primary); }
.track-admin-row.is-done {
    border-color: rgba(34, 197, 94, 0.4);
    background: rgba(34, 197, 94, 0.07);
}
.track-admin-row input[type="checkbox"] {
    flex: 0 0 auto;
    width: 1.05rem;
    height: 1.05rem;
    accent-color: var(--red-primary);
    cursor: pointer;
}
.track-admin-ic { flex: 0 0 auto; display: inline-flex; color: var(--text-muted); }
.track-admin-row.is-done .track-admin-ic { color: #4ADE80; }
.track-admin-label { font-size: 0.82rem; color: var(--text-primary); }
.track-admin-time {
    margin-inline-start: auto;
    font-size: 0.72rem;
    color: var(--text-muted);
    white-space: nowrap;
}

/* کادر کد رهگیری: با تیک «تحویل به پست» باز می‌شود و به همان ردیف چسبیده
   می‌ماند (تورفتگی + خط کناری) تا معلوم باشد متعلق به کدام مرحله است. */
.track-reveal {
    margin: -0.1rem 0 0.15rem;
    margin-inline-start: 1.6rem;
    padding: 0.6rem 0.75rem;
    background: rgba(34, 197, 94, 0.06);
    border: 1px solid rgba(34, 197, 94, 0.3);
    border-inline-start-width: 3px;
    border-radius: var(--radius-sm);
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}
.track-reveal[hidden] { display: none; }
.track-reveal > label {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.78rem;
    font-weight: 600;
    color: var(--text-primary);
    margin: 0;
}
.track-reveal .form-control {
    font-family: monospace;
    font-size: 0.85rem;
    padding: 0.4rem 0.55rem;
    margin: 0;
}
.track-reveal > i {
    font-style: normal;
    font-size: 0.7rem;
    color: var(--text-muted);
    line-height: 1.7;
}

/* یادداشت وضعیت پیامک زیر دکمهٔ ذخیره */
.track-sms-note {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.3rem;
    margin: 0.75rem 0 0;
    padding: 0.5rem 0.7rem;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    font-size: 0.74rem;
    color: var(--text-muted);
    line-height: 1.8;
}
.track-sms-note.is-on { border-color: rgba(34, 197, 94, 0.35); }
.track-sms-note b { color: var(--text-primary); }
.track-sms-note a { color: var(--red-light); text-decoration: none; margin-inline-start: auto; }
.track-sms-note a:hover { text-decoration: underline; }

@media (max-width: 768px) {
    .track-admin-row { flex-wrap: wrap; }
    .track-admin-time { margin-inline-start: 0; width: 100%; }
    .track-reveal { margin-inline-start: 0.5rem; }
    .track-sms-note a { margin-inline-start: 0; }
}

/* ===================== سه بنر مجزا زیر بنر اصلی =====================
   ردیف سه‌کارتی: جمع عرض سه کارت دقیقا به عرض بنر اصلی است و فاصلهٔ
   بین‌شان آن‌ها را از هم جدا نگه می‌دارد. بنر اصلی خودش تمام‌عرض کانتینر
   و دست‌نخورده می‌ماند — هیچ‌چیز کنارش نمی‌نشیند و از عرضش کم نمی‌کند.
   کارت‌ها عمدا جمع‌وجورند (ارتفاع و فونت‌های کوچک‌تر) چون در یک‌سوم
   عرض کانتینر می‌نشینند.
   auto-fit: روی نمایشگر متوسط به دو ستون و روی موبایل به یک ستون می‌رسد.
   min(100%,300px): روی نمایشگر باریک هم ستون از عرض صفحه بیرون نمی‌زند. */
.promo-row {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
    gap: 1rem;
    align-items: stretch;
}

/* ---------- اسلایدر آفرها ---------- */
.promo-slider {
    position: relative;
    display: flex;
    flex-direction: column;
    min-width: 0;
}
.promo-slider > .promo-card { flex: 1 1 auto; }
/* فقط اسلاید فعال دیده می‌شود؛ ارتفاع از محتوای همان اسلاید می‌آید تا
   هیچ‌وقت متن بریده نشود. بدون JS، اسلاید اول همیشه فعال است.
   انتخابگر فرزندی است تا از display:grid ی که .promo-card می‌دهد قوی‌تر بماند. */
.promo-slider > .promo-slide { display: none; }
.promo-slider > .promo-slide.is-active { display: grid; animation: pcIn 0.45s ease; }
/* fill-mode ندارد تا پس از پایان انیمیشن، transform hover آزاد بماند */
@keyframes pcIn {
    from { opacity: 0; transform: translateY(10px); }
    to   { opacity: 1; transform: none; }
}

/* اسلایدر بنر اصلی (خواستهٔ کاربر ۲۰۲۶-۰۹-۰۷) — همان .promo-slider عمومی
   بالا را با کلاس بنرها (.banner) پر می‌کند، نه کارت‌های .promo-card؛
   قاعدهٔ display:grid بالا برای بنر معنی ندارد (خودش block ساده است)،
   پس این‌جا با اختصاصیت بالاتر (۴ کلاس) بازنویسی می‌شود. */
.hero-slider > .banner.promo-slide { display: none; }
.hero-slider > .banner.promo-slide.is-active { display: block; animation: pcIn 0.45s ease; }

.promo-dots {
    display: flex;
    justify-content: center;
    gap: 0.3rem;
    padding-top: 0.45rem;
    /* کف ارتفاع ثابت (پدینگ + قد خود نقطه) تا اسلات تک‌آفره (بدون
       نقطه، is-empty) دقیقا همان فضای اسلات چندآفره را اشغال کند —
       وگرنه روی موبایل (بدون کشیدگی هم‌ردیف گرید) کوتاه‌تر می‌ماند. */
    min-height: calc(0.45rem + 4px);
}
.promo-dots.is-empty { visibility: hidden; }
.promo-dot {
    position: relative;
    width: 22px;
    height: 4px;
    padding: 0;
    border: 0;
    border-radius: 999px;
    background: var(--border-light);
    cursor: pointer;
    overflow: hidden;
    transition: background var(--transition);
}
.promo-dot:hover { background: var(--text-muted); }
.promo-dot.is-active { background: color-mix(in srgb, var(--red-primary) 22%, transparent); }
/* نشانگر فعال، همگام با بازهٔ چرخش پر می‌شود (--promo-ms از سرور می‌آید) —
   با تم هم‌رنگ می‌شود (var(--red-primary)/var(--red-light) خود تم) */
.promo-dot.is-active::after {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    background: linear-gradient(90deg, var(--red-primary), var(--red-light));
    transform-origin: left center;
    animation: pcDot var(--promo-ms, 6s) linear forwards;
}
@keyframes pcDot { from { transform: scaleX(0); } to { transform: scaleX(1); } }
.promo-slider:hover .promo-dot.is-active::after { animation-play-state: paused; }

/* ---------- کارت بنر (هر سه اسلات) ---------- */
.promo-card {
    position: relative;
    display: grid;
    grid-template-columns: minmax(0, 36%) minmax(0, 1fr);
    gap: 0.65rem;
    padding: 0.65rem;
    /* ۲۰۲۶-۰۸-۲۹: از ۱۵۸px به ۲۰۸px — کارت آفر فعال (تگ+عنوان+قیمت+شمارش‌معکوس+
       نوار) طبیعتا حدود ۲۰۰px جا لازم دارد، اما کارت آفر منقضی (فقط یک خط
       هشدار به‌جای شمارنده) طبیعتا کوتاه‌تر می‌ماند. روی دسکتاپ که هر سه‌کارت
       در یک ردیف گرید کنار هم‌اند align-items:stretch این تفاوت را می‌پوشاند،
       اما روی موبایل (.promo-row با auto-fit تک‌ستونه می‌شود) هر کارت ردیف
       گرید مستقل خودش را می‌گیرد و دیگر با هم کشیده نمی‌شوند — همان‌جا بود که
       کارت‌ها «کوچیک و بزرگ‌تر از هم» دیده می‌شدند. کف بلندتر این اختلاف را در
       هر دو حالت (چه کشیده‌شده چه تنها) از بین می‌برد؛ .pc-fill هم‌چنان فاصلهٔ
       اضافه را با فاصله‌گیر کشسانش پر می‌کند. */
    min-height: 208px;
    border-radius: var(--radius-lg);
    border: 1px solid var(--border-color);
    /* خواستهٔ کاربر ۲۰۲۶-۰۹-۰۸: «بنرهای آفر با تغییر تم با رنگ‌بندی سایت
       همخونی داشته باشه» — قبلا این پس‌زمینه همیشه یک گرادیان سرمه‌ای
       ثابت بود، کاملا مستقل از تم انتخابی. حالا با color-mix() از رنگ
       برند/دوم خود تم (var(--red-primary)/var(--accent-secondary)) روی
       یک زمینهٔ تیرهٔ ثابت رنگ می‌گیرد — عمدا «تیره» می‌ماند (نه روشن/تیره
       بر اساس تم) چون بنر تخفیف باید مثل ویترین از بقیهٔ صفحه بیرون بزند
       (الگوی رایج در فروشگاه‌های حرفه‌ای)، ولی خود تن رنگش با هر تم واقعا
       عوض می‌شود — نتیجه یک بنر که هم زیبا/برجسته می‌ماند هم با هر تم
       (۱۵ تم) هم‌رنگ است، بدون نیاز به override جدا برای هرکدام. */
    background:
        linear-gradient(150deg,
            color-mix(in srgb, var(--red-primary) 20%, #10141c 80%) 0%,
            color-mix(in srgb, var(--accent-secondary) 14%, #10141c 86%) 55%,
            #0c0f16 100%);
    text-decoration: none;
    overflow: hidden;
    isolation: isolate;
    transition: transform var(--transition), border-color var(--transition), box-shadow var(--transition);
}
.promo-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
.promo-special:hover { border-color: var(--red-primary); }
.promo-offer:hover   { border-color: color-mix(in srgb, var(--accent-secondary) 55%, transparent); }

/* اسلات خالی ردیف — همان زبان کادر خط‌چین بقیهٔ اسلات‌های این صفحه.
   نه هاور دارد و نه درخشش، چون لینک نیست. */
.promo-empty {
    border-style: dashed;
    background: var(--bg-secondary);
}
.promo-empty:hover { transform: none; box-shadow: none; }
.promo-empty::after { content: none; }
.promo-empty .pc-title { color: var(--text-secondary); font-weight: 600; }
.promo-empty .pc-sub { color: var(--text-muted); }

/* هالهٔ رنگی پشت محتوا (پشت متن، روی پس‌زمینهٔ کارت) — رنگ دوم/برند تم */
.pc-glow {
    position: absolute;
    inset: -40% -10% auto -10%;
    height: 160%;
    z-index: -1;
    pointer-events: none;
    background: radial-gradient(58% 58% at 76% 10%, color-mix(in srgb, var(--accent-secondary) 24%, transparent), transparent 70%);
}
.promo-special .pc-glow {
    background: radial-gradient(58% 58% at 76% 10%, color-mix(in srgb, var(--red-primary) 26%, transparent), transparent 70%);
}
/* درخششی که با hover یک‌بار از روی کارت رد می‌شود (چپ‌به‌راست فیزیکی) */
.promo-card::after {
    content: '';
    position: absolute;
    top: -60%;
    bottom: -60%;
    left: -30%;
    width: 24%;
    background: linear-gradient(100deg, transparent, rgba(255, 255, 255, 0.10), transparent);
    transform: rotate(12deg);
    opacity: 0;
    pointer-events: none;
}
.promo-card:hover::after { animation: pcSheen 0.9s ease; }
@keyframes pcSheen {
    0%   { opacity: 0; transform: rotate(12deg) translateX(0); }
    30%  { opacity: 1; }
    100% { opacity: 0; transform: rotate(12deg) translateX(560%); }
}

/* ---------- تصویر ---------- */
.pc-media {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 96px;
    border-radius: 9px;
    /* کارت آفر عمدا همیشه تیره می‌ماند (نگاه کنید به .promo-card بالا) —
       پس این قاب تصویر هم دیگر var(--bg-primary) نمی‌خواند (در تم‌های
       روشن آن روشن بود و داخل کارت تیره عجیب می‌شد)، بلکه یک تیرگی ثابت
       دارد که با هر تم یکسان و هماهنگ می‌ماند. */
    background: rgba(0, 0, 0, 0.25);
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.05);
    overflow: hidden;
}
.pc-media img { display: block; width: 100%; height: 100%; object-fit: cover; }
/* روشن و ثابت (نه var(--text-muted)) چون این آیکون روی زمینهٔ همیشه‌تیرهٔ
   .pc-media می‌نشیند (نگاه کنید به یادداشت .pc-title بالاتر) — در تم‌های
   روشن var(--text-muted) خودش تیره می‌شد و آیکون روی زمینهٔ تیره گم می‌شد.
   اسلات خالی (.promo-empty) قاعدهٔ جدای خودش را پایین‌تر دارد چون آنجا
   واقعا سطح روشن/تیرهٔ خود تم است، نه این کارت همیشه‌تیره. */
.pc-noimg { color: #D7DCE3; opacity: 0.45; }
.pc-noimg .ic { width: 1.7rem; height: 1.7rem; }
/* قاب تصویر اسلات خالی: تخت و خط‌چین، بدون توپری */
.promo-empty .pc-media {
    background: transparent;
    border: 1px dashed var(--border-color);
    box-shadow: none;
    color: var(--text-muted);
    opacity: 0.5;
}
.promo-empty .pc-noimg { color: var(--text-muted); }

.pc-off {
    position: absolute;
    top: 0.35rem;
    inset-inline-start: 0.35rem;
    font-size: 0.62rem;
    font-weight: 800;
    color: #fff;
    padding: 0.12rem 0.42rem;
    border-radius: 999px;
    background: linear-gradient(135deg, var(--red-light), var(--red-hover));
    box-shadow: 0 2px 8px color-mix(in srgb, var(--red-primary) 45%, transparent);
}

/* ---------- ستون متن ---------- */
.pc-body {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    min-width: 0;
}
/* فاصله‌گیر کشسان: هرچه بالای آن بماند بالا، بقیه به پایین کارت می‌چسبد */
.pc-fill { flex: 1 1 auto; min-height: 0.15rem; }

.pc-tag {
    align-self: flex-start;
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    font-size: 0.64rem;
    font-weight: 700;
    padding: 0.18rem 0.45rem;
    border-radius: 999px;
}
.promo-special .pc-tag {
    color: color-mix(in srgb, var(--red-light) 85%, white 15%);
    background: color-mix(in srgb, var(--red-primary) 16%, transparent);
    border: 1px solid color-mix(in srgb, var(--red-primary) 38%, transparent);
}
.promo-offer .pc-tag {
    color: color-mix(in srgb, var(--accent-secondary) 35%, white 65%);
    background: color-mix(in srgb, var(--accent-secondary) 15%, transparent);
    border: 1px solid color-mix(in srgb, var(--accent-secondary) 36%, transparent);
}
/* تپش ملایم عقربه تا حس گذر زمان بدهد */
.promo-offer .pc-tag .ic { animation: pcTick 2.4s ease-in-out infinite; }
@keyframes pcTick { 0%, 100% { transform: none; } 50% { transform: scale(1.18); } }

/* خواستهٔ کاربر ۲۰۲۶-۰۹-۰۸ (دور دوم): «رنگ‌ها هنوز خوانا نیستن» — علت
   واقعی این بود که .pc-title/.pc-sub/.pc-cap و... از var(--text-primary)/
   var(--text-muted) می‌خواندند؛ این توکن‌ها در تم‌های *روشن* رنگ تیره
   می‌شوند (چون قرار است روی پس‌زمینهٔ روشن همان تم خوانا باشند) — اما
   .promo-card عمدا همیشه تیره می‌ماند (نگاه کنید به پس‌زمینهٔ آن بالاتر)،
   پس متن با تم روشن می‌شد «متن تیره روی کارت تیره»، یعنی عملا نامرئی.
   چون سطح کارت با تم عوض نمی‌شود، متن رویش هم دیگر نباید با تم عوض شود —
   همیشه همان تن روشن ثابتی می‌ماند که با پس‌زمینهٔ همیشه‌تیرهٔ خودش
   می‌خواند (دقیقا همان رنگ‌هایی که تم تیرهٔ پیش‌فرض همین حالا برای
   text-primary/muted دارد، ولی اینجا دیگر متغیر تم نیست، مقدار ثابت
   است). .promo-empty .pc-title پایین‌تر جدا override دارد چون آن کارت
   خودش سطح تم را می‌گیرد (var(--bg-secondary))، نه این کارت همیشه‌تیره. */
.pc-title {
    font-size: 0.82rem;
    font-weight: 700;
    color: #F9FAFB;
    line-height: 1.5;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.pc-sub {
    font-size: 0.68rem;
    color: #B8C0CC;
    line-height: 1.55;
    display: -webkit-box;
    -webkit-line-clamp: 1;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.pc-cap {
    display: inline-flex;
    align-items: center;
    gap: 0.22rem;
    font-size: 0.62rem;
    color: #B8C0CC;
}
/* عنصر رنگ دوم تم (--accent-secondary) در بعضی تم‌ها خودش تیره است
   (مثلا تم پیش‌فرض: #B91C1C) — ترکیب‌کردن با فقط ۱۵-۲۰٪ سفید کافی نیست
   تا روی کارت تیره خوانا بماند؛ برای تضمین روشنایی کافی در هر تمی، سفید
   حالا سهم غالب ترکیب است (فقط رگه‌ای از رنگ تم باقی می‌ماند، نه رنگ اصلی
   با کمی سفید). همین قاعده در ادامه برای شمارندهٔ معکوس و کلید «آفر» هم
   تکرار شده. */
.promo-offer .pc-cap { color: color-mix(in srgb, var(--accent-secondary) 35%, white 65%); opacity: 0.9; }

.pc-price { display: flex; align-items: baseline; gap: 0.35rem; flex-wrap: wrap; }
.pc-price s { font-size: 0.68rem; color: #9AA3B0; }
.pc-price b { font-size: 0.88rem; font-weight: 800; color: #4ADE80; }
.pc-price .tmn { font-size: 0.6rem; color: #9AA3B0; margin-inline-start: 0.18rem; }

/* ---------- شمارش معکوس ---------- */
.pc-count {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 0.22rem;
    direction: ltr;
}
.pc-cd {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.02rem;
    padding: 0.22rem 0.08rem 0.2rem;
    border-radius: 7px;
    background: linear-gradient(180deg, color-mix(in srgb, var(--accent-secondary) 17%, transparent), color-mix(in srgb, var(--accent-secondary) 4%, transparent));
    border: 1px solid color-mix(in srgb, var(--accent-secondary) 28%, transparent);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.09);
}
.pc-cd b {
    font-size: 0.85rem;
    font-weight: 800;
    line-height: 1.2;
    color: color-mix(in srgb, var(--accent-secondary) 35%, white 65%);
    letter-spacing: 0.3px;
    font-variant-numeric: tabular-nums;
    text-shadow: 0 0 9px color-mix(in srgb, var(--accent-secondary) 45%, transparent);
}
.pc-cd i {
    font-style: normal;
    font-size: 0.5rem;
    color: #C6CCD6;
    direction: rtl;
}
/* خانهٔ ثانیه نفس می‌کشد تا زنده‌بودن شمارنده دیده شود */
.pc-cd.is-sec { animation: pcSec 1s ease-in-out infinite; }
@keyframes pcSec {
    0%, 100% { box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.09); }
    50%      { box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.09), 0 0 12px color-mix(in srgb, var(--accent-secondary) 40%, transparent); }
}

/* نوار زمان باقی‌مانده (نسبت زمان مانده به کل بازهٔ آفر) */
.pc-bar {
    display: block;
    height: 3px;
    border-radius: 999px;
    background: rgba(255, 255, 255, 0.07);
    overflow: hidden;
}
.pc-bar i {
    display: block;
    height: 100%;
    border-radius: inherit;
    background: linear-gradient(90deg,
        color-mix(in srgb, var(--accent-secondary) 55%, white 45%),
        color-mix(in srgb, var(--accent-secondary) 40%, white 60%),
        color-mix(in srgb, var(--accent-secondary) 20%, white 80%));
    box-shadow: 0 0 8px color-mix(in srgb, var(--accent-secondary) 50%, transparent);
    transition: width 1s linear;
}

.pc-over {
    display: none;
    text-align: center;
    align-items: center;
    justify-content: center;
    gap: 0.25rem;
    font-size: 0.7rem;
    font-weight: 600;
    color: color-mix(in srgb, var(--red-light) 85%, white 15%);
    padding: 0.3rem;
    border-radius: 7px;
    background: color-mix(in srgb, var(--red-primary) 12%, transparent);
    border: 1px solid color-mix(in srgb, var(--red-primary) 30%, transparent);
}
.pc-over .ic { width: 0.8rem; height: 0.8rem; }
/* با پایان آفر: شمارنده و نوار می‌روند، پیام پایان می‌آید */
.pc-count.is-over,
.pc-count.is-over ~ .pc-bar { display: none; }
.pc-count.is-over ~ .pc-over,
.pc-over.is-shown { display: flex; }
/* برچسب «زمان باقی‌مانده» پیش از شمارنده است و با انتخابگر خواهر قابل
   دسترسی نیست؛ در رندر سرور با همین کلاس پنهان می‌شود. */
.pc-cap.is-hidden { display: none; }

/* ---------- مهر «فروخته شد» ----------
   گوشهٔ چپ بالای تصویر بنر. صفحه RTL است، پس inset-inline-end یعنی «چپ»
   (قاب ‎.pc-off‎ با inset-inline-start در گوشهٔ راست است). چرخش کوچک و قاب
   ضخیم ظاهر مهر لاستیکی می‌دهد. */
.pc-sold {
    position: absolute;
    top: 0.4rem;
    inset-inline-end: 0.4rem;
    z-index: 2;
    display: inline-flex;
    align-items: center;
    gap: 0.15rem;
    font-size: 0.6rem;
    font-weight: 800;
    letter-spacing: 0.4px;
    color: color-mix(in srgb, var(--red-light) 85%, white 15%);
    padding: 0.14rem 0.4rem;
    border: 2px solid color-mix(in srgb, var(--red-primary) 70%, transparent);
    border-radius: var(--radius-sm);
    background: rgba(0, 0, 0, 0.5);
    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.7);
    transform: rotate(-11deg);
}
.pc-sold .ic { width: 0.72rem; height: 0.72rem; }
/* آفر تمام‌شده: تصویر خاکستری‌تر و کلید خرید آرام‌تر تا با آفرهای زنده اشتباه نشود */
.promo-card.is-sold .pc-media img { filter: grayscale(0.6) brightness(0.82); }
.promo-card.is-done .pc-cta {
    background: linear-gradient(135deg, #4B5563, #374151);
    box-shadow: none;
}
.promo-card.is-done .pc-tag { opacity: 0.6; }
.promo-card.is-done .pc-tag .ic { animation: none; }

.pc-cta {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.3rem;
    margin-top: 0.1rem;
    font-size: 0.7rem;
    font-weight: 700;
    color: #fff;
    padding: 0.36rem 0.5rem;
    border-radius: 8px;
    background: linear-gradient(135deg, var(--red-primary), var(--red-hover));
    box-shadow: 0 5px 14px color-mix(in srgb, var(--red-primary) 26%, transparent);
    transition: filter var(--transition);
}
/* بنرهای «آفر»: قبلا یک تم مشکی-طلایی ثابت بود (کد دقیق #FFBE00) که با
   عوض‌شدن تم سایت اصلا تغییر نمی‌کرد. خواستهٔ کاربر ۲۰۲۶-۰۹-۰۸: «بنر آفر
   با تغییر تم با رنگ‌بندی سایت همخونی داشته باشه» — پس‌زمینهٔ مشکی/تیره
   (حس «دکمهٔ ویژه») می‌ماند، رنگ متن/حاشیه/درخشش از var(--accent-secondary)
   خود تم می‌آید. دور دوم همان روز: «هنوز خوانا نیست» — چون --accent-secondary
   در بعضی تم‌ها خودش رنگی تیره است (مثلا تم پیش‌فرض #B91C1C)، ترکیب‌کردنش
   با کمی سفید کافی نبود؛ سهم سفید حالا غالب است (۶۵٪) تا متن روی این
   پس‌زمینهٔ مشکی، در هر تمی، همیشه به‌قدر کافی روشن/خوانا بماند. */
.promo-offer .pc-cta {
    background: linear-gradient(135deg, #1c1c1c, #000);
    border: 1px solid color-mix(in srgb, var(--accent-secondary) 55%, transparent);
    color: color-mix(in srgb, var(--accent-secondary) 35%, white 65%);
    box-shadow: 0 5px 14px color-mix(in srgb, var(--accent-secondary) 18%, transparent);
}
.pc-cta .ic { transition: transform var(--transition); }
.promo-card:hover .pc-cta { filter: brightness(1.1); }
/* فلش «مشاهده و خرید» در RTL به سمت چپ اشاره می‌کند */
.promo-card:hover .pc-cta .ic { transform: translateX(-3px); }

/* موبایل: کارت یک‌ستونی می‌شود تا متن و شمارنده جا شوند */
@media (max-width: 480px) {
    .promo-card {
        grid-template-columns: minmax(0, 1fr);
        min-height: 0;
        gap: 0.6rem;
    }
    .pc-media { min-height: 0; aspect-ratio: 16 / 9; }
    .pc-cd b { font-size: 0.95rem; }
    .pc-cd i { font-size: 0.56rem; }
    .pc-title { font-size: 0.9rem; }
}

/* احترام به کاربری که انیمیشن نمی‌خواهد */
@media (prefers-reduced-motion: reduce) {
    .promo-slider > .promo-slide.is-active,
    .promo-card:hover::after,
    .promo-offer .pc-tag .ic,
    .pc-cd.is-sec { animation: none; }
    .promo-dot.is-active::after { animation: none; transform: none; }
}

/* ===================== کاروسل تصاویر محصول =====================
   ستون چپ .product-detail: اسلات بزرگ + نوار بندانگشتی زیر آن.
   اسلات بزرگ ارتفاع باقی‌ماندهٔ ستون را می‌گیرد و تصویر با
   object-fit:cover آن را پر می‌کند؛ پس با عوض‌شدن src هیچ ابعادی
   تغییر نمی‌کند و صفحه جابه‌جا نمی‌شود. */
.product-gallery {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    min-width: 0;
    /* ارتفاع گالری از محتوای خودش می‌آید، نه از ستون بلند گزینه‌ها */
    align-self: start;
}
.product-gallery > .product-detail-image { flex: 0 0 auto; }

/* فلش‌های روی اسلات بزرگ — در RTL «قبلی» سمت راست است */
.pg-arrow {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 2.1rem;
    height: 2.1rem;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: none;
    border-radius: 999px;
    background: rgba(17, 24, 39, 0.6);
    color: #fff;
    cursor: pointer;
    opacity: 0;
    transition: opacity var(--transition), background var(--transition);
}
.pg-prev { inset-inline-start: 0.6rem; }
.pg-next { inset-inline-end: 0.6rem; }
.product-detail-image:hover .pg-arrow,
.pg-arrow:focus { opacity: 1; }
.pg-arrow:hover { background: var(--red-primary); }

.pg-count {
    position: absolute;
    inset-block-end: 0.6rem;
    inset-inline-start: 0.6rem;
    background: rgba(17, 24, 39, 0.6);
    color: #fff;
    font-size: 0.72rem;
    padding: 0.1rem 0.45rem;
    border-radius: 999px;
    direction: ltr;
}

/* نشان «فروش ویژه» — گوشهٔ بالای تصویر اصلی محصول، فقط وقتی این محصول
   همین الان یک آفر زمان‌دار واقعا زنده دارد (productHasActiveOffer()) */
.pd-special-badge {
    position: absolute;
    top: 0.7rem;
    inset-inline-start: 0.7rem;
    z-index: 2;
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.74rem;
    font-weight: 800;
    color: #fff;
    padding: 0.32rem 0.7rem;
    border-radius: 999px;
    background: linear-gradient(135deg, var(--red-light), var(--red-hover));
    box-shadow: 0 3px 10px color-mix(in srgb, var(--red-primary) 45%, transparent);
}
.pd-special-badge .ic { width: 0.9rem; height: 0.9rem; }

/* نوار بندانگشتی: ارتفاع ثابت، در صورت زیادبودن افقی اسکرول می‌شود */
.pg-thumbs {
    display: flex;
    gap: 0.5rem;
    overflow-x: auto;
    overflow-y: hidden;
    padding-bottom: 0.3rem;
    scrollbar-width: thin;
    scrollbar-color: var(--border-light) transparent;
}
.pg-thumbs::-webkit-scrollbar { height: 6px; }
.pg-thumbs::-webkit-scrollbar-track { background: transparent; }
.pg-thumbs::-webkit-scrollbar-thumb { background: var(--border-light); border-radius: 999px; }

.pg-thumb {
    flex: 0 0 76px;
    width: 76px;
    height: 76px;
    padding: 0;
    background: var(--bg-input);
    border: 2px solid var(--border-color);
    border-radius: var(--radius-sm);
    overflow: hidden;
    cursor: pointer;
    transition: border-color var(--transition), transform var(--transition);
}
.pg-thumb img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}
.pg-thumb:hover { border-color: var(--border-light); transform: translateY(-2px); }
.pg-thumb.is-active { border-color: var(--red-primary); }
.pg-thumb:focus-visible { outline: 2px solid var(--red-light); outline-offset: 2px; }

@media (max-width: 768px) {
    /* فلش‌ها روی لمس همیشه دیده شوند (hover وجود ندارد) */
    .pg-arrow { opacity: 1; }
    .pg-thumb { flex: 0 0 64px; width: 64px; height: 64px; }
}

/* خواستهٔ کاربر ۲۰۲۶-۰۹-۰۸: «روی عکس کلیک می‌کنم، عکس رو بزرگ کنه و
   بیاره روی صفحه و امکان بستن هم داشته باشه» — کلیک روی تصویر اصلی
   محصول آن را در یک لایهٔ تمام‌صفحه بزرگ می‌کند؛ با کلیک روی زمینه، دکمهٔ
   بستن، یا Escape بسته می‌شود.
   دور بعد، همان روز: «یک مقدار خلاقیت داشته باش، مثل فلان سایت، با یک
   افکت قشنگ بیاد وسط صفحه؛ وقتی چند عکس داره هم امکان رد کردن باشه» —
   تصویر با transform از محل/اندازهٔ دقیق خودش روی صفحه به وسط پرواز
   می‌کند (به‌جای display:none/فید ساده)، و اگر محصول چند عکس دارد،
   فلش/کیبورد/کشیدن‌انگشت همان‌جا داخل لایتباکس هم کار می‌کند. */
#pgMainImg { cursor: zoom-in; }
.pg-lightbox {
    position: fixed;
    inset: 0;
    z-index: 1000;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 2rem;
    background: rgba(0, 0, 0, 0.85);
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity 0.25s ease, visibility 0s linear 0.25s;
}
.pg-lightbox.is-open {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transition: opacity 0.25s ease;
}
.pg-lightbox-img {
    max-width: 90vw;
    max-height: 90vh;
    object-fit: contain;
    border-radius: var(--radius);
    box-shadow: var(--shadow-lg);
    cursor: zoom-out;
}
.pg-lightbox-close {
    position: absolute;
    top: 1.1rem;
    inset-inline-end: 1.1rem;
    width: 2.4rem;
    height: 2.4rem;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: none;
    border-radius: 999px;
    background: rgba(255, 255, 255, 0.12);
    color: #fff;
    cursor: pointer;
    transition: background var(--transition);
}
.pg-lightbox-close:hover { background: rgba(255, 255, 255, 0.25); }
.pg-lightbox-close:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }

/* فلش‌های رد کردن عکس‌های دیگر، داخل خود لایتباکس */
.pg-lb-arrow {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 3rem;
    height: 3rem;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: none;
    border-radius: 999px;
    background: rgba(255, 255, 255, 0.12);
    color: #fff;
    cursor: pointer;
    transition: background var(--transition);
}
.pg-lb-arrow:hover { background: rgba(255, 255, 255, 0.25); }
.pg-lb-prev { inset-inline-start: 1rem; }
.pg-lb-next { inset-inline-end: 1rem; }
.pg-lb-count {
    position: absolute;
    inset-block-end: 1.1rem;
    left: 50%;
    transform: translateX(-50%);
    background: rgba(255, 255, 255, 0.12);
    color: #fff;
    font-size: 0.78rem;
    padding: 0.25rem 0.75rem;
    border-radius: 999px;
    direction: ltr;
}
@media (max-width: 640px) {
    .pg-lb-arrow { width: 2.4rem; height: 2.4rem; }
}
body.pg-lightbox-lock { overflow: hidden; }

/* ===================== امتیاز ستاره‌ای · نظرها · پرسش‌وپاسخ =====================
   ستاره‌ها دو لایه‌اند: پایهٔ خاکستری + لایهٔ کهربایی که با width درصدی بریده
   می‌شود. در چیدمان راست‌به‌چپ ابتدای لایه (inset-inline-start) سمت راست است،
   پس برش از همان ستارهٔ اول شروع می‌شود و کسر امتیاز دقیق دیده می‌شود. */
.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; }

.rstars { position: relative; display: inline-flex; line-height: 1; vertical-align: -0.16em; white-space: nowrap; }
.rstars-base, .rstars-fill { display: flex; }
.rstars-base { color: var(--border-light); }
.rstars-fill { position: absolute; inset-block-start: 0; inset-inline-start: 0; overflow: hidden; color: #FBBF24; }
.rstars-sm .ic, .rstars.rstars-sm .ic { width: 0.9em; height: 0.9em; }
.rstars-meta { font-size: 0.8rem; color: var(--text-secondary); margin-inline-start: 0.45rem; }
.rstars-meta b { color: var(--text-primary); }
.rstars-none { color: var(--text-muted); }

/* ستاره‌های فشرده روی کارت‌های فهرست */
.pc-stars { display: flex; align-items: center; gap: 0.3rem; margin-bottom: 0.4rem; font-size: 0.78rem; }
.pc-stars .rstars .ic { width: 0.85em; height: 0.85em; }
.pc-stars-n { color: var(--text-muted); direction: ltr; }

/* ---------- قالب مشترک دو بخش ---------- */
.pr-wrap { margin-top: 2rem; display: flex; flex-direction: column; gap: 1.25rem; }
.pr-sec { background: var(--bg-card); border: 1px solid var(--border-color); border-radius: var(--radius); padding: 1.25rem; scroll-margin-top: 1rem; }
.pr-head { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem 0.9rem; padding-bottom: 0.85rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-color); }
.pr-head h2 { font-size: 1.05rem; font-weight: 700; display: flex; align-items: center; gap: 0.45rem; margin: 0; }
.pr-head h2 .ic { color: var(--red-primary); }
.pr-score { display: flex; flex-wrap: wrap; align-items: center; gap: 0.45rem; margin-inline-start: auto; }
.pr-score-num { font-size: 1.5rem; font-weight: 700; color: #FBBF24; line-height: 1; }
.pr-score-of { font-size: 0.75rem; color: var(--text-muted); }
.pr-score-n { font-size: 0.8rem; color: var(--text-secondary); }
.pr-score-none { font-size: 0.82rem; color: var(--text-muted); }

.pr-empty { padding: 1.1rem; text-align: center; color: var(--text-muted); font-size: 0.85rem; background: var(--bg-secondary); border-radius: var(--radius-sm); }

/* ---------- فهرست نظرها ---------- */
.pr-list { display: flex; flex-direction: column; gap: 0.7rem; }
.pr-item { background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--radius-sm); padding: 0.8rem 0.9rem; }
.pr-item-top { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin-bottom: 0.45rem; }
.pr-avatar { width: 1.7rem; height: 1.7rem; display: flex; align-items: center; justify-content: center; border-radius: 999px; background: var(--bg-input); color: var(--text-muted); flex: 0 0 auto; }
.pr-author { font-weight: 600; font-size: 0.88rem; }
.pr-date { font-size: 0.75rem; color: var(--text-muted); margin-inline-start: auto; direction: ltr; }
.pr-body { font-size: 0.87rem; line-height: 1.9; color: var(--text-secondary); overflow-wrap: anywhere; }

/* ---------- فرم‌ها ---------- */
.pr-form { margin-top: 1rem; padding: 1rem; background: var(--bg-secondary); border: 1px dashed var(--border-light); border-radius: var(--radius-sm); }
.pr-form-title { font-size: 0.88rem; font-weight: 600; display: flex; align-items: center; gap: 0.4rem; margin-bottom: 0.7rem; }
.pr-textarea { resize: vertical; min-height: 3.6rem; font-family: inherit; font-size: 0.87rem; line-height: 1.8; }
.pr-form-foot { display: flex; flex-wrap: wrap; align-items: center; gap: 0.6rem; margin-top: 0.7rem; }
.pr-note { font-size: 0.74rem; color: var(--text-muted); flex: 1 1 12rem; }
.pr-login { margin-top: 1rem; padding: 0.8rem 1rem; background: rgba(220, 38, 38, 0.08); border: 1px solid rgba(220, 38, 38, 0.25); border-radius: var(--radius-sm); font-size: 0.85rem; color: var(--text-secondary); }
.pr-login a { color: var(--red-light); font-weight: 600; }

/* انتخابگر ستاره — کاملا CSS، بدون JS.
   رادیوها در DOM به ترتیب ۵..۱ می‌آیند؛ row-reverse در RTL ستارهٔ «۱» را سمت
   راست می‌گذارد و «~» فقط برادرهای بعدی (امتیازهای کمتر) را رنگ می‌کند. */
.star-input { display: flex; flex-direction: row-reverse; justify-content: flex-end; gap: 0.1rem; margin-bottom: 0.8rem; }
.star-input input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.star-input label { cursor: pointer; font-size: 1.45rem; line-height: 1; color: var(--border-light); transition: color var(--transition), transform var(--transition); }
.star-input input:checked ~ label { color: #FBBF24; }
.star-input:hover input:checked ~ label { color: var(--border-light); }
.star-input label:hover, .star-input label:hover ~ label { color: #FBBF24; }
.star-input label:hover { transform: scale(1.12); }
.star-input input:focus-visible + label { outline: 2px solid var(--red-light); outline-offset: 2px; border-radius: var(--radius-sm); }

/* ---------- پرسش و پاسخ ---------- */
.qa-list { display: flex; flex-direction: column; gap: 0.9rem; }
.qa-item { background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--radius-sm); padding: 0.85rem 0.9rem; }
.qa-q, .qa-a { display: flex; gap: 0.6rem; }
.qa-q-main { min-width: 0; flex: 1; }
.qa-a { margin-top: 0.7rem; padding-top: 0.7rem; padding-inline-start: 0.9rem; border-top: 1px dashed var(--border-color); border-inline-start: 2px solid var(--border-color); }
.qa-a.is-shop { border-inline-start-color: var(--red-primary); }
.qa-tag { flex: 0 0 auto; font-size: 0.68rem; font-weight: 700; padding: 0.15rem 0.45rem; border-radius: 999px; white-space: nowrap; height: fit-content; display: inline-flex; align-items: center; gap: 0.2rem; }
.qa-tag-q { background: rgba(148, 163, 184, 0.15); color: #CBD5E1; border: 1px solid rgba(148, 163, 184, 0.3); }
.qa-tag-a { background: rgba(34, 197, 94, 0.13); color: #4ADE80; border: 1px solid rgba(34, 197, 94, 0.3); }
.qa-meta { font-size: 0.75rem; color: var(--text-muted); margin-bottom: 0.3rem; display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem; }
.qa-meta b { color: var(--text-secondary); font-weight: 600; }
.qa-badge-shop { display: inline-flex; align-items: center; gap: 0.2rem; font-size: 0.68rem; font-weight: 700; padding: 0.1rem 0.4rem; border-radius: 999px; background: rgba(220, 38, 38, 0.15); color: var(--red-light); border: 1px solid rgba(220, 38, 38, 0.3); }
.qa-body { font-size: 0.87rem; line-height: 1.9; color: var(--text-secondary); overflow-wrap: anywhere; }

.qa-reply { margin-top: 0.7rem; }
.qa-reply > summary { cursor: pointer; display: inline-flex; align-items: center; gap: 0.3rem; font-size: 0.76rem; color: var(--text-muted); padding: 0.2rem 0; list-style: none; }
.qa-reply > summary::-webkit-details-marker { display: none; }
.qa-reply > summary:hover { color: var(--red-light); }
.qa-reply-form { margin-top: 0.5rem; display: flex; flex-direction: column; align-items: flex-start; gap: 0.5rem; }
.qa-reply-form textarea { resize: vertical; font-family: inherit; font-size: 0.85rem; line-height: 1.8; }

@media (max-width: 768px) {
    .pr-sec { padding: 1rem 0.85rem; }
    .pr-score { margin-inline-start: 0; width: 100%; }
    .pr-date { margin-inline-start: 0; }
    .qa-a { padding-inline-start: 0.6rem; }
    .star-input label { font-size: 1.7rem; }
}

/* ===================== بررسی عکس نمونهٔ قطعه (part-check.php) =====================
   مرحلهٔ میان سبد خرید و ثبت سفارش. مشتری عکس قطعهٔ خودش را می‌فرستد،
   کارشناس مطابقت و موجودی را تأیید می‌کند. کلاس‌های همین بخش در پنل ادمین
   (admin/part-checks.php و admin/order-detail.php) هم استفاده می‌شوند، چون
   هر دو همین شیت را بار می‌کنند. */

/* دو کلید عمومی که تا امروز نداشتیم */
.btn-lg { padding: 0.8rem 1.6rem; font-size: 0.95rem; font-weight: 600; }
.btn-ghost {
    background: transparent;
    color: var(--text-muted);
    border: 1px dashed var(--border-light);
}
.btn-ghost:hover { color: var(--text-primary); border-color: var(--text-muted); background: var(--bg-input); }
.btn.is-locked { pointer-events: none; opacity: 0.45; }

/* ---------- نشانگر سه‌گام خرید ---------- */
.pchk-steps {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem 0.75rem;
    list-style: none;
    margin: 0 0 1.1rem;
    padding: 0;
}
.pchk-steps li {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.82rem;
    color: var(--text-muted);
    padding: 0.32rem 0.7rem 0.32rem 0.4rem;
    border: 1px solid var(--border-color);
    border-radius: 999px;
    background: var(--bg-card);
}
.pchk-steps li span {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.35rem;
    height: 1.35rem;
    flex: 0 0 auto;
    border-radius: 999px;
    font-size: 0.72rem;
    font-weight: 700;
    background: var(--bg-input);
    color: var(--text-muted);
}
.pchk-steps li.is-done { color: #4ADE80; border-color: rgba(34, 197, 94, 0.35); }
.pchk-steps li.is-done span { background: rgba(34, 197, 94, 0.18); color: #4ADE80; }
.pchk-steps li.is-now {
    color: var(--text-primary);
    border-color: var(--red-primary);
    box-shadow: 0 0 0 1px rgba(220, 38, 38, 0.3), 0 4px 14px rgba(220, 38, 38, 0.14);
}
.pchk-steps li.is-now span { background: var(--red-primary); color: #fff; }

/* گام‌هایی که قابل بازگشت‌اند (سبد/بررسی عکس) یک <a> دارند — با مارجین
   منفی، کل حبهٔ li کلیک‌پذیر می‌شود، نه فقط متن. */
.pchk-steps li a {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    color: inherit;
    text-decoration: none;
    margin: -0.32rem -0.7rem -0.32rem -0.4rem;
    padding: 0.32rem 0.7rem 0.32rem 0.4rem;
    border-radius: 999px;
}
.pchk-steps li a:hover { background: var(--bg-input); }

/* ---------- پیغام درشت بالای صفحه ----------
   خواستهٔ مدیر: مشتری حتما آن را ببیند، پس قاب پررنگ و متن بزرگ‌تر از
   متن معمول صفحه. نوار سرخ سمت شروع (در RTL = راست) چشم را می‌گیرد. */
.pchk-notice {
    display: flex;
    gap: 0.9rem;
    padding: 1.1rem 1.15rem;
    margin-bottom: 1.25rem;
    border: 1px solid rgba(220, 38, 38, 0.35);
    border-inline-start: 4px solid var(--red-primary);
    border-radius: var(--radius);
    background: linear-gradient(135deg, rgba(220, 38, 38, 0.12), rgba(220, 38, 38, 0.03));
    box-shadow: var(--shadow);
}
.pchk-notice-icon { flex: 0 0 auto; color: var(--red-light); }
.pchk-notice-icon .ic { width: 2rem; height: 2rem; }
.pchk-notice-body { min-width: 0; }
.pchk-notice-title {
    display: block;
    font-size: 1.05rem;
    font-weight: 800;
    line-height: 1.7;
    color: #FCA5A5;
    margin-bottom: 0.5rem;
}
.pchk-notice-text {
    font-size: 0.97rem;
    line-height: 2.05;
    color: var(--text-primary);
    margin: 0;
}
.pchk-notice-list {
    list-style: none;
    margin: 0.8rem 0 0;
    padding: 0.75rem 0 0;
    border-top: 1px dashed rgba(220, 38, 38, 0.3);
    display: flex;
    flex-direction: column;
    gap: 0.45rem;
}
.pchk-notice-list li {
    display: flex;
    align-items: flex-start;
    gap: 0.45rem;
    font-size: 0.88rem;
    line-height: 1.9;
    color: var(--text-secondary);
}
.pchk-notice-list li .ic { flex: 0 0 auto; margin-top: 0.35rem; color: var(--red-light); }
.pchk-notice-list b { color: var(--text-primary); }

/* ---------- کارت وضعیت ---------- */
.pchk-panel {
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 1.1rem 1.15rem;
    margin-bottom: 1.25rem;
    box-shadow: var(--shadow);
}
.pchk-panel.is-wait { border-inline-start: 4px solid #FBBF24; }
.pchk-panel.is-ok   { border-inline-start: 4px solid var(--green); }
.pchk-panel.is-no   { border-inline-start: 4px solid var(--red-primary); }
.pchk-panel-head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem 0.85rem;
    margin-bottom: 0.75rem;
}
.pchk-panel-text {
    font-size: 0.9rem;
    line-height: 2;
    color: var(--text-secondary);
    margin: 0 0 0.9rem;
}
.pchk-panel-text b { color: var(--text-primary); }

.pchk-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    font-size: 0.84rem;
    font-weight: 700;
    padding: 0.3rem 0.7rem;
    border-radius: 999px;
}
.pchk-badge.is-wait { color: #FCD34D; background: rgba(234, 179, 8, 0.14); border: 1px solid rgba(234, 179, 8, 0.35); }
.pchk-badge.is-ok   { color: #4ADE80; background: rgba(34, 197, 94, 0.14);  border: 1px solid rgba(34, 197, 94, 0.35); }
.pchk-badge.is-no   { color: #FCA5A5; background: rgba(220, 38, 38, 0.14);  border: 1px solid rgba(220, 38, 38, 0.35); }
.pchk-when {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.78rem;
    color: var(--text-muted);
    margin-inline-start: auto;
}

/* ---------- کادر بزرگ «در انتظار بررسی موجودی» ----------
   گیت کاملا مسدودکننده (خواستهٔ کاربر ۲۰۲۶-۰۸-۳۰): بزرگ، وسط‌چین، با یک
   حلقهٔ نور محو-و-پررنگ‌شونده پشت آیکون و برچسبی که مثل چراغ چشمک می‌زند،
   تا واضح باشد صفحه «زنده» است و منتظر رخدادی از سمت ادمین می‌ماند. */
.pchk-panel-big {
    position: relative;
    text-align: center;
    padding: 2.25rem 1.5rem;
    overflow: hidden;
}
.pchk-wait-icon {
    position: relative;
    z-index: 1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 72px;
    height: 72px;
    border-radius: 50%;
    background: rgba(234, 179, 8, 0.12);
    color: #FCD34D;
    margin-bottom: 0.9rem;
    font-size: 1.8rem;
}
.pchk-wait-icon.is-ok {
    background: rgba(34, 197, 94, 0.14);
    color: #4ADE80;
    animation: pchkPop 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
}
/* پیش‌تر با inset/height ثابت جا افتاده بود (بسته به ارتفاع کارت، مرکز
   هاله بالاتر از مرکز آیکون می‌ایستاد — «از بالا و پایین نامیزون»). حالا
   دقیقا روی مرکز خود آیکون قفل است: padding-top ی کارت (2.25rem) + نصف
   ارتفاع آیکون (72px/2) = فاصلهٔ مرکز آیکون از بالای کارت. */
.pchk-wait-glow {
    position: absolute;
    top: calc(2.25rem + 36px);
    left: 50%;
    width: 190px;
    height: 190px;
    transform: translate(-50%, -50%);
    background: radial-gradient(circle, rgba(234, 179, 8, 0.28) 0%, rgba(234, 179, 8, 0) 70%);
    animation: pchkGlow 2.2s ease-in-out infinite;
    pointer-events: none;
}
.pchk-badge-blink { animation: pchkBlink 1.6s ease-in-out infinite; }

@keyframes pchkGlow {
    /* translate(-50%,-50%) باید همراه هر فریم تکرار شود، وگرنه انیمیشن
       آن را از transform ثابت عنصر پاک می‌کند و هاله از مرکز آیکون می‌پرد */
    0%, 100% { opacity: 0.45; transform: translate(-50%, -50%) scale(0.92); }
    50%      { opacity: 1;    transform: translate(-50%, -50%) scale(1.08); }
}
@keyframes pchkBlink {
    0%, 100% { opacity: 1;    box-shadow: 0 0 0 0 rgba(234, 179, 8, 0.35); }
    50%      { opacity: 0.55; box-shadow: 0 0 0 6px rgba(234, 179, 8, 0); }
}
@keyframes pchkPop {
    0%   { transform: scale(0.4); opacity: 0; }
    60%  { transform: scale(1.12); opacity: 1; }
    100% { transform: scale(1); }
}
.pchk-panel-pop { animation: pchkPanelGlow 1.8s ease-out; }
@keyframes pchkPanelGlow {
    0%   { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.45); }
    100% { box-shadow: 0 0 0 22px rgba(34, 197, 94, 0); }
}
@media (prefers-reduced-motion: reduce) {
    .pchk-wait-glow, .pchk-badge-blink, .pchk-wait-icon.is-ok, .pchk-panel-pop { animation: none; }
}

/* ---------- دو خط تأیید: مطابقت قطعه و موجودی ---------- */
.pchk-confirm { display: flex; flex-direction: column; gap: 0.5rem; margin-bottom: 0.9rem; }
.pchk-confirm-row {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.35rem;
    font-size: 0.89rem;
    line-height: 1.9;
    padding: 0.55rem 0.75rem;
    border-radius: var(--radius-sm);
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    color: var(--text-secondary);
}
.pchk-confirm-row .ic { flex: 0 0 auto; }
.pchk-confirm-row b { color: var(--text-primary); }
.pchk-confirm-row.is-ok {
    color: #4ADE80;
    background: rgba(34, 197, 94, 0.09);
    border-color: rgba(34, 197, 94, 0.3);
}
.pchk-confirm-row.is-ok b { color: #4ADE80; }
.pchk-confirm-row.is-soft {
    color: #FCD34D;
    background: rgba(234, 179, 8, 0.08);
    border-color: rgba(234, 179, 8, 0.28);
}
.pchk-confirm-row.is-soft b { color: #FCD34D; }
.pchk-confirm-note { color: var(--text-muted); font-size: 0.83rem; }

.pchk-adminnote {
    font-size: 0.88rem;
    line-height: 1.95;
    color: var(--text-secondary);
    padding: 0.65rem 0.8rem;
    margin: 0 0 0.9rem;
    border-radius: var(--radius-sm);
    background: var(--bg-secondary);
    border: 1px dashed var(--border-light);
}
.pchk-adminnote b { color: var(--text-primary); }
.pchk-adminnote.is-no { border-color: rgba(220, 38, 38, 0.4); background: rgba(220, 38, 38, 0.07); }

/* ---------- بلوک عکس‌های ارسالی (includes/partcheck-photos.php) ---------- */
.pchk-sent {
    padding: 0.85rem 0.9rem;
    border-radius: var(--radius-sm);
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    margin-bottom: 0.9rem;
}
.pchk-sent-for, .pchk-sent-line {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 0.35rem;
    font-size: 0.86rem;
    line-height: 1.9;
    color: var(--text-secondary);
    margin: 0 0 0.4rem;
}
.pchk-sent-for b, .pchk-sent-line b { color: var(--text-primary); }
.pchk-sent-head {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    font-size: 0.8rem;
    color: var(--text-muted);
    margin: 0.6rem 0 0.5rem;
}
.pchk-tech {
    font-size: 0.75rem;
    color: var(--text-muted);
    direction: ltr;
    unicode-bidi: embed;
    padding: 0.05rem 0.4rem;
    border-radius: 999px;
    background: var(--bg-input);
}

/* شبکهٔ بندانگشتی — با تعداد عکس (۳ تا ۸) خودش تنظیم می‌شود */
.pchk-thumbs {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(108px, 1fr));
    gap: 0.55rem;
}
.pchk-thumb {
    position: relative;
    display: block;
    aspect-ratio: 1 / 1;
    border-radius: var(--radius-sm);
    overflow: hidden;
    border: 1px solid var(--border-color);
    background: var(--bg-input);
    transition: border-color var(--transition), transform var(--transition);
}
.pchk-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pchk-thumb:hover { border-color: var(--red-primary); transform: translateY(-2px); }
.pchk-thumb-n {
    position: absolute;
    top: 0.3rem;
    inset-inline-start: 0.3rem;
    font-size: 0.66rem;
    font-weight: 700;
    color: #fff;
    padding: 0.05rem 0.35rem;
    border-radius: 999px;
    background: rgba(17, 24, 39, 0.72);
}

/* ---------- ردیف کلیدها ---------- */
.pchk-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.6rem; }
.pchk-skip-form { display: inline-flex; margin: 0; }
.pchk-skip { font-size: 0.8rem; }

/* ---------- فرم آپلود ---------- */
.pchk-form {
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 1.15rem;
    box-shadow: var(--shadow);
    scroll-margin-top: 1rem;
}
.pchk-form-title {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 1rem;
    font-weight: 700;
    color: var(--text-primary);
    margin: 0 0 1rem;
    padding-bottom: 0.75rem;
    border-bottom: 1px solid var(--border-color);
}
.pchk-form-title .ic { color: var(--red-primary); }
.pchk-form-for {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.4rem;
    font-size: 0.87rem;
    color: var(--text-secondary);
    padding: 0.55rem 0.75rem;
    margin: 0 0 1rem;
    border-radius: var(--radius-sm);
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
}
.pchk-form-for b { color: var(--text-primary); }
.pchk-req { font-size: 0.78rem; font-weight: 700; color: var(--red-light); margin-inline-start: 0.3rem; }
.pchk-hint {
    display: flex;
    align-items: flex-start;
    gap: 0.35rem;
    font-size: 0.76rem;
    line-height: 1.85;
    color: var(--text-muted);
    margin-top: 0.4rem;
}
.pchk-hint .ic { flex: 0 0 auto; margin-top: 0.3rem; }

/* کادرهای مربعی آپلود عکس — کلیک روی هر کادر، انتخابگر فایل نامرئی همان
   کادر را باز می‌کند (همان ترفند .file-pick)؛ با انتخاب عکس، خود تصویر به‌جای
   آیکون دوربین در کادر نمایش داده می‌شود. رجوع کنید به قسمت اسکریپت در
   part-check.php. */
.pc-shots { display: grid; grid-template-columns: repeat(auto-fill, minmax(118px, 1fr)); gap: 0.6rem; margin-bottom: 0.4rem; }
.pc-shot {
    position: relative;
    aspect-ratio: 1 / 1;
    border: 2px dashed var(--border-color);
    border-radius: var(--radius);
    overflow: hidden;
    background: var(--bg-input);
    transition: border-color var(--transition);
}
.pc-shot:hover { border-color: var(--red-primary); }
.pc-shot.has-img { border-style: solid; }
.pc-shot-input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; z-index: 2; margin: 0; }
.pc-shot-view { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; }
.pc-shot-view img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pc-shot-ph { display: flex; flex-direction: column; align-items: center; gap: 0.3rem; color: var(--text-muted); font-size: 0.72rem; text-align: center; padding: 0 0.4rem; }
.pc-shot-clear {
    position: absolute;
    top: 0.3rem;
    inset-inline-end: 0.3rem;
    z-index: 3;
    width: 1.5rem;
    height: 1.5rem;
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(17, 24, 39, 0.75);
    border: none;
    border-radius: 999px;
    color: #fff;
    cursor: pointer;
    padding: 0;
}
.pc-shot-clear .ic { width: 0.9rem; height: 0.9rem; }
.pc-shot-clear[hidden] { display: none; }
.pc-shot-add { cursor: pointer; }
.pc-shot-add .pc-shot-ph { color: var(--red-light); }
.pc-shot-add:hover { border-color: var(--red-primary); background: rgba(220, 38, 38, 0.06); }

/* ---------- جعبهٔ ردکردن مرحله ----------
   قبلا یک قاب کم‌رنگ خط‌چین در پایین صفحه (زیر فرم کامل) بود — خواستهٔ
   کاربر: بالای صفحه و واضح‌تر. حالا بلافاصله بعد از پیغام درشت بالای صفحه
   می‌آید (کنار همان تصمیمی که مشتری تازه در حال گرفتنش است) و به‌جای
   خط‌چین محو، قاب توپر با نوار رنگی کهربایی و آیکون بزرگ دارد — هم‌خانواده
   با .pchk-notice ولی رنگش جداست تا با هشدار قرمز «مرجوعی نیست» قاطی نشود. */
.pchk-skipbox {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.9rem;
    margin-bottom: 1.25rem;
    padding: 1rem 1.15rem;
    border: 1px solid rgba(234, 179, 8, 0.35);
    border-inline-start: 4px solid #FBBF24;
    border-radius: var(--radius);
    background: linear-gradient(135deg, rgba(234, 179, 8, 0.1), rgba(234, 179, 8, 0.02));
}
.pchk-skipbox-ic { flex: 0 0 auto; color: #FBBF24; }
.pchk-skipbox-ic .ic { width: 1.8rem; height: 1.8rem; }
.pchk-skipbox > div { min-width: 0; flex: 1 1 18rem; }
.pchk-skipbox b { display: inline-flex; align-items: center; gap: 0.35rem; font-size: 0.98rem; color: var(--text-primary); }
.pchk-skipbox p { font-size: 0.84rem; line-height: 1.9; color: var(--text-secondary); margin: 0.35rem 0 0; }
.pchk-skipbox p b { display: inline; color: #FCA5A5; }
.pchk-skip-top { flex: 0 0 auto; }

@media (max-width: 768px) {
    .pchk-notice { flex-direction: column; gap: 0.6rem; padding: 1rem 0.9rem; }
    .pchk-notice-icon .ic { width: 1.6rem; height: 1.6rem; }
    .pchk-notice-title { font-size: 0.98rem; }
    .pchk-notice-text { font-size: 0.9rem; }
    .pchk-when { margin-inline-start: 0; }
    .pchk-thumbs { grid-template-columns: repeat(auto-fill, minmax(88px, 1fr)); }
    .pchk-actions .btn { flex: 1 1 100%; }
    .pchk-skip-form { width: 100%; }
    .pchk-skip-form .btn { width: 100%; }
}

/* ---------- سمت ادمین: صف بررسی و بلوک جزئیات سفارش ---------- */
.pcadm-tabs { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1.15rem; }
.pcadm-tab {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    font-size: 0.84rem;
    padding: 0.42rem 0.85rem;
    border-radius: 999px;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    color: var(--text-secondary);
    transition: all var(--transition);
}
.pcadm-tab:hover { color: var(--text-primary); border-color: var(--border-light); }
.pcadm-tab.is-on { background: var(--red-primary); border-color: var(--red-primary); color: #fff; font-weight: 600; }
.pcadm-tab-n {
    font-size: 0.72rem;
    font-weight: 700;
    padding: 0.02rem 0.4rem;
    border-radius: 999px;
    background: var(--bg-input);
    color: var(--text-muted);
    direction: ltr;
}
.pcadm-tab.is-on .pcadm-tab-n { background: rgba(255, 255, 255, 0.22); color: #fff; }

.pcadm-list { display: flex; flex-direction: column; gap: 1rem; }
.pcadm-card {
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    padding: 1rem 1.05rem;
    box-shadow: var(--shadow);
}
.pcadm-card.is-pending  { border-inline-start: 4px solid #FBBF24; }
.pcadm-card.is-approved { border-inline-start: 4px solid var(--green); }
.pcadm-card.is-rejected { border-inline-start: 4px solid var(--red-primary); }
.pcadm-top {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem 0.8rem;
    padding-bottom: 0.7rem;
    margin-bottom: 0.8rem;
    border-bottom: 1px solid var(--border-color);
}
.pcadm-id { font-size: 0.9rem; font-weight: 700; color: var(--text-primary); direction: ltr; }
.pcadm-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 0.55rem; margin-bottom: 0.85rem; }
.pcadm-f {
    font-size: 0.83rem;
    line-height: 1.9;
    color: var(--text-secondary);
    padding: 0.5rem 0.7rem;
    border-radius: var(--radius-sm);
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    overflow-wrap: anywhere;
}
.pcadm-f span { display: block; font-size: 0.72rem; color: var(--text-muted); margin-bottom: 0.15rem; }
.pcadm-f b { color: var(--text-primary); font-weight: 600; }
.pcadm-f a { color: var(--red-light); }

/* فرم داوری: تأیید/رد + یادداشت + تأیید موجودی، همه در یک جا */
.pcadm-review {
    margin-top: 0.9rem;
    padding: 0.9rem 1rem;
    border-radius: var(--radius-sm);
    background: var(--bg-secondary);
    border: 1px dashed var(--border-light);
}
.pcadm-review-title {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    font-size: 0.86rem;
    font-weight: 700;
    color: var(--text-primary);
    margin-bottom: 0.7rem;
}
.pcadm-review-title .ic { color: var(--red-primary); }
.pcadm-row { display: flex; flex-wrap: wrap; align-items: center; gap: 0.6rem; margin-bottom: 0.6rem; }
.pcadm-row > .form-control { flex: 1 1 14rem; min-width: 0; }
.pcadm-stock {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.6rem;
    padding: 0.6rem 0.7rem;
    margin-bottom: 0.7rem;
    border-radius: var(--radius-sm);
    background: rgba(34, 197, 94, 0.07);
    border: 1px solid rgba(34, 197, 94, 0.28);
}
.pcadm-check {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.86rem;
    font-weight: 600;
    color: #4ADE80;
    cursor: pointer;
    white-space: nowrap;
}
.pcadm-check input { width: 1.05rem; height: 1.05rem; accent-color: var(--green); cursor: pointer; }
.pcadm-acts { display: flex; flex-wrap: wrap; gap: 0.6rem; }
.pcadm-empty {
    padding: 2rem 1rem;
    text-align: center;
    color: var(--text-muted);
    font-size: 0.88rem;
    background: var(--bg-card);
    border: 1px dashed var(--border-color);
    border-radius: var(--radius);
}

@media (max-width: 768px) {
    .pcadm-grid { grid-template-columns: minmax(0, 1fr); }
    .pcadm-acts .btn { flex: 1 1 100%; }
}

/* ===== جعبهٔ «این آفر زنده نیست» در فرم ویرایش آفر (admin/banners.php) =====
   کهربایی، هم‌رنگ هشدارهای دیگر همین صفحه، تا ادمین بفهمد تیک‌ها از پیش برای
   برگرداندن آفر چیده شده‌اند. */
.offer-back-box {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    margin-bottom: 0.9rem;
    padding: 0.7rem 0.8rem;
    background: rgba(251, 191, 36, 0.08);
    border: 1px solid rgba(251, 191, 36, 0.45);
    border-radius: var(--radius-sm);
    font-size: 0.78rem;
    line-height: 1.9;
    color: var(--text-secondary);
}

.offer-back-box b:first-child {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    font-size: 0.85rem;
    color: #FBBF24;
}

/* ===== کادر تأیید حذف — جایگزین پاپ‌آپ بومی confirm() =====
   خواستهٔ کاربر: «یک پیام روی خود صفحه با یک کادر زیبا بیاد، دیگر مثل
   پاپ‌آپ نشون نده». رفتارش در admin/layout-bottom.php است — یک اسکریپت
   عمومی که [data-confirm="متن"] روی هر <a>/<button> را می‌گیرد. */
.confirm-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.55);
    backdrop-filter: blur(2px);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 3000;
    padding: 1rem;
    animation: confirmFadeIn 0.15s ease;
}
@keyframes confirmFadeIn { from { opacity: 0; } to { opacity: 1; } }
.confirm-box {
    width: 100%;
    max-width: 380px;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    padding: 1.35rem 1.25rem 1.1rem;
    text-align: center;
    animation: confirmPop 0.18s ease;
}
@keyframes confirmPop { from { transform: scale(0.92); opacity: 0; } to { transform: scale(1); opacity: 1; } }
.confirm-icon {
    width: 46px;
    height: 46px;
    margin: 0 auto 0.75rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(239, 68, 68, 0.12);
    color: var(--red-light);
}
.confirm-icon .ic { width: 24px; height: 24px; }
.confirm-msg {
    font-size: 0.9rem;
    color: var(--text-primary);
    line-height: 1.9;
    margin-bottom: 1.1rem;
}
.confirm-actions {
    display: flex;
    gap: 0.6rem;
    justify-content: center;
}

/* ===================== مدیریت قیمت‌ها (admin/price-management.php) =====================
   خواستهٔ کاربر ۲۰۲۶-۰۹-۱۰: محدودهٔ اعمال (همه/دسته/محصول) + سه اقدام
   مستقل (درصد قیمت، حالت نمایش، موجودی گروهی). */
.pm-scope-tabs {
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
    margin-bottom: 0.9rem;
}
.pm-scope-opt {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.5rem 0.85rem;
    border-radius: var(--radius-sm);
    border: 1px solid var(--border-color);
    background: var(--bg-card);
    font-size: 0.82rem;
    color: var(--text-secondary);
    cursor: pointer;
    transition: border-color var(--transition), color var(--transition);
}
.pm-scope-opt:has(input:checked) {
    border-color: var(--red-primary);
    color: var(--text-primary);
    background: color-mix(in srgb, var(--red-primary) 10%, var(--bg-card));
}
.pm-scope-opt input { accent-color: var(--red-primary); }
.pm-scope-block { margin-top: 0.6rem; }
.pm-count-note { font-size: 0.72rem; color: var(--text-muted); margin-top: 0.35rem; }
.pm-count-badge {
    margin-top: 0.9rem;
    padding: 0.55rem 0.8rem;
    border-radius: var(--radius-sm);
    background: color-mix(in srgb, var(--red-primary) 10%, transparent);
    border: 1px solid color-mix(in srgb, var(--red-primary) 30%, transparent);
    color: var(--text-primary);
    font-size: 0.8rem;
    font-weight: 600;
}
.pm-inline-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.9rem;
    align-items: flex-end;
    margin-bottom: 0.9rem;
}
.pm-check-row {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
    margin-bottom: 1rem;
}
.pm-check {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 0.85rem;
    color: var(--text-secondary);
    cursor: pointer;
}
.pm-check input { accent-color: var(--red-primary); width: 1.05rem; height: 1.05rem; }

/* ۲۰۲۶-۰۹-۱۳: نسخهٔ شیک‌تر پیش‌نمایش «N محصول (M واریانت)» — قبلا یک
   جملهٔ تخت داخل .flash-info بود؛ حالا عدد بزرگ/برجسته + هر فیلتر
   پرشده یک چیپ جدا (خواستهٔ کاربر: «این متن رو زیباتر و خواناتر بنویس»). */
.pm-preview-flash {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    text-align: right;
    max-width: none;
}
.pm-preview-flash > .ic { flex-shrink: 0; margin-top: 0.2rem; }
.pm-preview-stats {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 0.35rem;
    font-size: 0.9rem;
    color: var(--text-secondary);
    margin-bottom: 0.6rem;
}
.pm-preview-num {
    font-size: 1.35rem;
    font-weight: 800;
    color: var(--red-primary);
    line-height: 1;
}
.pm-preview-dot { color: var(--text-muted); }
.pm-preview-note { color: var(--text-muted); font-size: 0.8rem; margin-inline-start: 0.2rem; }
.pm-preview-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 0.45rem;
}
.pm-preview-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.3rem 0.75rem;
    border-radius: 999px;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    font-size: 0.78rem;
    color: var(--text-secondary);
}
.pm-preview-chip b { color: var(--text-primary); font-weight: 700; }
.pm-preview-chip-all { color: var(--text-muted); }
.pm-preview-chip-all .ic { width: 0.9rem; height: 0.9rem; }

/* ۲۰۲۶-۰۹-۱۰ پیگیری: محدودهٔ فیلتری چندوجهی (دسته/برند/مدل/سال/کشور/
   سازنده، هرکدام یک select مستقل که ترکیب می‌شوند) + بخش مدیریت
   شماره‌های تماس (افزودن/حذف ردیفی). */
.pm-filter-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
    gap: 0.9rem;
}
.pm-phone-group label {
    display: block;
    font-size: 0.82rem;
    color: var(--text-secondary);
    margin-bottom: 0.5rem;
}
.pm-phone-list { margin-bottom: 0.6rem; }
.pm-phone-row {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
}
.pm-phone-row .form-control { flex: 1; }
.pm-phone-remove {
    flex-shrink: 0;
    width: 2rem;
    height: 2rem;
    border-radius: var(--radius-sm);
    border: 1px solid var(--border-color);
    background: var(--bg-card);
    color: var(--red-primary);
    font-size: 1.1rem;
    line-height: 1;
    cursor: pointer;
    transition: background var(--transition), color var(--transition);
}
.pm-phone-remove:hover { background: var(--red-primary); color: #fff; }

/* ===================== دکمه/پنل «تماس با فروشگاه» (product.php + کارت‌های محصول) =====================
   خواستهٔ کاربر ۲۰۲۶-۰۹-۱۰: کلیک روی «تماس با فروشگاه» یک پنل شیک باز
   می‌کند که شماره‌های ثابت و موبایل فروشگاه را نشان می‌دهد (contactNumbers()
   موجود در functions.php — همان شماره‌هایی که فوتر سایت هم نشان می‌دهد،
   منبعی تازه لازم نبود). */
.contact-store-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.45rem;
    width: 100%;
    padding: 0.75rem 1rem;
    border: none;
    border-radius: var(--radius);
    background: linear-gradient(135deg, var(--red-primary), var(--red-hover));
    color: #fff;
    font-size: 0.92rem;
    font-weight: 700;
    cursor: pointer;
    box-shadow: 0 5px 14px color-mix(in srgb, var(--red-primary) 30%, transparent);
    transition: filter var(--transition), transform var(--transition);
}
.contact-store-btn:hover { filter: brightness(1.08); transform: translateY(-1px); }
.contact-store-btn .ic { width: 1.1rem; height: 1.1rem; }

/* کارت‌های گرید (شاپ/دسته‌بندی/قطعات/جست‌وجو) نسخهٔ کوچک‌تر همین دکمه دارند */
.contact-store-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.72rem;
    font-weight: 700;
    color: var(--red-light);
    background: color-mix(in srgb, var(--red-primary) 12%, transparent);
    border: 1px solid color-mix(in srgb, var(--red-primary) 32%, transparent);
    padding: 0.2rem 0.55rem;
    border-radius: 999px;
}
.contact-store-chip .ic { width: 0.8rem; height: 0.8rem; }

.contact-store-overlay {
    position: fixed;
    inset: 0;
    z-index: 1200;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1.2rem;
    background: rgba(0, 0, 0, 0.6);
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity 0.2s ease, visibility 0s linear 0.2s;
}
.contact-store-overlay.is-open {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transition: opacity 0.2s ease;
}
.contact-store-panel {
    width: 100%;
    max-width: 360px;
    background: var(--bg-card);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    padding: 1.4rem;
    position: relative;
    transform: translateY(10px) scale(0.97);
    transition: transform 0.22s cubic-bezier(.22,.9,.24,1);
}
.contact-store-overlay.is-open .contact-store-panel { transform: translateY(0) scale(1); }
.contact-store-panel-close {
    position: absolute;
    top: 0.8rem;
    inset-inline-start: 0.8rem;
    width: 2.1rem;
    height: 2.1rem;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: none;
    border-radius: 999px;
    background: var(--bg-input);
    color: var(--text-secondary);
    cursor: pointer;
    transition: background var(--transition), color var(--transition);
}
.contact-store-panel-close:hover { background: var(--red-primary); color: #fff; }
.contact-store-panel-title {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 1.02rem;
    font-weight: 700;
    color: var(--text-primary);
    margin-bottom: 1.1rem;
}
.contact-store-panel-title .ic { color: var(--red-light); }
.contact-store-group { margin-bottom: 1rem; }
.contact-store-group:last-child { margin-bottom: 0; }
.contact-store-group-label {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    font-size: 0.75rem;
    color: var(--text-muted);
    margin-bottom: 0.5rem;
}
.contact-store-num {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.7rem 0.9rem;
    border-radius: var(--radius-sm);
    background: var(--bg-input);
    border: 1px solid var(--border-color);
    color: var(--text-primary);
    text-decoration: none;
    font-size: 0.95rem;
    font-weight: 700;
    direction: ltr;
    justify-content: flex-end;
    margin-bottom: 0.5rem;
    transition: border-color var(--transition), background var(--transition);
}
.contact-store-num:last-child { margin-bottom: 0; }
.contact-store-num:hover { border-color: var(--red-primary); background: color-mix(in srgb, var(--red-primary) 10%, var(--bg-input)); color: var(--red-light); }
.contact-store-num .ic { width: 1rem; height: 1rem; flex-shrink: 0; }
.contact-store-empty { font-size: 0.82rem; color: var(--text-muted); text-align: center; padding: 0.5rem 0; }

/* ===================== دکمه/پنل «ارسال لیست قیمت» (خواستهٔ کاربر ۲۰۲۶-۰۹-۱۰) =====================
   دکمهٔ نوار ناوبری (header.php) + کارت‌های پیام‌رسان یک‌اندازه (footer.php،
   لوگوهای دقیق از messengerBrandDefs()). پنل خودش کلاس‌های .contact-store-
   overlay/.contact-store-panel را دوباره استفاده می‌کند (همان پس‌زمینه/
   انیمیشن)، فقط عرضش با .pricelist-panel بازتر می‌شود تا کارت‌ها جا شوند. */
.pricelist-nav-btn {
    margin-inline-start: auto;
    align-self: center;
    background: var(--red-primary);
    color: #fff;
    border: none;
    border-radius: var(--radius-sm);
    font-family: inherit;
    font-size: 0.82rem;
    cursor: pointer;
    margin-block: 0.4rem;
}
.pricelist-nav-btn:hover { background: var(--red-hover); color: #fff; border-bottom-color: transparent; }
.pricelist-nav-btn .ic { width: 1rem; height: 1rem; }

.pricelist-panel { max-width: 460px; }
.pricelist-note {
    font-size: 0.8rem;
    color: var(--text-muted);
    line-height: 1.9;
    margin: -0.4rem 0 1.1rem;
}
.pricelist-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 0.7rem;
}
.pricelist-card {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
    padding: 0.9rem 0.5rem;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    background: var(--bg-input);
    color: var(--text-secondary);
    text-decoration: none;
    text-align: center;
    font-size: 0.78rem;
    transition: border-color var(--transition), color var(--transition), background var(--transition), transform var(--transition);
}
.pricelist-card:hover {
    border-color: var(--red-primary);
    color: var(--red-light);
    background: color-mix(in srgb, var(--red-primary) 8%, var(--bg-input));
    transform: translateY(-2px);
}
/* هر ۶ لوگو یک‌اندازه‌اند صرف‌نظر از هندسهٔ اصلی برندشان (viewBoxهای
   متفاوت) — چون همان‌طور که در functions.php هم آمده هر SVG روی کرانهٔ
   واقعی محتوای خودش cropشده، اینجا کافی است یک قاب ثابت بدهیم. */
.pricelist-card-icon {
    width: 2.4rem;
    height: 2.4rem;
    display: flex;
    align-items: center;
    justify-content: center;
    color: inherit;
}
.pricelist-card-icon .social-ic { width: 100%; height: 100%; }
.pricelist-card-label { font-weight: 600; }

/* ===================== آپلود مستقیم لیست قیمت =====================
   خواستهٔ کاربر ۲۰۲۶-۰۹-۱۱: «یک گزینه آپلود لیست ... همونجا توی کادری که
   کانال‌های ارتباطی داره». زیر همان کارت‌های پیام‌رسان، با یک جداکنندهٔ
   «یا» — دکمه باز می‌شود به یک فرم کوچک (فایل + شماره)، عمدا هم‌رنگ/هم‌قواره
   با بقیهٔ پنل (bg-input تیره‌تر از پنل، border-radius یکسان). */
.pricelist-divider {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    margin: 0.2rem 0 0.9rem;
    color: var(--text-muted);
    font-size: 0.76rem;
}
.pricelist-divider::before, .pricelist-divider::after { content: ''; flex: 1; height: 1px; background: var(--border-color); }
.pricelist-upload-btn {
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 0.8rem;
    border-radius: var(--radius-sm);
    border: 1px dashed var(--border-color);
    background: var(--bg-input);
    color: var(--text-secondary);
    font-weight: 700;
    font-size: 0.85rem;
    font-family: inherit;
    cursor: pointer;
    transition: background var(--transition), border-color var(--transition), color var(--transition);
}
.pricelist-upload-btn:hover { background: color-mix(in srgb, var(--red-primary) 8%, var(--bg-input)); border-color: var(--red-primary); color: var(--red-light); }
.pricelist-upload-btn[hidden] { display: none; }
.pricelist-upload-form { margin-top: 0.75rem; display: flex; flex-direction: column; gap: 0.6rem; }
.pricelist-upload-form[hidden] { display: none; }
.pricelist-upload-row .form-control { width: 100%; }
.pricelist-upload-mobile-note { display: flex; align-items: center; gap: 0.4rem; font-size: 0.8rem; color: var(--text-secondary); line-height: 1.8; margin: 0; }
.pricelist-upload-mobile-note b { color: var(--text-primary); }
.pricelist-upload-err { color: var(--red-light); font-size: 0.78rem; margin: 0; }
.pricelist-upload-success {
    margin-top: 0.75rem;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.85rem 1rem;
    background: color-mix(in srgb, var(--green) 14%, transparent);
    border: 1px solid color-mix(in srgb, var(--green) 35%, transparent);
    border-radius: var(--radius);
    color: var(--green);
    font-size: 0.85rem;
    font-weight: 600;
}
.pricelist-upload-success[hidden] { display: none; }

/* ===================== ناموجود + «به محض موجود شدن خبرم کن» =====================
   خواستهٔ کاربر ۲۰۲۶-۰۹-۱۱: «وقتی ناموجوده قیمت/کلید نشون نده، دکمهٔ
   ناموجود نصف بشه، نصف دیگه یک دکمهٔ تازه — به محض موجود شد خبرم کن».
   دو نیمهٔ کنار هم یک باند سراسری با شکاف روشن می‌سازند — نیمهٔ خاکستری
   وضعیت را می‌گوید، نیمهٔ رنگی خودش دعوت به اقدام است. */
.oos-wrap { margin-bottom: 1rem; }
.oos-split {
    display: flex;
    border-radius: var(--radius);
    overflow: hidden;
    box-shadow: var(--shadow);
}
.oos-half {
    flex: 1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    padding: 0.85rem 0.75rem;
    font-size: 0.88rem;
    font-weight: 700;
    border: none;
    font-family: inherit;
}
.oos-out { background: var(--bg-input); color: var(--text-muted); }
.oos-notify {
    background: linear-gradient(135deg, var(--red-primary), var(--red-hover));
    color: #fff;
    cursor: pointer;
    transition: filter var(--transition), transform var(--transition);
}
.oos-notify:hover:not(:disabled) { filter: brightness(1.08); }
.oos-notify:disabled { cursor: default; opacity: 0.85; }
.oos-panel {
    margin-top: 0.75rem;
    padding: 1rem;
    background: var(--bg-secondary);
    border: 1px dashed var(--border-color);
    border-radius: var(--radius);
}
.oos-msg { font-size: 0.85rem; color: var(--text-secondary); line-height: 1.9; margin: 0 0 0.75rem; }
.oos-msg b { color: var(--text-primary); }
.oos-input-row { display: flex; gap: 0.5rem; }
.oos-input-row .form-control { flex: 1; }
.oos-err { color: var(--red-light); font-size: 0.78rem; margin: 0.5rem 0 0; }
.oos-success {
    margin-top: 0.75rem;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.85rem 1rem;
    background: color-mix(in srgb, var(--green) 14%, transparent);
    border: 1px solid color-mix(in srgb, var(--green) 35%, transparent);
    border-radius: var(--radius);
    color: var(--green);
    font-size: 0.85rem;
    font-weight: 600;
}
.oos-success[hidden] { display: none; }

/* ===================== ویژگی‌های محصول =====================
   خواستهٔ کاربر ۲۰۲۶-۰۹-۱۱: چند کادر با عنوان + توضیح کوتاه، زیر
   توضیحات محصول. بیش از ۶ کادر پشت «مشاهدهٔ همه» جمع می‌شود. */
.pf-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.75rem; }
.pf-grid.pf-collapsed .pf-extra { display: none; }
.pf-box { background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--radius); padding: 0.9rem 1rem; text-align: center; }
.pf-title { font-size: 0.78rem; color: var(--text-muted); margin-bottom: 0.35rem; }
.pf-desc { font-size: 0.92rem; font-weight: 700; color: var(--text-primary); }
.pf-toggle {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    width: 100%;
    margin-top: 1rem;
    padding: 0.6rem;
    background: none;
    border: 1px solid var(--border-color);
    border-radius: var(--radius);
    color: var(--text-secondary);
    font-size: 0.82rem;
    font-family: inherit;
    cursor: pointer;
    transition: all var(--transition);
}
.pf-toggle:hover { border-color: var(--red-primary); color: var(--red-light); }
.pf-toggle .ic { transition: transform var(--transition); }
.pf-toggle.is-open .ic { transform: rotate(180deg); }
@media (max-width: 720px) {
    .pf-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 460px) {
    .pf-grid { grid-template-columns: 1fr; }
    .oos-split { flex-direction: column; }
}
.confirm-actions .btn { min-width: 96px; }