Enable KeyStatic CMS for production

Changes:
- Added Netlify adapter for server-side rendering
- Changed output mode from static to server
- Updated KeyStatic storage from local to GitHub
- Removed SKIP_KEYSTATIC from Netlify build
- KeyStatic Admin UI will be available at /keystatic

Features:
- Server-side rendering with Netlify Functions
- GitHub integration for content management
- Production-ready KeyStatic Admin UI

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Buğra Canata
2026-01-17 20:05:42 +03:00
parent 8f64fb1eea
commit e05f99a0d2
5312 changed files with 102603 additions and 284 deletions
@@ -0,0 +1,208 @@
import { c as createComponent, m as maybeRenderHead, r as renderComponent, a as renderTemplate, e as createAstro, b as addAttribute, f as renderSlot, s as spreadAttributes, F as Fragment, u as unescapeHTML } from './astro/server_BfDhyAjM.mjs';
import 'kleur/colors';
import { a as $$Icon, $ as $$Layout } from './Icon_C8ArtCuv.mjs';
import { Image as $$Image } from './_astro_assets_CEb4NYTX.mjs';
import logoImage from './ARC_2024_bayrak_logo-Large-1-1024x1024_C43xBVnw.mjs';
import { U as UI, t as trimSlash, g as getHomePermalink, b as getAsset, S as SITE, a as getPermalink, d as getBlogPermalink } from './permalinks_BMxSf01e.mjs';
import 'clsx';
import { twMerge } from 'tailwind-merge';
const $$Logo = createComponent(($$result, $$props, $$slots) => {
return renderTemplate`${maybeRenderHead()}<div class="flex items-center"> ${renderComponent($$result, "Image", $$Image, { "src": logoImage, "alt": "ARC Logo", "width": 40, "height": 40, "class": "mr-2" })} <span class="self-center text-2xl md:text-xl font-bold text-gray-900 whitespace-nowrap dark:text-white"> ARC </span> </div>`;
}, "/Users/bugracanata/Developer/[Telsiz]/ARC-Web-Sitesi/src/components/Logo.astro", void 0);
const $$Astro$5 = createAstro("https://www.radio.org.tr");
const $$ToggleTheme = createComponent(($$result, $$props, $$slots) => {
const Astro2 = $$result.createAstro($$Astro$5, $$props, $$slots);
Astro2.self = $$ToggleTheme;
const {
label = "Toggle between Dark and Light mode",
class: className = "text-muted dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg text-sm p-2.5 inline-flex items-center",
iconClass = "w-6 h-6",
iconName = "tabler:sun"
} = Astro2.props;
return renderTemplate`${!(UI.theme.endsWith(":only")) && renderTemplate`${maybeRenderHead()}<button type="button"${addAttribute(className, "class")}${addAttribute(label, "aria-label")} data-aw-toggle-color-scheme>${renderComponent($$result, "Icon", $$Icon, { "name": iconName, "class": iconClass })}</button>`}`;
}, "/Users/bugracanata/Developer/[Telsiz]/ARC-Web-Sitesi/src/components/common/ToggleTheme.astro", void 0);
const $$Astro$4 = createAstro("https://www.radio.org.tr");
const $$ToggleMenu = createComponent(($$result, $$props, $$slots) => {
const Astro2 = $$result.createAstro($$Astro$4, $$props, $$slots);
Astro2.self = $$ToggleMenu;
const {
label = "Toggle Menu",
class: className = "flex flex-col h-12 w-12 rounded justify-center items-center cursor-pointer group"
} = Astro2.props;
return renderTemplate`${maybeRenderHead()}<button type="button"${addAttribute(className, "class")}${addAttribute(label, "aria-label")} data-aw-toggle-menu> <span class="sr-only">${label}</span> ${renderSlot($$result, $$slots["default"], renderTemplate` <span aria-hidden="true" class="h-0.5 w-6 my-1 rounded-full bg-black dark:bg-white transition ease transform duration-200 opacity-80 group-[.expanded]:rotate-45 group-[.expanded]:translate-y-2.5"></span> <span aria-hidden="true" class="h-0.5 w-6 my-1 rounded-full bg-black dark:bg-white transition ease transform duration-200 opacity-80 group-[.expanded]:opacity-0"></span> <span aria-hidden="true" class="h-0.5 w-6 my-1 rounded-full bg-black dark:bg-white transition ease transform duration-200 opacity-80 group-[.expanded]:-rotate-45 group-[.expanded]:-translate-y-2.5"></span> `)} </button>`;
}, "/Users/bugracanata/Developer/[Telsiz]/ARC-Web-Sitesi/src/components/common/ToggleMenu.astro", void 0);
const $$Astro$3 = createAstro("https://www.radio.org.tr");
const $$Button = createComponent(($$result, $$props, $$slots) => {
const Astro2 = $$result.createAstro($$Astro$3, $$props, $$slots);
Astro2.self = $$Button;
const {
variant = "secondary",
target,
text = Astro2.slots.render("default"),
icon = "",
class: className = "",
type,
...rest
} = Astro2.props;
const variants = {
primary: "btn-primary",
secondary: "btn-secondary",
tertiary: "btn btn-tertiary",
link: "cursor-pointer hover:text-primary"
};
return renderTemplate`${type === "button" || type === "submit" || type === "reset" ? renderTemplate`${maybeRenderHead()}<button${addAttribute(type, "type")}${addAttribute(twMerge(variants[variant] || "", className), "class")}${spreadAttributes(rest)}>${renderComponent($$result, "Fragment", Fragment, {}, { "default": ($$result2) => renderTemplate`${unescapeHTML(text)}` })}${icon && renderTemplate`${renderComponent($$result, "Icon", $$Icon, { "name": icon, "class": "w-5 h-5 ml-1 -mr-1.5 rtl:mr-1 rtl:-ml-1.5 inline-block" })}`}</button>` : renderTemplate`<a${addAttribute(twMerge(variants[variant] || "", className), "class")}${spreadAttributes(target ? { target, rel: "noopener noreferrer" } : {})}${spreadAttributes(rest)}>${renderComponent($$result, "Fragment", Fragment, {}, { "default": ($$result2) => renderTemplate`${unescapeHTML(text)}` })}${icon && renderTemplate`${renderComponent($$result, "Icon", $$Icon, { "name": icon, "class": "w-5 h-5 ml-1 -mr-1.5 rtl:mr-1 rtl:-ml-1.5 inline-block" })}`}</a>`}`;
}, "/Users/bugracanata/Developer/[Telsiz]/ARC-Web-Sitesi/src/components/ui/Button.astro", void 0);
const $$Astro$2 = createAstro("https://www.radio.org.tr");
const $$Header = createComponent(($$result, $$props, $$slots) => {
const Astro2 = $$result.createAstro($$Astro$2, $$props, $$slots);
Astro2.self = $$Header;
const {
id = "header",
links = [],
actions = [],
isSticky = false,
isDark = false,
isFullWidth = false,
showToggleTheme = false,
showRssFeed = false,
position = "center"
} = Astro2.props;
const currentPath = `/${trimSlash(new URL(Astro2.url).pathname)}`;
return renderTemplate`${maybeRenderHead()}<header${addAttribute([
{ sticky: isSticky, relative: !isSticky, dark: isDark },
"top-0 z-40 flex-none mx-auto w-full border-b border-gray-50/0 transition-[opacity] ease-in-out"
], "class:list")}${spreadAttributes(isSticky ? { "data-aw-sticky-header": true } : {})}${spreadAttributes(id ? { id } : {})}> <div class="absolute inset-0"></div> <div${addAttribute([
"relative text-default py-3 px-3 md:px-6 mx-auto w-full",
{
"md:flex md:justify-between": position !== "center"
},
{
"md:grid md:grid-cols-3 md:items-center": position === "center"
},
{
"max-w-7xl": !isFullWidth
}
], "class:list")}> <div${addAttribute([{ "mr-auto rtl:mr-0 rtl:ml-auto": position === "right" }, "flex justify-between"], "class:list")}> <a class="flex items-center"${addAttribute(getHomePermalink(), "href")}> ${renderComponent($$result, "Logo", $$Logo, {})} </a> <div class="flex items-center md:hidden"> ${renderComponent($$result, "ToggleMenu", $$ToggleMenu, {})} </div> </div> <nav class="items-center w-full md:w-auto hidden md:flex md:mx-5 text-default overflow-y-auto overflow-x-hidden md:overflow-y-visible md:overflow-x-auto md:justify-self-center" aria-label="Main navigation"> <ul class="flex flex-col md:flex-row md:self-center w-full md:w-auto text-xl md:text-[0.9375rem] tracking-[0.01rem] font-medium md:justify-center"> ${links.map(({ text, href, links: links2 }) => renderTemplate`<li${addAttribute(links2?.length ? "dropdown" : "", "class")}> ${links2?.length ? renderTemplate`${renderComponent($$result, "Fragment", Fragment, {}, { "default": ($$result2) => renderTemplate` <button type="button" class="hover:text-link dark:hover:text-white px-4 py-3 flex items-center whitespace-nowrap"> ${text}${" "} ${renderComponent($$result2, "Icon", $$Icon, { "name": "tabler:chevron-down", "class": "w-3.5 h-3.5 ml-0.5 rtl:ml-0 rtl:mr-0.5 hidden md:inline" })} </button> <ul class="dropdown-menu md:backdrop-blur-md dark:md:bg-dark rounded md:absolute pl-4 md:pl-0 md:hidden font-medium md:bg-white/90 md:min-w-[200px] drop-shadow-xl"> ${links2.map(({ text: text2, href: href2 }) => renderTemplate`<li> <a${addAttribute([
"first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap",
{ "aw-link-active": href2 === currentPath }
], "class:list")}${addAttribute(href2, "href")}> ${text2} </a> </li>`)} </ul> ` })}` : renderTemplate`<a${addAttribute([
"hover:text-link dark:hover:text-white px-4 py-3 flex items-center whitespace-nowrap",
{ "aw-link-active": href === currentPath }
], "class:list")}${addAttribute(href, "href")}> ${text} </a>`} </li>`)} </ul> </nav> <div${addAttribute([
{ "ml-auto rtl:ml-0 rtl:mr-auto": position === "left" },
"hidden md:self-center md:flex items-center md:mb-0 fixed w-full md:w-auto md:static justify-end left-0 rtl:left-auto rtl:right-0 bottom-0 p-3 md:p-0 md:justify-self-end"
], "class:list")}> <div class="items-center flex justify-between w-full md:w-auto"> <div class="flex"> ${showToggleTheme && renderTemplate`${renderComponent($$result, "ToggleTheme", $$ToggleTheme, { "iconClass": "w-6 h-6 md:w-5 md:h-5 md:inline-block" })}`} ${showRssFeed && renderTemplate`<a class="text-muted dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg text-sm p-2.5 inline-flex items-center" aria-label="RSS Feed"${addAttribute(getAsset("/rss.xml"), "href")}> ${renderComponent($$result, "Icon", $$Icon, { "name": "tabler:rss", "class": "w-5 h-5" })} </a>`} </div> ${actions?.length ? renderTemplate`<span class="ml-4 rtl:ml-0 rtl:mr-4"> ${actions.map((btnProps) => renderTemplate`${renderComponent($$result, "Button", $$Button, { ...btnProps, "class": "ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto" })}`)} </span>` : ""} </div> </div> </div> </header>`;
}, "/Users/bugracanata/Developer/[Telsiz]/ARC-Web-Sitesi/src/components/widgets/Header.astro", void 0);
const $$Astro$1 = createAstro("https://www.radio.org.tr");
const $$Footer = createComponent(($$result, $$props, $$slots) => {
const Astro2 = $$result.createAstro($$Astro$1, $$props, $$slots);
Astro2.self = $$Footer;
const { socialLinks = [], secondaryLinks = [], links = [], footNote = "", theme = "light" } = Astro2.props;
return renderTemplate`${maybeRenderHead()}<footer${addAttribute([{ dark: theme === "dark" }, "relative border-t border-gray-200 dark:border-slate-800 not-prose"], "class:list")}> <div class="dark:bg-dark absolute inset-0 pointer-events-none" aria-hidden="true"></div> <div class="relative max-w-7xl mx-auto px-4 sm:px-6 dark:text-slate-300 intersect-once intersect-quarter intercept-no-queue motion-safe:md:opacity-0 motion-safe:md:intersect:animate-fade"> <div class="grid grid-cols-12 gap-4 gap-y-8 sm:gap-8 py-8 md:py-12"> <div class="col-span-12 lg:col-span-4"> <div class="mb-2"> <a class="inline-block font-bold text-xl"${addAttribute(getHomePermalink(), "href")}>${SITE?.name}</a> </div> <div class="text-sm text-muted flex gap-1"> ${secondaryLinks.map(({ text, href }, index) => renderTemplate`${renderComponent($$result, "Fragment", Fragment, {}, { "default": ($$result2) => renderTemplate`${index !== 0 ? " \xB7 " : ""}<a class="text-muted hover:text-gray-700 dark:text-gray-400 hover:underline transition duration-150 ease-in-out"${addAttribute(href, "href")}>${unescapeHTML(text)}</a> ` })}`)} </div> </div> ${links.map(({ title, links: links2 }) => renderTemplate`<div class="col-span-6 md:col-span-3 lg:col-span-2"> <div class="dark:text-gray-300 font-medium mb-2">${title}</div> ${links2 && Array.isArray(links2) && links2.length > 0 && renderTemplate`<ul class="text-sm"> ${links2.map(({ text, href, ariaLabel }) => renderTemplate`<li class="mb-2"> <a class="text-muted hover:text-gray-700 hover:underline dark:text-gray-400 transition duration-150 ease-in-out"${addAttribute(href, "href")}${addAttribute(ariaLabel, "aria-label")}> ${renderComponent($$result, "Fragment", Fragment, {}, { "default": ($$result2) => renderTemplate`${unescapeHTML(text)}` })} </a> </li>`)} </ul>`} </div>`)} </div> <div class="md:flex md:items-center md:justify-between py-6 md:py-8"> ${socialLinks?.length ? renderTemplate`<ul class="flex mb-4 md:order-1 -ml-2 md:ml-4 md:mb-0 rtl:ml-0 rtl:-mr-2 rtl:md:ml-0 rtl:md:mr-4"> ${socialLinks.map(({ ariaLabel, href, text, icon }) => renderTemplate`<li> <a class="text-muted dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg text-sm p-2.5 inline-flex items-center"${addAttribute(ariaLabel, "aria-label")}${addAttribute(href, "href")}> ${icon && renderTemplate`${renderComponent($$result, "Icon", $$Icon, { "name": icon, "class": "w-5 h-5" })}`} ${renderComponent($$result, "Fragment", Fragment, {}, { "default": ($$result2) => renderTemplate`${unescapeHTML(text)}` })} </a> </li>`)} </ul>` : ""} <div class="text-sm mr-4 dark:text-muted"> ${renderComponent($$result, "Fragment", Fragment, {}, { "default": ($$result2) => renderTemplate`${unescapeHTML(footNote)}` })} </div> </div> </div> </footer>`;
}, "/Users/bugracanata/Developer/[Telsiz]/ARC-Web-Sitesi/src/components/widgets/Footer.astro", void 0);
const headerData = {
links: [
{
text: "Ana Sayfa",
href: getPermalink("/")
},
{
text: "Hakkımızda",
href: getPermalink("/hakkimizda")
},
{
text: "Blog",
href: getBlogPermalink()
},
{
text: "Kategoriler",
href: getPermalink("/kategoriler")
},
{
text: "Etiketler",
href: getPermalink("/etiketler")
},
{
text: "Sınav Hazırlık",
href: "https://sinav.radio.org.tr/",
target: "_blank"
},
{
text: "DMR Editor",
href: "https://dmr.radio.org.tr/",
target: "_blank"
},
{
text: "İletişim",
href: getPermalink("/iletisim")
}
],
actions: [{ text: "İletişim", href: getPermalink("/iletisim"), icon: "tabler:mail" }]
};
const footerData = {
links: [
{
title: "Hızlı Linkler",
links: [
{ text: "Ana Sayfa", href: getPermalink("/") },
{ text: "Hakkımızda", href: getPermalink("/hakkimizda") },
{ text: "Blog", href: getBlogPermalink() },
{ text: "Kategoriler", href: getPermalink("/kategoriler") },
{ text: "Etiketler", href: getPermalink("/etiketler") },
{ text: "Sınav Hazırlık", href: "https://sinav.radio.org.tr/", target: "_blank" },
{ text: "DMR Editor", href: "https://dmr.radio.org.tr/", target: "_blank" },
{ text: "İletişim", href: getPermalink("/iletisim") }
]
},
{
title: "Hizmetler",
links: [
{ text: "Eğitim Programları", href: getPermalink("/iletisim") },
{ text: "Lisans Sınavı Hazırlığı", href: getPermalink("/iletisim") },
{ text: "Teknik Destek", href: getPermalink("/iletisim") },
{ text: "Acil Haberleşme", href: getPermalink("/iletisim") }
]
},
{
title: "İletişim",
links: [
{ text: "E-posta: bilgi@radio.org.tr", href: "mailto:bilgi@radio.org.tr" },
{ text: "Telefon: +90 510 220 50 24", href: "tel:+905102205024" },
{ text: "Adres: Beyoğlu, İstanbul", href: getPermalink("/iletisim") },
{ text: "Çağrı İşareti: YM1KTC", href: getPermalink("/iletisim") }
]
}
],
secondaryLinks: [
{ text: "Gizlilik Politikası", href: getPermalink("/gizlilik") },
{ text: "Kullanım Şartları", href: getPermalink("/kullanim-sartlari") }
],
socialLinks: [
{ ariaLabel: "Facebook", icon: "tabler:brand-facebook", href: "https://facebook.com/ym1ktc" },
{ ariaLabel: "X (Twitter)", icon: "tabler:brand-x", href: "https://x.com/ym1ktc" },
{ ariaLabel: "LinkedIn", icon: "tabler:brand-linkedin", href: "https://www.linkedin.com/company/arctr/" },
{ ariaLabel: "YouTube", icon: "tabler:brand-youtube", href: "https://www.youtube.com/@YM1KTC" },
{ ariaLabel: "Instagram", icon: "tabler:brand-instagram", href: "https://www.instagram.com/ym1ktc" },
{ ariaLabel: "RSS", icon: "tabler:rss", href: getAsset("/rss.xml") }
],
footNote: `
© 2024 Amatör Radyocular Derneği (ARC) - YM1KTC. Tüm hakları saklıdır.
`
};
const $$Astro = createAstro("https://www.radio.org.tr");
const $$PageLayout = createComponent(($$result, $$props, $$slots) => {
const Astro2 = $$result.createAstro($$Astro, $$props, $$slots);
Astro2.self = $$PageLayout;
const { metadata } = Astro2.props;
return renderTemplate`${renderComponent($$result, "Layout", $$Layout, { "metadata": metadata }, { "default": ($$result2) => renderTemplate` ${renderSlot($$result2, $$slots["header"], renderTemplate` ${renderComponent($$result2, "Header", $$Header, { ...headerData, "isSticky": true, "showRssFeed": true, "showToggleTheme": true })} `)} ${maybeRenderHead()}<main> ${renderSlot($$result2, $$slots["default"])} </main> ${renderSlot($$result2, $$slots["footer"], renderTemplate` ${renderComponent($$result2, "Footer", $$Footer, { ...footerData })} `)} ` })}`;
}, "/Users/bugracanata/Developer/[Telsiz]/ARC-Web-Sitesi/src/layouts/PageLayout.astro", void 0);
export { $$PageLayout as $, $$Header as a, $$Button as b, headerData as h };