diff --git a/admin.php b/admin.php
new file mode 100644
index 0000000..0e8d3f4
--- /dev/null
+++ b/admin.php
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
Admin Panel
+
Welcome, !
+
This is your admin dashboard. You can add content and manage your site from here.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/assets/css/custom.css b/assets/css/custom.css
new file mode 100644
index 0000000..a565a13
--- /dev/null
+++ b/assets/css/custom.css
@@ -0,0 +1,88 @@
+:root {
+ --primary-color: #0D6EFD;
+ --secondary-color: #6C757D;
+ --background-color: #F8F9FA;
+ --surface-color: #FFFFFF;
+ --primary-font: 'Poppins', sans-serif;
+}
+
+body {
+ font-family: var(--primary-font);
+ background: linear-gradient(270deg, #a1c4fd, #c2e9fb);
+ background-size: 400% 400%;
+ animation: moveGradient 15s ease infinite;
+}
+
+@keyframes moveGradient {
+ 0%{background-position:0% 50%}
+ 50%{background-position:100% 50%}
+ 100%{background-position:0% 50%}
+}
+
+.hero-section {
+ background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('https://picsum.photos/seed/nimbus-hero/1600/900');
+ background-size: cover;
+ background-position: center;
+ color: white;
+ padding: 10rem 0;
+}
+
+.navbar.scrolled {
+ background-color: rgba(255, 255, 255, 0.9);
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+}
+
+.form-control:focus {
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
+ border-color: #86b7fe;
+}
+
+.btn-primary {
+ background-color: var(--primary-color);
+ border-color: var(--primary-color);
+}
+
+.section-icon {
+ font-size: 2.5rem;
+ color: var(--primary-color);
+}
+
+.feature-card {
+ background: rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px); /* For Safari */
+ border-radius: 15px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+}
+
+.feature-card:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 8px 12px rgba(0, 0, 0, 0.15);
+}
+
+.hero-section .btn-primary {
+ background-color: var(--primary-color);
+ border-color: var(--primary-color);
+ padding: 12px 30px;
+ font-weight: 600;
+ transition: background-color 0.3s ease;
+}
+
+.hero-section .btn-primary:hover {
+ background-color: #0b5ed7;
+}
+
+.hero-section .btn-outline-secondary {
+ color: white;
+ border-color: white;
+ padding: 12px 30px;
+ font-weight: 600;
+ transition: background-color 0.3s ease, color 0.3s ease;
+}
+
+.hero-section .btn-outline-secondary:hover {
+ background-color: white;
+ color: black;
+}
diff --git a/assets/js/main.js b/assets/js/main.js
new file mode 100644
index 0000000..435830f
--- /dev/null
+++ b/assets/js/main.js
@@ -0,0 +1,39 @@
+document.addEventListener('DOMContentLoaded', function () {
+ // Navbar shrink on scroll
+ const navbar = document.querySelector('.navbar');
+ if (navbar) {
+ window.addEventListener('scroll', () => {
+ if (window.scrollY > 50) {
+ navbar.classList.add('scrolled');
+ } else {
+ navbar.classList.remove('scrolled');
+ }
+ });
+ }
+
+ // Smooth scroll for anchor links
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ e.preventDefault();
+ const target = document.querySelector(this.getAttribute('href'));
+ if (target) {
+ target.scrollIntoView({
+ behavior: 'smooth'
+ });
+ }
+ });
+ });
+
+ // Pricing toggle
+ const priceToggle = document.getElementById('priceToggle');
+ if (priceToggle) {
+ priceToggle.addEventListener('change', function() {
+ const isYearly = this.checked;
+ document.querySelectorAll('[data-monthly]').forEach(priceEl => {
+ const monthly = priceEl.getAttribute('data-monthly');
+ const yearly = priceEl.getAttribute('data-yearly');
+ priceEl.textContent = isYearly ? yearly : monthly;
+ });
+ });
+ }
+});
diff --git a/db/migrate.php b/db/migrate.php
new file mode 100644
index 0000000..c4df483
--- /dev/null
+++ b/db/migrate.php
@@ -0,0 +1,29 @@
+exec($sql);
+ echo "Success.\n";
+ }
+
+ echo "\nAll migrations completed successfully.\n";
+
+} catch (PDOException $e) {
+ die("Database error: " . $e->getMessage() . "\n");
+}
+
diff --git a/db/migrations/001_create_users_table.sql b/db/migrations/001_create_users_table.sql
new file mode 100644
index 0000000..205005a
--- /dev/null
+++ b/db/migrations/001_create_users_table.sql
@@ -0,0 +1,7 @@
+CREATE TABLE IF NOT EXISTS `users` (
+ `id` INT AUTO_INCREMENT PRIMARY KEY,
+ `username` VARCHAR(50) NOT NULL UNIQUE,
+ `email` VARCHAR(100) NOT NULL UNIQUE,
+ `password_hash` VARCHAR(255) NOT NULL,
+ `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
diff --git a/index.php b/index.php
index e13ae95..4e60532 100644
--- a/index.php
+++ b/index.php
@@ -1,131 +1,288 @@
-
-
-
-
-
- New Style
-
-
-
-
-
-
-
-
-
Analyzing your requirements and generating your website…
-
- Loading…
-
-
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) ?>
-
-
-
-
-
+
+
+
+
+
+
Your Cloud, Simplified
+
Nimbus is the single pane of glass for your entire cloud infrastructure. Monitor, optimize, and automate with ease.
+
Start Your Free Trial
+
Explore Features
+
+
+
+
+
+
+
TRUSTED BY LEADING COMPANIES WORLDWIDE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Core Features
+
Everything you need in one platform.
+
+
+
+
+
+
Unified Monitoring
+
Get a bird's-eye view of your entire infrastructure in one place.
+
+
+
+
+
+
Cost Optimization
+
Identify and eliminate wasted cloud spend with smart recommendations.
+
+
+
+
+
+
Automated Security
+
Proactively secure your cloud environment against threats.
+
+
+
+
+
+
+
+
+
+
+
See Nimbus in Action
+
+

+
+
+
+
+
+
+
+
What Our Customers Say
+
+
+
+
+
"Nimbus has been a game-changer for us. We've saved over 30% on our cloud bills."
+
+

+
+
Jane Doe
+ CTO, TechCorp
+
+
+
+
+
+
+
"The unified dashboard is incredibly intuitive. Our team was up and running in minutes."
+
+

+
+
John Smith
+ CEO, Innovate LLC
+
+
+
+
+
+
+
"I can't imagine managing our infrastructure without Nimbus. It's essential."
+
+

+
+
Sam Wilson
+ DevOps Lead, Future Solutions
+
+
+
+
+
+
+
+
+
+
+
+
+
Simple, Transparent Pricing
+
+
+
+
+
+
+
+
+
+
Starter
+
+ $49/mo
+
+
+ - 10 Projects
+ - Basic Analytics
+ - Email Support
+
+
+
+
+
+
+
+
Pro
+
+ $99/mo
+
+
+ - Unlimited Projects
+ - Advanced Analytics
+ - Priority Support
+
+
+
+
+
+
+
+
Enterprise
+
Contact Us
+
+ - Dedicated Infrastructure
+ - Custom Integrations
+ - 24/7 Support
+
+
+
+
+
+
+
+
+
+
+
+
+
Frequently Asked Questions
+
+
+
+
+
+
Nimbus is a B2B SaaS platform that helps businesses manage their cloud infrastructure.
+
+
+
+
+
+
We support AWS, Google Cloud, and Azure.
+
+
+
+
+
+
Yes, you can cancel your subscription at any time.
+
+
+
+
+
+
+
+
+
+
diff --git a/login.php b/login.php
new file mode 100644
index 0000000..1026a93
--- /dev/null
+++ b/login.php
@@ -0,0 +1,86 @@
+prepare("SELECT id, username, password_hash FROM users WHERE email = ?");
+ $stmt->execute([$email]);
+ $user = $stmt->fetch();
+
+ if ($user && password_verify($password, $user['password_hash'])) {
+ $_SESSION['user_id'] = $user['id'];
+ $_SESSION['username'] = $user['username'];
+ header("Location: admin.php");
+ exit();
+ } else {
+ $errors[] = 'Invalid email or password';
+ }
+ }
+}
+?>
+
+
+
+
+
+
+
+
Login
+
+
+
+ Registration successful! You can now log in.
+
+
+
+
+
+
+
+
+
+ Don't have an account? Register here.
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/logout.php b/logout.php
new file mode 100644
index 0000000..248c535
--- /dev/null
+++ b/logout.php
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/mail/MailService.php b/mail/MailService.php
index b9812c3..d801067 100644
--- a/mail/MailService.php
+++ b/mail/MailService.php
@@ -75,7 +75,9 @@ class MailService
foreach ($toList as $addr) {
if (filter_var($addr, FILTER_VALIDATE_EMAIL)) { $mail->addAddress($addr); $added++; }
}
- if ($added === 0) { $mail->addAddress($fromEmail, $fromName); }
+ if ($added === 0) {
+ return [ 'success' => false, 'error' => 'No recipients defined (set MAIL_TO or pass $to)' ];
+ }
foreach ((array)($opts['cc'] ?? []) as $cc) { if (filter_var($cc, FILTER_VALIDATE_EMAIL)) $mail->addCC($cc); }
foreach ((array)($opts['bcc'] ?? []) as $bcc){ if (filter_var($bcc, FILTER_VALIDATE_EMAIL)) $mail->addBCC($bcc); }
@@ -156,8 +158,6 @@ class MailService
{
$mail = new PHPMailer\PHPMailer\PHPMailer(true);
try {
- // Enable verbose debug output
- $mail->SMTPDebug = 0;
$mail->isSMTP();
$mail->Host = $cfg['smtp_host'] ?? '';
$mail->Port = (int)($cfg['smtp_port'] ?? 587);
@@ -181,7 +181,7 @@ class MailService
$mail->addReplyTo($cfg['reply_to']);
}
- // Destination: prefer dynamic recipients ($to), fallback to MAIL_TO, then MAIL_FROM
+ // Destination: prefer dynamic recipients ($to), fallback to MAIL_TO; no silent FROM fallback
$toList = [];
if ($to) {
if (is_string($to)) {
@@ -201,8 +201,7 @@ class MailService
}
}
if ($added === 0) {
- // Final fallback: send to FROM address
- $mail->addAddress($fromEmail, $fromName);
+ return [ 'success' => false, 'error' => 'No recipients defined (set MAIL_TO or pass $to)' ];
}
// DKIM (optional)
diff --git a/mail/config.php b/mail/config.php
index c0ad9b9..626cca1 100644
--- a/mail/config.php
+++ b/mail/config.php
@@ -35,7 +35,8 @@ function load_dotenv_if_needed(array $keys): void {
load_dotenv_if_needed([
'MAIL_TRANSPORT','SMTP_HOST','SMTP_PORT','SMTP_SECURE','SMTP_USER','SMTP_PASS',
- 'MAIL_FROM','MAIL_FROM_NAME','MAIL_REPLY_TO','DKIM_DOMAIN','DKIM_SELECTOR','DKIM_PRIVATE_KEY_PATH'
+ 'MAIL_FROM','MAIL_FROM_NAME','MAIL_REPLY_TO','MAIL_TO',
+ 'DKIM_DOMAIN','DKIM_SELECTOR','DKIM_PRIVATE_KEY_PATH'
]);
$transport = env_val('MAIL_TRANSPORT', 'smtp');
diff --git a/mail_log.txt b/mail_log.txt
new file mode 100644
index 0000000..e662bca
--- /dev/null
+++ b/mail_log.txt
@@ -0,0 +1,224 @@
+SERVER -> CLIENT: 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-UJAP95IYE gQZPHeokgr2tbwK3Dh8W
+
+CLIENT -> SERVER: EHLO vm-30855.dev.flatlogic.app
+
+SERVER -> CLIENT: 250-email-smtp.amazonaws.com
+250-8BITMIME
+250-STARTTLS
+250-AUTH PLAIN LOGIN
+250 Ok
+
+CLIENT -> SERVER: STARTTLS
+
+SERVER -> CLIENT: 220 Ready to start TLS
+
+CLIENT -> SERVER: EHLO vm-30855.dev.flatlogic.app
+
+SERVER -> CLIENT: 250-email-smtp.amazonaws.com
+250-8BITMIME
+250-STARTTLS
+250-AUTH PLAIN LOGIN
+250 Ok
+
+CLIENT -> SERVER: AUTH LOGIN
+
+SERVER -> CLIENT: 334 VXNlcm5hbWU6
+
+CLIENT -> SERVER: [credentials hidden]
+SERVER -> CLIENT: 334 UGFzc3dvcmQ6
+
+CLIENT -> SERVER: [credentials hidden]
+SERVER -> CLIENT: 235 Authentication successful.
+
+CLIENT -> SERVER: MAIL FROM:
+
+SERVER -> CLIENT: 250 Ok
+
+CLIENT -> SERVER: RCPT TO:
+
+SERVER -> CLIENT: 250 Ok
+
+CLIENT -> SERVER: DATA
+
+SERVER -> CLIENT: 354 End data with .
+
+CLIENT -> SERVER: Date: Wed, 10 Sep 2025 13:14:43 +0000
+
+CLIENT -> SERVER: To: support@yourdomain.com
+
+CLIENT -> SERVER: From: 10
+
+CLIENT -> SERVER: Reply-To: Administrator , app@flatlogic.app
+
+CLIENT -> SERVER: Subject: New Lead from Nimbus Landing Page
+
+CLIENT -> SERVER: Message-ID:
+
+CLIENT -> SERVER: X-Mailer: PHPMailer 6.6.3 (https://github.com/PHPMailer/PHPMailer)
+
+CLIENT -> SERVER: MIME-Version: 1.0
+
+CLIENT -> SERVER: Content-Type: multipart/alternative;
+
+CLIENT -> SERVER: boundary="b1_RGGz281O0f5ZTbjFzdr3xDUogbl4E1VbKQwy0wGzlc"
+
+CLIENT -> SERVER: Content-Transfer-Encoding: 8bit
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: This is a multi-part message in MIME format.
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: --b1_RGGz281O0f5ZTbjFzdr3xDUogbl4E1VbKQwy0wGzlc
+
+CLIENT -> SERVER: Content-Type: text/plain; charset=us-ascii
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: Name: Administrator
+
+CLIENT -> SERVER: Email: Blarior@gmail.com
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: 123123
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: --b1_RGGz281O0f5ZTbjFzdr3xDUogbl4E1VbKQwy0wGzlc
+
+CLIENT -> SERVER: Content-Type: text/html; charset=us-ascii
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: Name: Administrator
Email: Blarior@gmail.com
123123
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: --b1_RGGz281O0f5ZTbjFzdr3xDUogbl4E1VbKQwy0wGzlc--
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: .
+
+SERVER -> CLIENT: 250 Ok 0100019933c3a725-dee3f92c-89a8-43b8-b180-c9a6a6fc68db-000000
+
+CLIENT -> SERVER: QUIT
+
+SERVER -> CLIENT: 221 Bye
+
+SERVER -> CLIENT: 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-UJAP95IYE 6w6jayOyd9KI2UxK7oOd
+
+CLIENT -> SERVER: EHLO vm-30855.dev.flatlogic.app
+
+SERVER -> CLIENT: 250-email-smtp.amazonaws.com
+250-8BITMIME
+250-STARTTLS
+250-AUTH PLAIN LOGIN
+250 Ok
+
+CLIENT -> SERVER: STARTTLS
+
+SERVER -> CLIENT: 220 Ready to start TLS
+
+CLIENT -> SERVER: EHLO vm-30855.dev.flatlogic.app
+
+SERVER -> CLIENT: 250-email-smtp.amazonaws.com
+250-8BITMIME
+250-STARTTLS
+250-AUTH PLAIN LOGIN
+250 Ok
+
+CLIENT -> SERVER: AUTH LOGIN
+
+SERVER -> CLIENT: 334 VXNlcm5hbWU6
+
+CLIENT -> SERVER: [credentials hidden]
+SERVER -> CLIENT: 334 UGFzc3dvcmQ6
+
+CLIENT -> SERVER: [credentials hidden]
+SERVER -> CLIENT: 235 Authentication successful.
+
+CLIENT -> SERVER: MAIL FROM:
+
+SERVER -> CLIENT: 250 Ok
+
+CLIENT -> SERVER: RCPT TO:
+
+SERVER -> CLIENT: 250 Ok
+
+CLIENT -> SERVER: DATA
+
+SERVER -> CLIENT: 354 End data with .
+
+CLIENT -> SERVER: Date: Wed, 10 Sep 2025 13:14:44 +0000
+
+CLIENT -> SERVER: To: support@yourdomain.com
+
+CLIENT -> SERVER: From: 10
+
+CLIENT -> SERVER: Reply-To: Administrator , app@flatlogic.app
+
+CLIENT -> SERVER: Subject: New Lead from Nimbus Landing Page
+
+CLIENT -> SERVER: Message-ID:
+
+CLIENT -> SERVER: X-Mailer: PHPMailer 6.6.3 (https://github.com/PHPMailer/PHPMailer)
+
+CLIENT -> SERVER: MIME-Version: 1.0
+
+CLIENT -> SERVER: Content-Type: multipart/alternative;
+
+CLIENT -> SERVER: boundary="b1_cFHV6zdk7XiFa9a6KOQI4Pr2H941RS0y1Dmc5CeJU"
+
+CLIENT -> SERVER: Content-Transfer-Encoding: 8bit
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: This is a multi-part message in MIME format.
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: --b1_cFHV6zdk7XiFa9a6KOQI4Pr2H941RS0y1Dmc5CeJU
+
+CLIENT -> SERVER: Content-Type: text/plain; charset=us-ascii
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: Name: Administrator
+
+CLIENT -> SERVER: Email: Blarior@gmail.com
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: 123123
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: --b1_cFHV6zdk7XiFa9a6KOQI4Pr2H941RS0y1Dmc5CeJU
+
+CLIENT -> SERVER: Content-Type: text/html; charset=us-ascii
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: Name: Administrator
Email: Blarior@gmail.com
123123
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: --b1_cFHV6zdk7XiFa9a6KOQI4Pr2H941RS0y1Dmc5CeJU--
+
+CLIENT -> SERVER:
+
+CLIENT -> SERVER: .
+
+SERVER -> CLIENT: 250 Ok 0100019933c3aa2d-e6f1f09d-c150-43d9-9c5a-d8f926c41ff2-000000
+
+CLIENT -> SERVER: QUIT
+
+SERVER -> CLIENT: 221 Bye
+
diff --git a/register.php b/register.php
new file mode 100644
index 0000000..a1f46c7
--- /dev/null
+++ b/register.php
@@ -0,0 +1,102 @@
+prepare("SELECT id FROM users WHERE username = ? OR email = ?");
+ $stmt->execute([$username, $email]);
+ if ($stmt->fetch()) {
+ $errors[] = 'Username or email already taken';
+ }
+ }
+
+ // Insert user if no errors
+ if (empty($errors)) {
+ $password_hash = password_hash($password, PASSWORD_DEFAULT);
+ $stmt = db()->prepare("INSERT INTO users (username, email, password_hash) VALUES (?, ?, ?)");
+ if ($stmt->execute([$username, $email, $password_hash])) {
+ // Redirect to login page
+ header("Location: login.php?registration=success");
+ exit();
+ } else {
+ $errors[] = 'Something went wrong. Please try again.';
+ }
+ }
+}
+?>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/templates/footer.php b/templates/footer.php
new file mode 100644
index 0000000..2bcc512
--- /dev/null
+++ b/templates/footer.php
@@ -0,0 +1,12 @@
+
+
+
+
+
+