44 Commits

Author SHA1 Message Date
37a01e4d96 fix(ui): mobile layout — no horizontal page scroll, truncate names, scrollable card table
- Page scroll container is overflow-x-hidden so the interface stays fixed; long
  content can no longer push the page wider than the viewport (tree was ~50% cut off).
- CardTable wrapped in overflow-x-auto with a min-width so only the table scrolls
  horizontally on small screens.
- Sublesson and lesson-tree rows get min-w-0 so truncate works in flex; long names
  now ellipsize instead of overflowing. Tree drag handle + hover actions hidden on
  mobile (were unusable via touch anyway), freeing width for the name.
- Lesson detail title wraps and scales down on mobile.
2026-05-21 10:59:55 +02:00
34431331e9 fix(practice): update session counters client-side after each answer
The in-session progress bar reads session.cardsShown/cardsCorrect/cardsIncorrect,
but the session store's answer() never refreshed the session object — the backend
tracked the counters but the client kept the stale start values (all 0), so the bar
appeared frozen. answer() now mirrors the backend's increment locally; end() still
replaces with authoritative server totals. Adds an E2E regression test.
2026-05-21 07:54:15 +02:00
2890e19953 fix(frontend): wrap lesson tree sibling groups in SortableContext for drag feedback 2026-05-21 07:27:12 +02:00
8499c60acb test(e2e): search palette + lesson detail + stats + legacy redirect
Add e2e/ux.spec.ts covering the ⌘K search palette, lesson detail page,
stats sections, and the legacy /admin → /lessons redirect.

Also fixes two issues uncovered by running the full suite:
- Skip auth rate limiter in e2e by running the backend with NODE_ENV=test
  (registration limit of 5 was tripping later tests).
- Render the card table for lesson owners even when the lesson has zero
  cards, so the first card can be added from the detail page.
2026-05-21 07:24:42 +02:00
99c55c1dba chore(frontend): remove obsolete Admin/AdminLesson pages 2026-05-21 07:17:04 +02:00
9928390946 feat(frontend): router restructure /admin → /lessons with redirects 2026-05-21 07:16:17 +02:00
d5dfc0d2db feat(frontend): ⌘K search trigger in layout + /lessons nav 2026-05-21 07:15:02 +02:00
4b9ff4b783 feat(frontend): ⌘K search palette modal 2026-05-21 07:13:50 +02:00
5754bec679 feat(frontend): lessons page with filter (replaces Admin.tsx) 2026-05-21 07:12:27 +02:00
0529e2a5e8 feat(frontend): lesson tree with filter + dnd-kit drag reorder 2026-05-21 07:11:13 +02:00
3254e225e9 feat(frontend): rich lesson detail page 2026-05-21 07:09:26 +02:00
d9b913aab7 feat(frontend): lesson stats panel + sublesson list + recent sessions list 2026-05-21 07:07:46 +02:00
2a6d048b65 feat(frontend): rewritten stats page with heatmap + progress + due 2026-05-21 07:06:37 +02:00
4c2d42779f feat(frontend): due-overview card with start-review CTA 2026-05-21 07:05:35 +02:00
a10d02cbaf feat(frontend): lesson progress list with sorting 2026-05-21 07:04:34 +02:00
5df6b240d9 feat(frontend): 12-month heatmap component 2026-05-21 07:03:50 +02:00
ab382a2c62 feat(frontend): API clients for search + stats extensions + due session 2026-05-21 07:02:57 +02:00
44622442de feat(frontend): marketplace route 2026-05-21 00:40:31 +02:00
9fdadca529 feat(dashboard): subscriptions section 2026-05-21 00:39:36 +02:00
6a65c5cf96 feat(frontend): marketplace page with subscribe + fork 2026-05-21 00:38:20 +02:00
3356767d21 feat(admin): visibility toggle, fork/unsubscribe, readonly CardTable for subscribers 2026-05-21 00:36:51 +02:00
7eabd667ce feat(frontend): lesson badges + marketplace nav link 2026-05-21 00:34:31 +02:00
01f7df3735 feat(frontend): API for visibility/fork/subscribe/marketplace/curated 2026-05-21 00:32:50 +02:00
e27c1ca06c chore(auth): non-blocking follow-ups from final review
- /api/stats: add verifyCsrf middleware (defense-in-depth; no-op for GETs)
- VerifyEmailPage: useRef guard to prevent React StrictMode double-fire of
  the single-use verify token in dev
- router.tsx: route-level code splitting via React.lazy + Suspense; initial
  bundle drops from 397 KB to 224 KB with per-route chunks (0.3–14 KB each)
- e2e: wait for verify-email completion before login; bump Account-menu
  timeout to handle Vite cold-chunk compile
2026-05-20 23:27:52 +02:00
5739b6d941 test(e2e): register+verify smoke and admin invite flow via Mailpit 2026-05-20 23:19:56 +02:00
28bb903b93 feat(frontend): router with auth boundary, role guard, and all auth pages 2026-05-20 23:12:59 +02:00
117cd52e3e feat(frontend): admin users page (invite, role, activate, send-reset) 2026-05-20 23:11:53 +02:00
88ba0a790c feat(frontend): profile page (display name, email, change password) 2026-05-20 23:10:28 +02:00
1850cd78f5 feat(frontend): VerifyEmail + ForgotPassword + ResetPassword + AcceptInvite pages 2026-05-20 23:09:04 +02:00
4e15d8b59d feat(frontend): Login + Register pages 2026-05-20 23:07:19 +02:00
6f921ae44e feat(frontend): AuthBoundary, RoleGuard, UserMenu + Layout integration 2026-05-20 23:05:36 +02:00
bd74098786 feat(frontend): authStore (Zustand) 2026-05-20 23:03:43 +02:00
eb540c2cd8 feat(frontend): API client CSRF support + auth and admin-users API modules 2026-05-20 23:02:47 +02:00
b984e83e2b feat(frontend): apply UI/UX design system - purple/green palette, gradient buttons, 3D flip, polished pages
Applied ui-ux-pro-max design system recommendations:
- Tailwind theme: study purple primary + correct green accent
- Inter + Plus Jakarta Sans typography
- Glassmorphic surfaces with soft shadows and mesh background
- Real 3D card flip with spring physics + answer feedback flash
- Gradient stat cards, progress bar, animated done screen with score ring
- Polished Layout, Dashboard, Admin, AdminLesson, CardTable, ImportDialog, PracticeSetup, Practice, PracticeDone
- E2E smoke updated for new accessible names
2026-05-20 21:48:47 +02:00
f88b4d57de test(e2e): playwright smoke for create→practice flow 2026-05-20 21:29:51 +02:00
b1992d0dad feat(frontend): resume active session prompt 2026-05-20 21:26:09 +02:00
f1abb64573 feat(frontend): settings page with dark mode and defaults 2026-05-20 21:24:12 +02:00
289a58fac0 feat(frontend): dashboard and stats pages 2026-05-20 21:22:44 +02:00
2444e2400f feat(frontend): practice setup, session and done flow 2026-05-20 21:20:30 +02:00
16a7cc6ad6 feat(frontend): admin card management with excel import/export 2026-05-20 21:17:55 +02:00
1fd31e1001 feat(frontend): admin lesson tree CRUD 2026-05-20 21:15:54 +02:00
1d501ee50a feat(frontend): zustand stores for settings, lessons, session 2026-05-20 21:14:20 +02:00
1c977c4743 feat(frontend): API client modules + backend GET /api/cards/:id 2026-05-20 21:12:38 +02:00
480ee15df9 feat(frontend): bootstrap React + Vite + Tailwind + Router + Layout 2026-05-20 21:10:27 +02:00