# SVG Template Refactoring Plan ## Current Architecture Problems ### The Issue While `template.svg` files exist in `example/` and `my-project/`, they only contain: - Outer SVG wrapper with styling - Two macros: `{{MONTHS}}` and `{{LANES}}` The actual SVG generation is hardcoded in `generator.js`: - **Lines 40-69**: Month grid generation (lines, labels, styling) - **Lines 78-129**: Lane generation (backgrounds, labels, task items) This makes templates non-editable in SVG tools - users can only change colors/styling in the wrapper, not the actual timeline structure. ## Goals 1. **Move SVG structure to templates**: Extract hardcoded SVG patterns from JavaScript to template files 2. **Use placeholders for dynamic data**: Replace actual values with `{{VARIABLE}}` placeholders 3. **Make templates editable**: Users should be able to open templates in Inkscape/Adobe Illustrator and modify the timeline layout 4. **Maintain flexibility**: Keep the ability to handle varying numbers of months, lanes, and items ## Proposed Template Structure ### Month Template Section Instead of generating months in JS, the template should contain a **sample month element** with placeholders: ```svg {{MONTH_LABEL}} ``` ### Lane Template Section Similarly, lanes should be defined once: ```svg {{LANE_NAME}} ``` ### Task Item Template Task items within lanes: ```svg {{TASK_ID}}: {{TASK_TITLE}} ``` ## Generator Refactoring The `generator.js` should: 1. **Load and parse template**: Read template SVG 2. **Extract template elements**: Find elements with `id="*-template"` 3. **Clone and populate**: For each data item, clone the template and replace placeholders 4. **Position elements**: Calculate positions based on layout constants 5. **Inject into template**: Replace `{{MONTHS}}` and `{{LANES}}` macros with generated content ## Variables Dictionary ### Layout Constants - `{{GRID_LEFT}}`, `{{GRID_TOP}}`, `{{GRID_BOTTOM}}` - Grid boundaries - `{{MONTH_WIDTH}}` - Width of each month column - `{{LANE_HEIGHT}}` - Height of each lane row - `{{LANE_GAP}}` - Spacing between lanes ### Month Variables - `{{MONTH_X}}` - X position - `{{MONTH_Y}}` - Y position for label - `{{MONTH_LABEL}}` - Month name (e.g., "Jan 25") ### Lane Variables - `{{LANE_X}}`, `{{LANE_Y}}` - Lane position - `{{LANE_WIDTH}}`, `{{LANE_HEIGHT}}` - Lane dimensions - `{{LANE_NAME}}` - Lane/Epic name - `{{LABEL_X}}`, `{{LABEL_Y}}` - Label position ### Task Variables - `{{TASK_X}}`, `{{TASK_Y}}` - Task marker position - `{{TEXT_X}}`, `{{TEXT_Y}}` - Text position - `{{TASK_ID}}` - Task ID (e.g., "T-1") - `{{TASK_TITLE}}` - Task title ## Migration Strategy ### Phase 1: Extract to Simple Templates 1. Create new `template-v2.svg` files with template elements 2. Update generator to use template-based approach 3. Keep existing templates as fallback 4. Test with both approaches ### Phase 2: Enhance Template Editing 1. Add template validation 2. Document template variables 3. Create template editing guide 4. Provide example templates with different layouts ### Phase 3: Remove Hardcoded SVG 1. Migrate existing templates to new format 2. Remove hardcoded SVG generation 3. Update tests 4. Update documentation ## Test Updates Needed - Tests for template parsing and validation - Tests for variable substitution - Tests for template cloning logic - Integration tests with real templates - Tests for backward compatibility with old templates ## Benefits 1. **User-editable templates**: Can modify in any SVG editor 2. **Visual template design**: See actual layout while editing 3. **Reusable patterns**: Template elements can be copied/modified 4. **Separation of concerns**: Presentation (SVG) vs. logic (JS) 5. **Easier customization**: Change fonts, colors, shapes without touching code ## Risks - **Complexity**: More complex generator logic - **Performance**: Template parsing and cloning overhead - **Compatibility**: Need to support both old and new templates - **Testing**: More edge cases to test ## Next Steps 1. Review and approve this plan 2. Create proof-of-concept with one template 3. Refactor generator.js gradually 4. Update tests 5. Document new template format 6. Migrate existing templates