- Add explicit activeCameraSource field to VisionConfig to track which
camera is in use (local vs phone), fixing button visibility bugs when
switching between camera sources
- Simplify calibration UI by removing the confusing "Auto/Manual" mode
toggle, replacing with a cleaner crop status indicator
- Remove calibration requirement from isVisionSetupComplete for local
camera since auto-crop runs continuously when markers are detected
- Update DockedVisionFeed to use activeCameraSource instead of inferring
from which configs are set
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Physical Abacus Columns Setting:
- Add physicalAbacusColumns to AbacusDisplayConfig (default: 4)
- Add database column with migration 0054
- Add slider UI in AbacusDisplayDropdown (range 1-21)
- Update AbacusVisionBridge to use setting instead of calculating from problem
Remote Camera Flash Toggle Fix:
- Add socket events for torch sync (set-torch, torch-state)
- Phone reports torch state to desktop on change/connection
- Desktop can control phone's torch remotely
- Add torch button in AbacusVisionBridge for phone camera mode
- Both local and remote flash toggles now work correctly
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix hook dependency issues in AbacusVisionBridge by using destructured
stable function references instead of remoteCamera object
- Add proper container dimension tracking for remote camera calibration
overlay to fix coordinate mismatch
- Add rotate180 option to perspectiveTransform to support both Desk View
(camera pointing down, needs 180° rotation) and phone cameras (no rotation)
- Phone camera cropping now uses direct mapping without rotation
The main issues fixed:
1. Hook dependencies were causing effects to run repeatedly when navigating
to remote camera URL in a different window
2. CalibrationOverlay was using hardcoded fallback dimensions instead of
actual container dimensions for remote camera
3. Perspective transform was applying 180° rotation which is wrong for
phone cameras held at normal angles
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Auto-generated fresh SVG examples and unified gallery from latest templates.
Includes comprehensive crop mark demonstrations with before/after comparisons.
Files updated:
- packages/templates/gallery-unified.html
🤖 Generated with GitHub Actions
Co-Authored-By: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Auto-generated fresh SVG examples and unified gallery from latest templates.
Includes comprehensive crop mark demonstrations with before/after comparisons.
Files updated:
- packages/templates/gallery-unified.html
🤖 Generated with GitHub Actions
Co-Authored-By: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Major changes:
- Merge SessionSummary and SessionOverview into unified experience
- Add "Problems Worth Attention" section with expandable problem details
- Add "All Problems" collapsible section with compact/detailed toggle
- Keep auto-pause timing info in unified view
- Remove debug view toggle from SummaryClient
- Delete SessionOverview.tsx (replaced by new components)
New components:
- AllProblemsSection.tsx - collapsible all-problems view
- ProblemToReview.tsx - expandable problem row with reason badges
- sessionSummaryUtils.ts - filtering utilities for attention-worthy problems
Bug fix:
- Fix ROTATION_MULTIPLIERS import in DashboardClient (was undefined due to re-export chain)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
# [2.16.0](https://github.com/antialias/soroban-abacus-flashcards/compare/abacus-react-v2.15.0...abacus-react-v2.16.0) (2025-12-19)
### Bug Fixes
* **blog:** correct misleading claim about BKT feeding problem generation ([184cba0](184cba0ec8))
* **blog:** regenerate trajectory data from correct snapshot ([ce85565](ce85565f06))
* **dashboard:** make student dashboard responsive for small screens ([129907f](129907fcc6))
* **dashboard:** use React Query mutations instead of direct fetch ([ff7554b](ff7554b005))
* **migration:** add statement-breakpoint between CREATE and INSERT ([ba68cfc](ba68cfc75d))
* **practice:** add comprehensive logging and validation in recordSlotResult ([85d36c8](85d36c80a2))
* **practice:** add defensive checks in recordSlotResult ([a33e3e6](a33e3e6d2b))
* **practice:** add responsive styles to SessionModeBanner for small screens ([be08efe](be08efe06f))
* **practice:** check all later prefix sums for ambiguity, not just final answer ([43e7db4](43e7db4e88))
* **practice:** correct five complement skill detection for addition and subtraction ([1139c4d](1139c4d1a1))
* **practice:** correct pause phrase attribution ([cc5bb47](cc5bb479c6))
* **practice:** correct route path for resume session ([1a7945d](1a7945dd0b))
* **practice:** disable auto-scroll and add modern PWA meta tag ([8a9afa8](8a9afa86bc))
* **practice:** ensure badges are never taller than wide ([5730bd6](5730bd6112))
* **practice:** ensure keypad spans full screen width ([4b8cbdf](4b8cbdf83c))
* **practice:** ensure speed meter bar is always visible ([0c40dd5](0c40dd5c42))
* **practice:** fix circular import causing REINFORCEMENT_CONFIG.creditMultipliers to be undefined ([147974a](147974a9f0))
* **practice:** fix invisible resume button by using inline styles ([dd3dd45](dd3dd4507c))
* **practice:** handle paused state transitions and add complete phase ([36c9ec3](36c9ec3301))
* **practice:** improve dark mode contrast for sub-nav buttons ([59f574c](59f574c178))
* **practice:** improve mobile layout + floating abacus positioning ([3c9406a](3c9406afc5))
* **practice:** include endEarly.data in currentPlan priority chain ([28b3b30](28b3b30da6))
* **practice:** make session plan page self-sufficient for data loading ([7243502](7243502873))
* **practice:** move SessionPausedModal into ActiveSession for single pause state ([f0a9608](f0a9608a6b))
* **practice:** only show landscape keypad on phone-sized screens ([6c09976](6c09976d4b))
* **practice:** prevent keypad from covering nav and content ([839171c](839171c0ff))
* **practice:** prevent stray "0" rendering in problem area ([7a2390b](7a2390bd1b))
* **practice:** remove empty spacer button from keypad layout ([1058f41](1058f411c6))
* **practice:** remove fallback random problem generation ([f95456d](f95456dadc))
* **practice:** size answer boxes for intermediate prefix sums ([5cfbeeb](5cfbeeb8df))
* **practice:** state-aware complexity selection with graceful fallback ([6c88dcf](6c88dcfdc5))
* **practice:** update pun to "We pressed paws!" ([4800a48](4800a48128))
* **practice:** use inline styles for progress bar ([f45428e](f45428ed82))
* **practice:** use raw CSS media query for landscape keypad visibility ([31fbf80](31fbf80b8f))
* **practice:** use React Query cache for /resume page session data ([ae1a0a8](ae1a0a8e2d))
* **StartPracticeModal:** responsive improvements + integrated tutorial CTA ([56742c5](56742c511d))
* sync pause state between modal and ActiveSession ([55e5c12](55e5c121f1))
### Features
* **abacus:** add dockable abacus feature for practice sessions ([5fb4751](5fb4751728))
* **abacus:** add smooth animated transitions for dock/undock ([2c832c7](2c832c7944))
* **bkt:** add adaptive-bkt mode with unified BKT architecture ([7085a4b](7085a4b3df))
* **bkt:** implement adaptive skill targeting with validated convergence ([354ada5](354ada596d))
* **blog:** add Bayesian blame attribution validation and address reviewer feedback ([ceadd9d](ceadd9de67))
* **blog:** add interactive ECharts for BKT validation blog post ([6a4dd69](6a4dd694a2))
* **blog:** add layered skill trajectory visualization ([b227162](b227162da6))
* **blog:** add session 0, line thickness, and category averages to charts ([c40baee](c40baee43f))
* **blog:** show adaptive vs classic comparison on same chart ([b0c0f5c](b0c0f5c2da))
* **blog:** simplify All Skills chart to show average comparison ([6ef329d](6ef329dd60))
* **practice:** add "Press paws!" pun to auto-pause phrases ([8405f64](8405f64486))
* **practice:** add /resume route for "Welcome back" experience ([7b476e8](7b476e80c1))
* **practice:** add 30 and 45 minute session duration options ([e42766c](e42766c893))
* **practice:** add auto-pause and improve docked abacus sizing ([9c1fd85](9c1fd85ed5))
* **practice:** add browse mode navigation and improve SpeedMeter timing display ([3c52e60](3c52e607b3))
* **practice:** add cascading regrouping skills and improve help UX ([7cf689c](7cf689c3d9))
* **practice:** add celebration progression banner with smooth transitions ([bb9506b](bb9506b93e))
* **practice:** add complexity budget system and toggleable session parts ([5d61de4](5d61de4bf6))
* **practice:** add inline practice panel for browse mode debugging ([c0764cc](c0764ccd85))
* **practice:** add pause info with response time statistics to paused modal ([826c849](826c8490ba))
* **practice:** add play emoji to Keep Going button ([80a33bc](80a33bcae2))
* **practice:** add prefix sum disambiguation and debug panel ([46ff5f5](46ff5f528a))
* **practice:** add projecting SessionModeBanner with slot-based animation ([0f84ede](0f84edec0a))
* **practice:** add Remediation CTA for weak skill focus sessions ([7d8bb2f](7d8bb2f525))
* **practice:** add response time tracking and live timing display ([18ce1f4](18ce1f41af))
* **practice:** add SkillUnlockBanner + session summary improvements ([4daf7b7](4daf7b7433))
* **practice:** add student notes with animated modal + BKT improvements ([2702ec5](2702ec585f))
* **practice:** add subtraction support to problem generator ([4f7a9d7](4f7a9d76cd))
* **practice:** add unified SessionMode system for consistent skill targeting ([b345baf](b345baf3c4))
* **practice:** consolidate nav with transport dropdown and mood indicator ([8851be5](8851be5948))
* **practice:** improve docked abacus UX and submit button behavior ([60fc81b](60fc81bc2d))
* **practice:** improve help mode UX with crossfade and dismiss behaviors ([bcb1c7a](bcb1c7a173))
* **practice:** improve modal UI with problem counts and time estimation ([34d0232](34d0232451))
* **practice:** improve session summary UI ([a27fb0c](a27fb0c9a4))
* **practice:** inline emoji with random pause phrases ([c13fedd](c13feddfbb))
* **practice:** integrate timing display into sub-nav with mobile support ([2fca17a](2fca17a58b))
* **practice:** migrate mastery model to isPracticing + computed fluency ([b2e7268](b2e7268e7a))
* **practice:** redesign paused modal with kid-friendly statistics UX ([11ecb38](11ecb385ad))
* **practice:** reduce term count for visualization part ([9159608](9159608dcd))
* **practice:** refactor disambiguation into state machine with comprehensive tests ([ed277ef](ed277ef745))
* **practice:** responsive mobile keypad and unified skill detection ([ee8dccd](ee8dccd83a))
* **practice:** separate phrase sets for manual vs auto pause ([652519f](652519f219))
* **practice:** unify dashboard with session-aware progress display ([c40543a](c40543ac64))
* **practice:** use student's actual mastered skills for problem generation ([245cc26](245cc269fe))
* **session-planner:** integrate SessionMode for single source of truth targeting ([9851c01](9851c01026))
* **skills-modal:** add spring animations and UX improvements ([b94f533](b94f5338e5))
* **skills:** add Skills Dashboard with honest skill assessment framing ([bf4334b](bf4334b281))
* **test:** add journey simulator for BKT A/B testing ([86cd518](86cd518c39))
* **tutorial:** implement subtraction in unified step generator ([e5c697b](e5c697b7a8))
- Add bottomOffset/rightOffset to MyAbacusContext for virtual keyboard avoidance
- NumericKeypad sets offsets when mounted (48px bottom, 100px right)
- Floating abacus repositions above/beside keyboard in portrait/landscape
- PracticeSubNav: fix horizontal overflow with minWidth: 0 on flex children
- SessionProgressIndicator: allow proper flex shrinking
- ActiveSession: reduce padding/gaps, use flex layout to fill available space
- PracticeClient: use fixed positioning with proper insets for all orientations
- Portrait: bottom 48px for keypad
- Landscape: right 100px for keypad
- Desktop: no offsets needed
- Prevent viewport scrolling during practice sessions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Auto-generated fresh SVG examples and unified gallery from latest templates.
Includes comprehensive crop mark demonstrations with before/after comparisons.
Files updated:
- packages/templates/gallery-unified.html
🤖 Generated with GitHub Actions
Co-Authored-By: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
NumericKeypad improvements:
- Fixed position: bottom bar in portrait, right panel in landscape
- Uses react-simple-keyboard with key-like styling (raised, press effect)
- Persists once shown even if physical keyboard detected
Skill detection refactoring:
- Unified all skill analysis through generateUnifiedInstructionSequence
- Removed ~210 lines of dead column-based analysis code
- Added cascading carry/borrow detection for consecutive ten complements
- Ported test cases from columnAnalysis.test.ts to skillDetection.test.ts
abacus-react:
- Added server-side compatible static exports
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
# [2.15.0](https://github.com/antialias/soroban-abacus-flashcards/compare/abacus-react-v2.14.0...abacus-react-v2.15.0) (2025-12-08)
### Bug Fixes
* **404:** reset easter egg config on page reload/close ([d6f1c13](d6f1c13317))
* account for SVG preserveAspectRatio in coordinate transforms ([e4e0925](e4e09256c2))
* add 'auto' to RuleMode type to prevent undefined display values ([a8636ca](a8636ca6a2))
* add comprehensive dark mode support to Smart Difficulty controls ([a65feb7](a65feb7344))
* add cooldown after quick-escape to prevent precision mode re-activation ([e885ae7](e885ae7ef4))
* add currentStepEstimate to required fields in JSON schema ([0d66c54](0d66c54991))
* add custom cursor when pointer lock is active ([5d6d6b4](5d6d6b4ddc))
* add missing openDeploymentInfo prop to MinimalNav ([30879d8](30879d8959))
* add missing scaleX and scaleY number conversions ([ae6cc5e](ae6cc5e326))
* add missing selectedContinent to default config and fix ts-expect-error directives ([07e9224](07e92240e8))
* add mode descriptions and remove double borders ([6f2f6d4](6f2f6d444c))
* add quotes around unquoted keys when parsing customCrops.ts ([0add49c](0add49c599))
* add seed and prngAlgorithm fields to all Zod schema versions (V1-V4) ([1782f42](1782f427f1))
* add shuffling to progressive difficulty mode & UI improvements ([38e9982](38e9982c3d))
* add zoom to selected continent and improve click detection ([6651979](6651979ea0))
* align share persistence with user session logic ([72c72fc](72c72fc218))
* calculate total problems correctly in preview API ([25dfb71](25dfb71b3e))
* cancel previous give-up animation when new give-up starts ([c01cb7f](c01cb7f384))
* cap zoom when releasing pointer lock (escape key) ([2331f10](2331f1038c))
* center crosshairs and re-enable pointer lock after escape ([814bf94](814bf949f2))
* change zoom capping to create pause effect instead of slow easing ([f2ca9d1](f2ca9d1ebe))
* combine fast easing with smooth precision mode transition ([cab1fbf](cab1fbff95))
* configure Next.js to transpile [@svg-maps](https://github.com/svg-maps) ES modules ([ebf2b66](ebf2b66910))
* consolidate worksheet validation constants and increase MAX_PAGES to 100 ([0f3ec36](0f3ec369bf))
* correct GPT-5 API parameters and surface actual grading errors ([2d33f35](2d33f35c4d))
* **create:** use inline styles for dynamic gradient backgrounds ([ed25b32](ed25b323e8))
* DevCropTool key quoting and magnifier label positioning ([2e4f22a](2e4f22a522))
* don't show labels for excluded/filtered regions ([a83fbb1](a83fbb1070))
* eagerly load map caches in browser and use Suspense pattern ([db6be73](db6be73a1c))
* eliminate cursor dampening lag when changing direction ([fc08b77](fc08b775db))
* enable page virtualization in worksheet creator ([b675f6c](b675f6c96e))
* enable vertical scrolling in layout controls ([a1b31f4](a1b31f454a))
* enable virtualization for worksheet preview by limiting SSR to 3 pages ([f409e3c](f409e3c2ed))
* ensure entire region path is clickable with pointerEvents: all ([eb94191](eb94191b2e))
* export worksheet schema tables from index ([6a16674](6a1667404f))
* hide abacus on /arcade and /arcade-rooms routes ([77033f0](77033f0b22))
* implement manual click detection using precise cursor position ([156f63f](156f63faaf))
* improve dark mode contrast in OrientationPanel dropdown ([f9e2343](f9e2343ffb))
* improve dark mode for orientation and page buttons ([fe9b9f9](fe9b9f9ffa))
* improve draggable button constraints to avoid action button overlap ([00b0fb2](00b0fb297b))
* improve magnifier zoom calculation for multi-piece regions ([cb4114f](cb4114f344))
* improve magnifier zoom smoothness and debug panel ([639e662](639e662d76))
* improve socket server error messages for better debugging ([5d1ea7d](5d1ea7db2d))
* improve text contrast for selected dropdown items in dark mode ([8d03452](8d0345287f))
* improve zoom easing to threshold by deferring capping ([b355a3f](b355a3fc8f))
* increase sampling density for tiny region detection and show all detected regions ([2c9f760](2c9f760ae9))
* increase super zoom multiplier from 2.5x to 5.0x for Gibraltar ([138e6c0](138e6c071b))
* increase z-index of pointer lock prompt overlay ([5388441](5388441ebb))
* **know-your-world:** actually change magnifier element dimensions to 1/3 ([31a06d6](31a06d6fef))
* **know-your-world:** allow space in name confirmation input ([285b128](285b128bb8))
* **know-your-world:** center setup settings panel horizontally ([5f69fab](5f69fab859))
* **know-your-world:** correctly identify local player for cursor sharing ([7aafe8c](7aafe8c92e))
* **know-your-world:** enable hot/cold only for current player in turn mode ([f5ce53e](f5ce53efc0))
* **know-your-world:** fix celebration timer restart and mobile magnifier dismissal bugs ([0558132](055813205a))
* **know-your-world:** fix hot/cold visual feedback delay ([a6352ec](a6352ec624))
* **know-your-world:** fix pointer lock escape for all edges and add smooth release animation ([a7fa858](a7fa858a29))
* **know-your-world:** fix server/client filter mismatch for USA map ([98e74ba](98e74bae3a))
* **know-your-world:** fix TypeScript build errors ([f622bfa](f622bfab54))
* **know-your-world:** guard against undefined state during session init ([ea8965b](ea8965bc95))
* **know-your-world:** improve crosshair UX and fix mobile Select button ([0584863](0584863bdd))
* **know-your-world:** improve mobile layout for setup screen ([81b44a6](81b44a6422))
* **know-your-world:** improve mobile magnifier positioning and sizing ([9a254e2](9a254e2933))
* **know-your-world:** improve mobile magnifier touch controls ([aee5f21](aee5f21ecc))
* **know-your-world:** make game settings visible in right panel ([11d2d56](11d2d5693c))
* **know-your-world:** move Start button to top-right settings panel ([cc51de3](cc51de35e3))
* **know-your-world:** normalize accented letters for keyboard input ([b27856e](b27856e9fc))
* **know-your-world:** prevent hint bubble closing when toggling settings ([a67c11a](a67c11ae04))
* **know-your-world:** raise auto-zoom thresholds for tiny regions ([17c113e](17c113e68b))
* **know-your-world:** reduce magnifier size to 1/3 of pane dimensions ([61a438d](61a438dd31))
* **know-your-world:** remove confidence gate from hot/cold visual emoji ([7f6b9dd](7f6b9dd558))
* **know-your-world:** remove hovered region label from setup screen ([5bb2288](5bb228883d))
* **know-your-world:** Remove redundant preventDefault calls in touch handlers ([021a75f](021a75f583))
* **know-your-world:** remove tips section from setup screen ([c9e9190](c9e9190937))
* **know-your-world:** replace react-spring with CSS animation for crosshair rotation ([af5e7b5](af5e7b59dc))
* **know-your-world:** restore no-music celebration sounds ([f6d1295](f6d1295c6f))
* **know-your-world:** restore Start button character ([7013a7b](7013a7b068))
* **know-your-world:** stabilize mobile magnifier 1:1 touch tracking ([ab30add](ab30adda25))
* **know-your-world:** suppress hot/cold hints during takeover and give-up ([9f6b425](9f6b425daf))
* **know-your-world:** use getBBox() for consistent takeover positioning ([f8acc4a](f8acc4aa6a))
* **know-your-world:** use localPlayerId for cursor updates in all modes ([5e8c37b](5e8c37b68e))
* **know-your-world:** use shared MAX_ZOOM constant for mobile magnifier ([e4c35e9](e4c35e9425))
* **know-your-world:** use spring-for-speed pattern for smooth crosshair rotation ([b7fe2af](b7fe2af369))
* **know-your-world:** use viewport-based maxHeight for right panel ([a4f9db6](a4f9db6d3f))
* lazy-load map data in know-your-world validator ([07c25a2](07c25a2296))
* lower quick-escape threshold to 15px/frame for easier triggering ([97b214d](97b214da12))
* make map-renderer fill parent container for fit-crop-with-fill ([18b1476](18b14766b2))
* make placeholder pages match actual page dimensions ([4003c5c](4003c5ceb7))
* make useArcadeSocket work without ArcadeErrorProvider ([01740af](01740afcb7))
* merge duplicate style attributes on magnifier SVG ([3eda493](3eda493051))
* move pointer lock management to MapRenderer ([0ed4d13](0ed4d13db6))
* page indicator not tracking scroll when showing all pages ([3d157e3](3d157e32ed))
* page indicator stuck on page 1 due to stale closure ([952ebc7](952ebc7756))
* pass correct parameter for borrow boxes in subtraction ([00d892a](00d892a05c))
* position debug panel opposite from magnifier ([aa80a73](aa80a73664))
* position shared worksheet banner below app nav ([fb3412c](fb3412c9a5))
* **practice:** add 80px top padding to account for app nav height ([a50b268](a50b268d35))
* **practice:** allow vertical overflow for help overlays ([1ddf9fc](1ddf9fc94f))
* **practice:** prevent decomposition math from wrapping ([52ea3f1](52ea3f10fa))
* **practice:** remove overflow clipping to allow help overlays ([e9b123a](e9b123a7b3))
* **practice:** remove redundant 'already at target' message ([e9ccfb9](e9ccfb9186))
* **practice:** use explicit padding to prevent shorthand override ([4c00d92](4c00d92ccb))
* preserve saved seed on page reload ([64ce64b](64ce64bd35))
* preserve seed and prngAlgorithm in config migrations ([b18c412](b18c412736))
* preserve user's scaffolding settings when changing skills ([1eb04ce](1eb04ce0c4))
* prevent duplicate API calls in React StrictMode ([0d59676](0d59676b38))
* prevent modal closure when clicking tabs in AllSkillsModal ([4746e1f](4746e1f8fe))
* prevent regrouping problems in no-regrouping skills and enable progressive difficulty toggle ([59712e1](59712e1021))
* prevent skill name wrapping in mini cards with single-line ellipsis ([a463d08](a463d088d7))
* prevent zoom jump on precision mode activation by resetting spring target ([33d9f15](33d9f15897))
* prevent zoom jump when activating precision mode ([9cb3c89](9cb3c898ec))
* properly apply dark mode hover states in dropdown ([34553ce](34553cebf7))
* properly cycle through problem sets when exceeding unique problem space ([55d4920](55d4920167))
* properly zoom to selected continent in game phases ([e900e44](e900e4465b))
* reduce font size for mini skill card titles to prevent wrapping ([833b481](833b481ebb))
* refactor worksheet config persistence to blacklist approach + Storybook stories ([5b6db58](5b6db588a2))
* regenerate lockfile to remove big.js dependencies ([05fc5cf](05fc5cfe49))
* remove all scaffolding from final mastery skills ([d7bec42](d7bec423e0))
* remove background rect from main map SVG ([7d3c5c3](7d3c5c304b))
* remove duplicate containerRect declaration ([1a690e0](1a690e00b0))
* remove magnifierSpring.zoom from effect dependencies ([5eb2eed](5eb2eeda32))
* remove mispositioned background rect from magnifier SVG ([5815cbe](5815cbee15))
* remove pages from visible set when they leave viewport ([9757449](9757449e21))
* remove redundant 'Teens minus singles' subtraction skill ([e156e87](e156e870df))
* remove regex lookbehind for Safari compatibility ([4d77f1f](4d77f1ffd3))
* remove unused velocity tracking and fix TypeScript errors ([0195a6d](0195a6dc6d))
* replace deprecated path() with curve() in borrow arrows ([47d149c](47d149ca17))
* replace ES module imports with JSON data files ([fb735be](fb735be014))
* resolve auto zoom freeze and stuck zoom issues ([0aee60d](0aee60d8d1))
* respect borrow boxes display setting regardless of actual borrowing ([1aef0f2](1aef0f292f))
* respect operator-specific scaffolding in mastery+mixed mode ([a6472a2](a6472a231b))
* respect user's layout options (problemNumbers/cellBorders) in mastery mode ([e708add](e708add9f2))
* responsive page indicator and settings summary improvements ([93ddc28](93ddc28a3a))
* resume zoom animation immediately when precision mode activates ([7ba7e03](7ba7e03661))
* resume zoom animation immediately when precision mode activates ([7c1f2e5](7c1f2e54c9))
* resume zoom animation when target drops below threshold ([e73b59d](e73b59d510))
* scaffolding changes now apply in mastery+mixed mode ([510f052](510f052978))
* **server:** lazy-load game validators to avoid ES module errors ([a88bd58](a88bd5844c))
* show hot/cold button on iPad with mouse attached ([1333818](1333818bae))
* skip pointer lock request on unsupported devices (iPad) ([d6eb997](d6eb997445))
* stabilize mini skill card height and fix preview updates ([4a52943](4a5294353e))
* take all measurements inside animation callback for label sync ([2191e07](2191e0732b))
* track both SVG units and screen pixels for zoom and dampening ([d72f309](d72f309bad))
* transform screen coordinates to SVG space for isPointInFill() ([4c933be](4c933be48a))
* transmit hovered region ID with network cursor to avoid hit-testing discrepancies ([6c3f860](6c3f860efc))
* **tutorial:** expose activeGroupTargetColumn state to context ([69f759a](69f759a178))
* update AbacusQRCode for qrcode.react v4 compatibility ([0f0c3c6](0f0c3c65e8))
* update operator-specific display rules in mastery+mixed mode ([4174b6d](4174b6d2e7))
* upgrade to Node.js 20 to resolve ES module import issues ([192de5c](192de5c6b5))
* use ± symbol for mixed operator icon consistently ([2695b50](2695b50abe))
* use actual SVG path geometry for region detection instead of bounding boxes ([e255ce2](e255ce2c6f))
* use animated spring for magnifier label positioning ([94d1cdf](94d1cdfcb5))
* use ASCII characters for operator icons to support dark mode ([3bd5c00](3bd5c00d21))
* use correct Unicode minus sign (−) for subtraction operator checks ([0dd9e45](0dd9e45952))
* use dynamic ES module imports for [@svg-maps](https://github.com/svg-maps) packages in know-your-world ([ab94fd3](ab94fd350f))
* use LAN IP instead of localhost for QR code camera uploads ([00b400a](00b400ae8a))
* use screen pixels for zoom, abandon SVG path parsing ([912dc38](912dc385b3))
* use subtle gray highlights for dropdown in dark mode ([8d6170a](8d6170a8c7))
* use SVG viewBox units instead of screen pixels for zoom ([0dcaabb](0dcaabb8a5))
* use white text for selected dropdown items in dark mode ([e1a7375](e1a73758d6))
* **worksheets:** add backward compatibility for displayRules in SmartModeControls ([b956e2d](b956e2d605))
* **worksheets:** add borrowNotation and borrowingHints to DisplayRules interfaces ([3b908ac](3b908ac453))
* **worksheets:** add borrowNotation and borrowingHints to validation fallback ([3f700af](3f700af643))
* **worksheets:** add mastery mode to Zod schema validation ([003f1d1](003f1d11cc))
* **worksheets:** correct Typst array membership syntax for ten-frames rendering ([14b3594](14b359462f))
* **worksheets:** enable borrowNotation and borrowingHints in smart difficulty mode ([8020ee8](8020ee835e))
* **worksheets:** prevent infinite loop when problem space is empty ([02463df](02463df8e5))
* **worksheets:** render operators last for proper layering ([cdd0de7](cdd0de797f))
* **worksheets:** sync preview and download problem generation ([822ef78](822ef78e58))
* **worksheets:** ten-frames not rendering in mastery mode ([b36df3a](b36df3a40c))
* **worksheets:** validation function was converting mastery mode to manual ([4ad687d](4ad687df73))
### Features
* **abacus-react:** add defaultValue prop for uncontrolled mode ([3ce12c5](3ce12c59fc))
* add 'auto' option for scaffolding to defer to mastery progression ([a945a62](a945a620c4))
* add adaptive zoom magnifier for Know Your World map ([1e8846c](1e8846cdb1))
* add AI-powered worksheet grading with GPT-5 vision ([6e95732](6e9573288f))
* add auto scaffolding mode with visual feedback and override notices ([b62db5a](b62db5a323))
* add auto-submit on correct answer + Newton poem blog post ([2f7cb03](2f7cb03c3f))
* add comprehensive error handling for arcade games ([e8c5256](e8c52561a2))
* add continent filtering to Know Your World game ([7bb03b8](7bb03b8409))
* add custom error boundaries with navigation ([73cc418](73cc4185c3))
* add database schema for custom skills and skill customizations ([906fa63](906fa63f24))
* add debug bounding boxes to magnifier view ([9c7d2fa](9c7d2fab5f))
* add debug indicator for custom crop region (dev only) ([9c89aad](9c89aadb17))
* add detailed zoom decision debug panel ([cb57f15](cb57f1585a))
* add dev-only crop tool for custom map region cropping ([855e5df](855e5df2c0))
* add download and share buttons to shared worksheet viewer ([9b8947a](9b8947a198))
* add dynamic layout preview component for orientation selection ([8df62d6](8df62d6a45))
* add dynamic operator icon to tab navigation ([b6ff995](b6ff995a8c))
* add exponential zoom scaling for sub-pixel regions ([101213b](101213ba1c))
* add fancy QR codes with abacus logo throughout app ([ebcabf9](ebcabf9bb9))
* add give up with zoom animation for Know Your World ([94cff43](94cff4374f))
* add gold scrim overlay and improve precision mode messaging ([4b20d07](4b20d0753f))
* add interactive world map continent selector ([245005c](245005c8ec))
* add Know Your World geography quiz game ([25e24a7](25e24a7cbc))
* add mobile drawer and detailed summary for shared worksheets ([0a35e70](0a35e70e28))
* add ngrok tunnel to dev server for HTTPS testing ([ab2bfde](ab2bfde9c2))
* add per-country coloring and individual region clicks to continent selector ([2e9f409](2e9f409f26))
* add per-page worksheet generation API ([6398fbe](6398fbead9))
* add Pointer Lock API for precision mode to prevent edge issues ([4d5953d](4d5953d034))
* add precision controls for tiny regions in Know Your World ([3bf127f](3bf127f344))
* add precision mode system with pixel grid visualization ([53e9041](53e90414a3))
* add prev/next navigation buttons to mixed mode mini skill panes ([498df2c](498df2ca5a))
* add problem space validation to warn about duplicate risk ([0b8c180](0b8c1803ff))
* add responsive mobile drawer with draggable settings button ([fc1d7fc](fc1d7fcbd6))
* add responsive page button layout with dynamic dropdown ([3f33cd1](3f33cd1924))
* add shared worksheet viewer with open-in-editor functionality ([4b8b3ee](4b8b3ee532))
* add single-page worksheet preview API endpoint ([10e97db](10e97db78a))
* add skill configuration system with interactive 2D difficulty plot ([7fbc743](7fbc743c4c)), closes [#9333](https://github.com/antialias/soroban-abacus-flashcards/issues/9333) [#10b981](https://github.com/antialias/soroban-abacus-flashcards/issues/10b981)
* add smooth fade-in animation for 404 message text changes ([e88380a](e88380a48d))
* add split-action share button with copy shortcut ([085d200](085d200da4))
* add themed backgrounds and enhanced styling to 404 page ([dd14062](dd14062112))
* add visible grab tab to worksheet panel resize handle ([288e6ed](288e6ed878))
* add visual debugging for zoom importance scoring ([e60a2c0](e60a2c09c0))
* add visual grab tab to resize handle with rounded corners ([6e55d5a](6e55d5add7))
* add visual warnings to page selector buttons ([5a87799](5a8779969c))
* add worksheet generation core logic and helpers ([163517d](163517db7d))
* add worksheet sharing infrastructure with database persistence ([7b4c7c3](7b4c7c3fb6))
* add worksheet studio with comprehensive features ([d5672bd](d5672bdddf))
* apply skill-specific scaffolding and fix mini card heights ([ee90182](ee90182ff2))
* **blog:** add subtraction and multi-digit worksheet blog posts ([dd9587f](dd9587f8cd))
* calculate zoom based on region under cursor, target 15% area ([6736336](6736336317))
* convert operator selection to checkboxes with required validation ([c997c4a](c997c4a7ba))
* create unified difficulty interface with 2-tab selector ([0b7382f](0b7382f1b6))
* enable production source maps for easier debugging ([d992e98](d992e98d77))
* enhance scaffolding tab with live preview and resolved display rules ([9a5a0d4](9a5a0d4e3c))
* **help-system:** add focus areas for skills needing reinforcement ([871390d](871390d8e1))
* **help-system:** add schema for progressive help and feedback loop ([41c4603](41c46038d8))
* **help-system:** add usePracticeHelp hook and skill extraction ([0b1ad1f](0b1ad1f896))
* **help-system:** integrate PracticeHelpPanel into ActiveSession ([373ec34](373ec34e46))
* hide easter egg hint until first discovery ([c2c7153](c2c71531ae))
* implement binary search for optimal zoom level ([1a54f09](1a54f09814))
* implement fit-crop-with-fill for custom map crops ([b6569ed](b6569ed4e1))
* implement lazy loading for worksheet preview with cursor pagination ([8b3d019](8b3d019652))
* implement lazy loading for worksheet preview with cursor pagination ([2a7d67d](2a7d67db58))
* improve shared worksheet viewer UX and multi-page support ([1c10a82](1c10a82c78))
* improve tab navigation layout and add pages to layout button ([926a029](926a029ff8))
* improve worksheet preview placeholder with cartoonish grid layout ([57fb99a](57fb99af63))
* increase max super zoom to 120x for ultra-tiny regions ([9b782be](9b782beabf))
* increase max zoom to 1000x with detailed debug logging ([a6be05f](a6be05f8c1))
* **know-your-world:** add 'H' keyboard shortcut for hint ([cdc9451](cdc94514d9))
* **know-your-world:** add adaptive hint cycling for struggling users ([5440250](54402501e5))
* **know-your-world:** add celebration animations for found regions ([3b9d6b0](3b9d6b0fdf))
* **know-your-world:** add device capability hooks and improve mobile support ([c502a4f](c502a4fa92))
* **know-your-world:** add drill-down map selector and improve setup UI ([a6f8dbe](a6f8dbe474))
* **know-your-world:** add filter tabs for size, importance, and population ([6c3c0ac](6c3c0ac70e))
* **know-your-world:** add fire tracer animation for learning mode takeover ([1e6153e](1e6153ee8b))
* **know-your-world:** add hint system, pointer lock buttons, and mobile magnifier support ([55e480c](55e480c03b))
* **know-your-world:** add hints for Europe and Africa regions ([46e5c6b](46e5c6b99b))
* **know-your-world:** add hot/cold audio feedback for cursor proximity ([69813e9](69813e92a2))
* **know-your-world:** add hot/cold debug panel and production debug mode ([493313a](493313a3bb))
* **know-your-world:** add hot/cold feedback for mobile magnifier ([824325b](824325b843))
* **know-your-world:** add interaction state machine foundation ([e4d6748](e4d6748d70))
* **know-your-world:** add Learning mode and fix hints before name unlock ([fc87808](fc87808b40))
* **know-your-world:** add learning mode takeover animation and fix give-up sequence ([3fd8472](3fd8472e68))
* **know-your-world:** add map zoom preview, remove study time feature ([57dd61b](57dd61b994))
* **know-your-world:** add missing island hints and revise all hints ([8b13b5a](8b13b5a455))
* **know-your-world:** add mobile cursor sharing and fix multi-device coop mode ([2ce5e18](2ce5e180b7))
* **know-your-world:** add mobile virtual keyboard and space-skipping ([5318d0d](5318d0dd89))
* **know-your-world:** add multiplayer cursor sharing and fix map viewport ([c3b94be](c3b94bea3d))
* **know-your-world:** add puzzle piece fly-to-map animation for learning mode ([7c49652](7c496525e9))
* **know-your-world:** add range thermometer for region size selection ([c7c4e7c](c7c4e7cef3))
* **know-your-world:** add region shape silhouette to learning takeover ([ebe07e3](ebe07e358f))
* **know-your-world:** add session-based give-up voting and fix cursor emojis ([bb2d6fc](bb2d6fc7d8))
* **know-your-world:** add speech announcements and compass-style crosshairs ([e0b762e](e0b762e3ee))
* **know-your-world:** add speech synthesis for hints with auto-hint/auto-speak ([cd841ff](cd841ff7dc))
* **know-your-world:** add Strudel-based music system ([7dab07b](7dab07b3a7))
* **know-your-world:** add SVG path geometry helpers for future use ([ea141f0](ea141f04f6))
* **know-your-world:** add turn-based restrictions for letter typing ([45730bb](45730bb4db))
* **know-your-world:** align guidance UI with assistance levels ([7e7a8dc](7e7a8dc1e8))
* **know-your-world:** auto-enable hot/cold for learning mode ([dcc32c2](dcc32c288f))
* **know-your-world:** enhance hint audio and region name display ([e6f58bf](e6f58bfd93))
* **know-your-world:** fix magnifier outline aspect ratio and add visual debug toggle ([ac915f2](ac915f2065))
* **know-your-world:** full-screen layout with squish-through pointer lock escape ([1729418](1729418dc5))
* **know-your-world:** implement empirical scale measurement for 1:1 magnifier tracking ([39886e8](39886e859c))
* **know-your-world:** improve magnifier UX and hide abacus on games ([fa1514d](fa1514d351))
* **know-your-world:** improve mobile magnifier controls and animations ([4449fb1](4449fb19b4))
* **know-your-world:** improve mobile magnifier with adaptive zoom and select button ([60cf98e](60cf98e77a))
* **know-your-world:** improve region size filter layout ([558d369](558d369ba0))
* **know-your-world:** improve setup screen UX ([dc4d621](dc4d62195b))
* **know-your-world:** improve takeover UI and fix celebration sound bug ([a8c6b84](a8c6b84855))
* **know-your-world:** live crop updates and safe zone improvements ([3f4691e](3f4691e8a3))
* **know-your-world:** make magnifier lazy - only move when cursor obscured ([ac82564](ac82564eac))
* **know-your-world:** make magnifier size responsive to aspect ratio ([5920cb4](5920cb4dc3))
* **know-your-world:** match setup phase map positioning with gameplay ([b030558](b0305581f9))
* **know-your-world:** move region size filters inside map preview ([81301ab](81301ab148))
* **know-your-world:** move start button below settings controls ([a05c4ca](a05c4ca5bf))
* **know-your-world:** Phase 2 - integrate useMagnifierZoom hook ([8ce878d](8ce878d03e))
* **know-your-world:** responsive setup + travel-themed start button ([02762fa](02762fad81))
* **know-your-world:** separate region filtering from assistance level ([9499e4e](9499e4e8b5))
* **know-your-world:** show magnifier on mobile drag gesture ([a02a710](a02a7108e9))
* **know-your-world:** speak country names in user's locale ([426a1e6](426a1e6868))
* **know-your-world:** sync letter confirmation across multiplayer sessions ([655660f](655660f7cf))
* **know-your-world:** unified region selector with inline list on desktop ([d329d80](d329d80399))
* **know-your-world:** unify setup and gameplay UI positions ([141a506](141a506739))
* **know-your-world:** unify setup UI positions with gameplay ([c1a0485](c1a0485b1d))
* **know-your-world:** wire interaction state machine to MapRenderer ([7e55953](7e55953eee))
* make 404 page abacus hero-sized and responsive ([41de252](41de25238f))
* make resize handle grab tab fully draggable with rounded corners ([be40f70](be40f70bc6))
* make scaffolding and preview collapsible ([804fb1a](804fb1a2f6))
* make super zoom threshold configurable and increase to 3px ([d7ce474](d7ce474a51))
* make zoom transitions 4x slower for smoother experience ([ca752bd](ca752bd0aa))
* move difficulty parameters into Smart mode ([4b66758](4b667587f8))
* move layout controls to OrientationPanel with toggles ([995966f](995966ffbc))
* operator-specific scaffolding for mixed mastery mode ([4d7d000](4d7d000046))
* optimize problem generation and add duplicate warning system ([11c46c1](11c46c1b44))
* pause zoom animation at precision mode threshold ([c4989b3](c4989b3ab0))
* pause/resume zoom animation at precision mode threshold ([bdf59e5](bdf59e571d))
* pause/resume zoom animation at precision mode threshold ([4687820](4687820d8a))
* persist seed and prngAlgorithm for exact problem reproducibility ([8cb2209](8cb2209d84))
* **practice:** add dark mode support and fix doubled answer digits ([026993c](026993cb05))
* **practice:** add progressive help overlay with proper positioning ([9a4ab82](9a4ab8296e))
* **practice:** add session HUD with tape-deck controls and PageWithNav ([b19c6d0](b19c6d0eca))
* **practice:** add smooth problem transition animation ([b12112e](b12112e8da))
* **practice:** add student onboarding and offline sync features ([b52f054](b52f0547af))
* **practice:** add three-part daily practice session system ([5855438](585543809a))
* **practice:** improve help UX with coach hints and simplified UI ([19169ad](19169ad9fe))
* **practice:** integrate progressive help with decomposition display ([804d937](804d937dd9))
* redesign shared worksheet viewer with read-only studio and proper error handling ([23dccc0](23dccc0ef3))
* remove all easter egg hints from 404 page ([1756182](17561829ef))
* remove redundant navigation buttons from 404 page ([e5262e5](e5262e5007))
* show magnifier only when current target region needs magnification ([996c973](996c973774))
* show magnifier only when target region needs it ([c6997ac](c6997ac9a7))
* show visual feedback for auto-resolved scaffolding values ([fbe776a](fbe776ac09))
* smooth cursor dampening transitions with react-spring ([66544dc](66544dc7dd))
* **thermometer:** add "only" buttons to quickly select single category ([623f882](623f882075))
* **worksheets:** add 3x scale effect to thrown dice ([920a855](920a855eb5))
* **worksheets:** add draggable dice easter egg with physics ([b8e66df](b8e66dfc17))
* **worksheets:** add duplicate risk warnings to page selector UI ([1d8dceb](1d8dceb55b))
* **worksheets:** add foundational steps to progression path ([7e6f99b](7e6f99b78c))
* **worksheets:** add QR codes with share codes for easy worksheet sharing ([a0e73d9](a0e73d971b))
* **worksheets:** add shuffle button with animated dice icon ([f97efb5](f97efb5c94))
* **worksheets:** add viewport edge ricochet to dice physics ([c6db7dc](c6db7dcfa2))
* **worksheets:** enhance dice throw physics for natural feel ([047a960](047a960567))
* **worksheets:** restore mastery progression UI with 3-way mode selector ([26a0885](26a08859d7))
* **worksheets:** smooth dice rotation settle to final face ([d00c707](d00c70750e))
* **worksheets:** upgrade to 3D dice with random rotation animation ([3cd5e49](3cd5e4992b))
### Performance Improvements
* add spatial filtering to skip distant regions ([8cb4c88](8cb4c88bef))
* cache polygon conversions to fix performance regression ([348ce8f](348ce8f314))
* **know-your-world:** memoize state machine return value and remove debug logging ([d85b976](d85b976f8b))
* reduce retry limit from 3000 to 100 in problem generators ([08fef59](08fef59cc5))
### Reverts
* **know-your-world:** undo premature extractions, restore working state ([f0bf205](f0bf2050d3))
* remove ngrok and LAN IP detection ([0040b57](0040b57829))
Auto-generated fresh SVG examples and unified gallery from latest templates.
Includes comprehensive crop mark demonstrations with before/after comparisons.
Files updated:
- packages/templates/gallery-unified.html
🤖 Generated with GitHub Actions
Co-Authored-By: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Add standard React controlled/uncontrolled component pattern to AbacusReact:
- Add `defaultValue` prop to support uncontrolled mode (component owns state)
- When `value` is provided, component operates in controlled mode (syncs to prop)
- When only `defaultValue` is provided, component operates in uncontrolled mode
- Update HelpAbacus to use defaultValue for interactive help
This enables interactive abacus in help mode where the component tracks its own
state while parent monitors via onValueChange callback.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Auto-generated fresh SVG examples and unified gallery from latest templates.
Includes comprehensive crop mark demonstrations with before/after comparisons.
Files updated:
- packages/templates/gallery-unified.html
🤖 Generated with GitHub Actions
Co-Authored-By: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
- Add runtime crop override system for live DevCropTool updates without page reload
- Fix SVG letterboxing in DevCropTool coordinate conversion (screenToSvg/svgToScreen)
- Hide all UI (nav, GameInfoPanel) during crop mode for unobstructed drawing
- Show debug overlay (leftover/crop rectangles) even when no custom crop defined
- Use full map bounds as implicit crop when no custom crop exists
- Ensure map always fits within leftover area (not under UI elements)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Auto-generated fresh SVG examples and unified gallery from latest templates.
Includes comprehensive crop mark demonstrations with before/after comparisons.
Files updated:
- packages/templates/gallery-unified.html
🤖 Generated with GitHub Actions
Co-Authored-By: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Recover all changes from stash including:
- Linter/formatter updates across codebase
- Settings permission updates for git checkout
This commit captures the complete state of work that was
stashed during the previous session's git operations.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
# [2.14.0](https://github.com/antialias/soroban-abacus-flashcards/compare/abacus-react-v2.13.2...abacus-react-v2.14.0) (2025-11-08)
### Bug Fixes
* add light/dark mode support to tutorial tooltips and decomposition UI ([ea10249](ea10249e94))
* replace hardcoded colors with semantic tokens in HomeBlogSection ([e124096](e124096914))
* use semantic tokens for nav bar transparent mode on hero ([d05c6a8](d05c6a8664))
* **worksheets:** Add "Practice" difficulty profile for scaffolded regrouping mastery ([d23b606](d23b606642))
* **worksheets:** Fix subtraction regrouping frequency bug ([8d8e55d](8d8e55d5c4))
### Features
* add close button and theme support to mobile menu ([ea41b32](ea41b323d0))
* add function-based custom bead rendering and HTTP status code easter eggs ([fde5ae9](fde5ae9164))
* add theme support to abacus style dropdown ([2e294ee](2e294ee820))
* add theme support to config panel components ([c868421](c8684213fa))
* add theme support to desktop hamburger menu ([ab9272b](ab9272bee6))
* add theme support to MyAbacus button ([702c1c9](702c1c9af2))
* add theme support to orientation and generate panels ([e38775b](e38775b991))
* add theme support to worksheet page container ([5c14925](5c14925d7d))
* add theme support to worksheet preview ([693b679](693b679965))
* implement full-screen mobile hamburger menu with portal ([615cd28](615cd28829))
* implement two-column landscape layout with smart viewport-based flexbox ([b57458b](b57458b039))
* make mobile menu more responsive with larger touch targets ([3ad244f](3ad244f2d3))
* **worksheets:** filter operator-specific scaffolds from difficulty change descriptions ([cace1c7](cace1c75c6))
* **worksheets:** filter operator-specific scaffolds from preset summaries ([8407b07](8407b070f9))
* **worksheets:** integrate subtraction scaffolding into smart difficulty mode ([15bded1](15bded1ab8))
Add dynamic custom bead rendering system that allows beads to change appearance
based on their context (active state, position, place value, type, etc.).
Custom Bead Features:
- Add emoji-function, image-function, and svg-function types
- Functions receive CustomBeadContext with bead state and style info
- Support for dynamic rendering based on: active state, position, place value,
bead type (heaven/earth), color, and size
- Enables creative visualizations like traffic lights, themed symbols, etc.
404 Page Easter Eggs:
- Create interactive 404 page with manipulable abacus
- Add 14 HTTP status code easter eggs (200, 201, 301, 400, 401, 403, 418,
420, 451, 500, 503, 666, 777, 911)
- Each code triggers site-wide custom bead transformation
- Use function-based rendering for variety (different emojis per bead
position/state)
- Easter eggs persist until page reload via global AbacusDisplayContext
Storybook Documentation:
- Add comprehensive custom bead stories showing static and function-based usage
- Include examples: active/inactive states, heaven/earth types, place value
colors, traffic lights, color theming
- Document CustomBeadContext API and usage patterns
Technical Implementation:
- Extend CustomBeadContent union type in AbacusContext
- Update AbacusStaticBead and AbacusAnimatedBead to handle function types
- Pass bead context (type, value, active, position, placeValue, color, size)
to custom render functions
- Maintain consistency across static (SSR) and animated (client) rendering
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Two critical issues fixed:
1. **Duplicate numerals**: Both AbacusSVGRenderer and AbacusReact were rendering
numerals when showNumbers={true}, causing two overlapping number displays.
- Disabled SVG text numerals in AbacusSVGRenderer (line 436: added `false &&`)
- NumberFlow provides better animated numerals, keep only those
2. **White numerals in dark mode**: NumberFlow components were inheriting CSS
color from parent, turning white in dark mode (unreadable on light frames).
- Added explicit color style to NumberFlow: uses themeAwareCustomStyles
- Now consistently dark (rgba(0,0,0,0.8)) regardless of page theme
This was the root cause of the "white numerals everywhere" issue - the
NumberFlow components were inheriting dark mode CSS colors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Critical bug: AbacusReact was passing showNumbers={false} to AbacusSVGRenderer
regardless of the prop value, causing numerals to never be displayed.
Changed line 2315 from:
showNumbers={false}
to:
showNumbers={finalConfig.showNumbers}
This was preventing the automatic theme detection for numerals from working,
since numerals were never being rendered at all.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add new story file demonstrating the automatic theme detection feature:
- **AutomaticThemeDetection**: Interactive demo with light/dark toggle showing automatic numeral color adjustment
- **UseSystemThemeHook**: Demonstrates the useSystemTheme hook API and how it detects theme changes
- **ManualColorOverride**: Shows how custom numeral colors override automatic detection
- **NumeralsComparison**: Side-by-side comparison of abacus with/without numerals in both themes
- **EducationalAppExample**: Real-world example of a theme-aware math learning app
Each story includes:
- Interactive theme toggle controls
- Visual demonstrations of the feature
- Explanatory text and usage notes
- Theme-appropriate styling
The stories complement the README documentation by providing live,
interactive examples that users can experiment with in Storybook.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
# [2.12.0](https://github.com/antialias/soroban-abacus-flashcards/compare/abacus-react-v2.11.0...abacus-react-v2.12.0) (2025-11-08)
### Bug Fixes
* add missing blog dependencies to package.json ([ceefb2f](ceefb2f1bd))
* arrow direction - go RIGHT to borrowed 10s box, not left ([fab1fb1](fab1fb10b7))
* disable place value colors in subtraction borrow boxes to fix arrow layering ([b4586ba](b4586bac8e))
* make borrow notation destination boxes full height ([17307f7](17307f7e82))
* position arrowhead at endpoint and increase size ([bdf28b2](bdf28b21b2))
* prevent undefined displayRules error in worksheet generator ([7c33d02](7c33d0246f))
* reduce borrowing hint font size from 0.5x to 0.25x ([f5d3de2](f5d3de2309))
* resolve TypeScript errors blocking Docker build ([a195338](a195338ba1))
* use curved Bezier path for borrow arrow ([9b4eb14](9b4eb14aaa))
* use dark gray for borrowing hints on colored backgrounds ([5cb346d](5cb346deee))
* use numeric cellSize for borrow box sizing in hints ([cc54176](cc54176cb1))
* **worksheets:** actually fix dropdown button height by constraining description area ([aa9052a](aa9052a49e))
* **worksheets:** Add operator to preview query key and update UI labels ([97ddc7e](97ddc7ee67))
* **worksheets:** add V4 fields to preview query key for cache invalidation ([d9b54a7](d9b54a736c))
* **worksheets:** align makeEasier fallback with spec priorities ([3e56e1d](3e56e1d6b6))
* **worksheets:** align makeHarder fallback with spec priorities ([a170209](a170209b2f))
* **worksheets:** correct findNearestPreset direction logic ([878cf02](878cf02511))
* **worksheets:** correct scaffolding summary to include all conditional modes ([2797038](2797038502))
* **worksheets:** dynamically size grid based on actual problem digits ([130bbd4](130bbd49dd))
* **worksheets:** increase color visibility for difficulty presets ([a7412ad](a7412adbee))
* **worksheets:** increase dropdown button height to fit all content lines ([3a43149](3a43149995))
* **worksheets:** Make destination borrow box more visible ([a01fa81](a01fa818b4))
* **worksheets:** persist digitRange and manualPreset in auto-save ([c874995](c87499535a))
* **worksheets:** prevent wrong preset showing as active at custom positions ([88e929e](88e929ed63))
* **worksheets:** Set showBorrowNotation to false for smart mode ([e9d52ba](e9d52bab49))
* **worksheets:** show ten-frames in smart mode when rule is 'always' ([0bc8272](0bc8272830))
* **worksheets:** update display options preview to use new problem-stack signature ([258b9ac](258b9ac1b4))
* **worksheets:** use fixed height instead of min-height for dropdown button ([fe1ef8a](fe1ef8a7fc))
* **worksheets:** use imperative voice for difficulty adjustment button labels ([d991512](d99151239d))
* **worksheets:** use white text on colored backgrounds for readability ([2b7b8ec](2b7b8ecc87))
### Features
* **abacus-react:** add automatic theme detection for numeral colors ([cbfd861](cbfd8618a9))
* add arrow from '1' in borrow hint pointing right ([b718994](b718994dab))
* add diagonal arrow from '1' to borrowed 10s box ([a9319c3](a9319c3bd8))
* add infrastructure for borrowing hints toggle ([74c6756](74c67566d2))
* add smooth curved arrow for borrowing hints ([112745c](112745ce16))
* **blog:** add "The Calculator Won" post on abacus education history ([8e04867](8e0486765a))
* **blog:** add navigation bar to blog pages ([6b4ed5d](6b4ed5d9dc))
* handle cascading borrows in borrowing hints ([3e1b51b](3e1b51bd84))
* implement borrowing hints arrow visualization ([b2f875c](b2f875c5a5))
* implement borrowing hints visual guidance ([89b8f98](89b8f98662))
* implement light/dark theme system with semantic tokens ([210a014](210a014699))
* optimize ten-frame blog examples for dark theme ([904701d](904701da2b))
* refactor borrow scaffolding into unified UI with column alignment ([41b5c05](41b5c057ed))
* **worksheets:** Add borrow notation scaffolding for subtraction ([ff161d4](ff161d4e30))
* **worksheets:** add color-coding to difficulty presets with interpolation ([b1201b8](b1201b83c0))
* **worksheets:** add difficulty preset dropdown for Smart mode ([49f6c02](49f6c029f6))
* **worksheets:** add interactive 2D difficulty map with hover preview ([b92b702](b92b702223))
* **worksheets:** add ModeSelector component for Smart/Manual mode switching ([4ffd47a](4ffd47a6b6))
* **worksheets:** add operator selection and subtraction problem generation ([ab87c6e](ab87c6ebe7))
* **worksheets:** add regrouping frequency controls to Manual mode ([f060692](f06069241f))
* **worksheets:** add subtraction problem analysis and implementation plan ([a7b48a2](a7b48a2879))
* **worksheets:** add V3 config schema with Smart/Manual mode discrimination ([cd1b3ed](cd1b3edc15))
* **worksheets:** add visual mode badges to scaffolding summary ([eaeeae4](eaeeae4ce8))
* **worksheets:** display scaffolding attributes on separate lines with fixed button height ([cc9fff7](cc9fff7733))
* **worksheets:** implement true RGB color interpolation for custom difficulty ([952cffa](952cffa2d1))
* **worksheets:** implement unique place value colors for 1-6 digit problems ([65e272c](65e272c570))
* **worksheets:** improve preset dropdown with descriptions and remove duplicate buttons ([852504a](852504a4fd))
* **worksheets:** make progressive difficulty available in both Smart and Manual modes ([54abd5d](54abd5de09))
* **worksheets:** Phase 10 - Add operator validation ([d93dfac](d93dfac461))
* **worksheets:** Phase 5 - Update typstGenerator for operator support ([b191bb9](b191bb9a82))
* **worksheets:** Phase 7 - Add operator to auto-save persistence ([01d0959](01d095942d))
* **worksheets:** Phase 8 - Update preview and example routes for operator ([0106068](010606848d))
* **worksheets:** Phase 9 - Update DisplayOptionsPreview for operator ([d5bbd78](d5bbd783b3))
* **worksheets:** reorganize orientation panel with Radix dropdown and compact layout ([f37960a](f37960aa94))
* **worksheets:** replace digit selector with Radix double-thumbed slider ([c0298cf](c0298cf65d))
* **worksheets:** show enabled scaffolding aids instead of numeric level ([0b8b0d2](0b8b0d21c5))
* **worksheets:** show nearest presets for custom difficulty configurations ([0e3f0ae](0e3f0aed94))
* **worksheets:** update validation and generation for V3 mode-aware schema ([ada9600](ada96005f5))
* **worksheets:** use more vibrant and distinct difficulty colors ([984b75c](984b75cb94))
* **worksheets:** use scaffolding summary for all preset descriptions ([23f0f1d](23f0f1dc21))
### Reverts
* remove all color-coding attempts for difficulty presets ([d52b2aa](d52b2aa4aa))
Implement Option 3: Make AbacusReact theme-aware to automatically
adjust numeral colors based on the document's theme.
**New Features:**
- Add `useSystemTheme` hook that detects theme from document root
- Watches for `data-theme` attribute changes
- Watches for `.light` / `.dark` class changes
- Returns 'light' or 'dark' theme
- SSR-safe with proper fallback
**Changes:**
- AbacusReact now automatically sets dark numeral color (rgba(0,0,0,0.8))
as default when no custom color is provided
- Works on white/translucent abacus frames in both light/dark page themes
- Users can still override with custom `customStyles.numerals.color`
- Theme detection uses MutationObserver for automatic updates
**Exports:**
- Export `useSystemTheme` hook for consumer use
- Export `SystemTheme` type ('light' | 'dark')
**Benefits:**
- Numerals always visible regardless of page theme
- No manual coordination needed
- Works automatically with web app's ThemeContext
- Zero breaking changes (respects existing customStyles)
Fixes numeral visibility issue where white numerals appeared on
white abacus frames in dark mode.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixes production error "Cannot read properties of undefined (reading 'carryBoxes')"
that occurred when users tried to adjust difficulty settings.
Root cause: displayRules was undefined for new users or users with old V1 config
in database. Difficulty adjustment buttons accessed displayRules.carryBoxes without
checking if displayRules existed first.
Changes:
- AdditionWorksheetClient: Initialize displayRules with defaults when missing
- ConfigPanel: Use null-coalescing operators instead of non-null assertions
- ConfigPanel: Add error logging when required fields are missing
- NEW: WorksheetErrorBoundary component to catch all errors in worksheet page
- page.tsx: Wrap client component with error boundary
This ensures users see helpful error messages instead of blank pages,
and never need to open the browser console to understand what went wrong.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
When showNumbers is enabled, the SVG viewBox now includes the 40px space
needed for NumberFlow elements rendered below abacus columns.
Previously: Always passed showNumbers: false to calculateStandardDimensions
Now: Pass finalConfig.showNumbers to include numbers space when needed
This fixes overflow issues where numerals were cut off because the viewBox
height didn't account for them.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add trailing comma in cropToActiveBeads config
- Format console.log call for better readability
- Format postMessage call parameters
- Add approved bash commands for icon testing to local settings
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add comprehensive cropping examples including:
- Basic cropping (with and without hideInactiveBeads)
- Padding configuration examples
- Interactive AbacusReact examples with different scale factors
- Favicon-style icons (all 31 days) showing adaptive crop positioning
- Compact mode showcase
These stories demonstrate how cropping adapts to active bead positions,
resulting in different vertical positions for each value (intentional behavior).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add cropToActiveBeads prop to AbacusSVGRenderer that accepts boolean or {padding} object
- Pass actual scaleFactor to calculateAbacusCrop for correct crop calculations at any scale
- Remove double scaling (was multiplying width/height by scaleFactor after crop already included it)
- Add cropToActiveBeads prop to AbacusStatic config and pass through to renderer
- Add cropToActiveBeads prop to AbacusReact config and pass through to renderer
This enables both components to crop the SVG viewBox to show only active beads with optional padding, working correctly at all scale factors (0.8, 1.0, 1.5, 2.0, etc.).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implemented i18n across all three create pages with translations for 7 languages (en, de, ja, hi, es, la, goh):
- Created comprehensive translation files in src/i18n/locales/create/
- Updated /create (hub) page with all card content translations
- Updated /create/abacus page with parameter labels and help text
- Updated /create/flashcards page with UI elements and status messages
- Integrated create translations into main messages system
Translation coverage includes:
- Page titles and subtitles
- Feature descriptions and lists
- Form labels and placeholders
- Button text (normal and loading states)
- Error messages
- Help text and instructions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add additional auto-approved commands to improve Claude Code workflow:
- git log/tag operations
- pnpm dev server
- biome formatting
- TypeScript compilation
- GitHub API access
- WebSearch and WebFetch
- npm/pnpm package management
These are safe, read-only, or routine development operations.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Multiple fixes for tutorial regression issues:
- Fix overlay rendering: Changed from <g> to <foreignObject> to support
DOM components (Radix UI Tooltip), fixing hydration errors
- Fix overlay positioning: Use calculateBeadPosition for accurate placement
- Fix arrow indicators: Reduce size, fix transform origin for center-based
scaling, correct direction logic for heaven vs earth beads, add black
stroke for contrast on yellow backgrounds, remove unnecessary circle
- Fix bead visibility: Implement proper opacity cascade (customStyle ->
active -> hideInactiveBeads + hover), use opacity 0 instead of
conditional rendering to enable hover detection
- Add abacus-level hover: Track hover state at abacus level and propagate
to beads so inactive beads appear on hover over any part of abacus
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
After the refactor to shared SVG rendering, data-testid attributes were
removed from beads, causing controlled-input tests to fail. Added them
back to both AbacusAnimatedBead and AbacusStaticBead for test compatibility.
Test IDs follow pattern: bead-place-{placeValue}-{type}[-pos-{position}]
Examples: bead-place-0-heaven, bead-place-0-earth-pos-0
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>