Daily review 2026-06-29 - #64
Draft
NghaReformer wants to merge 1 commit into
Draft
Conversation
Co-Authored-By: Claude <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
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.
Daily Review — 2026-06-29
Scope: full codebase scan (src/, static/playgrounds/). No Svelte 4 syntax violations found.
Server boundary is clean — Supabase only in
$lib/server/. API routes handle errors correctly.1. Bugs & Issues
B1 — Missing CSS variables
--orange,--blue,--redin theme generatorSeverity: HIGH
Files:
src/lib/theme/css-generator.ts(entire file — vars never emitted)src/lib/components/playground/KpiStrip.svelte:76src/lib/playgrounds/amortization/components/ChartPanel.svelte:436,444,448,493,501,505,515,529,533src/lib/playgrounds/amortization/components/ScheduleTable.svelte:240,246,259,265src/lib/playgrounds/amortization/components/InputsPanel.svelte:604–605src/lib/playgrounds/bank-reconciliation/components/LedgerPanel.svelte:149,175,208–222src/lib/playgrounds/bank-reconciliation/components/VarianceScale.svelte:252,260,264,410,413,416src/lib/playgrounds/bank-reconciliation/components/TransactionJournal.svelte:271,276,378,382src/lib/playgrounds/bank-reconciliation/components/BankStatementPanel.svelte:175css-generator.tsemits--green,--amber,--errorbut never--orange,--blue, or--red. Everyvar(--orange, #f59e0b),var(--blue, #3b82f6), andvar(--red, #ef4444)falls through to its hardcoded fallback — the CSS variable is always missing, making these hex values the real production colors. This defeats the theme token system and blocks future retheme.Fix: Add
orange,blue, andredfields toThemeTokens.colorsintokens.ts, set values indefaultTheme, and emit--orange,--blue,--redincss-generator.ts.B2 — Hardcoded hex palette in
CategoryBreakdownDonut.svelteSeverity: HIGH
File:
src/lib/playgrounds/bank-reconciliation/components/CategoryBreakdownDonut.svelte:30–40CATEGORY_COLORSis a plain TypeScript constant with 9 hardcoded hex values. These are passed as SVGstrokeprops and asstyle="background: {seg.color}"inline styles (line 120). They bypass the theme system entirely and cannot be rethemed.Fix: Map each
ItemCategoryto a CSS variable reference. For categories with no existing token, define new semantic tokens (--purple,--cyan,--pink) intokens.ts.B3 — Privacy page entirely in hardcoded English,
$timported but unusedSeverity: HIGH
File:
src/routes/[lang]/privacy/+page.svelte:1–26All headings and body paragraphs are raw English strings. French users at
/fr/privacysee an English-only page. The page imports{ t }from$lib/i18nbut never calls it.Fix: Create
privacy.en.tsandprivacy.fr.tsnamespaces. Replace raw strings with$t('privacy.*')calls. Runnpm run i18n:check.B4 — Difficulty labels hardcoded in French only
Severity: MEDIUM
File:
src/lib/components/playground/ExercisePanel.svelte:11–13'Fondamental','Intermédiaire','Avancé'are embedded as module-level constants, not reactive to locale. English users see French labels.Fix: Convert to
$derivedusing existingdiff.*i18n keys.B5 — Accounting framework labels hardcoded (including English-only "French PCG")
Severity: MEDIUM
File:
src/lib/components/playground/PlaygroundSettings.svelte:9–12'French PCG'is English-only (French users should see'PCG français'). Common namespace already hascoa.fw.*keys.Fix: Derive the options array reactively with
$derived($t).B6 — Hardcoded
#fffin component CSSSeverity: MEDIUM
Files:
EntryHistory.svelte:400,chart-of-accounts/+page.svelte:423,458,learn/+page.svelte:202Fix: Replace
color: #fffwithcolor: var(--bg).B7 —
rgba(0,0,0,0.3)hardcoded inPlaygroundCard.svelteSeverity: MEDIUM
File:
src/lib/components/PlaygroundCard.svelte:45Base box-shadow uses raw rgba while
--shadow-glowtoken is used in the same declaration. Fix: Usevar(--shadow-lg).B8 —
rgba(255,255,255,0.02)repeated 11 times, not tokenizedSeverity: LOW
Files: Multiple CVP playground components (GoalSeekPanel, WhatIfPanel, SensitivityTable, MultiProductForm, IndifferencePanel, Playground.svelte)
Fix: Add
--panel-insettoken, emit fromcss-generator.ts, replace raw values.B9 — Inline
style=on data-driven visual elementsSeverity: LOW
Files: CategoryBreakdownDonut:120, MatchingPairsOverlay:88/108, VarianceScale:146, ScenarioWalkthrough:62, ReconciliationFlow:122/133/160
Fix: Use
style:--var="{value}"+ CSSvar(--var)instead ofstyle=attributes.B10 —
onMountinFeedbackLauncher.svelte— not idiomatic Svelte 5Severity: LOW
File:
src/lib/components/feedback/FeedbackLauncher.svelte:2onMountis a Svelte 4 lifecycle import. The keyboard listener fits cleanly in a$effectwith cleanup return.Fix: Replace
onMount+mountedflag with$effect(() => { ...; return () => ... }).2. New Playground Ideas
Existing coverage: amortization (loan), bank reconciliation, CVP, simple/compound/bond interest, journal entry, TVM.
P1 — Inventory Valuation Methods
EN: Inventory Valuation Methods | FR: Méthodes d'évaluation des stocks
Target: Licence 2 / Licence 3
Fixes persistent student confusion between FIFO (PEPS) and Weighted Average Cost (CMUP) — SYSCOHADA only permits these two. Learner inputs purchase/sale events; playground recomputes the stock card in real time with a FIFO ↔ CMUP toggle showing how the method choice shifts COGS and closing inventory value. Complements the journal-entry playground by modelling the upstream inventory flow before it gets journaled.
P2 — VAT / TVA Input-Output Reconciliation
EN: VAT Input/Output Reconciliation | FR: Déclaration de TVA
Target: Licence 2 / practicing professional
No existing playground covers indirect tax. Learner enters purchase and sales invoices (HT, rate, deductibility %); playground computes TVA collectée, TVA déductible, net TVA payable, and previews the SYSCOHADA journal entries (accounts 4455/4456/4457). Rate selector covers 18% CEMAC standard and 0% exempt.
P3 — Financial Ratio Analyser
EN: Financial Ratio Analysis | FR: Analyse financière par ratios
Target: Licence 3 / Master 1
Operates at the strategic level that transaction-focused playgrounds can't reach. Learner inputs a simplified SYSCOHADA trial balance; playground computes FR/BFR/TN liquidity, solvency (gearing, D/E), profitability (ROE, ROA, EBITDA margin), and activity ratios (DSO, DPO). Radar chart + stress-test slider shows which ratios breach thresholds under revenue drop or debt increase. SYSCOHADA vs IFRS classification toggle shows how reclassification shifts the numbers.
P4 — Payroll / Fiche de Paie
EN: Payroll Computation | FR: Calcul de la fiche de paie
Target: Licence 3 / practicing professional
OHADA-zone payroll has layered country-specific social charges (CNPS, IRPP tranches) that no existing playground models. Learner inputs gross salary, country (Cameroon / Côte d'Ivoire / Senegal), and category (cadre/non-cadre); playground produces a payslip breakdown, employer cost total, and the required journal entries (641, 645, 431, 447).
P5 — Asset Depreciation Method Comparison
EN: Depreciation Method Comparison | FR: Comparaison des modes d'amortissement
Target: Licence 1 / Licence 2
Directly addresses the common student confusion between loan amortization (existing playground) and asset depreciation under SYSCOHADA Articles 35–38. Three methods run side by side — Linéaire, Dégressif (1.5×/2×), Unités d'œuvre — with animated net-book-value chart, annual journal entries (6811 Dotations / 2818 Amortissements), and a tax timing difference table when the "fiscal impact" toggle is on.
Generated by Claude Code