feat(blog): add file-based blog with dynamic slugs, MDX content and layout shell

- Introduced blog routing using Next.js App Router
- Implemented dynamic [slug] pages for blog posts
- Added MDX-based content loading via lib/posts
- Integrated shared TopBar layout with navigation
- Established clear content, lib and component separation
This commit is contained in:
PascalSchattenburg
2026-01-22 14:14:15 +01:00
parent b717952234
commit d147843c76
10412 changed files with 2475583 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
/**
* Parse the page segment config.
* @param data - The data to parse.
* @param route - The route of the page.
* @returns The parsed page segment config.
*/
export declare function parsePagesSegmentConfig(data: unknown, route: string): PagesSegmentConfig;
export type PagesSegmentConfigConfig = {
/**
* The maximum duration for the page render.
*/
maxDuration?: number;
/**
* The runtime to use for the page.
*/
runtime?: 'edge' | 'experimental-edge' | 'nodejs';
/**
* The preferred region for the page.
*/
regions?: string[];
};
export type PagesSegmentConfig = {
/**
* The runtime to use for the page.
*/
runtime?: 'edge' | 'experimental-edge' | 'nodejs';
/**
* The maximum duration for the page render.
*/
maxDuration?: number;
/**
* The exported config object for the page.
*/
config?: PagesSegmentConfigConfig;
};

View File

@@ -0,0 +1,62 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
0 && (module.exports = {
PagesSegmentConfigSchemaKeys: null,
parsePagesSegmentConfig: null
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
PagesSegmentConfigSchemaKeys: function() {
return PagesSegmentConfigSchemaKeys;
},
parsePagesSegmentConfig: function() {
return parsePagesSegmentConfig;
}
});
const _zod = require("next/dist/compiled/zod");
const _zod1 = require("../../../shared/lib/zod");
/**
* The schema for the page segment config.
*/ const PagesSegmentConfigSchema = _zod.z.object({
/**
* The runtime to use for the page.
*/ runtime: _zod.z.enum([
'edge',
'experimental-edge',
'nodejs'
]).optional(),
/**
* The maximum duration for the page render.
*/ maxDuration: _zod.z.number().optional(),
/**
* The exported config object for the page.
*/ config: _zod.z.object({
/**
* The runtime to use for the page.
*/ runtime: _zod.z.enum([
'edge',
'experimental-edge',
'nodejs'
]).optional(),
/**
* The maximum duration for the page render.
*/ maxDuration: _zod.z.number().optional()
}).optional()
});
function parsePagesSegmentConfig(data, route) {
const parsed = PagesSegmentConfigSchema.safeParse(data, {});
if (!parsed.success) {
throw (0, _zod1.formatZodError)(`Invalid segment configuration options detected for "${route}". Read more at https://nextjs.org/docs/messages/invalid-page-config`, parsed.error);
}
return parsed.data;
}
const PagesSegmentConfigSchemaKeys = PagesSegmentConfigSchema.keyof().options;
//# sourceMappingURL=pages-segment-config.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/build/segment-config/pages/pages-segment-config.ts"],"sourcesContent":["import { z } from 'next/dist/compiled/zod'\nimport { formatZodError } from '../../../shared/lib/zod'\n\n/**\n * The schema for the page segment config.\n */\nconst PagesSegmentConfigSchema = z.object({\n /**\n * The runtime to use for the page.\n */\n runtime: z.enum(['edge', 'experimental-edge', 'nodejs']).optional(),\n\n /**\n * The maximum duration for the page render.\n */\n maxDuration: z.number().optional(),\n\n /**\n * The exported config object for the page.\n */\n config: z\n .object({\n /**\n * The runtime to use for the page.\n */\n runtime: z.enum(['edge', 'experimental-edge', 'nodejs']).optional(),\n\n /**\n * The maximum duration for the page render.\n */\n maxDuration: z.number().optional(),\n })\n .optional(),\n})\n\n/**\n * Parse the page segment config.\n * @param data - The data to parse.\n * @param route - The route of the page.\n * @returns The parsed page segment config.\n */\nexport function parsePagesSegmentConfig(\n data: unknown,\n route: string\n): PagesSegmentConfig {\n const parsed = PagesSegmentConfigSchema.safeParse(data, {})\n if (!parsed.success) {\n throw formatZodError(\n `Invalid segment configuration options detected for \"${route}\". Read more at https://nextjs.org/docs/messages/invalid-page-config`,\n parsed.error\n )\n }\n\n return parsed.data\n}\n\n/**\n * The keys of the configuration for a page.\n *\n * @internal - required to exclude zod types from the build\n */\nexport const PagesSegmentConfigSchemaKeys =\n PagesSegmentConfigSchema.keyof().options\n\nexport type PagesSegmentConfigConfig = {\n /**\n * The maximum duration for the page render.\n */\n maxDuration?: number\n\n /**\n * The runtime to use for the page.\n */\n runtime?: 'edge' | 'experimental-edge' | 'nodejs'\n\n /**\n * The preferred region for the page.\n */\n regions?: string[]\n}\n\nexport type PagesSegmentConfig = {\n /**\n * The runtime to use for the page.\n */\n runtime?: 'edge' | 'experimental-edge' | 'nodejs'\n\n /**\n * The maximum duration for the page render.\n */\n maxDuration?: number\n\n /**\n * The exported config object for the page.\n */\n config?: PagesSegmentConfigConfig\n}\n"],"names":["PagesSegmentConfigSchemaKeys","parsePagesSegmentConfig","PagesSegmentConfigSchema","z","object","runtime","enum","optional","maxDuration","number","config","data","route","parsed","safeParse","success","formatZodError","error","keyof","options"],"mappings":";;;;;;;;;;;;;;;IA6DaA,4BAA4B;eAA5BA;;IApBGC,uBAAuB;eAAvBA;;;qBAzCE;sBACa;AAE/B;;CAEC,GACD,MAAMC,2BAA2BC,MAAC,CAACC,MAAM,CAAC;IACxC;;GAEC,GACDC,SAASF,MAAC,CAACG,IAAI,CAAC;QAAC;QAAQ;QAAqB;KAAS,EAAEC,QAAQ;IAEjE;;GAEC,GACDC,aAAaL,MAAC,CAACM,MAAM,GAAGF,QAAQ;IAEhC;;GAEC,GACDG,QAAQP,MAAC,CACNC,MAAM,CAAC;QACN;;OAEC,GACDC,SAASF,MAAC,CAACG,IAAI,CAAC;YAAC;YAAQ;YAAqB;SAAS,EAAEC,QAAQ;QAEjE;;OAEC,GACDC,aAAaL,MAAC,CAACM,MAAM,GAAGF,QAAQ;IAClC,GACCA,QAAQ;AACb;AAQO,SAASN,wBACdU,IAAa,EACbC,KAAa;IAEb,MAAMC,SAASX,yBAAyBY,SAAS,CAACH,MAAM,CAAC;IACzD,IAAI,CAACE,OAAOE,OAAO,EAAE;QACnB,MAAMC,IAAAA,oBAAc,EAClB,CAAC,oDAAoD,EAAEJ,MAAM,oEAAoE,CAAC,EAClIC,OAAOI,KAAK;IAEhB;IAEA,OAAOJ,OAAOF,IAAI;AACpB;AAOO,MAAMX,+BACXE,yBAAyBgB,KAAK,GAAGC,OAAO","ignoreList":[0]}