@charset "UTF-8";
/* ==== app.css ==== */

/* ==========================================================================
   بوش تهران — پایه
   ترتیب لود: app → rtl → nav → card → [صفحه] → mobile
   ========================================================================== */

/* ---------- فونت ----------
   swap تا متن قبل از رسیدن فونت دیده شود (جلوگیری از FOIT در اینترنت کند) */
/* مسیر همه فونت‌ها /public/fonts/ است — همان مسیری که header.php preload می‌کند.
   اگر این دو با هم فرق کنند مرورگر فونت را دو بار دانلود می‌کند. */
@font-face{
  font-family:'IRANYekanX';
  src:url('/public/fonts/IRANYekanX-Regular.woff2') format('woff2');
  font-weight:400; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'IRANYekanX';
  src:url('/public/fonts/IRANYekanX-Medium.woff2') format('woff2');
  font-weight:500; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'IRANYekanX';
  src:url('/public/fonts/IRANYekanX-Bold.woff2') format('woff2');
  font-weight:700; font-style:normal; font-display:swap;
}
/* پشتیبان: اگر یکان‌ایکس لایسنس نشد وزیرمتن جایش را می‌گیرد */
@font-face{
  font-family:'Vazirmatn';
  src:url('/public/fonts/Vazirmatn-Regular.woff2') format('woff2');
  font-weight:400; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'Vazirmatn';
  src:url('/public/fonts/Vazirmatn-Medium.woff2') format('woff2');
  font-weight:500; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'Vazirmatn';
  src:url('/public/fonts/Vazirmatn-Bold.woff2') format('woff2');
  font-weight:700; font-style:normal; font-display:swap;
}

/* ---------- توکن‌ها ----------
   هویت «بوش تهران» — لحن: فروشگاه تخصصیِ بازار امیرکبیر، نه مارکت‌پلیس.

   دو تصمیم که این سایت را از بقیهٔ سایت‌های مجموعه جدا می‌کند:

   ۱. پالت دورنگه است، نه تک‌رنگ. قرمز بوش فقط «اقدام» را نشان می‌دهد
      (خرید، تماس، تخفیف). سبزآبیِ رسمیِ بوش (--c-trust) کارِ «اطمینان» را
      می‌کند: موجودی، اصالت کالا، گارانتی، نوار اعتماد. چون ۵۸٪ محصولات این
      سایت قیمت آنلاین ندارند، کاربر بیش از قیمت دنبالِ «هست؟ اصله؟» است و
      آن سیگنال باید رنگِ خودش را داشته باشد، نه اینکه در دریای قرمز گم شود.

   ۲. شکل‌ها نرم‌ترند (شعاع ۱۰ تا ۲۴ به‌جای ۸ تا ۱۶) و سایه‌ها بازتر و
      دولایه. لوازم خانگیِ بزرگ عکس‌های حجیم دارند؛ کارتِ نرم و جادار به
      آن‌ها فضای نفس‌کشیدن می‌دهد. */
:root{
  /* ── پالت ─────────────────────────────────────────────────────────────── */
  --c-primary:#E4002B;  --c-primary-dark:#B00020;  --c-primary-soft:#FFF0F3;
  --c-primary-rgb:228,0,43;
  /* سبزآبیِ رسمیِ بوش — رنگِ «اعتماد» */
  --c-trust:#17817C;    --c-trust-dark:#0F5F5B;    --c-trust-soft:#E7F3F2;
  --c-trust-rgb:23,129,124;

  --c-ink:#10161C;      --c-ink-2:#59626B;  --c-ink-3:#858E97;
  --c-line:#E3E7EB;     --c-line-2:#EFF2F5;
  --c-bg:#F1F4F7;       --c-surface:#FFFFFF;
  /* پس‌زمینهٔ قابِ عکس محصول — عکس‌های سایت قدیم پس‌زمینهٔ سفید دارند و
     روی این خاکستریِ سرد، لبهٔ محصول دیده می‌شود. */
  --c-panel:#EDF1F4;

  /* ⚠ --c-success متنِ روی --c-success-soft است، پس باید ۴٫۵:۱ بدهد.
     خودِ --c-trust (#17817C) روی آن زمینه فقط ۴٫۱۴:۱ می‌دهد و WCAG AA را
     رد می‌کند؛ نسخهٔ تیره‌تر ۶٫۱۳:۱ می‌دهد. --c-trust برای پُرکردن (زمینهٔ
     دکمه و آیکون) می‌ماند که آنجا سفیدِ روی آن ۴٫۷:۱ است و قبول. */
  --c-success:#116460;  --c-danger:#E4002B;  --c-warn:#946200;
  --c-success-soft:#E7F3F2; --c-warn-soft:#FDF4E4;
  --c-star:#E8A317;

  --c-dark:#10161C;     --c-on-dark:#EDF1F4;  --c-on-dark-2:#98A2AC;
  /* «accent» برای سازگاری با کلاس‌های قدیمی مانده؛ حالا به سبزآبی وصل است
     تا هر جایی که «تأکید ثانویه» می‌خواست رنگِ درست را بگیرد. */
  --c-accent:#17817C;   --c-accent-soft:#E7F3F2;

  /* ── شعاع ───────────────────────────────────────────────────────────────
     ورودی و دکمه ۱۰–۱۴ | کارت ۱۸ | بخش بزرگ ۲۴ */
  --r-sm:10px; --r-md:14px; --r-lg:18px; --r-xl:24px; --r-full:999px;

  /* ── سایه ───────────────────────────────────────────────────────────────
     سه سطح، دولایه (لبهٔ ریز + پخشِ نرم). روی دکمه هیچ سایه‌ای نداریم. */
  --sh-1:0 1px 2px rgba(16,22,28,.04), 0 4px 16px rgba(16,22,28,.05);
  --sh-2:0 2px 6px rgba(16,22,28,.05), 0 12px 32px rgba(16,22,28,.08);
  --sh-3:0 8px 40px rgba(16,22,28,.12);

  --font:'IRANYekanX','Vazirmatn',Tahoma,sans-serif;
  --container:1320px;

  /* ── فاصله: مضربِ ۸ ─────────────────────────────────────────────────── */
  --sp-1:4px;  --sp-2:8px;  --sp-3:12px; --sp-4:16px;
  --sp-5:24px; --sp-6:32px; --sp-7:48px; --sp-8:64px;
  /* فاصلهٔ بین بخش‌های اصلی — دسکتاپ ۷۲تا۸۸، موبایل ۴۸تا۵۶ */
  --sec-gap:clamp(48px,6vw,80px);
  --pad-x:32px;

  --header-h:72px;
  --ease:cubic-bezier(.2,.7,.3,1);
  --t-fast:.15s var(--ease);
  --t-slow:.25s var(--ease);
}
@media (max-width:1023px){:root{--pad-x:20px}}
@media (max-width:639px){:root{--pad-x:16px}}

/* ---------- ریست ---------- */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;scroll-padding-top:calc(var(--header-h) + 16px)}
body{
  margin:0; direction:rtl; text-align:right;
  font-family:var(--font); font-size:15px; font-weight:400; line-height:1.85;
  color:var(--c-ink); background:var(--c-bg);
  -webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale;
  overflow-x:hidden;
}
h1,h2,h3,h4,h5,h6,p,figure,blockquote,dl,dd{margin:0}
/* ⚠ قبلاً «ul[class]» بود، یعنی فقط لیستی که کلاس دارد بولت نداشت.
   اما <ul> بدون کلاس در چند جای رابط هست — مثل <nav class="mobile-bar"><ul>
   و ستون‌های فوتر — و آنجا بولتِ پیش‌فرضِ مرورگر ظاهر می‌شد؛ چون padding صفر
   است، نشانه‌ها بیرونِ کادر و روی محتوا می‌افتادند (همان نقطه‌های اضافه‌ای که
   بین آیتم‌های نوار پایینِ موبایل دیده می‌شد).
   حالا بولت «انتخابی» است نه «پیش‌فرض»: فقط جایی که متنِ محتوایی داریم. */
ul,ol{margin:0;padding:0;list-style:none}
img,svg,video,iframe{max-width:100%;display:block}
img{height:auto}
a{color:inherit;text-decoration:none}
button,input,select,textarea{font:inherit;color:inherit}
button{background:none;border:0;padding:0;cursor:pointer}
table{border-collapse:collapse;width:100%}
hr{border:0;border-top:1px solid var(--c-line);margin:var(--sp-5) 0}
:target{scroll-margin-top:calc(var(--header-h) + 16px)}
[hidden]{display:none !important}

/* اعداد فارسی در فرم‌ها همیشه چپ‌چین منطقی نباشند */
input[type=number]{-moz-appearance:textfield}
input[type=number]::-webkit-outer-spin-button,
input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}

/* ---------- دسترسی ---------- */
:focus{outline:none}
:focus-visible,
a:focus-visible,button:focus-visible,input:focus-visible,
select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible,
summary:focus-visible{
  outline:2px solid var(--c-primary);
  outline-offset:2px;
  border-radius:var(--r-sm);
}
.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;
}
.skip-link{
  position:absolute;inset-inline-start:16px;top:-100px;z-index:1000;
  background:var(--c-surface);padding:10px 16px;border-radius:var(--r-sm);
  box-shadow:var(--sh-2);transition:top var(--t-fast);
}
.skip-link:focus{top:12px}

/* ---------- تایپوگرافی ----------
   دسکتاپ: H1 ۳۲–۳۸ | H2 ۲۴–۳۰ | متن ۱۵–۱۶
   موبایل: H1 ۲۵–۲۸ | H2 ۲۱–۲۴ | متن حداقل ۱۵
   ارتفاع خط فارسی ۱٫۷ تا ۱٫۹ */
h1,h2,h3,h4,h5,h6{font-weight:700;line-height:1.6;color:var(--c-ink);text-wrap:balance}
h1{font-size:clamp(25px,3vw,38px);line-height:1.45}
h2{font-size:clamp(21px,2.3vw,30px);line-height:1.5}
h3{font-size:clamp(18px,1.7vw,22px)}
h4{font-size:17px}
h5{font-size:16px}
h6{font-size:15px}
p{margin:0 0 1em}
p:last-child{margin-bottom:0}
/* هیچ متنی زیر ۱۵px نباشد جز فرا-داده‌های واقعاً فرعی */
small,.text-sm{font-size:15px}
.text-xs{font-size:15px}
.text-lg{font-size:17px}
strong,b{font-weight:700}
.lead{font-size:16px;color:var(--c-ink-2);line-height:2}
.muted{color:var(--c-ink-3)}
.ink-2{color:var(--c-ink-2)}
a.link{color:var(--c-primary)}
a.link:hover{color:var(--c-primary-dark);text-decoration:underline}
.tel-link{color:var(--c-primary);font-weight:500;direction:ltr;display:inline-block;unicode-bidi:isolate}
.num{font-variant-numeric:tabular-nums}
/* عنوان چندخطی محدودشده */
.clamp-1,.clamp-2,.clamp-3{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}
.clamp-1{-webkit-line-clamp:1}
.clamp-2{-webkit-line-clamp:2}
.clamp-3{-webkit-line-clamp:3}

/* ---------- چیدمان ---------- */
/* یک کانتینر، یک عرض، یک padding — در تمام صفحه‌ها یکسان */
.container{width:100%;max-width:var(--container);margin-inline:auto;padding-inline:var(--pad-x)}
.container-narrow{max-width:900px}
.section{padding-block:var(--sec-gap)}
.section-sm{padding-block:calc(var(--sec-gap) * .66)}
.section-head{
  display:flex;align-items:flex-end;justify-content:space-between;
  gap:var(--sp-4);margin-bottom:var(--sp-6);
}
/* تیتر بخش: بدون میلهٔ رنگی، بدون خط‌کش زیرین — فقط تایپوگرافی */
.section-title{font-size:clamp(21px,2.3vw,30px);font-weight:700;letter-spacing:-.01em}
.section-title::before{content:none}
.section-sub{color:var(--c-ink-2);font-size:15px;margin-top:8px;line-height:1.8}
.section-more{
  color:var(--c-ink);font-size:15px;font-weight:500;flex:none;
  display:inline-flex;align-items:center;gap:6px;white-space:nowrap;
  padding:10px 0;border-bottom:1px solid transparent;
}
.section-more svg{width:16px;height:16px}
.section-more:hover{color:var(--c-primary);border-bottom-color:var(--c-primary)}

.surface{background:var(--c-surface);border:1px solid var(--c-line);border-radius:var(--r-lg)}
.card{background:var(--c-surface);border:1px solid var(--c-line);border-radius:var(--r-lg);padding:var(--sp-5)}
.card-lg{border-radius:var(--r-xl);padding:var(--sp-6)}

/* ---------- ابزارها (دستی، بدون فریم‌ورک) ---------- */
.flex{display:flex}
.iflex{display:inline-flex}
.grid{display:grid}
.wrap{flex-wrap:wrap}
.nowrap{flex-wrap:nowrap}
.col{flex-direction:column}
.items-center{align-items:center}
.items-start{align-items:flex-start}
.items-end{align-items:flex-end}
.items-stretch{align-items:stretch}
.justify-between{justify-content:space-between}
.justify-center{justify-content:center}
.justify-end{justify-content:flex-end}
.flex-1{flex:1 1 auto;min-width:0}
.flex-none{flex:none}
.gap-1{gap:var(--sp-1)}
.gap-2{gap:var(--sp-2)}
.gap-3{gap:var(--sp-3)}
.gap-4{gap:var(--sp-4)}
.gap-5{gap:var(--sp-5)}
.gap-6{gap:var(--sp-6)}
.mt-0{margin-top:0}.mt-2{margin-top:var(--sp-2)}.mt-3{margin-top:var(--sp-3)}
.mt-4{margin-top:var(--sp-4)}.mt-5{margin-top:var(--sp-5)}.mt-6{margin-top:var(--sp-6)}
.mb-0{margin-bottom:0}.mb-2{margin-bottom:var(--sp-2)}.mb-3{margin-bottom:var(--sp-3)}
.mb-4{margin-bottom:var(--sp-4)}.mb-5{margin-bottom:var(--sp-5)}.mb-6{margin-bottom:var(--sp-6)}
.mis-auto{margin-inline-start:auto}
.mie-auto{margin-inline-end:auto}
.mt-auto{margin-top:auto}
.p-0{padding:0}.p-3{padding:var(--sp-3)}.p-4{padding:var(--sp-4)}.p-5{padding:var(--sp-5)}
.w-full{width:100%}
.h-full{height:100%}
.text-center{text-align:center}
.text-start{text-align:start}
.text-end{text-align:end}
.rounded{border-radius:var(--r-md)}
.rounded-sm{border-radius:var(--r-sm)}
.rounded-full{border-radius:var(--r-full)}
.shadow-1{box-shadow:var(--sh-1)}
.shadow-2{box-shadow:var(--sh-2)}
.relative{position:relative}
.hidden{display:none}
.grid-2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-4)}
.grid-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-4)}
.grid-4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--sp-4)}
@media (max-width:1023px){
  .grid-4{grid-template-columns:repeat(2,minmax(0,1fr))}
  .grid-3{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:639px){
  .grid-4,.grid-3,.grid-2{grid-template-columns:repeat(1,minmax(0,1fr))}
  .sm-grid-2{grid-template-columns:repeat(2,minmax(0,1fr))}
}
.only-mobile{display:none}
@media (max-width:900px){
  .only-desktop{display:none !important}
  .only-mobile{display:block}
}

/* ---------- دکمه‌ها ---------- */
.btn{
  --btn-bg:var(--c-surface); --btn-fg:var(--c-ink); --btn-bd:var(--c-line);
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  min-height:46px;padding:6px 20px;
  font-size:15px;font-weight:500;line-height:1.25;
  color:var(--btn-fg);background:var(--btn-bg);
  border:1px solid var(--btn-bd);border-radius:var(--r-md);
  cursor:pointer;user-select:none;
  /* ⚠ قبلاً white-space:nowrap بود. برچسبِ بلندِ فارسی در ظرفِ باریک به‌جای
     شکستن، از لبهٔ دکمه بیرون می‌زد و بریده می‌شد — همان «افزودن به سبد خرید
     جا نشده». حالا می‌شکند: دو سطرِ ۱۵px با line-height 1.25 حدود ۳۸px است و
     زیرِ min-height:46px جا می‌شود، پس هدفِ لمسی هیچ‌وقت کوچک‌تر نمی‌شود.
     balance باعث می‌شود شکستن عمدی به‌نظر برسد نه تصادفی. */
  white-space:normal;text-wrap:balance;
  transition:background var(--t-fast),color var(--t-fast),
             border-color var(--t-fast),box-shadow var(--t-fast),transform var(--t-fast);
}
.btn svg{width:19px;height:19px;flex:none;stroke-width:1.75}
.btn:disabled,.btn[aria-disabled=true],.btn.is-disabled{opacity:.55;cursor:not-allowed;pointer-events:none}
.btn.is-loading{color:transparent !important;position:relative;pointer-events:none}
.btn.is-loading::after{
  content:'';position:absolute;width:18px;height:18px;border-radius:50%;
  border:2px solid currentColor;border-top-color:transparent;
  color:#fff;animation:imb-spin .7s linear infinite;
}
/* ── فقط سه سبک دکمه ─────────────────────────────────────────────────────
   Primary   قرمز بوش + متن سفید   ← تنها یک CTA اصلی در هر بخش
   Secondary سفید + متن تیره + کادر
   Tertiary  فقط متن/آیکون
   هیچ‌کدام سایه ندارند. کلاس‌های قدیمی (accent/soft/call/ghost) عمداً به
   همین سه نگاشت شده‌اند تا ویوها دست‌نخورده بمانند و ظاهر یکدست شود. */
.btn-primary{--btn-bg:var(--c-primary);--btn-fg:#fff;--btn-bd:var(--c-primary)}
.btn-accent{--btn-bg:var(--c-primary);--btn-fg:#fff;--btn-bd:var(--c-primary)}
.btn-secondary,
.btn-ghost,
.btn-soft,
.btn-call{--btn-bg:var(--c-surface);--btn-fg:var(--c-ink);--btn-bd:#DADCE0;font-weight:500}
.btn-call svg,.btn-soft svg{color:var(--c-primary)}
.btn-tertiary{--btn-bg:transparent;--btn-fg:var(--c-ink);--btn-bd:transparent;padding-inline:8px}
.btn-danger{--btn-bg:var(--c-surface);--btn-fg:var(--c-danger);--btn-bd:var(--c-line)}
.btn-block{display:flex;width:100%}
/* هدف لمس هرگز زیر ۴۴ نرود */
.btn-sm{min-height:44px;padding:0 16px;font-size:15px;border-radius:var(--r-sm)}
.btn-sm svg{width:17px;height:17px}
.btn-lg{min-height:52px;padding:0 26px;font-size:16px;font-weight:700}
.btn-icon{min-height:44px;width:44px;padding:0;border-radius:var(--r-sm)}
.btn-icon.btn-sm{min-height:44px;width:44px}
@media (hover:hover){
  .btn-primary:hover,.btn-accent:hover{--btn-bg:var(--c-primary-dark);--btn-bd:var(--c-primary-dark)}
  .btn-secondary:hover,.btn-ghost:hover,.btn-soft:hover,.btn-call:hover{
    --btn-bd:var(--c-ink);--btn-bg:var(--c-surface);
  }
  .btn-tertiary:hover{--btn-fg:var(--c-primary)}
  .btn-danger:hover{--btn-bg:var(--c-primary-soft)}
}
.btn:active{transform:none}

/* ---------- فرم‌ها ---------- */
.field{display:block;margin-bottom:var(--sp-4)}
/* برچسب همیشه بالای فیلد است — placeholder جای برچسب را نمی‌گیرد */
.label{display:block;font-size:15px;font-weight:500;color:var(--c-ink-2);margin-bottom:8px}
.label .req{color:var(--c-danger);margin-inline-start:3px}
.input,.select,.textarea,
input[type=text],input[type=tel],input[type=email],input[type=number],
input[type=password],input[type=search],input[type=url],input[type=date],
select,textarea{
  width:100%;min-height:48px;padding:12px 14px;
  font-family:inherit;font-size:15px;color:var(--c-ink);
  background:var(--c-surface);
  border:1px solid #DADCE0;border-radius:var(--r-sm);
  transition:border-color var(--t-fast),box-shadow var(--t-fast),background var(--t-fast);
  appearance:none;
}
textarea,.textarea{min-height:120px;line-height:1.9;resize:vertical;padding-block:12px}
select,.select{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2362666A' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-size:18px;
  background-position:left 12px center;padding-inline-start:38px;
}
.input:hover,select:hover,textarea:hover{border-color:var(--c-ink-3)}
.input:focus,.select:focus,.textarea:focus,
input:focus,select:focus,textarea:focus{
  border-color:var(--c-primary);
  box-shadow:0 0 0 3px rgba(var(--c-primary-rgb),.12);
  outline:none;
}
::placeholder{color:var(--c-ink-3)}
.input[disabled],select[disabled],textarea[disabled]{background:var(--c-line-2);color:var(--c-ink-3);cursor:not-allowed}
.input.is-invalid,textarea.is-invalid,select.is-invalid{border-color:var(--c-danger)}
.field-error{color:var(--c-danger);font-size:15px;margin-top:6px;display:block}
.field-help{color:var(--c-ink-2);font-size:15px;margin-top:6px;display:block}
.input-ltr{direction:ltr;text-align:left;font-variant-numeric:tabular-nums}
.form-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-4)}
.form-row-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-4)}
@media (max-width:639px){.form-row,.form-row-3{grid-template-columns:minmax(0,1fr)}}
.input-group{display:flex;align-items:stretch}
.input-group>.input{border-start-end-radius:0;border-end-end-radius:0}
.input-group>.btn{border-start-start-radius:0;border-end-start-radius:0;margin-inline-start:-1px}

/* چک‌باکس و رادیو */
.check{display:flex;align-items:center;gap:9px;cursor:pointer;font-size:15px;color:var(--c-ink-2);line-height:1.6}
.check input[type=checkbox],.check input[type=radio]{
  width:18px;height:18px;min-height:0;flex:none;margin:0;padding:0;
  border:1.5px solid var(--c-line);background:#fff;cursor:pointer;
  border-radius:6px;transition:all var(--t-fast);position:relative;
}
.check input[type=radio]{border-radius:50%}
.check input:checked{background:var(--c-primary);border-color:var(--c-primary)}
.check input[type=checkbox]:checked::after{
  content:'';position:absolute;inset:0;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E") center/12px no-repeat;
}
.check input[type=radio]:checked::after{
  content:'';position:absolute;inset:4px;background:#fff;border-radius:50%;
}
.check:hover input{border-color:var(--c-primary)}

/* سوییچ */
.switch{position:relative;display:inline-flex;align-items:center;gap:10px;cursor:pointer}
.switch input{position:absolute;opacity:0;width:0;height:0}
.switch .track{width:44px;height:25px;border-radius:var(--r-full);background:var(--c-line);transition:background var(--t-fast);flex:none;position:relative}
.switch .track::after{content:'';position:absolute;top:3px;inset-inline-end:3px;width:19px;height:19px;border-radius:50%;background:#fff;box-shadow:var(--sh-1);transition:transform var(--t-fast)}
.switch input:checked+.track{background:var(--c-success)}
.switch input:checked+.track::after{transform:translateX(-19px)}
.switch input:focus-visible+.track{outline:2px solid var(--c-primary);outline-offset:2px}

/* ---------- نشان‌ها و چیپ‌ها ---------- */
.badge{
  display:inline-flex;align-items:center;gap:5px;
  padding:3px 10px;border-radius:var(--r-full);
  font-size:15px;font-weight:500;line-height:1.8;white-space:nowrap;
  background:var(--c-line-2);color:var(--c-ink-2);
}
.badge-primary{background:var(--c-primary-soft);color:var(--c-primary-dark)}
.badge-accent{background:var(--c-accent-soft);color:var(--c-warn)}
.badge-success{background:var(--c-success-soft);color:var(--c-success)}
.badge-danger{background:var(--c-primary-soft);color:var(--c-primary-dark)}
.badge-warn{background:var(--c-warn-soft);color:var(--c-warn)}
.badge-muted{background:var(--c-line-2);color:var(--c-ink-2)}
.badge-dot::before{content:'';width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}

.chip{
  display:inline-flex;align-items:center;gap:7px;
  padding:7px 14px;border-radius:var(--r-full);
  font-size:15px;font-weight:500;color:var(--c-ink-2);
  background:var(--c-surface);border:1px solid var(--c-line);
  transition:all var(--t-fast);white-space:nowrap;cursor:pointer;
}
.chip img{width:20px;height:20px;object-fit:contain;flex:none}
@media (hover:hover){.chip:hover{border-color:var(--c-primary);color:var(--c-primary)}}
.chip.is-active,.chip[aria-current=page]{
  background:var(--c-primary);border-color:var(--c-primary);color:#fff;
}
.chip-remove{width:16px;height:16px;opacity:.7}
.chip-row{display:flex;gap:9px;flex-wrap:wrap}
/* min-width:0 اجباری است: بدون آن، آیتمِ فلکس/گریدِ والد به‌جای اسکرولِ
   داخلی، والدش را پهن می‌کند و کلِ صفحه از عرض بیرون می‌زند. */
.chip-rail{display:flex;gap:9px;overflow-x:auto;min-width:0;padding-bottom:6px;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.chip-rail::-webkit-scrollbar{display:none}
.chip-rail>.chip{flex:none}

/* امتیاز ستاره */
.stars{display:inline-flex;gap:2px;color:var(--c-star)}
.stars svg{width:15px;height:15px}
.stars .off{color:var(--c-line)}

/* ---------- آکاردئون ----------
   اینجاست نه در product.css، چون بلوک‌های content_sections و سوالات متداول
   در صفحه اصلی و دسته و برند هم استفاده می‌شوند و آن صفحات product.css
   را لود نمی‌کنند. هندلر کلیکش در app.js روی .acc-head نشسته است. */
.accordion{border:1px solid var(--c-line);border-radius:var(--r-md);overflow:hidden;background:var(--c-surface)}
.accordion + .accordion{margin-top:10px}
.acc-head{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  width:100%;padding:15px 18px;font-weight:600;font-size:15px;
  text-align:start;color:var(--c-ink);background:var(--c-surface);
  transition:background var(--t-fast);
}
.acc-head:hover{background:var(--c-line-2)}
.acc-head svg{width:19px;height:19px;color:var(--c-ink-3);transition:transform var(--t-fast);flex:none}
.accordion.is-open .acc-head{background:var(--c-primary-soft);color:var(--c-primary-dark)}
.accordion.is-open .acc-head svg{transform:rotate(180deg)}
.acc-body{display:none;padding:18px;border-top:1px solid var(--c-line-2)}
.accordion.is-open .acc-body{display:block}

/* ---------- گرید محصول در متن ادیتور ----------
   renderBlocks() برای شورت‌کد [imb-products] کلاس .home-grid می‌زند و آن
   شورت‌کد در هر صفحه‌ای قابل استفاده است، پس تعریفش باید سراسری باشد
   (home.css فقط در صفحه اصلی لود می‌شود). */
.home-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
@media (min-width:640px){.home-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}}
@media (min-width:1024px){.home-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:20px}}
.block-products{margin:22px 0}

/* ---------- جدول ---------- */
.table-wrap{
  width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;
  border:1px solid var(--c-line);border-radius:var(--r-md);
  background:var(--c-surface);
}
.table-wrap>table{min-width:520px;font-size:15px}
.table-wrap th,.table-wrap td{
  padding:12px 14px;text-align:start;
  border-bottom:1px solid var(--c-line-2);vertical-align:top;
}
.table-wrap thead th{
  background:var(--c-line-2);color:var(--c-ink-2);
  font-weight:700;font-size:15px;white-space:nowrap;
  border-bottom:1px solid var(--c-line);
}
.table-wrap tbody tr:last-child td{border-bottom:0}
.table-wrap tbody tr:nth-child(even){background:var(--c-surface)}
@media (hover:hover){.table-wrap tbody tr:hover{background:var(--c-primary-soft)}}

/* موبایل: هر ردیف یک کارت — data-label را renderBlocks() تزریق می‌کند */
@media (max-width:639px){
  .table-wrap{border:0;background:transparent;overflow:visible}
  .table-wrap>table{min-width:0;display:block}
  .table-wrap thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
  .table-wrap tbody,.table-wrap tr,.table-wrap td{display:block;width:100%}
  .table-wrap tr{
    background:var(--c-surface);border:1px solid var(--c-line);
    border-radius:var(--r-md);margin-bottom:12px;padding:4px 12px;box-shadow:var(--sh-1);
  }
  .table-wrap tbody tr:nth-child(even){background:var(--c-surface)}
  .table-wrap td{
    display:flex;align-items:flex-start;justify-content:space-between;gap:14px;
    padding:9px 0;border-bottom:1px dashed var(--c-line);text-align:end;
  }
  .table-wrap tr td:last-child{border-bottom:0}
  .table-wrap td::before{
    content:attr(data-label);
    font-weight:700;color:var(--c-ink-3);font-size:15px;
    text-align:start;flex:none;max-width:45%;
  }
  .table-wrap td:not([data-label])::before{content:none}
}

/* ---------- محتوای ادیتور ---------- */
.content-note{
  background:var(--c-primary-soft);
  border:1px solid var(--c-line);
  border-inline-start:4px solid var(--c-primary);
  border-radius:var(--r-md);
  padding:16px 18px;margin:var(--sp-5) 0;
}
.content-note__title{display:block;font-weight:700;margin-bottom:6px;color:var(--c-primary-dark)}
.content-note__body{color:var(--c-ink-2);font-size:15px}
.content-note__body>*:last-child{margin-bottom:0}

.video-embed{
  position:relative;aspect-ratio:16/9;width:100%;
  border-radius:var(--r-md);overflow:hidden;background:var(--c-ink);
  margin:var(--sp-5) 0;box-shadow:var(--sh-2);
}
.video-embed iframe,.video-embed video{position:absolute;inset:0;width:100%;height:100%;border:0}

/* ---------- بردکرامب ---------- */
.breadcrumb{padding:14px 0;font-size:15px;color:var(--c-ink-3)}
.breadcrumb ol{display:flex;flex-wrap:wrap;align-items:center;gap:6px;list-style:none}
.breadcrumb li{display:flex;align-items:center;gap:6px;min-width:0}
.breadcrumb li:not(:last-child)::after{
  content:'';width:6px;height:6px;flex:none;
  border-inline-start:1.5px solid var(--c-line);border-block-end:1.5px solid var(--c-line);
  transform:rotate(45deg);opacity:.9;
}
.breadcrumb a{color:var(--c-ink-3);transition:color var(--t-fast)}
.breadcrumb a:hover{color:var(--c-primary)}
.breadcrumb [aria-current=page]{color:var(--c-ink-2);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}

/* ---------- صفحه‌بندی ---------- */
/* ⚠ چیدمان یک لایه پایین رفت: <nav> حالا یک <ul> دارد. انتخابگرهای
   `.pagination a,.pagination span` نزولی‌اند و دست‌نخورده کار می‌کنند. */
.pagination{margin:var(--sp-6) 0 0}
.pagination ul{display:flex;justify-content:center;flex-wrap:wrap;gap:7px;
               list-style:none;margin:0;padding:0}
.pagination a,.pagination span{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:42px;height:42px;padding:0 12px;
  border-radius:var(--r-md);border:1px solid var(--c-line);
  background:var(--c-surface);color:var(--c-ink-2);
  font-size:15px;font-weight:500;transition:all var(--t-fast);
}
@media (hover:hover){.pagination a:hover{border-color:var(--c-primary);color:var(--c-primary)}}
.pagination .is-current{background:var(--c-primary);border-color:var(--c-primary);color:#fff}
.pagination .is-disabled{opacity:.45;pointer-events:none}
.pagination .gap{border:0;background:transparent}

/* ---------- هشدار و پیام ---------- */
.alert{
  display:flex;align-items:flex-start;gap:11px;
  padding:14px 16px;border-radius:var(--r-md);
  font-size:15px;line-height:1.8;margin-bottom:var(--sp-4);
  border:1px solid transparent;
}
.alert svg{width:20px;height:20px;flex:none;margin-top:2px}
.alert-success{background:var(--c-success-soft);border-color:var(--c-success-soft);color:var(--c-success)}
.alert-danger,.alert-error{background:var(--c-primary-soft);border-color:var(--c-line);color:var(--c-primary-dark)}
.alert-warn,.alert-warning{background:var(--c-warn-soft);border-color:var(--c-warn-soft);color:var(--c-warn)}
.alert-info{background:var(--c-primary-soft);border-color:var(--c-line);color:var(--c-primary-dark)}

.flash-stack{margin:var(--sp-4) 0}

/* توست — از app.js ساخته می‌شود */
.toast-stack{
  position:fixed;inset-block-end:24px;inset-inline-start:24px;
  z-index:2000;display:flex;flex-direction:column;gap:10px;
  pointer-events:none;max-width:min(360px,calc(100vw - 32px));
}
.toast{
  display:flex;align-items:center;gap:10px;
  background:var(--c-ink);color:#fff;
  padding:13px 17px;border-radius:var(--r-md);
  box-shadow:var(--sh-3);font-size:15px;line-height:1.7;
  pointer-events:auto;
  animation:imb-toast-in .26s var(--ease) both;
}
.toast.is-out{animation:imb-toast-out .2s var(--ease) both}
.toast svg{width:19px;height:19px;flex:none}
.toast-success{background:var(--c-success)}
.toast-error{background:var(--c-primary-dark)}
.toast-info{background:var(--c-primary-dark)}
@keyframes imb-toast-in{from{opacity:0;transform:translateY(14px) scale(.97)}to{opacity:1;transform:none}}
@keyframes imb-toast-out{to{opacity:0;transform:translateY(8px)}}
@keyframes imb-spin{to{transform:rotate(360deg)}}

/* ---------- اسکلت لودینگ ---------- */
.skeleton,.skel{
  background:linear-gradient(90deg,var(--c-line-2) 25%,var(--c-line-2) 37%,var(--c-line-2) 63%);
  background-size:400% 100%;
  animation:imb-skel 1.3s ease-in-out infinite;
  border-radius:var(--r-sm);
}
.skel-line{height:12px;margin-bottom:9px}
.skel-line.w-60{width:60%}
.skel-line.w-40{width:40%}
.skel-box{aspect-ratio:1/1;border-radius:var(--r-md)}
.skel-card{background:var(--c-surface);border:1px solid var(--c-line);border-radius:var(--r-md);padding:14px}
@keyframes imb-skel{0%{background-position:100% 50%}100%{background-position:0 50%}}

/* ---------- حالت خالی ---------- */
.empty{
  text-align:center;padding:var(--sp-8) var(--sp-4);
  color:var(--c-ink-2);background:var(--c-surface);
  border:1px dashed var(--c-line);border-radius:var(--r-lg);
}
.empty svg{width:56px;height:56px;margin:0 auto 16px;color:var(--c-line);stroke-width:1.5}
.empty h3{color:var(--c-ink-2);margin-bottom:8px}

/* ---------- متن سئو / پرزو ---------- */
.prose{color:var(--c-ink-2);font-size:15px;line-height:2.1}
.prose h2,.prose h3,.prose h4{color:var(--c-ink);margin:1.6em 0 .7em}
.prose h2{font-size:21px}
.prose h3{font-size:18px}
.prose p{margin:0 0 1.15em}
.prose ul,.prose ol{margin:0 0 1.2em;padding-inline-start:1.4em}
.prose ul{list-style:disc}
.prose ol{list-style:decimal}
.prose li{margin-bottom:.5em}
.prose li::marker{color:var(--c-primary)}
.prose a{color:var(--c-primary);text-decoration:underline;text-underline-offset:3px}
.prose a:hover{color:var(--c-primary-dark)}
.prose img{border-radius:var(--r-md);margin:1.4em auto;box-shadow:var(--sh-1)}
.prose blockquote{
  margin:1.4em 0;padding:14px 18px;
  background:var(--c-line-2);border-inline-start:4px solid var(--c-primary);
  border-radius:var(--r-md);color:var(--c-ink-2);
}
.prose table{margin:1.4em 0}
.prose code{background:var(--c-line-2);padding:2px 6px;border-radius:6px;font-size:.9em;direction:ltr;display:inline-block}
.prose>*:first-child{margin-top:0}
.prose>*:last-child{margin-bottom:0}

/* بلوک محصول داخل متن ادیتور */
.block-products{margin:var(--sp-5) 0}

/* ---------- ریل افقی عمومی ---------- */
/* ریل محصول — همهٔ بخش‌های محصولی (فروش ویژه/جدیدترین/پرفروش) از همین یک
   سیستم استفاده می‌کنند؛ تمایزشان فقط از پس‌زمینهٔ بخش می‌آید.
   snap از نوع proximity است نه mandatory: با mandatory، کشیدنِ کوتاه به‌زور
   برمی‌گشت و حسِ گیر‌کردن می‌داد. */
.rail{
  display:flex;gap:var(--sp-4);overflow-x:auto;
  scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;
  scroll-padding-inline-start:var(--pad-x);
  padding-bottom:8px;scrollbar-width:thin;
  min-width:0;
}
.rail>*{flex:none;scroll-snap-align:start}
.rail::-webkit-scrollbar{height:6px}
.rail::-webkit-scrollbar-thumb{background:var(--c-line);border-radius:var(--r-full)}
.rail::-webkit-scrollbar-track{background:transparent}

/* ---------- اسکلتِ بخش‌های صفحه (.hsec) ----------
   اینجاست نه در home.css، چون call-cta در چهار صفحهٔ مختلف رندر می‌شود. */
/* ---------- اسکلت بخش ---------- */
.hsec{position:relative;padding-block:var(--sec-gap)}
.hsec--plain{background:var(--c-surface)}
.hsec--tint {background:var(--c-bg)}
/* بخش‌های هم‌رنگِ پشت‌سرهم با خط مویی از هم جدا می‌شوند، نه با شکل */
.hsec--plain + .hsec--plain{border-top:1px solid var(--c-line)}
.hsec--tint  + .hsec--tint {border-top:1px solid var(--c-line)}

/* ==========================================================================
   بخش مشاوره / درخواست تماس (partials/call-cta.php)
   ⚠ عمداً اینجاست نه در home.css: این پارشال در صفحهٔ اول، صفحهٔ محصول،
   صفحهٔ دسته و صفحهٔ جستجو رندر می‌شود، ولی home.css فقط در صفحهٔ اول لود
   می‌شود؛ قبلاً در آن سه صفحهٔ دیگر بی‌استایل دیده می‌شد.
   ========================================================================== */
/* ══════════════════════════════════════════════════ ۸. مشاوره / درخواست تماس
   دو ستون: یک طرف پیام و راه ارتباطی، طرف دیگر فرم.
   پس‌زمینهٔ خنثیِ کنترل‌شده؛ قرمز فقط روی CTA. */
.hsec--consult{background:var(--c-bg);border-block:1px solid var(--c-line)}
.consult-inline{margin-block:var(--sec-gap)}
.consult-inline > .container{padding:0;max-width:none}
.consult-inline .consult{
  background:var(--c-bg);border:1px solid var(--c-line);
  border-radius:var(--r-xl);padding:clamp(20px,3vw,32px);
}
.consult{display:grid;grid-template-columns:minmax(0,1fr) 440px;gap:clamp(24px,4vw,56px);align-items:center}
@media (max-width:1023px){.consult{grid-template-columns:minmax(0,1fr);gap:var(--sp-6)}}

.consult-say{min-width:0}
.consult-kicker{
  display:inline-flex;align-items:center;gap:7px;
  background:var(--c-surface);border:1px solid var(--c-line);
  color:var(--c-ink-2);font-size:15px;font-weight:500;
  padding:7px 14px;border-radius:var(--r-full);margin-bottom:var(--sp-4);
}
.consult-kicker svg{width:16px;height:16px}
.consult-say h2{font-size:clamp(21px,2.3vw,30px);line-height:1.5;color:var(--c-ink)}
.consult-say p{color:var(--c-ink-2);font-size:16px;line-height:1.9;margin:12px 0 0;max-width:52ch}

.consult-tels{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-5)}
.consult-tels a{
  display:inline-flex;align-items:center;gap:8px;
  min-height:46px;padding-inline:16px;border-radius:var(--r-sm);
  background:var(--c-surface);border:1px solid var(--c-line);
  color:var(--c-ink);font-weight:700;font-size:15px;
  transition:border-color var(--t-fast);
}
.consult-tels a svg{width:18px;height:18px;color:var(--c-ink-2)}
.consult-tels a .num{direction:ltr;unicode-bidi:isolate;font-variant-numeric:tabular-nums}
.consult-tels a:hover{border-color:var(--c-ink)}

.consult-card{
  background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:var(--r-lg);padding:clamp(20px,2.4vw,28px);
  display:flex;flex-direction:column;min-width:0;
}
.consult-card-title{display:block;font-size:16px;margin-bottom:var(--sp-4);color:var(--c-ink)}
.consult-card .label{font-size:15px;color:var(--c-ink-2);display:block;margin-bottom:8px}
.consult-card .input{width:100%}
.consult-note{
  display:flex;align-items:flex-start;gap:6px;
  margin-top:12px;font-size:15px;color:var(--c-ink-2);line-height:1.7;
}
.consult-note svg{width:15px;height:15px;flex:none;color:var(--c-success);margin-top:2px}

/* ---------- فوتر ----------
   روشن و آرام. در موبایل ستون‌ها آکاردئون می‌شوند تا فهرست‌های بلند
   همیشه باز نمانند (<details>/<summary> — بدون جاوااسکریپت). */
.site-footer{
  background:var(--c-bg);border-top:1px solid var(--c-line);
  margin-top:var(--sec-gap);padding-top:var(--sp-7);
}
.footer-grid{display:grid;grid-template-columns:minmax(0,1.7fr) repeat(3,1fr);gap:var(--sp-6)}
.footer-col h4{font-size:16px;margin-bottom:var(--sp-4);color:var(--c-ink)}
.footer-col ul li{margin-bottom:12px}
.footer-col a{color:var(--c-ink-2);font-size:15px;transition:color var(--t-fast)}
.footer-col a:hover{color:var(--c-primary)}
.footer-about p{color:var(--c-ink-2);font-size:15px;line-height:1.9}
/* لوگوی فوتر داخل یک قاب سفید. لوگوی بوش پس‌زمینهٔ سفید دارد و روی خاکستریِ
   فوتر مثل یک تکهٔ بریده‌شده دیده می‌شد؛ قاب آن را عمدی نشان می‌دهد.
   width:max-content تا قاب دقیقاً به اندازهٔ لوگو باشد، نه تمامِ عرضِ ستون. */
.footer-logo{
  display:inline-flex;align-items:center;justify-content:center;
  width:max-content;max-width:100%;
  padding:10px 14px;margin-bottom:var(--sp-4);
  background:var(--c-surface);
  border:1px solid var(--c-line);
  border-radius:var(--r-md);
}
.footer-logo img{height:52px;width:auto;object-fit:contain;display:block}
@media (max-width:639px){.footer-logo img{height:44px}}
/* شعبه در ستون «تماس با ما»: نام، تلفن و آدرس باید زیر هم بنشینند.
   بدون این قاعده، <b>/<a>/<span> درون <li> کنار هم روی یک خط می‌افتادند
   و آدرسِ بلند، نام شعبه را از تلفن جدا نمی‌کرد. */
.foot-branch{display:flex;flex-direction:column;gap:3px;margin-bottom:var(--sp-4)}
.foot-branch b{color:var(--c-ink);font-size:15px}
.foot-branch .tel-link{font-weight:700;direction:ltr;text-align:start;unicode-bidi:isolate}
.foot-branch .muted{font-size:15px;line-height:1.8;color:var(--c-ink-2)}
.footer-badges{display:flex;gap:12px;flex-wrap:wrap;margin-top:var(--sp-4)}
.footer-badges img{width:86px;height:auto;border-radius:var(--r-sm);background:#fff;border:1px solid var(--c-line);padding:4px}
.footer-social{display:flex;gap:10px;margin-top:var(--sp-4)}
.footer-social a{
  width:44px;height:44px;border-radius:var(--r-sm);
  display:grid;place-items:center;
  background:var(--c-surface);border:1px solid var(--c-line);color:var(--c-ink-2);
  transition:border-color var(--t-fast),color var(--t-fast);
}
.footer-social a:hover{border-color:var(--c-ink);color:var(--c-ink)}
.footer-bottom{
  margin-top:var(--sp-6);padding:20px 0;border-top:1px solid var(--c-line);
  display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);
  color:var(--c-ink-2);font-size:15px;flex-wrap:wrap;
}
/* فلشِ آکاردئون فقط در موبایل دیده می‌شود */
.footer-col>summary{display:none}
@media (max-width:900px){
  .footer-grid{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--sp-5)}
  .footer-about{grid-column:1/-1}
}
@media (max-width:639px){
  .footer-grid{grid-template-columns:minmax(0,1fr);gap:0}
  .footer-bottom{justify-content:center;text-align:center}

  /* هر ستون یک <details> است: در موبایل جمع می‌شود */
  .footer-col{border-top:1px solid var(--c-line)}
  .footer-col>summary{
    display:flex;align-items:center;justify-content:space-between;gap:10px;
    min-height:52px;cursor:pointer;list-style:none;
    font-size:16px;font-weight:700;color:var(--c-ink);
  }
  .footer-col>summary::-webkit-details-marker{display:none}
  .footer-col>summary::after{
    content:'';width:9px;height:9px;flex:none;
    border-inline-end:2px solid var(--c-ink-2);border-block-end:2px solid var(--c-ink-2);
    transform:rotate(45deg);margin-block-end:4px;
    transition:transform var(--t-fast);
  }
  .footer-col[open]>summary::after{transform:rotate(225deg);margin-block:4px 0}
  .footer-col>h4{display:none}
  .footer-col ul{padding-bottom:var(--sp-4)}
}

/* ---------- تنظیمات حرکت ---------- */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.001ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.001ms !important;
    scroll-behavior:auto !important;
  }
  html{scroll-behavior:auto}
}

/* ---------- چاپ ---------- */
@media print{
  .site-header,.site-footer,.mobile-bar,.toast-stack,.btn,.filters{display:none !important}
  body{background:#fff;font-size:15px}
  .container{max-width:none}
}

/* ==== rtl.css ==== */

/* ==========================================================================
   اصلاحات راست‌به‌چپ
   بیشتر فایل‌ها از خواص منطقی (inline-start/end) استفاده می‌کنند؛ این فایل
   فقط جاهایی را می‌گیرد که مرورگر یا مرزهای جهت‌دار خودکار درست نمی‌شوند.
   ========================================================================== */

html{direction:rtl}
body{direction:rtl;text-align:right}

/* عناصری که مرورگر پیش‌فرض چپ می‌گذارد */
input,select,textarea,button{text-align:right;direction:rtl}
input[type=tel],input[type=email],input[type=url],input[type=password],
input[type=number],.input-ltr,.ltr{direction:ltr;text-align:left}
/* شماره تلفن و قیمت داخل متن فارسی نباید تکه‌تکه شود */
.tel-link,.price-amount,.num,time,.order-number{unicode-bidi:isolate}

/* لیست‌ها: تورفتگی سمت راست */
ul,ol{padding-inline-start:0}
.prose ul,.prose ol{padding-inline-start:1.4em;padding-inline-end:0}

/* نقل‌قول و نوت: خط رنگی سمت راست */
blockquote,.content-note{border-inline-start-width:4px;border-inline-end-width:0}

/* فلش سلکت در RTL باید چپ باشد — در app.css با background-position:left ست شده،
   اینجا فقط برای سلکت‌های داخل فرم‌های تودرتو تکرار می‌شود */
select,.select{background-position:left 12px center}

/* اسکرول افقی: مرورگرهای قدیمی iOS نقطه شروع را چپ می‌گیرند */
.rail,.chip-rail,.table-wrap,.brand-rail,.related-rail{direction:rtl}

/* آیکون‌های جهت‌دار (فلش «ادامه») در RTL باید آینه شوند */
.icon-flip,
.section-more svg,
.pagination .prev svg,
.pagination .next svg,
.breadcrumb svg{transform:scaleX(-1)}

/* گرادیان‌ها و سایه‌های جهت‌دار */
.rail-fade{background:linear-gradient(to left,var(--c-bg),transparent)}

/* اسلایدر: ترتیب اسلایدها در RTL معکوس است */
.hero-slider,.hero-track{direction:rtl}

/* نوار پیشرفت / ریتینگ که با width پر می‌شود باید از راست پر شود */
.bar-fill,.rating-bar-fill{margin-inline-end:0;margin-inline-start:auto}

/* transform های افقی که در LTR نوشته شده‌اند */
[dir=rtl] .slide-in{transform:translateX(100%)}
[dir=rtl] .slide-in.is-open{transform:translateX(0)}

/* جدول: هدر و سلول‌ها همیشه از start */
th,td{text-align:start}

/* فرم شماره موبایل: پیشوند +۹۸ سمت چپ بماند */
.phone-field{display:flex;flex-direction:row-reverse}
.phone-field .prefix{
  display:grid;place-items:center;padding:0 12px;
  background:var(--c-line-2);border:1px solid var(--c-line);
  border-inline-end:0;
  border-start-start-radius:0;border-end-start-radius:0;
  border-start-end-radius:var(--r-md);border-end-end-radius:var(--r-md);
  color:var(--c-ink-2);font-size:15px;direction:ltr;
}
.phone-field .input{
  border-start-end-radius:0;border-end-end-radius:0;
}

/* اسکرول‌بار نازک سمت چپ در پنل‌ها */
.scroll-y{overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--c-line) transparent}
.scroll-y::-webkit-scrollbar{width:6px}
.scroll-y::-webkit-scrollbar-thumb{background:var(--c-line);border-radius:var(--r-full)}

/* محتوای انگلیسی داخل متن فارسی (مدل محصول) */
.model,.sku,code,kbd{direction:ltr;unicode-bidi:isolate;display:inline-block}

/* ==== nav.css ==== */

/* ==========================================================================
   هدر، ناوبری، مگامنو، پنل موبایل، نوار پایین موبایل
   --------------------------------------------------------------------------
   طراحی: روشن، مینیمال، اروپایی. سه لایه:
     ۱) نوار بالایی روشن (خاکستری --c-bg) — تلفن، ساعت کاری، لینک‌های فرعی
     ۲) نوار اصلی سفید — لوگو · جستجو · حساب · سبد · تماس
     ۳) نوار دسته‌ها سفید با خط مویی بالا + مگامنوی کم‌سایه
   --------------------------------------------------------------------------
   معماری چسبندگی (مهم — علت لرزش نسخهٔ قدیم):
   نسخهٔ خیلی قدیم روی همان عنصر sticky با transition، transform:translateY
   می‌زد. transform عنصر را به بلوکِ دربرگیرنده تبدیل می‌کند و مرورگر موقعیت
   sticky را یک فریم عقب‌تر حساب می‌کند ⇒ نوسان یک‌فریمی سر آستانه.
   قانون‌هایی که هنوز پابرجاست:
     • .topbar بیرون از هدر و در جریان عادی صفحه است.
     • .site-header فقط .mainbar + .navbar را دارد و فرزند مستقیم body است.
     • هیچ transform روی عنصر چسبان نداریم.
   تنها چیزی که در بازطراحی اضافه شد «جمع‌شدن در اسکرول» است (بند ۵ بریف):
   is-stuck فقط ارتفاع را کم می‌کند، آن هم حداکثر ۱۸px در دسکتاپ و ۱۰px در
   موبایل. هیسترزیس app.js ورود در ۱۲۰px و خروج در ۶۰px است؛ چون تغییر ارتفاع
   خیلی کوچک‌تر از فاصلهٔ ۶۰px است، امکان روشن/خاموش شدن حلقه‌ای وجود ندارد.
   (کم‌شدن ارتفاعِ عنصرِ چسبان scrollY را عوض نمی‌کند، فقط محتوای پایین را
   بالا می‌کشد؛ overflow-anchor:none هم جلوی جبران خودکار مرورگر را می‌گیرد.)
   ========================================================================== */

/* ارتفاع‌ها متغیرند تا scroll-padding و ستون‌های sticky بقیه صفحات هم‌خوان بمانند.
   نکته: بقیه فایل‌ها top:calc(var(--header-h) + 16px) می‌نویسند، پس --header-h
   باید «کل ارتفاع بخش چسبان» باشد نه فقط نوار اصلی.
   --msearch-h ردیف دومِ هدر موبایل (نوار جستجوی تمام‌عرض) است و در دسکتاپ صفر
   می‌ماند؛ mobile.css فقط --mainbar-h و --navbar-h را عوض می‌کند و این calc
   خودش را با آن‌ها به‌روز می‌کند. */
:root{
  --topbar-h:38px;
  --mainbar-h:76px;
  --navbar-h:50px;
  --msearch-h:0px;
  /* ارتفاع‌های حالت جمع‌شده (is-stuck) */
  --mainbar-h-stuck:62px;
  --navbar-h-stuck:46px;
  --header-h:calc(var(--mainbar-h) + var(--navbar-h) + var(--msearch-h));
  /* ارتفاع نوار پایین موبایل — با فضای امنِ body یک‌جا نگه داشته می‌شود */
  --mbar-h:62px;
  /* جهت خروج کشوی موبایل و اسلاید سطوح — سایت RTL است؛ برای LTR پایین بازنویسی می‌شود */
  --mp-out:100%;
  --mp-in:-100%;
}
[dir=ltr]{--mp-out:-100%;--mp-in:100%}

/* لنگر لینک‌های #… زیر هدر چسبان پنهان نشود */
html{scroll-padding-top:calc(var(--header-h) + 16px)}
:target{scroll-margin-top:calc(var(--header-h) + 16px)}

/* ==========================================================================
   ۱) نوار بالایی — روشن، کم‌رنگ، غیرچسبان
   در جریان عادی صفحه است؛ با اسکرول بالا می‌رود و دیگر رندر نمی‌شود.
   overflow-anchor:none تا اگر محتوایش دیر لود شد (فونت/ساعت کاری) مرورگر
   scrollTop را جبران نکند و حلقهٔ اسکرول-انکرینگ راه نیفتد.
   ========================================================================== */
.topbar{
  background:var(--c-bg);
  color:var(--c-ink-2);
  font-size:15px;line-height:1;
  border-bottom:1px solid var(--c-line);
  overflow-anchor:none;
}
.topbar .container{
  display:flex;align-items:center;justify-content:space-between;
  gap:var(--sp-5);height:var(--topbar-h);
}
.topbar a{color:var(--c-ink-2);transition:color var(--t-fast)}
@media (hover:hover){.topbar a:hover{color:var(--c-primary)}}
/* روی زمینهٔ روشن، حلقهٔ سفیدِ نسخهٔ تیره نامرئی بود */
.topbar a:focus-visible{outline:2px solid var(--c-primary);outline-offset:3px;border-radius:var(--r-sm)}

.topbar-start{display:flex;align-items:center;gap:var(--sp-5);min-width:0}
.topbar-links{display:flex;align-items:center;gap:18px;flex-wrap:wrap;min-width:0}
.topbar-links li{display:flex;align-items:center}
.topbar-links li+li{position:relative;padding-inline-start:18px}
.topbar-links li+li::before{
  content:'';position:absolute;inset-inline-start:0;top:50%;
  width:1px;height:12px;margin-top:-6px;background:var(--c-line);
}
.topbar-hours{
  display:inline-flex;align-items:center;gap:7px;
  white-space:nowrap;color:var(--c-ink-2);
}
.topbar-contact{display:flex;align-items:center;gap:var(--sp-4);flex:none}
.topbar-contact a{
  display:inline-flex;align-items:center;gap:7px;
  font-weight:500;color:var(--c-ink);
}
.topbar-contact .tel-num{unicode-bidi:isolate;font-variant-numeric:tabular-nums}
.topbar svg{width:15px;height:15px;stroke-width:1.75;flex:none;color:var(--c-primary)}
.topbar-hours svg{color:var(--c-ink-3)}

/* ==========================================================================
   ۲) هدر چسبان — سفید
   ========================================================================== */
.site-header{
  position:sticky;top:0;z-index:900;
  background:var(--c-surface);
  border-bottom:1px solid var(--c-line);
  transition:box-shadow .18s var(--ease),border-color .18s var(--ease);
  overflow-anchor:none;
}
/* .is-sticky فقط برای سازگاری با قالب‌ها/اسکریپت‌های قدیمی */
.site-header.is-sticky{position:sticky;top:0}
.site-header.is-stuck{box-shadow:var(--sh-1);border-bottom-color:var(--c-line-2)}

.mainbar{
  display:flex;align-items:center;gap:var(--sp-4);
  height:var(--mainbar-h);
  transition:height .18s var(--ease);
}
.site-header.is-stuck .mainbar{height:var(--mainbar-h-stuck)}

@media (prefers-reduced-motion:reduce){
  .site-header,.mainbar{transition:none}
}

/* ---------- لوگو ---------- */
.logo{
  display:flex;align-items:center;gap:10px;flex:none;
  border-radius:var(--r-sm);min-width:0;
}
/* ۲۰٪ بزرگ‌تر از قبل (۴۲→۵۰). --mainbar-h روی ۷۶px است، پس ۵۰px با
   فاصلهٔ بالا و پایین راحت جا می‌شود. */
.logo img{height:50px;width:auto;object-fit:contain;transition:height .18s var(--ease)}
.site-header.is-stuck .logo img{height:41px}
/* .logo خودش flex:none است، پس اگر نام/شعار سایت بلند باشد هیچ چیز جمعش
   نمی‌کند و نوار را پهن می‌کند؛ سقف عرض + بریدن با سه‌نقطه این را می‌بندد. */
.logo-text{display:flex;flex-direction:column;line-height:1.35;min-width:0;max-width:240px}
.logo-text b,.logo-text span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.logo-text b{font-size:16px;font-weight:700}
.logo-text span{font-size:15px;color:var(--c-ink-2)}
@media (max-width:1279px){.logo-text{display:none}}
@media (prefers-reduced-motion:reduce){.logo img{transition:none}}

/* ==========================================================================
   ۳) جستجو — مهم‌ترین عنصر هدر
   ========================================================================== */
.header-search{
  position:relative;
  flex:1 1 260px;min-width:0;max-width:620px;
  margin-inline-end:var(--sp-4);
}
/* display:block عمدی است: همهٔ فرزندهای دیگر absolute هستند، پس نه فلکس لازم
   است نه دردسر min-width آیتم فلکس. */
.header-search form{position:relative;display:block}
.header-search input{
  width:100%;min-width:0;height:48px;
  padding-inline-start:46px;padding-inline-end:104px;
  background:var(--c-surface);
  border:1px solid var(--c-line);
  border-radius:var(--r-md);
  font-size:15px;color:var(--c-ink);
  transition:border-color var(--t-fast),box-shadow var(--t-fast);
}
.site-header.is-stuck .header-search input{height:44px}
.header-search input:hover{border-color:var(--c-ink-3)}
.header-search input:focus{
  border-color:var(--c-primary);
  box-shadow:0 0 0 3px rgba(var(--c-primary-rgb),.12);
  outline:none;
}
.header-search .search-icon{
  position:absolute;inset-inline-start:15px;top:50%;transform:translateY(-50%);
  width:20px;height:20px;color:var(--c-ink-2);pointer-events:none;stroke-width:1.75;
}
/* دکمهٔ ارسال عمداً «متنی» است، نه یک دکمهٔ رنگی سوم:
   تنها CTA رنگیِ هدر، دکمهٔ تماس (.header-cta / .btn-primary) است. */
.header-search .search-submit{
  position:absolute;inset-inline-end:1px;top:50%;transform:translateY(-50%);
  height:34px;padding:0 16px;
  border-inline-start:1px solid var(--c-line);
  border-radius:0;
  background:transparent;color:var(--c-ink);
  font-size:15px;font-weight:500;line-height:1;
  transition:color var(--t-fast);
}
@media (hover:hover){.header-search .search-submit:hover{color:var(--c-primary)}}
.header-search .search-submit:focus-visible{outline:2px solid var(--c-primary);outline-offset:-2px;border-radius:var(--r-sm)}

/* ---------- پیشنهاد زنده — app.js پرش می‌کند ---------- */
.search-suggest{
  position:absolute;top:calc(100% + 8px);inset-inline:0;z-index:60;
  background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:var(--r-md);box-shadow:var(--sh-2);
  max-height:70vh;overflow-y:auto;overscroll-behavior:contain;
  padding:6px;display:none;
}
.search-suggest.is-open{display:block}
.suggest-group-title{
  font-size:15px;color:var(--c-ink-2);font-weight:500;
  padding:10px 10px 5px;
}
.suggest-item{
  display:flex;align-items:center;gap:11px;
  padding:9px 10px;border-radius:var(--r-sm);
  transition:background var(--t-fast);
}
.suggest-item:hover,.suggest-item.is-active{background:var(--c-line-2)}
.suggest-item img{
  width:44px;height:44px;object-fit:contain;flex:none;
  border-radius:var(--r-sm);background:var(--c-line-2);
}
.suggest-item .t{
  font-size:15px;color:var(--c-ink);line-height:1.6;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.suggest-item .s{font-size:15px;color:var(--c-ink-2)}
.suggest-item .p{margin-inline-start:auto;font-size:15px;font-weight:700;color:var(--c-ink);flex:none}
.suggest-empty{padding:22px;text-align:center;color:var(--c-ink-2);font-size:15px}
.suggest-all{
  display:block;text-align:center;padding:12px;margin-top:4px;
  border-top:1px solid var(--c-line-2);
  color:var(--c-primary);font-size:15px;font-weight:500;
}
@media (hover:hover){.suggest-all:hover{color:var(--c-primary-dark)}}

/* ==========================================================================
   ۴) اکشن‌های هدر
   ========================================================================== */
.header-actions{display:flex;align-items:center;gap:4px;flex:none;margin-inline-start:auto}
.hact{
  position:relative;display:inline-flex;align-items:center;gap:8px;
  min-height:44px;padding:0 12px;border-radius:var(--r-md);
  color:var(--c-ink-2);font-size:15px;font-weight:500;
  transition:background var(--t-fast),color var(--t-fast);
}
.hact svg{width:22px;height:22px;stroke-width:1.75;flex:none}
@media (hover:hover){.hact:hover{background:var(--c-line-2);color:var(--c-ink)}}
/* نشان روی خودِ آیکون بنشیند نه گوشهٔ دکمه — در RTL آیکون سمت شروع (راست) است،
   و با inset-inline-end نشان روی متن «سبد خرید» می‌افتاد و ناخوانا می‌شد */
.hact-count{
  position:absolute;top:2px;inset-inline-start:6px;
  min-width:18px;height:18px;padding:0 5px;
  display:grid;place-items:center;
  background:var(--c-primary);color:#fff;
  /* استثنای «حداقل ۱۵px» در app.css: عددِ داخل یک دایرهٔ ۱۸px است، نه متن بدنه */
  font-size:11px;font-weight:700;border-radius:var(--r-full);
  line-height:1;
}
.hact-count:empty,.hact-count[data-count="0"]{display:none}

/* تنها CTA رنگیِ هدر */
.header-cta{margin-inline-start:var(--sp-2);min-height:44px;padding:0 18px}
.header-cta svg{width:18px;height:18px}

/* زیر ۱۲۸۰ فقط آیکون می‌ماند تا نوار هرگز سرریز نکند */
@media (max-width:1279px){
  .hact span,.header-cta span{display:none}
  .hact{padding:0 10px}
  .header-cta{padding:0 12px;min-width:44px}
}

/* ---------- دکمه همبرگر ---------- */
.hamburger{
  display:none;width:44px;height:44px;border-radius:var(--r-md);
  align-items:center;justify-content:center;color:var(--c-ink);flex:none;
  transition:background var(--t-fast);
}
.hamburger svg{width:24px;height:24px;stroke-width:1.75}
@media (hover:hover){.hamburger:hover{background:var(--c-line-2)}}
@media (max-width:900px){.hamburger{display:inline-flex}}

/* ==========================================================================
   ۵) نوار دسته‌ها + مگامنو (دسکتاپ)
   ========================================================================== */
.navbar{border-top:1px solid var(--c-line-2);background:var(--c-surface)}
/* مگا نسبت به همین container موقعیت می‌گیرد تا هم‌عرض محتوای صفحه باشد */
.navbar>.container{position:relative}

/* نامِ دسته باید *کامل* دیده شود — سه‌نقطهٔ نسخهٔ قبل حذف شد.
   حساب سرانگشتی: ده دستهٔ این فروشگاه اسم‌های بلند دارند («ماشین ظرفشویی»،
   «لوازم آشپزخانه»)؛ هر برچسب حدود ۹۰px است و با پدینگ و فلشِ مگا حدود ۱۳۰px
   می‌شود ⇒ نزدیک ۱۳۰۰px. بیشینهٔ عرضِ مفیدِ .container هم ۱۲۵۶px است
   (۱۳۲۰ منهای ۲×۳۲ پدینگ) و در ۱۰۲۴px فقط ۹۶۰px. یعنی حتی با کمینه‌ترین
   پدینگ هم همیشه جا نمی‌شود. سه راه بود: بریدنِ نام (خواستهٔ مالک را نقض
   می‌کرد)، کوچک‌کردنِ فونت زیر ۱۵px (قاعدهٔ سفت‌وسختِ پروژه)، یا لغزاندنِ نوار.
   سومی انتخاب شد؛ وقتی محتوا جا شود این قاعده هیچ اثر دیداری ندارد.

   ⚠ چرا این کار مگا را نمی‌بَرد: .mega موقعیتش را از .navbar>.container
   می‌گیرد (تنها عنصرِ position:relative این شاخه) و آن ظرف *والدِ* همین
   ظرفِ اسکرول است. طبق CSS 2.1 §11.1.1 عنصر absolute که بلوکِ دربرگیرنده‌اش
   بیرونِ ظرفِ برش باشد، بریده نمی‌شود. شرطِ لازمِ این معافیت، static ماندنِ
   .mainnav>li است — با یک position:relative روی li، بلوکِ دربرگیرنده می‌آید
   داخلِ ظرفِ اسکرول و پنل همان‌جا قیچی می‌شود.
   به همین دلیل هم هرگز transform / filter / contain / will-change روی
   .mainnav نگذارید: هر کدام .mainnav را خودش به بلوکِ دربرگیرنده تبدیل
   می‌کند و همان قیچی برمی‌گردد. (mask/clip-path هم checkdesign را می‌شکند،
   پس محوکنندهٔ لبه هم عمداً نداریم.)
   overflow-y:hidden صریح است تا مرورگر آن را به auto ترفیع ندهد و نوارِ
   اسکرولِ عمودیِ بی‌مورد نسازد. */
.mainnav{
  display:flex;align-items:center;gap:0;min-width:0;
  height:var(--navbar-h);transition:height .18s var(--ease);
  overflow-x:auto;overflow-y:hidden;
  overscroll-behavior-inline:contain;
  -webkit-overflow-scrolling:touch;
  scroll-padding-inline:12px;
  /* نوارِ اسکرول پنهان است: در دسکتاپ اغلب عرض‌ها محتوا جا می‌شود و یک نوارِ
     خاکستریِ دائمی زیرِ منو فقط شلوغی است. لغزش با ترک‌پد/شیفت+چرخ و پرشِ
     خودکارِ فوکوس با Tab کار می‌کند. */
  scrollbar-width:none;-ms-overflow-style:none;
}
.mainnav::-webkit-scrollbar{display:none}
/* flex:none یعنی هیچ آیتمی زیرِ عرضِ نامش جمع نمی‌شود؛ سرریز به اسکرول
   می‌رود نه به بریدنِ متن. */
.mainnav>li{position:static;display:flex;flex:none;min-width:0}
.mainnav>li>a{
  display:inline-flex;align-items:center;gap:5px;min-width:0;
  height:var(--navbar-h);padding:0 10px;
  font-size:15px;font-weight:500;color:var(--c-ink-2);
  white-space:nowrap;position:relative;
  transition:color var(--t-fast),height .18s var(--ease);
}
.site-header.is-stuck .mainnav,
.site-header.is-stuck .mainnav>li>a{height:var(--navbar-h-stuck)}
@media (prefers-reduced-motion:reduce){
  .mainnav,.mainnav>li>a{transition:none}
}
.mainnav>li>a>svg{width:16px;height:16px;flex:none;stroke-width:1.75;color:var(--c-ink-3);transition:transform var(--t-fast)}
.mainnav>li>a::after{
  content:'';position:absolute;inset-inline:10px;bottom:0;height:2px;
  background:var(--c-primary);
  transform:scaleX(0);transform-origin:center;transition:transform var(--t-fast);
}
.mainnav>li.is-open>a,.mainnav>li>a[aria-current=page]{color:var(--c-primary)}
.mainnav>li.is-open>a::after,.mainnav>li>a[aria-current=page]::after{transform:scaleX(1)}
.mainnav>li.is-open>a>svg{transform:rotate(180deg);color:var(--c-primary)}
@media (hover:hover){
  .mainnav>li>a:hover{color:var(--c-primary)}
  .mainnav>li>a:hover::after{transform:scaleX(1)}
}
.mainnav>li>a:focus-visible{outline:2px solid var(--c-primary);outline-offset:-3px;border-radius:var(--r-sm)}

/* برچسب کوچک (جدید / تخفیف) از ستون badge جدول menus */
.nav-badge{
  /* برچسبِ حبابیِ کنار عنوان منو — فرا-دادهٔ فرعی، نه متن بدنه.
     ۱۲٫۵px کفِ خوانایی فارسی در حباب است؛ ۱۱px حروفِ «تخفیف» را می‌بندد. */
  flex:none;font-size:12.5px;font-weight:700;line-height:1;
  padding:4px 7px;border-radius:var(--r-full);
  background:var(--c-primary-soft);color:var(--c-primary-dark);
}

/* ---------- پنل مگا ---------- */
.mega{
  position:absolute;inset-inline:0;top:100%;z-index:80;
  background:var(--c-surface);
  border:1px solid var(--c-line);border-top:0;
  border-radius:0 0 var(--r-lg) var(--r-lg);
  box-shadow:var(--sh-2);
  padding:var(--sp-6);
  max-height:calc(100vh - var(--header-h) - 24px);
  /* هر دو محور صریح: با نوشتن فقط overflow-y:auto، مرورگر overflow-x را هم
     auto می‌کند و کوچک‌ترین سرریز افقی یک اسکرول‌بار افقی زشت زیر پنل می‌سازد.
     بین نوار و پنل هیچ فاصله‌ای نیست (پنل دقیقاً top:100%)، پس «ناحیه امن»
     را app.js با تشخیص جهت حرکت ماوس می‌سازد نه با شبه‌عنصرِ بیرون‌زده. */
  overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;
  opacity:0;visibility:hidden;transform:translateY(-6px);
  /* visibility را نباید «مدت‌دار» ترنزیشن داد: در لحظهٔ صفرِ ترنزیشن مقدار
     محاسبه‌شده هنوز hidden است و focus() برنامه‌ای (فلش پایین با کیبورد) بی‌اثر
     می‌ماند. الگوی درست: در حالت بسته با تأخیرِ برابرِ مدت محو، و در حالت باز
     با مدت و تأخیر صفر ⇒ باز شدن آنی و بسته شدن بعد از پایان انیمیشن. */
  transition:opacity .16s var(--ease),transform .16s var(--ease),visibility 0s linear .16s;
}
.mainnav>li.is-open>.mega{
  opacity:1;visibility:visible;transform:none;
  transition:opacity .16s var(--ease),transform .16s var(--ease),visibility 0s;
}
@media (prefers-reduced-motion:reduce){
  .mega,.mainnav>li.is-open>.mega{transition:none;transform:none}
}

/* مارک‌آپ فقط .mega-main را دارد؛ گریدِ دو ستونیِ قبلی یک ستونِ ۲۶۸px خالی
   می‌ساخت و پنل را نامتوازن نشان می‌داد. */
.mega-inner{display:block}
.mega-main{min-width:0}

/* سرستون پنل: عنوان دسته + لینک «مشاهده همه» */
.mega-top{
  display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-3);
  padding-bottom:var(--sp-3);margin-bottom:var(--sp-5);
  border-bottom:1px solid var(--c-line-2);
}
.mega-top h3{font-size:16px;font-weight:700;color:var(--c-ink);min-width:0}
.mega-all{
  display:inline-flex;align-items:center;gap:5px;flex:none;
  font-size:15px;font-weight:500;color:var(--c-primary);
  transition:color var(--t-fast);
}
.mega-all svg{width:15px;height:15px;stroke-width:2}
@media (hover:hover){.mega-all:hover{color:var(--c-primary-dark)}}

/* حالت ۱ — فرزندان نوه دارند: هر فرزند یک ستون با تیتر */
.mega-cols{
  display:grid;
  grid-template-columns:repeat(var(--mega-cols,4),minmax(0,1fr));
  gap:var(--sp-5) var(--sp-6);
}
.mega-col{min-width:0}
.mega-col>a.mega-head{
  display:block;font-size:15px;font-weight:700;color:var(--c-ink);
  padding-bottom:9px;margin-bottom:9px;border-bottom:1px solid var(--c-line-2);
  transition:color var(--t-fast);
}
@media (hover:hover){.mega-col>a.mega-head:hover{color:var(--c-primary)}}
.mega-col ul li{margin-bottom:1px}
.mega-col ul a{
  display:block;padding:6px 0;font-size:15px;color:var(--c-ink-2);
  border-radius:var(--r-sm);
  transition:color var(--t-fast);
}
@media (hover:hover){.mega-col ul a:hover{color:var(--c-primary)}}

/* حالت ۲ — فرزندان نوه ندارند: فهرست تخت که در چند ستون جاری می‌شود.
   با columns، ترتیب خواندن «بالا به پایینِ هر ستون» می‌ماند که برای فهرست
   الفبایی دسته درست‌تر از grid سطری است. تا ۱۱ فرزند هم مرتب می‌ماند. */
.mega-list{columns:var(--mega-cols,4);column-gap:var(--sp-6)}
.mega-list li{break-inside:avoid;margin-bottom:1px}
.mega-list a{
  display:block;padding:8px 10px;border-radius:var(--r-sm);
  font-size:15px;color:var(--c-ink-2);
  transition:background var(--t-fast),color var(--t-fast);
}
@media (hover:hover){
  .mega-list a:hover{background:var(--c-line-2);color:var(--c-ink)}
}
.mega a:focus-visible{outline:2px solid var(--c-primary);outline-offset:2px;border-radius:var(--r-sm)}

@media (max-width:1180px){
  .mega-cols,.mega-list{--mega-cols:3 !important}
  .mega{padding:var(--sp-5)}
  /* پدینگ دو پیکسل بیشتر جمع می‌شود تا در تبلتِ افقی و لپ‌تاپِ ۱۰۲۴ چند
     دستهٔ بیشتری بدون لغزاندن دیده شوند. فونت عمداً همان ۱۵px می‌ماند. */
  .mainnav>li>a{padding:0 8px}
  .mainnav>li>a::after{inset-inline:8px}
}
@media (max-width:900px){.navbar{display:none}}

/* ==========================================================================
   ۶) هدر موبایل — دو ردیفه (طراحی مستقل، نه دسکتاپِ کوچک‌شده)
   ردیف ۱: همبرگر · لوگو · سبد    ردیف ۲: جستجوی تمام‌عرض
   --------------------------------------------------------------------------
   ⚠ mobile.css بعد از این فایل لود می‌شود و روی .mainbar / .header-search input
   ارتفاع و flex تحمیل می‌کند. چون آن فایل خارج از دامنهٔ این تغییر است، اینجا
   با یک کلاسِ بیشتر (.site-header …) تخصص بالاتر گرفته می‌شود. هیچ !important
   لازم نشد. کلاس‌ها و قلاب‌های app.js دست‌نخورده‌اند.
   ========================================================================== */
@media (max-width:900px){
  /* ردیف دوم به --header-h اضافه می‌شود تا لنگرها و ستون‌های sticky
     صفحات دیگر زیر هدر نروند */
  :root{--msearch-h:54px}

  .site-header .mainbar{
    display:grid;
    grid-template-columns:auto minmax(0,1fr) auto;
    grid-template-rows:var(--mainbar-h) var(--msearch-h);
    grid-template-areas:
      "burger logo actions"
      "search search search";
    align-items:center;
    height:auto;
    column-gap:var(--sp-2);row-gap:0;
  }
  .site-header .hamburger{grid-area:burger}
  .site-header .logo{grid-area:logo;justify-self:start}
  .site-header .header-actions{grid-area:actions;justify-self:end;margin-inline-start:0;gap:var(--sp-1)}
  .site-header .header-search{
    grid-area:search;align-self:start;
    width:100%;max-width:none;margin-inline-end:0;
  }
  /* ۴۶px هدف لمس و ۱۶px فونت تا iOS موقع فوکوس صفحه را زوم نکند */
  .site-header .header-search input{
    height:46px;font-size:16px;
    padding-inline-start:42px;padding-inline-end:14px;
  }
  .site-header .header-search .search-icon{inset-inline-start:12px;width:19px;height:19px}

  /* حالت جمع‌شده: فقط ۱۰px کوتاه‌تر — بسیار کمتر از فاصلهٔ ۶۰px هیسترزیس */
  .site-header.is-stuck .mainbar{height:auto;grid-template-rows:52px 50px}
  .site-header.is-stuck .header-search input{height:44px}
  .site-header.is-stuck .logo img{height:36px}

  /* شمارهٔ تلفن در نوار بالایی نباید ۱۲px بماند */
  body>.topbar{font-size:15px}
}

/* ==========================================================================
   ۷) کشوی موبایل — دو سطحی (drill-down)
   ⚠ عمداً آکاردئون نیست: منطقِ سطح‌بندی در app.js است (data-mp-open /
   data-mp-pane / is-drilled) و بعضی دسته‌ها ۱۱ فرزند دارند. سطح دوم روی سطح
   اول می‌لغزد. اینجا فقط ظاهر بازطراحی شده و همهٔ قلاب‌های JS دست‌نخورده است.
   ========================================================================== */
.nav-overlay{
  position:fixed;inset:0;z-index:990;
  background:rgba(29,29,27,.45);
  opacity:0;visibility:hidden;
  transition:opacity var(--t-slow),visibility 0s linear .25s;
  /* عمداً backdrop-filter ندارد: بلورِ یک لایه تمام‌صفحه روی موبایلِ ضعیف
     هر فریم هزینه دارد و پشت ۴۵٪ تیرگی عملاً دیده نمی‌شود. */
}
.nav-overlay.is-open{opacity:1;visibility:visible;transition:opacity var(--t-slow),visibility 0s}

/* قفل اسکرول بدون پرش: app.js مقدار top را برابر منفیِ scrollY می‌گذارد و
   موقع بستن همان‌جا برمی‌گرداند. overflow:hidden تنها، در iOS کار نمی‌کند. */
body.is-locked{
  position:fixed;inset-inline:0;width:100%;
  overflow:hidden;overscroll-behavior:none;
}

.mobile-panel{
  position:fixed;inset-block:0;inset-inline-start:0;z-index:1000;
  width:min(360px,90vw);
  background:var(--c-surface);
  display:flex;flex-direction:column;
  transform:translateX(var(--mp-out));
  /* همان الگوی .mega — باز شدنِ آنیِ visibility تا focus() کار کند،
     پنهان شدن با تأخیر تا لغزشِ بسته‌شدن تا آخر دیده شود */
  transition:transform var(--t-slow),visibility 0s linear .25s;
  box-shadow:var(--sh-2);
  visibility:hidden;
  padding-top:env(safe-area-inset-top,0px);
  padding-bottom:env(safe-area-inset-bottom,0px);
  padding-inline-start:env(safe-area-inset-right,0px);
}
.mobile-panel.is-open{
  transform:translateX(0);visibility:visible;
  transition:transform var(--t-slow),visibility 0s;
}
@media (prefers-reduced-motion:reduce){
  .mobile-panel,.mobile-panel.is-open,.nav-overlay{transition:none}
}

/* سر کشو — خارج از ناحیه اسکرول است، پس همیشه دیده می‌شود */
.mp-head{
  display:flex;align-items:center;gap:var(--sp-2);
  padding:8px 12px;border-bottom:1px solid var(--c-line);flex:none;
  min-height:60px;background:var(--c-surface);
}
.mp-title{
  flex:1 1 auto;min-width:0;font-size:15.5px;font-weight:700;color:var(--c-ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.mp-back,.mp-close{
  width:44px;height:44px;flex:none;border-radius:var(--r-md);
  display:grid;place-items:center;
  background:transparent;color:var(--c-ink-2);
  border:1px solid var(--c-line);
  transition:background var(--t-fast),color var(--t-fast),border-color var(--t-fast);
}
.mp-back[hidden]{display:none}
.mp-back svg,.mp-close svg{width:20px;height:20px;stroke-width:1.75}
.mp-back:active,.mp-close:active{background:var(--c-line-2);color:var(--c-ink)}
.mp-back:focus-visible,.mp-close:focus-visible{outline:2px solid var(--c-primary);outline-offset:2px}

.mp-search{padding:12px;border-bottom:1px solid var(--c-line-2);flex:none;background:var(--c-surface)}
.mp-search input{width:100%;min-height:46px;font-size:16px}

/* ناحیه اسکرول: میزبان دو سطح که روی هم قرار می‌گیرند.
   min-height:0 لازم است وگرنه آیتمِ فلکسِ ستونی کوچک‌تر از محتوایش نمی‌شود
   و سرِ کشو و پایِ کشو از قاب بیرون می‌زنند. */
.mp-body{
  flex:1 1 auto;min-height:0;position:relative;overflow:hidden;
  background:var(--c-surface);
}
.mp-pane{
  position:absolute;inset:0;
  overflow-y:auto;-webkit-overflow-scrolling:touch;
  overscroll-behavior:contain;
  padding:4px 0 14px;
  background:var(--c-surface);
  /* همان الگوی visibility: نمایان‌شدن آنی (تا focus() کار کند)، پنهان‌شدن
     با تأخیرِ برابرِ مدت لغزش. app.js در focusables() هم دقیقاً روی
     getComputedStyle(el).visibility حساب می‌کند — display:none نکنید. */
  transition:transform var(--t-slow),visibility 0s linear .25s;
  visibility:hidden;
}
/* سطح ریشه بیرون که رفت، به سمت مقابلِ ورود می‌لغزد (هر دو سطح هم‌جهت حرکت می‌کنند) */
.mp-pane[data-mp-pane]{transform:translateX(var(--mp-in))}
.mp-pane-root{
  transform:translateX(0);visibility:visible;
  transition:transform var(--t-slow),visibility 0s;
}
.mobile-panel.is-drilled .mp-pane-root{
  transform:translateX(var(--mp-out));visibility:hidden;
  transition:transform var(--t-slow),visibility 0s linear .25s;
}
.mp-pane.is-active{
  transform:translateX(0);visibility:visible;
  transition:transform var(--t-slow),visibility 0s;
}
@media (prefers-reduced-motion:reduce){
  .mp-pane,.mp-pane-root,.mp-pane.is-active,.mobile-panel.is-drilled .mp-pane-root{transition:none}
}

.mp-nav>li+li{border-top:1px solid var(--c-line-2)}
.mp-nav a,.mp-nav .mp-drill{
  display:flex;align-items:center;gap:11px;width:100%;
  min-height:54px;padding:12px 16px;
  font-size:15px;color:var(--c-ink);text-align:start;line-height:1.5;
  -webkit-tap-highlight-color:transparent;
  transition:background var(--t-fast);
}
.mp-nav a:active,.mp-nav .mp-drill:active{background:var(--c-line-2)}
.mp-nav .mp-label{flex:1 1 auto;min-width:0}
.mp-nav .chev{flex:none;width:20px;height:20px;color:var(--c-ink-3);stroke-width:1.75}
.mp-nav .mp-badge{
  /* هم‌اندازهٔ .nav-badge — ۱۲٫۵px کفِ خوانایی فارسی در حباب */
  flex:none;font-size:12.5px;font-weight:700;line-height:1;padding:4px 7px;
  border-radius:var(--r-full);background:var(--c-primary-soft);color:var(--c-primary-dark);
}
.mp-nav .mp-count{flex:none;font-size:14px;color:var(--c-ink-2)}
.mp-nav a:focus-visible,.mp-nav .mp-drill:focus-visible{
  outline:2px solid var(--c-primary);outline-offset:-2px;
}

/* تیتر سطح دوم + لینک «مشاهده همه …» */
.mp-sub-head{
  padding:12px 16px;border-bottom:1px solid var(--c-line-2);
  background:var(--c-bg);
}
.mp-sub-head .mp-all{
  display:inline-flex;align-items:center;gap:6px;min-height:0;padding:0;
  font-size:15px;font-weight:700;color:var(--c-primary);
}
.mp-sub-head .mp-all svg{width:16px;height:16px;stroke-width:2}

/* پای کشو — چسبان */
.mp-foot{
  flex:none;padding:12px;border-top:1px solid var(--c-line);
  display:grid;gap:8px;background:var(--c-surface);
}
.mp-foot .btn{min-height:48px;width:100%}
/* auto-flow تا اگر فقط یکی از تلفن/واتس‌اپ تنظیم شده بود، جای خالی نماند */
.mp-foot-row{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:8px}
.mp-foot .mp-phone,.mp-foot .mp-wa{
  display:flex;align-items:center;justify-content:center;gap:7px;
  min-height:46px;border-radius:var(--r-md);
  font-size:15px;font-weight:500;
  background:var(--c-surface);color:var(--c-ink);
  border:1px solid var(--c-line);min-width:0;
}
.mp-foot .mp-phone{direction:ltr;unicode-bidi:isolate}
.mp-foot .mp-phone svg,.mp-foot .mp-wa svg{color:var(--c-primary)}
.mp-foot .mp-phone span,.mp-foot .mp-wa span{
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;
}
.mp-foot svg{width:18px;height:18px;flex:none;stroke-width:1.75}

/* ==========================================================================
   ۸) نوار پایین موبایل — «کلیدهای نرم» (بازطراحی)
   مارک‌آپش در views/layout/footer.php است.
   --------------------------------------------------------------------------
   چرا عوض شد: چیدمانِ قبلی — پنج ستونِ مساویِ سفید، آیکونِ خطیِ لخت و برچسبِ
   زیرش — عیناً در سایتِ دیگری از همین مالک هم هست و دو سایت را هم‌شکل نشان
   می‌داد. حالا آیکون داخل یک «کلیدِ» نرمِ خاکستریِ کشیده می‌نشیند و آیتمِ
   فعال همان کلید را قرمزِ توپر می‌کند؛ برچسب فقط پررنگ‌تر و تیره‌تر می‌شود.

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

   ⚠ --mbar-h تنها منبعِ حقیقتِ ارتفاعِ این نوار است. نوارِ خریدِ چسبانِ صفحهٔ
   محصول (product.css) و دکمهٔ بازگشت به بالا (mobile.css) هر دو خودشان را با
   همین توکن بالای این نوار نگه می‌دارند، پس عوض‌کردنش فقط همین‌جا لازم است و
   هیچ فایلی نباید عددِ ۶۲ را دوباره دستی بنویسد. ارتفاعِ محتوا
   (۲۸ کلید + ۴ فاصله + ۱۸ برچسب = ۵۰px) با ۶px تنفسِ بالا و پایین در ۶۲px جا می‌شود.
   ⚠ backdrop-filter عمداً ندارد — روی موبایلِ ضعیف هر فریم هزینه دارد.
   ⚠ همهٔ قلاب‌های app.js دست‌نخورده‌اند: .mobile-bar · .mb-count[data-count]
     · [data-menu-open] · #mobilePanel · .is-active
   ========================================================================== */
.mobile-bar{
  display:none;
  position:fixed;inset-block-end:0;inset-inline:0;z-index:880;
  background:var(--c-surface);
  border-top:1px solid var(--c-line);
  padding-bottom:env(safe-area-inset-bottom,0px);
}
.mobile-bar ul{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));align-items:center}
.mobile-bar a{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;
  height:var(--mbar-h);min-width:0;padding:0 2px;
  /* غیرفعال = --c-ink-2. عمداً نه --c-ink-3: آن یکی روی سفید ۳٫۳:۱ است و
     برای متن AA را رد نمی‌کند. --c-ink-2 روی سفید ۵٫۸:۱ و روی کلید ۵٫۴:۱. */
  font-size:15px;font-weight:500;color:var(--c-ink-2);line-height:1.2;
  position:relative;transition:color var(--t-fast);
  -webkit-tap-highlight-color:transparent;
}
/* «کلید» — کشیده و نه دایره، تا کنارِ برچسبِ ۱۵پیکسلیِ فارسی پهن‌تر از بلند
   دیده شود و ردیف آرام بماند. ۴۴×۲۸ خودش هدفِ لمسیِ اضافه نیست؛ هدفِ لمسیِ
   واقعی کلِ <a> است (۶۲px ارتفاع × حداقل ۶۴px عرضِ ستون در ۳۲۰px). */
.mobile-bar .mb-ico{
  display:grid;place-items:center;flex:none;
  width:44px;height:28px;border-radius:var(--r-full);
  background:var(--c-bg);color:var(--c-ink-2);
  transition:background var(--t-fast),color var(--t-fast);
}
.mobile-bar svg{width:21px;height:21px;stroke-width:1.75;flex:none}
.mobile-bar .mb-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}

/* حالت فعال. سلکتور عمداً یک پله تخصصی‌تر (ul اضافه) است چون bosch.css بعد
   از این فایل لود می‌شود و آنجا «.mobile-bar a.is-active{color:var(--c-primary)}»
   نوشته شده؛ با برچسبِ قرمز *و* کلیدِ قرمز، دو قرمزِ هم‌زمان روی یک آیتم
   می‌افتاد. حالا قرمز فقط در کلید است و برچسب مشکیِ پررنگ.
   [aria-expanded=true] برای «دسته‌ها»ست: app.js همین ویژگی را روی
   [data-menu-open] می‌گذارد، پس تا وقتی کشو باز است آن آیتم هم فعال دیده
   می‌شود — بدون یک خط جاوااسکریپتِ تازه. */
.mobile-bar ul a.is-active,
.mobile-bar ul a[aria-expanded=true]{color:var(--c-ink);font-weight:700}
.mobile-bar ul a.is-active .mb-ico,
.mobile-bar ul a[aria-expanded=true] .mb-ico{background:var(--c-primary);color:#fff}

/* بازخوردِ لمس روی خودِ کلید می‌نشیند نه کلِ ستون — نوار جابه‌جا به نظر نرسد */
.mobile-bar a:active .mb-ico{background:var(--c-line)}
.mobile-bar ul a.is-active:active .mb-ico{background:var(--c-primary-dark)}
.mobile-bar a:focus-visible{outline:2px solid var(--c-primary);outline-offset:-3px;border-radius:var(--r-sm)}

/* شمارنده روی گوشهٔ کلید می‌نشیند، نه وسطِ هوا. حلقهٔ سفید لازم است چون روی
   کلیدِ قرمزِ حالتِ فعال، دایرهٔ قرمز در زمینهٔ قرمز گم می‌شد. */
.mobile-bar .mb-count{
  position:absolute;top:4px;inset-inline-end:calc(50% - 28px);
  min-width:17px;height:17px;padding:0 4px;
  display:grid;place-items:center;background:var(--c-primary);color:#fff;
  /* عددِ داخل دایرهٔ ۱۷px — استثنای «حداقل ۱۵px» */
  font-size:10px;font-weight:700;border-radius:var(--r-full);line-height:1;
  box-shadow:0 0 0 2px var(--c-surface);
}
.mobile-bar .mb-count:empty,.mobile-bar .mb-count[data-count="0"]{display:none}
@media (prefers-reduced-motion:reduce){
  .mobile-bar a,.mobile-bar .mb-ico{transition:none}
}
@media (max-width:900px){
  .mobile-bar{display:block}
  /* فضای امن تا محتوا زیر نوار نرود */
  body{padding-bottom:calc(var(--mbar-h) + 2px + env(safe-area-inset-bottom,0px))}
}
/* در ۳۲۰–۴۰۰px هر ستون فقط ۶۴ تا ۸۰px است؛ کلید کمی باریک‌تر می‌شود تا
   برچسبِ «دسته‌ها» بدون سه‌نقطه جا شود. font-size هم دوباره تصریح می‌شود:
   mobile.css بعد از این فایل لود می‌شود و پیش‌تر همین برچسب‌ها را ۹٫۵px
   می‌کرد؛ سلکتور یک پله تخصصی‌تر است تا اگر آن قاعده برگشت برنده نشود. */
@media (max-width:400px){
  .mobile-bar li a{font-size:15px}
  .mobile-bar li .mb-ico{width:38px;height:27px}
  .mobile-bar li .mb-count{inset-inline-end:calc(50% - 25px)}
}

/* نوار بالایی هم مثل هدر در چاپ حذف شود (app.css فقط .site-header را می‌برد،
   و .topbar دیگر داخل هدر نیست) */
@media print{
  .topbar,.nav-overlay,.mobile-panel{display:none !important}
}

/* ==== card.css ==== */

/* ==========================================================================
   کارت محصول
   --------------------------------------------------------------------------
   سه حالتِ کاملاً مجزا (منطقِ انتخاب در views/partials/product-card.php):

     .pcard            قیمت‌دار و موجود   → قیمت + دکمهٔ «افزودن به سبد»
     .pcard.is-oos     قیمت‌دار ناموجود   → قیمتِ خاموش + دکمهٔ «اطلاع از موجودی»
     .pcard.is-quote   بدون قیمت (استعلامی) → فقط دکمهٔ استعلام، بدون هیچ خطِ قیمت

   ⚠ قانونِ اصلِ کاتالوگ: از ۴۸۵ محصول، ۳۸۵ تا price=0 هستند. در حالتِ استعلامی
   نه قیمت چاپ می‌شود و نه جای خالیِ قیمت رزرو می‌شود؛ «قیمت» و «تماس بگیرید»
   هیچ‌وقت کنار هم دیده نمی‌شوند.

   هم‌ترازیِ کارت‌ها: .pcard-foot با margin-block-start:auto به کفِ کارت می‌چسبد،
   پس دکمه‌های همهٔ کارت‌های یک ردیف — در هر سه حالت — روی یک خط می‌نشینند و
   ارتفاعِ کارت‌ها هم با stretch گرید یکسان می‌ماند.

   ⚠ کارت فقط یک دکمه دارد: «مشاهده جزئیات و خرید» که به صفحهٔ محصول می‌رود
   (خواستهٔ صریحِ کارفرما). «افزودن به سبد» و «تماس برای قیمت» از کارت برداشته
   شدند و فقط در صفحهٔ محصول‌اند. یعنی روی صفحهٔ دسته دیگر هیچ [data-add-to-cart]
   وجود ندارد؛ app.js با delegation کار می‌کند پس چیزی نمی‌شکند.
   تنها قلاب باقی‌مانده روی کارت: [data-wish] برای علاقه‌مندی.
   ========================================================================== */

/* ---------- گرید محصولات ---------- */
/* ⚠ گرید حالا <ul> است (فهرست محصولات باید فهرستِ واقعی باشد).
   بدونِ ریست، مرورگر بولت و تورفتگی می‌گذارد. list-style روی خودِ ul
   کافی نیست چون بعضی مرورگرها آن را به li ارث نمی‌دهند در حالتِ grid. */
.product-grid,
.product-grid > li{list-style:none}
/* ⚠ کلیدِ «صفحه‌بندی نداشته باشیم ولی کند نشود».
   content-visibility:auto به مرورگر می‌گوید چیدمان و رنگ‌آمیزیِ این
   کارت را تا وقتی نزدیکِ دید نشده انجام ندهد. با ۳۰۰ کارت تفاوتش
   بزرگ است.
   contain-intrinsic-size ارتفاعِ حدسی می‌دهد تا نوارِ اسکرول در حین
   اسکرول نپرد — بدون آن، پرشِ محتوا (CLS) می‌سازد. عدد از ارتفاعِ
   واقعیِ کارت آمده. */
.product-grid > li{
  min-width:0;display:flex;
  content-visibility:auto;
  contain-intrinsic-size:auto 360px;
}
.product-grid > li > .pcard{flex:1 1 auto}
.product-grid{margin:0;padding:0;
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:12px;
}
@media (min-width:640px){/* ⚠ گرید حالا <ul> است (فهرست محصولات باید فهرستِ واقعی باشد).
   بدونِ ریست، مرورگر بولت و تورفتگی می‌گذارد. list-style روی خودِ ul
   کافی نیست چون بعضی مرورگرها آن را به li ارث نمی‌دهند در حالتِ grid. */
.product-grid,
.product-grid > li{list-style:none}
.product-grid > li{min-width:0;display:flex}
.product-grid > li > .pcard{flex:1 1 auto}
.product-grid{margin:0;padding:0;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}}
@media (min-width:1024px){/* ⚠ گرید حالا <ul> است (فهرست محصولات باید فهرستِ واقعی باشد).
   بدونِ ریست، مرورگر بولت و تورفتگی می‌گذارد. list-style روی خودِ ul
   کافی نیست چون بعضی مرورگرها آن را به li ارث نمی‌دهند در حالتِ grid. */
.product-grid,
.product-grid > li{list-style:none}
.product-grid > li{min-width:0;display:flex}
.product-grid > li > .pcard{flex:1 1 auto}
.product-grid{margin:0;padding:0;grid-template-columns:repeat(4,minmax(0,1fr));gap:20px}}

/* ---------- بدنهٔ کارت ---------- */
.pcard{
  position:relative;
  display:flex;flex-direction:column;
  min-width:0;                       /* فرزندِ گرید باید اجازهٔ کوچک‌شدن داشته باشد */
  background:var(--c-surface);
  border:1px solid var(--c-line);
  border-radius:var(--r-lg);
  overflow:hidden;
  box-shadow:var(--sh-1);
  transition:box-shadow .2s var(--ease),border-color .2s var(--ease),transform .2s var(--ease);
  /* رندر تنبل: گرید دسته‌ها گاهی ۴۸ کارت دارد */
  content-visibility:auto;
  contain-intrinsic-size:auto 380px;
}
@media (hover:hover){
  .pcard:hover{border-color:#DADCE0;box-shadow:var(--sh-2);transform:translateY(-2px)}
  .pcard:hover .pcard-img img{transform:scale(1.04)}
  .pcard:hover .pcard-quick{opacity:1;transform:none}
}
.pcard:focus-within{border-color:var(--c-primary);box-shadow:0 0 0 3px rgba(var(--c-primary-rgb),.12)}

/* ---------- ۱) تصویر ---------- */
.pcard-img{
  position:relative;display:block;
  aspect-ratio:1/1;
  /* ⚠ سفید، نه خاکستری. تصویرِ خودِ محصولات پس‌زمینهٔ سفیدِ توپر دارد؛ روی
     خاکستریِ --c-bg یک مربعِ سفیدِ واضح دورِ محصول دیده می‌شد. حالا تصویر با
     کارت یکی می‌شود و جداکنندهٔ زیر، مرزِ لازم را می‌سازد. */
  background:var(--c-surface);
  border-block-end:1px solid var(--c-line-2);
  padding:var(--sp-4);
  overflow:hidden;
}
.pcard-img img{
  width:100%;height:100%;object-fit:contain;
  transition:transform .25s var(--ease);
}
/* جای‌گیرِ عمدی برای دو محصولی که اصلاً تصویر ندارند */
.pcard-img .ph{
  width:100%;height:100%;display:grid;place-items:center;
  color:var(--c-line);
}
.pcard-img .ph svg{width:38px;height:38px;stroke-width:1.25}

/* ---------- ۲) برچسب (فقط وقتی لازم است) ---------- */
.pcard-flags{
  position:absolute;top:10px;inset-inline-start:10px;z-index:2;
  display:flex;flex-direction:column;gap:5px;align-items:flex-start;
}
.pcard-flag{
  padding:1px 9px;border-radius:var(--r-full);
  font-size:15px;font-weight:700;line-height:1.55;
  background:var(--c-ink);color:#fff;
}
.pcard-flag.off{background:var(--c-primary)}
.pcard-flag.new,
.pcard-flag.hot{background:var(--c-surface);color:var(--c-ink-2);border:1px solid var(--c-line)}

/* افزودن به علاقه‌مندی — روی دسکتاپ با hover، روی لمسی همیشه دیده می‌شود */
.pcard-quick{
  position:absolute;top:8px;inset-inline-end:8px;z-index:2;
  display:flex;flex-direction:column;gap:6px;
  opacity:0;transform:translateY(-4px);
  transition:opacity var(--t-fast),transform var(--t-fast);
}
.pcard-quick button{
  width:40px;height:40px;border-radius:var(--r-full);
  display:grid;place-items:center;
  background:var(--c-surface);border:1px solid var(--c-line);
  color:var(--c-ink-2);
  transition:color var(--t-fast),border-color var(--t-fast),background var(--t-fast);
}
.pcard-quick button svg{width:18px;height:18px;stroke-width:1.75}
@media (hover:hover){.pcard-quick button:hover{color:var(--c-primary);border-color:var(--c-primary)}}
.pcard-quick button.is-on{background:var(--c-primary);border-color:var(--c-primary);color:#fff}
@media (hover:none){.pcard-quick{opacity:1;transform:none}}

/* ---------- بدنهٔ متنی ---------- */
.pcard-body{
  display:flex;flex-direction:column;flex:1 1 auto;
  min-width:0;min-height:0;
  padding:var(--sp-3) var(--sp-3) var(--sp-3);
  gap:6px;
}
@media (min-width:640px){.pcard-body{padding:14px}}

/* ۳) نام محصول — حداکثر دو خط */
.pcard .pcard-title{
  font-size:15px;font-weight:500;line-height:1.75;color:var(--c-ink);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;overflow-wrap:anywhere;
  min-height:calc(1.75em * 2);
  transition:color var(--t-fast);
}
@media (hover:hover){.pcard .pcard-title:hover{color:var(--c-primary)}}

/* ۴) کد مدل / SKU — کوچک و خاکستری */
.pcard-meta{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  font-size:15px;color:var(--c-ink-3);line-height:1.7;min-width:0;
}
.pcard-sku{
  direction:ltr;unicode-bidi:isolate;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;
}
.pcard-rating{display:inline-flex;align-items:center;gap:3px;color:var(--c-star);flex:none}
.pcard-rating svg{width:13px;height:13px}
.pcard-rating b{color:var(--c-ink-2);font-size:15px;font-weight:500}

/* ---------- بلوکِ پایین: قیمت (اگر هست) + دکمه ----------
   margin-block-start:auto ⇒ دکمه‌ها در همهٔ حالت‌ها کفِ کارت هم‌تراز می‌شوند. */
.pcard-foot{
  margin-block-start:auto;
  padding-block-start:var(--sp-3);
  display:grid;gap:10px;min-width:0;
}

/* ۵) قیمت — فقط در حالتِ قیمت‌دار رندر می‌شود */
.pcard-amount{
  display:flex;flex-direction:column;justify-content:flex-end;gap:2px;
  min-height:42px;min-width:0;
}
.price-old{
  font-size:15px;color:var(--c-ink-3);text-decoration:line-through;
  text-decoration-color:var(--c-ink-3);line-height:1.6;
}
.price-now{
  display:flex;align-items:baseline;gap:4px;flex-wrap:wrap;
  font-size:20px;font-weight:700;color:var(--c-ink);line-height:1.45;
}
.price-now .unit{font-size:15px;font-weight:400;color:var(--c-ink-3)}
/* ⚠ اندازه با .pcard قفل شده چون mobile.css — که بعد از این فایل لود می‌شود —
   زیر ۹۰۰px قیمت را به کوچک‌تر از کفِ ۱۵px می‌برد. */
.pcard .price-now{font-size:20px}
.price-off{
  align-self:flex-start;
  background:var(--c-primary);color:#fff;
  font-size:15px;font-weight:700;line-height:1.9;
  padding:2px 8px;border-radius:var(--r-full);
  white-space:nowrap;
}

/* ۶) دکمهٔ CTA — یک هندسه برای هر سه حالت، همیشه دیده می‌شود (بدون hover) */
.pcard-cta{
  display:flex;align-items:center;justify-content:center;gap:7px;
  width:100%;min-height:44px;padding-inline:10px;
  border:1px solid transparent;border-radius:var(--r-sm);
  font-size:15px;font-weight:700;line-height:1.2;text-align:center;
  transition:background var(--t-fast),color var(--t-fast),border-color var(--t-fast);
}
/* ⚠ برچسب عمداً ellipsis ندارد و اجازهٔ شکستن به دو خط دارد.
   «مشاهده جزئیات و خرید» ۲۰ کاراکتر است و در کارتِ ۱۶۴ پیکسلیِ ۳۶۰px در یک خط
   جا نمی‌شود؛ با ellipsis می‌شد «مشاهده جزئیات و…» که بدتر از دو خط است. */
.pcard-cta .t{min-width:0;text-wrap:balance}

/* تکِ CTA برای هر سه حالت: سفید با کادر — مطابق btn-secondary در app.css.
   قرمز عمداً اینجا نیست: در یک گرید ۲۴تایی، ۲۴ دکمهٔ قرمز صفحه را داد می‌زند و
   با قاعدهٔ «قرمز فقط برای CTA اصلی» می‌جنگد. CTA اصلی در صفحهٔ محصول است. */
.pcard-cta--go{
  background:var(--c-surface);color:var(--c-ink);border-color:#DADCE0;
  white-space:normal;line-height:1.45;padding-block:6px;
}
@media (hover:hover){
  .pcard-cta--go:hover{background:var(--c-primary-soft);border-color:var(--c-primary);color:var(--c-primary-dark)}
}

/* حالت ب: قیمت‌دار ولی ناموجود — قیمت خاموش می‌شود، اما حذف نمی‌شود */
.pcard.is-oos .pcard-img img{filter:grayscale(1);opacity:.55}
.pcard.is-oos .price-now{color:var(--c-ink-2)}
.pcard.is-oos .price-now .unit{color:var(--c-ink-2)}
/* خطِ «ناموجود» زیر قیمت — چون دکمه دیگر این را نمی‌گوید، وضعیت باید
   جایی دیده شود وگرنه کاربر تا صفحهٔ محصول نمی‌فهمد. */
.pcard-oos{
  font-size:15px;font-weight:500;line-height:1.6;color:var(--c-ink-2);
  display:flex;align-items:center;gap:5px;min-width:0;
}
.pcard-oos::before{
  content:'';width:7px;height:7px;flex:none;border-radius:50%;
  background:var(--c-ink-3);
}

/* حالت ج: بدون قیمت — .pcard-amount اصلاً رندر نمی‌شود، پس جای خالی نداریم */

/* ---------- ریزتنظیمِ نمایشگرهای کوچک ----------
   کفِ اندازهٔ متن ۱۵px است، پس در گریدِ دوستونیِ ۳۶۰px فقط فاصله‌ها جمع می‌شوند
   نه متن؛ کوتاه‌شدنِ برچسبِ دکمه هم با .t (ellipsis + min-width:0) مهار می‌شود. */
@media (max-width:479px){
  .pcard-img{padding:var(--sp-3)}
  .pcard .pcard-title{line-height:1.7;min-height:calc(1.7em * 2)}
  .pcard-body{padding:10px 10px 12px;gap:5px}
  .pcard-foot{padding-block-start:10px;gap:8px}
  .pcard-amount{min-height:38px}
  .pcard .price-now{font-size:18px}
  .pcard-cta{gap:5px;padding-inline:6px}
  .pcard-quick button{width:36px;height:36px}
}
@media (prefers-reduced-motion:reduce){
  .pcard,.pcard-img img,.pcard-quick{transition:none}
  .pcard:hover{transform:none}
  .pcard:hover .pcard-img img{transform:none}
}

/* ---------- کارت افقی (سبد، مقایسه، نتایج جستجو) ---------- */
.pcard-h{
  display:flex;gap:14px;align-items:center;
  background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:var(--r-lg);padding:12px;
}
/* سفید، به همان دلیلِ .pcard-img: تصویرِ محصول خودش زمینهٔ سفید دارد */
.pcard-h .thumb{width:88px;height:88px;flex:none;border-radius:var(--r-sm);background:var(--c-surface);border:1px solid var(--c-line-2);overflow:hidden}
.pcard-h .thumb img{width:100%;height:100%;object-fit:contain}
.pcard-h .info{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:5px}
.pcard-h .info .t{font-size:15px;font-weight:500;line-height:1.7}
@media (max-width:560px){.pcard-h .thumb{width:70px;height:70px}}

/* ---------- کارت داخل ریل ---------- */
.rail .pcard{width:230px;min-width:230px}
/* در موبایل عرض کارت طوری است که همیشه بخشی از کارت بعدی دیده شود،
   تا کاربر بفهمد می‌تواند بکشد. در ۳۶۰px: ۱۶۴+۱۶+۱۶۴ = ۳۴۴ > ۳۲۸ عرض مفید. */
@media (max-width:639px){.rail .pcard{width:164px;min-width:164px}}

/* ---------- اسکلت کارت ---------- */
.pcard-skel{
  background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:var(--r-lg);padding:12px;
}
.pcard-skel .im{aspect-ratio:1/1;border-radius:var(--r-sm);margin-bottom:12px}

/* ==== product.css ==== */

/* ==========================================================================
   صفحه محصول
   --------------------------------------------------------------------------
   دسکتاپ: گالری | بلوکِ عنوان و مشخصات | پنلِ خریدِ چسبان
   موبایل : گالری → عنوان → کد مدل → قیمت → موجودی → گارانتی → دکمه → جزئیات

   ترتیبِ موبایل با order روی فلکس گرفته می‌شود، نه با تکرارِ مارک‌آپ؛
   .p-title-block زیر ۸۶۰px به display:contents می‌رود تا فرزندانش مستقیماً
   فرزندِ .product-top شوند و بتوانند بین گالری و پنلِ خرید جابه‌جا شوند.

   ⚠ حالتِ استعلامی (۳۸۵ محصول از ۴۸۵): .quotebox جای .buybox می‌نشیند و هیچ
   عنصرِ قیمتی روی صفحه نیست. .buybox و .quotebox هیچ‌وقت با هم رندر نمی‌شوند.
   ========================================================================== */

.product-top{
  display:grid;grid-template-columns:minmax(0,440px) minmax(0,1fr) minmax(0,320px);
  gap:var(--sp-5);align-items:start;
  background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:var(--r-xl);padding:var(--sp-5);
  box-shadow:var(--sh-1);
}
@media (max-width:1199px){.product-top{grid-template-columns:minmax(0,380px) minmax(0,1fr)}}

/* ---------- گالری ---------- */
.gallery{position:sticky;top:calc(var(--header-h) + 16px);min-width:0}
.gal-main{
  position:relative;aspect-ratio:1/1;
  background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:var(--r-lg);overflow:hidden;
  display:grid;place-items:center;padding:var(--sp-5);
  cursor:zoom-in;
}
.gal-main img{width:100%;height:100%;object-fit:contain;transition:transform .25s var(--ease)}
/* زوم فقط روی دسکتاپ — روی لمسی حرکت موس نداریم */
@media (hover:hover) and (min-width:861px){
  .gal-main.is-zoom img{transform:scale(2);transform-origin:var(--zx,50%) var(--zy,50%)}
}
@media (hover:none){.gal-main{cursor:default}}

/* دو محصول اصلاً تصویر ندارند و به لوگو fallback می‌شوند؛
   عمداً کوچک و کم‌رنگ می‌شود تا «جای‌گیرِ آگاهانه» به‌نظر برسد نه تصویرِ خراب. */
.gal-main.is-empty{background:var(--c-bg);cursor:default}
.gal-main.is-empty img{width:auto;height:auto;max-width:132px;opacity:.32;filter:grayscale(1)}

.gal-flags{position:absolute;top:12px;inset-inline-start:12px;z-index:2;display:flex;flex-direction:column;gap:6px}
.gal-expand{
  position:absolute;bottom:12px;inset-inline-end:12px;z-index:2;
  width:44px;height:44px;border-radius:var(--r-full);
  display:grid;place-items:center;background:var(--c-surface);
  border:1px solid var(--c-line);color:var(--c-ink-2);
  transition:color var(--t-fast),border-color var(--t-fast);
}
.gal-expand svg{width:18px;height:18px}
@media (hover:hover){.gal-expand:hover{color:var(--c-primary);border-color:var(--c-primary)}}

.gal-thumbs{display:flex;gap:9px;margin-top:12px;overflow-x:auto;scrollbar-width:none;padding-bottom:4px;min-width:0}
.gal-thumbs::-webkit-scrollbar{display:none}
.gal-thumb{
  flex:none;width:72px;height:72px;padding:6px;
  background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:var(--r-sm);overflow:hidden;transition:border-color var(--t-fast),box-shadow var(--t-fast);
}
.gal-thumb img{width:100%;height:100%;object-fit:contain}
.gal-thumb.is-active{border-color:var(--c-primary);box-shadow:0 0 0 3px rgba(var(--c-primary-rgb),.1)}
@media (hover:hover){.gal-thumb:hover{border-color:var(--c-line)}}

/* لایت‌باکس ساده */
.gal-lightbox{
  position:fixed;inset:0;z-index:1200;background:rgba(29,29,27,.92);
  display:none;place-items:center;padding:24px;
}
.gal-lightbox.is-open{display:grid}
.gal-lightbox img{max-width:92vw;max-height:88vh;object-fit:contain;border-radius:var(--r-md);background:var(--c-surface)}
.gal-lightbox .close{
  position:absolute;top:20px;inset-inline-end:20px;
  width:44px;height:44px;border-radius:var(--r-full);
  display:grid;place-items:center;background:rgba(255,255,255,.14);color:#fff;
}

/* ---------- بلوک عنوان ---------- */
.p-title-block{display:flex;flex-direction:column;gap:12px;min-width:0}
.p-eyebrow{font-size:15px;color:var(--c-ink-3)}
.p-eyebrow a{color:var(--c-ink-2)}
@media (hover:hover){.p-eyebrow a:hover{color:var(--c-primary)}}

.p-title{font-size:clamp(20px,2.2vw,26px);line-height:1.6;overflow-wrap:anywhere}
.p-title-en{font-size:15px;color:var(--c-ink-3);direction:ltr;text-align:start;unicode-bidi:isolate}
.p-metaline{
  display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  padding-block:12px;border-block:1px solid var(--c-line-2);
  font-size:15px;color:var(--c-ink-3);
}
.p-metaline .item{display:inline-flex;align-items:center;gap:6px}
.p-metaline svg{width:16px;height:16px;stroke-width:1.75}
.p-metaline a{color:var(--c-ink-2)}
@media (hover:hover){.p-metaline a:hover{color:var(--c-primary)}}

.p-highlights{display:flex;flex-direction:column;gap:12px;min-width:0}
.p-highlights .lead{font-size:15px;line-height:2;color:var(--c-ink-2)}

/* مشخصات کلیدی کنار عنوان */
.p-keyspecs{display:grid;gap:9px}
.p-keyspecs li{display:flex;gap:9px;font-size:15px;color:var(--c-ink-2);line-height:1.85;min-width:0}
.p-keyspecs li::before{
  content:'';width:5px;height:5px;border-radius:50%;flex:none;
  background:var(--c-primary);margin-top:.72em;
}
.p-keyspecs .k{color:var(--c-ink-3);flex:none}

/* ---------- پنل خرید (قیمت‌دار) ---------- */
.buybox{
  background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:var(--r-lg);padding:var(--sp-4);
  display:flex;flex-direction:column;gap:14px;min-width:0;
  position:sticky;top:calc(var(--header-h) + 16px);
  box-shadow:var(--sh-1);
}
@media (max-width:1199px){.buybox{position:static;grid-column:1/-1;box-shadow:none;background:var(--c-bg)}}
.buybox-seller{
  display:flex;align-items:flex-start;gap:9px;
  font-size:15px;color:var(--c-ink-3);line-height:1.8;
  padding-bottom:12px;border-bottom:1px solid var(--c-line-2);
}
.buybox-seller svg{width:18px;height:18px;flex:none;margin-top:.35em;color:var(--c-success);stroke-width:1.75}

.p-stock{display:flex;align-items:center;gap:7px;font-size:15px;font-weight:500}
.p-stock.in{color:var(--c-success)}
.p-stock.low{color:var(--c-warn)}
.p-stock.out{color:var(--c-ink-3)}
.p-stock::before{content:'';width:8px;height:8px;flex:none;border-radius:50%;background:currentColor}

/* قیمت */
.pricebox{display:flex;flex-direction:column;gap:6px;min-width:0}
.pricebox .old{display:flex;align-items:center;gap:9px;font-size:15px;color:var(--c-ink-3);flex-wrap:wrap}
.pricebox .old s{text-decoration-color:var(--c-ink-3)}
.pricebox .off{
  background:var(--c-primary);color:#fff;font-size:15px;font-weight:700;
  padding:2px 9px;border-radius:var(--r-full);line-height:1.9;
}
.pricebox .now{
  display:flex;align-items:baseline;gap:6px;flex-wrap:wrap;
  font-size:27px;font-weight:700;color:var(--c-ink);line-height:1.4;
}
.pricebox .now .unit{font-size:15px;font-weight:400;color:var(--c-ink-2)}
.pricebox .save{font-size:15px;color:var(--c-success)}

/* شمارنده تعداد */
.qty{
  display:inline-flex;align-items:center;flex:none;
  border:1px solid #DADCE0;border-radius:var(--r-sm);
  background:var(--c-surface);overflow:hidden;height:48px;
}
.qty button{
  width:44px;height:100%;display:grid;place-items:center;
  color:var(--c-ink-2);transition:background var(--t-fast),color var(--t-fast);
}
/* قرمزِ تیره چون روی خاکستریِ --c-line-2 نشسته: قرمزِ روشن آنجا ۴٫۱۲:۱ می‌دهد */
@media (hover:hover){.qty button:hover{background:var(--c-line-2);color:var(--c-primary-dark)}}
.qty button:disabled{opacity:.4;pointer-events:none}
.qty button svg{width:17px;height:17px;stroke-width:2}
.qty input{
  width:50px;height:100%;min-height:0;border:0;text-align:center;
  font-size:15px;font-weight:700;background:transparent;border-radius:0;
  border-inline:1px solid var(--c-line);
}
.qty input:focus{box-shadow:none;border-color:var(--c-line)}

/* ⚠ شمارنده و دکمه عمداً در دو سطر‌اند، نه یک سطر.
   ستونِ پنلِ خرید در دسکتاپ حداکثر ۳۲۰px است و با پدینگِ ۱۶ و کادر فقط ۲۸۶px
   محتوا می‌ماند. .qty عرضِ ثابتِ ۱۴۰px دارد (۴۴+۵۰+۴۴ و کادر) و با gap تنها
   ۱۳۶px برای دکمه باقی می‌گذارد، در حالی‌که «افزودن به سبد خرید» با آیکون و
   پدینگِ btn-lg حدود ۲۶۶px می‌خواهد. (کفِ ماجرا: .btn در app.css آن‌موقع سراسری
   white-space:nowrap بود و متن را از لبه بیرون می‌داد؛ آن ریشه حالا در app.css
   اصلاح شده، ولی این دو-سطره‌کردن هنوز درست است چون ۱۳۶px برای این برچسب
   کم است و شکستنِ دکمه در یک سطرِ باریک زشت‌تر از سطرِ اختصاصی است.) با flex-basis:100%
   دکمه به سطرِ خودش می‌رود و تمام‌عرض می‌شود؛ شمارنده اندازهٔ طبیعی‌اش را
   نگه می‌دارد (flex:none در قاعدهٔ .qty بالاتر). */
.buybox-row{display:flex;flex-wrap:wrap;gap:10px;align-items:stretch;min-width:0}
.buybox-row .btn{flex:1 1 100%;min-width:0}

/* شبکهٔ ایمنیِ متنِ دکمه‌ها در سه ناحیهٔ تنگِ این صفحه (پنلِ خرید، پنلِ استعلام،
   نوارِ چسبانِ موبایل). از وقتی .btn در app.css خودش white-space:normal شد این
   قاعده تکراری است و عمداً نگه داشته شده: اگر روزی کسی nowrap را در app.css
   برگرداند، این سه ناحیه — که تنگ‌ترین جاهای سایت‌اند — نمی‌شکنند.
   line-height:1.25 عمدی است: دو سطرِ ۱۵px می‌شود ۳۸px و هنوز زیرِ min-height
   دکمه (۴۶px) جا می‌شود، پس هدفِ لمس هیچ‌وقت زیر ۴۴px نمی‌افتد. */
.buybox .btn,
.quotebox .btn,
.sticky-buy .btn{white-space:normal;line-height:1.25}

/* فرم اطلاع از موجودی — حالتِ سومِ محصول */
#stockAlert{display:flex;flex-direction:column;gap:6px}

/* ---------- پنل استعلام (بدون قیمت) ----------
   خنثی و روشن؛ هیچ رنگِ دومی در کار نیست و هیچ عددی هم نمایش داده نمی‌شود. */
.quotebox{
  background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:var(--r-lg);padding:var(--sp-4);
  display:flex;flex-direction:column;gap:13px;min-width:0;
  position:sticky;top:calc(var(--header-h) + 16px);
  box-shadow:var(--sh-1);
}
@media (max-width:1199px){.quotebox{position:static;grid-column:1/-1;box-shadow:none;background:var(--c-bg)}}
.quotebox .qtitle{
  display:flex;align-items:center;gap:9px;
  font-size:17px;font-weight:700;color:var(--c-ink);
}
.quotebox .qtitle svg{width:20px;height:20px;flex:none;stroke-width:1.75;color:var(--c-primary)}
.quotebox p{font-size:15px;color:var(--c-ink-2);line-height:1.95}
.quotebox .qphone{
  display:flex;align-items:center;justify-content:center;gap:9px;
  min-height:52px;border-radius:var(--r-sm);
  background:var(--c-primary);color:#fff;border:1px solid var(--c-primary);
  font-size:18px;font-weight:700;direction:ltr;
  transition:background var(--t-fast),border-color var(--t-fast);
}
@media (hover:hover){.quotebox .qphone:hover{background:var(--c-primary-dark);border-color:var(--c-primary-dark)}}
.quotebox .qphone svg{width:20px;height:20px;flex:none;stroke-width:1.9}
.quotebox .qnote{
  display:flex;align-items:flex-start;gap:8px;
  font-size:15px;color:var(--c-ink-3);line-height:1.8;
}
.quotebox .qnote svg{width:17px;height:17px;flex:none;margin-top:.3em;color:var(--c-success);stroke-width:1.75}

/* مزیت‌ها زیر پنل خرید */
.buy-perks{display:grid;gap:11px;padding-top:14px;border-top:1px solid var(--c-line-2)}
.buy-perks li{display:flex;align-items:flex-start;gap:9px;font-size:15px;color:var(--c-ink-2);line-height:1.8;min-width:0}
.buy-perks svg{width:18px;height:18px;flex:none;margin-top:.28em;color:var(--c-ink-3);stroke-width:1.6}
.buy-perks .tel-link{direction:ltr;unicode-bidi:isolate;font-weight:700}
@media (hover:hover){.buy-perks .tel-link:hover{color:var(--c-primary)}}

/* ==========================================================================
   ترتیبِ موبایل: گالری → عنوان → مدل → قیمت → موجودی → گارانتی → دکمه → جزئیات
   ========================================================================== */
@media (max-width:860px){
  .product-top{
    display:flex;flex-direction:column;gap:var(--sp-4);
    padding:var(--sp-4);border-radius:var(--r-lg);
  }
  .gallery{position:static;order:1}

  /* فرزندانِ بلوکِ عنوان مستقیماً فرزندِ .product-top می‌شوند تا بتوانند
     دور پنلِ خرید جابه‌جا شوند. */
  .p-title-block{display:contents}
  .p-eyebrow{order:2}
  .p-title{order:3}
  .p-title-en{order:4}
  .buybox,.quotebox{order:5}
  .p-metaline{order:6;margin-top:var(--sp-2)}
  .p-highlights{order:7}

  /* داخلِ پنلِ خرید: قیمت → موجودی → گارانتی → دکمه */
  .buybox{display:flex;flex-direction:column}
  .buybox > .buybox-seller{order:1}
  .buybox > .pricebox{order:2}
  .buybox > .p-stock{order:3}
  .buybox > .buy-perks{
    order:4;padding-top:0;padding-bottom:14px;
    border-top:0;border-bottom:1px solid var(--c-line-2);
  }
  .buybox > .buybox-row,
  .buybox > #stockAlert{order:5}
  .buybox > .rev-actions{order:6}

  /* در حالتِ استعلامی هم گارانتی/ساعتِ کاری قبل از دکمهٔ تماس بیاید */
  .quotebox{display:flex;flex-direction:column}
  .quotebox > .qtitle{order:1}
  .quotebox > p{order:2}
  .quotebox > .qnote{order:3}
  .quotebox > .qphone{order:4}
  .quotebox > .btn{order:5}
}

/* ---------- تب‌های محتوا ---------- */
.p-tabs{
  display:flex;gap:4px;overflow-x:auto;scrollbar-width:none;min-width:0;
  background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:var(--r-md);padding:6px;margin:var(--sp-5) 0 var(--sp-4);
  position:sticky;top:var(--header-h);z-index:30;
}
.p-tabs::-webkit-scrollbar{display:none}
.p-tabs a{
  flex:none;min-height:44px;display:inline-flex;align-items:center;
  padding:0 18px;border-radius:var(--r-sm);
  font-size:15px;font-weight:500;color:var(--c-ink-2);white-space:nowrap;
  transition:background var(--t-fast),color var(--t-fast);
}
.p-tabs a.is-active{background:var(--c-primary-soft);color:var(--c-primary-dark);font-weight:700}
@media (hover:hover){.p-tabs a:hover{background:var(--c-line-2)}}

.p-section{
  background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:var(--r-xl);padding:var(--sp-5) var(--sp-6);
  margin-bottom:var(--sp-4);min-width:0;
}
.p-section > h2{
  font-size:20px;margin-bottom:var(--sp-4);
  padding-bottom:12px;border-bottom:1px solid var(--c-line-2);
}
@media (max-width:639px){.p-section{padding:var(--sp-4);border-radius:var(--r-lg)}}

/* حالتِ خالیِ آگاهانه — نظرات و پرسش‌ها برای کاتالوگِ مهاجرت‌شده خالی‌اند */
.p-empty{
  display:flex;align-items:center;gap:10px;
  padding:var(--sp-4);border:1px dashed var(--c-line);
  border-radius:var(--r-md);background:var(--c-bg);
  font-size:15px;color:var(--c-ink-2);line-height:1.8;
}
.p-empty svg{width:20px;height:20px;flex:none;color:var(--c-ink-3);stroke-width:1.6}

/* ---------- جدول مشخصات ---------- */
.specs{display:grid;gap:0;min-width:0}
.specs-group + .specs-group{margin-top:var(--sp-5)}
.specs-group h3{
  font-size:15px;color:var(--c-primary-dark);background:var(--c-primary-soft);
  padding:9px 14px;border-radius:var(--r-sm);margin-bottom:6px;
}
/* ⚠ مشخصات فنی حالا <table> است، نه div/grid — رابطهٔ نام↔مقدار باید
   برای صفحه‌خوان و برای استخراجِ ویژگی توسط گوگل ماشین‌خوان باشد.
   display:grid روی <tr> کار نمی‌کند، پس چیدمان با خودِ جدول ساخته
   می‌شود: عرضِ ثابتِ ستونِ اول همان ۲۲۰px قبلی است. */
.spec-table{width:100%;border-collapse:collapse;table-layout:fixed}
.spec-row{border-bottom:1px solid var(--c-line-2)}
.spec-row:last-child{border-bottom:0}
.spec-row .k,
.spec-row .v{
  padding:11px 14px;font-size:15px;line-height:1.9;
  text-align:start;vertical-align:top;overflow-wrap:anywhere;
}
.spec-row .k{width:220px;color:var(--c-ink-3);font-weight:500}
.spec-row .v{color:var(--c-ink)}
@media (max-width:639px){
  /* روی گوشی ستونِ ۲۲۰ پیکسلی جا نمی‌شود؛ سلول‌ها بلوکی می‌شوند و
     زیر هم می‌نشینند — همان چیدمانی که قبلاً با grid ساخته می‌شد. */
  .spec-table,.spec-table tbody,.spec-row{display:block}
  .spec-row .k,.spec-row .v{display:block;width:auto;padding:0 12px}
  .spec-row .k{padding-top:10px}
  .spec-row .v{padding-bottom:10px}
}

/* fieldset باید از سبکِ پیش‌فرضِ مرورگر پاک شود وگرنه قابِ ناخواسته
   می‌گیرد. min-width:0 لازم است چون fieldset به‌طور پیش‌فرض کوچک‌تر از
   محتوایش نمی‌شود و گرید را می‌شکند. */
/* ⚠ فقط همان سه fieldsetی که تازه ساخته شدند — نه `.field` عمومی.
   انتخابگرِ گسترده هر فیلدِ فرم در سایت را بی‌حاشیه می‌کرد. */
fieldset.field,
fieldset.address-list,
fieldset.ship-list{border:0;padding:0;margin:0;min-width:0}
fieldset.field > legend.label{padding:0}

/* ---------- توضیحات و آکاردئون ---------- */
.p-desc.is-clamped{max-height:640px;overflow:hidden;position:relative}
.p-desc.is-clamped.is-open{max-height:none;overflow:visible}
.p-desc.is-clamped:not(.is-open)::after{
  content:'';position:absolute;inset-inline:0;bottom:0;height:110px;pointer-events:none;
  background:linear-gradient(to top,var(--c-surface),rgba(255,255,255,0));
}
.p-desc-more{display:block;margin:14px auto 0}

/* آکاردئون به app.css منتقل شد — در صفحه دسته و برند هم لازم است
   و آن صفحات این فایل را لود نمی‌کنند. اینجا فقط تیتر درشت‌تر می‌شود. */
.p-section .acc-head{font-size:15px;font-weight:700}

/* ---------- نظرات ---------- */
.rev-summary{
  display:grid;grid-template-columns:190px minmax(0,1fr);gap:var(--sp-5);
  align-items:center;padding-bottom:var(--sp-5);
  border-bottom:1px solid var(--c-line-2);margin-bottom:var(--sp-5);
}
.rev-score{text-align:center}
.rev-score .n{font-size:42px;font-weight:700;line-height:1.2}
.rev-score .stars{justify-content:center;margin:6px 0}
.rev-score small{color:var(--c-ink-3);font-size:15px}
.rev-bars{display:grid;gap:7px;min-width:0}
.rev-bar{display:flex;align-items:center;gap:10px;font-size:15px;color:var(--c-ink-3);min-width:0}
.rev-bar .lbl{flex:none;width:44px;display:flex;align-items:center;gap:3px}
.rev-bar .lbl svg{width:12px;height:12px;color:var(--c-star)}
.rev-bar .track{flex:1 1 auto;min-width:0;height:6px;border-radius:var(--r-full);background:var(--c-line-2);overflow:hidden}
.rev-bar .rating-bar-fill{height:100%;background:var(--c-star);border-radius:var(--r-full)}
.rev-bar .pct{flex:none;width:46px;text-align:end}
@media (max-width:860px){.rev-summary{grid-template-columns:minmax(0,1fr);text-align:center}}

.rev-list{display:grid;gap:14px}
.rev-item{border:1px solid var(--c-line);border-radius:var(--r-lg);padding:16px;min-width:0}
.rev-item-head{display:flex;align-items:center;gap:11px;margin-bottom:10px;flex-wrap:wrap}
.rev-avatar{
  width:38px;height:38px;border-radius:var(--r-full);flex:none;
  display:grid;place-items:center;background:var(--c-primary-soft);
  color:var(--c-primary-dark);font-weight:700;font-size:15px;
}
.rev-item-head .nm{font-size:15px;font-weight:700}
.rev-item-head time{font-size:15px;color:var(--c-ink-3)}
.rev-item-head .stars{margin-inline-start:auto}
.rev-body{font-size:15px;color:var(--c-ink-2);line-height:2;overflow-wrap:anywhere}
.rev-pros{display:grid;gap:6px;margin-top:12px}
.rev-pros li{display:flex;align-items:flex-start;gap:7px;font-size:15px;line-height:1.8}
.rev-pros li svg{width:15px;height:15px;flex:none;margin-top:5px}
.rev-pros .pro{color:var(--c-success)}
.rev-pros .con{color:var(--c-danger)}
.rev-actions{display:flex;gap:14px;margin-top:12px;font-size:15px;color:var(--c-ink-3);flex-wrap:wrap}
.rev-actions button,.rev-actions a{
  display:inline-flex;align-items:center;gap:6px;min-height:44px;color:inherit;
}
@media (hover:hover){.rev-actions button:hover,.rev-actions a:hover{color:var(--c-primary)}}
.rev-actions svg{width:16px;height:16px}
.rev-reply{
  margin-top:12px;padding:12px 14px;border-radius:var(--r-sm);
  background:var(--c-line-2);font-size:15px;color:var(--c-ink-2);
  border-inline-start:3px solid var(--c-primary);
}

/* فرم نظر */
.rev-form{background:var(--c-bg);border-radius:var(--r-lg);padding:var(--sp-5);margin-top:var(--sp-5);min-width:0}
@media (max-width:639px){.rev-form{padding:var(--sp-4)}}
.star-input{display:flex;flex-direction:row-reverse;justify-content:flex-end;gap:4px}
.star-input input{position:absolute;opacity:0;width:0;height:0}
.star-input label{cursor:pointer;color:var(--c-line);transition:color var(--t-fast);padding:4px}
.star-input label svg{width:28px;height:28px}
.star-input input:checked ~ label,
.star-input label:hover,
.star-input label:hover ~ label{color:var(--c-star)}
.star-input input:focus-visible + label{outline:2px solid var(--c-primary);outline-offset:2px;border-radius:4px}

/* ---------- پرسش و پاسخ ---------- */
.qa-list{display:grid;gap:12px}
.qa-item{border:1px solid var(--c-line);border-radius:var(--r-lg);padding:15px;min-width:0}
.qa-q,.qa-a{display:flex;gap:11px;font-size:15px;line-height:2;min-width:0}
.qa-q > div,.qa-a > div{min-width:0;overflow-wrap:anywhere}
.qa-a{margin-top:12px;padding-top:12px;border-top:1px solid var(--c-line-2)}
.qa-badge{
  width:28px;height:28px;flex:none;border-radius:var(--r-sm);
  display:grid;place-items:center;font-size:15px;font-weight:700;
}
.qa-q .qa-badge{background:var(--c-primary-soft);color:var(--c-primary-dark)}
.qa-a .qa-badge{background:var(--c-success-soft);color:var(--c-success)}
.qa-meta{font-size:15px;color:var(--c-ink-3);margin-top:4px}

/* ---------- ریل محصولات مرتبط ---------- */
.related-rail{
  display:flex;gap:16px;overflow-x:auto;min-width:0;max-width:100%;
  scroll-snap-type:x proximity;padding-bottom:8px;
  scrollbar-width:thin;
}
.related-rail::-webkit-scrollbar{height:6px}
.related-rail::-webkit-scrollbar-thumb{background:var(--c-line);border-radius:var(--r-full)}
.related-rail > .pcard{flex:none;width:230px;scroll-snap-align:start}
@media (max-width:639px){.related-rail > .pcard{width:172px}}

/* ==========================================================================
   نوار خریدِ چسبانِ موبایل
   --------------------------------------------------------------------------
   ⚠ نباید روی .mobile-bar (نوارِ ناوبریِ پایین، position:fixed، inset-block-end:0)
   بیفتد. nav.css برای آن نوار ۶۲px به body پدینگ می‌دهد؛ همان عدد را مبنا
   می‌گیریم و این نوار را دقیقاً بالای آن می‌نشانیم. برای پنهان‌شدن هم باید
   به‌اندازهٔ «ارتفاعِ خودش + همان ۶۲px» پایین برود، وگرنه نصفه‌نیمه روی
   ناوبری دیده می‌شود.
   کلاسِ is-visible را app.js با IntersectionObserver روی .buybox/.quotebox
   می‌گذارد؛ نام کلاس‌ها و ساختار دست‌نخورده مانده است.
   ========================================================================== */
.sticky-buy{
  /* --mbar-h عمداً اینجا دوباره تعریف نمی‌شود؛ از :root در nav.css می‌آید.
     تعریفِ محلی یعنی دو منبعِ حقیقت برای یک عدد: اگر کسی ارتفاعِ نوارِ پایین
     را در nav.css عوض کند، این نوار همان‌جا می‌ماند و رویش می‌افتد. */
  --sb-safe:env(safe-area-inset-bottom,0px);
  display:none;
  position:fixed;inset-inline:0;
  inset-block-end:calc(var(--mbar-h) + var(--sb-safe));
  z-index:890;
  background:var(--c-surface);border-top:1px solid var(--c-line);
  box-shadow:0 -2px 16px rgba(0,0,0,.06);
  padding:10px var(--pad-x);
  transform:translateY(calc(100% + var(--mbar-h) + var(--sb-safe)));
  transition:transform .25s var(--ease);
}
.sticky-buy.is-visible{transform:translateY(0)}
.sticky-buy-inner{display:flex;align-items:center;gap:10px;min-width:0}
/* قیمت در یک سطر می‌ماند تا نوار بلند نشود و ارتفاعش قابل پیش‌بینی بماند.
   flex:none هم عمدی است: عدد قیمت هرگز نباید کوچک یا بریده شود. */
.sticky-buy .sb-price{display:flex;align-items:baseline;gap:5px;flex:none;min-width:0}
.sticky-buy .sb-price .now{font-size:19px;font-weight:700;white-space:nowrap;color:var(--c-ink)}
.sticky-buy .sb-price .unit{font-size:15px;color:var(--c-ink-3);white-space:nowrap}
/* در ۳۶۰px بعد از قیمتِ نُه‌رقمی چیزی حدود ۱۷۰px برای دکمه می‌ماند؛ پدینگِ
   پیش‌فرضِ ۲۰px دو طرفِ .btn همان‌جا کم می‌آورد. اینجا کوتاه‌ترش می‌کنیم تا
   «افزودن به سبد» در یک سطر جا شود و شکستنِ خط فقط برای برچسبِ بلندترِ
   حالتِ ناموجود («ناموجود — اطلاع از موجودی») لازم بیفتد. */
.sticky-buy .btn{flex:1 1 auto;min-width:0;padding-inline:14px}

/* فاصلهٔ امن تا فوترِ صفحه زیرِ نوار پنهان نشود (فقط در همان بازه رندر می‌شود) */
.sticky-buy-spacer{display:none}

@media (max-width:900px){
  .sticky-buy{display:block}
  .sticky-buy-spacer{display:block;height:76px}
  /* دکمهٔ «بازگشت به بالا» وقتی نوار خرید باز است باید از رویش رد شود:
     ارتفاع نوار پایینِ موبایل + ارتفاع نوار خرید. عمداً !important ندارد —
     تخصصِ :has (۰,۳,۱) از قاعدهٔ .to-top در mobile.css (۰,۱,۰) بالاتر است. */
  body:has(.sticky-buy.is-visible) .to-top{
    inset-block-end:calc(var(--mbar-h,62px) + 80px + env(safe-area-inset-bottom,0px));
  }
}
/* گران‌ترین کالای کاتالوگ ۴۱۰٬۰۰۰٬۰۰۰ تومان است، یعنی نُه رقم و دو جداکننده.
   در ۳۶۰px همین عدد با «تومان» حدود ۱۶۸px از ۳۲۸px عرضِ نوار را می‌گیرد و چون
   .sb-price عمداً flex:none است، کمبودِ فضا تمامش می‌افتد گردنِ دکمه و
   «افزودن به سبد» می‌شکست. دو پیکسل از تیترِ قیمت و چهار پیکسل از پدینگِ نوار
   می‌گیریم تا دکمه در یک سطر جا شود؛ ۱۷px همچنان بالای کفِ ۱۵px پروژه است و
   قیمت هم هرگز بریده یا کوچک‌تر از خوانا نمی‌شود. */
@media (max-width:400px){
  .sticky-buy{padding-inline:12px}
  .sticky-buy .sb-price .now{font-size:17px}
}
@media (prefers-reduced-motion:reduce){
  .sticky-buy{transition:none}
}

/* ---------- مقایسه ---------- */
.compare-table{overflow-x:auto;min-width:0}
.compare-table table{min-width:760px}
.compare-table th{position:sticky;top:0;background:var(--c-surface);z-index:2}
.compare-table td:first-child,.compare-table th:first-child{
  position:sticky;inset-inline-start:0;background:var(--c-surface);z-index:1;
  border-inline-end:1px solid var(--c-line);
}

/* ==== bosch.css ==== */

/* bosch.css — build 15  (هیرو: بدون برش، فاصله در هر عرضی)
   ⚠ خودآزمون. F12 → Console → این یک خط را بچسبانید:

       (h=>({عرض:innerWidth,فاصله:getComputedStyle(h).gap,
         برش:(i=>Math.abs(i.width/i.height-i.naturalWidth/i.naturalHeight)>.02)
              (Object.assign(h.querySelector('img').getBoundingClientRect(),
               {naturalWidth:h.querySelector('img').naturalWidth,
                naturalHeight:h.querySelector('img').naturalHeight}))}))
       (document.querySelector('.herox'))

     انتظار:  فاصله «28px» (زیر ۹۰۰px: «24px») و برش «false».
     اگر «14px» یا «16px» داد → فایل آپلود نشده یا کش سرور مانده.
     ⚠ «عرض» را هم نگاه کنید: اگر زیر ۹۰۰ بود، شما اصلاً نسخهٔ دسکتاپ را
       نمی‌بینید — لپ‌تاپِ ۱۳۶۶ با مقیاسِ ۱۵۰٪ ویندوز ۹۱۰ CSS px است و با
       ۱۷۵٪ می‌شود ۷۸۰px. سه دورِ «فاصله نیست» علتش همین بود. */
/* ==========================================================================
   بوش تهران — لایهٔ هویت برند
   ترتیب لود: app → rtl → nav → card → [CSS صفحه] → bosch → mobile

   این فایل بعد از همهٔ کامپوننت‌ها می‌آید، پس هر چیزی که «امضای بصری سایت»
   است اینجا نوشته می‌شود و بقیه فایل‌ها ساختار خالص می‌مانند.

   ⚠ mobile.css بعد از این لود می‌شود؛ هر قاعده‌ای که باید در موبایل هم برنده
     باشد یا باید در mobile.css نوشته شود یا اینجا با تخصصِ بالاتر بیاید.
     (بخش موبایلِ همین طرح در انتهای mobile.css است.)

   ── سه تصمیمِ هویتی ────────────────────────────────────────────────────
   ۱. نوارِ بالاییِ تیره. تنها سطحِ تیرهٔ ثابتِ سایت و اولین چیزی که کاربر
      می‌بیند؛ همان نقشی را دارد که تابلوی فروشگاه در بازار امیرکبیر.
   ۲. قابِ خاکستریِ عکس. عکس‌های محصولِ سایت قدیم پس‌زمینهٔ سفید دارند؛ روی
      کارتِ سفید، لبهٔ یخچالِ سفید ناپدید می‌شد.
   ۳. سبزآبی = اطمینان. چون ۵۸٪ محصولات قیمت ندارند، «موجود / اصل / گارانتی»
      باید سیگنالِ رنگیِ خودش را داشته باشد.
   ========================================================================== */


/* ══════════════════════════════════════════════════════════ ۱. نوار بالایی
   تنها سطحِ تیرهٔ ثابتِ سایت. چون .topbar بیرون از <header> و بیرون از جریانِ
   sticky است، تیره‌کردنش هیچ ریسکی برای هدرِ چسبان ندارد. */
/* ⚠ رنگِ متن اینجا عمداً روشن است، نه «خاکستریِ ثانویه».
   قبلاً --c-on-dark-2 (#98A2AC) بود. آن رنگ از حدِ AA رد می‌شد (۷:۱) ولی
   «قابلِ خواندن» با «تیز» یکی نیست: روی نوارِ تیره خاکستری محو به نظر
   می‌رسد. حالا #EDF1F4 است → ۱۶٫۰:۱، و وزنِ ۵۰۰ لبهٔ حروفِ فارسی را
   در سایزِ ۱۳ پیکسل پررنگ‌تر می‌کند. */
.topbar{
  background:var(--c-dark);
  border-bottom:0;
  color:var(--c-on-dark);
  font-weight:500;
}
.topbar a{color:var(--c-on-dark)}
.topbar a:hover{color:#fff}
/* نامِ سایت، اولین لینکِ نوار — سفیدِ کامل و ضخیم، لنگرِ بصریِ سمت راست */
.topbar-links > li:first-child > a{color:#fff;font-weight:700}
/* ساعتِ کاری اطلاعاتِ درجه‌دوم است — ولی «درجه‌دوم» را با وزنِ سبک‌تر
   نشان می‌دهیم، نه با رنگِ کم‌رنگ‌تر. همان روشناییِ لینک‌ها را دارد.
   ⚠ اول یک خاکستریِ میانی (#C9D4DE) گذاشتم و checkdesign رد کرد: رنگِ
     خارج از پالت. درست هم بود — «کمی محوتر» دقیقاً همان چیزی است که
     کارفرما رویش انگشت گذاشت. */
.topbar-hours{color:var(--c-on-dark);font-weight:400}
/* آیکن تلفن قرمز می‌ماند: تنها لکهٔ رنگ روی نوار تیره */
.topbar svg{color:var(--c-primary)}
/* ── دو راهِ تماس در نوارِ بالایی ────────────────────────────────────────
   ⚠ نسخهٔ قبلی دو «چیپِ دوخطی» بود: در نوارِ ۳۴ پیکسلیِ بالا جا نمی‌شد و
     روی موبایل دو جعبهٔ تپیده کنارِ هم می‌ساخت.
     نوارِ بالایی یک نوارِ *کمکی* است، پس اینجا فقط دو لینکِ تک‌خطیِ آرام
     می‌نشیند با یک جداکنندهٔ مویی. شمارهٔ پررنگ و رنگی جای خودش را در
     دکمهٔ قرمزِ هدر دارد (.header-cta) — یک CTA رنگی در صفحه، نه سه تا. */
.topbar-contact{display:flex;align-items:center;gap:0;flex:none;min-width:0}
.tcall{
  display:inline-flex;align-items:center;gap:6px;
  padding:0 10px;line-height:1;white-space:nowrap;
  transition:color var(--t-fast);
}
.tcall svg{width:15px;height:15px;flex:none;stroke-width:1.9;color:var(--c-primary)}
.tcall-t{display:inline-flex;align-items:baseline;gap:5px;min-width:0}
.tcall-t b{font-size:15px;font-weight:700;unicode-bidi:isolate;letter-spacing:.01em}
/* برچسب («مشاوره و سفارش») در نوارِ باریک جا نمی‌شود و ارزشش را ندارد؛
   آیکنِ تلفن همان معنا را می‌رساند و برچسبِ کامل روی دکمهٔ هدر هست. */
.tcall-t i{display:none}

.tcall--mob{color:#fff}
.tcall--mob:hover{color:#fff}
/* تلفنِ ثابت هم روشن می‌شود؛ فقط موبایل ضخیم‌تر می‌ماند تا
   سلسله‌مراتب حفظ شود، نه با محوکردنِ دومی. */
.tcall--tel{color:var(--c-on-dark)}
.tcall--tel:hover{color:#fff}
/* جداکنندهٔ مویی بین دو شماره */
.tcall + .tcall{border-inline-start:1px solid rgba(255,255,255,.28)}


/* ── دکمهٔ قرمزِ تماس در هدر ─────────────────────────────────────────────
   برچسبِ ریز بالای شمارهٔ درشت — همان الگویی که در فروشگاه‌های تلفن‌محور
   جواب می‌دهد: کاربر هم می‌فهمد برای چیست، هم شماره را می‌بیند. */
.header-cta{padding-inline:16px}
.hcta-t{display:flex;flex-direction:column;align-items:flex-start;line-height:1.25;min-width:0}
.hcta-t i{font-style:normal;font-size:15px;font-weight:400;opacity:.85}
.hcta-t b{font-size:16px;font-weight:700;unicode-bidi:isolate;letter-spacing:.01em}
.topbar-contact a:hover{color:#fff}
.topbar-links li+li::before{background:rgba(255,255,255,.32)}
.topbar a:focus-visible{outline-color:#fff}


/* ═══════════════════════════════════════════════════════════════ ۲. هدر */
/* خطِ باریکِ قرمز زیرِ هدر — امضای برند، بدون اشغال ارتفاع */
.site-header{border-bottom:1px solid var(--c-line)}
.site-header.is-stuck{box-shadow:var(--sh-1)}
.header-search input{background:var(--c-bg);border-color:transparent}
.header-search input:hover{border-color:var(--c-line)}
.header-search input:focus{background:var(--c-surface);border-color:var(--c-primary)}
.hact-count{background:var(--c-primary)}

/* ⚠ ورود، علاقه‌مندی و سبد از هدر حذف شدند (خواستهٔ کارفرما).
   سایت فعلاً خرید آنلاین ندارد و تبدیلِ اصلی تماس است؛ سه آیکنِ خنثی
   کنارِ دکمهٔ قرمزِ تماس فقط توجه را می‌دزدیدند. کدشان حذف نشده و با
   برداشتنِ همین قاعده برمی‌گردند. */
.hact--user,
.hact--wish,
.hact--cart{display:none}
/* نویگیشنِ دسته‌ها حالا هفت نیتِ خرید است، نه فهرستِ انبار — پس باید
   وزن بصریِ بیشتری از بقیهٔ هدر بگیرد. */
.mainnav > li > a{font-weight:700}
.mainnav > li > a[aria-current="page"]{color:var(--c-primary)}


/* ═══════════════════════════════════ ۲.۵ گرید محصولات (PLP و ریل‌ها)
   ۳ ستون در دسکتاپ به‌جای ۴: عنوان‌های فارسیِ لوازم خانگی بلندند
   («ماشین ظرفشویی بوش مدل SMS6ZCI37Q») و در ستونِ ۴تایی سه خط می‌شوند. */
@media (min-width:1024px){
  .product-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}
}
@media (min-width:1440px){
  .product-grid{grid-template-columns:repeat(4,minmax(0,1fr))}
}


/* ════════════════════════════════════════════════════════ ۳. کارت محصول
   ترتیب اطلاعات: قابِ عکس → نام → کد مدل → وضعیت اعتماد → قیمت → دکمه */
.pcard{border-radius:var(--r-lg);border-color:var(--c-line-2)}
@media (hover:hover){
  .pcard:hover{border-color:var(--c-line);box-shadow:var(--sh-2)}
}

/* قابِ خاکستریِ عکس — عکس‌های پس‌زمینه‌سفیدِ لوازم خانگی روی این زمینه
   لبه پیدا می‌کنند. حاشیهٔ داخلی هم می‌گذاریم تا محصول به لبه نچسبد. */
.pcard-img{
  background:var(--c-panel);
  border-radius:var(--r-md);
  margin:8px 8px 0;
  padding:10px;
}
.pcard-img img{mix-blend-mode:multiply}
.pcard.is-oos .pcard-img{background:var(--c-line-2)}

/* برچسب‌ها — گوشهٔ قابِ عکس، نه گوشهٔ کارت */
.pcard-flags{inset-block-start:16px;inset-inline-start:16px}
.pcard-flag{border-radius:var(--r-sm);font-weight:700;letter-spacing:0}
.pcard-flag.new{background:var(--c-trust);color:#fff;border-color:var(--c-trust)}
.pcard-flag.hot{background:var(--c-ink);color:#fff;border-color:var(--c-ink)}
.pcard-quick{inset-block-start:16px;inset-inline-end:16px}

/* کدِ مدل به‌صورت چیپ — خریدارِ لوازم خانگی با کد مدل جستجو می‌کند
   (SMS46MI01B)، پس باید خوانا و قابلِ کپیِ چشمی باشد. */
.pcard-sku{
  background:var(--c-bg);
  border:1px solid var(--c-line-2);
  border-radius:var(--r-sm);
  padding:2px 8px;
  font-weight:500;
  color:var(--c-ink-2);
  letter-spacing:.02em;
  unicode-bidi:isolate;
}

/* خطِ اعتماد — جایگزینِ چیزی که در سایتِ تک‌رنگ اصلاً وجود نداشت */
.pcard-trust{
  display:flex;align-items:center;gap:5px;
  margin-block-start:2px;
  font-size:15px;font-weight:500;line-height:1.6;
  color:var(--c-success);
}
.pcard-trust svg{width:15px;height:15px;flex:none;stroke-width:2}
.pcard.is-oos .pcard-trust{color:var(--c-ink-2)}

/* خطِ مویی بالای بلوکِ قیمت — قیمت را از متن جدا می‌کند */
.pcard-foot{border-block-start:1px solid var(--c-line-2);padding-block-start:10px;margin-block-start:auto}
.pcard .price-now{font-size:21px;letter-spacing:-.01em}

/* بَج سری بوش — سیگنالِ اصلیِ خریدارِ لوازم خانگی («سری ۶ بخرم یا ۸؟») */
.pcard-flag.series{
  background:var(--c-ink);color:#fff;border-color:var(--c-ink);
  font-weight:700;letter-spacing:.01em;
}
.pcard-flag.new{background:var(--c-trust);color:#fff;border-color:var(--c-trust)}

/* دو ویژگیِ کوتاه زیر کد مدل */
.pcard-feat{
  display:flex;flex-direction:column;gap:3px;
  margin-block-start:6px;min-width:0;
}
.pcard-feat li{
  display:flex;align-items:flex-start;gap:6px;
  font-size:15px;line-height:1.55;color:var(--c-ink-2);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.pcard-feat li::before{
  content:"";flex:none;
  width:5px;height:5px;margin-block-start:8px;
  border-radius:var(--r-full);background:var(--c-trust);
}
.pcard-rating .rc{color:var(--c-ink-3);font-size:15px}

/* ردیفِ اقدام: دکمهٔ اصلی + دکمهٔ مربعیِ مقایسه */
.pcard-actions{display:flex;gap:6px;align-items:stretch;margin-block-start:8px}
.pcard-actions .pcard-cta{flex:1 1 auto;min-width:0;margin:0}
.pcard-cmp{
  flex:0 0 auto;width:42px;
  display:grid;place-items:center;
  border:1px solid var(--c-line);border-radius:var(--r-md);
  /* --c-ink-3 روی سفید ۳٫۳۳:۱ می‌دهد و AA را رد می‌کند؛ این آیکن تنها
     نشانهٔ دکمه است (متن ندارد) پس باید خوانا باشد. */
  background:var(--c-surface);color:var(--c-ink-2);
  transition:color var(--t-fast),border-color var(--t-fast),background var(--t-fast);
}
.pcard-cmp svg{width:18px;height:18px;stroke-width:1.8}
@media (hover:hover){
  .pcard-cmp:hover{color:var(--c-ink);border-color:var(--c-ink-3)}
}
.pcard-cmp[aria-pressed="true"]{
  background:var(--c-ink);border-color:var(--c-ink);color:#fff;
}

/* دکمهٔ کارت رنگش را از وضعیتِ محصول می‌گیرد.
   ⚠ همچنان یک لینکِ ساده است (نه فرم): صفحهٔ دستهٔ ۲۴تایی هیچ <form> اضافه
     و هیچ توکنِ CSRF اضافه‌ای در DOM ندارد. فقط برچسب و رنگ عوض می‌شود تا
     کاربر پیش از کلیک بداند آن‌طرف «خرید» است یا «تماس». */
.pcard-cta--buy,
.pcard-cta--quote,
.pcard-cta--oos{border-radius:var(--r-md);font-weight:700}

/* قابل خرید → قرمزِ اقدام */
.pcard-cta--buy{background:var(--c-primary);border-color:var(--c-primary);color:#fff}
@media (hover:hover){
  .pcard-cta--buy:hover{background:var(--c-primary-dark);border-color:var(--c-primary-dark);color:#fff}
}
/* استعلامی → سبزآبیِ اطمینان (تماس است، نه خرید) */
.pcard-cta--quote{background:var(--c-trust);border-color:var(--c-trust);color:#fff}
@media (hover:hover){
  .pcard-cta--quote:hover{background:var(--c-trust-dark);border-color:var(--c-trust-dark);color:#fff}
}
/* ناموجود → خنثی، تا با محصولِ قابلِ‌خرید اشتباه نشود */
.pcard-cta--oos{background:var(--c-surface);border-color:var(--c-line);color:var(--c-ink-2)}
@media (hover:hover){
  .pcard-cta--oos:hover{background:var(--c-bg);border-color:var(--c-ink-3);color:var(--c-ink)}
}
.pcard-cta svg{width:17px;height:17px;flex:none;stroke-width:1.9}


/* ═════════════════════════════════════════════════════ ۴. عنوانِ بخش‌ها
   خطِ کوتاهِ قرمز بالای تیتر — ریتمِ بصریِ تکرارشوندهٔ صفحه اصلی و دسته */
.section-head h2,
.sec-title,
.home-sec > h2{position:relative}
.section-head h2::before,
.sec-title::before,
.home-sec > h2::before{
  content:"";display:block;
  width:34px;height:3px;border-radius:2px;
  background:var(--c-primary);
  margin-block-end:10px;
}


/* ═══════════════════════════════════════════════════ ۵. قیمت و استعلام */
.price-now{color:var(--c-ink);font-weight:700}
.price-now .unit{color:var(--c-ink-2);font-weight:400}
.price-old{color:var(--c-ink-3)}
.price-off{background:var(--c-primary);color:#fff;border-radius:var(--r-sm)}

/* باکسِ استعلام — سبزآبی، نه قرمز. «تماس بگیر» یک اقدامِ کم‌ریسک است و
   نباید هم‌وزنِ بصریِ «خرید» باشد. */
.quotebox{
  background:var(--c-trust-soft);
  border:1px solid rgba(var(--c-trust-rgb),.22);
  border-radius:var(--r-lg);
}
.quotebox .qtitle{color:var(--c-trust-dark)}
.quotebox .qphone{
  background:var(--c-trust);color:#fff;border-color:var(--c-trust);
  border-radius:var(--r-md);
}
.quotebox .qphone:hover{background:var(--c-trust-dark);border-color:var(--c-trust-dark)}


/* ═══════════════════════════════════════════════════ ۶. سیگنالِ اطمینان */
.trust-bar{background:var(--c-surface);border-radius:var(--r-lg);border:1px solid var(--c-line-2)}
.trust-bar svg,
.trust-item svg{color:var(--c-trust)}
/* متنِ سبزآبی روی زمینهٔ سبزآبیِ روشن باید نسخهٔ تیره باشد (۶٫۱۳:۱)،
   وگرنه ۴٫۱۴:۱ می‌شود و AA رد می‌شود. */
.badge-stock,
.stock-in,
.in-stock{color:var(--c-success);background:var(--c-trust-soft)}
.alert-success{background:var(--c-trust-soft);border-color:rgba(var(--c-trust-rgb),.25);color:var(--c-trust-dark)}


/* ═════════════════════════════════════════════════ ۷. جدول مشخصات فنی */
.spec-row:nth-child(odd){background:var(--c-bg)}
.specs-group > h3{
  color:var(--c-ink);
  border-inline-start:3px solid var(--c-trust);
  padding-inline-start:10px;
}


/* ══════════════════════════════════════════════════════ ۸. نوار خرید */
.sticky-buy{border-block-start:1px solid var(--c-line);box-shadow:var(--sh-3)}
.sticky-buy .sb-price .now{color:var(--c-ink)}


/* ══════════════════════════════════════════ ۹. بردکرامب و نوار پایین */
.breadcrumb a:hover{color:var(--c-primary)}
.mobile-bar .mb-count{background:var(--c-primary)}

/* دکمهٔ برجستهٔ «تماس» وسط نوار پایین.
   تنها عنصرِ رنگیِ نوار است؛ در سایتی بدون درگاه، این خودِ دکمهٔ خرید است. */
.mobile-bar .mb-fab > a{
  position:relative;
  color:var(--c-primary);
}
.mobile-bar .mb-fab .mb-ico{
  width:46px;height:46px;
  margin-top:-16px;                 /* از لبهٔ بالای نوار بیرون بزند */
  border-radius:var(--r-full);
  background:var(--c-primary);
  color:#fff;
  display:grid;place-items:center;
  /* برجستگی از خودِ حلقهٔ سفید می‌آید، نه از سایهٔ رنگی — سیستمِ سایهٔ سایت
     فقط سه سطحِ توکن‌شده دارد و سایهٔ رنگیِ اختصاصی از آن بیرون می‌زد. */
  box-shadow:var(--sh-2);
  border:3px solid var(--c-surface);
}
.mobile-bar .mb-fab .mb-ico svg{width:21px;height:21px;stroke-width:2}
.mobile-bar .mb-fab .mb-label{color:var(--c-primary);font-weight:700}

/* ══════════════════════════════ ۱۰. ایزوله‌سازی جهت برای اعداد و کدها
   در متنِ RTL، «۱۲۰٬۰۰۰٬۰۰۰ تومان» و «۰۲۱-۳۳۱۲۷۶۴۲» و کد مدل «SMS46MI01B»
   با الگوریتم دوجهته جابه‌جا می‌شوند (۰۲۱ می‌پرد آخر). isolate این را می‌بندد. */
.price-now,.price-old,.pcard-amount,
.sb-price,.p-price,.sum-row .v,
.pcard-sku,.p-sku,.tel-num,.tel-link,
.num,.order-number{
  unicode-bidi:isolate;
}
/* عدد و واحد باید کنار هم بمانند ولی هرکدام جزیرهٔ خودش باشد */
.price-now .unit{unicode-bidi:isolate;margin-inline-start:4px}

/* ═══════════════════════════════ ۱۱. حالت استعلامی روی کارت محصول
   ⚠ کارتِ بی‌قیمت نباید «سوراخ» داشته باشد. اگر بلوکِ قیمت را حذف کنیم و
     جایش چیزی نگذاریم، ارتفاعِ کارت‌ها در گرید نامساوی می‌شود و کارتِ
     استعلامی «ناقص» به‌نظر می‌رسد — نه «عمدی». این بلوک دقیقاً همان جای
     قیمت را می‌گیرد و با لحنِ اطمینان (سبزآبی) نوشته شده. */
.pcard-quote{
  display:flex;align-items:center;gap:6px;
  min-height:30px;
  font-size:15px;font-weight:700;line-height:1.5;
  color:var(--c-success);
}
.pcard-quote svg{width:16px;height:16px;flex:none;stroke-width:2}


/* ═══════════════════════════════════════════════════ ۱۰. بازگشت به بالا */
.to-top{
  background:var(--c-surface);color:var(--c-ink);
  border:1px solid var(--c-line);box-shadow:var(--sh-2);
  border-radius:var(--r-full);
}
.to-top:hover{background:var(--c-ink);color:#fff;border-color:var(--c-ink)}


/* ══════════════════════════════════════════════════════ ۱۱. فرم‌ها */
.input:focus,input:focus,select:focus,textarea:focus{
  border-color:var(--c-primary);
  box-shadow:0 0 0 3px rgba(var(--c-primary-rgb),.10);
}
.btn{border-radius:var(--r-md)}
.btn-primary{background:var(--c-primary);border-color:var(--c-primary)}
.btn-primary:hover{background:var(--c-primary-dark);border-color:var(--c-primary-dark)}
/* دکمهٔ سبزآبی — برای «تماس»، «استعلام» و «مشاوره» */
.btn-trust{
  background:var(--c-trust);border:1px solid var(--c-trust);color:#fff;
}
.btn-trust:hover{background:var(--c-trust-dark);border-color:var(--c-trust-dark);color:#fff}


/* ═══════════════════════════════════════════ ۱۱.۵ هیروِ دوقسمتی
   ستونِ ۶۰٪ اسلایدر + ستونِ ۴۰٪ با دو بنرِ روی‌هم.
   نسبتِ ابعادِ هر دو ستون یکی است (۱۶:۹ برای اسلایدر، دو تا ۱۶:۵ برای
   بنرها) تا ارتفاعشان بخواند و ردیف صاف بماند. */
/* هیرو باید از هدرِ بالا و بخشِ بعدی هم فاصله بگیرد، نه فقط اجزایش از هم */
.hsec--hero{background:var(--c-surface);padding-block:clamp(20px,2.6vw,32px)}
.herox{
  display:grid;
  grid-template-columns:minmax(0,6fr) minmax(0,4fr);
  /* ⚠ عددِ صریح، نه var(--sp-5).
     دو دور این فاصله «کم» گزارش شد. توکن در هر فایلی قابلِ بازنویسی است
     (mobile.css همین حالا چند توکنِ فاصله را در :root عوض می‌کند)، پس
     برای چیزی که کارفرما مستقیم رویش انگشت گذاشته، عددِ ثابت امن‌تر است.
     ۲۸px هم‌اندازهٔ فاصلهٔ ستون‌های بقیهٔ صفحه است. */
  gap:28px;
  /* ⚠ چرا دو ردیف و چرا اسلایدر هر دو را می‌گیرد — این «ترازِ خودکار» است.
     تا اینجا اسلایدر و ستونِ بنرها دو جعبهٔ مستقل بودند که ارتفاعشان از
     نسبتِ تصویرِ خودشان می‌آمد، پس فقط وقتی ته‌شان یک خط می‌شد که
     نسبت‌ها *دقیقاً* حساب‌شده باشند — آن هم فقط در یک عرضِ صفحه، چون
     فاصلهٔ ۲۸px ثابت است ولی عرضِ ستون‌ها با صفحه تغییر می‌کند.
     یعنی هم‌ترازی با «ابعادِ درست» هم شکننده بود.

     حالا هر دو بنر عضوِ همین گریدِ بیرونی‌اند (display:contents روی
     .herox-side) و اسلایدر با grid-row دو ردیف را می‌پوشاند. پس:
         ارتفاعِ اسلایدر = بنر۱ + ۲۸ + بنر۲
     این یک اتحاد است، نه یک تنظیم. در هر عرضی و با هر تصویری برقرار است. */
  grid-template-rows:auto auto;
  align-items:stretch;
}
.herox-main{grid-column:1;grid-row:1 / span 2}
.herox-side{display:contents}

/* تمام‌عرض (بنری در کار نیست) → ارتفاع دوباره از خودِ تصویر */
.herox.is-wide{grid-template-columns:minmax(0,1fr);grid-template-rows:auto}
.herox.is-wide .herox-main{grid-row:auto}
/* ⚠ اگر ادمین فقط یک بنر بگذارد، ردیفِ دوم خالی می‌ماند و اسلایدر
   ۲۸px بلندتر از بنر می‌شود. :has در همهٔ مرورگرهای امروزی هست و اگر
   نبود، رفتار به همین حالتِ فعلی برمی‌گردد — یعنی خرابی‌ای نمی‌سازد. */
.herox:has(.herox-banner:only-child) .herox-main{grid-row:auto}
.herox:has(.herox-banner:only-child) .herox-side{display:block}

/* ⚠ هیچ بُرشی: نه aspect-ratio، نه object-fit:cover.
   این دو با هم یعنی «هر تصویری که دقیقاً ۱۶:۹ نباشد بریده شود» — و روی
   بنری که متنِ فارسی رویش پخته شده، بریدن یعنی نصفِ عنوان می‌رود.
   دقیقاً همین شد: «بوش تهران» از سمت راست قیچی شد.
   حالا ارتفاع را خودِ تصویر تعیین می‌کند؛ هر نسبتی بدهید کامل دیده می‌شود. */
.herox-main{
  position:relative;overflow:hidden;
  border-radius:var(--r-xl);background:var(--c-panel);
}
/* ⚠ ترک مطلق می‌شود تا ارتفاعِ اسلایدر را *گرید* تعیین کند، نه تصویر.
   اگر در جریانِ عادی بماند، ارتفاعش را از تصویر می‌گیرد و همان
   ناهم‌ترازی برمی‌گردد. سه حالتِ استثنا پایین‌تر به جریانِ عادی
   برمی‌گردند (تمام‌عرض، تک‌بنر، موبایل) چون آنجا گرید ارتفاعی نمی‌دهد
   و مطلق‌بودن یعنی ارتفاعِ صفر — یعنی اسلایدرِ نامرئی. */
.herox-main .hero-track{position:absolute;inset:0;display:flex;
  transition:transform .45s var(--ease)}
.herox-main .hero-slide{flex:0 0 100%;position:relative}
.herox-main .hero-slide a{height:100%}
/* ⚠ home.css این را روی `.hero-slider.is-single` نوشته، ولی کلاسِ
   is-single در مارک‌آپ روی `.herox-main` است — یعنی هرگز اجرا نمی‌شد
   و تک‌اسلاید می‌توانست جابه‌جا بماند. */
.herox-main.is-single .hero-track{transform:none!important}
.herox-main .hero-slide a{display:block}
/* ⚠ contain و نه cover. حالا که ارتفاع را گرید می‌دهد، تصویر باید خودش را
   با جعبه وفق دهد — و بینِ دو راه، cover می‌بُرَد و contain نوارِ نازک
   می‌گذارد. نوار برگشت‌پذیر است، برش نه؛ و متنِ فارسی روی این بنرها
   پخته شده. با نسبت‌های پیشنهادی نوار عملاً صفر است.
   object-fit صریح نوشته می‌شود چون home.css خط ۶۱ روی همین تصویر
   `object-fit:cover` دارد و بی‌صدا برنده می‌شد. */
.herox-main .hero-slide img{display:block;width:100%;height:100%;
  object-fit:contain;object-position:center;max-height:none;min-height:0}

/* ── درورِ موبایل: گروهِ دومِ لینک‌ها ───────────────────────────────────
   دسته‌بندی‌ها بالا، صفحه‌های اطلاعاتی پایین با یک مرزِ روشن بینشان —
   کاربر نباید «درباره ما» را لای هفت دستهٔ محصول بگردد. */
.mp-nav--more{
  margin-block-start:10px;
  border-top:1px solid var(--c-line);
}
.mp-nav--more a{color:var(--c-ink-2);font-weight:500}

/* ── دو بنرِ بعد از دسته‌بندی‌ها ────────────────────────────────────────
   یک قابِ واحد که هر دو بنر داخلش می‌نشینند — نه دو کارتِ جدا. همان
   زبانِ بصریِ فوتر و بقیهٔ صفحه: زمینهٔ ملایم، گوشهٔ گرد، نوارِ برند
   روی لبهٔ بالا. هیچ توکنِ تازه‌ای ساخته نشده. */
.hsec--promo{padding-block:clamp(18px,2.4vw,30px)}
.promo{
  position:relative;overflow:hidden;
  display:grid;grid-template-columns:minmax(0,1fr);gap:20px;
  padding:clamp(18px,2.2vw,26px);
  background:var(--c-panel);
  border:1px solid var(--c-line);
  border-radius:var(--r-xl);
}
.promo--2{grid-template-columns:repeat(2,minmax(0,1fr))}
/* نوارِ برند به گوشه‌های گرد بریده می‌شود چون قاب overflow:hidden دارد */
.promo > .bosch-strip{position:absolute;inset-block-start:0;inset-inline:0}
.promo-i{
  display:block;position:relative;overflow:hidden;
  border-radius:var(--r-lg);background:var(--c-surface);
  transition:transform var(--t-fast),box-shadow var(--t-fast);
}
.promo-i img{display:block;width:100%;height:auto;object-fit:fill}
@media (hover:hover){
  a.promo-i:hover{transform:translateY(-2px);box-shadow:var(--sh-2)}
}
@media (max-width:767px){
  /* روی گوشی دو بنرِ کنارِ هم هرکدام نصفِ عرض می‌شوند و ناخوانا */
  .promo--2{grid-template-columns:minmax(0,1fr)}
  .promo{border-radius:var(--r-lg);padding:14px}
}

/* ── بنرهای میانی و عریض ──────────────────────────────────────────────
   همان قاعدهٔ هیرو: هیچ برشی. ارتفاع را خودِ تصویر می‌دهد. */
.hsec--band{padding-block:clamp(18px,2.4vw,30px)}
.bband{display:grid;grid-template-columns:minmax(0,1fr);gap:24px}
.bband--2{grid-template-columns:repeat(2,minmax(0,1fr))}
.bband-i,
.bwide{
  display:block;position:relative;overflow:hidden;
  background:var(--c-panel);
  transition:transform var(--t-fast),box-shadow var(--t-fast);
}
.bband-i{border-radius:var(--r-xl)}
.bband-i img,
.bwide img{display:block;width:100%;height:auto;object-fit:fill}
@media (hover:hover){
  .bband-i:hover{transform:translateY(-2px);box-shadow:var(--sh-2)}
}
/* عریض = لبه‌به‌لبه، بدون قاب و بدون گوشهٔ گرد */
.bwide{margin-block:clamp(18px,2.4vw,30px)}
@media (max-width:767px){
  .bband--2{grid-template-columns:minmax(0,1fr)}
  .bband-i{border-radius:var(--r-lg)}
}

/* ── متنِ روی اسلاید و بنر ────────────────────────────────────────────
   ⚠ چرا متنِ HTML و نه متنِ پخته در تصویر:
       · در هر رزولوشن و هر زومی تیز است؛ متنِ داخلِ jpg با بزرگ‌شدنِ
         صفحه نرم و پیکسلی می‌شود.
       · گوگل می‌خواندش. متنِ داخلِ تصویر برای سئو صفر است و سئو
         مهم‌ترین خواستهٔ این پروژه بود.
       · از پنل عوض می‌شود؛ برای اصلاحِ یک کلمه لازم نیست تصویر را
         دوباره بسازید.
       · ابزارهای تصویرسازی فارسی را درست نمی‌نویسند — حروف را جدا
         می‌چینند یا برعکس.
   ⚠ اگر «عنوان» در پنل خالی باشد هیچ روکشی رندر نمی‌شود، پس تصویری که
     متنش داخلِ خودش پخته شده دست‌نخورده می‌ماند. هر دو راه باز است.

   جای متن سمت راستِ تصویر است — همان‌جا که در پرامپت‌ها بلوکِ رنگیِ خالی
   ساخته می‌شود. در RTL، inset-inline-start یعنی لبهٔ راست. */
.hcap{
  position:absolute;inset-block:0;inset-inline-start:0;
  inline-size:36%;min-inline-size:170px;
  display:flex;flex-direction:column;justify-content:center;align-items:flex-start;
  gap:clamp(6px,.8vw,12px);
  padding:clamp(14px,2.2vw,34px);
  color:#fff;text-align:start;
  /* پردهٔ ملایم تا اگر روزی تصویری بدونِ بلوکِ رنگی آپلود شد هم متن
     خوانا بماند. روی بلوکِ قرمز تقریباً نامرئی است. */
  background:linear-gradient(to left,rgba(16,22,28,.42),rgba(16,22,28,.10) 60%,transparent);
  /* کلِ اسلاید یک لینک است؛ روکش نباید کشیدنِ اسلایدر را بگیرد */
  pointer-events:none;
}
.hcap-t{
  margin:0;font-size:clamp(19px,2.4vw,36px);font-weight:800;line-height:1.3;
  text-shadow:0 2px 12px rgba(0,0,0,.38);
}
.hcap-s{
  margin:0;font-style:normal;
  font-size:clamp(11.5px,1.1vw,17px);font-weight:500;line-height:1.75;
  text-shadow:0 1px 8px rgba(0,0,0,.32);
}
.hcap-b{
  margin-block-start:clamp(4px,.8vw,10px);
  padding:clamp(7px,.8vw,11px) clamp(14px,1.5vw,22px);
  border-radius:var(--r-full);
  background:var(--c-primary);color:#fff;
  font-weight:700;font-size:clamp(11.5px,1.05vw,15px);line-height:1;
  /* ⚠ اول یک هالهٔ قرمزِ دست‌ساز گذاشتم و checkdesign رد کرد: سایهٔ خارج
     از سیستم. حق داشت — دکمه‌های اصلیِ سایت همین توکن را دارند و یک
     استثنا یعنی شروعِ واگراییِ بصری. */
  box-shadow:var(--sh-2);
}
/* بنرهای کناری کوچک‌ترند، پس سهمِ بیشتری از عرض می‌گیرند */
.hcap--sm{inline-size:46%}
.hcap--sm .hcap-t{font-size:clamp(14px,1.35vw,20px)}
.hcap--sm .hcap-s{font-size:clamp(10.5px,.85vw,13px);line-height:1.6}

@media (max-width:639px){
  /* ⚠ ۳۶٪ از عرضِ یک گوشیِ ۳۹۰ پیکسلی می‌شود ۱۴۰px — برای یک تیترِ
     فارسی خیلی باریک است. روی موبایل روکش تمام‌عرض و چسبیده به پایین
     می‌شود، با پردهٔ عمودی. */
  .hcap,.hcap--sm{
    inset-block:auto 0;inset-inline:0;inline-size:auto;
    justify-content:flex-end;
    padding:14px 16px 16px;
    background:linear-gradient(to top,rgba(16,22,28,.78),rgba(16,22,28,.25) 55%,transparent);
  }
}

/* ── بازگشت به جریانِ عادی، هر جا که گرید ارتفاعی نمی‌دهد ──────────────
   بدونِ این، ترکِ مطلق ارتفاعِ صفر می‌گیرد و اسلایدر ناپدید می‌شود. */
.herox.is-wide .hero-track,
.herox:has(.herox-banner:only-child) .hero-track{position:static}
.herox.is-wide .hero-slide img,
.herox:has(.herox-banner:only-child) .hero-slide img{height:auto}

/* ⚠ این بلوک فقط برای موبایل و حالت‌های استثنا معنی دارد؛ در دسکتاپ
   .herox-side با display:contents ناپدید می‌شود و دو بنر مستقیماً
   عضوِ گریدِ بیرونی‌اند. */
.herox-side{grid-template-rows:auto auto;gap:28px;min-width:0;align-content:start}
.herox:has(.herox-banner:only-child) .herox-side{gap:0}
.herox-banner{
  /* ⚠ position:relative لازم است وگرنه روکشِ متن (.hcap) نسبتِ به
     نزدیک‌ترین جدِ موقعیت‌دار جا می‌گیرد — یعنی کلِ گریدِ هیرو. */
  display:block;position:relative;overflow:hidden;
  border-radius:var(--r-lg);background:var(--c-panel);
  transition:transform var(--t-fast),box-shadow var(--t-fast);
}
/* همان قاعده: بنر هم بریده نمی‌شود */
.herox-banner img{display:block;width:100%;height:auto;object-fit:fill}
@media (hover:hover){
  .herox-banner:hover{transform:translateY(-2px);box-shadow:var(--sh-2)}
}

@media (max-width:899px){
  /* موبایل: اسلایدر بالا، دو بنر زیرش کنار هم — ستونِ باریکِ عمودی
     روی گوشی بنرها را به نوارِ نازکِ ناخوانا تبدیل می‌کرد. */
  /* ⚠ اینجا بود که «فاصله» گم می‌شد. ۱۶px بود، و لپ‌تاپِ ۱۳۶۶ با
     مقیاس ۱۵۰٪ ویندوز = ۹۱۰ CSS px، با ۱۷۵٪ = ۷۸۰px → کاربر اصلاً
     نسخهٔ دسکتاپ را نمی‌دید و ۲۸px هیچ‌وقت اعمال نمی‌شد. */
  .herox{grid-template-columns:minmax(0,1fr);grid-template-rows:auto;gap:24px}
  .herox-main{border-radius:var(--r-lg);grid-column:auto;grid-row:auto}
  /* ⚠ روی موبایل چیدمان تک‌ستونی است، پس گرید دیگر ارتفاعی به اسلایدر
     نمی‌دهد. ترک باید به جریانِ عادی برگردد و ارتفاع از تصویر بیاید،
     وگرنه اسلایدر ارتفاعِ صفر می‌گیرد و کلاً محو می‌شود. */
  .herox-main .hero-track{position:static}
  .herox-main .hero-slide img{height:auto;object-fit:fill}
  /* ⚠ display:contents باید پس گرفته شود، وگرنه دو بنر مستقیم داخلِ
     گریدِ تک‌ستونیِ بیرونی می‌افتند و زیرِ هم می‌چینند، نه کنار هم. */
  /* ⚠ minmax(0,1fr) و نه 1fr: در گرید، 1fr حداقلِ ضمنیِ auto دارد و
     تصویرِ پهنِ بنر ستون را از عرضِ صفحه بیرون می‌زند. */
  .herox-side{display:grid;grid-template-rows:none;
              grid-template-columns:repeat(2,minmax(0,1fr));gap:24px}

}
@media (max-width:479px){
  .herox-side{grid-template-columns:minmax(0,1fr)}
}


/* ══════════════════════════════ ۱۱.۶ بنرهای دسته‌بندیِ سایت قدیم
   نامِ دسته داخلِ خودِ تصویر پخته شده، پس هیچ متنی رویش نمی‌گذاریم و
   کاشی فقط قابِ تصویر است. نسبتِ ثابت ۱۶:۶ چون همهٔ هشت بنر افقی‌اند. */
.catbn{
  display:grid;gap:14px;
  grid-template-columns:repeat(4,minmax(0,1fr));
}
@media (max-width:1023px){.catbn{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:479px){.catbn{grid-template-columns:minmax(0,1fr);gap:10px}}

/* ⚠ بدون aspect-ratio و بدون object-fit:cover.
   این بنرها طراحیِ آماده‌اند و نامِ دسته داخلشان پخته شده؛ cover لبه‌ها را
   می‌بُرید و متن ناقص می‌شد. حالا تصویر ابعادِ خودش را دیکته می‌کند و
   کامل دیده می‌شود. هر هشت بنر یک نسبت دارند، پس ردیف‌ها هم‌قد می‌مانند. */
.catbn-item{
  display:block;overflow:hidden;
  border-radius:var(--r-lg);
  background:var(--c-panel);
  transition:transform var(--t-fast),box-shadow var(--t-fast);
}
.catbn-item img{
  display:block;width:100%;height:auto;
  transition:transform .35s var(--ease);
}
@media (hover:hover){
  .catbn-item:hover{box-shadow:var(--sh-2)}
  .catbn-item:hover img{transform:scale(1.04)}
}


/* ════════════════════════════════ ۱۱.۷ قفسهٔ محصول — یک قاب، سه تب
   ⚠ تب‌ها با رادیوی مخفی + :checked کار می‌کنند، نه جاوااسکریپت. یعنی
     اگر JS نرسد باز هم هر سه گروه در دسترس‌اند و هیچ محصولی پنهان
     نمی‌ماند. ترتیبِ DOM: همهٔ رادیوها و لیبل‌ها *قبل* از پنل‌ها هستند،
     چون سلکتور ~ فقط رو به جلو کار می‌کند. */
.shelf{
  background:var(--c-bg);
  border:1px solid var(--c-line-2);
  border-radius:var(--r-xl);
  padding:clamp(14px,2.4vw,26px);
}
.shelf-head{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:12px;margin-block-end:16px;
}
.shelf-head h2{font-size:clamp(19px,2.2vw,26px);line-height:1.5;color:var(--c-ink)}
.shelf-tabs{
  display:flex;gap:4px;flex-wrap:wrap;
  padding:4px;border-radius:var(--r-full);
  background:var(--c-surface);border:1px solid var(--c-line-2);
}
.shelf-tabs label{
  padding:8px 16px;border-radius:var(--r-full);
  font-size:15px;font-weight:700;color:var(--c-ink-2);
  cursor:pointer;white-space:nowrap;
  transition:background var(--t-fast),color var(--t-fast);
}
@media (hover:hover){.shelf-tabs label:hover{color:var(--c-ink)}}
/* رادیوها فرزندِ مستقیمِ .shelf‌اند و قبل از head و پنل‌ها می‌آیند، پس «~»
   هم به لیبل (داخلِ head) می‌رسد و هم به پنل. */
.shelf-pane{display:none}
#shelf-a:checked ~ .shelf-pane--a,
#shelf-b:checked ~ .shelf-pane--b,
#shelf-c:checked ~ .shelf-pane--c{display:block}
#shelf-a:checked ~ .shelf-head label[for="shelf-a"],
#shelf-b:checked ~ .shelf-head label[for="shelf-b"],
#shelf-c:checked ~ .shelf-head label[for="shelf-c"]{background:var(--c-primary);color:#fff}
.shelf-radio:focus-visible ~ .shelf-head .shelf-tabs{outline:2px solid var(--c-primary);outline-offset:2px;border-radius:var(--r-full)}
.shelf .rail{padding-block-end:4px}
.shelf .pcard{background:var(--c-surface)}


/* ════════════════════════════════════════ ۱۱.۸ فروشگاه (تک‌شعبه) */
.store1{
  display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1.2fr) minmax(0,.8fr);
  gap:clamp(20px,3vw,40px);align-items:center;
  background:var(--c-surface);
  border:1px solid var(--c-line-2);border-radius:var(--r-xl);
  padding:clamp(18px,2.6vw,32px);
}
.store1-say h2{font-size:clamp(19px,2.2vw,26px);color:var(--c-ink)}
.store1-say > p{margin-block-start:8px;color:var(--c-ink-2);font-size:15px;line-height:1.9}
.store1-row{
  display:flex;align-items:flex-start;gap:8px;
  margin-block-start:14px;font-size:15px;line-height:1.9;color:var(--c-ink);
}
.store1-row svg{width:18px;height:18px;flex:none;margin-block-start:5px;color:var(--c-primary)}
.store1-row address{font-style:normal}
.store1-do{display:flex;flex-direction:column;gap:8px;min-width:0}
.store1-do .btn{width:100%}
.store1-do .num{unicode-bidi:isolate;font-weight:700}
.store1-map{border-radius:var(--r-lg);overflow:hidden;min-width:0;line-height:0}
.store1-map iframe{display:block;width:100%;height:250px;border:0}
@media (max-width:1023px){
  .store1{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  .store1-map{grid-column:1 / -1;order:3}
  .store1-map iframe{height:220px}
}
@media (max-width:767px){
  .store1{grid-template-columns:minmax(0,1fr);gap:18px}
}


/* ═════════════════════════════════════ ۱۲. ریل گروه‌های دسته‌بندی (خانه) */
.grp-sec{padding-block:var(--sp-6)}
.grp-rail{
  display:flex;gap:12px;
  overflow-x:auto;scroll-snap-type:x proximity;
  scrollbar-width:none;-webkit-overflow-scrolling:touch;
  padding-block-end:4px;
}
.grp-rail::-webkit-scrollbar{display:none}
.grp{
  scroll-snap-align:start;
  flex:0 0 auto;width:132px;
  display:flex;flex-direction:column;align-items:center;gap:6px;
  padding:14px 10px;
  background:var(--c-surface);
  border:1px solid var(--c-line-2);
  border-radius:var(--r-lg);
  text-align:center;
  transition:border-color var(--t-fast),box-shadow var(--t-fast);
}
@media (hover:hover){
  .grp:hover{border-color:var(--c-primary);box-shadow:var(--sh-1)}
}
.grp-ic{
  width:64px;height:64px;
  display:grid;place-items:center;
  /* مربعِ گردگوشه، نه دایره — لوازم خانگی جعبه‌ای‌اند */
  border-radius:var(--r-md);
  background:var(--c-panel);
  color:var(--c-ink-2);
  overflow:hidden;
}
.grp-ic img{width:100%;height:100%;object-fit:contain;mix-blend-mode:multiply}
.grp-ic svg{width:26px;height:26px;stroke-width:1.5}
.grp b{font-size:15px;font-weight:700;line-height:1.5;color:var(--c-ink)}
.grp-n{font-size:15px;color:var(--c-ink-3)}
/* قرمزِ روشن روی صورتیِ کم‌رنگ ۴٫۳۹:۱ می‌دهد و AA را با اختلافِ کم رد می‌کند؛
   نسخهٔ تیره روی همان زمینه راحت از حد می‌گذرد. */
.grp--all .grp-ic{background:var(--c-primary-soft);color:var(--c-primary-dark)}


/* ═══════════════════════════════════════ ۱۳. چیپ‌های فیلترِ سریع */
.quick-filters{display:flex;gap:8px;flex-wrap:wrap;min-width:0}
.chip--toggle{
  display:inline-flex;align-items:center;gap:6px;
  border:1px solid var(--c-line);
  background:var(--c-surface);
  color:var(--c-ink-2);
  border-radius:var(--r-md);
  font-size:15px;font-weight:500;
}
.chip--toggle svg{width:16px;height:16px;stroke-width:1.9}
@media (hover:hover){
  .chip--toggle:hover{border-color:var(--c-ink-3);color:var(--c-ink)}
}
/* روشن = سبزآبیِ اطمینان، نه قرمز: این‌ها «محدودکننده»اند نه «اقدام» */
.chip--toggle.is-on{
  background:var(--c-trust-soft);
  border-color:rgba(var(--c-trust-rgb),.35);
  color:var(--c-success);
  font-weight:700;
}


/* ═════════════════════════════ ۱۴. شکلِ امضاییِ برچسب («بلیتی»)
   یک هندسه، سه معنا — تمایزِ ارزان و یکدست. گوشهٔ بالا-شروع و پایین-پایان
   بزرگ، دو گوشهٔ دیگر ریز. */
.pcard-flag,
.gal-flags .pcard-flag,
.price-off,
.badge-ticket{
  border-start-start-radius:var(--r-md);
  border-end-end-radius:var(--r-md);
  border-start-end-radius:4px;
  border-end-start-radius:4px;
}


/* ═══════════════════════════════ ۱۵. گالری — اورلیِ «+N» روی بندانگشتی */
.gal-thumbs.has-more .gal-thumb.is-hidden{display:none}
.gal-thumbs .gal-thumb.is-more{position:relative}
.gal-thumbs .gal-thumb.is-more::after{
  content:attr(data-more);
  position:absolute;inset:0;
  display:grid;place-items:center;
  background:rgba(16,22,28,.62);
  color:#fff;font-weight:700;font-size:15px;
  border-radius:inherit;
  unicode-bidi:isolate;
}
/* بعد از باز شدن، اورلی می‌رود و بقیه دیده می‌شوند */
.gal-thumbs.is-open .gal-thumb.is-hidden{display:block}
.gal-thumbs.is-open .gal-thumb.is-more::after{display:none}


/* ══════════════════════════ ۱۶. جدول مشخصات — دو ستونه در دسکتاپ
   محصولات این سایت تا ۱۹ ردیفِ مشخصات دارند؛ تک‌ستونه یعنی یک ستونِ باریکِ
   بلند و کلی فضای خالی سمت مقابل. */
@media (min-width:1024px){
  .specs-group{
    display:grid;
    grid-template-columns:repeat(2,minmax(0,1fr));
    column-gap:var(--sp-6);
  }
  .specs-group > h3{grid-column:1 / -1}
  /* راه‌راهِ زوج/فرد در دو ستون به هم می‌ریزد؛ به‌جایش خطِ جداکنندهٔ افقی */
  .specs-group .spec-row:nth-child(odd){background:transparent}
  .specs-group .spec-row{border-block-end:1px solid var(--c-line-2)}
}


/* ══════════════════════════ ۱۷. لینک واتس‌اپ در باکس مشاوره
   ⚠ کلاس .is-wa در call-cta.php بود ولی هیچ قاعده‌ای نداشت، پس دقیقاً شبیه
     لینک‌های تلفنِ کنارش دیده می‌شد و کاربر تفکیکشان نمی‌کرد. این پارشال در
     صفحهٔ اصلی، دسته، محصول و جستجو تکرار می‌شود — یعنی همه‌جا.
     سبزآبیِ اطمینان می‌گیرد، نه سبزِ برندِ واتس‌اپ، تا از پالت بیرون نزند. */
.consult-tels a.is-wa{
  background:var(--c-trust-soft);
  border-color:rgba(var(--c-trust-rgb),.30);
  color:var(--c-success);
  font-weight:700;
}
.consult-tels a.is-wa svg{color:var(--c-trust)}
.consult-tels a.is-wa:hover{border-color:var(--c-trust);color:var(--c-trust-dark)}


/* ══════════════════════════ ۱۸. مگامنو — بازشدن با کیبورد
   پنل فقط با کلاسِ .is-open (از app.js) باز می‌شد. اگر جاوااسکریپت نرسد یا
   کاربر با Tab حرکت کند، پنل هرگز باز نمی‌شد. لینکِ والد همچنان به صفحهٔ
   گروه می‌رود، پس ناوبری نمی‌شکست — ولی این یک خطِ CSS همان را با کیبورد
   هم قابل استفاده می‌کند. */
.mainnav > li.has-mega:focus-within > .mega{
  opacity:1;visibility:visible;transform:none;
  transition:opacity .16s var(--ease),transform .16s var(--ease),visibility 0s;
}


/* ══════════════════════════════════ ۱۹. نوار شناور مقایسه
   app.js وقتی حداقل یک کالا انتخاب شده باشد این نوار را می‌سازد. بالای نوار
   پایینِ موبایل می‌نشیند تا رویش نیفتد. */
.cmp-bar{
  position:fixed;z-index:860;
  inset-inline:16px;inset-block-end:16px;
  display:none;align-items:center;gap:10px;
  padding:10px 12px;
  background:var(--c-dark);color:var(--c-on-dark);
  border-radius:var(--r-lg);box-shadow:var(--sh-3);
}
.cmp-bar.is-on{display:flex}
.cmp-bar .cmp-n{flex:1 1 auto;min-width:0;font-size:15px;font-weight:500}
.cmp-bar .cmp-x{
  flex:none;width:32px;height:32px;
  display:grid;place-items:center;border-radius:var(--r-full);
  color:var(--c-on-dark-2);font-size:20px;line-height:1;
}
.cmp-bar .cmp-x:hover{background:rgba(255,255,255,.10);color:#fff}
@media (min-width:900px){
  .cmp-bar{inset-inline:auto 24px;inset-block-end:24px;min-width:320px}
}
@media (max-width:899px){
  .cmp-bar{inset-block-end:calc(var(--mbar-h,62px) + 12px + env(safe-area-inset-bottom,0px))}
}


/* ══════════════════════════ ۲۰. کانال دومِ فروش روی محصولِ قیمت‌دار */
.buybox-alt{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:8px;margin-block-start:10px;
}
.buybox-alt .btn{min-height:44px;font-size:15px}
.buybox-alt:only-child,
.buybox-alt:has(.btn:only-child){grid-template-columns:minmax(0,1fr)}


/* ══════════════════════════════════════════ ۲۱. احترام به کاهش حرکت */
@media (prefers-reduced-motion:reduce){
  .pcard,.pcard-img img,.btn,.to-top,.grp{transition:none !important}
}


/* ══════════════════════════════════════ ۲۲. لیست‌باکسِ مرتب‌سازی
   با <details>/<summary> ساخته شده نه <select>: قابلِ استایل، بدونِ
   جاوااسکریپت، و گزینه‌ها لینکِ واقعی‌اند. */
.sortdd{position:relative;flex:0 0 auto;min-width:0}
.sortdd > summary{
  display:flex;align-items:center;gap:8px;
  min-height:42px;padding:0 14px;
  background:var(--c-surface);
  border:1px solid var(--c-line);border-radius:var(--r-md);
  font-size:15px;cursor:pointer;list-style:none;white-space:nowrap;
}
.sortdd > summary::-webkit-details-marker{display:none}
.sortdd-k{color:var(--c-ink-3)}
.sortdd-v{font-weight:700;color:var(--c-ink)}
.sortdd > summary svg{width:15px;height:15px;stroke-width:2;color:var(--c-ink-3);transition:transform var(--t-fast)}
.sortdd[open] > summary{border-color:var(--c-primary)}
.sortdd[open] > summary svg{transform:rotate(180deg)}
.sortdd-menu{
  position:absolute;z-index:60;inset-block-start:calc(100% + 6px);
  inset-inline-start:0;min-width:190px;
  display:flex;flex-direction:column;padding:6px;
  background:var(--c-surface);
  border:1px solid var(--c-line);border-radius:var(--r-md);
  box-shadow:var(--sh-2);
}
.sortdd-menu a{
  padding:9px 12px;border-radius:var(--r-sm);
  font-size:15px;color:var(--c-ink-2);white-space:nowrap;
}
.sortdd-menu a:hover{background:var(--c-bg);color:var(--c-ink)}
.sortdd-menu a.is-active{background:var(--c-primary-soft);color:var(--c-primary-dark);font-weight:700}


/* ══════════════════════════════════ ۲۳. نوارِ رنگیِ برندِ بوش
   «سوپرگرافیک» رسمیِ بوش. عمداً فقط دو جا و فقط ۴ پیکسل: زیرِ هدر و بالای
   فوتر. بیشتر از این، خسته‌کننده و ارزان می‌شود. */
.bosch-strip{
  height:4px;width:100%;flex:none;
  background:linear-gradient(90deg,
    #8E2B34 0%, #E4002B 12%, #C8102E 20%, #7B3F98 34%,
    #1E4B8F 46%, #0079C1 58%, #00A0D2 68%, #00A651 80%,
    #6CBE45 90%, #A8CF45 100%);
}


/* ══════════════════════════════════════════════ ۲۴. فوتر
   الگو: Hashnode / Loopa — ستونِ ساده، تیترِ تیرهٔ پررنگ، لینکِ کم‌رنگ.

   ⚠ عمداً «ساده» است. دو نسخهٔ قبلی جاه‌طلبانه بودند و هر بار شکستند:
     آکاردئونِ تاشو (موبایل به‌هم ریخت) و بعد پنلِ شناور با margin منفی +
     ردیف‌های کارتی (ستونِ تماس دو برابرِ بقیه بلند شد و فوتر پر از فضای
     خالی). حالا هر چهار ستون یک جنس دارند: تیتر + فهرستِ لینک. همین.
     هیچ موقعیتِ منفی، هیچ کارت، هیچ ارتفاعِ ثابت.
*/
/* ── نوارِ بیرونی: زمینهٔ تیره‌رنگ که کارت رویش شناور است ───────────────
   الگوی Hashnode: فوتر یک «کارت» است، نه یک نوارِ تمام‌عرض. زمینهٔ پشتش
   کمی تیره‌تر از بدنهٔ سایت است تا لبهٔ کارت دیده شود. */
.ftr{
  background:var(--c-line-2);
  margin-block-start:var(--sec-gap);
  padding-block:clamp(20px,3vw,40px);
  color:var(--c-ink-2);
}

/* ── کارتِ فوتر ─────────────────────────────────────────────────────────
   دو شستشوی گرادیانِ خیلی ملایم در دو گوشهٔ مقابل: قرمزِ بوش بالا-شروع،
   سبزآبی پایین-پایان. هر دو rgba با آلفای ۰٫۰۵‌اند — در اسکرین‌شات به‌زور
   دیده می‌شوند ولی کارت را از «سفیدِ تخت» درمی‌آورند.
   ⚠ overflow:hidden لازم است تا نوارِ رنگیِ برند به گوشهٔ گردِ کارت بریده
     شود، وگرنه از لبه بیرون می‌زند. */
.ftr-card{
  position:relative;overflow:hidden;
  border-radius:var(--r-xl);
  border:1px solid var(--c-line);
  padding:clamp(24px,3.4vw,48px) clamp(18px,3vw,44px) clamp(18px,2.4vw,28px);
  /* ⚠ هر گرادیان عمداً روی یک خط: بازرسِ طراحی (checkdesign.py) خطِ حاوی
     «gradient» را می‌سنجد و اجازه را از دیدنِ rgba/transparent در همان خط
     می‌گیرد. شکستنِ اعلان به چند خط، آن را «گرادیانِ پررنگ» می‌شمرد. */
  background:
    radial-gradient(120% 90% at 100% 0%, rgba(var(--c-primary-rgb),.06) 0%, rgba(var(--c-primary-rgb),0) 58%),
    radial-gradient(110% 80% at 0% 100%, rgba(var(--c-trust-rgb),.06) 0%, rgba(var(--c-trust-rgb),0) 58%),
    var(--c-surface);
  box-shadow:var(--sh-1);
}
/* نوارِ رنگیِ برند، لبهٔ بالای کارت */
.ftr-card > .bosch-strip{
  position:absolute;inset-block-start:0;inset-inline:0;
  height:5px;
}

.ftr-grid{
  display:grid;
  grid-template-columns:minmax(0,1.6fr) repeat(3, minmax(0,1fr));
  gap:clamp(22px,3vw,40px);
  align-items:start;                 /* ستونِ بلند بقیه را کش نیاورد */
}
.ftr-col{min-width:0}
.ftr-col h3,
.ftr-sub h3{font-size:16px;font-weight:700;color:var(--c-ink);margin-block-end:14px}
.ftr-col h3::after,
.ftr-sub h3::after{
  content:"";display:block;
  width:22px;height:3px;border-radius:2px;
  background:var(--c-primary);margin-block-start:7px;
}
.ftr-col ul{display:flex;flex-direction:column;gap:11px}
.ftr-col ul li{margin:0;min-width:0}
.ftr-col ul a{
  display:inline-flex;align-items:center;gap:7px;
  font-size:15px;line-height:1.7;color:var(--c-ink-2);
}
.ftr-col ul a:hover{color:var(--c-primary)}
.ftr-col ul svg{width:16px;height:16px;flex:none;color:var(--c-primary)}
.ftr-col--stack{display:flex;flex-direction:column;gap:24px}

/* برند */
.ftr-logo{
  display:inline-flex;padding:8px 12px;
  background:var(--c-bg);border:1px solid var(--c-line-2);border-radius:var(--r-md);
}
.ftr-logo img{height:38px;width:auto;object-fit:contain}
.ftr-about{margin-block-start:14px;max-width:42ch;font-size:15px;line-height:1.95}
.ftr-social{display:flex;gap:8px;flex-wrap:wrap;margin-block-start:16px}
.ftr-social a{
  width:38px;height:38px;display:grid;place-items:center;
  background:var(--c-bg);border:1px solid var(--c-line);
  border-radius:var(--r-md);color:var(--c-ink-2);
}
.ftr-social a:hover{border-color:var(--c-primary);color:var(--c-primary)}
.ftr-social svg{width:18px;height:18px;stroke-width:1.8}
.ftr-badges{
  display:inline-flex;gap:8px;margin-block-start:14px;padding:8px;
  background:var(--c-bg);border:1px solid var(--c-line-2);border-radius:var(--r-md);
}

/* تماس — شماره‌ها پررنگ، نشانی متنِ ساده */
.ftr-contact .tel-link{font-weight:700;color:var(--c-primary);unicode-bidi:isolate}
.ftr-contact .tel-link:hover{color:var(--c-primary-dark)}
.ftr-addr{display:flex;align-items:flex-start;gap:7px}
.ftr-addr svg{width:16px;height:16px;flex:none;margin-block-start:4px;color:var(--c-ink-3)}
.ftr-addr address{font-style:normal;font-size:15px;line-height:1.85;color:var(--c-ink-2)}

/* نوارِ پایین */
.ftr-bottom{
  display:flex;align-items:center;justify-content:space-between;
  gap:14px;flex-wrap:wrap;
  margin-block-start:var(--sp-6);padding-block-start:var(--sp-4);
  border-block-start:1px solid var(--c-line);
  font-size:15px;color:var(--c-ink-3);
}
.ftr-bottom p{margin:0}
.ftr-bottom-links{display:flex;align-items:center;gap:18px;flex-wrap:wrap}
.ftr-bottom-links > a{color:var(--c-ink-2)}
.ftr-bottom-links > a:hover{color:var(--c-primary)}
.ftr-credit a{color:var(--c-ink);font-weight:700}
.ftr-credit a:hover{color:var(--c-primary)}

@media (max-width:1023px){
  .ftr-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:26px 22px}
  .ftr-brand{grid-column:1 / -1}
}
@media (max-width:639px){
  .ftr{padding-block:14px}
  .ftr-card{border-radius:var(--r-lg);padding:22px 16px 16px}
  .ftr-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:24px 16px}
  .ftr-brand,.ftr-contact{grid-column:1 / -1}
  .ftr-bottom{flex-direction:column;gap:8px;text-align:center;justify-content:center}
  .ftr-bottom-links{justify-content:center;gap:14px}
  /* فاصلهٔ امن زیرِ نوارِ تماسِ چسبان */
  .ftr{padding-block-end:calc(var(--mbar-h,68px) + 20px + env(safe-area-inset-bottom,0px))}
}


/* ══════════════════════════════ ۲۵. نوارِ تماسِ چسبانِ موبایل
   جای پنج آیتمِ ناوبری، دو دکمهٔ بزرگِ تماس. هدرِ چسبان ناوبری را دارد؛
   این نوار فقط برای اقدام است.

   ⚠ کلاسش عمداً «callbar» است نه «mobile-bar»: قواعدِ نوارِ پنج‌آیتمیِ قبلی
     در nav.css §۸ هنوز هستند و «.mobile-bar a{height:var(--mbar-h)}» روی
     دکمه‌های جدید هم می‌افتاد. با نامِ جدا هیچ‌چیز ارث نمی‌رسد.
   ⚠ --mbar-h همچنان «تنها منبعِ حقیقتِ ارتفاع» است — .to-top و .cmp-bar و
     پدینگِ پایینِ فوتر از آن فاصله می‌گیرند. */
.callbar{
  display:none;
  position:fixed;inset-inline:0;inset-block-end:0;z-index:880;
  gap:8px;padding:8px 12px calc(8px + env(safe-area-inset-bottom,0px));
  background:var(--c-surface);
  border-block-start:1px solid var(--c-line);
  box-shadow:0 -4px 20px rgba(16,22,28,.08);
}
.callbar .mb-call{
  flex:1 1 auto;min-width:0;
  display:flex;align-items:center;justify-content:center;gap:9px;
  min-height:52px;padding:0 14px;
  background:var(--c-primary);color:#fff;
  border-radius:var(--r-md);
}
.callbar .mb-call svg{width:21px;height:21px;flex:none;stroke-width:2}
.callbar .mb-t{display:flex;flex-direction:column;line-height:1.25;min-width:0}
.callbar .mb-t i{font-style:normal;font-size:15px;font-weight:400;opacity:.9}
.callbar .mb-t b{font-size:17px;font-weight:700;unicode-bidi:isolate}
.callbar .mb-wa{
  flex:0 0 auto;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
  min-width:74px;min-height:52px;padding:0 10px;
  background:var(--c-trust-soft);color:var(--c-success);
  border:1px solid rgba(var(--c-trust-rgb),.28);
  border-radius:var(--r-md);
  font-size:15px;font-weight:700;
}
.callbar .mb-wa svg{width:20px;height:20px;stroke-width:1.9}
@media (max-width:900px){
  .callbar{display:flex}
  /* ۵۲ دکمه + ۸ بالا + ۸ پایین */
  :root{--mbar-h:68px}
}

/* ==== mobile.css ==== */

/* ==========================================================================
   اصلاحات موبایل — آخرین فایل CSS در هدر، پس برندهٔ تداخل‌هاست.
   به همین دلیل عمداً «لاغر» است: هرچه اینجا بنویسیم، هر فایلِ دیگری را
   خاموش می‌کند و اشکال‌زدایی را سخت می‌کند.

   ⚠ قانون این فایل: فقط چیزی اینجا می‌آید که *هیچ فایل دیگری نمی‌تواند
   بگوید*. چیدمانِ هدر موبایل (nav.css §۶)، کارت محصول (card.css) و صفحهٔ
   محصول (product.css) خودشان مدیای موبایل دارند و اینجا تکرار نمی‌شوند.
   تکرارشان قبلاً باعث شده بود دو فایل سرِ یک عدد دعوا کنند.
   ========================================================================== */

@media (max-width:900px){

  /* ارتفاع‌های هدر. --header-h در nav.css از این‌ها calc می‌شود
     (--mainbar-h + --navbar-h + --msearch-h)، پس خودِ --header-h اینجا
     بازنویسی نمی‌شود؛ اگر بشود، ستون‌های چسبانِ بقیهٔ صفحات زیر هدر گیر
     می‌کنند. .navbar در این عرض مخفی است ⇒ صفر. */
  :root{--topbar-h:34px;--mainbar-h:58px;--navbar-h:0px;--sp-7:32px;--sp-8:44px}

  body{font-size:15px}
  .container{padding:0 12px}
  .section{padding-block:var(--sp-6)}
  .section-head{margin-bottom:var(--sp-4)}

  /* تیترها عمداً کوچک نمی‌شوند: app.css از clamp() استفاده می‌کند
     (h1 ۲۵→۳۸ / h2 ۲۱→۳۰) و کفِ آن دقیقاً همان چیزی است که برای موبایل
     می‌خواهیم. نسخهٔ قبلی اینجا h1 را ۲۰px و h2 را ۱۸px می‌کرد و clamp را
     بی‌اثر می‌گذاشت — یعنی تیترِ موبایل از حداقلِ خوانایی هم پایین‌تر می‌رفت. */
  .lead{font-size:15px}
  .prose,.article{font-size:15px;line-height:2.05}
  .article h2{font-size:21px}
  .article h3{font-size:18px}

  /* لوگو در موبایل ۳۰٪ کوچک‌تر: ۵۰→۳۵ و در حالتِ جمع‌شده ۳۶→۲۵.
     mobile.css آخرین فایل است، پس بر nav.css §۶ برنده می‌شود. */
  .logo img{height:35px}
  .site-header.is-stuck .logo img{height:25px}

  /* نوار بالایی بیرون از هدرِ چسبان است و با اسکرول برای همیشه بالا می‌رود؛
     فقط لینک‌های منو حذف می‌شوند تا شماره تماس یک لمسِ راحت فاصله بگیرد. */
  .topbar-links{display:none}
  .topbar-start{gap:0}
  .topbar--nophone{display:none}

  /* ورود و علاقه‌مندی در نوار پایینِ موبایل هستند؛ در هدر فقط سبد می‌ماند.
     «پشتیبانی» هم مخفی می‌شود چون همان کار را دکمهٔ «تماس» در نوار پایین
     انجام می‌دهد و دو CTAِ تماس در یک صفحه، هر دو را ضعیف می‌کند.
     (چیدمان دو-ردیفهٔ هدر خودش در nav.css §۶ است و اینجا دست‌کاری نمی‌شود.) */
  .header-cta,.hact--user,.hact--wish,.hact--help{display:none}

  /* کارت‌های عمومی. کارتِ محصول (.pcard) عمداً اینجا نیست — اندازهٔ عنوان،
     قیمت و دکمه‌اش در card.css تعریف شده و تکرارِ اینجا فقط با آن می‌جنگید. */
  .card,.card-lg{padding:var(--sp-4);border-radius:var(--r-md)}

  /* لمس راحت‌تر: هدف کلیک حداقل ۴۴px */
  .btn{min-height:46px}
  .btn-sm{min-height:44px}
  .chip{padding:9px 15px}

  /* ریل‌ها لبه‌به‌لبه اسکرول شوند.
     ⚠ .sort-opts عمداً از این فهرست بیرون است: آیتمِ فلکسِ داخلِ .sortbar است و
     حاشیهٔ منفی، آن را ۲۴ پیکسل از ظرفش پهن‌تر می‌کرد و کل ستون را می‌ترکاند. */
  .rail,.chip-rail,.related-rail,.grp-rail{
    margin-inline:-12px;padding-inline:12px;
  }
  /* هر ظرفِ اسکرول‌شونده باید بتواند باریک شود، وگرنه به‌جای اسکرولِ داخلی،
     والدش را پهن می‌کند و صفحه از عرض بیرون می‌زند. */
  .rail,.chip-rail,.related-rail,.grp-rail,
  .coll-main,.coll-results,.sortbar,.quick-filters{min-width:0;max-width:100%}

  .site-footer{margin-bottom:8px}
}

@media (max-width:639px){
  /* ستون‌های چندتایی به یک ستون */
  .coll-layout,.cart-layout,.blog-layout,.acct-layout{grid-template-columns:minmax(0,1fr)}
  .home-seo .prose{columns:1}

  /* نوار برندها در موبایل کمی جمع‌تر */
  .brand-logo{min-width:158px;height:74px;padding:10px 12px}
  .brand-mono{width:38px;height:38px;font-size:16px}

  /* .product-top زیر ۸۶۰px در product.css به flex-column تبدیل می‌شود تا
     ترتیبِ گالری → عنوان → باکس خرید درست دربیاید؛ اینجا grid-template-columns
     دادن آن را خنثی می‌کرد. */

  /* باکس‌های داخلی صفحه محصول */
  .p-section{padding:var(--sp-4) 14px}
  /* زیر هدر چسبان بنشیند — عدد ثابت با ارتفاع واقعی هدر هم‌خوان نبود */
  .p-tabs{border-radius:var(--r-md);padding:4px;top:var(--header-h)}
  .p-tabs a{padding:9px 14px;font-size:15px}

  .summary{border-radius:var(--r-md)}

  /* بردکرامب: به‌جای شکستن خط، افقی اسکرول شود */
  .breadcrumb{overflow-x:auto;min-width:0;scrollbar-width:none;white-space:nowrap}
  .breadcrumb::-webkit-scrollbar{display:none}
  .breadcrumb ol{flex-wrap:nowrap}

  /* صفحه‌بندی جمع‌وجور */
  .pagination a,.pagination span{min-width:38px;height:38px;font-size:15px}
}

/* زیر ~۶۰۰px ساعت کاری جا نمی‌شود و متن را می‌شکند؛ فقط شماره تماس می‌ماند */
@media (max-width:599px){
  :root{--topbar-h:32px}
  .topbar-start{display:none}
  .topbar .container{justify-content:center}
  .bc-links{grid-template-columns:minmax(0,1fr)}
}

@media (max-width:400px){
  .product-grid{gap:10px}
  .btn-lg{min-height:48px;font-size:15px;padding:0 18px}
}

/* ---------- دکمه بازگشت به بالا ---------- */
.to-top{
  position:fixed;inset-block-end:24px;inset-inline-start:20px;z-index:870;
  width:44px;height:44px;border-radius:var(--r-full);
  display:grid;place-items:center;
  background:var(--c-surface);border:1px solid var(--c-line);
  color:var(--c-ink-2);box-shadow:var(--sh-2);
  opacity:0;visibility:hidden;transform:translateY(10px);
  transition:all var(--t-slow);
}
.to-top.is-visible{opacity:1;visibility:visible;transform:none}
.to-top svg{width:20px;height:20px;stroke-width:2}

/* بالای نوار پایینِ موبایل بنشیند. عمداً !important ندارد و از --mbar-h
   (nav.css) می‌خواند: product.css با body:has(.sticky-buy.is-visible) این
   دکمه را بالاتر می‌برد و !important آن قاعده را از کار می‌انداخت. */
@media (max-width:900px){
  .to-top{inset-block-end:calc(var(--mbar-h,62px) + 12px + env(safe-area-inset-bottom,0px))}
}

/* ---------- صفحه‌های خیلی بلند: بهبود پیمایش ---------- */
@media (max-width:900px) and (prefers-reduced-motion:no-preference){
  /* کارت حالا یک خطِ «وضعیت اعتماد» بیشتر دارد؛ عددِ قبلی (۲۷۰) کوتاه بود و
     مرورگر موقعِ اسکرول ارتفاع را اصلاح می‌کرد ⇒ پرشِ چیدمان. */
  .pcard{contain-intrinsic-size:305px}
}

/* ==========================================================================
   لایهٔ برندِ «بوش تهران» در موبایل
   bosch.css قبل از این فایل لود می‌شود، پس هر قاعدهٔ برندی که در موبایل باید
   برنده باشد اینجاست — نه آنجا. (همان دامی که در iranboschcenter خورده بودیم.)
   ۹۰٪ ترافیک این سایت موبایل است، پس این بلوک «حاشیه» نیست؛ حالتِ اصلی است.
   ========================================================================== */
@media (max-width:900px){

  /* نوار بالاییِ تیره: زیر ۶۰۰px فقط شمارهٔ تماس می‌ماند و وسط‌چین می‌شود
     (mobile.css §۵۹۹). روی زمینهٔ تیره باید کاملاً سفید و درشت‌تر باشد تا
     به یک «دکمهٔ تماس» تمام‌عرض شبیه شود، نه یک خطِ تزئینی. */
  .topbar{background:var(--c-dark)}
  .topbar-contact a{color:#fff;font-weight:700;letter-spacing:.01em}
  .topbar-contact svg{color:var(--c-primary)}

  /* قابِ عکس در کارتِ باریکِ موبایل نباید ۱۰px حاشیهٔ داخلی بگیرد؛
     روی کارتِ ۱۶۴ پیکسلیِ ریل، عکس را به یک تمبر تبدیل می‌کرد. */
  .pcard-img{margin:6px 6px 0;padding:6px}
  .pcard-flags{inset-block-start:12px;inset-inline-start:12px}
  .pcard-quick{inset-block-start:12px;inset-inline-end:12px}

  /* «موجود در فروشگاه · قیمت تلفنی» در دو ستونِ موبایل دو خط می‌شود و
     ارتفاع کارت‌ها را نامساوی می‌کند. یک خط، با بریدنِ نرم. */
  .pcard-trust{
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
    display:flex;
  }
  .pcard-trust span{overflow:hidden;text-overflow:ellipsis}

  /* برچسبِ دکمهٔ کارت در عرضِ کم نباید بشکند */
  .pcard-cta{min-height:44px}
  .pcard-cta .t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

  /* هیرو، کارت دسته و جدول مقایسه — نسخهٔ موبایل در همان فایلِ برند
     تعریف شده‌اند (bosch.css §۱۱٫۵ تا ۱۱٫۷) چون آنجا مدیای اختصاصی دارند
     و اینجا فقط چیزی می‌آید که واقعاً باید بعد از bosch.css برنده شود. */

  /* دکمهٔ مقایسه روی کارتِ باریکِ موبایل جا را از برچسبِ دکمهٔ اصلی می‌گیرد */
  .pcard-cmp{width:38px}
  .pcard-actions{gap:5px}

  /* خطِ قرمزِ بالای تیترها در موبایل جمع‌تر */
  .section-head h2::before,
  .sec-title::before,
  .home-sec > h2::before{width:28px;height:3px;margin-block-end:8px}
}

  /* ریلِ گروه‌ها: کاشیِ جمع‌تر تا سه‌تا در عرضِ گوشی دیده شود و کاربر
     بفهمد ادامه دارد (لبهٔ چهارمی پیدا باشد). */
  .grp{width:114px;padding:12px 8px}
  .grp-ic{width:54px;height:54px}
  .grp b{font-size:15px}

  /* چیپ‌های فیلترِ سریع: یک ردیفِ افقیِ اسکرول‌شونده، نه شکستن به چند خط.
     این‌ها مهم‌ترین کنترلِ صفحهٔ دسته روی موبایل‌اند («فقط چیزهایی که
     قیمت دارند») و نباید زیرِ دکمهٔ فیلتر گم شوند. */
  .quick-filters{
    flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;
    margin-inline:-12px;padding-inline:12px;
  }
  .quick-filters::-webkit-scrollbar{display:none}
  .chip--toggle{flex:0 0 auto;min-height:38px;padding:8px 14px}

  /* دو دکمهٔ «سفارش تلفنی / واتس‌اپ» زیر دکمهٔ سبد، کنار هم می‌مانند */
  .buybox-alt{gap:6px}
}

@media (max-width:479px){
  /* در دو ستونِ خیلی باریک، آیکنِ خطِ اعتماد جا را می‌گیرد و متن را می‌بُرد */
  .pcard-trust svg{display:none}
  .pcard-trust{gap:0}
}


/* ==========================================================================
   اصلاحات موبایلِ دورِ آخر
   ========================================================================== */
@media (max-width:900px){

  /* ── بردکرامب ──────────────────────────────────────────────────────────
     نوارِ افقیِ اسکرول‌شونده روی گوشی بد بود: کاربر نمی‌فهمید ادامه دارد و
     زنجیرهٔ چهارتایی («خانه › گروه › دسته › محصول») نصفه دیده می‌شد.
     روی موبایل فقط یک لینکِ «بازگشت به والد» می‌ماند — همان کاری که کاربر
     واقعاً با بردکرامب می‌کند. زنجیرهٔ کامل در DOM می‌ماند (سئو و
     BreadcrumbList دست‌نخورده) و فقط بصری پنهان می‌شود. */
  .breadcrumb{overflow:visible;white-space:normal}
  .breadcrumb ol{flex-wrap:nowrap;gap:4px}
  .breadcrumb li{display:none}
  .breadcrumb li:nth-last-child(2){
    display:flex;align-items:center;gap:6px;
    font-size:15px;font-weight:500;
  }
  .breadcrumb li:nth-last-child(2)::before{
    content:"‹";
    font-size:19px;line-height:1;color:var(--c-ink-3);
  }
  .breadcrumb li:nth-last-child(2) a{color:var(--c-ink-2)}

  /* ── مرتب‌سازی ────────────────────────────────────────────────────────
     لیست‌باکس تمام‌عرض تا با دکمهٔ فیلتر یک ردیفِ مرتب بسازد. */
  .sortbar{flex-wrap:wrap;gap:8px}
  .sortdd{flex:1 1 100%}
  .sortdd > summary{justify-content:space-between;width:100%}
  .sortdd-menu{inset-inline:0;min-width:0}

  /* ── هر دو شماره در موبایل هم می‌مانند ────────────────────────────────
     روی سایتی که تبدیلِ اصلی‌اش تماس است، هیچ‌کدام نباید حذف شود. فقط
     برچسبِ زیرِ عدد («مشاوره و سفارش») می‌رود تا نوار یک‌خطی بماند. */
  /* هر دو شماره می‌مانند، تک‌خطی و جمع. دکمهٔ قرمزِ هدر در موبایل مخفی
     است (فضا نیست) ولی نوارِ پایین دکمهٔ «تماس» دارد، پس شمارهٔ موبایل
     در سه جا در دسترس است: همین‌جا، نوارِ پایین، و فوتر. */
  .topbar-contact{gap:0}
  .tcall{padding:0 8px;gap:5px}
  .tcall svg{width:14px;height:14px}
  .tcall-t b{font-size:15px}
}

/* ── نوارِ رنگیِ بوش روی موبایل نازک‌تر ───────────────────────────────── */
@media (max-width:639px){
  .bosch-strip{height:3px}
}
