commit d00a5fac34f2ebfb9c2225ff454ddd07e7915493 Author: M. Batuhan Erkek Date: Fri Jan 30 00:53:50 2026 +0300 30012026-01 VDS aktarım Batuhan diff --git a/admin.css b/admin.css new file mode 100644 index 0000000..9c6b2cb --- /dev/null +++ b/admin.css @@ -0,0 +1,231 @@ +@import url("https://fonts.googleapis.com/css2?family=Manrope:wght@300;400;500;600;700&display=swap"); + +:root { + color-scheme: dark; + --bg: #05070d; + --bg-alt: #0a0f1f; + --primary: #0c1b3a; + --primary-strong: #10224f; + --accent: #1f3a7a; + --text: #e6ecff; + --muted: #a3b1d4; + --border: rgba(125, 140, 180, 0.2); + --glow: rgba(35, 70, 150, 0.35); +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: "Manrope", system-ui, -apple-system, sans-serif; + background: radial-gradient(circle at top left, #0c1b3a 0%, #05070d 40%, #000 100%); + color: var(--text); + min-height: 100vh; +} + +.panel { + max-width: 980px; + margin: 0 auto; + padding: 80px 24px; +} + +.login-card, +.panel-card { + background: linear-gradient(135deg, rgba(16, 34, 79, 0.9), rgba(5, 7, 13, 0.95)); + border-radius: 24px; + border: 1px solid var(--border); + padding: 32px; + box-shadow: 0 25px 80px rgba(2, 6, 20, 0.7); +} + +.hidden { + display: none; +} + +.card-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + margin-bottom: 24px; +} + +.card-header h1 { + font-size: clamp(1.8rem, 2.6vw, 2.4rem); +} + +.card-header p { + color: var(--muted); +} + +.card-form { + display: grid; + gap: 18px; +} + +label { + display: grid; + gap: 8px; + font-weight: 500; +} + +input, +textarea { + background: var(--bg-alt); + border: 1px solid var(--border); + border-radius: 12px; + padding: 12px 14px; + color: var(--text); + font-size: 0.95rem; +} + +input:focus, +textarea:focus { + outline: 2px solid rgba(31, 58, 122, 0.5); + border-color: rgba(31, 58, 122, 0.5); +} + +button { + border: none; + border-radius: 999px; + padding: 12px 24px; + font-weight: 600; + background: linear-gradient(120deg, #1f3a7a, #10224f); + color: var(--text); + cursor: pointer; + transition: transform 0.2s ease, box-shadow 0.2s ease; + box-shadow: 0 10px 30px var(--glow); +} + +button:hover { + transform: translateY(-2px); +} + +button.ghost { + background: transparent; + border: 1px solid var(--border); + box-shadow: none; +} + +.hint { + color: var(--muted); + font-size: 0.85rem; +} + +.grid { + display: grid; + gap: 16px; +} + +.grid.two { + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); +} + +.posts { + margin-top: 32px; +} + +.posts h2 { + margin-bottom: 16px; +} + +.posts-list { + display: grid; + gap: 16px; +} + +.tag-input { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; + min-height: 44px; + padding: 8px 12px; + border-radius: 12px; + border: 1px solid var(--border); + background: var(--bg-alt); +} + +.tag-input input { + border: none; + background: transparent; + padding: 6px 4px; + min-width: 160px; + flex: 1; +} + +.tag-input input:focus { + outline: none; +} + +.tags { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; +} + +.tag { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 6px 12px; + border-radius: 999px; + border: 1px solid var(--border); + background: rgba(10, 15, 31, 0.5); + font-size: 0.85rem; +} + +.tag button { + border: none; + background: transparent; + color: var(--muted); + cursor: pointer; + font-size: 1rem; + line-height: 1; + padding: 0; + box-shadow: none; +} + +.tag button:hover { + color: var(--text); +} + +.post-item { + padding: 18px; + border-radius: 16px; + border: 1px solid var(--border); + background: var(--bg-alt); + display: grid; + gap: 6px; +} + +.post-item h3 { + font-size: 1.1rem; +} + +.post-meta { + color: var(--muted); + font-size: 0.85rem; +} + +.post-actions { + display: flex; + gap: 12px; + margin-top: 8px; +} + +.post-actions button { + padding: 8px 16px; + font-size: 0.85rem; +} + +@media (max-width: 720px) { + .card-header { + flex-direction: column; + align-items: flex-start; + } +} diff --git a/admin.html b/admin.html new file mode 100644 index 0000000..028d56e --- /dev/null +++ b/admin.html @@ -0,0 +1,90 @@ + + + + + + Admin Panel | Blog Yönetimi + + + + +
+ + + +
+ + + + diff --git a/admin.js b/admin.js new file mode 100644 index 0000000..5617941 --- /dev/null +++ b/admin.js @@ -0,0 +1,194 @@ +import { initializeApp } from "https://www.gstatic.com/firebasejs/12.8.0/firebase-app.js"; +import { getAnalytics } from "https://www.gstatic.com/firebasejs/12.8.0/firebase-analytics.js"; +import { + getAuth, + onAuthStateChanged, + signInWithEmailAndPassword, + signOut, +} from "https://www.gstatic.com/firebasejs/12.8.0/firebase-auth.js"; +import { + addDoc, + collection, + deleteDoc, + doc, + getFirestore, + onSnapshot, + orderBy, + query, + serverTimestamp, +} from "https://www.gstatic.com/firebasejs/12.8.0/firebase-firestore.js"; + +const firebaseConfig = { + apiKey: "AIzaSyAdLH7HMwCMZ4lThoWGEiI5TEjfvBMXem8", + authDomain: "batuhanerkeksite.firebaseapp.com", + projectId: "batuhanerkeksite", + storageBucket: "batuhanerkeksite.firebasestorage.app", + messagingSenderId: "439489523058", + appId: "1:439489523058:web:ce15dc3127f1ce03a8c1eb", + measurementId: "G-FC46PNZJHX", +}; + +const app = initializeApp(firebaseConfig); +try { + getAnalytics(app); +} catch { + // Analytics optional in local/dev environments. +} + +const auth = getAuth(app); +const db = getFirestore(app); + +const loginCard = document.getElementById("login-card"); +const adminPanel = document.getElementById("admin-panel"); +const loginForm = document.getElementById("login-form"); +const blogForm = document.getElementById("blog-form"); +const postsList = document.getElementById("posts-list"); +const logoutBtn = document.getElementById("logout-btn"); +const tagsInput = document.getElementById("tags-input"); +const tagsList = document.getElementById("tags-list"); + +let currentTags = []; +const postsRef = collection(db, "posts"); + +const renderPosts = (posts) => { + postsList.innerHTML = ""; + + if (!posts.length) { + const empty = document.createElement("div"); + empty.className = "post-item"; + empty.textContent = "Henüz blog yazısı yok."; + postsList.appendChild(empty); + return; + } + + posts.forEach((post) => { + const wrapper = document.createElement("div"); + wrapper.className = "post-item"; + + const title = document.createElement("h3"); + title.textContent = post.title; + + const meta = document.createElement("div"); + meta.className = "post-meta"; + const tagsLabel = post.tags?.length ? post.tags.join(", ") : "Etiket yok"; + meta.textContent = `${post.date || "-"} · ${tagsLabel}`; + + const summary = document.createElement("p"); + summary.textContent = post.summary; + + const actions = document.createElement("div"); + actions.className = "post-actions"; + + const removeBtn = document.createElement("button"); + removeBtn.className = "ghost"; + removeBtn.type = "button"; + removeBtn.textContent = "Sil"; + removeBtn.addEventListener("click", () => { + deleteDoc(doc(db, "posts", post.id)); + }); + + actions.appendChild(removeBtn); + wrapper.append(title, meta, summary, actions); + postsList.appendChild(wrapper); + }); +}; + +const setAuthState = (isLoggedIn) => { + loginCard.classList.toggle("hidden", isLoggedIn); + adminPanel.classList.toggle("hidden", !isLoggedIn); +}; + +const renderTags = () => { + tagsList.innerHTML = ""; + if (!currentTags.length) return; + + currentTags.forEach((tag, index) => { + const chip = document.createElement("span"); + chip.className = "tag"; + chip.textContent = tag; + + const removeBtn = document.createElement("button"); + removeBtn.type = "button"; + removeBtn.setAttribute("aria-label", `${tag} etiketini kaldır`); + removeBtn.textContent = "×"; + removeBtn.addEventListener("click", () => { + currentTags = currentTags.filter((_, i) => i !== index); + renderTags(); + }); + + chip.appendChild(removeBtn); + tagsList.appendChild(chip); + }); +}; + +const addTag = (rawValue) => { + const value = rawValue.trim(); + if (!value) return; + if (currentTags.includes(value)) return; + currentTags = [...currentTags, value]; + renderTags(); +}; + +tagsInput.addEventListener("keydown", (event) => { + if (event.key === "Enter") { + event.preventDefault(); + addTag(tagsInput.value); + tagsInput.value = ""; + } +}); + +loginForm.addEventListener("submit", (event) => { + event.preventDefault(); + const formData = new FormData(loginForm); + const email = formData.get("email"); + const password = formData.get("password"); + + signInWithEmailAndPassword(auth, email, password) + .then(() => { + loginForm.reset(); + }) + .catch(() => { + alert("Giriş başarısız. E-posta veya şifre hatalı."); + }); +}); + +logoutBtn.addEventListener("click", () => { + signOut(auth); +}); + +blogForm.addEventListener("submit", (event) => { + event.preventDefault(); + const formData = new FormData(blogForm); + const newPost = { + title: formData.get("title").trim(), + tags: currentTags, + summary: formData.get("summary").trim(), + content: formData.get("content").trim(), + date: formData.get("date"), + image: formData.get("image").trim(), + createdAt: serverTimestamp(), + }; + + addDoc(postsRef, newPost) + .then(() => { + blogForm.reset(); + currentTags = []; + renderTags(); + }) + .catch(() => { + alert("Yazı kaydedilemedi. Tekrar deneyin."); + }); +}); + +onAuthStateChanged(auth, (user) => { + setAuthState(!!user); +}); + +const postsQuery = query(postsRef, orderBy("createdAt", "desc")); +onSnapshot(postsQuery, (snapshot) => { + const posts = snapshot.docs.map((docSnap) => ({ + id: docSnap.id, + ...docSnap.data(), + })); + renderPosts(posts); +}); diff --git a/assets/MBE.png b/assets/MBE.png new file mode 100644 index 0000000..5b6e5e4 Binary files /dev/null and b/assets/MBE.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..b0caa17 --- /dev/null +++ b/index.html @@ -0,0 +1,231 @@ + + + + + + Kişisel Website | İsim Soyisim + + + + + + +
+
+
+

Merhaba, ben

+

Mehmet Batuhan Erkek

+

+ Girişimci - Mühendis - Eğitmen +

+ +
+
+
+ İsim Soyisim fotoğrafı +
+
+
+ +
+
+

Özgeçmiş

+
+
+
+

Hakkımda

+

+ Makine Mühendisliği mezunuyum. Malzeme Bilimi ve Mühendisliği alanında yüksek lisans yaptım, aynı zamanda Yönetim Bilişim Sistemleri ve Egzersiz & Spor Bilimleri alanlarında eğitimime devam ediyorum. 2020 yılından bu yana Erkba Ar-Ge Mühendislik bünyesinde genel müdür olarak çalışıyor, sanayi, sağlık teknolojileri ve yapay zekâ odaklı Ar-Ge projeleri geliştiriyorum. +

+ TÜBİTAK ve KOSGEB destekli birçok projede aktif rol aldım; robotik rehabilitasyon cihazları, üretim teknolojileri ve yazılım tabanlı mühendislik çözümleri üzerine çalışıyorum. CAD, CAM ve CAE yazılımları başta olmak üzere ileri mühendislik araçlarıyla hem proje geliştiriyor hem de teknik eğitimler veriyorum. +

+ Amacım, disiplinler arası mühendislik yaklaşımıyla yenilikçi fikirleri uygulanabilir ve sürdürülebilir çözümlere dönüştürmek. +

+
+
+

Yetkinlikler

+
    +
  • Mekanik tasarım, üretim ve mühendislik analizleri
  • +
  • CAD, CAM ve CAE tabanlı tasarım ve simülasyon süreçleri
  • +
  • Üretim ve malzeme simülasyon teknolojileri
  • +
  • Robotik, mekatronik ve rehabilitasyon cihazları geliştirme
  • +
  • Yazılım geliştirme ve veri tabanı sistemleri
  • +
  • Elektronik, gömülü sistemler ve otomasyon
  • +
  • Ar-Ge, proje ve teknik ekip yönetimi
  • +
  • Teknik eğitim, danışmanlık ve ürün geliştirme
  • +
+
+
+
+ +
+
+

ERKBA

+
+
+
+

+ Yapay zeka, sensör teknolojisi ve oyunlaştırma ile fizik tedaviye + yeni bir standart kazandırıyoruz. ERKBA, hastaların tedavi + süreçlerini ölçülebilir, motive edici ve erişilebilir hale + getiren dijital rehabilitasyon çözümleri sunar. +

+ + erkba.com → + +
+
+
+ +
+
+

Verdiğim Eğitimler

+
+
+
+

Ansys Mechanical

+

Yapısal analiz ve simülasyon odaklı eğitim.

+
+
+

Fusion 360

+

3D modelleme, tasarım ve üretim süreçleri.

+
+
+

Proje Yönetimi

+

Planlama, kaynak yönetimi ve süreç optimizasyonu.

+
+
+
+ +
+
+

Blog

+
+
+
+

Ürün Ekiplerinde Tasarım Sistemi

+

Küçük ekiplerde ölçeklenebilir sistem kurma rehberi.

+ Devamını oku → +
+
+

Eğitimde Etkileşimli Öğrenme

+

Öğrenci katılımını artıran pratik yöntemler.

+ Devamını oku → +
+
+
+ +
+
+

Ödüller

+
+
+
+

12. GIV Girişimcilik Ödülleri

+

Girişimci birincilik ödülü

+
+
+

4. Kristal Çam Ödülü

+

Yılın sağlık teknolojisi girişimcisi

+
+
+

Türk Patent ISIF 24

+

Adana Uluslararası Buluş Fuarı · Gümüş madalya

+
+
+

Türk Patent ISIF 25

+

İstanbul Uluslararası Buluş Fuarı · Gümüş madalya

+
+
+
+
+ + + + + + diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..b80f50a --- /dev/null +++ b/styles.css @@ -0,0 +1,363 @@ +@import url("https://fonts.googleapis.com/css2?family=Manrope:wght@300;400;500;600;700&display=swap"); + +:root { + color-scheme: dark; + --bg: #05070d; + --bg-alt: #0a0f1f; + --primary: #0c1b3a; + --primary-strong: #10224f; + --accent: #1f3a7a; + --text: #e6ecff; + --muted: #a3b1d4; + --border: rgba(125, 140, 180, 0.2); + --glow: rgba(35, 70, 150, 0.35); +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: "Manrope", system-ui, -apple-system, sans-serif; + background: radial-gradient(circle at top left, #0c1b3a 0%, #05070d 40%, #000 100%); + color: var(--text); + line-height: 1.6; +} + +a { + color: inherit; + text-decoration: none; +} + +.site-header { + position: sticky; + top: 0; + z-index: 10; + backdrop-filter: blur(12px); + background: rgba(5, 7, 13, 0.7); + border-bottom: 1px solid var(--border); +} + +.nav { + max-width: 1100px; + margin: 0 auto; + display: flex; + align-items: center; + justify-content: space-between; + padding: 26px 24px; +} + +.logo { + font-weight: 700; + letter-spacing: 0.5px; + font-size: 1.2rem; +} + +.nav-links { + display: flex; + gap: 20px; + font-size: 1.05rem; + color: var(--muted); +} + +.nav-links a { + transition: color 0.2s ease; +} + +.nav-links a:hover { + color: var(--text); +} + +main { + max-width: 1100px; + margin: 0 auto; + padding: 60px 24px 80px; +} + +.hero { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 40px; + padding: 40px; + border-radius: 28px; + background: linear-gradient(135deg, rgba(16, 34, 79, 0.9), rgba(5, 7, 13, 0.95)); + box-shadow: 0 25px 80px rgba(2, 6, 20, 0.7); + border: 1px solid var(--border); +} + +.eyebrow { + text-transform: uppercase; + letter-spacing: 2px; + font-size: 0.75rem; + color: var(--muted); +} + +.hero h1 { + font-size: clamp(2.6rem, 4vw, 3.6rem); + margin: 12px 0; + white-space: nowrap; +} + +.subtitle { + font-size: 1.05rem; + color: var(--muted); + max-width: 520px; +} + +.hero-actions { + display: flex; + gap: 16px; + margin: 24px 0; + flex-wrap: wrap; +} + +.btn { + padding: 12px 22px; + border-radius: 999px; + border: 1px solid transparent; + font-weight: 600; + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.btn.primary { + background: linear-gradient(120deg, #1f3a7a, #10224f); + box-shadow: 0 10px 30px var(--glow); +} + +.btn.ghost { + border: 1px solid var(--border); + color: var(--muted); +} + +.btn:hover { + transform: translateY(-2px); +} + +.hero-badges { + display: flex; + gap: 16px; + flex-wrap: wrap; + color: var(--muted); + font-size: 0.9rem; +} + +.hero-media { + display: grid; + align-content: center; + gap: 12px; + justify-items: end; +} + +.avatar { + width: 220px; + height: 220px; + border-radius: 50%; + overflow: hidden; + background: radial-gradient(circle at top right, #1f3a7a, #0a0f1f); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: inset 0 0 30px rgba(31, 58, 122, 0.4), 0 20px 40px rgba(0, 0, 0, 0.5); +} + +.avatar img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +.media-note { + font-size: 0.85rem; + color: var(--muted); +} + +.section { + margin-top: 80px; +} + +.section-header { + display: flex; + flex-direction: column; + gap: 10px; + margin-bottom: 28px; +} + +.section-header h2 { + font-size: clamp(1.6rem, 2.5vw, 2.2rem); +} + +.section-header p { + color: var(--muted); +} + +.grid { + display: grid; + gap: 20px; +} + +.grid.two { + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); +} + +.grid.three { + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); +} + +.grid.four { + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); +} + +.card { + background: var(--bg-alt); + border: 1px solid var(--border); + border-radius: 18px; + padding: 22px; + box-shadow: 0 15px 35px rgba(4, 8, 20, 0.5); + transition: transform 0.2s ease, border-color 0.2s ease; +} + +.card:hover { + transform: translateY(-4px); + border-color: rgba(255, 255, 255, 0.15); +} + +.card h3 { + margin-bottom: 10px; + font-size: 1.1rem; +} + +.card p { + color: var(--muted); +} + +.card.compact { + text-align: center; + font-weight: 600; +} + +.link-card span { + display: inline-block; + margin-top: 12px; + color: var(--text); + font-weight: 600; +} + +.list { + display: grid; + gap: 8px; + color: var(--muted); + list-style: none; + margin-bottom: 14px; +} + +.inline-link { + font-weight: 600; + color: var(--text); +} + +.footer { + margin-top: 100px; + padding: 50px 24px 60px; + border-top: 1px solid var(--border); + background: rgba(5, 7, 13, 0.8); +} + +.footer > div { + max-width: 1100px; + margin: 0 auto; +} + +.footer h2 { + margin-bottom: 8px; +} + +.socials { + display: flex; + flex-direction: row; + align-items: center; + gap: 18px; + flex-wrap: wrap; + margin: 20px auto 30px; + max-width: 1100px; + color: var(--muted); +} + +.socials a { + display: inline-flex; + align-items: center; + gap: 10px; + padding: 16px 16px; + border-radius: 999px; + border: 1px solid rgba(125, 140, 180, 0.2); + background: rgba(10, 15, 31, 0.4); + transition: transform 0.2s ease, border-color 0.2s ease, color 0.2s ease; +} + +.socials .icon { + width: 20px; + height: 20px; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.socials .icon svg { + width: 100%; + height: 100%; + display: block; +} + +.socials a:hover { + color: var(--text); + transform: translateY(-2px); + border-color: rgba(255, 255, 255, 0.2); +} + +.copyright { + max-width: 1100px; + margin: 0 auto; + color: var(--muted); + font-size: 0.85rem; +} + +.reveal { + opacity: 0; + transform: translateY(24px); + transition: opacity 0.6s ease, transform 0.6s ease; + will-change: opacity, transform; +} + +.reveal.is-visible { + opacity: 1; + transform: translateY(0); +} + +@media (max-width: 720px) { + .nav { + flex-direction: column; + gap: 12px; + } + + .nav-links { + flex-wrap: wrap; + justify-content: center; + } + + .hero { + padding: 30px; + } + + .avatar { + width: 180px; + height: 180px; + } + + .logo { + font-size: 1.1rem; + } + + .nav-links { + font-size: 1rem; + } +}