Added geographic locations for upcoming events
This commit is contained in:
parent
a2b3b1756d
commit
b214427fda
4 changed files with 666 additions and 33 deletions
492
DEVELOPMENT_DOCUMENTATION.txt
Normal file
492
DEVELOPMENT_DOCUMENTATION.txt
Normal file
|
|
@ -0,0 +1,492 @@
|
||||||
|
# DeafGain Website - Complete Development Documentation
|
||||||
|
## Technical Stack Overview & Recent Enhancements
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
PROJECT OVERVIEW
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
DeafGain LLC Website serves as a comprehensive digital platform dedicated to
|
||||||
|
empowering the Deaf community through innovative communication solutions,
|
||||||
|
professional training resources, and accessibility services. The website
|
||||||
|
focuses on providing ADA-compliant content with full accessibility features
|
||||||
|
including WebVTT subtitles, transcriptions, and universal design principles.
|
||||||
|
|
||||||
|
Live Production URL: https://deafgain.org/
|
||||||
|
Development Server: http://localhost:5173
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
TECHNOLOGY STACK - COMPREHENSIVE BREAKDOWN
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
FRONTEND TECHNOLOGIES
|
||||||
|
---------------------
|
||||||
|
- React 19.0.0 - Core UI framework with latest features
|
||||||
|
- TypeScript 5.7.2 - Type safety and enhanced development experience
|
||||||
|
- React Router 7.6.1 - Client-side routing with latest security fixes
|
||||||
|
- Tailwind CSS 3.4.16 - Utility-first CSS framework for rapid styling
|
||||||
|
- Framer Motion 11.13.5 - Advanced animations and micro-interactions
|
||||||
|
- React Simple Maps 4.0.0-beta.6 - Geographic visualization components
|
||||||
|
- React Icons 5.4.0 - Comprehensive icon library
|
||||||
|
- React Intersection Observer 9.13.1 - Scroll detection and lazy loading
|
||||||
|
|
||||||
|
BACKEND TECHNOLOGIES
|
||||||
|
--------------------
|
||||||
|
- Express.js 4.21.2 - Web application framework for Node.js
|
||||||
|
- Node.js (Latest LTS) - JavaScript runtime environment
|
||||||
|
- Nodemailer 6.9.9 - Email service integration
|
||||||
|
- Upstash Redis 1.28.4 - Cloud Redis for caching and rate limiting
|
||||||
|
- TypeScript 5.7.2 - Backend type safety
|
||||||
|
- dotenv 16.4.7 - Environment variable management
|
||||||
|
|
||||||
|
DEVELOPMENT & BUILD TOOLS
|
||||||
|
-------------------------
|
||||||
|
- Vite 6.3.5 - Lightning-fast build tool and dev server
|
||||||
|
- pnpm 9.14.2 - Efficient package manager
|
||||||
|
- ESLint 9.15.0 - Code quality and consistency enforcement
|
||||||
|
- PostCSS 8.4.49 - CSS processing and optimization
|
||||||
|
- Autoprefixer 10.4.20 - CSS vendor prefix automation
|
||||||
|
- Concurrently 9.1.2 - Parallel process management
|
||||||
|
- tsx 4.19.4 - TypeScript execution for development
|
||||||
|
|
||||||
|
DEPLOYMENT & INFRASTRUCTURE
|
||||||
|
----------------------------
|
||||||
|
- Docker & Docker Compose - Containerization and orchestration
|
||||||
|
- Nginx - Reverse proxy and static file serving
|
||||||
|
- Redis - Session management and caching
|
||||||
|
- Gmail SMTP - Email service integration
|
||||||
|
- Caddy Reverse Proxy - Production load balancing
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
ARCHITECTURE OVERVIEW
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
FRONTEND ARCHITECTURE
|
||||||
|
---------------------
|
||||||
|
The application follows a modern React architecture with:
|
||||||
|
|
||||||
|
1. Component Structure:
|
||||||
|
- Layout components (Navbar, Footer) for consistent structure
|
||||||
|
- Page components for route-specific content
|
||||||
|
- Shared components for reusability
|
||||||
|
- Context providers for global state management
|
||||||
|
|
||||||
|
2. State Management:
|
||||||
|
- React Context for global application state
|
||||||
|
- Local component state for UI-specific data
|
||||||
|
- Notification context for toast messaging system
|
||||||
|
|
||||||
|
3. Routing System:
|
||||||
|
- React Router v7 for client-side navigation
|
||||||
|
- Protected routes and dynamic routing
|
||||||
|
- Direct video linking with URL parameters
|
||||||
|
|
||||||
|
BACKEND ARCHITECTURE
|
||||||
|
--------------------
|
||||||
|
Express.js RESTful API with:
|
||||||
|
|
||||||
|
1. API Structure:
|
||||||
|
- RESTful endpoints for contact and subscription
|
||||||
|
- Rate-limited routes for security
|
||||||
|
- Error handling and input validation
|
||||||
|
|
||||||
|
2. Services:
|
||||||
|
- Email service with professional templates
|
||||||
|
- Redis-backed caching and session management
|
||||||
|
- Rate limiting middleware
|
||||||
|
|
||||||
|
SECURITY IMPLEMENTATION
|
||||||
|
-----------------------
|
||||||
|
- Input validation and sanitization
|
||||||
|
- Rate limiting on API endpoints (Redis-backed)
|
||||||
|
- CORS policy configuration
|
||||||
|
- Environment variable protection
|
||||||
|
- Secure email handling with app passwords
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
RECENT ENHANCEMENTS - VIDEO CARD INTERFACE IMPROVEMENTS
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
OVERVIEW OF MODIFICATIONS
|
||||||
|
-------------------------
|
||||||
|
Recent updates to the Resources page video library interface focus on enhanced
|
||||||
|
user experience, modern visual design, and improved accessibility. These changes
|
||||||
|
maintain full functionality while significantly upgrading the visual appeal.
|
||||||
|
|
||||||
|
DETAILED CHANGES IMPLEMENTED
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
1. ENHANCED CARD DESIGN
|
||||||
|
- Border Radius: Upgraded from 'rounded-lg' to 'rounded-xl' for modern aesthetics
|
||||||
|
- Shadow System: Enhanced from 'shadow-md' to 'shadow-lg' with 'hover:shadow-2xl'
|
||||||
|
- Subtle Borders: Added 'border border-gray-100' for better card definition
|
||||||
|
- Hover Effects: Implemented lift animation 'hover:-translate-y-2' for interactivity
|
||||||
|
|
||||||
|
2. ADVANCED ANIMATION SYSTEM
|
||||||
|
- Staggered Entrance: Cards animate in sequentially with index-based delays
|
||||||
|
- Smooth Transitions: Enhanced image scaling from 'scale-105' to 'scale-110'
|
||||||
|
- Micro-interactions: Added Framer Motion 'whileHover' and 'whileTap' effects
|
||||||
|
- Duration Control: Optimized animation timing for professional feel
|
||||||
|
|
||||||
|
3. IMPROVED VISUAL HIERARCHY
|
||||||
|
- Always-Visible Play Icon: Added semi-transparent play button in top-right
|
||||||
|
- Gradient Overlays: Implemented 'bg-gradient-to-t from-black/70' for readability
|
||||||
|
- Typography Enhancement: Larger titles with improved line-height and spacing
|
||||||
|
- Color Transitions: Added hover color changes for better user feedback
|
||||||
|
|
||||||
|
4. ENHANCED BUTTON INTERFACE
|
||||||
|
- Primary Action Styling: "Watch Video" button uses gradient background
|
||||||
|
- Secondary Button Design: "Share" and "Transcript" use backdrop blur effects
|
||||||
|
- Consistent Spacing: Improved button layouts and grouping
|
||||||
|
- Professional Appearance: Added borders and enhanced shadow effects
|
||||||
|
|
||||||
|
5. CONTENT LAYOUT IMPROVEMENTS
|
||||||
|
- Increased Grid Spacing: Changed from 'gap-6' to 'gap-8' for better breathing room
|
||||||
|
- Enhanced Padding: More generous content padding throughout cards
|
||||||
|
- Action Bar Addition: Bottom section with professional training indicators
|
||||||
|
- Visual Elements: Added decorative dot patterns for polish
|
||||||
|
|
||||||
|
TECHNICAL IMPLEMENTATION DETAILS
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
File Modified: src/pages/Resources.tsx
|
||||||
|
Lines Changed: Approximately 150-250 (video card rendering section)
|
||||||
|
|
||||||
|
Key Code Changes:
|
||||||
|
- Added staggered animation with index-based delays
|
||||||
|
- Implemented gradient overlays for better text contrast
|
||||||
|
- Enhanced button styling with Framer Motion animations
|
||||||
|
- Added professional indicators and visual elements
|
||||||
|
- Improved responsive design considerations
|
||||||
|
|
||||||
|
Performance Considerations:
|
||||||
|
- Animations are GPU-accelerated using CSS transforms
|
||||||
|
- Lazy loading maintained for video thumbnails
|
||||||
|
- No impact on existing functionality or loading times
|
||||||
|
- Accessibility features preserved and enhanced
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
DEVELOPMENT SETUP INSTRUCTIONS
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
PREREQUISITES
|
||||||
|
-------------
|
||||||
|
- Node.js LTS version (18.x or higher)
|
||||||
|
- pnpm 9.14.2 (package manager)
|
||||||
|
- Docker & Docker Compose (for containerized development)
|
||||||
|
- Git for version control
|
||||||
|
|
||||||
|
LOCAL DEVELOPMENT SETUP
|
||||||
|
-----------------------
|
||||||
|
1. Clone Repository:
|
||||||
|
git clone [repository-url]
|
||||||
|
cd deafgain-website
|
||||||
|
|
||||||
|
2. Install Dependencies:
|
||||||
|
pnpm install
|
||||||
|
|
||||||
|
3. Environment Configuration:
|
||||||
|
cp .env.example .env
|
||||||
|
# Configure the following variables:
|
||||||
|
- GMAIL_USER=your-email@gmail.com
|
||||||
|
- GMAIL_PASS=your-app-password
|
||||||
|
- REDIS_URL=your-redis-url
|
||||||
|
- REDIS_TOKEN=your-redis-token
|
||||||
|
|
||||||
|
4. Start Development Servers:
|
||||||
|
pnpm dev
|
||||||
|
# This starts both frontend (port 5173) and backend (port 804)
|
||||||
|
|
||||||
|
5. Access Application:
|
||||||
|
Frontend: http://localhost:5173
|
||||||
|
API: http://localhost:804
|
||||||
|
|
||||||
|
DOCKER DEVELOPMENT
|
||||||
|
------------------
|
||||||
|
Alternative development setup using Docker:
|
||||||
|
|
||||||
|
1. Development Environment:
|
||||||
|
docker-compose -f docker-compose.dev.yml up
|
||||||
|
|
||||||
|
2. Production Build:
|
||||||
|
docker-compose up --build
|
||||||
|
|
||||||
|
AVAILABLE SCRIPTS
|
||||||
|
-----------------
|
||||||
|
- pnpm dev - Start development servers (frontend + backend)
|
||||||
|
- pnpm build - Build for production
|
||||||
|
- pnpm preview - Preview production build locally
|
||||||
|
- pnpm lint - Run ESLint code quality checks
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
PRODUCTION DEPLOYMENT
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
DEPLOYMENT ARCHITECTURE
|
||||||
|
-----------------------
|
||||||
|
Production deployment utilizes a multi-container Docker setup:
|
||||||
|
|
||||||
|
1. Web Container (Nginx):
|
||||||
|
- Serves static frontend files
|
||||||
|
- Handles routing for single-page application
|
||||||
|
- Configured reverse proxy for API endpoints
|
||||||
|
|
||||||
|
2. API Container (Node.js):
|
||||||
|
- Express.js server handling API requests
|
||||||
|
- Email service integration
|
||||||
|
- Rate limiting and security middleware
|
||||||
|
|
||||||
|
3. Redis Container:
|
||||||
|
- Caching layer for improved performance
|
||||||
|
- Session management
|
||||||
|
- Rate limiting storage
|
||||||
|
|
||||||
|
PRODUCTION CONFIGURATION
|
||||||
|
------------------------
|
||||||
|
- Container Names: deafgain-website-web-1, deafgain-website-api-1
|
||||||
|
- Network: Integrated with Caddy reverse proxy (caddy_network)
|
||||||
|
- Ports: Web (804), API (3000), Redis (internal)
|
||||||
|
- Volumes: Video content mounted from host system
|
||||||
|
|
||||||
|
ENVIRONMENT VARIABLES (Production)
|
||||||
|
----------------------------------
|
||||||
|
Required environment variables for production:
|
||||||
|
- GMAIL_USER: Email service authentication
|
||||||
|
- GMAIL_PASS: Gmail app password
|
||||||
|
- REDIS_URL: Production Redis connection string
|
||||||
|
- REDIS_TOKEN: Redis authentication token
|
||||||
|
- NODE_ENV: Set to 'production'
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
KEY FEATURES & FUNCTIONALITY
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
VIDEO RESOURCE LIBRARY
|
||||||
|
-----------------------
|
||||||
|
- 6 Professional development videos with full accessibility
|
||||||
|
- WebVTT subtitle support for hearing accessibility
|
||||||
|
- Complete transcriptions with scene descriptions
|
||||||
|
- Modal video player with native HTML5 controls
|
||||||
|
- Share functionality with direct video linking
|
||||||
|
- Responsive grid layout (1/2/3 columns based on screen size)
|
||||||
|
|
||||||
|
EMAIL SUBSCRIPTION SYSTEM
|
||||||
|
--------------------------
|
||||||
|
- Professional subscription form with validation
|
||||||
|
- Rate-limited API endpoints for security
|
||||||
|
- Gmail SMTP integration with branded templates
|
||||||
|
- Redis-backed subscriber management
|
||||||
|
- Success/error notification system
|
||||||
|
|
||||||
|
ACCESSIBILITY FEATURES
|
||||||
|
----------------------
|
||||||
|
- WCAG 2.1 Level AA compliance
|
||||||
|
- Screen reader compatibility
|
||||||
|
- Keyboard navigation support
|
||||||
|
- High contrast color ratios
|
||||||
|
- Alternative text for all images
|
||||||
|
- Semantic HTML structure
|
||||||
|
|
||||||
|
INTERACTIVE COMPONENTS
|
||||||
|
----------------------
|
||||||
|
- Custom video player with accessibility controls
|
||||||
|
- Snow peaks animation effect
|
||||||
|
- Contact form with real-time validation
|
||||||
|
- Toast notification system
|
||||||
|
- Responsive navigation with mobile support
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
FILE STRUCTURE & ORGANIZATION
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
ROOT LEVEL
|
||||||
|
----------
|
||||||
|
├── src/ # Source code directory
|
||||||
|
├── public/ # Static assets
|
||||||
|
├── cline_docs/ # Development documentation
|
||||||
|
├── docker-compose.yml # Production container config
|
||||||
|
├── docker-compose.dev.yml # Development container config
|
||||||
|
├── package.json # Dependencies and scripts
|
||||||
|
├── tailwind.config.js # Tailwind CSS configuration
|
||||||
|
├── tsconfig.json # TypeScript configuration
|
||||||
|
└── vite.config.ts # Vite build configuration
|
||||||
|
|
||||||
|
SOURCE CODE STRUCTURE
|
||||||
|
---------------------
|
||||||
|
src/
|
||||||
|
├── api/ # Backend API routes
|
||||||
|
│ ├── contact.ts # Contact form handler
|
||||||
|
│ └── subscribe.ts # Email subscription handler
|
||||||
|
├── components/ # React components
|
||||||
|
│ ├── Layout/ # Layout components
|
||||||
|
│ │ ├── Navbar.tsx # Navigation component
|
||||||
|
│ │ ├── Footer.tsx # Footer component
|
||||||
|
│ │ └── Layout.tsx # Main layout wrapper
|
||||||
|
│ ├── shared/ # Reusable components
|
||||||
|
│ │ └── Toast.tsx # Notification component
|
||||||
|
│ ├── VideoPlayer.tsx # Custom video player
|
||||||
|
│ └── SnowPeaks.tsx # Animation component
|
||||||
|
├── context/ # React Context providers
|
||||||
|
│ ├── notification-context.ts
|
||||||
|
│ └── NotificationProvider.tsx
|
||||||
|
├── lib/ # Utility functions
|
||||||
|
│ ├── email.ts # Email service utilities
|
||||||
|
│ └── rate-limit.ts # Rate limiting logic
|
||||||
|
├── pages/ # Route components
|
||||||
|
│ ├── Home.tsx # Landing page
|
||||||
|
│ ├── About.tsx # About page
|
||||||
|
│ ├── Services.tsx # Services showcase
|
||||||
|
│ ├── Resources.tsx # Video library (recently enhanced)
|
||||||
|
│ └── Contact.tsx # Contact form
|
||||||
|
└── main.tsx # Application entry point
|
||||||
|
|
||||||
|
PUBLIC ASSETS STRUCTURE
|
||||||
|
-----------------------
|
||||||
|
public/
|
||||||
|
├── images/
|
||||||
|
│ ├── thumbnails/ # Video thumbnail images
|
||||||
|
│ ├── eliza.jpg # Profile images
|
||||||
|
│ └── scene.jpg # Background images
|
||||||
|
├── subtitles/ # WebVTT subtitle files
|
||||||
|
├── transcriptions/ # Full text transcriptions
|
||||||
|
└── videos/ # Video content files
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
PERFORMANCE OPTIMIZATION
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
FRONTEND OPTIMIZATIONS
|
||||||
|
----------------------
|
||||||
|
- Tree shaking for minimal bundle size
|
||||||
|
- Code splitting for faster initial loads
|
||||||
|
- Image optimization and lazy loading
|
||||||
|
- CSS purging for reduced stylesheet size
|
||||||
|
- Modern JavaScript features for better performance
|
||||||
|
|
||||||
|
BACKEND OPTIMIZATIONS
|
||||||
|
---------------------
|
||||||
|
- Redis caching for frequently accessed data
|
||||||
|
- Rate limiting to prevent abuse
|
||||||
|
- Optimized database queries
|
||||||
|
- Gzip compression for API responses
|
||||||
|
- Static file serving through Nginx
|
||||||
|
|
||||||
|
DEPLOYMENT OPTIMIZATIONS
|
||||||
|
------------------------
|
||||||
|
- Multi-stage Docker builds for smaller images
|
||||||
|
- Nginx for efficient static file serving
|
||||||
|
- CDN-ready asset organization
|
||||||
|
- Production build optimization
|
||||||
|
- Container resource allocation
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
SECURITY CONSIDERATIONS
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
API SECURITY
|
||||||
|
------------
|
||||||
|
- Rate limiting on all public endpoints
|
||||||
|
- Input validation and sanitization
|
||||||
|
- CORS policy configuration
|
||||||
|
- Environment variable protection
|
||||||
|
- Secure email handling
|
||||||
|
|
||||||
|
DATA PROTECTION
|
||||||
|
---------------
|
||||||
|
- No sensitive data stored in client-side code
|
||||||
|
- Secure credential management
|
||||||
|
- Redis session security
|
||||||
|
- Email data encryption in transit
|
||||||
|
|
||||||
|
DEPLOYMENT SECURITY
|
||||||
|
-------------------
|
||||||
|
- Container isolation
|
||||||
|
- Secure environment variable handling
|
||||||
|
- Network segmentation
|
||||||
|
- SSL/TLS termination at proxy level
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
MAINTENANCE & MONITORING
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
REGULAR MAINTENANCE TASKS
|
||||||
|
--------------------------
|
||||||
|
1. Dependency Updates:
|
||||||
|
- Monthly security patch reviews
|
||||||
|
- Quarterly major version updates
|
||||||
|
- Browser compatibility testing
|
||||||
|
|
||||||
|
2. Performance Monitoring:
|
||||||
|
- Load time analysis
|
||||||
|
- Core Web Vitals tracking
|
||||||
|
- Error rate monitoring
|
||||||
|
|
||||||
|
3. Content Management:
|
||||||
|
- Video content updates
|
||||||
|
- Subtitle accuracy verification
|
||||||
|
- Transcription quality checks
|
||||||
|
|
||||||
|
TROUBLESHOOTING GUIDE
|
||||||
|
---------------------
|
||||||
|
1. Development Issues:
|
||||||
|
- Clear node_modules and reinstall dependencies
|
||||||
|
- Check environment variable configuration
|
||||||
|
- Verify port availability (5173, 804)
|
||||||
|
|
||||||
|
2. Production Issues:
|
||||||
|
- Check container logs: docker logs [container-name]
|
||||||
|
- Verify environment variables in production
|
||||||
|
- Monitor Redis connection health
|
||||||
|
|
||||||
|
3. Email Service Issues:
|
||||||
|
- Verify Gmail app password configuration
|
||||||
|
- Check SMTP connection settings
|
||||||
|
- Review rate limiting logs
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
FUTURE DEVELOPMENT ROADMAP
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
PLANNED ENHANCEMENTS
|
||||||
|
--------------------
|
||||||
|
1. Additional Video Categories:
|
||||||
|
- Communication training modules
|
||||||
|
- Leadership development series
|
||||||
|
- Technical skill workshops
|
||||||
|
|
||||||
|
2. User Experience Improvements:
|
||||||
|
- Video progress tracking
|
||||||
|
- User preference settings
|
||||||
|
- Advanced search functionality
|
||||||
|
|
||||||
|
3. Administrative Features:
|
||||||
|
- Content management system
|
||||||
|
- Analytics dashboard
|
||||||
|
- User engagement metrics
|
||||||
|
|
||||||
|
TECHNICAL IMPROVEMENTS
|
||||||
|
----------------------
|
||||||
|
1. Performance Enhancements:
|
||||||
|
- Service worker implementation
|
||||||
|
- Advanced caching strategies
|
||||||
|
- Progressive web app features
|
||||||
|
|
||||||
|
2. Accessibility Enhancements:
|
||||||
|
- Enhanced screen reader support
|
||||||
|
- Voice navigation capabilities
|
||||||
|
- Multi-language subtitle support
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
CONTACT & SUPPORT
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
For technical questions or development support:
|
||||||
|
- Production URL: https://deafgain.org/
|
||||||
|
- Development Environment: http://localhost:5173
|
||||||
|
- Documentation Location: cline_docs/ directory
|
||||||
|
- Recent Changes: See Git commit history for detailed change log
|
||||||
|
|
||||||
|
This documentation should be updated with each major release or significant
|
||||||
|
feature addition to maintain accuracy and usefulness for the development team.
|
||||||
|
|
||||||
|
Last Updated: May 30, 2025
|
||||||
|
Version: 1.0 (Post Video Card Enhancement)
|
||||||
|
|
@ -1,5 +1,32 @@
|
||||||
# Active Context - Current Work Status
|
# Active Context - Current Work Status
|
||||||
|
|
||||||
|
## Production Deployment Success 🚀
|
||||||
|
**Date: 5/27/2025 - FINAL STATUS**
|
||||||
|
|
||||||
|
### ✅ FULL PRODUCTION DEPLOYMENT - COMPLETED
|
||||||
|
Successfully deployed complete DeafGain website to production server with all functionality working:
|
||||||
|
|
||||||
|
**Production Environment:**
|
||||||
|
- **URL**: https://deafgain.org/ ✅ LIVE
|
||||||
|
- **Server**: 10.4.0.206 behind Caddy reverse proxy
|
||||||
|
- **All 6 videos displaying correctly** ✅
|
||||||
|
- **Email subscription system working** ✅
|
||||||
|
- **Logging enabled for statistics** ✅
|
||||||
|
|
||||||
|
**Final Deployment Process:**
|
||||||
|
1. **Docker Cache Issues Resolved**: Forced fresh rebuild by removing cached images
|
||||||
|
2. **Missing Content Fixed**: All governance documents assets now included
|
||||||
|
3. **Email Configuration Fixed**: Environment variables properly mapped to .env file
|
||||||
|
4. **Production Verified**: Website fully functional at https://deafgain.org/
|
||||||
|
|
||||||
|
**Email System Status:**
|
||||||
|
- **Sender**: system@deafgain.org
|
||||||
|
- **Recipient**: eliza@deafgain.org
|
||||||
|
- **SMTP**: Gmail (smtp.gmail.com:587) with app password authentication
|
||||||
|
- **Test Result**: ✅ Subscription notifications working correctly
|
||||||
|
|
||||||
|
**Current Production Status**: 🟢 **FULLY OPERATIONAL**
|
||||||
|
|
||||||
## Recently Completed Work
|
## Recently Completed Work
|
||||||
**Date: 5/27/2025**
|
**Date: 5/27/2025**
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -215,57 +215,97 @@ const Resources = () => {
|
||||||
<p className="text-accent-mountain">{category.description}</p>
|
<p className="text-accent-mountain">{category.description}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||||
{getCurrentPageVideos(category.videos, category.id).map((video) => (
|
{getCurrentPageVideos(category.videos, category.id).map((video, index) => (
|
||||||
<motion.div
|
<motion.div
|
||||||
key={video.id}
|
key={video.id}
|
||||||
layout
|
layout
|
||||||
className="group bg-white rounded-lg shadow-md overflow-hidden hover:shadow-xl transition-shadow duration-300"
|
initial={{ opacity: 0, y: 20 }}
|
||||||
|
animate={{ opacity: 1, y: 0 }}
|
||||||
|
transition={{ duration: 0.5, delay: index * 0.1 }}
|
||||||
|
className="group bg-white rounded-xl shadow-lg overflow-hidden hover:shadow-2xl transition-all duration-500 transform hover:-translate-y-2 border border-gray-100"
|
||||||
>
|
>
|
||||||
<div className="relative aspect-video">
|
<div className="relative aspect-video overflow-hidden">
|
||||||
<img
|
<img
|
||||||
src={video.thumbnail}
|
src={video.thumbnail}
|
||||||
alt={video.title}
|
alt={video.title}
|
||||||
className="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105"
|
className="w-full h-full object-cover transition-transform duration-500 group-hover:scale-110"
|
||||||
/>
|
/>
|
||||||
<div className="absolute inset-0 bg-black/40 opacity-0 group-hover:opacity-100 transition-opacity duration-300 flex items-center justify-center gap-4">
|
{/* Gradient overlay for better text readability */}
|
||||||
<div className="flex items-center gap-4">
|
<div className="absolute inset-0 bg-gradient-to-t from-black/70 via-black/20 to-transparent opacity-60 group-hover:opacity-80 transition-opacity duration-300" />
|
||||||
<button
|
|
||||||
onClick={() => {
|
{/* Always visible play icon */}
|
||||||
setSelectedVideo(video)
|
<div className="absolute top-4 right-4 bg-white/20 backdrop-blur-sm rounded-full p-2 opacity-80 group-hover:opacity-100 transition-opacity duration-300">
|
||||||
navigate(`/resources/video/${video.id}`, { replace: true })
|
<FaVideo className="w-4 h-4 text-white" />
|
||||||
}}
|
</div>
|
||||||
className="bg-primary/90 hover:bg-primary text-white px-4 py-2 rounded-full flex items-center gap-2 transition-colors"
|
|
||||||
aria-label={`Watch ${video.title}`}
|
{/* Hover overlay with buttons */}
|
||||||
>
|
<div className="absolute inset-0 bg-black/60 opacity-0 group-hover:opacity-100 transition-all duration-300 flex flex-col items-center justify-center gap-3">
|
||||||
<FaVideo /> Watch
|
<motion.button
|
||||||
</button>
|
whileHover={{ scale: 1.05 }}
|
||||||
<button
|
whileTap={{ scale: 0.95 }}
|
||||||
|
onClick={() => {
|
||||||
|
setSelectedVideo(video)
|
||||||
|
navigate(`/resources/video/${video.id}`, { replace: true })
|
||||||
|
}}
|
||||||
|
className="bg-gradient-to-r from-primary to-secondary hover:from-secondary hover:to-primary text-white px-6 py-3 rounded-xl flex items-center gap-3 font-semibold shadow-lg backdrop-blur-sm border border-white/20 transition-all duration-300"
|
||||||
|
aria-label={`Watch ${video.title}`}
|
||||||
|
>
|
||||||
|
<FaVideo className="w-4 h-4" /> Watch Video
|
||||||
|
</motion.button>
|
||||||
|
|
||||||
|
<div className="flex items-center gap-3">
|
||||||
|
<motion.button
|
||||||
|
whileHover={{ scale: 1.05 }}
|
||||||
|
whileTap={{ scale: 0.95 }}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
const url = `${window.location.origin}/resources/video/${video.id}`
|
const url = `${window.location.origin}/resources/video/${video.id}`
|
||||||
navigator.clipboard.writeText(url)
|
navigator.clipboard.writeText(url)
|
||||||
showNotification('Link copied to clipboard!', 'success')
|
showNotification('Link copied to clipboard!', 'success')
|
||||||
}}
|
}}
|
||||||
className="bg-accent-lake/90 hover:bg-accent-lake text-white px-4 py-2 rounded-full flex items-center gap-2 transition-colors"
|
className="bg-white/20 backdrop-blur-sm hover:bg-white/30 text-white px-4 py-2 rounded-lg flex items-center gap-2 transition-all duration-300 border border-white/20"
|
||||||
aria-label={`Copy link to ${video.title}`}
|
aria-label={`Copy link to ${video.title}`}
|
||||||
>
|
>
|
||||||
<FaLink /> Copy Link
|
<FaLink className="w-4 h-4" /> Share
|
||||||
</button>
|
</motion.button>
|
||||||
|
|
||||||
|
{video.transcriptSrc && (
|
||||||
|
<motion.button
|
||||||
|
whileHover={{ scale: 1.05 }}
|
||||||
|
whileTap={{ scale: 0.95 }}
|
||||||
|
onClick={() => fetchTranscript(video.id)}
|
||||||
|
className="bg-white/20 backdrop-blur-sm hover:bg-white/30 text-white px-4 py-2 rounded-lg flex items-center gap-2 transition-all duration-300 border border-white/20"
|
||||||
|
aria-label={`Read transcript of ${video.title}`}
|
||||||
|
>
|
||||||
|
<FaBookReader className="w-4 h-4" /> Transcript
|
||||||
|
</motion.button>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
{video.transcriptSrc && (
|
|
||||||
<button
|
|
||||||
onClick={() => fetchTranscript(video.id)}
|
|
||||||
className="bg-secondary/90 hover:bg-secondary text-white px-4 py-2 rounded-full flex items-center gap-2 transition-colors"
|
|
||||||
aria-label={`Read transcript of ${video.title}`}
|
|
||||||
>
|
|
||||||
<FaBookReader /> Transcript
|
|
||||||
</button>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="p-4">
|
|
||||||
<h3 className="text-lg font-semibold text-secondary mb-2">{video.title}</h3>
|
<div className="p-6">
|
||||||
<p className="text-sm text-accent-mountain line-clamp-2">{video.description}</p>
|
<h3 className="text-xl font-bold text-secondary mb-3 line-clamp-2 leading-tight group-hover:text-primary transition-colors duration-300">
|
||||||
|
{video.title}
|
||||||
|
</h3>
|
||||||
|
<p className="text-accent-mountain line-clamp-3 leading-relaxed text-sm">
|
||||||
|
{video.description}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{/* Bottom action bar */}
|
||||||
|
<div className="mt-4 pt-4 border-t border-gray-100 flex items-center justify-between">
|
||||||
|
<span className="text-xs text-accent-mountain/70 uppercase tracking-wide font-medium">
|
||||||
|
Professional Training
|
||||||
|
</span>
|
||||||
|
<div className="flex items-center gap-1">
|
||||||
|
{[...Array(5)].map((_, i) => (
|
||||||
|
<div
|
||||||
|
key={i}
|
||||||
|
className="w-1.5 h-1.5 rounded-full bg-primary/20"
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
))}
|
))}
|
||||||
|
|
|
||||||
|
|
@ -139,6 +139,80 @@ const relationshipPoints: RelationshipPoint[] = [
|
||||||
startDate: "December 15, 2024",
|
startDate: "December 15, 2024",
|
||||||
endDate: "December 15, 2024"
|
endDate: "December 15, 2024"
|
||||||
}]
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
coordinates: [-112.0740, 33.4484] as Coordinates,
|
||||||
|
city: "Phoenix",
|
||||||
|
state: "Arizona",
|
||||||
|
events: [
|
||||||
|
{
|
||||||
|
name: "DANE",
|
||||||
|
description: "Deaf Abuse Network and Education - Advocacy Round-table Discussion",
|
||||||
|
startDate: "May 31, 2025",
|
||||||
|
endDate: "May 31, 2025"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "NAP",
|
||||||
|
description: "National Association of Parliamentarians - NAP 45th Biennial Convention",
|
||||||
|
startDate: "August 20, 2025",
|
||||||
|
endDate: "August 24, 2025"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
coordinates: [-112.0362, 46.5958] as Coordinates,
|
||||||
|
city: "Helena",
|
||||||
|
state: "Montana",
|
||||||
|
events: [{
|
||||||
|
name: "AIP",
|
||||||
|
description: "American Institute of Parliamentarians - 2025 Spring Practicum (Online)",
|
||||||
|
startDate: "June 12, 2025",
|
||||||
|
endDate: "June 14, 2025"
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
coordinates: [-97.3375, 37.6872] as Coordinates,
|
||||||
|
city: "Wichita",
|
||||||
|
state: "Kansas",
|
||||||
|
events: [{
|
||||||
|
name: "KAD",
|
||||||
|
description: "Kansas Association of the Deaf - 2025 General Business Meeting",
|
||||||
|
startDate: "June 21, 2025",
|
||||||
|
endDate: "June 21, 2025"
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
coordinates: [-91.1871, 30.4515] as Coordinates,
|
||||||
|
city: "Baton Rouge",
|
||||||
|
state: "Louisiana",
|
||||||
|
events: [{
|
||||||
|
name: "LAD",
|
||||||
|
description: "Louisiana Association of the Deaf - 2025 Conference",
|
||||||
|
startDate: "June 26, 2025",
|
||||||
|
endDate: "June 28, 2025"
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
coordinates: [-77.0369, 38.9072] as Coordinates,
|
||||||
|
city: "Washington",
|
||||||
|
state: "DC",
|
||||||
|
events: [{
|
||||||
|
name: "ASLTA",
|
||||||
|
description: "American Sign Language Teachers Association - National Professional Development Conference",
|
||||||
|
startDate: "July 9, 2025",
|
||||||
|
endDate: "July 12, 2025"
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
coordinates: [-94.5786, 39.0997] as Coordinates,
|
||||||
|
city: "Kansas City",
|
||||||
|
state: "Missouri",
|
||||||
|
events: [{
|
||||||
|
name: "NBDA",
|
||||||
|
description: "National Black Deaf Advocates - Building Our Legacy: The Road To Success",
|
||||||
|
startDate: "August 13, 2025",
|
||||||
|
endDate: "August 16, 2025"
|
||||||
|
}]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue