140 lines
8.8 KiB
Markdown
140 lines
8.8 KiB
Markdown
# رفع بهمریختگی کامل پنل ادمین روی 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`) — دست نزن.
|