v1
This commit is contained in:
parent
8baf2dc598
commit
8d321c93b4
24
assets/css/custom.css
Normal file
24
assets/css/custom.css
Normal file
@ -0,0 +1,24 @@
|
||||
body {
|
||||
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
font-family: Georgia, 'Times New Roman', Times, serif;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.post-card {
|
||||
background-color: #ffffff;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
|
||||
transition: transform 0.2s;
|
||||
}
|
||||
|
||||
.post-card:hover {
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
|
||||
.post-title {
|
||||
font-family: Georgia, 'Times New Roman', Times, serif;
|
||||
}
|
||||
50
db/setup.php
Normal file
50
db/setup.php
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
require_once 'config.php';
|
||||
|
||||
function setup_database() {
|
||||
$pdo = db();
|
||||
|
||||
$sql = <<<SQL
|
||||
CREATE TABLE IF NOT EXISTS posts (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
title VARCHAR(255) NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
author VARCHAR(255) NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
SQL;
|
||||
|
||||
$pdo->exec($sql);
|
||||
|
||||
// Check if posts table is empty
|
||||
$stmt = $pdo->query("SELECT COUNT(*) FROM posts");
|
||||
$postCount = $stmt->fetchColumn();
|
||||
|
||||
if ($postCount == 0) {
|
||||
$posts = [
|
||||
[
|
||||
'title' => 'The Future of Web Development',
|
||||
'content' => 'The web is constantly evolving. In this post, we explore the latest trends in web development, from serverless architectures to the rise of AI-powered tools. Stay ahead of the curve and learn what to expect in the coming years.',
|
||||
'author' => 'Jane Doe'
|
||||
],
|
||||
[
|
||||
'title' => 'A Guide to Mindful Coding',
|
||||
'content' => 'Coding can be stressful. This guide offers practical tips for staying focused, managing complexity, and writing better code through mindfulness. Learn how to bring a sense of calm and clarity to your development process.',
|
||||
'author' => 'John Smith'
|
||||
],
|
||||
[
|
||||
'title' => 'Mastering CSS Grid',
|
||||
'content' => 'CSS Grid is a powerful tool for creating complex layouts with ease. This tutorial walks you through the fundamentals of Grid, with practical examples and pro tips to help you master this essential CSS feature.',
|
||||
'author' => 'Emily White'
|
||||
]
|
||||
];
|
||||
|
||||
$stmt = $pdo->prepare("INSERT INTO posts (title, content, author) VALUES (?, ?, ?)");
|
||||
foreach ($posts as $post) {
|
||||
$stmt->execute([$post['title'], $post['content'], $post['author']]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setup_database();
|
||||
?>
|
||||
7
footer.php
Normal file
7
footer.php
Normal file
@ -0,0 +1,7 @@
|
||||
</main>
|
||||
<footer class="bg-light text-center p-3 mt-5">
|
||||
<p>© <?php echo date("Y"); ?> Clean Blog. All Rights Reserved.</p>
|
||||
</footer>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
18
header.php
Normal file
18
header.php
Normal file
@ -0,0 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title><?php echo htmlspecialchars($page_title ?? 'Clean Blog'); ?></title>
|
||||
<meta name="description" content="<?php echo htmlspecialchars($page_description ?? 'A clean blog to publish updates and articles.'); ?>">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/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?v=<?php echo time(); ?>">
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="index.php">Clean Blog</a>
|
||||
</div>
|
||||
</nav>
|
||||
<main class="container mt-4">
|
||||
171
index.php
171
index.php
@ -1,150 +1,27 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
@ini_set('display_errors', '1');
|
||||
@error_reporting(E_ALL);
|
||||
@date_default_timezone_set('UTC');
|
||||
require_once 'db/config.php';
|
||||
require_once 'db/setup.php';
|
||||
|
||||
$phpVersion = PHP_VERSION;
|
||||
$now = date('Y-m-d H:i:s');
|
||||
$page_title = 'Home - Clean Blog';
|
||||
include 'header.php';
|
||||
|
||||
$pdo = db();
|
||||
$stmt = $pdo->query("SELECT * FROM posts ORDER BY created_at DESC");
|
||||
$posts = $stmt->fetchAll();
|
||||
?>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>New Style</title>
|
||||
<?php
|
||||
// Read project preview data from environment
|
||||
$projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? '';
|
||||
$projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
|
||||
?>
|
||||
<?php if ($projectDescription): ?>
|
||||
<!-- Meta description -->
|
||||
<meta name="description" content='<?= htmlspecialchars($projectDescription) ?>' />
|
||||
<!-- Open Graph meta tags -->
|
||||
<meta property="og:description" content="<?= htmlspecialchars($projectDescription) ?>" />
|
||||
<!-- Twitter meta tags -->
|
||||
<meta property="twitter:description" content="<?= htmlspecialchars($projectDescription) ?>" />
|
||||
<?php endif; ?>
|
||||
<?php if ($projectImageUrl): ?>
|
||||
<!-- Open Graph image -->
|
||||
<meta property="og:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
|
||||
<!-- Twitter image -->
|
||||
<meta property="twitter:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
|
||||
<?php endif; ?>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root {
|
||||
--bg-color-start: #6a11cb;
|
||||
--bg-color-end: #2575fc;
|
||||
--text-color: #ffffff;
|
||||
--card-bg-color: rgba(255, 255, 255, 0.01);
|
||||
--card-border-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: 'Inter', sans-serif;
|
||||
background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end));
|
||||
color: var(--text-color);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
min-height: 100vh;
|
||||
text-align: center;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
body::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><path d="M-10 10L110 10M10 -10L10 110" stroke-width="1" stroke="rgba(255,255,255,0.05)"/></svg>');
|
||||
animation: bg-pan 20s linear infinite;
|
||||
z-index: -1;
|
||||
}
|
||||
@keyframes bg-pan {
|
||||
0% { background-position: 0% 0%; }
|
||||
100% { background-position: 100% 100%; }
|
||||
}
|
||||
main {
|
||||
padding: 2rem;
|
||||
}
|
||||
.card {
|
||||
background: var(--card-bg-color);
|
||||
border: 1px solid var(--card-border-color);
|
||||
border-radius: 16px;
|
||||
padding: 2rem;
|
||||
backdrop-filter: blur(20px);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.loader {
|
||||
margin: 1.25rem auto 1.25rem;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
border: 3px solid rgba(255, 255, 255, 0.25);
|
||||
border-top-color: #fff;
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
@keyframes spin {
|
||||
from { transform: rotate(0deg); }
|
||||
to { transform: rotate(360deg); }
|
||||
}
|
||||
.hint {
|
||||
opacity: 0.9;
|
||||
}
|
||||
.sr-only {
|
||||
position: absolute;
|
||||
width: 1px; height: 1px;
|
||||
padding: 0; margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap; border: 0;
|
||||
}
|
||||
h1 {
|
||||
font-size: 3rem;
|
||||
font-weight: 700;
|
||||
margin: 0 0 1rem;
|
||||
letter-spacing: -1px;
|
||||
}
|
||||
p {
|
||||
margin: 0.5rem 0;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
code {
|
||||
background: rgba(0,0,0,0.2);
|
||||
padding: 2px 6px;
|
||||
border-radius: 4px;
|
||||
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
||||
}
|
||||
footer {
|
||||
position: absolute;
|
||||
bottom: 1rem;
|
||||
font-size: 0.8rem;
|
||||
opacity: 0.7;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<div class="card">
|
||||
<h1>Analyzing your requirements and generating your website…</h1>
|
||||
<div class="loader" role="status" aria-live="polite" aria-label="Applying initial changes">
|
||||
<span class="sr-only">Loading…</span>
|
||||
</div>
|
||||
<p class="hint"><?= ($_SERVER['HTTP_HOST'] ?? '') === 'appwizzy.com' ? 'AppWizzy' : 'Flatlogic' ?> AI is collecting your requirements and applying the first changes.</p>
|
||||
<p class="hint">This page will update automatically as the plan is implemented.</p>
|
||||
<p>Runtime: PHP <code><?= htmlspecialchars($phpVersion) ?></code> — UTC <code><?= htmlspecialchars($now) ?></code></p>
|
||||
</div>
|
||||
</main>
|
||||
<footer>
|
||||
Page updated: <?= htmlspecialchars($now) ?> (UTC)
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<div class="row">
|
||||
<?php foreach ($posts as $post): ?>
|
||||
<div class="col-md-4 mb-4">
|
||||
<div class="card post-card h-100">
|
||||
<div class="card-body d-flex flex-column">
|
||||
<h5 class="card-title post-title"><?php echo htmlspecialchars($post['title']); ?></h5>
|
||||
<p class="card-text flex-grow-1"><?php echo htmlspecialchars(substr($post['content'], 0, 100)); ?>...</p>
|
||||
<a href="post.php?id=<?php echo $post['id']; ?>" class="btn btn-primary mt-auto">Read More</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
34
post.php
Normal file
34
post.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
require_once 'db/config.php';
|
||||
|
||||
$pdo = db();
|
||||
$stmt = $pdo->prepare("SELECT * FROM posts WHERE id = ?");
|
||||
$stmt->execute([$_GET['id'] ?? 0]);
|
||||
$post = $stmt->fetch();
|
||||
|
||||
if (!$post) {
|
||||
header("Location: index.php");
|
||||
exit;
|
||||
}
|
||||
|
||||
$page_title = htmlspecialchars($post['title']);
|
||||
$page_description = htmlspecialchars(substr($post['content'], 0, 160));
|
||||
|
||||
include 'header.php';
|
||||
?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8 offset-md-2">
|
||||
<div class="card post-card">
|
||||
<div class="card-body">
|
||||
<h1 class="card-title post-title"><?php echo htmlspecialchars($post['title']); ?></h1>
|
||||
<p class="text-muted">By <?php echo htmlspecialchars($post['author']); ?> on <?php echo date("F j, Y", strtotime($post['created_at'])); ?></p>
|
||||
<p class="card-text"><?php echo nl2br(htmlspecialchars($post['content'])); ?></p>
|
||||
</div>
|
||||
</div>
|
||||
<a href="index.php" class="btn btn-secondary mt-3"><i class="bi bi-arrow-left"></i> Back to Home</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
Loading…
x
Reference in New Issue
Block a user