feat(ui): home shell with a learning catalogue, roadmap briefing page and focused player - #86
Merged
Conversation
…s Projects/Learning pages
# Conflicts: # frontend/src/features/learning/components/RoadmapPlayer.tsx # frontend/src/features/learning/components/StepValidationResults.tsx # frontend/src/locales/en.json # frontend/src/locales/fr.json # frontend/src/pages/ProjectsPage/ProjectsPage.tsx
…he empty canvas at the player
Derssa
approved these changes
Aug 4, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary of Changes
A UI revamp of everything outside the canvas, plus a rework of the learning player's in-canvas surfaces. The goal was to fix the empty-canvas cold start — a new user landed on a bare project list with no idea what the app was for — and to make the guided roadmaps a first-class destination rather than a panel hidden inside a project.
A home shell with two views. The landing page is now a shell with a dark icon rail (
SideRail) switching between Projects and Learning. Projects keeps project CRUD (extracted intoProjectsSection,ProjectCard,ProjectCardSkeleton,PageHeader) and shows aFirstRunHeroonly when the user has no projects yet. Learning is a real catalogue page:LearningHero,RoadmapShowcaseCard,WhyPanel, and aResumeCardthat surfaces the most recent play-through for returning users.A roadmap briefing page. Picking a roadmap opens a detail page (a sub-page of Learning, with a breadcrumb back to the catalogue) before anything is launched: hero, stats strip, architecture preview, prerequisites, step outline, and a "what you'll verify" panel. Everything on it is derived from the roadmap's validators (
roadmapTopology.ts,roadmapChecks.ts) — the v1 roadmap format is unchanged, no authoring burden added. Launching from there routes through aProjectPickerModal(pick an existing project or create one) and carries a session-onlyLearningIntentinto the canvas so the learning panel opens on the right roadmap. The intent is deliberately not persisted — a reload must not replay a past navigation.The player, focused.
RoadmapPlayerdrops the full step list for the current step alone plus aProgressBarand a Skip control. Validation verdicts moved out of the sidebar into a floatingValidationToastportalled over the canvas (StepValidationResultsis deleted), showing one line of detail and a "+N more checks to fix" tail. Step hints are restyled as quiet marginalia — a rule plus monohint 1/2/solutionmarkers — instead of lightbulb cards.Design foundations.
index.cssgains a token layer (spacing, radii, type scale, shadows, rail/scrim colors, per-node accents) and new shared primitives land:Button,Receipt(including a structured checks variant with verdict/context/footer),ProgressBar,Skeleton. A de-flashing pass follows one rule throughout: the accent color means clickable, never decorative; panels are flat; no color on a fact that isn't a status.Backend. One additive endpoint,
GET /api/learning/progress, returning a summary per(projectId, roadmapId)play-through so the catalogue can show cross-project progress. It deliberately never emits the one-shotstoreRecoveredflag — that notice stays with the per-pair read the player uses. Documented indocs/learning-api.md.Full EN/FR coverage for every new string. Dead assets (
hero.png,react.svg) removed.Types of Changes
Verification & Testing
Automated Checks
npm run lintsuccessfully with no errorsnpm run buildsuccessfully with no compilation errorsnpm testsuccessfully (all tests pass)Backend: 35 suites / 390 tests pass,
tscclean, lint clean. Frontend: 26 files / 270 tests pass,tsc -b && vite buildclean, lint reports 0 errors (6no-explicit-anywarnings, all pre-existing onmain). New test files coverProjectsPage,RoadmapDetailPage,ValidationToast,Receipt,roadmapTopology,roadmapChecks,useLearningProgressSummaries, and the new progress endpoint on both controller and service.Manual Verification
Driven against a real backend in a scratch
HOME(so~/.torollostarts empty), with Playwright for the browser flows:Checklist