Commit Graph

1949 Commits

Author SHA1 Message Date
Thomas Hallock a7890873ed fix: improve visual balance of inactive heaven bead positioning
Increased inactive heaven bead gap from 3pt to 8pt for better visual
balance with earth beads. Now positioned at 14pt from top vs
reckoning bar at 20pt, giving 6pt clearance.

This provides more proportional spacing compared to earth beads
while keeping heaven beads clearly above the reckoning bar.

Updated all example images to reflect the improved positioning.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-10 07:24:49 -05:00
Thomas Hallock 2d7d4efacc fix: position inactive heaven beads above reckoning bar, not below
My previous attempt to match earth bead gaps exactly resulted in
inactive heaven beads appearing below the reckoning bar at 27pt
while the bar is at 20pt.

Fixed by:
- Positioning inactive heaven beads at bead-size/2 + 3pt = 9pt from top
- This places them clearly above the reckoning bar (at 20pt)
- Removed unused inactive-bead-gap variable
- Active heaven beads remain just above the bar as intended

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-10 07:22:19 -05:00
Thomas Hallock 0c1f44b8c9 fix: make sorting game action buttons visible during gameplay
The 'Check My Solution' and 'End Game' buttons were hidden because
they were inside the .sorting-controls div, which gets hidden when
the game starts.

Solution:
- Move action buttons outside .sorting-controls into new .sorting-game-actions div
- Show/hide the entire .sorting-game-actions container instead of individual buttons
- Add CSS styling for the new container
- Buttons now remain visible throughout sorting gameplay

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-10 07:20:17 -05:00
Thomas Hallock 209ea0f13b fix: make inactive heaven bead gaps truly equal to earth bead gaps
The previous fix used a fixed 5pt gap for heaven beads while earth beads
used a calculated gap of (bead-size + bead-spacing) + 5pt = 21pt.

This fix:
- Adds inactive-bead-gap variable for consistency
- Makes inactive heaven beads use same gap calculation as earth beads
- Now both heaven and earth inactive beads have visually equal spacing
- Updated all example images to show the corrected equal spacing

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-10 07:18:42 -05:00
Thomas Hallock 0c4eea5a04 fix: correct heaven bead positioning to match earth bead gap consistency
Fix heaven bead positioning issue where inactive heaven beads appeared
too close to the reckoning bar. Now inactive heaven beads use the same
5pt gap as inactive earth beads for visual consistency.

Changes:
- Inactive heaven beads: moved from 5pt+bead-size/2 to bead-size/2+5pt gap
- Active heaven beads: fine-tuned to heaven-earth-gap-bead-size/2-1pt
- Updated example images to reflect corrected positioning

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-10 07:15:53 -05:00
Thomas Hallock 243160ebe5 docs: enhance README to showcase full project capabilities
Transform README from simple PDF generator description to comprehensive
documentation highlighting interactive web flashcards, quiz modes,
sorting challenges, multiple output formats, APIs, and educational features.

Major additions:
- Interactive web flashcards with quiz modes and sorting challenges
- Multiple output formats (PDF, PNG, SVG, HTML)
- REST API and Node.js integration documentation
- Comprehensive test coverage details
- Enhanced examples and feature categorization
- Updated project structure reflecting actual codebase

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-10 07:09:34 -05:00
Thomas Hallock df41f2eee3 fix: implement gap-filling logic for sorting challenge boundary issues
Replace problematic overflow behavior where cards knocked off the end
would return to selection pool. Cards now shift left to fill gaps,
only returning excess cards to pool when truly necessary.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-10 07:05:29 -05:00
Thomas Hallock 9b6cabb111 feat: implement modal dialogs with fullscreen support for challenges
Major UX improvement replacing inline challenge sections with professional modal dialogs:

**Modal System:**
- Clean challenge buttons with attractive call-to-action design
- Professional modal dialogs with smooth animations (fadeIn, slideIn)
- Full Fullscreen API support with cross-browser compatibility
- ESC key, outside click, and close button dismiss modals
- Mobile-responsive design with optimized sizing

**Quiz Integration:**
- Fixed critical bug where quiz ran behind modal (invisible)
- Moved all quiz elements (game, input, results) inside modal
- Updated JavaScript to work with modal structure
- Maintained all existing functionality and scoring systems

**Technical Implementation:**
- ModalManager class handles all modal functionality
- Cross-browser fullscreen support with fallbacks
- Responsive CSS Grid layout for challenge buttons
- Import compatibility fixes for both direct and module execution

**Benefits:**
- Cleaner main page (no cluttered challenge controls)
- Immersive fullscreen experience for distraction-free challenges
- Professional modern UI with smooth transitions
- Better focus and attention on individual challenges

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-10 06:48:34 -05:00
Thomas Hallock a1fd4c84d3 fix: handle both direct and module execution for web format
- Add try/except for import compatibility
- Supports both `python3 src/generate.py` and `python3 -m src.generate`
- Fixes nested try/except structure for proper error handling

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-10 06:48:23 -05:00
Thomas Hallock adbefdc363 chore: update Claude settings with additional bash permissions
- Add permission for git restore command
- Required for git workflow during development

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 20:52:15 -05:00
Thomas Hallock 0bea2fb733 test: add comprehensive quiz functionality tests
- Tests quiz HTML structure and control elements
- Validates JavaScript classes and methods
- Verifies default values and configuration
- Tests card count buttons and progress tracking
- Validates input parsing and scoring logic
- Checks countdown functionality and responsive design
- Tests accessibility features
- Covers various card count scenarios

Ensures interactive quiz features work correctly across different configurations.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 20:51:59 -05:00
Thomas Hallock ee7a5e4a0b feat: implement fair scoring algorithm for card sorting challenge
Replaces simple position-based scoring with sophisticated sequence alignment algorithm:

- Longest Common Subsequence (50% weight): Rewards cards in correct relative order
- Exact Position Matches (30% weight): Rewards cards in exact correct positions
- Sequence Organization (20% weight): Uses inversion counting to measure organization

Key improvements:
- Handles shifts gracefully (e.g. [2,3,4,5,1] vs [1,2,3,4,5] gets significant credit)
- Provides detailed scoring breakdown with component analysis
- Shows specific metrics (cards in order, exact matches)
- Fair assessment that doesn't penalize shifted sequences

Algorithm uses sequence alignment principles similar to Levenshtein distance
but tailored specifically for this educational sorting task.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 20:51:51 -05:00
Thomas Hallock b633578ac5 fix: update relative import in generate.py for module compatibility
- Change 'from web_generator import' to 'from .web_generator import'
- Ensures proper module resolution when running as python -m

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 20:51:37 -05:00
Thomas Hallock 2d7d926f7c chore: update Claude settings to allow pytest and python commands
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 20:49:45 -05:00
Thomas Hallock 0a4e849c35 feat: add web output format with interactive hover flashcards
Add new web output format that generates a static HTML page with:
- Inline SVG abacus representations using existing Typst->SVG pipeline
- Hover functionality to reveal numerals on cards
- Responsive grid layout that works on desktop and mobile
- Print-friendly styles for offline practice
- Support for all existing configuration options (colors, shapes, etc.)

Usage: python3 src/generate.py --format web --range 1-10 --output cards.html

The web format reuses the existing visual generation code, ensuring
consistency with PDF/PNG/SVG outputs while providing an interactive
learning experience in the browser.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 17:46:45 -05:00
Thomas Hallock 9b8fe745e2 refactor: remove skipped test and unused reference update utility
- Remove test_reference_image_update_utility that was always skipped
- Remove --update-references option and make target that were unused
- Simplify reference image update process to manual deletion + test rerun
- Clean up documentation to reflect simpler approach

All tests now run without skipping. Reference updates are handled
by deleting old images and letting tests auto-generate new ones.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 17:35:23 -05:00
Thomas Hallock 3c0affca00 fix: resolve test failures and improve test robustness
- Fix empty array generation in Typst files (empty list now generates () not (,))
- Adjust range parsing test expectations to match actual behavior
- Fix visual test dimensions to use proper Typst units (2in vs 300px)
- Fix pytest configuration access for reference image updates
- Register pytest markers to eliminate warnings
- Adjust visual comparison thresholds for more reliable testing

All tests now pass successfully including visual regression tests.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 17:33:44 -05:00
Thomas Hallock 8c15d06593 feat: integrate pytest testing with make targets
Add pytest integration to Makefile with new targets:
- make pytest: run all tests
- make pytest-fast: run unit tests only (skip slow integration tests)
- make pytest-visual: run visual regression tests only
- make pytest-cov: run tests with coverage reports
- make update-references: update visual test reference images

Update make install to use requirements.txt and reorganize help output
to clearly separate build, test, and setup targets.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 17:29:19 -05:00
Thomas Hallock 7a2eb309a8 feat: add comprehensive test suite with visual regression testing
Implement pytest-based testing framework with:
- Unit tests for configuration parsing and core generation logic
- Visual regression tests using perceptual image hashing
- Fixtures and test configuration in conftest.py
- Test documentation and usage guide

Visual tests generate reference images and compare new output against them
to catch regressions while allowing for minor anti-aliasing differences.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 17:29:09 -05:00
Thomas Hallock 11306dfb2e feat: add testing framework dependencies
Add pytest and visual testing dependencies to requirements.txt:
- pytest>=7.0 for test framework
- pytest-cov>=4.0 for coverage reports
- pillow>=10.0 for image processing
- imagehash>=4.3 for visual regression testing

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 17:28:58 -05:00
Thomas Hallock 33153108a2 feat: add single card template for PNG/SVG output
- Create templates/single-card.typ for individual card rendering
- Includes local copy of create-colored-numeral function
- Supports transparent backgrounds and exact card dimensions
- Used by PNG/SVG generation to avoid PDF intermediate

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 17:01:50 -05:00
Thomas Hallock 1adbd1a5ff feat: add CI-friendly example generation and verification
- Add 'make examples' to regenerate README images
- Add 'make verify-examples' for CI verification
- Create GitHub Action to verify examples are up to date
- Improve generate_examples.py with better error handling
- Add update-examples.sh convenience script
- Document development workflow in README

This ensures README examples always match the actual code output.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 15:55:53 -05:00
Thomas Hallock 3c9c06acc9 docs: add cutting guides examples to README
- Generate examples showing cutting guides and registration marks
- Add 'Printing Features' section to README
- Show full-page cutting guides for accurate card separation
- Include example with both cutting guides and registration marks

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 15:52:37 -05:00
Thomas Hallock 4ca23e9308 docs: add visual examples to README
- Create generate_examples.py script to convert PDFs to PNGs
- Generate example images showcasing all major features
- Add image gallery to README showing:
  - Basic soroban/numeral pairs
  - Color schemes and colored numerals
  - Different bead shapes
  - Various layouts and options
- Include front/back examples for double-sided cards

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 15:49:32 -05:00
Thomas Hallock 8bd6ca2968 chore: update Claude settings with git permissions
🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 15:46:10 -05:00
Thomas Hallock adc5a557e2 docs: update README with new features and Node.js integration
- Document all new features (colors, shapes, scaling, skip counting)
- Add Node.js/TypeScript integration section
- Update command-line options documentation
- Include API usage examples

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 15:46:06 -05:00
Thomas Hallock f21b5e5592 feat: add TypeScript client libraries for browser integration
- Add TypeScript client for API consumption
- Add browser package setup for Typst.ts WASM
- Support for direct browser PDF generation

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 15:45:59 -05:00
Thomas Hallock 98263a79a0 feat: add Python bridge and optional FastAPI server
- Add bridge.py for clean JSON-based Python-Node communication
- Add optional FastAPI server for REST API access
- Include requirements for API server setup

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 15:45:52 -05:00
Thomas Hallock fb1b0470cf feat: add Node.js/TypeScript integration with clean function interface
- Add SorobanGenerator class with python-shell bridge
- No CLI arguments - clean TypeScript function calls
- Support for Express.js and Next.js integration
- Include comprehensive API documentation

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 15:45:47 -05:00
Thomas Hallock a8a01a8db3 feat: add config presets for colored numerals and skip counting
- Add colored-numerals.yaml for place-value with colored text
- Add count-by-5s.yaml for skip counting example
- Demonstrate new features with ready-to-use configs

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 15:45:40 -05:00
Thomas Hallock c94fa5c74e feat: add step parameter for skip counting
- Add --step flag to count by 2s, 5s, 10s, or any increment
- Update parse_range function to support step parameter
- Works with ranges to generate skip counting flashcards

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 15:45:28 -05:00
Thomas Hallock e4aaaeab13 feat: add colored numerals feature to match bead colors
- Add create-colored-numeral function for coloring digits
- Support place-value, heaven-earth, and alternating color schemes
- Numerals on back of cards now use same colors as beads on front

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 15:45:23 -05:00
Thomas Hallock 06926262c1 Add full-page cutting guides for accurate card separation
- Implement horizontal and vertical cutting guides that extend across entire page
- Use subtle 50% gray lines (0.25pt) that won't be distracting if cut is slightly off
- Guides run through the gutter space between cards
- Automatically adjust to any grid layout (2x3, 3x3, 3x4, etc.)
- Controlled by existing --cut-marks flag
- Appear on both front and back sides for consistent cutting

The guides make it much easier to:
- Cut all cards to exactly the same size
- Make straight cuts across the entire page
- Maintain consistent spacing between cards
- Handle larger batches efficiently with a paper cutter

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 13:18:08 -05:00
Thomas Hallock 7d8d7a1cfd Add color scheme support for enhanced learning
- Implement four color schemes: monochrome, place-value, heaven-earth, alternating
- Place-value: Different colors for ones (blue), tens (magenta), hundreds (orange), etc.
- Heaven-earth: Orange heaven beads, blue earth beads for visual distinction
- Alternating: Blue/green alternating columns for easier reading
- Add --color-scheme CLI flag and config support
- Create place-value-colors.yaml example config

Color coding helps students:
- Instantly recognize place values
- Distinguish between heaven and earth beads
- Reduce reading errors in multi-digit numbers
- Make learning more engaging and memorable

Default remains monochrome for printer-friendly output.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 13:15:04 -05:00
Thomas Hallock 0ab2a69b90 Add flexible cards-per-page support with dynamic grid layout
- Support common layouts: 1, 2, 3, 4, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 30
- Add fallback logic for arbitrary card counts using square root calculation
- Remove panic on unsupported values - now handles any reasonable number
- Enable layouts like 18 cards (3x6) for larger batches

Users can now specify any cards-per-page value and get a reasonable
grid layout automatically calculated.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 13:05:07 -05:00
Thomas Hallock 152c495c40 Fix circle positioning to align with other shapes
- Wrap circles in a box for consistent top-left positioning
- All shapes now position from the same reference point
- Eliminates the bar appearing too high for circles only

Now all three shapes (diamond, square, circle) use the exact same
positioning logic with no special cases or exceptions.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:56:17 -05:00
Thomas Hallock 472aa5fc63 Simplify bead positioning with consistent center-based logic
- All shapes now use center-based positioning (no exceptions)
- Remove shape-specific adjustments for cleaner code
- Calculate bead positions using centers for all shapes
- Diamond and square shapes offset from center appropriately

This eliminates the complex conditional logic and makes the code
much cleaner and easier to maintain. All three shapes now follow
the same positioning rules.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:53:31 -05:00
Thomas Hallock a8078b8110 Fix bead positioning for all shapes with proper alignment
- Circles use center-based positioning (original Typst behavior)
- Diamonds and squares use top-edge positioning
- Add shape-specific y-coordinate adjustments for consistent alignment
- Ensure all active beads properly touch the reckoning bar

Each shape now positions correctly relative to the reckoning bar,
with circles using their natural center positioning and other shapes
using top-edge positioning.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:50:06 -05:00
Thomas Hallock 9ed1015bf3 Fix bead vertical alignment for all shapes
- Standardize bead positioning to use top edge as reference point
- Adjust circle positioning to match diamond and square alignment
- Ensure active beads properly touch the reckoning bar
- Fix issue where non-circle beads appeared too high

All bead shapes now align consistently with the reckoning bar,
with active beads properly positioned against it.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:46:53 -05:00
Thomas Hallock 8725d8b4ed Add configurable bead shapes with diamond as default
- Add three bead shape options: diamond (default), circle, square
- Implement diamond shape as horizontally elongated rhombus (realistic)
- Add draw-bead function to handle all three shape types
- Update CLI with --bead-shape parameter
- Create circle-beads.yaml config for traditional round beads

Diamond shape is now the default as it more accurately represents
real soroban/abacus beads which are typically bi-conical or
rhombus-shaped when viewed from the side.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:43:51 -05:00
Thomas Hallock 36b13bb54a Improve duplex printing support and documentation
- Clarify page ordering with detailed comments (fronts on odd, backs on even)
- Add PDF metadata for better document properties
- Improve qpdf linearization with object stream preservation
- Document duplex printing behavior in README
- Ensure consistent front/back pairing with explicit pagebreaks

The PDF now clearly alternates between soroban diagrams (odd pages)
and numerals (even pages) for reliable duplex printing with long-edge
binding.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:40:35 -05:00
Thomas Hallock 5596ef2c81 Add option to hide inactive beads for minimal display
- Add hide-inactive-beads parameter to draw-soroban function
- Conditionally render beads based on active state
- Add --hide-inactive-beads CLI flag
- Create minimal-beads.yaml config example
- Support both display modes: full (with grayed inactive) and minimal (active only)

This allows users to choose between two common soroban display
conventions: showing all beads with inactive ones grayed out, or
showing only the active beads for a cleaner look.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:38:15 -05:00
Thomas Hallock 8b38ca6521 Add comprehensive documentation
- README.md: Main documentation with quick start, usage, and examples
- DESIGN.md: Technical implementation details and architecture decisions
- INSTALL.md: Detailed installation guide for macOS

Documentation covers soroban representation, duplex printing,
vector graphics strategy, and configuration options.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:14:57 -05:00
Thomas Hallock 75e9337e4e Bundle DejaVu Sans fonts for consistent rendering
- Add DejaVuSans.ttf for main text
- Add DejaVuSans-Bold.ttf for emphasis
- Ensures PDF portability across systems
- No dependency on system fonts

DejaVu fonts are open source and freely redistributable.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:14:44 -05:00
Thomas Hallock e411b289c7 Add Makefile for build automation
- Default target generates flashcards with linearization
- Install target for macOS dependencies (typst, qpdf)
- Sample generation target for all configurations
- Test target for quick validation
- Clean target to remove generated files
- Dependency checking before builds

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:14:31 -05:00
Thomas Hallock 46f235a0b7 Add configuration files for common use cases
- default.yaml: Basic 0-9 configuration
- 0-99.yaml: Two-digit numbers with cut marks
- 3-column-fixed.yaml: Three-digit numbers with fixed columns

Each config includes paper size, margins, font settings, and
soroban display options.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:14:18 -05:00
Thomas Hallock d10b7836b7 Add Python CLI tool for flashcard generation
- Create generate.py with full CLI argument support
- Support YAML/JSON configuration files
- Implement number range parsing and shuffling
- Add font path configuration for bundled fonts
- Include PDF linearization with qpdf
- Add sample generation script for testing

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:14:05 -05:00
Thomas Hallock 1312eef345 Add Typst template for soroban flashcard generation
- Implement draw-soroban function for rendering abacus beads
- Create flashcard layout with front/back support
- Add generate-flashcards main function for batch generation
- Support configurable layouts (6/8/9 cards per page)
- Include duplex printing alignment with mirrored backs
- Pure vector graphics using Typst drawing primitives

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:13:51 -05:00
Thomas Hallock 466efad640 Initial project setup with dependencies
- Add .gitignore for Python, macOS, and generated files
- Add requirements.txt with PyYAML dependency

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 12:13:32 -05:00