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 @@
export { Postpone } from '../dynamic-rendering';

View File

@@ -0,0 +1,18 @@
/*
Files in the rsc directory are meant to be packaged as part of the RSC graph using next-app-loader.
*/ // When postpone is available in canary React we can switch to importing it directly
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "Postpone", {
enumerable: true,
get: function() {
return _dynamicrendering.Postpone;
}
});
const _dynamicrendering = require("../dynamic-rendering");
//# sourceMappingURL=postpone.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/app-render/rsc/postpone.ts"],"sourcesContent":["/*\n\nFiles in the rsc directory are meant to be packaged as part of the RSC graph using next-app-loader.\n\n*/\n\n// When postpone is available in canary React we can switch to importing it directly\nexport { Postpone } from '../dynamic-rendering'\n"],"names":["Postpone"],"mappings":"AAAA;;;;AAIA,GAEA,oFAAoF;;;;;+BAC3EA;;;eAAAA,0BAAQ;;;kCAAQ","ignoreList":[0]}

View File

@@ -0,0 +1,3 @@
export declare function preloadStyle(href: string, crossOrigin: string | undefined, nonce: string | undefined): void;
export declare function preloadFont(href: string, type: string, crossOrigin: string | undefined, nonce: string | undefined): void;
export declare function preconnect(href: string, crossOrigin: string | undefined, nonce: string | undefined): void;

View File

@@ -0,0 +1,74 @@
/*
Files in the rsc directory are meant to be packaged as part of the RSC graph using next-app-loader.
*/ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
0 && (module.exports = {
preconnect: null,
preloadFont: null,
preloadStyle: null
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
preconnect: function() {
return preconnect;
},
preloadFont: function() {
return preloadFont;
},
preloadStyle: function() {
return preloadStyle;
}
});
const _reactdom = /*#__PURE__*/ _interop_require_default(require("react-dom"));
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function preloadStyle(href, crossOrigin, nonce) {
const opts = {
as: 'style'
};
if (typeof crossOrigin === 'string') {
opts.crossOrigin = crossOrigin;
}
if (typeof nonce === 'string') {
opts.nonce = nonce;
}
_reactdom.default.preload(href, opts);
}
function preloadFont(href, type, crossOrigin, nonce) {
const opts = {
as: 'font',
type
};
if (typeof crossOrigin === 'string') {
opts.crossOrigin = crossOrigin;
}
if (typeof nonce === 'string') {
opts.nonce = nonce;
}
_reactdom.default.preload(href, opts);
}
function preconnect(href, crossOrigin, nonce) {
const opts = {};
if (typeof crossOrigin === 'string') {
opts.crossOrigin = crossOrigin;
}
if (typeof nonce === 'string') {
opts.nonce = nonce;
}
;
_reactdom.default.preconnect(href, opts);
}
//# sourceMappingURL=preloads.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/app-render/rsc/preloads.ts"],"sourcesContent":["/*\n\nFiles in the rsc directory are meant to be packaged as part of the RSC graph using next-app-loader.\n\n*/\n\nimport ReactDOM from 'react-dom'\n\nexport function preloadStyle(\n href: string,\n crossOrigin: string | undefined,\n nonce: string | undefined\n) {\n const opts: any = { as: 'style' }\n if (typeof crossOrigin === 'string') {\n opts.crossOrigin = crossOrigin\n }\n if (typeof nonce === 'string') {\n opts.nonce = nonce\n }\n ReactDOM.preload(href, opts)\n}\n\nexport function preloadFont(\n href: string,\n type: string,\n crossOrigin: string | undefined,\n nonce: string | undefined\n) {\n const opts: any = { as: 'font', type }\n if (typeof crossOrigin === 'string') {\n opts.crossOrigin = crossOrigin\n }\n if (typeof nonce === 'string') {\n opts.nonce = nonce\n }\n ReactDOM.preload(href, opts)\n}\n\nexport function preconnect(\n href: string,\n crossOrigin: string | undefined,\n nonce: string | undefined\n) {\n const opts: any = {}\n if (typeof crossOrigin === 'string') {\n opts.crossOrigin = crossOrigin\n }\n if (typeof nonce === 'string') {\n opts.nonce = nonce\n }\n ;(ReactDOM as any).preconnect(href, opts)\n}\n"],"names":["preconnect","preloadFont","preloadStyle","href","crossOrigin","nonce","opts","as","ReactDOM","preload","type"],"mappings":"AAAA;;;;AAIA;;;;;;;;;;;;;;;;IAmCgBA,UAAU;eAAVA;;IAhBAC,WAAW;eAAXA;;IAfAC,YAAY;eAAZA;;;iEAFK;;;;;;AAEd,SAASA,aACdC,IAAY,EACZC,WAA+B,EAC/BC,KAAyB;IAEzB,MAAMC,OAAY;QAAEC,IAAI;IAAQ;IAChC,IAAI,OAAOH,gBAAgB,UAAU;QACnCE,KAAKF,WAAW,GAAGA;IACrB;IACA,IAAI,OAAOC,UAAU,UAAU;QAC7BC,KAAKD,KAAK,GAAGA;IACf;IACAG,iBAAQ,CAACC,OAAO,CAACN,MAAMG;AACzB;AAEO,SAASL,YACdE,IAAY,EACZO,IAAY,EACZN,WAA+B,EAC/BC,KAAyB;IAEzB,MAAMC,OAAY;QAAEC,IAAI;QAAQG;IAAK;IACrC,IAAI,OAAON,gBAAgB,UAAU;QACnCE,KAAKF,WAAW,GAAGA;IACrB;IACA,IAAI,OAAOC,UAAU,UAAU;QAC7BC,KAAKD,KAAK,GAAGA;IACf;IACAG,iBAAQ,CAACC,OAAO,CAACN,MAAMG;AACzB;AAEO,SAASN,WACdG,IAAY,EACZC,WAA+B,EAC/BC,KAAyB;IAEzB,MAAMC,OAAY,CAAC;IACnB,IAAI,OAAOF,gBAAgB,UAAU;QACnCE,KAAKF,WAAW,GAAGA;IACrB;IACA,IAAI,OAAOC,UAAU,UAAU;QAC7BC,KAAKD,KAAK,GAAGA;IACf;;IACEG,iBAAQ,CAASR,UAAU,CAACG,MAAMG;AACtC","ignoreList":[0]}

View File

@@ -0,0 +1,5 @@
type Reference = object;
type TaintableUniqueValue = string | bigint | ArrayBufferView;
export declare const taintObjectReference: (message: string | undefined, object: Reference) => void;
export declare const taintUniqueValue: (message: string | undefined, lifetime: Reference, value: TaintableUniqueValue) => void;
export {};

View File

@@ -0,0 +1,79 @@
/*
Files in the rsc directory are meant to be packaged as part of the RSC graph using next-app-loader.
*/ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
0 && (module.exports = {
taintObjectReference: null,
taintUniqueValue: null
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
taintObjectReference: function() {
return taintObjectReference;
},
taintUniqueValue: function() {
return taintUniqueValue;
}
});
const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interop_require_wildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {
__proto__: null
};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
function notImplemented() {
throw Object.defineProperty(new Error('Taint can only be used with the taint flag.'), "__NEXT_ERROR_CODE", {
value: "E354",
enumerable: false,
configurable: true
});
}
const taintObjectReference = process.env.__NEXT_EXPERIMENTAL_REACT ? _react.experimental_taintObjectReference : notImplemented;
const taintUniqueValue = process.env.__NEXT_EXPERIMENTAL_REACT ? _react.experimental_taintUniqueValue : notImplemented;
//# sourceMappingURL=taint.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/app-render/rsc/taint.ts"],"sourcesContent":["/*\n\nFiles in the rsc directory are meant to be packaged as part of the RSC graph using next-app-loader.\n\n*/\n\nimport * as React from 'react'\n\ntype Reference = object\ntype TaintableUniqueValue = string | bigint | ArrayBufferView\n\nfunction notImplemented() {\n throw new Error('Taint can only be used with the taint flag.')\n}\n\nexport const taintObjectReference: (\n message: string | undefined,\n object: Reference\n) => void = process.env.__NEXT_EXPERIMENTAL_REACT\n ? // @ts-ignore\n React.experimental_taintObjectReference\n : notImplemented\nexport const taintUniqueValue: (\n message: string | undefined,\n lifetime: Reference,\n value: TaintableUniqueValue\n) => void = process.env.__NEXT_EXPERIMENTAL_REACT\n ? // @ts-ignore\n React.experimental_taintUniqueValue\n : notImplemented\n"],"names":["taintObjectReference","taintUniqueValue","notImplemented","Error","process","env","__NEXT_EXPERIMENTAL_REACT","React","experimental_taintObjectReference","experimental_taintUniqueValue"],"mappings":"AAAA;;;;AAIA;;;;;;;;;;;;;;;IAWaA,oBAAoB;eAApBA;;IAOAC,gBAAgB;eAAhBA;;;+DAhBU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKvB,SAASC;IACP,MAAM,qBAAwD,CAAxD,IAAIC,MAAM,gDAAV,qBAAA;eAAA;oBAAA;sBAAA;IAAuD;AAC/D;AAEO,MAAMH,uBAGDI,QAAQC,GAAG,CAACC,yBAAyB,GAE7CC,OAAMC,iCAAiC,GACvCN;AACG,MAAMD,mBAIDG,QAAQC,GAAG,CAACC,yBAAyB,GAE7CC,OAAME,6BAA6B,GACnCP","ignoreList":[0]}