Skip to content

front (legacy learner app)

Generated from front/README.md

The learner front-end: course catalogue, course pages, the lesson player for every topic type, quizzes, certificates, profile, cart and the per-tenant landing pages. React 18 + Vite, styled with CSS Modules and the --ulams-* theme variables.

From the repository root (with the API stack running, see the root README):

Terminal window
corepack yarn dev:front # http://localhost:3000 (platform) and http://<tenant>.app.localhost
Path What
src/pages/ Routes; pages/landing/{coffee,oncall,nightsky} are the experience landing pages
src/components/ App components (course player, profile, consultations, webinars, cart, …)
src/lib/components Component library (@ulams/components), theme presets and CSS-variable contract (theme/README.md)
src/lib/sdk API client and React context (@ulams/sdk)
src/lib/ts-models API types (@ulams/ts-models)
src/lib/tenant Resolves the tenant API from the browser host (@ulams/tenant)
src/lib/scorm-player SCORM runtime (shared with admin)
tests/ Unit tests (node --test) and the visual regression harness (tests/visual)
docs/ Retroactive ADRs and the design briefs (docs/design)

.env.example lists the variables. The API URL comes from a runtime-injected value, then the host rule VITE_APP_TENANT_API_HOST_PATTERN (default {slug}.app.localhost=>http://{slug}.localhost), then the build-time VITE_APP_PUBLIC_API_URL.

  • No styled-components and no GPL imports (@lumieducation/*); both are blocked by lint (yarn lint, scripts/check-no-gpl-imports.cjs).
  • Learner-facing UI meets WCAG 2.2 AA.
  • H5P is embedded as an iframe served by api/h5p (players/H5Player).