diff --git a/.claude/skills/redesign-page/SKILL.md b/.claude/skills/redesign-page/SKILL.md new file mode 100644 index 00000000..133c1848 --- /dev/null +++ b/.claude/skills/redesign-page/SKILL.md @@ -0,0 +1,165 @@ +--- +name: redesign-page +description: بازطراحی UI/UX یک صفحه از پنل ادمین ClinicPro از روی URL آن — اسکرین‌شات گرفتن از صفحه، نگاشت URL به فایل سورس، آدیت انحراف‌ها از دیزاین‌سیستم، و بازنویسی صفحه با کامپوننت‌ها و توکن‌های موجود. استفاده کن وقتی کاربر یک URL از /admin می‌دهد و می‌گوید «این صفحه ui/ux خوبی ندارد»، «این صفحه را بازطراحی کن»، «redesign this page»، «این قسمت را درست کن»، یا «screenshot این صفحه». +--- + +# بازطراحی صفحه پنل ادمین ClinicPro + +پنل ادمین یک SPA کلاینت‌ساید است (React 19 + Webpack Encore، سرو شده از `/admin/*`). +یعنی `curl` و فلگ `--screenshot` کروم به درد نمی‌خورند: هر دو روی فرم لاگین می‌نشینند، +چون توکن JWT در `localStorage['clinicpro-auth']` است. + +درایور این skill آن کار را انجام می‌دهد: با API لاگین می‌کند، `localStorage` را seed +می‌کند، بعد ناوبری و اسکرین‌شات می‌گیرد — با CDP روی `WebSocket` نیتیو Node 22، +**بدون هیچ وابستگی npm** (نه playwright، نه puppeteer). + +مسیرها نسبت به `clinicpro/` هستند. + +## پیش‌نیازها + +هیچ نصبی لازم نیست. فقط این دو: + +```bash +ddev describe | head -3 # باید بالا باشد: https://clinic-pro.ddev.site +ls "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" +``` + +کروم در مسیر دیگری است؟ `CHROME_BIN` را ست کن. + +## گردش کار + +### ۱. اسکرین‌شات صفحه فعلی + +```bash +node .claude/skills/redesign-page/driver.mjs shot \ + "https://clinic-pro.ddev.site/admin/appointments" --out /tmp/before.png +``` + +**بعد حتماً تصویر را با ابزار Read باز کن و نگاه کن.** بدون دیدنِ صفحه، بازطراحی +یعنی حدس زدن. + +فلگ‌ها: `--w 1440 --h 900` (سایز ویوپورت)، `--wait 4000` (میلی‌ثانیه صبر برای رندر)، +`--full` (کل صفحه، نه فقط ویوپورت). + +موبایل هم ببین — این پنل RTL و پرجدول است و بیشتر مشکلات ریسپانسیو آنجاست: + +```bash +node .claude/skills/redesign-page/driver.mjs shot \ + "https://clinic-pro.ddev.site/admin/appointments" --w 390 --h 844 --out /tmp/mobile.png +``` + +### ۲. نگاشت URL به سورس + آدیت + +```bash +node .claude/skills/redesign-page/driver.mjs inspect \ + "https://clinic-pro.ddev.site/admin/clinics/41e325c4-e825-4067-8438-5d828ecaee09" +``` + +خروجی واقعی: + +``` +route clinics/:uuid +component ClinicDetailPage +file assets/admin/pages/ClinicDetailPage.tsx +components ConfirmDialog, Modal, PageHeader, SearchableSelect, NotificationMobileCard +lines 1035 + +AUDIT + assets/admin/pages/ClinicDetailPage.tsx:242 hand-rolled overlay — use the shared +``` + +روی هر فایل دلخواه هم مستقیم: + +```bash +node .claude/skills/redesign-page/driver.mjs audit assets/admin/pages/AppointmentsPage.tsx +``` + +### ۳. قبل از نوشتن کد، دیزاین‌سیستم را بخوان + +**منبع حقیقتِ توکن‌ها `assets/admin/styles.css` است** — نه `docs/admin-ui/ui-design-spec.md` +(آن سند قدیمی و پالت بنفشش با کد شیپ‌شده نمی‌خواند). + +```bash +sed -n '/^:root/,/^}/p' assets/admin/styles.css | head -60 # توکن‌ها +ls assets/admin/components/ui/ # کامپوننت‌های آماده +``` + +قانون: **اول کامپوننت موجود، بعد توسعه‌اش، در آخر ساخت کامپوننت جدید** — و دلیلش را بنویس. + +### ۴. بازنویسی، سپس مقایسه + +بعد از ادیت، دوباره اسکرین‌شات بگیر و با `before.png` مقایسه کن: + +```bash +yarn dev # یا: yarn watch +node .claude/skills/redesign-page/driver.mjs shot "<همان url>" --out /tmp/after.png +``` + +### ۵. تست + تایپ‌چک (بدون این، تسک تمام نیست) + +```bash +npx tsc --noEmit -p tsconfig.json +npx vitest run assets/admin/pages/.test.tsx +``` + +توجه: سوییت کامل همین الان **۲۱ تست از پیش شکسته** دارد (`api.test.ts`، `LoginPage`، +`PatientDetailPage`، …) که ربطی به کار تو ندارند. قبل از شروع یک‌بار `npx vitest run` +بگیر و عدد پایه را یادداشت کن، وگرنه خطاهای موجود را به گردن تغییر خودت می‌اندازی. + +## چک‌لیست بازطراحی + +درایور موارد گرپ‌شدنی را می‌گیرد؛ این‌ها را باید خودت با چشم ببینی: + +- **`.field` در مقابل `.field-block`** — `.field` یک باکس افقی بوردردار است که لیبل + *داخلش* می‌نشیند. اگر `