Major architectural simplification removing content type complexity: Database Schema: - Remove 'type' field from content and content_versions tables - Simplify to pure HTML storage with html_content + original_template - Regenerate all sqlc models for SQLite and PostgreSQL API Simplification: - Remove content type routing and validation - Eliminate type-specific handlers (text/markdown/structured) - Unified HTML-first approach for all content operations - Simplify CreateContent and UpdateContent to HTML-only Backend Enhancements: - Update enhancer to only generate data-content-id (no data-content-type) - Improve container expansion utilities with comprehensive block/inline rules - Add Phase 3 preparation with boundary-respecting traversal logic - Strengthen element classification for viable children detection Documentation: - Update TODO.md to reflect Phase 1-3 completion status - Add WORKING_ON.md documenting the architectural transformation - Mark container expansion and HTML-first architecture as complete This completes the transition to a unified HTML-first content management system with automatic style detection and element-based behavior, eliminating the complex multi-type system in favor of semantic HTML-driven editing.
8.5 KiB
Insertr Structural Refactoring - Work in Progress
Current Status: Major Simplification Opportunity Identified
We've identified that the current Insertr codebase has remnants from multiple refactoring phases and can be significantly simplified by fully embracing the HTML-first philosophy outlined in CLASSES.md.
Key Insights Discovered
1. Obsolete Content Type System
- Problem: Currently has 3 content types (
'text','html','structured') with complex routing logic - HTML-First Reality: Only need HTML preservation with automatic style detection
- Opportunity: Remove
data-content-typeattributes entirely and detect behavior from HTML element tags
2. Multiple Editor Systems (Legacy)
- Current: Complex strategy detection choosing between simple vs rich editors
- HTML-First: Always use StyleAwareEditor with HTML preservation and remove legacy code
- Benefit: Massive code reduction, consistent behavior everywhere
3. Element-Based Behavior Detection
- Instead of:
data-content-type="link"attributes - Use: Element tag analysis (
<a>= link behavior,<p>= text behavior) - Source: Behavior rules already defined in CLASSES.md
4. UX Optimization Opportunity
- Direct Multi-Property Editing:
<a class="insertr">should open URL+text editor immediately - Rich Text Editing:
<p class="insertr">with nested elements should use StyleAwareEditor - Context-Appropriate UX: Right editor for the right element type
Planned Refactoring (Major Changes)
Keep in mind that we need no legacy code preserved or backwards compatibility. Database changes can be done to the schema, not with ALTER statements. We have no data to preserve and no users of any current insertr versions.
Phase 1: Frontend Simplification
- Remove content type routing from StyleAwareEditor
- Eliminate 'text' and 'structured' handlers - keep only HTML preservation
- Remove simple/textarea editor that strips HTML formatting
- Implement element-based behavior detection using tag names
- Create direct multi-property editors for
<a>,<button>,<img>
Phase 2: Backend Simplification
- Remove
data-content-typegeneration from enhancer - Simplify API to be purely HTML-based
- Keep only
data-content-idfor content tracking - Update database schema remove type field
Phase 3: Container Expansion Intelligence
- Improve viable children detection with element-type-aware rules
- Smart stopping rules for multi-property elements (
<a>,<button>,<img>) - Semantic container expansion respecting HTML element purposes
- Framework/technical container filtering (React, Gatsby artifacts)
Technical Architecture Changes
Before (Complex Multi-System):
// Multiple content types with routing
switch (content.type) {
case 'text': // Strips HTML - obsolete
case 'html': // HTML preservation
case 'structured': // Legacy template system
}
// Multiple editor strategies
switch (analysis.strategy) {
case 'simple': // Textarea - strips HTML
case 'rich': // Rich editor with styles
}
After (Unified HTML-First):
// Single path for ALL .insertr elements
class StyleAwareEditor {
async initialize() {
// 1. Always extract HTML with preservation
this.originalContent = this.htmlEngine.extractForEditing(this.element);
// 2. Always detect styles from nested elements
this.detectedStyles = this.styleEngine.detectStyles(this.element);
// 3. Element-based UX routing
if (this.isMultiPropertyElement()) {
this.createDirectEditor(); // URL+text for links
} else {
this.createRichEditor(); // Rich text with styles
}
}
}
Container Expansion Rules (New Logic)
Container expansions are syntactic sugar for applying the insertr class to viable children. Our autodetection might need to be revised. Some anchor tags for instance can be a formatting style inside of content, or it could be a standalone navigation link. So for instance a p>a element might be formatting, while div>a could be a link. This might resolve itself when we respect boundaries, but would need further investigation.
Stopping Rules:
- Stop: Element has
.insertr(respect boundaries) - Stop: Multi-property element found (
<a>,<button>,<img>get direct editing) - Stop: Framework containers (React, Gatsby artifacts)
- Continue: Semantic containers with viable children
Benefits of This Refactoring
🚀 Massive Code Reduction
- Remove 3 content type handlers → 1 HTML handler
- Remove 2 editor types → 1 unified system
- Remove strategy detection → linear flow
- Remove attribute generation → tag-based detection
🎯 Consistent Behavior
<h1>Our <em>Services</em></h1>always preserves formatting- Style detection always runs
- No more edge cases between strategies
⚡ Better Performance
- No strategy detection overhead
- No conditional branching complexity
- Simpler initialization paths
🛠️ Easier Maintenance
- Single code path to test and debug
- Unified behavior aligns with CLASSES.md
- HTML-first philosophy consistently applied
Current Working Files
Fixed in This Session:
- ✅ Style preview system - Now uses CSS isolation for perfect previews
- ✅ Simple demo cleanup - Removed unsupported examples 6 & 8
- ✅ Default demo preparation - Stripped data attributes for clean enhancement
Next Session Priorities:
- Remove content type routing from StyleAwareEditor
- Implement element-based behavior detection
- Create direct multi-property editors for better UX
- Enhance container expansion logic with smart stopping rules
Status
✅ Phase 1, 2 & 3 COMPLETED - Complete HTML-first architecture with container transformation!
✅ Completed Across Multiple Sessions:
Phase 1 & 2: HTML-First Architecture
- Removed content type routing from StyleAwareEditor - now uses unified HTML-first approach
- Eliminated simple/textarea editor that stripped HTML formatting
- Implemented element-based behavior detection using tag names (no more
data-content-typeattributes) - Created direct multi-property editors for
<a>,<button>,<img>elements - Removed
data-content-typegeneration from backend enhancer - Updated database schema - completely removed type field from content and content_versions tables
- Regenerated all sqlc code with new schema
- Simplified API layer to be purely HTML-based
Phase 3: Container Transformation
- Implemented backend container transformation following CLASSES.md syntactic sugar specification
- Added addClass/removeClass methods to ContentEngine for proper class manipulation
- Removed frontend container expansion logic - frontend now only finds enhanced elements
- Fixed StyleAwareEditor runtime error (hasMultiPropertyElements method)
- Verified container transformation works correctly:
<section class="insertr">→ children get.insertr
🎯 Results Achieved:
- Massive code reduction: 3 content handlers → 1 unified system
- Consistent behavior: All content now uses HTML preservation with style detection
- Element-based UX:
<a>tags get direct URL+text editor,<p>tags get rich text with formatting - Container transformation: Syntactic sugar working per CLASSES.md specification
- Simplified frontend: No runtime container expansion - backend handles transformation
- Zero breaking changes: User-facing functionality maintained while simplifying backend
🚀 System Now Works As:
// Single path for ALL .insertr elements
class StyleAwareEditor {
async initialize() {
// 1. Always extract HTML with preservation
this.originalContent = this.htmlEngine.extractForEditing(this.element);
// 2. Always detect styles from nested elements
this.detectedStyles = this.styleEngine.detectStyles(this.element);
// 3. Element-based UX routing
if (this.isMultiPropertyElement()) {
this.createDirectEditor(); // URL+text for links
} else {
this.createRichEditor(); // Rich text with styles
}
}
}
Confidence Level: High - All changes successfully implemented and tested. Server starts correctly, builds complete successfully.