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,16 @@
import { type Dispatch, type SetStateAction } from 'react';
export type PanelStateKind = 'preferences' | 'route-type' | 'segment-explorer' | 'panel-selector';
export declare const PanelRouterContext: import("react").Context<{
panel: PanelStateKind | null;
setPanel: Dispatch<SetStateAction<PanelStateKind | null>>;
triggerRef: React.RefObject<HTMLButtonElement | null>;
selectedIndex: number;
setSelectedIndex: Dispatch<SetStateAction<number>>;
}>;
export declare const usePanelRouterContext: () => {
panel: PanelStateKind | null;
setPanel: Dispatch<SetStateAction<PanelStateKind | null>>;
triggerRef: React.RefObject<HTMLButtonElement | null>;
selectedIndex: number;
setSelectedIndex: Dispatch<SetStateAction<number>>;
};

View File

@@ -0,0 +1,15 @@
export declare const DevtoolMenu: ({ closeOnClickOutside, items, }: {
closeOnClickOutside?: boolean;
items: Array<false | undefined | null | {
onClick?: () => void;
title?: string;
label: string;
value: React.ReactNode;
attributes?: Record<string, string | boolean>;
footer?: boolean;
}>;
}) => import("react/jsx-runtime").JSX.Element;
export declare function IssueCount({ children }: {
children: number;
}): import("react/jsx-runtime").JSX.Element;
export declare function ChevronRight(): import("react/jsx-runtime").JSX.Element;

View File

@@ -0,0 +1,7 @@
import { type PanelStateKind } from './context';
import './panel-router.css';
export declare const PanelRouter: () => import("react/jsx-runtime").JSX.Element;
export declare const usePanelContext: () => {
name: PanelStateKind;
mounted: boolean;
};