/* ===== فونت Vazirmatn — میزبانیِ محلی (فاز ۱۳۹) =====
   قبلاً از fonts.googleapis.com می‌آمد: یک <link> رندر-بلاکینگ به سرور گوگل،
   به‌علاوه ۱۲ فایل woff2 (۶ وزن × ۲ زیرمجموعه) = ~۴۷۳ کیلوبایت.
   حالا فونتِ *متغیر* است: همان بازه‌ی وزن ۴۰۰..۹۰۰ در ۲ فایل، ~۷۹ کیلوبایت
   برای یک کاربر فارسی‌زبان. ظاهر عوض نمی‌شود — فونت متغیر همان مستری است
   که وزن‌های ثابت از آن تولید می‌شوند.
   دلیل اصلیِ محلی‌کردن فقط حجم نیست: این پروژه سابقه‌ی مستند دارد که سرویس‌های
   گوگل از ایران غیرقابل‌اتکا هستند (فاز ۱۰ و ۵۱) و آن <link> رندرِ اولِ صفحه
   را بلاک می‌کرد.
   نامِ فایل‌ها نسخه‌دار است (v16) پس /fonts با max-age یک‌ساله سرو می‌شود.
   مجوز: SIL OFL 1.1 — متن کامل در public/fonts/OFL.txt
   ===================================================== */
  /* arabic */
  @font-face{
    font-family:'Vazirmatn';
    font-style:normal;
    font-weight:400 900;
    font-display:swap;
    src:url(/fonts/vazirmatn-v16-arabic.woff2) format('woff2');
    unicode-range:U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
  }
  /* latin-ext */
  @font-face{
    font-family:'Vazirmatn';
    font-style:normal;
    font-weight:400 900;
    font-display:swap;
    src:url(/fonts/vazirmatn-v16-latin-ext.woff2) format('woff2');
    unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
  }
  /* latin */
  @font-face{
    font-family:'Vazirmatn';
    font-style:normal;
    font-weight:400 900;
    font-display:swap;
    src:url(/fonts/vazirmatn-v16-latin.woff2) format('woff2');
    unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
  }

  :root{
    /* کنتراستِ بیشتر (درخواستِ مالک): متنِ اصلی سفیدِ واقعی، متن‌هایِ فرعی روشن‌تر، زمینه عمیق‌تر و کارت‌ها جداتر */
    --bg:#0E0C0B; --surface:#1C1815; --surface-2:#26201C; --surface-3:#332B26;
    --border:#3A312B; --border-strong:#54473E;
    --text-primary:#FFFFFF; --text-secondary:#DCD3CA; --text-tertiary:#BFB2A6;
    --red:#EF2B35; --red-hover:#CB242D; --red-deep:#A81E26; --red-text-soft:#FF8A82; --red-soft:#301412;
    --gold:#E2B65C; --gold-text-soft:#EFCB8C; --gold-soft:#332510;
    --success:#10B981; --success-soft:#0F2A22; --success-text:#5EEAB8;
    --warning:#E0A93E; --warning-soft:#332510; --warning-text:#E8C481;
    --info:#5B9BD1; --info-soft:#15222E; --info-text:#8FC1E8;
    /* S1 — نمودارهایِ کابینِ مدیر: دوره‌یِ جاری / دوره‌یِ قبل (جفتِ رنگ با validate_palette در هر دو تم پاس شده) */
    --chart-cur:#EF2B35; --chart-prev:#5B9BD1;
    --cat-1:#3987e5; --cat-2:#d95926; --cat-3:#199e70; --cat-4:#c98500; /* پالتِ مرجعِ dataviz، اعتبارسنجی‌شده رویِ سطحِ تیره */
    --purple:#9B7FE0; --purple-soft:#241E36; --purple-text:#C3B2F0;
    /* teal (فاز ۱۸) هنوز جای دیگه‌ای (آیکون گروه تأمین اجتماعی و...) استفاده می‌شه —
       دست‌نخورده مونده. توکن‌های «سبز سلطنتی» (فاز ۲۰، رنگ مکمل شخصی/دستیار هوشمند)
       فاز ۲۷ حذف شدن — کاربر گفت روی کار ننشسته، آواتار/دستیار هوشمند برگشتن به
       قرمز اصلی برند (همون چیزی که پیش از فاز ۱۸ بود). */
    --teal:#45B0A6; --teal-hover:#3A9A91; --teal-deep:#2F7D76; --teal-soft:#122A28; --teal-text:#7FD4C9;
    --danger-soft:#301412;
    --on-accent:#fff;
    --silver:#C9CDD6; --silver-soft:#2A2D33;
    --diamond:#8FE1F0; --diamond-soft:#12303A;
    --r-lg:20px; --r-md:14px; --r-sm:10px;
    --sidebar-w:236px;
    --font-display:'Vazirmatn', 'Segoe UI', Tahoma, sans-serif;
    --shadow-1: 0 1px 3px rgba(0,0,0,.22);
    --shadow-2: 0 6px 18px rgba(0,0,0,.32);
    --shadow-3: 0 16px 44px rgba(0,0,0,.46);
    --shadow-sm: var(--shadow-1);
    --shadow-md: var(--shadow-2);
    --shadow-lg: var(--shadow-3);
    --shadow-red: 0 10px 28px rgba(239,43,53,.42);
    --sheen: linear-gradient(180deg, rgba(255,255,255,.05), rgba(255,255,255,0) 40%);
    /* فاز ۹۰ — .r-header/.r-nav (نوار بالا/پایین موبایل) قبلاً یه rgba تیره‌ی هاردکد
       داشتن (نه وابسته به تم) — همیشه تیره می‌موندن حتی تو تمِ روشن. الان از این
       توکن می‌خونن؛ مقدارش دقیقاً هم‌رنگ --bg با آلفا برای افکت شیشه‌ای backdrop-blur. */
    --glass-bg: rgba(14,12,11,.92);
    --ease-out: cubic-bezier(.16,.84,.44,1);
    --sp-1:4px; --sp-2:8px; --sp-3:16px; --sp-4:24px; --sp-5:32px; --sp-6:48px; --sp-7:64px;
    /* فاز ۴۳ — «رنگ و لعاب» درخواستی، از همون جفت‌رنگ برند موجود (قرمز+طلایی) ساخته شده،
       نه یه رنگ جدید و بیگانه — برای حس ریزتعامل‌ها (فشردن دکمه، اسکلتون لودینگ،
       نشان دستاورد)، جایی که فقط خودِ قرمز یا خودِ طلایی به‌تنهایی کافی نبود. */
    --gradient-brand: linear-gradient(135deg, var(--red) 0%, var(--gold) 100%);

    /* ---- Persian motif system: gره‌چینی/تذهیب-inspired decorative layer, kept subtle
       and always additive to the palette above — see PERSIAN MOTIF SYSTEM section. ---- */
    --gold-line: rgba(226,182,92,.8);
    --pattern-girih: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='44' height='44' viewBox='0 0 44 44'%3E%3Cg fill='none' stroke='%23E2B65C' stroke-width='.8'%3E%3Crect x='9' y='9' width='26' height='26'/%3E%3Crect x='9' y='9' width='26' height='26' transform='rotate(45 22 22)'/%3E%3C/g%3E%3C/svg%3E");
    --pattern-girih-fine: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='26' height='26' viewBox='0 0 26 26'%3E%3Cg fill='none' stroke='%23F6F0E8' stroke-width='.7'%3E%3Crect x='5' y='5' width='16' height='16'/%3E%3Crect x='5' y='5' width='16' height='16' transform='rotate(45 13 13)'/%3E%3C/g%3E%3C/svg%3E");
    --motif-medallion: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='360' height='360' viewBox='0 0 360 360'%3E%3Cg fill='none' stroke='%23E2B65C'%3E%3Ccircle cx='180' cy='180' r='150' stroke-width='1.4'/%3E%3Ccircle cx='180' cy='180' r='128' stroke-width='1'/%3E%3Crect x='95' y='95' width='170' height='170' stroke-width='1.3'/%3E%3Crect x='95' y='95' width='170' height='170' transform='rotate(45 180 180)' stroke-width='1.3'/%3E%3Ccircle cx='180' cy='180' r='40' stroke-width='1.3'/%3E%3C/g%3E%3C/svg%3E");
    --motif-rosette-muted: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 48 48'%3E%3Cg fill='none' stroke='%23A29283'%3E%3Ccircle cx='24' cy='24' r='19' stroke-width='1'/%3E%3Crect x='12' y='12' width='24' height='24' stroke-width='1'/%3E%3Crect x='12' y='12' width='24' height='24' stroke-width='1' transform='rotate(45 24 24)'/%3E%3Ccircle cx='24' cy='24' r='5.5' stroke-width='1'/%3E%3C/g%3E%3C/svg%3E");
    /* بته‌جقه (boteh/paisley) — traced from a real vector illustration the user
       supplied (EPS from a CorelDRAW source), not hand-plotted. Parsed the EPS's own
       PostScript path operators (m/l/c/@c) directly into this SVG path — the earlier
       from-scratch attempts (hand-guessed beziers, then a computed teardrop+spiral)
       both still read as amateurish once actually on screen; this is the real thing.
       Renders filled with evenodd so the concentric bands in the source art show up
       correctly. Used once on the login screen, flanking the medallion. */
    --motif-boteh: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='614' height='1000' viewBox='0 0 614 1000'%3E%3Cpath fill='none' stroke='%23E2B65C' stroke-width='5.5' stroke-linejoin='round' d='M364 787C345 802 320 808 293 805C226 795 188 703 188 621C187 586 192 549 200 513C209 477 222 442 239 408C241 414 244 419 246 423C272 480 304 525 335 569C386 641 405 673 401 713C401 719 400 725 398 731C393 754 381 773 364 787Z M292 588L292 588C284 577 275 565 268 553L245 519L239 560C231 610 233 653 245 690C253 717 269 754 299 759C318 762 333 756 343 742C358 723 356 693 347 675C333 643 312 615 292 588Z M408 517L408 517C380 477 349 435 327 385C285 290 311 199 319 179C226 221 138 389 113 492C103 535 98 579 98 622C99 744 162 876 279 893L280 893L281 894C332 901 381 888 420 857C453 830 476 794 486 752C488 742 490 731 491 721C497 648 464 596 408 517Z M391 821L391 821C363 844 326 854 287 848L287 848C194 835 144 725 144 622C143 582 148 542 157 502C175 428 210 357 257 298C260 335 270 371 286 405C311 458 341 501 371 543C423 618 450 659 445 717C445 725 443 733 441 741C434 774 416 801 391 821Z M349 559L349 559C319 516 288 471 262 416L243 371L241 367L239 371L226 395C207 432 192 470 183 509C174 546 170 584 170 622C171 711 213 811 291 822C322 826 352 819 375 800C395 784 409 762 415 735C417 728 418 721 419 714C423 668 403 635 349 559Z M439 495L439 495C412 456 383 416 362 369C339 321 333 266 346 214C353 183 368 154 388 131L405 111L379 116C330 126 281 152 242 190C162 267 103 371 76 483C65 529 60 576 60 622C61 761 136 912 276 931C337 940 397 924 443 887C483 855 511 811 523 761C526 749 528 736 529 724C537 633 491 569 439 495Z M432 872L432 872C389 906 335 921 278 913C148 895 79 753 78 622C78 577 83 532 94 487C120 379 177 278 254 203C285 174 321 152 358 140C344 161 334 185 328 210C315 266 321 325 345 377C367 425 396 466 424 506C474 577 518 638 510 722C509 734 508 745 505 756C494 803 469 843 432 872Z M587 729L587 729C597 617 541 538 487 462C461 425 434 386 415 344C385 282 395 205 438 163C471 130 526 127 568 150C573 153 614 178 608 156C606 144 594 133 586 124C460 0 304 49 201 148C75 270 0 447 1 623C3 787 95 965 268 989C345 1000 420 980 480 932C541 884 580 810 587 729Z M460 907L460 907C407 949 341 967 272 958C117 936 34 773 33 623C32 456 103 287 223 171C296 101 405 59 500 103C468 104 439 117 415 140C363 192 351 283 386 358C406 402 434 442 461 480C514 555 564 626 555 726C549 798 514 864 460 907Z'/%3E%3C/svg%3E");
    --ease-ornament: cubic-bezier(.65,0,.35,1);

    /* ---- Kashi/تخت‌جمشید/قالی escalation (richer color, بنا به درخواست کاربر) ----
       A third accent family (turquoise/cobalt — the classic Persian tilework palette)
       layered on TOP of the existing red/gold, never replacing it. Used at meaningfully
       higher opacity than the first motif pass — this round is deliberately "پررنگ‌تر". */
    --tile-turquoise:#12A0A0; --tile-turquoise-soft:#0E2B2C; --tile-turquoise-text:#5FD6D2;
    --tile-cobalt:#2C5C99; --tile-cobalt-soft:#132234;
    /* Revision 2: the filled-diamond kashi tile + hard crenellation border + dotted
       spandrels above read as busy/toy-like once actually rendered — three stacked
       decorative systems competing at once. Replaced with ONE quieter, monoline,
       two-color (gold+turquoise) lattice — outline only, no fills, no dots — plus a
       refined corner flourish. Crenellation is dropped entirely (kept as dead code
       nowhere — the class below is simply unused now, not deleted, in case a future
       session wants a single very-restrained instance of it somewhere new). */
    --pattern-kashi: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='52' height='52' viewBox='0 0 52 52'%3E%3Cg fill='none' stroke-width='.5'%3E%3Cpath d='M26 4 L48 26 L26 48 L4 26 Z' stroke='%23E2B65C'/%3E%3Ccircle cx='26' cy='26' r='3.5' stroke='%2312A0A0'/%3E%3C/g%3E%3C/svg%3E");
    --pattern-crenel: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='16' viewBox='0 0 40 16'%3E%3Cpath d='M0 16 L0 6 L5 6 L5 0 L10 0 L10 6 L15 6 L15 0 L20 0 L20 6 L25 6 L25 0 L30 0 L30 6 L35 6 L35 0 L40 0 L40 16 Z' fill='%23E2B65C' fill-opacity='.6'/%3E%3C/svg%3E");
    /* قالی corner flourish (لچک) — pure fine linework in two colors, no filled dots. */
    --motif-spandrel: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='60' height='60' viewBox='0 0 60 60'%3E%3Cg fill='none'%3E%3Cpath d='M2 58 Q2 24 24 13 Q42 4 58 2' stroke='%23E2B65C' stroke-width='1'/%3E%3Cpath d='M2 58 Q8 30 26 21' stroke='%2312A0A0' stroke-width='.8' opacity='.75'/%3E%3C/g%3E%3C/svg%3E");
  }

  /* ============ فاز ۸۵ — تم روز (لایت‌مود) ============
     توکن‌های :root بالا (تاریک) عمداً دست‌نخورده موندن و هنوز پیش‌فرض واقعی‌ان — این
     بلوک فقط زیرمجموعه‌ای از توکن‌ها رو، وقتی <html data-theme="light"> باشه، override
     می‌کنه (public/index.html's applyTheme() این attribute رو ست می‌کنه، نه CSS
     media query — چون این یه انتخاب صریح کاربره تو تنظیمات، نه ترجیح سیستم‌عامل).
     پس‌زمینه‌ها عمداً خاکستریِ روشن‌ان، نه سفید خالص (تأکید صریح کاربر) — کارت‌ها فقط
     یه پله روشن‌تر از پس‌زمینه‌ی صفحه، نه سفیدِ تخت. --red/--gold و بقیه‌ی رنگ‌های
     «solid» (که رو دکمه/آیکون‌های پررنگ استفاده می‌شن، نه پس‌زمینه‌ی نرم) دست‌نخورده
     می‌مونن — هویت بصری RAMA مستقل از تمه. فقط جفت‌های soft-bg/text-soft (که رو تم
     تاریک برای «چیپ کم‌رنگ» طراحی شدن — پس‌زمینه‌ی تیره‌ی رنگی + متن روشن‌رنگ) باید
     برعکس بشن (پس‌زمینه‌ی خیلی‌روشن‌رنگی + متن تیره‌رنگ)، وگرنه رو پس‌زمینه‌ی روشن
     غیرقابل‌خوندن می‌شن. */
  :root[data-theme='light']{
    /* فاز ۹۰ — کاربر گزارش داد تمِ روشن هنوز خیلی کم‌رنگ/نزدیک به سفیده؛ خواست خاکستری
       تیره‌تری استفاده بشه. مقادیر --bg تا --border-strong یه پله (تقریباً ۱۵-۲۰
       واحد luminance) تیره‌تر شدن — همچنان قطعاً «روشن»، ولی خاکستریِ محسوس‌تر، نه
       نزدیک به سفید خالص (که از فاز ۸۵ هم عمداً پرهیز شده بود). */
    --bg:#D6D8DC; --surface:#E4E6E9; --surface-2:#DADDE1; --surface-3:#CCD0D5;
    --border:#C0C4CA; --border-strong:#A3A8AF;
    --text-primary:#1B1D22; --text-secondary:#54575F; --text-tertiary:#787B84;
    --glass-bg: rgba(214,216,220,.92); /* فاز ۹۰ — نوار بالا/پایین موبایل، هم‌رنگ --bg */

    /* فاز ۹۱ — کاربر گزارش داد ترنج/نقوش فارسی (girih/medallion/boteh) تو تم روشن بد
       می‌افتادن — علتش این بود که این‌ها SVG data-URIهای ثابتن (نه رنگی که بشه با
       var() داخلشون کنترل کرد)، همیشه با طلایی روشنِ %23E2B65C (طراحی‌شده برای زمینه‌ی
       تقریباً مشکی) رسم می‌شدن، صرف‌نظر از تم. این‌جا نسخه‌ی رنگِ عوض‌شده‌ی همون ۴ الگو
       (با %238A6410 — همون --gold-text-soft تمِ روشن، و برای نسخه‌ی «fine»ی
       نزدیک‌به‌سفیدِ قدیم، %23787B84 — همون --text-tertiary تمِ روشن) override شدن. */
--pattern-girih: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='44' height='44' viewBox='0 0 44 44'%3E%3Cg fill='none' stroke='%238A6410' stroke-width='.8'%3E%3Crect x='9' y='9' width='26' height='26'/%3E%3Crect x='9' y='9' width='26' height='26' transform='rotate(45 22 22)'/%3E%3C/g%3E%3C/svg%3E");
--pattern-girih-fine: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='26' height='26' viewBox='0 0 26 26'%3E%3Cg fill='none' stroke='%23787B84' stroke-width='.7'%3E%3Crect x='5' y='5' width='16' height='16'/%3E%3Crect x='5' y='5' width='16' height='16' transform='rotate(45 13 13)'/%3E%3C/g%3E%3C/svg%3E");
--motif-medallion: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='360' height='360' viewBox='0 0 360 360'%3E%3Cg fill='none' stroke='%238A6410'%3E%3Ccircle cx='180' cy='180' r='150' stroke-width='1.4'/%3E%3Ccircle cx='180' cy='180' r='128' stroke-width='1'/%3E%3Crect x='95' y='95' width='170' height='170' stroke-width='1.3'/%3E%3Crect x='95' y='95' width='170' height='170' transform='rotate(45 180 180)' stroke-width='1.3'/%3E%3Ccircle cx='180' cy='180' r='40' stroke-width='1.3'/%3E%3C/g%3E%3C/svg%3E");
--motif-boteh: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='614' height='1000' viewBox='0 0 614 1000'%3E%3Cpath fill='none' stroke='%238A6410' stroke-width='5.5' stroke-linejoin='round' d='M364 787C345 802 320 808 293 805C226 795 188 703 188 621C187 586 192 549 200 513C209 477 222 442 239 408C241 414 244 419 246 423C272 480 304 525 335 569C386 641 405 673 401 713C401 719 400 725 398 731C393 754 381 773 364 787Z M292 588L292 588C284 577 275 565 268 553L245 519L239 560C231 610 233 653 245 690C253 717 269 754 299 759C318 762 333 756 343 742C358 723 356 693 347 675C333 643 312 615 292 588Z M408 517L408 517C380 477 349 435 327 385C285 290 311 199 319 179C226 221 138 389 113 492C103 535 98 579 98 622C99 744 162 876 279 893L280 893L281 894C332 901 381 888 420 857C453 830 476 794 486 752C488 742 490 731 491 721C497 648 464 596 408 517Z M391 821L391 821C363 844 326 854 287 848L287 848C194 835 144 725 144 622C143 582 148 542 157 502C175 428 210 357 257 298C260 335 270 371 286 405C311 458 341 501 371 543C423 618 450 659 445 717C445 725 443 733 441 741C434 774 416 801 391 821Z M349 559L349 559C319 516 288 471 262 416L243 371L241 367L239 371L226 395C207 432 192 470 183 509C174 546 170 584 170 622C171 711 213 811 291 822C322 826 352 819 375 800C395 784 409 762 415 735C417 728 418 721 419 714C423 668 403 635 349 559Z M439 495L439 495C412 456 383 416 362 369C339 321 333 266 346 214C353 183 368 154 388 131L405 111L379 116C330 126 281 152 242 190C162 267 103 371 76 483C65 529 60 576 60 622C61 761 136 912 276 931C337 940 397 924 443 887C483 855 511 811 523 761C526 749 528 736 529 724C537 633 491 569 439 495Z M432 872L432 872C389 906 335 921 278 913C148 895 79 753 78 622C78 577 83 532 94 487C120 379 177 278 254 203C285 174 321 152 358 140C344 161 334 185 328 210C315 266 321 325 345 377C367 425 396 466 424 506C474 577 518 638 510 722C509 734 508 745 505 756C494 803 469 843 432 872Z M587 729L587 729C597 617 541 538 487 462C461 425 434 386 415 344C385 282 395 205 438 163C471 130 526 127 568 150C573 153 614 178 608 156C606 144 594 133 586 124C460 0 304 49 201 148C75 270 0 447 1 623C3 787 95 965 268 989C345 1000 420 980 480 932C541 884 580 810 587 729Z M460 907L460 907C407 949 341 967 272 958C117 936 34 773 33 623C32 456 103 287 223 171C296 101 405 59 500 103C468 104 439 117 415 140C363 192 351 283 386 358C406 402 434 442 461 480C514 555 564 626 555 726C549 798 514 864 460 907Z'/%3E%3C/svg%3E");

    --red-text-soft:#B0242E; --red-soft:#FBE3E1;
    --gold-text-soft:#8A6410; --gold-soft:#FAF0DA;
    --success-soft:#DFF4EB; --success-text:#0D7A53;
    --warning-soft:#FAF0DA; --warning-text:#976808;
    --info-soft:#E2EDF9; --info-text:#2C6BA3;
    --chart-cur:#EF2B35; --chart-prev:#2C6BA3;
    --cat-1:#2a78d6; --cat-2:#eb6834; --cat-3:#1baf7a; --cat-4:#eda100; /* روشن: کنتراستِ زیرِ ۳:۱ ⇒ هر قطعه برچسبِ متنی و درصد دارد */
    --purple-soft:#ECE7FA; --purple-text:#6A4DC3;
    --teal-soft:#DFF3F0; --teal-text:#1F7A70;
    --danger-soft:#FBE3E1;
    --silver-soft:#ECEEF1; --diamond-soft:#E1F5F9;

    --shadow-1: 0 1px 3px rgba(20,22,26,.09);
    --shadow-2: 0 6px 18px rgba(20,22,26,.11);
    --shadow-3: 0 16px 44px rgba(20,22,26,.15);
    --shadow-sm: var(--shadow-1);
    --shadow-md: var(--shadow-2);
    --shadow-lg: var(--shadow-3);
    --shadow-red: 0 10px 28px rgba(239,43,53,.24);
    --sheen: linear-gradient(180deg, rgba(0,0,0,.035), rgba(0,0,0,0) 40%);
  }

  @media (prefers-reduced-motion: reduce){
    *, *::before, *::after{ animation-duration:.001ms !important; animation-iteration-count:1 !important; transition-duration:.001ms !important; scroll-behavior:auto !important; }
  }
  *{box-sizing:border-box;}
  html,body{margin:0;padding:0;background:var(--bg);}
  #rama-root{
    font-family:var(--font-display);
    direction:rtl; color:var(--text-primary);
    /* فاز ۹۱ — کاربر خواست تم اصلی (تاریک) یه براقیتِ خاص با حس لاکچری بگیره، خصوصاً
       زمینه‌ی تقریباً مشکی‌ش — یه هاله‌ی طلاییِ خیلی‌کم‌رنگ از بالا (مثل نورِ ملایمِ
       نمایشگاه) + یه های‌لایتِ ظریف رو لبه‌ی بالایی صفحه، هر دو زیرِ آستانه‌ی حواس‌پرتی
       (کمتر از ۵٪ opacity). تمِ روشن چون تأکید کاربر رو «خصوصاً مشکی» بود، این لایه‌ها
       رو تو override پایین ندارن — فقط رنگ خاکستریِ صافش می‌مونه. */
    background:
      radial-gradient(ellipse 1100px 700px at 50% -8%, rgba(226,182,92,.055), transparent 62%),
      linear-gradient(180deg, rgba(255,255,255,.025), transparent 260px),
      var(--bg);
    /* فاز ۴۹ — کاربر Vazirmatn رو نگه داشت (فونت‌های دقیق دیجی‌کالا/اسنپ لایسنس‌دار و
       رایگان-برای-CDN نیستن)، فقط خواست وزن/سایز حرفه‌ای‌تر بشه: سایز پایه ۱۴.۵→۱۵px،
       و مهم‌تر، وزن پیش‌فرض متن از ۴۰۰ (Regular) به ۵۰۰ (Medium) رفت — دقیقاً همون
       حسی که اپ‌های حرفه‌ای فارسی (مثل دیجی‌کالا با IRANYekan Medium) دارن؛ کلاس‌هایی
       که خودشون وزن صریح دارن (اکثر تیتر/برچسب‌ها) دست‌نخورده می‌مونن، این فقط
       پیش‌فرضِ متن معمولیه.
    */
    min-height:100vh; position:relative; font-size:15px; line-height:1.72; font-weight:500; -webkit-font-smoothing:antialiased;
    font-variant-numeric:tabular-nums; font-feature-settings:'tnum' 1, 'ss01' 1;
  }
  /* فاز ۹۱ — براقیتِ لاکچریِ بالا فقط برای تمِ تاریک بود («خصوصاً مشکی»)؛ تمِ روشن
     همون خاکستریِ صافِ --bg رو نگه می‌داره، بدون این لایه‌های اضافه. */
  :root[data-theme='light'] #rama-root{ background:var(--bg); }
  ::selection{ background:var(--red-hover); color:var(--on-accent); }
  button{ font-family:inherit; cursor:pointer; color:inherit; }
  input,select,textarea{ font-family:inherit; }
  button:focus-visible, input:focus-visible, select:focus-visible{ outline:2px solid var(--red); outline-offset:1px; }
  a{ text-decoration:none; }
  svg{ display:block; }

  /* ============ PERSIAN MOTIF SYSTEM ============
     Girih (گره‌چینی) line patterns + تذهیب-style corner ornaments + a ترنج medallion
     watermark — layered on TOP of the existing dark/red/gold palette, never replacing
     it. Every pattern layer is pointer-events:none and sits behind real content
     (isolation:isolate + ::before z-index:-1 keeps it from leaking into other cards'
     stacking order). Kept low-opacity by design — "ظریف و مدرن", not decoration for
     its own sake. Extends the existing aiGlow/slideUp/fadeDown/spin animation
     vocabulary rather than replacing it. */
  /* فاز ۴۵ — کاربر خواست همین هویت (طلا/قرمز + نقوش فارسی) خیلی پررنگ‌تر/جسورانه‌تر
     بشه، نه یه جهت بصری جدید. این عدد‌ها نسخه‌ی سوم تشدیدن (فاز ۱۸ اولین بار، فاز ~۲۰
     یه بار «رنگ و لعاب بیشتر» بود، این‌بار صریحاً «جسورانه» — پس جهش این‌بار بزرگ‌تره،
     نه فقط چند صدم). */
  .r-motif-bg{ position:relative; isolation:isolate; }
  .r-motif-bg::before{
    content:''; position:absolute; inset:0; z-index:-1; pointer-events:none;
    background-image:var(--pattern-girih); background-repeat:repeat; opacity:.18;
  }
  .r-motif-bg.light::before{ background-image:var(--pattern-girih-fine); opacity:.14; }
  .r-motif-bg.breathing::before{ animation:patternPulse 9s ease-in-out infinite; }

  .r-medallion-watermark{ position:relative; isolation:isolate; overflow:hidden; }
  .r-medallion-watermark::after{
    content:''; position:absolute; z-index:-1; pointer-events:none; width:560px; height:560px;
    top:50%; right:-140px; transform:translateY(-50%); background-image:var(--motif-medallion);
    background-repeat:no-repeat; background-size:contain; opacity:.20; animation:medallionFloat 14s ease-in-out infinite;
  }
  /* بته‌جقه flanking the medallion on the opposite side — same idea, one static
     instance (a slow float would read as two things fighting for attention; only the
     central medallion breathes/moves). A REAL element, not another ::before —
     .r-motif-bg already owns ::before and .r-medallion-watermark already owns ::after
     on this same login screen; a third pseudo-element slot doesn't exist, so this one
     is an actual <div> in the markup instead (see renderLogin). */
  .r-boteh-mark{
    position:absolute; z-index:-1; pointer-events:none; width:230px; height:375px;
    top:50%; left:15px; transform:translateY(-50%); background-image:var(--motif-boteh);
    background-repeat:no-repeat; background-size:contain; opacity:.20;
  }
  /* فاز ۴۶ — کاربر با تست واقعی رو موبایل پیدا کرد: همین دو نقش پس‌زمینه (مدالیون +
     بته‌جقه)، رو یه صفحه‌ی باریک موبایل، اونقدر بزرگ/پررنگ بودن که مستقیم رو لوگو و
     متن می‌افتادن و «قاطی» به‌نظر می‌رسیدن. اولین رفع خیلی محتاطانه بود («خوبه ولی
     جسورانه‌تر» — فاز ۴۷)؛ این‌ها اندازه‌ی نهایی‌ان: به‌اندازه‌ای بزرگ که واقعاً دیده
     بشن، ولی نه اونقدر که رو لوگو/متن بیفتن (فاصله‌شون از مرکز صفحه بیشتر شده، نه
     فقط سایزشون کمتر). */
  @media (max-width:480px){
    .r-medallion-watermark::after{ width:420px; height:420px; opacity:.17; right:-160px; }
    .r-boteh-mark{ width:170px; height:280px; opacity:.16; left:-10px; }
  }

  .r-ornament-corner{ position:absolute; top:10px; left:10px; width:32px; height:32px; color:var(--gold-line); opacity:.8; pointer-events:none; }
  .r-ornament-corner path, .r-ornament-corner circle{ stroke-dasharray:60; stroke-dashoffset:60; transition:stroke-dashoffset .7s var(--ease-ornament); }
  .r-group-card:hover .r-ornament-corner path, .r-group-card:hover .r-ornament-corner circle,
  .r-service-grid-card:hover .r-ornament-corner path, .r-service-grid-card:hover .r-ornament-corner circle,
  .r-package-card:hover .r-ornament-corner path, .r-package-card:hover .r-ornament-corner circle,
  .r-card:hover .r-ornament-corner path, .r-card:hover .r-ornament-corner circle{ stroke-dashoffset:0; }
  /* login box and the wallet balance card aren't hover targets themselves, so their
     corner ornament draws itself in once, shortly after the card's own entrance —
     same stroke-drawing technique. Both are also key "first look" trust moments, so
     it's drawn by default rather than waiting for an interaction that may never come. */
  .r-login-box .r-ornament-corner path, .r-login-box .r-ornament-corner circle,
  .r-balance-card .r-ornament-corner path, .r-balance-card .r-ornament-corner circle{ animation:ornamentDraw 1s .35s var(--ease-ornament) both; }
  @keyframes ornamentDraw{ to{ stroke-dashoffset:0; } }

  /* ---- Kashi/تخت‌جمشید/قالی escalation — richer, more colorful pass on top of the
     quieter system above (کاربر خواست «رنگ و لعاب بیشتر»). Turquoise+cobalt kashi tile
     pattern, a Persepolis crenellation border strip, and a two-color (gold+turquoise)
     carpet corner spandrel on all four corners instead of one thin gold line. ---- */
  .r-kashi-bg{ position:relative; isolation:isolate; }
  .r-kashi-bg::before{
    content:''; position:absolute; inset:0; z-index:-1; pointer-events:none;
    background-image:var(--pattern-kashi); background-repeat:repeat; opacity:.10;
  }
  .r-kashi-bg.bold::before{ opacity:.15; }

  /* Crenellation border is unused for now (read as a hard "toy castle" edge in
     practice) — class kept, defined, harmless; nothing currently applies it. */
  .r-crenel-top, .r-crenel-bottom{ position:relative; }
  .r-crenel-top::before, .r-crenel-bottom::after{
    content:''; position:absolute; right:0; left:0; height:12px; pointer-events:none;
    background-image:var(--pattern-crenel); background-repeat:repeat-x; background-size:32px 12px; opacity:.85;
  }
  .r-crenel-top::before{ top:-1px; }
  .r-crenel-bottom::after{ bottom:-1px; transform:scaleY(-1); }

  .r-spandrel{ position:relative; }
  .r-spandrel-corner{
    position:absolute; width:34px; height:34px; pointer-events:none; opacity:.8;
    background-image:var(--motif-spandrel); background-repeat:no-repeat; background-size:contain;
  }
  .r-spandrel-corner.tl{ top:10px; left:10px; }
  .r-spandrel-corner.tr{ top:10px; right:10px; transform:scaleX(-1); }
  .r-spandrel-corner.bl{ bottom:10px; left:10px; transform:scaleY(-1); }
  .r-spandrel-corner.br{ bottom:10px; right:10px; transform:scale(-1,-1); }

  /* S1 — فقط در اولین رندرِ هر صفحه (#rama-root.r-enter، index.html: pageKey)، نه با هر render؛ و backwards نه both —
     fill-modeِ both بعد از پایان transform:none را نگه می‌داشت و بالاآمدن/چرخشِ هاورِ همین کارت‌ها را خاموش می‌کرد. */
  #rama-root.r-enter .r-stagger > *{ animation:staggerFadeUp .5s var(--ease-out) backwards; }
  #rama-root.r-enter .r-stagger > *:nth-child(1){ animation-delay:.02s; } #rama-root.r-enter .r-stagger > *:nth-child(2){ animation-delay:.07s; }
  #rama-root.r-enter .r-stagger > *:nth-child(3){ animation-delay:.12s; } #rama-root.r-enter .r-stagger > *:nth-child(4){ animation-delay:.17s; }
  #rama-root.r-enter .r-stagger > *:nth-child(5){ animation-delay:.22s; } #rama-root.r-enter .r-stagger > *:nth-child(6){ animation-delay:.27s; }
  #rama-root.r-enter .r-stagger > *:nth-child(n+7){ animation-delay:.32s; }

  .r-sheen-sweep{ position:relative; overflow:hidden; }
  .r-sheen-sweep::after{
    content:''; position:absolute; inset:0; pointer-events:none;
    background:linear-gradient(115deg, transparent 40%, rgba(255,255,255,.22) 50%, transparent 60%);
    background-size:220% 100%; background-position:120% 0; transition:background-position .6s var(--ease-out);
  }
  .r-sheen-sweep:hover::after{ background-position:-20% 0; }

  @keyframes staggerFadeUp{ from{ opacity:0; transform:translateY(10px); } to{ opacity:1; transform:translateY(0); } }
  @keyframes patternPulse{ 0%,100%{ opacity:.035; } 50%{ opacity:.06; } }
  @keyframes medallionFloat{ 0%,100%{ transform:translateY(-50%) rotate(0deg); } 50%{ transform:translateY(-52%) rotate(1.2deg); } }

  /* ============ APP FRAME ============ */
  .r-app{ max-width:480px; margin:0 auto; position:relative; padding-bottom:84px; }
  @media (min-width:1024px){
    .r-app{ max-width:none; margin:0; padding-bottom:0; display:flex; min-height:100vh; }
  }

  /* ============ SIDEBAR (desktop only) ============ */
  .r-sidebar{ display:none; }
  @media (min-width:1024px){
    /* تاریخچه‌ی این بخش: نسخه‌ی اول (فاز ۱۵/۱۶) سایدبار flex-item واقعیِ .r-app بود، پس
       باز/بسته‌شدنش کل .r-col-main رو reflow می‌کرد — کاربر گفت «یک‌دفعه شیفت می‌شه».
       نسخه‌ی دوم (فاز ۱۷) سایدبار رو position:fixed کرد تا محتوا اصلاً reflow نشه — ولی
       نتیجه‌ش این بود که حالت بازشده روی محتوا می‌نشست/می‌پوشوندش، که کاربر بازم دوست
       نداشت. این نسخه (فاز ۱۹) دقیقاً چیزی‌ه که کاربر خواست: برگشت به flex-item واقعی
       (محتوا واقعاً reflow می‌شه، نه پوشونده می‌شه) ولی با transition روی همون عرض —
       چون .r-col-main کنارش flex:1 داره، فلکس‌باکس اندازه‌ش رو هر فریم از انیمیشن‌عرض
       سایدبار دوباره حساب می‌کنه، پس محتوا هم‌زمان و نرم «کوچک/بزرگ» می‌شه، نه یک‌دفعه. */
    .r-sidebar{
      display:flex; flex-direction:column; flex:0 0 72px; width:72px; height:100vh; position:sticky; top:0;
      background:var(--surface); border-left:1px solid var(--border); padding:20px 16px; box-shadow:4px 0 20px rgba(0,0,0,.25);
      /* باگ واقعی دیگه: قبلاً هیچ overflow نداشت — با تعداد آیتم‌های نوار کناری که این
         نشست بهش اضافه شد (تا ۱۱ آیتم برای نقش معرف)، محتوا رو صفحه‌های با ارتفاع معمولی
         از ۱۰۰vh رد می‌شد و هیچ راهی برای اسکرول/دیدن بقیه‌ش نبود. */
      overflow-y:auto; overflow-x:hidden; overscroll-behavior:contain;
      /* هم flex-basis هم width رو transition می‌دیم — کاربر تأیید کرد hover ساده‌ی
         رنگی (رو آواتار) درست کار می‌کنه ولی این عرض هیچ‌وقت عوض نمی‌شد؛ یعنی مشکل
         خودِ :hover/mouseenter نبود (که تو فاز ۲۲ به mouseenter واقعی سوییچ شد)، بلکه
         چیزی خاصِ خودِ سایز فلکس این المانه. flex-basis رو یه فلکس‌آیتم مستقیم‌تر و
         قابل‌اعتمادتر از width (که باید اول به flex-basis ترجمه بشه) رعایت می‌شه. */
      transition:flex-basis .3s var(--ease-out), width .3s var(--ease-out);
    }
    /* جمع‌شدن/بازشدن خودکار با هاور — نه دستی. جمع‌شده (فقط آیکون) پیش‌فرضه تا بیشترین
       فضا به محتوا بدیم؛ با بردن موس روی سایدبار خودش باز می‌شه.
       باگ واقعی پیدا‌شده (فاز ۲۲): با CSS خالص `:hover` رو خودِ `.r-sidebar`، تو مرورگر
       واقعی کاربر عرض اصلاً تغییر نمی‌کرد — نه فقط «حس بد»، بلکه هیچ تغییری، حتی بعد از
       رفع کامل مشکل cache سرویس‌ورکر. به‌جای گشتن دنبال یه علت مبهم CSS/مرورگر که نمی‌شد
       از راه دور تشخیصش داد، رفتیم سراغ یه مکانیزم قابل‌اعتمادتر: به‌جای `:hover` روی
       این المان، یه کلاس `.expanded` با mouseenter/mouseleave واقعی (JS) روش می‌شینه —
       این با DOM event واقعی کار می‌کنه، نه cascade خزنده‌ی CSS، پس دیگه به هیچ رفتار
       خاص مرورگر/موقعیت (sticky و...) وابسته نیست. */
    .r-sidebar.expanded{ flex-basis:var(--sidebar-w); width:var(--sidebar-w); }
  }
  /* اسکرول‌بار نازک و هم‌رنگ پالت تیره‌ی اپ — اولین اسکرول‌بار سفارشی این فایل،
     چون سایدبار اولین جایی‌ه که واقعاً اسکرول واقعی لازم داره. */
  .r-sidebar::-webkit-scrollbar{ width:6px; }
  .r-sidebar::-webkit-scrollbar-track{ background:transparent; }
  .r-sidebar::-webkit-scrollbar-thumb{ background:var(--surface-3); border-radius:99px; }
  .r-sidebar::-webkit-scrollbar-thumb:hover{ background:var(--border-strong); }
  .r-sb-logo{ display:flex; flex-direction:column; align-items:center; text-align:center; gap:4px; padding:10px 6px 16px; }
  .r-sb-logo img{ width:44px;height:44px;border-radius:12px;flex-shrink:0;object-fit:cover;background:#000; margin-bottom:6px; box-shadow:var(--shadow-sm); }
  .r-sb-logo b{ font-size:16px; font-weight:700; }
  .r-sb-logo-tagline{ font-size:10.5px; color:var(--text-tertiary); }
  .r-wordmark{ font-family:var(--font-display); font-weight:900; letter-spacing:2px; font-size:16px !important; background:linear-gradient(120deg, var(--text-primary) 35%, var(--gold-text-soft)); -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; position:relative; }
  /* باگ واقعی پیدا‌شده (فاز ۲۵): این المان‌ها خودشون padding/border/margin ثابت داشتن
     (خط قبلی)، و یه رول جدای دیگه هم padding/margin/border-width رو با max-height هم‌زمان
     انیمیشن می‌داد — با اسکرین‌شات واقعی کاربر تأیید شد که نتیجه‌ش یه نوار «نصفه» بود
     (ارتفاع نهایی درست به محتوای واقعی نمی‌رسید)، برخلاف لیبل آیتم‌های منو (که فقط
     opacity+max-width ساده دارن و کاملاً درست کار می‌کنن). رفعش: به‌جای انیمیشن‌دادن
     ۵ پراپرتی هم‌زمان رو خودِ این باکس، یه wrapper خنثی دورش می‌ذاریم که فقط
     opacity+max-height داره (دقیقاً همون الگوی ساده‌ی logo-b/logo-tagline که ثابت‌شده
     درسته) — خودِ باکس (padding/border/margin/background) دیگه هیچ‌وقت شرطی نیست. */
  .r-sb-slogan{ font-size:10.5px; color:var(--gold-text-soft); background:var(--gold-soft); border:1px solid var(--border-strong); border-radius:var(--r-sm); padding:7px 10px; margin-bottom:16px; line-height:1.6; text-align:center; }
  .r-logo-img{ width:32px; height:32px; border-radius:9px; flex-shrink:0; object-fit:cover; background:#000; }
  .r-sb-nav{ display:flex; flex-direction:column; gap:2px; flex:1; }
  .r-sb-item{ display:flex; align-items:center; justify-content:center; gap:11px; padding:11px 0; border-radius:var(--r-sm); background:none; border:none; color:var(--text-secondary); font-size:13.5px; font-weight:500; text-align:right; }
  .r-sidebar.expanded .r-sb-item{ justify-content:flex-start; padding:11px 12px; }
  .r-sb-item svg{ width:18px; height:18px; flex-shrink:0; }
  .r-sb-item{ position:relative; transition:background .18s var(--ease-out), color .18s var(--ease-out); }
  .r-sb-item:hover{ background:var(--surface-2); color:var(--text-primary); }
  .r-sb-item.active{ background:var(--red-soft); color:var(--red-text-soft); font-weight:700; box-shadow:inset 2px 0 0 0 var(--gold-text-soft); }
  .r-sb-badge{ position:absolute; top:4px; left:4px; margin:0; background:var(--surface-3); color:var(--text-secondary); font-size:10.5px; padding:2px 7px; border-radius:var(--r-lg); font-weight:700; }
  .r-sidebar.expanded .r-sb-badge{ position:static; margin-right:auto; }
  .r-sb-item.active .r-sb-badge{ background:var(--red-hover); color:var(--on-accent); }

  /* فاز ۹۰ — کاربر خواست به‌جای باکس متنی، یه آیکون جذاب برای ورود به گفتگوی زنده.
     همون الگوی .r-sb-item (آیکون همیشه دیده می‌شه، برچسب فقط موقع باز شدن سایدبار
     با opacity/max-width ظاهر می‌شه) + گرادیان برند (--gradient-brand) + یه هاله‌ی
     پالسی ملایم رو خودِ آیکون تا واقعاً چشم‌گیر باشه، نه فقط یه دکمه‌ی ساده‌ی دیگه. */
  .r-sb-chat-btn{ display:flex; align-items:center; justify-content:center; gap:11px; width:100%; background:none; border:none; padding:10px 0; margin-top:6px; border-radius:var(--r-sm); transition:background .18s var(--ease-out); }
  .r-sidebar.expanded .r-sb-chat-btn{ justify-content:flex-start; padding:10px 12px; }
  .r-sb-chat-btn:hover{ background:var(--surface-2); }
  /* فاز ۹۱ — کاربر گفت گرادیانِ قرمز→طلایی فاز ۹۰ کافی نیست؛ خواست دقیقاً «قرمز
     سلطنتی» (رنگ اصلی برند --red، نه ترکیب با طلایی) با یه هایلایتِ سایه‌ی رنگی پشتش
     (halo) و زنده (پالس) باشه. */
  .r-sb-chat-icon{
    width:38px; height:38px; border-radius:50%; flex-shrink:0; background:linear-gradient(150deg, var(--red-hover), var(--red-deep)); color:var(--on-accent);
    display:flex; align-items:center; justify-content:center;
    box-shadow:inset 0 1px 0 rgba(255,255,255,.25), 0 4px 12px rgba(0,0,0,.32), 0 0 18px rgba(239,43,53,.45);
    animation:sbChatPulse 2.6s ease-in-out infinite;
  }
  .r-sb-chat-icon svg{ width:19px; height:19px; }
  @keyframes sbChatPulse{
    0%,100%{ box-shadow:inset 0 1px 0 rgba(255,255,255,.25), 0 4px 12px rgba(0,0,0,.32), 0 0 18px rgba(239,43,53,.45), 0 0 0 0 var(--red-soft); }
    50%{ box-shadow:inset 0 1px 0 rgba(255,255,255,.25), 0 4px 12px rgba(0,0,0,.32), 0 0 24px rgba(239,43,53,.55), 0 0 0 8px transparent; }
  }
  .r-sb-chat-btn span{ display:inline-block; opacity:0; max-width:0; overflow:hidden; white-space:nowrap; font-size:13px; font-weight:600; color:var(--text-primary); transition:opacity .3s var(--ease-out), max-width .3s var(--ease-out); }
  .r-sidebar.expanded .r-sb-chat-btn span{ opacity:1; max-width:160px; }

  /* جمع‌شده پیش‌فرضه — متن/تگ‌لاین/شعار/کارت پشتیبانی مخفی، فقط با هاور رو سایدبار
     (کلاً، نه تک‌تک آیتم) دوباره ظاهر می‌شن؛ هر آیتم title (تول‌تیپ بومی مرورگر) داره
     برای وقتی که جمع‌شده و جای متن نیست. */
  /* «زوم»/رشد هماهنگ به‌جای پاپ‌آپ ناگهانی — display:none نمی‌شه transition داد، پس
     به‌جاش opacity+max-height با overflow:hidden، هم‌زمان با عرض خودِ سایدبار (۰.۳s)
     رشد/جمع می‌شن. لیبل آیتم‌های منو (max-width) و لوگو (max-height) با همین الگوی
     ساده‌ی دوپراپرتی درست کار می‌کنن (تأیید‌شده با اسکرین‌شات واقعی کاربر). */
  .r-sb-logo b, .r-sb-logo-tagline{
    opacity:0; max-height:0; overflow:hidden; transition:opacity .3s var(--ease-out), max-height .3s var(--ease-out);
  }
  .r-sidebar.expanded .r-sb-logo b, .r-sidebar.expanded .r-sb-logo-tagline{ opacity:1; max-height:60px; }
  /* باگ واقعی دیگه پیدا‌شده (فاز ۲۶): wrapper شعار/کارت پشتیبانی با همین الگوی
     max-height باز هم با اسکرین‌شات واقعی کاربر «کاملاً غایب»/بریده دیده شد — یعنی
     خودِ max-height (که یه عدد سقفِ حدسی‌ه، نه ارتفاع واقعی محتوا) به‌نوعی قابل‌اعتماد
     نبود رو این دو باکس مشخص (که برخلاف لوگو/تگ‌لاین، محتوای چندخطی/متغیر دارن).
     رفعش: به‌جای max-height (عدد ثابتِ حدسی)، از grid-template-rows: 0fr→1fr استفاده
     می‌کنیم — تکنیک استاندارد و مقاوم‌تر مدرن CSS برای «جمع‌شدن به ارتفاع صفر / بازشدن
     به ارتفاع واقعی محتوا» که اصلاً نیازی به حدس‌زدن یه عدد سقف نداره، پس دیگه محدود
     به مقدار محتوای واقعی نمی‌مونه، صرف‌نظر از این‌که متن چقدر بلند/کوتاهه. */
  .r-sb-fade{
    display:grid; grid-template-rows:0fr; opacity:0;
    transition:grid-template-rows .3s var(--ease-out), opacity .3s var(--ease-out);
  }
  .r-sb-fade > *{ overflow:hidden; min-height:0; }
  .r-sidebar.expanded .r-sb-fade{ grid-template-rows:1fr; opacity:1; }
  .r-sb-item span{
    display:inline-block; opacity:0; max-width:0; overflow:hidden; white-space:nowrap;
    transition:opacity .3s var(--ease-out), max-width .3s var(--ease-out);
  }
  .r-sidebar.expanded .r-sb-item span{ opacity:1; max-width:160px; }

  /* ============ MAIN COLUMN ============ */
  .r-col-main{ flex:1; min-width:0; }

  /* ============ TOPBAR (desktop) ============ */
  .r-topbar{ display:none; }
  @media (min-width:1024px){
    .r-topbar{
      /* فاز ۷۸ — قبلاً space-between بود چون دو فرزند داشت (.r-search بی‌فایده‌ی
         حذف‌شده + .r-topbar-actions)؛ حالا که فقط یه فرزند مونده، flex-end همون
         موضع بصری قبلی (چسبیده به لبه‌ی دور از شروع، تو RTL یعنی چپ) رو حفظ می‌کنه. */
      display:flex; align-items:center; justify-content:flex-end; gap:20px;
      padding:16px 28px; border-bottom:1px solid var(--border); position:sticky; top:0; z-index:20; box-shadow:0 4px 16px rgba(0,0,0,.2); isolation:isolate;
    }
  }

  /* فاز ۶۵ — باکس سرچ بالای داشبورد. مستقل و خودکفاست: هم رو موبایل هم دسکتاپ
     داخل خودِ r-main (که پدینگ ریسپانسیوش رو از قبل داره) رندر می‌شه، و نتیجه‌ها
     رو مستقیم DOM patch می‌کنه نه render() کامل — چون render() کامل رو یه input
     متنی وسط تایپ فوکوس/مکان‌نما رو گم می‌کنه (تله‌ی مستندشده‌ی این فایل، فاز
     ۱۲/۵۰/۶۴). فاز ۷۸ — یه باکس سرچ قدیمی‌تر و بی‌فایده تو r-topbar دسکتاپ
     (.r-search، به state.searchQuery/تب کاتالوگ وابسته، بدون هیچ فیدبک زنده‌ای
     موقع تایپ) کنار همین باکس وجود داشت؛ کاربر گزارش داد «دو باکس سرچ» می‌بینه —
     اون یکی کامل حذف شد، این‌جا تنها باکس سرچ باقی‌مونده‌ست. */
  .r-dash-search{ position:relative; margin-bottom:16px; }
  .r-dash-search-box{ position:relative; }
  .r-dash-search-box input{ width:100%; background:var(--surface-2); border:1px solid var(--border-strong); border-radius:var(--r-lg); padding:13px 44px 13px 40px; color:var(--text-primary); font-size:14px; transition:border-color .15s; }
  .r-dash-search-box input:focus{ border-color:var(--red); outline:none; }
  .r-dash-search-box > svg{ position:absolute; right:15px; top:50%; transform:translateY(-50%); width:17px; height:17px; color:var(--text-tertiary); pointer-events:none; }
  .r-dash-search-clear{ position:absolute; left:8px; top:50%; transform:translateY(-50%); width:26px; height:26px; border-radius:50%; background:var(--surface-3,var(--surface)); border:none; align-items:center; justify-content:center; color:var(--text-tertiary); }
  .r-dash-search-clear svg{ width:12px; height:12px; }
  .r-dash-search-results{ display:none; position:absolute; top:calc(100% + 6px); right:0; left:0; z-index:5; background:var(--surface); border:1px solid var(--border-strong); border-radius:var(--r-md); box-shadow:var(--shadow-md); max-height:340px; overflow-y:auto; padding:6px; }
  .r-dash-search-results.open{ display:block; }
  .r-dash-search-item{ display:flex; align-items:center; gap:10px; width:100%; background:none; border:none; border-radius:var(--r-sm); padding:9px 8px; text-align:right; }
  .r-dash-search-item:hover{ background:var(--surface-2); }
  .r-dash-search-item-icon{ width:34px; height:34px; border-radius:var(--r-sm); display:flex; align-items:center; justify-content:center; flex-shrink:0; }
  .r-dash-search-item-icon svg{ width:17px; height:17px; }
  .r-dash-search-item-text{ flex:1; min-width:0; display:flex; flex-direction:column; gap:1px; }
  .r-dash-search-item-text b{ font-size:13px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .r-dash-search-item-text span{ font-size:11px; color:var(--text-tertiary); }
  .r-dash-search-item-price{ font-size:11.5px; color:var(--text-secondary); white-space:nowrap; flex-shrink:0; }
  .r-dash-search-empty{ padding:16px 10px; text-align:center; font-size:12.5px; color:var(--text-tertiary); }

  /* فاز ۱۶۱ — دکمه‌ی ورودیِ «اگه نمی‌دونی از کجا شروع کنی»، زیرِ باکسِ سرچ. */
  .r-service-finder-entry{ display:flex; align-items:center; gap:11px; width:100%; background:var(--surface-2); border:1px solid var(--border-strong); border-radius:var(--r-lg); padding:13px 15px; margin-bottom:16px; text-align:right; transition:.18s var(--ease-out); }
  .r-service-finder-entry:hover{ border-color:var(--gold-line); background:var(--surface-3); }
  .r-service-finder-entry:active{ transform:scale(.98); }
  .r-service-finder-entry-icon{ width:34px; height:34px; border-radius:50%; background:var(--gradient-brand); color:var(--on-accent); display:flex; align-items:center; justify-content:center; flex-shrink:0; }
  .r-service-finder-entry-icon svg{ width:17px; height:17px; }
  .r-service-finder-entry-text{ flex:1; font-size:13.5px; font-weight:600; }

  /* گامِ درخت‌تصمیمِ سرویس‌فایندر — هر گام یه رندرِ عمدیِ کاربرمحرکه (نه اتفاقی مثلِ
     باگِ فازِ ۱۶۰)، پس ری‌پلی‌شدنِ این انیمیشن هر بار درسته، نه باگ. */
  .r-finder-step{ animation:staggerFadeUp .32s var(--ease-out) both; }
  /* همیشه ۲ستونه — چه موبایل چه دسکتاپ، عمداً برای صفرکردنِ ریسکِ نامتقارنی؛ حداکثر
     ۴ گزینه داریم که همیشه دقیقاً ۲×۲ جفت می‌شه. */
  .r-finder-grid{ display:grid; grid-template-columns:1fr 1fr; gap:10px; }
  .r-finder-option{ display:flex; flex-direction:column; align-items:center; gap:9px; background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-md); padding:18px 10px; transition:.18s var(--ease-out); text-align:center; }
  .r-finder-option:hover{ border-color:var(--gold-line); background:var(--surface-3); transform:translateY(-2px); }
  .r-finder-option:active{ transform:scale(.96); }
  .r-finder-option-icon{ width:56px; height:56px; border-radius:50%; background:var(--gradient-brand); color:var(--on-accent); display:flex; align-items:center; justify-content:center; animation:iconFloat 5s ease-in-out infinite; }
  .r-finder-option-icon svg{ width:24px; height:24px; }
  .r-finder-option-label{ font-size:12.5px; font-weight:600; line-height:1.4; }

  .r-finder-suggestion{ display:flex; align-items:center; gap:12px; width:100%; background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-md); padding:13px 14px; margin-bottom:9px; text-align:right; transition:.18s var(--ease-out); }
  .r-finder-suggestion:hover{ border-color:var(--gold-line); background:var(--surface-3); }
  .r-finder-suggestion:active{ transform:scale(.98); }
  .r-finder-suggestion-icon{ width:42px; height:42px; border-radius:var(--r-sm); display:flex; align-items:center; justify-content:center; flex-shrink:0; }
  .r-finder-suggestion-icon svg{ width:20px; height:20px; }
  .r-finder-suggestion-text{ flex:1; min-width:0; display:flex; flex-direction:column; gap:2px; }
  .r-finder-suggestion-text b{ font-size:13.5px; }
  .r-finder-suggestion-text span{ font-size:11.5px; color:var(--text-tertiary); }

  .r-topbar-actions{ display:flex; align-items:center; gap:14px; }
  .r-bell{ position:relative; width:36px; height:36px; border-radius:50%; background:var(--surface-2); border:1px solid var(--border-strong); display:flex; align-items:center; justify-content:center; color:var(--text-secondary); }
  .r-bell svg{ width:16px; height:16px; }
  .r-bell .dot{ position:absolute; top:6px; left:8px; width:8px; height:8px; border-radius:50%; background:var(--red); border:2px solid var(--surface); }

  /* ============ Mobile header (mobile only) ============ */
  /* فاز ۴۳ — کاربر با تست واقعی رو گوشی پیدا کرد: چون viewport-fit=cover تنظیم شده
     (برای PWA لبه‌به‌لبه)، بدون این padding، نوار بالا زیر ساعت/باتری/بریدگی گوشی
     می‌رفت. env(safe-area-inset-top) صفر می‌شه رو مرورگرهایی که ازش پشتیبانی
     نمی‌کنن، پس بی‌خطره. */
  .r-header{ position:sticky; top:0; z-index:30; border-bottom:1px solid var(--border); display:flex; align-items:center; justify-content:space-between; padding:calc(14px + env(safe-area-inset-top)) 18px 14px; box-shadow:0 4px 16px rgba(0,0,0,.24); isolation:isolate; }
  /* فاز ۵۰ — کاربر گفت به‌جای بته‌جقه، طرح تذهیب (--pattern-girih موجود، همون گره‌چینی
     هندسی طلایی که .r-motif-bg هم استفاده می‌کنه) رو نوار بالا بذار — پشت محتوا
     (z-index:-1 + isolation:isolate بالا، هم‌الگو با .r-motif-bg).
     فاز ۱۵۴ (ادامه) — background/backdrop-filter هم از خودِ .r-header/.r-topbar
     به یه لایه‌ی جدا (::after) منتقل شد: کاربر گزارش داد translateZ(0) رو خودِ
     آواتار (فازِ ۱۵۴ی قبلی) کافی نبود، دایره‌ی آواتار هنوز رو گوشیِ خودش ناقص
     می‌موند. رفعِ ریشه‌ای‌تر: اگه آواتار اصلاً «فرزندِ مستقیمِ عنصری که خودش
     backdrop-filter داره» نباشه، این کلاس باگ (کلیپِ گوشه‌ی گرد زیرِ والدِ
     blur-دار) از پایه رخ نمی‌ده — پس بلور به یه لایه‌ی جدا (همیشه پشتِ محتوا)
     منتقل شد؛ خودِ .r-header/.r-topbar دیگه هیچ backdrop-filterی روی خودشون
     ندارن. عمداً ::after جدا از ::before (نه ترکیبِ توی همون یکی) — چون
     opacity:.14ی پترنِ تذهیب اگه روی همین لایه هم اعمال بشه، پس‌زمینه/بلور هم
     ۸۶٪ محو می‌شد و هدر تقریباً شیشه‌ای/ناپیدا می‌شد. */
  .r-header::before, .r-topbar::before{
    content:''; position:absolute; inset:0; z-index:-1; pointer-events:none;
    background-image:var(--pattern-girih); background-repeat:repeat; opacity:.14;
  }
  .r-header::after, .r-topbar::after{
    content:''; position:absolute; inset:0; z-index:-2; pointer-events:none;
    background-color:var(--glass-bg); -webkit-backdrop-filter:blur(14px); backdrop-filter:blur(14px);
  }
  #rama-rotate-lock{ display:none; }
  /* فاز ۴۳ (اصلاح‌شده بعد از تست واقعی): pointer:coarse/hover:none اضافه شد تا فقط
     صفحه‌ی لمسی واقعی (موبایل/تبلت) رو بگیره — یه پنجره‌ی دسکتاپ باریک با ماوس نباید
     قفل بشه، حتی اگه عرضش زیر ۱۰۲۴ و شکلش افقی باشه. */
  @media (max-width:1023px) and (orientation:landscape) and (hover:none) and (pointer:coarse){
    #rama-root{ display:none; }
    #rama-rotate-lock{ display:flex; position:fixed; inset:0; z-index:999; background:var(--bg); flex-direction:column; align-items:center; justify-content:center; gap:16px; padding:24px; text-align:center; }
    #rama-rotate-lock .r-rotate-icon{ font-size:48px; animation:ramaRotateHint 1.8s ease-in-out infinite; }
    #rama-rotate-lock .r-rotate-text{ color:var(--text-primary); font-size:15px; font-weight:600; max-width:280px; }
    @keyframes ramaRotateHint{ 0%,100%{ transform:rotate(0deg); } 50%{ transform:rotate(-90deg); } }
  }
  @media (min-width:1024px){ .r-header{ display:none; } }
  .r-brand{ display:flex; align-items:center; gap:10px; }
  .r-logo{ width:32px; height:32px; border-radius:9px; background:var(--red); display:flex; align-items:center; justify-content:center; font-weight:800; font-size:15px; color:var(--on-accent); }
  .r-brand-text{ display:flex; flex-direction:column; line-height:1.25; }
  .r-brand-text b{ font-size:14.5px; font-weight:700; }
  .r-brand-text span{ font-size:10px; color:var(--text-tertiary); }
  .r-header-actions{ display:flex; align-items:center; gap:8px; }
  .r-wallet-chip{ display:flex; align-items:center; gap:6px; color:var(--text-secondary); padding:6px 10px; font-size:12px; border:1px solid var(--gold-line); border-radius:var(--r-lg); background:var(--gold-soft); }
  .r-wallet-chip b{ color:var(--gold-text-soft); font-size:12.5px; font-weight:700; font-variant-numeric:tabular-nums; }
  /* فاز ۹۱ — ساعت زنده‌ی تهران (فاز ۷، .r-clock-chip/.r-brand-clock) از بالای
     نرم‌افزار حذف شد؛ CSS مرده‌ش هم همین‌جا حذف شد. */
  .r-admin-toggle{ border:1px solid var(--border-strong); background:transparent; color:var(--text-secondary); border-radius:var(--r-lg); padding:6px 12px; font-size:11.5px; }
  .r-admin-toggle.on{ background:var(--red-hover); border-color:var(--red-hover); color:var(--on-accent); }
  /* فاز ۲۷ — کاربر گفت رنگ مکمل (فیروزه‌ای فاز ۱۸، بعد سبز سلطنتی فاز ۲۰) روی کار
     ننشسته؛ برگشت به قرمز اصلی برند (همون چیزی که پیش از فاز ۱۸ بود) — قرمز زبان
     اصلی این اپ‌ه، همه‌جای دیگه هم همینه، پس آواتار/دستیار هوشمند دیگه هویت بصری
     مجزا و آزمایش‌نشده ندارن. */
  .r-avatar-btn{ width:34px; height:34px; padding:0; border-radius:50%; background:linear-gradient(155deg, var(--red-hover), var(--red-deep)); border:none; color:var(--on-accent); font-weight:700; font-size:13px; display:flex; align-items:center; justify-content:center; flex-shrink:0; box-shadow:var(--shadow-sm); overflow:hidden; }
  .r-avatar-btn:hover{ box-shadow:0 0 0 2px var(--red-soft); }
  /* فاز ۱۵۱ — عکسِ پروفایل، وقتی کاربر آپلود کرده باشه؛ گرادیانِ پس‌زمینه به‌عنوانِ
     پلیس‌هولدرِ لحظه‌ی لودِ عکس زیرش می‌مونه (overflow:hidden بالا گرد نگهش می‌داره). */
  .r-avatar-btn img{ width:100%; height:100%; object-fit:cover; border-radius:50%; }
  /* علتِ واقعیِ باگِ چندین‌فازیِ «دایره‌ی ناقصِ آواتارِ هدر» — بالاخره با اندازه‌گیریِ
     مستقیمِ getComputedStyle پیدا شد (نه حدس): آواتارِ هدر یه `<button>`ه
     (`.r-header .r-avatar-btn`)، ولی آواتارِ مودالِ پروفایل/حسابِ من یه `<div>`.
     دکمه‌ها به‌طور پیش‌فرضِ مرورگر یه padding دارن (مثلاً Chrome: `1px 6px` —
     نامتقارن، افقی بیشتر از عمودی) که این رول تا امروز صفر نکرده بود. چون
     `<img>` داخلش `width:100%;height:100%` می‌خوره (نسبت به content-boxِ
     والد، نه border-box)، این padding محتوا رو به یه مستطیلِ نامربع (مثلاً
     ۳۴×۳۴ منهایِ padding = ۲۲×۳۲) فشار می‌داد — و چون خودِ img هم
     border-radius:50% داره، یه مستطیلِ نامربع با این رول یه **بیضی** می‌شه،
     نه دایره؛ در حالی که پس‌زمینه‌ی قرمزِ خودِ دکمه (border-box، بدونِ اثرپذیری
     از padding) دایره‌ی کامل می‌مونه — دقیقاً همون «دایره‌ی قرمزِ کامل با یه
     بیضیِ عکسِ کوچیک‌تر وسطش» که تو اسکرین‌شات‌ها دیده می‌شد. رفع: `padding:0`
     رو خودِ `.r-avatar-btn` (بالا). دو تئوریِ قبلی (backdrop-filter/compositing)
     غلط بودن — `translateZ`ی زیر همچنان بی‌خطره، فقط دیگه نقشی تو رفع نداره. */
  .r-header .r-avatar-btn, .r-topbar .r-avatar-btn{ transform:translateZ(0); }

  /* فاز ۱۶ — پنل کاربری تاپ‌بار دسکتاپ، تنها نمایه‌ی کاربر باقی‌مانده بعد از حذف نسخه‌ی
     تکراری‌ش از ته سایدبار. یه چیپ کامل (آواتار + نام + برچسب کسب‌وکار + شورون) به‌جای
     صرفاً یه دایره‌ی کوچیک بی‌نام، تا هم جذاب‌تر باشه هم نقش «این تویی، اینجا کلیک کن
     برای پروفایل» رو واضح‌تر برسونه. */
  .r-topbar-user{
    display:flex; align-items:center; gap:9px; padding:5px 12px 5px 6px;
    background:var(--surface-2); border:1px solid var(--border-strong); border-radius:99px;
    transition:.18s var(--ease-out);
  }
  .r-topbar-user:hover{ background:var(--surface-3); border-color:var(--red); }
  .r-topbar-user-info{ display:flex; flex-direction:column; line-height:1.3; text-align:right; }
  .r-topbar-user-info b{ font-size:12.5px; font-weight:700; max-width:130px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .r-topbar-user-info span{ font-size:10px; color:var(--text-tertiary); }
  .r-topbar-user > svg{ width:12px; height:12px; color:var(--text-tertiary); flex-shrink:0; }

  /* ============ Content ============ */
  .r-main{ padding:20px 18px; }
  /* باگ واقعی پیدا‌شده از رو اسکرین‌شات کاربر: max-width:1180px بدون margin:auto —
     یعنی محتوا رو حالت RTL همیشه به لبه‌ی چسبیده به سایدبار می‌چسبید و فاصله‌ی خالی
     همیشه یه‌طرفه (لبه‌ی دور از سایدبار) می‌افتاد؛ با بزرگ‌شدن سایدبار (باز شدنش با
     هاور)، .r-col-main باریک‌تر می‌شه ولی 1180px ثابت می‌مونه، پس این نامتقارنی محسوس‌تر
     می‌شه — دقیقاً همون چیزی که کاربر «نصفه باز شدن»/فضای خالی عجیب توصیف کرد. رفع شد
     با وسط‌چین کردن محتوا، تا فضای اضافه (هرچقدرم باشه) همیشه متقارن و طبیعی به‌نظر
     برسه، نه یه گپ بزرگ یه‌طرفه. */
  @media (min-width:1024px){ .r-main{ padding:26px 28px 40px; max-width:1180px; margin:0 auto; } }
  .r-eyebrow{ font-size:10.5px; color:var(--gold-text-soft); margin-bottom:8px; font-weight:700; letter-spacing:1.4px; text-transform:uppercase; opacity:.85; }
  .r-title{ font-size:28px; font-weight:800; margin:0 0 4px; letter-spacing:-.5px; }
  .r-subtitle{ color:var(--text-secondary); font-size:13px; margin:0 0 22px; }
  .r-greet{ font-size:30px; font-weight:800; margin-bottom:5px; letter-spacing:-.5px; }
  .r-greet-sub{ color:var(--text-secondary); font-size:13px; margin-bottom:24px; }
  /* فاز ۴۳ — نشان کوچیک دستاورد (تعداد پرونده‌ی تکمیل‌شده)، رنگ طلایی که تو کل پروژه
     برای «مثبت/موفقیت جشن‌گرفته‌شده» استفاده می‌شه، نه سبز success معمولی — چون این
     یه پیام سیستمی نیست، یه تبریک شخصیه. */
  .r-achieve-chip{ display:inline-flex; align-items:center; gap:7px; background:var(--gold-soft); border:1px solid var(--gold-line); color:var(--gold-text-soft); font-size:12px; font-weight:600; padding:7px 13px; border-radius:999px; margin:-12px 0 20px; animation:fadeIn .3s var(--ease-out); }
  .r-achieve-chip svg{ width:14px; height:14px; }

  /* ============ Dashboard grid ============ */
  .r-dash-grid{ display:grid; grid-template-columns:1fr; gap:16px; }
  /* S1 — تقارنِ دسکتاپ: دو ستون هم‌قد (stretch) و آخرین کارتِ هر ستون فضایِ باقی‌مانده را پر می‌کند، تا لبه‌یِ پایینِ
     دو ستون هم‌تراز باشد (قبلاً align-items:start ⇒ ستونِ پهن زودتر تمام می‌شد و زیرش خالی می‌ماند). داشبوردِ ادمین هم
     همین گرید را دارد و کارت‌هایش هم‌قد می‌شوند. */
  @media (min-width:1024px){
    .r-dash-grid{ grid-template-columns:2fr 1.15fr; align-items:stretch; }
    .r-dash-left > :last-child, .r-dash-right > :last-child{ flex:1 1 auto; }
  }
  .r-dash-left, .r-dash-right{ display:flex; flex-direction:column; gap:16px; min-width:0; }
  /* فاز ۱۵ (کنار هم رو دسکتاپ) → فاز ۳۰ (تمام‌عرض، برای دسترسی بهتر به خدمات، دیگه
     استفاده نمی‌شه — .r-dash-row-2 حذف شد؛ رجوع به CLAUDE.md فاز ۳۰ برای جزئیات). */

  /* stat cards */
  .r-section-label{ font-size:12px; font-weight:800; color:var(--text-primary); margin:22px 0 10px; padding-right:10px; border-right:3px solid var(--red); }
  .r-section-label:first-of-type{ margin-top:20px; }

  .r-hero-today{ background:linear-gradient(155deg, var(--surface-2), var(--surface)); border:1px solid var(--border-strong); border-radius:var(--r-lg); padding:18px; margin-bottom:14px; box-shadow:var(--shadow-md); overflow:hidden; }
  .r-hero-today-head{ display:flex; align-items:center; gap:12px; margin-bottom:14px; position:relative; }
  .r-hero-icon{ width:38px; height:38px; border-radius:10px; background:var(--red-soft); color:var(--red-text-soft); display:flex; align-items:center; justify-content:center; flex-shrink:0; box-shadow:inset 0 1px 0 rgba(255,255,255,.07); position:relative; overflow:hidden; }
  .r-hero-icon svg{ width:26px; height:26px; }
  /* برق آینه‌ای خودکار (نه فقط با هاور) — hero-icon/stat-icon داخل کارت‌های غیرقابل‌کلیک
     هستن (برخلاف کارت‌های گروه/پکیج)، پس همون افکت رو یه‌بار موقع رندر خودش پخش می‌کنه،
     دقیقاً همون تکنیک ornamentDraw که login-box/balance-card از قبل استفاده می‌کنن. */
  @keyframes iconSheen{ from{ background-position:120% 0; } to{ background-position:-20% 0; } }
  .r-hero-icon::after, .r-stat-icon::after{
    content:''; position:absolute; inset:0; pointer-events:none;
    background:linear-gradient(115deg, transparent 40%, rgba(255,255,255,.4) 50%, transparent 60%);
    background-size:220% 100%; background-position:120% 0;
    animation:iconSheen 1.1s .3s var(--ease-out) both;
  }
  .r-hero-today-head b{ font-size:15px; font-weight:800; }
  .r-hero-bell{ margin-right:auto; position:relative; width:34px; height:34px; border-radius:50%; background:var(--surface-3); border:1px solid var(--border-strong); color:var(--text-secondary); display:flex; align-items:center; justify-content:center; }
  .r-hero-today-list{ display:flex; flex-direction:column; gap:8px; }
  .r-hero-today-item{ display:flex; align-items:center; gap:12px; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-sm); padding:12px 13px; width:100%; text-align:right; transition:.18s var(--ease-out); }
  .r-hero-today-item:hover{ border-color:var(--border-strong); transform:translateX(-2px); }
  .r-hero-today-empty{ display:flex; align-items:center; gap:8px; color:var(--success-text); font-size:12.5px; font-weight:600; background:var(--success-soft); border-radius:var(--r-sm); padding:12px 14px; }
  .r-hero-today-empty svg{ width:16px; height:16px; }

  .r-trust-row{ display:flex; gap:8px; margin-bottom:6px; }
  .r-trust-item{ flex:1; display:flex; align-items:center; gap:8px; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-sm); padding:9px 11px; font-size:10px; color:var(--text-tertiary); box-shadow:var(--shadow-sm); }
  .r-trust-item svg{ width:15px; height:15px; color:var(--success-text); flex-shrink:0; }
  .r-trust-item b{ display:block; font-size:11px; color:var(--text-primary); font-weight:700; }

  .r-recent-order-item{ display:flex; align-items:center; justify-content:space-between; gap:10px; width:100%; background:none; border:none; border-bottom:1px solid var(--border); padding:11px 0; text-align:right; }
  .r-recent-order-item:last-of-type{ border-bottom:none; }

  .r-stats{ display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-bottom:8px; }
  /* S1 — کابینِ مدیر: کاشی‌هایِ «نیاز به اقدام» (مرکزِ فرمان و هابِ «عملیات»). کاشیِ صفر کم‌رنگ، کاشیِ «داغ» (>۰) پررنگ. */
  .r-ops-grid{ display:grid; grid-template-columns:repeat(auto-fill, minmax(210px, 1fr)); gap:10px; }
  @media (max-width:520px){ .r-ops-grid{ grid-template-columns:1fr 1fr; } }
  .r-ops-tile{ display:flex; align-items:center; gap:12px; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:14px; text-align:right; color:inherit; font:inherit; cursor:pointer; box-shadow:var(--shadow-sm); opacity:.62; transition:opacity .15s, transform .15s, border-color .15s; min-width:0; }
  .r-ops-tile.hot{ opacity:1; border-color:var(--border-strong); }
  .r-ops-tile:hover{ opacity:1; transform:translateY(-1px); }
  .r-ops-readonly{ cursor:default; }
  .r-ops-readonly:hover{ transform:none; }
  .r-ops-icon{ width:38px; height:38px; flex-shrink:0; border-radius:var(--r-sm); display:flex; align-items:center; justify-content:center; background:var(--surface-2); color:var(--text-secondary); }
  .r-ops-text{ display:flex; flex-direction:column; min-width:0; }
  .r-ops-text b{ font-size:20px; font-weight:800; line-height:1.2; }
  .r-ops-text span{ font-size:12px; color:var(--text-secondary); }
  .r-ops-text small{ font-size:10.5px; color:var(--text-tertiary); margin-top:2px; }
  @media (min-width:560px){ .r-stats{ grid-template-columns:repeat(4,1fr); } }

  /* S1 — کابینِ مدیر (مرحله‌یِ ۳): بازه، کاشی‌هایِ KPI، نمودارِ روند، هدفِ ماهانه، جدول‌هایِ گزارش */
  @media (min-width:1024px){ .r-dash-grid.r-dash-grid-even{ grid-template-columns:1fr 1fr; } }
  .r-kpi-bar{ display:flex; align-items:center; flex-wrap:wrap; gap:8px 14px; margin:0 0 12px; }
  .r-kpi-compare{ font-size:11.5px; color:var(--text-tertiary); }
  .r-kpi-seg{ display:inline-flex; background:var(--surface-2); border:1px solid var(--border); border-radius:999px; padding:3px; gap:2px; max-width:100%; overflow-x:auto; }
  .r-kpi-seg button{ font:inherit; font-size:12px; font-weight:700; color:var(--text-secondary); background:none; border:none; border-radius:999px; padding:6px 13px; cursor:pointer; white-space:nowrap; }
  .r-kpi-seg button.active{ background:var(--surface); color:var(--text-primary); box-shadow:var(--shadow-sm); }
  .r-kpi-seg button:focus-visible{ outline:2px solid var(--gold-line); outline-offset:1px; }
  .r-kpi-seg-sm button{ font-size:11px; padding:5px 10px; }
  .r-kpi-report-head{ display:flex; align-items:flex-start; justify-content:space-between; flex-wrap:wrap; gap:8px; }
  .r-kpi-report-head .r-kpi-bar{ margin-bottom:6px; }
  .r-kpi-groups{ display:grid; grid-template-columns:1fr; gap:16px; margin-top:16px; }
  @media (min-width:1024px){ .r-kpi-groups{ grid-template-columns:1fr 1fr; } }
  .r-kpi-ghead{ display:flex; align-items:center; gap:8px; margin-bottom:12px; font-size:13.5px; }
  .r-kpi-gicon{ width:28px; height:28px; border-radius:var(--r-sm); background:var(--surface-2); color:var(--gold-text-soft); display:flex; align-items:center; justify-content:center; flex-shrink:0; }
  .r-kpi-gicon svg{ width:16px; height:16px; }
  .r-kpi-grid{ display:grid; grid-template-columns:1fr 1fr; gap:10px; }
  .r-kpi-tile{ background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-md); padding:12px; min-width:0; display:flex; flex-direction:column; gap:4px; }
  .r-kpi-top{ display:flex; align-items:flex-start; justify-content:space-between; gap:6px; }
  .r-kpi-label{ font-size:11.5px; color:var(--text-secondary); font-weight:700; }
  .r-kpi-value{ font-size:16px; font-weight:800; color:var(--text-primary); line-height:1.35; overflow-wrap:anywhere; }
  .r-kpi-sub{ font-size:10.5px; color:var(--text-tertiary); line-height:1.6; }
  @media (max-width:420px){ .r-kpi-value{ font-size:14px; } .r-kpi-tile{ padding:10px; } .r-kpi-grid{ gap:8px; } }
  .r-kpi-spark{ width:100%; height:26px; color:var(--chart-cur); margin-top:2px; display:block; }
  .r-kpi-delta{ font-size:10.5px; font-weight:800; border-radius:999px; padding:2px 7px; white-space:nowrap; flex-shrink:0; }
  .r-kpi-delta.up{ background:var(--success-soft); color:var(--success-text); }
  .r-kpi-delta.down{ background:var(--red-soft); color:var(--red-text-soft); }
  .r-kpi-delta.flat{ background:var(--surface-3); color:var(--text-tertiary); font-weight:700; }
  .r-kpi-prov{ margin-top:12px; display:flex; flex-direction:column; gap:10px; }
  .r-kpi-prov-row small{ font-size:10.5px; color:var(--text-tertiary); }
  .r-kpi-prov-head{ display:flex; justify-content:space-between; font-size:12.5px; margin-bottom:4px; }
  .r-hbar{ margin-bottom:12px; }
  .r-hbar-head{ display:flex; justify-content:space-between; gap:8px; font-size:12.5px; margin-bottom:5px; }
  .r-hbar-head span{ color:var(--text-secondary); font-size:11.5px; text-align:left; }
  .r-hbar-track{ height:6px; border-radius:99px; background:var(--surface-3); overflow:hidden; }
  .r-hbar-track i{ display:block; height:100%; border-radius:99px; background:var(--gold); }
  .r-kpi-trend-head{ display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:8px; margin-bottom:10px; font-size:13.5px; }
  /* نمودارِ روند: ناحیه‌یِ رسم LTR (زمان چپ→راست، مثلِ بقیه‌یِ نمودارهایِ اپ)؛ متنِ راهنما RTL */
  .r-tc{ direction:ltr; display:grid; grid-template-columns:auto 1fr; grid-template-rows:190px auto; column-gap:8px; margin-top:10px; }
  @media (max-width:600px){ .r-tc{ grid-template-rows:160px auto; } }
  .r-tc-y{ position:relative; min-width:44px; }
  .r-tc-y span{ position:absolute; right:0; transform:translateY(-50%); font-size:10px; color:var(--text-tertiary); white-space:nowrap; }
  .r-tc-plot{ position:relative; }
  .r-tc-plot svg{ position:absolute; inset:0; width:100%; height:100%; overflow:visible; display:block; }
  .r-tc-grid{ stroke:var(--border); stroke-width:1; vector-effect:non-scaling-stroke; }
  .r-tc-line{ fill:none; stroke-width:2; vector-effect:non-scaling-stroke; stroke-linejoin:round; stroke-linecap:round; }
  .r-tc-line.cur{ stroke:var(--chart-cur); }
  .r-tc-line.prev{ stroke:var(--chart-prev); stroke-dasharray:5 4; }
  .r-tc-area{ fill:var(--chart-cur); opacity:.10; }
  .r-tc-x{ grid-column:2; position:relative; height:20px; margin-top:4px; }
  .r-tc-x span{ position:absolute; top:0; transform:translateX(-50%); font-size:10px; color:var(--text-tertiary); white-space:nowrap; direction:rtl; }
  .r-tc-x span.first{ transform:none; }
  .r-tc-x span.last{ transform:translateX(-100%); }
  .r-tc-cols{ position:absolute; inset:0; }
  .r-tc-col{ position:absolute; top:0; bottom:0; transform:translateX(-50%); cursor:crosshair; outline:none; }
  .r-tc-guide{ position:absolute; left:50%; top:0; bottom:0; width:1px; background:var(--border-strong); opacity:0; }
  .r-tc-dot{ position:absolute; left:50%; width:9px; height:9px; margin:-4.5px 0 0 -4.5px; border-radius:50%; background:var(--chart-cur); box-shadow:0 0 0 2px var(--surface); opacity:0; }
  .r-tc-dot.prev{ background:var(--chart-prev); }
  .r-tc-col.last .r-tc-dot:not(.prev){ opacity:1; }
  .r-tc-tip{ position:absolute; top:2px; left:calc(50% + 10px); direction:rtl; text-align:right; min-width:150px; background:var(--surface-2); border:1px solid var(--border-strong); border-radius:var(--r-sm); padding:8px 10px; font-size:11.5px; line-height:1.8; color:var(--text-primary); box-shadow:var(--shadow-2); opacity:0; pointer-events:none; z-index:3; white-space:nowrap; transition:opacity .12s; }
  .r-tc-tip b{ font-size:11px; color:var(--text-secondary); }
  .r-tc-col.flip .r-tc-tip{ left:auto; right:calc(50% + 10px); }
  .r-tc-col:hover .r-tc-guide, .r-tc-col:focus .r-tc-guide, .r-tc-col:hover .r-tc-dot, .r-tc-col:focus .r-tc-dot, .r-tc-col:hover .r-tc-tip, .r-tc-col:focus .r-tc-tip{ opacity:1; }
  .r-tc-legend{ display:flex; flex-wrap:wrap; gap:14px; font-size:11.5px; color:var(--text-secondary); }
  .r-sw{ display:inline-block; width:16px; height:3px; border-radius:2px; vertical-align:middle; margin-inline-end:6px; }
  .r-sw.cur{ background:var(--chart-cur); }
  .r-sw.prev{ background:repeating-linear-gradient(90deg, var(--chart-prev) 0 5px, transparent 5px 8px); }
  /* مرکزِ فرمان (بازنگری): همه‌چیز کلیک‌خور، متنِ کم، گیج/دونات */
  .r-kpi-click{ font:inherit; color:inherit; text-align:right; cursor:pointer; transition:transform .15s, border-color .15s, box-shadow .15s; }
  .r-kpi-click:hover{ transform:translateY(-2px); border-color:var(--border-strong); box-shadow:var(--shadow-2); }
  .r-kpi-click:active{ transform:scale(.985); }
  .r-kpi-click:focus-visible{ outline:2px solid var(--gold-line); outline-offset:2px; }
  .r-kpi-cardbtn{ display:block; width:100%; }
  .r-kpi-more{ display:inline-flex; align-items:center; gap:4px; font:inherit; font-size:11.5px; font-weight:700; color:var(--text-tertiary); background:none; border:none; cursor:pointer; padding:2px 4px; }
  .r-kpi-more svg{ width:14px; height:14px; }
  .r-kpi-more:hover{ color:var(--text-primary); }
  .r-kpi-head-tools{ margin-inline-start:auto; }
  .r-kpi-strip{ display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:10px; }
  @media (min-width:760px){ .r-kpi-strip{ grid-template-columns:repeat(4, minmax(0,1fr)); } }
  .r-kpi-strip .r-kpi-tile{ background:var(--surface); box-shadow:var(--shadow-sm); padding:14px; }
  .r-kpi-strip .r-kpi-value{ font-size:18px; }
  .r-kpi-strip-sm{ margin-top:16px; grid-template-columns:repeat(2, minmax(0,1fr)); }
  @media (min-width:760px){ .r-kpi-strip-sm{ grid-template-columns:repeat(5, minmax(0,1fr)); } }
  .r-kpi-strip-sm .r-kpi-value{ font-size:15px; }
  .r-kpi-strip-sm .r-kpi-tile{ padding:12px; }
  .r-kgauge-row{ display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:10px; }
  @media (min-width:760px){ .r-kgauge-row{ grid-template-columns:repeat(4, minmax(0,1fr)); } }
  .r-kgauge-row.r-kgauge-row-2{ grid-template-columns:repeat(2, minmax(0,1fr)); }
  .r-kgauge{ display:flex; flex-direction:column; align-items:center; gap:2px; background:transparent; border:1px solid var(--border); border-radius:var(--r-md); padding:12px 8px 10px; text-align:center; min-width:0; }
  .r-kgauge-dial{ position:relative; width:100%; max-width:150px; }
  .r-kgauge-dial svg{ display:block; width:100%; height:auto; }
  .r-kgauge-dial b{ position:absolute; left:0; right:0; bottom:0; font-size:18px; font-weight:800; line-height:1; }
  .r-kgauge-label{ font-size:12px; font-weight:700; color:var(--text-secondary); margin-top:6px; }
  .r-kgauge small{ font-size:10.5px; color:var(--text-tertiary); }
  .r-kgauge small .ok{ color:var(--success-text); font-weight:700; }
  .r-kgauge small .behind{ color:var(--warning-text); font-weight:700; }
  .r-kg-bg{ fill:none; stroke:var(--surface-3); stroke-width:11; stroke-linecap:round; }
  .r-kg-val{ fill:none; stroke-width:11; stroke-linecap:round; }
  .r-kg-val.good{ stroke:var(--success); } .r-kg-val.warn{ stroke:var(--warning); } .r-kg-val.bad{ stroke:var(--red); } .r-kg-val.brand{ stroke:var(--gold); }
  .r-kg-tick{ stroke:var(--text-primary); stroke-width:2.5; stroke-linecap:round; }
  .r-kpi-targets{ display:flex; flex-direction:column; }
  .r-kpi-targets .r-kgauge-row{ flex:1; }
  .r-kpi-targets .r-kgauge{ justify-content:center; }
  .r-kpi-targets .r-kgauge-dial{ max-width:170px; }
  .r-kpi-vs{ display:flex; flex-direction:column; gap:4px; margin-top:6px; }
  .r-kpi-vs i{ display:block; height:5px; border-radius:99px; background:var(--chart-cur); min-width:2px; }
  .r-kpi-vs i.prev{ background:var(--chart-prev); opacity:.8; }
  .r-kpi-legend-mini{ display:flex; flex-wrap:wrap; justify-content:space-between; gap:4px 12px; font-size:11px; color:var(--text-tertiary); margin-top:10px; }
  .r-kpi-day{ margin-inline-start:auto; }
  .r-kdonut{ display:flex; align-items:center; gap:18px; }
  .r-kdonut-dial{ position:relative; width:128px; height:128px; flex-shrink:0; }
  .r-kdonut-dial svg{ width:100%; height:100%; display:block; }
  .r-kdonut-dial > div{ position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center; }
  .r-kdonut-dial b{ font-size:14px; font-weight:800; }
  .r-kdonut-dial span{ font-size:10px; color:var(--text-tertiary); }
  .r-kdonut-legend{ flex:1; min-width:0; max-width:210px; display:flex; flex-direction:column; gap:8px; }
  .r-kdonut-legend > div{ display:flex; align-items:center; gap:8px; font-size:12px; }
  .r-kdonut-legend i{ width:10px; height:10px; border-radius:3px; flex-shrink:0; }
  .r-kdonut-legend span{ flex:1; color:var(--text-secondary); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .r-kdonut-legend b{ font-size:12.5px; }
  /* S1 — نمایِ راهبردی: کارتِ بینش (یافته ← اقدام)، کارنامه با ستون‌هایِ ۴ماهه، دسته‌هایِ مشتری */
  .r-insights{ display:grid; grid-template-columns:1fr; gap:12px; }
  @media (min-width:900px){ .r-insights{ grid-template-columns:1fr 1fr; } }
  .r-insight{ background:var(--surface); border:1px solid var(--border); border-inline-start:4px solid var(--border-strong); border-radius:var(--r-md); padding:14px 16px; box-shadow:var(--shadow-sm); display:flex; flex-direction:column; gap:6px; }
  .r-insight.crit{ border-inline-start-color:var(--red); }
  .r-insight.warn{ border-inline-start-color:var(--warning); }
  .r-insight.opp{ border-inline-start-color:var(--info); }
  .r-insight.pos{ border-inline-start-color:var(--success); }
  .r-insight-head{ display:flex; justify-content:space-between; align-items:center; font-size:11px; }
  .r-insight-kind{ font-weight:800; }
  .r-insight.crit .r-insight-kind{ color:var(--red-text-soft); } .r-insight.warn .r-insight-kind{ color:var(--warning-text); }
  .r-insight.opp .r-insight-kind{ color:var(--info-text); } .r-insight.pos .r-insight-kind{ color:var(--success-text); }
  .r-insight-pillar{ color:var(--text-tertiary); }
  .r-insight-title{ font-size:13.5px; }
  .r-insight-finding{ font-size:12.5px; line-height:1.9; color:var(--text-secondary); margin:0; }
  .r-insight-action{ font-size:12.5px; line-height:1.9; background:var(--surface-2); border-radius:var(--r-sm); padding:8px 10px; }
  .r-insight-action span{ display:block; font-size:10.5px; font-weight:800; color:var(--gold-text-soft); margin-bottom:2px; }
  .r-insight .r-kpi-more{ align-self:flex-end; }
  .r-score-grid{ display:grid; grid-template-columns:1fr; gap:16px; }
  @media (min-width:1024px){ .r-score-grid{ grid-template-columns:repeat(3, minmax(0,1fr)); } }
  .r-score-row{ display:flex; align-items:center; gap:10px; padding:10px 0; border-bottom:1px solid var(--border); }
  .r-score-row:last-child{ border-bottom:none; }
  .r-score-main{ flex:1; min-width:0; display:flex; flex-direction:column; gap:2px; }
  .r-score-main span{ font-size:11.5px; color:var(--text-secondary); }
  .r-score-main b{ font-size:15px; font-weight:800; }
  .r-score-main b small{ font-size:10px; font-weight:600; color:var(--text-tertiary); }
  .r-score-main .r-kpi-delta{ align-self:flex-start; }
  .r-sbars{ direction:ltr; display:flex; align-items:flex-end; gap:4px; height:42px; width:76px; flex-shrink:0; }
  .r-sbar{ position:relative; flex:1; height:100%; }
  .r-sbar i{ position:absolute; bottom:0; left:0; right:0; border-radius:3px 3px 0 0; }
  .r-sbar .val{ background:var(--gold); opacity:.55; }
  .r-sbar.cur .val{ opacity:1; }
  .r-sbar .proj{ background:repeating-linear-gradient(45deg, var(--gold) 0 2px, transparent 2px 5px); opacity:.6; }
  .r-score-legend{ display:flex; flex-wrap:wrap; gap:6px 14px; font-size:10.5px; color:var(--text-tertiary); margin-top:8px; }
  .r-sw-proj{ display:inline-block; width:10px; height:10px; vertical-align:middle; border-radius:2px; background:repeating-linear-gradient(45deg, var(--gold) 0 2px, transparent 2px 5px); }
  button.r-score-row{ width:100%; background:none; border:none; border-bottom:1px solid var(--border); border-radius:0; font:inherit; color:inherit; text-align:right; cursor:pointer; }
  button.r-score-row:hover{ transform:none; box-shadow:none; background:var(--surface-2); }
  .r-insight-ctas{ display:flex; align-items:center; justify-content:space-between; gap:8px; margin-top:2px; }
  .r-strat-def{ font-size:12px; line-height:1.9; color:var(--text-secondary); background:var(--surface-2); border-radius:var(--r-sm); padding:10px 12px; margin-top:12px; }
  .r-strat-def b{ display:block; font-size:11px; color:var(--gold-text-soft); margin-bottom:2px; }
  .r-mbars{ direction:ltr; display:grid; grid-template-columns:repeat(12, minmax(0,1fr)); gap:6px; align-items:end; height:190px; padding-top:18px; }
  .r-mbar{ display:flex; flex-direction:column; align-items:center; height:100%; outline:none; min-width:0; }
  .r-mbar-val{ font-size:9.5px; color:var(--text-tertiary); white-space:nowrap; opacity:0; transition:opacity .12s; height:16px; }
  .r-mbar:hover .r-mbar-val, .r-mbar:focus .r-mbar-val, .r-mbar.cur .r-mbar-val{ opacity:1; }
  .r-mbar-col{ position:relative; flex:1; width:100%; max-width:34px; }
  .r-mbar-col i{ position:absolute; bottom:0; left:0; right:0; border-radius:4px 4px 0 0; }
  .r-mbar-col .val{ background:var(--gold); opacity:.6; }
  .r-mbar.cur .r-mbar-col .val{ opacity:1; }
  .r-mbar:hover .r-mbar-col .val{ opacity:1; }
  .r-mbar-col .proj{ background:repeating-linear-gradient(45deg, var(--gold) 0 2px, transparent 2px 5px); opacity:.7; }
  .r-mbar-lbl{ font-size:9.5px; color:var(--text-tertiary); margin-top:4px; white-space:nowrap; direction:rtl; max-width:100%; overflow:hidden; text-overflow:clip; }
  @media (max-width:600px){ .r-mbars{ gap:3px; height:160px; } .r-mbar-lbl{ font-size:8.5px; } }
  .r-row-link{ cursor:pointer; } .r-row-link:hover td{ background:var(--surface-2); }
  /* تحلیلِ راهبردیِ عمیق */
  .r-deep{ display:grid; grid-template-columns:minmax(0,1fr); gap:16px; }
  .r-deep-card{ min-width:0; }
  .r-deep-card .r-rep-table td[style]{ color:var(--text-primary); }
  .r-wf{ display:flex; flex-direction:column; gap:8px; }
  .r-wf-row{ display:grid; grid-template-columns:minmax(120px, 1.1fr) 2fr minmax(110px, auto); align-items:center; gap:10px; font-size:12.5px; }
  .r-wf-row span{ color:var(--text-secondary); }
  .r-wf-row b{ text-align:left; white-space:nowrap; }
  .r-wf-track{ height:10px; border-radius:99px; background:var(--surface-3); overflow:hidden; }
  .r-wf-track i{ display:block; height:100%; border-radius:99px; }
  .r-wf-row.base .r-wf-track i{ background:var(--gold); }
  .r-wf-row.up .r-wf-track i{ background:var(--success); } .r-wf-row.up b{ color:var(--success-text); }
  .r-wf-row.down .r-wf-track i{ background:var(--red); } .r-wf-row.down b{ color:var(--red-text-soft); }
  @media (max-width:600px){ .r-wf-row{ grid-template-columns:1fr auto; } .r-wf-track{ grid-column:1 / -1; grid-row:2; } }
  .r-pbars{ direction:ltr; display:grid; gap:8px; align-items:end; height:170px; }
  .r-pbar{ display:flex; flex-direction:column; align-items:center; height:100%; min-width:0; }
  .r-pbar-cols{ flex:1; width:100%; display:flex; align-items:flex-end; justify-content:center; gap:3px; }
  .r-pbar-cols i{ width:42%; max-width:16px; border-radius:3px 3px 0 0; min-height:2px; }
  .r-pbar-cols .in{ background:var(--chart-cur); } .r-pbar-cols .out{ background:var(--chart-prev); }
  .r-pbar span{ font-size:9.5px; color:var(--text-tertiary); margin-top:4px; white-space:nowrap; direction:rtl; }
  /* برنامه‌ریزِ هدف */
  .r-pl-target{ display:flex; align-items:flex-end; flex-wrap:wrap; gap:8px 12px; }
  .r-pl-target label{ width:100%; font-size:12px; color:var(--text-secondary); font-weight:700; }
  .r-pl-target input{ flex:1; min-width:180px; font:inherit; font-size:16px; font-weight:800; padding:10px 12px; border-radius:var(--r-sm); border:1px solid var(--border-strong); background:var(--surface-2); color:var(--text-primary); }
  .r-pl-presets{ display:flex; flex-wrap:wrap; gap:4px 10px; margin:10px 0 4px; }
  .r-pl-grid{ display:grid; grid-template-columns:minmax(0,1fr); gap:14px; }
  @media (min-width:900px){ .r-pl-grid{ grid-template-columns:repeat(2, minmax(0,1fr)); } }
  @media (min-width:1280px){ .r-pl-grid{ grid-template-columns:repeat(4, minmax(0,1fr)); } }
  .r-pl-card{ border-top:3px solid var(--border-strong); display:flex; flex-direction:column; gap:8px; min-width:0; }
  .r-pl-card.good{ border-top-color:var(--success); } .r-pl-card.warn{ border-top-color:var(--warning); } .r-pl-card.bad{ border-top-color:var(--red); }
  .r-pl-feas{ font-size:10.5px; font-weight:800; border-radius:999px; padding:2px 8px; white-space:nowrap; }
  .r-pl-feas.good{ background:var(--success-soft); color:var(--success-text); } .r-pl-feas.warn{ background:var(--warning-soft); color:var(--warning-text); } .r-pl-feas.bad{ background:var(--red-soft); color:var(--red-text-soft); }
  .r-pl-rows > div{ display:flex; justify-content:space-between; gap:8px; font-size:12px; padding:5px 0; border-bottom:1px solid var(--border); }
  .r-pl-rows > div:last-child{ border-bottom:none; }
  .r-pl-rows span{ color:var(--text-secondary); }
  .r-pl-ch{ font-size:10px; font-weight:800; } .r-pl-ch.up{ color:var(--success-text); } .r-pl-ch.down{ color:var(--text-tertiary); } .r-pl-ch.bad{ color:var(--red-text-soft); }
  .r-pl-action{ font-size:11.5px; line-height:1.8; color:var(--text-secondary); margin:0; background:var(--surface-2); border-radius:var(--r-sm); padding:8px 10px; }
  .r-pl-action.warn{ color:var(--warning-text); }
  .r-pl-gap{ font-size:12.5px; font-weight:800; } .r-pl-gap.ok{ color:var(--success-text); } .r-pl-gap.short{ color:var(--warning-text); }
  .r-pl-levers{ display:grid; grid-template-columns:minmax(0,1fr); gap:10px; margin-bottom:8px; }
  @media (min-width:900px){ .r-pl-levers{ grid-template-columns:repeat(2, minmax(0,1fr)); } }
  .r-pl-lever{ display:grid; grid-template-columns:minmax(110px, auto) 1fr 56px; align-items:center; gap:10px; font-size:12px; }
  .r-pl-lever span{ color:var(--text-secondary); } .r-pl-lever b{ text-align:left; }
  .r-pl-lever input[type=range]{ width:100%; accent-color:var(--gold); direction:ltr; } /* راست = بیشتر، حتی در صفحه‌یِ RTL */
  .r-seg-grid{ display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:10px; }
  @media (min-width:900px){ .r-seg-grid{ grid-template-columns:repeat(3, minmax(0,1fr)); } }
  .r-seg-card{ display:flex; flex-direction:column; gap:6px; text-align:right; padding:14px; }
  .r-seg-top{ display:flex; justify-content:space-between; align-items:baseline; }
  .r-seg-top b{ font-size:12.5px; } .r-seg-top span{ font-size:18px; font-weight:800; }
  .r-seg-card small{ font-size:10.5px; color:var(--text-tertiary); line-height:1.6; }
  .r-rep-scroll{ overflow-x:auto; -webkit-overflow-scrolling:touch; }
  .r-rep-scroll-y{ max-height:420px; overflow-y:auto; }
  .r-rep-table{ width:100%; border-collapse:collapse; font-size:12.5px; }
  .r-rep-table th{ text-align:right; font-size:11px; font-weight:700; color:var(--text-tertiary); padding:8px 10px; border-bottom:1px solid var(--border-strong); white-space:nowrap; position:sticky; top:0; background:var(--surface); }
  .r-rep-table td{ padding:9px 10px; border-bottom:1px solid var(--border); white-space:nowrap; }
  .r-rep-table tr:last-child td{ border-bottom:none; }
  .r-stat-card{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:16px; box-shadow:var(--shadow-sm); perspective:500px; }
  /* فاز ۴۹ — آیکون‌های «اقدامات امروز» دقیقاً هم‌سایز/هم‌ظاهر/هم‌انیمیشن با
     .r-service-icon (خط ۵۹۳ به بالا) — همون کادر ۵۶px، همون سایه‌ی لایه‌ای سه‌بعدی،
     همون rotateY موقع هاور کارت، + شناوری خودکار (چون .r-stat-card برخلاف
     .r-service-card واقعاً کلیک‌پذیر/لینک نیست، انیمیشن idle مثل .r-group-icon هم
     اضافه شد تا رو موبایل هم بدون هاور دیده بشه). */
  .r-stat-icon{
    width:56px; height:56px; border-radius:16px; display:flex; align-items:center; justify-content:center; margin-bottom:12px;
    box-shadow:inset 0 2px 0 rgba(255,255,255,.14), inset 0 -3px 8px rgba(0,0,0,.26), 0 8px 16px rgba(0,0,0,.3);
    position:relative; overflow:hidden; transform-style:preserve-3d;
    transition:transform .25s var(--ease-out);
    animation:iconFloat 5s ease-in-out infinite;
  }
  .r-stat-card:hover .r-stat-icon{ transform:rotateY(-8deg) scale(1.06); }
  .r-stat-icon svg{ width:30px; height:30px; filter:drop-shadow(0 2px 3px rgba(0,0,0,.3)); }
  /* فاز ۱۲۸ — چهار عددِ «کاربران و رشد» کلیک‌خور شدند و پشتشان گزارشِ کاملِ مشتریان
     می‌آید. خودِ .r-stat-card ظاهر را می‌دهد؛ این کلاس فقط پیش‌فرض‌های <button> را
     خنثی می‌کند و «قابلِ کلیک بودن» را دیداری می‌کند. */
  .r-stat-card-btn{ font:inherit; color:inherit; text-align:center; width:100%; cursor:pointer;
    transition:transform .18s var(--ease-out), border-color .18s var(--ease-out), box-shadow .18s var(--ease-out); }
  .r-stat-card-btn:hover{ transform:translateY(-2px); border-color:var(--border-strong); box-shadow:var(--shadow-2); }
  .r-stat-card-btn:active{ transform:scale(.98); }
  .r-stat-num{ font-size:22px; font-weight:800; margin-bottom:2px; }
  .r-stat-label{ font-size:11.5px; color:var(--text-tertiary); }

  /* card shell */
  .r-card{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-lg); padding:18px; box-shadow:var(--shadow-sm); position:relative; }
  .r-card-head{ display:flex; align-items:center; justify-content:space-between; margin-bottom:16px; }
  .r-card-head b{ font-size:14px; font-weight:700; }
  .r-card-link{ font-size:11.5px; color:var(--text-secondary); background:none; border:none; }
  .r-card-link:hover{ color:var(--text-primary); }

  /* donut */
  .r-donut-wrap{ display:flex; align-items:center; gap:20px; flex-wrap:wrap; }
  .r-donut-center-label{ font-size:22px; font-weight:800; }
  .r-donut-center-sub{ font-size:10.5px; color:var(--text-tertiary); }
  .r-legend{ display:flex; flex-direction:column; gap:10px; flex:1; min-width:120px; }
  .r-legend-item{ display:flex; align-items:center; gap:8px; font-size:12.5px; }
  .r-legend-dot{ width:9px; height:9px; border-radius:50%; flex-shrink:0; }
  .r-legend-item b{ margin-right:auto; font-weight:700; }

  /* important actions list */
  .r-action-item{ display:flex; align-items:flex-start; gap:12px; padding:12px 0; border-bottom:1px solid var(--border); }
  .r-action-item:last-child{ border-bottom:none; padding-bottom:0; }
  .r-action-icon{ width:32px; height:32px; border-radius:8px; background:var(--surface-2); display:flex; align-items:center; justify-content:center; flex-shrink:0; color:var(--text-secondary); }
  .r-action-icon svg{ width:15px; height:15px; }
  /* فاز ۴۹ — آیکون‌های منوی «حساب من» به‌جای رنگ خنثی، قرمز سلطنتی با هاله‌ی سفید
     دور خودشون (نه رنگ متن)؛ فقط همین یه محل — .r-action-icon پایه (سفارش‌های امروز،
     اعلان‌ها) که رنگش معنایی/وضعیتی‌ست (هشدار/موفقیت/اطلاع) دست‌نخورده می‌مونه. */
  .r-account-menu-icon{ background:linear-gradient(135deg, var(--red) 0%, var(--red-deep) 100%) !important; color:#fff !important; box-shadow:0 0 0 3px rgba(255,255,255,.16), 0 3px 10px rgba(239,43,53,.38); }
  .r-action-body{ flex:1; min-width:0; }
  .r-action-tag{ font-size:9.5px; font-weight:700; padding:2px 8px; border-radius:var(--r-lg); display:inline-block; margin-bottom:6px; }
  .r-action-tag.urgent{ background:var(--red-soft); color:var(--red-text-soft); }
  .r-action-tag.waiting{ background:var(--warning-soft); color:var(--warning-text); }
  .r-action-title{ font-size:12.5px; font-weight:600; margin-bottom:2px; }
  .r-action-sub{ font-size:11px; color:var(--text-tertiary); }

  /* finance chart */
  /* فاز ۴۵ — همون تکنیک متن-گرادیانی که .r-wordmark از قبل داشت (طلا/قرمز)، این‌بار
     رو عدد بزرگ کارت مالی هم — یه سکه‌ی طلای واقعی به‌جای رنگ ثابت. */
  .r-fin-total{ font-size:32px; font-weight:800; margin-bottom:2px; letter-spacing:-.5px; background:linear-gradient(120deg, var(--text-primary) 30%, var(--gold-text-soft)); -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; }
  .r-fin-change{ font-size:11.5px; color:var(--success-text); font-weight:600; }
  .r-fin-select{ background:var(--surface-2); border:1px solid var(--border-strong); color:var(--text-secondary); border-radius:var(--r-lg); padding:6px 12px; font-size:11px; }

  /* risk card */
  .r-risk-bar{ height:6px; border-radius:10px; background:var(--surface-3); overflow:hidden; margin-top:12px; }
  .r-risk-bar-fill{ height:100%; border-radius:10px; }

  /* AI assistant */
  .r-ai-card{ background:linear-gradient(160deg, var(--surface-2), var(--surface)); border:1px solid var(--border); border-radius:var(--r-lg); padding:18px; display:flex; flex-direction:column; box-shadow:var(--shadow-md); position:relative; overflow:hidden; }
  .r-ai-head{ display:flex; align-items:center; gap:12px; margin-bottom:14px; }
  /* فاز ۲۷ — دستیار هوشمند هم برگشت به قرمز اصلی برند (به‌جای سبز سلطنتی/فیروزه‌ای
     آزمایشی فازهای ۱۸/۲۰ که کاربر گفت روی کار ننشسته). */
  .r-ai-avatar{ width:44px; height:44px; border-radius:50%; background:var(--red-soft); border:1.5px solid var(--red); display:flex; align-items:center; justify-content:center; color:var(--red-text-soft); flex-shrink:0; box-shadow:0 0 0 4px rgba(239,43,53,.09), 0 0 18px rgba(239,43,53,.35); animation:aiGlow 3.2s ease-in-out infinite; }
  @keyframes aiGlow{ 0%,100%{ box-shadow:0 0 0 4px rgba(239,43,53,.09), 0 0 18px rgba(239,43,53,.35); } 50%{ box-shadow:0 0 0 6px rgba(239,43,53,.13), 0 0 26px rgba(239,43,53,.5); } }
  .r-ai-avatar svg{ width:22px; height:22px; }
  .r-ai-head b{ font-size:13.5px; display:block; }
  .r-ai-head span{ font-size:11px; color:var(--text-tertiary); }
  .r-ai-messages{ display:flex; flex-direction:column; gap:10px; max-height:320px; overflow-y:auto; margin-bottom:12px; padding-left:2px; }
  .r-ai-bubble{ font-size:12.5px; padding:10px 13px; border-radius:14px; line-height:1.7; max-width:92%; }
  .r-ai-bubble.assistant{ background:var(--surface-2); border:1px solid var(--border); align-self:flex-start; border-bottom-left-radius:4px; }
  .r-ai-bubble.user{ background:var(--red-hover); color:var(--on-accent); align-self:flex-end; border-bottom-right-radius:4px; }
  /* فاز ۱۵۴ — تیکِ ارسال/خوانده‌شدنِ پیام‌رسانِ تیم؛ یه‌سره‌سایز صرف‌نظر از اینکه
     آیکونِ خامِ استفاده‌شده (check تک‌تیک در برابرِ checkAll دوتیک) چه width/height
     ذاتی‌ای داره — بدونِ این، تیکِ تک از دوتیک بزرگ‌تر دیده می‌شد. */
  .r-msg-tick{ display:inline-flex; line-height:0; flex-shrink:0; }
  .r-msg-tick svg{ width:12px; height:12px; }
  .r-ai-chip{ background:var(--surface-2); border:1px solid var(--border-strong); color:var(--text-secondary); border-radius:12px; padding:10px 12px; font-size:11.5px; text-align:right; margin-bottom:7px; width:100%; }
  .r-ai-chip:hover{ border-color:var(--red); color:var(--text-primary); }
  .r-ai-input-row{ display:flex; gap:8px; margin-top:auto; }
  /* فاز ۱۲۹ — min-width:0 حیاتی است، نه احتیاطِ اضافه: بدونش فلکس‌آیتم زیرِ عرضِ
     ذاتیِ متنش کوچک نمی‌شود و کلِ ردیف از کارت بیرون می‌زند — که با ۱۶px شدنِ فونتِ
     موبایل در فاز ۱۱۲ (ضدِ زومِ سافاری) روی گوشی واقعاً دیده شد. */
  .r-ai-input-row input{ flex:1; min-width:0; background:var(--surface-2); border:1px solid var(--border-strong); border-radius:var(--r-lg); padding:10px 15px; color:var(--text-primary); font-size:12.5px; }
  .r-ai-input-row .r-icon-btn{ flex-shrink:0; }
  .r-ai-send{ width:38px; height:38px; border-radius:50%; background:var(--red); border:none; color:var(--on-accent); display:flex; align-items:center; justify-content:center; flex-shrink:0; }
  .r-ai-send svg{ width:15px; height:15px; }
  .r-ai-typing{ display:flex; gap:4px; padding:10px 13px; }
  .r-ai-typing span{ width:5px; height:5px; border-radius:50%; background:var(--text-tertiary); animation:aiTyping 1s infinite ease-in-out; }
  .r-ai-typing span:nth-child(2){ animation-delay:.15s; } .r-ai-typing span:nth-child(3){ animation-delay:.3s; }
  @keyframes aiTyping{ 0%,60%,100%{ opacity:.3; transform:translateY(0);} 30%{ opacity:1; transform:translateY(-3px);} }

  /* services grid with colored icons */
  .r-groups{ display:grid; grid-template-columns:1fr 1fr; gap:10px; }
  @media (min-width:560px) and (max-width:1023px){ .r-groups{ grid-template-columns:repeat(3,1fr); } }
  @media (min-width:1024px){ .r-groups{ grid-template-columns:repeat(4,1fr); } }
  /* فاز ۴۶ — «آیکون‌ها به اندازه‌ی کادر خودشون بزرگ بشن، حجم و انیمیشن سه‌بعدی» —
     آیکون گروه از ۴۰px به ۷۲px (نزدیک به کل عرض کارت تو گرید دوستونه‌ی موبایل)، با
     چند لایه سایه‌ی واقعی (نه فقط یکی) برای حس برجستگی/عمق، + perspective رو خودِ
     کارت تا چرخش سه‌بعدی آیکون موقع لمس/هاور واقعاً سه‌بعدی به‌نظر برسه، نه فقط flat
     scale. حرکت شناور آروم هم تا حس «زنده» بدن، نه ساکن. */
  .r-group-card{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:16px; display:flex; flex-direction:column; gap:14px; text-align:right; transition:.25s var(--ease-out); box-shadow:var(--shadow-sm); position:relative; overflow:hidden; perspective:600px; }
  .r-group-card:hover{ border-color:var(--gold-line); background:var(--surface-2); box-shadow:var(--shadow-lg); transform:translateY(-4px); }
  .r-group-card:active{ transform:scale(.97); }
  .r-group-icon{
    width:72px; height:72px; border-radius:22px; display:flex; align-items:center; justify-content:center;
    box-shadow:inset 0 2px 0 rgba(255,255,255,.16), inset 0 -4px 10px rgba(0,0,0,.28), 0 14px 26px rgba(0,0,0,.38), 0 3px 6px rgba(0,0,0,.22);
    position:relative; overflow:hidden; transform-style:preserve-3d;
    transition:transform .3s var(--ease-out), box-shadow .3s var(--ease-out);
    animation:iconFloat 5s ease-in-out infinite;
  }
  .r-group-card:hover .r-group-icon{ transform:rotateY(-10deg) rotateX(6deg) translateZ(6px) scale(1.06); }
  .r-group-card:active .r-group-icon{ transform:scale(.92); animation-play-state:paused; }
  .r-group-icon svg{ width:42px; height:42px; filter:drop-shadow(0 3px 4px rgba(0,0,0,.35)); }
  @keyframes iconFloat{ 0%,100%{ transform:translateY(0) rotateZ(0deg); } 50%{ transform:translateY(-3px) rotateZ(-1.5deg); } }
  @media (prefers-reduced-motion: no-preference){ .r-group-icon{ will-change:transform; } }
  /* برق آینه‌ای موقع هاور کارت — همون تکنیک .r-sheen-sweep (خط ۱۹۲)، این‌بار مستقیم روی
     کادر آیکون به‌جای کل کارت، چون خواسته‌ی کاربر دقیقاً «روی آیکون‌ها» بود. */
  .r-group-icon::after, .r-package-icon::after{
    content:''; position:absolute; inset:0; pointer-events:none;
    background:linear-gradient(115deg, transparent 40%, rgba(255,255,255,.35) 50%, transparent 60%);
    background-size:220% 100%; background-position:120% 0; transition:background-position .6s var(--ease-out);
  }
  .r-group-card:hover .r-group-icon::after, .r-package-card:hover .r-package-icon::after{ background-position:-20% 0; }
  .r-group-card b{ font-size:16px; font-weight:700; }
  .r-group-card small{ color:var(--text-tertiary); font-size:12.5px; }
  .r-service-grid-card{ justify-content:space-between; min-height:172px; }
  .r-service-grid-price{ margin-top:auto; padding-top:10px; border-top:1px solid var(--border); }

  /* service list rows */
  .r-back{ display:flex; align-items:center; gap:6px; color:var(--text-secondary); font-size:13px; margin-bottom:14px; background:none; border:none; padding:4px 0; }
  .r-back svg{ width:16px; height:16px; }
  .r-service-list{ border:1px solid var(--border); border-radius:var(--r-md); overflow:hidden; }
  .r-service-card{ background:var(--surface); border:none; border-bottom:1px solid var(--border); padding:14px 16px; display:flex; align-items:center; gap:13px; width:100%; text-align:right; transition:background .12s; perspective:500px; }
  .r-service-card:last-child{ border-bottom:none; }
  .r-service-card:hover{ background:var(--surface-2); }
  .r-service-icon{
    width:56px; height:56px; border-radius:16px; display:flex; align-items:center; justify-content:center; flex-shrink:0;
    box-shadow:inset 0 2px 0 rgba(255,255,255,.14), inset 0 -3px 8px rgba(0,0,0,.26), 0 8px 16px rgba(0,0,0,.3);
    transition:transform .25s var(--ease-out);
  }
  .r-service-card:hover .r-service-icon{ transform:rotateY(-8deg) scale(1.06); }
  .r-service-icon svg{ width:30px; height:30px; filter:drop-shadow(0 2px 3px rgba(0,0,0,.3)); }
  .r-service-main{ flex:1; min-width:0; }
  .r-service-main b{ font-size:15px; display:block; margin-bottom:3px; font-weight:700; }
  .r-service-main span{ color:var(--text-tertiary); font-size:12px; }
  .r-service-right{ display:flex; align-items:center; gap:10px; flex-shrink:0; }
  .r-price-tag{ font-size:12.5px; white-space:nowrap; font-weight:700; color:var(--text-primary); }
  .r-price-tag.quote{ color:var(--text-secondary); font-weight:500; font-size:11.5px; }
  .r-price-tag.from::before{ content:'شروع از '; font-weight:400; color:var(--text-tertiary); font-size:10.5px; }
  .r-chevron{ color:var(--text-tertiary); flex-shrink:0; }
  .r-chevron svg{ width:15px; height:15px; }

  /* buttons */
  .r-btn{ border:none; border-radius:var(--r-sm); padding:0 18px; height:52px; font-size:14.5px; font-weight:700; display:flex; align-items:center; justify-content:center; gap:6px; width:100%; transition:.18s var(--ease-out); }
  /* فاز ۴۳ — ریزتعامل: فشرده‌شدن کوتاه موقع لمس، رو هر عنصر قابل‌کلیک اصلی — حس
     «پاسخ‌گو بودن» فوری می‌ده، بدون افکت اضافه‌ای که حواس‌پرت‌کننده باشه. */
  .r-btn:active, .r-choice-row:active, .r-nav-item:active, .r-icon-btn:active{ transform:scale(.96); }
  /* فاز ۱۲۳ — تا امروز هیچ استایل disabled تو کل شیت نبود، یعنی یه دکمه‌ی غیرفعال
     دقیقاً مثل فعال دیده می‌شد. حالت «در حال ارسال» دکمه‌ی ورود به همین متکیه. */
  .r-btn:disabled{ opacity:.55; filter:saturate(.6); pointer-events:none; transform:none !important; }
  .r-nav-fab:active{ transform:translateY(-2px) scale(.96); }
  /* فاز ۴۵ — یه لبه‌ی طلایی ظریف دور دکمه‌ی اصلی، به‌جای عوض‌کردن کامل رنگ پرشده (که
     ریسک خوانایی متن سفید داشت) — همون حس «مهر طلایی/پرمیوم» رو بدون افت کنتراست می‌ده. */
  .r-btn-primary{ background:linear-gradient(155deg, var(--red-hover), var(--red-deep)); color:var(--on-accent); box-shadow:var(--shadow-red), inset 0 0 0 1.5px rgba(226,182,92,.35); position:relative; overflow:hidden; }
  .r-btn-primary:hover{ background:linear-gradient(155deg, var(--red-deep), #8E1A21); box-shadow:0 10px 26px rgba(239,43,53,.38); transform:scale(1.012); }
  .r-btn-primary:active{ transform:scale(.98); }
  /* Sheen sweep on every primary button app-wide, not just login — a single shared
     rule so no call site needs to opt in individually. */
  .r-btn-primary::after{
    content:''; position:absolute; inset:0; pointer-events:none;
    background:linear-gradient(115deg, transparent 40%, rgba(255,255,255,.25) 50%, transparent 60%);
    background-size:220% 100%; background-position:120% 0; transition:background-position .6s var(--ease-out);
  }
  .r-btn-primary:hover::after{ background-position:-20% 0; }
  .r-btn-ghost{ background:var(--surface-2); color:var(--text-primary); border:1px solid var(--border-strong); }
  .r-btn-ghost:hover{ background:var(--surface-3); }
  .r-btn-sm{ width:auto; height:auto; padding:9px 14px; font-size:12.5px; font-weight:600; }
  /* دکمه‌ی «افزودن» در کنارِ فیلدهای فرم (مثلِ روستر کارکنان) — بینِ r-btn-sm و
     پیش‌فرض؛ هم‌ارتفاع/هم‌فونتِ تقریبیِ ورودی‌های .r-field، ولی عرضش خودکار می‌مونه
     تا تو ردیفِ کنارِ یه عنوان هم جا بشه. */
  .r-btn-md{ width:auto; height:44px; padding:0 16px; font-size:13.5px; font-weight:700; }
  .r-btn-danger-text{ background:transparent; color:var(--red-text-soft); }
  .r-btn-danger-text:hover{ background:var(--red-soft); }
  .r-btn-link{ background:transparent; border:none; color:var(--text-tertiary); cursor:pointer; padding:4px 2px; font-family:inherit; }
  .r-btn-link:hover{ color:var(--text-secondary); text-decoration:underline; }
  .r-btn-topbar{ background:var(--red-hover); color:var(--on-accent); border:none; border-radius:var(--r-lg); padding:9px 18px; font-size:12.5px; font-weight:700; display:flex; align-items:center; gap:6px; box-shadow:var(--shadow-red); }
  .r-btn-topbar svg{ width:14px; height:14px; }

  /* stepper */
  .r-stepper{ display:flex; align-items:center; gap:6px; padding:14px 18px 0; }
  .r-step{ display:flex; align-items:center; gap:6px; font-size:11.5px; color:var(--text-tertiary); }
  .r-step .r-step-dot{ width:18px; height:18px; border-radius:50%; background:var(--surface-3); display:flex; align-items:center; justify-content:center; font-size:10px; font-weight:700; color:var(--text-tertiary); }
  .r-step.done .r-step-dot, .r-step.active .r-step-dot{ background:var(--red-hover); color:var(--on-accent); }
  .r-step.active{ color:var(--text-primary); font-weight:600; }
  .r-step.done{ color:var(--text-secondary); }
  .r-step-line{ flex:1; height:1px; background:var(--border-strong); min-width:14px; }

  /* modal */
  .r-overlay{ position:fixed; inset:0; background:rgba(10,7,6,.7); z-index:100; display:flex; align-items:flex-end; justify-content:center; animation:fadeIn .16s var(--ease-out); }
  @keyframes fadeIn{ from{ opacity:0; } to{ opacity:1; } }
  @media (min-width:760px){ .r-overlay{ align-items:center; } }
  .r-modal{ background:var(--surface); width:100%; max-width:480px; max-height:90vh; overflow-y:auto; border-radius:22px 22px 0 0; border:1px solid var(--border); border-bottom:none; animation:slideUp .2s cubic-bezier(.2,.8,.2,1); box-shadow:var(--shadow-lg); }
  /* فاز ۹۰ — کاربر گزارش داد هر تیک/تعامل تو یه مودالِ از‌قبل‌باز، یه لحظه «قطع و وصل»
     می‌شه (مثل اسکرین‌شات). علت: چون render() کل root.innerHTML رو عوض می‌کنه،
     .r-overlay/.r-modal هر بار از نو ساخته می‌شن — یعنی انیمیشن ورودشون (fadeIn/
     slideUp) هر بار که کاربر یه چک‌باکس می‌زنه یا تایپ می‌کنه (نه فقط لحظه‌ی باز شدن
     مودال) دوباره از اول پخش می‌شه. این کلاس فقط وقتی render() تشخیص بده مودال از
     قبل باز بوده (نه همین الان باز شده) اضافه می‌شه — انیمیشن ورود واقعی (باز شدن
     مودال) دست‌نخورده می‌مونه. */
  .r-modal-reopen{ animation:none !important; }
  .r-modal-reopen .r-modal{ animation:none !important; }
  @media (min-width:760px){ .r-modal{ border-radius:18px; border-bottom:1px solid var(--border); } }
  @keyframes slideUp{ from{ transform:translateY(18px); opacity:0; } to{ transform:translateY(0); opacity:1; } }
  .r-modal-header{ display:flex; align-items:center; justify-content:space-between; padding:18px 18px 14px; position:sticky; top:0; background:var(--surface); z-index:2; isolation:isolate; }
  .r-modal-header::before{
    content:''; position:absolute; z-index:-1; pointer-events:none; inset:0;
    background-image:var(--pattern-girih-fine); background-repeat:repeat; opacity:.035;
  }
  .r-modal-header b{ font-size:15.5px; font-weight:700; }
  .r-modal-close{ background:var(--surface-2); border:none; color:var(--text-secondary); width:30px; height:30px; border-radius:50%; display:flex; align-items:center; justify-content:center; }
  .r-modal-close svg{ width:14px; height:14px; }
  .r-modal-body{ padding:2px 18px 18px; }
  .r-modal-footer{ position:sticky; bottom:0; background:var(--surface); padding:14px 18px 18px; border-top:1px solid var(--border); display:flex; align-items:center; gap:12px; }

  /* forms */
  .r-field{ margin-bottom:16px; }
  .r-field label{ display:block; font-size:12px; color:var(--text-secondary); margin-bottom:7px; font-weight:500; }
  .r-field input[type=text], .r-field input[type=number], .r-field textarea, .r-field select{ width:100%; background:var(--surface-2); border:1px solid var(--border-strong); color:var(--text-primary); border-radius:var(--r-sm); padding:11px 13px; font-size:13.5px; }
  .r-field input:focus, .r-field select:focus, .r-field textarea:focus{ border-color:var(--red); }

  /* فاز ۱۱۲-ادامه۶ — باگ واقعی گزارش‌شده: سافاری آیفون هر فیلد ورودی با
     font-size زیر ۱۶px رو موقع فوکوس خودکار زوم می‌کنه، ولی خودش هیچ‌وقت زوم رو
     برنمی‌گردونه (باید کاربر دستی pinch-to-zoom کنه) — این رفتار خودِ iOS Safari
     است، نه باگ اپ، ولی چون تقریباً همه‌ی فیلدهای این فایل (۱۱.۵-۱۴px) زیر همون
     آستانه‌ان، عملاً هر فرمی رو موبایل این مشکل رو داره. رفعِ استاندارد و تنها
     راه واقعاً قابل‌اعتماد: هیچ‌وقت نذار زوم اصلاً شروع بشه — همه‌ی فیلدهای متنی
     رو ۱۶px کن. `!important` لازمه چون بعضی فیلدها (مثل ادیتور گزینه‌های خدمت)
     font-size رو inline ست کرده‌ن که specificity بالاتری از این کلاس‌ها داره.
     فقط رو دستگاه لمسی (نه دسکتاپ، که اصلاً این باگ رو نداره) اعمال می‌شه تا
     ظاهر دسکتاپ دست‌نخورده بمونه. */
  @media (hover:none) and (pointer:coarse){
    input[type=text], input[type=number], input[type=tel], input[type=email], input[type=password], input[type=search], textarea, select{
      font-size:16px !important;
    }
  }

  /* Jalali date picker (فاز ۷) — replaces native <input type="date"> in accounting forms,
     which is always Gregorian regardless of locale. Renders inline in normal document
     flow (not an absolutely-positioned popover) since render() rebuilds the whole tree
     on every state change, making floating-overlay positioning fragile. */
  .r-jalali-input{ width:100%; display:flex; align-items:center; justify-content:space-between; background:var(--surface-2); border:1px solid var(--border-strong); color:var(--text-primary); border-radius:var(--r-sm); padding:11px 13px; font-size:13.5px; text-align:right; font-family:inherit; }
  .r-jalali-input svg{ color:var(--text-tertiary); flex-shrink:0; }
  .r-jalali-placeholder{ color:var(--text-tertiary); }
  .r-jalali-cal{ margin-top:8px; background:var(--surface); border:1px solid var(--border-strong); border-radius:var(--r-md); padding:12px; }
  .r-jalali-cal-head{ display:flex; align-items:center; justify-content:space-between; margin-bottom:10px; gap:6px; }
  .r-jalali-cal-head button{ background:var(--surface-2); border:1px solid var(--border); border-radius:8px; width:28px; height:28px; flex-shrink:0; display:flex; align-items:center; justify-content:center; color:var(--text-secondary); }
  .r-jalali-cal-head b{ font-size:12.5px; font-weight:700; }
  /* پرشِ مستقیم به ماه/سالِ دلخواه (به‌جای فقط فلشِ ماهِ قبل/بعد) — مخصوصاً برای
     تاریخ تولد که ممکنه ده‌ها سال عقب باشه. */
  .r-jalali-cal-jump{ display:flex; gap:6px; flex:1; min-width:0; }
  .r-jalali-cal-jump select{ flex:1; min-width:0; background:var(--surface-2); border:1px solid var(--border); border-radius:8px; color:var(--text-primary); font-size:11.5px; font-weight:700; padding:5px 4px; font-family:inherit; text-align:center; }
  .r-jalali-cal-weekdays{ display:grid; grid-template-columns:repeat(7,1fr); margin-bottom:4px; }
  .r-jalali-cal-weekdays span{ text-align:center; font-size:10px; color:var(--text-tertiary); font-weight:600; }
  .r-jalali-cal-grid{ display:grid; grid-template-columns:repeat(7,1fr); gap:3px; }
  .r-jalali-cal-day{ aspect-ratio:1; background:transparent; border:none; border-radius:8px; font-size:11.5px; color:var(--text-primary); font-variant-numeric:tabular-nums; }
  .r-jalali-cal-day:hover{ background:var(--surface-3); }
  .r-jalali-cal-day.today{ box-shadow:inset 0 0 0 1px var(--border-strong); font-weight:700; }
  .r-jalali-cal-day.selected{ background:var(--red-hover); color:var(--on-accent); font-weight:700; }
  .r-field textarea{ resize:vertical; min-height:64px; }
  .r-option-group{ border:1px solid var(--border); border-radius:var(--r-md); padding:14px; margin-bottom:12px; background:var(--surface-2); }
  .r-option-group-title{ font-size:12.5px; font-weight:700; margin-bottom:10px; }
  .r-option-group-title span{ color:var(--text-tertiary); font-weight:400; }
  .r-choice-row{ display:flex; align-items:center; gap:11px; padding:11px 12px; border-radius:var(--r-sm); background:var(--surface); margin-bottom:7px; cursor:pointer; border:1px solid var(--border); transition:.18s var(--ease-out); }
  .r-choice-row:hover{ border-color:var(--border-strong); }
  .r-choice-row.selected{ border-color:var(--red); background:var(--surface-3); }
  .r-choice-row .r-radio{ width:17px; height:17px; border-radius:50%; border:1.6px solid var(--border-strong); flex-shrink:0; position:relative; background:var(--surface); }
  .r-choice-row.selected .r-radio{ border-color:var(--red); }
  .r-choice-row.selected .r-radio::after{ content:''; position:absolute; inset:3px; background:var(--red); border-radius:50%; }
  .r-choice-row .r-checkbox{ width:17px; height:17px; border-radius:5px; border:1.6px solid var(--border-strong); flex-shrink:0; background:var(--surface); display:flex; align-items:center; justify-content:center; }
  .r-choice-row.selected .r-checkbox{ border-color:var(--red); background:var(--red); }
  .r-choice-row.selected .r-checkbox svg{ width:11px; height:11px; color:var(--on-accent); }
  .r-choice-label{ flex:1; font-size:13px; }
  .r-choice-mod{ font-size:11.5px; color:var(--text-secondary); font-weight:600; white-space:nowrap; }
  .r-choice-mod.free{ color:var(--text-tertiary); font-weight:400; }
  .r-price-box{ background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-md); padding:15px 16px; display:flex; align-items:center; justify-content:space-between; margin:16px 0; }
  .r-price-box .label{ font-size:12px; color:var(--text-secondary); }
  .r-price-box .amount{ font-size:18px; font-weight:800; color:var(--gold-text-soft); }
  .r-price-box .amount.quote{ font-size:13px; color:var(--warning); font-weight:700; }

  /* mobile bottom nav w/ FAB */
  /* همون منطق env(safe-area-inset-*) بالا، این‌بار برای پایین (home indicator گوشی‌های
     بدون دکمه) — تا نوار پایین زیر اون گیر نکنه. */
  .r-nav{ position:fixed; bottom:0; left:50%; transform:translateX(-50%); width:100%; max-width:480px; background:var(--glass-bg); backdrop-filter:blur(14px); border-top:1px solid var(--border); display:flex; align-items:center; z-index:30; box-shadow:0 -6px 20px rgba(0,0,0,.3); padding-bottom:env(safe-area-inset-bottom); }
  @media (min-width:1024px){ .r-nav{ display:none; } }
  .r-nav-item{ flex:1; background:none; border:none; color:var(--text-tertiary); display:flex; flex-direction:column; align-items:center; gap:5px; padding:11px 4px 13px; font-size:10.5px; transition:transform .15s var(--ease-out); }
  .r-nav-item svg{ width:20px; height:20px; }
  .r-nav-item.active{ color:var(--text-primary); }
  .r-nav-item.active svg{ color:var(--red); }
  .r-nav-fab{ width:56px; height:56px; border-radius:50%; background:linear-gradient(155deg, var(--red-hover), var(--red-deep)); border:none; color:var(--on-accent); display:flex; align-items:center; justify-content:center; margin-top:-26px; flex-shrink:0; box-shadow:0 10px 26px rgba(239,43,53,.55), inset 0 0 0 2px rgba(226,182,92,.4); transition:transform .15s var(--ease-out); }
  .r-nav-fab svg{ width:22px; height:22px; }

  .r-status{ font-size:10.5px; padding:5px 10px; border-radius:var(--r-lg); font-weight:600; white-space:nowrap; transition:background .25s var(--ease-out), color .25s var(--ease-out); }
  .r-status.reviewing{ background:var(--info-soft); color:var(--info-text); }
  .r-status.progress{ background:var(--warning-soft); color:var(--warning-text); }
  .r-status.needs_doc{ background:var(--danger-soft); color:var(--red-text-soft); }
  .r-status.pending_review{ background:var(--purple-soft); color:var(--purple-text); }
  .r-status.done{ background:var(--success-soft); color:var(--success-text); }
  .r-status.cancelled{ background:var(--surface-3); color:var(--text-tertiary); }

  /* Shared lifecycle/severity pill palette — used by the Accounting/Risk/Review Case
     screens (journal entry status, risk finding severity+status, review case status).
     Reuses the same soft/text token pairs as the order-status pills above rather than
     inventing a new palette per screen. */
  .r-status.sev-low{ background:var(--info-soft); color:var(--info-text); }
  .r-status.sev-medium{ background:var(--warning-soft); color:var(--warning-text); }
  .r-status.sev-high{ background:var(--danger-soft); color:var(--red-text-soft); }
  .r-status.sev-none{ background:var(--surface-3); color:var(--text-tertiary); }
  .r-status.stage-new{ background:var(--info-soft); color:var(--info-text); }
  .r-status.stage-pending{ background:var(--warning-soft); color:var(--warning-text); }
  .r-status.stage-done{ background:var(--success-soft); color:var(--success-text); }
  .r-status.stage-closed{ background:var(--purple-soft); color:var(--purple-text); }
  .r-evidence-grid{ display:flex; flex-direction:column; gap:6px; background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-sm); padding:12px; }
  .r-evidence-row{ display:flex; align-items:center; justify-content:space-between; font-size:11.5px; gap:10px; }
  .r-evidence-row span{ color:var(--text-tertiary); }
  .r-evidence-row b{ font-weight:600; }

  .r-order-card{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:15px 16px; margin-bottom:10px; width:100%; text-align:right; transition:.18s var(--ease-out); box-shadow:var(--shadow-sm); }
  .r-order-card:hover{ border-color:var(--border-strong); }
  .r-order-top{ display:flex; align-items:center; justify-content:space-between; margin-bottom:9px; gap:8px; }
  .r-order-top b{ font-size:13.5px; font-weight:600; }
  .r-order-meta{ display:flex; justify-content:space-between; color:var(--text-tertiary); font-size:11px; }
  .r-timeline{ margin-top:14px; border-top:1px solid var(--border); padding-top:14px; display:flex; flex-direction:column; gap:12px; }
  .r-timeline-item{ display:flex; align-items:center; gap:10px; font-size:12.5px; color:var(--text-tertiary); }
  .r-timeline-item .dot{ width:8px; height:8px; border-radius:50%; background:var(--surface-3); border:1.5px solid var(--border-strong); flex-shrink:0; }
  .r-timeline-item.active .dot{ background:var(--red); border-color:var(--red); }
  .r-timeline-item.active{ color:var(--text-primary); font-weight:600; }

  .r-empty{ text-align:center; padding:60px 20px; color:var(--text-tertiary); position:relative; isolation:isolate; animation:fadeIn .3s var(--ease-out); }
  /* فاز ۴۳ اضافه کرده بود یه دایره‌ی گرادیانی پشت آیکون؛ فاز ۵۲ — کاربر با اسکرین‌شات
     واقعی نشون داد این دقیقاً همون «حباب قرمز رنگی» بود که چندبار توصیف کلامی نتونست
     دقیق پیداش کنه (درس فاز ۲۴: اسکرین‌شات سریع‌تر از حدسه) — حذف شد، فقط آیکون
     تنها می‌مونه، بدون پس‌زمینه‌ی رنگی. */
  .r-empty .r-empty-icon-wrap{ width:72px; height:72px; margin:0 auto 16px; border-radius:50%; display:flex; align-items:center; justify-content:center; position:relative; }
  .r-empty svg{ width:34px; height:34px; opacity:.75; position:relative; color:var(--text-secondary); }
  .r-empty > svg{ width:38px; height:38px; margin-bottom:14px; opacity:.6; position:relative; } /* fallback for any .r-empty که هنوز از wrap استفاده نمی‌کنه */
  .r-empty div{ font-size:13px; position:relative; }
  .r-empty .r-btn{ width:auto; padding:0 22px; height:40px; margin:16px auto 0; font-size:12.5px; }
  /* Rosette watermark behind every empty state app-wide (orders/wallet/catalog
     search/invoices/reports/notifications all share .r-empty) — one rule, uplifts all. */
  .r-empty::before{
    content:''; position:absolute; z-index:-1; pointer-events:none; top:50%; left:50%;
    width:150px; height:150px; transform:translate(-50%,-50%); opacity:.10;
    background-image:var(--motif-rosette-muted); background-repeat:no-repeat; background-size:contain;
  }

  .r-tabs{ display:flex; gap:8px; margin-bottom:18px; overflow-x:auto; padding-bottom:2px; scrollbar-width:none; }
  .r-tabs::-webkit-scrollbar{ display:none; }
  .r-tab{ background:transparent; border:1px solid var(--border-strong); color:var(--text-secondary); padding:8px 15px; border-radius:var(--r-lg); font-size:12px; white-space:nowrap; transition:.2s var(--ease-out); }
  .r-tab.active{ background:var(--text-primary); color:var(--bg); border-color:var(--text-primary); font-weight:600; }

  /* فاز ۷۳ ادامه — کاربر گزارش داد پنل «کاربران و نقش‌ها» رو موبایل ظاهرش خرابه:
     renderAdminTeam() یه دراپ‌داون نقش + تا ۴ دکمه‌ی اکشن رو همون یه ردیفِ بدون-
     wrap می‌ذاشت — رو ۳۷۵px این محتوا از عرض کارت رد می‌شد و بی‌صدا (بدون
     اسکرول) از صفحه بیرون می‌زد. تأیید شد با یه harness مجزا (نه فقط خوندن CSS)
     رو ۳۷۵px. رفع شد با flex-wrap رو خودِ r-admin-row + r-admin-actions —
     min-width:0 رو r-admin-row-info لازمه وگرنه فلکس‌باکس عرض کامل متن رو به‌عنوان
     حداقل عرض می‌گیره و wrap هیچ‌وقت اتفاق نمی‌افته. عمداً media query نذاشتیم:
     ردیف‌های ساده‌ی دیگه (گروه/خدمت/کد تخفیف/پکیج، فقط ۲ دکمه) با همین محتوا رو
     همین عرض جا می‌شن و اصلاً wrap نمی‌کنن (تأیید شد با اجرای واقعی) — فقط
     ردیف‌هایی که واقعاً جا کم میارن (مثل همین‌جا) به یه ردیف دوم می‌رن.
  */
  .r-admin-row{ display:flex; align-items:center; justify-content:space-between; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:16px; margin-bottom:9px; box-shadow:var(--shadow-sm); flex-wrap:wrap; gap:10px; }
  .r-admin-row-info{ min-width:0; }
  .r-admin-row-info b{ font-size:13.5px; display:block; font-weight:600; margin-bottom:2px; }
  .r-admin-row-info span{ font-size:11px; color:var(--text-tertiary); }
  .r-admin-actions{ display:flex; gap:6px; flex-wrap:wrap; justify-content:flex-end; }
  .r-icon-btn{ width:30px; height:30px; border-radius:8px; background:var(--surface-2); border:1px solid var(--border-strong); color:var(--text-secondary); display:flex; align-items:center; justify-content:center; }
  .r-icon-btn svg{ width:14px; height:14px; }
  .r-icon-btn.danger{ color:var(--red-text-soft); }

  .r-toast{ position:fixed; top:74px; left:50%; transform:translateX(-50%); background:var(--surface-3); border:1px solid var(--border-strong); color:var(--text-primary); padding:11px 20px; border-radius:var(--r-lg); font-size:12.5px; z-index:200; box-shadow:0 10px 30px rgba(0,0,0,.4); animation:fadeDown .2s ease; font-weight:500; }
  /* فاز ۴۴ — نوار اطلاع‌رسانی نسخه‌ی جدید. بر خلاف toast خودکار محونشو، این می‌مونه تا
     کاربر خودش تصمیم بگیره — پس رنگش هم عمداً پررنگ‌تر (گرادیان برند) تا دیده بشه ولی
     مودال/دیالوگ مزاحم هم نیست، فقط یه نوار بالای همه‌چی. */
  #rama-update-banner{ position:fixed; top:0; right:0; left:0; z-index:9999; background:var(--gradient-brand); color:var(--on-accent); display:flex; align-items:center; justify-content:center; gap:14px; padding:calc(10px + env(safe-area-inset-top)) 16px 10px; font-size:12.5px; font-weight:600; box-shadow:var(--shadow-md); animation:fadeDown .25s var(--ease-out); flex-wrap:wrap; }
  #rama-update-btn{ background:rgba(0,0,0,.22); color:var(--on-accent); border:none; border-radius:999px; padding:6px 16px; font-size:12px; font-weight:700; cursor:pointer; transition:.15s var(--ease-out); }
  #rama-update-btn:hover{ background:rgba(0,0,0,.34); }
  #rama-update-btn:active{ transform:scale(.95); }

  /* فاز ۱۶۱-ب — کوچ‌مارکِ آموزشِ اولین‌ورود؛ سیبلینگِ مستقلِ #rama-root (هم‌الگوی
     #rama-update-banner)، بالاتر از همه‌چیزِ دیگه حتی خودِ بنرِ آپدیت. کلِ سطح، عمداً
     pointer-events دارد — تعامل با زیرِ اپ حینِ تور بسته‌ست، فقط دکمه‌های خودِ حباب
     فعالن؛ کاربر با «بعدی»/«رد کردن» جلو می‌ره، نه با کلیکِ مستقیمِ هدفِ اسپاتلایت. */
  #rama-coachmark{ position:fixed; inset:0; z-index:10000; }
  /* تکنیکِ استانداردِ CSS برای cutout: یه سایه‌ی خیلی بزرگ رو یه باکسِ شفافِ هم‌اندازه‌ی
     هدف — ساده‌تر از clip-path و مستقل از شکلِ دقیقِ هدف. transition رو top/left/
     width/height یعنی جابه‌جاییِ بینِ گام‌ها واقعاً سُر می‌خوره، نه می‌پره (چون همین
     یه المان فقط style می‌گیره، نه بازسازی — repositionCoachmark). */
  #rama-coachmark-spotlight{ position:fixed; box-shadow:0 0 0 9999px rgba(10,7,6,.8); transition:top .3s var(--ease-out), left .3s var(--ease-out), width .3s var(--ease-out), height .3s var(--ease-out), border-radius .3s var(--ease-out); }
  #rama-coachmark-bubble{ position:fixed; background:var(--gradient-brand); color:var(--on-accent); border-radius:var(--r-lg); padding:16px 18px; box-shadow:var(--shadow-lg); animation:fadeIn .3s var(--ease-out); transition:top .3s var(--ease-out), bottom .3s var(--ease-out), left .3s var(--ease-out); }
  #rama-coachmark-bubble::before{ content:''; position:absolute; width:14px; height:14px; background:inherit; right:0; left:0; margin:0 auto; }
  #rama-coachmark-bubble.below::before{ top:-6px; transform:rotate(45deg); border-radius:3px 0 0 0; }
  #rama-coachmark-bubble.above::before{ bottom:-6px; transform:rotate(45deg); border-radius:0 0 3px 0; }
  #rama-coachmark-text{ margin:0 0 12px; font-size:13.5px; font-weight:600; line-height:1.7; position:relative; }
  #rama-coachmark-actions{ display:flex; align-items:center; justify-content:space-between; gap:12px; position:relative; }
  #rama-coachmark-skip{ background:none; border:none; color:rgba(255,255,255,.82); font-size:12px; text-decoration:underline; cursor:pointer; padding:4px; }
  #rama-coachmark-next{ background:rgba(0,0,0,.22); color:var(--on-accent); border:none; border-radius:999px; padding:8px 18px; font-size:12.5px; font-weight:700; cursor:pointer; transition:.15s var(--ease-out); white-space:nowrap; }
  #rama-coachmark-next:hover{ background:rgba(0,0,0,.34); }
  #rama-coachmark-next:active{ transform:scale(.95); }
  @keyframes fadeDown{ from{ opacity:0; transform:translate(-50%,-8px);} to{opacity:1; transform:translate(-50%,0);} }
  .r-loading{ display:flex; align-items:center; justify-content:center; padding:70px 0; color:var(--text-secondary); font-size:13px; gap:10px; }
  .r-login-screen{ min-height:100vh; display:flex; align-items:center; justify-content:center; padding:24px; background:var(--bg); position:relative; overflow:hidden; }
  /* فاز ۴۷ — «جسورانه‌تر ادامه بده»: یه هاله‌ی طلایی زنده دور کارت ورود که آروم نفس
     می‌کشه (نه ثابت) — همون حس اول‌برخورد «این یه اپ معمولی نیست»ی که خواسته شد. */
  .r-login-box{ width:100%; max-width:340px; display:flex; flex-direction:column; align-items:center; text-align:center; background:var(--surface); border:1.5px solid var(--gold-line); border-radius:var(--r-lg); padding:32px 24px; box-shadow:var(--shadow-lg), 0 0 60px rgba(226,182,92,.08); position:relative; animation:staggerFadeUp .6s var(--ease-out) both, loginGlow 4s ease-in-out .6s infinite; }
  @keyframes loginGlow{
    0%,100%{ box-shadow:var(--shadow-lg), 0 0 60px rgba(226,182,92,.08); }
    50%{ box-shadow:var(--shadow-lg), 0 0 90px rgba(226,182,92,.20); }
  }
  /* Opacity-only fade (never animate transform here — .tl/.tr/.bl/.br already set a
     static flip transform per corner, and animating transform would fight that). */
  .r-login-box .r-spandrel-corner{ animation:spandrelFadeIn .8s .4s var(--ease-ornament) both; }
  @keyframes spandrelFadeIn{ from{ opacity:0; } to{ opacity:.8; } }
  .r-login-logo{ width:68px; height:68px; border-radius:18px; object-fit:cover; background:#000; margin-bottom:12px; box-shadow:var(--shadow-md), 0 0 0 3px var(--gold-soft), 0 0 24px rgba(226,182,92,.25); }
  .r-login-tagline{ font-size:12px; color:var(--text-tertiary); margin-top:2px; }
  .r-spin{ width:16px; height:16px; border:2px solid var(--border-strong); border-top-color:var(--red); border-radius:50%; animation:spin .7s linear infinite; }
  @keyframes spin{ to{ transform:rotate(360deg); } }
  /* فاز ۱۵۷/۱۵۸/۱۵۹ — اسپلش‌اسکرینِ برندشده‌ی اولین باز کردنِ اپ، هم‌زبونِ .r-login-screen
     (همون پترن‌ها/گرادیان‌ها) ولی تمام‌صفحه و بدون فرم. ورودش یه ظهورِ نرم (فید+اسکیلِ
     ملایم، به‌جای translateY خشکِ قبلی)، خروجش (کلاسِ r-splash-exit، از JS ست می‌شه)
     یه محوشدنِ نرمِ متقارن — هیچ‌کدوم پرشِ ناگهانی نیستن. */
  .r-splash-screen{ min-height:100vh; display:flex; flex-direction:column; align-items:center; justify-content:center; padding:24px; background:var(--bg); position:relative; overflow:hidden; }
  .r-splash-screen.r-splash-exit{ animation:splashFadeOut .38s var(--ease-out) both; }
  @keyframes splashFadeOut{ to{ opacity:0; transform:scale(1.015); } }
  .r-splash-content{ display:flex; flex-direction:column; align-items:center; text-align:center; animation:splashReveal 1s var(--ease-out) both; }
  @keyframes splashReveal{ from{ opacity:0; transform:translateY(18px) scale(.96); } to{ opacity:1; transform:translateY(0) scale(1); } }
  /* فاز ۱۵۹ — باگِ واقعی: اینجا قبلاً animation:loginGlow روی خودِ لوگو بود، ولی
     loginGlow فقط ۲ لایه‌ی box-shadow تعریف می‌کنه (shadow-lg + یه glow)، در حالی که
     box-shadowِ استاتیکِ خودِ این المان ۳ لایه‌ست (shadow-lg + حلقه‌ی طلایی ۴px + glow).
     چون animation کل مقدارِ box-shadow رو (نه فقط چیزی که توش تغییر می‌کنه) جایگزین
     می‌کنه، دقیقاً لحظه‌ی شروعِ انیمیشن (بعد از ۰.۵s delay) حلقه‌ی طلایی ناگهان محو
     می‌شد و شعاع/شفافیتِ glow می‌پرید — این پرش، درست وسطِ فیدِ ورودی (که هنوز کامل
     تموم نشده)، دقیقاً همون «انگار لوگو دوبار ظاهر می‌شه» رو کاربر گزارش کرد. رفع:
     هیچ pulseِ box-shadowی رو خودِ تصویرِ لوگو نیست (عیناً هم‌الگوی .r-login-logo که
     همیشه هم همین‌طور بوده — پالسِ درخشش تو صفحه‌ی ورود رو خودِ کارت است، نه لوگو). */
  .r-splash-logo{ width:104px; height:104px; border-radius:26px; object-fit:cover; background:#000; margin-bottom:18px; box-shadow:var(--shadow-lg), 0 0 0 4px var(--gold-soft), 0 0 40px rgba(226,182,92,.3); }
  .r-splash-wordmark{ font-size:38px !important; letter-spacing:4px; }
  .r-splash-tagline{ font-size:14px; color:var(--text-tertiary); margin-top:8px; letter-spacing:.3px; }
  .r-splash-version{ position:fixed; left:0; right:0; bottom:20px; text-align:center; opacity:.4; font-size:11px; pointer-events:none; }
  .r-code-applied{ display:flex; align-items:center; gap:8px; background:var(--success-soft); border:1px solid var(--success); border-radius:var(--r-sm); padding:9px 12px; margin-top:8px; font-size:12px; color:var(--success-text); }
  .r-code-applied svg{ width:15px; height:15px; flex-shrink:0; }
  .r-code-applied span{ flex:1; }
  .r-code-applied button{ background:none; border:none; color:var(--success-text); opacity:.7; }
  .r-code-applied button svg{ width:12px; height:12px; }
  .r-file-row{ display:flex; align-items:center; gap:8px; background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-sm); padding:8px 10px; margin-bottom:6px; font-size:11.5px; }
  .r-file-row svg{ width:15px; height:15px; color:var(--text-secondary); flex-shrink:0; }
  .r-file-name{ flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .r-file-size{ color:var(--text-tertiary); font-size:10.5px; flex-shrink:0; }
  .r-file-row button{ background:none; border:none; color:var(--text-tertiary); flex-shrink:0; }
  .r-file-row button svg{ width:12px; height:12px; }

  /* account hub */
  .r-account-card{ display:flex; align-items:center; gap:12px; width:100%; background:linear-gradient(160deg, var(--surface-2), var(--surface)); border:1px solid var(--border); border-radius:var(--r-md); padding:16px; text-align:right; margin-top:8px; box-shadow:var(--shadow-md); }
  .r-account-card-info{ flex:1; min-width:0; }
  .r-account-card-info b{ display:block; font-size:14px; }
  .r-account-card-info span{ font-size:11px; color:var(--text-tertiary); }
  .r-plan-chip{ font-size:10.5px; font-weight:700; padding:5px 10px; border-radius:var(--r-lg); flex-shrink:0; }
  .r-account-menu{ display:flex; flex-direction:column; gap:8px; }
  .r-account-menu-item{ display:flex; align-items:center; gap:12px; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:13px 14px; width:100%; text-align:right; box-shadow:var(--shadow-sm); }
  .r-account-menu-item:hover{ border-color:var(--border-strong); }
  .r-account-menu-text{ flex:1; min-width:0; display:flex; flex-direction:column; gap:2px; }
  .r-account-menu-text b{ font-size:13px; font-weight:600; }
  .r-account-menu-text span{ font-size:10.5px; color:var(--text-tertiary); }
  /* فاز ۹۱ — ورودی موبایل گفتگوی زنده، هم‌الگوی .r-account-menu-item ولی برجسته‌تر
     (پس‌زمینه‌ی قرمزِ خیلی‌کم‌رنگ + حاشیه‌ی قرمز) تا مثل سایدبار دسکتاپ واقعاً چشم‌گیر
     باشه، نه یه ردیف معمولی دیگه. */
  .r-chat-fab-row{ display:flex; align-items:center; gap:14px; background:var(--red-soft); border:1px solid var(--red-hover); border-radius:var(--r-md); padding:13px 14px; width:100%; text-align:right; box-shadow:var(--shadow-md); margin-bottom:16px; }
  .r-chat-fab-row:active{ transform:scale(.98); }

  .r-nav-badge{ position:absolute; top:2px; left:calc(50% - 18px); background:var(--red-hover); color:var(--on-accent); font-size:9px; font-weight:700; min-width:15px; height:15px; border-radius:var(--r-lg); display:flex; align-items:center; justify-content:center; padding:0 3px; }
  .r-nav-item{ position:relative; }

  .r-contact-row{ display:flex; align-items:center; gap:10px; background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-sm); padding:11px 13px; margin-bottom:8px; color:var(--text-primary); font-size:12.5px; direction:ltr; unicode-bidi:isolate; justify-content:flex-end; }
  .r-contact-row svg{ width:16px; height:16px; color:var(--text-secondary); flex-shrink:0; }

  .r-notif-item{ display:flex; align-items:flex-start; gap:12px; width:100%; text-align:right; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:13px 14px; margin-bottom:8px; position:relative; box-shadow:var(--shadow-sm); }
  .r-notif-item.unread{ border-color:var(--border-strong); background:var(--surface-2); }
  .r-unread-dot{ width:8px; height:8px; border-radius:50%; background:var(--red); flex-shrink:0; margin-top:6px; }

  .r-plans-grid{ display:grid; grid-template-columns:1fr; gap:14px; }
  @media (min-width:640px){ .r-plans-grid{ grid-template-columns:repeat(2,1fr); } }
  @media (min-width:1024px){ .r-plans-grid{ grid-template-columns:repeat(4,1fr); } }
  .r-plan-card{ background:linear-gradient(165deg, var(--surface-2), var(--surface)); border:1.5px solid var(--border); border-radius:var(--r-lg); padding:18px; display:flex; flex-direction:column; gap:12px; box-shadow:var(--shadow-md); }
  .r-plan-badge{ display:inline-block; font-size:12px; font-weight:800; padding:6px 12px; border-radius:var(--r-lg); width:fit-content; }
  .r-plan-price{ font-size:18px; font-weight:800; }
  .r-plan-perks{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:8px; flex:1; }
  .r-plan-perks li{ display:flex; align-items:flex-start; gap:8px; font-size:11.5px; color:var(--text-secondary); line-height:1.6; }
  .r-plan-perks li svg{ width:14px; height:14px; color:var(--success-text); flex-shrink:0; margin-top:2px; }

  /* فاز ۹۱ — کاربر گزارش داد ردیف افقیِ اسکرول‌شونده باعث می‌شد برای دیدن پکیج‌های
     بعدی باید «به بغل» رفت — خواست عیناً مثل گرید گروه‌های خدمت (.r-groups) بدون
     اسکرول افقی همه‌ی پکیج‌ها دیده بشن. */
  .r-packages-row{ display:grid; grid-template-columns:1fr 1fr; gap:10px; }
  @media (min-width:560px) and (max-width:1023px){ .r-packages-row{ grid-template-columns:repeat(3,1fr); } }
  @media (min-width:1024px){ .r-packages-row{ grid-template-columns:repeat(4,1fr); } }
  /* فاز ۹۰ — سایز/فونت کارت پکیج عیناً با .r-group-icon/.r-group-card هم‌راستا شد. */
  .r-package-card{ width:100%; background:linear-gradient(160deg, var(--gold-soft), var(--surface)); border:1px solid var(--border-strong); border-radius:var(--r-md); padding:16px; display:flex; flex-direction:column; gap:14px; text-align:right; box-shadow:var(--shadow-md); position:relative; overflow:hidden; transition:.25s var(--ease-out); perspective:500px; }
  .r-package-card:hover{ border-color:var(--gold-line); box-shadow:var(--shadow-lg); transform:translateY(-4px); }
  .r-package-icon{
    width:72px; height:72px; border-radius:22px; background:var(--surface-3); color:var(--gold-text-soft); display:flex; align-items:center; justify-content:center; position:relative; overflow:hidden;
    box-shadow:inset 0 2px 0 rgba(255,255,255,.16), inset 0 -4px 10px rgba(0,0,0,.28), 0 14px 26px rgba(0,0,0,.38), 0 3px 6px rgba(0,0,0,.22);
    transition:transform .3s var(--ease-out), box-shadow .3s var(--ease-out);
    animation:iconFloat 5s ease-in-out infinite;
  }
  .r-package-card:hover .r-package-icon{ transform:rotateY(-10deg) rotateX(6deg) translateZ(6px) scale(1.06); }
  .r-package-icon svg{ width:42px; height:42px; filter:drop-shadow(0 3px 4px rgba(0,0,0,.35)); }
  .r-package-card b{ font-size:16px; font-weight:700; }
  .r-package-card span{ font-size:12.5px; color:var(--text-tertiary); }
  .r-package-price{ margin-top:auto; padding-top:8px; border-top:1px solid var(--border-strong); display:flex; align-items:center; gap:8px; }
  .r-package-price s{ font-size:10.5px; color:var(--text-tertiary); }
  .r-package-price b{ font-size:13px; color:var(--gold-text-soft); }

  .r-gauge-wrap{ position:relative; display:flex; flex-direction:column; align-items:center; }
  .r-gauge-center{ position:absolute; bottom:0; left:0; right:0; text-align:center; display:flex; flex-direction:column; align-items:center; }
  .r-gauge-center b{ font-size:20px; font-weight:800; }
  .r-gauge-center span{ font-size:10px; color:var(--text-tertiary); }
  .r-remaining-item{ display:flex; align-items:center; gap:10px; padding:9px 0; border-bottom:1px solid var(--border); }
  .r-remaining-item:last-child{ border-bottom:none; padding-bottom:0; }
  .r-remaining-dot{ width:8px; height:8px; border-radius:50%; flex-shrink:0; }
  .r-divider{ height:1px; background:var(--border); margin:18px 0; }
  .r-referral-card{ background:linear-gradient(160deg, var(--gold-soft), var(--surface-2)); border:1px solid var(--border-strong); border-radius:var(--r-md); padding:16px; box-shadow:var(--shadow-md); }
  .r-referral-code{ display:flex; align-items:center; justify-content:space-between; background:var(--surface); border:1px dashed var(--border-strong); border-radius:var(--r-sm); padding:12px 14px; }
  .r-referral-code span{ font-size:16px; font-weight:800; letter-spacing:.5px; color:var(--gold-text-soft); font-family:var(--font-display); direction:ltr; unicode-bidi:isolate; }
  .r-btn-copy{ background:var(--surface-3); border:1px solid var(--border-strong); color:var(--text-primary); border-radius:8px; padding:6px 14px; font-size:11.5px; font-weight:600; }
  .r-btn-copy:hover{ border-color:var(--gold); }
  .r-ref-stats{ display:flex; gap:10px; margin-top:4px; }
  .r-ref-stats > div{ flex:1; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-sm); padding:12px; text-align:center; }
  .r-ref-stats b{ display:block; font-size:16px; margin-bottom:3px; }
  .r-ref-stats span{ font-size:10.5px; color:var(--text-tertiary); }
  .r-small-note{ font-size:11.5px; color:var(--text-tertiary); margin-top:6px; line-height:1.6; }
  .r-balance-card{ background:linear-gradient(160deg, var(--surface-2), var(--surface)); border:1.5px solid var(--gold-line); border-radius:var(--r-lg); padding:28px 22px; margin-bottom:18px; box-shadow:var(--shadow-lg), inset 0 0 0 1px rgba(226,182,92,.14); position:relative; overflow:hidden; }
  .r-balance-card .label{ font-size:12px; color:var(--text-secondary); margin-bottom:8px; }
  .r-balance-card .amount{ font-size:40px; font-weight:800; letter-spacing:-.8px; font-variant-numeric:tabular-nums; background:linear-gradient(120deg, var(--text-primary) 30%, var(--gold-text-soft)); -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; }
  .r-balance-card .amount span.unit{ font-size:14px; color:var(--text-tertiary); font-weight:500; margin-right:6px; }

  /* فاز ۱۶۱ — فاکتور خدمات: چیدمانِ موبایل‌محور (ردیف‌ها کارت‌اند، جمع‌ها فشرده، جمعِ نهایی در فوترِ چسبان) */
  .r-inv-line{ background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-sm); padding:12px 12px 8px; margin-bottom:10px; }
  .r-inv-line-head{ display:flex; justify-content:space-between; align-items:center; margin-bottom:8px; font-size:12px; font-weight:700; color:var(--text-secondary); }
  .r-inv-line .r-field{ margin-bottom:10px; min-width:0; }
  .r-inv-line input{ min-width:0; }
  .r-inv-line-grid{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,2fr); gap:10px; }
  .r-inv-line-total{ font-size:12px; font-weight:700; color:var(--gold-text-soft); padding-bottom:4px; }
  .r-inv-two{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:10px; }
  .r-inv-two .r-field{ margin-bottom:12px; min-width:0; }
  .r-inv-sum{ border:1px solid var(--border); border-radius:var(--r-sm); padding:2px 12px; margin-top:10px; background:var(--surface-2); }
  .r-inv-sum-row{ display:flex; justify-content:space-between; align-items:flex-start; gap:12px; padding:9px 0; font-size:13px; color:var(--text-secondary); }
  .r-inv-sum-row + .r-inv-sum-row{ border-top:1px dashed var(--border); }
  .r-inv-sum-row b{ color:var(--text-primary); font-weight:700; white-space:nowrap; }
  .r-inv-sum-row.grand{ font-size:14px; color:var(--text-primary); }
  .r-inv-sum-row.grand b{ color:var(--gold-text-soft); font-size:15px; }
  .r-inv-cust{ display:flex; justify-content:space-between; align-items:center; gap:10px; padding:10px 12px; background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-sm); margin-bottom:6px; cursor:pointer; font-size:12.5px; }
  .r-inv-cust > div{ line-height:1.9; }
  .r-inv-cust span{ font-size:11.5px; color:var(--text-tertiary); }
  .r-inv-footer{ gap:12px; }
  .r-inv-foot-total{ display:flex; flex-direction:column; flex:0 0 auto; min-width:0; line-height:1.5; }
  .r-inv-foot-total small{ font-size:10.5px; color:var(--text-tertiary); }
  .r-inv-foot-total b{ font-size:14px; color:var(--gold-text-soft); white-space:nowrap; }
  .r-inv-footer .r-btn{ flex:1; }

  /* ============ فاز ۱۶۲ — تقارن و اصالتِ هویتِ بصری (دسکتاپ) ============
     مشکلِ دیده‌شده در نمایشِ دسکتاپ: (۱) ردیفِ آخرِ گریدِ کارت‌ها (۵/۶ مورد در ۴ ستون) چپ‌چین می‌ماند و یک سمتِ صفحه خالی؛
     (۲) تزئینِ گوشهٔ کارت‌ها فقط یک «نقطهٔ طلاییِ سرگردان» بود (مسیرِ خط تا هاور مخفی)؛ (۳) جداکننده‌ها خطِ ساده؛
     (۴) ناحیهٔ اصلیِ صفحه هیچ نقشِ فارسی نداشت و پایینِ صفحه‌هایِ کم‌محتوا کاملاً خالی بود.
     همه‌چیز فقط CSS، فقط دسکتاپ/تبلت برایِ چیدمان، و از همان واژگانِ نقشِ موجود (ترنج، گوشه‌یِ تذهیب، طلا) استفاده می‌کند. */
  :root{ --motif-medallion-faint: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='360' height='360' viewBox='0 0 360 360'%3E%3Cg fill='none' stroke='%23E2B65C' stroke-opacity='.10'%3E%3Ccircle cx='180' cy='180' r='150' stroke-width='1.4'/%3E%3Ccircle cx='180' cy='180' r='128' stroke-width='1'/%3E%3Crect x='95' y='95' width='170' height='170' stroke-width='1.3'/%3E%3Crect x='95' y='95' width='170' height='170' transform='rotate(45 180 180)' stroke-width='1.3'/%3E%3Ccircle cx='180' cy='180' r='40' stroke-width='1.3'/%3E%3C/g%3E%3C/svg%3E"); --motif-corner-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48' fill='none' stroke='black' stroke-width='1.7' stroke-linecap='round'%3E%3Cpath d='M4 44 Q4 20 20 12 Q30 7 44 8'/%3E%3Ccircle cx='44' cy='8' r='2.4' fill='black' stroke='none'/%3E%3Cpath d='M13 31q4-7 13-7' stroke-width='1.3' opacity='.8'/%3E%3C/svg%3E"); }
  :root[data-theme='light']{ --motif-medallion-faint: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='360' height='360' viewBox='0 0 360 360'%3E%3Cg fill='none' stroke='%238A6410' stroke-opacity='.13'%3E%3Ccircle cx='180' cy='180' r='150' stroke-width='1.4'/%3E%3Ccircle cx='180' cy='180' r='128' stroke-width='1'/%3E%3Crect x='95' y='95' width='170' height='170' stroke-width='1.3'/%3E%3Crect x='95' y='95' width='170' height='170' transform='rotate(45 180 180)' stroke-width='1.3'/%3E%3Ccircle cx='180' cy='180' r='40' stroke-width='1.3'/%3E%3C/g%3E%3C/svg%3E"); }

  /* ۱) گریدِ کارت‌ها: ردیفِ ناقص وسط‌چین (تقارنِ دو طرف)؛ ۵ یا ۶ کارت → ۳ ستون (۲×۳ / ۳+۲ متقارن) */
  @media (min-width:560px){
    .r-groups{ display:flex; flex-wrap:wrap; justify-content:center; gap:10px; }
    .r-groups > .r-group-card{ flex:0 0 calc((100% - 20px) / 3); max-width:calc((100% - 20px) / 3); }
  }
  @media (min-width:1024px){
    .r-groups > .r-group-card{ flex:0 0 calc((100% - 30px) / 4); max-width:calc((100% - 30px) / 4); }
    .r-groups:has(> :nth-child(5)):not(:has(> :nth-child(7))) > .r-group-card{ flex-basis:calc((100% - 20px) / 3); max-width:calc((100% - 20px) / 3); }
  }

  /* ۲) گوشهٔ تذهیب: در حالتِ عادی کاملاً کشیده و کم‌رنگ (نه فقط نقطه)، با گوشهٔ هم‌ضلع در پایین (آینهٔ عمودی، سمتِ خالیِ کارت؛ زیرِ متنِ راست‌چین نمی‌افتد) → تقارنِ آینه‌ای */
  .r-group-card .r-ornament-corner path, .r-group-card .r-ornament-corner circle,
  .r-package-card .r-ornament-corner path, .r-package-card .r-ornament-corner circle{ stroke-dashoffset:0; }
  .r-group-card .r-ornament-corner, .r-package-card .r-ornament-corner{ opacity:.55; transition:opacity .25s var(--ease-out); }
  .r-group-card:hover .r-ornament-corner, .r-package-card:hover .r-ornament-corner{ opacity:1; }
  .r-group-card::after{
    content:''; position:absolute; bottom:10px; left:10px; width:32px; height:32px; pointer-events:none;
    background:var(--gold-line); opacity:.55; transform:scaleY(-1); transition:opacity .25s var(--ease-out);
    -webkit-mask:var(--motif-corner-mask) center / contain no-repeat; mask:var(--motif-corner-mask) center / contain no-repeat;
  }
  .r-group-card:hover::after{ opacity:1; }

  /* ۳) جداکنندهٔ تزئینی: دو خطِ محوشونده + لوزیِ طلاییِ وسط (کاملاً متقارن) */
  .r-divider{
    position:relative; height:14px; margin:24px 0;
    background:
      linear-gradient(90deg, transparent, var(--border-strong)) left center / calc(50% - 20px) 1px no-repeat,
      linear-gradient(270deg, transparent, var(--border-strong)) right center / calc(50% - 20px) 1px no-repeat;
  }
  .r-divider::before{
    content:''; position:absolute; left:50%; top:50%; width:9px; height:9px; margin:-4.5px 0 0 -4.5px;
    transform:rotate(45deg); border:1px solid var(--gold-line); background:var(--bg);
  }
  .r-divider::after{ content:''; position:absolute; left:50%; top:50%; width:3px; height:3px; margin:-1.5px 0 0 -1.5px; border-radius:50%; background:var(--gold-line); }

  /* ۴) ترنجِ بسیار کم‌رنگ و دقیقاً وسطِ ناحیهٔ اصلی (پشتِ محتوا، pointer-events ندارد چون فقط background است) */
  @media (min-width:1024px){
    .r-main{ background:var(--motif-medallion-faint) no-repeat center 96px / 640px 640px; min-height:calc(100vh - 80px); }
  }

  /* ============ S1 — قرینگیِ کابینِ مدیر (اندازه‌گیری‌شده با ابزار، نه چشمی) ============
     کاشی‌هایِ «نیاز به اقدام» ۷ تاست: دسکتاپ/تبلت ۴ + ۳ با عرضِ کامل در هر دو ردیف (۱۲ ستون: ۴×۳ و ۳×۴) به‌جایِ ۵+۲ / ۴+۳؛
     موبایل ۲ ستون و آخرین کاشیِ فرد تمام‌عرض. همان قاعده برایِ کاشی‌هایِ کوچکِ ثانوی و کارت‌هایِ «کاربران و رشد». */
  @media (min-width:760px){
    .r-ops-grid:has(> :nth-child(7):last-child){ grid-template-columns:repeat(12, minmax(0,1fr)); }
    .r-ops-grid:has(> :nth-child(7):last-child) > *{ grid-column:span 3; }
    .r-ops-grid:has(> :nth-child(7):last-child) > :nth-child(n+5){ grid-column:span 4; }
  }
  @media (max-width:759px){
    .r-ops-grid{ grid-template-columns:repeat(2, minmax(0,1fr)); }
    .r-ops-grid > :last-child:nth-child(odd),
    .r-kpi-strip > :last-child:nth-child(odd){ grid-column:1 / -1; }
  }
  .r-stats{ grid-template-columns:repeat(2, minmax(0,1fr)); }
  @media (min-width:560px){ .r-stats{ grid-template-columns:repeat(4, minmax(0,1fr)); } .r-stats.r-stats-2{ grid-template-columns:repeat(2, minmax(0,1fr)); } }
  .r-stats.r-stats-2{ grid-template-columns:repeat(2, minmax(0,1fr)); }

  /* ============ S1 — عمق و پرسپکتیو (درخواستِ مالک: «پرسپکتیو بیشتر تا نرم‌افزار جذاب‌تر شود») ============
     سه لایه‌یِ ارتفاع: صفحه (عمیق) ← کارت (شناور: سایه‌یِ دولایه + لبه‌یِ نورِ بالا + درخششِ ملایمِ بالایِ سطح) ← عنصرِ تعاملی
     (با هاور بالا می‌آید و اندکی رو به کاربر می‌چرخد). :where() ⇒ صفر specificity: هیچ پس‌زمینه/گرادیانِ اختصاصیِ کارت‌ها را
     نمی‌شکند، فقط جایی که چیزی تعریف نشده اضافه می‌شود. هرگونه حرکت با prefers-reduced-motion خاموش است. */
  :root{
    --elev-1: inset 0 1px 0 rgba(255,255,255,.05), 0 1px 2px rgba(0,0,0,.4), 0 10px 26px -14px rgba(0,0,0,.65);
    --elev-2: inset 0 1px 0 rgba(255,255,255,.07), 0 3px 6px rgba(0,0,0,.4), 0 22px 44px -18px rgba(0,0,0,.8);
    --elev-3: inset 0 1px 0 rgba(255,255,255,.08), 0 34px 80px -24px rgba(0,0,0,.85);
    --card-sheen: linear-gradient(180deg, rgba(255,255,255,.04) 0%, rgba(255,255,255,0) 42%);
    --well: inset 0 2px 4px rgba(0,0,0,.45);
  }
  :root[data-theme='light']{
    --elev-1: inset 0 1px 0 rgba(255,255,255,.75), 0 1px 2px rgba(20,22,26,.09), 0 10px 24px -14px rgba(20,22,26,.28);
    --elev-2: inset 0 1px 0 rgba(255,255,255,.85), 0 3px 6px rgba(20,22,26,.09), 0 22px 42px -18px rgba(20,22,26,.36);
    --elev-3: 0 34px 80px -24px rgba(20,22,26,.4);
    --card-sheen: linear-gradient(180deg, rgba(255,255,255,.5) 0%, rgba(255,255,255,0) 45%);
    --well: inset 0 2px 3px rgba(20,22,26,.12);
  }
  :where(.r-card, .r-kpi-tile, .r-ops-tile, .r-group-card, .r-insight, .r-seg-card, .r-pl-card, .r-stat-card, .r-account-menu, .r-admin-row){ box-shadow:var(--elev-1); }
  :where(.r-card, .r-kpi-tile, .r-ops-tile, .r-insight, .r-seg-card, .r-pl-card, .r-stat-card){ background-image:var(--card-sheen); }
  :where(.r-modal){ box-shadow:var(--elev-3); }
  .r-overlay{ backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px); }
  /* آیکون‌ها و حفره‌ها: برجسته / فرورفته */
  :where(.r-ops-icon, .r-kpi-gicon, .r-stat-icon, .r-action-icon){ box-shadow:inset 0 1px 0 rgba(255,255,255,.08), 0 6px 14px -6px rgba(0,0,0,.55); }
  :where(.r-hbar-track, .r-target-track, .r-wf-track, .r-kpi-seg){ box-shadow:var(--well); }
  /* نمودارها: ستون‌ها و نوارها حجم دارند (نور از بالا)، گیج و دونات کمی از سطح جدا */
  .r-hbar-track i, .r-mbar-col .val, .r-sbar .val{ background-image:linear-gradient(180deg, rgba(255,255,255,.22), rgba(255,255,255,0) 60%); }
  .r-pbar-cols i{ background-image:linear-gradient(180deg, rgba(255,255,255,.25), rgba(255,255,255,0) 65%); }
  .r-kgauge-dial svg, .r-kdonut-dial svg{ filter:drop-shadow(0 6px 10px rgba(0,0,0,.35)); }
  :root[data-theme='light'] .r-kgauge-dial svg, :root[data-theme='light'] .r-kdonut-dial svg{ filter:drop-shadow(0 5px 8px rgba(20,22,26,.16)); }
  /* دکمه‌یِ اصلی: فشرده می‌شود؛ دکمه‌یِ ثانوی کمی برجسته */
  .r-btn-primary:active{ transform:translateY(1px) scale(.99); }
  :where(.r-btn-ghost){ box-shadow:var(--elev-1); }
  @media (hover:hover) and (prefers-reduced-motion:no-preference){
    .r-kpi-click, .r-ops-tile, .r-group-card, .r-seg-card, .r-stat-card-btn{ transition:transform .22s var(--ease-out), box-shadow .22s var(--ease-out), border-color .2s; transform-origin:50% 100%; }
    .r-kpi-click:hover, .r-ops-tile:hover, .r-group-card:hover, .r-seg-card:hover, .r-stat-card-btn:hover, .r-insight:hover{
      /* --rx/--ry را index.html (rTilt) از رویِ مکانِ موس می‌گذارد؛ بدونِ آن همان کجیِ ثابتِ قبلی */
      transform:perspective(900px) translateY(-4px) rotateX(var(--rx, 3deg)) rotateY(var(--ry, 0deg)); box-shadow:var(--elev-2); border-color:var(--border-strong);
    }
    .r-insight{ transition:transform .22s var(--ease-out), box-shadow .22s var(--ease-out), border-color .2s; }
    button.r-score-row:hover{ transform:none; box-shadow:none; }
  }

  /* ============ S1 — هم‌ارتفاعیِ کنترل‌هایِ هم‌ردیف (اسکرین‌شاتِ مالک: سلکتِ نقش در ردیفِ کاربر بلندتر از دکمه‌ها بود و از خطِ ردیف بیرون می‌زد)
     اندازه‌گیری با ابزار در همه‌یِ بخش‌هایِ مدیر (۳۹۰ لمسی و ۱۴۴۰): سلکتِ نقش ۴۷–۵۱px کنارِ دکمه‌هایِ ۳۰px، فیلدِ برنامه‌ریز ۵۰ کنارِ دکمه‌یِ ۳۸،
     نوارِ بالا ۳۶/۳۴/۴۶. قاعده: هر ردیف یک ارتفاع — ردیف‌هایِ اکشن ۳۴px، نوارِ بالا ۴۰px، فرمِ یک‌خطی ۴۶px. */
  :root{ --ctl-h:34px; --ctl-h-top:40px; --ctl-h-form:46px; }
  .r-icon-btn{ width:var(--ctl-h); height:var(--ctl-h); flex-shrink:0; }
  .r-icon-btn svg{ width:15px; height:15px; }
  .r-admin-actions{ align-items:center; }
  .r-admin-actions .r-field select{ height:var(--ctl-h); padding:0 12px; line-height:1.2; font-size:12.5px; }
  .r-admin-actions .r-admin-toggle{ height:var(--ctl-h); display:inline-flex; align-items:center; padding:0 12px; }
  .r-topbar-actions{ align-items:center; }
  .r-topbar-actions .r-bell{ width:var(--ctl-h-top); height:var(--ctl-h-top); }
  .r-topbar-actions .r-admin-toggle{ height:var(--ctl-h-top); display:inline-flex; align-items:center; padding:0 14px; }
  .r-topbar-actions .r-topbar-user{ height:var(--ctl-h-top); padding-top:0; padding-bottom:0; box-sizing:border-box; }
  .r-topbar-actions .r-topbar-user .r-avatar-btn{ width:30px; height:30px; }
  .r-pl-target{ align-items:stretch; }
  .r-pl-target input, .r-pl-target .r-btn{ height:var(--ctl-h-form); box-sizing:border-box; }
  .r-pl-target .r-btn{ display:inline-flex; align-items:center; padding-top:0; padding-bottom:0; }
  .r-insight-ctas .r-kpi-more{ min-height:40px; } /* لینکِ «جزئیات» هم‌قدِ دکمه‌یِ کنارش + هدفِ لمسیِ بزرگ‌تر */
  .r-admin-row-info{ flex:1 1 200px; } /* نام و مشخصات کنارِ آواتار، نه وسطِ ردیف (space-between در دسکتاپ آن را وسط می‌انداخت) */
  @media (max-width:759px){ .r-admin-row > .r-admin-actions{ flex:1 1 100%; } } /* موبایل: ردیفِ اکشن تمام‌عرض ⇒ سلکت فضایِ باقی‌مانده را پر می‌کند، دو لبه قرینه */
  /* S1 — نوارِ «کارشناس در دفترِ مشتری» (و نوارِ آگاهیِ خودِ مشتری) */
  .r-review-book-bar{ display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap; margin:0 0 14px; padding:12px 14px; border-radius:var(--r-md); border:1px solid var(--border-strong); background:var(--info-soft); color:var(--info-text); box-shadow:var(--elev-1); }
  .r-review-book-bar > div{ display:flex; flex-direction:column; gap:3px; min-width:0; flex:1 1 260px; }
  .r-review-book-bar b{ display:flex; align-items:center; gap:6px; font-size:13px; }
  .r-review-book-bar b svg{ width:15px; height:15px; flex-shrink:0; }
  .r-review-book-bar span{ font-size:11.5px; line-height:1.7; color:var(--text-secondary); }


  /* ============ S1 — پرسپکتیوِ محسوس‌تر + جذابیت (تأییدِ مالک: فرورفتن هنگامِ لمس، چرخش همراهِ نشانگر، لایه‌هایِ عمیق‌تر، ورود با عمق)
     فقط transform/opacity/box-shadow (روانی رویِ اندرویدِ ضعیف)؛ هر حرکت با prefers-reduced-motion خاموش. */
  :root{
    --elev-1: inset 0 1px 0 rgba(255,255,255,.065), 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -16px rgba(0,0,0,.85);
    --elev-2: inset 0 1px 0 rgba(255,255,255,.09), 0 4px 8px rgba(0,0,0,.45), 0 30px 56px -20px rgba(0,0,0,.9);
    --elev-press: inset 0 2px 5px rgba(0,0,0,.45), 0 1px 1px rgba(0,0,0,.4);
    --page-light: radial-gradient(1100px 460px at 50% -160px, rgba(255,236,214,.07), transparent 70%);
    --page-vignette: radial-gradient(ellipse 120% 90% at 50% 35%, transparent 55%, rgba(0,0,0,.42) 100%);
    --tilt-sheen: rgba(255,255,255,.09);
  }
  :root[data-theme='light']{
    --elev-1: inset 0 1px 0 rgba(255,255,255,.8), 0 1px 2px rgba(20,22,26,.1), 0 12px 28px -14px rgba(20,22,26,.32);
    --elev-2: inset 0 1px 0 rgba(255,255,255,.9), 0 4px 8px rgba(20,22,26,.1), 0 28px 50px -20px rgba(20,22,26,.42);
    --elev-press: inset 0 2px 4px rgba(20,22,26,.14), 0 1px 1px rgba(20,22,26,.08);
    --page-light: radial-gradient(1100px 460px at 50% -160px, rgba(255,255,255,.75), transparent 70%);
    --page-vignette: radial-gradient(ellipse 120% 90% at 50% 35%, transparent 60%, rgba(20,22,26,.07) 100%);
    --tilt-sheen: rgba(255,255,255,.5);
  }
  /* لایه‌یِ صفحه: نورِ ملایم از بالا + تاریک‌شدنِ لبه‌ها — کارت‌ها رویش شناورتر دیده می‌شوند */
  body{ background-image:var(--page-light), var(--page-vignette); background-attachment:fixed; background-repeat:no-repeat; }
  .r-header::after, .r-topbar::after{ -webkit-backdrop-filter:blur(18px) saturate(1.4); backdrop-filter:blur(18px) saturate(1.4); }
  .r-header, .r-topbar{ box-shadow:0 1px 0 rgba(255,255,255,.04), 0 10px 28px -8px rgba(0,0,0,.55); }
  :root[data-theme='light'] .r-header, :root[data-theme='light'] .r-topbar{ box-shadow:0 1px 0 rgba(255,255,255,.7), 0 10px 26px -10px rgba(20,22,26,.18); }

  /* فرورفتن هنگامِ لمس — موبایل و دسکتاپ (رندر تا رها شدنِ انگشت عقب می‌افتد، پس :active پایدار است) */
  .r-admin-row[data-r-click], .r-card[data-r-click], .r-choice-row, .r-kpi-click, .r-ops-tile, .r-group-card, .r-seg-card, .r-stat-card-btn, .r-insight{ -webkit-tap-highlight-color:transparent; }
  :is(.r-admin-row[data-r-click], .r-card[data-r-click], .r-choice-row, .r-kpi-click, .r-ops-tile, .r-group-card, .r-seg-card, .r-stat-card-btn, .r-insight):active{
    transform:translateY(1px) scale(.985); box-shadow:var(--elev-press); transition:transform .08s ease-out, box-shadow .08s ease-out;
  }
  .r-btn-primary:active{ box-shadow:var(--elev-press); }
  .r-tab:active, .r-nav-item:active, .r-sb-item:active{ transform:scale(.95); }
  @media (hover:hover) and (prefers-reduced-motion:no-preference){
    .r-kpi-click:active, .r-ops-tile:active, .r-group-card:active, .r-seg-card:active, .r-stat-card-btn:active, .r-insight:active{
      transform:perspective(900px) translateY(0) scale(.98) rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg)); box-shadow:var(--elev-press);
    }
  }

  /* چرخش همراهِ نشانگر: نوری که با موس رویِ سطح جابه‌جا می‌شود (فقط موسِ واقعی) */
  @media (hover:hover) and (pointer:fine) and (prefers-reduced-motion:no-preference){
    .r-tilt-on{ position:relative; }
    .r-tilt-on::before{
      content:''; position:absolute; inset:0; border-radius:inherit; pointer-events:none; z-index:1;
      background:radial-gradient(240px circle at var(--mx, 50%) var(--my, 0%), var(--tilt-sheen), transparent 62%);
      opacity:0; transition:opacity .2s var(--ease-out);
    }
    .r-tilt-on:hover::before{ opacity:1; }
  }

  /* ورود با عمق: فقط اولین رندرِ پُرِ هر صفحه (کلاسِ r-enter رویِ #rama-root) — backwards تا بعد از پایان هیچ transformی نماند */
  @keyframes depthRise{ from{ opacity:0; transform:perspective(1000px) translateY(18px) rotateX(8deg) scale(.97); } to{ opacity:1; transform:none; } }
  @keyframes gaugeFill{ from{ stroke-dashoffset:100; } }
  @keyframes barGrowY{ from{ transform:scaleY(0); } }
  @keyframes barGrowX{ from{ transform:scaleX(0); } }
  @keyframes sheetRise{ from{ opacity:0; transform:perspective(1100px) translateY(40px) rotateX(9deg); } to{ opacity:1; transform:none; } }
  @keyframes modalDepth{ from{ opacity:0; transform:perspective(1100px) translateY(22px) rotateX(10deg) scale(.95); } to{ opacity:1; transform:none; } }
  @media (prefers-reduced-motion:no-preference){
    #rama-root.r-enter .r-main :is(.r-card, .r-ops-tile, .r-kpi-tile, .r-group-card, .r-insight, .r-seg-card, .r-kgauge, .r-stat-card, .r-review-book-bar){
      animation:depthRise .52s cubic-bezier(.2,.8,.25,1) backwards; transform-origin:50% 0;
    }
    #rama-root.r-enter .r-main :is(.r-card, .r-ops-tile, .r-kpi-tile, .r-group-card, .r-insight, .r-seg-card, .r-kgauge, .r-stat-card):nth-child(2){ animation-delay:.05s; }
    #rama-root.r-enter .r-main :is(.r-card, .r-ops-tile, .r-kpi-tile, .r-group-card, .r-insight, .r-seg-card, .r-kgauge, .r-stat-card):nth-child(3){ animation-delay:.1s; }
    #rama-root.r-enter .r-main :is(.r-card, .r-ops-tile, .r-kpi-tile, .r-group-card, .r-insight, .r-seg-card, .r-kgauge, .r-stat-card):nth-child(4){ animation-delay:.15s; }
    #rama-root.r-enter .r-main :is(.r-card, .r-ops-tile, .r-kpi-tile, .r-group-card, .r-insight, .r-seg-card, .r-kgauge, .r-stat-card):nth-child(n+5){ animation-delay:.2s; }
    #rama-root.r-enter .r-kg-val{ stroke-dasharray:100; animation:gaugeFill 1s cubic-bezier(.3,.7,.2,1) .25s backwards; }
    #rama-root.r-enter :is(.r-mbar-col .val, .r-sbar .val, .r-pbar-cols i){ transform-origin:50% 100%; animation:barGrowY .7s cubic-bezier(.3,.7,.2,1) .2s backwards; }
    #rama-root.r-enter .r-hbar-track i{ transform-origin:100% 50%; animation:barGrowX .7s cubic-bezier(.3,.7,.2,1) .2s backwards; }
    .r-modal{ animation:sheetRise .34s cubic-bezier(.2,.9,.25,1); transform-origin:50% 100%; }
    @media (min-width:760px){ .r-modal{ animation:modalDepth .3s cubic-bezier(.2,.9,.25,1); transform-origin:50% 0; } }
    .r-modal-reopen .r-modal{ animation:none !important; }
  }

  /* ============ S1 — جذاب‌تر (تأییدِ مالک): بارگذاریِ براق، تیکِ موفقیت، انتقالِ نرمِ صفحه‌ها ============ */
  /* بارگذاری: اسکلتِ براق به‌جایِ چرخک — متن برایِ صفحه‌خوان می‌ماند ولی دیده نمی‌شود */
  @keyframes shimmer{ from{ background-position:100% 0; } to{ background-position:0 0; } }
  .r-loading{ display:flex; flex-direction:column; align-items:stretch; justify-content:flex-start; gap:12px; padding:18px 2px !important; font-size:0; color:transparent; }
  .r-loading .r-spin{ display:none; }
  .r-loading::before, .r-loading::after{
    content:''; display:block; border-radius:12px;
    background:linear-gradient(100deg, var(--surface) 20%, var(--surface-3) 40%, var(--surface-2) 50%, var(--surface) 70%) 0 0 / 300% 100%;
    box-shadow:var(--elev-1); animation:shimmer 1.4s linear infinite;
  }
  .r-loading::before{ height:16px; width:46%; border-radius:99px; }
  .r-loading::after{ height:96px; }
  @media (prefers-reduced-motion:reduce){ .r-loading::before, .r-loading::after{ animation:none; } }

  /* تیکِ موفقیت */
  .r-success-pop{ position:fixed; left:50%; top:42%; z-index:400; width:96px; height:96px; margin:-48px 0 0 -48px; pointer-events:none;
    border-radius:50%; background:var(--surface-2); box-shadow:var(--elev-2), 0 0 0 10px rgba(46,160,110,.10);
    display:flex; align-items:center; justify-content:center; animation:successPop 1.4s cubic-bezier(.2,.9,.25,1) both; }
  .r-success-pop svg{ width:64px; height:64px; }
  .r-success-pop .c{ fill:none; stroke:var(--success-text); stroke-width:4; stroke-dasharray:100; stroke-dashoffset:100; animation:successDraw .45s ease-out .05s forwards; transform:rotate(-90deg); transform-origin:50% 50%; }
  .r-success-pop .k{ fill:none; stroke:var(--success-text); stroke-width:5; stroke-linecap:round; stroke-linejoin:round; stroke-dasharray:100; stroke-dashoffset:100; animation:successDraw .35s ease-out .42s forwards; }
  @keyframes successDraw{ to{ stroke-dashoffset:0; } }
  @keyframes successPop{
    0%{ opacity:0; transform:perspective(600px) scale(.6) rotateX(25deg); }
    18%{ opacity:1; transform:perspective(600px) scale(1.06) rotateX(0); }
    28%{ transform:scale(1); }
    80%{ opacity:1; transform:scale(1); }
    100%{ opacity:0; transform:scale(.92) translateY(-8px); }
  }

  /* انتقالِ نرمِ صفحه‌ها: فقط opacity (transform رویِ .r-main عناصرِ fixedِ داخلش را جابه‌جا می‌کرد)؛ حرکت با کارت‌ها */
  @keyframes pageIn{ from{ opacity:0; } }
  @media (prefers-reduced-motion:no-preference){
    #rama-root.r-enter .r-main{ animation:pageIn .28s ease-out backwards; }
  }

  /* ============ S1 — قرینگیِ بخشِ مشتری (ممیزیِ ابزاری در ۳۹۰ لمسی و ۱۴۴۰، همه‌یِ صفحه‌ها) ============ */
  /* پلن‌ها و پکیج‌ها: هم‌الگویِ کارت‌هایِ گروه — ردیفِ ناقص وسط‌چین، نه چسبیده به یک طرف (۳ پلن در ۴ ستون / ۲ پکیج در ۴ ستون نیمه‌یِ چپ را خالی می‌گذاشت) */
  @media (min-width:560px){
    .r-packages-row{ display:flex; flex-wrap:wrap; justify-content:center; gap:10px; }
    .r-packages-row > .r-package-card{ flex:0 0 calc((100% - 20px) / 3); max-width:calc((100% - 20px) / 3); }
  }
  @media (min-width:1024px){
    .r-packages-row > .r-package-card{ flex-basis:calc((100% - 30px) / 4); max-width:calc((100% - 30px) / 4); }
  }
  @media (min-width:640px){
    .r-plans-grid{ display:flex; flex-wrap:wrap; justify-content:center; gap:14px; }
    .r-plans-grid > .r-plan-card{ flex:0 0 calc((100% - 14px) / 2); max-width:calc((100% - 14px) / 2); }
  }
  @media (min-width:1024px){
    .r-plans-grid > .r-plan-card{ flex-basis:calc((100% - 42px) / 4); max-width:calc((100% - 42px) / 4); }
    .r-plans-grid:has(> :nth-child(3):last-child) > .r-plan-card{ flex-basis:calc((100% - 28px) / 3); max-width:calc((100% - 28px) / 3); }
  }
  /* داشبورد: کارتِ «نمای کلی مالی» آخرین کارتِ ستون است و تا پایینِ ستونِ کناری کشیده می‌شود — نمودار همان فضا را پر کند، نه جایِ خالی زیرش */
  .r-fin-card{ display:flex; flex-direction:column; }
  .r-fin-chart{ flex:1 1 auto; display:flex; flex-direction:column; min-height:90px; }
  .r-fin-chart > svg{ flex:1 1 0; height:auto; min-height:90px; }
  /* دستیارِ هوشمند: فیلد، میکروفون/دوربین/پیوست و ارسال یک ارتفاع (۴۷/۴۲ کنارِ ۳۸ و ۳۴ بود) */
  .r-ai-input-row{ align-items:center; }
  .r-ai-input-row input{ height:42px; box-sizing:border-box; padding-top:0; padding-bottom:0; }
  .r-ai-send{ width:42px; height:42px; }
  .r-ai-input-row .r-icon-btn{ width:42px; height:42px; border-radius:50%; }
  /* هر ردیفی که دکمه‌یِ کوچک کنارِ دکمه‌یِ آیکونی دارد (فاکتورها: «پرداخت» + دریافت) — هم‌قدِ آیکون */
  :has(> .r-icon-btn) > .r-btn-sm{ height:var(--ctl-h); padding-top:0; padding-bottom:0; display:inline-flex; align-items:center; }
