Onboarding polish: validated custom imports, tutorial step indicator, Discord CTA
This drop focuses on onboarding and custom games: custom league imports get server-side validation (with i18n error messages), custom team logos render as SVG with a transparent PNG fallback, the tutorial gets a clear step counter, and a fresh Discord CTA beneath the existing-games box invites everyone to the community channel.
📥 Custom imports: file upload + validator
- Import page now accepts direct CSV file uploads (teams, players) instead of URL-only entry — much faster onboarding for league imports from tabletop or your own tools
- Server-side validator on upload: column count, required fields, value ranges (OVR 0–100, age 18–45 etc.) and a slimmer schema variant with fewer required columns
- Error messages in DE + EN with locale-specific thousand separators (e.g. „Zu wenig Fans (1.000.000) — Mindestwert 1,5 Mio." vs. EN „Fanbase too low (1,000,000) — minimum 1.5M")
- Off-by-one bug in the CSV templates on the first player record fixed — templates now load cleanly
nfl-import53.pygenerator synchronised with the slimmer schema
🛡️ Custom game logos now as SVG
- Custom game saves now render team logos as SVG by default (instead of PNG) — crisp at any size, smaller footprint
- Pre-cache before
startgame.php: as soon as the logo URL is known, the SVG is fetched in the background; a generic fake-SVG fallback is staged in case the download fails .htaccessrewrite redirects missing.svgrequests to.pngautomatically — old custom saves without an SVG asset still work- Permanently failed downloads are skipped on retry, parallel retries are bundled — clean custom-game onboarding even with flaky source CDNs
🎓 Tutorial polish
- New step indicator directly under the tutorial nav: shows „Step X of Y" at all times so it's obvious how much is left
- EN typo „+5%% OVR" → „+5% OVR" fixed
- Updated roster depth screenshot in tutorial step 4
- DE wording on
franchise.php: „Konto" → „Balance" for the EN version so vocabulary stays consistent across languages
💬 Discord CTA placed prominently
- New Discord banner directly below the existing-games block on the landing page — instantly visible for anyone opening the site
- The feedback overlay also gets a Discord CTA below the submit button — bug reports and feature wishes get a direct live channel
- Asset
grafiken/discord.pngshipped
🎨 Team polish
teams.php: new „Team Colors" column with a small gradient chip (color1 → color2) — sortable + searchable- 12 fictional teams with too-light color2 get a contrast bump so white text on the secondary colour stays reliably readable — no more grey-white player names in the trade or roster overlay
🤝 Trade cap consistency
trade.phpgets a 3-pick cap per side as a counterpart to the existing 5-player cap — prevents giant pick packages that would later blow the draft-room limitcheckTeamNeeds()respects the cap lock: already-limited checkboxes are no longer wrongly re-enabled when the needs highlights re-render- Selected players are now reliably counted from the
idstringinstead of:checked— works even after DataTable filter changes that detach unmatched rows from the DOM
Onboarding day: custom imports get more defensive, the tutorial gets clearer, custom logos get prettier, and the Discord entry point is visible to everyone. Plus the last gaps in the trade cap system are closed so pick packages no longer spiral out of control.