diff --git a/assets/css/custom.css b/assets/css/custom.css
new file mode 100644
index 0000000..12ac401
--- /dev/null
+++ b/assets/css/custom.css
@@ -0,0 +1,57 @@
+
+body {
+ font-family: 'Inter', sans-serif;
+ background-color: #F8FAFC;
+ color: #1E293B;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-family: 'Georgia', serif;
+}
+
+.gradient-text {
+ background: linear-gradient(to right, #6366F1, #EC4899);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+.navbar {
+ transition: background-color 0.3s ease;
+}
+
+.nav-link {
+ transition: color 0.3s ease;
+}
+
+.nav-link:hover {
+ color: #6366F1;
+}
+
+.section {
+ padding: 6rem 0;
+}
+
+.card {
+ border: none;
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ transition: transform 0.3s ease;
+}
+
+.card:hover {
+ transform: translateY(-5px);
+}
+
+.form-control:focus {
+ box-shadow: 0 0 0 0.25rem rgba(99, 102, 241, 0.25);
+ border-color: #6366F1;
+}
+
+.btn-primary {
+ background-color: #6366F1;
+ border-color: #6366F1;
+}
+
+.btn-primary:hover {
+ background-color: #4F46E5;
+ border-color: #4F46E5;
+}
diff --git a/assets/js/main.js b/assets/js/main.js
new file mode 100644
index 0000000..6e14beb
--- /dev/null
+++ b/assets/js/main.js
@@ -0,0 +1,50 @@
+document.addEventListener('DOMContentLoaded', function () {
+ // Navbar shrink function
+ const navbar = document.querySelector('.navbar');
+ window.addEventListener('scroll', () => {
+ if (window.scrollY > 50) {
+ navbar.classList.add('bg-white', 'shadow-sm');
+ } else {
+ navbar.classList.remove('bg-white', 'shadow-sm');
+ }
+ });
+
+ // Smooth scroll for anchor links
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ e.preventDefault();
+ document.querySelector(this.getAttribute('href')).scrollIntoView({
+ behavior: 'smooth'
+ });
+ });
+ });
+
+ // Contact form validation
+ const contactForm = document.getElementById('contactForm');
+ contactForm.addEventListener('submit', function (e) {
+ e.preventDefault();
+ const name = document.getElementById('name').value;
+ const email = document.getElementById('email').value;
+ const message = document.getElementById('message').value;
+
+ if (name === '' || email === '' || message === '') {
+ alert('Please fill in all fields.');
+ return;
+ }
+
+ if (!validateEmail(email)) {
+ alert('Please enter a valid email address.');
+ return;
+ }
+
+ // If validation passes, you would typically send the form data to the server here.
+ // For this example, we'll just show a success message.
+ this.style.display = 'none';
+ document.getElementById('formSuccess').style.display = 'block';
+ });
+
+ function validateEmail(email) {
+ const re = /^(([^<>()[\\]\\.,;:\s@"]+(\.[^<>()[\\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+ return re.test(String(email).toLowerCase());
+ }
+});
diff --git a/db/config.php b/db/config.php
index 89075af..f1af70c 100644
--- a/db/config.php
+++ b/db/config.php
@@ -1,17 +1,25 @@
PDO::ERRMODE_EXCEPTION,
- PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
- ]);
- }
- return $pdo;
+ static $pdo;
+ if ($pdo) {
+ return $pdo;
+ }
+ try {
+ $pdo = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS);
+ $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+ return $pdo;
+ } catch (PDOException $e) {
+ die("Database connection failed: " . $e->getMessage());
+ }
}
+
+// Create contact_submissions table if it doesn't exist
+$pdo = db();
+$pdo->exec("CREATE TABLE IF NOT EXISTS contact_submissions (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, message TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);");
\ No newline at end of file
diff --git a/index.php b/index.php
index 7205f3d..68a8528 100644
--- a/index.php
+++ b/index.php
@@ -1,150 +1,190 @@
prepare("INSERT INTO contact_submissions (name, email, message) VALUES (?, ?, ?)");
+ $stmt->execute([$name, $email, $message]);
+
+ MailService::sendContactMessage($name, $email, $message);
+
+ $success_message = "Thank you for your message! I will get back to you shortly.";
+ } catch (Exception $e) {
+ $error_message = "Something went wrong. Please try again later.";
+ // Optionally log the error: error_log($e->getMessage());
+ }
+ }
+}
?>
-
+
-
-
- New Style
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ John Doe - Personal Portfolio
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
Analyzing your requirements and generating your website…
-
- Loading…
-
-
= ($_SERVER['HTTP_HOST'] ?? '') === 'appwizzy.com' ? 'AppWizzy' : 'Flatlogic' ?> AI is collecting your requirements and applying the first changes.
-
This page will update automatically as the plan is implemented.
-
Runtime: PHP = htmlspecialchars($phpVersion) ?> — UTC = htmlspecialchars($now) ?>
-
-
-
- Page updated: = htmlspecialchars($now) ?> (UTC)
-
+
+
+
+
+
+
+
+
I build beautiful web experiences.
+
I'm a passionate web developer and designer. Let's create something amazing together.
+
Get in Touch
+
+
+
+
+
+
+
+
+
About Me
+
I am a creative developer with a passion for building beautiful and functional websites. With a background in design and a love for code, I strive to create user experiences that are both intuitive and engaging.
+
When I'm not coding, you can find me exploring new technologies, contributing to open-source projects, or enjoying a good cup of coffee.
+
+
+
+
+
+
+
+
+
+
+
My Work
+
+
+
+
+
+
Project One
+
A brief description of the project, highlighting the technologies used and the problems solved.
+
+
+
+
+
+
+
+
Project Two
+
Another project description, focusing on the creative process and the final outcome.
+
+
+
+
+
+
+
+
+
+
What People Say
+
+
+
+
"Working with John was a fantastic experience. He is a true professional with a keen eye for detail."
+
+
+
+
"The final product exceeded all our expectations. Highly recommended!"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+