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,13 @@
import type { ReactNode } from 'react';
export declare const MetadataBoundary: ({ children }: {
children: ReactNode;
}) => ReactNode;
export declare const ViewportBoundary: ({ children }: {
children: ReactNode;
}) => ReactNode;
export declare const OutletBoundary: ({ children }: {
children: ReactNode;
}) => ReactNode;
export declare const RootLayoutBoundary: ({ children, }: {
children: ReactNode;
}) => ReactNode;

View File

@@ -0,0 +1,62 @@
'use client';
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
0 && (module.exports = {
MetadataBoundary: null,
OutletBoundary: null,
RootLayoutBoundary: null,
ViewportBoundary: null
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
MetadataBoundary: function() {
return MetadataBoundary;
},
OutletBoundary: function() {
return OutletBoundary;
},
RootLayoutBoundary: function() {
return RootLayoutBoundary;
},
ViewportBoundary: function() {
return ViewportBoundary;
}
});
const _boundaryconstants = require("./boundary-constants");
// We use a namespace object to allow us to recover the name of the function
// at runtime even when production bundling/minification is used.
const NameSpace = {
[_boundaryconstants.METADATA_BOUNDARY_NAME]: function({ children }) {
return children;
},
[_boundaryconstants.VIEWPORT_BOUNDARY_NAME]: function({ children }) {
return children;
},
[_boundaryconstants.OUTLET_BOUNDARY_NAME]: function({ children }) {
return children;
},
[_boundaryconstants.ROOT_LAYOUT_BOUNDARY_NAME]: function({ children }) {
return children;
}
};
const MetadataBoundary = // We use slice(0) to trick the bundler into not inlining/minifying the function
// so it retains the name inferred from the namespace object
NameSpace[_boundaryconstants.METADATA_BOUNDARY_NAME.slice(0)];
const ViewportBoundary = // We use slice(0) to trick the bundler into not inlining/minifying the function
// so it retains the name inferred from the namespace object
NameSpace[_boundaryconstants.VIEWPORT_BOUNDARY_NAME.slice(0)];
const OutletBoundary = // We use slice(0) to trick the bundler into not inlining/minifying the function
// so it retains the name inferred from the namespace object
NameSpace[_boundaryconstants.OUTLET_BOUNDARY_NAME.slice(0)];
const RootLayoutBoundary = // We use slice(0) to trick the bundler into not inlining/minifying the function
// so it retains the name inferred from the namespace object
NameSpace[_boundaryconstants.ROOT_LAYOUT_BOUNDARY_NAME.slice(0)];
//# sourceMappingURL=boundary-components.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/lib/framework/boundary-components.tsx"],"sourcesContent":["'use client'\n\nimport type { ReactNode } from 'react'\nimport {\n METADATA_BOUNDARY_NAME,\n VIEWPORT_BOUNDARY_NAME,\n OUTLET_BOUNDARY_NAME,\n ROOT_LAYOUT_BOUNDARY_NAME,\n} from './boundary-constants'\n\n// We use a namespace object to allow us to recover the name of the function\n// at runtime even when production bundling/minification is used.\nconst NameSpace = {\n [METADATA_BOUNDARY_NAME]: function ({ children }: { children: ReactNode }) {\n return children\n },\n [VIEWPORT_BOUNDARY_NAME]: function ({ children }: { children: ReactNode }) {\n return children\n },\n [OUTLET_BOUNDARY_NAME]: function ({ children }: { children: ReactNode }) {\n return children\n },\n [ROOT_LAYOUT_BOUNDARY_NAME]: function ({\n children,\n }: {\n children: ReactNode\n }) {\n return children\n },\n}\n\nexport const MetadataBoundary =\n // We use slice(0) to trick the bundler into not inlining/minifying the function\n // so it retains the name inferred from the namespace object\n NameSpace[METADATA_BOUNDARY_NAME.slice(0) as typeof METADATA_BOUNDARY_NAME]\n\nexport const ViewportBoundary =\n // We use slice(0) to trick the bundler into not inlining/minifying the function\n // so it retains the name inferred from the namespace object\n NameSpace[VIEWPORT_BOUNDARY_NAME.slice(0) as typeof VIEWPORT_BOUNDARY_NAME]\n\nexport const OutletBoundary =\n // We use slice(0) to trick the bundler into not inlining/minifying the function\n // so it retains the name inferred from the namespace object\n NameSpace[OUTLET_BOUNDARY_NAME.slice(0) as typeof OUTLET_BOUNDARY_NAME]\n\nexport const RootLayoutBoundary =\n // We use slice(0) to trick the bundler into not inlining/minifying the function\n // so it retains the name inferred from the namespace object\n NameSpace[\n ROOT_LAYOUT_BOUNDARY_NAME.slice(0) as typeof ROOT_LAYOUT_BOUNDARY_NAME\n ]\n"],"names":["MetadataBoundary","OutletBoundary","RootLayoutBoundary","ViewportBoundary","NameSpace","METADATA_BOUNDARY_NAME","children","VIEWPORT_BOUNDARY_NAME","OUTLET_BOUNDARY_NAME","ROOT_LAYOUT_BOUNDARY_NAME","slice"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;IA+BaA,gBAAgB;eAAhBA;;IAUAC,cAAc;eAAdA;;IAKAC,kBAAkB;eAAlBA;;IAVAC,gBAAgB;eAAhBA;;;mCA5BN;AAEP,4EAA4E;AAC5E,iEAAiE;AACjE,MAAMC,YAAY;IAChB,CAACC,yCAAsB,CAAC,EAAE,SAAU,EAAEC,QAAQ,EAA2B;QACvE,OAAOA;IACT;IACA,CAACC,yCAAsB,CAAC,EAAE,SAAU,EAAED,QAAQ,EAA2B;QACvE,OAAOA;IACT;IACA,CAACE,uCAAoB,CAAC,EAAE,SAAU,EAAEF,QAAQ,EAA2B;QACrE,OAAOA;IACT;IACA,CAACG,4CAAyB,CAAC,EAAE,SAAU,EACrCH,QAAQ,EAGT;QACC,OAAOA;IACT;AACF;AAEO,MAAMN,mBACX,gFAAgF;AAChF,4DAA4D;AAC5DI,SAAS,CAACC,yCAAsB,CAACK,KAAK,CAAC,GAAoC;AAEtE,MAAMP,mBACX,gFAAgF;AAChF,4DAA4D;AAC5DC,SAAS,CAACG,yCAAsB,CAACG,KAAK,CAAC,GAAoC;AAEtE,MAAMT,iBACX,gFAAgF;AAChF,4DAA4D;AAC5DG,SAAS,CAACI,uCAAoB,CAACE,KAAK,CAAC,GAAkC;AAElE,MAAMR,qBACX,gFAAgF;AAChF,4DAA4D;AAC5DE,SAAS,CACPK,4CAAyB,CAACC,KAAK,CAAC,GACjC","ignoreList":[0]}

View File

@@ -0,0 +1,4 @@
export declare const METADATA_BOUNDARY_NAME = "__next_metadata_boundary__";
export declare const VIEWPORT_BOUNDARY_NAME = "__next_viewport_boundary__";
export declare const OUTLET_BOUNDARY_NAME = "__next_outlet_boundary__";
export declare const ROOT_LAYOUT_BOUNDARY_NAME = "__next_root_layout_boundary__";

View File

@@ -0,0 +1,36 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
0 && (module.exports = {
METADATA_BOUNDARY_NAME: null,
OUTLET_BOUNDARY_NAME: null,
ROOT_LAYOUT_BOUNDARY_NAME: null,
VIEWPORT_BOUNDARY_NAME: null
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
METADATA_BOUNDARY_NAME: function() {
return METADATA_BOUNDARY_NAME;
},
OUTLET_BOUNDARY_NAME: function() {
return OUTLET_BOUNDARY_NAME;
},
ROOT_LAYOUT_BOUNDARY_NAME: function() {
return ROOT_LAYOUT_BOUNDARY_NAME;
},
VIEWPORT_BOUNDARY_NAME: function() {
return VIEWPORT_BOUNDARY_NAME;
}
});
const METADATA_BOUNDARY_NAME = '__next_metadata_boundary__';
const VIEWPORT_BOUNDARY_NAME = '__next_viewport_boundary__';
const OUTLET_BOUNDARY_NAME = '__next_outlet_boundary__';
const ROOT_LAYOUT_BOUNDARY_NAME = '__next_root_layout_boundary__';
//# sourceMappingURL=boundary-constants.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/lib/framework/boundary-constants.tsx"],"sourcesContent":["export const METADATA_BOUNDARY_NAME = '__next_metadata_boundary__'\nexport const VIEWPORT_BOUNDARY_NAME = '__next_viewport_boundary__'\nexport const OUTLET_BOUNDARY_NAME = '__next_outlet_boundary__'\nexport const ROOT_LAYOUT_BOUNDARY_NAME = '__next_root_layout_boundary__'\n"],"names":["METADATA_BOUNDARY_NAME","OUTLET_BOUNDARY_NAME","ROOT_LAYOUT_BOUNDARY_NAME","VIEWPORT_BOUNDARY_NAME"],"mappings":";;;;;;;;;;;;;;;;;IAAaA,sBAAsB;eAAtBA;;IAEAC,oBAAoB;eAApBA;;IACAC,yBAAyB;eAAzBA;;IAFAC,sBAAsB;eAAtBA;;;AADN,MAAMH,yBAAyB;AAC/B,MAAMG,yBAAyB;AAC/B,MAAMF,uBAAuB;AAC7B,MAAMC,4BAA4B","ignoreList":[0]}