kite-menu

This commit is contained in:
2026-06-11 13:38:37 +03:00
parent 60b48ca5e8
commit 18dabd1eb2
6 changed files with 167 additions and 5 deletions
+13 -4
View File
@@ -80,7 +80,7 @@ export default function MenuClient({ initialCategories, siteSettings }: { initia
backgroundPosition: "center" backgroundPosition: "center"
}} }}
/> />
{/* Dark overlay to make text readable */} {/* Dark overlay to make text readable */}
<div className="absolute inset-0 z-0 bg-gradient-to-b from-black/60 via-black/40 to-black/80" /> <div className="absolute inset-0 z-0 bg-gradient-to-b from-black/60 via-black/40 to-black/80" />
@@ -101,7 +101,7 @@ export default function MenuClient({ initialCategories, siteSettings }: { initia
{/* Logo */} {/* Logo */}
<img <img
src="/logo.png" src="/logo.avif"
alt="Moy Beach" alt="Moy Beach"
className="w-64 md:w-80 object-contain drop-shadow-lg" className="w-64 md:w-80 object-contain drop-shadow-lg"
style={{ filter: 'brightness(0) invert(1)' }} style={{ filter: 'brightness(0) invert(1)' }}
@@ -194,7 +194,7 @@ export default function MenuClient({ initialCategories, siteSettings }: { initia
<div className="flex flex-col items-center gap-1"> <div className="flex flex-col items-center gap-1">
{/* Footer Logo */} {/* Footer Logo */}
<img <img
src="/logo.png" src="/logo.avif"
alt="Moy Beach" alt="Moy Beach"
className="w-36 object-contain opacity-70 mb-2" className="w-36 object-contain opacity-70 mb-2"
style={{ filter: 'brightness(0) invert(1)' }} style={{ filter: 'brightness(0) invert(1)' }}
@@ -217,8 +217,17 @@ export default function MenuClient({ initialCategories, siteSettings }: { initia
className="text-[11px] font-sans" className="text-[11px] font-sans"
style={{ color: "rgba(120,90,60,0.5)" }} style={{ color: "rgba(120,90,60,0.5)" }}
> >
© 2026 Moy Beach. Tüm hakları saklıdır. © 2026 KiteBeach Akyaka. Tüm hakları saklıdır.
</p> </p>
<a
href="https://ayris.tech"
target="_blank"
rel="noopener noreferrer"
className="text-[10px] font-sans mt-3 tracking-wide hover:opacity-80 transition-opacity"
style={{ color: "rgba(120,90,60,0.7)" }}
>
Created by ayris.tech
</a>
</div> </div>
</footer> </footer>
+1 -1
View File
@@ -29,7 +29,7 @@ export default function RootLayout({
}>) { }>) {
return ( return (
<html lang="tr" className={`${cormorant.variable} ${jakarta.variable} h-full`}> <html lang="tr" className={`${cormorant.variable} ${jakarta.variable} h-full`}>
<body className="min-h-full flex flex-col antialiased">{children}</body> <body className="min-h-full flex flex-col antialiased" suppressHydrationWarning>{children}</body>
</html> </html>
); );
} }
+39
View File
@@ -0,0 +1,39 @@
import pkg from 'pg';
import dotenv from 'dotenv';
import bcrypt from 'bcryptjs';
dotenv.config();
const { Client } = pkg;
async function main() {
const client = new Client({
connectionString: process.env.DATABASE_URL,
});
await client.connect();
const username = 'admin';
const plainPassword = 'password123';
const passwordHash = await bcrypt.hash(plainPassword, 10);
try {
// Delete existing admin if any
await client.query('DELETE FROM "users" WHERE "username" = $1', [username]);
await client.query(`
INSERT INTO "users" ("username", "password_hash", "role")
VALUES ($1, $2, $3)
`, [username, passwordHash, 'admin']);
console.log(`Successfully created admin user: ${username} / ${plainPassword}`);
} catch (e) {
console.error('Error creating admin:', e.message);
} finally {
await client.end();
}
}
main().catch(e => {
console.error(e);
process.exit(1);
});
+32
View File
@@ -0,0 +1,32 @@
import pkg from 'pg';
import dotenv from 'dotenv';
dotenv.config();
const { Client } = pkg;
async function main() {
const client = new Client({
connectionString: process.env.DATABASE_URL,
});
await client.connect();
const mockImageUrl = '/default-product.png';
try {
const result = await client.query(`
UPDATE "products"
SET "image_url" = $1
`, [mockImageUrl]);
console.log(`Successfully updated ${result.rowCount} products with a mock image.`);
} catch (e) {
console.error('Error updating products:', e.message);
} finally {
await client.end();
}
}
main().catch(e => {
console.error(e);
process.exit(1);
});
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

+82
View File
@@ -0,0 +1,82 @@
import fs from 'fs';
import pkg from 'pg';
import dotenv from 'dotenv';
dotenv.config();
const { Client } = pkg;
async function main() {
const client = new Client({
connectionString: process.env.DATABASE_URL,
});
await client.connect();
// Disable triggers to bypass foreign key checks temporarily
await client.query("SET session_replication_role = replica;");
const sql = fs.readFileSync('./sql/kitebeac_menu.sql', 'utf8');
const lines = sql.split('\n');
let currentInsert = '';
let inInsert = false;
let tableName = '';
try {
await client.query(`TRUNCATE TABLE "products", "categories", "users", "settings" RESTART IDENTITY CASCADE;`);
console.log('Truncated existing tables');
} catch (e) {
console.log('Truncate skipped or failed (possibly tables empty)', e.message);
}
for (let line of lines) {
if (line.startsWith('INSERT INTO')) {
inInsert = true;
currentInsert = line;
let match = line.match(/INSERT INTO `(\w+)`/);
if (match) {
tableName = match[1];
}
} else if (inInsert) {
currentInsert += '\n' + line;
}
if (inInsert && currentInsert.trim().endsWith(';')) {
if (['categories', 'products', 'users', 'settings'].includes(tableName)) {
let firstLineEnd = currentInsert.indexOf('VALUES') + 6;
let prefix = currentInsert.substring(0, firstLineEnd).replace(/`/g, '"');
let values = currentInsert.substring(firstLineEnd);
values = values.replace(/\\'/g, "''");
values = values.replace(/\\"/g, '"');
if (tableName === 'users') {
prefix = prefix.replace('"password"', '"password_hash"').replace('"email"', '"username"');
}
let query = prefix + values;
// Skip settings because of id column mismatch, not crucial for menu data
if (tableName !== 'settings') {
try {
await client.query(query);
console.log(`Successfully inserted data into "${tableName}"`);
} catch (e) {
console.error(`Error inserting into "${tableName}":`, e.message);
}
}
}
inInsert = false;
currentInsert = '';
}
}
// Re-enable triggers
await client.query("SET session_replication_role = origin;");
await client.end();
}
main().catch(e => {
console.error(e);
process.exit(1);
});