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 — UTC

-
-
- - - + + + +
+
+

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

+
+ A mock screenshot of the Nimbus dashboard showing key performance metrics. +
+
+ + +
+
+
+

What Our Customers Say

+
+
+
+
+

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

+
+ Avatar of a satisfied Nimbus customer. +
+
Jane Doe
+ CTO, TechCorp +
+
+
+
+
+
+

"The unified dashboard is incredibly intuitive. Our team was up and running in minutes."

+
+ Avatar of a satisfied Nimbus customer. +
+
John Smith
+ CEO, Innovate LLC +
+
+
+
+
+
+

"I can't imagine managing our infrastructure without Nimbus. It's essential."

+
+ Avatar of a satisfied Nimbus customer. +
+
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.
+
+
+
+
+
+ + +
+
+
+

Get in Touch

+

We'd love to hear from you.

+
+
+
+ + + + + + + + +
+ +
+ + +
+
+ + +
Please provide a valid email.
+
+
+ + +
+ +
+
+
+
+
+ + 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.'; + } + } +} +?> +
+ +
+
+
+
+
+

Create an Account

+ + +
+ +

+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+

+ Already have an account? Login here. +

+
+
+
+
+
+ +
+ \ 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 @@ + + + + + + + \ No newline at end of file diff --git a/templates/header.php b/templates/header.php new file mode 100644 index 0000000..e406e23 --- /dev/null +++ b/templates/header.php @@ -0,0 +1,40 @@ + + + + + + + Nimbus - Effortless Cloud Management + + + + + + + + + + + \ No newline at end of file