# رفع بهم‌ریختگی کامل پنل ادمین روی iPhone 8 (Safari/Chrome iOS)

## پروژه

`clinicpro` (فقط CSS پنل ادمین React — بدون تغییر backend یا API)

## زمینه

پنل ادمین (`https://clinic-pro.ddev.site/admin`) روی دسکتاپ و موبایل‌های جدید درست است، اما روی **iPhone 8** با **هر دو مرورگر Chrome و Safari** کامل بهم‌ریخته دیده می‌شود (رنگ‌ها، پس‌زمینه‌ها، دکمه‌ها، بوردرها خراب).

نکته کلیدی: Chrome روی iOS هم از موتور **WebKit** استفاده می‌کند (نه Blink). پس «هر دو مرورگر خراب» یعنی مشکل از **موتور WebKit قدیمیِ iPhone 8** است، نه مرورگر. iPhone 8 حداکثر به iOS 16.7 می‌رسد و بسیاری از کاربران روی iOS ۱۵.x یا ۱۶.۰–۱۶.۱ می‌مانند.

## مشکل / هدف

استایل پنل به‌شدت به توابع رنگ مدرن CSS وابسته است که روی WebKit قدیمی پشتیبانی نمی‌شوند و مقدارشان **نامعتبر** می‌شود → مرورگر مقدار را دور می‌ریزد → رنگ به transparent/سیاه/ارثی می‌افتد → کل UI بهم می‌ریزد:

- **`oklch()`** — فقط Safari ‏15.4+ . روی iOS ‏15.0–15.3 خراب.
- **`color-mix()`** — فقط Safari ‏16.2+ . روی iOS ‏15.x و ‏16.0/16.1 خراب. (**۳۰ مورد** در فایل)
- **Tailwind v4** — رسماً فقط Safari ‏16.4+ را هدف می‌گیرد (`@property`, cascade layers, oklch). روی iPhone 8 قدیمی base/reset ناقص اجرا می‌شود.

هدف: افزودن fallback رنگ sRGB و گارد `@supports` تا پنل روی WebKit قدیمی هم صحیح رندر شود (progressive enhancement — روی مرورگر جدید دقیقاً مثل الان بماند).

## فایل‌های مرتبط

| فایل | نقش |
|------|-----|
| `clinicpro/assets/admin/styles.css` | تمام متغیرهای رنگ + ۳۰ مورد `color-mix` + `oklch` |
| `clinicpro/templates/admin/index.html.twig` | shell پنل (viewport موجود و درست) |
| `clinicpro/package.json` | Tailwind v4 (`tailwindcss@^4`, `@tailwindcss/postcss@^4`) |

## وضعیت فعلی

هیچ fallback و هیچ `@supports` وجود ندارد (`grep -c "@supports" = 0`).

متغیرهای رنگ فقط با `oklch` تعریف شده‌اند (خط ۳۰ و ۸۵):

```css
/* :root روشن */
--primary:       oklch(0.55 var(--brand-c) var(--brand-h));
--primary-600:   oklch(0.49 var(--brand-c) var(--brand-h));
--primary-700:   oklch(0.43 var(--brand-c) var(--brand-h));
--primary-soft:  oklch(0.95 0.03 var(--brand-h));
--primary-soft2: oklch(0.90 0.05 var(--brand-h));
--ring:          color-mix(in oklch, var(--primary) 32%, transparent);
```

تم تیره (خط ۸۵+) کلاً روی `color-mix` سوار است → روی iOS قدیمی کامل خراب:

```css
[data-theme="dark"] {
  --primary:      oklch(0.66 var(--brand-c) var(--brand-h));
  --primary-soft: color-mix(in oklch, var(--primary) 16%, var(--surface));
  --success-bg:   color-mix(in oklch, var(--success) 18%, var(--surface));
  --warning-bg:   color-mix(in oklch, var(--warning) 18%, var(--surface));
  /* ... danger-bg, info-bg, violet-bg, accent-bg, stat-*-bg همه color-mix */
}
```

استفاده inline در قوانین (خط ۴۶۹–۴۷۳ و بلوک settings جدید):

```css
.appt-status.status-green  { border-color: color-mix(in srgb, var(--success) 25%, transparent); }
.toggle-row.on             { border-color: color-mix(in oklch, var(--primary) 40%, var(--border)); }
.save-bar.ok               { border-color: color-mix(in oklch, var(--success) 45%, var(--border)); }
.gw-card ...               /* و موارد مشابه */
```

## وظایف

### ۱. fallback هگز sRGB برای متغیرهای رنگِ مبتنی بر oklch

برای هر متغیری که با `oklch()` تعریف شده، یک خط هگز sRGB **قبل** از خط oklch بگذار. مرورگر قدیمی خط oklch را نامعتبر می‌بیند و خط هگز قبلی را نگه می‌دارد؛ مرورگر جدید oklch را استفاده می‌کند.

الگو (در `:root` روشن):

```css
:root {
  /* primary = تقریب sRGB از brand-h:256 brand-c:0.15 */
  --primary:       #5b5ef0;  /* fallback */
  --primary:       oklch(0.55 var(--brand-c) var(--brand-h));
  --primary-600:   #4a4dd6;  /* fallback */
  --primary-600:   oklch(0.49 var(--brand-c) var(--brand-h));
  --primary-700:   #3d40b8;  /* fallback */
  --primary-700:   oklch(0.43 var(--brand-c) var(--brand-h));
  --primary-soft:  #eceafd;  /* fallback */
  --primary-soft:  oklch(0.95 0.03 var(--brand-h));
  --primary-soft2: #d9d5fb;  /* fallback */
  --primary-soft2: oklch(0.90 0.05 var(--brand-h));
  --ring:          rgba(91,94,240,.32);  /* fallback */
  --ring:          color-mix(in oklch, var(--primary) 32%, transparent);
}
```

- مقادیر هگز باید چشمی به رنگ oklch نزدیک باشند (با ابزار تبدیل oklch→sRGB بگیر؛ `--brand-h: 256`, `--brand-c: 0.15`).
- همین کار را برای **تم تیره** (`[data-theme="dark"]`) تکرار کن: `--primary`, `--primary-600/700`, و همه `*-soft`/`*-bg` که با color-mix ساخته شده‌اند، هرکدام یک هگز fallback قبل از خط color-mix بگیرند (رنگ تیره مناسب سطح تیره).

### ۲. fallback برای color-mix در قوانین inline

هرجا `color-mix()` مستقیم داخل یک قانون استفاده شده (نه در تعریف متغیر)، یک خط رنگ ساده **قبل** از آن بگذار:

```css
.appt-status.status-green {
  border-color: rgba(21,163,90,.25);              /* fallback */
  border-color: color-mix(in srgb, var(--success) 25%, transparent);
}
.toggle-row.on {
  border-color: var(--border-2);                  /* fallback */
  border-color: color-mix(in oklch, var(--primary) 40%, var(--border));
}
.save-bar.ok {
  border-color: var(--success);                   /* fallback */
  border-color: color-mix(in oklch, var(--success) 45%, var(--border));
}
```

- کل ۳۰ مورد `color-mix` را پیدا کن (`grep -n "color-mix" assets/admin/styles.css`) و برای هرکدام fallback مناسب اضافه کن.
- `color-mix(in srgb, ...)` هم روی iOS < 16.2 خراب است؛ پس این‌ها هم باید fallback بگیرند.

### ۳. تصمیم درباره Tailwind v4

Tailwind v4 فقط Safari 16.4+ را هدف می‌گیرد. بررسی کن پنل چقدر به utilityهای Tailwind وابسته است (به‌نظر کم — بیشتر استایل‌ها inline یا کلاس‌های design-system سفارشی‌اند: `grep -rho 'className="[^"]*"' assets/admin | grep -oE '(flex|grid|text-|bg-|p-[0-9]|gap-|rounded)'`).

- اگر وابستگی کم بود: کافی است وظیفه ۱ و ۲ انجام شود؛ مشکل اصلی رنگ‌هاست.
- اگر جایی از رنگ‌های Tailwind (`bg-*`, `text-*`) استفاده شده که oklch تولید می‌کنند و روی iOS قدیمی خرابند، همان‌ها را با کلاس design-system سفارشی (که حالا fallback دارد) جایگزین کن.
- در فایل پرامپت خروجی، حداقل نسخهٔ پشتیبانی‌شده را مستند کن.

### ۴. تست

- با Safari دسکتاپ: Develop → Enter Responsive Design Mode → iPhone 8 و نسخه‌ی WebKit قدیمی؛ یا BrowserStack با iOS 15.x.
- چک کن: رنگ primary دکمه‌ها، پس‌زمینه کارت‌ها، بوردرها، تم تیره، chipهای وضعیت، صفحه `/admin/settings` (toggleها و gw-cardها).
- مطمئن شو روی مرورگر جدید هیچ تغییری در ظاهر ایجاد نشده (fallback فقط روی قدیمی فعال می‌شود).

## نکات مهم

- **ترتیب اعلان‌ها حیاتی است:** خط fallback باید *قبل* از خط مدرن بیاید. CSS اعلان نامعتبر را دور می‌ریزد و آخرین اعلانِ معتبر را نگه می‌دارد.
- تغییر فقط در `assets/admin/styles.css` (و در صورت نیاز جزئی در twig برای `theme-color`). backend/API دست نخورد → نیاز به migration یا آپدیت `docs/api/` نیست.
- بعد از تغییر CSS: `ddev exec yarn dev` بزن و کامپایل موفق را تأیید کن (خطای شناخته‌شدهٔ `lightningcss.linux-arm64-gnu` روی ddev بی‌ربط است).
- مراقب باش fallbackها با تم تیره تداخل نکنند؛ `[data-theme="dark"]` مقادیر خودش را دارد و باید fallback تیره بگیرد نه روشن.
- viewport در twig درست است (`width=device-width, initial-scale=1`) — دست نزن.
