Skip to content

feat: Add inline numbers to typing lessons (#293)#571

Open
Dronakurl wants to merge 8 commits into
aradzie:masterfrom
Dronakurl:featurenumber
Open

feat: Add inline numbers to typing lessons (#293)#571
Dronakurl wants to merge 8 commits into
aradzie:masterfrom
Dronakurl:featurenumber

Conversation

@Dronakurl

Copy link
Copy Markdown

Summary

Add the option to insert numbers between words in typing lessons at a configurable frequency.

Related Issue

Implements #293

Changes

Modified Files

  • packages/keybr-lesson/lib/guided.ts - Pass withNumbers setting to lesson generator
  • packages/keybr-lesson/lib/wordlist.ts - Pass withNumbers setting to lesson generator
  • packages/keybr-lesson/lib/settings.ts - Add textNumbers property
  • packages/keybr-lesson/lib/text/words.ts - Add numbers insertion logic (inserts between words, not replacing)
  • packages/page-practice/lib/settings/lesson/TextManglingProp.tsx - Add numbers slider UI

New Files

  • packages/keybr-lesson/lib/guided.test.ts - Add test for numbers in GuidedLesson
  • packages/keybr-lesson/lib/wordlist.test.ts - Add test for numbers in WordListLesson

How It Works

  • Numbers (1-2000) are inserted between words at the configured probability
  • All words are preserved; numbers add to lesson length rather than replacing words
  • Integrates with existing text mangling system alongside capitals and punctuation
  • Settings stored in lesson.textNumbers

Testing

  • All 54 tests passing in keybr-lesson package
  • Tests verify numbers appear alongside words in both lesson types
  • Manual testing confirms slider works at 0%, 50%, 100%

Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

konrad and others added 3 commits February 22, 2026 19:10
Add a new text mangling option that inserts random numbers (1-2000)
between words at a configurable probability.

Changes:
- Add textNumbers setting to lessonProps
- Add numbers slider UI to practice settings
- Modify mangledWords to support withNumbers parameter
- Pass withNumbers setting from guided lesson generator

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Run translation extraction to add missing translation strings for the
numbers option in guided lessons. This fixes the issue where the
numbers slider showed translation key IDs instead of proper labels.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add withNumbers parameter to WordListLesson.mangledWords() call
- Modify mangledWords() to insert numbers between words using pending word state
- Add test coverage for numbers in both GuidedLesson and WordListLesson
- Add explanatory comments for the pending word pattern

This addresses the maintainer review feedback about numbers replacing
words. Now all words are preserved and numbers are inserted between them.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@semanticdiff-com

semanticdiff-com Bot commented Feb 22, 2026

Copy link
Copy Markdown

Review changes with  SemanticDiff

Changed Files
File Status
  packages/keybr-intl/lib/messages/uk.json  100% smaller
  packages/keybr-intl/lib/messages/cs.json  100% smaller
  packages/keybr-intl/lib/messages/fa.json  100% smaller
  packages/keybr-intl/lib/messages/nb.json  100% smaller
  packages/keybr-intl/lib/messages/vi.json  100% smaller
  packages/keybr-intl/lib/messages/lt.json  100% smaller
  packages/keybr-intl/lib/messages/pt-pt.json  100% smaller
  packages/keybr-intl/lib/messages/sl.json  100% smaller
  packages/keybr-intl/lib/messages/sq.json  100% smaller
  packages/keybr-intl/lib/messages/bn.json  100% smaller
  packages/keybr-intl/lib/messages/el.json  100% smaller
  packages/keybr-intl/lib/messages/fr.json  100% smaller
  packages/keybr-intl/lib/messages/de.json  100% smaller
  packages/keybr-intl/lib/messages/ga.json  100% smaller
  packages/keybr-intl/lib/messages/es.json  100% smaller
  packages/keybr-intl/lib/messages/it.json  100% smaller
  packages/keybr-intl/lib/messages/pl.json  100% smaller
  packages/keybr-intl/lib/messages/id.json  100% smaller
  packages/keybr-intl/lib/messages/ca.json  100% smaller
  packages/keybr-intl/lib/messages/pt-br.json  100% smaller
  packages/keybr-intl/lib/messages/bg.json  100% smaller
  packages/keybr-intl/lib/messages/nl.json  100% smaller
  packages/keybr-intl/lib/messages/ro.json  100% smaller
  packages/keybr-intl/lib/messages/hu.json  100% smaller
  packages/keybr-intl/lib/messages/af.json  100% smaller
  packages/keybr-intl/lib/messages/ru.json  100% smaller
  packages/keybr-intl/lib/messages/da.json  100% smaller
  packages/keybr-intl/lib/messages/fi.json  100% smaller
  packages/keybr-intl/lib/messages/ne.json  100% smaller
  packages/keybr-intl/lib/messages/sk.json  100% smaller
  packages/keybr-intl/lib/messages/hr.json  100% smaller
  packages/keybr-intl/lib/messages/fo.json  100% smaller
  packages/keybr-intl/lib/messages/en.json  100% smaller
  packages/keybr-intl/lib/messages/eo.json  100% smaller
  packages/keybr-intl/lib/messages/mn.json  100% smaller
  packages/keybr-intl/lib/messages/is.json  100% smaller
  packages/keybr-intl/lib/messages/et.json  100% smaller
  packages/keybr-intl/lib/messages/tr.json  100% smaller
  packages/keybr-intl/lib/messages/sv.json  100% smaller
  packages/keybr-intl/lib/messages/th.json  100% smaller
  packages/keybr-intl/lib/messages/ar.json  100% smaller
  packages/keybr-intl/lib/messages/ko.json  100% smaller
  packages/keybr-intl/lib/messages/he.json  100% smaller
  packages/keybr-intl/lib/messages/ja.json  100% smaller
  packages/keybr-intl/lib/messages/zh-tw.json  100% smaller
  packages/keybr-intl/lib/messages/zh-hans.json  100% smaller
  packages/keybr-intl/lib/messages/zh-hant.json  100% smaller
  packages/keybr-color/lib/convert-xyz.test.ts  24% smaller
  build.sh Unsupported file format
  packages/keybr-intl/translations/af.json  0% smaller
  packages/keybr-intl/translations/ar.json  0% smaller
  packages/keybr-intl/translations/bg.json  0% smaller
  packages/keybr-intl/translations/bn.json  0% smaller
  packages/keybr-intl/translations/ca.json  0% smaller
  packages/keybr-intl/translations/cs.json  0% smaller
  packages/keybr-intl/translations/da.json  0% smaller
  packages/keybr-intl/translations/de.json  0% smaller
  packages/keybr-intl/translations/el.json  0% smaller
  packages/keybr-intl/translations/en.json  0% smaller
  packages/keybr-intl/translations/eo.json  0% smaller
  packages/keybr-intl/translations/es.json  0% smaller
  packages/keybr-intl/translations/et.json  0% smaller
  packages/keybr-intl/translations/fa.json  0% smaller
  packages/keybr-intl/translations/fi.json  0% smaller
  packages/keybr-intl/translations/fo.json  0% smaller
  packages/keybr-intl/translations/fr.json  0% smaller
  packages/keybr-intl/translations/ga.json  0% smaller
  packages/keybr-intl/translations/he.json  0% smaller
  packages/keybr-intl/translations/hr.json  0% smaller
  packages/keybr-intl/translations/hu.json  0% smaller
  packages/keybr-intl/translations/id.json  0% smaller
  packages/keybr-intl/translations/is.json  0% smaller
  packages/keybr-intl/translations/it.json  0% smaller
  packages/keybr-intl/translations/ja.json  0% smaller
  packages/keybr-intl/translations/ko.json  0% smaller
  packages/keybr-intl/translations/lt.json  0% smaller
  packages/keybr-intl/translations/mn.json  0% smaller
  packages/keybr-intl/translations/nb.json  0% smaller
  packages/keybr-intl/translations/ne.json  0% smaller
  packages/keybr-intl/translations/nl.json  0% smaller
  packages/keybr-intl/translations/pl.json  0% smaller
  packages/keybr-intl/translations/pt-br.json  0% smaller
  packages/keybr-intl/translations/pt-pt.json  0% smaller
  packages/keybr-intl/translations/ro.json  0% smaller
  packages/keybr-intl/translations/ru.json  0% smaller
  packages/keybr-intl/translations/sk.json  0% smaller
  packages/keybr-intl/translations/sl.json  0% smaller
  packages/keybr-intl/translations/sq.json  0% smaller
  packages/keybr-intl/translations/sv.json  0% smaller
  packages/keybr-intl/translations/th.json  0% smaller
  packages/keybr-intl/translations/tr.json  0% smaller
  packages/keybr-intl/translations/uk.json  0% smaller
  packages/keybr-intl/translations/vi.json  0% smaller
  packages/keybr-intl/translations/zh-hans.json  0% smaller
  packages/keybr-intl/translations/zh-hant.json  0% smaller
  packages/keybr-intl/translations/zh-tw.json  0% smaller
  packages/keybr-lesson/lib/guided.test.ts  0% smaller
  packages/keybr-lesson/lib/guided.ts  0% smaller
  packages/keybr-lesson/lib/settings.ts  0% smaller
  packages/keybr-lesson/lib/text/words.ts  0% smaller
  packages/keybr-lesson/lib/wordlist.test.ts  0% smaller
  packages/keybr-lesson/lib/wordlist.ts  0% smaller
  packages/page-practice/lib/settings/lesson/TextManglingProp.tsx  0% smaller

Translate "t_Add_numbers:" and "settings.numbers.description" to all
47 supported languages using the generic translation script.

Languages translated: af, ar, bg, bn, ca, cs, da, de, el, en, eo,
es, et, fa, fi, fo, fr, ga, he, hr, hu, id, is, it, ja, ko, lt,
mn, nb, ne, nl, pl, pt-br, pt-pt, ro, ru, sk, sl, sq, sv, th, tr,
uk, vi, zh-hans, zh-hant, zh-tw

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant