Claude-skill-registry Implement Dynamic Tape Diagram
Create interactive tape diagram builders using p5.js where students construct algebraic equations by dragging and resizing parts.
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-dynamic-tape-diagram" ~/.claude/skills/majiayu000-claude-skill-registry-implement-dynamic-tape-diagram && rm -rf "$T"
manifest:
skills/data/implement-dynamic-tape-diagram/SKILL.mdsource content
Implement Dynamic Tape Diagram
Use this skill when creating animations where students:
- Build tape diagrams by dragging variables (x) and constants into a bar
- Resize constants before adding them to the diagram
- See proportional relationships when setting a total value
- Visualize algebraic equations as bar models
When to Use This Pattern
Perfect for:
- "Build a tape diagram for x + 8 = 32"
- Interactive equation builders with visual models
- Exploring how changing parts affects the whole
- Understanding proportional relationships in algebra
- Visualizing variable vs. constant relationships
Not suitable for:
- Static tape diagrams (use basic p5 animation)
- Comparing multiple equations side-by-side
- Multi-step equation solving sequences (use phase-based animation)
Technology Stack
Uses p5.js for the interactive tape diagram because:
- Real-time drag-and-drop interaction
- Dynamic resizing of visual elements
- Mouse and touch event handling
- Smooth proportional animations
Configuration Options
Basic Configuration
// ========================================== // CONFIGURATION - Easily modifiable // ========================================== // Palette items (draggable sources) let paletteConfig = { variable: { x: 80, y: 100, w: 60, h: 60, color: [230, 57, 70], // Red for variables label: 'x' }, constant: { x: 200, y: 100, w: 100, // Initial width (resizable) h: 60, minWidth: 40, // Minimum size maxWidth: 300, // Maximum size initialValue: 1, maxValue: 20, color: [6, 167, 125], // Green for constants } }; // Tape diagram drop zone let tapeConfig = { x: 50, y: 320, w: 500, h: 100, backgroundColor: [240, 240, 240], borderColor: [150, 150, 150], label: 'Drop parts here' }; // Total value settings let totalConfig = { initial: 0, // Starting total value min: 0, max: 1000, step: 1, showProportions: true // Show calculated values when total is set }; // Visual settings let visualConfig = { showEquation: true, // Display equation text showInstructions: true, // Show helper text animateTransitions: true, // Smooth width changes highlightDropZone: true // Highlight when dragging };
Features
Interactive Controls
-
Drag Variable (x)
- Drag from palette to drop zone
- Each x represents 1 unit
- Always distributes evenly in the diagram
-
Resize and Drag Constants
- Drag edges to resize the constant bar
- Shows current value as you resize
- Drag to drop zone when ready
- Each whole number proportionally sized
-
Total Value Input
- Click +/- buttons to adjust total
- When set, all parts resize proportionally
- Shows calculated values for each part
-
Part Management
- Click parts to select/deselect
- Click X button to remove parts
- Parts automatically distribute space
Visual Elements
- Palette area with draggable variable and constant
- Resize handles on constant bar (left and right edges)
- Drop zone with visual feedback
- Proportional tape bars showing equation parts
- Equation display showing current expression
- Calculated values when total is set
Common Patterns
Pattern 1: Simple Equation (x + 5 = 20)
let paletteConfig = { variable: { x: 80, y: 80, w: 60, h: 60, color: [230, 57, 70], label: 'x' }, constant: { x: 200, y: 80, w: 100, h: 60, minWidth: 40, maxWidth: 200, initialValue: 5, maxValue: 20, color: [6, 167, 125] } }; let totalConfig = { initial: 20, min: 0, max: 100, step: 1, showProportions: true };
Pattern 2: Multiple Variables (2x + 10)
// Enable adding multiple x's let paletteConfig = { variable: { x: 80, y: 80, w: 60, h: 60, color: [230, 57, 70], label: 'x', allowMultiple: true // Can add multiple x's }, constant: { x: 200, y: 80, w: 100, h: 60, minWidth: 40, maxWidth: 300, initialValue: 1, maxValue: 30, color: [6, 167, 125] } };
Pattern 3: Fraction Tape Diagrams
let paletteConfig = { constant: { x: 200, y: 80, w: 100, h: 60, minWidth: 20, maxWidth: 400, initialValue: 1, maxValue: 12, // For showing 1/12, 2/12, etc. color: [255, 153, 51], // Orange showAsFraction: true // Display as fraction of whole } }; let totalConfig = { initial: 1, // Whole = 1 min: 0, max: 1, step: 0, showProportions: true };
Mouse Interactions
Dragging from Palette
- Mouse down on variable or constant → start drag
- Move mouse → item follows cursor
- Release over drop zone → add to tape
- Release elsewhere → return to palette
Resizing Constant
- Mouse near left/right edge → show resize cursor
- Mouse down on edge → start resize
- Drag left/right → change width (snaps to whole numbers)
- Release → set new value
Managing Tape Parts
- Click on part → select (highlight)
- Click X button → remove part
- Parts automatically redistribute space
Drawing Logic
Proportional Sizing
When total value is set:
- Calculate total units: sum all part values (x=1, constant=its value)
- Calculate unit value: totalValue / totalUnits
- Each part width = (partValue / totalUnits) * tapeWidth
- Show actual values: partValue * unitValue
Drop Zone Feedback
- Hovering while dragging → highlight border
- Invalid drop → shake animation or visual feedback
- Valid drop → smooth transition into place
Code Structure
// State management let tapeParts = []; // Parts in the main diagram let isDragging = false; // Current drag state let dragItem = null; // What's being dragged let totalValue = 0; // Current total function setup() { createCanvas(600, 600); textFont('Arial'); } function draw() { background(255); drawPalette(); // Draggable sources drawTotalInput(); // +/- controls drawEquationDisplay(); // Show equation text drawTapeDiagram(); // Main visualization drawInstructions(); // Helper text if (isDragging) { drawDraggedItem(); // Follow cursor } } function mousePressed() { checkPaletteClick(); checkResizeHandles(); checkTotalButtons(); checkPartSelection(); } function mouseDragged() { updateDragPosition(); updateResizeWidth(); } function mouseReleased() { checkDropZone(); releaseDragItem(); }
Implementation Checklist
- Create palette area with variable and constant
- Implement drag from palette to drop zone
- Add resize handles to constant bar
- Show current value when resizing
- Implement drop zone with visual feedback
- Create tape parts array to store dropped items
- Calculate proportional widths based on values
- Implement total value +/- controls
- Show calculated actual values when total is set
- Add part selection (click to select)
- Add part removal (X button)
- Display equation as text
- Add helper instructions
- Test all mouse interactions
- Verify proportional sizing is correct
Tips and Best Practices
Proportional Calculations
- Always calculate total units first
- Handle zero cases (no total set, or totalUnits = 0)
- Use consistent rounding for display values
Visual Feedback
- Show resize cursor when near edges
- Highlight drop zone when dragging
- Animate width changes smoothly
- Use distinct colors for variable vs constant
User Experience
- Snap resize to whole numbers (easier to control)
- Provide clear instructions
- Show equation dynamically as parts are added
- Allow removing parts easily
Related Patterns
- Auto/Manual Toggle Pattern - For multi-phase solving
- Dynamic Graph - For coordinate plane interactions
- Color Palette - Standard colors to use
Examples
See
snippets/dynamic-tape-diagram.ts for complete working code.
Common use cases in
src/app/animations/examples/tapeDiagrams/:
- Simple equation builder (x + 5 = 20)
- Multi-variable builder (2x + 3)
- Fraction tape diagrams (showing parts of a whole)
Last Updated: November 2024 Maintained By: AI Coaching Platform Team