/* ==========================================================================
   resto_saas — yagona dizayn tizimi (design system)
   --------------------------------------------------------------------------
   Bu fayl butun loyihaning ko'rinishini boshqaradi: mijoz sahifasi, rahbar
   paneli, ofitsiant/kuryer/oshpaz panellari va kirish sahifalari.

   MUHIM: brend rangi va shrifti har bir restoran uchun har xil bo'lgani uchun
   ular BU YERDA emas, har bir base shablonning <head> qismida CSS
   o'zgaruvchilari sifatida e'lon qilinadi:

       :root {
         --brand:      {{ brand_color }};
         --brand-on:   {{ brand_on_color }};
         --brand-font: '{{ brand_font }}';
       }

   Shu sababli bu faylda hech qachon to'g'ridan-to'g'ri brend rangi yozilmaydi —
   faqat var(--brand) va undan hosil qilingan soyalar ishlatiladi.
   ========================================================================== */

/* ==========================================================================
   1. TOKENLAR
   ========================================================================== */

:root {
    /* --- Neytral shkala --- */
    --n-0:   #ffffff;
    --n-25:  #fcfcfd;
    --n-50:  #f8f9fb;
    --n-100: #f1f3f6;
    --n-200: #e6e9ee;
    --n-300: #d3d8e0;
    --n-400: #a3abb8;
    --n-500: #737d8c;
    --n-600: #545d6b;
    --n-700: #3c444f;
    --n-800: #262c35;
    --n-900: #161a20;

    /* --- Semantik rollar --- */
    --bg-app:        var(--n-50);
    --bg-surface:    var(--n-0);
    --bg-subtle:     var(--n-100);
    --border:        var(--n-200);
    --border-strong: var(--n-300);
    --text:          var(--n-800);
    /* Kontrast (audit 2026-09-20, J8).
       Ilgari `--text-muted: var(--n-500)` (4.17:1) va
       `--text-faint: var(--n-400)` (2.31:1) edi — ikkalasi ham WCAG
       talabidan (4.5:1) past, holbuki ular bezak emas, HAQIQIY MATN
       uchun ishlatiladi: kuryerning pastki navigatsiya yozuvlari (10px),
       mijozning buyurtma bosqichlari, jadval sarlavhalari, placeholder.
       Endi ikkalasi ham yorug'ida ham, qorong'usida ham 4.5:1 dan
       yuqori — qiymatlar o'lchab tanlangan. */
    --text-muted:    var(--n-600);
    --text-faint:    #67707e;
    --text-invert:   var(--n-0);

    /* --- Holat ranglari: fon / matn / chegara --- */
    --success-bg: #ecfdf3;  --success-fg: #047857;  --success-bd: #a7f3d0;
    --warning-bg: #fffaeb;  --warning-fg: #b45309;  --warning-bd: #fde68a;
    --danger-bg:  #fef3f2;  --danger-fg:  #b42318;  --danger-bd:  #fecdca;
    --info-bg:    #eff8ff;  --info-fg:    #175cd3;  --info-bd:    #b2ddff;

    /* --- Brend soyalari (fallback; quyida color-mix bilan aniqlashtiriladi) --- */
    --brand-50:  var(--n-50);
    --brand-100: var(--n-100);
    --brand-200: var(--n-200);
    --brand-700: var(--brand, #FF6B00);

    /* --- Oraliqlar --- */
    --sp-1: 4px;   --sp-2: 8px;   --sp-3: 12px;  --sp-4: 16px;  --sp-5: 20px;
    --sp-6: 24px;  --sp-7: 32px;  --sp-8: 40px;  --sp-9: 48px;  --sp-10: 64px;

    /* --- Burchaklar --- */
    --r-sm: 6px;  --r-md: 10px;  --r-lg: 14px;  --r-xl: 20px;  --r-full: 999px;

    /* --- Soyalar --- */
    --sh-xs: 0 1px 2px rgba(16, 24, 40, .05);
    --sh-sm: 0 1px 3px rgba(16, 24, 40, .08), 0 1px 2px rgba(16, 24, 40, .04);
    --sh-md: 0 4px 8px -2px rgba(16, 24, 40, .08), 0 2px 4px -2px rgba(16, 24, 40, .04);
    --sh-lg: 0 12px 16px -4px rgba(16, 24, 40, .08), 0 4px 6px -2px rgba(16, 24, 40, .03);

    /* --- Shrift o'lchamlari --- */
    --fs-xs: 12px;  --fs-sm: 13px;  --fs-base: 14px; --fs-md: 15px;
    --fs-lg: 17px;  --fs-xl: 20px;  --fs-2xl: 24px;  --fs-3xl: 30px; --fs-4xl: 38px;


    /* --- Sidebar va savat paneli: bular YORUG' rejimda ham quyuq bo'ladi,
       shuning uchun neytral shkala bilan birga teskari aylanmasligi kerak --- */
    --sidebar-bg:        #161a20;
    --sidebar-fg:        #a3abb8;
    --sidebar-fg-strong: #ffffff;
    /* Audit 2026-09-24, O13: #545d6b edi — 2,6:1 (WCAG 4,5:1 talab). */
    --sidebar-dim:       #8a93a3;
    --sidebar-disabled:  #3c444f;
    --sidebar-divider:   rgba(255, 255, 255, .08);
    --sidebar-hover:     rgba(255, 255, 255, .05);
    --sidebar-active:    rgba(255, 255, 255, .07);
    --bar-bg:            #161a20;
    --bar-fg:            #ffffff;

    /* Brauzerning o'z elementlari (scrollbar, sana tanlagich) mos kelishi uchun */
    color-scheme: light;

    /* --- Animatsiya --- */
    --t-fast: 120ms ease;
    --t: 180ms cubic-bezier(.4, 0, .2, 1);

    /* --- Qatlamlar --- */
    --z-nav: 40;
    --z-bar: 50;
    --z-drawer: 60;
    --z-overlay: 55;
}

/* Brend soyalarini aniq hisoblash (zamonaviy brauzerlar) */
@supports (color: color-mix(in srgb, red 50%, white)) {
    :root {
        --brand-50:  color-mix(in srgb, var(--brand) 8%, white);
        --brand-100: color-mix(in srgb, var(--brand) 14%, white);
        --brand-200: color-mix(in srgb, var(--brand) 26%, white);
        --brand-700: color-mix(in srgb, var(--brand) 86%, black);

        /* Audit 2026-09-23, "barcha panellar" qayta ko'rib chiqish:
           sidebar'dagi faol/hover holat ilgari OQ shaffoflik (neytral,
           brendsiz) edi — shu sababli boshqaruv paneli "generic admin
           shablon"dek ko'rinardi. Endi brend rangining o'zidan olingan
           shaffof qatlam ishlatiladi, fallback esa (bu blok
           qo'llab-quvvatlanmasa) yuqoridagi neytral qiymatlarda qoladi. */
        --sidebar-hover:  color-mix(in srgb, var(--brand) 10%, transparent);
        --sidebar-active: color-mix(in srgb, var(--brand) 22%, transparent);
    }
}


/* ==========================================================================
   1b. QORONG'U REJIM
   --------------------------------------------------------------------------
   Ikki holatda yoqiladi:
     1) qurilma sozlamasi qorong'u VA foydalanuvchi yorug'ni majburlamagan;
     2) foydalanuvchi tugma orqali qorong'uni tanlagan (data-theme="dark").

   Quyidagi ikki blok bir xil — biri media-so'rov ichida bo'lgani uchun
   ularni birlashtirib bo'lmaydi. Ikkalasi bitta manbadan yozilgan,
   shuning uchun biri o'zgarsa, ikkinchisi ham o'zgarishi shart.
   ========================================================================== */

@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) {
    /* Neytral shkala teskari: kichik raqam = fon, katta raqam = matn.
       Shu sababli semantik tokenlar (--bg-app, --text va h.k.) o'z-o'zidan
       to'g'ri qiymat oladi — ularni qayta yozish shart emas. */
    /* Qorong'u rejimda `--text-faint` alohida yoziladi: u neytral
       shkaladan emas, o'lchab tanlangan qiymatdan olinadi (audit J8). */
    --text-faint: #7b8796;
    --n-0:   #12161c;
    --n-25:  #141920;
    --n-50:  #0d1014;
    --n-100: #1a1f27;
    --n-200: #262c36;
    --n-300: #343c48;
    --n-400: #5d6775;
    --n-500: #8892a1;
    --n-600: #a7b0bd;
    --n-700: #c6ccd6;
    --n-800: #e5e9ef;
    --n-900: #f4f6f9;

    /* Holat ranglari — qorong'u fonda och pastel fon ishlamaydi,
       shuning uchun to'q fon + yorqin matn */
    --success-bg: #0c2a1e;  --success-fg: #4ade80;  --success-bd: #14532d;
    --warning-bg: #2b1f07;  --warning-fg: #fbbf24;  --warning-bd: #78350f;
    --danger-bg:  #2c1113;  --danger-fg:  #f87171;  --danger-bd:  #7f1d1d;
    --info-bg:    #0d1f33;  --info-fg:    #60a5fa;  --info-bd:    #1e3a8a;

    /* Sidebar qorong'u rejimda ham quyuq qoladi, lekin sahifa fonidan
       biroz ajralib tursin */
    --sidebar-bg:        #14181f;
    --sidebar-fg:        #9aa3b1;
    --sidebar-fg-strong: #ffffff;
    /* Audit 2026-09-24, O13: #6b7585 edi — 3,8:1. */
    --sidebar-dim:       #8a93a3;
    --sidebar-disabled:  #454d59;
    --sidebar-divider:   rgba(255, 255, 255, .07);
    --sidebar-hover:     rgba(255, 255, 255, .05);
    --sidebar-active:    rgba(255, 255, 255, .09);
    --bar-bg:            #1a1f27;
    --bar-fg:            #ffffff;

    /* Soyalar qorong'u fonda quyuqroq bo'lishi kerak */
    --sh-xs: 0 1px 2px rgba(0, 0, 0, .35);
    --sh-sm: 0 1px 3px rgba(0, 0, 0, .45), 0 1px 2px rgba(0, 0, 0, .3);
    --sh-md: 0 4px 8px -2px rgba(0, 0, 0, .5), 0 2px 4px -2px rgba(0, 0, 0, .3);
    --sh-lg: 0 12px 16px -4px rgba(0, 0, 0, .55), 0 4px 6px -2px rgba(0, 0, 0, .3);

    color-scheme: dark;
    }
    @supports (color: color-mix(in srgb, red 50%, white)) {
        :root:not([data-theme="light"]) {
    /* Brend soyalari qorong'u fon bilan aralashtiriladi, matn esa ochroq */
    --brand-50:  color-mix(in srgb, var(--brand) 14%, #12161c);
    --brand-100: color-mix(in srgb, var(--brand) 22%, #12161c);
    --brand-200: color-mix(in srgb, var(--brand) 34%, #12161c);
    --brand-700: color-mix(in srgb, var(--brand) 72%, white);
    /* Audit 2026-09-23: sidebar faol/hover holati — shaffof qatlam
       bo'lgani uchun qorong'uda ham xuddi shu formula ishlaydi, lekin
       yuqoridagi (149-qator) oddiy oq-shaffoflik qiymatlari BU YERDA
       ustidan qayta yozilishi kerak, aks holda ular ustun kelib qoladi. */
    --sidebar-hover:  color-mix(in srgb, var(--brand) 10%, transparent);
    --sidebar-active: color-mix(in srgb, var(--brand) 24%, transparent);
        }
    }
    /* Select strelkasi qorong'u fonda ko'rinadigan bo'lsin */
    :root:not([data-theme="light"]) select { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238892a1' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E"); }
    /* Buyurtma holatlari — qattiq yozilgan uchtasi uchun qorong'u variant */
    :root:not([data-theme="light"]) .status-PREPARING { background: #2b1608; color: #fb923c; }
    :root:not([data-theme="light"]) .status-DELIVERED { background: #1d1a33; color: #a78bfa; }
    :root:not([data-theme="light"]) .status-PAID      { background: #0c2a1e; color: #4ade80; }
}

:root[data-theme="dark"] {
    /* Neytral shkala teskari: kichik raqam = fon, katta raqam = matn.
       Shu sababli semantik tokenlar (--bg-app, --text va h.k.) o'z-o'zidan
       to'g'ri qiymat oladi — ularni qayta yozish shart emas. */
    /* Qorong'u rejimda `--text-faint` alohida yoziladi: u neytral
       shkaladan emas, o'lchab tanlangan qiymatdan olinadi (audit J8). */
    --text-faint: #7b8796;
    --n-0:   #12161c;
    --n-25:  #141920;
    --n-50:  #0d1014;
    --n-100: #1a1f27;
    --n-200: #262c36;
    --n-300: #343c48;
    --n-400: #5d6775;
    --n-500: #8892a1;
    --n-600: #a7b0bd;
    --n-700: #c6ccd6;
    --n-800: #e5e9ef;
    --n-900: #f4f6f9;

    /* Holat ranglari — qorong'u fonda och pastel fon ishlamaydi,
       shuning uchun to'q fon + yorqin matn */
    --success-bg: #0c2a1e;  --success-fg: #4ade80;  --success-bd: #14532d;
    --warning-bg: #2b1f07;  --warning-fg: #fbbf24;  --warning-bd: #78350f;
    --danger-bg:  #2c1113;  --danger-fg:  #f87171;  --danger-bd:  #7f1d1d;
    --info-bg:    #0d1f33;  --info-fg:    #60a5fa;  --info-bd:    #1e3a8a;

    /* Sidebar qorong'u rejimda ham quyuq qoladi, lekin sahifa fonidan
       biroz ajralib tursin */
    --sidebar-bg:        #14181f;
    --sidebar-fg:        #9aa3b1;
    --sidebar-fg-strong: #ffffff;
    /* Audit 2026-09-24, O13: #6b7585 edi — 3,8:1. */
    --sidebar-dim:       #8a93a3;
    --sidebar-disabled:  #454d59;
    --sidebar-divider:   rgba(255, 255, 255, .07);
    --sidebar-hover:     rgba(255, 255, 255, .05);
    --sidebar-active:    rgba(255, 255, 255, .09);
    --bar-bg:            #1a1f27;
    --bar-fg:            #ffffff;

    /* Soyalar qorong'u fonda quyuqroq bo'lishi kerak */
    --sh-xs: 0 1px 2px rgba(0, 0, 0, .35);
    --sh-sm: 0 1px 3px rgba(0, 0, 0, .45), 0 1px 2px rgba(0, 0, 0, .3);
    --sh-md: 0 4px 8px -2px rgba(0, 0, 0, .5), 0 2px 4px -2px rgba(0, 0, 0, .3);
    --sh-lg: 0 12px 16px -4px rgba(0, 0, 0, .55), 0 4px 6px -2px rgba(0, 0, 0, .3);

    color-scheme: dark;
}

@supports (color: color-mix(in srgb, red 50%, white)) {
    :root[data-theme="dark"] {
    /* Brend soyalari qorong'u fon bilan aralashtiriladi, matn esa ochroq */
    --brand-50:  color-mix(in srgb, var(--brand) 14%, #12161c);
    --brand-100: color-mix(in srgb, var(--brand) 22%, #12161c);
    --brand-200: color-mix(in srgb, var(--brand) 34%, #12161c);
    --brand-700: color-mix(in srgb, var(--brand) 72%, white);
    /* Audit 2026-09-23: yuqoridagi (214-qator) oq-shaffoflik
       qiymatlarini bekor qilib, sidebar faol/hover holatini brendga
       moslaydi (bu yerdagi formula qorong'u/yorug'dan mustaqil, chunki
       shaffof qatlam). */
    --sidebar-hover:  color-mix(in srgb, var(--brand) 10%, transparent);
    --sidebar-active: color-mix(in srgb, var(--brand) 24%, transparent);
    }
}

/* Select strelkasi qorong'u fonda ko'rinadigan bo'lsin */
:root[data-theme="dark"] select { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238892a1' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E"); }
/* Buyurtma holatlari — qattiq yozilgan uchtasi uchun qorong'u variant */
:root[data-theme="dark"] .status-PREPARING { background: #2b1608; color: #fb923c; }
:root[data-theme="dark"] .status-DELIVERED { background: #1d1a33; color: #a78bfa; }
:root[data-theme="dark"] .status-PAID      { background: #0c2a1e; color: #4ade80; }

/* ==========================================================================
   2. RESET VA ASOSIY
   ========================================================================== */

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

html { -webkit-text-size-adjust: 100%; }
/* 2026-09-25 (6-audit, "har bir bo'limni tanlaganimizda baribir sahifa
   biroz siljib ketmoqda"): sahifalar orasida balandlik farq qiladi —
   ba'zilarida vertikal skroll-panel chiqadi (tor kontent balandligi
   ekrandan oshadi), ba'zilarida yo'q. Skroll-panel o'zi bir necha piksel
   joy egallaydi, shu sabab markazlashtirilgan `max-width` konteynerlar
   (masalan `.about, .branches, .home`) sahifadan sahifaga bir necha
   piksel chapga/o'ngga siljib ko'rinardi. `scrollbar-gutter: stable` —
   skroll-panel HAR DOIM (kontent balandligidan qat'iy nazar) shu joyni
   band qilib turishini ta'minlaydi, shunda siljish yo'qoladi. Eski
   Safari'da qo'llab-quvvatlanmasa ham xavfsiz — oddiygina e'tiborga
   olinmaydi, hech qanday regressiyaga sabab bo'lmaydi. */
html { scrollbar-gutter: stable; }

body {
    margin: 0;
    background: var(--bg-app);
    color: var(--text);
    font-family: var(--brand-font), -apple-system, BlinkMacSystemFont, "Segoe UI",
                 Roboto, "Helvetica Neue", Arial, sans-serif;
    font-size: var(--fs-base);
    line-height: 1.55;
    -webkit-font-smoothing: antialiased;
}

h1, h2, h3, h4 {
    margin: 0;
    line-height: 1.25;
    letter-spacing: -0.01em;
    font-weight: 600;
    color: var(--text);
}

p { margin: 0 0 var(--sp-3); }
p:last-child { margin-bottom: 0; }

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

img { max-width: 100%; }

code {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: .92em;
    background: var(--bg-subtle);
    padding: 1px 5px;
    border-radius: var(--r-sm);
}

hr {
    border: 0;
    border-top: 1px solid var(--border);
    margin: var(--sp-5) 0;
}

/* Fokus halqasi — klaviatura bilan yurganda ko'rinadi */
:focus-visible {
    outline: 2px solid var(--brand);
    outline-offset: 2px;
    border-radius: var(--r-sm);
}

::selection { background: var(--brand-200); }

/* Faqat ekranni o'quvchi dasturlar uchun */
.sr-only {
    position: absolute;
    width: 1px; height: 1px;
    padding: 0; margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* ==========================================================================
   3. TIPOGRAFIKA YORDAMCHILARI
   ========================================================================== */

.text-muted { color: var(--text-muted); }
.text-sm    { font-size: var(--fs-sm); }
.text-xs    { font-size: var(--fs-xs); }
.num        { font-variant-numeric: tabular-nums; }
.text-pos   { color: var(--success-fg); }
.text-neg   { color: var(--danger-fg); }

.lead {
    color: var(--text-muted);
    font-size: var(--fs-base);
    margin: var(--sp-1) 0 0;
}

/* ==========================================================================
   4. IKONKALAR
   ========================================================================== */

.icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    width: 1em;
    height: 1em;
    line-height: 1;
}
/* `display: inline-flex` brauzerning `[hidden]{display:none}` qoidasini
   bekor qiladi — shuning uchun alohida yoziladi (audit 2026-09-20, O4).
   Aks holda login sahifasidagi "parolni ko'rsatish" tugmasida ikkala
   ko'z ikonkasi bir vaqtda ko'rinib turardi. */
.icon[hidden] { display: none; }
.icon svg {
    width: 100%;
    height: 100%;
    display: block;
}

/* 2026-09-24 (to'liq audit, 2-band — foydalanuvchi: "professional
   dizayner nazari bilan audit qil"): `.icon-sm` shu auditda qo'shildi —
   ilgari faqat md/lg/xl bor edi, "kichik" ikonkalar esa (topbar, qator
   ikonkalari) har biri o'zicha (ba'zisi atrofdagi shriftdan meros,
   ba'zisi qattiq kodlangan 15px) turlicha o'lchamda chiqardi (bitta
   sahifada 8 xil piksel o'lchami jonli o'lchovda topilgan). */
.icon-sm  { font-size: 16px; }
.icon-md  { font-size: 18px; }
.icon-lg  { font-size: 22px; }
.icon-xl  { font-size: 28px; }

/* Ikonka uchun yumshoq fonli kvadrat (statistika kartalarida) */
.icon-tile {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border-radius: var(--r-md);
    background: var(--brand-50);
    color: var(--brand-700);
    flex-shrink: 0;
}
.icon-tile.is-success { background: var(--success-bg); color: var(--success-fg); }
.icon-tile.is-warning { background: var(--warning-bg); color: var(--warning-fg); }
.icon-tile.is-danger  { background: var(--danger-bg);  color: var(--danger-fg); }
.icon-tile.is-info    { background: var(--info-bg);    color: var(--info-fg); }
.icon-tile.is-muted   { background: var(--bg-subtle);  color: var(--text-muted); }

/* "Yopish/bekor qilish" (X) ikonkasi — 2026-09-27, foydalanuvchi so'rovi:
   loyihadagi BARCHA yopish/bekor qilish X ikonkalari endi doim QIZIL —
   X "bekor qilish"ni anglatadi, shu ma'no rangda ham aks etsin. `.icon`
   klassi butun saytda ko'p turli maqsadda ishlatilgani uchun (o'chirish,
   qo'ng'iroq, tema va h.k.) ranglash TO'G'RIDAN-TO'G'RI `.icon`ga emas,
   balki loyihada "yopish" ma'nosini bildiruvchi aniq belgilovchilarga
   (data-close/data-att-cancel/data-cart-close/data-topnav-close va
   .search-clear/.lightbox-close) qaratilgan — shu orqali boshqa
   ikonkalar (masalan "o'chirish" chelagi) qizil bo'lib qolmaydi.
   `svg` to'g'ridan-to'g'ri nishonlanadi, chunki ba'zi joylarda (masalan
   `.att-modal-close`) ikonka `.icon` o'ragichisiz to'g'ridan-to'g'ri
   tugma ichida keladi. */
[data-close] svg,
[data-att-cancel] svg,
[data-cart-close] svg,
[data-topnav-close] svg,
.search-clear svg,
.lightbox-close svg {
    color: var(--danger-fg);
}

/* ==========================================================================
   5. TUGMALAR
   ========================================================================== */

.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--sp-2);
    height: 40px;
    padding: 0 var(--sp-4);
    border: 1px solid transparent;
    border-radius: var(--r-md);
    background: var(--brand);
    color: var(--brand-on, #fff);
    font: inherit;
    font-size: var(--fs-base);
    font-weight: 500;
    line-height: 1;
    white-space: nowrap;
    cursor: pointer;
    text-decoration: none;
    transition: background var(--t-fast), border-color var(--t-fast),
                box-shadow var(--t-fast), color var(--t-fast);
    -webkit-tap-highlight-color: transparent;
}

.btn:hover { background: var(--brand-700); }
.btn:active { transform: translateY(1px); }
/* O'chirilgan tugma.
   Ilgari bu yerda `opacity: .5` turardi — qorong'u rejimda brend rangi fon
   bilan aralashib ketib, yozuv deyarli o'qilmas holga kelardi. Shuning uchun
   shaffoflik o'rniga neytral fon va so'ngan matn rangi ishlatiladi: u ikkala
   rejimda ham bir xil ko'rinadi va "hozir bosib bo'lmaydi" degan ma'noni
   aniq beradi. */
.btn:disabled {
    background: var(--bg-subtle);
    border-color: var(--border);
    color: var(--text-muted);
    box-shadow: none;
    cursor: not-allowed;
    pointer-events: none;
}

.btn-secondary {
    background: var(--bg-surface);
    color: var(--text);
    border-color: var(--border-strong);
    box-shadow: var(--sh-xs);
}
.btn-secondary:hover { background: var(--bg-subtle); border-color: var(--n-400); }

.btn-ghost {
    background: transparent;
    color: var(--text-muted);
    border-color: transparent;
    box-shadow: none;
}
.btn-ghost:hover { background: var(--bg-subtle); color: var(--text); }

.btn-danger {
    background: var(--bg-surface);
    color: var(--danger-fg);
    border-color: var(--danger-bd);
    box-shadow: var(--sh-xs);
}
.btn-danger:hover { background: var(--danger-bg); }

.btn-success {
    background: var(--bg-surface);
    color: var(--success-fg);
    border-color: var(--success-bd);
    box-shadow: var(--sh-xs);
}
.btn-success:hover { background: var(--success-bg); }

/* O'lchamlar */
.btn-sm { height: 32px; padding: 0 var(--sp-3); font-size: var(--fs-sm); border-radius: var(--r-sm); }
.btn-lg { height: 48px; padding: 0 var(--sp-5); font-size: var(--fs-md); }
.btn-xl { height: 58px; padding: 0 var(--sp-6); font-size: var(--fs-lg); font-weight: 600; }

.btn-block { width: 100%; }

.btn-icon { width: 36px; height: 36px; padding: 0; }
.btn-icon.btn-sm { width: 30px; height: 30px; }

/* ==========================================================================
   6. FORMALAR
   ========================================================================== */

.field { margin-bottom: var(--sp-4); }
.field:last-child { margin-bottom: 0; }

label,
.field-label {
    display: block;
    margin-bottom: var(--sp-2);
    font-size: var(--fs-sm);
    font-weight: 500;
    color: var(--text);
}
.field-label .optional {
    font-weight: 400;
    color: var(--text-faint);
}

.input,
input[type="text"], input[type="password"], input[type="email"],
input[type="tel"], input[type="number"], input[type="date"],
input[type="url"], input[type="search"],
select, textarea {
    width: 100%;
    height: 40px;
    padding: 0 var(--sp-3);
    border: 1px solid var(--border-strong);
    border-radius: var(--r-md);
    background: var(--bg-surface);
    color: var(--text);
    font: inherit;
    font-size: var(--fs-base);
    transition: border-color var(--t-fast), box-shadow var(--t-fast);
}

textarea {
    height: auto;
    min-height: 84px;
    padding: var(--sp-3);
    line-height: 1.55;
    resize: vertical;
}

.input:hover,
input:hover, select:hover, textarea:hover { border-color: var(--n-400); }

/* Sichqoncha bilan bosilganda — yumshoq halqa. */
.input:focus,
input:focus, select:focus, textarea:focus {
    outline: none;
    border-color: var(--brand);
    box-shadow: 0 0 0 3px var(--brand-100);
}
/* Klaviatura bilan kelganda — aniq ko'rinadigan kontur (audit 2026-09-20, O9).
   Ilgari faqat yuqoridagi qoida bor edi: `outline: none` global
   `:focus-visible` qoidasidan kuchliroq (0,1,1 va 0,1,0), o'rniga
   qo'yilgan `--brand-100` esa oq kartada deyarli ko'rinmaydigan ochiq
   tus — ya'ni klaviatura bilan ishlaydigan foydalanuvchi qaysi maydonda
   turganini umuman bilmasdi. */
.input:focus-visible,
input:focus-visible, select:focus-visible, textarea:focus-visible {
    outline: 2px solid var(--brand);
    outline-offset: 2px;
    box-shadow: 0 0 0 3px var(--brand-100);
}

input::placeholder, textarea::placeholder { color: var(--text-faint); }

input:disabled, select:disabled, textarea:disabled {
    background: var(--bg-subtle);
    color: var(--text-muted);
    cursor: not-allowed;
}

/* Select — o'z strelkasi bilan */
select {
    appearance: none;
    -webkit-appearance: none;
    padding-right: var(--sp-8);
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23737d8c' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right var(--sp-3) center;
    background-size: 16px 16px;
}
select[multiple] { height: auto; padding: var(--sp-2); background-image: none; }

.input-lg,
.input-lg input, .input-lg select { height: 48px; font-size: var(--fs-md); }

/* Checkbox / radio */
input[type="checkbox"], input[type="radio"] {
    width: 18px;
    height: 18px;
    margin: 0;
    accent-color: var(--brand);
    cursor: pointer;
    flex-shrink: 0;
}

.check-row {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    margin: var(--sp-4) 0 0;
}
.check-row label { margin: 0; cursor: pointer; font-weight: 400; }

/* Fayl tanlash */
input[type="file"] {
    width: 100%;
    height: auto;
    padding: var(--sp-3);
    border: 1px dashed var(--border-strong);
    border-radius: var(--r-md);
    background: var(--bg-subtle);
    font-size: var(--fs-sm);
    cursor: pointer;
}
input[type="file"]:hover { border-color: var(--brand); background: var(--brand-50); }

.file-preview {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    padding: var(--sp-3);
    margin-bottom: var(--sp-2);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    background: var(--bg-subtle);
}
.file-preview img {
    width: 56px;
    height: 56px;
    object-fit: cover;
    border-radius: var(--r-sm);
    display: block;
}

/* Yordam matni va xatolar */
.help-text {
    margin: var(--sp-2) 0 0;
    font-size: var(--fs-xs);
    color: var(--text-muted);
    line-height: 1.5;
}

.errorlist {
    list-style: none;
    margin: var(--sp-2) 0 0;
    padding: 0;
    color: var(--danger-fg);
    font-size: var(--fs-sm);
}
.errorlist:empty { display: none; }
.errorlist li { margin-top: 2px; }

.field.has-error input,
.field.has-error select,
.field.has-error textarea { border-color: var(--danger-bd); }

/* Forma tarmog'i */
.form-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--sp-4) var(--sp-5);
}
.form-grid .field { margin-bottom: 0; }
.form-grid .span-2 { grid-column: 1 / -1; }

.form-actions {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    margin-top: var(--sp-6);
    padding-top: var(--sp-5);
    border-top: 1px solid var(--border);
}

fieldset {
    margin: var(--sp-5) 0 0;
    padding: var(--sp-4);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    background: var(--bg-app);
}
legend {
    padding: 0 var(--sp-2);
    font-size: var(--fs-sm);
    font-weight: 600;
    color: var(--text-muted);
}

/* ==========================================================================
   7. KARTA
   ========================================================================== */

.card {
    background: var(--bg-surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    /* Audit 2026-09-23: pastroq soya — .card passiv/ma'lumotnoma
       sirt (sozlama, forma, statistika), jonli/harakatga chaqiruvchi
       .order-card'dan pastroq vizual og'irlikda bo'lishi kerak. */
    box-shadow: var(--sh-xs);
}
.card > .card-body { padding: var(--sp-6); }
.card.is-narrow { max-width: 560px; }
.card.is-form { max-width: 740px; }

.card-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-4);
    padding: var(--sp-4) var(--sp-6);
    border-bottom: 1px solid var(--border);
}
.card-header h2, .card-header h3 {
    font-size: var(--fs-md);
    font-weight: 600;
}
.card-header .sub {
    margin: 2px 0 0;
    font-size: var(--fs-sm);
    color: var(--text-muted);
}

/* ==========================================================================
   8. SAHIFA VA BO'LIM SARLAVHALARI
   ========================================================================== */

.page-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--sp-4);
    flex-wrap: wrap;
    margin-bottom: var(--sp-6);
}
.page-head h2 { font-size: var(--fs-xl); }
.page-head .page-head-actions {
    display: flex;
    gap: var(--sp-2);
    flex-wrap: wrap;
}

.section-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-3);
    margin: var(--sp-7) 0 var(--sp-4);
}
.section-head:first-child { margin-top: 0; }
.section-head h3 {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    font-size: var(--fs-lg);
}
.section-head .count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 22px;
    height: 22px;
    padding: 0 6px;
    border-radius: var(--r-full);
    background: var(--bg-subtle);
    color: var(--text-muted);
    font-size: var(--fs-xs);
    font-weight: 600;
}

/* Audit 2026-09-21, M9: bu qoida ilgari `pos/dashboard.html`,
   `cashier/dashboard.html` va `cashier/shift_result.html`ning har
   birida ALOHIDA-ALOHIDA, so'zma-so'z bir xil qilib takrorlangan edi —
   endi bitta umumiy joyda. */
/* Audit 2026-09-23: kassa/kuryer kabi bir nechta bo'limni ketma-ket
   ko'rsatadigan sahifalarda ilgari bo'limlar orasida faqat matn
   sarlavhasi bor edi — telefonda bu "uzluksiz quti oqimi"dek ko'rinardi.
   Endi har bir yangi bo'lim tepasida aniq chiziq + ko'proq bo'shliq
   bilan ajratiladi. */
.section-title {
    font-size: var(--fs-lg);
    margin: var(--sp-8) 0 var(--sp-3);
    padding-top: var(--sp-6);
    border-top: 1px solid var(--border);
}
.section-title:first-child { margin-top: 0; padding-top: 0; border-top: 0; }

.back-link {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-1);
    margin-bottom: var(--sp-4);
    color: var(--text-muted);
    font-size: var(--fs-sm);
    transition: color var(--t-fast);
}
.back-link:hover { color: var(--brand); }

/* ==========================================================================
   9. JADVAL
   ========================================================================== */

.table-wrap {
    background: var(--bg-surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    box-shadow: var(--sh-sm);
    overflow: hidden;
}
.table-scroll { overflow-x: auto; }

.table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--fs-base);
}
.table th {
    position: sticky;
    top: 0;
    z-index: 1;
    padding: var(--sp-3) var(--sp-4);
    background: var(--bg-subtle);
    border-bottom: 1px solid var(--border);
    text-align: left;
    font-size: var(--fs-xs);
    font-weight: 600;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: .04em;
    white-space: nowrap;
}
.table td {
    padding: var(--sp-3) var(--sp-4);
    border-bottom: 1px solid var(--border);
    vertical-align: middle;
}
.table tbody tr:last-child td { border-bottom: 0; }
.table tbody tr { transition: background var(--t-fast); }
.table tbody tr:hover { background: var(--bg-app); }

.table .align-right { text-align: right; }
.table .num { font-variant-numeric: tabular-nums; }
.table .primary-cell { font-weight: 500; }

.table-actions {
    display: flex;
    align-items: center;
    gap: var(--sp-1);
    justify-content: flex-end;
}
.table-actions form { margin: 0; }
/* Jadval ichidagi kichik forma: "To'lov turi" tanlovi + tugma bir qatorda
   (audit 2026-09-20, O7). Tor ekranda o'ralib tushadi. */
.inline-form { display: flex; align-items: center; gap: var(--sp-1); flex-wrap: wrap; }

/* ==========================================================================
   10. BADGE / HOLAT
   ========================================================================== */

.badge {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-1);
    padding: 3px var(--sp-2);
    border-radius: var(--r-full);
    background: var(--bg-subtle);
    color: var(--text-muted);
    font-size: var(--fs-xs);
    font-weight: 500;
    line-height: 1.5;
    white-space: nowrap;
}
.badge::before {
    content: "";
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: currentColor;
    flex-shrink: 0;
    opacity: .7;
}

.badge-success { background: var(--success-bg); color: var(--success-fg); }
.badge-warning { background: var(--warning-bg); color: var(--warning-fg); }
.badge-danger  { background: var(--danger-bg);  color: var(--danger-fg); }
.badge-brand   { background: var(--brand-50);   color: var(--brand-700); }

/* Buyurtma holatlari — butun tizimda bir xil rang-kod */
.status-NEW         { background: var(--danger-bg);  color: var(--danger-fg); }
.status-ACCEPTED    { background: var(--warning-bg); color: var(--warning-fg); }
.status-PREPARING   { background: #fff4e6;           color: #c2410c; }
.status-READY       { background: var(--success-bg); color: var(--success-fg); }
.status-ON_THE_WAY  { background: var(--info-bg);    color: var(--info-fg); }
.status-DELIVERED   { background: #f4f3ff;           color: #5925dc; }
.status-PAID        { background: #f0fdf4;           color: #15803d; }
.status-CANCELLED   { background: var(--bg-subtle);  color: var(--text-muted); }

/* Chapdagi rangli chiziq uchun (buyurtma kartasi) */
/* Holat chizig'i ranglari — `.status-*` nishonlari singari qorong'u
   rejimda ham qayta e'lon qilinadi (audit 2026-09-20, Ki7). Ilgari faqat
   nishonlar tuzatilgan, yonidagi 4px chiziq esa yorug' rejim ranglarida
   qolgan edi va qorong'u fonda deyarli qora ko'rinardi. */
.bar-NEW        { --status-bar: #d92d20; }
.bar-ACCEPTED   { --status-bar: #dc6803; }
.bar-PREPARING  { --status-bar: #ea580c; }
.bar-READY      { --status-bar: #12b76a; }
.bar-ON_THE_WAY { --status-bar: #2e90fa; }
.bar-DELIVERED  { --status-bar: #7a5af8; }
.bar-PAID       { --status-bar: #15803d; }
.bar-CANCELLED  { --status-bar: var(--n-300); }

/* Qorong'u rejim uchun yorqinroq variantlar (audit Ki7) — 4px chiziq
   qora fonda ham ajralib tursin. */
:root[data-theme="dark"] .bar-NEW        { --status-bar: #f97066; }
:root[data-theme="dark"] .bar-ACCEPTED   { --status-bar: #fdb022; }
:root[data-theme="dark"] .bar-PREPARING  { --status-bar: #fd853a; }
:root[data-theme="dark"] .bar-READY      { --status-bar: #32d583; }
:root[data-theme="dark"] .bar-ON_THE_WAY { --status-bar: #53b1fd; }
:root[data-theme="dark"] .bar-DELIVERED  { --status-bar: #a48afb; }
:root[data-theme="dark"] .bar-PAID       { --status-bar: #3ccb7f; }
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .bar-NEW        { --status-bar: #f97066; }
    :root:not([data-theme="light"]) .bar-ACCEPTED   { --status-bar: #fdb022; }
    :root:not([data-theme="light"]) .bar-PREPARING  { --status-bar: #fd853a; }
    :root:not([data-theme="light"]) .bar-READY      { --status-bar: #32d583; }
    :root:not([data-theme="light"]) .bar-ON_THE_WAY { --status-bar: #53b1fd; }
    :root:not([data-theme="light"]) .bar-DELIVERED  { --status-bar: #a48afb; }
    :root:not([data-theme="light"]) .bar-PAID       { --status-bar: #3ccb7f; }
}


/* ==========================================================================
   11. STATISTIKA KARTALARI
   ========================================================================== */

.stat-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: var(--sp-4);
    margin-bottom: var(--sp-6);
}

.stat {
    background: var(--bg-surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    /* Audit 2026-09-23: statistika — passiv ma'lumotnoma, .order-card
       kabi jonli/harakatga chaqiruvchi karta emas (16-bo'limga q.). */
    box-shadow: var(--sh-xs);
    padding: var(--sp-5);
    /* Audit 2026-09-24, O9: grid ichida tor ustun kartadan kengaymasin va
       qiymat shrifti kartaning O'Z kengligiga qarab moslashsin (pastda). */
    min-width: 0;
    container-type: inline-size;
}
.stat-top {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    margin-bottom: var(--sp-3);
}
.stat-label {
    font-size: var(--fs-sm);
    color: var(--text-muted);
    line-height: 1.35;
}
.stat-value {
    font-size: var(--fs-3xl);
    font-weight: 600;
    line-height: 1.1;
    letter-spacing: -0.02em;
    font-variant-numeric: tabular-nums;
    /* Audit 2026-09-24, O9: pul summasi bo'linmas bo'shliqlar bilan
       yoziladi ("1 152 000"), ya'ni o'ralmaydi — 375px telefonda "so'm"
       karta chetidan chiqib ketar, katta summada esa butun sahifa yon
       tomonga suriladigan bo'lib qolardi. Endi: shrift karta kengligiga
       moslashadi (faqat pul summalarida — `.is-money`, pastga qarang),
       "so'm" sig'masa keyingi qatorga tushadi. Raqam guruh o'rtasidan
       ("9 / 76") faqat juda uzun summada, eng oxirgi chora sifatida
       bo'linadi. */
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    column-gap: var(--sp-1);
    /* `anywhere` (break-word emas): flex ichidagi matnning min-content
       kengligini ham kamaytiradi — aks holda juda uzun summa karta
       chetidan chiqib ketardi. Shrift to'g'ri tanlangani uchun amalda
       faqat trillionli summada ishga tushadi. */
    overflow-wrap: anywhere;
}
/* Pul summasi: shrift kartaning o'z kengligiga moslashadi (12cqi —
   "400 052 162,66" kabi 14 belgili summa ham bir qatorga sig'adi). Oddiy
   sonlar ("0", "12") esa ataylab katta qoladi — ularni kichraytirishga
   sabab yo'q. */
.stat-value.is-money { font-size: clamp(14px, 12cqi, var(--fs-3xl)); }
.stat-value.is-negative { color: var(--danger-fg); }
/* Audit 2026-09-24, J3: statistika qiymati ostidagi izoh (masalan
   "Qaytarishlar: −45 000 so'm"). */
.stat-note { margin-top: var(--sp-1); font-size: var(--fs-xs); color: var(--text-muted); }
.stat-value.is-positive { color: var(--success-fg); }
.stat-unit {
    font-size: var(--fs-base);
    font-weight: 500;
    color: var(--text-muted);
}

/* ==========================================================================
   12. BO'SH HOLAT
   ========================================================================== */

.empty-state {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    padding: var(--sp-9) var(--sp-5);
    background: var(--bg-surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
}
.empty-state > .icon {
    font-size: 40px;
    color: var(--n-300);
    margin-bottom: var(--sp-3);
}
/* Ichkaridagi tugma ikonkasi katta bo'lib ketmasligi kerak — `>` bilan
   faqat bevosita bolaga tegishli qilib qo'yildi, lekin eski `.empty-state
   .icon` yozuvi tugma ichidagi ikonkani ham 40px qilib yuborardi. */
.empty-state .btn .icon { font-size: 1em; color: inherit; margin-bottom: 0; }
.empty-state h4 {
    font-size: var(--fs-md);
    font-weight: 500;
    margin-bottom: var(--sp-1);
}
.empty-state p {
    color: var(--text-muted);
    font-size: var(--fs-sm);
    max-width: 380px;
    margin: 0;
}
.empty-state .btn { margin-top: var(--sp-4); }
.empty-state.is-compact { padding: var(--sp-6) var(--sp-4); }
/* display: flex brauzerning [hidden] qoidasini bekor qiladi — shuning uchun
   (masalan qidiruv natijasi bo'sh holati) alohida yozilishi shart. */
.empty-state[hidden] { display: none; }

/* Mijoz menyusidagi ikkita "bo'sh holat" (savat, qidiruv natijasi) —
   11/10 vizual sayqal (2026-09-26, 2-bosqich): oddiy kulrang 24px
   ikonka o'rniga, brendga mos (`--brand-50`/`--brand-700`, mavjud
   ranglar tizimidan) kattaroq, bir necha qatlamli SVG tasvir
   (`icons/illustration-empty-*.svg`). Boshqa (masalan boshqaruv
   panelidagi) `.empty-state`larga TA'SIR QILMAYDI — ataylab alohida,
   yangi klass, umumiy `.empty-state > .icon` qoidasiga tegmaydi. */
.empty-illustration {
    display: inline-flex;
    width: 88px;
    height: 88px;
    margin-bottom: var(--sp-3);
}
.empty-illustration svg { width: 100%; height: 100%; display: block; }
.empty-illustration .ill-accent { fill: var(--brand-50); }
.empty-illustration .ill-line { stroke: var(--brand-700); fill: none; }
.empty-illustration .ill-dot { fill: var(--brand-700); }
.cart-empty .empty-illustration { width: 72px; height: 72px; }

/* ==========================================================================
   13. BILDIRISHNOMALAR (alert / messages)
   ========================================================================== */

.messages { list-style: none; margin: 0 0 var(--sp-5); padding: 0; }
.messages:empty { display: none; }

.alert,
.messages li {
    display: flex;
    align-items: flex-start;
    gap: var(--sp-3);
    padding: var(--sp-3) var(--sp-4);
    margin-bottom: var(--sp-2);
    border: 1px solid var(--border);
    border-left: 3px solid var(--n-400);
    border-radius: var(--r-md);
    background: var(--bg-surface);
    font-size: var(--fs-base);
    color: var(--text);
}
.messages li:last-child { margin-bottom: 0; }

.alert-success, .messages li.success {
    background: var(--success-bg); border-color: var(--success-bd);
    border-left-color: var(--success-fg); color: var(--success-fg);
}
.alert-error, .messages li.error {
    background: var(--danger-bg); border-color: var(--danger-bd);
    border-left-color: var(--danger-fg); color: var(--danger-fg);
}
.alert-warning, .messages li.warning {
    background: var(--warning-bg); border-color: var(--warning-bd);
    border-left-color: var(--warning-fg); color: var(--warning-fg);
}
.alert-info, .messages li.info, .messages li.debug {
    background: var(--info-bg); border-color: var(--info-bd);
    border-left-color: var(--info-fg); color: var(--info-fg);
}

.alert .icon { margin-top: 2px; font-size: 18px; }
.alert-body { flex: 1; min-width: 0; }
.alert-body strong { display: block; margin-bottom: 2px; }

/* ==========================================================================
   14. BOSHQARUV PANELI KARKASI (sidebar + main)
   ========================================================================== */

.app { display: flex; min-height: 100vh; }

.sidebar {
    width: 248px;
    flex-shrink: 0;
    background: var(--sidebar-bg);
    color: var(--sidebar-fg);
    display: flex;
    flex-direction: column;
    padding: var(--sp-5) 0 var(--sp-4);
    overflow-y: auto;
}

.sidebar-brand {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    padding: 0 var(--sp-5) var(--sp-4);
    margin-bottom: var(--sp-4);
    border-bottom: 1px solid var(--sidebar-divider);
}
.sidebar-brand img,
.sidebar-brand .brand-fallback {
    width: 36px;
    height: 36px;
    border-radius: var(--r-md);
    object-fit: cover;
    flex-shrink: 0;
}
.sidebar-brand .brand-fallback {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--brand);
    color: var(--brand-on, #fff);
    font-weight: 700;
    font-size: var(--fs-lg);
    text-transform: uppercase;
}
.brand-text { min-width: 0; }
.brand-name {
    font-size: var(--fs-base);
    font-weight: 600;
    color: var(--sidebar-fg-strong);
    line-height: 1.2;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.brand-sub { font-size: var(--fs-xs); color: var(--sidebar-dim); margin-top: 1px; }

.nav-group { margin-bottom: var(--sp-5); }
.nav-group:last-child { margin-bottom: 0; }
.nav-group-title {
    padding: 0 var(--sp-5);
    margin-bottom: var(--sp-2);
    font-size: 11px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--sidebar-dim);
}

.nav-link {
    position: relative;
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    height: 40px;
    padding: 0 var(--sp-5);
    color: var(--sidebar-fg);
    font-size: var(--fs-base);
    transition: background var(--t-fast), color var(--t-fast);
}
.nav-link .icon { font-size: 18px; }
.nav-link:hover { background: var(--sidebar-hover); color: var(--sidebar-fg-strong); }

.nav-link.active {
    background: var(--sidebar-active);
    color: var(--sidebar-fg-strong);
    font-weight: 500;
}
.nav-link.active::before {
    content: "";
    position: absolute;
    left: 0; top: 6px; bottom: 6px;
    width: 4px;
    border-radius: 0 3px 3px 0;
    background: var(--brand);
}

.nav-link.disabled { color: var(--sidebar-disabled); cursor: default; }
.nav-link.disabled:hover { background: none; color: var(--sidebar-disabled); }

.soon-badge {
    margin-left: auto;
    padding: 1px 6px;
    border-radius: var(--r-full);
    background: var(--sidebar-hover);
    color: var(--sidebar-dim);
    font-size: 10px;
    font-weight: 500;
}

/* --- Asosiy ustun --- */
.main {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
}

.topbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-4);
    height: 64px;
    padding: 0 var(--sp-7);
    background: var(--bg-surface);
    border-bottom: 1px solid var(--border);
    position: sticky;
    top: 0;
    z-index: var(--z-nav);
}
.topbar h1 {
    font-size: var(--fs-lg);
    /* Audit 2026-09-21, M5: tor ekranda `.topbar-right` (til, mavzu,
       foydalanuvchi) joy talab qilib turgani uchun sarlavhaga deyarli
       joy qolmasdi — u har bir so'zdan keyin qatorga o'tib, oxir-oqibat
       1-2 harfli qatorlarga bo'linib ketardi. Endi sig'maganda chiroyli
       "..." bilan bir qatorda kesiladi. */
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    min-width: 0;
}
.topbar-left {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    min-width: 0;
    /* h1 ellipsis qila olishi uchun ushbu konteyner ham qisqarishi
       kerak — aks holda sarlavha "yashirin" kengligi bilan cho'zilib,
       `.topbar-right`ni sahifadan chiqarib yuborardi. */
    flex: 1 1 auto;
}
.topbar-right { display: flex; align-items: center; gap: var(--sp-3); flex-shrink: 0; }

.nav-toggle { display: none; }

.user-chip {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    padding: var(--sp-1) var(--sp-2);
    border-radius: var(--r-md);
}
.user-chip .user-meta { line-height: 1.25; }
.user-chip .user-name { font-size: var(--fs-sm); font-weight: 500; }
.user-chip .user-role { font-size: var(--fs-xs); color: var(--text-muted); }

.avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    border-radius: 50%;
    background: var(--brand-50);
    color: var(--brand-700);
    font-size: var(--fs-sm);
    font-weight: 600;
    text-transform: uppercase;
    flex-shrink: 0;
}
.avatar.is-lg { width: 48px; height: 48px; font-size: var(--fs-lg); }

.content {
    flex: 1;
    padding: var(--sp-7);
    max-width: 1440px;
    width: 100%;
}

.nav-overlay {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(22, 26, 32, .5);
    z-index: var(--z-overlay);
}

/* ==========================================================================
   15. ISHCHI PANEL KARKASI (ofitsiant / kuryer / oshpaz)
   ========================================================================== */

.worker-shell {
    max-width: 1100px;
    margin: 0 auto;
    padding: var(--sp-5) var(--sp-4) var(--sp-9);
}
/* Oshxona ekrani odatda katta monoblokda turadi — kengroq maydon beriladi,
   shunda bir vaqtning o'zida ko'proq buyurtma ko'rinadi. */
.worker-shell.is-wide { max-width: 1680px; }

.worker-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-3);
    margin-bottom: var(--sp-4);
}
.worker-header .brand-row {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    min-width: 0;
}
.worker-header img.brand-logo,
.worker-header .brand-fallback {
    width: 38px;
    height: 38px;
    border-radius: var(--r-md);
    object-fit: cover;
    flex-shrink: 0;
}
.worker-header .brand-fallback {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--brand);
    color: var(--brand-on, #fff);
    font-weight: 700;
    text-transform: uppercase;
}
.worker-header h1 { font-size: var(--fs-xl); }
/* 2026-09-24 (8-audit, to'rtinchi tur — foydalanuvchi: "restoran nomi
   ta'sir qiladigan boshqa sahifalarni ham ko'zdan kechir"): bu yerda
   ham (`.worker-header .sub`) — `{{ brand_name }} · {{ staff nomi }}` —
   xuddi shu flex-element muammosi bor edi: `.brand-row`ning o'zi
   `min-width:0` olgan, LEKIN h1+sub'ni o'rab turgan ICHKI `<div>`
   (nomsiz, brand-row'ning bevosita farzandi) buni OLMAGAN edi — agar
   brend nomi YOKI xodim FAMILIYASI bo'sh joysiz uzun bo'lsa (o'zbek
   ismlari ko'pincha shunday), bu qator ham xuddi footer'dagi kabi
   "toshib" ketishi mumkin edi. Oshxona paneli (`.kitchen-header`)da
   brend nomi umuman ko'rsatilmagani uchun (faqat belgi/rasm sifatida)
   u yerga tegilmadi — faqat shu yerda, "ishchi" (ofitsiant/kassir)
   panelida haqiqiy xavf bor edi. */
.worker-header .brand-row > div { min-width: 0; }
.worker-header .sub {
    font-size: var(--fs-xs);
    color: var(--text-muted);
    overflow-wrap: break-word;
    word-break: break-word;
}

/* Yuqoridagi segment navigatsiya (desktop) */
.wnav {
    display: flex;
    align-items: center;
    gap: var(--sp-1);
    padding: var(--sp-1);
    margin-bottom: var(--sp-5);
    background: var(--bg-surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    box-shadow: var(--sh-xs);
}
/* Chiqish tugmasi endi POST formasi ichidagi <button> (audit O1) —
   shuning uchun navigatsiya uslublari havola bilan birga unga ham
   qo'llanadi. `all: unset` emas: kerakli xossalarni aniq yozgan
   ma'qul, aks holda brauzerlar orasida farq chiqadi. */
.topbar .logout-form { margin: 0; display: flex; }
.wnav .logout-form { margin: 0; margin-left: auto; display: flex; }
.wnav a,
.wnav .logout-form button {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    height: 38px;
    padding: 0 var(--sp-3);
    border-radius: var(--r-md);
    color: var(--text-muted);
    font-size: var(--fs-sm);
    font-weight: 500;
    transition: background var(--t-fast), color var(--t-fast);
}
.wnav a .icon,
.wnav .logout-form button .icon { font-size: 17px; }
.wnav a:hover,
.wnav .logout-form button:hover { background: var(--bg-subtle); color: var(--text); }
.wnav a.active { background: var(--brand-50); color: var(--brand-700); }
.wnav a.disabled { color: var(--text-faint); cursor: default; }
.wnav a.disabled:hover { background: none; color: var(--text-faint); }
.wnav .logout-form button {
    margin: 0;
    border: 0;
    background: none;
    font-family: inherit;
    cursor: pointer;
    color: var(--text-muted);
}
.wnav .soon-badge { background: var(--bg-subtle); color: var(--text-faint); }

/* Pastdagi yopishqoq navigatsiya (telefon) */
.wnav-bottom {
    display: none;
    position: fixed;
    left: 0; right: 0; bottom: 0;
    z-index: var(--z-bar);
    background: var(--bg-surface);
    border-top: 1px solid var(--border);
    padding-bottom: env(safe-area-inset-bottom);
    box-shadow: var(--sh-sm);  /* token — qorong'u rejimda ham to'g'ri (audit Ki8) */
}
.wnav-bottom-inner { display: flex; }
.wnav-bottom .logout-form { flex: 1; margin: 0; display: flex; }
.wnav-bottom a,
.wnav-bottom .logout-form button {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 3px;
    height: 58px;
    color: var(--text-faint);
    font-size: 10px;
    font-weight: 500;
}
.wnav-bottom .logout-form button {
    border: 0;
    background: none;
    font-family: inherit;
    cursor: pointer;
}
.wnav-bottom a .icon,
.wnav-bottom .logout-form button .icon { font-size: 21px; }
.wnav-bottom a.active { color: var(--brand-700); }
.wnav-bottom a.disabled { opacity: .4; }

/* ==========================================================================
   16. BUYURTMA KARTASI
   ========================================================================== */

.order-card {
    position: relative;
    background: var(--bg-surface);
    border: 1px solid var(--border);
    border-left: 4px solid var(--status-bar, var(--n-300));
    border-radius: var(--r-lg);
    /* Audit 2026-09-23: jonli/harakatga chaqiruvchi karta — .card/.stat
       kabi passiv ma'lumotnomalardan ko'proq vizual og'irlikda
       ko'rinishi uchun kuchliroq soya. */
    box-shadow: var(--sh-md);
    padding: var(--sp-4) var(--sp-5);
    margin-bottom: var(--sp-3);
}

/* Audit 2026-09-23: BUTUN buyurtma bilan ishlaydigan panellar uchun
   (oshxona, ofitsiant, kuryer) BITTA holat-rang tili — ilgari faqat
   oshxona ekrani kechikish uchun fon rangini o'zgartirardi (pastda,
   .is-late/.is-very-late), boshqa joyda esa holat faqat ingichka chap
   chiziq + belgi bilan ko'rsatilardi. Endi shu belgi (`--status-bar`,
   17-bo'limdagi `.bar-*` klasslaridan) kartaning FONIGA ham engil soya
   sifatida tushadi — qaysi panelda ko'rinishidan qat'iy nazar. Eski
   brauzerlarda (`color-mix` yo'q) karta shunchaki oddiy fonda qoladi. */
@supports (color: color-mix(in srgb, red 50%, white)) {
    .order-card {
        background: color-mix(in srgb, var(--status-bar, var(--border)) 6%, var(--bg-surface));
        /* `border-color` shorthand emas — u `border-left`ning kuchli
           holat rangini ham qayta yozib, chap chiziqni xiralashtirib
           qo'yardi. Faqat qolgan uch tomon shu yerda yangilanadi. */
        border-top-color: color-mix(in srgb, var(--status-bar, var(--border)) 28%, var(--border));
        border-right-color: color-mix(in srgb, var(--status-bar, var(--border)) 28%, var(--border));
        border-bottom-color: color-mix(in srgb, var(--status-bar, var(--border)) 28%, var(--border));
    }
}

.order-card-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-3);
    margin-bottom: var(--sp-3);
}
.order-no {
    font-size: var(--fs-lg);
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

.order-meta { display: grid; gap: var(--sp-2); margin-bottom: var(--sp-3); }
.order-meta-row {
    display: flex;
    align-items: flex-start;
    gap: var(--sp-2);
    font-size: var(--fs-base);
    color: var(--text-muted);
}
.order-meta-row .icon { font-size: 16px; margin-top: 2px; color: var(--text-faint); }
.order-meta-row strong { color: var(--text); font-weight: 600; }

.order-items {
    list-style: none;
    margin: 0 0 var(--sp-3);
    padding: var(--sp-3) 0;
    border-top: 1px solid var(--border);
    border-bottom: 1px solid var(--border);
}
.order-items li {
    display: flex;
    align-items: baseline;
    gap: var(--sp-2);
    padding: 3px 0;
    font-size: var(--fs-base);
}
.order-items .qty {
    min-width: 32px;
    color: var(--brand-700);
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}

.order-actions {
    display: flex;
    gap: var(--sp-2);
    flex-wrap: wrap;
    align-items: center;
}
.order-actions form { margin: 0; }

/* Oshxona uchun kattalashtirilgan variant */
.order-card-lg { padding: var(--sp-5); }
.order-card-lg .order-no { font-size: var(--fs-3xl); letter-spacing: -0.02em; }
.order-card-lg .order-items li { font-size: var(--fs-lg); padding: var(--sp-1) 0; }
.order-card-lg .order-items .qty { min-width: 42px; font-size: var(--fs-xl); }
.order-card-lg .order-meta-row { font-size: var(--fs-md); }

/* Oshxona kutish vaqti ogohlantirishi */
.order-card.is-late {
    border-color: var(--warning-bd);
    background: linear-gradient(0deg, var(--warning-bg), var(--warning-bg)) padding-box;
}
.order-card.is-very-late {
    border-color: var(--danger-bd);
    background: linear-gradient(0deg, var(--danger-bg), var(--danger-bg)) padding-box;
    /* Audit 2026-09-23, "barcha panellar": oshpaz ekrandan bir necha
       qadam narida, qo'li band holda qaraydi — shuning uchun eng
       kechikkan buyurtma sokin chegara rangidan balandroq signal
       berishi kerak. `prefers-reduced-motion` global qoidasi (pastda,
       23-bo'lim) bu animatsiyani ham avtomatik o'chiradi. */
    animation: order-very-late-pulse 1.8s ease-in-out infinite;
}
@keyframes order-very-late-pulse {
    0%, 100% { box-shadow: var(--sh-md); }
    50%      { box-shadow: var(--sh-md), 0 0 0 4px var(--danger-bd); }
}

.elapsed {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-1);
    font-size: var(--fs-sm);
    font-weight: 500;
    color: var(--text-muted);
    font-variant-numeric: tabular-nums;
}
.order-card.is-late .elapsed { color: var(--warning-fg); }
.order-card.is-very-late .elapsed { color: var(--danger-fg); }

/* Audit 2026-09-23: kuryer panelida "olinmagan" (hali hech kim
   olmagan) buyurtma va "yo'lda"/"mening" buyurtma bir xil ko'rinardi —
   faqat tugma matni farq qilardi. Endi olinishi mumkin bo'lgan karta
   o'zining shtrixli chegarasi bilan ajralib turadi, shunda kuryer
   ro'yxatni bir qarashda skanerlay oladi. */
.order-card.is-claimable {
    border-style: dashed;
    background: var(--bg-subtle);
}
@supports (color: color-mix(in srgb, red 50%, white)) {
    .order-card.is-claimable {
        background: color-mix(in srgb, var(--brand) 5%, var(--bg-surface));
        /* Chap chiziqning holat rangini (`.bar-*`) saqlab qolish uchun
           `border-color` shorthand emas, faqat qolgan uch tomon. */
        border-top-color: color-mix(in srgb, var(--brand) 35%, var(--border));
        border-right-color: color-mix(in srgb, var(--brand) 35%, var(--border));
        border-bottom-color: color-mix(in srgb, var(--brand) 35%, var(--border));
    }
}

.board {
    display: grid;
    /* Audit 2026-09-24: `min(..., 100%)` — 320px li telefonda ustun ekrandan
       kengroq bo'lib, sahifa yonga surilardi (gorizontal skroll). */
    grid-template-columns: repeat(auto-fill, minmax(min(320px, 100%), 1fr));
    gap: var(--sp-4);
    align-items: start;
}
.board .order-card { margin-bottom: 0; }

/* ==========================================================================
   17. FILTR PANELI
   ========================================================================== */

.filter-bar {
    display: flex;
    align-items: flex-end;
    gap: var(--sp-3);
    flex-wrap: wrap;
    padding: var(--sp-4);
    margin-bottom: var(--sp-5);
    background: var(--bg-surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    box-shadow: var(--sh-xs);
}
.filter-bar .field { margin: 0; min-width: 150px; }
.filter-bar label {
    margin-bottom: var(--sp-1);
    font-size: var(--fs-xs);
    color: var(--text-muted);
    font-weight: 500;
}

/* ==========================================================================
   18. KICHIK KOMPONENTLAR
   ========================================================================== */

.kv-list { display: grid; gap: var(--sp-2); }
.kv-row {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--sp-4);
    font-size: var(--fs-sm);
}
.kv-row .k { color: var(--text-muted); }
.kv-row .v { font-weight: 500; text-align: right; }

.copy-field { display: flex; gap: var(--sp-2); }
.copy-field input {
    flex: 1;
    min-width: 0;
    background: var(--bg-subtle);
    color: var(--text-muted);
    font-size: var(--fs-sm);
}

.chip-row {
    display: flex;
    gap: var(--sp-2);
    overflow-x: auto;
    padding-bottom: var(--sp-1);
    /* Oxirgi chip skroll chegarasiga yopishib, "kesilgan"dek
       ko'rinmasin — bir oz nafas joyi (audit 2026-09-23). */
    padding-right: var(--sp-3);
    scrollbar-width: none;
}
.chip-row::-webkit-scrollbar { display: none; }
/* Audit 2026-09-23: tasma skroll qilinishi mumkinligini ko'rsatuvchi
   xiralashuv — `.has-more`/`.is-scrolled` klasslarini
   `menu_picker_js.html` skroll holatiga qarab qo'yadi/olib tashlaydi.
   Ikkalasi ham yo'q bo'lsa (hammasi bitta ekranga sig'sa) xiralashuv
   umuman ko'rinmaydi. */
.chip-row.has-more {
    -webkit-mask-image: linear-gradient(to right, black calc(100% - 28px), transparent);
    mask-image: linear-gradient(to right, black calc(100% - 28px), transparent);
}
.chip-row.is-scrolled {
    -webkit-mask-image: linear-gradient(to left, black calc(100% - 28px), transparent);
    mask-image: linear-gradient(to left, black calc(100% - 28px), transparent);
}
.chip-row.is-scrolled.has-more {
    -webkit-mask-image: linear-gradient(to right, transparent, black 28px, black calc(100% - 28px), transparent);
    mask-image: linear-gradient(to right, transparent, black 28px, black calc(100% - 28px), transparent);
}
.chip {
    display: inline-flex;
    align-items: center;
    height: 34px;
    padding: 0 var(--sp-4);
    border: 1px solid var(--border-strong);
    border-radius: var(--r-full);
    background: var(--bg-surface);
    color: var(--text-muted);
    font-size: var(--fs-sm);
    font-weight: 500;
    white-space: nowrap;
}
.chip:hover { border-color: var(--brand); color: var(--brand-700); }
.chip.active { background: var(--brand); border-color: var(--brand); color: var(--brand-on, #fff); }

/* ==========================================================================
   19. KIRISH SAHIFASI
   ========================================================================== */

body.auth-page {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    padding: var(--sp-5);
    /* Audit 2026-09-23: bu ekranni har bir xodim, har smenada ko'radi —
       ilgari bitta yumshoq nurdan iborat edi, endi ikki nuqtali
       chuqurlik beriladi, shunda sahifa "bo'sh sozlama oynasi" emas,
       atayin ishlangandek ko'rinadi. */
    background:
        radial-gradient(900px 480px at 12% -10%, var(--brand-100), transparent 60%),
        radial-gradient(700px 420px at 100% 110%, var(--brand-50), transparent 55%),
        var(--bg-app);
}

.auth-card {
    position: relative;
    overflow: hidden;
    width: 100%;
    max-width: 400px;
    padding: var(--sp-7);
    background: var(--bg-surface);
    border: 1px solid var(--border);
    border-radius: var(--r-xl);
    box-shadow: var(--sh-lg);
}
/* Brend chizig'i — kartaning o'zi ham "generic" oq quti bo'lib
   qolmasligi uchun. */
.auth-card::before {
    content: "";
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 4px;
    background: linear-gradient(90deg, var(--brand), var(--brand-700));
}
.auth-head { text-align: center; margin-bottom: var(--sp-6); }
.auth-head img.brand-logo {
    display: block;
    max-width: 96px;
    max-height: 64px;
    margin: 0 auto var(--sp-4);
}
.auth-head .brand-fallback {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 56px;
    height: 56px;
    margin: 0 auto var(--sp-4);
    border-radius: var(--r-lg);
    background: var(--brand);
    color: var(--brand-on, #fff);
    font-size: var(--fs-2xl);
    font-weight: 700;
    text-transform: uppercase;
}
.auth-head h1 { font-size: var(--fs-xl); margin-bottom: var(--sp-1); }
.auth-head .panel-name { font-size: var(--fs-sm); color: var(--text-muted); }

.password-wrap { position: relative; }
.password-wrap input { padding-right: var(--sp-9); }
.password-toggle {
    position: absolute;
    right: var(--sp-1);
    top: 50%;
    transform: translateY(-50%);
    width: 34px;
    height: 34px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 0;
    background: none;
    color: var(--text-faint);
    cursor: pointer;
    border-radius: var(--r-sm);
}
.password-toggle:hover { color: var(--text-muted); background: var(--bg-subtle); }

/* Kirish sahifasidagi telefon maydoni — O'zbekiston kodi (+998) doim
   ko'rinib tursin, xodim uni har safar qayta terib o'tirmasin
   (2026-09-23). Maydonning o'zi kod kiritilmasa ham ishlaydi
   (`config/phone.py` 9 xonali raqamni +998 deb qabul qiladi) — bu
   faqat ko'rinish uchun. */
.phone-wrap { position: relative; }
.phone-wrap .phone-prefix {
    position: absolute;
    left: var(--sp-3);
    top: 50%;
    transform: translateY(-50%);
    color: var(--text-muted);
    font-size: var(--fs-base);
    pointer-events: none;
}
.phone-wrap input { padding-left: 54px; }

/* Filial joylashuvini tanlash xaritasi (2026-09-23) — Leaflet/OSM,
   templates/manage/branches/form.html ichida ishlatiladi. */
.branch-map {
    height: 320px;
    width: 100%;
    border: 1px solid var(--border-strong);
    border-radius: var(--r-md);
    margin-bottom: var(--sp-3);
    overflow: hidden;
}

/* Kirish sahifasidagi izoh matni — PIN qadamida ko'rsatilgan raqam va
   "birinchi kirishingiz" tushuntirishi uchun (2026-09-20, 2-bosqich).
   `.auth-foot` dan farqi: bu matn kartaning ICHIDA, formadan oldin turadi
   va markazga tekislanmaydi — u o'qiladigan jumla, imzo emas. */
.auth-note {
    margin: 0 0 var(--sp-4);
    font-size: var(--fs-sm);
    color: var(--text-muted);
    line-height: 1.55;
}

/* Tahrirlab bo'lmaydigan qiymat (masalan Profil sahifasidagi telefon
   raqami — u endi login, shuning uchun faqat o'qish uchun). */
.static-text {
    margin: 0;
    padding: var(--sp-2) 0;
    font-size: var(--fs-md);
    font-weight: 600;
    color: var(--text);
}

.auth-foot {
    margin-top: var(--sp-5);
    text-align: center;
    font-size: var(--fs-xs);
    color: var(--text-faint);
}

/* ==========================================================================
   20. MIJOZ SAHIFASI
   ========================================================================== */

.site {
    /* 2026-09-24 (8-audit, ikkinchi tur): pastdagi `.about, .jobs, ...`
       qoidasidagi izohga qarang — bu yerda ham xuddi shu flexbox
       kvirki (`body.client-shell` + auto margin + align-items:stretch)
       sabab `width: 100%` ANIQ qiymat sifatida qo'shildi, aks holda
       Menyu sahifasi ham o'z kontentiga qarab "qisilib" qolar edi. */
    width: 100%;
    max-width: 960px;
    margin: 0 auto;
    padding: var(--sp-5) var(--sp-4) 120px;
}

/* Topbar (2026-09-23, 3/4-audit). 3-audit: brend+til/rejim 1-qatorda,
   havolalar+qo'ng'iroqcha ALOHIDA 2-qatorda edi — endi >640px'da HAMMASI
   bitta qatorda, sahifa aylantirilganda ham ko'rinib turadi
   (`position: sticky`).

   4-audit (foydalanuvchi: "Bo'lim nomi ikki marta takrorlanib
   judayam yomon holat", "avval til, keyin mavzu va undan keyin
   qo'ng'iroqcha joylashsin"): ikkita qo'shimcha muammo topildi va
   tuzatildi:
   1) `brand-row`dagi `<h1>` ilgari HAR BIR SAHIFADA sahifa nomini
      ko'rsatardi ("Filiallar", "Biz haqimizda", ...) — bu HAM faol
      bo'lim nomi bilan pastdagi ro'yxatda ikki marta takrorlanardi,
      HAM sahifadan-sahifaga uzunligi farq qilib, butun topbar
      "siljib"/o'zgarib turardi (foydalanuvchi buni alohida payqadi).
      Endi barcha mijoz sahifalarida bitta xil `{{ brand_name }}`
      (shablonlarga qarang) — brand-row kengligi endi DOIM bir xil.
   2) `partials/prefs.html` (til+rejim) ilgari `.header-links`dan
      TASHQARIDA, alohida ulanardi — shu sabab uni CSS `order` bilan
      qo'ng'iroqchadan OLDIN chiqarish tabiiy emas edi (opa-uka emas
      edi). Endi `partials/client_topnav.html` ICHIGA, ro'yxatdan
      keyin va qo'ng'iroqchadan OLDIN ko'chirildi — natijada DOM
      tartibining o'zi kerakli ketma-ketlikni beradi: bo'limlar, til,
      rejim, qo'ng'iroqcha. Shu sabab endi `.site-header`ning faqat
      IKKITA to'g'ridan-to'g'ri farzandi bor (brand-row, header-links)
      — alohida `order` kerak emas, tabiiy DOM tartibi yetarli. */
.site-header {
    display: flex;
    align-items: center;
    gap: var(--sp-4);
    flex-wrap: wrap;
    margin-bottom: var(--sp-5);
    position: sticky;
    top: 0;
    /* 2026-09-25 (6-audit — mobil skrinshotda topilgan xato): "sudralib
       chiquvchi panel" (`.topnav-drawer`, z-index 60) va til menyusi
       (`.lang-menu-panel`, z-index 50) shu `.site-header`ning ICHIDA
       joylashgan. `.site-header`ning o'zi `position:sticky` + o'z
       z-index'i borligi sabab ALOHIDA stacking context hosil qiladi —
       demak ICHIDAGI 60/50 qiymatlar faqat BIR-BIRIGA nisbatan
       ishlaydi, TASHQARIDAGI (`.menu-toolbar`/`.menu-chips`, ular ham
       sticky + `--z-nav`) bilan solishtirilganda esa `.site-header`ning
       O'ZINING qiymati (`--z-nav`, ya'ni ULARNIKI BILAN BIR XIL)
       hisobga olinadi — teng bo'lganda esa DOM tartibida KEYIN kelgan
       g'olib chiqadi. Natija: sahifa pastroqqa scroll qilinganda
       qidiruv/kategoriya tasmasi panel/menyu ustidan chiqib ketardi
       (mobil skrinshotda ko'rilgan "kesilgan" ko'rinish). Yechim —
       `.site-header`ning o'zini ENG YUQORI qiymatga (`--z-drawer`)
       ko'tarish, shunda butun ichki mazmuni (panel, til menyusi) har
       doim sahifa kontentidan ustun turadi. */
    z-index: var(--z-drawer);
    background: var(--bg-app);
    padding-top: var(--sp-3);
    padding-bottom: var(--sp-3);
    border-bottom: 1px solid var(--border);
}
.site-header .brand-row { display: flex; align-items: center; gap: var(--sp-3); flex-shrink: 0; }
/* 2026-09-24 (5-audit, "bosh sahifa"): beshqozon.uz'da alohida "Bosh
   sahifa" havolasi navigatsiyada YO'Q — logotipning o'zi bosh sahifaga
   olib boradi (jonli tekshirilganda shunday). Xuddi shu naqsh
   takrorlandi: nav ro'yxatiga 7-havola qo'shish o'rniga (foydalanuvchi
   aynan shu ro'yxat "judayam keng" degan edi — yana bittasini qo'shish
   noto'g'ri bo'lardi), brend nomi+logotip endi `{% url 'home_page' %}`ga
   havola. `color:inherit`/`text-decoration:none` — oddiy matn kabi
   ko'rinishi uchun (havola rangi/tagiga chizilgan chiziq YO'Q). */
.site-header .brand-row a.brand-link {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    color: inherit;
    text-decoration: none;
}
.site-header .brand-row img,
.site-header .brand-fallback {
    width: 46px; height: 46px;
    border-radius: var(--r-md);
    object-fit: cover;
}
.site-header .brand-fallback {
    display: flex; align-items: center; justify-content: center;
    background: var(--brand); color: var(--brand-on, #fff);
    font-weight: 700; font-size: var(--fs-xl); text-transform: uppercase;
}
/* 2026-09-25 (7-audit, "desktop uchun topbardagi restoran nomini ham
   olib tashla xuddi mobil kabi"): ilgari brend NOMI (h1) faqat
   <=640px'da yashirilardi (pastdagi media-so'rovga qarang edi) — endi
   EKRAN O'LCHAMIDAN QAT'IY NAZAR har doim yashirilgan: topbarda faqat
   logotipning o'zi qoladi, matn UMUMAN yo'q. Shu bilan birga bu
   topbar/logo o'lchamini sahifadan sahifaga bir xil qilishga ham
   yordam beradi — matn uzunligi endi hech qanday joy egallamaydi. */
.site-header h1 { display: none; }
.site-header .header-links {
    display: flex;
    align-items: center;
    flex-wrap: nowrap;
    gap: var(--sp-4);
    flex: 1 1 auto;
    min-width: 0;
}
/* Klaviatura/o'qish tartibi (fokus, ekran o'qigichlar) DOM tartibiga mos
   kelishi uchun `order` ATAYLAB ishlatilmaydi — vizual tartib allaqachon
   DOM tartibi bilan bir xil (bo'limlar, til/rejim, qo'ng'iroqcha). */
/* 2026-09-24 (5-audit): `.topnav-links` endi zich (flex:1 emas), shuning
   uchun bo'limlar bilan til/rejim+qo'ng'iroqcha orasidagi qolgan bo'sh joy
   ENDI shu yerda, `.prefs`ning o'zida yutiladi — beshqozon.uz'dagi
   `margin-right:auto` naqshining oynadagi aksi (bizda navigatsiya
   ro'yxatidan KEYINGI birinchi element `.prefs` bo'lgani uchun
   `margin-left:auto` bir xil natija beradi). */
.site-header .prefs { flex-shrink: 0; margin-left: auto; }
/* 2026-09-23 (4-audit): mijoz topbari uchun til tugmasidagi pastga
   ishora qiluvchi belgi ortiqcha topildi (foydalanuvchi) — tugmaning
   o'zi allaqachon bosiladigan ko'rinishda. Faqat shu kontekstda
   (`.site-header .lang-menu-chevron`) yashiriladi — boshqaruv panellari
   (`.sidebar`, xodim panellari)dagi til tugmasiga tegmaydi, u yerda
   hali ham chevron bor. */
.site-header .lang-menu-chevron { display: none; }
/* 2026-09-24 audit — beshqozon.uz'ning HAQIQIY topbari jonli, brauzer
   `getComputedStyle()` orqali o'lchab chiqildi (o'zboshimchalik bilan
   "chiroyli qilib" emas): oddiy matn havolalar — ikonka yo'q, fon yo'q,
   chegara yo'q, pill yo'q. Shrift 16px/24px, orasidagi bo'shliq 16px,
   FAQAT faol bo'lim `font-weight: 600` bilan ajratiladi (rang
   o'zgarmaydi — ikkalasi ham bir xil asosiy matn rangida). Shu o'lchamlar
   ataylab token o'rniga ANIQ piksel qiymat bilan yozilgan, chunki vazifa
   aynan namunani 1:1 nusxalash edi.
   beshqozon 640px'dan tor ekranda bu ro'yxatni BUTUNLAY yashirib,
   gamburger tugma + o'ngdan sudralib chiquvchi panel bilan almashtiradi
   — shu naqsh pastda takrorlangan. */
.topnav-links {
    display: flex;
    flex-wrap: nowrap;
    align-items: center;
    /* 2026-09-23 (topbar-tuzatish): oldin `justify-content:center` +
       32px qattiq oraliq bilan sinaldi — 960px konteynerda bu (brend +
       6 ta havola + qo'ng'iroqcha + til/rejim bir qatorda) sig'may
       qolib, `.prefs` 2-qatorga tushib ketishiga sabab bo'ldi (jonli
       o'lchab aniqlandi). Shundan keyin `space-evenly` bilan mavjud
       bo'shliqqa yoyilgan edi.

       2026-09-24 (5-audit): konteyner 1440px'ga kengaytirilgandan so'ng
       (Menyu sahifasiga moslab) xuddi shu `space-evenly` endi havolalar
       orasida judayam katta bo'shliq hosil qildi — foydalanuvchi "bo'limlarni
       judayam keng yoyib yuborganmiz" deb to'g'ri ta'kidladi. beshqozon.uz'ning
       HAQIQIY topbari (jonli, `getComputedStyle()` bilan) qayta o'lchandi:
       u yerda havolalar konteyner bo'ylab UMUMAN yoyilmagan — brenddan keyin
       zich guruhlangan (`gap-4` = 16px, `w-auto`), so'ng `margin-right:auto`
       bilan qolgan hamma narsa (qidiruv/savat/til) o'ng chetga suriladi.
       Shu naqsh takrorlandi: `flex:1` va `space-evenly` OLIB TASHLANDI —
       endi ro'yxat o'z tabiiy kengligida, brenddan keyin zich turadi;
       o'ng chetga surish esa `.site-header .prefs`dagi `margin-left:auto`
       orqali amalga oshadi (pastga qarang). */
    justify-content: flex-start;
    gap: var(--sp-5);
    margin: 0;
    padding: 0;
    list-style: none;
    flex: 0 1 auto;
    min-width: 0;
}
.topnav-links a {
    display: inline-block;
    /* 2026-09-23 audit: ilgari beshqozon.uz'da jonli o'lchangan
       rgb(17,24,28) qattiq kodlangan edi (loyihaning --text tokeni,
       #262c35'dan sal farqli). 2026-09-24 (8-audit — foydalanuvchi:
       "qorong'u rejimda bo'limlar ko'rinmay qolmoqda"): qattiq kodlangan
       rang qorong'u rejimda AVTOMATIK almashmaydi (--text esa
       almashadi — pastga, qorong'u rejim bo'limiga qarang), shu sabab
       matn deyarli qora fonda deyarli qora bo'lib "yo'qolib" qolardi.
       Ikki rang bir-biriga judayam yaqin bo'lgani uchun (#11181c vs
       #262c35) yorug' rejimdagi sezilmas farq evaziga --text tokeniga
       o'tkazildi — bu qorong'u rejimda TO'G'RI ishlaydi. */
    color: var(--text);
    font-size: 16px;
    line-height: 24px;
    font-weight: 400;
    text-decoration: none;
}
.topnav-links a.active { font-weight: 600; }

/* O'ng chetdagi qo'ng'iroqcha — bu FENO'ning o'z xususiyati (buyurtma
   kuzatish + bildirishnoma soni), beshqozon namunasida yo'q, shuning
   uchun undan ataylab ALOHIDA, har doim ko'rinadigan qilib qoldirildi.

   2026-09-24 (to'liq audit, 1-band): o'lcham/fon/border-radius/hover
   endi shablonda qo'shilgan `.btn.btn-ghost.btn-icon` klasslaridan
   meros (`.theme-toggle` bilan bir xil 36x36px) — bu yerda FAQAT
   joylashuv (flex-shrink, margin) qoladi. Ilgari shu yerda qattiq
   kodlangan `font-size: var(--fs-sm)` (13px) ikonkani ham 13x13px
   qilib qo'yardi — hech qanday tugma foni yo'q edi. */
.header-links .topnav-utility {
    margin-left: 0;
    flex-shrink: 0;
}

/* --- Gamburger tugma + sudralib chiquvchi panel (o'ng tomondan, 320px,
   beshqozon.uz'ning mobil menyusi namunasida — jonli tekshirildi). --- */
.topnav-toggle {
    display: none;
    width: 40px; height: 40px;
    align-items: center;
    justify-content: center;
    border: 0;
    border-radius: var(--r-md);
    background: transparent;
    color: var(--text);
    cursor: pointer;
}
.topnav-toggle:hover { background: var(--bg-subtle); }

/* 2026-09-24 (to'liq audit, 2-band): mijoz topbaridagi BARCHA utility
   ikonkalar (qo'ng'iroqcha, tema, til globusi, gamburger, sudralib
   chiquvchi panelni yopish tugmasi) endi BITTA aniq o'lchamda —
   `.icon-sm` (16px). Ilgari har biri turli manbadan o'lcham olardi:
   qo'ng'iroqcha 13px (font-size:var(--fs-sm) orqali, endi olib
   tashlandi), til globusi 15px (qattiq kodlangan), tema/gamburger esa
   hech qanday aniq qiymat berilmagan holda atrofdagi shriftdan meros
   olardi — natijada bitta qatorda bir nechta turli o'lchamdagi ikonka
   yonma-yon turardi. */
.site-header .theme-toggle .icon,
.site-header .notif-bell .icon,
.site-header .topnav-toggle .icon,
.site-header .lang-menu-globe,
.topnav-drawer-close .icon {
    font-size: 16px;
}

.topnav-backdrop {
    position: fixed;
    inset: 0;
    z-index: var(--z-overlay);
    /* beshqozon.uz'da jonli o'lchandi (2026-09-23): oddiy qora, 50% —
       loyihaning --sh-lg/rangli overlay o'rniga ataylab shu aniq qiymat. */
    background: rgba(0, 0, 0, .5);
    opacity: 0;
    transition: opacity 200ms ease;
}
.topnav-backdrop.is-open { opacity: 1; }

.topnav-drawer {
    position: fixed;
    top: 0; right: 0; bottom: 0;
    z-index: var(--z-drawer);
    width: min(320px, 92vw);
    display: flex;
    flex-direction: column;
    background: var(--bg-surface);
    /* beshqozon.uz'ning jonli o'lchangan soyasi — loyihaning odatiy
       --sh-lg'idan ancha yengilroq (2026-09-23 audit). */
    box-shadow: 0 0 5px rgba(0, 0, 0, .02), 0 2px 10px rgba(0, 0, 0, .06), 0 0 1px rgba(0, 0, 0, .3);
    border-radius: var(--r-lg) 0 0 var(--r-lg);
    transform: translateX(100%);
    transition: transform 250ms ease;
    overflow-y: auto;
}
.topnav-drawer.is-open { transform: translateX(0); }
.topnav-drawer-head {
    display: flex;
    justify-content: flex-end;
    padding: var(--sp-3);
}
.topnav-drawer-close {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 36px; height: 36px;
    border: 0;
    border-radius: 50%;
    background: transparent;
    color: var(--text-muted);
    cursor: pointer;
}
.topnav-drawer-close:hover { background: var(--bg-subtle); color: var(--text); }
.topnav-drawer-links {
    margin: 0;
    padding: 0 var(--sp-6) var(--sp-6);
    list-style: none;
}
/* Chiziq rangi ham beshqozon.uz'da jonli o'lchandi: rgb(228,228,231) —
   loyihaning --border tokeni (#e6e9ee)dan sal farqli, aniq qiymat
   ishlatildi (2026-09-23 audit). */
.topnav-drawer-links li { border-bottom: 1px solid #e4e4e7; }
.topnav-drawer-links li:last-child { border-bottom: 0; }
.topnav-drawer-links a {
    display: block;
    padding: 12px 0;
    /* 2026-09-24 (8-audit — foydalanuvchi: "qorong'u rejimda bo'limlar
       ko'rinmay qolmoqda"): yuqoridagi `.topnav-links a`dagi bilan bir
       xil sabab — qattiq kodlangan #11181c qorong'u rejimda almashmas
       edi, --text tokeniga o'tkazildi. */
    color: var(--text);
    font-size: 16px;
    font-weight: 400;
    text-decoration: none;
}
.topnav-drawer-links a.active { font-weight: 600; }
/* Audit 2026-09-24, M10: "Ma'lumotlarni tozalash" endi POST forma
   tugmasi — ko'rinishi yonidagi havolalar bilan aynan bir xil. */
.topnav-drawer-form { margin: 0; }
.topnav-drawer-link-btn {
    display: block;
    width: 100%;
    padding: 12px 0;
    border: 0;
    background: transparent;
    color: var(--text);
    font: inherit;
    font-size: 16px;
    font-weight: 400;
    text-align: left;
    cursor: pointer;
}

/* Audit 2026-09-24, O6: gamburger chegarasi 640px -> 900px. 641–800px
   (planshetlar: iPad 768/810, iPad mini 744, ko'p Android planshetlar)
   oralig'ida 6 ta havola + til + mavzu + qo'ng'iroqcha bitta qatorga
   sig'masdi — header ikki qatorga (122–135px) o'ralib, menyu sahifasida
   qidiruv panelining 53–65px qismini yopib qo'yardi (jonli o'lchandi).
   Endi planshetda ham gamburger — header har doim bitta qatorda. */
@media (max-width: 900px) {
    .topnav-links { display: none; }
    .topnav-toggle {
        display: inline-flex;
        /* 6-audit: gamburger mobilda kichik/bosish qiyin topilgan edi —
           kattalashtirildi (40px -> 48px), ikonka ham shrift o'lchamiga
           qarab kattalashadi (`.icon` — 1em). */
        width: 48px; height: 48px;
        font-size: 22px;
    }

    /* 6-audit ("topbarda logo yonida restoran nomi yaxshi turmayapti...
       shunchaki logoning o'zi tursa yetarli"): brend NOMI (h1) endi HAR
       DOIM yashirilgan (7-auditdan keyin, yuqoridagi bazaviy
       `.site-header h1` qoidasiga qarang) — bu yerda faqat shundan
       kelib chiqadigan natija qoladi: matn yo'qolgani sabab
       `.header-links`ni ALOHIDA (2-)qatorga tushirish (`flex-basis:100%`)
       kerak emas, logo, UZ/rejim, qo'ng'iroqcha va gamburger BITTA
       qatorga sig'adi ("logo uz/mavzu/qo'ng'iroq bitta tekislikda
       joylashsin" — foydalanuvchi). */
    .site-header .header-links { flex-basis: auto; justify-content: flex-end; }
}

/* --------------------------------------------------------------------------
   Mijoz sahifalarining umumiy konteyneri (2026-09-23, keng ekranli audit
   — foydalanuvchi haqiqiy Opera brauzerida ~2000px kenglikda skrinshot
   yubordi: "Barcha bo'limlar har xil ochilayotganini ko'rdingmi?").
   Muammo: about/jobs/branches/contact sahifalarining har biri o'zining
   sahifa-ichi <style>'ida ALOHIDA max-width qiymatini e'lon qilardi
   (620px/620px/680px/960px) — bir xil sahifadagi sarlavha, tarkib va
   pastdagi footer turlicha kenglik/chekka bo'lib ko'rinardi. Yana
   yomoni: promotions.html "about" klassini qayta ishlatadi, lekin
   o'zining <style>'ida hech qanday kenglik qoidasi yo'q edi — shu
   sabab Aksiyalar sahifasida sarlavha/menyu butun ekran bo'ylab cho'zilib
   ketardi.

   4-audit (foydalanuvchi: "sen topbarni toraytiribsan... aksincha
   qilishing kerak edi"): birinchi marta bu 960px qilib tuzatilgan edi
   (footer'ga moslab) — keyin Menyu sahifasi (`.menu-page .site`, taom
   tanlash uchun 1440px) bilan boshqa sahifalar orasida topbar kengligi
   farq qilgani aniqlanib, AVVAL Menyu'ning topbar'i 960px'ga
   TORAYTIRILGAN edi. Foydalanuvchi buni yoqtirmadi — aksincha, boshqa
   sahifalar Menyu'ning KENGROQ o'lchamiga (1440px) moslashishi kerak
   ekan. Endi shunday: BITTA umumiy qoida, `.menu-page .site` bilan BIR
   XIL 1440px. */
/* 2026-09-24 (5-audit): `.home` shu qoidaga QO'SHILDI — yangi "Bosh
   sahifa" ham xuddi shu 1440px'da, aks holda topbar yana sahifadan
   sahifaga sakrab qoladi (aynan shu xato uchun butun ushbu qoida
   yozilgan edi). */
.about, .jobs, .branches, .contact, .home {
    /* 2026-09-24 (8-audit, ikkinchi tur — foydalanuvchi: "Desktop uchun
       topbardagi bo'limlar o'ngga va chapga surilishi hamon davom
       etmoqda"): pastdagi `body.client-shell` qoidasi (flex ustun)
       tufayli bu konteynerlar endi FLEX FARZANDLARI — flexbox'da
       "kross o'qda avtomatik margin bo'lsa, `align-items:stretch`
       BEKOR qilinadi" degan kam ma'lum qoida bor (CSS Flexbox
       spetsifikatsiyasi). Natijada `width` avtomatik ravishda
       KONTENTGA moslashib (shrink-to-fit) qolardi — masalan "Ish
       o'rinlari" sahifasida kontent kichik bo'lgani uchun konteyner
       taxminan 755px'gacha "qisilib" qolardi, Menyu sahifasida esa
       ~894px'gacha — demak HAR BIR SAHIFA turlicha kenglikda markazga
       tortilardi, shu sabab topbar sahifadan-sahifaga chapga/o'ngga
       "sakrab" ko'rinardi (aynan foydalanuvchi tasvirlagan xato).
       Yechim — `width: 100%` ANIQ qiymat sifatida qo'shildi: bu
       flex stretch'ga umuman muhtoj emas (kenglik allaqachon aniq),
       shu bilan bir vaqtda `max-width` + `margin:0 auto` markazlash
       odatdagidek ishlayveradi (kenglik konteynerdan katta bo'lganda
       `max-width` uni 1440px'ga cheklaydi, ortiqcha joy esa avtomatik
       margin'larga teng taqsimlanadi — bu oddiy blok box modeli, flex
       kvirki bilan bog'liq emas). */
    width: 100%;
    max-width: 1440px;
    margin: 0 auto;
    padding: var(--sp-5) var(--sp-4) var(--sp-9);
}

/* 2026-09-25 (8-audit — foydalanuvchi: "footer qismi har doim joyida
   tursin, ya'ni sahifaning eng pastki qismida joylashsin... masalan
   ish o'rinlari bo'limini tanlasak footer ancha yuqoriga siljimoqda"):
   qisqa kontentli sahifalarda (masalan "Ish o'rinlari" — bor-yo'g'i bir
   necha qatorlik matn) footer sahifa balandligi ekrandan kichik bo'lgani
   uchun O'RTADA "muallaq" qolib qolardi, pastda esa bo'sh kulrang joy
   qolardi — xuddi footer "yuqoriga surilib qolgandek" tuyulardi.

   Standart "yopishqoq footer" (sticky footer) naqshi: `<body>`ning o'zi
   vertikal flex konteyner (`min-height:100vh`) qilinadi, sahifa kontenti
   (`.about`/`.jobs`/`.branches`/`.contact`/`.home`/menyu uchun `.site`)
   `flex:1 0 auto` bilan QOLGAN BARCHA bo'sh joyni egallaydi — natijada
   footer HAR DOIM kamida ekranning pastki chetida turadi (kontent qisqa
   bo'lsa bo'sh joy kontent bilan footer orasida emas, kontentning O'ZIDA
   "yutiladi"), kontent ekrandan uzun bo'lsa esa hammasi avvalgidek
   tabiiy oqimda pastga cho'ziladi.

   FAQAT mijoz sahifalarida kerak (yangi `body.client-shell` klassi,
   har bir shablonning `<body>` tegiga qo'shilgan) — boshqaruv/POS/oshxona
   panellari o'zining ALOHIDA `.app`/`.worker-shell` flex tuzilishiga ega,
   ularga tegilmaydi. Modal/dialog/skript kabi footer'dan KEYIN keladigan
   qo'shimcha `<body>` farzandlari (masalan menyu sahifasidagi buyurtma
   formasi/oynasi) yopiq holatda balandligi deyarli 0 bo'lgani uchun bu
   hisob-kitobga ta'sir qilmaydi. */
body.client-shell {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}
body.client-shell > .about,
body.client-shell > .jobs,
body.client-shell > .branches,
body.client-shell > .contact,
body.client-shell > .home,
body.client-shell > .site {
    flex: 1 0 auto;
}

/* --------------------------------------------------------------------------
   Sayt footer'i — beshqozon.uz'da har bir sahifada bor, FENO'da esa
   umuman yo'q edi (audit 2026-09-23, "osmon bilan yer" farqi). Faqat
   haqiqiy ma'lumot (haqiqiy sahifalar + tenant'ning o'z kontakt/ijtimoiy
   havolalari) ko'rsatiladi — soxta "to'lov/maxfiylik siyosati" havolalari
   YO'Q (ular FENO'da umuman mavjud emas).
   -------------------------------------------------------------------------- */
.site-footer {
    margin-top: var(--sp-9);
    border-top: 1px solid var(--border);
    background: var(--bg-surface);
}
.site-footer-inner {
    /* 4-audit: yuqoridagi `.about, .jobs, .branches, .contact` bilan bir
       xil (1440px) — footer sahifa tarkibi bilan doim bir xil kenglikda
       qolishi kerak. */
    max-width: 1440px;
    margin: 0 auto;
    /* 5-audit: "Kompaniya haqida" ustuni olib tashlangach footer endi
       ancha qisqa — tepadagi bo'shliq ham shunga moslab kamaytirildi
       (sp-8 → sp-7). */
    padding: var(--sp-7) var(--sp-4) var(--sp-6);
}
.site-footer-grid {
    display: grid;
    gap: var(--sp-6);
    /* 2026-09-24 (8-audit, uchinchi tur — foydalanuvchi: "oshxona nomi
       uzun bo'lsa nima bo'ladi?"): FENO — bu ko'p tenantli SaaS, demak
       restoran nomi HAR XIL uzunlikda bo'lishi mumkin. `1fr` grid
       ustunining "avtomatik" minimal kengligi ICHIDAGI KONTENTga qarab
       belgilanadi (CSS grid standarti) — agar nom bitta uzun so'z
       bo'lsa (bo'sh joysiz, masalan "SuperTaomxonaRestoraniMChJ"), shu
       "avtomatik minimum" butun ustunni (demak butun sahifani, mobil
       ekranda!) kengaytirib yuborishi mumkin edi — jonli tekshirilganda
       aynan shu holat tasdiqlandi (gorizontal skroll paydo bo'lardi).
       `minmax(0, 1fr)` bu "avtomatik minimum"ni NOLGA tushiradi — endi
       ustun konteyneridan HECH QACHON kengroq bo'lmaydi, matn esa
       pastdagi `.site-footer-brand-name`dagi qoida orqali ichkarida
       qatlanadi/uziladi. */
    grid-template-columns: minmax(0, 1fr);
}
@media (min-width: 768px) {
    /* 5-audit: 3 ustun (1.4fr 1fr 1fr) o'rniga endi FAQAT 2 ustun (brend +
       aloqa) — 1440px konteynerda ikkalasi ham keng bo'sh joy qolmasligi
       uchun taxminan teng kenglikda. */
    .site-footer-grid { grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr); max-width: 720px; }
}
.site-footer-col { min-width: 0; }
.site-footer-brand-row {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    margin-bottom: var(--sp-3);
}
.site-footer-brand-row img,
.site-footer-brand-row .brand-fallback {
    width: 32px; height: 32px;
    flex-shrink: 0;
    border-radius: var(--r-sm);
    object-fit: cover;
}
.site-footer-brand-name {
    font-weight: 600;
    font-size: var(--fs-lg);
    /* 2026-09-24 (8-audit, uchinchi tur): bu — flex qatordagi ELEMENT,
       standart holatda flex elementlar o'z KONTENTIdan (bu yerda —
       matnning eng uzun so'zi) TORROQ bo'la olmaydi (`min-width:auto`),
       shu sabab uzun bitta-so'zli nom qatordan "toshib" chiqib ketardi.
       `min-width: 0` shuni bekor qiladi, `overflow-wrap: break-word`
       esa juda uzun so'zning o'zini ham konteyner ichida MAJBURIY
       qatlaydi (agar bo'sh joy umuman bo'lmasa). */
    min-width: 0;
    overflow-wrap: break-word;
    word-break: break-word;
}
.site-footer-desc { color: var(--text-muted); font-size: var(--fs-sm); line-height: 1.6; }
.site-footer-col h3 {
    font-size: var(--fs-md);
    font-weight: 600;
    margin: 0 0 var(--sp-3);
}
.site-footer-col ul {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    gap: var(--sp-2);
}
.site-footer-col a {
    color: var(--text-muted);
    text-decoration: none;
    font-size: var(--fs-sm);
}
.site-footer-col a:hover { color: var(--brand-700); }
.site-footer-contact span { color: var(--text-muted); font-size: var(--fs-sm); }
/* 2026-09-24 (to'liq audit, 5-band — foydalanuvchi: "professional
   dizayner nazari bilan audit qil"): telefon/manzil/ijtimoiy tarmoq
   qatorlari ilgari faqat matn edi — hover'dagina (sichqon bilan)
   rang o'zgarardi, teginish (mobil) uchun esa hech qanday vizual
   belgi yo'q edi, oddiy matndan farqlanmasdi. Endi har bir qatorda
   ikonka bor (shablonda qo'shildi) — shu ikonka joylashuvi/o'lchami
   shu yerda belgilanadi, topbar ikonkalari bilan bir xil 16px'da
   (2-band, ikonka o'lcham tizimi). */
.site-footer-contact li {
    display: flex;
    align-items: flex-start;
    gap: var(--sp-2);
}
.site-footer-contact .icon {
    margin-top: 2px;
    flex-shrink: 0;
    font-size: 16px;
    color: var(--text-faint);
}
.site-footer-contact a .icon { color: var(--text-muted); }
.site-footer-contact a:hover .icon { color: var(--brand-700); }
/* 2026-09-27 (foydalanuvchi: "Nega instagram ikonkasi yozuvidan
   teparoqda joylashgan, telegramniki ham"): yuqoridagi `margin-top: 2px`
   FAQAT to'g'ridan-to'g'ri <li> ichidagi (masalan manzil qatoridagi, ko'p
   qatorli bo'lishi mumkin bo'lgan) ikonka uchun mo'ljallangan edi — o'sha
   holatda ikonka matnning BIRINCHI qatori bilan tekislanishi kerak,
   shuning uchun `align-items: flex-start` + qo'lda 2px nudge kerak edi.
   LEKIN bir qatorli havolalarda (telefon, Facebook, Instagram, Telegram
   — barchasi <a> ichida) bitta qattiq 2px qiymat har bir SVG'ning o'z
   24x24 katagi ichidagi "siyoh" taqsimotiga (shakl geometriyasiga) qarab
   TURLICHA natija berardi — jonli tekshiruvda telefon/Facebook'da deyarli
   sezilmasdi, lekin Instagram/Telegram'da matndan bir necha piksel
   yuqoriroq ko'rinardi. Tuzatish: endi <a> o'zi flex konteyner bo'lib,
   `align-items: center` bilan ICHIDAGI ikonka+matnni DOIM aniq markazga
   tekislaydi — bu SVG shaklidan mutlaqo mustaqil (chunki markazlash endi
   ikkalasining CSS box balandligiga asoslanadi, ikonkaning ichki
   "siyoh" markaziga emas). Shu sabab <a> ichidagi ikonkada yuqoridagi
   2px nudge BEKOR qilinadi (aks holda ikkalasi qo'shilib, yana pastga
   suzardi). Manzil qatorida (<a> YO'Q, span+span) hech narsa o'zgarmadi
   — u hamon `li`ning `align-items: flex-start` + shu 2px nudge orqali
   tekislanadi. */
.site-footer-contact a {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-2);
}
.site-footer-contact a .icon { margin-top: 0; }
/* Foydalanuvchi: "Shu ikonkalarga o'z rangini bersak qanday bo'ladi?" —
   Facebook/Instagram/Telegram endi bir xil kulrang o'rniga o'zining
   tanib olinadigan brend rangida chiqadi (Instagram uchun uning rasmiy
   ko'p rangli gradienti o'rniga bitta vakillik rangi ishlatildi — bu
   ikonka bitta rangli chiziq/stroke uslubida, gradientni to'g'ridan-
   to'g'ri qo'llab bo'lmaydi). Rang doim shu holda (hover'da ham
   o'zgarmaydi) — foydalanuvchi "o'z rangi" so'ragan, hover effekti
   emas. Selektor aynan `.site-footer-contact a .icon-*` shaklida
   yozildi (yuqoridagi `.site-footer-contact a .icon` bilan BIR XIL
   ustunlik darajasida), shunda manba tartibi (bu qoidalar pastroqda)
   g'alaba qozonadi. */
.site-footer-contact a .icon-facebook  { color: #1877f2; }
.site-footer-contact a .icon-instagram { color: #e4405f; }
.site-footer-contact a .icon-telegram  { color: #26a5e4; }
.site-footer-contact a:hover .icon-facebook  { color: #1877f2; }
.site-footer-contact a:hover .icon-instagram { color: #e4405f; }
.site-footer-contact a:hover .icon-telegram  { color: #26a5e4; }
.site-footer-bottom {
    margin-top: var(--sp-7);
    padding-top: var(--sp-4);
    border-top: 1px solid var(--border);
    color: var(--text-faint);
    font-size: var(--fs-xs);
    text-align: center;
}

/* --------------------------------------------------------------------------
   Menyu sahifasi — uch qismli joylashuv
   Keng ekran: chapda kategoriya ro'yxati · markazda taomlar · o'ngda savat
   Tor ekran:  bitta ustun · pastda savat tasmasi va pastdan chiqadigan varaq
   -------------------------------------------------------------------------- */

.menu-page .site { max-width: 1440px; padding-bottom: var(--sp-7); }

.menu-layout {
    display: grid;
    grid-template-columns: 200px minmax(0, 1fr) 320px;
    gap: var(--sp-6);
    align-items: start;
}

/* --- Chapdagi kategoriya ro'yxati --- */
.cat-rail { position: sticky; top: var(--sp-4); }
/* qidiruv natijasi bo'sh bo'lsa JS ro'yxat mazmunini yashiradi (ustunning
   o'zi joyida qoladi) — `display` yozilgani uchun [hidden] alohida kerak */
.cat-rail-inner[hidden] { display: none; }
.cat-rail-inner {
    display: flex;
    flex-direction: column;
    /* 6-audit ("kategoriyalar hozir bir-biriga judayam tiqilib qolgan,
       orasini ochish kerak"): 2px -> var(--sp-2) (8px) — `.cat-link`ning
       o'z padding'i ham kattalashtirilgani bilan birga (pastga qarang)
       ro'yxat ancha "nafas oladigan" ko'rinishga keldi. */
    gap: var(--sp-2);
    max-height: calc(100vh - var(--sp-8));
    overflow-y: auto;
    padding-right: var(--sp-1);
}
/* 6-audit ("Kategoriyalar tepasidagi menyu so'zi judayam kichik"): 11px
   kichik, katta harfli, xira rangli "yorliq"dan — 24px, qalin, oddiy
   matn rangidagi haqiqiy SARLAVHAGA aylantirildi. */
.cat-rail-title {
    padding: 0 var(--sp-3) var(--sp-3);
    font-size: var(--fs-2xl);
    font-weight: 700;
    color: var(--text);
}
.cat-link {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    /* 6-audit: yuqoridagi `.cat-rail-inner` gap'i bilan birga ko'proq
       vertikal bo'shliq uchun (avval `var(--sp-2) var(--sp-3)`).
       `justify-content: space-between` olib tashlandi — endi faqat
       nom bor, uni o'ng chetga "surib" turadigan hisob belgisi yo'q. */
    padding: var(--sp-3);
    border-radius: var(--r-md);
    color: var(--text-muted);
    font-size: var(--fs-sm);
    transition: background var(--t-fast), color var(--t-fast);
}
.cat-link:hover { background: var(--bg-subtle); color: var(--text); }
.cat-link.active { background: var(--brand-50); color: var(--brand-700); font-weight: 600; }
.cat-link.is-hidden { display: none; }
/* 6-audit ("har bir kategoriya qarshisida turgan raqamlar menga
   yoqmayapti"): `.cat-link-count` (taomlar soni belgisi) BUTUNLAY olib
   tashlandi — shablonda ham (`partials/menu_picker.html`) mos
   `<span class="cat-link-count">` o'chirildi, shu sabab bu yerda
   `.cat-link-count { ... }` / `.cat-link.active .cat-link-count { ... }`
   qoidalariga endi ehtiyoj yo'q. */

/* --- Qidiruv --- */
.menu-toolbar {
    position: sticky;
    top: 0;
    z-index: var(--z-nav);
    padding: var(--sp-3) 0;
    background: var(--bg-app);
}
.search-box { position: relative; display: flex; align-items: center; }
.search-box .search-icon {
    position: absolute;
    left: var(--sp-3);
    font-size: 17px;
    color: var(--text-faint);
    pointer-events: none;
}
.search-box input {
    height: 44px;
    padding-left: var(--sp-8);
    padding-right: var(--sp-8);
    border-radius: var(--r-full);
    font-size: var(--fs-md);
}
.search-box input::-webkit-search-cancel-button { display: none; }
.search-clear {
    position: absolute;
    right: var(--sp-2);
    width: 30px;
    height: 30px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 0;
    border-radius: 50%;
    background: var(--bg-subtle);
    color: var(--text-muted);
    cursor: pointer;
}
.search-clear:hover { background: var(--border); color: var(--text); }
/* `display` qiymati brauzerning o'z `[hidden]{display:none}` qoidasini bekor
   qiladi — shuning uchun yashirilishi kerak bo'lgan har bir element uchun
   [hidden] alohida yoziladi (aks holda tugma doim ko'rinib turadi). */
.search-clear[hidden] { display: none; }

/* --- Kategoriya tasmasi (tor ekran uchun) --- */
.menu-chips { display: none; }
.menu-chips .chip.active { background: var(--brand); border-color: var(--brand); color: var(--brand-on, #fff); }
.menu-chips .chip.is-hidden { display: none; }

/* --- Taomlar --- */
.menu-section { margin-bottom: var(--sp-7); scroll-margin-top: 76px; }
.menu-section[hidden] { display: none; }
.menu-section-title {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    font-size: var(--fs-lg);
    margin-bottom: var(--sp-4);
}
.menu-section-title::after {
    content: "";
    flex: 1;
    height: 1px;
    background: var(--border);
}

.dish-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
    gap: var(--sp-4);
}

.dish {
    position: relative;
    display: flex;
    flex-direction: column;
    background: var(--bg-surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    box-shadow: var(--sh-xs);
    overflow: hidden;
    cursor: pointer;
    transition: box-shadow var(--t-fast), border-color var(--t-fast), transform var(--t-fast);
}
.dish[hidden] { display: none; }
.dish:hover { box-shadow: var(--sh-md); transform: translateY(-2px); }
.dish:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.dish.in-cart { border-color: var(--brand); box-shadow: 0 0 0 1px var(--brand); }

.dish-photo {
    position: relative;
    aspect-ratio: 4 / 3;
    background: var(--bg-subtle);
    overflow: hidden;
}
.dish-photo img {
    width: 100%; height: 100%; object-fit: cover; display: block;
    opacity: 1;
    transition: opacity 260ms ease;
}
/* Rasm hali yuklanmoqda ("lazy") paytida — tekis kulrang quti o'rniga
   yumshoq "yaltirash" (shimmer) o'tadi (11/10 vizual sayqal, 3-bosqich,
   2026-09-26; boshqaruvchi JS: `menu_picker_js.html`). Rasm tayyor
   bo'lgach klass olib tashlanadi va u o'zi (opacity orqali) mayin
   paydo bo'ladi — shuning uchun boshlanishida ko'rinmas qilib
   qo'yiladi. */
.dish-photo.is-loading {
    background: linear-gradient(100deg, var(--bg-subtle) 30%, var(--n-200) 50%, var(--bg-subtle) 70%);
    background-size: 200% 100%;
    animation: dish-photo-shimmer 1.3s ease-in-out infinite;
}
.dish-photo.is-loading img { opacity: 0; }
@keyframes dish-photo-shimmer {
    0%   { background-position: 150% 0; }
    100% { background-position: -50% 0; }
}
.dish-photo-empty {
    width: 100%; height: 100%;
    display: flex; align-items: center; justify-content: center;
    background: var(--brand-50);
    color: var(--brand-700);
}
.dish-photo-empty .icon { font-size: 34px; opacity: .55; }

.dish-qty-badge {
    position: absolute;
    top: var(--sp-2);
    left: var(--sp-2);
    min-width: 26px;
    height: 26px;
    padding: 0 var(--sp-2);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--r-full);
    background: var(--brand);
    color: var(--brand-on, #fff);
    font-size: var(--fs-sm);
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    box-shadow: var(--sh-sm);
}
/* Savatda bu taom bo'lmaganida belgi ko'rinmasligi kerak */
.dish-qty-badge[hidden] { display: none; }
/* "Tugagan" belgisi butun rasmni qopqoq kabi qoplaydi — shu bilan birga
   rasmni xiralashtiradi ("scrim") VA yorlig'ning o'zi rasm MARKAZIDA
   chiqadi (audit 2026-09-24: avval kichkina, burchakdagi belgi
   "tugagan"ligini yetarlicha ko'rsatmasdi, karta esa umuman xira/o'lik
   ko'rinardi — pastdagi `.dish.is-out`ga qarang). `.dish-photo`ning
   o'zi `overflow: hidden`, shuning uchun bu qopqoq avtomatik ravishda
   rasm burchaklariga mos kesiladi.

   11/10 vizual sayqal (2026-09-26, 2-bosqich): tekis, bir xilda qora
   qopqoq (`rgba(15,15,15,.4)`) o'rniga yumshoq gradient (pastga qarab
   quyuqlashadi) — rasm yuqori qismi kamroq xiralashadi. Matnning o'zi
   endi butun kartani qoplaydigan yalang'och harflar emas, balki
   ixcham, aylana chekkali "pill" ichida (`.dish-out-pill`, pastda) —
   kichik "taqiq" ikonkasi bilan birga, brendlashtirilgan ko'rinish
   uchun. Kontrast (oq matn + qora fon) o'zgarmagan, shuning uchun
   ko'rinuvchanlik AVVALGIDEK yuqori qoladi. */
.dish-out-badge {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: linear-gradient(180deg, rgba(15, 15, 15, .14) 0%, rgba(15, 15, 15, .48) 55%, rgba(15, 15, 15, .56) 100%);
    box-shadow: none;
}
.dish-out-pill {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: var(--sp-2) var(--sp-3);
    border-radius: var(--r-full);
    background: rgba(15, 15, 15, .55);
    border: 1px solid rgba(255, 255, 255, .18);
    color: #fff;
    font-size: var(--fs-sm);
    font-weight: 700;
    letter-spacing: .01em;
    text-shadow: 0 1px 3px rgba(0, 0, 0, .4);
}
.dish-out-pill .icon { font-size: 14px; }

/* Tugagan taom — ko'rinadi, lekin tanlab bo'lmaydi. Ataylab ENDI karta
   butunlay xiralashtirilmaydi (oldingi `opacity: .55` taom nomi/narxini
   ham deyarli o'qib bo'lmas holga keltirar, karta "o'lik" ko'rinardi) —
   faqat rasm bir oz xiraroq va rangsizroq chiqadi (yuqoridagi qora
   qopqoq bilan birga), taom nomi va narxi esa to'liq o'qiladigan holda
   qoladi. */
.dish.is-out { cursor: default; }
.dish.is-out:hover { box-shadow: var(--sh-xs); transform: none; }
.dish.is-out .dish-photo img,
.dish.is-out .dish-photo-empty { filter: grayscale(.6) brightness(.82); }
.dish.is-out .dish-info { opacity: .7; }

/* Tugagan taom bosilganda — hech narsa ochilmasa ham, mijoz "bosildimi
   o'zi?" deb qolmasligi uchun kartaning o'zi va "Tugagan" belgisi bir
   zumga silkinadi/kattalashadi, e'tiborni allaqachon bor bo'lgan belgiga
   qaratadi (audit 2026-09-23: avval bosilganda mutlaqo hech narsa
   bo'lmasdi). JS shu klassni qo'shib, ~350ms'dan keyin olib tashlaydi
   (`partials/menu_picker_js.html`). `prefers-reduced-motion` uchun
   alohida yozish shart emas — 22-bo'limdagi umumiy qoida animatsiya
   davomiyligini avtomatik qisqartiradi. */
.dish.is-out.is-tapped { animation: dish-out-shake 350ms ease; }
.dish.is-out.is-tapped .dish-out-pill {
    animation: dish-out-badge-pulse 350ms ease;
}
@keyframes dish-out-shake {
    0%, 100% { transform: translateX(0); }
    25%      { transform: translateX(-4px); }
    75%      { transform: translateX(4px); }
}
@keyframes dish-out-badge-pulse {
    0%   { box-shadow: 0 0 0 0 var(--danger-bd); }
    50%  { box-shadow: 0 0 0 4px var(--danger-bd); }
    100% { box-shadow: 0 0 0 0 transparent; }
}

.dish-info {
    display: flex;
    flex-direction: column;
    flex: 1;
    padding: var(--sp-3) var(--sp-4) var(--sp-4);
}
.dish-name { font-size: var(--fs-base); font-weight: 600; margin-bottom: 2px; }
.dish-desc {
    font-size: var(--fs-xs);
    color: var(--text-muted);
    margin: 0 0 var(--sp-3);
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.dish-bottom {
    margin-top: auto;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-2);
    flex-wrap: wrap;
}
.dish-action { flex-shrink: 0; }
.dish-price {
    font-size: var(--fs-base);
    font-weight: 700;
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}
/* 11/10 vizual sayqal (2026-09-27, 4-bosqich — tipografiya): narx
   raqami va "so'm" birligi endi bitta xil og'irlikdagi matn emas —
   raqam katta/qalin qoladi, birlik esa kichikroq va xiraroq (ko'plab
   premium taom-yetkazish ilovalarida keng tarqalgan naqsh). `em`da
   yozilgan, shuning uchun har uch kontekstda ham (mijoz menyusi,
   POS/ofitsiant, admin) narxning o'ziga mutanosib qoladi — piksel
   qiymatga bog'lanmagan. `letter-spacing` ATAYLAB qo'yilmaydi —
   `font-variant-numeric: tabular-nums` bilan birga raqamlarga
   tegmaslik uchun (yuqoridagi qoidaga qarang). */
.dish-price .unit {
    font-size: .64em;
    font-weight: 600;
    opacity: .58;
    margin-left: 3px;
}

/* --- Qo'shish tugmasi va miqdor boshqaruvi --- */
.qty-add {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-1);
    height: 36px;
    padding: 0 var(--sp-3);
    border: 0;
    border-radius: var(--r-full);
    background: var(--brand);
    color: var(--brand-on, #fff);
    font: inherit;
    font-size: var(--fs-sm);
    font-weight: 500;
    cursor: pointer;
}
.qty-add:hover { background: var(--brand-700); }
.qty-add[hidden] { display: none; }

.qty-stepper {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    padding: 3px;
    border-radius: var(--r-full);
    background: var(--bg-subtle);
}
.qty-stepper[hidden] { display: none; }
.qty-stepper button {
    width: 30px; height: 30px;
    display: flex; align-items: center; justify-content: center;
    border: 0;
    border-radius: 50%;
    background: var(--brand);
    color: var(--brand-on, #fff);
    font: inherit;
    font-size: var(--fs-md);
    line-height: 1;
    cursor: pointer;
}
.qty-stepper button:hover { background: var(--brand-700); }
.qty-stepper .qty-value {
    min-width: 20px;
    text-align: center;
    font-size: var(--fs-sm);
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}
.qty-stepper.is-sm button { width: 26px; height: 26px; font-size: var(--fs-sm); }
.qty-stepper.is-lg button { width: 38px; height: 38px; font-size: var(--fs-lg); }
.qty-stepper.is-lg .qty-value { min-width: 28px; font-size: var(--fs-md); }

/* --- Savat: keng ekranda o'ng ustun --- */
.cart { position: sticky; top: var(--sp-4); }
.cart-inner {
    display: flex;
    flex-direction: column;
    max-height: calc(100vh - var(--sp-8));
    background: var(--bg-surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    box-shadow: var(--sh-sm);
    overflow: hidden;
}
.cart-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-2);
    padding: var(--sp-4);
    border-bottom: 1px solid var(--border);
}
.cart-head h2 {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    font-size: var(--fs-md);
}
.cart-close { display: none; }
.cart-body { flex: 1; overflow-y: auto; padding: var(--sp-3) var(--sp-4); }
.cart-lines { display: grid; gap: var(--sp-3); }
.cart-lines[hidden] { display: none; }
.cart-empty { border: 0; padding: var(--sp-6) var(--sp-2); }
.cart-empty[hidden] { display: none; }

.cart-line {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
}
.cart-line-main { flex: 1; min-width: 0; }
.cart-line-name {
    font-size: var(--fs-sm);
    font-weight: 500;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.cart-line-sum {
    font-size: var(--fs-xs);
    color: var(--text-muted);
    font-variant-numeric: tabular-nums;
}
.cart-line-remove {
    flex-shrink: 0;
    width: 26px; height: 26px;
    display: flex; align-items: center; justify-content: center;
    border: 0;
    border-radius: 50%;
    background: none;
    color: var(--text-faint);
    font-size: 18px;
    line-height: 1;
    cursor: pointer;
}
.cart-line-remove:hover { background: var(--danger-bg); color: var(--danger-fg); }

.cart-foot {
    padding: var(--sp-4);
    border-top: 1px solid var(--border);
    background: var(--bg-app);
}
.cart-total-row {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    margin-bottom: var(--sp-3);
    font-size: var(--fs-base);
    color: var(--text-muted);
}
.cart-total-row strong {
    font-size: var(--fs-lg);
    color: var(--text);
    font-variant-numeric: tabular-nums;
}

/* --- Telefondagi pastki savat tasmasi --- */
.cart-bar {
    display: none;
    position: fixed;
    left: 0; right: 0; bottom: 0;
    z-index: var(--z-bar);
    width: 100%;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-4);
    padding: var(--sp-3) var(--sp-5);
    padding-bottom: calc(var(--sp-3) + env(safe-area-inset-bottom));
    border: 0;
    background: var(--brand);
    color: var(--brand-on, #fff);
    font: inherit;
    font-size: var(--fs-base);
    cursor: pointer;
    box-shadow: var(--sh-lg);  /* audit Ki8 */
}
.cart-bar[hidden] { display: none; }
.cart-bar-left,
.cart-bar-right { display: flex; align-items: center; gap: var(--sp-2); }
.cart-bar strong { font-variant-numeric: tabular-nums; }

/* --- Oynalar (dialog) --- */
.modal {
    position: fixed;
    inset: 0;
    z-index: var(--z-drawer);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--sp-4);
}
.modal[hidden] { display: none; }
.modal-backdrop {
    position: absolute;
    inset: 0;
    background: rgba(16, 24, 40, .55);
    backdrop-filter: blur(2px);
}
.modal-box {
    position: relative;
    display: flex;
    flex-direction: column;
    width: 100%;
    max-width: 640px;
    max-height: calc(100vh - var(--sp-8));
    background: var(--bg-surface);
    border: 1px solid var(--border);
    border-radius: var(--r-xl);
    box-shadow: var(--sh-lg);
    overflow: hidden;
}
.modal-box.is-narrow { max-width: 560px; }
.modal-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-3);
    padding: var(--sp-4) var(--sp-5);
    border-bottom: 1px solid var(--border);
}
.modal-head h2 { font-size: var(--fs-md); }
.modal-body { flex: 1; overflow-y: auto; padding: var(--sp-5); }
.modal-foot {
    padding: var(--sp-4) var(--sp-5);
    border-top: 1px solid var(--border);
    background: var(--bg-app);
}

.checkout-summary {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--sp-3);
    padding: var(--sp-3) var(--sp-4);
    margin-bottom: var(--sp-5);
    border-radius: var(--r-md);
    background: var(--brand-50);
    color: var(--brand-700);
    font-size: var(--fs-sm);
}
.checkout-summary strong { font-size: var(--fs-md); font-variant-numeric: tabular-nums; }

.cart-warning {
    margin-top: var(--sp-3);
    color: var(--danger-fg);
    font-size: var(--fs-sm);
}
.cart-warning[hidden] { display: none; }

/* --- Taom oynasi --- */
.dish-modal-photo {
    margin: calc(var(--sp-5) * -1) calc(var(--sp-5) * -1) var(--sp-4);
    background: var(--bg-subtle);
}
.dish-modal-photo[hidden] { display: none; }
.dish-modal-photo img {
    display: block;
    width: 100%;
    max-height: 40vh;
    object-fit: cover;
    cursor: zoom-in;
}
.dish-modal-desc { color: var(--text-muted); font-size: var(--fs-base); }
.dish-modal-desc[hidden] { display: none; }
.dish-modal-price {
    margin-top: var(--sp-4);
    font-size: var(--fs-xl);
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}
.dish-modal-foot {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    flex-wrap: wrap;
}
.dish-modal-foot .btn { flex: 1; min-width: 180px; }

/* --- Rasmni kattalashtirish --- */
.lightbox {
    position: fixed;
    inset: 0;
    z-index: var(--z-drawer);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--sp-5);
    background: rgba(8, 11, 15, .92);
    cursor: zoom-out;
}
.lightbox[hidden] { display: none; }
.lightbox img {
    max-width: 100%;
    max-height: 100%;
    border-radius: var(--r-md);
}
.lightbox-close {
    position: absolute;
    top: var(--sp-4);
    right: var(--sp-4);
    width: 44px; height: 44px;
    display: flex; align-items: center; justify-content: center;
    border: 0;
    border-radius: 50%;
    background: rgba(255, 255, 255, .12);
    color: #fff;
    cursor: pointer;
}
.lightbox-close:hover { background: rgba(255, 255, 255, .22); }

/* Oyna ochiq turganda sahifa orqa fonda siljimasin */
body.no-scroll { overflow: hidden; }

/* Buyurtma kuzatuvi — vertikal timeline */
.timeline { display: grid; gap: 0; margin-top: var(--sp-4); }
.timeline-step {
    position: relative;
    display: flex;
    align-items: flex-start;
    gap: var(--sp-3);
    padding-bottom: var(--sp-4);
}
.timeline-step:last-child { padding-bottom: 0; }
.timeline-step::before {
    content: "";
    position: absolute;
    left: 9px;
    top: 22px;
    bottom: 0;
    width: 2px;
    background: var(--border);
}
.timeline-step:last-child::before { display: none; }
.timeline-dot {
    position: relative;
    z-index: 1;
    width: 20px; height: 20px;
    flex-shrink: 0;
    display: flex; align-items: center; justify-content: center;
    border-radius: 50%;
    background: var(--bg-surface);
    border: 2px solid var(--border-strong);
    color: transparent;
    font-size: 11px;
}
.timeline-label { font-size: var(--fs-sm); color: var(--text-faint); padding-top: 1px; }

.timeline-step.done .timeline-dot {
    background: var(--success-fg);
    border-color: var(--success-fg);
    color: var(--success-bg);
}
.timeline-step.done::before { background: var(--success-fg); }
.timeline-step.done .timeline-label { color: var(--text-muted); }

.timeline-step.current .timeline-dot {
    background: var(--brand);
    border-color: var(--brand);
    box-shadow: 0 0 0 4px var(--brand-100);
}
.timeline-step.current .timeline-label { color: var(--text); font-weight: 600; }

/* Natija (buyurtma qabul qilindi) sahifasi */
.result-card { max-width: 420px; text-align: center; }
.result-icon {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 64px; height: 64px;
    margin: 0 auto var(--sp-4);
    border-radius: 50%;
    background: var(--success-bg);
    color: var(--success-fg);
    font-size: 32px;
    /* Buyurtma qabul qilingani — kichik "muvaffaqiyat lahzasi" (11/10
       vizual sayqal, 3-bosqich, 2026-09-26): doira ozgina "sakrab"
       (overshoot) katta bo'ladi, atrofida ikkita halqa bir marta
       kengayib so'nadi, ichidagi belgi esa chizilib chiqadi (pastga
       qarang, `.success-check-path`). Hammasi ~700ms ichida, faqat
       BIR MARTA — davomida hech narsa takrorlanmaydi/miltillamaydi.
       `prefers-reduced-motion` uchun alohida yozish shart emas —
       23-bo'limdagi umumiy qoida hammasini avtomatik qisqartiradi. */
    animation: success-pop 420ms cubic-bezier(.22, 1.4, .36, 1);
}
.result-icon::before,
.result-icon::after {
    content: "";
    position: absolute;
    inset: 0;
    border-radius: 50%;
    border: 2px solid var(--success-fg);
    opacity: 0;
}
.result-icon::before { animation: success-ring 750ms ease-out 60ms; }
.result-icon::after  { animation: success-ring 750ms ease-out 220ms; }
.success-check-path {
    stroke-dasharray: 1;
    stroke-dashoffset: 1;
    animation: success-draw 320ms ease-out 300ms forwards;
}
@keyframes success-pop {
    0%   { transform: scale(0); opacity: 0; }
    65%  { transform: scale(1.1); opacity: 1; }
    100% { transform: scale(1); }
}
@keyframes success-ring {
    0%   { opacity: .5; transform: scale(1); }
    100% { opacity: 0; transform: scale(1.7); }
}
@keyframes success-draw {
    to { stroke-dashoffset: 0; }
}

/* ==========================================================================
   20b. MIJOZ SAHIFASI — PREMIUM KO'RINISH (2026-09-23)
   --------------------------------------------------------------------------
   Faqat `body.client-menu` uchun (templates/client/order.html) — bu sahifa
   xuddi ofitsiant paneli (`body.pos-picker`, 25-bo'limga qarang) kabi
   yuqoridagi 20-bo'limdagi UMUMIY `.dish`/`.cart`/`.modal` va h.k.
   klasslarini ishlatadi, shuning uchun bu yerdagi HAR BIR qoida
   `body.client-menu` bilan boshlanadi: shunda ofitsiant paneli o'zgarmay
   qoladi (u '.client-menu' klassiga ega emas).

   DIQQAT (specificity): `body.client-menu .dish` kabi ikkita-klass
   selektor, yuqoridagi bazaviy bitta-klass selektorlardan (`.dish.in-cart`,
   `.dish.is-out:hover`) KUCHLIROQ. Shu sababli, agar shu yerda bazaviy
   xususiyat (masalan `.dish`ning box-shadow'i) qayta yozilsa-yu, o'sha
   holat qoidasi bu yerda QAYTA YOZILMASA — masalan "savatdagi taom"
   belgisi (`.in-cart`) yoki "tugagan taom hover'da ko'tarilmasin"
   (`.is-out:hover`) — o'sha holat "yutqazib qoladi" va yo'qolib qoladi.
   Shu sababli pastda ular ataylab qayta ko'rsatilgan.
   ========================================================================== */

/* --- Fon: sarlavha ortida juda mayin brend rangidagi nur --- */
body.client-menu {
    background:
        radial-gradient(1100px 420px at 50% -160px, var(--brand-50), transparent 65%),
        var(--bg-app);
}

/* Audit 2026-09-24 (9-audit — foydalanuvchi skrinshoti: "header bilan
   qidiruv orasida tirqish bor, mobil va desktopda ham"): bazaviy
   `.site-header { margin-bottom: var(--sp-5) }` (yuqorida, "20" bo'limi)
   BOSHQA sahifalar uchun to'g'ri — u yerda header ostida oddiy sahifa
   matni keladi, orasida bo'shliq kerak. Lekin bu sahifada header ostida
   DARHOL yana bir sticky qatlam (`.menu-toolbar`) keladi va ular header
   BALANDLIGIGA aniq mos `top` qiymati bilan "bir-biriga yopishishi"
   kerak (yuqoridagi katta izohga qarang: 71px/73px hisob-kitobi) — shu
   20px margin ana shu hisobni buzib, ikkalasi orasida bo'sh chiziq
   (foydalanuvchi "tirqish" deb atagan) hosil qilardi. Bu yerda ataylab
   0'ga qaytariladi — boshqa sahifalarga tegmaydi (ular `.client-menu`
   klassiga ega emas).
   */
body.client-menu .site-header { margin-bottom: 0; }

/* --- Sarlavha --- */
/* 2026-09-23 (4-audit — foydalanuvchi: "topbar surilib ketyapti-ku,
   menyu bo'limi tanlansa kengayadi, boshqa bo'lim tanlansa torayadi"):
   ilgari `.menu-page .site` (pastda, "21b" bo'limi) 1440px, boshqa
   sahifalar 960px edi — shu farq sabab topbar kengligi sahifadan-
   sahifaga o'zgarardi. Birinchi urinishda Menyu'ning topbar'i 960px'ga
   TORAYTIRILGAN edi — foydalanuvchi buni yoqtirmadi, aksincha: boshqa
   sahifalar Menyu'ning kengroq (1440px) o'lchamiga moslashishi kerak
   ekan (yuqoridagi "20" bo'limidagi `.about, .jobs, .branches,
   .contact` va `.site-footer-inner` endi 1440px). Shu sabab bu yerda
   ortiqcha `max-width` cheklovi olib tashlandi — topbar endi
   `.site`ning o'zi (1440px) kabi tabiiy kengayadi, boshqa sahifalar
   bilan bir xil. */
/* 2026-09-25 (7-audit — foydalanuvchi: "Menyu bo'limini tanlasak logo
   kichraymoqda va bosh bo'limni tanlasak ozgina kattalashmoqda, bu esa
   yaxshi emas, topbar va footer o'zgarmas bo'lishi kerak"): shu yergacha
   Menyu sahifasining topbari boshqa sahifalardan ATAYLAB "premium"
   (kattaroq) qilib farqlantirilgan edi — logotip 56px (boshqa
   sahifalarda 46px), pastki gradient chiziq, kattaroq h1 shrifti,
   ko'proq pastki padding. Foydalanuvchi buni endi yoqtirmadi: sahifadan
   sahifaga o'tganda topbar "sakrab" ko'rinar edi. Shu sabab bu yerdagi
   BARCHA maxsus qoidalar OLIB TASHLANDI — Menyu sahifasi endi bazaviy
   `.site-header` qoidasiga (yuqorida, "20" bo'limi) to'liq bo'ysunadi,
   xuddi about/jobs/branches/contact/home kabi. (h1'ning o'zi endi
   umuman ko'rinmaydi — 7-auditning 3-bandiga qarang, yuqoridagi
   bazaviy `.site-header h1 { display: none; }`.)

   2026-09-24 (8-audit — foydalanuvchi: "Baribir menu bo'limini tanlasak
   mobilda logo siljib ketmoqda, shu umuman siljimasin"): yuqoridagi
   7-auditda `position: relative` (sticky EMAS) ataylab qoldirilgan edi —
   sabab TEXNIK: `.menu-toolbar` (qidiruv) va tor ekranda `.menu-chips`
   ham `position:sticky` ishlatadi, va agar `.site-header` HAM bazaviy
   `top:0`ni olsa, ikkalasi BIR XIL `top:0`da to'qnashardi (CSS sticky
   elementlar bir-birini avtomatik pastma-past joylashtirmaydi). Lekin bu
   "kompromis" foydalanuvchi uchun YETARLI emas ekan — u BOSHQA
   sahifalardagi kabi logotip HECH QACHON siljimasligini xohlaydi (ya'ni
   `.site-header`ning o'zi HAM sticky bo'lishi kerak, xuddi about/jobs/
   home kabi). Yechim — to'qnashuvni CHINDAN HAL qilish: `.site-header`
   endi bazaviy `position:sticky; top:0`ni oladi (bu yerda maxsus qoida
   YO'Q), `.menu-toolbar`/`.menu-chips`ga esa header balandligiga mos
   ANIQ `top` qiymati beriladi (pastga, tegishli qoidalarga qarang) —
   shunda ular header OSTIGA "qatlanib" yopishadi, USTIGA emas.

   Header balandligi jonli o'lchandi (brauzerda `getBoundingClientRect`):
   71px >640px kengliqda (logo yagona qatorda), 73px <=640px'da (48px
   gamburger tugmasi 46px logotipdan baland). `.menu-toolbar`ning o'zi
   72px baland (ikkala oraliqda ham bir xil). */
/* 2026-09-24 audit: bu yerda ilgari topbar havolalari "pill" (dumaloq
   chegarali belgi) qilib ko'rsatilardi — bu XATO taxminga asoslangan edi.
   beshqozon.uz'ning haqiqiy topbari (jonli o'lchandi, quyidagi asosiy
   `.topnav-links` qoidasiga qarang) hech qanday pill/fon/chegara
   ishlatmaydi — oddiy matn, faqat faol bo'lim `font-weight` bilan
   ajratiladi. Shu sabab bu yerda menyu sahifasi uchun alohida uslub
   ENDI YO'Q — `.topnav-links` bazaviy qoidasi barcha sahifalarda bir xil
   ishlaydi (beshqozon'da ham topbar barcha sahifada bir xil ko'rinadi). */

/* 2026-09-24 (8-audit): `.site-header` endi sticky bo'lgani uchun
   `.menu-toolbar` (qidiruv, o'zi ham sticky — yuqorida, "21" bo'limi)
   endi `top:0`da emas, header OSTIDA yopishishi kerak — aks holda
   ikkalasi bir-birining ustiga tushib qolardi. `top` qiymati header
   balandligiga teng (71px >640px'da, 73px <=640px'da — pastdagi
   media-qoidaga qarang). Bu qoida FAQAT `body.client-menu`ga tegishli —
   boshqa sahifalarda `.menu-toolbar` umuman ishlatilmaydi.

   2026-09-26 (9-audit, 2-marta — foydalanuvchi qurilmasida "tirqish"
   hamon ko'rinardi, garchi bu yerdagi son header balandligiga aniq mos
   qilib o'lchangan bo'lsa ham): jonli o'lchov brauzerda header
   balandligini 72.667px kabi KASR piksel qilib berdi (shrift
   renderlash brauzer/qurilmadan-qurilmaga bir necha o'ndan bir piksel
   farq qilishi mumkin) — "73px" esa BUTUN son, ya'ni ba'zi qurilmalarda
   header bilan tasma orasida O'RTA HISOBDA <1px, lekin ko'rinadigan
   tirqish qolib ketishi mumkin edi. Endi ataylab 1px KAM qiymat
   qo'llanadi — bu ikkalasini bir-biriga 1px CHOYSHAB kabi ustma-ust
   qo'yadi (ikkalasi ham xiralik/shaffoflik'siz, bir xil fon rangida —
   `var(--bg-app)` — bo'lgani uchun bu ustma-ust tushish umuman
   ko'rinmaydi), shu bilan piksel aniqligiga qat'iy bog'liq bo'lmagan,
   HAR QANDAY qurilmada ishlaydigan yechim beradi. */
/* 2026-09-24 (audit, O6): quyidagi qat'iy piksel qiymatlar endi faqat
   ZAXIRA (JS ishlamasa). Asosiy qiymatlar `--menu-toolbar-top`,
   `--menu-chips-top`, `--menu-scroll-margin` — ularni `client/order.html`
   dagi kichik skript header/qidiruv/tasmaning HAQIQIY balandligidan
   hisoblaydi (ResizeObserver). Shu tufayli header qaysidir sababga ko'ra
   (uzun restoran nomi, boshqa til, shrift) balandlashsa ham qatlamlar bir-
   birini yopmaydi va orasida tirqish qolmaydi. */
body.client-menu .menu-toolbar { top: var(--menu-toolbar-top, 70px); }
@media (max-width: 900px) {
    body.client-menu .menu-toolbar { top: var(--menu-toolbar-top, 72px); }
}

/* --- Kategoriya navigatsiyasi (audit 2026-09-24, beshqozon.uz'ning
   HAQIQIY ish stoli ko'rinishi jonli tekshirildi): beshqozon.uz KENG
   ekranda chapdagi DOIMIY ro'yxatni (bizdagi `.cat-rail`) ishlatar ekan,
   gorizontal tasmani EMAS — avvalgi taxmin ("hamma o'lchamda gorizontal
   tasma") noto'g'ri bo'lib chiqdi. Shuning uchun client-menu endi
   BOSHQA sahifalar bilan BIR XIL umumiy naqshga ergashadi: keng ekranda
   `.cat-rail` (u umumiy `.menu-layout`da standart ustun sifatida
   allaqachon bor — bu yerda alohida hech narsa kerak emas), tor ekranda
   (21-bo'limdagi `@media (max-width: 1100px)` qoidasi) esa gorizontal
   `.menu-chips`. JS'ga tegilmaydi — `markActive()` allaqachon
   `[data-cat-link]` orqali ham rail, ham chip'larni bab-baravar
   boshqaradi. --- */
/* 2026-09-24 (8-audit): >1100px'da chip tasmasi ko'rinmaydi — faqat
   header (71px) + qidiruv (72px) sticky bo'lib qoladi, shu sabab
   bazaviy (umumiy, pastga qarang) 76px endi yetarli emas: 71+72+4
   (bufer) = 147px. */
body.client-menu .menu-section { scroll-margin-top: var(--menu-scroll-margin, 147px); }
@media (max-width: 1100px) {
    body.client-menu .menu-chips {
        /* 2026-09-24 (8-audit): endi `.site-header` HAM sticky bo'lgani
           uchun bu yerdagi `top` header + qidiruv IKKALASINING
           balandligini hisobga olishi kerak: 71px (header, >640px) +
           72px (qidiruv) = 143px. <=640px uchun aniqroq qiymat (145px)
           pastdagi alohida media-qoidada.
           2026-09-26 (9-audit, 2-marta): yuqoridagi `.menu-toolbar`
           qatoridagi kabi, 1px kamroq qiymat — tasma qidiruv panelining
           pastki chetiga 1px ustma-ust tushadi (ikkalasi ham bir xil
           `var(--bg-app)` foni, shu sabab ko'rinmaydi), sub-piksel
           tirqishga qarshi. */
        top: var(--menu-chips-top, 141px);
        padding: var(--sp-2) 0 var(--sp-4);
    }
    /* Tasma ustma-ust turgani uchun, bo'limga sakrab o'tishda (chip
       bosilganda) sarlavha tasma ostida yashirinib qolmasin. 2026-09-24
       (8-audit): endi header ham hisobga olinadi — 71 (header) + 72
       (qidiruv) + 52 (tasma) + 4 (bufer) = 199px. <=640px uchun aniqroq
       qiymat (201px) pastdagi alohida media-qoidada. */
    body.client-menu .menu-section { scroll-margin-top: var(--menu-scroll-margin, 199px); }
}
@media (max-width: 900px) {
    body.client-menu .menu-chips { top: var(--menu-chips-top, 143px); }
    body.client-menu .menu-section { scroll-margin-top: var(--menu-scroll-margin, 201px); }
}
body.client-menu .menu-chips .chip-row { gap: var(--sp-6); }
body.client-menu .menu-chips .chip {
    height: auto;
    padding: var(--sp-2) 0;
    border: 0;
    border-bottom: 2px solid transparent;
    border-radius: 0;
    background: transparent;
    color: var(--text-muted);
    /* 6-audit ("mobil uchun gorizontal joylashgan kategoriyalar shriftini
       kattaroq qilaylik"): fs-base (14px) -> fs-lg (17px) — fs-md (15px)
       ko'zga sezilarli farq uchun yetarli emas edi. */
    font-size: var(--fs-lg);
    transition: color var(--t-fast), border-color var(--t-fast);
}
body.client-menu .menu-chips .chip:hover { color: var(--text); }
body.client-menu .menu-chips .chip.active {
    background: transparent;
    color: var(--text);
    font-weight: 700;
    border-bottom-color: var(--brand);
}

/* --- Qidiruv maydoni --- */
body.client-menu .search-box input {
    height: 48px;
    border-color: var(--border);
    box-shadow: var(--sh-xs);
}
body.client-menu .search-box input:focus-visible {
    border-color: var(--brand);
    box-shadow: 0 0 0 3px var(--brand-100);
}

/* Audit 2026-09-23 (jonli qayta tekshiruv, beshqozon.uz): haqiqiy
   sayt sarlavhasi CHAPGA tekislangan, kattaroq va HECH QANDAY bezak
   chizig'isiz ekan — bu yerdagi avvalgi "markazda, ikki tomondan
   chiziq" varianti eskirgan taxmin bo'lib chiqdi, endi tuzatildi. */
body.client-menu .menu-section-title {
    justify-content: flex-start;
    font-size: var(--fs-3xl);
    font-weight: 700;
    /* 11/10 vizual sayqal (2026-09-27, 4-bosqich — tipografiya): bazaviy
       `h1..h4` qoidasi -0.01em beradi — katta (30px) va qalin (700)
       sarlavha uchun buni ataylab kuchaytirdik. Bu FAQAT harflar
       orasidagi masofaga tegadi, balandlik/qator sonini o'zgartirmaydi
       — shuning uchun yuqoridagi (audit 2026-09-24) "harf kesilishi"
       tuzatishlariga (line-height/padding-top) hech qanday ta'sir
       qilmaydi. */
    letter-spacing: -0.02em;
    /* Audit 2026-09-24: ba'zi brauzer/shrift birikmalarida (masalan
       Opera, Windows) global `h1..h4 { line-height: 1.25 }` bu yerdagi
       30px + 700 og'irlik bilan birga harflarning (ayniqsa "O" kabi
       dumaloq harflarning) tepasini "kesilgandek" chizib qo'yishi
       aniqlandi — CSS jihatidan hech narsa haqiqatda kesib
       tashlamayotgan bo'lsa ham (overflow hamma joyda `visible`),
       bu muammo real edi. Shuning uchun bu yerga ataylab kengroq,
       xavfsiz bufer beriladi — sabab aniq bo'lmasa ham, natija
       barqaror tuzaladi. */
    line-height: 1.45;
    padding-top: 2px;
}
body.client-menu .menu-section-title::before,
body.client-menu .menu-section-title::after {
    display: none;
}
/* Audit 2026-09-24 (9-audit — foydalanuvchi skrinshoti, mobil:
   "Issiq ichimliklar" sarlavhasining katta shrifti kesilib qolyapti):
   xuddi shu turdagi "harf tepasi kesilgandek" muammo yuqoridagi bazaviy
   qoidada DESKTOP uchun (line-height 1.45 + padding-top 2px) tuzatilgan
   edi. Mobil kenglikda xuddi shu shrift (fs-3xl, 700 og'irlik) hamon
   yetarlicha katta bo'lgani uchun muammo saqlanib qolgan — shu sabab
   bu yerda MOBIL uchun ataylab yanada kengroq bufer beriladi.
   DIQQAT — JOYLASHUV MUHIM: bu qoida ATAYLAB shu yerga, bazaviy
   qoidadan KEYIN qo'yilgan (avval yuqoridagi "kategoriya navigatsiyasi"
   bo'limidagi boshqa media-qoida ichida edi — o'sha bazaviy qoidadan
   OLDIN kelgani uchun, teng specificity'da manba tartibida YUTQAZIB,
   hech qanday ta'sir qilmasdi; jonli tekshiruvda aniqlandi). */
@media (max-width: 640px) {
    body.client-menu .menu-section-title { line-height: 1.7; padding-top: 6px; }
}

/* --- Taom kartalari: rasm markazda, "+" tugmasi rasm burchagiga suzib
   chiqadi (2026-09-23, beshqozon.uz namunasi) --- */
body.client-menu .dish {
    border: 0;
    border-radius: var(--r-xl);
    box-shadow: none;
    background: transparent;
    transition: box-shadow var(--t-fast), transform var(--t-fast);
}
body.client-menu .dish:hover {
    box-shadow: var(--sh-lg);
    transform: translateY(-3px);
}
/* Holat klasslari — izohga qarang: shu yerda ataylab qayta yozilgan */
body.client-menu .dish.in-cart {
    box-shadow: 0 0 0 1.5px var(--brand);
}
body.client-menu .dish.is-out:hover {
    box-shadow: none;
    transform: none;
}
/* Audit 2026-09-23 (jonli qayta tekshiruv): beshqozon.uz'da rasm
   ANIQ kvadrat (1:1) — avvalgi 5:4 taxminiy qiymat edi. */
body.client-menu .dish-photo {
    aspect-ratio: 1 / 1;
    border-radius: var(--r-xl);
}
body.client-menu .dish-photo img {
    transition: transform 420ms cubic-bezier(.2, .8, .2, 1);
}
body.client-menu .dish:hover .dish-photo img { transform: scale(1.05); }
body.client-menu .dish.is-out:hover .dish-photo img { transform: none; }

/* Tavsif kartada ko'rsatilmaydi (beshqozon.uz'da ham shunday) — u taom
   oynasida (`#dish-modal`) to'liq ko'rinadi, bosilganda ochiladi. */
body.client-menu .dish-desc { display: none; }

/* Narx va nom: DIQQAT — `line-height` ATAYLAB piksellarda (foizda yoki
   "normal" emas) yozilgan. Sabab: har bir restoran o'z shriftini
   (`--brand-font`) tanlaydi, shrift har xil bo'lsa "normal" line-height
   ham har xil balandlik beradi. Pastdagi "+" tugmasi esa shu blokning
   ANIQ balandligiga (70px) qarab joylashtirilgan (pastga qarang) —
   agar balandlik shriftga qarab suzib tursa, tugma na rasmga, na matnga
   to'g'ri kelmay qolardi. */
body.client-menu .dish-info {
    display: flex;
    flex-direction: column;
    padding: 12px var(--sp-4) 16px;
}
body.client-menu .dish-bottom {
    display: block;
    margin-top: 0;
    order: 1;
}
body.client-menu .dish-price {
    display: block;
    color: var(--text);
    font-size: var(--fs-lg);
    line-height: 22px;
    font-weight: 700;
}
/* Audit 2026-09-23: taom nomi `--text-muted`da (ikkinchi darajali)
   turgani mijozga "narx asosiy, taom nomi qo'shimcha" deb o'qilardi —
   holbuki mijoz avval NOMga qaraydi. Narxni birinchi qatorda qoldirdik
   (beshqozon.uz namunasidagi joylashuv ataylab tanlangan, yuqoridagi
   izohga qarang) — faqat rangini asosiy matn ranggiga ko'tardik, shunda
   ikkalasi ham to'liq o'qiladigan, teng vizual og'irlikda bo'ladi. */
body.client-menu .dish-name {
    order: 2;
    margin-top: 2px;
    margin-bottom: 0;
    color: var(--text);
    font-size: var(--fs-sm);
    line-height: 18px;
    /* 11/10 vizual sayqal (2026-09-27, 4-bosqich): 600 -> 700. DIQQAT:
       faqat `font-weight` o'zgardi — `font-size`/`line-height` ATAYLAB
       piksellarda va o'zgarishsiz qoldirildi, chunki yuqoridagi
       "+" tugmasi (`.dish-action`, pastda) shu blokning ANIQ 70px
       balandligiga (12+22+2+18+16) qarab joylashtirilgan; og'irlik
       o'zgarishi bu hisobga ta'sir qilmaydi. Narx (`.dish-price`)
       allaqachon 700 edi — endi ikkalasi yana teng vizual og'irlikda,
       faqat umuman qalinroq/ishonchliroq ko'rinadi (audit 2026-09-23'da
       "teng vizual og'irlik" qarori saqlanadi). */
    font-weight: 700;
}
/* "+" tugmasi/miqdor boshqaruvi — rasm va matn chegarasiga suzib chiqadi.
   `.dish-info` balandligi yuqoridagi qoidalar bilan aniq 70px (12+22+2+18+16)
   qilib belgilangan, tugma balandligi esa 36px — shuning uchun
   `bottom: 52px` uni aynan shu chegara ustiga (yarmi rasmda, yarmi
   matn blokida) markazlaydi, karta kengligidan qat'i nazar (chunki bu
   qiymatlar rasm eniga emas, faqat shu blok balandligiga bog'liq). */
body.client-menu .dish-action {
    position: absolute;
    right: var(--sp-3);
    bottom: 52px;
    z-index: 2;
}
/* 2026-09-27 (foydalanuvchi jonli xato: "'-' belgisi taom summasini
   to'sib qo'ymoqda, ya'ni oxirgi raqamning ustiga tegib qolmoqda"):
   yuqoridagi `bottom: 52px` "+" tugmasi hali 30px bo'lgan davrda
   hisoblangan edi. Keyinroq (shu faylda yuqorida, "+ bossak keyin
   bitta kichik - va + paydo bo'lib qolmoqda" tuzatishida) stepper
   30px -> 38px balandlikka o'sdi. `.dish-action` FAB naqshida
   `bottom` uning PASTKI chetini belgilaydi — balandlik o'sishi
   faqat YUQORI chetini narxga tomon suradi, shuning uchun stepper
   endi narx qatorining ustiga ~8px kirib borardi (jonli o'lchovda
   tasdiqlandi: 52px'da clearance = -8.67px). Jonli DOM'da bir nechta
   qiymat sinovdan o'tkazildi (getBoundingClientRect orqali aniq
   o'lchov): 60px hali ham -0.67px qoplanish beradi, 61px atigi
   +0.33px, shuning uchun kichik xavfsizlik zaxirasi bilan 63px
   tanlandi (+2.33px aniq bo'shliq — ortiqcha katta emas, vizual
   jihatdan rasm/matn chegarasiga hamon yaqin turadi). */
body.client-menu .dish-action { bottom: 63px; }
/* 2026-09-24 (to'liq audit, 3-band — foydalanuvchi: "professional
   dizayner nazari bilan audit qil"): pastdagi umumiy "Tor ekranda taom
   kartasi..." qoidasi (560px, quyida) `.dish-action { width: 100% }`
   deb belgilaydi — bu ESKI, ushbu `position:absolute` FAB naqshidan
   OLDINGI joylashuv uchun yozilgan edi (narx+tugma bir qatorga sig'may
   qolganda tugmani butun kenglikka cho'zish uchun). Lekin selektor
   umumiy bo'lgani sabab bu qoida shu (yangi, suzuvchi) kontekstga ham
   "sizib kirgan" — `width:100%` + faqat `right` berilgani sabab brauzer
   `left`ni AVTOMATIK -12px qilib hisoblab chiqargan, natijada "+"
   tugmasi desktopda rasmning O'NG pastki burchagida, mobilda esa CHAP
   pastki burchagida chiqib qolgan edi (jonli o'lchovda ikkala holat ham
   tasdiqlandi — tasodifiy emas, har bir kartada izchil). Xuddi shu
   muammo `body.pos-picker` uchun pastda (26-bo'lim) allaqachon
   `width: auto` bilan tuzatilgan edi — shu yerda ham AYNAN o'sha naqsh
   qo'llanildi, natijada tugma endi BARCHA ekran o'lchamlarida rasmning
   O'NG pastki burchagida, izchil turadi. */
body.client-menu .dish-action { width: auto; }
/* 2026-09-27 (foydalanuvchi jonli xato: "+ bossak keyin bitta kichik
   - va + paydo bo'lib qolmoqda"): sabab — "+" tugmasi (`.qty-add`,
   yuqorida) 44px doira, lekin bosilgach o'rnini bosuvchi `.qty-stepper`
   bazaviy (umumiy, admin/POS bilan baham ko'rilgan) o'lchamda — atigi
   30px tugmalar — qoladi. Natijada foydalanuvchi ko'zida tugma
   "kichrayib qolgandek" ko'rinadi. Mijoz menyusida (faqat shu yerda —
   admin/POS panelida bu muammo yo'q, ular umuman boshqa joylashuvda)
   stepper endi kodda ALLAQACHON bor `is-lg` shkalasiga (38px) mos
   kattalashtirildi — hamon 44px'dan biroz kichik (ikkita tugma + son
   bitta doirachaga sig'ishi kerak), lekin 30px'dan ancha yaqinroq,
   "kichrayish" taassuroti his qilinmaydigan darajada. */
body.client-menu .qty-stepper button { width: 38px; height: 38px; font-size: var(--fs-lg); }
body.client-menu .qty-stepper .qty-value { min-width: 26px; font-size: var(--fs-md); }

/* "Savatga qo'shildi" — belgi birinchi marta chiqqanda mayin animatsiya.
   JS faqat qiymat 0'dan oshganda `hidden`ni olib tashlaydi (renderDish),
   shuning uchun animatsiya har bir +1 bosilganda emas, faqat taom
   savatga YANGI qo'shilganda ishga tushadi. */
body.client-menu .dish-qty-badge:not([hidden]) {
    animation: client-menu-pop 320ms cubic-bezier(.34, 1.56, .64, 1);
}
@keyframes client-menu-pop {
    0%   { transform: scale(0); }
    70%  { transform: scale(1.15); }
    100% { transform: scale(1); }
}

/* Audit 2026-09-23 (jonli qayta tekshiruv): beshqozon.uz'da "+"
   tugmasi brend rangida YO'Q — u oq, faqat belgidan iborat doira,
   soyasi bilan rasmga suzib chiqadi. Naqsh POS panelida (26-bo'lim,
   `body.pos-picker .qty-add`) allaqachon sinalgan — shu yerda AYNAN
   o'sha texnika (`font-size:0` + ichidagi `.icon`ga alohida o'lcham)
   qayta ishlatiladi; matn DOM'da qoladi, ekran o'quvchi baribir
   o'qiydi.

   2026-09-24 (9-audit — foydalanuvchi: "+ belgisi rangini
   yaxshilaylik"): yuqoridagi neytral (`--bg-surface`/`--text`) variant
   QORONG'U rejimda muammoli chiqdi — doira ham, soyasi ham to'q rangda
   (qorong'u temadagi soya deyarli ko'rinmas, `--sh-md`ga qarang), shu
   sabab tugma to'q rangli taom suratlari ustida deyarli yo'qolib
   qolardi. Endi brend rangi ishlatiladi (`--brand`/`--brand-on`, tenant
   o'zi tanlagan rang — saytning boshqa joylarida, masalan savat
   belgisida, allaqachon shunday) — bu HAR doim, har qanday rasm fonida
   va ikkala temada ham izchil, yaxshi kontrastli chiqadi. */
body.client-menu .qty-add {
    width: 44px;
    height: 44px;
    padding: 0;
    justify-content: center;
    border-radius: 50%;
    font-size: 0;
    background: var(--brand);
    color: var(--brand-on, #fff);
    box-shadow: var(--sh-md);
}
body.client-menu .qty-add .icon { font-size: 20px; }
body.client-menu .qty-add:hover {
    background: var(--brand-700);
    box-shadow: var(--sh-lg);
    transform: translateY(-1px);
}

/* --- Savat --- */
body.client-menu .cart-inner { border-radius: var(--r-xl); box-shadow: var(--sh-md); }
body.client-menu .cart-head { padding: var(--sp-5); }
body.client-menu .cart-head h2 { font-size: var(--fs-lg); font-weight: 700; }
body.client-menu .cart-foot { background: var(--brand-50); }
body.client-menu .cart-total-row strong { color: var(--brand-700); font-size: var(--fs-xl); }

/* --- Telefonda pastki savat tasmasi: chetga yopishgan tasma o'rniga
   suzuvchi (floating) tugma --- */
@media (max-width: 900px) {
    body.client-menu .cart-bar {
        left: var(--sp-3);
        right: var(--sp-3);
        bottom: calc(var(--sp-3) + env(safe-area-inset-bottom));
        padding-bottom: var(--sp-3);
        border-radius: var(--r-xl);
        box-shadow: var(--sh-lg);
    }
    body.client-menu .cart {
        transition: transform 320ms cubic-bezier(.2, .8, .2, 1), visibility 320ms;
    }
}

/* --- Oynalar: ochilishda mayin animatsiya (CSS animation — `[hidden]`
   olib tashlanganda elementga animatsiya YANGIDAN qo'llanadi va u har
   safar boshidan ishga tushadi, shuning uchun bu qayta ochish/yopishda
   ham ishonchli ishlaydi; `prefers-reduced-motion` uchun 23-bo'limdagi
   umumiy qoida animatsiya davomiyligini avtomatik qisqartiradi). --- */
body.client-menu .lightbox img { border-radius: var(--r-xl); }
body.client-menu .modal:not([hidden]) .modal-box {
    animation: client-menu-modal-in 260ms cubic-bezier(.2, .8, .2, 1);
}
body.client-menu .modal:not([hidden]) .modal-backdrop,
body.client-menu .lightbox:not([hidden]) {
    animation: client-menu-fade-in 220ms ease;
}
@keyframes client-menu-modal-in {
    from { opacity: 0; transform: translateY(14px) scale(.98); }
    to   { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes client-menu-fade-in {
    from { opacity: 0; }
    to   { opacity: 1; }
}
body.client-menu .modal-head h2 { font-size: var(--fs-lg); font-weight: 700; }
body.client-menu .checkout-summary { background: var(--brand-50); }

/* ==========================================================================
   21. RESPONSIVE
   ========================================================================== */

/* --- Sidebar: tor "rail" ko'rinishi --- */
@media (max-width: 1180px) and (min-width: 769px) {
    .sidebar { width: 68px; padding-left: 0; padding-right: 0; }
    .sidebar .brand-text,
    .sidebar .nav-group-title,
    .sidebar .nav-label,
    .sidebar .soon-badge { display: none; }
    .sidebar-brand { justify-content: center; padding: 0 0 var(--sp-4); }
    .nav-link { justify-content: center; padding: 0; gap: 0; }
    .nav-link .icon { font-size: 20px; }
    .nav-group { margin-bottom: var(--sp-3); }
    .content { padding: var(--sp-6); }
}

/* --- Sidebar: chekka drawer (telefon/planshet) --- */
@media (max-width: 768px) {
    .sidebar {
        position: fixed;
        top: 0; bottom: 0; left: 0;
        width: 264px;
        transform: translateX(-100%);
        transition: transform var(--t);
        z-index: var(--z-drawer);
    }
    .app.nav-open .sidebar { transform: none; }
    .app.nav-open .nav-overlay { display: block; }

    .nav-toggle {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        width: 38px; height: 38px;
        border: 1px solid var(--border);
        border-radius: var(--r-md);
        background: var(--bg-surface);
        color: var(--text);
        font-size: 20px;
        cursor: pointer;
    }

    .topbar { height: 58px; padding: 0 var(--sp-4); }
    .topbar h1 { font-size: var(--fs-md); }
    .user-chip .user-meta { display: none; }
    /* Audit 2026-09-24, M12: 375px telefonda sarlavha hamon "Bosh…",
       "Xodi…" gacha kesilardi (topbar'da 6 ta boshqaruv elementi). Tor
       ekranda avatar yashiriladi va elementlar orasi qisqaradi — ism/rol
       baribir sidebar'da, sahifa nomi esa to'liqroq ko'rinadi. */
    .topbar-right { gap: var(--sp-2); }
    .content { padding: var(--sp-4); }
    .page-head h2 { font-size: var(--fs-lg); }
    .form-grid { grid-template-columns: 1fr; }
}

/* --- Ishchi panel: pastki navigatsiya --- */
@media (max-width: 720px) {
    .wnav { display: none; }
    .wnav-bottom { display: block; }
    .worker-shell { padding-bottom: 86px; }
    .worker-header h1 { font-size: var(--fs-lg); }

    /* Audit 2026-09-23, "barcha panellar": ofitsiant/kuryer/kassa —
       telefonni bir qo'lda ushlab ishlatiladi, rahbar paneli esa
       desktopda. Ilgari ikkalasi ham AYNAN bir xil shkaladan (masalan
       --fs-3xl) foydalanardi — endi telefon kengligida bu raqamlar
       biroz kichrayadi, shunda bir qarashda tez skanerlash osonroq
       bo'ladi (oshxona monobloki, .kitchen-screen, buni bo'limi
       alohida — o'zining kattaroq shkalasida qoladi). */
    .worker-shell .order-no { font-size: var(--fs-2xl); }
    .worker-shell .stat-value { font-size: var(--fs-2xl); }
    .worker-shell .stat-value.is-money { font-size: clamp(14px, 12cqi, var(--fs-2xl)); }  /* audit 2026-09-24, O9 */
    .worker-shell .table-no { font-size: var(--fs-2xl); }
    .worker-shell .table-no.is-small { font-size: var(--fs-lg); }
}

/* --- Jadvallar telefonda kartaga aylanadi --- */
@media (max-width: 720px) {
    .table-cards thead { display: none; }
    .table-cards, .table-cards tbody, .table-cards tr, .table-cards td { display: block; }
    .table-cards tr {
        padding: var(--sp-3) var(--sp-4);
        border-bottom: 1px solid var(--border);
    }
    .table-cards tr:last-child { border-bottom: 0; }
    .table-cards td {
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: var(--sp-4);
        padding: var(--sp-1) 0;
        border: 0;
        text-align: left;
    }
    .table-cards td::before {
        content: attr(data-label);
        flex-shrink: 0;
        color: var(--text-muted);
        font-size: var(--fs-sm);
    }
    .table-cards td[data-label=""]::before,
    .table-cards td:not([data-label])::before { display: none; }
    .table-cards td.primary-cell {
        font-size: var(--fs-md);
        font-weight: 600;
        padding-bottom: var(--sp-2);
    }
    /* Audit 2026-09-24, M11: telefonda tugmalar keyingi qatorga o'raladi —
       ilgari 3-tugma ("Qurilmalardan chiqarish" — telefon yo'qolganda kerak
       bo'ladigan xavfsizlik amali) karta chetidan tashqarida qolib, faqat
       kartani yon tomonga surganda ko'rinardi. */
    .table-cards .table-actions { justify-content: flex-start; flex-wrap: wrap; padding-top: var(--sp-2); }
    .table-wrap { border-radius: var(--r-md); }
}

@media (max-width: 640px) {
    .stat-grid { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: var(--sp-3); }
    /* Audit 2026-09-24, O9: pul summasi bor plitkalar telefonda bitta
       ustunda turadi — ikki ustunda 13 xonali summa ~15px gacha
       kichrayib, sahifaning asosiy raqami izohdan ham kichik ko'rinardi.
       Oddiy sonli plitkalar (Bosh sahifa: 4 ta hisoblagich) 2x2 qoladi. */
    .stat-grid:has(.stat-value.is-money) { grid-template-columns: 1fr; }
    .stat { padding: var(--sp-4); }
    .stat-value { font-size: var(--fs-2xl); }
    .stat-value.is-money { font-size: clamp(14px, 12cqi, var(--fs-2xl)); }  /* audit 2026-09-24, O9: qat'iy 24px katta summada bo'linishga olib kelardi */
    .card > .card-body { padding: var(--sp-4); }
    .card-header { padding: var(--sp-3) var(--sp-4); }
    .board { grid-template-columns: 1fr; }
    /* Audit 2026-09-26, R2 (foydalanuvchi: "header tepasida va ikki
       yonida bo'sh joy bor, yoqmadi"): `.site`ning bazaviy qoidasi
       (yuqorida, "20" bo'limi) tor ekranda ham header ustidan 20px
       bo'sh joy qoldirardi — shu YUQORI bo'shliq butunlay olib
       tashlandi, mobil ekranda header endi to'g'ridan-to'g'ri
       ekran tepasiga tegib turadi.

       R3 (davomi, o'sha kuni — foydalanuvchi: "rasmlar ikki yonga
       tegib qolmoqda, kategoriya tanlansa chap tomonga yopishib
       qolmoqda"): R2'da YON tomonlar ham 0'ga tushirilgan edi —
       amalda taom rasmlari va kategoriya tasmasi ekran chetiga
       to'g'ridan-to'g'ri "yopishib" ko'rinishga sabab bo'ldi. Yon
       bo'shliq avvalgi qiymatiga (`var(--sp-3)`, 12px) qaytarildi —
       faqat YUQORIDAGI bo'shliq olib tashlangan holicha qoladi. */
    .site { padding-top: 0; padding-left: var(--sp-3); padding-right: var(--sp-3); }
    .filter-bar { padding: var(--sp-3); }
    .filter-bar .field { min-width: 120px; flex: 1; }
    .form-actions { flex-wrap: wrap; }
    .order-card { padding: var(--sp-4); }
}

/* --------------------------------------------------------------------------
   Menyu sahifasining moslashuvchanligi
   -------------------------------------------------------------------------- */

/* 1100px dan tor: chapdagi kategoriya ro'yxati o'rniga gorizontal tasma */
@media (max-width: 1100px) {
    .menu-layout { grid-template-columns: minmax(0, 1fr) 300px; gap: var(--sp-5); }
    .cat-rail { display: none; }
    .menu-chips {
        display: block;
        position: sticky;
        top: 60px;
        z-index: var(--z-nav);
        padding: var(--sp-2) 0 var(--sp-3);
        background: var(--bg-app);
    }
    /* qidiruvda hech narsa topilmasa JS tasmani yashiradi */
    .menu-chips[hidden] { display: none; }
}

/* 900px dan tor: bitta ustun, savat pastdan chiqadigan varaqqa aylanadi */
@media (max-width: 900px) {
    .menu-layout { grid-template-columns: minmax(0, 1fr); }
    .menu-page .site { padding-bottom: 96px; }

    .cart {
        position: fixed;
        left: 0; right: 0; bottom: 0;
        top: auto;
        z-index: var(--z-drawer);
        transform: translateY(100%);
        visibility: hidden;
        transition: transform var(--t), visibility var(--t);
    }
    .cart.is-open { transform: none; visibility: visible; }
    /* Varaq ortidagi qoraytirilgan fon — bosilsa varaq yopiladi */
    .cart.is-open::before {
        content: "";
        position: fixed;
        inset: 0;
        background: rgba(16, 24, 40, .45);
        z-index: -1;
    }
    .cart-inner { position: relative; z-index: 1; }
    .cart-inner {
        max-height: 78vh;
        border-radius: var(--r-xl) var(--r-xl) 0 0;
        border-bottom: 0;
        box-shadow: var(--sh-lg);  /* audit Ki8 */
    }
    .cart-close { display: inline-flex; }
    .cart-foot { padding-bottom: calc(var(--sp-4) + env(safe-area-inset-bottom)); }
    .cart-bar { display: flex; }
    .cart-bar[hidden] { display: none; }
}

/* Tor ekranda taom kartasi: narx tepada, tugma butun kenglikda.
   Aks holda narx + "Qo'shish" bir qatorga sig'may, tugma kartadan chiqib ketadi. */
@media (max-width: 560px) {
    .dish-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: var(--sp-3); }
    .dish-bottom { flex-direction: column; align-items: stretch; gap: var(--sp-2); }
    .dish-action { width: 100%; }
    .qty-add { width: 100%; justify-content: center; }
    .qty-stepper { justify-content: center; }
    .modal { padding: 0; align-items: flex-end; }
    .modal-box {
        max-width: none;
        max-height: 92vh;
        border-radius: var(--r-xl) var(--r-xl) 0 0;
        border-bottom: 0;
    }
    .modal-body { padding: var(--sp-4); }
    .modal-head, .modal-foot { padding: var(--sp-4); }
    .dish-modal-photo { margin: calc(var(--sp-4) * -1) calc(var(--sp-4) * -1) var(--sp-4); }
    .dish-modal-foot .btn { min-width: 0; }

    /* 2026-09-25 (7-audit): Menyu sahifasining sarlavhasini tor ekranda
       ALOHIDA ixchamlashtiruvchi qoidalar (kichikroq logotip, boshqa
       gap/margin) OLIB TASHLANDI — endi bazaviy `.site-header`
       (20-bo'lim) va yuqoridagi umumiy 640px qoidasi barcha sahifalarda
       (Menyu ham) bir xil ishlaydi. */
}

/* Juda tor ekran (380px dan kichik) — bitta ustun */
@media (max-width: 380px) {
    .dish-grid { grid-template-columns: 1fr; }
}

/* Telefonda inputlar zoom qilmasin */
@media (max-width: 640px) {
    input, select, textarea { font-size: 16px; }
}

/* ==========================================================================
   22. KICHIK YORDAMCHI KLASSLAR
   --------------------------------------------------------------------------
   Faqat shablonlarda inline style="..." yozishga o'rin qolmasligi uchun.
   ========================================================================== */

.w-full { width: 100%; }
.mt-2 { margin-top: var(--sp-2); }
.mt-4 { margin-top: var(--sp-4); }
.mt-6 { margin-top: var(--sp-6); }
.mb-0 { margin-bottom: 0; }
.mb-4 { margin-bottom: var(--sp-4); }
.stack-sm { display: grid; gap: var(--sp-2); }
.row-between { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); }

/* ==========================================================================
   23. HARAKATNI KAMAYTIRISH
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: .01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: .01ms !important;
        scroll-behavior: auto !important;
    }
}

/* ==========================================================================
   24. TIL TANLASH VA YORUG'/QORONG'U REJIM TUGMASI
   ========================================================================== */

.prefs {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    flex-shrink: 0;
}

/* --- Til menyusi (2026-09-23) — SOF IBRAT/BuildOps paneli namunasi:
   joriy til kodi ko'rinadigan tugma, bosilganda radio-ro'yxat ochiladi.
   Ochish/yopish `partials/scripts.html`dagi JS bilan — `.is-open` klassi
   qo'shilib/olib tashlanadi, xuddi mijoz savatining pastdan chiqadigan
   varag'i (`.cart.is-open`) kabi. */
.lang-menu { position: relative; }
.lang-menu-toggle {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    height: 36px;
    padding: 0 var(--sp-3);
    border: 1px solid var(--border);
    border-radius: var(--r-full);
    background: var(--bg-surface);
    color: var(--text);
    font: inherit;
    font-size: var(--fs-sm);
    font-weight: 600;
    cursor: pointer;
    transition: border-color var(--t-fast), box-shadow var(--t-fast);
}
.lang-menu-toggle:hover { border-color: var(--border-strong); }
.lang-menu.is-open .lang-menu-toggle {
    border-color: var(--brand);
    box-shadow: 0 0 0 3px var(--brand-100);
}
.lang-menu-globe { font-size: 15px; color: var(--text-muted); }
.lang-menu-chevron {
    font-size: 10px;
    color: var(--text-faint);
    transform: rotate(90deg);
    transition: transform var(--t-fast);
}
.lang-menu.is-open .lang-menu-chevron { transform: rotate(-90deg); }

/* Panel — DIQQAT: z-index atayin `--z-bar`ga (sticky qidiruv/tasmalardan
   yuqori) o'rnatilgan, `--z-nav`ga emas: mijoz sahifasida qidiruv maydoni
   va kategoriya tasmasi ham `--z-nav` bilan sticky (static/css/app.css,
   "20b" bo'lim) — ular DOM'da bu menyudan KEYIN kelgani uchun, agar
   z-index bir xil bo'lganda ular shu menyu ustidan chiqib ketardi. */
.lang-menu-panel {
    position: absolute;
    top: calc(100% + var(--sp-2));
    right: 0;
    z-index: var(--z-bar);
    min-width: 168px;
    padding: var(--sp-2);
    background: var(--bg-surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    box-shadow: var(--sh-lg);
    display: none;
}
.lang-menu.is-open .lang-menu-panel { display: block; }
.lang-menu-form { margin: 0; }
.lang-menu-item {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    width: 100%;
    height: 38px;
    padding: 0 var(--sp-3);
    border: 0;
    border-radius: var(--r-md);
    background: transparent;
    color: var(--text);
    font: inherit;
    font-size: var(--fs-sm);
    text-align: left;
    cursor: pointer;
}
.lang-menu-item:hover { background: var(--bg-subtle); }
.lang-menu-radio {
    flex-shrink: 0;
    width: 16px; height: 16px;
    border-radius: 50%;
    border: 1.5px solid var(--border-strong);
    transition: border-color var(--t-fast), border-width var(--t-fast);
}
.lang-menu-item.is-active { color: var(--brand-700); font-weight: 600; }
.lang-menu-item.is-active .lang-menu-radio {
    border-color: var(--brand);
    border-width: 5px;
}

/* Tugmada bir vaqtda faqat bitta ikonka ko'rinadi */
.theme-toggle { color: var(--text-muted); }
.theme-toggle:hover { color: var(--text); }
.theme-icon-dark { display: none; }

:root[data-theme="dark"] .theme-icon-light { display: none; }
:root[data-theme="dark"] .theme-icon-dark { display: inline-flex; }

@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .theme-icon-light { display: none; }
    :root:not([data-theme="light"]) .theme-icon-dark { display: inline-flex; }
}

/* Sidebar ichida (drawer holatida) va quyuq panellarda — tugma o'zi
   sidebar rangida, lekin ochiladigan panel odatdagi ("yorug'/qorong'u
   rejim" belgilaganidek) sirt rangida qoladi, chunki u sidebar ustidan
   suzib chiqadi. */
.sidebar .prefs .lang-menu-toggle {
    background: transparent;
    border-color: var(--sidebar-divider);
    color: var(--sidebar-fg-strong);
}
.sidebar .prefs .lang-menu-globe,
.sidebar .prefs .lang-menu-chevron { color: var(--sidebar-dim); }

/* Kirish sahifasi — karta ustida o'ng burchakda */
.auth-page .prefs {
    position: fixed;
    top: var(--sp-4);
    right: var(--sp-4);
    z-index: var(--z-nav);
}

/* Tor ekranda joy tejash uchun — kod (masalan "UZ") allaqachon ixcham,
   shuning uchun faqat dekorativ globus ikonkasi yashiriladi. */
@media (max-width: 560px) {
    .lang-menu-globe { display: none; }
    .lang-menu-toggle { padding: 0 var(--sp-2); gap: 4px; }
    .topbar .prefs { gap: var(--sp-1); }
}

/* ==========================================================================
   24b. TOPBAR — TIL/TEMA/BILDIRISHNOMA/CHIQISH BITTA BLOKDA (2026-09-23,
   foydalanuvchi so'rovi: "til/qorong'u rejim/chiqish belgisi bitta blok
   ichida joylashsin" — SOF IBRAT/BuildOps namunasi). Bu blok
   `manage/base.html`dagi `.topbar-right` ichida `.prefs`ni (til+tema),
   yangi qo'ng'iroqcha (bildirishnoma) tugmasini va chiqish formasini
   yaxlit bitta pastki chiziqli konteynerga jamlaydi — har biri alohida
   chegarali tugma bo'lib turmasin deb. --- */

.topbar-utility-group {
    display: flex;
    align-items: center;
    gap: 2px;
    padding: 3px;
    border: 1px solid var(--border);
    border-radius: var(--r-full);
    background: var(--bg-surface);
    flex-shrink: 0;
}

/* Guruh ichida — har bir element o'z chegara/fonini yo'qotadi, chunki
   endi tashqi konteyner bitta umumiy chegara chizadi. */
.topbar-utility-group .lang-menu-toggle {
    height: 32px;
    border: 0;
    background: transparent;
}
.topbar-utility-group .lang-menu-toggle:hover { border-color: transparent; background: var(--bg-subtle); }
.topbar-utility-group .lang-menu.is-open .lang-menu-toggle {
    border-color: transparent;
    background: var(--bg-subtle);
    box-shadow: none;
}

.topbar-utility-group .theme-toggle,
.topbar-utility-group .notif-bell,
.topbar-utility-group .logout-form button {
    width: 32px;
    height: 32px;
    border: 0;
    background: transparent;
    border-radius: 50%;
    box-shadow: none;
}
.topbar-utility-group .theme-toggle:hover,
.topbar-utility-group .notif-bell:hover,
.topbar-utility-group .logout-form button:hover { background: var(--bg-subtle); }

/* Qo'ng'iroqcha `<button>`i CSRF tufayli `<form method="post">` ichida
   (`.logout-form`dagi bilan bir xil naqsh) — forma o'zi ko'rinmas, faqat
   tugmani flex qatorga qo'shib turadi. */
.topbar-utility-group .notif-bell-form { margin: 0; display: flex; }

/* Qo'ng'iroqcha (bildirishnoma) tugmasi — o'qilmagan sonini ko'rsatuvchi
   belgi `.dish-qty-badge` naqshiga asoslangan (loyihada boshqa yagona
   "to'liq" rangli belgi shu — alohida qattiq `--danger` o'zgaruvchisi
   yo'q). */
.notif-bell { position: relative; }
.bell-badge {
    position: absolute;
    top: 2px;
    right: 2px;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--r-full);
    background: var(--brand);
    color: var(--brand-on, #fff);
    font-size: 10px;
    font-weight: 700;
    line-height: 1;
    font-variant-numeric: tabular-nums;
    box-shadow: var(--sh-sm);
}
.bell-badge[hidden] { display: none; }

@media (max-width: 560px) {
    .topbar-utility-group { gap: 0; padding: 2px; }
}

/* ==========================================================================
   25. OFITSIANT PANELI — TELEFON UCHUN (2026-09-20 rejasi, 5-bosqich)
   ========================================================================== */

/* --- "Mening stollarim" kartasi --- */

/* Stol raqami kartadagi eng katta element: ofitsiant ekranga bir qarab,
   o'qimasdan kerakli stolni topishi kerak. */
.pos-table {
    font-size: var(--fs-3xl);
    font-weight: 700;
    line-height: 1;
    letter-spacing: -0.02em;
}
.pos-card .order-items li { font-size: var(--fs-md); }
.pos-card-total {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--sp-3);
    margin-top: var(--sp-3);
    padding-top: var(--sp-3);
    border-top: 1px solid var(--border);
    color: var(--text-muted);
    font-size: var(--fs-sm);
}
.pos-card-total strong {
    color: var(--text);
    font-size: var(--fs-md);
    font-variant-numeric: tabular-nums;
}
.pos-card .order-actions { margin-top: var(--sp-4); }

/* --- Stol tanlash: ochiluvchi ro'yxat emas, yonma-yon tugmalar ---

   Telefonda `<select>` uch harakat edi: ro'yxatni ochish, aylantirish,
   tasdiqlash — mijoz oldida turib. Radio tugmalar bitta tegishga
   tushiradi. Tugmalar 56px — barmoq uchun qulay eng kichik o'lcham. */
.table-picker > div {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(84px, 1fr));
    gap: var(--sp-2);
    max-height: 46vh;
    overflow-y: auto;
}
.table-picker label {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 56px;
    padding: var(--sp-2);
    border: 1px solid var(--border-strong);
    border-radius: var(--r-md);
    background: var(--bg-surface);
    font-size: var(--fs-lg);
    font-weight: 600;
    text-align: center;
    cursor: pointer;
    transition: border-color var(--t-fast), background var(--t-fast), color var(--t-fast);
}
.table-picker label:hover { border-color: var(--brand); }
/* Radio tugmaning o'zi ko'rinmaydi, lekin DOMda qoladi — klaviatura bilan
   boshqarish va ekran o'quvchilar shunga tayanadi. */
.table-picker input[type="radio"] {
    position: absolute;
    width: 1px; height: 1px;
    opacity: 0;
    pointer-events: none;
}
.table-picker label:has(input:checked) {
    background: var(--brand);
    border-color: var(--brand);
    color: var(--brand-on, #fff);
}
/* `:has()` ni tanimaydigan eski brauzerda tanlangan stol bilinmay qolmasin —
   fokus halqasi hech bo'lmasa qayerda turganini ko'rsatadi. */
.table-picker label:focus-within {
    outline: 2px solid var(--brand);
    outline-offset: 2px;
}

/* --- Menyu tanlash ekrani ishchi panel ichida ---

   Bu sahifalarda pastki navigatsiya YASHIRILADI: savat tasmasi ham
   ekranning pastida turadi va ikkovi ustma-ust tushardi. Buyurtma
   kiritish — bir maqsadli ekran; undan chiqish uchun tepada "Orqaga"
   havolasi bor. */
body.pos-picker .wnav-bottom { display: none; }

@media (max-width: 900px) {
    body.pos-picker .worker-shell { padding-bottom: 96px; }
}

/* --- Ofitsiant uchun menyu ZICH ro'yxat bo'lib ko'rinadi ---

   Rasm mijoz uchun muhim: u taomni birinchi marta ko'radi va ko'z bilan
   tanlaydi. Ofitsiant esa menyuni yoddan biladi va kuniga yuz marta
   ochadi — unga kerak bo'lgan narsa ro'yxatni tez aylantirish. Katta
   rasmli kartalarda telefon ekraniga to'rtta taom sig'adi, zich
   ro'yxatda esa o'n bittasi.

   Rasm butunlay yo'qolmaydi: kichik belgi bo'lib qoladi va taom
   kartasini bossa, to'liq rasm oynada ochiladi (mijoz "bu qanaqa
   taom?" deb so'raganda kerak bo'ladi). */
body.pos-picker .dish-grid {
    grid-template-columns: 1fr;
    gap: var(--sp-2);
}
body.pos-picker .dish {
    flex-direction: row;
    align-items: center;
    gap: var(--sp-3);
    padding: var(--sp-2) var(--sp-3);
}
body.pos-picker .dish:hover { transform: none; }
body.pos-picker .dish-photo {
    flex-shrink: 0;
    width: 52px;
    height: 52px;
    aspect-ratio: auto;
    border-radius: var(--r-md);
}
body.pos-picker .dish-photo-empty .icon { font-size: 22px; }
body.pos-picker .dish-qty-badge {
    top: -6px; left: -6px;
    min-width: 22px; height: 22px;
    font-size: var(--fs-xs);
}
/* Audit 2026-09-21, O7: `.dish-photo` shu rejimda 52px'gacha kichrayadi
   va `overflow: hidden` saqlanadi (yuqoriga qarang). `position: static`
   belgini oddiy oqimga qo'yardi — u rasmdan KEYIN, ya'ni 52px balandlik
   chegarasidan PASTDA chiqib, o'sha "overflow: hidden" tomonidan butunlay
   kesib tashlanardi. Faqat `.dish.is-out`ning kulrang filtri qolardi —
   bu esa "nega bu taom xira?" degan savolga javob bermaydi.

   Endi belgi butun 52px kvadratni qoplaydigan mo'jaz "qopqoq" bo'ladi:
   fon va matn rangi ASOSIY (kartochka) ko'rinishdagi bilan bir xil
   (`--bg-surface` / `--text-muted`) — kontrast nisbati allaqachon
   tekshirilgan, shuning uchun bu yerda yangi rang o'ylab topilmaydi. */
body.pos-picker .dish-out-badge {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    width: auto;
    height: auto;
    border-radius: var(--r-md);
    box-shadow: none;
    padding: 2px;
    background: var(--bg-surface);
}
/* 2026-09-26, 2-bosqich: bazaviy `.dish-out-pill` mijoz menyusi uchun
   qora fon/chegara/quyuq matn qo'shdi — 52px kvadratda bu ortiqcha
   bezak bo'lardi. Shu sabab pill'ning o'z "chrome"i shu yerda butunlay
   olib tashlanadi va matn to'g'ridan-to'g'ri (avvalgidek) `--bg-surface`
   fon ustida `--text-muted` rangda chiqadi (audit 2026-09-24, O7:
   kontrast shu birikma bilan allaqachon tekshirilgan). Ikonka esa shu
   tor joyda chiqib ketmasligi uchun yashiriladi. */
body.pos-picker .dish-out-pill {
    background: transparent;
    border: 0;
    padding: 0;
    color: var(--text-muted);
    text-shadow: none;
    font-size: 10px;
    font-weight: 700;
    letter-spacing: 0;
    line-height: 1.15;
    text-align: center;
}
body.pos-picker .dish-out-pill .icon { display: none; }
/* Audit 2026-09-24, J7: ilgari bu qator bitta flex-qator edi — nom,
   reyting, narx va tugma yonma-yon. 09-23 da reyting qo'shilgach, 375px
   telefonda nom 1 harfgacha siqilardi ("O.", "S." — ikki xil somsa bir xil
   ko'rinardi), uzun nomli taomda esa nom butunlay yo'qolib, "+" tugma
   kartadan tashqariga chiqardi. Endi ikki ustunli grid: chapda nom (2
   qatorgacha), uning ostida narx va reyting; o'ngda tugma — nomga doim
   joy qoladi va qator kengligi hech qachon oshmaydi. */
body.pos-picker .dish-info {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
    column-gap: var(--sp-3);
    row-gap: 2px;
    padding: 0;
    min-width: 0;
    flex: 1;
}
body.pos-picker .dish-info > .dish-name { grid-column: 1; grid-row: 1; }
body.pos-picker .dish-bottom { display: contents; }
body.pos-picker .dish-price { grid-column: 1; grid-row: 2; }
body.pos-picker .dish-rating { grid-column: 1; grid-row: 3; font-size: var(--fs-xs); }
body.pos-picker .dish-action { grid-column: 2; grid-row: 1 / span 3; align-self: center; }
body.pos-picker .dish-desc { display: none; }
body.pos-picker .dish-name {
    min-width: 0;
    margin-bottom: 0;
    font-size: var(--fs-md);
    line-height: 1.3;
    /* 2 qatorgacha (J7) — ofitsiant o'xshash nomli taomlarni ajrata olishi
       kerak. Undan uzunini to'liq taom oynasida ko'rish mumkin. */
    overflow: hidden;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    overflow-wrap: anywhere;
}
body.pos-picker .dish-action,
body.pos-picker .qty-add { width: auto; }
/* Tugma barmoq uchun kattalashadi — zich ro'yxatda qatorlar yaqin
   turadi va kichik tugmani xato bosish oson bo'lardi.

   MATN OLIB TASHLANADI, faqat "+" belgisi qoladi. Sabab o'lchamda:
   ruscha "Добавить" tugmaga 90px qo'shadi va 390px kenglikdagi
   telefonda taom nomiga joy qolmaydi ("Lag'mon" -> "Lag'…"). Menyu
   qatorida narx yonidagi "+" nima qilishini aytib turadi, matn esa
   DOMda qoladi — ekran o'quvchi uni baribir o'qiydi (`font-size: 0`
   ko'rinishga ta'sir qiladi, foydalanuvchanlik daraxtiga emas). */
body.pos-picker .qty-add {
    width: 44px;
    height: 44px;
    padding: 0;
    justify-content: center;
    border-radius: 50%;
    font-size: 0;
}
body.pos-picker .qty-add .icon { font-size: 20px; }
body.pos-picker .qty-stepper button { width: 38px; height: 38px; }

/* Keng ekranda (kassa monitori yoki planshet) ro'yxat ikki ustun bo'ladi */
@media (min-width: 900px) {
    body.pos-picker .dish-grid {
        grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
        gap: var(--sp-3);
    }
}

/* ==========================================================================
   26. OSHXONA MONOBLOKI (2026-09-20 rejasi, 6-bosqich)
   ========================================================================== */

/* Monoblok oshxonada, bir-ikki qadam narida turadi va oshpaz unga qo'li
   band holda, yonidan o'tib ketayotib qaraydi. Shuning uchun bu yerda
   hamma narsa boshqa panellardagidan kattaroq va ekran kengroq: navbat
   qancha ko'p ko'rinsa, shuncha kam aylantirish kerak bo'ladi. */
.kitchen-shell {
    max-width: 1920px;
    margin: 0 auto;
    padding: var(--sp-5) var(--sp-5) var(--sp-7);
}
.kitchen-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-3);
    margin-bottom: var(--sp-5);
}
.kitchen-header .brand-row {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    min-width: 0;
}
.kitchen-header img.brand-logo,
.kitchen-header .brand-fallback {
    width: 48px;
    height: 48px;
    border-radius: var(--r-md);
    object-fit: cover;
    flex-shrink: 0;
}
.kitchen-header .brand-fallback {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--brand);
    color: var(--brand-on, #fff);
    font-size: var(--fs-xl);
    font-weight: 700;
    text-transform: uppercase;
}
.kitchen-header h1 { font-size: var(--fs-2xl); }
.kitchen-header .sub { color: var(--text-muted); font-size: var(--fs-md); }

/* Kartalar kengroq: 320px da bitta buyurtmaning taomlari ikki qatorga
   bo'linib ketardi, bu esa uzoqdan o'qishni qiyinlashtiradi. */
.kitchen-screen .board { grid-template-columns: repeat(auto-fill, minmax(min(380px, 100%), 1fr)); }  /* audit 2026-09-24: telefonda toshmasin */
.kitchen-screen .order-items li { font-size: var(--fs-xl); }
.kitchen-screen .order-items .qty { min-width: 52px; font-size: var(--fs-2xl); }
.kitchen-screen .order-no { font-size: var(--fs-4xl); }

@media (max-width: 720px) {
    .kitchen-shell { padding: var(--sp-4) var(--sp-3) var(--sp-6); }
    .kitchen-header h1 { font-size: var(--fs-lg); }
    .kitchen-header .sub { font-size: var(--fs-xs); }
    .kitchen-header img.brand-logo,
    .kitchen-header .brand-fallback { width: 38px; height: 38px; font-size: var(--fs-base); }
    .kitchen-screen .board { grid-template-columns: 1fr; }
    .kitchen-screen .order-items li { font-size: var(--fs-md); }
    .kitchen-screen .order-items .qty { min-width: 42px; font-size: var(--fs-lg); }
}

/* ==========================================================================
   27. KASSA SMENASI (2026-09-20 rejasi, 7-bosqich)
   ========================================================================== */

/* Kutilgan / sanalgan / farq. Farq qatori rang bilan ajraladi — kassir
   ham, rahbar ham uni birinchi ko'rishi kerak. */
.diff-list .diff-row {
    margin-top: var(--sp-2);
    padding-top: var(--sp-3);
    border-top: 1px solid var(--border);
    font-size: var(--fs-md);
}
.diff-list .diff-row.is-short strong { color: var(--danger-fg); }
.diff-list .diff-row.is-over strong { color: var(--warning-fg); }

/* ==========================================================================
   28. TAOM SHARHLARI (REYTING) — 2026-09-23
   ========================================================================== */

/* --- O'rtacha baho — menyu kartasida (`dish-grid`), faqat kamida bitta
   sharh bo'lsa ko'rinadi --- */
.dish-rating {
    display: flex;
    align-items: baseline;
    gap: 4px;
    margin-top: 2px;
    font-size: var(--fs-sm);
    color: var(--text-muted);
}
.dish-rating .star-filled { color: var(--warning-fg, #b45309); }
.dish-rating-count { color: var(--text-faint); }

/* --- Baho qo'yish formasi — "Buyurtmam qayerda?" sahifasida, TO'LANGAN
   buyurtmada --- */
.review-block {
    margin-top: var(--sp-4);
    padding-top: var(--sp-4);
    border-top: 1px dashed var(--border);
}
.review-block h4 { margin-bottom: var(--sp-3); font-size: var(--fs-sm); color: var(--text-muted); }
.review-row { display: grid; gap: var(--sp-2); margin-bottom: var(--sp-3); }
.review-row:last-child { margin-bottom: 0; }
.review-row-name { font-weight: 600; font-size: var(--fs-sm); }
.review-form {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--sp-2);
}
.review-comment-input {
    flex: 1 1 160px;
    height: 36px;
    padding: 0 var(--sp-3);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    background: var(--bg-surface);
    color: var(--text);
    font: inherit;
    font-size: var(--fs-sm);
}

/* CSS-only yulduzcha tanlagich — radio + label, hech qanday JS shart
   emas (loyihadagi boshqa formalar kabi, masalan til tanlash).
   MUHIM: shablonda inputlar TESKARI tartibda (5,4,3,2,1) chiqadi —
   `row-reverse` bilan birga, `~` (keyingi DOM birodarlari) tanlangan
   yulduzdan CHAPDAGI (kichikroq) yulduzlarni ham yoritishini ta'minlaydi. */
.star-rating {
    display: inline-flex;
    flex-direction: row-reverse;
    gap: 2px;
}
.star-rating input {
    position: absolute;
    opacity: 0;
    width: 1px;
    height: 1px;
}
.star-rating label {
    cursor: pointer;
    font-size: 22px;
    line-height: 1;
    color: var(--border-strong);
    transition: color var(--t-fast);
}
.star-rating input:checked ~ label { color: var(--warning-fg, #b45309); }
.star-rating label:hover,
.star-rating label:hover ~ label { color: var(--warning-fg, #b45309); }

/* --- Boshqaruv panelidagi sharhlar ro'yxati (`manage/reviews.html`) --- */
.star-display { color: var(--warning-fg, #b45309); letter-spacing: 1px; }
.diff-list .diff-row.is-even strong { color: var(--success-fg); }

/* Audit 2026-09-24, M12 (davomi): juda tor telefonda avatar ham yashiriladi. */
@media (max-width: 480px) {
    .topbar .user-chip { display: none; }
    .topbar { gap: var(--sp-2); padding: 0 var(--sp-3); }
}

/* ==========================================================================
   Audit 2026-09-24, M13: sensorli ekranda bosiladigan maydon kamida 44px.

   Ilgari header ikonkalari 32px, sidebar havolalari, tugma va maydonlar
   40px edi — WCAG AA (24px) talabiga javob beradi, lekin telefonda
   barmoq bilan xato bosish oson edi (qo'ng'iroqcha o'rniga "Chiqish").

   Faqat `pointer: coarse` (barmoq) qurilmalarda ishlaydi — sichqonchali
   kompyuterda dizayn o'zgarmaydi. Ikki xil yondashuv:
   1) Tugma, maydon, sidebar havolasi — haqiqatan 44px ga kattalashadi.
   2) Kichik ikonka tugmalari (tor topbar, 320px telefon) — KO'RINISHI
      o'zgarmaydi, faqat ko'rinmas `::after` qatlami bosiladigan joyni
      kengaytiradi. Yonma-yon turgan tugmalarda (topbar guruhi) gorizontal
      kengaytirish ataylab kichik — qo'shni tugmaning ustiga chiqmasin.
   ========================================================================== */
@media (pointer: coarse) {
    :where(.btn):not(.btn-sm):not(.btn-icon) { min-height: 44px; }
    .input,
    input[type="text"], input[type="password"], input[type="email"],
    input[type="tel"], input[type="number"], input[type="date"],
    input[type="url"], input[type="search"],
    select { min-height: 44px; }
    .nav-link { min-height: 44px; }

    :where(.btn-sm, .btn-icon, .lang-menu-toggle, .topnav-toggle,
           .topnav-drawer-close, .theme-toggle, .notif-bell, .nav-toggle,
           .logout-form button, .qty-stepper button, .chip) { position: relative; }
    /* Vertikal kengaytirish: 32px -> 44px. Gorizontal EMAS — jadval
       qatoridagi va topbar guruhidagi tugmalar bir-biriga tegib turadi,
       yon tomonga kengaysa qo'shni tugmaning chetini "o'g'irlardi"
       (tekshiruvda "Tahrirlash"ning o'ng cheti "O'chirish"ga tushgan). */
    .btn-sm::after, .btn-icon::after, .lang-menu-toggle::after,
    .theme-toggle::after, .notif-bell::after, .logout-form button::after,
    .qty-stepper button::after {
        content: "";
        position: absolute;
        inset: -7px 0;
    }
    .qty-stepper button::after { inset: -3px 0; }
    /* Yakka turadigan tugmalar (qo'shnisi yo'q) — har tomonga. */
    .nav-toggle::after, .topnav-toggle::after, .topnav-drawer-close::after {
        content: "";
        position: absolute;
        inset: -7px;
    }
    /* Audit 2026-09-26, R1: yuqoridagi M13 qatori (`min-width: 44px`)
       `.menu-chips .chip-row`dagi (mijoz/xodim menyusi kategoriya
       tasmasi) chip'larni SIQIB qo'yardi — qator flex-shrink bilan
       barcha kategoriyani ekranga sig'dirishga urinadi, lekin
       min-width majburlangani uchun matn o'z qutisidan CHIQIB, keyingi
       chip ustiga "minib" ko'rinardi (mas., "Salqin ichimliklar" 90px
       matn 44px qutiga siqilib, qo'shnisi bilan qo'shilib ketardi).
       Bu xatti-harakat aynan yuqoridagi izohda "gorizontal EMAS" deb
       ogohlantirilgan holat — shunchaki `.chip`ga ham tegishli ekan.
       Pastdagi `::after` (faqat vertikal, kenglikka ta'sir qilmaydi)
       bosiladigan maydonni allaqachon kattalashtiradi — shuning uchun
       `min-width`ni butunlay olib tashlaymiz. */
    .chip::after { content: ""; position: absolute; inset: -5px 0; }
}

/* Audit 2026-09-24, M17: ro'yxatlar sahifalanishi (partials/pagination.html). */
.pagination {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-wrap: wrap;
    gap: var(--sp-3);
    margin-top: var(--sp-5);
}
.pagination-info { color: var(--text-muted); font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
.pagination .is-disabled { opacity: .45; pointer-events: none; }
