This commit is contained in:
Flatlogic Bot 2025-09-16 16:47:58 +00:00
parent c004bbea8a
commit 4325b410a3
8 changed files with 472 additions and 182 deletions

View File

@ -1,5 +1,6 @@
<?php <?php
session_start(); session_start();
require_once __DIR__ . '/db/config.php';
// Hardcoded credentials // Hardcoded credentials
$valid_username = 'admin'; $valid_username = 'admin';
@ -7,7 +8,10 @@ $valid_password = 'password';
$is_logged_in = isset($_SESSION['loggedin']) && $_SESSION['loggedin'] === true; $is_logged_in = isset($_SESSION['loggedin']) && $_SESSION['loggedin'] === true;
$error_message = ''; $error_message = '';
$pdo = db();
$editing_fact = null;
// Handle Login/Logout
if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['logout'])) { if (isset($_POST['logout'])) {
$_SESSION = []; $_SESSION = [];
@ -16,9 +20,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
exit; exit;
} }
if (isset($_POST['login'])) {
$username = $_POST['username'] ?? ''; $username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? ''; $password = $_POST['password'] ?? '';
if ($username === $valid_username && $password === $valid_password) { if ($username === $valid_username && $password === $valid_password) {
$_SESSION['loggedin'] = true; $_SESSION['loggedin'] = true;
header("Location: admin.php"); header("Location: admin.php");
@ -26,7 +30,45 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
} else { } else {
$error_message = "Invalid username or password."; $error_message = "Invalid username or password.";
} }
}
} }
// If logged in, handle CRUD actions
if ($is_logged_in && $pdo) {
// Handle Delete
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_id'])) {
$stmt = $pdo->prepare('DELETE FROM nokia_facts WHERE id = ?');
$stmt->execute([$_POST['delete_id']]);
header("Location: admin.php");
exit;
}
// Handle Add/Update
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['fact_text'])) {
$fact_text = trim($_POST['fact_text']);
$fact_id = $_POST['fact_id'] ?? null;
if (!empty($fact_text)) {
if ($fact_id) { // Update
$stmt = $pdo->prepare('UPDATE nokia_facts SET fact = ? WHERE id = ?');
$stmt->execute([$fact_text, $fact_id]);
} else { // Add
$stmt = $pdo->prepare('INSERT INTO nokia_facts (fact) VALUES (?)');
$stmt->execute([$fact_text]);
}
}
header("Location: admin.php");
exit;
}
// Handle Edit - Fetch fact for form
if (isset($_GET['edit_id'])) {
$stmt = $pdo->prepare('SELECT id, fact FROM nokia_facts WHERE id = ?');
$stmt->execute([$_GET['edit_id']]);
$editing_fact = $stmt->fetch();
}
}
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
@ -56,6 +98,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<li class="nav-item"><a class="nav-link" href="sandbox.php">Sandbox</a></li> <li class="nav-item"><a class="nav-link" href="sandbox.php">Sandbox</a></li>
<li class="nav-item"><a class="nav-link" href="seo.php">SEO</a></li> <li class="nav-item"><a class="nav-link" href="seo.php">SEO</a></li>
<li class="nav-item"><a class="nav-link active" href="admin.php">Admin</a></li> <li class="nav-item"><a class="nav-link active" href="admin.php">Admin</a></li>
<li class="nav-item"><a class="nav-link" href="contact.php">Contact</a></li>
</ul> </ul>
</div> </div>
</div> </div>
@ -73,14 +116,14 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<?php endif; ?> <?php endif; ?>
<form method="POST" action="admin.php"> <form method="POST" action="admin.php">
<div class="form-floating mb-3"> <div class="form-floating mb-3">
<input type="text" class="form-control" id="username" name="username" placeholder="Username"> <input type="text" class="form-control" id="username" name="username" placeholder="Username" required>
<label for="username">Username</label> <label for="username">Username</label>
</div> </div>
<div class="form-floating mb-3"> <div class="form-floating mb-3">
<input type="password" class="form-control" id="password" name="password" placeholder="Password"> <input type="password" class="form-control" id="password" name="password" placeholder="Password" required>
<label for="password">Password</label> <label for="password">Password</label>
</div> </div>
<button class="w-100 btn btn-lg btn-primary" type="submit">Sign in</button> <button class="w-100 btn btn-lg btn-primary" type="submit" name="login">Sign in</button>
</form> </form>
</div> </div>
</div> </div>
@ -90,49 +133,63 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<div class="card shadow-sm"> <div class="card shadow-sm">
<div class="card-header d-flex justify-content-between align-items-center"> <div class="card-header d-flex justify-content-between align-items-center">
<h2 class="h4 mb-0">Nokia Facts Management</h2> <h2 class="h4 mb-0">Nokia Facts Management</h2>
<form method="POST" action="admin.php"> <form method="POST" action="admin.php" class="mb-0">
<button type="submit" name="logout" class="btn btn-sm btn-outline-secondary">Logout <i class="bi bi-box-arrow-right"></i></button> <button type="submit" name="logout" class="btn btn-sm btn-outline-secondary">Logout <i class="bi bi-box-arrow-right"></i></button>
</form> </form>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="mb-4 p-3 border rounded bg-light">
<h3 class="h5"><?php echo $editing_fact ? 'Edit Fact' : 'Add New Fact'; ?></h3>
<form method="POST" action="admin.php">
<input type="hidden" name="fact_id" value="<?php echo $editing_fact['id'] ?? ''; ?>">
<div class="input-group">
<textarea class="form-control" name="fact_text" rows="2" placeholder="Enter a new Nokia fact..."><?php echo htmlspecialchars($editing_fact['fact'] ?? ''); ?></textarea>
<button class="btn btn-<?php echo $editing_fact ? 'primary' : 'success'; ?>" type="submit"><?php echo $editing_fact ? 'Update Fact' : 'Add Fact'; ?></button>
<?php if ($editing_fact): ?>
<a href="admin.php" class="btn btn-secondary">Cancel</a>
<?php endif; ?>
</div>
</form>
</div>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead> <thead>
<tr> <tr>
<th scope="col">#</th>
<th scope="col">Fact</th> <th scope="col">Fact</th>
<th scope="col">Created At</th> <th scope="col" class="text-end">Actions</th>
<th scope="col">Actions</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<?php <?php
require_once __DIR__ . '/db/config.php';
$pdo = db();
if ($pdo) { if ($pdo) {
$stmt = $pdo->query('SELECT id, fact, created_at FROM nokia_facts ORDER BY id DESC'); $stmt = $pdo->query('SELECT id, fact, created_at FROM nokia_facts ORDER BY id DESC');
$facts = $stmt->fetchAll(); $facts = $stmt->fetchAll();
foreach ($facts as $fact): foreach ($facts as $fact):
?> ?>
<tr> <tr>
<th scope="row"><?php echo htmlspecialchars($fact['id']); ?></th>
<td><?php echo htmlspecialchars($fact['fact']); ?></td> <td><?php echo htmlspecialchars($fact['fact']); ?></td>
<td><?php echo htmlspecialchars($fact['created_at']); ?></td> <td class="text-end">
<td> <a href="admin.php?edit_id=<?php echo $fact['id']; ?>" class="btn btn-sm btn-outline-primary"><i class="bi bi-pencil"></i> Edit</a>
<button class="btn btn-sm btn-outline-primary"><i class="bi bi-pencil"></i></button> <form method="POST" action="admin.php" class="d-inline" onsubmit="return confirm('Are you sure you want to delete this fact?');">
<button class="btn btn-sm btn-outline-danger"><i class="bi bi-trash"></i></button> <input type="hidden" name="delete_id" value="<?php echo $fact['id']; ?>">
<button type="submit" class="btn btn-sm btn-outline-danger"><i class="bi bi-trash"></i> Delete</button>
</form>
</td> </td>
</tr> </tr>
<?php <?php
endforeach; endforeach;
if (empty($facts)) {
echo "<tr><td colspan='2'>No facts found. Add one above!</td></tr>";
}
} else { } else {
echo "<tr><td colspan='4'>Database connection not available.</td></tr>"; echo "<tr><td colspan='2'>Database connection not available.</td></tr>";
} }
?> ?>
</tbody> </tbody>
</table> </table>
</div> </div>
<button class="btn btn-success"><i class="bi bi-plus-circle"></i> Add New Fact</button>
</div> </div>
</div> </div>
<?php endif; ?> <?php endif; ?>

View File

@ -1,7 +1,8 @@
body { font-family: "Courier New", monospace; background-color: #000; color: #0FF; } @import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&display=swap");
.navbar, .card, footer { background-color: #002B36 !important; border: 1px solid #0FF; } body { font-family: "Orbitron", sans-serif; background: linear-gradient(to bottom, #2c003e, #ff00c1); color: #fff; }
.navbar-brand, .nav-link, h1, h2, h5, p { color: #0FF !important; } .navbar, .card, footer { background-color: rgba(0,0,0,0.5) !important; backdrop-filter: blur(10px); border: 1px solid #ff00c1; }
.btn-primary { background-color: #0FF; color: #000; border: none; } .navbar-brand, .nav-link, h1, h2, h5, p { color: #fff !important; text-shadow: 0 0 10px #ff00c1; }
.vibe-preview { padding: 2rem; border: 1px dashed #0FF; margin-top: 2rem; } .btn-primary { background: #ff00c1; border: none; box-shadow: 0 0 15px #ff00c1; }
.vibe-preview { padding: 2rem; border: 1px solid #ff00c1; margin-top: 2rem; }

115
contact.php Normal file
View File

@ -0,0 +1,115 @@
<?php
$message_status = '';
$error_message = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
require_once __DIR__ . '/mail/MailService.php';
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$message = trim($_POST['message'] ?? '');
if (empty($name) || empty($email) || empty($message)) {
$error_message = 'Please fill out all fields.';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$error_message = 'Please enter a valid email address.';
} else {
$to = getenv('MAIL_TO') ?: 'admin@example.com'; // Fallback recipient
$subject = 'New Contact Form Message from ' . $name;
$res = MailService::sendContactMessage($name, $email, $message, $to, $subject);
if (!empty($res['success'])) {
$message_status = 'success';
} else {
$error_message = 'Sorry, there was an error sending your message. Please try again later.';
// Log the actual error: error_log("MailService Error: " . $res['error']);
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Contact Us - LAMP Demo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
<link rel="stylesheet" href="assets/css/custom.css">
</head>
<body class="bg-light">
<nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm">
<div class="container">
<a class="navbar-brand" href="index.php">
<i class="bi bi-lightbulb-fill text-primary"></i>
LAMP Demo
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="index.php">Home</a></li>
<li class="nav-item"><a class="nav-link" href="vibe.php">Vibe</a></li>
<li class="nav-item"><a class="nav-link" href="sandbox.php">Sandbox</a></li>
<li class="nav-item"><a class="nav-link" href="seo.php">SEO</a></li>
<li class="nav-item"><a class="nav-link" href="admin.php">Admin</a></li>
<li class="nav-item"><a class="nav-link active" href="contact.php">Contact</a></li>
</ul>
</div>
</div>
</nav>
<main class="container my-5">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card shadow-sm">
<div class="card-body p-5">
<h1 class="display-5 text-center mb-4">Contact Us</h1>
<?php if ($message_status === 'success'): ?>
<div class="alert alert-success text-center">
<h4>Thank You!</h4>
<p>Your message has been sent successfully. We will get back to you shortly.</p>
<a href="index.php" class="btn btn-primary">Return Home</a>
</div>
<?php else: ?>
<?php if ($error_message): ?>
<div class="alert alert-danger">- <?php echo $error_message; ?></div>
<?php endif; ?>
<p class="text-center text-muted mb-4">Have a question or feedback? Fill out the form below to get in touch with us.</p>
<form action="contact.php" method="POST">
<div class="form-floating mb-3">
<input type="text" class="form-control" id="name" name="name" placeholder="Your Name" required value="<?php echo htmlspecialchars($_POST['name'] ?? ''); ?>">
<label for="name">Your Name</label>
</div>
<div class="form-floating mb-3">
<input type="email" class="form-control" id="email" name="email" placeholder="Your Email" required value="<?php echo htmlspecialchars($_POST['email'] ?? ''); ?>">
<label for="email">Your Email</label>
</div>
<div class="form-floating mb-4">
<textarea class="form-control" id="message" name="message" placeholder="Your Message" required style="height: 150px;"><?php echo htmlspecialchars($_POST['message'] ?? ''); ?></textarea>
<label for="message">Your Message</label>
</div>
<div class="text-center">
<button type="submit" class="btn btn-primary btn-lg"><i class="bi bi-send-fill"></i> Send Message</button>
</div>
</form>
<?php endif; ?>
</div>
</div>
<div class="alert alert-warning text-center mt-4">This is for testing purposes only Flatlogic does not guarantee usage of the mail server. Please set up your own SMTP in <code>.env</code> (MAIL_/SMTP_ vars).</div>
</div>
</div>
</main>
<footer class="bg-white text-center text-muted py-4 mt-5 border-top">
<div class="container">
<p class="mb-0">&copy; <?php echo date("Y"); ?> LAMP Demo. All rights reserved.</p>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@ -13,20 +13,21 @@
<nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm"> <nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm">
<div class="container"> <div class="container">
<a class="navbar-brand" href="/"> <a class="navbar-brand" href="index.php">
<i class="bi bi-box-seam"></i> <i class="bi bi-lightbulb-fill text-primary"></i>
Flatlogic<span style="color: #6366F1;">Vibes</span> LAMP Demo
</a> </a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="collapse navbar-collapse" id="navbarNav"> <div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto"> <ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="/">Home</a></li> <li class="nav-item"><a class="nav-link active" href="index.php">Home</a></li>
<li class="nav-item"><a class="nav-link" href="vibe.php">Vibe Generator</a></li> <li class="nav-item"><a class="nav-link" href="vibe.php">Vibe</a></li>
<li class="nav-item"><a class="nav-link" href="sandbox.php">PHP Sandbox</a></li> <li class="nav-item"><a class="nav-link" href="sandbox.php">Sandbox</a></li>
<li class="nav-item"><a class="nav-link" href="seo.php">SEO Checker</a></li> <li class="nav-item"><a class="nav-link" href="seo.php">SEO</a></li>
<li class="nav-item"><a class="nav-link" href="admin.php">Admin</a></li> <li class="nav-item"><a class="nav-link" href="admin.php">Admin</a></li>
<li class="nav-item"><a class="nav-link" href="contact.php">Contact</a></li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -62,19 +62,20 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") {
<nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm"> <nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm">
<div class="container"> <div class="container">
<a class="navbar-brand" href="index.php"> <a class="navbar-brand" href="index.php">
<i class="bi bi-box-seam"></i> <i class="bi bi-lightbulb-fill text-primary"></i>
Flatlogic<span style="color: #6366F1;">Vibes</span> LAMP Demo
</a> </a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="collapse navbar-collapse" id="navbarNav"> <div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto"> <ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="index.php">Home</a></li> <li class="nav-item"><a class="nav-link" href="index.php">Home</a></li>
<li class="nav-item"><a class="nav-link" href="vibe.php">Vibe Generator</a></li> <li class="nav-item"><a class="nav-link" href="vibe.php">Vibe</a></li>
<li class="nav-item"><a class="nav-link active" href="sandbox.php">PHP Sandbox</a></li> <li class="nav-item"><a class="nav-link active" href="sandbox.php">Sandbox</a></li>
<li class="nav-item"><a class="nav-link" href="seo.php">SEO Checker</a></li> <li class="nav-item"><a class="nav-link" href="seo.php">SEO</a></li>
<li class="nav-item"><a class="nav-link" href="admin.php">Admin</a></li> <li class="nav-item"><a class="nav-link" href="admin.php">Admin</a></li>
<li class="nav-item"><a class="nav-link" href="contact.php">Contact</a></li>
</ul> </ul>
</div> </div>
</div> </div>

95
seo.php
View File

@ -17,8 +17,8 @@ function analyze_seo($html) {
// Title // Title
$title_node = $doc->getElementsByTagName('title')->item(0); $title_node = $doc->getElementsByTagName('title')->item(0);
if ($title_node) { if ($title_node) {
$results['title']['text'] = $title_node->nodeValue; $results['title']['text'] = trim($title_node->nodeValue);
$results['title']['length'] = strlen($title_node->nodeValue); $results['title']['length'] = strlen($results['title']['text']);
if ($results['title']['length'] >= 10 && $results['title']['length'] <= 70) { if ($results['title']['length'] >= 10 && $results['title']['length'] <= 70) {
$results['title']['status'] = 'success'; $results['title']['status'] = 'success';
} }
@ -27,15 +27,16 @@ function analyze_seo($html) {
// Meta Description // Meta Description
$metas = $doc->getElementsByTagName('meta'); $metas = $doc->getElementsByTagName('meta');
foreach ($metas as $meta) { foreach ($metas as $meta) {
if (strtolower($meta->getAttribute('name')) == 'description') { $name = strtolower($meta->getAttribute('name'));
$results['description']['text'] = $meta->getAttribute('content'); $property = strtolower($meta->getAttribute('property'));
$results['description']['length'] = strlen($meta->getAttribute('content')); if ($name == 'description') {
$results['description']['text'] = trim($meta->getAttribute('content'));
$results['description']['length'] = strlen($results['description']['text']);
if ($results['description']['length'] >= 50 && $results['description']['length'] <= 160) { if ($results['description']['length'] >= 50 && $results['description']['length'] <= 160) {
$results['description']['status'] = 'success'; $results['description']['status'] = 'success';
} }
break;
} }
if (strpos(strtolower($meta->getAttribute('property')), 'og:') === 0) { if (strpos($property, 'og:') === 0) {
$results['og_tags']['found']++; $results['og_tags']['found']++;
} }
} }
@ -58,19 +59,35 @@ function analyze_seo($html) {
$results['alt_tags']['missing']++; $results['alt_tags']['missing']++;
} }
} }
if ($results['alt_tags']['missing'] > 0) { if ($results['alt_tags']['total'] > 0 && $results['alt_tags']['missing'] > 0) {
$results['alt_tags']['status'] = 'warning'; $results['alt_tags']['status'] = 'warning';
} }
return $results; return $results;
} }
$html_input = ''; $url_input = '';
$seo_results = null; $seo_results = null;
$error_message = '';
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['html_content'])) { if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['url'])) {
$html_input = $_POST['html_content']; $url_input = trim($_POST['url']);
$seo_results = analyze_seo($html_input); if (filter_var($url_input, FILTER_VALIDATE_URL)) {
$context = stream_context_create([
'http' => [
'timeout' => 10, // 10 seconds
'user_agent' => 'FlatlogicSEOChecker/1.0',
]
]);
$html = @file_get_contents($url_input, false, $context);
if ($html) {
$seo_results = analyze_seo($html);
} else {
$error_message = "Could not retrieve content from the URL. Please check if the URL is correct and publicly accessible.";
}
} else {
$error_message = "Invalid URL provided. Please enter a valid URL (e.g., http://example.com).";
}
} }
?> ?>
@ -79,23 +96,30 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['html_content'])) {
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SEO Checker - Flatlogic LAMP Demo</title> <title>SEO Checker - LAMP Demo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
<link rel="stylesheet" href="assets/css/custom.css"> <link rel="stylesheet" href="assets/css/custom.css">
</head> </head>
<body> <body class="bg-light">
<nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm"> <nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm">
<div class="container"> <div class="container">
<a class="navbar-brand" href="index.php">Flatlogic<span style="color: #6366F1;">Vibes</span></a> <a class="navbar-brand" href="index.php">
<div class="collapse navbar-collapse"> <i class="bi bi-lightbulb-fill text-primary"></i>
LAMP Demo
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto"> <ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="index.php">Home</a></li> <li class="nav-item"><a class="nav-link" href="index.php">Home</a></li>
<li class="nav-item"><a class="nav-link" href="vibe.php">Vibe</a></li> <li class="nav-item"><a class="nav-link" href="vibe.php">Vibe</a></li>
<li class="nav-item"><a class="nav-link" href="sandbox.php">Sandbox</a></li> <li class="nav-item"><a class="nav-link" href="sandbox.php">Sandbox</a></li>
<li class="nav-item"><a class="nav-link active" href="seo.php">SEO</a></li> <li class="nav-item"><a class="nav-link active" href="seo.php">SEO</a></li>
<li class="nav-item"><a class="nav-link" href="admin.php">Admin</a></li> <li class="nav-item"><a class="nav-link" href="admin.php">Admin</a></li>
<li class="nav-item"><a class="nav-link" href="contact.php">Contact</a></li>
</ul> </ul>
</div> </div>
</div> </div>
@ -103,49 +127,48 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['html_content'])) {
<main class="container my-5"> <main class="container my-5">
<div class="text-center mb-5"> <div class="text-center mb-5">
<h1 class="display-5">SEO Checker</h1> <h1 class="display-5">Live SEO Checker</h1>
<p class="lead">Paste your HTML to get an on-page SEO analysis.</p> <p class="lead">Enter a URL to get an on-page SEO analysis.</p>
</div> </div>
<div class="card shadow-sm"> <div class="card shadow-sm">
<div class="card-body"> <div class="card-body p-4">
<form action="seo.php" method="POST"> <form action="seo.php" method="POST">
<div class="mb-3"> <div class="input-group mb-3">
<label for="html_content" class="form-label">HTML Content</label> <span class="input-group-text"><i class="bi bi-link-45deg"></i></span>
<textarea class="form-control font-monospace" id="html_content" name="html_content" rows="12" placeholder="<html>..."><?php echo htmlspecialchars($html_input); ?></textarea> <input type="url" class="form-control form-control-lg" id="url" name="url" placeholder="https://example.com" value="<?php echo htmlspecialchars($url_input); ?>" required>
</div>
<div class="text-center">
<button type="submit" class="btn btn-primary"><i class="bi bi-search"></i> Analyze</button> <button type="submit" class="btn btn-primary"><i class="bi bi-search"></i> Analyze</button>
</div> </div>
</form> </form>
<?php if ($error_message): ?>
<div class="alert alert-danger mt-3"><?php echo $error_message; ?></div>
<?php endif; ?>
</div> </div>
</div> </div>
<?php if ($seo_results): ?> <?php if ($seo_results): ?>
<div class="card shadow-sm mt-5"> <div class="card shadow-sm mt-5">
<div class="card-header"> <div class="card-header">
<h2 class="h4 mb-0">Analysis Results</h2> <h2 class="h4 mb-0">Analysis Results for <span class="text-primary"><?php echo htmlspecialchars($url_input); ?></span></h2>
</div> </div>
<div class="card-body"> <div class="card-body">
<ul class="list-group list-group-flush"> <ul class="list-group list-group-flush">
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
<div><strong>Title Tag</strong> <small class="text-muted d-block"><?php echo htmlspecialchars($seo_results['title']['text']); ?> (<?php echo $seo_results['title']['length']; ?> chars)</small></div> <div><strong>Title Tag</strong> <span class="badge bg-<?php echo $seo_results['title']['status']; ?>"><?php echo $seo_results['title']['length'] > 0 ? 'OK' : 'Missing'; ?></span><br><small class="text-muted"><?php echo htmlspecialchars($seo_results['title']['text']); ?> (<?php echo $seo_results['title']['length']; ?> chars)</small></div>
<span class="badge bg-<?php echo $seo_results['title']['status']; ?>"><?php echo $seo_results['title']['length'] > 0 ? 'Good' : 'Missing'; ?></span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
<div><strong>Meta Description</strong> <small class="text-muted d-block"><?php echo htmlspecialchars(substr($seo_results['description']['text'], 0, 100)); ?>... (<?php echo $seo_results['description']['length']; ?> chars)</small></div> <div><strong>Meta Description</strong> <span class="badge bg-<?php echo $seo_results['description']['status']; ?>"><?php echo $seo_results['description']['length'] > 0 ? 'OK' : 'Missing'; ?></span><br><small class="text-muted"><?php echo htmlspecialchars(substr($seo_results['description']['text'], 0, 150)); ?>... (<?php echo $seo_results['description']['length']; ?> chars)</small></div>
<span class="badge bg-<?php echo $seo_results['description']['status']; ?>"><?php echo $seo_results['description']['length'] > 0 ? 'Good' : 'Missing'; ?></span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
<div><strong>H1 Tags</strong> <small class="text-muted d-block">Should be exactly one.</small></div> <div><strong>H1 Tags</strong> <small class="text-muted">Should be exactly one.</small></div>
<span class="badge bg-<?php echo $seo_results['h1_count']['status']; ?>"><?php echo $seo_results['h1_count']['count']; ?> found</span> <span class="badge bg-<?php echo $seo_results['h1_count']['status']; ?>"><?php echo $seo_results['h1_count']['count']; ?> found</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
<div><strong>Image Alt Tags</strong> <small class="text-muted d-block">All images should have descriptive alt text.</small></div> <div><strong>Image Alt Tags</strong> <small class="text-muted">All images should have descriptive alt text.</small></div>
<span class="badge bg-<?php echo $seo_results['alt_tags']['status']; ?>"><?php echo $seo_results['alt_tags']['missing']; ?> missing / <?php echo $seo_results['alt_tags']['total']; ?> total</span> <span class="badge bg-<?php echo $seo_results['alt_tags']['status']; ?>"><?php echo $seo_results['alt_tags']['missing']; ?> missing / <?php echo $seo_results['alt_tags']['total']; ?> total</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
<div><strong>Open Graph Tags</strong> <small class="text-muted d-block">For social media sharing.</small></div> <div><strong>Open Graph Tags</strong> <small class="text-muted">For social media sharing.</small></div>
<span class="badge bg-<?php echo $seo_results['og_tags']['status']; ?>"><?php echo $seo_results['og_tags']['found']; ?> found</span> <span class="badge bg-<?php echo $seo_results['og_tags']['status']; ?>"><?php echo $seo_results['og_tags']['found']; ?> found</span>
</li> </li>
</ul> </ul>
@ -154,9 +177,9 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['html_content'])) {
<?php endif; ?> <?php endif; ?>
</main> </main>
<footer class="py-4 mt-auto bg-light"> <footer class="bg-white text-center text-muted py-4 mt-5 border-top">
<div class="container text-center"> <div class="container">
<p class="mb-0 text-muted">&copy; <?php echo date("Y"); ?> Flatlogic. All rights reserved.</p> <p class="mb-0">&copy; <?php echo date("Y"); ?> LAMP Demo. All rights reserved.</p>
</div> </div>
</footer> </footer>

106
vibe-share.php Normal file
View File

@ -0,0 +1,106 @@
<?php
require_once __DIR__ . '/db/config.php';
function get_vibe_css($vibe) {
$css = '';
switch ($vibe) {
case 'Tech-retro':
$css = 'body { font-family: "Courier New", monospace; background-color: #000; color: #0FF; } .navbar, .card, footer { background-color: #002B36 !important; border: 1px solid #0FF; } .navbar-brand, .nav-link, h1, h2, h5, p { color: #0FF !important; } .btn-primary { background-color: #0FF; color: #000; border: none; } .vibe-preview { padding: 2rem; border: 1px dashed #0FF; margin-top: 2rem; }';
break;
case 'Synthwave':
$css = '@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&display=swap"); body { font-family: "Orbitron", sans-serif; background: linear-gradient(to bottom, #2c003e, #ff00c1); color: #fff; } .navbar, .card, footer { background-color: rgba(0,0,0,0.5) !important; backdrop-filter: blur(10px); border: 1px solid #ff00c1; } .navbar-brand, .nav-link, h1, h2, h5, p { color: #fff !important; text-shadow: 0 0 10px #ff00c1; } .btn-primary { background: #ff00c1; border: none; box-shadow: 0 0 15px #ff00c1; } .vibe-preview { padding: 2rem; border: 1px solid #ff00c1; margin-top: 2rem; }';
break;
case 'Brutalism':
$css = 'body { font-family: "Arial", sans-serif; background-color: #f0f0f0; color: #000; } .navbar, .card, footer { background-color: #f0f0f0 !important; border: 2px solid #000; box-shadow: none !important; border-radius: 0; } .navbar-brand, .nav-link, h1, h2, h5, p { color: #000 !important; } .btn-primary { background-color: #FFFF00; color: #000; border: 2px solid #000; border-radius: 0; } .vibe-preview { padding: 2rem; border: 2px solid #000; margin-top: 2rem; }';
break;
case 'Dad-garage':
$css = '@import url("https://fonts.googleapis.com/css2?family=Roboto+Slab:wght@400;700&display=swap"); body { font-family: "Roboto Slab", serif; background-color: #D2B48C; color: #333; } .navbar, .card, footer { background-color: #8B4513 !important; color: white; border: 3px solid #654321; } .navbar-brand, .nav-link, h1, h2, h5, p, .card-body { color: #fff !important; } .btn-primary { background-color: #008000; color: #fff; border: 2px solid #006400; } .vibe-preview { padding: 2rem; border: 2px solid #654321; margin-top: 2rem; background-color: #F5DEB3; } .vibe-preview h2, .vibe-preview p { color: #333 !important; }';
break;
case 'Zen-mono':
$css = 'body { font-family: "Helvetica Neue", sans-serif; background-color: #fff; color: #333; } .navbar, .card, footer { background-color: #fff !important; border: 1px solid #ddd; box-shadow: none !important; } .navbar-brand, .nav-link, h1, h2, h5, p { color: #333 !important; } .btn-primary { background-color: #333; color: #fff; border: none; border-radius: 50px; } .vibe-preview { padding: 2rem; border: 1px solid #eee; margin-top: 2rem; }';
break;
}
return $css;
}
$pdo = db();
$saved_vibe = null;
if (isset($_GET['id']) && $pdo) {
$stmt = $pdo->prepare('SELECT id, vibe, keywords, created_at FROM saved_vibes WHERE id = ?');
$stmt->execute([$_GET['id']]);
$saved_vibe = $stmt->fetch();
}
$vibe_css = '';
if ($saved_vibe) {
$vibe_css = get_vibe_css($saved_vibe['vibe']);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Shared Vibe - <?php echo htmlspecialchars($saved_vibe['keywords'] ?? 'Not Found'); ?></title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
<link rel="stylesheet" href="assets/css/custom.css">
<?php if ($vibe_css): ?>
<style><?php echo $vibe_css; ?></style>
<?php endif; ?>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm">
<div class="container">
<a class="navbar-brand" href="index.php"><i class="bi bi-lightbulb-fill text-primary"></i> LAMP Demo</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"><span class="navbar-toggler-icon"></span></button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="index.php">Home</a></li>
<li class="nav-item"><a class="nav-link" href="vibe.php">Vibe</a></li>
<li class="nav-item"><a class="nav-link" href="sandbox.php">Sandbox</a></li>
<li class="nav-item"><a class="nav-link" href="seo.php">SEO</a></li>
<li class="nav-item"><a class="nav-link" href="admin.php">Admin</a></li>
<li class="nav-item"><a class="nav-link" href="contact.php">Contact</a></li>
</ul>
</div>
</div>
</nav>
<main class="py-5">
<div class="container">
<?php if ($saved_vibe): ?>
<div class="vibe-preview">
<div class="text-center">
<h1><?php echo htmlspecialchars($saved_vibe['keywords']); ?></h1>
<p>A micro-site generated with the <span class="badge bg-secondary"><?php echo htmlspecialchars($saved_vibe['vibe']); ?></span> vibe.</p>
</div>
<div class="row mt-5">
<div class="col-md-4"><div class="card"><div class="card-body"><h5 class="card-title">Feature One</h5><p class="card-text">This is a sample card.</p></div></div></div>
<div class="col-md-4"><div class="card"><div class="card-body"><h5 class="card-title">Feature Two</h5><p class="card-text">Styles are from the vibe.</p></div></div></div>
<div class="col-md-4"><div class="card"><div class="card-body"><h5 class="card-title">Feature Three</h5><p class="card-text">Create your own vibe!</p></div></div></div>
</div>
<div class="text-center mt-5">
<a href="vibe.php" class="btn btn-primary">Create Your Own Vibe</a>
</div>
</div>
<?php else: ?>
<div class="text-center">
<h1 class="display-5">Vibe Not Found</h1>
<p class="lead">Sorry, we couldn't find the vibe you were looking for.</p>
<a href="vibe.php" class="btn btn-primary">Explore Other Vibes</a>
</div>
<?php endif; ?>
</div>
</main>
<footer class="py-4 mt-auto bg-light">
<div class="container text-center"><p class="mb-0 text-muted">&copy; <?php echo date("Y"); ?> Flatlogic. All rights reserved.</p></div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

182
vibe.php
View File

@ -1,104 +1,85 @@
<?php <?php
require_once __DIR__ . '/db/config.php';
function get_vibe_css($vibe) { function get_vibe_css($vibe) {
$css = ''; $css = '';
switch ($vibe) { switch ($vibe) {
case 'Tech-retro': case 'Tech-retro':
$css = ' $css = 'body { font-family: "Courier New", monospace; background-color: #000; color: #0FF; } .navbar, .card, footer { background-color: #002B36 !important; border: 1px solid #0FF; } .navbar-brand, .nav-link, h1, h2, h5, p { color: #0FF !important; } .btn-primary { background-color: #0FF; color: #000; border: none; } .vibe-preview { padding: 2rem; border: 1px dashed #0FF; margin-top: 2rem; }';
body { font-family: "Courier New", monospace; background-color: #000; color: #0FF; }
.navbar, .card, footer { background-color: #002B36 !important; border: 1px solid #0FF; }
.navbar-brand, .nav-link, h1, h2, h5, p { color: #0FF !important; }
.btn-primary { background-color: #0FF; color: #000; border: none; }
.vibe-preview { padding: 2rem; border: 1px dashed #0FF; margin-top: 2rem; }
';
break; break;
case 'Synthwave': case 'Synthwave':
$css = ' $css = '@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&display=swap"); body { font-family: "Orbitron", sans-serif; background: linear-gradient(to bottom, #2c003e, #ff00c1); color: #fff; } .navbar, .card, footer { background-color: rgba(0,0,0,0.5) !important; backdrop-filter: blur(10px); border: 1px solid #ff00c1; } .navbar-brand, .nav-link, h1, h2, h5, p { color: #fff !important; text-shadow: 0 0 10px #ff00c1; } .btn-primary { background: #ff00c1; border: none; box-shadow: 0 0 15px #ff00c1; } .vibe-preview { padding: 2rem; border: 1px solid #ff00c1; margin-top: 2rem; }';
@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&display=swap");
body { font-family: "Orbitron", sans-serif; background: linear-gradient(to bottom, #2c003e, #ff00c1); color: #fff; }
.navbar, .card, footer { background-color: rgba(0,0,0,0.5) !important; backdrop-filter: blur(10px); border: 1px solid #ff00c1; }
.navbar-brand, .nav-link, h1, h2, h5, p { color: #fff !important; text-shadow: 0 0 10px #ff00c1; }
.btn-primary { background: #ff00c1; border: none; box-shadow: 0 0 15px #ff00c1; }
.vibe-preview { padding: 2rem; border: 1px solid #ff00c1; margin-top: 2rem; }
';
break; break;
case 'Brutalism': case 'Brutalism':
$css = ' $css = 'body { font-family: "Arial", sans-serif; background-color: #f0f0f0; color: #000; } .navbar, .card, footer { background-color: #f0f0f0 !important; border: 2px solid #000; box-shadow: none !important; border-radius: 0; } .navbar-brand, .nav-link, h1, h2, h5, p { color: #000 !important; } .btn-primary { background-color: #FFFF00; color: #000; border: 2px solid #000; border-radius: 0; } .vibe-preview { padding: 2rem; border: 2px solid #000; margin-top: 2rem; }';
body { font-family: "Arial", sans-serif; background-color: #f0f0f0; color: #000; }
.navbar, .card, footer { background-color: #f0f0f0 !important; border: 2px solid #000; box-shadow: none !important; border-radius: 0; }
.navbar-brand, .nav-link, h1, h2, h5, p { color: #000 !important; }
.btn-primary { background-color: #FFFF00; color: #000; border: 2px solid #000; border-radius: 0; }
.vibe-preview { padding: 2rem; border: 2px solid #000; margin-top: 2rem; }
';
break; break;
case 'Dad-garage': case 'Dad-garage':
$css = ' $css = '@import url("https://fonts.googleapis.com/css2?family=Roboto+Slab:wght@400;700&display=swap"); body { font-family: "Roboto Slab", serif; background-color: #D2B48C; color: #333; } .navbar, .card, footer { background-color: #8B4513 !important; color: white; border: 3px solid #654321; } .navbar-brand, .nav-link, h1, h2, h5, p, .card-body { color: #fff !important; } .btn-primary { background-color: #008000; color: #fff; border: 2px solid #006400; } .vibe-preview { padding: 2rem; border: 2px solid #654321; margin-top: 2rem; background-color: #F5DEB3; } .vibe-preview h2, .vibe-preview p { color: #333 !important; }';
@import url("https://fonts.googleapis.com/css2?family=Roboto+Slab:wght@400;700&display=swap");
body { font-family: "Roboto Slab", serif; background-color: #D2B48C; color: #333; }
.navbar, .card, footer { background-color: #8B4513 !important; color: white; border: 3px solid #654321; }
.navbar-brand, .nav-link, h1, h2, h5, p, .card-body { color: #fff !important; }
.btn-primary { background-color: #008000; color: #fff; border: 2px solid #006400; }
.vibe-preview { padding: 2rem; border: 2px solid #654321; margin-top: 2rem; background-color: #F5DEB3; }
.vibe-preview h2, .vibe-preview p { color: #333 !important; }
';
break; break;
case 'Zen-mono': case 'Zen-mono':
$css = ' $css = 'body { font-family: "Helvetica Neue", sans-serif; background-color: #fff; color: #333; } .navbar, .card, footer { background-color: #fff !important; border: 1px solid #ddd; box-shadow: none !important; } .navbar-brand, .nav-link, h1, h2, h5, p { color: #333 !important; } .btn-primary { background-color: #333; color: #fff; border: none; border-radius: 50px; } .vibe-preview { padding: 2rem; border: 1px solid #eee; margin-top: 2rem; }';
body { font-family: "Helvetica Neue", sans-serif; background-color: #fff; color: #333; }
.navbar, .card, footer { background-color: #fff !important; border: 1px solid #ddd; box-shadow: none !important; }
.navbar-brand, .nav-link, h1, h2, h5, p { color: #333 !important; }
.btn-primary { background-color: #333; color: #fff; border: none; border-radius: 50px; }
.vibe-preview { padding: 2rem; border: 1px solid #eee; margin-top: 2rem; }
';
break; break;
} }
return $css; return $css;
} }
$pdo = db();
$vibe_css_path = 'assets/css/vibe.css'; $vibe_css_path = 'assets/css/vibe.css';
$vibe_generated = false; $vibe_generated = false;
$saved_vibe_id = null;
if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$vibe = $_POST['vibe'] ?? ''; $vibe = $_POST['vibe'] ?? '';
$keywords = $_POST['keywords'] ?? ''; $keywords = $_POST['keywords'] ?? '';
$action = $_POST['action'] ?? 'generate';
if ($vibe) { if ($action === 'save' && $pdo) {
$stmt = $pdo->prepare('INSERT INTO saved_vibes (vibe, keywords) VALUES (?, ?)');
$stmt->execute([$vibe, $keywords]);
$saved_vibe_id = $pdo->lastInsertId();
header("Location: vibe.php?saved_id=" . $saved_vibe_id);
exit;
} elseif ($action === 'generate' && $vibe) {
$css_content = get_vibe_css($vibe); $css_content = get_vibe_css($vibe);
file_put_contents($vibe_css_path, $css_content); file_put_contents($vibe_css_path, $css_content);
$vibe_generated = true; $vibe_generated = true;
} }
} }
$saved_vibes = [];
if ($pdo) {
$stmt = $pdo->query('SELECT id, vibe, keywords, created_at FROM saved_vibes ORDER BY created_at DESC');
$saved_vibes = $stmt->fetchAll();
}
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vibe Generator - Flatlogic LAMP Demo</title> <title>Vibe Generator - LAMP Demo</title>
<meta name="description" content="Generate a micro-site based on a vibe and keywords.">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
<link rel="stylesheet" href="assets/css/custom.css?v=<?php echo time(); ?>"> <link rel="stylesheet" href="assets/css/custom.css">
<?php if (file_exists($vibe_css_path)): ?> <?php if ($vibe_generated && file_exists($vibe_css_path)): ?>
<link rel="stylesheet" href="<?php echo $vibe_css_path; ?>?v=<?php echo time(); ?>"> <link rel="stylesheet" href="<?php echo $vibe_css_path; ?>?v=<?php echo time(); ?>">
<?php endif; ?> <?php endif; ?>
</head> </head>
<body> <body class="bg-light">
<nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm"> <nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm">
<div class="container"> <div class="container">
<a class="navbar-brand" href="index.php"> <a class="navbar-brand" href="index.php"><i class="bi bi-lightbulb-fill text-primary"></i> LAMP Demo</a>
<i class="bi bi-box-seam"></i> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"><span class="navbar-toggler-icon"></span></button>
Flatlogic<span style="color: #6366F1;">Vibes</span>
</a>
<div class="collapse navbar-collapse" id="navbarNav"> <div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto"> <ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="index.php">Home</a></li> <li class="nav-item"><a class="nav-link" href="index.php">Home</a></li>
<li class="nav-item"><a class="nav-link active" href="vibe.php">Vibe Generator</a></li> <li class="nav-item"><a class="nav-link active" href="vibe.php">Vibe</a></li>
<li class="nav-item"><a class="nav-link" href="sandbox.php">PHP Sandbox</a></li> <li class="nav-item"><a class="nav-link" href="sandbox.php">Sandbox</a></li>
<li class="nav-item"><a class="nav-link" href="seo.php">SEO Checker</a></li> <li class="nav-item"><a class="nav-link" href="seo.php">SEO</a></li>
<li class="nav-item"><a class="nav-link" href="admin.php">Admin</a></li> <li class="nav-item"><a class="nav-link" href="admin.php">Admin</a></li>
<li class="nav-item"><a class="nav-link" href="contact.php">Contact</a></li>
</ul> </ul>
</div> </div>
</div> </div>
@ -106,15 +87,26 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<main class="py-5"> <main class="py-5">
<div class="container"> <div class="container">
<?php if (!$vibe_generated): ?> <?php if (isset($_GET['saved_id'])): ?>
<div class="row justify-content-center"> <div class="alert alert-success text-center">
<div class="col-lg-8 text-center"> <h4>Vibe Saved!</h4>
<h1 class="display-5">Create a Vibe Site</h1> <p>Your vibe has been saved. You can share it with this link:</p>
<p class="lead">Step 1: Choose your aesthetic and provide a few keywords.</p> <input type="text" class="form-control text-center" value="<?php echo htmlspecialchars("http://{$_SERVER['HTTP_HOST']}/vibe-share.php?id={$_GET['saved_id']}"); ?>" readonly>
<div class="mt-3">
<a href="vibe-share.php?id=<?php echo htmlspecialchars($_GET['saved_id']); ?>" class="btn btn-primary">View Saved Vibe</a>
<a href="vibe.php" class="btn btn-secondary">Create Another</a>
</div> </div>
</div> </div>
<?php endif; ?>
<?php if (!$vibe_generated): ?>
<div class="text-center mb-5">
<h1 class="display-5">Create a Vibe Site</h1>
<p class="lead">Choose an aesthetic, provide keywords, and generate a themed micro-site.</p>
</div>
<form action="vibe.php" method="POST" class="mt-5"> <form action="vibe.php" method="POST">
<input type="hidden" name="action" value="generate">
<div class="row g-4 justify-content-center text-center"> <div class="row g-4 justify-content-center text-center">
<h2 class="h4">1. Choose a Vibe</h2> <h2 class="h4">1. Choose a Vibe</h2>
<?php <?php
@ -125,7 +117,6 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
'Dad-garage' => ['icon' => 'bi-tools', 'desc' => 'Rugged, practical, and built to last.'], 'Dad-garage' => ['icon' => 'bi-tools', 'desc' => 'Rugged, practical, and built to last.'],
'Zen-mono' => ['icon' => 'bi-yin-yang', 'desc' => 'Minimalist, monochrome, and serene.'] 'Zen-mono' => ['icon' => 'bi-yin-yang', 'desc' => 'Minimalist, monochrome, and serene.']
]; ];
foreach ($vibes as $name => $details): foreach ($vibes as $name => $details):
?> ?>
<div class="col-md-4 col-lg-2"> <div class="col-md-4 col-lg-2">
@ -142,21 +133,33 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<div class="row justify-content-center mt-5"> <div class="row justify-content-center mt-5">
<div class="col-lg-6"> <div class="col-lg-6">
<h2 class="h4 text-center">2. Enter Keywords</h2> <h2 class="h4 text-center">2. Enter Keywords</h2>
<div class="mb-3"> <input type="text" class="form-control form-control-lg" name="keywords" placeholder="e.g., My personal blog, AI experiments" required>
<label for="keywords" class="form-label visually-hidden">Keywords</label>
<input type="text" class="form-control form-control-lg" id="keywords" name="keywords" placeholder="e.g., My personal blog, AI experiments" required>
<div class="form-text text-center">Enter 1-3 key phrases that describe your site.</div>
</div>
</div> </div>
</div> </div>
<div class="text-center mt-4"> <div class="text-center mt-4"><button type="submit" class="btn btn-primary btn-lg"><i class="bi bi-stars"></i> Generate</button></div>
<button type="submit" class="btn btn-primary btn-lg px-5">
<i class="bi bi-stars"></i>
Generate
</button>
</div>
</form> </form>
<?php if (!empty($saved_vibes)): ?>
<div class="mt-5 pt-5 border-top">
<h2 class="text-center mb-4">Previously Saved Vibes</h2>
<div class="row g-4">
<?php foreach ($saved_vibes as $item): ?>
<div class="col-md-6 col-lg-4">
<div class="card h-100">
<div class="card-body text-center">
<h5 class="card-title"><?php echo htmlspecialchars($item['keywords']); ?></h5>
<p class="card-text"><span class="badge bg-secondary"><?php echo htmlspecialchars($item['vibe']); ?></span></p>
<a href="vibe-share.php?id=<?php echo $item['id']; ?>" class="btn btn-sm btn-outline-primary">View Vibe</a>
</div>
<div class="card-footer text-muted text-center"><small>Created: <?php echo date("M j, Y", strtotime($item['created_at'])); ?></small></div>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<?php else: ?> <?php else: ?>
<div class="vibe-preview"> <div class="vibe-preview">
<div class="text-center"> <div class="text-center">
@ -164,33 +167,18 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<p>A micro-site generated with the <span class="badge bg-secondary"><?php echo htmlspecialchars($vibe); ?></span> vibe.</p> <p>A micro-site generated with the <span class="badge bg-secondary"><?php echo htmlspecialchars($vibe); ?></span> vibe.</p>
</div> </div>
<div class="row mt-5"> <div class="row mt-5">
<div class="col-md-4"> <div class="col-md-4"><div class="card"><div class="card-body"><h5 class="card-title">Feature One</h5><p class="card-text">This is a sample card.</p></div></div></div>
<div class="card"> <div class="col-md-4"><div class="card"><div class="card-body"><h5 class="card-title">Feature Two</h5><p class="card-text">Styles are from the vibe.</p></div></div></div>
<div class="card-body"> <div class="col-md-4"><div class="card"><div class="card-body"><h5 class="card-title">Feature Three</h5><p class="card-text">Save or start over.</p></div></div></div>
<h5 class="card-title">Feature One</h5>
<p class="card-text">This is a sample card showcasing the generated vibe.</p>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">Feature Two</h5>
<p class="card-text">The colors, fonts, and styles are all part of the vibe.</p>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">Feature Three</h5>
<p class="card-text">Click the button below to start over.</p>
</div>
</div>
</div>
</div> </div>
<div class="text-center mt-5"> <div class="text-center mt-5">
<a href="vibe.php" class="btn btn-secondary">Start Over</a> <form action="vibe.php" method="POST" class="d-inline">
<input type="hidden" name="action" value="save">
<input type="hidden" name="vibe" value="<?php echo htmlspecialchars($vibe); ?>">
<input type="hidden" name="keywords" value="<?php echo htmlspecialchars($keywords); ?>">
<button type="submit" class="btn btn-success btn-lg"><i class="bi bi-save"></i> Save Vibe</button>
</form>
<a href="vibe.php" class="btn btn-secondary btn-lg">Start Over</a>
</div> </div>
</div> </div>
<?php endif; ?> <?php endif; ?>
@ -199,9 +187,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
</main> </main>
<footer class="py-4 mt-auto bg-light"> <footer class="py-4 mt-auto bg-light">
<div class="container text-center"> <div class="container text-center"><p class="mb-0 text-muted">&copy; <?php echo date("Y"); ?> Flatlogic. All rights reserved.</p></div>
<p class="mb-0 text-muted">&copy; <?php echo date("Y"); ?> Flatlogic. All rights reserved.</p>
</div>
</footer> </footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>