From 1c4f2a24515bd664b1b1abb7889ca743cd6aa351 Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Sun, 2 Aug 2026 14:27:23 +0330 Subject: [PATCH] chore(skill): make redesign-page a real UI/UX review harness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The skill's driver could not log in any more: its default credentials were a user the scenario seeder wiped, so every command died on ERR_AUTH_005 before taking a single screenshot. Defaults now point at a user the seeder actually creates, and the failure message says how to rebuild the users. A page was also being judged on one screenshot. Dark mode and compact density are real settings in this panel and mobile is where an RTL, table-heavy admin breaks, so `variants` now captures all four and the theme is written to the ui store rather than only stamped on the element — the attribute alone is overwritten at hydrate. Narrow shots enable device metrics, without which pointer:coarse media queries never fire and the 44px touch targets stay invisible. Every shot now probes the live DOM for the things no grep can see: horizontal overflow, nameless icon buttons, unlabelled fields, controls under 32px. The static audit gained Gregorian dates, native date inputs, icon buttons with no aria-label, and .seg without an on/active class. `ds` prints the tokens and the shared components with their props, so a redesign starts from what exists instead of inventing a second Modal. Also corrected a stale claim: the suite has no pre-broken tests — it is 100 files / 660 passing. Co-Authored-By: Claude Opus 5 --- .claude/skills/redesign-page/SKILL.md | 211 ++++++++++++++--------- .claude/skills/redesign-page/driver.mjs | 215 ++++++++++++++++++++++-- 2 files changed, 333 insertions(+), 93 deletions(-) diff --git a/.claude/skills/redesign-page/SKILL.md b/.claude/skills/redesign-page/SKILL.md index 133c1848..893ffaae 100644 --- a/.claude/skills/redesign-page/SKILL.md +++ b/.claude/skills/redesign-page/SKILL.md @@ -1,165 +1,220 @@ --- name: redesign-page -description: بازطراحی UI/UX یک صفحه از پنل ادمین ClinicPro از روی URL آن — اسکرین‌شات گرفتن از صفحه، نگاشت URL به فایل سورس، آدیت انحراف‌ها از دیزاین‌سیستم، و بازنویسی صفحه با کامپوننت‌ها و توکن‌های موجود. استفاده کن وقتی کاربر یک URL از /admin می‌دهد و می‌گوید «این صفحه ui/ux خوبی ندارد»، «این صفحه را بازطراحی کن»، «redesign this page»، «این قسمت را درست کن»، یا «screenshot این صفحه». +description: نقد و بازطراحی حرفه‌ای UI/UX یک صفحه از پنل ادمین ClinicPro از روی URL آن — اسکرین‌شات در چهار نما (روشن، تیره، فشرده، موبایل)، پروبِ دسترسی‌پذیری روی DOM زنده، نگاشت URL به فایل سورس، آدیت انحراف از دیزاین‌سیستم، و بازنویسی با کامپوننت‌ها و توکن‌های موجود. استفاده کن وقتی کاربر یک URL از /admin می‌دهد و می‌گوید «این صفحه ui/ux خوبی ندارد»، «این صفحه را بازطراحی کن»، «این صفحه را نقد کن»، «redesign this page»، «UI/UX review»، «این قسمت را درست کن»، یا «screenshot این صفحه». --- -# بازطراحی صفحه پنل ادمین ClinicPro +# نقد و بازطراحی صفحهٔ پنل ادمین ClinicPro + +نقش: متخصص ارشد UI/UX. هدف **بهبود تجربهٔ کاربری در چهارچوب تم فعلی** است، نه ساختن +هویت بصری جدید. هر تغییری که با دیزاین‌سیستم فعلی ناسازگار باشد، رد است. پنل ادمین یک SPA کلاینت‌ساید است (React 19 + Webpack Encore، سرو شده از `/admin/*`). یعنی `curl` و فلگ `--screenshot` کروم به درد نمی‌خورند: هر دو روی فرم لاگین می‌نشینند، -چون توکن JWT در `localStorage['clinicpro-auth']` است. - -درایور این skill آن کار را انجام می‌دهد: با API لاگین می‌کند، `localStorage` را seed -می‌کند، بعد ناوبری و اسکرین‌شات می‌گیرد — با CDP روی `WebSocket` نیتیو Node 22، -**بدون هیچ وابستگی npm** (نه playwright، نه puppeteer). +چون توکن 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` را ست کن. +کروم جای دیگری است؟ `CHROME_BIN` را ست کن. ## گردش کار -### ۱. اسکرین‌شات صفحه فعلی +### ۰. اول دیزاین‌سیستم را بخوان — قبل از هر چیز + +**منبع حقیقتِ توکن‌ها `assets/admin/styles.css` است**، نه `docs/admin-ui/ui-design-spec.md` +(آن سند قدیمی است و پالت بنفشش با کد شیپ‌شده نمی‌خواند). ```bash -node .claude/skills/redesign-page/driver.mjs shot \ - "https://clinic-pro.ddev.site/admin/appointments" --out /tmp/before.png +node .claude/skills/redesign-page/driver.mjs ds # توکن‌ها + کلاس‌ها + کامپوننت‌ها +node .claude/skills/redesign-page/driver.mjs ds tokens # فقط توکن‌ها +node .claude/skills/redesign-page/driver.mjs ds components # فقط کامپوننت‌های مشترک با Props ``` -**بعد حتماً تصویر را با ابزار Read باز کن و نگاه کن.** بدون دیدنِ صفحه، بازطراحی -یعنی حدس زدن. +خروجی واقعی: `TOKENS (57)` و `SHARED COMPONENTS (26)`. قانون ترتیب: +**اول کامپوننت موجود، بعد توسعه/عمومی‌کردنش، در آخر ساخت کامپوننت جدید** — و دلیلش را بنویس. -فلگ‌ها: `--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 +node .claude/skills/redesign-page/driver.mjs variants \ + "https://clinic-pro.ddev.site/admin/resources" --dir /tmp/clinicpro-review ``` -### ۲. نگاشت URL به سورس + آدیت +چهار فایل می‌سازد: `-light` · `-dark` · `-compact` · `-mobile`. **هر چهار را با ابزار +Read باز کن و نگاه کن.** قضاوت با یک اسکرین‌شات یعنی صفحه‌ای که در سه نمای دیگر خراب است. +تم تیره و تراکم فشرده در این پنل تنظیمات واقعی کاربرند، نه فرض. + +تک‌نما: ```bash -node .claude/skills/redesign-page/driver.mjs inspect \ - "https://clinic-pro.ddev.site/admin/clinics/41e325c4-e825-4067-8438-5d828ecaee09" +node .claude/skills/redesign-page/driver.mjs shot "" --out /tmp/x.png \ + --theme dark --density compact --w 390 --h 844 --full --wait 6000 +``` + +فلگ‌ها: `--w/--h` ویوپورت · `--wait` میلی‌ثانیه · `--full` کل صفحه · +`--theme light|dark` · `--density comfortable|compact` · `--context clinic|personal` · +`--no-probe`. + +هر `shot` یک **پروب رانتایم** هم می‌زند که فقط روی DOM رندرشده دیدنی است: + +``` +RUNTIME + ⚠ 2 form field(s) with no label +``` + +چه چیزهایی می‌گیرد: سرریز افقی، دکمهٔ آیکونیِ بی‌نام (بدون `aria-label`/`title`)، +فیلد بدون لیبل، و کنترل کوتاه‌تر از ۳۲px (هدف لمسی ۴۴px است). + +### ۲. نگاشت URL به سورس + آدیت ایستا + +```bash +node .claude/skills/redesign-page/driver.mjs inspect "https://clinic-pro.ddev.site/admin/resources" ``` خروجی واقعی: ``` -route clinics/:uuid -component ClinicDetailPage -file assets/admin/pages/ClinicDetailPage.tsx -components ConfirmDialog, Modal, PageHeader, SearchableSelect, NotificationMobileCard -lines 1035 +route resources +component ResourcesPage +file assets/admin/pages/ResourcesPage.tsx +components PageHeader, DataTable, ResourceBlocksModal, ConfirmDialog, SearchableSelect, … +lines 278 +test assets/admin/pages/ResourcesPage.test.tsx -AUDIT - assets/admin/pages/ClinicDetailPage.tsx:242 hand-rolled overlay — use the shared +AUDIT clean ``` -روی هر فایل دلخواه هم مستقیم: +روی هر فایل مستقیم: ```bash -node .claude/skills/redesign-page/driver.mjs audit assets/admin/pages/AppointmentsPage.tsx +node .claude/skills/redesign-page/driver.mjs audit assets/admin/pages/ClinicDetailPage.tsx +# AUDIT +# assets/admin/pages/ClinicDetailPage.tsx:242 hand-rolled overlay — use the shared ``` -### ۳. قبل از نوشتن کد، دیزاین‌سیستم را بخوان +آدیت این‌ها را می‌گیرد: `, hardcoded hex, dead tokens, …). + * `shot` logs in over the API, seeds localStorage['clinicpro-auth'], then + * navigates and captures. Needed because the admin is a client-side + * SPA: Chrome's plain `--screenshot` flag lands on the login form. + * `variants` runs `shot` four times — light desktop, dark, compact, 390px mobile. + * A redesign judged on one screenshot ships a page that breaks in the + * other three; dark mode and compact density are real user settings + * here, not hypotheticals. + * `inspect` maps a URL to the route entry in App.tsx, the page source file, and + * the design-system components it already imports. + * `audit` greps one source file for the anti-patterns this project keeps + * regrowing (native