Files
clinicpro/.claude/prompt/admin-ios-safari-css-fallbacks.md
2026-07-02 10:51:48 +03:30

140 lines
8.8 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# رفع بهم‌ریختگی کامل پنل ادمین روی 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.015.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`) — دست نزن.