From e708ba2156cde68442f2ea962230375a16abbcd5 Mon Sep 17 00:00:00 2001 From: AyrisAI Date: Sat, 16 May 2026 00:43:22 +0300 Subject: [PATCH] initial commit: project completion with proper gitignore --- .../scratch/sync_partners.js | 57 + .gitignore | 7 + app/about/page.tsx | 266 + app/actions.ts | 100 + app/admin/(dashboard)/layout.tsx | 60 + app/admin/(dashboard)/leads/page.tsx | 71 + app/admin/(dashboard)/page.tsx | 47 + app/admin/(dashboard)/partners/PartnerRow.tsx | 125 + app/admin/(dashboard)/partners/page.tsx | 55 + app/admin/(dashboard)/projects/[id]/page.tsx | 32 + .../(dashboard)/projects/new/ProjectForm.tsx | 207 + app/admin/(dashboard)/projects/new/page.tsx | 25 + app/admin/(dashboard)/projects/page.tsx | 90 + app/admin/(dashboard)/services/page.tsx | 82 + .../(dashboard)/settings/SettingsForm.tsx | 86 + app/admin/(dashboard)/settings/page.tsx | 17 + app/admin/actions.ts | 260 + app/admin/login/page.tsx | 51 + app/contact/page.tsx | 26 + app/favicon.ico | Bin 0 -> 15406 bytes app/globals.css | 224 + app/layout.tsx | 154 + app/page.tsx | 18 + app/partners/page.tsx | 57 + app/robots.ts | 20 + app/services/page.tsx | 50 + app/sitemap.ts | 32 + app/works/[slug]/page.tsx | 29 + app/works/page.tsx | 24 + check_db.mjs | 36 + components/BottomBar.tsx | 65 + components/Capabilities.tsx | 83 + components/ClientWrapper.tsx | 16 + components/Contact.tsx | 232 + components/DynamicLogo.tsx | 39 + components/Footer.tsx | 91 + components/Hero.tsx | 64 + components/Navbar.tsx | 83 + components/Partners.tsx | 120 + components/PartnersList.tsx | 92 + components/SelectedWorks.tsx | 108 + components/ServicesClient.tsx | 128 + components/ServicesGrid.tsx | 143 + components/WorkDetailClient.tsx | 193 + components/WorksClient.tsx | 187 + eslint.config.mjs | 18 + lib/db.ts | 13 + next-env.d.ts | 6 + next.config.ts | 26 + package-lock.json | 6684 +++++++++++++++++ package.json | 31 + postcss.config.mjs | 7 + proxy.ts | 27 + public/logo.png | Bin 0 -> 17402 bytes public/partnerlogo/1.png | Bin 0 -> 24854 bytes public/partnerlogo/10.png | Bin 0 -> 30492 bytes public/partnerlogo/11.png | Bin 0 -> 59443 bytes public/partnerlogo/12.png | Bin 0 -> 57991 bytes public/partnerlogo/13.png | Bin 0 -> 18057 bytes public/partnerlogo/14.png | Bin 0 -> 53927 bytes public/partnerlogo/15.png | Bin 0 -> 13611 bytes public/partnerlogo/16.png | Bin 0 -> 22309 bytes public/partnerlogo/17.png | Bin 0 -> 12965 bytes public/partnerlogo/18.png | Bin 0 -> 22133 bytes public/partnerlogo/19.png | Bin 0 -> 28614 bytes public/partnerlogo/2.png | Bin 0 -> 24232 bytes public/partnerlogo/20.png | Bin 0 -> 36384 bytes public/partnerlogo/21.png | Bin 0 -> 30127 bytes public/partnerlogo/22.png | Bin 0 -> 24624 bytes public/partnerlogo/23.png | Bin 0 -> 26900 bytes public/partnerlogo/24.png | Bin 0 -> 20941 bytes public/partnerlogo/25.png | Bin 0 -> 17396 bytes public/partnerlogo/3.png | Bin 0 -> 21693 bytes public/partnerlogo/4.png | Bin 0 -> 16972 bytes public/partnerlogo/5.png | Bin 0 -> 19027 bytes public/partnerlogo/6.png | Bin 0 -> 64050 bytes public/partnerlogo/7.png | Bin 0 -> 13538 bytes public/partnerlogo/8.png | Bin 0 -> 17379 bytes public/partnerlogo/9.png | Bin 0 -> 66805 bytes schema.sql | 59 + scratch/update_contact.js | 24 + seed_services.mjs | 90 + setup_partners.mjs | 56 + tsconfig.json | 42 + 84 files changed, 11035 insertions(+) create mode 100644 .gemini/antigravity/brain/16b256ef-320e-49fd-b6f6-29b6cbcf3505/scratch/sync_partners.js create mode 100644 .gitignore create mode 100644 app/about/page.tsx create mode 100644 app/actions.ts create mode 100644 app/admin/(dashboard)/layout.tsx create mode 100644 app/admin/(dashboard)/leads/page.tsx create mode 100644 app/admin/(dashboard)/page.tsx create mode 100644 app/admin/(dashboard)/partners/PartnerRow.tsx create mode 100644 app/admin/(dashboard)/partners/page.tsx create mode 100644 app/admin/(dashboard)/projects/[id]/page.tsx create mode 100644 app/admin/(dashboard)/projects/new/ProjectForm.tsx create mode 100644 app/admin/(dashboard)/projects/new/page.tsx create mode 100644 app/admin/(dashboard)/projects/page.tsx create mode 100644 app/admin/(dashboard)/services/page.tsx create mode 100644 app/admin/(dashboard)/settings/SettingsForm.tsx create mode 100644 app/admin/(dashboard)/settings/page.tsx create mode 100644 app/admin/actions.ts create mode 100644 app/admin/login/page.tsx create mode 100644 app/contact/page.tsx create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/page.tsx create mode 100644 app/partners/page.tsx create mode 100644 app/robots.ts create mode 100644 app/services/page.tsx create mode 100644 app/sitemap.ts create mode 100644 app/works/[slug]/page.tsx create mode 100644 app/works/page.tsx create mode 100644 check_db.mjs create mode 100644 components/BottomBar.tsx create mode 100644 components/Capabilities.tsx create mode 100644 components/ClientWrapper.tsx create mode 100644 components/Contact.tsx create mode 100644 components/DynamicLogo.tsx create mode 100644 components/Footer.tsx create mode 100644 components/Hero.tsx create mode 100644 components/Navbar.tsx create mode 100644 components/Partners.tsx create mode 100644 components/PartnersList.tsx create mode 100644 components/SelectedWorks.tsx create mode 100644 components/ServicesClient.tsx create mode 100644 components/ServicesGrid.tsx create mode 100644 components/WorkDetailClient.tsx create mode 100644 components/WorksClient.tsx create mode 100644 eslint.config.mjs create mode 100644 lib/db.ts create mode 100644 next-env.d.ts create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 proxy.ts create mode 100644 public/logo.png create mode 100644 public/partnerlogo/1.png create mode 100644 public/partnerlogo/10.png create mode 100644 public/partnerlogo/11.png create mode 100644 public/partnerlogo/12.png create mode 100644 public/partnerlogo/13.png create mode 100644 public/partnerlogo/14.png create mode 100644 public/partnerlogo/15.png create mode 100644 public/partnerlogo/16.png create mode 100644 public/partnerlogo/17.png create mode 100644 public/partnerlogo/18.png create mode 100644 public/partnerlogo/19.png create mode 100644 public/partnerlogo/2.png create mode 100644 public/partnerlogo/20.png create mode 100644 public/partnerlogo/21.png create mode 100644 public/partnerlogo/22.png create mode 100644 public/partnerlogo/23.png create mode 100644 public/partnerlogo/24.png create mode 100644 public/partnerlogo/25.png create mode 100644 public/partnerlogo/3.png create mode 100644 public/partnerlogo/4.png create mode 100644 public/partnerlogo/5.png create mode 100644 public/partnerlogo/6.png create mode 100644 public/partnerlogo/7.png create mode 100644 public/partnerlogo/8.png create mode 100644 public/partnerlogo/9.png create mode 100644 schema.sql create mode 100644 scratch/update_contact.js create mode 100644 seed_services.mjs create mode 100644 setup_partners.mjs create mode 100644 tsconfig.json diff --git a/.gemini/antigravity/brain/16b256ef-320e-49fd-b6f6-29b6cbcf3505/scratch/sync_partners.js b/.gemini/antigravity/brain/16b256ef-320e-49fd-b6f6-29b6cbcf3505/scratch/sync_partners.js new file mode 100644 index 0000000..c05ce91 --- /dev/null +++ b/.gemini/antigravity/brain/16b256ef-320e-49fd-b6f6-29b6cbcf3505/scratch/sync_partners.js @@ -0,0 +1,57 @@ +const cloudinary = require('cloudinary').v2; +const postgres = require('postgres'); +const fs = require('fs'); +const path = require('path'); +require('dotenv').config({ path: '.env.local' }); + +cloudinary.config({ + cloud_name: process.env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME, + api_key: process.env.CLOUDINARY_API_KEY, + api_secret: process.env.CLOUDINARY_API_SECRET +}); + +const sql = postgres(process.env.DATABASE_URL); + +async function uploadAndSync() { + const partnersDir = path.join(process.cwd(), 'public', 'partnerlogo'); + const files = fs.readdirSync(partnersDir).filter(file => file.endsWith('.png')); + + console.log(`Found ${files.length} images to upload.`); + + // First, let's clear or check existing partners + // To keep it simple, we'll insert new records or update by a 'name' which we'll placeholder + + for (const file of files) { + const filePath = path.join(partnersDir, file); + const partnerId = file.replace('.png', ''); // e.g., "1" + + try { + console.log(`Uploading ${file}...`); + const result = await cloudinary.uploader.upload(filePath, { + folder: 'partners', + public_id: `partner_${partnerId}` + }); + + console.log(`Uploaded: ${result.secure_url}`); + + // Insert or Update in DB + // We'll use partnerId as id and display_order + const idNum = parseInt(partnerId); + await sql` + INSERT INTO partners (id, name, logo, display_order) + VALUES (${idNum}, ${`Partner ${partnerId}`}, ${result.secure_url}, ${idNum}) + ON CONFLICT (id) + DO UPDATE SET logo = EXCLUDED.logo + `; + + console.log(`Synced ${file} to database (ID: ${idNum}).`); + } catch (error) { + console.error(`Error processing ${file}:`, error); + } + } + + console.log('Sync complete.'); + process.exit(0); +} + +uploadAndSync(); diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..33b7c4a --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules +.next +.env* +*.log +build +dist +.DS_Store diff --git a/app/about/page.tsx b/app/about/page.tsx new file mode 100644 index 0000000..6d1bb4c --- /dev/null +++ b/app/about/page.tsx @@ -0,0 +1,266 @@ +import Image from "next/image"; +import Link from "next/link"; +import { + ArrowRight, + Circle, + Camera, + Video, + Instagram, + TrendingUp +} from "lucide-react"; +import Footer from "@/components/Footer"; +import { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Hakkımızda | Muğla Dijital Medya & Prodüksiyon Ajansı", + description: "Muğla Dijital Medya Ajansı'nın hikayesini, değerlerini ve vizyonunu keşfedin. Drone çekimi, video prodüksiyon, sosyal medya yönetimi ve reklam hizmetleri.", + alternates: { + canonical: "/about", + }, + openGraph: { + title: "Hakkımızda | Muğla Dijital", + description: "Muğla'nın dijital çözüm ortağı.", + url: "https://mugladijitalmedya.com/about", + } +}; + +const timeline = [ + { year: "2020", title: "Ajans Kuruldu", desc: "Muğla'da küçük bir ekiple yola çıktık. Drone çekimleri ve sosyal medya yönetimi ile ilk projelerimizi tamamladık." }, + { year: "2021", title: "İlk Büyük Projeler", desc: "Bölgedeki oteller ve işletmeler için profesyonel tanıtım çekimleri gerçekleştirdik. Müşteri portföyümüz hızla büyüdü." }, + { year: "2023", title: "Dijital Genişleme", desc: "Reklam yönetimi, SEO ve web tasarım hizmetlerini de ekleyerek tam kapsamlı bir dijital ajansa dönüştük." }, + { year: "2025", title: "Sektörde Güçlü Konum", desc: "150+ mutlu müşteri, 500+ tamamlanmış proje ile Muğla ve çevresinin güvenilir dijital çözüm ortağı olduk." } +]; + +const highlights = [ + { number: "500+", label: "Tamamlanan Proje" }, + { number: "150+", label: "Mutlu Müşteri" }, + { number: "5+", label: "Yıllık Deneyim" }, + { number: "9", label: "Hizmet Alanı" } +]; + +export default function AboutPage() { + return ( +
+ + {/* Hero Section */} +
+
+
+ Hakkımızda + Son Güncelleme: 15 Mayıs 2026 +
+

+ Muğla'nın Dijital
+ Hikaye Mimarları. +

+
+
+ + {/* Stats Bar - Editorial Style */} +
+
+ {highlights.map((item, idx) => ( +
+
{item.number}
+
{item.label}
+
+ ))} +
+
+ + {/* Mission Section - Editorial Layout */} +
+
+
+ Misyonumuz +

+ Markanızı Havadan ve
Yerden Kurguluyoruz. +

+
+

+ Muğla Dijital Medya Ajansı, Muğla merkezli profesyonel bir dijital medya ve prodüksiyon ajansıdır. İşletmelerin dijital dünyada güçlü bir şekilde var olmasını sağlamak amacıyla; profesyonel drone çekimleri, kurumsal fotoğrafçılık ve video prodüksiyon hizmetleriyle markaların görsel kimliğini inşa ediyoruz. +

+

+ Stratejik sosyal medya yönetimi, Google ve Meta reklam kampanyaları, SEO optimizasyonu ve modern web tasarım çözümlerimizle markanızın dijital varlığını güçlendiriyoruz. Ayrıca düğün ve özel gün çekimleriyle en değerli anlarınızı profesyonel kurgularla ölümsüzleştiriyoruz. +

+
+ + Hizmetlerimiz + + +
+
+
+ Muğla Dijital Profesyonel Drone Çekimi ve Havadan Görüntüleme Hizmetleri +
+ {/* Diagonal decoration */} +
+
+
+
+ + {/* Core Values - Editorial Bento */} +
+
+
+ Değerlerimiz +

Temel İlkelerimiz

+
+ +
+ {[ + { + title: "Profesyonel Prodüksiyon", + desc: "Drone çekimi ve prodüksiyon alanında en son teknolojiyle markanız için unutulmaz görsel içerikler üretiyoruz.", + icon: Camera + }, + { + title: "Dijital Büyüme", + desc: "Sosyal medya yönetimi ve reklam stratejileri ile markanızın sürdürülebilir şekilde büyümesini sağlıyoruz.", + icon: TrendingUp + }, + { + title: "Müşteri Odaklılık", + desc: "Her projeyi müşterimizin ihtiyaçlarına özel tasarlıyor, şeffaf iletişim ve sonuç odaklı çalışma prensibiyle ilerliyoruz.", + icon: Circle + } + ].map((v, idx) => ( +
+
+ +
+

{v.title}

+

+ {v.desc} +

+ {/* Subtle diagonal on hover */} +
+
+
+
+ ))} +
+
+
+ + + {/* FAQ Section - AI Extraction Optimized */} +
+
+
+ Destek +

Sıkça Sorulan Sorular

+
+ +
+ {[ + { + q: "Muğla Dijital Medya Ajansı nedir?", + a: "Muğla Dijital, Muğla merkezli profesyonel bir dijital medya ajansıdır. Drone çekimi, video prodüksiyon, sosyal medya yönetimi, SEO ve dijital reklam yönetimi (Google/Meta) alanlarında markalara yaratıcı ve sonuç odaklı çözümler sunuyoruz." + }, + { + q: "Drone çekimi hizmetleriniz neleri kapsıyor?", + a: "Drone çekimi hizmetlerimiz; otel tanıtım filmleri, gayrimenkul çekimleri, arazi ve arsa havadan görüntüleme, etkinlik ve düğün çekimlerini kapsamaktadır. Tüm çekimler profesyonel lisanslı pilotlarımız ve 4K/5.4K çözünürlüklü ekipmanlarımızla gerçekleştirilir." + }, + { + q: "Sosyal medya yönetimi süreciniz nasıl işliyor?", + a: "Sosyal medya yönetimi sürecimiz; marka analizi, içerik planlama, profesyonel çekimler, grafik tasarım, paylaşım yönetimi ve aylık performans raporlamasını içerir. Instagram, Facebook, LinkedIn ve TikTok platformlarında markanızı büyütecek stratejiler uyguluyoruz." + }, + { + q: "Muğla dışında hizmet veriyor musunuz?", + a: "Evet, merkezimiz Muğla olmakla birlikte başta Aydın, Denizli, Antalya ve İzmir olmak üzere tüm Ege bölgesi ve Türkiye genelinde projeler gerçekleştiriyoruz." + }, + { + q: "Dijital reklam yönetimi (Google ve Meta) için bütçe nasıl belirlenir?", + a: "Reklam bütçesi; sektörünüze, hedef kitlenize ve hedeflerinize göre analiz edilerek belirlenir. Minimum bütçe ile maksimum dönüşüm alabilmeniz için stratejik planlama yapıyor, kampanyalarınızı günlük olarak optimize ediyoruz." + } + ].map((faq, idx) => ( +
+

{faq.q}

+

{faq.a}

+
+ ))} +
+
+ + {/* FAQ Schema */} +