import type { Block } from 'payload' /** * TableOfContentsBlock * * Automatisches Inhaltsverzeichnis für lange Blog-Posts. * Extrahiert Überschriften aus dem Content und erstellt Navigation. */ export const TableOfContentsBlock: Block = { slug: 'toc-block', labels: { singular: 'Inhaltsverzeichnis', plural: 'Inhaltsverzeichnisse', }, imageURL: '/assets/blocks/table-of-contents.png', fields: [ { name: 'title', type: 'text', label: 'Überschrift', localized: true, defaultValue: 'Inhaltsverzeichnis', }, // Überschriften-Level { name: 'levels', type: 'group', label: 'Überschriften-Level', admin: { description: 'Welche Überschriften-Ebenen einschließen?', }, fields: [ { name: 'h2', type: 'checkbox', defaultValue: true, label: 'H2', }, { name: 'h3', type: 'checkbox', defaultValue: true, label: 'H3', }, { name: 'h4', type: 'checkbox', defaultValue: false, label: 'H4', }, { name: 'h5', type: 'checkbox', defaultValue: false, label: 'H5', }, { name: 'h6', type: 'checkbox', defaultValue: false, label: 'H6', }, ], }, // Layout { name: 'layout', type: 'select', defaultValue: 'list', label: 'Layout', options: [ { label: 'Liste', value: 'list' }, { label: 'Nummeriert', value: 'numbered' }, { label: 'Kompakt (Inline)', value: 'inline' }, { label: 'Sidebar (Sticky)', value: 'sidebar' }, { label: 'Dropdown/Akkordeon', value: 'dropdown' }, ], }, { name: 'sidebarPos', type: 'select', defaultValue: 'right', label: 'Sidebar-Position', options: [ { label: 'Links', value: 'left' }, { label: 'Rechts', value: 'right' }, ], admin: { condition: (_, siblingData) => siblingData?.layout === 'sidebar', }, }, // Verhalten { name: 'behavior', type: 'group', label: 'Verhalten', fields: [ { name: 'smoothScroll', type: 'checkbox', defaultValue: true, label: 'Sanftes Scrollen', }, { name: 'highlightActive', type: 'checkbox', defaultValue: true, label: 'Aktiven Abschnitt markieren', admin: { description: 'Markiert den aktuell sichtbaren Abschnitt', }, }, { name: 'scrollOffset', type: 'number', defaultValue: 80, label: 'Scroll-Offset (px)', admin: { description: 'Abstand zum oberen Rand nach dem Scrollen (für Fixed Headers)', }, }, { name: 'collapsible', type: 'checkbox', defaultValue: false, label: 'Einklappbar', admin: { description: 'User kann das Inhaltsverzeichnis ein-/ausklappen', }, }, { name: 'startCollapsed', type: 'checkbox', defaultValue: false, label: 'Anfangs eingeklappt', admin: { condition: (_, siblingData) => siblingData?.collapsible, }, }, { name: 'showProgress', type: 'checkbox', defaultValue: false, label: 'Lesefortschritt anzeigen', admin: { description: 'Fortschrittsbalken oder Prozent-Anzeige', }, }, { name: 'progressStyle', type: 'select', defaultValue: 'bar', label: 'Fortschritts-Stil', options: [ { label: 'Balken', value: 'bar' }, { label: 'Prozent', value: 'percent' }, { label: 'Kreis', value: 'circle' }, ], admin: { condition: (_, siblingData) => siblingData?.showProgress, }, }, ], }, // Styling { name: 'style', type: 'group', label: 'Darstellung', fields: [ { name: 'bg', type: 'select', defaultValue: 'light', label: 'Hintergrund', options: [ { label: 'Keiner', value: 'none' }, { label: 'Hell', value: 'light' }, { label: 'Dunkel', value: 'dark' }, { label: 'Akzent', value: 'accent' }, ], }, { name: 'border', type: 'checkbox', defaultValue: true, label: 'Rahmen', }, { name: 'borderSide', type: 'select', defaultValue: 'left', label: 'Rahmen-Seite', options: [ { label: 'Alle', value: 'all' }, { label: 'Links', value: 'left' }, { label: 'Oben', value: 'top' }, ], admin: { condition: (_, siblingData) => siblingData?.border, }, }, { name: 'rounded', type: 'select', defaultValue: 'md', label: 'Ecken', options: [ { label: 'Keine', value: 'none' }, { label: 'Klein', value: 'sm' }, { label: 'Mittel', value: 'md' }, { label: 'Groß', value: 'lg' }, ], }, { name: 'shadow', type: 'checkbox', defaultValue: false, label: 'Schatten', }, { name: 'indent', type: 'checkbox', defaultValue: true, label: 'Sub-Überschriften einrücken', }, { name: 'showIcon', type: 'checkbox', defaultValue: false, label: 'Icons anzeigen', admin: { description: 'Link-Symbol neben Einträgen', }, }, { name: 'fontSize', type: 'select', defaultValue: 'sm', label: 'Schriftgröße', options: [ { label: 'Klein', value: 'sm' }, { label: 'Normal', value: 'base' }, { label: 'Groß', value: 'lg' }, ], }, { name: 'lineHeight', type: 'select', defaultValue: 'relaxed', label: 'Zeilenhöhe', options: [ { label: 'Eng', value: 'tight' }, { label: 'Normal', value: 'normal' }, { label: 'Locker', value: 'relaxed' }, ], }, ], }, // Limits { name: 'minItems', type: 'number', defaultValue: 3, label: 'Mindestanzahl', admin: { description: 'Inhaltsverzeichnis nur anzeigen, wenn mindestens X Einträge', }, }, { name: 'maxItems', type: 'number', label: 'Maximalanzahl', admin: { description: 'Maximale Anzahl angezeigter Einträge (0 = unbegrenzt)', }, }, // Accessibility { name: 'a11yLabel', type: 'text', label: 'ARIA Label', localized: true, defaultValue: 'Inhaltsverzeichnis', }, ], }