Changelog¶
Format: Keep a Changelog + Semantic Versioning — see the Changelog section of the docs site for details.
[1.0.0] "WorldWake" - 2026-07-24¶
Added¶
- Initial scaffold of the Tamiyo Scroll frontend (React 19, TypeScript, Vite, React Router, TanStack Query, Zod, TailwindCSS, shadcn/ui components).
- Authentication flow: login page, self-registration email verification
page, and a
ProtectedRouteguard backed by a session store consuming thebarrins_api/api/v1/authendpoints. - Metagame tab: personal decks list with Moxfield decklist import, a meta/opponent deck roster, and aggregated archetype/matchup statistics sections.
- Suivi BO3 tab: match journal, new-match form, and card-test feedback section, backed by the BO3 match log and card-test BFF endpoints.
- Decklist tab: current decklist view (colored by card-test feedback) and version history section.
- Read-only "viewing owner" selector (header) and
active-deck-contextfor sharing another user's data without allowing edits, per the BFF's read-only sharing settings. - App shell layout with tab navigation, and a centralized typed API
client (
src/api/client.ts) with Zod-validated request/response schemas (src/schemas/tamiyoScroll.ts). - Test suite (Vitest + Testing Library) covering the API client, card tests, active-deck context, match form, and card-tests section.
LoginPage.tsx: live password requirements checklist on signup, mirroringPASSWORD_PATTERNinapps/barrins_api/app/schemas/auth.py(12+ characters, upper/lowercase, digit, symbol) so users see which rules they still need to satisfy as they type. UX feedback only — the backend remains the sole source of truth on submit.PersonalDeckSelector.tsx: an archive (delete) button per deck in the list, wired to the already-existingDELETE /personal-decks/{id}endpoint (soft-delete viaarchived_at, never a hard delete) anduseArchivePersonalDeckhook — both existed backend-side but had no UI entry point. Guarded behind a confirmation dialog (ui/dialog.tsx) so a stray click can't archive a deck. Archiving the currently-active deck also clearsactive_personal_deck_id.AppShell.tsx: a "Welcome, {display_name}" greeting next to the Log out button, usinguseCurrentUser(GET /api/v1/auth/me, already implemented but unused in the UI). Falls back to the account email when no display name is set.
Changed¶
- Route
/app/suivi-bo3renamed to/app/bo3-tracker(App.tsx,AppShell.tsx's tab nav,LoginPage.tsx,VerifyEmailPage.tsx,README.md). Thepages/suivi-bo3/folder andSuiviBo3Tabcomponent name are unaffected — internal naming, not the route. - Post-login, post-signup, and post-email-verification now redirect to
/app/bo3-trackerinstead of/app/metagame, landing users on the match tracker first. - Translated
README.mdfrom French to English. - Translated remaining French UI text (labels, buttons, placeholders,
error messages) and code comments across the app —
index.css,active-deck-context.tsx,lib/mtg-format.ts,schemas/tamiyoScroll.ts,LoginPage.tsx,VerifyEmailPage.tsx, the decklist, metagame, and Suivi BO3 sections,AppShell.tsx,lib/store.ts,lib/queryClient.ts,api/client.ts,api/viewingOwner.ts, andhooks/useViewingOwner.ts— to English. - The "Share my data" checkbox and "View: {user}" selector extracted
into
SharingControls, disabled for v1.0.0 (not mature enough — the underlying backend enforcement is fully tested, but this UI had no component-level test).AppShell's deck selector no longer branches oncanEdit/viewing-mode, since there's no UI path left to enter it. CurrentDecklistSection.tsx,PersonalDecklistImportSection.tsx, andCardTestsSection.tsxnow render nothing (null) instead of a "Select or create a personal deck…" placeholder card when no personal deck is active (e.g. right after archiving one) — matchesVersionHistorySection.tsx's existing behavior for the same state.
Fixed¶
VerifyEmailPage.tsx: footer credit read "Account managed by barrins_api" — corrected tobarrins_identity, the actual identity service.PersonalDecklistImportSection.tsx:handleImport(Moxfield URL) andhandleSaveRaw(raw decklist text) never caught a failed mutation, so a backend error (e.g.400on an invalid/non-Moxfield URL) silently vanished instead of reaching the user — found via the A3 manual UAT step. Both now catchApiErrorand render the message inline, mirroringLoginPage's existing pattern.vite.config.ts: stubbedVITE_API_BASE_URLvia Vitest'stest.envsosrc/api/client.tsdoesn't build requests against"undefined"during tests. The variable was only ever supplied by a local, gitignored.envfile, so every CI run (including thefrontjob for otherwise-unrelated Dependabot bumps) failed 6client.test.tstests withTypeError: Invalid URL.