Refactor sitemap and project components; remove snippets page; update project data structure and command palette links

This commit is contained in:
Poyraz Avsever
2026-04-03 11:53:22 +03:00
parent 7b95ca43b7
commit ed5f3b0900
8 changed files with 684 additions and 130 deletions
+325 -44
View File
@@ -1,5 +1,11 @@
export const BLOG_CATEGORIES = ["Frontend", "UX", "Yazilim", "TypeScript", "Testing", "General"];
export const BLOG_CATEGORIES = [
"Frontend",
"UX",
"Yazilim",
"TypeScript",
"Testing",
"General",
];
export const COLLECTION_CONFIGS = {
announcement: {
@@ -8,10 +14,33 @@ export const COLLECTION_CONFIGS = {
fileName: "site-settings.ts",
exportName: "ANNOUNCEMENT_ITEMS",
fields: [
{ key: "id", label: "ID", required: true, placeholder: "main-announcement" },
{ key: "text", label: "Text", type: "textarea", full: true, required: true, placeholder: "Bu hafta yeni bilesenler eklendi!" },
{ key: "actionLabel", label: "Action Label", required: true, placeholder: "Incele ->" },
{ key: "actionHref", label: "Action Link", type: "url", required: true, placeholder: "https://..." },
{
key: "id",
label: "ID",
required: true,
placeholder: "main-announcement",
},
{
key: "text",
label: "Text",
type: "textarea",
full: true,
required: true,
placeholder: "Bu hafta yeni bilesenler eklendi!",
},
{
key: "actionLabel",
label: "Action Label",
required: true,
placeholder: "Incele ->",
},
{
key: "actionHref",
label: "Action Link",
type: "url",
required: true,
placeholder: "https://...",
},
],
card: (item) => ({
title: item.id || "Announcement",
@@ -25,11 +54,34 @@ export const COLLECTION_CONFIGS = {
fileName: "bookmarks.ts",
exportName: "BOOKMARKS",
fields: [
{ key: "id", label: "ID", required: true, placeholder: "bookmark-poyraz-ui" },
{ key: "title", label: "Title", required: true, placeholder: "Poyraz UI" },
{ key: "href", label: "Link", type: "url", required: true, placeholder: "https://..." },
{
key: "id",
label: "ID",
required: true,
placeholder: "bookmark-poyraz-ui",
},
{
key: "title",
label: "Title",
required: true,
placeholder: "Poyraz UI",
},
{
key: "href",
label: "Link",
type: "url",
required: true,
placeholder: "https://...",
},
{ key: "tag", label: "Tag", required: true, placeholder: "UI Kit" },
{ key: "description", label: "Description", type: "textarea", full: true, required: true, placeholder: "Short description" },
{
key: "description",
label: "Description",
type: "textarea",
full: true,
required: true,
placeholder: "Short description",
},
],
card: (item) => ({
title: item.title || item.id || "Untitled bookmark",
@@ -43,12 +95,39 @@ export const COLLECTION_CONFIGS = {
fileName: "certificates.ts",
exportName: "certificates",
fields: [
{ key: "name", label: "Name", required: true, placeholder: "Certificate name" },
{ key: "organization", label: "Organization", required: true, placeholder: "Udemy" },
{
key: "name",
label: "Name",
required: true,
placeholder: "Certificate name",
},
{
key: "organization",
label: "Organization",
required: true,
placeholder: "Udemy",
},
{ key: "date", label: "Date", required: true, placeholder: "June 2025" },
{ key: "category", label: "Category", required: true, placeholder: "mobile" },
{ key: "image", label: "Image Path", required: true, placeholder: "/certificates/reactnative.png" },
{ key: "description", label: "Description", type: "textarea", full: true, required: true, placeholder: "What this certificate represents" },
{
key: "category",
label: "Category",
required: true,
placeholder: "mobile",
},
{
key: "image",
label: "Image Path",
required: true,
placeholder: "/certificates/reactnative.png",
},
{
key: "description",
label: "Description",
type: "textarea",
full: true,
required: true,
placeholder: "What this certificate represents",
},
],
card: (item) => ({
title: item.name || "Untitled certificate",
@@ -62,11 +141,38 @@ export const COLLECTION_CONFIGS = {
fileName: "education.ts",
exportName: "EDUCATION",
fields: [
{ key: "id", label: "ID", required: true, placeholder: "ostim-university" },
{ key: "title", label: "Title", required: true, placeholder: "Software Engineering - 2nd Year Student" },
{ key: "institution", label: "Institution", required: true, placeholder: "OSTIM Technical University" },
{ key: "period", label: "Period", required: true, placeholder: "2024 - Present" },
{ key: "description", label: "Description", type: "textarea", full: true, required: true, placeholder: "Education summary" },
{
key: "id",
label: "ID",
required: true,
placeholder: "ostim-university",
},
{
key: "title",
label: "Title",
required: true,
placeholder: "Software Engineering - 2nd Year Student",
},
{
key: "institution",
label: "Institution",
required: true,
placeholder: "OSTIM Technical University",
},
{
key: "period",
label: "Period",
required: true,
placeholder: "2024 - Present",
},
{
key: "description",
label: "Description",
type: "textarea",
full: true,
required: true,
placeholder: "Education summary",
},
],
card: (item) => ({
title: item.title || item.id || "Education",
@@ -80,10 +186,30 @@ export const COLLECTION_CONFIGS = {
fileName: "experience.ts",
exportName: "EXPERIENCE",
fields: [
{ key: "id", label: "ID", required: true, placeholder: "omedya-part-time" },
{ key: "role", label: "Role", required: true, placeholder: "Fullstack Developer" },
{ key: "company", label: "Company", required: true, placeholder: "Omedya Bilisim A.S" },
{ key: "period", label: "Period", required: true, placeholder: "August 2025 - Present" },
{
key: "id",
label: "ID",
required: true,
placeholder: "omedya-part-time",
},
{
key: "role",
label: "Role",
required: true,
placeholder: "Fullstack Developer",
},
{
key: "company",
label: "Company",
required: true,
placeholder: "Omedya Bilisim A.S",
},
{
key: "period",
label: "Period",
required: true,
placeholder: "August 2025 - Present",
},
],
card: (item) => ({
title: item.role || item.id || "Experience",
@@ -97,12 +223,47 @@ export const COLLECTION_CONFIGS = {
exportName: "REFERENCES",
fields: [
{ key: "id", label: "ID", required: true, placeholder: "ali-korkmaz" },
{ key: "author", label: "Author", required: true, placeholder: "Ali Korkmaz" },
{ key: "role", label: "Role", required: true, placeholder: "Musteri - 2025" },
{ key: "avatar", label: "Avatar Path", required: true, placeholder: "/avatars/ali.png" },
{ key: "rating", label: "Rating", type: "number", min: 1, max: 5, step: 1, placeholder: "5" },
{ key: "profileHref", label: "Profile Link", type: "url", placeholder: "https://linkedin.com/in/..." },
{ key: "quote", label: "Quote", type: "textarea", full: true, required: true, placeholder: "Reference quote" },
{
key: "author",
label: "Author",
required: true,
placeholder: "Ali Korkmaz",
},
{
key: "role",
label: "Role",
required: true,
placeholder: "Musteri - 2025",
},
{
key: "avatar",
label: "Avatar Path",
required: true,
placeholder: "/avatars/ali.png",
},
{
key: "rating",
label: "Rating",
type: "number",
min: 1,
max: 5,
step: 1,
placeholder: "5",
},
{
key: "profileHref",
label: "Profile Link",
type: "url",
placeholder: "https://linkedin.com/in/...",
},
{
key: "quote",
label: "Quote",
type: "textarea",
full: true,
required: true,
placeholder: "Reference quote",
},
],
card: (item) => ({
title: item.author || item.id || "Reference",
@@ -116,12 +277,34 @@ export const COLLECTION_CONFIGS = {
fileName: "projects.ts",
exportName: "MOBILE_APPS",
fields: [
{ key: "id", label: "ID", required: true, placeholder: "mobile-habit-flow" },
{ key: "title", label: "Title", required: true, placeholder: "Habit Flow" },
{
key: "id",
label: "ID",
required: true,
placeholder: "mobile-habit-flow",
},
{
key: "title",
label: "Title",
required: true,
placeholder: "Habit Flow",
},
{ key: "badge", label: "Badge", placeholder: "React Native" },
{ key: "image", label: "Image Path", required: true, placeholder: "/images/hero1.png" },
{
key: "image",
label: "Image Path",
required: true,
placeholder: "/images/hero1.png",
},
{ key: "href", label: "Link", type: "url", placeholder: "https://..." },
{ key: "description", label: "Description", type: "textarea", full: true, required: true, placeholder: "Project summary" },
{
key: "description",
label: "Description",
type: "textarea",
full: true,
required: true,
placeholder: "Project summary",
},
],
card: (item) => ({
title: item.title || item.id || "Project",
@@ -136,11 +319,69 @@ export const COLLECTION_CONFIGS = {
exportName: "WEB_APPS",
fields: [
{ key: "id", label: "ID", required: true, placeholder: "web-portfolio" },
{ key: "title", label: "Title", required: true, placeholder: "Personal Portfolio" },
{
key: "title",
label: "Title",
required: true,
placeholder: "Personal Portfolio",
},
{ key: "badge", label: "Badge", placeholder: "Next.js" },
{ key: "image", label: "Image Path", required: true, placeholder: "/news/design.svg" },
{
key: "image",
label: "Image Path",
required: true,
placeholder: "/news/design.svg",
},
{ key: "href", label: "Link", type: "url", placeholder: "https://..." },
{ key: "description", label: "Description", type: "textarea", full: true, required: true, placeholder: "Project summary" },
{
key: "description",
label: "Description",
type: "textarea",
full: true,
required: true,
placeholder: "Project summary",
},
],
card: (item) => ({
title: item.title || item.id || "Project",
meta: [item.badge, item.href],
footer: item.description,
}),
},
projectsExtensions: {
label: "Projects Extensions",
itemLabel: "Extension Project",
fileName: "projects.ts",
exportName: "EXTENSIONS",
fields: [
{
key: "id",
label: "ID",
required: true,
placeholder: "extension-theme-tuner",
},
{
key: "title",
label: "Title",
required: true,
placeholder: "Theme Tuner",
},
{ key: "badge", label: "Badge", placeholder: "VS Code Extension" },
{
key: "image",
label: "Image Path",
required: true,
placeholder: "/news/design.svg",
},
{ key: "href", label: "Link", type: "url", placeholder: "https://..." },
{
key: "description",
label: "Description",
type: "textarea",
full: true,
required: true,
placeholder: "Project summary",
},
],
card: (item) => ({
title: item.title || item.id || "Project",
@@ -154,12 +395,34 @@ export const COLLECTION_CONFIGS = {
fileName: "projects.ts",
exportName: "FIGMA_TEMPLATES",
fields: [
{ key: "id", label: "ID", required: true, placeholder: "figma-minimal-saas" },
{ key: "title", label: "Title", required: true, placeholder: "Minimal SaaS Landing Kit" },
{
key: "id",
label: "ID",
required: true,
placeholder: "figma-minimal-saas",
},
{
key: "title",
label: "Title",
required: true,
placeholder: "Minimal SaaS Landing Kit",
},
{ key: "badge", label: "Badge", placeholder: "Figma" },
{ key: "image", label: "Image Path", required: true, placeholder: "/news/design.svg" },
{
key: "image",
label: "Image Path",
required: true,
placeholder: "/news/design.svg",
},
{ key: "href", label: "Link", type: "url", placeholder: "https://..." },
{ key: "description", label: "Description", type: "textarea", full: true, required: true, placeholder: "Project summary" },
{
key: "description",
label: "Description",
type: "textarea",
full: true,
required: true,
placeholder: "Project summary",
},
],
card: (item) => ({
title: item.title || item.id || "Project",
@@ -175,9 +438,21 @@ export const COLLECTION_CONFIGS = {
fields: [
{ key: "id", label: "ID", required: true, placeholder: "youtube" },
{ key: "title", label: "Title", required: true, placeholder: "YouTube" },
{ key: "timeline", label: "Timeline", required: true, placeholder: "2025 - Present" },
{
key: "timeline",
label: "Timeline",
required: true,
placeholder: "2025 - Present",
},
{ key: "link", label: "Link", type: "url", placeholder: "https://..." },
{ key: "focus", label: "Focus", type: "textarea", full: true, required: true, placeholder: "Community contribution summary" },
{
key: "focus",
label: "Focus",
type: "textarea",
full: true,
required: true,
placeholder: "Community contribution summary",
},
],
card: (item) => ({
title: item.title || item.id || "Community",
@@ -191,7 +466,13 @@ export const COLLECTION_CONFIGS = {
fileName: "youtube-videos.ts",
exportName: "YOUTUBE_VIDEO_LINKS",
fields: [
{ key: "url", label: "Video URL", type: "url", required: true, placeholder: "https://www.youtube.com/watch?v=..." },
{
key: "url",
label: "Video URL",
type: "url",
required: true,
placeholder: "https://www.youtube.com/watch?v=...",
},
],
deserializeItem: (raw) => ({ url: String(raw || "") }),
serializeItem: (item) => String(item.url || "").trim(),
+151 -30
View File
@@ -10,26 +10,106 @@
<header class="topbar">
<div>
<h1>Portfolio Data Panel</h1>
<p>Manage blog posts, dashboard collections, media files, and publish updates.</p>
<p>
Manage blog posts, dashboard collections, media files, and publish
updates.
</p>
</div>
<div class="chip">Electron Monorepo</div>
</header>
<nav class="tabs">
<button class="tab-btn active" data-tab="blog">Blog</button>
<button class="tab-btn" data-tab="collection" data-collection-key="announcement">Announcement</button>
<button class="tab-btn" data-tab="podcast" data-podcast-kind="yazilim">Podcast Yazilim</button>
<button class="tab-btn" data-tab="podcast" data-podcast-kind="masa-basi">Podcast Masa Basi</button>
<button class="tab-btn" data-tab="collection" data-collection-key="bookmarks">Bookmarks</button>
<button class="tab-btn" data-tab="collection" data-collection-key="certificates">Certificates</button>
<button class="tab-btn" data-tab="collection" data-collection-key="education">Education</button>
<button class="tab-btn" data-tab="collection" data-collection-key="experience">Experience</button>
<button class="tab-btn" data-tab="collection" data-collection-key="references">References</button>
<button class="tab-btn" data-tab="collection" data-collection-key="projectsMobile">Projects Mobile</button>
<button class="tab-btn" data-tab="collection" data-collection-key="projectsWeb">Projects Web</button>
<button class="tab-btn" data-tab="collection" data-collection-key="projectsFigma">Projects Figma</button>
<button class="tab-btn" data-tab="collection" data-collection-key="community">Community</button>
<button class="tab-btn" data-tab="collection" data-collection-key="youtube">YouTube</button>
<button
class="tab-btn"
data-tab="collection"
data-collection-key="announcement"
>
Announcement
</button>
<button class="tab-btn" data-tab="podcast" data-podcast-kind="yazilim">
Podcast Yazilim
</button>
<button class="tab-btn" data-tab="podcast" data-podcast-kind="masa-basi">
Podcast Masa Basi
</button>
<button
class="tab-btn"
data-tab="collection"
data-collection-key="bookmarks"
>
Bookmarks
</button>
<button
class="tab-btn"
data-tab="collection"
data-collection-key="certificates"
>
Certificates
</button>
<button
class="tab-btn"
data-tab="collection"
data-collection-key="education"
>
Education
</button>
<button
class="tab-btn"
data-tab="collection"
data-collection-key="experience"
>
Experience
</button>
<button
class="tab-btn"
data-tab="collection"
data-collection-key="references"
>
References
</button>
<button
class="tab-btn"
data-tab="collection"
data-collection-key="projectsMobile"
>
Projects Mobile
</button>
<button
class="tab-btn"
data-tab="collection"
data-collection-key="projectsWeb"
>
Projects Web
</button>
<button
class="tab-btn"
data-tab="collection"
data-collection-key="projectsExtensions"
>
Projects Extensions
</button>
<button
class="tab-btn"
data-tab="collection"
data-collection-key="projectsFigma"
>
Projects Figma
</button>
<button
class="tab-btn"
data-tab="collection"
data-collection-key="community"
>
Community
</button>
<button
class="tab-btn"
data-tab="collection"
data-collection-key="youtube"
>
YouTube
</button>
<button class="tab-btn" data-tab="media">Media</button>
<button class="tab-btn" data-tab="publish">Publish</button>
</nav>
@@ -40,7 +120,9 @@
<aside class="card sidebar">
<div class="sidebar-header">
<h2>Blog Posts</h2>
<button id="refresh-blog-files" class="btn btn-ghost">Refresh</button>
<button id="refresh-blog-files" class="btn btn-ghost">
Refresh
</button>
</div>
<div id="blog-card-list" class="blog-card-list"></div>
<button id="new-blog-file" class="btn mt-8">New Blog Post</button>
@@ -50,7 +132,9 @@
<div class="editor-head">
<h2 id="blog-editor-title">Create Blog Post</h2>
<div class="row">
<button id="delete-blog-file" class="btn btn-danger">Delete</button>
<button id="delete-blog-file" class="btn btn-danger">
Delete
</button>
<button id="save-blog-file" class="btn">Save</button>
</div>
</div>
@@ -58,11 +142,17 @@
<div class="blog-form-grid">
<div>
<label for="blog-slug">Slug</label>
<input id="blog-slug" placeholder="building-minimal-design-systems" />
<input
id="blog-slug"
placeholder="building-minimal-design-systems"
/>
</div>
<div>
<label for="blog-title">Title</label>
<input id="blog-title" placeholder="Building Minimal Design Systems" />
<input
id="blog-title"
placeholder="Building Minimal Design Systems"
/>
</div>
<div>
<label for="blog-category">Category</label>
@@ -86,7 +176,11 @@
</div>
<div class="full">
<label for="blog-excerpt">Excerpt</label>
<textarea id="blog-excerpt" class="small-editor" spellcheck="false"></textarea>
<textarea
id="blog-excerpt"
class="small-editor"
spellcheck="false"
></textarea>
</div>
<div class="full">
<label for="blog-editor">Markdown Content</label>
@@ -102,7 +196,9 @@
<aside class="card sidebar">
<div class="sidebar-header">
<h2 id="collection-sidebar-title">Bookmarks</h2>
<button id="refresh-collection" class="btn btn-ghost">Refresh</button>
<button id="refresh-collection" class="btn btn-ghost">
Refresh
</button>
</div>
<div id="collection-card-list" class="blog-card-list"></div>
<button id="new-collection-item" class="btn mt-8">New Item</button>
@@ -112,12 +208,16 @@
<div class="editor-head">
<h2 id="collection-editor-title">Create Item</h2>
<div class="row">
<button id="delete-collection-item" class="btn btn-danger">Delete</button>
<button id="delete-collection-item" class="btn btn-danger">
Delete
</button>
<button id="save-collection-item" class="btn">Save</button>
</div>
</div>
<p id="collection-helper" class="hint">Fill inputs and save to update the related data export.</p>
<p id="collection-helper" class="hint">
Fill inputs and save to update the related data export.
</p>
<div id="collection-form-grid" class="blog-form-grid"></div>
</section>
</div>
@@ -128,7 +228,9 @@
<aside class="card sidebar">
<div class="sidebar-header">
<h2 id="podcast-sidebar-title">Podcast Episodes</h2>
<button id="refresh-podcast-files" class="btn btn-ghost">Refresh</button>
<button id="refresh-podcast-files" class="btn btn-ghost">
Refresh
</button>
</div>
<div id="podcast-card-list" class="blog-card-list"></div>
<button id="new-podcast-file" class="btn mt-8">New Episode</button>
@@ -138,7 +240,9 @@
<div class="editor-head">
<h2 id="podcast-editor-title">Create Episode</h2>
<div class="row">
<button id="delete-podcast-file" class="btn btn-danger">Delete</button>
<button id="delete-podcast-file" class="btn btn-danger">
Delete
</button>
<button id="save-podcast-file" class="btn">Save</button>
</div>
</div>
@@ -146,11 +250,17 @@
<div class="blog-form-grid">
<div>
<label for="podcast-slug">Slug</label>
<input id="podcast-slug" placeholder="2026-03-09-foundations-over-tools" />
<input
id="podcast-slug"
placeholder="2026-03-09-foundations-over-tools"
/>
</div>
<div>
<label for="podcast-title">Title</label>
<input id="podcast-title" placeholder="Foundations Over Tools" />
<input
id="podcast-title"
placeholder="Foundations Over Tools"
/>
</div>
<div>
<label for="podcast-date">Date</label>
@@ -158,11 +268,17 @@
</div>
<div>
<label for="podcast-youtube-url">YouTube URL</label>
<input id="podcast-youtube-url" placeholder="https://www.youtube.com/watch?v=..." />
<input
id="podcast-youtube-url"
placeholder="https://www.youtube.com/watch?v=..."
/>
</div>
<div class="full">
<label for="podcast-spotify-url">Spotify URL</label>
<input id="podcast-spotify-url" placeholder="https://open.spotify.com/show/..." />
<input
id="podcast-spotify-url"
placeholder="https://open.spotify.com/show/..."
/>
</div>
<div class="full">
<label for="podcast-editor">Markdown Content</label>
@@ -205,10 +321,15 @@
<div class="card publish-card">
<div class="row between">
<h2>Publish Changes</h2>
<button id="refresh-status" class="btn btn-ghost">Refresh Status</button>
<button id="refresh-status" class="btn btn-ghost">
Refresh Status
</button>
</div>
<p class="hint">This will stage <code>data/</code>, <code>public/</code> and <code>content/</code>, create commit, and push.</p>
<p class="hint">
This will stage <code>data/</code>, <code>public/</code> and
<code>content/</code>, create commit, and push.
</p>
<label for="commit-message">Commit Message (optional)</label>
<input id="commit-message" placeholder="Auto-generated if empty" />