Add KeyStatic CMS integration

Features added:
- KeyStatic Core and Astro integration installed
- Markdoc integration for content rendering
- keystatic.config.ts with blog post schema
- Local storage mode for content management
- Conditional loading via SKIP_KEYSTATIC env var
- Netlify build command updated to skip KeyStatic in production

KeyStatic Admin UI available at:
- Local: http://localhost:4321/keystatic
- Production: Disabled for security

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Buğra Canata
2026-01-17 19:51:49 +03:00
parent 2467d5555f
commit 8f64fb1eea
5 changed files with 3203 additions and 106 deletions
+69
View File
@@ -0,0 +1,69 @@
import { config, fields, collection } from '@keystatic/core';
export default config({
storage: {
kind: 'local',
},
collections: {
post: collection({
label: 'Blog Yazıları',
slugField: 'title',
path: 'src/data/post/*',
format: { contentField: 'body' },
schema: {
title: fields.slug({
name: {
label: 'Başlık',
description: 'Blog yazısının başlığı',
},
}),
date: fields.datetime({
label: 'Yayın Tarihi',
description: 'Yazının yayınlanma tarihi',
}),
author: fields.text({
label: 'Yazar',
description: 'Çağrı işareti veya yazar adı',
default: 'TA1SPH',
}),
categories: fields.array(
fields.text({
label: 'Kategori',
})
, {
label: 'Kategoriler',
description: 'Blog yazısının kategorileri',
}),
tags: fields.array(
fields.text({
label: 'Etiket',
})
, {
label: 'Etiketler',
description: 'Blog yazısının etiketleri',
}),
layout: fields.text({
label: 'Düzen',
default: 'post',
}),
image: fields.image({
label: 'Öne Çıkan Görsel',
description: 'Blog yazısı için kapak görseli',
}),
publishDate: fields.datetime({
label: 'Yayınlanma Tarihi',
description: 'Content collection için yayın tarihi',
}),
excerpt: fields.text({
label: 'Özet',
description: 'Blog yazısının kısa özeti',
multiline: true,
}),
body: fields.markdoc({
label: 'İçerik',
description: 'Blog yazısının ana içeriği',
}),
},
}),
},
});