feat: update layout metadata and add icons for data panel

This commit is contained in:
Poyraz Avsever
2026-03-11 15:22:27 +03:00
parent c6d1252bb8
commit f65a9bcd9e
7 changed files with 138 additions and 59 deletions
+87 -51
View File
@@ -1,20 +1,61 @@
# Portfolio New # Portfolio New
Poyraz Avsever icin hazirlanmis, `Next.js + poyraz-ui` tabanli portfolyo ve ayni repoda yer alan Electron tabanli veri yonetim paneli. Bu monorepo, Next.js tabanlı portfolyo web uygulaması ve Electron ile geliştirilen veri yönetim panelini bir arada sunar.
## Monorepo Yapisi ## Mimari
```text ```mermaid
. flowchart TD
|- app/ # Next.js route'lari subgraph Web Uygulama (Next.js)
|- components/ # UI component'leri A[app/] --> B[components/]
|- content/ # Markdown icerikleri (blog, podcast) A --> C[content/]
|- data/ # TypeScript veri kaynaklari A --> D[data/]
|- public/ # Statik dosyalar A --> E[public/]
|- apps/ B --> F[UI Bilesenleri]
| |- data-panel/ # Electron dashboard (icerik yonetimi + publish) C --> G[Markdown Blog/Podcast]
D --> H[TypeScript Veri Kaynaklari]
E --> I[Statik Dosyalar]
end
subgraph Electron Data Panel
J[apps/data-panel/]
J --> K[renderer/]
J --> L[main.cjs]
J --> M[preload.cjs]
K --> N[configs.js]
J --> O[assets/]
J --> P[Electron build scripts]
end
J --> D
J --> E
J --> C
J --> Q[Git ile publish]
Q --> D
Q --> E
Q --> C
A -.-> E
A -.-> D
A -.-> C
``` ```
### Klasörler ve Akış
- **app/**: Next.js route ve sayfa yapısı
- **components/**: UI bileşenleri (React)
- **content/**: Markdown içerikler (blog, podcast)
- **data/**: TypeScript veri kaynakları (projeler, referanslar, eğitim vb.)
- **public/**: Statik dosyalar (görseller, pdf, avatar)
- **apps/data-panel/**: Electron tabanlı içerik yönetim paneli
- **renderer/**: Panelin arayüzü ve form konfigürasyonları
- **main.cjs**: Electron ana süreç, dosya ve git işlemleri
- **configs.js**: Koleksiyon ve form alanı yönetimi
### Akış
1. Web uygulaması Next.js ile çalışır, içerik ve veri dosyalarını okur.
2. Electron paneli ile içerik (blog/podcast), veri (data/\*.ts) ve medya (public/) yönetimi yapılır.
3. Panelde yapılan değişiklikler git ile commit/push edilerek yayınlanır.
4. Paneldeki koleksiyonlar ve form alanları configs.js ile özelleştirilebilir.
## Gereksinimler ## Gereksinimler
- Node.js 20+ - Node.js 20+
@@ -27,7 +68,7 @@ Poyraz Avsever icin hazirlanmis, `Next.js + poyraz-ui` tabanli portfolyo ve ayni
pnpm install pnpm install
``` ```
## Frontend Komutlari ## Frontend Komutları
```bash ```bash
pnpm dev # Next.js local pnpm dev # Next.js local
@@ -36,18 +77,18 @@ pnpm build # Production build
pnpm start # Production run pnpm start # Production run
``` ```
## Electron Data Panel Komutlari ## Electron Data Panel Komutları
```bash ```bash
pnpm panel:dev # Electron panel (development) pnpm panel:dev # Electron panel (development)
pnpm panel:clean # apps/data-panel/dist temizle pnpm panel:clean # apps/data-panel/dist temizle
pnpm panel:pack # Paket test (unpacked) pnpm panel:pack # Paket test (unpacked)
pnpm panel:dist # Tum hedefler icin distributable pnpm panel:dist # Tüm hedefler için distributable
pnpm panel:dist:win # Windows NSIS installer pnpm panel:dist:win # Windows NSIS installer
pnpm panel:dist:portable # Windows portable exe pnpm panel:dist:portable # Windows portable exe
``` ```
## Icerik Kaynaklari ## İçerik Kaynakları
- Blog markdown: `content/blog/*.md` - Blog markdown: `content/blog/*.md`
- Podcast markdown: - Podcast markdown:
@@ -55,71 +96,66 @@ pnpm panel:dist:portable # Windows portable exe
- `content/podcasts/masa-basi/*.md` - `content/podcasts/masa-basi/*.md`
- Site verileri: `data/*.ts` - Site verileri: `data/*.ts`
## Electron Panel Neleri Yapar? ## Electron Panel Özellikleri
- Blog/podcast icerigi olusturma-guncelleme-silme - Blog/podcast içeriği oluşturma-güncelleme-silme
- `data/*.ts` export dizilerini form tabanli yonetme - `data/*.ts` export dizilerini form tabanlı yönetme
- `public/` altina medya yukleme/silme - `public/` altına medya yükleme/silme
- `git add + commit + push` ile yayinlama akisi - `git add + commit + push` ile yayınlama akışı
## Open-Source ve Ozellestirme Rehberi ## Özelleştirme ve Açık Kaynak
### 1) Dashboard tab/field ozellestirme ### Dashboard tab/field özelleştirme
Paneldeki koleksiyonlar ve form alanlari su dosyadan yonetilir: Paneldeki koleksiyonlar ve form alanları `apps/data-panel/renderer/configs.js` dosyasından yönetilir.
- `apps/data-panel/renderer/configs.js` - Yeni tab/collection ekleyebilir
- Alan tiplerini (`text`, `textarea`, `number`, `url`) değiştirebilir
- Kart görünümünü özelleştirebilirsin
Buradan: ### Farklı repo kökü ile çalıştırma
- yeni tab/collection ekleyebilir, Panel varsayılan olarak bu monorepo kökünü kullanır. Farklı klasör için:
- alan tiplerini (`text`, `textarea`, `number`, `url`) degistirebilir,
- kart gorunumunu (`card`) ozellestirebilirsin.
### 2) Farkli repo koku ile calistirma - Çevresel değişken: `PORTFOLIO_WORKSPACE_ROOT`
- veya CLI argüman: `--workspace-root=<path>`
Panel varsayilan olarak bu monorepo kokunu kullanir. Farkli klasor icin: Örnek (PowerShell):
- Cevresel degisken: `PORTFOLIO_WORKSPACE_ROOT`
- veya CLI arguman: `--workspace-root=<path>`
Ornek (PowerShell):
```powershell ```powershell
$env:PORTFOLIO_WORKSPACE_ROOT = "D:\my-portfolio-repo" $env:PORTFOLIO_WORKSPACE_ROOT = "D:\my-portfolio-repo"
pnpm panel:dev pnpm panel:dev
``` ```
Ornek (packaged exe): Örnek (packaged exe):
```powershell ```powershell
.\apps\data-panel\dist\portfolio-data-panel-0.1.0-x64-portable.exe --workspace-root="D:\my-portfolio-repo" .\apps\data-panel\dist\portfolio-data-panel-0.1.0-x64-portable.exe --workspace-root="D:\my-portfolio-repo"
``` ```
Panel baslarken `data`, `public`, `content/blog`, `content/podcasts` klasorlerini dogrular. Panel başlarken `data`, `public`, `content/blog`, `content/podcasts` klasörlerini doğrular.
### 3) Publish akisini degistirme ### Publish akışını değiştirme
Git publish akisi `apps/data-panel/main.cjs` icindeki `publishChanges` fonksiyonunda. Git publish akışı `apps/data-panel/main.cjs` içindeki `publishChanges` fonksiyonunda yönetilir.
Varsayilan akista: Varsayılan akış:
- `git add data public content` - `git add data public content`
- otomatik/manuel commit message - Otomatik/manuel commit message
- `git push` - `git push`
Branch seçimi, PR tabanlı akış veya sadece commit modları eklenebilir.
Istersen branch secimi, PR tabanli akış, veya sadece commit modlari ekleyebilirsin. ## Yayın ve Kontrol Listesi
## Release Checklist
1. `pnpm lint` 1. `pnpm lint`
2. `pnpm build` 2. `pnpm build`
3. Icerik/veri kontrolu (`content/`, `data/`, `public/`) 3. İçerik/veri kontrolü (`content/`, `data/`, `public/`)
4. Electron panel akisi kontrolu (`pnpm panel:dev`) 4. Electron panel akışı kontrolü (`pnpm panel:dev`)
5. Gerekirse distributable kontrolu (`pnpm panel:pack` / `pnpm panel:dist`) 5. Gerekirse distributable kontrolü (`pnpm panel:pack` / `pnpm panel:dist`)
## Troubleshooting ## Sorun Giderme
### YouTube cookie/SameSite uyarilari ### YouTube cookie/SameSite uyarıları
Embed URL'ler `youtube-nocookie.com` formatina cekildi. Bu degisiklik cross-site cookie kaynakli konsol gurultusunu azaltir. Embed URL'ler `youtube-nocookie.com` formatına çekildi. Bu değişiklik cross-site cookie kaynaklı konsol gürültüsünü azaltır.
Tarayici guvenlik politikasi nedeniyle bazi 3rd-party loglar tamamen sifirlanamayabilir; bu durumda uygulama davranisi etkilenmez. Tarayıcı güvenlik politikası nedeniyle bazı 3rd-party loglar tamamen sıfırlanamayabilir; bu durumda uygulama davranışı etkilenmez.
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 279 KiB

+44 -5
View File
@@ -1,4 +1,4 @@
import type { Metadata } from "next"; import type { Metadata } from "next";
import "./globals.css"; import "./globals.css";
import { SiteNavbar } from "@/components/site-navbar"; import { SiteNavbar } from "@/components/site-navbar";
@@ -9,14 +9,53 @@ import Link from "next/link";
import { AnnouncementBar } from "poyraz-ui/organisms"; import { AnnouncementBar } from "poyraz-ui/organisms";
export const metadata: Metadata = { export const metadata: Metadata = {
title: metadataBase: new URL("https://poyrazavsever.com"),
"Poyraz Avsever | Portfolyo | Freelancer | Full-stack Geliştirici | Web Geliştirici", title: {
default: "Poyraz Avsever | Portfolyo",
template: "%s | Poyraz Avsever",
},
description: description:
"Poyraz Avsever'in projelerini, yetkinliklerini ve hizmetlerini sergilediği kişisel portfolyo sitesi.", "Poyraz Avsever'in projelerini, yazılım içeriklerini ve teknik çalışmalarını paylaştığı kişisel portfolyo sitesi.",
applicationName: "Poyraz Avsever Portfolyo",
alternates: {
canonical: "/",
},
icons: { icons: {
icon: "/favicon.ico", icon: [
{ url: "/favicon.ico", sizes: "any" },
{ url: "/logo/logo.jpeg", type: "image/jpeg" },
],
shortcut: "/favicon.ico",
apple: "/logo/logo.jpeg",
}, },
authors: [{ name: "Poyraz Avsever" }], authors: [{ name: "Poyraz Avsever" }],
creator: "Poyraz Avsever",
publisher: "Poyraz Avsever",
openGraph: {
type: "website",
locale: "tr_TR",
url: "https://poyrazavsever.com",
siteName: "Poyraz Avsever Portfolyo",
title: "Poyraz Avsever | Portfolyo",
description:
"Poyraz Avsever'in projelerini, yazılım içeriklerini ve teknik çalışmalarını paylaştığı kişisel portfolyo sitesi.",
images: [
{
url: "/logo/logo.jpeg",
width: 1200,
height: 1200,
alt: "Poyraz Avsever Logo",
},
],
},
twitter: {
card: "summary_large_image",
title: "Poyraz Avsever | Portfolyo",
description:
"Poyraz Avsever'in projelerini, yazılım içeriklerini ve teknik çalışmalarını paylaştığı kişisel portfolyo sitesi.",
images: ["/logo/logo.jpeg"],
creator: "@poyrazavsever",
},
keywords: [ keywords: [
"Poyraz Avsever", "Poyraz Avsever",
"Portfolio", "Portfolio",
Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 KiB

+5 -1
View File
@@ -28,6 +28,7 @@
"appId": "com.poyraz.portfolio.datapanel", "appId": "com.poyraz.portfolio.datapanel",
"productName": "Portfolio Data Panel", "productName": "Portfolio Data Panel",
"asar": true, "asar": true,
"icon": "assets/icon.png",
"directories": { "directories": {
"output": "dist" "output": "dist"
}, },
@@ -38,6 +39,7 @@
"package.json" "package.json"
], ],
"win": { "win": {
"icon": "assets/icon.ico",
"signAndEditExecutable": false, "signAndEditExecutable": false,
"target": [ "target": [
{ {
@@ -51,7 +53,9 @@
"nsis": { "nsis": {
"oneClick": false, "oneClick": false,
"allowToChangeInstallationDirectory": true, "allowToChangeInstallationDirectory": true,
"perMachine": false "perMachine": false,
"installerIcon": "assets/icon.ico",
"uninstallerIcon": "assets/icon.ico"
} }
} }
} }
+2 -2
View File
@@ -1,7 +1,7 @@
"use client"; "use client";
import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import Image from "next/image";
import ReactMarkdown from "react-markdown"; import ReactMarkdown from "react-markdown";
import remarkGfm from "remark-gfm"; import remarkGfm from "remark-gfm";
import { useEffect, useMemo, useRef, useState } from "react"; import { useEffect, useMemo, useRef, useState } from "react";
@@ -122,7 +122,7 @@ export function BlogDetailContent({ post }: BlogDetailContentProps) {
</Typography> </Typography>
</header> </header>
<Card className="relative aspect-[16/8] overflow-hidden rounded-sm border-border"> <Card className="relative aspect-16/8 overflow-hidden rounded-sm border-border">
<Image <Image
src={post.coverImage} src={post.coverImage}
alt={post.title} alt={post.title}