change style css

This commit is contained in:
hamed
2026-07-02 10:51:48 +03:30
parent 6d594822bf
commit fb90e447d8
13 changed files with 6704 additions and 2068 deletions
@@ -0,0 +1,139 @@
# رفع بهم‌ریختگی کامل پنل ادمین روی 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`) — دست نزن.