Files
dmail-admin/mvp-implementation-plan.md
T
2025-07-15 12:40:39 +03:30

303 lines
9.0 KiB
Markdown

# 🎯 DanakMail Template Builder MVP - Implementation Plan
## 📋 Executive Summary
This MVP combines the best features of Waypoint's template builder with your current Persian email template system to create a powerful, RTL-compatible email template builder.
## 🎨 Key Features to Implement
### Phase 1: Core Block System (Week 1-2)
-**Text Block**: Rich text editing with Persian support
-**Button Block**: Customizable CTAs with styling
-**Image Block**: Upload/URL with responsive options
-**Container Block**: Layout wrapper with styling
-**Spacer Block**: Vertical spacing control
### Phase 2: Drag & Drop Interface (Week 3-4)
- 🔄 **Block Library**: Sidebar with draggable blocks
- 🔄 **Canvas Area**: Drop zone for template building
- 🔄 **Block Management**: Add, remove, reorder blocks
- 🔄 **Properties Panel**: Context-sensitive editing
### Phase 3: Template Variables (Week 5-6)
- 📝 **Variable System**: Dynamic content placeholders
- 📝 **Test Data**: Preview with sample data
- 📝 **Conditional Logic**: Show/hide based on data
- 📝 **Loop Support**: Repeat blocks with arrays
### Phase 4: Export & Preview (Week 7-8)
- 📤 **HTML Export**: Email-compatible HTML
- 📤 **Live Preview**: Real-time template preview
- 📤 **Mobile Preview**: Responsive design testing
- 📤 **Email Client Testing**: Gmail, Outlook compatibility
## 🏗️ Architecture Overview
```
src/
├── pages/
│ └── email-builder/
│ ├── EmailBuilder.tsx # Main builder interface
│ ├── components/
│ │ ├── blocks/ # Block components
│ │ │ ├── TextBlock.tsx
│ │ │ ├── ButtonBlock.tsx
│ │ │ ├── ImageBlock.tsx
│ │ │ ├── ContainerBlock.tsx
│ │ │ └── SpacerBlock.tsx
│ │ ├── panels/ # Side panels
│ │ │ ├── BlockLibrary.tsx
│ │ │ ├── PropertiesPanel.tsx
│ │ │ └── VariablesPanel.tsx
│ │ ├── canvas/ # Canvas area
│ │ │ ├── Canvas.tsx
│ │ │ ├── DropZone.tsx
│ │ │ └── BlockRenderer.tsx
│ │ └── preview/ # Preview system
│ │ ├── LivePreview.tsx
│ │ ├── MobilePreview.tsx
│ │ └── EmailPreview.tsx
│ ├── hooks/
│ │ ├── useEmailBuilder.ts
│ │ ├── useDragDrop.ts
│ │ └── useTemplateExport.ts
│ ├── store/
│ │ ├── builderStore.ts
│ │ └── templatesStore.ts
│ ├── types/
│ │ ├── blocks.ts
│ │ ├── template.ts
│ │ └── export.ts
│ └── utils/
│ ├── blockRenderers.ts
│ ├── htmlExporter.ts
│ └── templateValidator.ts
```
## 🔧 Technical Implementation
### 1. Block Interface Definition
```typescript
// src/pages/email-builder/types/blocks.ts
interface BaseBlock {
id: string
type: BlockType
data: BlockData
style: BlockStyle
responsive?: ResponsiveSettings
}
interface TextBlock extends BaseBlock {
type: 'text'
data: {
content: string
variables?: string[]
}
style: {
fontSize: number
fontWeight: string
color: string
textAlign: 'left' | 'center' | 'right'
lineHeight: number
}
}
interface ButtonBlock extends BaseBlock {
type: 'button'
data: {
text: string
url: string
variables?: string[]
}
style: {
backgroundColor: string
textColor: string
borderRadius: number
padding: Spacing
fontSize: number
}
}
```
### 2. Drag & Drop Implementation
```typescript
// src/pages/email-builder/hooks/useDragDrop.ts
import { useDragDropManager } from '@dnd-kit/core'
export const useDragDrop = () => {
const { addBlock, moveBlock, removeBlock } = useEmailBuilderStore()
const handleDragEnd = (event: DragEndEvent) => {
const { active, over } = event
if (active.data.current?.type === 'library-block') {
// Add new block from library
addBlock(active.data.current.blockType, over?.id)
} else if (active.data.current?.type === 'canvas-block') {
// Reorder existing blocks
moveBlock(active.id, over?.id)
}
}
return { handleDragEnd }
}
```
### 3. Template Variable System
```typescript
// src/pages/email-builder/utils/templateProcessor.ts
export const processTemplate = (template: Template, variables: Record<string, any>) => {
return template.blocks.map(block => {
switch (block.type) {
case 'text':
return {
...block,
data: {
...block.data,
content: replaceVariables(block.data.content, variables)
}
}
case 'button':
return {
...block,
data: {
...block.data,
text: replaceVariables(block.data.text, variables),
url: replaceVariables(block.data.url, variables)
}
}
default:
return block
}
})
}
const replaceVariables = (content: string, variables: Record<string, any>) => {
return content.replace(/\{\{(\w+)\}\}/g, (match, key) => {
return variables[key] || match
})
}
```
### 4. HTML Export System
```typescript
// src/pages/email-builder/utils/htmlExporter.ts
export const exportToHTML = (template: Template, options: ExportOptions) => {
const styles = generateEmailStyles(template, options)
const bodyHTML = renderBlocks(template.blocks, options)
return `
<!DOCTYPE html>
<html dir="${options.rtlSupport ? 'rtl' : 'ltr'}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>${template.name}</title>
${styles}
</head>
<body>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="center">
<table width="600" cellpadding="0" cellspacing="0" border="0">
${bodyHTML}
</table>
</td>
</tr>
</table>
</body>
</html>
`
}
```
## 📊 Comparison Matrix
| Feature | Current System | Waypoint | MVP Target |
|---------|---------------|----------|------------|
| RTL Support | ✅ Full | ❌ None | ✅ Full |
| Drag & Drop | ❌ None | ✅ Full | ✅ Full |
| Block System | ⚠️ Limited | ✅ Rich | ✅ Rich |
| Variables | ❌ None | ✅ LiquidJS | ✅ Simple |
| Email Client Support | ⚠️ Basic | ✅ Full | ✅ Full |
| Persian UI | ✅ Full | ❌ None | ✅ Full |
| Template Library | ✅ Basic | ✅ Rich | ✅ Rich |
| Live Preview | ⚠️ Basic | ✅ Advanced | ✅ Advanced |
## 🚀 Development Timeline
### Week 1-2: Foundation
- [ ] Setup new email builder structure
- [ ] Implement basic block types
- [ ] Create block components
- [ ] Setup Zustand store
### Week 3-4: Drag & Drop
- [ ] Install @dnd-kit/core
- [ ] Implement block library sidebar
- [ ] Create canvas drop zone
- [ ] Add block management
### Week 5-6: Advanced Features
- [ ] Template variables system
- [ ] Properties panel
- [ ] Test data scenarios
- [ ] Conditional rendering
### Week 7-8: Export & Polish
- [ ] HTML export optimization
- [ ] Email client testing
- [ ] Mobile responsive preview
- [ ] Performance optimization
## 💻 Getting Started
1. **Install Dependencies**:
```bash
npm install @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities
npm install react-beautiful-dnd @types/react-beautiful-dnd
```
2. **Update Store Structure**:
```typescript
// Extend existing personality store
interface EmailBuilderStore extends PersonalityStore {
blocks: Block[]
template: Template
variables: TemplateVariable[]
addBlock: (type: BlockType, position?: number) => void
updateBlock: (id: string, updates: Partial<Block>) => void
removeBlock: (id: string) => void
}
```
3. **Migration Path**:
- Keep existing personality system
- Add new email builder alongside
- Gradually migrate users to new system
- Maintain backward compatibility
## 🎯 Success Metrics
- **User Adoption**: 80% of users try new builder within first month
- **Template Creation Time**: 50% reduction compared to current system
- **Email Compatibility**: 99% rendering across major clients
- **Mobile Responsiveness**: Perfect rendering on all devices
- **Persian RTL Support**: Flawless right-to-left layout
## 🔮 Future Enhancements (Post-MVP)
1. **AI-Powered Templates**: Generate templates from text descriptions
2. **Collaboration**: Real-time editing with team members
3. **Analytics**: Template performance tracking
4. **A/B Testing**: Compare template variants
5. **Animation Support**: CSS animations for email elements
6. **Component Library**: Reusable design system components
---
*This MVP plan provides a clear roadmap to build a world-class email template builder that combines Waypoint's advanced features with your system's Persian/RTL strengths.*