8.4 KiB
8.4 KiB
frontend-designer — MEMORY (L1 HOT)
8th sub-agent (S47, 2026-06-02). Role: FE design/UX/aesthetic cho 2 app SOLUTION_ERP. Floor FD1–FD10 (AI_INFRA canonical, KHÔNG hạ). Forked
frontend-designer.agent.template.md.
Role + boundary
- MINE: FE design/UX/redesign —
fe-admin/src/**+fe-user/src/**styling/component/page/design-system/a11y/responsive/micro-interaction. Design-by-code (React/Tailwind/shadcn), KHÔNG Figma. - NOT MINE: BE/DB/business-logic (implementer-backend) · cookie-cutter mechanical mirror theo spec (implementer-frontend — KHÔNG double-touch cùng file UI) · test (test-specialist).
- store_memory GỠ (broadcast 2026-06-02) → ghi finding/token/component vào FILE NÀY; em main + re-index đưa vào RAG.
SE design-system (FD1 — DÙNG, KHÔNG reinvent) — VERIFIED S47
- Brand primary
#1F7DC1· font Be Vietnam Pro (Vietnamese diacritics) · Tailwind tokens · ERP shell (TopBar + Bell + UserMenu). - ⚠️ Token source = Tailwind v4 CSS-first (NO
tailwind.config.jsfile — template path stale). Tokens live infe-user/src/index.css@theme{}block (mirrorfe-admin/src/index.css). Read TRƯỚC khi build.- Brand scale
--color-brand-50..900;--color-brand-600 = #1f7dc1(exact logo). Accent red--color-accent-500/600(from ® mark). Be Vietnam Pro + JetBrains Mono via Google Fonts@importin index.css. body 14px / lh 1.55 / letter-spacing -0.003em.
- Brand scale
- UI primitives are hand-rolled cva (NOT vanilla shadcn copy):
fe-user/src/components/ui/{Button,Input,Label}.tsx. Button variants primary/secondary/outline/ghost/danger × sm/md/lg; focus-visible ring brand-500 + disabled:opacity-50 already wired. Input has focus-visible border-brand-500 + ring. REUSE these, don't reinvent. - Stack: React 19 + Vite 8 + TS 6 + TanStack Query + lucide-react + sonner. Node v22 local (engines
>=20). - UI 100% tiếng Việt · Named export (trừ App) · TS6
const X = {...} as constthay enum · PageHeader chỉ {title, description, actions} · Duplicate 2 app CÓ CHỦ ĐÍCH (§3.9).
FD2 visual-verification rig (SE-specific) — ✅ VERIFIED RAN end-to-end S47
- Dev:
cd fe-admin && npm run dev→ :8082 (proxy /api→:5443) ·cd fe-user && npm run dev→ :8080. - Auth: ERP behind login — token localStorage
solution-erp-admin-token/solution-erp-user-token. Authed page screenshot cần API+SQL chạy + login fixture (seed JWT). Public/loginchụp trực tiếp. - PROVEN rig (
webapp-testingskill = Python Playwright, NOT npm @playwright/test):- Bash tool is POSIX bash despite env "PowerShell" note → use
cd "abs/path"(NOcd /d). Forward-slash Windows paths work. - Chromium for Testing already installed (
C:\Users\pqhuy\AppData\Local\ms-playwright\chromium-1223). Python 3.11 +playwrightbinding present & drives headless OK. NO install needed. - Run pattern:
python <skill>/scripts/with_server.py --server "npm run dev" --port 8080 --timeout 90 -- python my_shot.py(helper starts/stops dev). Write my_shot.py in fe-user dir, delete after (throwaway, not app code). - Screenshot:
browser.new_page(viewport={w,h}, device_scale_factor=2)→page.screenshot(full_page=True)→ Read PNG to NHÌN.
- Bash tool is POSIX bash despite env "PowerShell" note → use
- 🪲 2 Vite-dev gotchas (cost me 2 failed runs): (1)
wait_until="networkidle"NEVER fires — Vite HMR websocket stays open → usedomcontentloaded+wait_for_selector("form"). (2) FIRST goto after cold server triggers Vite dep-optimize compile (>15s) → add a warm-up goto with 60s timeout before the viewport loop, else first viewport times out.- 🪲 (3) Authed-page (Dashboard…) S55 BLOCKER:
dotnet runAPI binds HTTPS :5443 + HTTP :5444 (Program.cs overridesASPNETCORE_URLS), nhưngvite.config.tsproxy target =http://localhost:5443→ protocol mismatch → /api login fail → kẹt /login. ĐỂ chụp authed: temp-set proxyhttps://localhost:5443(secure:falsesẵn) + restart Vite + REVERT sau; HOẶC run API HTTP-only. + Dashboard = ProtectedRoute (cần JWT) → Playwright login THẬT (filladmin@solutions.com.vn/Admin@123456+ submit + wait url≠/login). S55 rig này chặn cả designer + em main → đáng tin nhất = deploy prod rồi login thật xem authed pages (đừng vật lộn dev-rig cho authed screenshot).
- 🪲 (3) Authed-page (Dashboard…) S55 BLOCKER:
- Fallback khi stack chưa chạy: static component preview / screenshot
/login— KHÔNG bỏ soi (FD2 cấm ship-unseen).
Component inventory (built/verified — chống reinvent)
fe-user/src/pages/LoginPage.tsx— login (public, no auth). Layout: gradient bg + 2 blur blobs + centeredmax-w-mdcard (bg-white/90 backdrop-blur) → logo / brand eyebrow / subtitle / Email+Mật khẩu / full-width Đăng nhập. Uses ui/{Button,Input,Label}. Solid baseline; nearly identical in fe-admin (mirror candidate).
Anti-slop catches + rubric verdicts
- LoginPage (S47): rubric PASS. Anti-generic ✓ (brand #1F7DC1 NOT default-blue, no emoji, lucide-ready, purposeful palette). Fix applied: subtitle "Đăng nhập để tiếp tục"
text-slate-500→text-slate-600(borderline ~4.6:1 over translucent card → solid ~7.5:1, FD5 contrast floor). 1-line, no layout shift, on-scale (FD1). Screenshots:/tmp/fd2-login-shots/login-{before,after}-{mobile-375,desktop-1440}.png.- ⚠️ fe-admin parity follow-up: same subtitle likely
text-slate-500in fe-admin LoginPage — apply same bump next fe-admin touch (did NOT touch fe-admin this run; scope-disciplined). - Minor noted (NOT fixed, out of bounded scope): 2
blur-3xlblobs barely visible at 1440 = render cost ~0 payoff; eyebrowtracking-[0.2em]heavy. Candidates if login redesign requested.
- ⚠️ fe-admin parity follow-up: same subtitle likely
Activity log
- S58 (2026-06-11) fe-user redesign theo UI/UX guide AI_INFRA canonical — KEEP brand [em main proxy — truncated #53 giữa FD2 screenshot, 2nd consecutive]: Mirror design-system fe-admin S55 → 14 file fe-user (index.css heading-ladder+.label-eyebrow / 6 ui primitives — Button gần SHA-identical fe-admin chỉ khác comment / 6 shell DataTable+RowActions-additive·Layout-brand-left-rail·TopBar·PageHeader·PhaseBadge-ring·EmptyState / LoginPage polish). Rubric mới = guide 13 mục
D:\Dropbox\CONG_VIEC\AI_INFRA\docs\reference\ui-ux-design-guide.md(density 14px/h32-34/radius-8/thead-sticky/action-luôn-hiện/no-font-bold). BRAND KEPT: #1F7DC1 + Be Vietnam Pro + slate (guide cho plug hue riêng). Chết NGAY TRƯỚC with_server.py screenshot /login → em main recover: build ×2 PASS 0 TS + diff-review key-stability từng file + shipe959f72; authed visual qua deploy prod (rig-gotcha #3 standing). LESSON: 2 lần liên tiếp truncate ở CÙNG điểm (sau khi sửa xong, lúc bắt đầu FD2 rig) → lần sau EMIT file-list verdict TRƯỚC khi vào screenshot loop. Tag [s58, fe-user-redesign, guide-aiinfra, keep-brand, truncated-53-proxy]. - S55 (2026-06-09) Phase-1 fe-admin redesign — density-first NAMGROUP-ref, KEEP brand [em main proxy — designer truncated gotcha #53 trước build/MEMORY]: Applied 14 file: index.css (density heading ladder semibold +
.label-eyebrow11px uppercase slate-500 + drop font-bold) + 6 ui primitives (Buttontext-xs font-semibold rounded-lgh-7/8/10 + brand focus-ring/70 — variant/size keys STABLE 51 call-sites) + 6 shell (DataTable/Layout/TopBar/PageHeader/PhaseBadge/EmptyState) + DashboardPage (KPI cardrounded-lg border-slate-200+bg-brand-50icon chip h-7w7 + uppercase tracking-wider label + brand accent bar). Brand #1F7DC1 + Be Vietnam Pro KEPT (NAMGROUP density = mượn cấu trúc, brand=ours).npm run build0 TS err. Visual loop BLOCKED by authed-rig gotcha (3) above → CHỈ chụp /login (polished, on-brand). em main recover: build ✓ + login-visual ✓ + diff-review (index.css/Button/DashboardPage high-quality, brand-consistent). User chọn commit+deploy → login prod xem authed. Tag [s55, phase1-redesign, density-namgroup, keep-brand, authed-rig-blocked]. - S47 (2026-06-02) FD2 RIG VERIFIED ✅ — first real spawn. Ran full FD2 loop end-to-end on fe-user
/login: read DS (Tailwind v4 CSS-first, corrected stale config-path assumption) → started Vite viawith_server.py→ Playwright screenshot 375+1440 → Read PNGs → FD4 critique → 1-line contrast fix → re-screenshot confirmed →npm run build0 TS error. Closes adap-report2026-06-02-Agent-frontend-designer-floorFD2 runtime proof. 2 Vite gotchas captured above. Loop is REAL, not theoretical.