644 lines
21 KiB
Markdown
644 lines
21 KiB
Markdown
# Product Requirements Document: Media Library Modal System
|
||
|
||
## 🎉 **PROJECT STATUS: CORE IMPLEMENTATION COMPLETE!**
|
||
|
||
We have successfully implemented a comprehensive Media Library system with both direct upload workflows and library browsing capabilities. **All major components are functional and integrated throughout the admin interface.**
|
||
|
||
### 🏆 Major Achievements
|
||
|
||
- **✅ Complete MediaLibraryModal system** with single/multiple selection
|
||
- **✅ Enhanced upload components** (ImageUploader, GalleryUploader) with MediaLibraryModal integration
|
||
- **✅ Full form integration** across projects, posts, albums, and editor
|
||
- **✅ Alt text support** throughout upload and editing workflows
|
||
- **✅ Edra editor integration** with `/image` and `/gallery` slash commands
|
||
- **✅ Media Library management** with clickable editing and metadata support
|
||
|
||
## Overview
|
||
|
||
Implement a comprehensive Media Library modal system that provides a unified interface for browsing, selecting, and managing media across all admin forms. **The primary workflow is direct upload from computer within forms**, with the Media Library serving as a secondary browsing interface and management tool for previously uploaded content.
|
||
|
||
## 📋 Updated Approach Summary
|
||
|
||
**🎯 Primary Focus**: Direct upload components that allow users to drag-and-drop or browse files directly within project/post/album forms, with immediate preview and alt text capture.
|
||
|
||
**🎯 Secondary Feature**: Media Library modal for selecting previously uploaded content when needed.
|
||
|
||
**🎯 Key Addition**: Alt text storage and editing capabilities for accessibility compliance and SEO.
|
||
|
||
## Goals
|
||
|
||
### Primary Goals (Direct Upload Workflow)
|
||
|
||
- **Enable direct file upload within forms** where content will be used (projects, posts, albums)
|
||
- **Provide immediate upload and preview** without requiring navigation to separate media management
|
||
- **Store comprehensive metadata** including alt text for accessibility and SEO
|
||
- **Support drag-and-drop and click-to-browse** for intuitive file selection
|
||
|
||
### Secondary Goals (Media Library Browser)
|
||
|
||
- Create a reusable media browser for **selecting previously uploaded content**
|
||
- Provide **media management interface** showing where files are referenced
|
||
- Enable **bulk operations** and **metadata editing** (especially alt text)
|
||
- Support **file organization** and **usage tracking**
|
||
|
||
### Technical Goals
|
||
|
||
- Maintain consistent UX across all media interactions
|
||
- Support different file type filtering based on context
|
||
- Integrate seamlessly with existing admin components
|
||
|
||
## Current State Analysis
|
||
|
||
### ✅ What We Have
|
||
|
||
- Complete media API (`/api/media`, `/api/media/upload`, `/api/media/bulk-upload`)
|
||
- Media management page with grid/list views and search/filtering
|
||
- Modal base component (`Modal.svelte`)
|
||
- Complete admin UI component library (Button, Input, etc.)
|
||
- Media upload infrastructure with Cloudinary integration
|
||
- Pagination and search functionality
|
||
- **✅ Database schema with alt text support** (altText field in Media table)
|
||
- **✅ MediaLibraryModal component** with single/multiple selection modes
|
||
- **✅ ImageUploader and GalleryUploader components** with MediaLibraryModal integration
|
||
- **✅ Enhanced admin form components** with Browse Library functionality
|
||
- **✅ Media details editing** with alt text support in Media Library page
|
||
- **✅ Edra editor integration** with image and gallery support via slash commands
|
||
|
||
### 🎯 What We Need
|
||
|
||
#### High Priority (Remaining Tasks)
|
||
|
||
- **Enhanced upload features** with drag & drop zones in all upload components
|
||
- **Bulk alt text editing** in Media Library for existing content
|
||
- **Usage tracking display** showing where media is referenced
|
||
- **Performance optimizations** for large media libraries
|
||
|
||
#### Medium Priority (Polish & Advanced Features)
|
||
|
||
- **Image optimization options** during upload
|
||
- **Advanced search capabilities** (by alt text, usage, etc.)
|
||
- **Bulk operations** (delete multiple, bulk metadata editing)
|
||
|
||
#### Low Priority (Future Enhancements)
|
||
|
||
- **AI-powered alt text suggestions**
|
||
- **Duplicate detection** and management
|
||
- **Advanced analytics** and usage reporting
|
||
|
||
## Workflow Priorities
|
||
|
||
### 🥇 Primary Workflow: Direct Upload in Forms
|
||
|
||
This is the **main workflow** that users will use 90% of the time:
|
||
|
||
1. **User creates content** (project, post, album)
|
||
2. **User uploads files directly** in the form where they'll be used
|
||
3. **Files are immediately processed** and previewed
|
||
4. **Alt text and metadata** are captured during upload
|
||
5. **Content is saved** with proper media references
|
||
|
||
**Key Components**:
|
||
|
||
- `ImageUploader` - Direct drag-and-drop/click upload with preview
|
||
- `GalleryUploader` - Multiple file upload with immediate gallery preview
|
||
- `MediaMetadataForm` - Alt text and description capture during upload
|
||
|
||
### 🥈 Secondary Workflow: Browse Existing Media
|
||
|
||
This workflow is for **reusing previously uploaded content**:
|
||
|
||
1. **User needs to select existing media** (rare case)
|
||
2. **User clicks "Browse Library"** (secondary button)
|
||
3. **Media Library Modal opens** showing all uploaded files
|
||
4. **User selects from existing content**
|
||
5. **Media references are updated**
|
||
|
||
**Key Components**:
|
||
|
||
- `MediaLibraryModal` - Browse and select existing media
|
||
- `MediaSelector` - Grid interface for selection
|
||
- `MediaManager` - Edit alt text and view usage
|
||
|
||
## Technical Requirements
|
||
|
||
### 1. Enhanced Upload Components (Primary)
|
||
|
||
#### ImageUploader Component
|
||
|
||
**Purpose**: Direct image upload with immediate preview and metadata capture
|
||
|
||
```typescript
|
||
interface ImageUploaderProps {
|
||
label: string
|
||
value?: Media | null
|
||
onUpload: (media: Media) => void
|
||
aspectRatio?: string
|
||
required?: boolean
|
||
error?: string
|
||
allowAltText?: boolean // Enable alt text input
|
||
maxFileSize?: number // MB limit
|
||
}
|
||
```
|
||
|
||
**Features**:
|
||
|
||
- Drag-and-drop upload zone with visual feedback
|
||
- Click to browse files from computer
|
||
- Immediate image preview with proper aspect ratio
|
||
- Alt text input field (when enabled)
|
||
- Upload progress indicator
|
||
- File validation with helpful error messages
|
||
- Replace/remove functionality
|
||
|
||
#### GalleryUploader Component
|
||
|
||
**Purpose**: Multiple file upload with gallery preview and reordering
|
||
|
||
```typescript
|
||
interface GalleryUploaderProps {
|
||
label: string
|
||
value?: Media[]
|
||
onUpload: (media: Media[]) => void
|
||
onReorder?: (media: Media[]) => void
|
||
maxItems?: number
|
||
allowAltText?: boolean
|
||
required?: boolean
|
||
error?: string
|
||
}
|
||
```
|
||
|
||
**Features**:
|
||
|
||
- Multiple file drag-and-drop
|
||
- Immediate gallery preview grid
|
||
- Individual alt text inputs for each image
|
||
- Drag-and-drop reordering
|
||
- Individual remove buttons
|
||
- Bulk upload progress
|
||
|
||
### 2. MediaLibraryModal Component (Secondary)
|
||
|
||
**Purpose**: Main modal component that wraps the media browser functionality
|
||
|
||
**Props Interface**:
|
||
|
||
```typescript
|
||
interface MediaLibraryModalProps {
|
||
isOpen: boolean
|
||
mode: 'single' | 'multiple'
|
||
fileType?: 'image' | 'video' | 'all'
|
||
onSelect: (media: Media | Media[]) => void
|
||
onClose: () => void
|
||
selectedIds?: number[] // Pre-selected items
|
||
title?: string // Modal title
|
||
confirmText?: string // Confirm button text
|
||
}
|
||
```
|
||
|
||
**Features**:
|
||
|
||
- Modal overlay with proper focus management
|
||
- Header with title and close button
|
||
- Media browser grid with selection indicators
|
||
- Search and filter controls
|
||
- Upload area with drag-and-drop
|
||
- Footer with selection count and action buttons
|
||
- Responsive design (desktop and tablet)
|
||
|
||
### 2. MediaSelector Component
|
||
|
||
**Purpose**: The actual media browsing interface within the modal
|
||
|
||
**Features**:
|
||
|
||
- Grid layout with thumbnail previews
|
||
- Individual item selection with visual feedback
|
||
- Keyboard navigation support
|
||
- Loading states and error handling
|
||
- "Select All" / "Clear Selection" bulk actions (for multiple mode)
|
||
|
||
**Item Display**:
|
||
|
||
- Thumbnail image
|
||
- Filename (truncated)
|
||
- File size and dimensions
|
||
- Usage indicator (if used elsewhere)
|
||
- Selection checkbox/indicator
|
||
|
||
### 3. MediaUploader Component
|
||
|
||
**Purpose**: Handle file uploads within the modal
|
||
|
||
**Features**:
|
||
|
||
- Drag-and-drop upload zone
|
||
- Click to browse files
|
||
- Upload progress indicators
|
||
- Error handling and validation
|
||
- Multiple file upload support
|
||
- Automatic refresh of media grid after upload
|
||
|
||
**Validation**:
|
||
|
||
- File type restrictions based on context
|
||
- File size limits (10MB per file)
|
||
- Maximum number of files for bulk upload
|
||
|
||
### 4. Form Integration Components
|
||
|
||
#### MediaInput Component
|
||
|
||
**Purpose**: Generic input field that opens media library modal
|
||
|
||
```typescript
|
||
interface MediaInputProps {
|
||
label: string
|
||
value?: Media | Media[] | null
|
||
mode: 'single' | 'multiple'
|
||
fileType?: 'image' | 'video' | 'all'
|
||
onSelect: (media: Media | Media[] | null) => void
|
||
placeholder?: string
|
||
required?: boolean
|
||
error?: string
|
||
}
|
||
```
|
||
|
||
**Display**:
|
||
|
||
- Label and optional required indicator
|
||
- Preview of selected media (thumbnail + filename)
|
||
- "Browse" button to open modal
|
||
- "Clear" button to remove selection
|
||
- Error state display
|
||
|
||
#### ImagePicker Component
|
||
|
||
**Purpose**: Specialized single image selector with enhanced preview
|
||
|
||
```typescript
|
||
interface ImagePickerProps {
|
||
label: string
|
||
value?: Media | null
|
||
onSelect: (media: Media | null) => void
|
||
aspectRatio?: string // e.g., "16:9", "1:1"
|
||
placeholder?: string
|
||
required?: boolean
|
||
error?: string
|
||
}
|
||
```
|
||
|
||
**Display**:
|
||
|
||
- Large preview area with placeholder
|
||
- Image preview with proper aspect ratio
|
||
- Overlay with "Change" and "Remove" buttons on hover
|
||
- Upload progress indicator
|
||
|
||
#### GalleryManager Component
|
||
|
||
**Purpose**: Multiple image selection with drag-and-drop reordering
|
||
|
||
```typescript
|
||
interface GalleryManagerProps {
|
||
label: string
|
||
value?: Media[]
|
||
onSelect: (media: Media[]) => void
|
||
onReorder?: (media: Media[]) => void
|
||
maxItems?: number
|
||
required?: boolean
|
||
error?: string
|
||
}
|
||
```
|
||
|
||
**Display**:
|
||
|
||
- Grid of selected images with reorder handles
|
||
- "Add Images" button to open modal
|
||
- Individual remove buttons on each image
|
||
- Drag-and-drop reordering with visual feedback
|
||
|
||
## User Experience Flows
|
||
|
||
### 🥇 Primary Flow: Direct Upload in Forms
|
||
|
||
#### 1. Single Image Upload (Project Featured Image)
|
||
|
||
1. **User creates/edits project** and reaches featured image field
|
||
2. **User drags image file** directly onto ImageUploader component OR clicks to browse
|
||
3. **File is immediately uploaded** with progress indicator
|
||
4. **Image preview appears** with proper aspect ratio
|
||
5. **Alt text input field appears** below preview (if enabled)
|
||
6. **User enters alt text** for accessibility
|
||
7. **Form can be saved** with media reference and metadata
|
||
|
||
#### 2. Multiple Image Upload (Project Gallery)
|
||
|
||
1. **User reaches gallery section** of project form
|
||
2. **User drags multiple files** onto GalleryUploader OR clicks to browse multiple
|
||
3. **Upload progress shown** for each file individually
|
||
4. **Gallery grid appears** with all uploaded images
|
||
5. **Alt text inputs available** for each image
|
||
6. **User can reorder** images with drag-and-drop
|
||
7. **User can remove** individual images with X button
|
||
8. **Form saves** with complete gallery and metadata
|
||
|
||
#### 3. Media Management and Alt Text Editing
|
||
|
||
1. **User visits Media Library page** to manage uploaded content
|
||
2. **User clicks on any media item** to open details modal
|
||
3. **User can edit alt text** and other metadata
|
||
4. **User can see usage references** (which projects/posts use this media)
|
||
5. **Changes are saved** and reflected wherever media is used
|
||
|
||
### 🥈 Secondary Flow: Browse Existing Media
|
||
|
||
#### 1. Selecting Previously Uploaded Image
|
||
|
||
1. **User clicks "Browse Library"** button (secondary option in forms)
|
||
2. **MediaLibraryModal opens** showing all previously uploaded media
|
||
3. **User browses or searches** existing content
|
||
4. **User selects image** and confirms selection
|
||
5. **Modal closes** and form shows selected media with existing alt text
|
||
|
||
#### 2. Managing Media Library
|
||
|
||
1. **User visits dedicated Media Library page**
|
||
2. **User can view all uploaded media** in grid/list format
|
||
3. **User can edit metadata** including alt text for any media
|
||
4. **User can see usage tracking** - which content references each media
|
||
5. **User can perform bulk operations** like deleting unused media
|
||
|
||
## Design Specifications
|
||
|
||
### Modal Layout
|
||
|
||
- **Width**: 1200px max, responsive on smaller screens
|
||
- **Height**: 80vh max with scroll
|
||
- **Grid**: 4-6 columns depending on screen size
|
||
- **Item Size**: 180px × 140px thumbnails
|
||
|
||
### Visual States
|
||
|
||
- **Default**: Border with subtle background
|
||
- **Selected**: Blue border and checkmark overlay
|
||
- **Hover**: Slight scale and shadow effect
|
||
- **Loading**: Skeleton loader animation
|
||
- **Upload**: Progress overlay with percentage
|
||
|
||
### Colors (Using Existing Variables)
|
||
|
||
- **Selection**: `$blue-60` for selected state
|
||
- **Hover**: `$grey-10` background
|
||
- **Upload Progress**: `$green-60` for success, `$red-60` for error
|
||
|
||
## API Integration
|
||
|
||
### Endpoints Used
|
||
|
||
- `GET /api/media` - Browse media with search/filter/pagination
|
||
- `POST /api/media/upload` - Single file upload
|
||
- `POST /api/media/bulk-upload` - Multiple file upload
|
||
|
||
### Search and Filtering
|
||
|
||
- **Search**: By filename (case-insensitive)
|
||
- **Filter by Type**: image/_, video/_, all
|
||
- **Filter by Usage**: unused only, all
|
||
- **Sort**: Most recent first
|
||
|
||
### Pagination
|
||
|
||
- 24 items per page
|
||
- Infinite scroll or traditional pagination
|
||
- Loading states during page changes
|
||
|
||
## Implementation Plan
|
||
|
||
### ✅ Phase 1: Database Schema Updates (COMPLETED)
|
||
|
||
1. **✅ Alt Text Support**
|
||
|
||
- Database schema includes `altText` and `description` fields
|
||
- API endpoints support alt text in upload and update operations
|
||
|
||
2. **⏳ Usage Tracking (IN PROGRESS)**
|
||
- Basic usage references working in forms
|
||
- Need dedicated tracking table for comprehensive usage analytics
|
||
|
||
### ✅ Phase 2: Direct Upload Components (COMPLETED)
|
||
|
||
1. **✅ ImageUploader Component**
|
||
|
||
- Drag-and-drop upload zone with visual feedback
|
||
- Immediate upload and preview functionality
|
||
- Alt text input integration
|
||
- MediaLibraryModal integration as secondary option
|
||
|
||
2. **✅ GalleryUploader Component**
|
||
|
||
- Multiple file drag-and-drop support
|
||
- Individual alt text inputs per image
|
||
- Drag-and-drop reordering functionality
|
||
- Remove individual images functionality
|
||
- MediaLibraryModal integration for existing media selection
|
||
|
||
3. **✅ Upload API Enhancement**
|
||
- Alt text accepted in upload requests
|
||
- Complete media object returned with metadata
|
||
- Batch uploads with individual alt text support
|
||
|
||
### ✅ Phase 3: Form Integration (COMPLETED)
|
||
|
||
1. **✅ Project Forms Enhancement**
|
||
|
||
- Logo field enhanced with ImageUploader + Browse Library
|
||
- Featured image support with ImageUploader
|
||
- Gallery section implemented with GalleryUploader
|
||
- Secondary "Browse Library" buttons throughout
|
||
|
||
2. **✅ Post Forms Enhancement**
|
||
- Photo post creation with PhotoPostForm
|
||
- Album creation with AlbumForm and GalleryUploader
|
||
- Universe Composer with photo attachments
|
||
- Enhanced Edra editor with inline image/gallery support
|
||
|
||
### ✅ Phase 4: Media Library Management (MOSTLY COMPLETED)
|
||
|
||
1. **✅ Enhanced Media Library Page**
|
||
|
||
- Alt text editing for existing media via MediaDetailsModal
|
||
- Clickable media items with edit functionality
|
||
- Grid and list view toggles
|
||
|
||
2. **✅ MediaLibraryModal for Selection**
|
||
- Browse existing media interface
|
||
- Single and multiple selection modes
|
||
- Integration throughout all form components
|
||
- File type filtering (image/video/all)
|
||
|
||
### 🎯 Phase 5: Remaining Enhancements (CURRENT PRIORITIES)
|
||
|
||
#### 🔥 High Priority (Next Sprint)
|
||
|
||
1. **Enhanced Media Library Features**
|
||
|
||
- **Bulk alt text editing** - Select multiple media items and edit alt text in batch
|
||
- **Usage tracking display** - Show where each media item is referenced
|
||
- **Advanced drag & drop zones** - More intuitive upload areas in all components
|
||
|
||
2. **Performance Optimizations**
|
||
- **Lazy loading** for large media libraries
|
||
- **Search optimization** with better indexing
|
||
- **Thumbnail optimization** for faster loading
|
||
|
||
#### 🔥 Medium Priority (Future Sprints)
|
||
|
||
1. **Advanced Upload Features**
|
||
|
||
- **Image resizing/optimization** options during upload
|
||
- **Duplicate detection** to prevent redundant uploads
|
||
- **Bulk upload improvements** with better progress tracking
|
||
|
||
2. **Usage Analytics & Management**
|
||
- **Usage analytics dashboard** showing media usage statistics
|
||
- **Unused media cleanup** tools for storage optimization
|
||
- **Advanced search** by alt text, usage status, date ranges
|
||
|
||
#### 🔥 Low Priority (Nice-to-Have)
|
||
|
||
1. **AI Integration**
|
||
- **Automatic alt text suggestions** using image recognition
|
||
- **Smart tagging** for better organization
|
||
- **Content-aware optimization** suggestions
|
||
|
||
## Success Criteria
|
||
|
||
### Functional Requirements
|
||
|
||
#### Primary Workflow (Direct Upload)
|
||
|
||
- [x] **Drag-and-drop upload works** in all form components
|
||
- [x] **Click-to-browse file selection** works reliably
|
||
- [x] **Immediate upload and preview** happens without page navigation
|
||
- [x] **Alt text input appears** and saves with uploaded media
|
||
- [x] **Upload progress** is clearly indicated with percentage
|
||
- [x] **Error handling** provides helpful feedback for failed uploads
|
||
- [x] **Multiple file upload** works with individual progress tracking
|
||
- [x] **Gallery reordering** works with drag-and-drop after upload
|
||
|
||
#### Secondary Workflow (Media Library)
|
||
|
||
- [x] **Media Library Modal** opens and closes properly with smooth animations
|
||
- [x] **Single and multiple selection** modes work correctly
|
||
- [x] **Search and filtering** return accurate results
|
||
- [ ] **Usage tracking** shows where media is referenced (IN PROGRESS)
|
||
- [x] **Alt text editing** works in Media Library management
|
||
- [x] **All components are keyboard accessible**
|
||
|
||
#### Edra Editor Integration
|
||
|
||
- [x] **Slash commands** work for image and gallery insertion
|
||
- [x] **MediaLibraryModal integration** in editor placeholders
|
||
- [x] **Gallery management** within rich text editor
|
||
- [x] **Image replacement** functionality in editor
|
||
|
||
### Performance Requirements
|
||
|
||
- [x] Modal opens in under 200ms
|
||
- [x] Media grid loads in under 1 second
|
||
- [x] Search results appear in under 500ms
|
||
- [x] Upload progress updates in real-time
|
||
- [x] No memory leaks when opening/closing modal multiple times
|
||
|
||
### UX Requirements
|
||
|
||
- [x] Interface is intuitive without instruction
|
||
- [x] Visual feedback is clear for all interactions
|
||
- [x] Error messages are helpful and actionable
|
||
- [x] Mobile/tablet interface is fully functional
|
||
- [x] Loading states prevent user confusion
|
||
|
||
## Technical Considerations
|
||
|
||
### State Management
|
||
|
||
- Use Svelte runes for reactive state
|
||
- Maintain selection state during modal lifecycle
|
||
- Handle API loading and error states properly
|
||
|
||
### Accessibility
|
||
|
||
- Proper ARIA labels and roles
|
||
- Keyboard navigation support
|
||
- Focus management when modal opens/closes
|
||
- Screen reader announcements for state changes
|
||
|
||
### Performance
|
||
|
||
- Lazy load thumbnails as they come into view
|
||
- Debounce search input to prevent excessive API calls
|
||
- Efficient reordering without full re-renders
|
||
- Memory cleanup when modal is closed
|
||
|
||
### Error Handling
|
||
|
||
- Network failure recovery
|
||
- Upload failure feedback
|
||
- File validation error messages
|
||
- Graceful degradation for missing thumbnails
|
||
|
||
## Future Enhancements
|
||
|
||
### Nice-to-Have Features
|
||
|
||
- **Bulk Operations**: Delete multiple files, bulk tag editing
|
||
- **Advanced Search**: Search by tags, date range, file size
|
||
- **Preview Mode**: Full-size preview with navigation
|
||
- **Folder Organization**: Create folders/categories for organization
|
||
- **Smart Suggestions**: Recently used, similar images
|
||
- **Crop Tool**: Basic cropping interface within modal
|
||
- **Alt Text Editor**: Quick alt text editing for accessibility
|
||
|
||
### Integration Opportunities
|
||
|
||
- **CDN Optimization**: Automatic image optimization settings
|
||
- **AI Tagging**: Automatic tag generation for uploaded images
|
||
- **Duplicate Detection**: Warn about similar/duplicate uploads
|
||
- **Usage Analytics**: Track which media is used most frequently
|
||
|
||
## Development Checklist
|
||
|
||
### Core Components
|
||
|
||
- [x] MediaLibraryModal base structure
|
||
- [x] MediaSelector with grid layout
|
||
- [x] MediaUploader with drag-and-drop
|
||
- [x] Search and filter interface
|
||
- [x] Pagination implementation
|
||
|
||
### Form Integration
|
||
|
||
- [x] MediaInput generic component (ImageUploader/GalleryUploader)
|
||
- [x] ImagePicker specialized component (ImageUploader)
|
||
- [x] GalleryManager with reordering (GalleryUploader)
|
||
- [x] Integration with existing project forms
|
||
- [x] Integration with post forms
|
||
- [x] Integration with Edra editor
|
||
|
||
### Polish and Testing
|
||
|
||
- [x] Responsive design implementation
|
||
- [x] Accessibility testing and fixes
|
||
- [x] Performance optimization
|
||
- [x] Error state handling
|
||
- [x] Cross-browser testing
|
||
- [x] Mobile device testing
|
||
|
||
### 🎯 Next Priority Items
|
||
|
||
- [ ] **Bulk alt text editing** in Media Library
|
||
- [ ] **Usage tracking display** for media references
|
||
- [ ] **Advanced drag & drop zones** with better visual feedback
|
||
- [ ] **Performance optimizations** for large libraries
|
||
|
||
This Media Library system will serve as the foundation for all media-related functionality in the CMS, enabling rich content creation across projects, posts, and albums.
|