Thank you to all the contributors who made this release possible!
Features
- lang: add pokemon language (@LuWo0) (#7688) (b098c9d60)
- quotes: add vietnamese quotes (@nhuyy01) (#7646) (e4dac78af)
- fonts: add Inter Tight and Space Grotesk (@AzureNightlock) (#7585) (fe00866b6)
Improvements
- input-validation: clean preset name input when adding (@byseif21) (#7703) (12fbad378)
- ape-keys: add input validation for ape keys (@Leonabcd123) (#7614) (70e7b9f80)
- custom-background: allow users to remove custom url background from commandline (@Leonabcd123) (#7613) (67efd1fdc)
- english_5k: order english_5k.json by frequency (@norwd) (#7609) (a4a4463bb)
- personal best: personal best table UX QoL (@DLineone) (#7551) (07e76a549)
- leaderboard: don't show stale data for weekly/daily when entering leaderboard page (@fehmer) (#7597) (1254f2cfc)
- quotes: Add code_java quotes (@K87lk) (#7566) (400acde4a)
- quotes: only check short length of new quotes (@Leonabcd123) (#7555) (5d608d536)
- fonts: improve letter-wise feedback of Arabic script default font (@nadalaba) (#7552) (f4c9ad727)
- quotes: add quotes in various languages (@cryptographe, @norwd, @yohaann196, @damarpas, @blue-94, @enzom-uy, @WormholeDragon) (#7674, #7634, #7532, #7581, #7557, #7365) (29d3206e2, e7006130f, 6fbc780c8, f6367ea4d, 6154bbfd0, 9b7417c43)
Fixes
- quote-modal: broken debouncing & prevent filter reset on chaining (@byseif21) (#7742) (ca84f790e)
- profile: fix profile not shown if inventory is null (@fehmer) (#7745) (ec0478efb)
- single badge not showing if not selected (15f95dd2a)
- resolve global auth state reactivity and quote search rtl layouts (@byseif21) (#7735) (1e305aca4)
- carryover: only reset keypress timings on restart and only carryover on start (@Leonabcd123, @Miodec) (#7705) (3bba57b77)
- dispatch authEvent when creating a new account with google (92aa5a637)
- zen: negative wpm in short tests (@Leonabcd123, @Miodec) (#7679) (96acd402d)
- short-tests: afk percentage is NaN (@Leonabcd123) (#7694) (cf9d4df2d)
- language: remove abbreviations in russian (@Dmskrzh) (#7682) (803e3d114)
- test: disable solid HMR in tests to fix path error on Windows (@nadalaba) (#7677) (e37252b13)
- language: cleanup the rest of english wordlists (@byseif21) (#7671) (243f75525)
- language: cleanup english_25k (@byseif21) (#7670) (ac1c0402e)
- custom-text: mode 'simple' isn't saved when delimiter is pipe (@Leonabcd123) (#7699) (87c886ed1)
- terms-of-service: weird line break (@Leonabcd123) (#7676) (e2378e9f3)
- quotes: correct quote length (@norwd) (#7675) (c460647ad)
- exact-quote-search: results can be interpreted as regex (@Leonabcd123) (#7673) (4c8764fd9)
- lang: normalize diacritic storage order for myanmar_burmese (@NayLinAungGo) (#7636) (f8b8419ed)
- results-page: empty input history with zen mode (@byseif21) (#7622) (ab52ae402)
- language: mark esperanto 200 word list as ordered by frequency (@norwd) (#7621) (8162c2345)
- account-chart: prevent scroll when clicking outside chart (@byseif21) (#7608) (6e45d24f5)
- test: only increment incomplete test seconds once (@Miodec) (#7607) (9c741971a)
- layoutfluid: layoutfluid highlights first key in test (@Leonabcd123) (#7604) (a20c9ca5f)
- rainbow-trail: errors aren't fading away (@Leonabcd123) (#7668) (5249b5a8a)
- privacy-policy: missing whitespace in privacy policy page (@Leonabcd123, @Miodec) (#7637) (efbfb0635)
- update security.txt expiry date (@norwd) (#7610) (5af1eed4d)
- profile: prevent PB hover details from overlapping base values (@AzureNightlock) (#7598) (666d8cd1b)
- layoutfluid: highlight key after layout switch in timed mode when layoutfluid is active (@Leonabcd123) (#7594) (685a40d0a)
- quick-restart: quick restart warning firing for wrong events in long tests (@Leonabcd123) (#7590) (9ab31b9f7)
- quote-search: user input is interpreted as a regex when using exact quote search (@Leonabcd123) (#7658) (98f1c091e)
- favorite-quote: favorite quote button isn't hidden in result screen when logged out (@Leonabcd123) (#7649) (50f95c5de)
- style: transparent table headers when custom background is used (@fehmer) (#7612) (0a7785b93)
- language: mark esperanto word lists as ordered by frequency (@norwd) (#7620) (688bc6892)
- caret: prevent misplacement in zen mode with blind mode on (@byseif21) (#7584) (c5711c43b)
- quote-search: length filter losing styles after returning from chained modal (@byseif21) (#7570) (2f2de3b21)
- hide xp bar and breakdown in focus mode (8ea033062)
- profile: missing completion ratio tooltip to tests completed stat (3d528288f)
- remove redundant clearGlobal/applyGlobalCSS calls (@byseif21) (#7575) (e57686d46)
- custom-text: custom text isn't saving to local storage (@Leonabcd123) (#7573) (e16f3c177)
- changelog: prs which aren't adding quotes are treated as such (@Leonabcd123) (#7592) (c2c064fc1)
- lb: Fix missing min wpm to qualify on rank (@fehmer) (#7616) (b6d89499e)
- profile: don't show headers if no content (@fehmer) (#7603) (47e725cb5)
- language: Add all Common Lisp symbols. (@aadcg) (#7569) (ca6a4ef0d)
- stupid safari (85ae1fa95)
- profile: badge text hiding on narrow screen (39d9111df)
- practise-words: treat proto as a normal word in practise words (@Leonabcd123) (#7494) (245dcd7af)
- stuck hover on focus for header and restart button (@byseif21) (#7434) (d79ac4c19)
- profile: fix style issues (@fehmer) (#7593) (a4fb88e6c)
Nerd stuff
These changes will not be visible to users, but are included for completeness and to credit contributors.
- impr: add solidjs simple modal (@Miodec) (#7681) (1cbeb68fa)
- impr: enhance import tree script with folder leaf detection and error handling (f95cbaa25)
- impr: strip out type only imports in import tree script (e89ec7cb4)
- fix(User component): spinner positioning, level spacing (999b58c0c)
- docs: guidelines for pr descriptions (@fehmer) (#7706) (252d92fe8)
- docs(pull-request-template): general improvements (@Leonabcd123) (#7678) (29d76b505)
- refactor: add tanstack signal tanstack plugin, reorder files (@Miodec) (#7721) (3cdaf0905)
- refactor: add options metadata to config meta (608a10288)
- refactor: use fa object type in config metadata (504eb4add)
- refactor(hotkeys): use tanstack/hotkey (@fehmer, @d1rshan, @Miodec) (#7691) (c852ff56e)
- refactor: move test event to its own file, move test specific signals (f91eef36f)
- refactor: solid test config (@Miodec) (#7701) (4d936d75e)
- refactor: solid quote modals (@Miodec) (#7700) (37d884624)
- refactor: solid custom text and associated modals (@Miodec) (#7695) (cc09c9497)
- refactor: move addFriend to db.ts (ca746f382)
- refactor: move applyFontFamily to ui.ts (4a1ec41eb)
- refactor: move captcha modal call from auth to Register component (69e96f230)
- refactor: reactively add name change banner (962ebc9d2)
- refactor: convert observables to events (@Miodec) (#7680) (f5fe3ded3)
- refactor: reorganize funbox validation logic and update imports (841dbe376)
- refactor: config split (@Miodec) (#7659) (f3f0e9ed6)
- refactor: reorganize states (@fehmer) (#7651) (e26e963fd)
- refactor: login page (@Miodec) (#7595) (86613e3c9)
- refactor: move some code to the constants directory, move constants to their own bundle chunk (@Miodec) (#7650) (3ec2cac17)
- refactor(chart): better theme handling for ChartJs component (@fehmer) (#7600) (2d558d10f)
- refactor: util cleanup (@Miodec) (#7648) (0576f1708)
- perf(CI): optimize check-assets-quotes script (@nadalaba) (#7669) (fd2e610ae)
- chore: bump tsgolint (051da1eda)
- chore: add yaml as dev dependency (93b61c1df)
- chore: bump typescript version (e7cd1a0b3)
- chore: bump oxc version (3a049d2cb)
- chore: update redocly, fixes cannot find module yaml (@fehmer) (#7707) (04b130ac8)
- chore: cleanup types in quotes scripts (@nadalaba) (#7672) (f04e28ece)
- chore: pnpm i (13d09343e)
- chore: upgrade to vite8 (again) (ed774cfc5)
- chore: optimise depencencies by extracting prefetch functions to their own module (b67443eb7)
- chore: downgrade to sass 1.70 (e7a2cd9c9)
- chore(deps): bump @sentry/browser from 9.14.0 to 10.43.0 (#7641) (a03ea0ef7)
- chore(deps-dev): bump sass from 1.70.0 to 1.98.0 (#7640) (597832992)
- chore(deps-dev): bump nodemon from 3.1.4 to 3.1.14 (#7639) (5588aa29d)
- chore: fix contributors list structure (148956f23)
- chore: stringify output (cb26361cc)
- chore: handle new script output structure, use try catch (457e8a4e6)
- chore: fix env not loading, change output structure (70917e74f)
- chore: fix contributors (3311202ad)
- chore: release v26.12.0 (1181d956d)
- chore: fix contributors file path (abd8fb87c)
- chore: downgrade to vite7 for now (bfac84904)
- chore: actually fix 404 (7ddbcdf0a)
- chore: fix 404 page styling (f5a47615d)
- chore: add yaml as dev dependency (5f264392f)
- chore: update contributors when running the release script (83c5ff1a6)
- chore: add solid dev tools (@fehmer) (#7660) (6161fdb5f)
- chore: finish cleaning up utils (e85bc8ae2)
- chore: remove test logic dependency from solidjs code (01c986f9a)
- chore: update purge cf cache script (73e9a6aa4)
- chore: remove theme indicator commandline dependency (aece24e70)
- chore: upgrade to vite8 (@Miodec) (#7647) (9c7114383)
- chore: add script to visualise import tree (49589c447)
- chore: lint all files in frontend instead of just src (02310c737)
- chore: add caniuse dev dependency (75c0f6bdb)
- chore: add claude worktrees to gitignore (4aa9e554c)
- chore(deps): bump simple-git from 3.16.0 to 3.32.3 (#7619) (ea2fff888)
- chore: add Claude Code GitHub Workflow (@Miodec) (#7617) (b40fb2597)
- chore: add dir auto to quote text in report and submit quote modals (@byseif21) (#7571) (9d56ac49c)