LoVisual/frontend
loki5512344 e0531eda5e
fix(frontend): session cookie path, browser-language default, avatar crop, EN link previews, topbar logo
- nginx: rewrite the refresh cookie's Path=/auth to /api/auth on the
  production proxy — without this the browser never sent the cookie
  back on POST /api/auth/refresh and the session was lost on reload
- i18n: fallbackLng ru -> en, so only an actual ru browser locale
  defaults to Russian, everything else defaults to English
- index.html: explicit English og:*/twitter:* tags so link previews
  in Discord/etc. don't fall back to the (Russian) meta description
- Avatar upload: pick -> circular crop/reposition/zoom preview ->
  confirm -> upload, instead of uploading the raw file blind
- Topbar: logo pill background removed, pixel-heart mark added next
  to the LoVisual wordmark
- Fixed two tests left stale by the earlier tagline copy change

Claude-Session: https://claude.ai/code/session_01F1M1Jic1wTSn4igUENynmZ
2026-09-28 22:23:28 +02:00
..
public feat(brand): 3D pixel-heart icon and updated site tagline 2026-09-28 22:14:14 +02:00
scripts chore(history): squash 67 commit(s) from 2026-09-25 2026-09-25 20:22:13 +02:00
src fix(frontend): session cookie path, browser-language default, avatar crop, EN link previews, topbar logo 2026-09-28 22:23:28 +02:00
.env.example chore(history): squash 67 commit(s) from 2026-09-25 2026-09-25 20:22:13 +02:00
.gitignore test(frontend): lock the style invariants a QA pass keeps re-finding 2026-09-28 13:27:15 +02:00
.oxlintrc.json chore(history): squash 59 commit(s) from 2026-09-23 2026-09-23 22:38:08 +02:00
ARCHITECTURE.md refactor(frontend): bring shared/ui and pages/public under the 4-file rule 2026-09-28 13:21:18 +02:00
bun.lock chore(history): squash 67 commit(s) from 2026-09-25 2026-09-25 20:22:13 +02:00
index.html fix(frontend): session cookie path, browser-language default, avatar crop, EN link previews, topbar logo 2026-09-28 22:23:28 +02:00
package.json chore(history): squash 67 commit(s) from 2026-09-25 2026-09-25 20:22:13 +02:00
PLAN.md chore(history): squash 67 commit(s) from 2026-09-25 2026-09-25 20:22:13 +02:00
README.md docs: add a real root README and rewrite the frontend one 2026-09-28 17:28:41 +02:00
tsconfig.app.json test(frontend): lock the style invariants a QA pass keeps re-finding 2026-09-28 13:27:15 +02:00
tsconfig.json test(frontend): lock the style invariants a QA pass keeps re-finding 2026-09-28 13:27:15 +02:00
tsconfig.node.json chore(history): squash 67 commit(s) from 2026-09-25 2026-09-25 20:22:13 +02:00
tsconfig.test.json test(frontend): lock the style invariants a QA pass keeps re-finding 2026-09-28 13:27:15 +02:00
vite.config.ts chore(history): squash 67 commit(s) from 2026-09-25 2026-09-25 20:22:13 +02:00

LoVisual Website

The frontend for LoVisual - a marketing site with a live in-game GUI demo, download page, documentation, themes/showcase pages, and an account dashboard with a cloud config manager. UI is fully bilingual (Russian default, English toggle, persisted in the URL).

Stack

  • React 19 + TypeScript + Vite, package manager: bun
  • Tailwind CSS v4 with custom design tokens (radii, glass panels, control sizing)
  • TanStack Query for backend calls, react-router for pages
  • react-i18next - ru/en resources per feature, compile-time key parity via satisfies
  • motion/react for animation, vitest + Testing Library for tests
  • oxlint for linting

Layout

src/
├── app/         router, providers, App shell
├── features/    one folder per domain (account, cloud, demo, themes, ...)
│   └── <f>/     api.ts · i18n/{ru,en}.ts · components/ · tests/
├── pages/       route-level pages composing features
├── shared/      ui primitives, i18n bootstrap, easter eggs, helpers
└── test/        vitest setup and utilities

Feature-folder rules: API calls, translations and components live together; no cross-feature imports except through shared/.

Scripts

bun install        # install dependencies
bun run dev        # dev server on http://localhost:5173 (proxies /api to the backend)
bun run test       # vitest run
bun run build      # tsc -b + vite build → dist/
bun run lint       # oxlint
bun run gen:themes # regenerate theme tokens from the mod palette (scripts/extract-themes.ts)

The dev server expects the Rust gateway on 127.0.0.1:8080 (see backend/); without it, API-backed pages degrade to demo/offline states by design.

Testing

Unit and component tests are colocated in features/*/tests/ and shared/**/tests/; run a single file with bunx vitest run src/features/account/tests/account.test.tsx. Translation parity (ru ↔ en key sets) is enforced at compile time and in tests.