changemaker.lite/mkdocs/docs/v2/user-guides/content-editor-guide.md

1277 lines
30 KiB
Markdown

# Content Editor Guide
## Overview
As a Content Editor, you're responsible for creating and managing public-facing content in Changemaker Lite, including:
- **Landing pages**: Custom web pages using the visual editor
- **Email templates**: System email templates (welcome, password reset, shift reminders)
- **Media library**: Video uploads and organization (if enabled)
This guide will help you create professional, engaging content that drives participation in your campaigns and volunteer activities.
---
## Getting Started
### Content Editor Access
Content editing features are available to:
- **SUPER_ADMIN**: Full access to all content features
- **INFLUENCE_ADMIN**: Email templates (for campaign-related emails)
- **MAP_ADMIN**: Email templates (for shift-related emails)
Landing pages and media library are typically managed by SUPER_ADMIN only.
### Content Areas
**1. Landing Pages** (`/app/pages`)
- Custom public pages at `/p/[slug]`
- Visual editor (GrapesJS) or code editor
- Use for: Campaign pages, donation pages, event pages
**2. Email Templates** (`/app/email-templates`)
- System email templates
- HTML + plain text versions
- Use for: Welcome emails, shift reminders, password resets
**3. Media Library** (`/app/media/library`, if enabled)
- Video uploads and organization
- Shareable public gallery
- Use for: Testimonials, events, educational content
---
## Creating Landing Pages
### Landing Page Overview
Landing pages are custom web pages published at `/p/[slug]`. Use them for:
- **Campaign-specific pages**: Dedicated page for a major campaign
- **Event registration**: Custom signup forms for events
- **Donation pages**: Integrated donation forms
- **About pages**: "About Us", "Our Team", "Our Mission"
- **Volunteer recruitment**: Custom volunteer signup pages
### Creating a New Page
**To create a landing page:**
1. Navigate to **Content > Landing Pages**
2. Click **"Create Page"**
3. Fill in page details:
- **Title**: Page title (shown in browser tab, used for SEO)
- **Slug**: URL identifier (e.g., `about-us``/p/about-us`)
- **Description**: Meta description for SEO (160 characters max)
- **Status**: DRAFT or PUBLISHED
4. Click **"Create"**
5. Click **"Edit"** to open the page editor
**Screenshot placeholder**: *Create Page modal showing title, slug, description, and status fields*
### Page Editor Overview
The page editor has two modes:
**Visual Mode** (default):
- Drag-and-drop interface (GrapesJS)
- No coding required
- What-you-see-is-what-you-get (WYSIWYG)
- Best for: Non-technical users, quick page creation
**Code Mode**:
- HTML/CSS editor
- Full control over markup
- Best for: Experienced users, complex layouts
**Switch modes** using the tabs at the top of the editor.
**Screenshot placeholder**: *Page editor showing Visual/Code mode tabs and toolbar*
!!! warning "Desktop Only"
The page editor is designed for desktop use (minimum 1024px width). Mobile users will see a warning to switch to desktop.
---
## Using the Visual Editor
### Editor Interface
The visual editor has three main areas:
**1. Canvas** (center):
- Preview of your page
- Click blocks to select
- Drag to reposition
**2. Block Toolbar** (left):
- Drag blocks onto canvas
- Categories: Layout, Text, Media, Forms, Components
**3. Settings Panel** (right):
- Style selected block
- Adjust colors, fonts, spacing
- Configure block settings
**Screenshot placeholder**: *Visual editor showing block toolbar, canvas, and settings panel*
### Adding Blocks
**To add a block:**
1. Find block in left toolbar (or search)
2. Drag block onto canvas
3. Drop where you want it
**Available block categories:**
**Layout:**
- **Section**: Full-width container
- **Container**: Centered content wrapper
- **Row**: Multi-column row
- **Column**: Single column within row
**Text:**
- **Text**: Paragraph text
- **Heading**: H1, H2, H3 headings
- **Quote**: Blockquote
- **List**: Bulleted or numbered list
**Media:**
- **Image**: Single image
- **Video**: Embedded video (YouTube, Vimeo, or self-hosted)
- **Icon**: Font Awesome icon
**Forms:**
- **Form**: Form container
- **Input**: Text input field
- **Textarea**: Multi-line text input
- **Button**: Submit button
**Components** (custom blocks):
- **Hero**: Large header with background image and CTA
- **Features**: Three-column feature grid
- **Testimonial**: Quote with author photo
- **Call to Action**: Centered CTA with button
- **Stats**: Number counter grid
**Screenshot placeholder**: *Block toolbar showing categories and block preview thumbnails*
### Configuring Blocks
**To configure a block:**
1. Click the block on canvas (selects it)
2. Settings panel opens on right
3. Adjust settings (varies by block type)
**Common settings:**
**Style tab:**
- **Typography**: Font family, size, weight, color
- **Spacing**: Margin, padding
- **Background**: Color, image, gradient
- **Border**: Width, color, radius
- **Dimensions**: Width, height
**Settings tab** (varies by block):
- **Image**: URL, alt text, link
- **Video**: Video URL, autoplay, controls
- **Button**: Text, link, style
- **Form**: Action URL, method
**Screenshot placeholder**: *Settings panel showing style options for a selected heading block*
### Styling Blocks
**To change text color:**
1. Select text block
2. Settings panel > Style tab
3. Color picker under Typography
4. Choose color or enter hex code
**To change background:**
1. Select section or container block
2. Settings panel > Style tab
3. Background section
4. Choose color, image, or gradient
**To adjust spacing:**
1. Select block
2. Settings panel > Style tab
3. Margin/Padding section
4. Adjust top, right, bottom, left values
**Screenshot placeholder**: *Background settings showing color picker, image upload, and gradient options*
### Using Pre-Built Components
Changemaker Lite includes pre-built components for common page sections:
#### Hero Component
**What it is:** Large header section with background image, headline, and call-to-action button
**How to use:**
1. Drag **Hero** block from Components category
2. Click headline to edit text
3. Click button to edit text and link
4. Select block, then in settings:
- Upload background image
- Adjust overlay opacity
- Change text color
**Screenshot placeholder**: *Hero component on canvas showing headline, subheading, and CTA button*
#### Features Component
**What it is:** Three-column grid showcasing features or benefits
**How to use:**
1. Drag **Features** block onto canvas
2. Click each feature to edit:
- Icon (Font Awesome icon name)
- Heading
- Description
3. Adjust colors and spacing in settings panel
**Screenshot placeholder**: *Features component showing three columns with icons, headings, and text*
#### Testimonial Component
**What it is:** Quote with author photo and name
**How to use:**
1. Drag **Testimonial** block onto canvas
2. Click quote text to edit
3. Click author name to edit
4. Upload author photo in settings panel
#### Call to Action Component
**What it is:** Centered section with headline and button
**How to use:**
1. Drag **Call to Action** block onto canvas
2. Edit headline and description
3. Edit button text and link
4. Adjust background color
### Saving Your Page
**To save changes:**
**Method 1: Keyboard shortcut**
- Press **Ctrl+S** (Windows/Linux) or **Cmd+S** (Mac)
**Method 2: Save button**
- Click **"Save"** button in editor toolbar
**Auto-save:**
- Changes are NOT auto-saved
- Save frequently to avoid losing work
!!! tip "Save Often"
Use Ctrl+S frequently. Browser crashes or network issues can cause unsaved work to be lost.
**Screenshot placeholder**: *Save button in editor toolbar*
---
## Using the Code Editor
### Switching to Code Mode
**To switch to code editor:**
1. Click **"Code"** tab at top of editor
2. HTML code appears in text editor
3. Edit HTML directly
4. Click **"Visual"** tab to return to visual mode
**When to use code mode:**
- Need precise control over HTML structure
- Adding custom CSS or JavaScript
- Copying HTML from another source
- Working with complex layouts
**Screenshot placeholder**: *Code editor showing HTML markup in text editor*
### HTML Structure
**Basic page structure:**
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Page Title</title>
<style>
/* CSS goes here */
</style>
</head>
<body>
<!-- Page content goes here -->
</body>
</html>
```
**Recommended structure:**
```html
<body>
<!-- Hero Section -->
<section class="hero">
<h1>Welcome to Our Campaign</h1>
<p>Join us in making a difference.</p>
<a href="/campaigns/climate-action" class="btn">Take Action</a>
</section>
<!-- Features Section -->
<section class="features">
<div class="container">
<div class="row">
<div class="col">
<h3>Easy to Use</h3>
<p>Send emails in under 2 minutes.</p>
</div>
<div class="col">
<h3>High Impact</h3>
<p>Your voice reaches decision-makers.</p>
</div>
<div class="col">
<h3>Community</h3>
<p>Join thousands of advocates.</p>
</div>
</div>
</div>
</section>
</body>
```
### Adding Custom CSS
**To add custom styles:**
1. In code mode, add a `<style>` block in the `<head>`:
```html
<head>
<style>
.hero {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 100px 20px;
text-align: center;
}
.hero h1 {
font-size: 3rem;
margin-bottom: 20px;
}
.btn {
background: #ff6b6b;
color: white;
padding: 15px 40px;
text-decoration: none;
border-radius: 5px;
display: inline-block;
margin-top: 20px;
}
.btn:hover {
background: #ee5a52;
}
</style>
</head>
```
### Using Variables
Landing pages support variable interpolation:
**Available variables:**
- `{{SITE_NAME}}` — Organization name (from settings)
- `{{SITE_URL}}` — Website URL
- `{{USER_NAME}}` — Logged-in user's name (if authenticated)
**Example usage:**
```html
<p>Welcome to {{SITE_NAME}}, {{USER_NAME}}!</p>
```
Renders as:
```
Welcome to Community Action Network, John Smith!
```
### Keyboard Shortcuts in Code Mode
- **Ctrl+S** / **Cmd+S**: Save
- **Ctrl+F** / **Cmd+F**: Find
- **Ctrl+H** / **Cmd+H**: Find and replace
- **Tab**: Indent
- **Shift+Tab**: Unindent
---
## Publishing Pages
### Publishing Workflow
**Draft → Published:**
1. Create page (status: DRAFT)
2. Build page in editor
3. Preview page (see below)
4. Publish page (change status to PUBLISHED)
**Draft pages:**
- Not visible to public
- Only accessible to admins via direct URL
- Use for: Work in progress, testing
**Published pages:**
- Visible at `/p/[slug]`
- Accessible to anyone
- Indexed by search engines (if SEO configured)
### Previewing Pages
**To preview a page before publishing:**
1. Save the page (Ctrl+S)
2. Click **"Preview"** button in editor toolbar
3. Page opens in new tab at `/p/[slug]?preview=true`
**OR:**
1. Navigate to **Content > Landing Pages**
2. Click page title to view published version
**Screenshot placeholder**: *Preview button in editor toolbar*
### Publishing a Page
**To publish a draft page:**
1. Navigate to **Content > Landing Pages**
2. Find the page in the table
3. Click **"Edit"** in Actions column
4. Change status from DRAFT to PUBLISHED
5. Click **"Save"**
**To unpublish a page:**
1. Change status from PUBLISHED to DRAFT
2. Save
Unpublishing removes the page from public access but preserves all content.
### SEO Settings
**To optimize for search engines:**
1. Edit the page
2. Fill in SEO fields:
- **Title**: Page title (shown in search results, max 60 characters)
- **Description**: Meta description (shown in search results, max 160 characters)
- **Keywords**: Comma-separated keywords (e.g., "climate action, advocacy, environment")
- **OG Image**: Social media share image (Facebook, Twitter)
**Best practices:**
- **Title**: Include primary keyword near beginning
- **Description**: Compelling, action-oriented, includes keyword
- **Keywords**: 5-10 relevant keywords
- **OG Image**: 1200x630 px, high-quality, relevant to page content
**Screenshot placeholder**: *SEO settings form showing title, description, keywords, and OG image fields*
### MkDocs Export
**What it is:** Export landing page as Jinja2 template for MkDocs (static site generator)
**Use case:** Publish landing pages on your static documentation site
**To export:**
1. Navigate to **Content > Landing Pages**
2. Click **"Export"** in Actions column
3. Choose export format:
- **Jinja2 Template**: Wraps HTML in MkDocs Material theme layout
- **Standalone HTML**: Raw HTML (no wrapper)
4. File is saved to MkDocs `docs/overrides/` directory
5. Access via MkDocs site navigation
**Screenshot placeholder**: *Export modal showing Jinja2/Standalone options*
---
## Managing Email Templates
### Email Template Overview
Email templates control the content and formatting of system-generated emails:
**System templates:**
- **Welcome Email**: Sent to new users after registration
- **Password Reset**: Sent when user requests password reset
- **Shift Confirmation**: Sent when volunteer signs up for shift
- **Shift Reminder**: Sent day before shift
- **Response Verification**: Sent to verify campaign response
**Custom templates:**
- Create custom templates for specific campaigns or events
- Use in shift emails, follow-up campaigns, etc.
### Email Template Structure
Each template has three parts:
**1. Subject Line**
- Text shown in email inbox
- Supports variables (e.g., `{{USER_NAME}}`, `{{SHIFT_TITLE}}`)
- Keep under 60 characters
**2. HTML Body**
- Rich-formatted email (colors, images, links)
- What users see in modern email clients
- Supports variables
**3. Plain Text Body**
- Unformatted text version
- Fallback for old email clients or user preference
- Should convey same information as HTML
### Editing an Email Template
**To edit a template:**
1. Navigate to **Content > Email Templates**
2. Click **"Edit"** for the template you want to modify
3. Edit subject, HTML body, and/or plain text body
4. Click **"Preview"** to see rendered email
5. Click **"Save"**
**Screenshot placeholder**: *Email template editor showing subject field, HTML editor, and plain text editor*
### Using Variables in Templates
Variables are placeholders that get replaced with real data when the email is sent.
**Available variables:**
**User variables:**
- `{{USER_NAME}}` — User's full name
- `{{USER_EMAIL}}` — User's email address
**Shift variables:**
- `{{SHIFT_TITLE}}` — Shift name
- `{{SHIFT_START}}` — Start date/time (formatted)
- `{{SHIFT_END}}` — End date/time (formatted)
- `{{SHIFT_LOCATION}}` — Meeting location
- `{{SHIFT_CUT}}` — Cut name
**Campaign variables:**
- `{{CAMPAIGN_TITLE}}` — Campaign name
- `{{CAMPAIGN_URL}}` — Link to campaign page
**System variables:**
- `{{SITE_NAME}}` — Organization name (from settings)
- `{{SITE_URL}}` — Website URL
- `{{RESET_LINK}}` — Password reset link (password reset emails only)
- `{{VERIFICATION_LINK}}` — Verification link (response verification emails only)
**Example template:**
**Subject:**
```
Welcome to {{SITE_NAME}}, {{USER_NAME}}!
```
**HTML Body:**
```html
<h1>Welcome, {{USER_NAME}}!</h1>
<p>Thank you for joining {{SITE_NAME}}. We're excited to have you as part of our community.</p>
<p>Here's what you can do next:</p>
<ul>
<li><a href="{{SITE_URL}}/campaigns">Take action on a campaign</a></li>
<li><a href="{{SITE_URL}}/shifts">Sign up for a volunteer shift</a></li>
<li><a href="{{SITE_URL}}/app">Explore your dashboard</a></li>
</ul>
<p>If you have questions, reply to this email or visit our <a href="{{SITE_URL}}/docs">help center</a>.</p>
<p>Together, we can make a difference!</p>
<p>— The {{SITE_NAME}} Team</p>
```
**Plain Text Body:**
```
Welcome, {{USER_NAME}}!
Thank you for joining {{SITE_NAME}}. We're excited to have you as part of our community.
Here's what you can do next:
- Take action on a campaign: {{SITE_URL}}/campaigns
- Sign up for a volunteer shift: {{SITE_URL}}/shifts
- Explore your dashboard: {{SITE_URL}}/app
If you have questions, reply to this email or visit our help center: {{SITE_URL}}/docs.
Together, we can make a difference!
— The {{SITE_NAME}} Team
```
### HTML Email Best Practices
**Do:**
- ✅ Use inline CSS (not external stylesheets)
- ✅ Use tables for layout (old email clients don't support flexbox/grid)
- ✅ Test in multiple email clients (Gmail, Outlook, Apple Mail)
- ✅ Include alt text for images
- ✅ Use web-safe fonts (Arial, Verdana, Georgia)
- ✅ Keep width under 600px (mobile friendly)
- ✅ Always provide plain text version
**Don't:**
- ❌ Use JavaScript (email clients strip it)
- ❌ Use CSS positioning (absolute, fixed)
- ❌ Use background images (not universally supported)
- ❌ Rely on external resources (may be blocked)
- ❌ Use tiny fonts (< 14px)
### Testing Email Templates
**To test a template:**
1. Click **"Send Test Email"** button in editor
2. Enter your email address
3. Click **"Send"**
4. Check your inbox (may take 1-2 minutes)
The test email uses sample data for variables:
- `{{USER_NAME}}` "Test User"
- `{{SHIFT_TITLE}}` "Sample Shift"
- etc.
**Test in multiple email clients:**
- Gmail (web)
- Outlook (Windows)
- Apple Mail (Mac/iOS)
- Outlook.com (web)
Look for:
- Formatting intact (no broken layout)
- Images loading
- Links working
- Variables replaced correctly
- Readable on mobile (check phone)
**Screenshot placeholder**: *Send Test Email modal showing email address input and send button*
---
## Managing the Media Library
!!! note "Optional Feature"
Media features must be enabled via **Settings > Feature Toggles > ENABLE_MEDIA_FEATURES**. Contact your administrator if this option is not visible.
### Media Library Overview
The media library allows you to:
- **Upload videos**: MP4, MOV, AVI, MKV, WebM, M4V, FLV
- **Organize by directory**: Folder structure for categorization
- **Edit metadata**: Title, description, producer, creator, tags
- **Share publicly**: Publish videos to public gallery at `/media`
- **Lock videos**: Prevent accidental deletion of important content
**Use cases:**
- Event recordings (rallies, town halls, speeches)
- Testimonials (supporter stories)
- Educational content (issue explainers, how-to guides)
- Promotional videos (recruitment, fundraising appeals)
### Uploading Videos
**To upload a video:**
1. Navigate to **Content > Media > Library**
2. Click **"Upload Video"** button (top-right)
3. Either:
- Drag and drop video file into upload area, OR
- Click to browse and select file
4. Fill in metadata (see below)
5. Click **"Upload"**
**Screenshot placeholder**: *Upload Video modal showing drag-drop area and metadata form*
**Supported formats:**
- MP4 (recommended, best compatibility)
- MOV (Apple QuickTime)
- AVI (older format, large file size)
- MKV (Matroska, open format)
- WebM (web-optimized)
- M4V (Apple iTunes)
- FLV (Flash video, legacy)
**File size limit:** 10 GB per file
**Upload time:** Varies by file size and connection speed. A 1 GB file takes ~5-10 minutes on typical broadband.
### Video Metadata
**Metadata fields:**
**Title** (required):
- Video title
- Displayed in library and public gallery
- Example: "Climate Rally - June 2024"
**Description** (optional):
- Longer description of video content
- Supports HTML (bold, links, etc.)
- Displayed on video detail page
**Producer** (optional):
- Organization or individual who produced the video
- Example: "Community Action Network"
**Creator** (optional):
- Videographer or director
- Example: "John Smith"
**Tags** (optional):
- Comma-separated keywords for search/filtering
- Example: "climate, rally, 2024, toronto"
**Directory** (optional):
- Folder path for organization
- Use forward slashes for nested folders
- Examples: "events/2024", "testimonials", "educational"
**Screenshot placeholder**: *Metadata form showing title, description, producer, creator, tags, and directory fields*
### Automatic Metadata Extraction
When you upload a video, the system automatically extracts:
- **Duration**: Length in seconds (shown as MM:SS)
- **Dimensions**: Width x height in pixels (e.g., 1920x1080)
- **Orientation**: PORTRAIT, LANDSCAPE, or SQUARE
- **Quality**: SD, HD, FULL_HD, or 4K
- **Has Audio**: Boolean (detected from audio track)
- **File Size**: Bytes (shown as MB/GB)
**Quality detection:**
- **SD** (Standard Definition): Height < 720px
- **HD** (High Definition): Height 720-1079px
- **FULL_HD** (1080p): Height 1080-2159px
- **4K** (Ultra HD): Height 2160px
**Orientation detection:**
- **PORTRAIT**: Height > Width (e.g., 1080x1920, vertical phone video)
- **LANDSCAPE**: Width > Height (e.g., 1920x1080, standard video)
- **SQUARE**: Width = Height (e.g., 1080x1080, Instagram video)
You cannot edit these fields manually—they're extracted automatically.
### Organizing Videos
**Directory structure:**
Use directories to organize videos by:
- **Type**: "events", "testimonials", "educational", "promotional"
- **Year**: "2024", "2023"
- **Campaign**: "climate-campaign", "housing-campaign"
- **Combination**: "events/2024", "testimonials/climate"
**Example directory structure:**
```
events/
2024/
rally-june.mp4
townhall-july.mp4
2023/
rally-september.mp4
testimonials/
climate/
jane-smith.mp4
john-doe.mp4
housing/
maria-garcia.mp4
educational/
climate-101.mp4
how-to-canvass.mp4
```
**To move videos between directories:**
1. Select videos in library (checkboxes)
2. Choose **"Move"** from bulk actions
3. Enter new directory path
4. Click **"Move"**
**Screenshot placeholder**: *Library showing directory tree sidebar and video grid*
### Filtering and Searching Videos
**To find videos:**
**Search:**
- Enter keywords in search box
- Searches title, description, tags, producer, creator
**Filters:**
- **Directory**: Show only videos in specific directory
- **Quality**: Filter by SD, HD, FULL_HD, 4K
- **Orientation**: Filter by portrait, landscape, square
- **Locked**: Show only locked or unlocked videos
**Sort:**
- Upload date (newest first, oldest first)
- Title (A-Z, Z-A)
- Duration (shortest first, longest first)
**Screenshot placeholder**: *Library filters showing directory dropdown, quality checkboxes, and sort options*
### Editing Video Metadata
**To edit a video:**
1. Click on video thumbnail (or click "Edit" in actions menu)
2. Edit metadata fields
3. Click **"Save"**
**Editable fields:**
- Title
- Description
- Producer
- Creator
- Tags
- Directory
**Non-editable fields** (auto-extracted):
- Duration
- Dimensions
- Orientation
- Quality
- Has Audio
- File Size
### Deleting Videos
**To delete a video:**
1. Select video in library
2. Click **"Delete"** (trash icon)
3. Confirm deletion
!!! danger "Permanent Deletion"
Deleting a video is permanent. The video file is removed from the server and cannot be recovered.
**Locked videos cannot be deleted** (unlock first).
### Locking Videos
**What is locking?**
Locked videos cannot be:
- Deleted
- Moved to a different directory
- Unshared from public gallery (if already shared)
**When to lock:**
- ✅ Important historical videos
- ✅ Videos currently shared publicly
- ✅ Videos linked from landing pages or campaigns
**To lock a video:**
1. Select video
2. Click **"Lock"** (padlock icon)
**To unlock:**
1. Select locked video
2. Click **"Unlock"**
**Screenshot placeholder**: *Video card showing lock icon badge*
---
## Sharing Videos Publicly
### Public Media Gallery
The public media gallery (`/media`) showcases videos to the public. It's organized by categories.
**Categories:**
- **TESTIMONIAL**: Personal stories from supporters
- **EVENT**: Rally videos, town halls, speeches
- **EDUCATIONAL**: Issue explainers, how-to guides
- **PROMOTIONAL**: Recruitment, fundraising appeals
### Sharing Videos
**To share videos publicly:**
1. Navigate to **Content > Media > Shared Media**
2. Click **"Share Videos"** button
3. Select videos from library (search, filter, select)
4. Choose category (TESTIMONIAL, EVENT, EDUCATIONAL, PROMOTIONAL)
5. Click **"Share"**
Videos immediately appear on public gallery at `/media`.
**Screenshot placeholder**: *Share Videos modal showing library selector, category dropdown, and share button*
### Managing Shared Media
**To view shared videos:**
1. Navigate to **Content > Media > Shared Media**
Table shows:
- Video title
- Category
- Shared date
- View count (if tracking enabled)
- Actions: Unshare, change category
**To unshare videos:**
1. Select videos in table
2. Click **"Unshare"**
3. Confirm
Videos are removed from public gallery but remain in library.
**To change category:**
1. Click **"Edit"** for video
2. Select new category
3. Click **"Save"**
### Public Gallery Customization
**Gallery settings** (managed by admin):
- Gallery title (e.g., "Our Videos")
- Category order
- Videos per page
- Allow reactions (like, love, etc.)
Ask your administrator to configure these settings.
---
## Content Best Practices
### Writing for the Web
**Scannable:**
- Use headings and subheadings
- Short paragraphs (2-3 sentences)
- Bulleted lists
- Bold key points
**Actionable:**
- Clear call to action on every page
- Tell users what to do next
- Use action verbs (Join, Donate, Sign Up, Learn More)
**Accessible:**
- Use alt text for images
- Sufficient color contrast (WCAG AA: 4.5:1 for text)
- Descriptive link text (not "click here")
- Readable font size (≥ 16px)
### Mobile Optimization
**Mobile traffic** is 50-70% of web traffic. Optimize for mobile:
**Responsive design:**
- Use mobile-friendly templates
- Test on actual phones (not just desktop browser resize)
**Touch targets:**
- Buttons at least 44x44 px
- Adequate spacing between links (avoid accidental taps)
**Load time:**
- Compress images (use tools like TinyPNG)
- Minimize video file sizes
- Avoid large background images
**Readability:**
- Large font (≥ 16px)
- Short paragraphs
- Simple navigation
### SEO Optimization
**On-page SEO:**
1. **Title tag**: Include primary keyword, under 60 characters
2. **Meta description**: Compelling, includes keyword, under 160 characters
3. **Headings**: Use H1 for main title, H2 for sections, H3 for subsections
4. **Keywords**: Use naturally in content (don't stuff)
5. **Internal links**: Link to other pages on your site
6. **External links**: Link to authoritative sources
7. **Image alt text**: Describe images for screen readers and SEO
**Technical SEO:**
- Fast load time (< 3 seconds)
- Mobile-friendly
- HTTPS (secure)
- Clean URLs (e.g., `/p/about-us`, not `/p/page?id=123`)
### Accessibility
**WCAG 2.1 Level AA compliance:**
**Perceivable:**
- Alt text for images
- Captions for videos
- Color contrast (4.5:1 for text, 3:1 for large text)
**Operable:**
- Keyboard navigation (all interactive elements reachable via Tab)
- Skip links (skip to main content)
- No keyboard traps
**Understandable:**
- Clear language (avoid jargon)
- Consistent navigation
- Error messages explain how to fix
**Robust:**
- Valid HTML (no unclosed tags, proper nesting)
- Semantic markup (use `<nav>`, `<main>`, `<article>`, not just `<div>`)
---
## Troubleshooting
### Landing Pages
**Issue: Page editor won't load**
**Solutions:**
1. Check browser console for errors (F12)
2. Try different browser (Chrome recommended)
3. Clear browser cache (Ctrl+Shift+Delete)
4. Disable browser extensions (ad blockers may interfere)
---
**Issue: Changes not saving**
**Solutions:**
1. Check internet connection
2. Try Ctrl+S (keyboard shortcut)
3. Check browser console for errors
4. Try refreshing and re-editing
---
**Issue: Page looks different when published**
**Causes:**
- Preview mode shows editor styles (not exact public view)
- Browser caching old version
**Solutions:**
1. Hard refresh published page (Ctrl+Shift+R)
2. Test in incognito/private window
3. Clear browser cache
---
### Email Templates
**Issue: Variables not replacing**
**Symptoms:** Email shows `{{USER_NAME}}` instead of actual name
**Causes:**
- Variable name misspelled
- Variable not supported in this template type
- Email sent via test (test uses sample data)
**Solutions:**
1. Check variable spelling (case-sensitive)
2. Consult variable reference (see "Using Variables" above)
3. Send real email (not test) to see actual data
---
**Issue: Email looks broken in Outlook**
**Causes:** Outlook uses Microsoft Word rendering engine (poor CSS support)
**Solutions:**
1. Use table-based layout (not flexbox/grid)
2. Use inline CSS (not external styles)
3. Test specifically in Outlook (use Litmus or Email on Acid)
---
### Media Library
**Issue: Video won't upload**
**Solutions:**
1. Check file size (max 10 GB)
2. Check file format (must be MP4, MOV, AVI, MKV, WebM, M4V, or FLV)
3. Check internet connection (large files need stable connection)
4. Try different browser
---
**Issue: Metadata extraction failed**
**Symptoms:** Duration shows "Unknown", quality shows "N/A"
**Causes:**
- Video file is corrupted
- Unsupported codec
- FFprobe service not running (server issue)
**Solutions:**
1. Try re-encoding video (use HandBrake or similar)
2. Convert to MP4 with H.264 codec (most compatible)
3. Contact administrator (may be server configuration issue)
---
**Issue: Video won't play on public gallery**
**Causes:**
- Video not shared (still in library only)
- Unsupported codec in browser
- Video file missing (deleted from server)
**Solutions:**
1. Verify video is shared (Content > Media > Shared Media)
2. Re-encode as H.264 MP4 (best browser compatibility)
3. Check server logs (ask administrator)
---
## Related Documentation
- **[Admin Guide](admin-guide.md)**: Full administrator guide
- **[Campaign Manager Guide](campaign-manager-guide.md)**: Campaign-specific content (email templates)
- **[Landing Pages Feature](../features/landing-pages.md)**: Technical documentation on GrapesJS editor
- **[Media Library Feature](../features/media.md)**: Technical documentation on video upload and storage
- **[API Reference](../api/pages.md)**: Pages API endpoints
---
**Last updated**: February 2026 (V2 complete)