Update contact information, enhance form notification, and improve hero section content
|  | @ -14,12 +14,12 @@ export async function onRequestPost(context) { | ||||||
|             }, |             }, | ||||||
|             body: JSON.stringify({ |             body: JSON.stringify({ | ||||||
|                 from: { |                 from: { | ||||||
|                     email: "daniel@laforceit.com", |                     email: "contact@argobox.com", | ||||||
|                     name: "Daniel LaForce" |                     name: "Daniel LaForce" | ||||||
|                 }, |                 }, | ||||||
|                 to: [ |                 to: [ | ||||||
|                     { |                     { | ||||||
|                         email: "daniel@laforceit.com", |                         email: "daniel.laforce@argobox.com", | ||||||
|                         name: "Daniel LaForce" |                         name: "Daniel LaForce" | ||||||
|                     } |                     } | ||||||
|                 ], |                 ], | ||||||
|  |  | ||||||
| Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 58 KiB | 
| Before Width: | Height: | Size: 228 KiB After Width: | Height: | Size: 536 KiB | 
| Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 51 KiB | 
| Before Width: | Height: | Size: 371 B After Width: | Height: | Size: 789 B | 
| Before Width: | Height: | Size: 927 B After Width: | Height: | Size: 2.2 KiB | 
| Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB | 
							
								
								
									
										14
									
								
								index.html
								
								
								
								
							
							
						
						|  | @ -80,7 +80,7 @@ | ||||||
|                 <h1 class="hero-title"> |                 <h1 class="hero-title"> | ||||||
|                     <span class="role-wrapper"> |                     <span class="role-wrapper"> | ||||||
|                         <span class="role active" data-role="admin" data-description="Building scalable infrastructure with optimized performance and bulletproof security — from server management to end-user support that keeps businesses running smoothly."> |                         <span class="role active" data-role="admin" data-description="Building scalable infrastructure with optimized performance and bulletproof security — from server management to end-user support that keeps businesses running smoothly."> | ||||||
|                             <span class="highlight">System</span> <span class="highlight">Administrator</span> & IT Expert |                             <span class="highlight">Network</span> & <span class="highlight">Cyber Security</span> Professional | ||||||
|                         </span> |                         </span> | ||||||
|                         <span class="role" data-role="devops" data-description="Streamlining development workflows with CI/CD pipelines and infrastructure as code — automating deployments and improving reliability across your entire technology stack."> |                         <span class="role" data-role="devops" data-description="Streamlining development workflows with CI/CD pipelines and infrastructure as code — automating deployments and improving reliability across your entire technology stack."> | ||||||
|                             <span class="highlight">DevOps</span> & <span class="highlight">Automation</span> Engineer |                             <span class="highlight">DevOps</span> & <span class="highlight">Automation</span> Engineer | ||||||
|  | @ -92,7 +92,7 @@ | ||||||
|                 </h1> |                 </h1> | ||||||
|                  |                  | ||||||
|                 <p class="hero-description" id="role-description"> |                 <p class="hero-description" id="role-description"> | ||||||
|                     Building scalable infrastructure with optimized performance and bulletproof security — from server management to end-user support that keeps businesses running smoothly. |                     Securing and optimizing your digital infrastructure with enterprise-grade solutions — from zero-trust architecture to automated security monitoring that keeps your business protected 24/7. | ||||||
|                 </p> |                 </p> | ||||||
|                  |                  | ||||||
|                 <div class="inline-terminal"> |                 <div class="inline-terminal"> | ||||||
|  | @ -132,7 +132,7 @@ | ||||||
|                     <span class="btn-icon"><i class="fas fa-arrow-right"></i></span> |                     <span class="btn-icon"><i class="fas fa-arrow-right"></i></span> | ||||||
|                 </a> |                 </a> | ||||||
|                  |                  | ||||||
|                 <a href="https://argobox.com/ansible-sandbox" class="btn btn-outline btn-featured" target="_blank"> |                 <a href="https://www.argobox.com" class="btn btn-outline btn-featured" target="_blank"> | ||||||
|                     <span class="pulse-ring"></span> |                     <span class="pulse-ring"></span> | ||||||
|                     <span class="btn-text">Explore My Lab</span> |                     <span class="btn-text">Explore My Lab</span> | ||||||
|                     <span class="btn-icon"><i class="fas fa-server"></i></span> |                     <span class="btn-icon"><i class="fas fa-server"></i></span> | ||||||
|  | @ -584,7 +584,7 @@ | ||||||
|                             <i class="fas fa-envelope"></i> |                             <i class="fas fa-envelope"></i> | ||||||
|                         </div> |                         </div> | ||||||
|                         <h3 class="contact-title">Email</h3> |                         <h3 class="contact-title">Email</h3> | ||||||
|                         <p><a href="mailto:daniel@laforceit.com">daniel@laforceit.com</a></p> |                         <p><a href="mailto:daniel.laforce@argobox.com">daniel.laforce@argobox.com</a></p> | ||||||
|                     </div> |                     </div> | ||||||
|                      |                      | ||||||
|                     <div class="contact-item"> |                     <div class="contact-item"> | ||||||
|  | @ -631,6 +631,10 @@ | ||||||
|                             Send Message |                             Send Message | ||||||
|                         </button> |                         </button> | ||||||
|                     </form> |                     </form> | ||||||
|  |                     <div id="form-notification" class="form-notification" style="display: none;"> | ||||||
|  |                         <i class="fas fa-check-circle"></i> | ||||||
|  |                         <span class="notification-text">Message sent successfully! We'll get back to you soon.</span> | ||||||
|  |                     </div> | ||||||
|                 </div> |                 </div> | ||||||
|             </div> |             </div> | ||||||
|         </div> |         </div> | ||||||
|  | @ -656,7 +660,7 @@ | ||||||
|                 <div class="footer-social"> |                 <div class="footer-social"> | ||||||
|                     <a href="https://github.com/keyargo" target="_blank" aria-label="GitHub"><i class="fab fa-github"></i></a> |                     <a href="https://github.com/keyargo" target="_blank" aria-label="GitHub"><i class="fab fa-github"></i></a> | ||||||
|                     <a href="https://www.linkedin.com/in/danlaforce" target="_blank" aria-label="LinkedIn"><i class="fab fa-linkedin"></i></a> |                     <a href="https://www.linkedin.com/in/danlaforce" target="_blank" aria-label="LinkedIn"><i class="fab fa-linkedin"></i></a> | ||||||
|                     <a href="mailto:daniel@laforceit.com" aria-label="Email"><i class="fas fa-envelope"></i></a> |                     <a href="mailto:daniel.laforce@argobox.com" aria-label="Email"><i class="fas fa-envelope"></i></a> | ||||||
|                 </div> |                 </div> | ||||||
|             </div> |             </div> | ||||||
|              |              | ||||||
|  |  | ||||||
							
								
								
									
										57
									
								
								script.js
								
								
								
								
							
							
						
						|  | @ -394,9 +394,6 @@ function updateMetrics() { | ||||||
|     setInterval(updateMetricValues, 5000); |     setInterval(updateMetricValues, 5000); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** |  | ||||||
|  * Initialize contact form handling |  | ||||||
|  */ |  | ||||||
| /** | /** | ||||||
|  * Initialize contact form handling |  * Initialize contact form handling | ||||||
|  */ |  */ | ||||||
|  | @ -427,16 +424,43 @@ function initFormHandling(form) { | ||||||
| 
 | 
 | ||||||
|             const data = await res.json(); |             const data = await res.json(); | ||||||
| 
 | 
 | ||||||
|  |             const notification = document.getElementById('form-notification'); | ||||||
|  |             const notificationIcon = notification.querySelector('i'); | ||||||
|  |             const notificationText = notification.querySelector('.notification-text'); | ||||||
|  | 
 | ||||||
|             if (data.success) { |             if (data.success) { | ||||||
|                 alert("Thank you for your message! I will get back to you soon."); |                 notification.style.display = 'block'; | ||||||
|  |                 notification.classList.add('success'); | ||||||
|  |                 notification.classList.remove('error'); | ||||||
|  |                 notificationIcon.className = 'fas fa-check-circle'; | ||||||
|  |                 notificationText.textContent = "Message sent successfully! We'll get back to you soon."; | ||||||
|                 form.reset(); |                 form.reset(); | ||||||
|             } else { |             } else { | ||||||
|                 alert("Failed to send message. Please try again or contact me directly."); |                 notification.style.display = 'block'; | ||||||
|  |                 notification.classList.add('error'); | ||||||
|  |                 notification.classList.remove('success'); | ||||||
|  |                 notificationIcon.className = 'fas fa-exclamation-circle'; | ||||||
|  |                 notificationText.textContent = "Failed to send message. Please try again or contact me directly."; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             // Hide notification after 5 seconds
 | ||||||
|  |             setTimeout(() => { | ||||||
|  |                 notification.style.display = 'none'; | ||||||
|  |             }, 5000); | ||||||
|  | 
 | ||||||
|         } catch (error) { |         } catch (error) { | ||||||
|             console.error("Error:", error); |             console.error("Error:", error); | ||||||
|             alert("Something went wrong while sending your message."); |             const notification = document.getElementById('form-notification'); | ||||||
|  |             notification.style.display = 'block'; | ||||||
|  |             notification.classList.add('error'); | ||||||
|  |             notification.classList.remove('success'); | ||||||
|  |             notification.querySelector('i').className = 'fas fa-exclamation-circle'; | ||||||
|  |             notification.querySelector('.notification-text').textContent = "Something went wrong while sending your message."; | ||||||
|  |              | ||||||
|  |             // Hide notification after 5 seconds
 | ||||||
|  |             setTimeout(() => { | ||||||
|  |                 notification.style.display = 'none'; | ||||||
|  |             }, 5000); | ||||||
|         } finally { |         } finally { | ||||||
|             submitButton.innerHTML = originalButtonText; |             submitButton.innerHTML = originalButtonText; | ||||||
|             submitButton.disabled = false; |             submitButton.disabled = false; | ||||||
|  | @ -453,24 +477,3 @@ function updateYear() { | ||||||
|         yearElement.textContent = new Date().getFullYear(); |         yearElement.textContent = new Date().getFullYear(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * Utility function to add particle float animation |  | ||||||
|  */ |  | ||||||
| document.addEventListener('DOMContentLoaded', function() { |  | ||||||
|     // Initialize all website functionality
 |  | ||||||
|     initNavigation(); |  | ||||||
|     initParticlesAndIcons(); |  | ||||||
|     initRoleRotation(); // Updated function
 |  | ||||||
|     initTerminalTyping(); // Updated function
 |  | ||||||
|     initSolutionsCarousel(); // Updated function
 |  | ||||||
|     initScrollReveal(); |  | ||||||
|     updateMetrics(); |  | ||||||
|     updateYear(); |  | ||||||
|      |  | ||||||
|     // Initialize form handling
 |  | ||||||
|     const contactForm = document.getElementById('contact-form'); |  | ||||||
|     if (contactForm) { |  | ||||||
|         initFormHandling(contactForm); |  | ||||||
|     } |  | ||||||
| }); |  | ||||||
							
								
								
									
										37
									
								
								styles.css
								
								
								
								
							
							
						
						|  | @ -1538,4 +1538,41 @@ text-shadow: 0 0 10px rgba(59, 130, 246, 0.8), 0 0 8px rgba(255, 255, 255, 0.3); | ||||||
| transform: scale(1.02); | transform: scale(1.02); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .form-notification { | ||||||
|  |     margin-top: 1rem; | ||||||
|  |     padding: 1rem; | ||||||
|  |     border-radius: 0.5rem; | ||||||
|  |     display: flex; | ||||||
|  |     align-items: center; | ||||||
|  |     gap: 0.75rem; | ||||||
|  |     animation: slideIn 0.3s ease-out; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .form-notification.success { | ||||||
|  |     background-color: #d1fae5; | ||||||
|  |     color: #065f46; | ||||||
|  |     border: 1px solid #34d399; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .form-notification.error { | ||||||
|  |     background-color: #fee2e2; | ||||||
|  |     color: #991b1b; | ||||||
|  |     border: 1px solid #f87171; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .form-notification i { | ||||||
|  |     font-size: 1.25rem; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @keyframes slideIn { | ||||||
|  |     from { | ||||||
|  |         transform: translateY(-10px); | ||||||
|  |         opacity: 0; | ||||||
|  |     } | ||||||
|  |     to { | ||||||
|  |         transform: translateY(0); | ||||||
|  |         opacity: 1; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||