Initial commit: Key Ajans portfolio site

This commit is contained in:
kayasamat
2026-08-07 17:46:14 +03:00
commit 91bb52bce4
18 changed files with 1656 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
{% extends "base.html" %}
{% block title %}Proje Yükleme — Key Ajansı{% endblock %}
{% block content %}
<section class="auth-single">
<div class="form-card form-card-wide">
<h2 class="form-title">Proje Yükle</h2>
<p class="form-note">Yeni projenizi GitHub'a benzer şekilde ekleyin. İstediğiniz zaman kaldırabilir veya dosyayı geri indirebilirsiniz.</p>
<form method="post" action="{{ url_for('projects.do_upload') }}" enctype="multipart/form-data">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<label>Başlık
<input type="text" name="title" maxlength="150" placeholder="Proje adı" required>
</label>
<label>Açıklama
<textarea name="description" maxlength="5000" rows="5" placeholder="Proje hakkında kısa bilgi"></textarea>
</label>
<label>Etiketler
<input type="text" name="tags" maxlength="300" placeholder="örn. web, tasarım, python">
</label>
<label>Bağlantı (isteğe bağlı)
<input type="url" name="link" maxlength="500" placeholder="https://…">
</label>
<label>Dosya (isteğe bağlı)
<input type="file" name="file" accept=".png,.jpg,.jpeg,.gif,.webp,.pdf,.zip,.rar,.7z,.tar,.gz,.txt,.md,.doc,.docx,.ppt,.pptx,.xls,.xlsx">
</label>
<button class="btn btn-primary btn-block" type="submit">Projeyi Yükle</button>
</form>
</div>
</section>
<section class="section">
<h2 class="section-title">Yüklenen Projeler</h2>
{% if projects %}
<div class="admin-list">
{% for p in projects %}
<div class="admin-row">
<div class="admin-row-main">
<span class="proj-title">{{ p.title }}</span>
<span class="admin-row-meta">{{ p.created_at }} · {% if p.size %}{{ (p.size / 1024) | round(1) }} KB{% else %}dosya yok{% endif %}</span>
</div>
<div class="admin-row-actions">
<a class="btn btn-ghost" href="{{ url_for('index') }}#projeler">Gör</a>
{% if p.stored_name %}
<a class="btn btn-primary" href="{{ url_for('projects.download', pid=p.id) }}">İndir</a>
{% endif %}
<form class="inline-form" method="post" action="{{ url_for('projects.do_delete', pid=p.id) }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<button class="btn btn-danger" type="submit" onclick="return confirm('Bu proje silinsin mi?')">Sil</button>
</form>
</div>
</div>
{% endfor %}
</div>
{% else %}
<p class="empty-note">Henüz proje yüklenmedi.</p>
{% endif %}
</section>
{% endblock %}
+31
View File
@@ -0,0 +1,31 @@
{% extends "base.html" %}
{% block title %}Talepler — Key Ajansı{% endblock %}
{% block content %}
<section class="section">
<h2 class="section-title">Gelen Talepler</h2>
{% if requests %}
<div class="inbox">
{% for r in requests %}
<article class="mail">
<div class="mail-head">
<span class="mail-subject">{{ r.subject }}</span>
<span class="mail-time">{{ r.created_at }}</span>
</div>
<div class="mail-from">Kimden: {{ r.sender_name }} &lt;{{ r.sender_email }}&gt;</div>
<div class="mail-body">{{ r.body }}</div>
<div class="mail-actions">
<form class="inline-form" method="post" action="{{ url_for('talepler.admin_delete', rid=r.id) }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<button class="btn btn-danger" type="submit" onclick="return confirm('Bu talep silinsin mi?')">Sil</button>
</form>
</div>
</article>
{% endfor %}
</div>
{% else %}
<p class="empty-note">Henüz talep yok.</p>
{% endif %}
</section>
{% endblock %}
+64
View File
@@ -0,0 +1,64 @@
<!doctype html>
<html lang="tr" data-theme="light">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex">
<title>{% block title %}Key Ajansı Portfolyosu{% endblock %}</title>
<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=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,500&family=Montserrat:wght@300;400;500;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
<header class="topbar">
<button class="theme-toggle" id="themeToggle" type="button" aria-label="Tema değiştir" title="Aydınlık / Karanlık tema">
<span class="tt-sun"></span><span class="tt-moon"></span>
<span class="tt-knob"></span>
</button>
<a class="brand" href="/">Key Ajansı</a>
<nav class="nav">
<a href="/">Ana Menü</a>
{% if is_admin %}
<a href="{{ url_for('projects.admin_panel') }}">Proje Yükleme</a>
<a href="{{ url_for('talepler.admin_inbox') }}">Talepler</a>
<form class="inline-form" method="post" action="{{ url_for('auth.cikis') }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<button class="link-btn" type="submit">Çıkış</button>
</form>
{% elif current_user %}
<a href="{{ url_for('talepler.new_talep') }}">Yeni Talep</a>
<form class="inline-form" method="post" action="{{ url_for('auth.cikis') }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<button class="link-btn" type="submit">Çıkış</button>
</form>
{% else %}
<a href="{{ url_for('auth.login_page') }}">Giriş Yap</a>
<a href="{{ url_for('auth.kayit') }}">Kayıt Ol</a>
{% endif %}
</nav>
</header>
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<div class="flash-wrap">
{% for category, message in messages %}
<div class="flash flash-{{ category }}">{{ message }}</div>
{% endfor %}
</div>
{% endif %}
{% endwith %}
<main class="wrap">
{% block content %}{% endblock %}
</main>
<footer class="footer">
<p>Key Ajansı Portfolyosu — an unofficial agency</p>
</footer>
<script src="{{ url_for('static', filename='js/app.js') }}"></script>
{% block scripts %}{% endblock %}
</body>
</html>
+9
View File
@@ -0,0 +1,9 @@
{% extends "base.html" %}
{% block title %}Hata — Key Ajansı{% endblock %}
{% block content %}
<section class="hero">
<h1 class="hero-title">{{ code }}</h1>
<p class="hero-sub">{{ message }}</p>
<p><a class="btn btn-primary" href="/">Ana Menüye Dön</a></p>
</section>
{% endblock %}
+78
View File
@@ -0,0 +1,78 @@
{% extends "base.html" %}
{% block content %}
<section class="hero">
<h1 class="hero-title">Key Ajansı Portfolyosu</h1>
<p class="hero-sub">an unofficial agency</p>
</section>
<section class="section" id="projeler">
<h2 class="section-title">Projelerimiz:</h2>
{% if projects %}
<div class="proj-grid">
{% for p in projects %}
<article class="proj-card">
<div class="proj-body">
<h3 class="proj-title">{{ p.title }}</h3>
{% if p.tags %}
<p class="proj-tags">{% for t in p.tags.split(',') if t.strip() %}<span class="tag">{{ t.strip() }}</span>{% endfor %}</p>
{% endif %}
<p class="proj-desc">{{ p.description }}</p>
<p class="proj-date">{{ p.created_at }}</p>
</div>
<div class="proj-actions">
{% if p.link %}<a class="btn btn-ghost" href="{{ p.link }}" target="_blank" rel="noopener noreferrer">Bağlantı</a>{% endif %}
{% if p.stored_name %}
<a class="btn btn-primary" href="{{ url_for('projects.download', pid=p.id) }}">Dosyayı İndir</a>
{% endif %}
</div>
</article>
{% endfor %}
</div>
{% else %}
<p class="empty-note">Henüz proje yüklenmedi.</p>
{% endif %}
</section>
<section class="section">
<h2 class="section-title">Ajansdaki Çalışanlarımız:</h2>
<div class="emp-grid">
<div class="emp-col">
<h3 class="emp-name">Eymen Mert YİĞİT</h3>
<div class="emp-card">
<div class="slider" data-interval="4000">
<div class="slides">
<img src="https://picsum.photos/seed/key-eymen-1/900/560" alt="" loading="eager">
<img src="https://picsum.photos/seed/key-eymen-2/900/560" alt="" loading="lazy">
<img src="https://picsum.photos/seed/key-eymen-3/900/560" alt="" loading="lazy">
<img src="https://picsum.photos/seed/key-eymen-4/900/560" alt="" loading="lazy">
</div>
<button class="slider-btn prev" type="button" aria-label="Önceki"></button>
<button class="slider-btn next" type="button" aria-label="Sonraki"></button>
<div class="dots"></div>
</div>
</div>
</div>
<div class="emp-col">
<h3 class="emp-name">Mehmed Kudret ERDOĞMUŞ</h3>
<div class="emp-card">
<div class="slider" data-interval="4000">
<div class="slides">
<img src="https://picsum.photos/seed/key-kudret-1/900/560" alt="" loading="eager">
<img src="https://picsum.photos/seed/key-kudret-2/900/560" alt="" loading="lazy">
<img src="https://picsum.photos/seed/key-kudret-3/900/560" alt="" loading="lazy">
<img src="https://picsum.photos/seed/key-kudret-4/900/560" alt="" loading="lazy">
</div>
<button class="slider-btn prev" type="button" aria-label="Önceki"></button>
<button class="slider-btn next" type="button" aria-label="Sonraki"></button>
<div class="dots"></div>
</div>
</div>
</div>
</div>
</section>
{% endblock %}
+31
View File
@@ -0,0 +1,31 @@
{% extends "base.html" %}
{% block title %}Giriş Yap — Key Ajansı{% endblock %}
{% block content %}
<section class="auth-grid">
<div class="form-card">
<h2 class="form-title">Giriş Yap</h2>
<form method="post" action="{{ url_for('auth.do_login') }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<label>Kullanıcı adı
<input type="text" name="username" maxlength="64" autocomplete="username" required>
</label>
<label>Şifre
<input type="password" name="password" maxlength="128" autocomplete="current-password" required>
</label>
<button class="btn btn-primary btn-block" type="submit">Giriş Yap</button>
</form>
<p class="form-note">Hesabınız yok mu? <a href="{{ url_for('auth.kayit') }}">Kayıt olun</a></p>
</div>
<aside class="request-panel">
<h2 class="form-title">Talep Menüsü</h2>
<p class="request-panel-text">
Ajansımızda görmek istediğiniz bir çalışma, öneri veya işbirliği mi var?
Bir e-posta yazar gibi talebinizi bize iletin; inceleyip dönüş yapalım.
</p>
<a class="btn btn-primary" href="{{ url_for('talepler.new_talep') }}">Talebi Oluştur</a>
</aside>
</section>
{% endblock %}
+32
View File
@@ -0,0 +1,32 @@
{% extends "base.html" %}
{% block title %}Yeni Talep — Key Ajansı{% endblock %}
{% block content %}
<section class="auth-single">
<div class="form-card form-card-wide">
<h2 class="form-title">Yeni Talep</h2>
<p class="form-note">Bir e-posta yazar gibi talebinizi oluşturun.</p>
<form method="post" action="{{ url_for('talepler.do_talep') }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<div class="field-row">
<label>Kimden — Adınız
<input type="text" name="sender_name" maxlength="100" value="{{ prefill_name }}" autocomplete="name" required>
</label>
<label>Kimden — E-posta
<input type="email" name="sender_email" maxlength="120" value="{{ prefill_email }}" autocomplete="email" required>
</label>
</div>
<label>Konu
<input type="text" name="subject" maxlength="150" placeholder="Talebinizin kısa özeti" required>
</label>
<label>Mesajınız
<textarea name="body" maxlength="5000" rows="8" placeholder="Talebinizi detaylı şekilde açıklayın…" required></textarea>
</label>
<button class="btn btn-primary btn-block" type="submit">Başvuru Yap</button>
<p class="form-note form-note-center"><a href="/">Geri Dön</a></p>
</form>
</div>
</section>
{% endblock %}
+28
View File
@@ -0,0 +1,28 @@
{% extends "base.html" %}
{% block title %}Kayıt Ol — Key Ajansı{% endblock %}
{% block content %}
<section class="auth-single">
<div class="form-card">
<h2 class="form-title">Kayıt Ol</h2>
<form method="post" action="{{ url_for('auth.do_register') }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<label>Kullanıcı adı
<input type="text" name="username" minlength="3" maxlength="32" pattern="[A-Za-z0-9_.-]{3,32}" autocomplete="username" required>
</label>
<label>Ad Soyad
<input type="text" name="display_name" maxlength="100" autocomplete="name" required>
</label>
<label>Şifre
<input type="password" name="password" minlength="8" maxlength="128" autocomplete="new-password" required>
</label>
<label>Şifre (tekrar)
<input type="password" name="password_confirm" minlength="8" maxlength="128" autocomplete="new-password" required>
</label>
<button class="btn btn-primary btn-block" type="submit">Kayıt Ol</button>
</form>
<p class="form-note">Zaten hesabınız var mı? <a href="{{ url_for('auth.login_page') }}">Giriş yapın</a></p>
</div>
</section>
{% endblock %}