Claude-skill-registry Implement Algebra Tiles
Create interactive algebra tiles manipulatives using p5.js where students drag tiles and see cancellations when opposites overlap.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/implement-algebra-tiles" ~/.claude/skills/majiayu000-claude-skill-registry-implement-algebra-tiles && rm -rf "$T"
manifest:
skills/data/implement-algebra-tiles/SKILL.mdsource content
Implement Algebra Tiles
Use this skill when creating animations where students:
- Drag algebra tiles (x, -x, 1, -1) onto a workspace
- Combine tiles to model algebraic expressions
- See visual cancellation when opposite tiles are placed together
- Explore the zero principle (x + (-x) = 0)
When to Use This Pattern
Perfect for:
- "Model the expression 2x - 3 using algebra tiles"
- Interactive equation solving with manipulatives
- Understanding additive inverses and the zero principle
- Simplifying algebraic expressions visually
- Combining like terms with visual models
Not suitable for:
- Multiplication of algebraic expressions (need x² tiles)
- Complex polynomial operations (use specialized tools)
- Static tile diagrams (use basic p5 animation)
Technology Stack
Uses p5.js for the interactive tiles because:
- Real-time drag-and-drop interaction
- Dynamic collision detection for linking
- Mouse and touch event handling
- Smooth visual feedback
Configuration Options
Basic Configuration
// ========================================== // CONFIGURATION - Easily modifiable // ========================================== // Tile types configuration let tileConfig = { x: { width: 80, height: 60, color: [102, 178, 102], // Green for positive x label: 'x', value: 'x', sign: 'positive' }, negX: { width: 80, height: 60, color: [230, 57, 70], // Red for negative x label: '-x', value: 'x', sign: 'negative' }, one: { width: 50, height: 50, color: [255, 193, 94], // Yellow/gold for positive 1 label: '1', value: '1', sign: 'positive' }, negOne: { width: 50, height: 50, color: [230, 57, 70], // Red for negative 1 label: '-1', value: '1', sign: 'negative' } }; // Palette layout (where tiles can be dragged from) let paletteConfig = { x: 80, y: 100, spacing: 100, label: 'Drag tiles onto canvas:' }; // Canvas area (drop zone) let canvasConfig = { x: 50, y: 250, w: 500, h: 300, backgroundColor: [245, 245, 245], borderColor: [180, 180, 180], label: 'Workspace' }; // Snap & cancellation settings let cancelConfig = { snapDistance: 60, // How close tiles need to be to snap together cancelledColor: [200, 200, 200], // Light grey color for snapped tiles snapGap: 2 // Small gap between snapped tiles }; // Visual settings let visualConfig = { showInstructions: true, highlightOnHover: true, showEquation: true };
Features
Interactive Controls
-
Drag Tiles from Palette
- Drag x, -x, 1, or -1 from top palette
- Release on workspace to place
- Can create unlimited copies
- Each tile is independent
-
Move Existing Tiles
- Click and drag any placed tile
- Move to reposition
- Drag outside workspace to remove
- Real-time cancellation updates
-
Automatic Snap & Cancellation
- When opposite tiles are dragged close, they snap together
- x and -x snap and cancel each other
- 1 and -1 snap and cancel each other
- Snapped tiles physically move to align side-by-side
- Both tiles turn light grey when snapped
- Cancellations update as tiles move
Visual Elements
- Palette area with four tile types (x, -x, 1, -1)
- Workspace for placing and arranging tiles
- Snap indicators (tiles physically align when cancelled)
- Cancellation visuals (light grey color for snapped pairs)
- Equation display showing simplified expression
- Hover effects for interactive feedback
- Instructions for user guidance
Common Patterns
Pattern 1: Basic Manipulative (All Four Tiles)
let tileConfig = { x: { width: 80, height: 60, color: [102, 178, 102], label: 'x', value: 'x', sign: 'positive' }, negX: { width: 80, height: 60, color: [230, 57, 70], label: '-x', value: 'x', sign: 'negative' }, one: { width: 50, height: 50, color: [255, 193, 94], label: '1', value: '1', sign: 'positive' }, negOne: { width: 50, height: 50, color: [230, 57, 70], label: '-1', value: '1', sign: 'negative' } }; let cancelConfig = { snapDistance: 60, cancelledColor: [200, 200, 200], snapGap: 2 };
Pattern 2: Variables Only (x and -x)
let tileConfig = { x: { width: 100, height: 70, color: [102, 178, 102], label: 'x', value: 'x', sign: 'positive' }, negX: { width: 100, height: 70, color: [230, 57, 70], label: '-x', value: 'x', sign: 'negative' } // Only include x and -x, omit 1 and -1 }; let paletteConfig = { x: 150, y: 100, spacing: 150, label: 'Drag variable tiles:' };
Pattern 3: Constants Only (1 and -1)
let tileConfig = { one: { width: 60, height: 60, color: [255, 193, 94], label: '1', value: '1', sign: 'positive' }, negOne: { width: 60, height: 60, color: [230, 57, 70], label: '-1', value: '1', sign: 'negative' } // Only include 1 and -1, omit x and -x }; let paletteConfig = { x: 200, y: 100, spacing: 120, label: 'Drag constant tiles:' };
Pattern 4: Larger Snap Distance (Easier Cancellation)
let cancelConfig = { snapDistance: 80, // Larger distance for easier cancellation cancelledColor: [150, 150, 150], showCancelledLabel: true, showLinkLine: true // Show dashed line between cancelled pairs };
Mouse Interactions
Dragging from Palette
- Mouse down on tile → create new copy
- Move mouse → tile follows cursor
- Release over workspace → place tile
- Release elsewhere → discard
Moving Placed Tiles
- Mouse down on placed tile → start drag
- Move mouse → tile follows cursor
- Release on workspace → update position
- Release outside workspace → remove tile
Snap & Cancellation Detection
- On every mouse release → check all pairs
- Calculate distance between tile centers
- If distance < snapDistance and opposite types → snap together
- Snapped tiles physically align side-by-side
- Both tiles turn light grey to indicate cancellation
Drawing Logic
Snap & Cancellation Algorithm
function updateCancellations() { // Reset all cancellations placedTiles.forEach(tile => { tile.isCancelled = false; tile.linkedTo = null; }); // Check each pair of tiles for (let i = 0; i < placedTiles.length; i++) { for (let j = i + 1; j < placedTiles.length; j++) { let tile1 = placedTiles[i]; let tile2 = placedTiles[j]; // Skip if either is already cancelled if (tile1.isCancelled || tile2.isCancelled) continue; // Check if they can cancel (same value, opposite signs) if (tile1.config.value === tile2.config.value && tile1.config.sign !== tile2.config.sign) { // Check if they're close enough let distance = dist( tile1.x + tile1.config.width/2, tile1.y + tile1.config.height/2, tile2.x + tile2.config.width/2, tile2.y + tile2.config.height/2 ); if (distance < cancelConfig.snapDistance) { // Mark as cancelled tile1.isCancelled = true; tile2.isCancelled = true; tile1.linkedTo = tile2; tile2.linkedTo = tile1; // SNAP: Position tiles side-by-side // Calculate midpoint between the two tiles let midX = (tile1.x + tile2.x) / 2; let midY = (tile1.y + tile2.y) / 2; // Position tiles side-by-side at the midpoint let gap = 2; // Small gap between snapped tiles tile1.x = midX - tile1.config.width / 2 - gap / 2; tile2.x = midX + tile2.config.width / 2 + gap / 2 - tile2.config.width; tile1.y = midY; tile2.y = midY; } } } } }
Equation Display
- Count tiles by type (exclude cancelled)
- Group like terms
- Display simplified expression
- Example: "2x - 3" or "x + (-x) + 1" → "1"
Code Structure
// State management let placedTiles = []; // Tiles on workspace let draggedTile = null; // Currently dragged tile let nextTileId = 0; // ID counter let hoveredPaletteTile = null; // Palette hover state function setup() { createCanvas(600, 600); textFont('Arial'); } function draw() { background(255); drawPalette(); // Tile sources drawCanvasArea(); // Workspace drawPlacedTiles(); // All placed tiles drawEquation(); // Simplified expression drawInstructions(); // Helper text if (draggedTile) { drawDraggedTile(); // Tile following cursor } } function mousePressed() { checkPlacedTileClick(); // Start dragging existing tile checkPaletteClick(); // Create new tile from palette } function mouseReleased() { handleTileDrop(); // Place or remove tile draggedTile = null; } function mouseMoved() { updateHoverState(); // Visual feedback }
Implementation Checklist
- Create palette area with all four tile types
- Implement drag from palette (creates new tiles)
- Implement drag of placed tiles
- Add workspace area with visual boundaries
- Implement drop detection (in/out of workspace)
- Create snap & cancellation detection algorithm
- Calculate distance between tile centers
- Snap opposite tiles together when close enough
- Position snapped tiles side-by-side at midpoint
- Apply light grey color to snapped/cancelled tiles
- Count non-cancelled tiles by type
- Display simplified equation
- Add hover effects for palette tiles
- Add hover effects for placed tiles
- Show instructions and labels
- Test all drag and drop scenarios
- Verify snap and cancellation logic works correctly
Tips and Best Practices
Snap & Cancellation Logic
- Check for snap opportunities on mouse release
- Reset all cancellation states before checking
- Use center points for distance calculation
- Only pair each tile once (skip already cancelled)
- Calculate midpoint for snap positioning
- Align tiles side-by-side at the midpoint
Visual Feedback
- Use distinct colors for positive/negative
- Make snapped tiles clearly different (light grey)
- Tiles physically move together when snapped
- Provide hover feedback on interactive elements
User Experience
- Make snap distance reasonable (not too small/large)
- Snap provides satisfying visual feedback
- Allow removing tiles by dragging outside
- Update equation in real-time
- Provide clear instructions
Performance
- Limit number of tiles if performance is an issue
- Use efficient distance calculations
- Only redraw when state changes
Color Guidelines
Standard algebra tile colors:
- Positive x: Green [102, 178, 102]
- Negative x: Red [230, 57, 70]
- Positive 1: Yellow/Gold [255, 193, 94]
- Negative 1: Red [230, 57, 70]
- Snapped/Cancelled: Light Grey [200, 200, 200]
Alternative color schemes:
- Traditional: Yellow (positive), Red (negative)
- High contrast: Blue (positive), Orange (negative)
- Colorblind-friendly: Use patterns/textures in addition to color
Related Patterns
- Dynamic Tape Diagram - For equation building
- Drag and Drop Pattern - Core interaction
- Color Palette - Standard colors
Examples
See
snippets/algebra-tiles.ts for complete working code.
Common use cases in
src/app/animations/examples/algebraTiles/:
- Simple manipulative (all four tiles)
- Variables only (x and -x)
- Equation modeling
- Zero principle exploration
Educational Notes
The Zero Principle
When a positive and negative tile of the same value are paired:
- x + (-x) = 0
- 1 + (-1) = 0 This is the foundation of:
- Solving equations (adding/subtracting from both sides)
- Simplifying expressions
- Understanding additive inverses
Modeling Expressions
- 2x + 3: Two x tiles, three 1 tiles
- x - 5: One x tile, five -1 tiles
- -3x + 2: Three -x tiles, two 1 tiles
Solving Equations
- Model both sides with tiles
- Add opposite tiles to isolate variable
- Count remaining tiles to find solution
Last Updated: November 2024 Maintained By: AI Coaching Platform Team