diff --git a/api/import.php b/api/import.php
new file mode 100644
index 0000000..711f5c5
--- /dev/null
+++ b/api/import.php
@@ -0,0 +1,112 @@
+ false,
+ 'files' => [],
+ 'errors' => []
+];
+
+function getUploadErrorMessage($errorCode) {
+ switch ($errorCode) {
+ case UPLOAD_ERR_INI_SIZE:
+ return 'The uploaded file exceeds the upload_max_filesize directive in php.ini.';
+ case UPLOAD_ERR_FORM_SIZE:
+ return 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.';
+ case UPLOAD_ERR_PARTIAL:
+ return 'The uploaded file was only partially uploaded.';
+ case UPLOAD_ERR_NO_FILE:
+ return 'No file was uploaded.';
+ case UPLOAD_ERR_NO_TMP_DIR:
+ return 'Missing a temporary folder.';
+ case UPLOAD_ERR_CANT_WRITE:
+ return 'Failed to write file to disk.';
+ case UPLOAD_ERR_EXTENSION:
+ return 'A PHP extension stopped the file upload.';
+ default:
+ return 'Unknown upload error.';
+ }
+}
+
+if (!isset($_FILES['photos'])) {
+ $response['errors'][] = 'No files were sent. The key "photos" is missing from the request.';
+ echo json_encode($response);
+ exit;
+}
+
+$upload_dir = __DIR__ . '/../assets/uploads/';
+if (!is_dir($upload_dir)) {
+ if (!mkdir($upload_dir, 0775, true)) {
+ $response['errors'][] = 'Failed to create upload directory: ' . $upload_dir;
+ echo json_encode($response);
+ exit;
+ }
+}
+
+if (!is_writable($upload_dir)) {
+ $response['errors'][] = 'The upload directory is not writable: ' . $upload_dir;
+ echo json_encode($response);
+ exit;
+}
+
+$files = $_FILES['photos'];
+$file_count = count($files['name']);
+$successful_uploads = 0;
+
+try {
+ $pdo = db();
+ $stmt = $pdo->prepare(
+ 'INSERT INTO photos (filename, filepath, filesize) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE updated_at = CURRENT_TIMESTAMP'
+ );
+} catch (PDOException $e) {
+ $response['errors'][] = 'Database connection failed: ' . $e->getMessage();
+ error_log('DB Connection Error: ' . $e->getMessage());
+ echo json_encode($response);
+ exit;
+}
+
+
+for ($i = 0; $i < $file_count; $i++) {
+ $errorCode = $files['error'][$i];
+ $filename = basename($files['name'][$i]);
+
+ if ($errorCode !== UPLOAD_ERR_OK) {
+ $response['errors'][] = "Error uploading '$filename': " . getUploadErrorMessage($errorCode);
+ continue;
+ }
+
+ $filepath = $upload_dir . $filename;
+ $relative_path = 'assets/uploads/' . $filename;
+
+ if (!move_uploaded_file($files['tmp_name'][$i], $filepath)) {
+ $response['errors'][] = "Failed to move uploaded file '$filename'. Check permissions and paths.";
+ continue;
+ }
+
+ try {
+ $stmt->execute([$filename, $relative_path, $files['size'][$i]]);
+ $response['files'][] = [
+ 'filename' => $filename,
+ 'filepath' => $relative_path
+ ];
+ $successful_uploads++;
+ } catch (PDOException $e) {
+ $response['errors'][] = "Failed to save file '$filename' to database: " . $e->getMessage();
+ error_log("DB Insert Error for $filename: " . $e->getMessage());
+ // Optionally, delete the file if DB insert fails
+ // unlink($filepath);
+ }
+}
+
+if ($successful_uploads > 0) {
+ $response['success'] = true;
+}
+
+if ($successful_uploads < $file_count) {
+ $response['success'] = false; // Mark as failure if any file failed
+}
+
+
+echo json_encode($response);
\ No newline at end of file
diff --git a/api/pexels.php b/api/pexels.php
new file mode 100644
index 0000000..77629b9
--- /dev/null
+++ b/api/pexels.php
@@ -0,0 +1,33 @@
+ 'assets/images/pexels/'.$p['id'].'.jpg',
+ 'photographer' => $p['photographer'] ?? 'Unknown',
+ 'photographer_url' => $p['photographer_url'] ?? '',
+ 'alt' => $p['alt'] ?? 'Photo by '.$p['photographer'],
+ ];
+ }
+ } else {
+ // Fallback: Picsum
+ $out[] = [
+ 'src' => 'https://picsum.photos/600/600',
+ 'photographer' => 'Random Picsum',
+ 'photographer_url' => 'https://picsum.photos/',
+ 'alt' => 'Random placeholder image'
+ ];
+ }
+}
+echo json_encode($out);
diff --git a/assets/css/custom.css b/assets/css/custom.css
new file mode 100644
index 0000000..3e01cc1
--- /dev/null
+++ b/assets/css/custom.css
@@ -0,0 +1,113 @@
+/* General Styles */
+body {
+ font-family: 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
+ transition: background-color 0.3s, color 0.3s;
+}
+
+:root {
+ --light-bg: #FFFFFF;
+ --light-surface: #F8F9FA;
+ --light-text-primary: #212529;
+ --light-text-secondary: #6C757D;
+ --dark-bg: #121212;
+ --dark-surface: #1E1E1E;
+ --dark-text-primary: #E9ECEF;
+ --dark-text-secondary: #ADB5BD;
+ --accent-color: #0D6EFD;
+}
+
+body.light-theme {
+ background-color: var(--light-bg);
+ color: var(--light-text-primary);
+}
+
+body.dark-theme {
+ background-color: var(--dark-bg);
+ color: var(--dark-text-primary);
+}
+
+/* Layout */
+.main-container {
+ display: flex;
+ height: 100vh;
+}
+
+.sidebar {
+ width: 250px;
+ flex-shrink: 0;
+ padding: 1rem;
+ border-right: 1px solid #dee2e6;
+}
+
+body.light-theme .sidebar {
+ background-color: var(--light-surface);
+ border-right: 1px solid #dee2e6;
+}
+
+body.dark-theme .sidebar {
+ background-color: var(--dark-surface);
+ border-right: 1px solid #343a40;
+}
+
+.main-content {
+ flex-grow: 1;
+ padding: 1rem;
+ overflow-y: auto;
+}
+
+/* Sidebar */
+.sidebar h4 {
+ font-size: 1.1rem;
+ font-weight: 600;
+}
+
+.sidebar .nav-link {
+ color: var(--light-text-secondary);
+}
+
+body.dark-theme .sidebar .nav-link {
+ color: var(--dark-text-secondary);
+}
+
+.sidebar .nav-link.active,
+.sidebar .nav-link:hover {
+ color: var(--accent-color);
+}
+
+/* Header */
+.header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 1rem;
+}
+
+/* Search Bar */
+.search-bar {
+ flex-grow: 1;
+ margin-right: 1rem;
+}
+
+/* Gallery */
+.photo-gallery {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+ gap: 1rem;
+}
+
+.photo-item img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ border-radius: 0.25rem;
+ transition: transform 0.2s;
+}
+
+.photo-item img:hover {
+ transform: scale(1.05);
+}
+
+/* Theme switcher */
+.theme-switcher {
+ cursor: pointer;
+}
diff --git a/assets/images/pexels/1020010.jpg b/assets/images/pexels/1020010.jpg
new file mode 100644
index 0000000..ad28494
Binary files /dev/null and b/assets/images/pexels/1020010.jpg differ
diff --git a/assets/images/pexels/1055272.jpg b/assets/images/pexels/1055272.jpg
new file mode 100644
index 0000000..b4fa113
Binary files /dev/null and b/assets/images/pexels/1055272.jpg differ
diff --git a/assets/images/pexels/105808.jpg b/assets/images/pexels/105808.jpg
new file mode 100644
index 0000000..a4f9f13
Binary files /dev/null and b/assets/images/pexels/105808.jpg differ
diff --git a/assets/images/pexels/1115804.jpg b/assets/images/pexels/1115804.jpg
new file mode 100644
index 0000000..f4240db
Binary files /dev/null and b/assets/images/pexels/1115804.jpg differ
diff --git a/assets/images/pexels/1292496.jpg b/assets/images/pexels/1292496.jpg
new file mode 100644
index 0000000..2c1cf60
Binary files /dev/null and b/assets/images/pexels/1292496.jpg differ
diff --git a/assets/images/pexels/130574.jpg b/assets/images/pexels/130574.jpg
new file mode 100644
index 0000000..45f706a
Binary files /dev/null and b/assets/images/pexels/130574.jpg differ
diff --git a/assets/images/pexels/14229638.jpg b/assets/images/pexels/14229638.jpg
new file mode 100644
index 0000000..64b0433
Binary files /dev/null and b/assets/images/pexels/14229638.jpg differ
diff --git a/assets/images/pexels/1454797.jpg b/assets/images/pexels/1454797.jpg
new file mode 100644
index 0000000..7f85c5e
Binary files /dev/null and b/assets/images/pexels/1454797.jpg differ
diff --git a/assets/images/pexels/1520760.jpg b/assets/images/pexels/1520760.jpg
new file mode 100644
index 0000000..015ec6f
Binary files /dev/null and b/assets/images/pexels/1520760.jpg differ
diff --git a/assets/images/pexels/158330.jpg b/assets/images/pexels/158330.jpg
new file mode 100644
index 0000000..2521059
Binary files /dev/null and b/assets/images/pexels/158330.jpg differ
diff --git a/assets/images/pexels/1592384.jpg b/assets/images/pexels/1592384.jpg
new file mode 100644
index 0000000..0d4673d
Binary files /dev/null and b/assets/images/pexels/1592384.jpg differ
diff --git a/assets/images/pexels/1617366.jpg b/assets/images/pexels/1617366.jpg
new file mode 100644
index 0000000..6f7537b
Binary files /dev/null and b/assets/images/pexels/1617366.jpg differ
diff --git a/assets/images/pexels/162396.jpg b/assets/images/pexels/162396.jpg
new file mode 100644
index 0000000..20cb474
Binary files /dev/null and b/assets/images/pexels/162396.jpg differ
diff --git a/assets/images/pexels/1715092.jpg b/assets/images/pexels/1715092.jpg
new file mode 100644
index 0000000..fed5b2f
Binary files /dev/null and b/assets/images/pexels/1715092.jpg differ
diff --git a/assets/images/pexels/189361.jpg b/assets/images/pexels/189361.jpg
new file mode 100644
index 0000000..d4dfada
Binary files /dev/null and b/assets/images/pexels/189361.jpg differ
diff --git a/assets/images/pexels/189396.jpg b/assets/images/pexels/189396.jpg
new file mode 100644
index 0000000..9dd50ed
Binary files /dev/null and b/assets/images/pexels/189396.jpg differ
diff --git a/assets/images/pexels/2100650.jpg b/assets/images/pexels/2100650.jpg
new file mode 100644
index 0000000..42f542e
Binary files /dev/null and b/assets/images/pexels/2100650.jpg differ
diff --git a/assets/images/pexels/2173872.jpg b/assets/images/pexels/2173872.jpg
new file mode 100644
index 0000000..b6fc324
Binary files /dev/null and b/assets/images/pexels/2173872.jpg differ
diff --git a/assets/images/pexels/2393835.jpg b/assets/images/pexels/2393835.jpg
new file mode 100644
index 0000000..78c07b8
Binary files /dev/null and b/assets/images/pexels/2393835.jpg differ
diff --git a/assets/images/pexels/2437286.jpg b/assets/images/pexels/2437286.jpg
new file mode 100644
index 0000000..864e0be
Binary files /dev/null and b/assets/images/pexels/2437286.jpg differ
diff --git a/assets/images/pexels/259239.jpg b/assets/images/pexels/259239.jpg
new file mode 100644
index 0000000..d025d94
Binary files /dev/null and b/assets/images/pexels/259239.jpg differ
diff --git a/assets/images/pexels/2762939.jpg b/assets/images/pexels/2762939.jpg
new file mode 100644
index 0000000..e0e0944
Binary files /dev/null and b/assets/images/pexels/2762939.jpg differ
diff --git a/assets/images/pexels/288100.jpg b/assets/images/pexels/288100.jpg
new file mode 100644
index 0000000..70891a8
Binary files /dev/null and b/assets/images/pexels/288100.jpg differ
diff --git a/assets/images/pexels/290275.jpg b/assets/images/pexels/290275.jpg
new file mode 100644
index 0000000..7b3ff63
Binary files /dev/null and b/assets/images/pexels/290275.jpg differ
diff --git a/assets/images/pexels/34791005.jpg b/assets/images/pexels/34791005.jpg
new file mode 100644
index 0000000..f2b1ef7
Binary files /dev/null and b/assets/images/pexels/34791005.jpg differ
diff --git a/assets/images/pexels/3876394.jpg b/assets/images/pexels/3876394.jpg
new file mode 100644
index 0000000..82f8c8f
Binary files /dev/null and b/assets/images/pexels/3876394.jpg differ
diff --git a/assets/images/pexels/3944311.jpg b/assets/images/pexels/3944311.jpg
new file mode 100644
index 0000000..b393b29
Binary files /dev/null and b/assets/images/pexels/3944311.jpg differ
diff --git a/assets/images/pexels/399772.jpg b/assets/images/pexels/399772.jpg
new file mode 100644
index 0000000..28bfff9
Binary files /dev/null and b/assets/images/pexels/399772.jpg differ
diff --git a/assets/images/pexels/41953.jpg b/assets/images/pexels/41953.jpg
new file mode 100644
index 0000000..03585bd
Binary files /dev/null and b/assets/images/pexels/41953.jpg differ
diff --git a/assets/images/pexels/450038.jpg b/assets/images/pexels/450038.jpg
new file mode 100644
index 0000000..b055499
Binary files /dev/null and b/assets/images/pexels/450038.jpg differ
diff --git a/assets/images/pexels/582070.jpg b/assets/images/pexels/582070.jpg
new file mode 100644
index 0000000..581259b
Binary files /dev/null and b/assets/images/pexels/582070.jpg differ
diff --git a/assets/images/pexels/694587.jpg b/assets/images/pexels/694587.jpg
new file mode 100644
index 0000000..cea152f
Binary files /dev/null and b/assets/images/pexels/694587.jpg differ
diff --git a/assets/images/pexels/698532.jpg b/assets/images/pexels/698532.jpg
new file mode 100644
index 0000000..71065a6
Binary files /dev/null and b/assets/images/pexels/698532.jpg differ
diff --git a/assets/images/pexels/772478.jpg b/assets/images/pexels/772478.jpg
new file mode 100644
index 0000000..f78cbae
Binary files /dev/null and b/assets/images/pexels/772478.jpg differ
diff --git a/assets/images/pexels/789555.jpg b/assets/images/pexels/789555.jpg
new file mode 100644
index 0000000..91613dc
Binary files /dev/null and b/assets/images/pexels/789555.jpg differ
diff --git a/assets/images/pexels/793763.jpg b/assets/images/pexels/793763.jpg
new file mode 100644
index 0000000..c5ec352
Binary files /dev/null and b/assets/images/pexels/793763.jpg differ
diff --git a/assets/images/pexels/8218.jpg b/assets/images/pexels/8218.jpg
new file mode 100644
index 0000000..0cde903
Binary files /dev/null and b/assets/images/pexels/8218.jpg differ
diff --git a/assets/images/pexels/831889.jpg b/assets/images/pexels/831889.jpg
new file mode 100644
index 0000000..7cb8bd1
Binary files /dev/null and b/assets/images/pexels/831889.jpg differ
diff --git a/assets/images/pexels/87009.jpg b/assets/images/pexels/87009.jpg
new file mode 100644
index 0000000..19539a4
Binary files /dev/null and b/assets/images/pexels/87009.jpg differ
diff --git a/assets/images/pexels/87651.jpg b/assets/images/pexels/87651.jpg
new file mode 100644
index 0000000..49d2e9b
Binary files /dev/null and b/assets/images/pexels/87651.jpg differ
diff --git a/assets/images/pexels/892649.jpg b/assets/images/pexels/892649.jpg
new file mode 100644
index 0000000..1447a47
Binary files /dev/null and b/assets/images/pexels/892649.jpg differ
diff --git a/assets/images/pexels/938580.jpg b/assets/images/pexels/938580.jpg
new file mode 100644
index 0000000..e994ee2
Binary files /dev/null and b/assets/images/pexels/938580.jpg differ
diff --git a/assets/images/pexels/938582.jpg b/assets/images/pexels/938582.jpg
new file mode 100644
index 0000000..bb3435a
Binary files /dev/null and b/assets/images/pexels/938582.jpg differ
diff --git a/assets/js/main.js b/assets/js/main.js
new file mode 100644
index 0000000..52232de
--- /dev/null
+++ b/assets/js/main.js
@@ -0,0 +1,92 @@
+document.addEventListener('DOMContentLoaded', () => {
+ const themeSwitcher = document.getElementById('theme-switcher');
+ const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+
+ if (currentTheme) {
+ document.body.classList.add(currentTheme);
+ if (currentTheme === 'dark-theme') {
+ themeSwitcher.innerHTML = '';
+ } else {
+ themeSwitcher.innerHTML = '';
+ }
+ } else {
+ // Default to light
+ document.body.classList.add('light-theme');
+ themeSwitcher.innerHTML = '';
+ }
+
+ themeSwitcher.addEventListener('click', () => {
+ if (document.body.classList.contains('dark-theme')) {
+ document.body.classList.remove('dark-theme');
+ document.body.classList.add('light-theme');
+ localStorage.setItem('theme', 'light-theme');
+ themeSwitcher.innerHTML = '';
+ } else {
+ document.body.classList.remove('light-theme');
+ document.body.classList.add('dark-theme');
+ localStorage.setItem('theme', 'dark-theme');
+ themeSwitcher.innerHTML = '';
+ }
+ });
+
+ // Folder import functionality
+ const importFolderBtn = document.getElementById('import-folder-btn');
+ const folderInput = document.getElementById('folder-input');
+ const photoGallery = document.querySelector('.photo-gallery');
+
+ if (importFolderBtn && folderInput && photoGallery) {
+ importFolderBtn.addEventListener('click', () => {
+ folderInput.click();
+ });
+
+ folderInput.addEventListener('change', (event) => {
+ const files = event.target.files;
+ if (files.length > 0) {
+ const formData = new FormData();
+ const imageFiles = Array.from(files).filter(file => file.type.startsWith('image/'));
+
+ if (imageFiles.length > 0) {
+ imageFiles.forEach(file => {
+ formData.append('photos[]', file);
+ });
+
+ // Show a loading indicator
+ photoGallery.innerHTML = '
';
+
+ fetch('api/import.php', {
+ method: 'POST',
+ body: formData
+ })
+ .then(response => response.json())
+ .then(data => {
+ console.log('Server response:', data); // Log the full response
+ photoGallery.innerHTML = ''; // Clear loading indicator
+
+ if (data.success && data.files.length > 0) {
+ // On success, refresh the page to show all images from the DB
+ window.location.reload();
+ } else {
+ let errorMessages = 'Upload failed. Please try again.';
+ if (data.errors && data.errors.length > 0) {
+ // Create a list of error messages
+ errorMessages = '';
+ data.errors.forEach(err => {
+ errorMessages += `- ${err}
`;
+ });
+ errorMessages += '
';
+ }
+ photoGallery.innerHTML = `Upload Failed:
${errorMessages}
`;
+ }
+ })
+ .catch(error => {
+ console.error('Error uploading files:', error);
+ photoGallery.innerHTML = 'An error occurred during upload. Check the browser console for details.
';
+ });
+
+ } else {
+ photoGallery.innerHTML = 'No images found in the selected folder.
';
+ }
+ }
+ });
+ }
+});
diff --git a/assets/uploads/Screenshot 2025-07-22 211239.png b/assets/uploads/Screenshot 2025-07-22 211239.png
new file mode 100644
index 0000000..54d7dde
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-22 211239.png differ
diff --git a/assets/uploads/Screenshot 2025-07-22 235340.png b/assets/uploads/Screenshot 2025-07-22 235340.png
new file mode 100644
index 0000000..44da22d
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-22 235340.png differ
diff --git a/assets/uploads/Screenshot 2025-07-23 005726.png b/assets/uploads/Screenshot 2025-07-23 005726.png
new file mode 100644
index 0000000..3d341ef
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-23 005726.png differ
diff --git a/assets/uploads/Screenshot 2025-07-24 013427.png b/assets/uploads/Screenshot 2025-07-24 013427.png
new file mode 100644
index 0000000..95dcf4a
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-24 013427.png differ
diff --git a/assets/uploads/Screenshot 2025-07-25 193641.png b/assets/uploads/Screenshot 2025-07-25 193641.png
new file mode 100644
index 0000000..93b1ad0
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-25 193641.png differ
diff --git a/assets/uploads/Screenshot 2025-07-25 194057.png b/assets/uploads/Screenshot 2025-07-25 194057.png
new file mode 100644
index 0000000..2421a5d
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-25 194057.png differ
diff --git a/assets/uploads/Screenshot 2025-07-25 194137.png b/assets/uploads/Screenshot 2025-07-25 194137.png
new file mode 100644
index 0000000..a6ce5aa
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-25 194137.png differ
diff --git a/assets/uploads/Screenshot 2025-07-26 185850.png b/assets/uploads/Screenshot 2025-07-26 185850.png
new file mode 100644
index 0000000..6114640
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-26 185850.png differ
diff --git a/assets/uploads/Screenshot 2025-07-26 190723.png b/assets/uploads/Screenshot 2025-07-26 190723.png
new file mode 100644
index 0000000..3a1097b
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-26 190723.png differ
diff --git a/assets/uploads/Screenshot 2025-07-27 234510.png b/assets/uploads/Screenshot 2025-07-27 234510.png
new file mode 100644
index 0000000..4f4e5a2
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-27 234510.png differ
diff --git a/assets/uploads/Screenshot 2025-07-29 223254.png b/assets/uploads/Screenshot 2025-07-29 223254.png
new file mode 100644
index 0000000..52306df
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-29 223254.png differ
diff --git a/assets/uploads/Screenshot 2025-07-29 223411.png b/assets/uploads/Screenshot 2025-07-29 223411.png
new file mode 100644
index 0000000..bade089
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-29 223411.png differ
diff --git a/assets/uploads/Screenshot 2025-07-29 223436.png b/assets/uploads/Screenshot 2025-07-29 223436.png
new file mode 100644
index 0000000..027e513
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-29 223436.png differ
diff --git a/assets/uploads/Screenshot 2025-07-30 032808.png b/assets/uploads/Screenshot 2025-07-30 032808.png
new file mode 100644
index 0000000..8bd2583
Binary files /dev/null and b/assets/uploads/Screenshot 2025-07-30 032808.png differ
diff --git a/assets/uploads/Screenshot 2025-08-02 154654.png b/assets/uploads/Screenshot 2025-08-02 154654.png
new file mode 100644
index 0000000..b3c31bf
Binary files /dev/null and b/assets/uploads/Screenshot 2025-08-02 154654.png differ
diff --git a/assets/uploads/Screenshot 2025-08-08 022129.png b/assets/uploads/Screenshot 2025-08-08 022129.png
new file mode 100644
index 0000000..7337b98
Binary files /dev/null and b/assets/uploads/Screenshot 2025-08-08 022129.png differ
diff --git a/assets/uploads/Screenshot 2025-08-10 223842.png b/assets/uploads/Screenshot 2025-08-10 223842.png
new file mode 100644
index 0000000..f0812d7
Binary files /dev/null and b/assets/uploads/Screenshot 2025-08-10 223842.png differ
diff --git a/assets/uploads/Screenshot 2025-08-10 224208.png b/assets/uploads/Screenshot 2025-08-10 224208.png
new file mode 100644
index 0000000..33ff0ef
Binary files /dev/null and b/assets/uploads/Screenshot 2025-08-10 224208.png differ
diff --git a/assets/uploads/Screenshot 2025-08-11 164103.png b/assets/uploads/Screenshot 2025-08-11 164103.png
new file mode 100644
index 0000000..2627ea1
Binary files /dev/null and b/assets/uploads/Screenshot 2025-08-11 164103.png differ
diff --git a/assets/uploads/Screenshot 2025-08-25 003007.png b/assets/uploads/Screenshot 2025-08-25 003007.png
new file mode 100644
index 0000000..e25b3d6
Binary files /dev/null and b/assets/uploads/Screenshot 2025-08-25 003007.png differ
diff --git a/db/migrations/001_create_photos_table.php b/db/migrations/001_create_photos_table.php
new file mode 100644
index 0000000..03c9b6f
--- /dev/null
+++ b/db/migrations/001_create_photos_table.php
@@ -0,0 +1,24 @@
+exec($sql);
+ echo "Table 'photos' created successfully." . PHP_EOL;
+} catch (PDOException $e) {
+ die("DB ERROR: " . $e->getMessage());
+}
diff --git a/includes/pexels.php b/includes/pexels.php
new file mode 100644
index 0000000..92a207a
--- /dev/null
+++ b/includes/pexels.php
@@ -0,0 +1,26 @@
+ 0 ? $k : 'Vc99rnmOhHhJAbgGQoKLZtsaIVfkeownoQNbTj78VemUjKh08ZYRbf18';
+}
+function pexels_get($url) {
+ $ch = curl_init();
+ curl_setopt_array($ch, [
+ CURLOPT_URL => $url,
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_HTTPHEADER => [ 'Authorization: '. pexels_key() ],
+ CURLOPT_TIMEOUT => 15,
+ ]);
+ $resp = curl_exec($ch);
+ $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ curl_close($ch);
+ if ($code >= 200 && $code < 300 && $resp) return json_decode($resp, true);
+ return null;
+}
+function download_to($srcUrl, $destPath) {
+ $data = file_get_contents($srcUrl);
+ if ($data === false) return false;
+ if (!is_dir(dirname($destPath))) mkdir(dirname($destPath), 0775, true);
+ return file_put_contents($destPath, $data) !== false;
+}
\ No newline at end of file
diff --git a/index.php b/index.php
index 7205f3d..07fc260 100644
--- a/index.php
+++ b/index.php
@@ -1,150 +1,108 @@
query('SELECT * FROM photos ORDER BY created_at DESC');
+ $images = $stmt->fetchAll();
+} catch (PDOException $e) {
+ // Handle DB error
+ $images = [];
+ // You might want to log an error here
+}
-$phpVersion = PHP_VERSION;
-$now = date('Y-m-d H:i:s');
?>
-
+
-
-
- New Style
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
Analyzing your requirements and generating your website…
-
- Loading…
-
-
= ($_SERVER['HTTP_HOST'] ?? '') === 'appwizzy.com' ? 'AppWizzy' : 'Flatlogic' ?> AI is collecting your requirements and applying the first changes.
-
This page will update automatically as the plan is implemented.
-
Runtime: PHP = htmlspecialchars($phpVersion) ?> — UTC = htmlspecialchars($now) ?>
+
+
+
+
+
+
+
+
+
+
+
+
![<?php echo htmlspecialchars($image['filename']); ?>](<?php echo htmlspecialchars($image['filepath']); ?>)
+
+
+
+
No images found. Please import photos to see them here.
+
+
+
+
-
-
+
+
+