cms.c2sgmbh/src/payload-types.ts
Martin Porwoll 304e54f9e2 feat: upgrade Payload CMS 3.69.0 → 3.76.1
Upgrade all 11 @payloadcms/* packages to 3.76.1, gaining fixes from
PRs #15404 (user.collection property for multi-tenant access control)
and #15499 (tenant selector uses beforeNav slot).

Fix afterLogin audit hook deadlock: payload.create() inside the hook
caused a transaction deadlock with PgBouncer in transaction mode under
Payload 3.76.1's stricter transaction handling. Changed to fire-and-forget
pattern to prevent login hangs.

Note: Next.js 15.5.9 peer dependency warning exists but build/runtime
work correctly. Consider upgrading Next.js to 16.x or downgrading to
15.4.11 in a follow-up.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 11:07:46 +00:00

12783 lines
No EOL
333 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* tslint:disable */
/* eslint-disable */
/**
* This file was automatically generated by Payload.
* DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config,
* and re-run `payload generate:types` to regenerate this file.
*/
/**
* Supported timezones in IANA format.
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "supportedTimezones".
*/
export type SupportedTimezones =
| 'Pacific/Midway'
| 'Pacific/Niue'
| 'Pacific/Honolulu'
| 'Pacific/Rarotonga'
| 'America/Anchorage'
| 'Pacific/Gambier'
| 'America/Los_Angeles'
| 'America/Tijuana'
| 'America/Denver'
| 'America/Phoenix'
| 'America/Chicago'
| 'America/Guatemala'
| 'America/New_York'
| 'America/Bogota'
| 'America/Caracas'
| 'America/Santiago'
| 'America/Buenos_Aires'
| 'America/Sao_Paulo'
| 'Atlantic/South_Georgia'
| 'Atlantic/Azores'
| 'Atlantic/Cape_Verde'
| 'Europe/London'
| 'Europe/Berlin'
| 'Africa/Lagos'
| 'Europe/Athens'
| 'Africa/Cairo'
| 'Europe/Moscow'
| 'Asia/Riyadh'
| 'Asia/Dubai'
| 'Asia/Baku'
| 'Asia/Karachi'
| 'Asia/Tashkent'
| 'Asia/Calcutta'
| 'Asia/Dhaka'
| 'Asia/Almaty'
| 'Asia/Jakarta'
| 'Asia/Bangkok'
| 'Asia/Shanghai'
| 'Asia/Singapore'
| 'Asia/Tokyo'
| 'Asia/Seoul'
| 'Australia/Brisbane'
| 'Australia/Sydney'
| 'Pacific/Guam'
| 'Pacific/Noumea'
| 'Pacific/Auckland'
| 'Pacific/Fiji';
export interface Config {
auth: {
users: UserAuthOperations;
};
blocks: {};
collections: {
users: User;
media: Media;
tenants: Tenant;
pages: Page;
posts: Post;
categories: Category;
'social-links': SocialLink;
testimonials: Testimonial;
faqs: Faq;
team: Team;
'service-categories': ServiceCategory;
services: Service;
'newsletter-subscribers': NewsletterSubscriber;
'portfolio-categories': PortfolioCategory;
portfolios: Portfolio;
'video-categories': VideoCategory;
videos: Video;
'product-categories': ProductCategory;
products: Product;
timelines: Timeline;
workflows: Workflow;
tags: Tag;
authors: Author;
locations: Location;
partners: Partner;
jobs: Job;
downloads: Download;
events: Event;
bookings: Booking;
certifications: Certification;
projects: Project;
favorites: Favorite;
series: Series;
'youtube-channels': YoutubeChannel;
'youtube-content': YoutubeContent;
'yt-tasks': YtTask;
'yt-notifications': YtNotification;
'yt-batches': YtBatch;
'yt-monthly-goals': YtMonthlyGoal;
'yt-script-templates': YtScriptTemplate;
'yt-checklist-templates': YtChecklistTemplate;
'yt-series': YtSery;
'social-platforms': SocialPlatform;
'social-accounts': SocialAccount;
'community-interactions': CommunityInteraction;
'community-templates': CommunityTemplate;
'community-rules': CommunityRule;
'report-schedules': ReportSchedule;
'cookie-configurations': CookieConfiguration;
'cookie-inventory': CookieInventory;
'consent-logs': ConsentLog;
'privacy-policy-settings': PrivacyPolicySetting;
'email-logs': EmailLog;
'audit-logs': AuditLog;
'site-settings': SiteSetting;
navigations: Navigation;
forms: Form;
'form-submissions': FormSubmission;
redirects: Redirect;
'payload-kv': PayloadKv;
'payload-locked-documents': PayloadLockedDocument;
'payload-preferences': PayloadPreference;
'payload-migrations': PayloadMigration;
};
collectionsJoins: {};
collectionsSelect: {
users: UsersSelect<false> | UsersSelect<true>;
media: MediaSelect<false> | MediaSelect<true>;
tenants: TenantsSelect<false> | TenantsSelect<true>;
pages: PagesSelect<false> | PagesSelect<true>;
posts: PostsSelect<false> | PostsSelect<true>;
categories: CategoriesSelect<false> | CategoriesSelect<true>;
'social-links': SocialLinksSelect<false> | SocialLinksSelect<true>;
testimonials: TestimonialsSelect<false> | TestimonialsSelect<true>;
faqs: FaqsSelect<false> | FaqsSelect<true>;
team: TeamSelect<false> | TeamSelect<true>;
'service-categories': ServiceCategoriesSelect<false> | ServiceCategoriesSelect<true>;
services: ServicesSelect<false> | ServicesSelect<true>;
'newsletter-subscribers': NewsletterSubscribersSelect<false> | NewsletterSubscribersSelect<true>;
'portfolio-categories': PortfolioCategoriesSelect<false> | PortfolioCategoriesSelect<true>;
portfolios: PortfoliosSelect<false> | PortfoliosSelect<true>;
'video-categories': VideoCategoriesSelect<false> | VideoCategoriesSelect<true>;
videos: VideosSelect<false> | VideosSelect<true>;
'product-categories': ProductCategoriesSelect<false> | ProductCategoriesSelect<true>;
products: ProductsSelect<false> | ProductsSelect<true>;
timelines: TimelinesSelect<false> | TimelinesSelect<true>;
workflows: WorkflowsSelect<false> | WorkflowsSelect<true>;
tags: TagsSelect<false> | TagsSelect<true>;
authors: AuthorsSelect<false> | AuthorsSelect<true>;
locations: LocationsSelect<false> | LocationsSelect<true>;
partners: PartnersSelect<false> | PartnersSelect<true>;
jobs: JobsSelect<false> | JobsSelect<true>;
downloads: DownloadsSelect<false> | DownloadsSelect<true>;
events: EventsSelect<false> | EventsSelect<true>;
bookings: BookingsSelect<false> | BookingsSelect<true>;
certifications: CertificationsSelect<false> | CertificationsSelect<true>;
projects: ProjectsSelect<false> | ProjectsSelect<true>;
favorites: FavoritesSelect<false> | FavoritesSelect<true>;
series: SeriesSelect<false> | SeriesSelect<true>;
'youtube-channels': YoutubeChannelsSelect<false> | YoutubeChannelsSelect<true>;
'youtube-content': YoutubeContentSelect<false> | YoutubeContentSelect<true>;
'yt-tasks': YtTasksSelect<false> | YtTasksSelect<true>;
'yt-notifications': YtNotificationsSelect<false> | YtNotificationsSelect<true>;
'yt-batches': YtBatchesSelect<false> | YtBatchesSelect<true>;
'yt-monthly-goals': YtMonthlyGoalsSelect<false> | YtMonthlyGoalsSelect<true>;
'yt-script-templates': YtScriptTemplatesSelect<false> | YtScriptTemplatesSelect<true>;
'yt-checklist-templates': YtChecklistTemplatesSelect<false> | YtChecklistTemplatesSelect<true>;
'yt-series': YtSeriesSelect<false> | YtSeriesSelect<true>;
'social-platforms': SocialPlatformsSelect<false> | SocialPlatformsSelect<true>;
'social-accounts': SocialAccountsSelect<false> | SocialAccountsSelect<true>;
'community-interactions': CommunityInteractionsSelect<false> | CommunityInteractionsSelect<true>;
'community-templates': CommunityTemplatesSelect<false> | CommunityTemplatesSelect<true>;
'community-rules': CommunityRulesSelect<false> | CommunityRulesSelect<true>;
'report-schedules': ReportSchedulesSelect<false> | ReportSchedulesSelect<true>;
'cookie-configurations': CookieConfigurationsSelect<false> | CookieConfigurationsSelect<true>;
'cookie-inventory': CookieInventorySelect<false> | CookieInventorySelect<true>;
'consent-logs': ConsentLogsSelect<false> | ConsentLogsSelect<true>;
'privacy-policy-settings': PrivacyPolicySettingsSelect<false> | PrivacyPolicySettingsSelect<true>;
'email-logs': EmailLogsSelect<false> | EmailLogsSelect<true>;
'audit-logs': AuditLogsSelect<false> | AuditLogsSelect<true>;
'site-settings': SiteSettingsSelect<false> | SiteSettingsSelect<true>;
navigations: NavigationsSelect<false> | NavigationsSelect<true>;
forms: FormsSelect<false> | FormsSelect<true>;
'form-submissions': FormSubmissionsSelect<false> | FormSubmissionsSelect<true>;
redirects: RedirectsSelect<false> | RedirectsSelect<true>;
'payload-kv': PayloadKvSelect<false> | PayloadKvSelect<true>;
'payload-locked-documents': PayloadLockedDocumentsSelect<false> | PayloadLockedDocumentsSelect<true>;
'payload-preferences': PayloadPreferencesSelect<false> | PayloadPreferencesSelect<true>;
'payload-migrations': PayloadMigrationsSelect<false> | PayloadMigrationsSelect<true>;
};
db: {
defaultIDType: number;
};
fallbackLocale: ('false' | 'none' | 'null') | false | null | ('de' | 'en') | ('de' | 'en')[];
globals: {
'seo-settings': SeoSetting;
};
globalsSelect: {
'seo-settings': SeoSettingsSelect<false> | SeoSettingsSelect<true>;
};
locale: 'de' | 'en';
user: User;
jobs: {
tasks: unknown;
workflows: unknown;
};
}
export interface UserAuthOperations {
forgotPassword: {
email: string;
password: string;
};
login: {
email: string;
password: string;
};
registerFirstUser: {
email: string;
password: string;
};
unlock: {
email: string;
password: string;
};
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "users".
*/
export interface User {
id: number;
/**
* Super Admins haben Zugriff auf alle Tenants und können neue Tenants erstellen.
*/
isSuperAdmin?: boolean | null;
/**
* Rolle im YouTube Operations Hub
*/
youtubeRole?: ('none' | 'viewer' | 'editor' | 'producer' | 'creator' | 'manager') | null;
/**
* Zugewiesene YouTube-Kanäle
*/
youtubeChannels?: (number | YoutubeChannel)[] | null;
/**
* Zugriff auf Community Management Features
*/
communityRole?: ('none' | 'viewer' | 'moderator' | 'manager') | null;
tenants?:
| {
tenant: number | Tenant;
id?: string | null;
}[]
| null;
updatedAt: string;
createdAt: string;
email: string;
resetPasswordToken?: string | null;
resetPasswordExpiration?: string | null;
salt?: string | null;
hash?: string | null;
loginAttempts?: number | null;
lockUntil?: string | null;
sessions?:
| {
id: string;
createdAt?: string | null;
expiresAt: string;
}[]
| null;
password?: string | null;
collection: 'users';
}
/**
* YouTube-Kanäle und ihre Konfiguration
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "youtube-channels".
*/
export interface YoutubeChannel {
id: number;
/**
* z.B. "BlogWoman by Caroline Porwoll"
*/
name: string;
/**
* Interner Kurzname (z.B. "blogwoman", "corporate-de")
*/
slug: string;
/**
* Die YouTube Channel ID (z.B. "UCxxxxxxxxxxxxx")
*/
youtubeChannelId: string;
/**
* z.B. "@blogwoman" oder "@zweitmeinu.ng"
*/
youtubeHandle?: string | null;
language: 'de' | 'en';
category: 'lifestyle' | 'corporate' | 'b2b';
status: 'active' | 'planned' | 'paused' | 'archived';
branding?: {
/**
* z.B. #1278B3
*/
primaryColor?: string | null;
secondaryColor?: string | null;
logo?: (number | null) | Media;
thumbnailTemplate?: (number | null) | Media;
};
publishingSchedule?: {
defaultDays?: ('monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday')[] | null;
/**
* z.B. "12:00"
*/
defaultTime?: string | null;
shortsPerWeek?: number | null;
longformPerWeek?: number | null;
};
/**
* Automatisch via YouTube API aktualisiert
*/
currentMetrics?: {
subscriberCount?: number | null;
totalViews?: number | null;
videoCount?: number | null;
lastSyncedAt?: string | null;
};
updatedAt: string;
createdAt: string;
}
/**
* Bilder und Dokumente mit automatischer Optimierung
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "media".
*/
export interface Media {
id: number;
tenant?: (number | null) | Tenant;
/**
* Beschreibung für Screenreader und SEO (Pflichtfeld)
*/
alt: string;
/**
* Optionale Bildunterschrift für Darstellung unter dem Bild
*/
caption?: string | null;
/**
* Fotograf, Agentur oder Quelle
*/
credit?: string | null;
/**
* Schlagwörter für die Suche und Filterung
*/
tags?: string[] | null;
updatedAt: string;
createdAt: string;
url?: string | null;
thumbnailURL?: string | null;
filename?: string | null;
mimeType?: string | null;
filesize?: number | null;
width?: number | null;
height?: number | null;
focalX?: number | null;
focalY?: number | null;
sizes?: {
thumbnail?: {
url?: string | null;
width?: number | null;
height?: number | null;
mimeType?: string | null;
filesize?: number | null;
filename?: string | null;
};
small?: {
url?: string | null;
width?: number | null;
height?: number | null;
mimeType?: string | null;
filesize?: number | null;
filename?: string | null;
};
medium?: {
url?: string | null;
width?: number | null;
height?: number | null;
mimeType?: string | null;
filesize?: number | null;
filename?: string | null;
};
large?: {
url?: string | null;
width?: number | null;
height?: number | null;
mimeType?: string | null;
filesize?: number | null;
filename?: string | null;
};
xlarge?: {
url?: string | null;
width?: number | null;
height?: number | null;
mimeType?: string | null;
filesize?: number | null;
filename?: string | null;
};
'2k'?: {
url?: string | null;
width?: number | null;
height?: number | null;
mimeType?: string | null;
filesize?: number | null;
filename?: string | null;
};
og?: {
url?: string | null;
width?: number | null;
height?: number | null;
mimeType?: string | null;
filesize?: number | null;
filename?: string | null;
};
medium_avif?: {
url?: string | null;
width?: number | null;
height?: number | null;
mimeType?: string | null;
filesize?: number | null;
filename?: string | null;
};
large_avif?: {
url?: string | null;
width?: number | null;
height?: number | null;
mimeType?: string | null;
filesize?: number | null;
filename?: string | null;
};
xlarge_avif?: {
url?: string | null;
width?: number | null;
height?: number | null;
mimeType?: string | null;
filesize?: number | null;
filename?: string | null;
};
};
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "tenants".
*/
export interface Tenant {
id: number;
name: string;
slug: string;
domains?:
| {
domain: string;
id?: string | null;
}[]
| null;
/**
* SMTP-Einstellungen für diesen Tenant. Leer = globale Einstellungen.
*/
email?: {
/**
* Tipp: Verwenden Sie eine E-Mail-Adresse der Domain, für die SPF/DKIM konfiguriert ist.
*/
fromAddress?: string | null;
fromName?: string | null;
replyTo?: string | null;
/**
* Aktivieren Sie diese Option, um einen eigenen SMTP-Server statt der globalen Einstellungen zu verwenden.
*/
useCustomSmtp?: boolean | null;
/**
* Hinweis: Stellen Sie sicher, dass SPF- und DKIM-Einträge für Ihre Domain konfiguriert sind, um eine optimale E-Mail-Zustellung zu gewährleisten.
*/
smtp?: {
/**
* Hostname ohne Protokoll (z.B. smtp.gmail.com)
*/
host: string;
/**
* 587 (STARTTLS) oder 465 (SSL)
*/
port?: number | null;
/**
* Für Port 465 aktivieren
*/
secure?: boolean | null;
/**
* Meist die E-Mail-Adresse
*/
user: string;
/**
* Leer lassen um bestehendes Passwort zu behalten
*/
pass?: string | null;
};
};
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "pages".
*/
export interface Page {
id: number;
tenant?: (number | null) | Tenant;
title: string;
/**
* URL-Pfad (z.B. "ueber-uns" / "about-us")
*/
slug: string;
hero?: {
image?: (number | null) | Media;
headline?: string | null;
subline?: string | null;
};
layout?:
| (
| {
backgroundImage?: (number | null) | Media;
headline: string;
subline?: string | null;
alignment?: ('left' | 'center' | 'right') | null;
overlay?: boolean | null;
cta?: {
text?: string | null;
link?: string | null;
style?: ('primary' | 'secondary' | 'outline') | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'hero-block';
}
| {
/**
* Mindestens 1 Slide erforderlich, maximal 10 Slides
*/
slides: {
/**
* Empfohlen: 1920x1080px oder größer
*/
backgroundImage: number | Media;
/**
* Optional: Alternatives Bild für mobile Geräte (Portrait-Format empfohlen)
*/
mobileBackgroundImage?: (number | null) | Media;
/**
* Hauptüberschrift des Slides
*/
headline: string;
/**
* Optionaler Untertitel oder kurze Beschreibung
*/
subline?: string | null;
textAlignment?: ('left' | 'center' | 'right') | null;
verticalPosition?: ('top' | 'center' | 'bottom') | null;
overlay?: {
enabled?: boolean | null;
color?: ('dark' | 'light' | 'primary' | 'gradient-bottom' | 'gradient-top') | null;
opacity?: ('20' | '30' | '40' | '50' | '60' | '70' | '80') | null;
};
primaryCta?: {
enabled?: boolean | null;
text?: string | null;
/**
* URL oder interner Pfad (z.B. /kontakt)
*/
link?: string | null;
style?: ('primary' | 'secondary' | 'outline-white' | 'outline-dark') | null;
openInNewTab?: boolean | null;
};
secondaryCta?: {
enabled?: boolean | null;
text?: string | null;
link?: string | null;
style?: ('primary' | 'secondary' | 'outline-white' | 'outline-dark' | 'text') | null;
openInNewTab?: boolean | null;
};
textColor?: ('white' | 'dark' | 'primary') | null;
id?: string | null;
}[];
settings?: {
/**
* Art des Übergangs zwischen den Slides
*/
animation?: ('fade' | 'slide' | 'zoom' | 'flip' | 'none') | null;
animationDuration?: ('300' | '500' | '800' | '1200') | null;
autoplay?: {
enabled?: boolean | null;
interval?: ('3000' | '4000' | '5000' | '6000' | '7000' | '8000' | '10000') | null;
/**
* Autoplay pausiert, wenn der Mauszeiger über dem Slider ist
*/
pauseOnHover?: boolean | null;
/**
* Autoplay pausiert nach manueller Navigation
*/
pauseOnInteraction?: boolean | null;
};
/**
* Nach dem letzten Slide automatisch zum ersten springen
*/
loop?: boolean | null;
};
navigation?: {
arrows?: {
enabled?: boolean | null;
style?: ('default' | 'minimal' | 'square' | 'hover-only') | null;
position?: ('sides' | 'bottom-left' | 'bottom-right' | 'bottom-center') | null;
hideOnMobile?: boolean | null;
};
dots?: {
enabled?: boolean | null;
style?: ('dots' | 'lines' | 'numbers' | 'thumbnails' | 'progress') | null;
position?: ('bottom-center' | 'bottom-left' | 'bottom-right' | 'left' | 'right') | null;
color?: ('white' | 'dark' | 'primary') | null;
};
/**
* Ermöglicht Wischen auf Touch-Geräten
*/
swipe?: boolean | null;
/**
* Navigation mit Pfeiltasten ermöglichen
*/
keyboard?: boolean | null;
};
layout?: {
height?: ('viewport' | 'large' | 'medium' | 'small' | 'compact' | 'auto') | null;
mobileHeight?: ('same' | 'viewport' | 'large' | 'medium' | 'small' | 'compact') | null;
contentWidth?: ('container' | 'narrow' | 'wide' | 'full') | null;
/**
* Slider nimmt die volle Bildschirmbreite ein
*/
fullWidth?: boolean | null;
};
accessibility?: {
/**
* Beschreibung für Screenreader
*/
ariaLabel?: string | null;
/**
* Autoplay deaktivieren, wenn der User "prefers-reduced-motion" aktiviert hat
*/
reducedMotion?: boolean | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'hero-slider-block';
}
| {
/**
* Optionaler Titel über der Galerie
*/
title?: string | null;
description?: string | null;
/**
* Mindestens 1 Bild, maximal 50 Bilder
*/
images: {
image: number | Media;
caption?: string | null;
/**
* Alternativer Text für Barrierefreiheit (falls abweichend vom Media Alt)
*/
alt?: string | null;
/**
* Optionaler Link beim Klick (statt Lightbox)
*/
link?: string | null;
id?: string | null;
}[];
layout?: ('slider' | 'grid' | 'masonry' | 'single' | 'thumbs' | 'filmstrip') | null;
grid?: {
cols?: ('2' | '3' | '4' | '5' | '6') | null;
gap?: ('0' | '8' | '16' | '24' | '32') | null;
aspectRatio?: ('square' | '4-3' | '16-9' | '3-4' | 'auto') | null;
};
slider?: {
effect?: ('slide' | 'fade' | 'zoom' | 'flip' | 'coverflow' | 'cube') | null;
speed?: ('300' | '500' | '800') | null;
perView?: ('1' | '2' | '3' | '4' | 'auto') | null;
gap?: ('0' | '8' | '16' | '24') | null;
auto?: boolean | null;
delay?: ('3000' | '4000' | '5000' | '6000' | '8000') | null;
pauseHover?: boolean | null;
loop?: boolean | null;
centered?: boolean | null;
};
nav?: {
arrows?: boolean | null;
arrowStyle?: ('default' | 'minimal' | 'square' | 'hover') | null;
dots?: boolean | null;
dotStyle?: ('dots' | 'lines' | 'numbers' | 'progress') | null;
counter?: boolean | null;
swipe?: boolean | null;
keys?: boolean | null;
};
lightbox?: {
/**
* Bilder bei Klick in Vollansicht öffnen
*/
enabled?: boolean | null;
zoom?: boolean | null;
download?: boolean | null;
share?: boolean | null;
captions?: boolean | null;
thumbs?: boolean | null;
bg?: ('dark' | 'light' | 'blur') | null;
};
style?: {
height?: ('auto' | '300' | '400' | '500' | '600' | 'full') | null;
imgFit?: ('cover' | 'contain' | 'fill') | null;
rounded?: ('none' | 'sm' | 'md' | 'lg' | 'full') | null;
shadow?: boolean | null;
border?: boolean | null;
hoverEffect?: ('none' | 'zoom' | 'brighten' | 'darken' | 'overlay') | null;
captionPos?: ('below' | 'overlay' | 'hover' | 'hidden') | null;
bg?: ('none' | 'white' | 'light' | 'dark') | null;
padding?: ('none' | 'sm' | 'md' | 'lg') | null;
};
a11y?: {
label?: string | null;
reducedMotion?: boolean | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'image-slider-block';
}
| {
content: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
};
width?: ('narrow' | 'medium' | 'full') | null;
id?: string | null;
blockName?: string | null;
blockType: 'text-block';
}
| {
image: number | Media;
imagePosition?: ('left' | 'right') | null;
headline?: string | null;
content?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
cta?: {
text?: string | null;
link?: string | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'image-text-block';
}
| {
headline?: string | null;
cards?:
| {
image?: (number | null) | Media;
title: string;
description?: string | null;
link?: string | null;
linkText?: string | null;
id?: string | null;
}[]
| null;
columns?: ('2' | '3' | '4') | null;
id?: string | null;
blockName?: string | null;
blockType: 'card-grid-block';
}
| {
quote: string;
author?: string | null;
role?: string | null;
image?: (number | null) | Media;
style?: ('simple' | 'highlighted' | 'with-image') | null;
id?: string | null;
blockName?: string | null;
blockType: 'quote-block';
}
| {
headline: string;
description?: string | null;
buttons?:
| {
text: string;
link: string;
style?: ('primary' | 'secondary' | 'outline') | null;
id?: string | null;
}[]
| null;
backgroundColor?: ('dark' | 'light' | 'accent') | null;
id?: string | null;
blockName?: string | null;
blockType: 'cta-block';
}
| {
headline?: string | null;
description?: string | null;
recipientEmail?: string | null;
showPhone?: boolean | null;
showAddress?: boolean | null;
showSocials?: boolean | null;
id?: string | null;
blockName?: string | null;
blockType: 'contact-form-block';
}
| {
title?: string | null;
subtitle?: string | null;
layout?: ('vertical' | 'alternating' | 'horizontal') | null;
showConnector?: boolean | null;
markerStyle?: ('dot' | 'number' | 'icon' | 'date') | null;
items?:
| {
/**
* z.B. "2024", "Januar 2024", "15.03.2024"
*/
year?: string | null;
title: string;
description?: string | null;
/**
* Emoji oder Icon-Name
*/
icon?: string | null;
image?: (number | null) | Media;
link?: {
label?: string | null;
href?: string | null;
};
id?: string | null;
}[]
| null;
backgroundColor?: ('white' | 'light' | 'dark') | null;
id?: string | null;
blockName?: string | null;
blockType: 'timeline-block';
}
| {
style?: ('line' | 'space' | 'dots') | null;
spacing?: ('small' | 'medium' | 'large') | null;
id?: string | null;
blockName?: string | null;
blockType: 'divider-block';
}
| {
/**
* Woher soll das Video eingebunden werden?
*/
sourceType: 'embed' | 'upload' | 'library' | 'external';
/**
* Video aus der Video-Bibliothek auswählen
*/
videoFromLibrary?: (number | null) | Video;
/**
* YouTube, Vimeo oder externe Video-URL
*/
videoUrl?: string | null;
/**
* MP4, WebM oder andere Video-Dateien hochladen
*/
videoFile?: (number | null) | Media;
/**
* Eigenes Thumbnail (optional, bei YouTube wird automatisch eines verwendet)
*/
thumbnail?: (number | null) | Media;
/**
* Bildunterschrift unter dem Video
*/
caption?: string | null;
aspectRatio?: ('16:9' | '4:3' | '1:1' | '9:16' | '21:9') | null;
/**
* Breite des Video-Containers
*/
size?: ('full' | 'large' | 'medium' | 'small') | null;
alignment?: ('left' | 'center' | 'right') | null;
playback?: {
/**
* Video automatisch starten (erfordert meist Mute)
*/
autoplay?: boolean | null;
/**
* Video stumm abspielen
*/
muted?: boolean | null;
/**
* Video in Endlosschleife abspielen
*/
loop?: boolean | null;
/**
* Video-Controls anzeigen
*/
controls?: boolean | null;
/**
* Auf Mobile inline statt Vollbild abspielen
*/
playsinline?: boolean | null;
/**
* Video ab dieser Sekunde starten
*/
startTime?: number | null;
};
embedOptions?: {
/**
* Am Ende ähnliche Videos von YouTube/Vimeo anzeigen
*/
showRelated?: boolean | null;
/**
* YouTube-nocookie.com verwenden (DSGVO-konformer)
*/
privacyMode?: boolean | null;
};
style?: {
rounded?: ('none' | 'sm' | 'md' | 'lg' | 'xl') | null;
shadow?: ('none' | 'sm' | 'md' | 'lg' | 'xl') | null;
border?: boolean | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'video-block';
}
| {
title?: string | null;
subtitle?: string | null;
postType: 'blog' | 'news' | 'press' | 'announcement' | 'all';
layout?: ('grid' | 'list' | 'featured' | 'compact' | 'masonry') | null;
columns?: ('2' | '3' | '4') | null;
limit?: number | null;
showFeaturedOnly?: boolean | null;
/**
* Leer = alle Kategorien
*/
filterByCategory?: (number | Category)[] | null;
showExcerpt?: boolean | null;
showDate?: boolean | null;
showAuthor?: boolean | null;
showCategory?: boolean | null;
showPagination?: boolean | null;
showReadMore?: boolean | null;
readMoreLabel?: string | null;
readMoreLink?: string | null;
backgroundColor?: ('white' | 'light' | 'dark') | null;
id?: string | null;
blockName?: string | null;
blockType: 'posts-list-block';
}
| {
title?: string | null;
subtitle?: string | null;
layout?: ('slider' | 'grid' | 'single' | 'masonry' | 'list') | null;
columns?: ('2' | '3' | '4') | null;
displayMode?: ('all' | 'selected') | null;
selectedTestimonials?: (number | Testimonial)[] | null;
limit?: number | null;
displayOptions?: {
showRating?: boolean | null;
showImage?: boolean | null;
showCompany?: boolean | null;
showSource?: boolean | null;
showDate?: boolean | null;
/**
* Lange Testimonials werden abgeschnitten mit "Mehr lesen"
*/
truncateText?: boolean | null;
maxLength?: number | null;
};
slider?: {
effect?: ('slide' | 'fade' | 'cards' | 'coverflow' | 'none') | null;
speed?: ('300' | '500' | '800') | null;
/**
* Anzahl gleichzeitig sichtbarer Testimonials
*/
perView?: ('1' | '2' | '3' | 'auto') | null;
gap?: ('0' | '16' | '24' | '32' | '48') | null;
auto?: boolean | null;
delay?: ('3000' | '4000' | '5000' | '6000' | '8000' | '10000') | null;
hoverPause?: boolean | null;
loop?: boolean | null;
/**
* Der aktive Slide wird in der Mitte angezeigt
*/
centered?: boolean | null;
};
nav?: {
arrows?: boolean | null;
arrowStyle?: ('default' | 'minimal' | 'square' | 'hover' | 'outside') | null;
arrowPos?: ('sides' | 'bl' | 'br' | 'bc') | null;
dots?: boolean | null;
dotStyle?: ('dots' | 'lines' | 'numbers' | 'progress' | 'fraction') | null;
dotPos?: ('bottom' | 'bl' | 'br') | null;
swipe?: boolean | null;
keys?: boolean | null;
};
style?: {
bg?: ('white' | 'light' | 'dark' | 'accent' | 'none') | null;
card?: ('shadow' | 'border' | 'flat' | 'glass') | null;
quote?: ('icon' | 'quotes' | 'none' | 'large') | null;
imgPos?: ('top' | 'left' | 'bottom' | 'bg') | null;
imgSize?: ('sm' | 'md' | 'lg' | 'xl') | null;
align?: ('left' | 'center' | 'right') | null;
spacing?: ('sm' | 'normal' | 'lg') | null;
};
a11y?: {
label?: string | null;
/**
* Autoplay deaktivieren bei "prefers-reduced-motion"
*/
reducedMotion?: boolean | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'testimonials-block';
}
| {
title?: string | null;
subtitle?: string | null;
layout?: ('inline' | 'stacked' | 'with-image' | 'minimal' | 'card') | null;
image?: (number | null) | Media;
imagePosition?: ('left' | 'right') | null;
collectName?: boolean | null;
showInterests?: boolean | null;
availableInterests?: ('general' | 'blog' | 'products' | 'offers' | 'events')[] | null;
buttonText?: string | null;
placeholderEmail?: string | null;
successMessage?: string | null;
errorMessage?: string | null;
privacyText?: string | null;
privacyLink?: string | null;
/**
* Wird gespeichert um zu tracken, wo die Anmeldung erfolgte
*/
source?: string | null;
backgroundColor?: ('white' | 'light' | 'dark' | 'accent') | null;
id?: string | null;
blockName?: string | null;
blockType: 'newsletter-block';
}
| {
title?: string | null;
subtitle?: string | null;
layout?: ('horizontal' | 'vertical' | 'alternating' | 'connected' | 'timeline') | null;
showNumbers?: boolean | null;
showIcons?: boolean | null;
steps?:
| {
title: string;
description?: string | null;
/**
* Emoji oder Icon-Name (z.B. "📞", "✓", "1")
*/
icon?: string | null;
image?: (number | null) | Media;
id?: string | null;
}[]
| null;
cta?: {
show?: boolean | null;
label?: string | null;
href?: string | null;
variant?: ('default' | 'ghost' | 'light') | null;
};
backgroundColor?: ('white' | 'light' | 'dark') | null;
id?: string | null;
blockName?: string | null;
blockType: 'process-steps-block';
}
| {
title?: string | null;
subtitle?: string | null;
sourceMode?: ('collection' | 'inline') | null;
displayMode?: ('all' | 'featured' | 'category' | 'selected') | null;
/**
* Zeigt nur FAQs mit dieser Kategorie
*/
category?: string | null;
selectedFAQs?: (number | Faq)[] | null;
limit?: number | null;
inlineFAQs?:
| {
question: string;
answer: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
};
/**
* Kurzfassung als reiner Text für SEO Structured Data
*/
answerPlainText?: string | null;
id?: string | null;
}[]
| null;
layout?: ('accordion' | 'grid' | 'list' | 'two-column') | null;
columns?: ('2' | '3') | null;
expandFirst?: boolean | null;
allowMultipleOpen?: boolean | null;
showCategory?: boolean | null;
showIcon?: boolean | null;
groupByCategory?: boolean | null;
/**
* Generiert SEO-optimiertes JSON-LD Structured Data
*/
enableSchemaOrg?: boolean | null;
backgroundColor?: ('white' | 'light' | 'dark' | 'accent') | null;
/**
* Zeigt einen "Frage nicht gefunden? Kontaktieren Sie uns" Button
*/
showContactCTA?: boolean | null;
contactCTAText?: string | null;
contactCTALink?: string | null;
contactCTAButtonText?: string | null;
id?: string | null;
blockName?: string | null;
blockType: 'faq-block';
}
| {
title?: string | null;
subtitle?: string | null;
/**
* Optionaler Text vor der Team-Anzeige
*/
introduction?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
displayMode?: ('all' | 'featured' | 'department' | 'selected') | null;
/**
* Zeigt nur Mitglieder dieser Abteilung
*/
department?: string | null;
selectedMembers?: (number | Team)[] | null;
limit?: number | null;
layout?: ('grid' | 'list' | 'slider' | 'compact' | 'detailed') | null;
columns?: ('2' | '3' | '4') | null;
showRole?: boolean | null;
showDepartment?: boolean | null;
showBio?: boolean | null;
/**
* Nur wenn beim Mitglied "Kontaktdaten öffentlich anzeigen" aktiviert ist
*/
showContact?: boolean | null;
showSocialLinks?: boolean | null;
showQualifications?: boolean | null;
showSpecializations?: boolean | null;
showLanguages?: boolean | null;
groupByDepartment?: boolean | null;
autoplay?: boolean | null;
autoplaySpeed?: number | null;
/**
* Klick auf Mitglied öffnet Modal/Lightbox mit allen Details
*/
enableDetailView?: boolean | null;
imageStyle?: ('circle' | 'rounded' | 'square') | null;
backgroundColor?: ('white' | 'light' | 'dark' | 'accent') | null;
showCTA?: boolean | null;
ctaText?: string | null;
ctaLink?: string | null;
id?: string | null;
blockName?: string | null;
blockType: 'team-block';
}
| {
title?: string | null;
subtitle?: string | null;
/**
* Optionaler Text vor der Leistungsübersicht
*/
introduction?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
displayMode?: ('all' | 'featured' | 'category' | 'selected') | null;
/**
* Zeigt nur Leistungen dieser Kategorie
*/
category?: (number | null) | ServiceCategory;
selectedServices?: (number | Service)[] | null;
limit?: number | null;
layout?:
| ('grid' | 'list' | 'tabs' | 'accordion' | 'featured-grid' | 'slider' | 'compact' | 'masonry')
| null;
columns?: ('2' | '3' | '4') | null;
/**
* Anzahl der hervorgehobenen Leistungen oben
*/
featuredCount?: number | null;
tabsStyle?: ('horizontal' | 'vertical' | 'pills') | null;
showAllTab?: boolean | null;
expandFirst?: boolean | null;
allowMultipleOpen?: boolean | null;
autoplay?: boolean | null;
autoplaySpeed?: number | null;
slidesPerView?: ('1' | '2' | '3' | '4') | null;
showImage?: boolean | null;
showIcon?: boolean | null;
showDescription?: boolean | null;
showCategory?: boolean | null;
showPricing?: boolean | null;
showFeatures?: boolean | null;
featuresLimit?: number | null;
showCTA?: boolean | null;
showNewBadge?: boolean | null;
/**
* Zeigt Kategorie-Überschriften zwischen den Leistungen
*/
groupByCategory?: boolean | null;
/**
* Karten/Einträge verlinken zur Leistungs-Detail-Seite
*/
linkToDetail?: boolean | null;
detailLinkText?: string | null;
/**
* z.B. "/leistungen" → "/leistungen/intensivpflege"
*/
servicesBasePath?: string | null;
cardStyle?: ('elevated' | 'bordered' | 'flat' | 'filled') | null;
backgroundColor?: ('white' | 'light' | 'dark' | 'accent') | null;
showSectionCTA?: boolean | null;
sectionCTAText?: string | null;
sectionCTALink?: string | null;
id?: string | null;
blockName?: string | null;
blockType: 'services-block';
}
| {
/**
* Woher sollen die Autoren-Daten kommen?
*/
source?: ('post' | 'manual') | null;
/**
* Wählen Sie die anzuzeigenden Autoren
*/
authors?: (number | Author)[] | null;
/**
* Auch Co-Autoren des Artikels anzeigen
*/
showCoAuthors?: boolean | null;
layout?: ('card' | 'inline' | 'compact' | 'feature') | null;
show?: {
avatar?: boolean | null;
name?: boolean | null;
title?: boolean | null;
bio?: ('none' | 'short' | 'full') | null;
social?: boolean | null;
email?: boolean | null;
website?: boolean | null;
postCount?: boolean | null;
};
style?: {
avatarSize?: ('sm' | 'md' | 'lg') | null;
avatarShape?: ('circle' | 'square' | 'rounded') | null;
bg?: ('none' | 'light' | 'dark' | 'accent') | null;
border?: boolean | null;
shadow?: boolean | null;
/**
* Linie zur Trennung vom Artikel-Inhalt
*/
divider?: boolean | null;
};
/**
* z.B. "Über den Autor", "Geschrieben von" (optional)
*/
label?: string | null;
linkToProfile?: boolean | null;
id?: string | null;
blockName?: string | null;
blockType: 'author-bio-block';
}
| {
title?: string | null;
source?: ('auto' | 'manual' | 'category' | 'tag' | 'latest' | 'popular' | 'author') | null;
/**
* Wählen Sie die anzuzeigenden Artikel
*/
posts?: (number | Post)[] | null;
category?: (number | null) | Category;
tag?: (number | null) | Tag;
limit?: number | null;
/**
* Den Artikel, auf dem dieser Block ist, nicht anzeigen
*/
excludeCurrent?: boolean | null;
layout?: ('grid' | 'list' | 'slider' | 'compact' | 'cards') | null;
cols?: ('2' | '3' | '4') | null;
show?: {
image?: boolean | null;
date?: boolean | null;
author?: boolean | null;
category?: boolean | null;
excerpt?: boolean | null;
readingTime?: boolean | null;
tags?: boolean | null;
};
style?: {
imgRatio?: ('square' | '4-3' | '16-9' | '3-4') | null;
rounded?: ('none' | 'sm' | 'md' | 'lg') | null;
shadow?: boolean | null;
hover?: ('none' | 'lift' | 'zoom' | 'overlay') | null;
bg?: ('none' | 'light' | 'dark') | null;
gap?: ('16' | '24' | '32') | null;
};
showAllLink?: boolean | null;
allLinkText?: string | null;
/**
* z.B. /blog oder /news
*/
allLinkUrl?: string | null;
id?: string | null;
blockName?: string | null;
blockType: 'related-posts-block';
}
| {
/**
* z.B. "Teilen:", "Artikel teilen" (optional)
*/
label?: string | null;
platforms?: {
facebook?: boolean | null;
twitter?: boolean | null;
linkedin?: boolean | null;
xing?: boolean | null;
whatsapp?: boolean | null;
telegram?: boolean | null;
email?: boolean | null;
copy?: boolean | null;
print?: boolean | null;
pinterest?: boolean | null;
reddit?: boolean | null;
};
layout?: ('horizontal' | 'vertical' | 'floating' | 'sticky') | null;
align?: ('left' | 'center' | 'right') | null;
floatSide?: ('left' | 'right') | null;
style?: {
variant?: ('filled' | 'outline' | 'icon' | 'minimal') | null;
size?: ('sm' | 'md' | 'lg') | null;
shape?: ('square' | 'rounded' | 'circle' | 'pill') | null;
colorScheme?: ('brand' | 'gray' | 'dark' | 'light' | 'accent') | null;
gap?: ('0' | '4' | '8' | '12') | null;
showLabel?: boolean | null;
/**
* Zeigt Anzahl der Shares (sofern verfügbar)
*/
showCount?: boolean | null;
};
behavior?: {
/**
* Share-Dialoge in kleinem Popup statt neuem Tab
*/
openInPopup?: boolean | null;
/**
* Auf mobilen Geräten den System-Share-Dialog verwenden
*/
useNativeShare?: boolean | null;
/**
* Text der angezeigt wird nach dem Kopieren
*/
copyFeedback?: string | null;
};
/**
* Überschreibt automatische Werte (optional)
*/
content?: {
/**
* Leer lassen für automatischen Seitentitel
*/
customTitle?: string | null;
/**
* Leer lassen für automatische Meta-Description
*/
customDescription?: string | null;
/**
* Komma-getrennt, ohne # (z.B. "blog,news,tech")
*/
hashtags?: string | null;
/**
* Twitter-Handle ohne @ (z.B. "c2sgmbh")
*/
via?: string | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'share-buttons-block';
}
| {
title?: string | null;
/**
* Welche Überschriften-Ebenen einschließen?
*/
levels?: {
h2?: boolean | null;
h3?: boolean | null;
h4?: boolean | null;
h5?: boolean | null;
h6?: boolean | null;
};
layout?: ('list' | 'numbered' | 'inline' | 'sidebar' | 'dropdown') | null;
sidebarPos?: ('left' | 'right') | null;
behavior?: {
smoothScroll?: boolean | null;
/**
* Markiert den aktuell sichtbaren Abschnitt
*/
highlightActive?: boolean | null;
/**
* Abstand zum oberen Rand nach dem Scrollen (für Fixed Headers)
*/
scrollOffset?: number | null;
/**
* User kann das Inhaltsverzeichnis ein-/ausklappen
*/
collapsible?: boolean | null;
startCollapsed?: boolean | null;
/**
* Fortschrittsbalken oder Prozent-Anzeige
*/
showProgress?: boolean | null;
progressStyle?: ('bar' | 'percent' | 'circle') | null;
};
style?: {
bg?: ('none' | 'light' | 'dark' | 'accent') | null;
border?: boolean | null;
borderSide?: ('all' | 'left' | 'top') | null;
rounded?: ('none' | 'sm' | 'md' | 'lg') | null;
shadow?: boolean | null;
indent?: boolean | null;
/**
* Link-Symbol neben Einträgen
*/
showIcon?: boolean | null;
fontSize?: ('sm' | 'base' | 'lg') | null;
lineHeight?: ('tight' | 'normal' | 'relaxed') | null;
};
/**
* Inhaltsverzeichnis nur anzeigen, wenn mindestens X Einträge
*/
minItems?: number | null;
/**
* Maximale Anzahl angezeigter Einträge (0 = unbegrenzt)
*/
maxItems?: number | null;
a11yLabel?: string | null;
id?: string | null;
blockName?: string | null;
blockType: 'toc-block';
}
| {
title?: string | null;
subtitle?: string | null;
filters?: {
showSearch?: boolean | null;
searchPlaceholder?: string | null;
showDepartment?: boolean | null;
showSpecialization?: boolean | null;
showLanguage?: boolean | null;
showHierarchy?: boolean | null;
filterLayout?: ('horizontal' | 'sidebar' | 'dropdown' | 'tabs') | null;
filterStyle?: ('buttons' | 'select' | 'checkbox') | null;
showResultCount?: boolean | null;
showResetButton?: boolean | null;
};
display?: {
layout?: ('grid' | 'list' | 'compact') | null;
columns?: ('2' | '3' | '4') | null;
initialLimit?: number | null;
loadMore?: ('button' | 'infinite' | 'pagination' | 'all') | null;
loadMoreText?: string | null;
};
card?: {
showImage?: boolean | null;
imageStyle?: ('circle' | 'rounded' | 'square') | null;
showRole?: boolean | null;
showDepartment?: boolean | null;
showBio?: boolean | null;
showContact?: boolean | null;
showSocial?: boolean | null;
showSpecializations?: boolean | null;
showLanguages?: boolean | null;
showVCard?: boolean | null;
linkToProfile?: boolean | null;
/**
* z.B. "/team" ergibt "/team/max-mustermann"
*/
profileBasePath?: string | null;
/**
* Klick öffnet Modal statt Profilseite
*/
enableModal?: boolean | null;
};
style?: {
bg?: ('none' | 'light' | 'dark') | null;
cardBg?: ('white' | 'transparent' | 'light') | null;
cardShadow?: boolean | null;
cardHover?: ('none' | 'lift' | 'shadow' | 'border') | null;
gap?: ('16' | '24' | '32') | null;
animation?: ('none' | 'fade' | 'slide' | 'scale') | null;
};
emptyState?: {
title?: string | null;
message?: string | null;
showResetButton?: boolean | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'team-filter-block';
}
| {
title?: string | null;
subtitle?: string | null;
source?: ('auto' | 'department' | 'manual') | null;
/**
* Oberstes Element (z.B. Geschäftsführer). Leer = automatisch ermitteln.
*/
rootMember?: (number | null) | Team;
/**
* Zeigt nur diese Abteilung
*/
department?: string | null;
selectedMembers?: (number | Team)[] | null;
/**
* Wie viele Hierarchie-Ebenen anzeigen
*/
maxDepth?: number | null;
layout?: ('tree' | 'tree-horizontal' | 'org' | 'radial' | 'layers') | null;
direction?: ('top' | 'bottom' | 'left' | 'right') | null;
node?: {
style?: ('card' | 'compact' | 'avatar' | 'text') | null;
showImage?: boolean | null;
imageSize?: ('sm' | 'md' | 'lg') | null;
imageShape?: ('circle' | 'rounded' | 'square') | null;
showName?: boolean | null;
showRole?: boolean | null;
showDepartment?: boolean | null;
showContact?: boolean | null;
clickAction?: ('none' | 'modal' | 'link' | 'expand') | null;
profileBasePath?: string | null;
};
connectors?: {
style?: ('straight' | 'angular' | 'curved' | 'dashed') | null;
color?: ('gray' | 'dark' | 'accent' | 'gradient') | null;
thickness?: ('1' | '2' | '3') | null;
/**
* Animierte Linien beim Laden
*/
animated?: boolean | null;
};
levels?: {
/**
* Verschiedene Farben pro Hierarchie-Ebene
*/
colorByLevel?: boolean | null;
/**
* Höhere Ebenen größer darstellen
*/
sizeByLevel?: boolean | null;
collapsible?: boolean | null;
/**
* Wie viele Ebenen anfangs sichtbar
*/
initiallyExpanded?: number | null;
};
interaction?: {
zoomable?: boolean | null;
pannable?: boolean | null;
/**
* Kleine Übersichtskarte bei großen Organigrammen
*/
minimap?: boolean | null;
search?: boolean | null;
/**
* Bei Hover Pfad zur Wurzel hervorheben
*/
highlight?: boolean | null;
fullscreen?: boolean | null;
/**
* Als PNG oder PDF exportieren
*/
export?: boolean | null;
};
style?: {
bg?: ('none' | 'light' | 'white' | 'dark' | 'gradient') | null;
nodeBg?: ('white' | 'light' | 'transparent' | 'accent') | null;
nodeShadow?: boolean | null;
nodeBorder?: boolean | null;
spacing?: ('sm' | 'md' | 'lg') | null;
minHeight?: ('auto' | '300' | '400' | '500' | '600' | 'full') | null;
};
/**
* Erklärt Farben und Symbole
*/
showLegend?: boolean | null;
a11yLabel?: string | null;
id?: string | null;
blockName?: string | null;
blockType: 'org-chart-block';
}
| {
title?: string | null;
subtitle?: string | null;
source?: ('all' | 'main' | 'type' | 'manual') | null;
locationType?:
| ('headquarters' | 'office' | 'branch' | 'warehouse' | 'showroom' | 'studio' | 'practice' | 'workshop')
| null;
selectedLocations?: (number | Location)[] | null;
layout?: ('map-list' | 'map-only' | 'list-only' | 'cards' | 'accordion' | 'tabs') | null;
mapPosition?: ('left' | 'right' | 'top' | 'bottom') | null;
columns?: ('1' | '2' | '3') | null;
map?: {
provider?: ('osm' | 'google' | 'mapbox') | null;
style?: ('default' | 'light' | 'dark' | 'satellite') | null;
height?: ('300' | '400' | '500' | '600') | null;
defaultZoom?: number | null;
/**
* Karte automatisch anpassen, um alle Standorte zu zeigen
*/
fitBounds?: boolean | null;
markerStyle?: ('pin' | 'dot' | 'icon' | 'custom') | null;
/**
* Hex-Farbe (z.B. #e11d48)
*/
markerColor?: string | null;
/**
* Nahe Marker zu Gruppen zusammenfassen
*/
clustering?: boolean | null;
controls?: {
zoom?: boolean | null;
fullscreen?: boolean | null;
scrollZoom?: boolean | null;
dragging?: boolean | null;
};
};
show?: {
image?: boolean | null;
type?: boolean | null;
address?: boolean | null;
phone?: boolean | null;
email?: boolean | null;
hours?: boolean | null;
directions?: boolean | null;
services?: boolean | null;
team?: boolean | null;
};
actions?: {
showDirectionsLink?: boolean | null;
showCallButton?: boolean | null;
showEmailButton?: boolean | null;
showDetailLink?: boolean | null;
detailBasePath?: string | null;
};
style?: {
bg?: ('none' | 'light' | 'dark') | null;
cardStyle?: ('simple' | 'bordered' | 'shadow' | 'filled') | null;
gap?: ('16' | '24' | '32') | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'locations-block';
}
| {
/**
* z.B. "Unsere Partner", "Bekannt aus", "Zertifizierungen"
*/
title?: string | null;
subtitle?: string | null;
source?: ('collection' | 'manual') | null;
partnerType?:
| (
| 'all'
| 'partner'
| 'client'
| 'reference'
| 'sponsor'
| 'certification'
| 'membership'
| 'award'
| 'supplier'
| 'technology'
)[]
| null;
/**
* Optional: Bestimmte Partner auswählen (sonst alle vom gewählten Typ)
*/
selectedPartners?: (number | Partner)[] | null;
featuredOnly?: boolean | null;
limit?: number | null;
logos?:
| {
logo: number | Media;
/**
* Für Alt-Text und Tooltip
*/
name?: string | null;
link?: string | null;
id?: string | null;
}[]
| null;
layout?: ('grid' | 'slider' | 'marquee' | 'inline' | 'masonry') | null;
columns?: ('3' | '4' | '5' | '6' | '8') | null;
slider?: {
perView?: ('3' | '4' | '5' | '6' | 'auto') | null;
autoplay?: boolean | null;
speed?: ('5000' | '3000' | '2000') | null;
pauseOnHover?: boolean | null;
showArrows?: boolean | null;
showDots?: boolean | null;
};
logoStyle?: {
size?: ('sm' | 'md' | 'lg') | null;
maxHeight?: ('40' | '50' | '60' | '80' | '100') | null;
/**
* Logos in Graustufen anzeigen
*/
grayscale?: boolean | null;
colorOnHover?: boolean | null;
opacity?: ('50' | '70' | '100') | null;
hoverEffect?: ('none' | 'scale' | 'brighten' | 'shadow') | null;
};
behavior?: {
linkToWebsite?: boolean | null;
openInNewTab?: boolean | null;
showTooltip?: boolean | null;
showName?: boolean | null;
};
style?: {
bg?: ('none' | 'light' | 'white' | 'dark') | null;
logoBg?: ('none' | 'white' | 'light') | null;
logoPadding?: boolean | null;
gap?: ('16' | '24' | '32' | '48') | null;
alignment?: ('left' | 'center' | 'right') | null;
divider?: boolean | null;
};
showCTA?: boolean | null;
ctaText?: string | null;
ctaLink?: string | null;
id?: string | null;
blockName?: string | null;
blockType: 'logo-grid-block';
}
| {
title?: string | null;
subtitle?: string | null;
stats: {
/**
* z.B. "500+", "99%", "24/7", "10.000"
*/
value: string;
/**
* Für Zähl-Animation (z.B. 500 für "500+")
*/
numericValue?: number | null;
/**
* z.B. "€", "+"
*/
prefix?: string | null;
/**
* z.B. "+", "%", "k", "Mio."
*/
suffix?: string | null;
/**
* z.B. "Zufriedene Kunden", "Erfolgsquote"
*/
label: string;
/**
* Optionaler erklärender Text
*/
description?: string | null;
icon?:
| (
| 'none'
| 'users'
| 'star'
| 'heart'
| 'check'
| 'trophy'
| 'chart'
| 'clock'
| 'calendar'
| 'globe'
| 'building'
| 'document'
| 'target'
| 'rocket'
| 'handshake'
)
| null;
color?: ('default' | 'primary' | 'green' | 'blue' | 'orange' | 'red') | null;
id?: string | null;
}[];
layout?: ('row' | 'grid' | 'cards' | 'column' | 'inline' | 'feature') | null;
columns?: ('2' | '3' | '4' | 'auto') | null;
alignment?: ('left' | 'center' | 'right') | null;
animation?: {
/**
* Zahlen hochzählen (benötigt numericValue)
*/
countUp?: boolean | null;
duration?: ('1000' | '2000' | '3000') | null;
trigger?: ('viewport' | 'immediate') | null;
/**
* Statistiken nacheinander einblenden
*/
stagger?: boolean | null;
};
style?: {
bg?: ('none' | 'light' | 'dark' | 'primary' | 'gradient') | null;
bgImage?: (number | null) | Media;
bgOverlay?: ('none' | 'dark' | 'light' | 'primary') | null;
textColor?: ('auto' | 'dark' | 'light') | null;
valueSize?: ('base' | 'lg' | 'xl' | '2xl') | null;
valueWeight?: ('normal' | 'medium' | 'bold' | 'extrabold') | null;
showIcon?: boolean | null;
iconPosition?: ('top' | 'left' | 'inline') | null;
dividers?: boolean | null;
cardBorder?: boolean | null;
cardShadow?: boolean | null;
gap?: ('16' | '24' | '32' | '48') | null;
padding?: ('none' | 'sm' | 'md' | 'lg') | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'stats-block';
}
| {
title?: string | null;
subtitle?: string | null;
introduction?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
source?: ('all' | 'category' | 'department' | 'location' | 'featured' | 'manual') | null;
category?:
| (
| 'care'
| 'medical'
| 'admin'
| 'it'
| 'marketing'
| 'sales'
| 'finance'
| 'hr'
| 'production'
| 'logistics'
)
| null;
department?: string | null;
locationFilter?: (number | null) | Location;
selectedJobs?: (number | Job)[] | null;
limit?: number | null;
filters?: {
showSearch?: boolean | null;
showCategoryFilter?: boolean | null;
showTypeFilter?: boolean | null;
showLocationFilter?: boolean | null;
showWorkModelFilter?: boolean | null;
filterLayout?: ('horizontal' | 'sidebar' | 'dropdown') | null;
};
layout?: ('list' | 'cards' | 'compact' | 'accordion') | null;
columns?: ('1' | '2' | '3') | null;
show?: {
image?: boolean | null;
department?: boolean | null;
type?: boolean | null;
location?: boolean | null;
workModel?: boolean | null;
salary?: boolean | null;
summary?: boolean | null;
deadline?: boolean | null;
publishDate?: boolean | null;
badges?: boolean | null;
};
badges?: {
/**
* Wie viele Tage nach Veröffentlichung "Neu" anzeigen
*/
newDays?: number | null;
showUrgent?: boolean | null;
showFeatured?: boolean | null;
};
pagination?: {
type?: ('button' | 'pagination' | 'infinite' | 'none') | null;
perPage?: number | null;
};
style?: {
bg?: ('none' | 'light' | 'dark') | null;
cardStyle?: ('simple' | 'bordered' | 'shadow') | null;
hoverEffect?: ('none' | 'lift' | 'highlight') | null;
gap?: ('8' | '16' | '24') | null;
};
emptyState?: {
title?: string | null;
message?: string | null;
showInitiativeLink?: boolean | null;
initiativeText?: string | null;
initiativeUrl?: string | null;
};
showAllJobsLink?: boolean | null;
allJobsText?: string | null;
allJobsUrl?: string | null;
id?: string | null;
blockName?: string | null;
blockType: 'jobs-block';
}
| {
title?: string | null;
subtitle?: string | null;
introduction?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
source?: ('all' | 'category' | 'tags' | 'featured' | 'service' | 'product' | 'manual') | null;
category?:
| (
| 'brochure'
| 'flyer'
| 'catalog'
| 'pricelist'
| 'form'
| 'manual'
| 'datasheet'
| 'certificate'
| 'press'
| 'whitepaper'
| 'presentation'
| 'legal'
)
| null;
/**
* z.B. "produktinfo, 2024, neu"
*/
filterTags?: string | null;
relatedService?: (number | null) | Service;
relatedProduct?: (number | null) | Product;
selectedDownloads?: (number | Download)[] | null;
limit?: number | null;
filters?: {
showSearch?: boolean | null;
showCategoryFilter?: boolean | null;
showFileTypeFilter?: boolean | null;
filterLayout?: ('horizontal' | 'sidebar' | 'dropdown') | null;
};
layout?: ('list' | 'cards' | 'compact' | 'table' | 'accordion') | null;
columns?: ('1' | '2' | '3' | '4') | null;
show?: {
thumbnail?: boolean | null;
description?: boolean | null;
fileSize?: boolean | null;
fileType?: boolean | null;
category?: boolean | null;
downloadCount?: boolean | null;
version?: boolean | null;
lastUpdated?: boolean | null;
};
downloadBehavior?: {
/**
* Datei direkt herunterladen vs. Vorschau öffnen
*/
directDownload?: boolean | null;
trackDownloads?: boolean | null;
openInNewTab?: boolean | null;
};
fileIcons?: {
showFileTypeIcon?: boolean | null;
iconStyle?: ('colored' | 'mono' | 'outline') | null;
};
sortBy?:
| ('order' | 'title_asc' | 'title_desc' | 'date_desc' | 'date_asc' | 'downloads_desc' | 'size')
| null;
groupBy?: ('none' | 'category' | 'fileType') | null;
pagination?: {
type?: ('none' | 'button' | 'pagination') | null;
perPage?: number | null;
};
style?: {
bg?: ('none' | 'light' | 'dark') | null;
cardStyle?: ('simple' | 'bordered' | 'shadow') | null;
hoverEffect?: ('none' | 'highlight' | 'lift') | null;
gap?: ('8' | '16' | '24') | null;
};
emptyState?: {
title?: string | null;
message?: string | null;
};
showAllDownloadsLink?: boolean | null;
allDownloadsText?: string | null;
allDownloadsUrl?: string | null;
id?: string | null;
blockName?: string | null;
blockType: 'downloads-block';
}
| {
title?: string | null;
subtitle?: string | null;
source?: ('locations' | 'manual' | 'single') | null;
locationType?:
| (
| 'all'
| 'headquarters'
| 'branch'
| 'office'
| 'warehouse'
| 'production'
| 'showroom'
| 'service'
| 'partner'
)[]
| null;
/**
* Optional: Bestimmte Standorte auswählen (sonst alle vom gewählten Typ)
*/
selectedLocations?: (number | Location)[] | null;
markers?:
| {
name: string;
address?: string | null;
lat: number;
lng: number;
markerType?: ('default' | 'main' | 'highlight' | 'custom') | null;
customIcon?: (number | null) | Media;
popupContent?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
link?: string | null;
id?: string | null;
}[]
| null;
singleAddress?: {
name?: string | null;
street?: string | null;
zip?: string | null;
city?: string | null;
country?: string | null;
/**
* Optional - wird sonst per Geocoding ermittelt
*/
lat?: number | null;
lng?: number | null;
};
provider?: ('osm' | 'google' | 'mapbox' | 'leaflet') | null;
mapStyle?: ('default' | 'light' | 'dark' | 'satellite' | 'hybrid' | 'terrain') | null;
mapSettings?: {
height?: ('300' | '400' | '500' | '600' | 'fullscreen') | null;
/**
* 1 = Welt, 20 = Gebäude-Details
*/
zoom?: number | null;
/**
* Zoom so anpassen, dass alle Marker sichtbar sind
*/
autoFit?: boolean | null;
/**
* Optional - wird automatisch berechnet wenn leer
*/
centerLat?: number | null;
centerLng?: number | null;
};
interaction?: {
scrollZoom?: boolean | null;
dragging?: boolean | null;
zoomControl?: boolean | null;
fullscreenControl?: boolean | null;
/**
* User-Standort ermitteln
*/
locateControl?: boolean | null;
};
markerStyle?: {
type?: ('pin' | 'dot' | 'icon' | 'custom') | null;
/**
* HEX-Farbcode, z.B. #3B82F6
*/
color?: string | null;
size?: ('sm' | 'md' | 'lg') | null;
/**
* Nahe beieinander liegende Marker gruppieren
*/
clustering?: boolean | null;
clusterRadius?: number | null;
};
popup?: {
show?: boolean | null;
trigger?: ('click' | 'hover') | null;
showAddress?: boolean | null;
showDirectionsLink?: boolean | null;
showPhone?: boolean | null;
showOpeningHours?: boolean | null;
showDetailLink?: boolean | null;
};
sidebar?: {
show?: boolean | null;
position?: ('left' | 'right' | 'bottom') | null;
width?: ('250' | '300' | '400') | null;
searchable?: boolean | null;
clickToCenter?: boolean | null;
};
style?: {
rounded?: boolean | null;
shadow?: boolean | null;
border?: boolean | null;
padding?: ('none' | 'sm' | 'md' | 'lg') | null;
};
fallback?: {
showStaticImage?: boolean | null;
staticImage?: (number | null) | Media;
noJsMessage?: string | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'map-block';
}
| {
title?: string | null;
subtitle?: string | null;
sourceMode?: ('collection' | 'selected') | null;
filterMode?: ('upcoming' | 'past' | 'all' | 'featured' | 'type' | 'category') | null;
eventType?:
| (
| 'event'
| 'workshop'
| 'seminar'
| 'webinar'
| 'conference'
| 'tradeshow'
| 'networking'
| 'course'
| 'talk'
)
| null;
category?: string | null;
selectedEvents?: (number | Event)[] | null;
limit?: number | null;
layout?: ('cards' | 'list' | 'compact' | 'timeline' | 'calendar' | 'agenda') | null;
columns?: ('2' | '3' | '4') | null;
showImage?: boolean | null;
showExcerpt?: boolean | null;
showDate?: boolean | null;
showTime?: boolean | null;
showLocation?: boolean | null;
showPrice?: boolean | null;
showEventType?: boolean | null;
showRegistrationButton?: boolean | null;
registrationButtonText?: string | null;
calendarOptions?: {
defaultView?: ('month' | 'week' | 'day') | null;
showNavigation?: boolean | null;
showViewToggle?: boolean | null;
};
groupBy?: ('none' | 'month' | 'type' | 'category') | null;
sortOrder?: ('asc' | 'desc') | null;
showAllLink?: boolean | null;
allEventsLink?: string | null;
allEventsText?: string | null;
emptyMessage?: string | null;
backgroundColor?: ('white' | 'light' | 'dark' | 'accent') | null;
cardStyle?: ('elevated' | 'bordered' | 'flat') | null;
id?: string | null;
blockName?: string | null;
blockType: 'events';
}
| {
title?: string | null;
subtitle?: string | null;
description?: string | null;
pricingType?: ('one-time' | 'monthly' | 'yearly' | 'toggle' | 'custom') | null;
currency?: string | null;
showCurrencyBefore?: boolean | null;
toggleOptions?: {
monthlyLabel?: string | null;
yearlyLabel?: string | null;
/**
* z.B. "2 Monate gratis"
*/
yearlyDiscount?: string | null;
defaultToYearly?: boolean | null;
};
plans?:
| {
/**
* z.B. "Basic", "Pro", "Enterprise"
*/
name: string;
/**
* z.B. "Für Einsteiger"
*/
subtitle?: string | null;
description?: string | null;
price?: number | null;
priceMonthly?: number | null;
priceYearly?: number | null;
/**
* z.B. "/Monat", "/Nutzer"
*/
priceSuffix?: string | null;
/**
* Für Rabatt-Darstellung
*/
originalPrice?: number | null;
/**
* z.B. "zzgl. MwSt.", "Bei jährlicher Zahlung"
*/
priceNote?: string | null;
/**
* z.B. "Auf Anfrage", "Individuell"
*/
customPriceText?: string | null;
features?:
| {
text: string;
included?: boolean | null;
highlight?: boolean | null;
tooltip?: string | null;
id?: string | null;
}[]
| null;
ctaText?: string | null;
ctaLink?: string | null;
ctaStyle?: ('primary' | 'secondary' | 'outline') | null;
isPopular?: boolean | null;
popularLabel?: string | null;
isRecommended?: boolean | null;
recommendedLabel?: string | null;
accentColor?: ('default' | 'primary' | 'secondary' | 'green' | 'blue' | 'purple') | null;
icon?: (number | null) | Media;
id?: string | null;
}[]
| null;
showComparison?: boolean | null;
comparisonFeatures?:
| {
category?: string | null;
feature: string;
tooltip?: string | null;
values?:
| {
planIndex?: number | null;
/**
* ✓, ✗, oder Text wie "10 GB", "Unbegrenzt"
*/
value?: string | null;
id?: string | null;
}[]
| null;
id?: string | null;
}[]
| null;
layout?: ('cards' | 'table' | 'compact') | null;
alignment?: ('left' | 'center' | 'right') | null;
highlightPopular?: boolean | null;
guarantee?: {
show?: boolean | null;
text?: string | null;
icon?: ('shield' | 'check' | 'star' | 'lock') | null;
};
showFAQ?: boolean | null;
faqTitle?: string | null;
faqItems?:
| {
question: string;
answer: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
};
id?: string | null;
}[]
| null;
backgroundColor?: ('white' | 'light' | 'dark' | 'gradient') | null;
cardStyle?: ('elevated' | 'bordered' | 'flat' | 'glass') | null;
id?: string | null;
blockName?: string | null;
blockType: 'pricing';
}
| {
title?: string | null;
subtitle?: string | null;
tabs?:
| {
label: string;
icon?:
| (
| 'none'
| 'info'
| 'star'
| 'heart'
| 'check'
| 'settings'
| 'user'
| 'document'
| 'image'
| 'video'
| 'code'
| 'chart'
| 'calendar'
| 'location'
| 'email'
| 'phone'
)
| null;
/**
* Überschreibt das ausgewählte Icon
*/
customIcon?: (number | null) | Media;
/**
* z.B. "Neu", "3", "Beta"
*/
badge?: string | null;
contentType?: ('richtext' | 'image-text' | 'features' | 'code' | 'embed') | null;
content?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
imgTxt?: {
img?: (number | null) | Media;
imgPos?: ('left' | 'right' | 'top') | null;
text?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
};
features?:
| {
title: string;
description?: string | null;
icon?: ('check' | 'star' | 'arrow' | 'dot' | 'number') | null;
id?: string | null;
}[]
| null;
code?: {
language?:
| ('javascript' | 'typescript' | 'html' | 'css' | 'json' | 'python' | 'bash' | 'sql')
| null;
code?: string | null;
showLineNumbers?: boolean | null;
};
embed?: {
type?: ('youtube' | 'vimeo' | 'iframe') | null;
url?: string | null;
aspectRatio?: ('16:9' | '4:3' | '1:1') | null;
};
id?: string | null;
}[]
| null;
tabStyle?: ('underline' | 'boxed' | 'pills' | 'buttons' | 'vertical') | null;
tabPosition?: ('top' | 'left' | 'right' | 'bottom') | null;
tabAlignment?: ('left' | 'center' | 'right' | 'stretch') | null;
/**
* 0 = erster Tab
*/
defaultTab?: number | null;
allowKeyboardNavigation?: boolean | null;
animated?: boolean | null;
/**
* Tab-Inhalte erst bei Aktivierung laden
*/
lazy?: boolean | null;
mobileStyle?: ('scroll' | 'dropdown' | 'accordion' | 'stacked') | null;
backgroundColor?: ('white' | 'light' | 'dark' | 'transparent') | null;
contentBackground?: ('white' | 'light' | 'transparent') | null;
showBorder?: boolean | null;
fullWidth?: boolean | null;
id?: string | null;
blockName?: string | null;
blockType: 'tabs';
}
| {
title?: string | null;
subtitle?: string | null;
description?: string | null;
items?:
| {
title: string;
subtitle?: string | null;
icon?:
| (
| 'none'
| 'info'
| 'question'
| 'star'
| 'check'
| 'warning'
| 'document'
| 'user'
| 'settings'
| 'code'
| 'lightbulb'
| 'lock'
)
| null;
customIcon?: (number | null) | Media;
contentType?: ('richtext' | 'image-text' | 'list' | 'table' | 'code') | null;
content?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
imgTxt?: {
img?: (number | null) | Media;
imgPos?: ('left' | 'right') | null;
text?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
};
listItems?:
| {
text: string;
icon?: ('check' | 'dot' | 'arrow' | 'star' | 'x') | null;
id?: string | null;
}[]
| null;
tableData?: {
headers?:
| {
text?: string | null;
id?: string | null;
}[]
| null;
rows?:
| {
cells?:
| {
text?: string | null;
id?: string | null;
}[]
| null;
id?: string | null;
}[]
| null;
};
codeContent?: {
language?: ('javascript' | 'typescript' | 'html' | 'css' | 'json' | 'python' | 'bash') | null;
code?: string | null;
};
/**
* z.B. "Neu", "Wichtig", "Pro"
*/
badge?: string | null;
badgeColor?: ('gray' | 'blue' | 'green' | 'yellow' | 'red' | 'purple') | null;
defaultOpen?: boolean | null;
disabled?: boolean | null;
id?: string | null;
}[]
| null;
behavior?: ('single' | 'multiple' | 'at-least-one') | null;
expandFirst?: boolean | null;
animated?: boolean | null;
style?: ('default' | 'bordered' | 'separated' | 'flush' | 'rounded') | null;
iconPosition?: ('left' | 'right') | null;
iconStyle?: ('chevron' | 'plus-minus' | 'arrow' | 'caret') | null;
layout?: ('full' | 'centered' | 'narrow' | 'two-column') | null;
titleSize?: ('small' | 'medium' | 'large') | null;
backgroundColor?: ('white' | 'light' | 'dark' | 'transparent') | null;
headerBackground?: ('white' | 'light' | 'transparent') | null;
/**
* Wenn aktiviert, wird FAQ Structured Data generiert
*/
enableSchemaOrg?: boolean | null;
id?: string | null;
blockName?: string | null;
blockType: 'accordion';
}
| {
title?: string | null;
subtitle?: string | null;
description?: string | null;
comparisonType?: ('table' | 'cards' | 'before-after' | 'pros-cons' | 'feature-matrix') | null;
tbl?: {
columns?:
| {
name: string;
subtitle?: string | null;
image?: (number | null) | Media;
price?: string | null;
isHighlighted?: boolean | null;
/**
* z.B. "Empfohlen", "Bestseller"
*/
highlightLabel?: string | null;
ctaText?: string | null;
ctaLink?: string | null;
id?: string | null;
}[]
| null;
rows?:
| {
feature: string;
/**
* Für Gruppierung
*/
category?: string | null;
tooltip?: string | null;
values?:
| {
/**
* 0 = erste Spalte
*/
columnIndex?: number | null;
valueType?: ('text' | 'boolean' | 'partial' | 'na') | null;
textValue?: string | null;
booleanValue?: boolean | null;
/**
* z.B. "Eingeschränkt", "Mit Aufpreis"
*/
partialNote?: string | null;
id?: string | null;
}[]
| null;
id?: string | null;
}[]
| null;
};
crd?: {
items?:
| {
title: string;
subtitle?: string | null;
image?: (number | null) | Media;
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
features?:
| {
text: string;
included?: boolean | null;
id?: string | null;
}[]
| null;
price?: string | null;
ctaText?: string | null;
ctaLink?: string | null;
isHighlighted?: boolean | null;
accentColor?: ('default' | 'primary' | 'secondary' | 'green' | 'blue') | null;
id?: string | null;
}[]
| null;
};
beforeAfter?: {
beforeLabel?: string | null;
afterLabel?: string | null;
items?:
| {
title?: string | null;
beforeImage?: (number | null) | Media;
afterImage?: (number | null) | Media;
beforeText?: string | null;
afterText?: string | null;
id?: string | null;
}[]
| null;
displayStyle?: ('slider' | 'side-by-side' | 'stacked' | 'flip') | null;
};
prosCons?: {
prosLabel?: string | null;
consLabel?: string | null;
items?:
| {
title?: string | null;
image?: (number | null) | Media;
pros?:
| {
text: string;
id?: string | null;
}[]
| null;
cons?:
| {
text: string;
id?: string | null;
}[]
| null;
verdict?: string | null;
rating?: number | null;
id?: string | null;
}[]
| null;
};
stickyHeader?: boolean | null;
showCategories?: boolean | null;
collapsibleCategories?: boolean | null;
showRowDividers?: boolean | null;
highlightDifferences?: boolean | null;
mobileView?: ('scroll' | 'stacked' | 'accordion' | 'dropdown') | null;
symbols?: {
checkSymbol?: string | null;
crossSymbol?: string | null;
partialSymbol?: string | null;
};
backgroundColor?: ('white' | 'light' | 'dark') | null;
tableStyle?: ('bordered' | 'striped' | 'minimal' | 'cards') | null;
checkColor?: ('green' | 'primary' | 'blue') | null;
crossColor?: ('red' | 'gray' | 'transparent') | null;
id?: string | null;
blockName?: string | null;
blockType: 'comparison';
}
| {
title?: string | null;
subtitle?: string | null;
description?: string | null;
comparisons: {
title?: string | null;
beforeImage: number | Media;
afterImage: number | Media;
beforeLabel?: string | null;
afterLabel?: string | null;
description?: string | null;
category?:
| (
| 'wedding'
| 'portrait'
| 'retouch'
| 'colorgrade'
| 'restore'
| 'composing'
| 'architecture'
| 'product'
| 'other'
)
| null;
/**
* Komma-getrennte Tags für Filterung
*/
tags?: string | null;
metadata?: {
client?: string | null;
date?: string | null;
/**
* z.B. Lightroom, Photoshop
*/
tools?: string | null;
duration?: string | null;
};
showMetadata?: boolean | null;
id?: string | null;
}[];
displayStyle?: ('slider' | 'hover' | 'toggle' | 'side-by-side' | 'fade') | null;
sliderOrientation?: ('horizontal' | 'vertical') | null;
/**
* 0 = links/oben, 100 = rechts/unten
*/
sliderStartPosition?: number | null;
layout?: ('single' | 'grid-2' | 'grid-3' | 'carousel' | 'masonry') | null;
aspectRatio?: ('original' | '16-9' | '4-3' | '3-2' | '1-1' | '2-3' | '9-16') | null;
sliderHandle?: {
style?: ('circle' | 'line' | 'arrows' | 'custom') | null;
color?: ('white' | 'black' | 'primary' | 'accent') | null;
size?: ('small' | 'medium' | 'large') | null;
showLine?: boolean | null;
};
showLabels?: boolean | null;
labelPosition?: ('corners' | 'top' | 'bottom' | 'overlay') | null;
labelStyle?: ('badge' | 'text' | 'pill') | null;
showFilter?: boolean | null;
animation?: {
enableAnimation?: boolean | null;
autoPlay?: boolean | null;
autoPlaySpeed?: number | null;
scrollTrigger?: boolean | null;
};
interactivity?: {
enableZoom?: boolean | null;
enableFullscreen?: boolean | null;
enableSwipe?: boolean | null;
enableKeyboard?: boolean | null;
};
cta?: {
showCta?: boolean | null;
ctaText?: string | null;
ctaLink?: string | null;
ctaStyle?: ('primary' | 'secondary' | 'outline' | 'ghost') | null;
};
backgroundColor?: ('transparent' | 'white' | 'light' | 'dark' | 'black') | null;
borderRadius?: ('none' | 'small' | 'medium' | 'large') | null;
shadow?: ('none' | 'small' | 'medium' | 'large') | null;
spacing?: ('none' | 'small' | 'medium' | 'large') | null;
id?: string | null;
blockName?: string | null;
blockType: 'before-after';
}
| {
title?: string | null;
subtitle?: string | null;
/**
* Nur Favoriten dieser Kategorie anzeigen
*/
category?: ('all' | 'fashion' | 'beauty' | 'travel' | 'tech' | 'home') | null;
/**
* Nur als "Featured" markierte Favoriten anzeigen
*/
showFeaturedOnly?: boolean | null;
/**
* Maximale Anzahl der angezeigten Favoriten
*/
limit?: number | null;
layout?: ('grid' | 'list' | 'carousel') | null;
columns?: ('2' | '3' | '4') | null;
showPrice?: boolean | null;
showBadge?: boolean | null;
showDescription?: boolean | null;
showCategory?: boolean | null;
backgroundColor?: ('white' | 'ivory' | 'sand' | 'light' | 'dark') | null;
cta?: {
showCta?: boolean | null;
ctaText?: string | null;
ctaUrl?: string | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'favorites-block';
}
| {
title?: string | null;
subtitle?: string | null;
layout?: ('grid' | 'list' | 'featured') | null;
columns?: ('2' | '3' | '4') | null;
showDescription?: boolean | null;
showLogo?: boolean | null;
showTagline?: boolean | null;
/**
* Serien-spezifische Farben für Akzente nutzen
*/
useBrandColors?: boolean | null;
/**
* Maximale Anzahl der angezeigten Serien
*/
limit?: number | null;
backgroundColor?: ('white' | 'ivory' | 'sand' | 'light' | 'dark') | null;
cta?: {
showCta?: boolean | null;
ctaText?: string | null;
ctaUrl?: string | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'series-block';
}
| {
/**
* Die anzuzeigende Serie
*/
series: number | Series;
/**
* Cover-Bild mit Logo und Tagline
*/
showHero?: boolean | null;
showDescription?: boolean | null;
/**
* Serien-spezifische Farben für Akzente nutzen
*/
showBrandColors?: boolean | null;
/**
* Posts die mit dieser Serie verknüpft sind
*/
showRelatedPosts?: boolean | null;
relatedPostsLimit?: number | null;
relatedPostsTitle?: string | null;
/**
* Embed der YouTube-Playlist falls konfiguriert
*/
showYoutubePlaylist?: boolean | null;
layout?: ('full' | 'compact') | null;
hero?: {
height?: ('small' | 'medium' | 'large' | 'fullscreen') | null;
/**
* Dunkles Overlay für bessere Lesbarkeit
*/
overlay?: boolean | null;
textAlign?: ('left' | 'center' | 'right') | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'series-detail-block';
}
| {
/**
* Optionaler Titel über dem Video
*/
title?: string | null;
videoSource: 'youtube' | 'vimeo' | 'custom';
/**
* z.B. https://www.youtube.com/watch?v=VIDEO_ID oder https://youtu.be/VIDEO_ID
*/
youtubeUrl?: string | null;
/**
* z.B. https://vimeo.com/VIDEO_ID
*/
vimeoUrl?: string | null;
/**
* Direkte URL zu einer MP4, WebM oder anderen Video-Datei
*/
customUrl?: string | null;
/**
* Optional: Eigenes Vorschaubild. Bei YouTube wird automatisch das Thumbnail verwendet.
*/
thumbnail?: (number | null) | Media;
/**
* Optionaler Text unter dem Video
*/
caption?: string | null;
/**
* YouTube: Verwendet youtube-nocookie.com für besseren Datenschutz
*/
privacyMode?: boolean | null;
/**
* Video erst laden, wenn es im Viewport sichtbar ist
*/
lazyLoad?: boolean | null;
aspectRatio?: ('16:9' | '4:3' | '1:1' | '9:16') | null;
maxWidth?: ('full' | 'large' | 'medium' | 'small') | null;
playbackOptions?: {
/**
* Automatisch abspielen (erfordert Mute für die meisten Browser)
*/
autoplay?: boolean | null;
/**
* Video stumm abspielen
*/
muted?: boolean | null;
loop?: boolean | null;
showControls?: boolean | null;
/**
* Video ab dieser Sekunde starten
*/
startTime?: number | null;
};
style?: {
alignment?: ('left' | 'center' | 'right') | null;
borderRadius?: ('none' | 'sm' | 'md' | 'lg') | null;
shadow?: boolean | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'video-embed-block';
}
| {
title?: string | null;
subtitle?: string | null;
/**
* Wähle verschiedene Content-Typen aus
*/
items: {
itemType: 'post' | 'video' | 'series' | 'external';
post?: (number | null) | Post;
video?: (number | null) | Video;
series?: (number | null) | Series;
externalTitle?: string | null;
externalUrl?: string | null;
externalImage?: (number | null) | Media;
externalDescription?: string | null;
/**
* Optionales Label (z.B. "NEU", "TRENDING", "MUSS-LESEN")
*/
customLabel?: string | null;
/**
* In featured-grid Layout größer darstellen
*/
featured?: boolean | null;
id?: string | null;
}[];
layout?: ('grid' | 'carousel' | 'list' | 'featured-grid') | null;
columns?: ('2' | '3' | '4') | null;
showDates?: boolean | null;
/**
* Icon oder Label für Post/Video/Serie anzeigen
*/
showType?: boolean | null;
showDescription?: boolean | null;
showCustomLabels?: boolean | null;
backgroundColor?: ('white' | 'ivory' | 'sand' | 'light' | 'dark') | null;
card?: {
bg?: ('white' | 'transparent' | 'light') | null;
shadow?: boolean | null;
border?: boolean | null;
imgRatio?: ('16:9' | '4:3' | '1:1' | '3:2') | null;
hover?: ('none' | 'lift' | 'zoom' | 'shadow') | null;
};
cta?: {
showCta?: boolean | null;
ctaText?: string | null;
ctaUrl?: string | null;
};
id?: string | null;
blockName?: string | null;
blockType: 'featured-content-block';
}
)[]
| null;
seo?: {
metaTitle?: string | null;
metaDescription?: string | null;
ogImage?: (number | null) | Media;
};
status?: ('draft' | 'published') | null;
publishedAt?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* Video-Bibliothek für YouTube/Vimeo Embeds und hochgeladene Videos
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "videos".
*/
export interface Video {
id: number;
tenant?: (number | null) | Tenant;
/**
* Titel des Videos
*/
title: string;
/**
* URL-freundlicher Name (z.B. "produkt-tutorial")
*/
slug: string;
/**
* Ausführliche Beschreibung des Videos
*/
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Kurzbeschreibung für Übersichten (max. 300 Zeichen)
*/
excerpt?: string | null;
/**
* Woher stammt das Video?
*/
source: 'youtube' | 'vimeo' | 'upload' | 'external';
/**
* MP4, WebM oder andere Video-Dateien
*/
videoFile?: (number | null) | Media;
/**
* YouTube/Vimeo URL oder direkte Video-URL
*/
embedUrl?: string | null;
/**
* Wird automatisch aus der URL extrahiert
*/
videoId?: string | null;
/**
* Eigenes Thumbnail (bei YouTube wird automatisch eins verwendet falls leer)
*/
thumbnail?: (number | null) | Media;
/**
* Video-Dauer (z.B. "2:30" oder "1:02:30")
*/
duration?: string | null;
/**
* Automatisch berechnet
*/
durationSeconds?: number | null;
/**
* Primäre Video-Kategorie
*/
category?: (number | null) | VideoCategory;
/**
* Schlagwörter für bessere Auffindbarkeit
*/
tags?: (number | Tag)[] | null;
/**
* Art des Videos
*/
videoType?:
| ('tutorial' | 'product' | 'testimonial' | 'explainer' | 'webinar' | 'interview' | 'event' | 'trailer' | 'other')
| null;
playback?: {
/**
* Video automatisch starten (Browser blockieren oft ohne Mute)
*/
autoplay?: boolean | null;
/**
* Video stumm abspielen (erforderlich für Autoplay in Browsern)
*/
muted?: boolean | null;
/**
* Video in Endlosschleife abspielen
*/
loop?: boolean | null;
/**
* Video-Controls anzeigen
*/
controls?: boolean | null;
/**
* Video ab dieser Sekunde starten
*/
startTime?: number | null;
};
/**
* Anzeigeverhältnis des Videos
*/
aspectRatio?: ('16:9' | '4:3' | '1:1' | '9:16' | '21:9') | null;
status?: ('draft' | 'published' | 'archived') | null;
/**
* Als Featured Video markieren
*/
isFeatured?: boolean | null;
publishedAt?: string | null;
/**
* Weitere Videos zu diesem Thema
*/
relatedVideos?: (number | Video)[] | null;
/**
* Blog-Beiträge zu diesem Video
*/
relatedPosts?: (number | Post)[] | null;
/**
* Vollständiges Transkript für SEO und Barrierefreiheit
*/
transcript?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
seo?: {
/**
* SEO-Titel (falls abweichend vom Video-Titel)
*/
metaTitle?: string | null;
/**
* SEO-Beschreibung (max. 160 Zeichen)
*/
metaDescription?: string | null;
/**
* Bild für Social Media Shares (Fallback: Thumbnail)
*/
ogImage?: (number | null) | Media;
};
updatedAt: string;
createdAt: string;
}
/**
* Kategorien für Video-Bibliothek (z.B. Tutorials, Produktvideos, Testimonials)
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "video-categories".
*/
export interface VideoCategory {
id: number;
tenant?: (number | null) | Tenant;
/**
* z.B. "Tutorials", "Produktvideos", "Webinare"
*/
name: string;
/**
* URL-freundlicher Name (z.B. "tutorials", "produktvideos")
*/
slug: string;
/**
* Kurzbeschreibung der Kategorie für SEO und Übersichten
*/
description?: string | null;
/**
* Icon-Name (z.B. Lucide Icon wie "play-circle", "video", "film")
*/
icon?: string | null;
/**
* Repräsentatives Bild für die Kategorieübersicht
*/
coverImage?: (number | null) | Media;
/**
* Niedrigere Zahlen erscheinen zuerst
*/
order?: number | null;
/**
* Inaktive Kategorien werden nicht angezeigt
*/
isActive?: boolean | null;
updatedAt: string;
createdAt: string;
}
/**
* Schlagwörter für Blog-Posts
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "tags".
*/
export interface Tag {
id: number;
tenant?: (number | null) | Tenant;
name: string;
/**
* URL-freundlicher Identifier (z.B. "javascript")
*/
slug: string;
/**
* Optionale Beschreibung für Tag-Archivseiten
*/
description?: string | null;
/**
* Optionale Farbe für Tag-Badge (z.B. "#3B82F6" oder "blue")
*/
color?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "posts".
*/
export interface Post {
id: number;
tenant?: (number | null) | Tenant;
title: string;
/**
* URL-Pfad (z.B. "mein-beitrag" / "my-post")
*/
slug: string;
/**
* Art des Beitrags
*/
type: 'blog' | 'news' | 'press' | 'announcement';
/**
* Auf Startseite/oben anzeigen
*/
isFeatured?: boolean | null;
/**
* Für Übersichten und SEO (max. 300 Zeichen). Wird automatisch aus Content generiert, falls leer.
*/
excerpt?: string | null;
featuredImage?: (number | null) | Media;
/**
* Optional: Video als Hero-Element für diesen Beitrag
*/
featuredVideo?: {
/**
* Video als primäres Medienelement verwenden
*/
enabled?: boolean | null;
/**
* Video statt Beitragsbild im Hero-Bereich anzeigen
*/
replaceImage?: boolean | null;
source?: ('library' | 'embed' | 'upload') | null;
/**
* Video aus der Video-Bibliothek auswählen
*/
video?: (number | null) | Video;
/**
* YouTube oder Vimeo URL
*/
embedUrl?: string | null;
/**
* MP4, WebM oder andere Video-Dateien
*/
uploadedVideo?: (number | null) | Media;
/**
* Video automatisch starten (erfordert Mute)
*/
autoplay?: boolean | null;
/**
* Video stumm abspielen (empfohlen für Autoplay)
*/
muted?: boolean | null;
/**
* Automatisch generierte Embed-URL mit Privacy-Mode
*/
processedEmbedUrl?: string | null;
/**
* Extrahierte Video-ID (z.B. YouTube Video-ID)
*/
extractedVideoId?: string | null;
/**
* Erkannte Plattform (youtube, vimeo, etc.)
*/
platform?: string | null;
/**
* Auto-generierte Thumbnail-URL
*/
thumbnailUrl?: string | null;
};
content: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
};
categories?: (number | Category)[] | null;
/**
* Schlagwörter für bessere Auffindbarkeit
*/
tags?: (number | Tag)[] | null;
/**
* Hauptautor des Beitrags
*/
author?: (number | null) | Author;
/**
* Weitere beteiligte Autoren
*/
coAuthors?: (number | Author)[] | null;
/**
* Freitext-Autor für ältere Beiträge ohne Autoren-Eintrag
*/
authorLegacy?: string | null;
/**
* Wird automatisch berechnet
*/
readingTime?: number | null;
status?: ('draft' | 'published' | 'archived') | null;
publishedAt?: string | null;
seo?: {
metaTitle?: string | null;
metaDescription?: string | null;
ogImage?: (number | null) | Media;
};
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "categories".
*/
export interface Category {
id: number;
tenant?: (number | null) | Tenant;
name: string;
slug: string;
description?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* Blog-Autoren und Gastautoren
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "authors".
*/
export interface Author {
id: number;
tenant?: (number | null) | Tenant;
/**
* Anzeigename des Autors
*/
name: string;
/**
* URL-freundlicher Identifier (z.B. "max-mustermann")
*/
slug: string;
/**
* Avatar/Profilbild (empfohlen: quadratisch, min. 200x200px)
*/
avatar?: (number | null) | Media;
/**
* Ausführliche Biografie für Autorenseite
*/
bio?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Ein bis zwei Sätze für Anzeige unter Artikeln
*/
bioShort?: string | null;
/**
* z.B. "Senior Editor", "Gastautor", "Chefredakteur"
*/
title?: string | null;
/**
* Öffentliche Kontakt-E-Mail (optional)
*/
email?: string | null;
/**
* Persönliche Website oder Blog
*/
website?: string | null;
social?: {
/**
* Twitter-Handle ohne @ (z.B. "maxmustermann")
*/
twitter?: string | null;
/**
* LinkedIn-Profil-URL oder Username
*/
linkedin?: string | null;
/**
* GitHub-Username
*/
github?: string | null;
/**
* Instagram-Handle ohne @
*/
instagram?: string | null;
};
/**
* Optional: Verknüpfung mit Team-Eintrag
*/
linkedTeam?: (number | null) | Team;
/**
* Optional: Verknüpfung mit Login-User
*/
linkedUser?: (number | null) | User;
/**
* Inaktive Autoren erscheinen nicht in Listen
*/
isActive?: boolean | null;
/**
* Markierung für Gastautoren
*/
isGuest?: boolean | null;
/**
* Für besondere Darstellung auf Autorenseite
*/
featured?: boolean | null;
updatedAt: string;
createdAt: string;
}
/**
* Team-Mitglieder und Mitarbeiter
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "team".
*/
export interface Team {
id: number;
tenant?: (number | null) | Tenant;
/**
* Vollständiger Name
*/
name: string;
/**
* URL-freundlicher Identifier (z.B. "max-mustermann")
*/
slug: string;
/**
* z.B. "Geschäftsführer", "Pflegedienstleitung", "Fotograf"
*/
role: string;
/**
* z.B. "Verwaltung", "Pflege", "Marketing"
*/
department?: string | null;
/**
* Portrait-Foto (empfohlen: quadratisch, min. 400x400px)
*/
image?: (number | null) | Media;
/**
* Kurze Beschreibung zur Person
*/
bio?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Ein-Satz-Beschreibung für kompakte Darstellung
*/
bioShort?: string | null;
/**
* Öffentliche Kontakt-E-Mail (optional)
*/
email?: string | null;
/**
* Öffentliche Telefonnummer (optional)
*/
phone?: string | null;
showContactInfo?: boolean | null;
socialLinks?:
| {
platform: 'linkedin' | 'xing' | 'twitter' | 'instagram' | 'facebook' | 'website' | 'github';
url: string;
id?: string | null;
}[]
| null;
/**
* Ausbildungen, Zertifikate, Abschlüsse
*/
qualifications?:
| {
title: string;
year?: number | null;
institution?: string | null;
id?: string | null;
}[]
| null;
specializations?:
| {
title: string;
id?: string | null;
}[]
| null;
languages?:
| {
language: string;
level?: ('native' | 'fluent' | 'good' | 'basic') | null;
id?: string | null;
}[]
| null;
/**
* Optional: Verknüpfung mit Login-User (z.B. für Autoren-Zuordnung)
*/
linkedUser?: (number | null) | User;
/**
* Inaktive Mitglieder werden nicht angezeigt
*/
isActive?: boolean | null;
/**
* Für Startseiten-Anzeige oder besondere Hervorhebung
*/
isFeatured?: boolean | null;
/**
* Niedrigere Zahlen werden zuerst angezeigt
*/
order?: number | null;
/**
* Eintrittsdatum (optional)
*/
startDate?: string | null;
/**
* Direkter Vorgesetzter (für Organigramm)
*/
reportsTo?: (number | null) | Team;
/**
* Für Organigramm-Darstellung
*/
hierarchyLevel?: ('executive' | 'department_head' | 'team_lead' | 'employee' | 'trainee') | null;
/**
* Kontaktkarte zum Download anbieten
*/
allowVCard?: boolean | null;
updatedAt: string;
createdAt: string;
}
/**
* Kundenstimmen und Bewertungen
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "testimonials".
*/
export interface Testimonial {
id: number;
tenant?: (number | null) | Tenant;
/**
* Die Aussage des Kunden
*/
quote: string;
author: string;
/**
* z.B. "Patient", "Geschäftsführer", "Marketing Manager"
*/
role?: string | null;
company?: string | null;
/**
* Portrait-Foto (empfohlen: quadratisch, min. 200x200px)
*/
image?: (number | null) | Media;
/**
* Optional: Sterne-Bewertung
*/
rating?: number | null;
/**
* z.B. "Google Reviews", "Trustpilot", "Persönlich"
*/
source?: string | null;
/**
* URL zur Original-Bewertung (falls öffentlich)
*/
sourceUrl?: string | null;
date?: string | null;
/**
* Inaktive Testimonials werden nicht angezeigt
*/
isActive?: boolean | null;
/**
* Niedrigere Zahlen werden zuerst angezeigt
*/
order?: number | null;
updatedAt: string;
createdAt: string;
}
/**
* Häufig gestellte Fragen (FAQ)
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "faqs".
*/
export interface Faq {
id: number;
tenant?: (number | null) | Tenant;
/**
* Die Frage, die beantwortet wird
*/
question: string;
/**
* Die ausführliche Antwort auf die Frage
*/
answer: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
};
/**
* Kurzfassung der Antwort als reiner Text für Schema.org Structured Data. Falls leer, wird die Rich-Text-Antwort verwendet.
*/
answerPlainText?: string | null;
/**
* Optionale Kategorie zur Gruppierung (z.B. "Allgemein", "Preise", "Lieferung")
*/
category?: string | null;
/**
* Optionaler Icon-Name (z.B. "question-circle", "info")
*/
icon?: string | null;
/**
* Andere FAQs die thematisch zusammenhängen
*/
relatedFAQs?: (number | Faq)[] | null;
/**
* Inaktive FAQs werden nicht angezeigt
*/
isActive?: boolean | null;
/**
* Hervorgehobene FAQs werden prominent angezeigt
*/
isFeatured?: boolean | null;
/**
* Niedrigere Zahlen werden zuerst angezeigt
*/
order?: number | null;
updatedAt: string;
createdAt: string;
}
/**
* Kategorien für Leistungen/Services
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "service-categories".
*/
export interface ServiceCategory {
id: number;
tenant?: (number | null) | Tenant;
/**
* z.B. "Pflege", "Beratung", "Schulung"
*/
name: string;
/**
* URL-freundlicher Name (z.B. "pflege", "beratung")
*/
slug: string;
/**
* Kurze Beschreibung der Kategorie
*/
description?: string | null;
/**
* Icon-Name (z.B. "heart", "users", "book")
*/
icon?: string | null;
/**
* Optionales Kategorie-Bild
*/
image?: (number | null) | Media;
/**
* Akzentfarbe für die Kategorie (z.B. "#3B82F6")
*/
color?: string | null;
isActive?: boolean | null;
/**
* Niedrigere Zahlen werden zuerst angezeigt
*/
order?: number | null;
updatedAt: string;
createdAt: string;
}
/**
* Leistungen und Dienstleistungen
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "services".
*/
export interface Service {
id: number;
tenant?: (number | null) | Tenant;
/**
* Name der Leistung (z.B. "Intensivpflege", "Beratungsgespräch")
*/
title: string;
/**
* URL-Pfad für Detail-Seite (z.B. "intensivpflege")
*/
slug: string;
/**
* Optionaler Untertitel oder Slogan
*/
subtitle?: string | null;
/**
* Kurze Beschreibung für Übersichtsseiten (1-2 Sätze)
*/
shortDescription: string;
/**
* Detaillierte Beschreibung für die Detail-Seite
*/
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Icon-Name (z.B. "heart", "shield", "clock")
*/
icon?: string | null;
/**
* Alternativ: Icon als hochgeladenes Bild
*/
iconImage?: (number | null) | Media;
/**
* Bild für Karten und Header der Detail-Seite
*/
image?: (number | null) | Media;
/**
* Zusätzliche Bilder für die Detail-Seite
*/
gallery?:
| {
image: number | Media;
caption?: string | null;
id?: string | null;
}[]
| null;
/**
* Kategorie zur Gruppierung der Leistung
*/
category?: (number | null) | ServiceCategory;
/**
* Vorteile und Merkmale dieser Leistung
*/
features?:
| {
title: string;
description?: string | null;
/**
* Optionales Icon für das Merkmal
*/
icon?: string | null;
id?: string | null;
}[]
| null;
pricingType?: ('on-request' | 'fixed' | 'from' | 'range' | 'hourly' | 'monthly' | 'free') | null;
/**
* Preis in Euro
*/
price?: number | null;
/**
* Maximaler Preis bei Preisspanne
*/
priceMax?: number | null;
/**
* z.B. "pro Stunde", "pro Monat", "pro Behandlung"
*/
priceUnit?: string | null;
/**
* Zusätzliche Info (z.B. "zzgl. MwSt.", "inkl. Anfahrt")
*/
priceNote?: string | null;
/**
* Ausführliche Preisinformationen für Detail-Seite
*/
pricingDetails?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
ctaText?: string | null;
/**
* Ziel-URL oder Pfad (z.B. "/kontakt", "#formular")
*/
ctaLink?: string | null;
ctaStyle?: ('primary' | 'secondary' | 'outline') | null;
secondaryCta?: {
enabled?: boolean | null;
text?: string | null;
link?: string | null;
};
/**
* Andere Leistungen die thematisch passen
*/
relatedServices?: (number | Service)[] | null;
/**
* Ansprechpartner für diese Leistung
*/
teamMembers?: (number | Team)[] | null;
/**
* FAQs zu dieser Leistung
*/
faqs?: (number | Faq)[] | null;
detailSections?:
| {
title: string;
content: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
};
icon?: string | null;
id?: string | null;
}[]
| null;
/**
* Optionales Zitat zur Leistung
*/
testimonialQuote?: string | null;
testimonialAuthor?: string | null;
/**
* Titel für Suchmaschinen (falls anders als Titel)
*/
metaTitle?: string | null;
/**
* Beschreibung für Suchmaschinen
*/
metaDescription?: string | null;
ogImage?: (number | null) | Media;
/**
* Inaktive Leistungen werden nicht angezeigt
*/
isActive?: boolean | null;
/**
* Für Startseiten-Anzeige oder besondere Hervorhebung
*/
isFeatured?: boolean | null;
/**
* Zeigt "Neu"-Badge an
*/
isNew?: boolean | null;
/**
* Niedrigere Zahlen werden zuerst angezeigt
*/
order?: number | null;
updatedAt: string;
createdAt: string;
}
/**
* Firmenstandorte und Niederlassungen
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "locations".
*/
export interface Location {
id: number;
tenant?: (number | null) | Tenant;
/**
* z.B. "Hauptsitz München", "Filiale Hamburg"
*/
name: string;
/**
* URL-freundlicher Identifier
*/
slug: string;
type?: ('headquarters' | 'office' | 'branch' | 'warehouse' | 'showroom' | 'studio' | 'practice' | 'workshop') | null;
/**
* Optionale Beschreibung des Standorts
*/
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Foto des Gebäudes oder Standorts
*/
image?: (number | null) | Media;
address: {
street: string;
/**
* z.B. "Gebäude B, 3. Stock"
*/
additionalLine?: string | null;
zip: string;
city: string;
state?: string | null;
country?: string | null;
};
/**
* Für Kartenanzeige
*/
geo?: {
/**
* z.B. 48.137154
*/
lat?: number | null;
/**
* z.B. 11.576124
*/
lng?: number | null;
zoom?: number | null;
};
contact?: {
phone?: string | null;
fax?: string | null;
email?: string | null;
/**
* Falls abweichend von Hauptwebsite
*/
website?: string | null;
};
hours?: {
/**
* z.B. "Mo-Fr: 9-18 Uhr, Sa: 10-14 Uhr"
*/
display?: string | null;
/**
* Detaillierte Öffnungszeiten pro Tag
*/
structured?:
| {
day: 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday';
closed?: boolean | null;
/**
* z.B. "09:00"
*/
open?: string | null;
/**
* z.B. "18:00"
*/
close?: string | null;
break?: {
hasBreak?: boolean | null;
start?: string | null;
end?: string | null;
};
id?: string | null;
}[]
| null;
/**
* z.B. "Termine nach Vereinbarung"
*/
note?: string | null;
};
directions?: {
text?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
parking?: string | null;
/**
* z.B. "U-Bahn U3 Haltestelle Münchner Freiheit"
*/
publicTransport?: string | null;
accessibility?: string | null;
};
/**
* Welche Dienstleistungen werden hier angeboten?
*/
services?: (number | Service)[] | null;
/**
* Mitarbeiter an diesem Standort
*/
teamMembers?: (number | Team)[] | null;
/**
* Als primärer Standort markieren
*/
isMain?: boolean | null;
isActive?: boolean | null;
showInFooter?: boolean | null;
order?: number | null;
updatedAt: string;
createdAt: string;
}
/**
* Partner, Kunden, Referenzen und Zertifizierungen
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "partners".
*/
export interface Partner {
id: number;
tenant?: (number | null) | Tenant;
/**
* Firmen-/Partnername
*/
name: string;
slug: string;
type:
| 'partner'
| 'client'
| 'reference'
| 'sponsor'
| 'certification'
| 'membership'
| 'award'
| 'supplier'
| 'technology';
/**
* Logo (empfohlen: SVG oder PNG mit transparentem Hintergrund)
*/
logo: number | Media;
/**
* Alternative Version für dunkle Hintergründe
*/
logoLight?: (number | null) | Media;
/**
* Kurze Beschreibung der Partnerschaft
*/
description?: string | null;
website?: string | null;
caseStudy?: {
quote?: string | null;
quotePerson?: string | null;
quoteRole?: string | null;
projectDescription?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
results?:
| {
/**
* z.B. "+50%", "10.000+"
*/
metric: string;
/**
* z.B. "Umsatzsteigerung", "Neue Kunden"
*/
label: string;
id?: string | null;
}[]
| null;
};
certification?: {
issuer?: string | null;
validFrom?: string | null;
validUntil?: string | null;
certNumber?: string | null;
document?: (number | null) | Media;
};
/**
* z.B. "Technologie", "Finanzen", "Pflege"
*/
category?: string | null;
tags?:
| {
tag: string;
id?: string | null;
}[]
| null;
isFeatured?: boolean | null;
isActive?: boolean | null;
order?: number | null;
since?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* Stellenanzeigen und Karriere
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "jobs".
*/
export interface Job {
id: number;
tenant?: (number | null) | Tenant;
/**
* z.B. "Pflegefachkraft (m/w/d)", "Senior Developer"
*/
title: string;
slug: string;
/**
* Interne Stellennummer
*/
reference?: string | null;
/**
* z.B. "Pflege", "IT", "Marketing"
*/
department?: string | null;
category?:
| (
| 'care'
| 'medical'
| 'admin'
| 'it'
| 'marketing'
| 'sales'
| 'finance'
| 'hr'
| 'production'
| 'logistics'
| 'other'
)
| null;
type:
| 'fulltime'
| 'parttime'
| 'minijob'
| 'working_student'
| 'internship'
| 'apprenticeship'
| 'dual_study'
| 'freelance'
| 'temporary';
workModel?: ('onsite' | 'remote' | 'hybrid') | null;
experienceLevel?: ('entry' | 'experienced' | 'senior' | 'management') | null;
location?: {
locationRef?: (number | null) | Location;
/**
* Falls kein Standort aus Collection
*/
city?: string | null;
region?: string | null;
country?: string | null;
};
/**
* Für Übersichten und SEO (max. 300 Zeichen)
*/
summary?: string | null;
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
responsibilities?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
requirements?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
qualifications?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
benefits?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Für visuelle Darstellung mit Icons
*/
benefitsList?:
| {
benefit: string;
icon?:
| (
| 'money'
| 'vacation'
| 'home'
| 'education'
| 'health'
| 'team'
| 'flexible'
| 'transport'
| 'food'
| 'childcare'
| 'fitness'
| 'parking'
)
| null;
id?: string | null;
}[]
| null;
salary?: {
show?: boolean | null;
type?: ('yearly' | 'monthly' | 'hourly') | null;
min?: number | null;
max?: number | null;
currency?: string | null;
/**
* z.B. "je nach Qualifikation"
*/
note?: string | null;
};
application?: {
method?: ('email' | 'form' | 'external' | 'mail') | null;
email?: string | null;
formId?: (number | null) | Form;
externalUrl?: string | null;
contact?: (number | null) | Team;
deadline?: string | null;
};
/**
* Bild für die Stellenanzeige
*/
image?: (number | null) | Media;
status: 'draft' | 'published' | 'filled' | 'archived';
publishedAt?: string | null;
isFeatured?: boolean | null;
isUrgent?: boolean | null;
seo?: {
metaTitle?: string | null;
metaDescription?: string | null;
};
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "forms".
*/
export interface Form {
id: number;
title: string;
fields?:
| (
| {
name: string;
label?: string | null;
width?: number | null;
required?: boolean | null;
defaultValue?: boolean | null;
id?: string | null;
blockName?: string | null;
blockType: 'checkbox';
}
| {
name: string;
label?: string | null;
width?: number | null;
required?: boolean | null;
id?: string | null;
blockName?: string | null;
blockType: 'email';
}
| {
message?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
id?: string | null;
blockName?: string | null;
blockType: 'message';
}
| {
name: string;
label?: string | null;
width?: number | null;
defaultValue?: number | null;
required?: boolean | null;
id?: string | null;
blockName?: string | null;
blockType: 'number';
}
| {
name: string;
label?: string | null;
width?: number | null;
defaultValue?: string | null;
placeholder?: string | null;
options?:
| {
label: string;
value: string;
id?: string | null;
}[]
| null;
required?: boolean | null;
id?: string | null;
blockName?: string | null;
blockType: 'select';
}
| {
name: string;
label?: string | null;
width?: number | null;
defaultValue?: string | null;
required?: boolean | null;
id?: string | null;
blockName?: string | null;
blockType: 'text';
}
| {
name: string;
label?: string | null;
width?: number | null;
defaultValue?: string | null;
required?: boolean | null;
id?: string | null;
blockName?: string | null;
blockType: 'textarea';
}
)[]
| null;
submitButtonLabel?: string | null;
/**
* Choose whether to display an on-page message or redirect to a different page after they submit the form.
*/
confirmationType?: ('message' | 'redirect') | null;
confirmationMessage?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
redirect?: {
type?: ('reference' | 'custom') | null;
reference?: {
relationTo: 'pages';
value: number | Page;
} | null;
url?: string | null;
};
/**
* Send custom emails when the form submits. Use comma separated lists to send the same email to multiple recipients. To reference a value from this form, wrap that field's name with double curly brackets, i.e. {{firstName}}. You can use a wildcard {{*}} to output all data and {{*:table}} to format it as an HTML table in the email.
*/
emails?:
| {
emailTo?: string | null;
cc?: string | null;
bcc?: string | null;
replyTo?: string | null;
emailFrom?: string | null;
subject: string;
/**
* Enter the message that should be sent in this email.
*/
message?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
id?: string | null;
}[]
| null;
updatedAt: string;
createdAt: string;
}
/**
* Produkte und Artikel
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "products".
*/
export interface Product {
id: number;
tenant?: (number | null) | Tenant;
title: string;
/**
* URL-freundlicher Name (z.B. "premium-widget")
*/
slug: string;
/**
* Eindeutige Artikelnummer für interne Verwaltung
*/
sku?: string | null;
/**
* Kurze Beschreibung für Produktlisten (max. 200 Zeichen)
*/
shortDescription?: string | null;
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Hauptkategorie des Produkts
*/
category?: (number | null) | ProductCategory;
/**
* Zusätzliche Schlagworte für Filterung
*/
tags?:
| {
tag: string;
id?: string | null;
}[]
| null;
featuredImage: number | Media;
/**
* Zusätzliche Produktbilder
*/
gallery?:
| {
image: number | Media;
caption?: string | null;
id?: string | null;
}[]
| null;
pricing?: {
/**
* Regulärer Preis in Euro
*/
price?: number | null;
/**
* Reduzierter Preis (optional)
*/
salePrice?: number | null;
currency?: ('EUR' | 'USD' | 'CHF') | null;
priceType?: ('fixed' | 'from' | 'on_request' | 'free') | null;
/**
* z.B. "zzgl. MwSt.", "pro Monat", "Einmalzahlung"
*/
priceNote?: string | null;
};
/**
* Technische Daten und Spezifikationen
*/
details?: {
/**
* Technische Daten als Schlüssel-Wert-Paare
*/
specifications?:
| {
key: string;
value: string;
id?: string | null;
}[]
| null;
/**
* Wichtigste Produktvorteile
*/
features?:
| {
feature: string;
/**
* Optional: Lucide-Icon Name
*/
icon?: string | null;
id?: string | null;
}[]
| null;
};
inventory?: {
stockStatus?: ('in_stock' | 'low_stock' | 'out_of_stock' | 'on_order' | 'preorder') | null;
/**
* Aktuelle Stückzahl (optional)
*/
stockQuantity?: number | null;
/**
* z.B. "1-3 Werktage", "Sofort lieferbar"
*/
deliveryTime?: string | null;
};
/**
* Produktempfehlungen für Cross-Selling
*/
relatedProducts?: (number | Product)[] | null;
/**
* Produktdatenblätter, Anleitungen, etc.
*/
downloadFiles?:
| {
file: number | Media;
title?: string | null;
id?: string | null;
}[]
| null;
/**
* Handlungsaufforderung für das Produkt
*/
cta?: {
type?: ('contact' | 'quote' | 'cart' | 'external' | 'download') | null;
/**
* z.B. "Jetzt anfragen", "Kaufen", "Herunterladen"
*/
buttonText?: string | null;
/**
* URL für externen Shop oder Bestellseite
*/
externalUrl?: string | null;
};
seo?: {
/**
* Überschreibt den Produktnamen für Suchmaschinen
*/
metaTitle?: string | null;
/**
* Kurze Beschreibung für Suchergebnisse (max. 160 Zeichen)
*/
metaDescription?: string | null;
/**
* Bild für Social Media Shares (1200x630px empfohlen)
*/
ogImage?: (number | null) | Media;
};
status?: ('draft' | 'published' | 'archived') | null;
/**
* Auf Startseite oder in Highlights anzeigen
*/
isFeatured?: boolean | null;
/**
* "Neu"-Badge anzeigen
*/
isNew?: boolean | null;
/**
* Kleinere Zahlen erscheinen zuerst
*/
order?: number | null;
publishedAt?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* Kategorien zur Gruppierung von Produkten
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "product-categories".
*/
export interface ProductCategory {
id: number;
tenant?: (number | null) | Tenant;
name: string;
/**
* URL-freundlicher Name (z.B. "elektronik", "software")
*/
slug: string;
/**
* Kurze Beschreibung der Kategorie
*/
description?: string | null;
image?: (number | null) | Media;
/**
* Icon-Name (z.B. Lucide-Icons: "package", "cpu", "code")
*/
icon?: string | null;
/**
* Optional: Für verschachtelte Kategorien
*/
parent?: (number | null) | ProductCategory;
/**
* Kleinere Zahlen erscheinen zuerst
*/
order?: number | null;
/**
* Inaktive Kategorien werden nicht angezeigt
*/
isActive?: boolean | null;
/**
* Suchmaschinenoptimierung für Kategorieseiten
*/
seo?: {
metaTitle?: string | null;
metaDescription?: string | null;
};
updatedAt: string;
createdAt: string;
}
/**
* Downloadbare Dateien und Dokumente
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "downloads".
*/
export interface Download {
id: number;
tenant?: (number | null) | Tenant;
title: string;
slug: string;
description?: string | null;
file: number | Media;
/**
* Wird automatisch erkannt, kann überschrieben werden
*/
fileType?: ('pdf' | 'doc' | 'xls' | 'ppt' | 'image' | 'video' | 'audio' | 'archive' | 'other') | null;
/**
* z.B. "2.5 MB" - wird automatisch berechnet
*/
fileSize?: string | null;
category?:
| (
| 'brochure'
| 'flyer'
| 'catalog'
| 'pricelist'
| 'form'
| 'manual'
| 'datasheet'
| 'certificate'
| 'press'
| 'whitepaper'
| 'presentation'
| 'legal'
| 'other'
)
| null;
tags?:
| {
tag: string;
id?: string | null;
}[]
| null;
/**
* Optionales Thumbnail (sonst wird Standard-Icon verwendet)
*/
thumbnail?: (number | null) | Media;
relatedServices?: (number | Service)[] | null;
relatedProducts?: (number | Product)[] | null;
access?: {
requireLogin?: boolean | null;
/**
* User müssen Kontaktdaten eingeben
*/
requireForm?: boolean | null;
formFields?: ('name' | 'email' | 'company' | 'phone')[] | null;
};
downloadCount?: number | null;
/**
* z.B. "2024-01", "v2.0"
*/
version?: string | null;
lastUpdated?: string | null;
isActive?: boolean | null;
isFeatured?: boolean | null;
order?: number | null;
updatedAt: string;
createdAt: string;
}
/**
* Veranstaltungen und Events
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "events".
*/
export interface Event {
id: number;
tenant?: (number | null) | Tenant;
title: string;
/**
* URL-Pfad für das Event
*/
slug: string;
subtitle?: string | null;
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Für Übersichtsseiten und SEO
*/
excerpt?: string | null;
eventType:
| 'event'
| 'workshop'
| 'seminar'
| 'webinar'
| 'conference'
| 'tradeshow'
| 'networking'
| 'course'
| 'talk'
| 'other';
/**
* Freies Textfeld für Kategorisierung
*/
category?: string | null;
format: 'onsite' | 'online' | 'hybrid';
startDate: string;
/**
* Leer lassen für eintägige Events
*/
endDate?: string | null;
isAllDay?: boolean | null;
/**
* z.B. Europe/Berlin, America/New_York
*/
timezone?: string | null;
isRecurring?: boolean | null;
recurrence?: {
frequency?: ('daily' | 'weekly' | 'monthly' | 'yearly') | null;
/**
* Alle X Tage/Wochen/Monate/Jahre
*/
interval?: number | null;
endRecurrence?: string | null;
/**
* z.B. "Jeden ersten Montag im Monat"
*/
description?: string | null;
};
location?: {
/**
* Aus bestehenden Standorten wählen
*/
locationRef?: (number | null) | Location;
customLocation?: boolean | null;
venueName?: string | null;
street?: string | null;
zip?: string | null;
city?: string | null;
country?: string | null;
room?: string | null;
directions?: string | null;
};
online?: {
platform?: ('zoom' | 'teams' | 'google-meet' | 'webex' | 'gotowebinar' | 'livestream' | 'other') | null;
/**
* Wird nur angemeldeten Teilnehmern angezeigt
*/
accessLink?: string | null;
/**
* z.B. Meeting-ID, Passwort
*/
accessInfo?: string | null;
};
image?: (number | null) | Media;
gallery?:
| {
image: number | Media;
caption?: string | null;
id?: string | null;
}[]
| null;
registration?: {
required?: boolean | null;
method?: ('form' | 'email' | 'external' | 'phone') | null;
formId?: (number | null) | Form;
email?: string | null;
externalUrl?: string | null;
phone?: string | null;
deadline?: string | null;
/**
* 0 = unbegrenzt
*/
maxParticipants?: number | null;
currentParticipants?: number | null;
waitlistEnabled?: boolean | null;
};
pricing?: {
isFree?: boolean | null;
prices?:
| {
/**
* z.B. "Standard", "Frühbucher", "Ermäßigt"
*/
name: string;
price: number;
currency?: string | null;
description?: string | null;
/**
* Für Frühbucher-Preise
*/
validUntil?: string | null;
id?: string | null;
}[]
| null;
/**
* z.B. "zzgl. MwSt.", "inkl. Verpflegung"
*/
priceNote?: string | null;
};
speakers?:
| {
teamMember?: (number | null) | Team;
isExternal?: boolean | null;
name?: string | null;
title?: string | null;
company?: string | null;
photo?: (number | null) | Media;
bio?: string | null;
/**
* z.B. "Hauptredner", "Workshop-Leiter"
*/
role?: string | null;
id?: string | null;
}[]
| null;
agenda?:
| {
/**
* z.B. "09:00 - 10:30"
*/
time?: string | null;
title: string;
description?: string | null;
speaker?: string | null;
type?: ('talk' | 'workshop' | 'break' | 'networking' | 'panel' | 'qa') | null;
id?: string | null;
}[]
| null;
contact?: {
teamMember?: (number | null) | Team;
name?: string | null;
email?: string | null;
phone?: string | null;
};
relatedServices?: (number | Service)[] | null;
relatedEvents?: (number | Event)[] | null;
seo?: {
metaTitle?: string | null;
metaDescription?: string | null;
ogImage?: (number | null) | Media;
};
status: 'draft' | 'published' | 'soldout' | 'cancelled' | 'postponed' | 'past';
isFeatured?: boolean | null;
publishedAt?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* YouTube-Serien und Content-Reihen
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "series".
*/
export interface Series {
id: number;
tenant?: (number | null) | Tenant;
title: string;
/**
* URL-freundlicher Name (z.B. "grfi-series")
*/
slug: string;
/**
* Kurzer Slogan oder Untertitel (max. 150 Zeichen)
*/
tagline?: string | null;
/**
* Ausführliche Beschreibung der Serie
*/
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Serien-Logo (empfohlen: transparent PNG)
*/
logo?: (number | null) | Media;
/**
* Hauptbild für die Serie (16:9 empfohlen)
*/
coverImage?: (number | null) | Media;
/**
* Hex-Farbcode (z.B. #B08D57)
*/
brandColor?: string | null;
/**
* Sekundäre Farbe (z.B. #FFFFFF)
*/
accentColor?: string | null;
/**
* Die Playlist-ID aus YouTube (z.B. PLxxxxxx)
*/
youtubePlaylistId?: string | null;
/**
* Vollständiger Link zur YouTube-Playlist
*/
youtubePlaylistUrl?: string | null;
/**
* Niedrigere Zahlen werden zuerst angezeigt
*/
order?: number | null;
/**
* Inaktive Serien werden nicht angezeigt
*/
isActive: boolean;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "social-links".
*/
export interface SocialLink {
id: number;
tenant?: (number | null) | Tenant;
platform: 'facebook' | 'x' | 'instagram' | 'youtube' | 'linkedin' | 'xing';
url: string;
isActive?: boolean | null;
updatedAt: string;
createdAt: string;
}
/**
* Newsletter-Abonnenten (DSGVO-konform)
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "newsletter-subscribers".
*/
export interface NewsletterSubscriber {
id: number;
tenant?: (number | null) | Tenant;
email: string;
firstName?: string | null;
lastName?: string | null;
status: 'pending' | 'confirmed' | 'unsubscribed' | 'bounced';
interests?: ('general' | 'blog' | 'products' | 'offers' | 'events')[] | null;
/**
* z.B. "Footer", "Popup", "Blog-Artikel", "Kontakt-Seite"
*/
source?: string | null;
subscribedAt?: string | null;
confirmedAt?: string | null;
unsubscribedAt?: string | null;
confirmationToken?: string | null;
/**
* DSGVO-Nachweis der Anmeldung
*/
ipAddress?: string | null;
userAgent?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* Kategorien für Portfolio-Galerien (z.B. Hochzeit, Portrait, Landschaft)
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "portfolio-categories".
*/
export interface PortfolioCategory {
id: number;
tenant?: (number | null) | Tenant;
/**
* z.B. "Hochzeitsfotografie", "Portraits", "Landschaften"
*/
name: string;
/**
* URL-freundlicher Name (z.B. "hochzeit", "portrait")
*/
slug: string;
/**
* Kurzbeschreibung der Kategorie für SEO und Übersichten
*/
description?: string | null;
/**
* Repräsentatives Bild für die Kategorieübersicht
*/
coverImage?: (number | null) | Media;
/**
* Niedrigere Zahlen erscheinen zuerst
*/
order?: number | null;
/**
* Inaktive Kategorien werden nicht angezeigt
*/
isActive?: boolean | null;
updatedAt: string;
createdAt: string;
}
/**
* Portfolio-Galerien mit Fotografien
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "portfolios".
*/
export interface Portfolio {
id: number;
tenant?: (number | null) | Tenant;
/**
* Name der Galerie / des Projekts
*/
title: string;
/**
* URL-freundlicher Name (z.B. "hochzeit-maria-thomas")
*/
slug: string;
/**
* Ausführliche Beschreibung des Projekts/Shootings
*/
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Kurze Beschreibung für Übersichten und SEO (max. 300 Zeichen)
*/
excerpt?: string | null;
/**
* Hauptkategorie dieser Galerie
*/
category: number | PortfolioCategory;
/**
* Zusätzliche Schlagwörter für Filterung (z.B. "outdoor", "studio", "schwarz-weiß")
*/
tags?: string[] | null;
/**
* Hauptbild für Übersichten und Vorschauen
*/
coverImage: number | Media;
/**
* Alle Bilder dieser Galerie
*/
images: {
image: number | Media;
/**
* Optionale Beschreibung für dieses Bild
*/
caption?: string | null;
/**
* Als Highlight-Bild markieren
*/
isHighlight?: boolean | null;
id?: string | null;
}[];
/**
* Zusätzliche Informationen zum Shooting
*/
projectDetails?: {
/**
* Name des Kunden (optional, für Referenzen)
*/
client?: string | null;
/**
* Wo wurde das Shooting durchgeführt?
*/
location?: string | null;
shootingDate?: string | null;
/**
* Kamera, Objektive etc. (optional)
*/
equipment?: string[] | null;
};
/**
* Veröffentlichungsstatus
*/
status: 'draft' | 'published' | 'archived';
/**
* Auf der Startseite anzeigen
*/
isFeatured?: boolean | null;
/**
* Wann soll die Galerie veröffentlicht werden?
*/
publishedAt?: string | null;
/**
* Für manuelle Sortierung (niedrigere Zahlen zuerst)
*/
order?: number | null;
seo?: {
/**
* Überschreibt den Standardtitel für Suchmaschinen
*/
metaTitle?: string | null;
/**
* Beschreibung für Suchmaschinen (max. 160 Zeichen)
*/
metaDescription?: string | null;
/**
* Bild für Social Media Shares (verwendet Cover-Bild wenn leer)
*/
ogImage?: (number | null) | Media;
};
updatedAt: string;
createdAt: string;
}
/**
* Chronologische Darstellungen für Unternehmensgeschichte, Meilensteine, etc.
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "timelines".
*/
export interface Timeline {
id: number;
tenant?: (number | null) | Tenant;
/**
* Interner Name zur Identifikation (z.B. "Unternehmensgeschichte")
*/
name: string;
/**
* URL-freundlicher Identifier (z.B. "company-history")
*/
slug: string;
/**
* Optionale Beschreibung der Timeline
*/
description?: string | null;
type: 'history' | 'milestones' | 'releases' | 'career' | 'events' | 'process';
status: 'draft' | 'published' | 'archived';
displayOptions?: {
layout?: ('vertical' | 'alternating' | 'horizontal' | 'compact') | null;
sortOrder?: ('desc' | 'asc') | null;
showConnector?: boolean | null;
showImages?: boolean | null;
groupByYear?: boolean | null;
markerStyle?: ('dot' | 'number' | 'icon' | 'date') | null;
colorScheme?: ('primary' | 'secondary' | 'neutral' | 'colorful') | null;
};
/**
* Die einzelnen Einträge der Timeline
*/
events: {
dateType?: ('year' | 'monthYear' | 'fullDate' | 'range' | 'custom') | null;
year?: number | null;
month?: ('1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12') | null;
day?: number | null;
endYear?: number | null;
endMonth?: ('1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12') | null;
ongoing?: boolean | null;
/**
* z.B. "Frühjahr 2024", "Q1 2023", "1990er Jahre"
*/
customDate?: string | null;
title: string;
/**
* Optional: z.B. Rolle, Position, Ort
*/
subtitle?: string | null;
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Für kompakte Ansichten (max. 200 Zeichen empfohlen)
*/
shortDescription?: string | null;
image?: (number | null) | Media;
/**
* Zusätzliche Bilder für dieses Ereignis
*/
gallery?:
| {
image: number | Media;
caption?: string | null;
id?: string | null;
}[]
| null;
/**
* Zur Filterung und farblichen Unterscheidung
*/
category?:
| ('milestone' | 'founding' | 'product' | 'team' | 'award' | 'partnership' | 'expansion' | 'technology' | 'other')
| null;
/**
* Highlights werden visuell hervorgehoben
*/
importance?: ('highlight' | 'normal' | 'minor') | null;
/**
* Explizite Nummerierung (optional, sonst wird Reihenfolge verwendet)
*/
stepNumber?: number | null;
/**
* z.B. "2-3 Tage", "1 Woche", "30 Minuten"
*/
duration?: string | null;
/**
* Person oder Rolle (z.B. "HR-Team", "Projektleiter")
*/
responsible?: string | null;
/**
* Wer muss in diesem Schritt aktiv werden?
*/
actionRequired?: ('customer' | 'internal' | 'both' | 'automatic') | null;
/**
* Was wird in diesem Schritt erstellt oder benötigt?
*/
deliverables?:
| {
name: string;
type?: ('output' | 'input' | 'document') | null;
id?: string | null;
}[]
| null;
/**
* Emoji oder Lucide Icon-Name (z.B. "rocket", "award", "users")
*/
icon?: string | null;
/**
* Überschreibt die Kategorie-Farbe (z.B. "#FF5733" oder "blue")
*/
color?: string | null;
links?:
| {
label: string;
url: string;
type?: ('internal' | 'external' | 'download') | null;
id?: string | null;
}[]
| null;
/**
* Für spezielle Anwendungsfälle (z.B. Statistiken, Kennzahlen)
*/
metadata?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
id?: string | null;
}[];
seo?: {
metaTitle?: string | null;
metaDescription?: string | null;
};
updatedAt: string;
createdAt: string;
}
/**
* Komplexe Prozesse und Workflows mit Phasen, Abhängigkeiten und Status-Tracking
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "workflows".
*/
export interface Workflow {
id: number;
tenant?: (number | null) | Tenant;
/**
* Name des Workflows (z.B. "Projektablauf Webentwicklung")
*/
name: string;
/**
* URL-freundlicher Identifier
*/
slug: string;
/**
* Ausführliche Beschreibung des Workflows
*/
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Kurze Zusammenfassung für Übersichten
*/
shortDescription?: string | null;
type: 'project' | 'business' | 'approval' | 'onboarding' | 'support' | 'development' | 'marketing' | 'other';
status: 'draft' | 'published' | 'archived';
/**
* Optionales Bild für den Workflow
*/
image?: (number | null) | Media;
properties?: {
/**
* z.B. "4-6 Wochen", "3 Monate"
*/
estimatedDuration?: string | null;
complexity?: ('simple' | 'medium' | 'complex' | 'very_complex') | null;
/**
* Kann der Workflow wiederholt durchlaufen werden?
*/
isIterative?: boolean | null;
/**
* Können mehrere Phasen gleichzeitig aktiv sein?
*/
allowParallelPhases?: boolean | null;
};
displayOptions?: {
layout?: ('vertical' | 'horizontal' | 'flowchart' | 'kanban' | 'gantt') | null;
showPhaseNumbers?: boolean | null;
showStepNumbers?: boolean | null;
showDurations?: boolean | null;
showResponsible?: boolean | null;
/**
* Zeigt Fortschrittsbalken basierend auf abgeschlossenen Schritten
*/
showProgress?: boolean | null;
colorScheme?: ('phase' | 'status' | 'priority' | 'brand') | null;
};
/**
* Hauptabschnitte des Workflows
*/
phases: {
name: string;
description?: string | null;
/**
* Lucide Icon-Name (z.B. "rocket", "settings", "check-circle")
*/
icon?: string | null;
/**
* HEX-Farbe (z.B. "#3B82F6") oder Tailwind-Klasse
*/
color?: string | null;
/**
* z.B. "1 Woche", "2-3 Tage"
*/
estimatedDuration?: string | null;
/**
* Rolle oder Person (z.B. "Projektleiter", "Design-Team")
*/
responsible?: string | null;
/**
* Einzelne Schritte in dieser Phase
*/
steps: {
name: string;
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Für kompakte Ansichten
*/
shortDescription?: string | null;
stepType?: ('task' | 'decision' | 'milestone' | 'approval' | 'wait' | 'automatic') | null;
priority?: ('critical' | 'high' | 'normal' | 'low' | 'optional') | null;
/**
* z.B. "2 Stunden", "1 Tag"
*/
estimatedDuration?: string | null;
responsible?: string | null;
icon?: string | null;
/**
* Welche Schritte müssen vorher abgeschlossen sein?
*/
dependencies?: {
/**
* IDs oder Namen der Vorgänger-Schritte (komma-separiert). Leer = vorheriger Schritt
*/
dependsOnSteps?: string | null;
canRunParallel?: boolean | null;
/**
* Muss abgeschlossen sein, bevor der nächste Schritt beginnt
*/
isBlocking?: boolean | null;
};
/**
* Für Entscheidungsschritte: Welche Wege gibt es?
*/
conditions?:
| {
/**
* z.B. "Wenn genehmigt", "Bei Budget > 10.000€"
*/
condition: string;
/**
* ID oder Name des nächsten Schritts
*/
nextStep?: string | null;
/**
* z.B. "green" für positiv, "red" für negativ
*/
color?: string | null;
id?: string | null;
}[]
| null;
/**
* To-Do-Punkte für diesen Schritt
*/
checklist?:
| {
item: string;
isRequired?: boolean | null;
id?: string | null;
}[]
| null;
resources?:
| {
name: string;
type?: ('document' | 'template' | 'link' | 'tool' | 'video') | null;
file?: (number | null) | Media;
url?: string | null;
description?: string | null;
id?: string | null;
}[]
| null;
/**
* Was wird in diesem Schritt produziert?
*/
outputs?:
| {
name: string;
description?: string | null;
id?: string | null;
}[]
| null;
/**
* Für spezielle Anwendungsfälle
*/
metadata?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
id?: string | null;
}[];
/**
* Was wird am Ende dieser Phase abgeliefert?
*/
deliverables?:
| {
name: string;
description?: string | null;
id?: string | null;
}[]
| null;
id?: string | null;
}[];
/**
* Ressourcen, die für den gesamten Workflow relevant sind
*/
globalResources?:
| {
name: string;
type?: ('document' | 'template' | 'checklist' | 'link' | 'tool') | null;
file?: (number | null) | Media;
url?: string | null;
description?: string | null;
id?: string | null;
}[]
| null;
seo?: {
metaTitle?: string | null;
metaDescription?: string | null;
};
updatedAt: string;
createdAt: string;
}
/**
* Terminbuchungen für Fotoshootings
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "bookings".
*/
export interface Booking {
id: number;
tenant?: (number | null) | Tenant;
customerName: string;
customerEmail: string;
customerPhone?: string | null;
customerCompany?: string | null;
serviceType:
| 'wedding'
| 'portrait'
| 'business'
| 'event'
| 'product'
| 'family'
| 'newborn'
| 'maternity'
| 'realestate'
| 'other';
/**
* Optional: Verknüpfung mit einem definierten Service
*/
service?: (number | null) | Service;
date: string;
/**
* z.B. 14:00 Uhr
*/
time?: string | null;
duration?: ('30' | '60' | '120' | '180' | '240' | '480' | 'custom') | null;
locationType?: ('studio' | 'outdoor' | 'customer' | 'event' | 'tbd') | null;
locationAddress?: string | null;
/**
* Wie viele Personen sollen fotografiert werden?
*/
participants?: number | null;
/**
* Besondere Wünsche, Ideen oder Anmerkungen
*/
message?: string | null;
/**
* Beispielbilder für gewünschten Stil
*/
referenceImages?:
| {
image?: (number | null) | Media;
note?: string | null;
id?: string | null;
}[]
| null;
status: 'pending' | 'review' | 'confirmed' | 'deposit' | 'completed' | 'cancelled' | 'noshow';
priority?: ('high' | 'normal' | 'low') | null;
pricing?: {
/**
* In Euro
*/
estimatedPrice?: number | null;
finalPrice?: number | null;
depositAmount?: number | null;
depositPaid?: boolean | null;
fullyPaid?: boolean | null;
};
/**
* Nur für interne Verwendung
*/
internalNotes?:
| {
note: string;
author?: (number | null) | User;
createdAt?: string | null;
id?: string | null;
}[]
| null;
contactHistory?:
| {
type: 'email_sent' | 'email_received' | 'call' | 'whatsapp' | 'inperson';
summary: string;
date?: string | null;
id?: string | null;
}[]
| null;
assignedTo?: (number | null) | User;
source?: ('website' | 'phone' | 'email' | 'instagram' | 'facebook' | 'referral' | 'returning' | 'other') | null;
/**
* Kunde hat Datenschutzerklärung akzeptiert
*/
gdprConsent?: boolean | null;
updatedAt: string;
createdAt: string;
}
/**
* Zertifizierungen, Akkreditierungen und Qualitätssiegel
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "certifications".
*/
export interface Certification {
id: number;
tenant?: (number | null) | Tenant;
name: string;
/**
* URL-freundlicher Name
*/
slug: string;
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Für Übersichten und Meta-Beschreibungen
*/
shortDescription?: string | null;
type: 'iso' | 'din' | 'accreditation' | 'seal' | 'membership' | 'award' | 'license' | 'approval' | 'other';
category?:
| (
| 'quality'
| 'care'
| 'medical'
| 'hygiene'
| 'safety'
| 'privacy'
| 'environment'
| 'hr'
| 'it-security'
| 'accessibility'
| 'other'
)
| null;
issuer: {
name: string;
logo?: (number | null) | Media;
website?: string | null;
country?: ('DE' | 'AT' | 'CH' | 'EU' | 'INT') | null;
};
certNumber?: string | null;
issuedDate?: string | null;
validUntil?: string | null;
renewalCycle?: ('yearly' | '2years' | '3years' | '5years' | 'unlimited') | null;
logo?: (number | null) | Media;
/**
* Das offizielle Zertifikatsdokument
*/
certificate?: (number | null) | Media;
gallery?:
| {
document?: (number | null) | Media;
title?: string | null;
id?: string | null;
}[]
| null;
scope?: {
description?: string | null;
/**
* Für welche Standorte gilt die Zertifizierung?
*/
locations?: (number | Location)[] | null;
/**
* Für welche Leistungen gilt die Zertifizierung?
*/
services?: (number | Service)[] | null;
};
requirements?:
| {
requirement: string;
description?: string | null;
id?: string | null;
}[]
| null;
benefits?:
| {
title: string;
description?: string | null;
icon?: ('check' | 'star' | 'shield' | 'heart' | 'lock' | 'search' | 'clock' | 'document') | null;
id?: string | null;
}[]
| null;
/**
* Historie der durchgeführten Audits
*/
audits?:
| {
date: string;
type?: ('initial' | 'surveillance' | 'recertification' | 'special') | null;
result?: ('passed' | 'conditional' | 'failed') | null;
notes?: string | null;
id?: string | null;
}[]
| null;
status: 'active' | 'pending' | 'renewal' | 'suspended' | 'expired' | 'withdrawn';
visibility?: ('public' | 'request' | 'internal') | null;
/**
* Höhere Zahl = höhere Priorität in der Anzeige
*/
priority?: number | null;
showOnHomepage?: boolean | null;
seo?: {
metaTitle?: string | null;
metaDescription?: string | null;
};
updatedAt: string;
createdAt: string;
}
/**
* Projekte, Spiele und kreative Arbeiten
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "projects".
*/
export interface Project {
id: number;
tenant?: (number | null) | Tenant;
title: string;
slug: string;
/**
* Kurze, prägnante Beschreibung (1 Zeile)
*/
tagline?: string | null;
description?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
/**
* Für Übersichten und Social Media
*/
shortDescription?: string | null;
type: 'game' | 'demo' | 'mod' | 'tool' | 'assets' | 'prototype' | 'gamejam' | 'tutorial' | 'opensource' | 'other';
genres?:
| (
| 'action'
| 'adventure'
| 'rpg'
| 'strategy'
| 'simulation'
| 'puzzle'
| 'horror'
| 'shooter'
| 'platformer'
| 'racing'
| 'sports'
| 'fighting'
| 'music'
| 'visualnovel'
| 'survival'
| 'sandbox'
| 'towerdefense'
| 'roguelike'
| 'indie'
)[]
| null;
platforms?:
| (
| 'windows'
| 'macos'
| 'linux'
| 'web'
| 'ios'
| 'android'
| 'playstation'
| 'xbox'
| 'switch'
| 'steamdeck'
| 'vr'
)[]
| null;
featuredImage: number | Media;
logo?: (number | null) | Media;
screenshots?:
| {
image: number | Media;
caption?: string | null;
id?: string | null;
}[]
| null;
videos?:
| {
type: 'trailer' | 'gameplay' | 'devlog' | 'tutorial' | 'other';
title?: string | null;
/**
* YouTube, Vimeo oder direkter Link
*/
url: string;
thumbnail?: (number | null) | Media;
id?: string | null;
}[]
| null;
techStack?: {
engine?:
| (
| 'unity'
| 'unreal'
| 'godot'
| 'gamemaker'
| 'rpgmaker'
| 'construct'
| 'custom'
| 'renpy'
| 'phaser'
| 'other'
)
| null;
languages?:
| ('csharp' | 'cpp' | 'gdscript' | 'javascript' | 'typescript' | 'python' | 'lua' | 'rust' | 'blueprint')[]
| null;
/**
* z.B. Blender, Aseprite, FMOD
*/
tools?: string | null;
};
requirements?: {
minimum?: {
os?: string | null;
cpu?: string | null;
ram?: string | null;
gpu?: string | null;
storage?: string | null;
};
recommended?: {
os?: string | null;
cpu?: string | null;
ram?: string | null;
gpu?: string | null;
storage?: string | null;
};
};
releaseDate?: string | null;
links?: {
website?: string | null;
steam?: string | null;
itchio?: string | null;
epicGames?: string | null;
gog?: string | null;
playStore?: string | null;
appStore?: string | null;
github?: string | null;
discord?: string | null;
twitter?: string | null;
};
downloads?:
| {
/**
* z.B. "Windows Build", "Demo v0.5"
*/
title: string;
platform?: ('windows' | 'macos' | 'linux' | 'universal') | null;
version?: string | null;
file?: (number | null) | Media;
externalUrl?: string | null;
size?: string | null;
id?: string | null;
}[]
| null;
features?:
| {
title: string;
description?: string | null;
icon?: (number | null) | Media;
id?: string | null;
}[]
| null;
team?:
| {
name: string;
role?: string | null;
link?: string | null;
avatar?: (number | null) | Media;
id?: string | null;
}[]
| null;
gameJam?: {
jamName?: string | null;
theme?: string | null;
/**
* z.B. "48 Stunden"
*/
duration?: string | null;
ranking?: string | null;
jamLink?: string | null;
};
/**
* Verknüpfte Blog-Posts über dieses Projekt
*/
devlogs?: (number | Post)[] | null;
status: 'development' | 'earlyaccess' | 'released' | 'paused' | 'cancelled' | 'completed';
visibility?: ('public' | 'draft' | 'unlisted' | 'private') | null;
featured?: boolean | null;
/**
* Höher = weiter oben
*/
sortOrder?: number | null;
seo?: {
metaTitle?: string | null;
metaDescription?: string | null;
ogImage?: (number | null) | Media;
};
updatedAt: string;
createdAt: string;
}
/**
* Affiliate-Produkte und Favoriten
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "favorites".
*/
export interface Favorite {
id: number;
tenant?: (number | null) | Tenant;
title: string;
/**
* URL-freundlicher Name
*/
slug: string;
/**
* Kurze Produktbeschreibung (max. 300 Zeichen)
*/
description?: string | null;
category: 'fashion' | 'beauty' | 'travel' | 'tech' | 'home';
/**
* z.B. "Taschen", "Hautpflege", "Laptops"
*/
subcategory?: string | null;
/**
* Aktueller Preis in Euro
*/
price?: number | null;
priceRange?: ('budget' | 'mid' | 'premium' | 'luxury') | null;
/**
* Vollständiger Affiliate-Link mit Tracking
*/
affiliateUrl: string;
affiliateNetwork?: ('amazon' | 'awin' | 'ltk' | 'direct' | 'other') | null;
/**
* Hauptbild des Produkts
*/
image: number | Media;
/**
* Optionales Label/Abzeichen
*/
badge?: ('investment-piece' | 'daily-driver' | 'grfi-approved' | 'new' | 'bestseller') | null;
/**
* In der Featured-Sektion anzeigen
*/
featured?: boolean | null;
/**
* Inaktive Favoriten werden nicht angezeigt
*/
isActive: boolean;
/**
* Niedrigere Zahlen werden zuerst angezeigt
*/
order?: number | null;
updatedAt: string;
createdAt: string;
}
/**
* Content-Pipeline für YouTube-Videos
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "youtube-content".
*/
export interface YoutubeContent {
id: number;
/**
* Max. 60 Zeichen für YouTube empfohlen
*/
title: string;
/**
* URL-freundlicher Name (wird automatisch generiert)
*/
slug: string;
channel: number | YoutubeChannel;
/**
* Content-Serie für dieses Video
*/
series?: (number | null) | YtSery;
format: 'short' | 'longform' | 'premiere';
status:
| 'idea'
| 'script_draft'
| 'script_review'
| 'script_approved'
| 'shoot_scheduled'
| 'shot'
| 'rough_cut'
| 'fine_cut'
| 'final_review'
| 'approved'
| 'upload_scheduled'
| 'published'
| 'tracked'
| 'discarded';
priority?: ('urgent' | 'high' | 'normal' | 'low') | null;
assignedTo?: (number | null) | User;
createdBy?: (number | null) | User;
productionBatch?: (number | null) | YtBatch;
description?: string | null;
/**
* Was sagt/zeigt der Creator in den ersten 3 Sekunden?
*/
hook?: string | null;
keyPoints?:
| {
point?: string | null;
id?: string | null;
}[]
| null;
callToAction?: string | null;
scriptUrl?: string | null;
scriptContent?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
shootDate?: string | null;
editDeadline?: string | null;
reviewDeadline?: string | null;
scheduledPublishDate?: string | null;
actualPublishDate?: string | null;
productionWeek?: number | null;
calendarWeek?: number | null;
productionDate?: string | null;
targetDuration?: string | null;
bRollNotes?: string | null;
publishTime?: string | null;
thumbnailText?: string | null;
ctaType?: ('link_in_bio' | 'newsletter' | 'longform_link' | 'custom') | null;
ctaDetail?: string | null;
uploadChecklist?:
| {
step: string;
completed?: boolean | null;
completedAt?: string | null;
id?: string | null;
}[]
| null;
disclaimers?:
| {
type: 'medical' | 'legal' | 'affiliate' | 'sponsored';
text?: string | null;
placement?: ('spoken' | 'overlay' | 'description' | 'all') | null;
id?: string | null;
}[]
| null;
thumbnail?: (number | null) | Media;
thumbnailAlt?: (number | null) | Media;
videoFile?: (number | null) | Media;
rawFootage?:
| {
file?: (number | null) | Media;
description?: string | null;
id?: string | null;
}[]
| null;
approvals?: {
scriptApproval?: {
approved?: boolean | null;
approvedBy?: (number | null) | User;
approvedAt?: string | null;
notes?: string | null;
};
/**
* Nur für Corporate-Kanäle relevant
*/
medicalApproval?: {
required?: boolean | null;
approved?: boolean | null;
approvedBy?: (number | null) | User;
approvedAt?: string | null;
notes?: string | null;
};
legalApproval?: {
approved?: boolean | null;
approvedBy?: (number | null) | User;
approvedAt?: string | null;
disclaimerIncluded?: boolean | null;
notes?: string | null;
};
finalApproval?: {
approved?: boolean | null;
approvedBy?: (number | null) | User;
approvedAt?: string | null;
notes?: string | null;
};
};
youtube?: {
videoId?: string | null;
url?: string | null;
metadata?: {
youtubeTitle?: string | null;
youtubeDescription?: string | null;
tags?:
| {
tag?: string | null;
id?: string | null;
}[]
| null;
visibility?: ('public' | 'unlisted' | 'private') | null;
chapters?: string | null;
pinnedComment?: string | null;
};
};
/**
* Automatisch via YouTube API aktualisiert
*/
performance?: {
views?: number | null;
likes?: number | null;
comments?: number | null;
shares?: number | null;
watchTimeMinutes?: number | null;
avgViewDuration?: number | null;
avgViewPercentage?: number | null;
ctr?: number | null;
impressions?: number | null;
subscribersGained?: number | null;
lastSyncedAt?: string | null;
};
/**
* Nur für das Team sichtbar
*/
internalNotes?: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
} | null;
updatedAt: string;
createdAt: string;
}
/**
* Content-Serien für YouTube-Kanäle
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-series".
*/
export interface YtSery {
id: number;
name: string;
/**
* URL-freundlicher Name (eindeutig pro Kanal)
*/
slug: string;
channel: number | YoutubeChannel;
description?: string | null;
/**
* Serien-Logo (transparent PNG empfohlen)
*/
logo?: (number | null) | Media;
/**
* Hauptbild für die Serie (16:9 empfohlen)
*/
coverImage?: (number | null) | Media;
/**
* Hex-Farbcode
*/
brandColor?: string | null;
/**
* Sekundäre Farbe
*/
accentColor?: string | null;
/**
* Die Playlist-ID aus YouTube (z.B. PLxxxxxx)
*/
youtubePlaylistId?: string | null;
/**
* Vollständiger Link zur YouTube-Playlist
*/
youtubePlaylistUrl?: string | null;
format?: ('short' | 'longform' | 'mixed') | null;
publishingFrequency?: string | null;
/**
* Inaktive Serien werden nicht angezeigt
*/
isActive?: boolean | null;
/**
* Niedrigere Zahlen werden zuerst angezeigt
*/
order?: number | null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-batches".
*/
export interface YtBatch {
id: number;
name: string;
channel?: (number | null) | YoutubeChannel;
status?: ('planning' | 'production' | 'published') | null;
productionPeriodStart?: string | null;
productionPeriodEnd?: string | null;
targets?: {
shortsTarget?: number | null;
longformsTarget?: number | null;
totalTarget?: number | null;
bufferDays?: number | null;
};
progress?: {
shortsCompleted?: number | null;
longformsCompleted?: number | null;
percentage?: number | null;
};
team?: {
producer?: (number | null) | User;
editor?: (number | null) | User;
reviewer?: (number | null) | User;
};
updatedAt: string;
createdAt: string;
}
/**
* Aufgaben für die Video-Produktion
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-tasks".
*/
export interface YtTask {
id: number;
title: string;
description?: string | null;
video?: (number | null) | YoutubeContent;
/**
* Wird automatisch vom Video übernommen
*/
channel?: (number | null) | YoutubeChannel;
taskType:
| 'script_write'
| 'script_review'
| 'shoot_prep'
| 'shoot'
| 'edit'
| 'graphics'
| 'thumbnail'
| 'review'
| 'upload'
| 'track'
| 'comments'
| 'other';
status: 'todo' | 'in_progress' | 'blocked' | 'waiting_review' | 'done' | 'cancelled';
priority?: ('urgent' | 'high' | 'normal' | 'low') | null;
assignedTo: number | User;
dueDate?: string | null;
completedAt?: string | null;
completedBy?: (number | null) | User;
blockedReason?: string | null;
attachments?:
| {
file?: (number | null) | Media;
note?: string | null;
id?: string | null;
}[]
| null;
comments?:
| {
author?: (number | null) | User;
content?: string | null;
createdAt?: string | null;
id?: string | null;
}[]
| null;
updatedAt: string;
createdAt: string;
}
/**
* Benachrichtigungen für YouTube Operations
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-notifications".
*/
export interface YtNotification {
id: number;
recipient: number | User;
type:
| 'task_assigned'
| 'task_due'
| 'task_overdue'
| 'approval_required'
| 'approved'
| 'rejected'
| 'video_published'
| 'comment'
| 'mention'
| 'token_expiring'
| 'token_expired'
| 'token_refresh_failed'
| 'token_refreshed'
| 'system';
title: string;
message?: string | null;
/**
* Relativer Pfad zum relevanten Element
*/
link?: string | null;
relatedVideo?: (number | null) | YoutubeContent;
relatedTask?: (number | null) | YtTask;
/**
* Verknüpfter Social Account (für Token-Benachrichtigungen)
*/
relatedAccount?: (number | null) | SocialAccount;
read?: boolean | null;
readAt?: string | null;
emailSent?: boolean | null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "social-accounts".
*/
export interface SocialAccount {
id: number;
platform: number | SocialPlatform;
/**
* Für Zuordnung zu Brand/Kanal
*/
linkedChannel?: (number | null) | YoutubeChannel;
displayName: string;
accountHandle?: string | null;
/**
* YouTube Channel ID, LinkedIn URN, etc.
*/
externalId?: string | null;
accountUrl?: string | null;
isActive?: boolean | null;
/**
* Sensible Daten nur für Super-Admins sichtbar
*/
credentials?: {
/**
* OAuth Access Token
*/
accessToken?: string | null;
refreshToken?: string | null;
tokenExpiresAt?: string | null;
/**
* Für API-Key basierte Auth
*/
apiKey?: string | null;
};
stats?: {
followers?: number | null;
totalPosts?: number | null;
lastSyncedAt?: string | null;
};
syncSettings?: {
autoSyncEnabled?: boolean | null;
syncIntervalMinutes?: number | null;
syncComments?: boolean | null;
/**
* Nicht alle Plattformen unterstützen DM-API
*/
syncDMs?: boolean | null;
};
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "social-platforms".
*/
export interface SocialPlatform {
id: number;
name: string;
slug: string;
icon?: string | null;
color?: string | null;
isActive?: boolean | null;
apiStatus?: ('connected' | 'limited' | 'disconnected' | 'development') | null;
apiConfig?: {
apiType?: ('youtube_v3' | 'linkedin' | 'instagram_graph' | 'facebook_graph' | 'meta_graph' | 'custom') | null;
baseUrl?: string | null;
authType?: ('oauth2' | 'api_key' | 'bearer') | null;
/**
* Relativer API-Pfad für OAuth-Initiation (z.B. /api/youtube/auth)
*/
oauthEndpoint?: string | null;
scopes?:
| {
scope?: string | null;
id?: string | null;
}[]
| null;
/**
* Wie lange ist der Access Token gültig? (YouTube: unbegrenzt mit Refresh, Meta: 60 Tage)
*/
tokenValidityDays?: number | null;
};
interactionTypes?:
| {
type: string;
label: string;
icon?: string | null;
canReply?: boolean | null;
id?: string | null;
}[]
| null;
rateLimits?: {
requestsPerMinute?: number | null;
requestsPerDay?: number | null;
/**
* YouTube: 10.000/Tag
*/
quotaUnitsPerDay?: number | null;
};
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-monthly-goals".
*/
export interface YtMonthlyGoal {
id: number;
channel: number | YoutubeChannel;
month: string;
displayTitle?: string | null;
contentGoals?: {
longformsTarget?: number | null;
longformsCurrent?: number | null;
shortsTarget?: number | null;
shortsCurrent?: number | null;
};
audienceGoals?: {
subscribersTarget?: number | null;
subscribersCurrent?: number | null;
viewsTarget?: number | null;
viewsCurrent?: number | null;
};
engagementGoals?: {
avgCtrTarget?: string | null;
avgCtrCurrent?: string | null;
avgRetentionTarget?: string | null;
avgRetentionCurrent?: string | null;
};
businessGoals?: {
newsletterSignupsTarget?: number | null;
newsletterSignupsCurrent?: number | null;
affiliateRevenueTarget?: number | null;
affiliateRevenueCurrent?: number | null;
};
customGoals?:
| {
metric: string;
target: string;
current?: string | null;
status?: ('on_track' | 'at_risk' | 'achieved' | 'missed') | null;
id?: string | null;
}[]
| null;
notes?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-script-templates".
*/
export interface YtScriptTemplate {
id: number;
name: string;
channel: number | YoutubeChannel;
series: string;
format: 'short' | 'longform';
description?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* Reusable checklists for upload and production
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-checklist-templates".
*/
export interface YtChecklistTemplate {
id: number;
name: string;
/**
* Optional: Channel-specific template
*/
channel?: (number | null) | YoutubeChannel;
type: 'upload' | 'production' | 'review' | 'post_publish';
format?: ('all' | 'short' | 'longform') | null;
/**
* When to use this checklist
*/
description?: string | null;
items: {
order?: number | null;
task: string;
category?: ('metadata' | 'assets' | 'seo' | 'community' | 'legal' | 'other') | null;
details?: string | null;
isRequired?: boolean | null;
id?: string | null;
}[];
/**
* Automatically used for new videos
*/
isDefault?: boolean | null;
isActive?: boolean | null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "community-interactions".
*/
export interface CommunityInteraction {
id: number;
platform: number | SocialPlatform;
socialAccount: number | SocialAccount;
linkedContent?: (number | null) | YoutubeContent;
type: 'comment' | 'reply' | 'dm' | 'mention' | 'review' | 'question';
/**
* YouTube Comment ID, etc.
*/
externalId: string;
parentInteraction?: (number | null) | CommunityInteraction;
author?: {
name?: string | null;
handle?: string | null;
profileUrl?: string | null;
avatarUrl?: string | null;
isVerified?: boolean | null;
isSubscriber?: boolean | null;
isMember?: boolean | null;
subscriberCount?: number | null;
};
message: string;
/**
* Falls Plattform HTML liefert
*/
messageHtml?: string | null;
attachments?:
| {
type?: ('image' | 'video' | 'link' | 'sticker') | null;
url?: string | null;
id?: string | null;
}[]
| null;
publishedAt: string;
/**
* Automatisch via Claude API
*/
analysis?: {
sentiment?: ('positive' | 'neutral' | 'negative' | 'question' | 'gratitude' | 'frustration') | null;
sentimentScore?: number | null;
confidence?: number | null;
topics?:
| {
topic?: string | null;
id?: string | null;
}[]
| null;
language?: string | null;
suggestedTemplate?: (number | null) | CommunityTemplate;
suggestedReply?: string | null;
analyzedAt?: string | null;
};
flags?: {
/**
* Erfordert ärztliche Review
*/
isMedicalQuestion?: boolean | null;
requiresEscalation?: boolean | null;
isSpam?: boolean | null;
/**
* >10k Follower
*/
isFromInfluencer?: boolean | null;
};
status: 'new' | 'in_review' | 'waiting' | 'replied' | 'resolved' | 'archived' | 'spam';
priority: 'urgent' | 'high' | 'normal' | 'low';
assignedTo?: (number | null) | User;
responseDeadline?: string | null;
response?: {
text?: string | null;
usedTemplate?: (number | null) | CommunityTemplate;
sentAt?: string | null;
sentBy?: (number | null) | User;
externalReplyId?: string | null;
};
/**
* Wird beim Sync aktualisiert
*/
engagement?: {
likes?: number | null;
replies?: number | null;
isHearted?: boolean | null;
isPinned?: boolean | null;
};
/**
* Nur für Team sichtbar
*/
internalNotes?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "community-templates".
*/
export interface CommunityTemplate {
id: number;
name: string;
category:
| 'thank_you'
| 'question_answer'
| 'redirect_hotline'
| 'medical_disclaimer'
| 'product_info'
| 'content_reference'
| 'follow_up'
| 'negative_feedback'
| 'spam_response'
| 'welcome';
/**
* Leer = für alle Kanäle
*/
channel?: (number | null) | YoutubeChannel;
/**
* Leer = für alle Plattformen
*/
platforms?: (number | SocialPlatform)[] | null;
/**
* Variablen: {{author_name}}, {{video_title}}, {{channel_name}}, {{hotline_number}}
*/
template: string;
/**
* Dokumentation der Variablen in diesem Template
*/
variables?:
| {
variable: string;
description?: string | null;
defaultValue?: string | null;
id?: string | null;
}[]
| null;
/**
* Bei diesen Keywords wird das Template vorgeschlagen
*/
autoSuggestKeywords?:
| {
keyword: string;
id?: string | null;
}[]
| null;
/**
* Für medizinische Antworten
*/
requiresReview?: boolean | null;
isActive?: boolean | null;
usageCount?: number | null;
/**
* So sieht die Antwort mit ausgefüllten Variablen aus
*/
exampleOutput?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "community-rules".
*/
export interface CommunityRule {
id: number;
name: string;
/**
* Niedrigere Zahl = höhere Priorität
*/
priority: number;
isActive?: boolean | null;
description?: string | null;
/**
* Leer = alle Kanäle
*/
channel?: (number | null) | YoutubeChannel;
/**
* Leer = alle Plattformen
*/
platforms?: (number | SocialPlatform)[] | null;
trigger: {
type:
| 'keyword'
| 'sentiment'
| 'question_detected'
| 'medical_detected'
| 'influencer'
| 'all_new'
| 'contains_link'
| 'contains_email';
keywords?:
| {
keyword: string;
matchType?: ('contains' | 'exact' | 'regex') | null;
id?: string | null;
}[]
| null;
sentimentValues?: ('positive' | 'negative' | 'neutral' | 'question')[] | null;
influencerMinFollowers?: number | null;
};
actions: {
action:
| 'set_priority'
| 'assign_to'
| 'set_flag'
| 'suggest_template'
| 'send_notification'
| 'flag_medical'
| 'escalate'
| 'mark_spam'
| 'set_deadline';
/**
* Priority: urgent/high/normal/low, Deadline: Stunden
*/
value?: string | null;
targetUser?: (number | null) | User;
targetTemplate?: (number | null) | CommunityTemplate;
id?: string | null;
}[];
stats?: {
timesTriggered?: number | null;
lastTriggeredAt?: string | null;
};
updatedAt: string;
createdAt: string;
}
/**
* Automatische Community-Reports per E-Mail
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "report-schedules".
*/
export interface ReportSchedule {
id: number;
/**
* Interner Name für diesen Report-Zeitplan
*/
name: string;
/**
* Deaktivierte Reports werden nicht automatisch versendet
*/
enabled?: boolean | null;
frequency: 'daily' | 'weekly' | 'monthly';
/**
* Für wöchentliche Reports
*/
dayOfWeek?: ('monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday') | null;
/**
* Für monatliche Reports (1-28)
*/
dayOfMonth?: number | null;
/**
* Format: HH:MM (24-Stunden)
*/
time: string;
timezone: 'Europe/Berlin' | 'Europe/London' | 'America/New_York' | 'America/Los_Angeles' | 'Asia/Tokyo' | 'UTC';
/**
* Art der Daten im Report
*/
reportType: 'overview' | 'sentiment_analysis' | 'response_metrics' | 'content_performance' | 'full_report';
/**
* Leer = alle aktiven Kanäle. Oder spezifische Kanäle auswählen.
*/
channels?: (number | SocialAccount)[] | null;
/**
* Wie viele Tage zurück sollen analysiert werden?
*/
periodDays?: number | null;
format: 'pdf' | 'excel' | 'html_email';
recipients: {
email: string;
/**
* Optional
*/
name?: string | null;
id?: string | null;
}[];
lastSentAt?: string | null;
nextScheduledAt?: string | null;
sendCount?: number | null;
lastError?: string | null;
updatedAt: string;
createdAt: string;
}
/**
* Cookie-Banner Konfiguration pro Tenant
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "cookie-configurations".
*/
export interface CookieConfiguration {
id: number;
/**
* Jeder Tenant kann nur eine Konfiguration haben
*/
tenant: number | Tenant;
/**
* Interner Titel zur Identifikation
*/
title: string;
/**
* Bei inhaltlichen Änderungen erhöhen → erzwingt erneuten Consent bei allen Nutzern
*/
revision: number;
/**
* Welche Kategorien sollen im Banner angezeigt werden?
*/
enabledCategories: ('necessary' | 'functional' | 'analytics' | 'marketing')[];
translations?: {
de?: {
bannerTitle?: string | null;
bannerDescription?: string | null;
acceptAllButton?: string | null;
acceptNecessaryButton?: string | null;
settingsButton?: string | null;
saveButton?: string | null;
privacyPolicyUrl?: string | null;
categoryLabels?: {
necessary?: {
title?: string | null;
description?: string | null;
};
functional?: {
title?: string | null;
description?: string | null;
};
analytics?: {
title?: string | null;
description?: string | null;
};
marketing?: {
title?: string | null;
description?: string | null;
};
};
};
};
styling?: {
position?: ('bottom' | 'top' | 'middle') | null;
theme?: ('dark' | 'light' | 'auto') | null;
};
updatedAt: string;
createdAt: string;
}
/**
* Cookie-Dokumentation für die Datenschutzerklärung
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "cookie-inventory".
*/
export interface CookieInventory {
id: number;
tenant: number | Tenant;
/**
* Technischer Name des Cookies (z.B. "_ga")
*/
name: string;
/**
* Anbieter (z.B. "Google LLC")
*/
provider: string;
category: 'necessary' | 'functional' | 'analytics' | 'marketing';
/**
* Speicherdauer (z.B. "2 Jahre")
*/
duration: string;
/**
* Verständliche Erklärung für Endnutzer
*/
description: string;
isActive?: boolean | null;
updatedAt: string;
createdAt: string;
}
/**
* WORM Audit-Trail für Cookie-Einwilligungen (unveränderbar)
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "consent-logs".
*/
export interface ConsentLog {
id: number;
/**
* Server-generierte eindeutige ID
*/
consentId: string;
/**
* Client-seitige Referenz (Cookie-UUID) für Traceability
*/
clientRef?: string | null;
tenant: number | Tenant;
/**
* Akzeptierte Kategorien zum Zeitpunkt der Einwilligung
*/
categories:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
/**
* Version der Konfiguration zum Zeitpunkt der Zustimmung
*/
revision: number;
/**
* Browser/Device (für Forensik und Bot-Erkennung)
*/
userAgent?: string | null;
/**
* HMAC-Hash der IP (täglich rotierender, tenant-spezifischer Salt)
*/
anonymizedIp?: string | null;
/**
* Automatische Löschung nach 3 Jahren
*/
expiresAt: string;
updatedAt: string;
createdAt: string;
}
/**
* Externe Datenschutzerklärung Konfiguration (Alfright)
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "privacy-policy-settings".
*/
export interface PrivacyPolicySetting {
id: number;
/**
* Jeder Tenant kann nur eine Konfiguration haben
*/
tenant: number | Tenant;
/**
* Interner Titel zur Identifikation
*/
title: string;
/**
* Quelle der Datenschutzerklärung
*/
provider: 'alfright' | 'internal';
/**
* Einstellungen für die Alfright Integration
*/
alfright?: {
/**
* Alfright Tenant-ID (aus dem iframe-Code)
*/
tenantId: string;
/**
* Alfright API-Key / Dokument-ID (aus dem iframe-Code, z.B. "9f315103c43245bcb0806dd56c2be757")
*/
apiKey: string;
/**
* Sprache der Datenschutzerklärung
*/
language: 'de-de' | 'de-at' | 'de-ch' | 'en-gb' | 'en-us';
/**
* Höhe des iframes in Pixeln (empfohlen: 3000-5000)
*/
iframeHeight: number;
};
/**
* Farben und Schriften an das Website-Design anpassen
*/
styling?: {
/**
* Farbe der Überschriften (Hex-Code, z.B. #ca8a04 für Gold)
*/
headerColor: string;
/**
* Schriftart der Überschriften
*/
headerFont: string;
/**
* Schriftgröße der Hauptüberschriften
*/
headerSize: string;
/**
* Schriftgröße der Unterüberschriften
*/
subheaderSize: string;
/**
* Textfarbe (Hex-Code, z.B. #f3f4f6 für hellen Text)
*/
fontColor: string;
/**
* Schriftart für Fließtext
*/
textFont: string;
/**
* Schriftgröße für Fließtext
*/
textSize: string;
/**
* Linkfarbe (Hex-Code)
*/
linkColor: string;
/**
* Hintergrundfarbe (Hex-Code, z.B. #111827 für Dark Theme)
*/
backgroundColor: string;
};
/**
* Cookie-Tabelle aus CookieInventory unterhalb der Datenschutzerklärung anzeigen
*/
showCookieTable?: boolean | null;
/**
* Überschrift für die Cookie-Tabelle
*/
cookieTableTitle?: string | null;
/**
* Einleitungstext für die Cookie-Tabelle
*/
cookieTableDescription?: string | null;
seo?: {
/**
* Meta-Titel für die Seite
*/
metaTitle?: string | null;
/**
* Meta-Beschreibung für Suchmaschinen
*/
metaDescription?: string | null;
};
updatedAt: string;
createdAt: string;
}
/**
* Protokoll aller gesendeten E-Mails
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "email-logs".
*/
export interface EmailLog {
id: number;
tenant: number | Tenant;
to: string;
from: string;
subject: string;
status: 'pending' | 'sent' | 'failed';
/**
* SMTP Message-ID bei erfolgreichem Versand
*/
messageId?: string | null;
error?: string | null;
source: 'manual' | 'form' | 'system' | 'newsletter';
/**
* Zusätzliche Kontextinformationen (z.B. Form-ID)
*/
metadata?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
updatedAt: string;
createdAt: string;
}
/**
* Protokoll wichtiger System-Aktionen
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "audit-logs".
*/
export interface AuditLog {
id: number;
action:
| 'login_success'
| 'login_failed'
| 'logout'
| 'password_changed'
| 'password_reset'
| 'create'
| 'update'
| 'delete'
| 'config_changed'
| 'email_failed'
| 'access_denied'
| 'rate_limit';
severity: 'info' | 'warning' | 'error' | 'critical';
entityType?: ('users' | 'tenants' | 'pages' | 'posts' | 'media' | 'forms' | 'email' | 'global' | 'system') | null;
/**
* ID des betroffenen Dokuments
*/
entityId?: string | null;
/**
* Benutzer, der die Aktion ausgeführt hat
*/
user?: (number | null) | User;
/**
* E-Mail zum Zeitpunkt der Aktion (für gelöschte User)
*/
userEmail?: string | null;
/**
* Betroffener Tenant (falls zutreffend)
*/
tenant?: (number | null) | Tenant;
ipAddress?: string | null;
userAgent?: string | null;
/**
* Detaillierte Beschreibung der Aktion
*/
description?: string | null;
/**
* Zustand vor der Änderung
*/
previousValue?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
/**
* Zustand nach der Änderung
*/
newValue?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
/**
* Weitere Kontextinformationen
*/
metadata?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
updatedAt: string;
createdAt: string;
}
/**
* Allgemeine Website-Einstellungen pro Tenant
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "site-settings".
*/
export interface SiteSetting {
id: number;
tenant?: (number | null) | Tenant;
siteName: string;
siteTagline?: string | null;
logo?: (number | null) | Media;
favicon?: (number | null) | Media;
contact?: {
email?: string | null;
phone?: string | null;
fax?: string | null;
};
address?: {
/**
* z.B. "Hans-Böckler-Str. 19"
*/
street?: string | null;
/**
* z.B. "Gebäude B, 3. Stock"
*/
additionalLine?: string | null;
zip?: string | null;
city?: string | null;
state?: string | null;
country?: string | null;
};
/**
* Für Kartenanzeige (Google Maps, OpenStreetMap)
*/
geo?: {
/**
* z.B. 51.521732
*/
lat?: number | null;
/**
* z.B. 6.928850
*/
lng?: number | null;
/**
* 1 = Weltkarte, 20 = Straßenebene
*/
zoom?: number | null;
};
footer?: {
copyrightText?: string | null;
showSocialLinks?: boolean | null;
};
seo?: {
defaultMetaTitle?: string | null;
defaultMetaDescription?: string | null;
defaultOgImage?: (number | null) | Media;
};
updatedAt: string;
createdAt: string;
}
/**
* Navigationsmenüs pro Tenant
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "navigations".
*/
export interface Navigation {
id: number;
tenant?: (number | null) | Tenant;
/**
* Interner Name zur Identifikation
*/
title: string;
mainMenu?:
| {
label: string;
type?: ('page' | 'custom' | 'submenu') | null;
page?: (number | null) | Page;
url?: string | null;
openInNewTab?: boolean | null;
submenu?:
| {
label: string;
linkType?: ('page' | 'custom') | null;
page?: (number | null) | Page;
url?: string | null;
id?: string | null;
}[]
| null;
id?: string | null;
}[]
| null;
footerMenu?:
| {
label: string;
linkType?: ('page' | 'custom') | null;
page?: (number | null) | Page;
url?: string | null;
id?: string | null;
}[]
| null;
updatedAt: string;
createdAt: string;
}
/**
* Eingegangene Formular-Einsendungen
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "form-submissions".
*/
export interface FormSubmission {
id: number;
form: number | Form;
submissionData?:
| {
field: string;
value: string;
id?: string | null;
}[]
| null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "redirects".
*/
export interface Redirect {
id: number;
from: string;
to?: {
type?: ('reference' | 'custom') | null;
reference?: {
relationTo: 'pages';
value: number | Page;
} | null;
url?: string | null;
};
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-kv".
*/
export interface PayloadKv {
id: number;
key: string;
data:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-locked-documents".
*/
export interface PayloadLockedDocument {
id: number;
document?:
| ({
relationTo: 'users';
value: number | User;
} | null)
| ({
relationTo: 'media';
value: number | Media;
} | null)
| ({
relationTo: 'tenants';
value: number | Tenant;
} | null)
| ({
relationTo: 'pages';
value: number | Page;
} | null)
| ({
relationTo: 'posts';
value: number | Post;
} | null)
| ({
relationTo: 'categories';
value: number | Category;
} | null)
| ({
relationTo: 'social-links';
value: number | SocialLink;
} | null)
| ({
relationTo: 'testimonials';
value: number | Testimonial;
} | null)
| ({
relationTo: 'faqs';
value: number | Faq;
} | null)
| ({
relationTo: 'team';
value: number | Team;
} | null)
| ({
relationTo: 'service-categories';
value: number | ServiceCategory;
} | null)
| ({
relationTo: 'services';
value: number | Service;
} | null)
| ({
relationTo: 'newsletter-subscribers';
value: number | NewsletterSubscriber;
} | null)
| ({
relationTo: 'portfolio-categories';
value: number | PortfolioCategory;
} | null)
| ({
relationTo: 'portfolios';
value: number | Portfolio;
} | null)
| ({
relationTo: 'video-categories';
value: number | VideoCategory;
} | null)
| ({
relationTo: 'videos';
value: number | Video;
} | null)
| ({
relationTo: 'product-categories';
value: number | ProductCategory;
} | null)
| ({
relationTo: 'products';
value: number | Product;
} | null)
| ({
relationTo: 'timelines';
value: number | Timeline;
} | null)
| ({
relationTo: 'workflows';
value: number | Workflow;
} | null)
| ({
relationTo: 'tags';
value: number | Tag;
} | null)
| ({
relationTo: 'authors';
value: number | Author;
} | null)
| ({
relationTo: 'locations';
value: number | Location;
} | null)
| ({
relationTo: 'partners';
value: number | Partner;
} | null)
| ({
relationTo: 'jobs';
value: number | Job;
} | null)
| ({
relationTo: 'downloads';
value: number | Download;
} | null)
| ({
relationTo: 'events';
value: number | Event;
} | null)
| ({
relationTo: 'bookings';
value: number | Booking;
} | null)
| ({
relationTo: 'certifications';
value: number | Certification;
} | null)
| ({
relationTo: 'projects';
value: number | Project;
} | null)
| ({
relationTo: 'favorites';
value: number | Favorite;
} | null)
| ({
relationTo: 'series';
value: number | Series;
} | null)
| ({
relationTo: 'youtube-channels';
value: number | YoutubeChannel;
} | null)
| ({
relationTo: 'youtube-content';
value: number | YoutubeContent;
} | null)
| ({
relationTo: 'yt-tasks';
value: number | YtTask;
} | null)
| ({
relationTo: 'yt-notifications';
value: number | YtNotification;
} | null)
| ({
relationTo: 'yt-batches';
value: number | YtBatch;
} | null)
| ({
relationTo: 'yt-monthly-goals';
value: number | YtMonthlyGoal;
} | null)
| ({
relationTo: 'yt-script-templates';
value: number | YtScriptTemplate;
} | null)
| ({
relationTo: 'yt-checklist-templates';
value: number | YtChecklistTemplate;
} | null)
| ({
relationTo: 'yt-series';
value: number | YtSery;
} | null)
| ({
relationTo: 'social-platforms';
value: number | SocialPlatform;
} | null)
| ({
relationTo: 'social-accounts';
value: number | SocialAccount;
} | null)
| ({
relationTo: 'community-interactions';
value: number | CommunityInteraction;
} | null)
| ({
relationTo: 'community-templates';
value: number | CommunityTemplate;
} | null)
| ({
relationTo: 'community-rules';
value: number | CommunityRule;
} | null)
| ({
relationTo: 'report-schedules';
value: number | ReportSchedule;
} | null)
| ({
relationTo: 'cookie-configurations';
value: number | CookieConfiguration;
} | null)
| ({
relationTo: 'cookie-inventory';
value: number | CookieInventory;
} | null)
| ({
relationTo: 'consent-logs';
value: number | ConsentLog;
} | null)
| ({
relationTo: 'privacy-policy-settings';
value: number | PrivacyPolicySetting;
} | null)
| ({
relationTo: 'email-logs';
value: number | EmailLog;
} | null)
| ({
relationTo: 'audit-logs';
value: number | AuditLog;
} | null)
| ({
relationTo: 'site-settings';
value: number | SiteSetting;
} | null)
| ({
relationTo: 'navigations';
value: number | Navigation;
} | null)
| ({
relationTo: 'forms';
value: number | Form;
} | null)
| ({
relationTo: 'form-submissions';
value: number | FormSubmission;
} | null)
| ({
relationTo: 'redirects';
value: number | Redirect;
} | null);
globalSlug?: string | null;
user: {
relationTo: 'users';
value: number | User;
};
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-preferences".
*/
export interface PayloadPreference {
id: number;
user: {
relationTo: 'users';
value: number | User;
};
key?: string | null;
value?:
| {
[k: string]: unknown;
}
| unknown[]
| string
| number
| boolean
| null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-migrations".
*/
export interface PayloadMigration {
id: number;
name?: string | null;
batch?: number | null;
updatedAt: string;
createdAt: string;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "users_select".
*/
export interface UsersSelect<T extends boolean = true> {
isSuperAdmin?: T;
youtubeRole?: T;
youtubeChannels?: T;
communityRole?: T;
tenants?:
| T
| {
tenant?: T;
id?: T;
};
updatedAt?: T;
createdAt?: T;
email?: T;
resetPasswordToken?: T;
resetPasswordExpiration?: T;
salt?: T;
hash?: T;
loginAttempts?: T;
lockUntil?: T;
sessions?:
| T
| {
id?: T;
createdAt?: T;
expiresAt?: T;
};
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "media_select".
*/
export interface MediaSelect<T extends boolean = true> {
tenant?: T;
alt?: T;
caption?: T;
credit?: T;
tags?: T;
updatedAt?: T;
createdAt?: T;
url?: T;
thumbnailURL?: T;
filename?: T;
mimeType?: T;
filesize?: T;
width?: T;
height?: T;
focalX?: T;
focalY?: T;
sizes?:
| T
| {
thumbnail?:
| T
| {
url?: T;
width?: T;
height?: T;
mimeType?: T;
filesize?: T;
filename?: T;
};
small?:
| T
| {
url?: T;
width?: T;
height?: T;
mimeType?: T;
filesize?: T;
filename?: T;
};
medium?:
| T
| {
url?: T;
width?: T;
height?: T;
mimeType?: T;
filesize?: T;
filename?: T;
};
large?:
| T
| {
url?: T;
width?: T;
height?: T;
mimeType?: T;
filesize?: T;
filename?: T;
};
xlarge?:
| T
| {
url?: T;
width?: T;
height?: T;
mimeType?: T;
filesize?: T;
filename?: T;
};
'2k'?:
| T
| {
url?: T;
width?: T;
height?: T;
mimeType?: T;
filesize?: T;
filename?: T;
};
og?:
| T
| {
url?: T;
width?: T;
height?: T;
mimeType?: T;
filesize?: T;
filename?: T;
};
medium_avif?:
| T
| {
url?: T;
width?: T;
height?: T;
mimeType?: T;
filesize?: T;
filename?: T;
};
large_avif?:
| T
| {
url?: T;
width?: T;
height?: T;
mimeType?: T;
filesize?: T;
filename?: T;
};
xlarge_avif?:
| T
| {
url?: T;
width?: T;
height?: T;
mimeType?: T;
filesize?: T;
filename?: T;
};
};
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "tenants_select".
*/
export interface TenantsSelect<T extends boolean = true> {
name?: T;
slug?: T;
domains?:
| T
| {
domain?: T;
id?: T;
};
email?:
| T
| {
fromAddress?: T;
fromName?: T;
replyTo?: T;
useCustomSmtp?: T;
smtp?:
| T
| {
host?: T;
port?: T;
secure?: T;
user?: T;
pass?: T;
};
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "pages_select".
*/
export interface PagesSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
hero?:
| T
| {
image?: T;
headline?: T;
subline?: T;
};
layout?:
| T
| {
'hero-block'?:
| T
| {
backgroundImage?: T;
headline?: T;
subline?: T;
alignment?: T;
overlay?: T;
cta?:
| T
| {
text?: T;
link?: T;
style?: T;
};
id?: T;
blockName?: T;
};
'hero-slider-block'?:
| T
| {
slides?:
| T
| {
backgroundImage?: T;
mobileBackgroundImage?: T;
headline?: T;
subline?: T;
textAlignment?: T;
verticalPosition?: T;
overlay?:
| T
| {
enabled?: T;
color?: T;
opacity?: T;
};
primaryCta?:
| T
| {
enabled?: T;
text?: T;
link?: T;
style?: T;
openInNewTab?: T;
};
secondaryCta?:
| T
| {
enabled?: T;
text?: T;
link?: T;
style?: T;
openInNewTab?: T;
};
textColor?: T;
id?: T;
};
settings?:
| T
| {
animation?: T;
animationDuration?: T;
autoplay?:
| T
| {
enabled?: T;
interval?: T;
pauseOnHover?: T;
pauseOnInteraction?: T;
};
loop?: T;
};
navigation?:
| T
| {
arrows?:
| T
| {
enabled?: T;
style?: T;
position?: T;
hideOnMobile?: T;
};
dots?:
| T
| {
enabled?: T;
style?: T;
position?: T;
color?: T;
};
swipe?: T;
keyboard?: T;
};
layout?:
| T
| {
height?: T;
mobileHeight?: T;
contentWidth?: T;
fullWidth?: T;
};
accessibility?:
| T
| {
ariaLabel?: T;
reducedMotion?: T;
};
id?: T;
blockName?: T;
};
'image-slider-block'?:
| T
| {
title?: T;
description?: T;
images?:
| T
| {
image?: T;
caption?: T;
alt?: T;
link?: T;
id?: T;
};
layout?: T;
grid?:
| T
| {
cols?: T;
gap?: T;
aspectRatio?: T;
};
slider?:
| T
| {
effect?: T;
speed?: T;
perView?: T;
gap?: T;
auto?: T;
delay?: T;
pauseHover?: T;
loop?: T;
centered?: T;
};
nav?:
| T
| {
arrows?: T;
arrowStyle?: T;
dots?: T;
dotStyle?: T;
counter?: T;
swipe?: T;
keys?: T;
};
lightbox?:
| T
| {
enabled?: T;
zoom?: T;
download?: T;
share?: T;
captions?: T;
thumbs?: T;
bg?: T;
};
style?:
| T
| {
height?: T;
imgFit?: T;
rounded?: T;
shadow?: T;
border?: T;
hoverEffect?: T;
captionPos?: T;
bg?: T;
padding?: T;
};
a11y?:
| T
| {
label?: T;
reducedMotion?: T;
};
id?: T;
blockName?: T;
};
'text-block'?:
| T
| {
content?: T;
width?: T;
id?: T;
blockName?: T;
};
'image-text-block'?:
| T
| {
image?: T;
imagePosition?: T;
headline?: T;
content?: T;
cta?:
| T
| {
text?: T;
link?: T;
};
id?: T;
blockName?: T;
};
'card-grid-block'?:
| T
| {
headline?: T;
cards?:
| T
| {
image?: T;
title?: T;
description?: T;
link?: T;
linkText?: T;
id?: T;
};
columns?: T;
id?: T;
blockName?: T;
};
'quote-block'?:
| T
| {
quote?: T;
author?: T;
role?: T;
image?: T;
style?: T;
id?: T;
blockName?: T;
};
'cta-block'?:
| T
| {
headline?: T;
description?: T;
buttons?:
| T
| {
text?: T;
link?: T;
style?: T;
id?: T;
};
backgroundColor?: T;
id?: T;
blockName?: T;
};
'contact-form-block'?:
| T
| {
headline?: T;
description?: T;
recipientEmail?: T;
showPhone?: T;
showAddress?: T;
showSocials?: T;
id?: T;
blockName?: T;
};
'timeline-block'?:
| T
| {
title?: T;
subtitle?: T;
layout?: T;
showConnector?: T;
markerStyle?: T;
items?:
| T
| {
year?: T;
title?: T;
description?: T;
icon?: T;
image?: T;
link?:
| T
| {
label?: T;
href?: T;
};
id?: T;
};
backgroundColor?: T;
id?: T;
blockName?: T;
};
'divider-block'?:
| T
| {
style?: T;
spacing?: T;
id?: T;
blockName?: T;
};
'video-block'?:
| T
| {
sourceType?: T;
videoFromLibrary?: T;
videoUrl?: T;
videoFile?: T;
thumbnail?: T;
caption?: T;
aspectRatio?: T;
size?: T;
alignment?: T;
playback?:
| T
| {
autoplay?: T;
muted?: T;
loop?: T;
controls?: T;
playsinline?: T;
startTime?: T;
};
embedOptions?:
| T
| {
showRelated?: T;
privacyMode?: T;
};
style?:
| T
| {
rounded?: T;
shadow?: T;
border?: T;
};
id?: T;
blockName?: T;
};
'posts-list-block'?:
| T
| {
title?: T;
subtitle?: T;
postType?: T;
layout?: T;
columns?: T;
limit?: T;
showFeaturedOnly?: T;
filterByCategory?: T;
showExcerpt?: T;
showDate?: T;
showAuthor?: T;
showCategory?: T;
showPagination?: T;
showReadMore?: T;
readMoreLabel?: T;
readMoreLink?: T;
backgroundColor?: T;
id?: T;
blockName?: T;
};
'testimonials-block'?:
| T
| {
title?: T;
subtitle?: T;
layout?: T;
columns?: T;
displayMode?: T;
selectedTestimonials?: T;
limit?: T;
displayOptions?:
| T
| {
showRating?: T;
showImage?: T;
showCompany?: T;
showSource?: T;
showDate?: T;
truncateText?: T;
maxLength?: T;
};
slider?:
| T
| {
effect?: T;
speed?: T;
perView?: T;
gap?: T;
auto?: T;
delay?: T;
hoverPause?: T;
loop?: T;
centered?: T;
};
nav?:
| T
| {
arrows?: T;
arrowStyle?: T;
arrowPos?: T;
dots?: T;
dotStyle?: T;
dotPos?: T;
swipe?: T;
keys?: T;
};
style?:
| T
| {
bg?: T;
card?: T;
quote?: T;
imgPos?: T;
imgSize?: T;
align?: T;
spacing?: T;
};
a11y?:
| T
| {
label?: T;
reducedMotion?: T;
};
id?: T;
blockName?: T;
};
'newsletter-block'?:
| T
| {
title?: T;
subtitle?: T;
layout?: T;
image?: T;
imagePosition?: T;
collectName?: T;
showInterests?: T;
availableInterests?: T;
buttonText?: T;
placeholderEmail?: T;
successMessage?: T;
errorMessage?: T;
privacyText?: T;
privacyLink?: T;
source?: T;
backgroundColor?: T;
id?: T;
blockName?: T;
};
'process-steps-block'?:
| T
| {
title?: T;
subtitle?: T;
layout?: T;
showNumbers?: T;
showIcons?: T;
steps?:
| T
| {
title?: T;
description?: T;
icon?: T;
image?: T;
id?: T;
};
cta?:
| T
| {
show?: T;
label?: T;
href?: T;
variant?: T;
};
backgroundColor?: T;
id?: T;
blockName?: T;
};
'faq-block'?:
| T
| {
title?: T;
subtitle?: T;
sourceMode?: T;
displayMode?: T;
category?: T;
selectedFAQs?: T;
limit?: T;
inlineFAQs?:
| T
| {
question?: T;
answer?: T;
answerPlainText?: T;
id?: T;
};
layout?: T;
columns?: T;
expandFirst?: T;
allowMultipleOpen?: T;
showCategory?: T;
showIcon?: T;
groupByCategory?: T;
enableSchemaOrg?: T;
backgroundColor?: T;
showContactCTA?: T;
contactCTAText?: T;
contactCTALink?: T;
contactCTAButtonText?: T;
id?: T;
blockName?: T;
};
'team-block'?:
| T
| {
title?: T;
subtitle?: T;
introduction?: T;
displayMode?: T;
department?: T;
selectedMembers?: T;
limit?: T;
layout?: T;
columns?: T;
showRole?: T;
showDepartment?: T;
showBio?: T;
showContact?: T;
showSocialLinks?: T;
showQualifications?: T;
showSpecializations?: T;
showLanguages?: T;
groupByDepartment?: T;
autoplay?: T;
autoplaySpeed?: T;
enableDetailView?: T;
imageStyle?: T;
backgroundColor?: T;
showCTA?: T;
ctaText?: T;
ctaLink?: T;
id?: T;
blockName?: T;
};
'services-block'?:
| T
| {
title?: T;
subtitle?: T;
introduction?: T;
displayMode?: T;
category?: T;
selectedServices?: T;
limit?: T;
layout?: T;
columns?: T;
featuredCount?: T;
tabsStyle?: T;
showAllTab?: T;
expandFirst?: T;
allowMultipleOpen?: T;
autoplay?: T;
autoplaySpeed?: T;
slidesPerView?: T;
showImage?: T;
showIcon?: T;
showDescription?: T;
showCategory?: T;
showPricing?: T;
showFeatures?: T;
featuresLimit?: T;
showCTA?: T;
showNewBadge?: T;
groupByCategory?: T;
linkToDetail?: T;
detailLinkText?: T;
servicesBasePath?: T;
cardStyle?: T;
backgroundColor?: T;
showSectionCTA?: T;
sectionCTAText?: T;
sectionCTALink?: T;
id?: T;
blockName?: T;
};
'author-bio-block'?:
| T
| {
source?: T;
authors?: T;
showCoAuthors?: T;
layout?: T;
show?:
| T
| {
avatar?: T;
name?: T;
title?: T;
bio?: T;
social?: T;
email?: T;
website?: T;
postCount?: T;
};
style?:
| T
| {
avatarSize?: T;
avatarShape?: T;
bg?: T;
border?: T;
shadow?: T;
divider?: T;
};
label?: T;
linkToProfile?: T;
id?: T;
blockName?: T;
};
'related-posts-block'?:
| T
| {
title?: T;
source?: T;
posts?: T;
category?: T;
tag?: T;
limit?: T;
excludeCurrent?: T;
layout?: T;
cols?: T;
show?:
| T
| {
image?: T;
date?: T;
author?: T;
category?: T;
excerpt?: T;
readingTime?: T;
tags?: T;
};
style?:
| T
| {
imgRatio?: T;
rounded?: T;
shadow?: T;
hover?: T;
bg?: T;
gap?: T;
};
showAllLink?: T;
allLinkText?: T;
allLinkUrl?: T;
id?: T;
blockName?: T;
};
'share-buttons-block'?:
| T
| {
label?: T;
platforms?:
| T
| {
facebook?: T;
twitter?: T;
linkedin?: T;
xing?: T;
whatsapp?: T;
telegram?: T;
email?: T;
copy?: T;
print?: T;
pinterest?: T;
reddit?: T;
};
layout?: T;
align?: T;
floatSide?: T;
style?:
| T
| {
variant?: T;
size?: T;
shape?: T;
colorScheme?: T;
gap?: T;
showLabel?: T;
showCount?: T;
};
behavior?:
| T
| {
openInPopup?: T;
useNativeShare?: T;
copyFeedback?: T;
};
content?:
| T
| {
customTitle?: T;
customDescription?: T;
hashtags?: T;
via?: T;
};
id?: T;
blockName?: T;
};
'toc-block'?:
| T
| {
title?: T;
levels?:
| T
| {
h2?: T;
h3?: T;
h4?: T;
h5?: T;
h6?: T;
};
layout?: T;
sidebarPos?: T;
behavior?:
| T
| {
smoothScroll?: T;
highlightActive?: T;
scrollOffset?: T;
collapsible?: T;
startCollapsed?: T;
showProgress?: T;
progressStyle?: T;
};
style?:
| T
| {
bg?: T;
border?: T;
borderSide?: T;
rounded?: T;
shadow?: T;
indent?: T;
showIcon?: T;
fontSize?: T;
lineHeight?: T;
};
minItems?: T;
maxItems?: T;
a11yLabel?: T;
id?: T;
blockName?: T;
};
'team-filter-block'?:
| T
| {
title?: T;
subtitle?: T;
filters?:
| T
| {
showSearch?: T;
searchPlaceholder?: T;
showDepartment?: T;
showSpecialization?: T;
showLanguage?: T;
showHierarchy?: T;
filterLayout?: T;
filterStyle?: T;
showResultCount?: T;
showResetButton?: T;
};
display?:
| T
| {
layout?: T;
columns?: T;
initialLimit?: T;
loadMore?: T;
loadMoreText?: T;
};
card?:
| T
| {
showImage?: T;
imageStyle?: T;
showRole?: T;
showDepartment?: T;
showBio?: T;
showContact?: T;
showSocial?: T;
showSpecializations?: T;
showLanguages?: T;
showVCard?: T;
linkToProfile?: T;
profileBasePath?: T;
enableModal?: T;
};
style?:
| T
| {
bg?: T;
cardBg?: T;
cardShadow?: T;
cardHover?: T;
gap?: T;
animation?: T;
};
emptyState?:
| T
| {
title?: T;
message?: T;
showResetButton?: T;
};
id?: T;
blockName?: T;
};
'org-chart-block'?:
| T
| {
title?: T;
subtitle?: T;
source?: T;
rootMember?: T;
department?: T;
selectedMembers?: T;
maxDepth?: T;
layout?: T;
direction?: T;
node?:
| T
| {
style?: T;
showImage?: T;
imageSize?: T;
imageShape?: T;
showName?: T;
showRole?: T;
showDepartment?: T;
showContact?: T;
clickAction?: T;
profileBasePath?: T;
};
connectors?:
| T
| {
style?: T;
color?: T;
thickness?: T;
animated?: T;
};
levels?:
| T
| {
colorByLevel?: T;
sizeByLevel?: T;
collapsible?: T;
initiallyExpanded?: T;
};
interaction?:
| T
| {
zoomable?: T;
pannable?: T;
minimap?: T;
search?: T;
highlight?: T;
fullscreen?: T;
export?: T;
};
style?:
| T
| {
bg?: T;
nodeBg?: T;
nodeShadow?: T;
nodeBorder?: T;
spacing?: T;
minHeight?: T;
};
showLegend?: T;
a11yLabel?: T;
id?: T;
blockName?: T;
};
'locations-block'?:
| T
| {
title?: T;
subtitle?: T;
source?: T;
locationType?: T;
selectedLocations?: T;
layout?: T;
mapPosition?: T;
columns?: T;
map?:
| T
| {
provider?: T;
style?: T;
height?: T;
defaultZoom?: T;
fitBounds?: T;
markerStyle?: T;
markerColor?: T;
clustering?: T;
controls?:
| T
| {
zoom?: T;
fullscreen?: T;
scrollZoom?: T;
dragging?: T;
};
};
show?:
| T
| {
image?: T;
type?: T;
address?: T;
phone?: T;
email?: T;
hours?: T;
directions?: T;
services?: T;
team?: T;
};
actions?:
| T
| {
showDirectionsLink?: T;
showCallButton?: T;
showEmailButton?: T;
showDetailLink?: T;
detailBasePath?: T;
};
style?:
| T
| {
bg?: T;
cardStyle?: T;
gap?: T;
};
id?: T;
blockName?: T;
};
'logo-grid-block'?:
| T
| {
title?: T;
subtitle?: T;
source?: T;
partnerType?: T;
selectedPartners?: T;
featuredOnly?: T;
limit?: T;
logos?:
| T
| {
logo?: T;
name?: T;
link?: T;
id?: T;
};
layout?: T;
columns?: T;
slider?:
| T
| {
perView?: T;
autoplay?: T;
speed?: T;
pauseOnHover?: T;
showArrows?: T;
showDots?: T;
};
logoStyle?:
| T
| {
size?: T;
maxHeight?: T;
grayscale?: T;
colorOnHover?: T;
opacity?: T;
hoverEffect?: T;
};
behavior?:
| T
| {
linkToWebsite?: T;
openInNewTab?: T;
showTooltip?: T;
showName?: T;
};
style?:
| T
| {
bg?: T;
logoBg?: T;
logoPadding?: T;
gap?: T;
alignment?: T;
divider?: T;
};
showCTA?: T;
ctaText?: T;
ctaLink?: T;
id?: T;
blockName?: T;
};
'stats-block'?:
| T
| {
title?: T;
subtitle?: T;
stats?:
| T
| {
value?: T;
numericValue?: T;
prefix?: T;
suffix?: T;
label?: T;
description?: T;
icon?: T;
color?: T;
id?: T;
};
layout?: T;
columns?: T;
alignment?: T;
animation?:
| T
| {
countUp?: T;
duration?: T;
trigger?: T;
stagger?: T;
};
style?:
| T
| {
bg?: T;
bgImage?: T;
bgOverlay?: T;
textColor?: T;
valueSize?: T;
valueWeight?: T;
showIcon?: T;
iconPosition?: T;
dividers?: T;
cardBorder?: T;
cardShadow?: T;
gap?: T;
padding?: T;
};
id?: T;
blockName?: T;
};
'jobs-block'?:
| T
| {
title?: T;
subtitle?: T;
introduction?: T;
source?: T;
category?: T;
department?: T;
locationFilter?: T;
selectedJobs?: T;
limit?: T;
filters?:
| T
| {
showSearch?: T;
showCategoryFilter?: T;
showTypeFilter?: T;
showLocationFilter?: T;
showWorkModelFilter?: T;
filterLayout?: T;
};
layout?: T;
columns?: T;
show?:
| T
| {
image?: T;
department?: T;
type?: T;
location?: T;
workModel?: T;
salary?: T;
summary?: T;
deadline?: T;
publishDate?: T;
badges?: T;
};
badges?:
| T
| {
newDays?: T;
showUrgent?: T;
showFeatured?: T;
};
pagination?:
| T
| {
type?: T;
perPage?: T;
};
style?:
| T
| {
bg?: T;
cardStyle?: T;
hoverEffect?: T;
gap?: T;
};
emptyState?:
| T
| {
title?: T;
message?: T;
showInitiativeLink?: T;
initiativeText?: T;
initiativeUrl?: T;
};
showAllJobsLink?: T;
allJobsText?: T;
allJobsUrl?: T;
id?: T;
blockName?: T;
};
'downloads-block'?:
| T
| {
title?: T;
subtitle?: T;
introduction?: T;
source?: T;
category?: T;
filterTags?: T;
relatedService?: T;
relatedProduct?: T;
selectedDownloads?: T;
limit?: T;
filters?:
| T
| {
showSearch?: T;
showCategoryFilter?: T;
showFileTypeFilter?: T;
filterLayout?: T;
};
layout?: T;
columns?: T;
show?:
| T
| {
thumbnail?: T;
description?: T;
fileSize?: T;
fileType?: T;
category?: T;
downloadCount?: T;
version?: T;
lastUpdated?: T;
};
downloadBehavior?:
| T
| {
directDownload?: T;
trackDownloads?: T;
openInNewTab?: T;
};
fileIcons?:
| T
| {
showFileTypeIcon?: T;
iconStyle?: T;
};
sortBy?: T;
groupBy?: T;
pagination?:
| T
| {
type?: T;
perPage?: T;
};
style?:
| T
| {
bg?: T;
cardStyle?: T;
hoverEffect?: T;
gap?: T;
};
emptyState?:
| T
| {
title?: T;
message?: T;
};
showAllDownloadsLink?: T;
allDownloadsText?: T;
allDownloadsUrl?: T;
id?: T;
blockName?: T;
};
'map-block'?:
| T
| {
title?: T;
subtitle?: T;
source?: T;
locationType?: T;
selectedLocations?: T;
markers?:
| T
| {
name?: T;
address?: T;
lat?: T;
lng?: T;
markerType?: T;
customIcon?: T;
popupContent?: T;
link?: T;
id?: T;
};
singleAddress?:
| T
| {
name?: T;
street?: T;
zip?: T;
city?: T;
country?: T;
lat?: T;
lng?: T;
};
provider?: T;
mapStyle?: T;
mapSettings?:
| T
| {
height?: T;
zoom?: T;
autoFit?: T;
centerLat?: T;
centerLng?: T;
};
interaction?:
| T
| {
scrollZoom?: T;
dragging?: T;
zoomControl?: T;
fullscreenControl?: T;
locateControl?: T;
};
markerStyle?:
| T
| {
type?: T;
color?: T;
size?: T;
clustering?: T;
clusterRadius?: T;
};
popup?:
| T
| {
show?: T;
trigger?: T;
showAddress?: T;
showDirectionsLink?: T;
showPhone?: T;
showOpeningHours?: T;
showDetailLink?: T;
};
sidebar?:
| T
| {
show?: T;
position?: T;
width?: T;
searchable?: T;
clickToCenter?: T;
};
style?:
| T
| {
rounded?: T;
shadow?: T;
border?: T;
padding?: T;
};
fallback?:
| T
| {
showStaticImage?: T;
staticImage?: T;
noJsMessage?: T;
};
id?: T;
blockName?: T;
};
events?:
| T
| {
title?: T;
subtitle?: T;
sourceMode?: T;
filterMode?: T;
eventType?: T;
category?: T;
selectedEvents?: T;
limit?: T;
layout?: T;
columns?: T;
showImage?: T;
showExcerpt?: T;
showDate?: T;
showTime?: T;
showLocation?: T;
showPrice?: T;
showEventType?: T;
showRegistrationButton?: T;
registrationButtonText?: T;
calendarOptions?:
| T
| {
defaultView?: T;
showNavigation?: T;
showViewToggle?: T;
};
groupBy?: T;
sortOrder?: T;
showAllLink?: T;
allEventsLink?: T;
allEventsText?: T;
emptyMessage?: T;
backgroundColor?: T;
cardStyle?: T;
id?: T;
blockName?: T;
};
pricing?:
| T
| {
title?: T;
subtitle?: T;
description?: T;
pricingType?: T;
currency?: T;
showCurrencyBefore?: T;
toggleOptions?:
| T
| {
monthlyLabel?: T;
yearlyLabel?: T;
yearlyDiscount?: T;
defaultToYearly?: T;
};
plans?:
| T
| {
name?: T;
subtitle?: T;
description?: T;
price?: T;
priceMonthly?: T;
priceYearly?: T;
priceSuffix?: T;
originalPrice?: T;
priceNote?: T;
customPriceText?: T;
features?:
| T
| {
text?: T;
included?: T;
highlight?: T;
tooltip?: T;
id?: T;
};
ctaText?: T;
ctaLink?: T;
ctaStyle?: T;
isPopular?: T;
popularLabel?: T;
isRecommended?: T;
recommendedLabel?: T;
accentColor?: T;
icon?: T;
id?: T;
};
showComparison?: T;
comparisonFeatures?:
| T
| {
category?: T;
feature?: T;
tooltip?: T;
values?:
| T
| {
planIndex?: T;
value?: T;
id?: T;
};
id?: T;
};
layout?: T;
alignment?: T;
highlightPopular?: T;
guarantee?:
| T
| {
show?: T;
text?: T;
icon?: T;
};
showFAQ?: T;
faqTitle?: T;
faqItems?:
| T
| {
question?: T;
answer?: T;
id?: T;
};
backgroundColor?: T;
cardStyle?: T;
id?: T;
blockName?: T;
};
tabs?:
| T
| {
title?: T;
subtitle?: T;
tabs?:
| T
| {
label?: T;
icon?: T;
customIcon?: T;
badge?: T;
contentType?: T;
content?: T;
imgTxt?:
| T
| {
img?: T;
imgPos?: T;
text?: T;
};
features?:
| T
| {
title?: T;
description?: T;
icon?: T;
id?: T;
};
code?:
| T
| {
language?: T;
code?: T;
showLineNumbers?: T;
};
embed?:
| T
| {
type?: T;
url?: T;
aspectRatio?: T;
};
id?: T;
};
tabStyle?: T;
tabPosition?: T;
tabAlignment?: T;
defaultTab?: T;
allowKeyboardNavigation?: T;
animated?: T;
lazy?: T;
mobileStyle?: T;
backgroundColor?: T;
contentBackground?: T;
showBorder?: T;
fullWidth?: T;
id?: T;
blockName?: T;
};
accordion?:
| T
| {
title?: T;
subtitle?: T;
description?: T;
items?:
| T
| {
title?: T;
subtitle?: T;
icon?: T;
customIcon?: T;
contentType?: T;
content?: T;
imgTxt?:
| T
| {
img?: T;
imgPos?: T;
text?: T;
};
listItems?:
| T
| {
text?: T;
icon?: T;
id?: T;
};
tableData?:
| T
| {
headers?:
| T
| {
text?: T;
id?: T;
};
rows?:
| T
| {
cells?:
| T
| {
text?: T;
id?: T;
};
id?: T;
};
};
codeContent?:
| T
| {
language?: T;
code?: T;
};
badge?: T;
badgeColor?: T;
defaultOpen?: T;
disabled?: T;
id?: T;
};
behavior?: T;
expandFirst?: T;
animated?: T;
style?: T;
iconPosition?: T;
iconStyle?: T;
layout?: T;
titleSize?: T;
backgroundColor?: T;
headerBackground?: T;
enableSchemaOrg?: T;
id?: T;
blockName?: T;
};
comparison?:
| T
| {
title?: T;
subtitle?: T;
description?: T;
comparisonType?: T;
tbl?:
| T
| {
columns?:
| T
| {
name?: T;
subtitle?: T;
image?: T;
price?: T;
isHighlighted?: T;
highlightLabel?: T;
ctaText?: T;
ctaLink?: T;
id?: T;
};
rows?:
| T
| {
feature?: T;
category?: T;
tooltip?: T;
values?:
| T
| {
columnIndex?: T;
valueType?: T;
textValue?: T;
booleanValue?: T;
partialNote?: T;
id?: T;
};
id?: T;
};
};
crd?:
| T
| {
items?:
| T
| {
title?: T;
subtitle?: T;
image?: T;
description?: T;
features?:
| T
| {
text?: T;
included?: T;
id?: T;
};
price?: T;
ctaText?: T;
ctaLink?: T;
isHighlighted?: T;
accentColor?: T;
id?: T;
};
};
beforeAfter?:
| T
| {
beforeLabel?: T;
afterLabel?: T;
items?:
| T
| {
title?: T;
beforeImage?: T;
afterImage?: T;
beforeText?: T;
afterText?: T;
id?: T;
};
displayStyle?: T;
};
prosCons?:
| T
| {
prosLabel?: T;
consLabel?: T;
items?:
| T
| {
title?: T;
image?: T;
pros?:
| T
| {
text?: T;
id?: T;
};
cons?:
| T
| {
text?: T;
id?: T;
};
verdict?: T;
rating?: T;
id?: T;
};
};
stickyHeader?: T;
showCategories?: T;
collapsibleCategories?: T;
showRowDividers?: T;
highlightDifferences?: T;
mobileView?: T;
symbols?:
| T
| {
checkSymbol?: T;
crossSymbol?: T;
partialSymbol?: T;
};
backgroundColor?: T;
tableStyle?: T;
checkColor?: T;
crossColor?: T;
id?: T;
blockName?: T;
};
'before-after'?:
| T
| {
title?: T;
subtitle?: T;
description?: T;
comparisons?:
| T
| {
title?: T;
beforeImage?: T;
afterImage?: T;
beforeLabel?: T;
afterLabel?: T;
description?: T;
category?: T;
tags?: T;
metadata?:
| T
| {
client?: T;
date?: T;
tools?: T;
duration?: T;
};
showMetadata?: T;
id?: T;
};
displayStyle?: T;
sliderOrientation?: T;
sliderStartPosition?: T;
layout?: T;
aspectRatio?: T;
sliderHandle?:
| T
| {
style?: T;
color?: T;
size?: T;
showLine?: T;
};
showLabels?: T;
labelPosition?: T;
labelStyle?: T;
showFilter?: T;
animation?:
| T
| {
enableAnimation?: T;
autoPlay?: T;
autoPlaySpeed?: T;
scrollTrigger?: T;
};
interactivity?:
| T
| {
enableZoom?: T;
enableFullscreen?: T;
enableSwipe?: T;
enableKeyboard?: T;
};
cta?:
| T
| {
showCta?: T;
ctaText?: T;
ctaLink?: T;
ctaStyle?: T;
};
backgroundColor?: T;
borderRadius?: T;
shadow?: T;
spacing?: T;
id?: T;
blockName?: T;
};
'favorites-block'?:
| T
| {
title?: T;
subtitle?: T;
category?: T;
showFeaturedOnly?: T;
limit?: T;
layout?: T;
columns?: T;
showPrice?: T;
showBadge?: T;
showDescription?: T;
showCategory?: T;
backgroundColor?: T;
cta?:
| T
| {
showCta?: T;
ctaText?: T;
ctaUrl?: T;
};
id?: T;
blockName?: T;
};
'series-block'?:
| T
| {
title?: T;
subtitle?: T;
layout?: T;
columns?: T;
showDescription?: T;
showLogo?: T;
showTagline?: T;
useBrandColors?: T;
limit?: T;
backgroundColor?: T;
cta?:
| T
| {
showCta?: T;
ctaText?: T;
ctaUrl?: T;
};
id?: T;
blockName?: T;
};
'series-detail-block'?:
| T
| {
series?: T;
showHero?: T;
showDescription?: T;
showBrandColors?: T;
showRelatedPosts?: T;
relatedPostsLimit?: T;
relatedPostsTitle?: T;
showYoutubePlaylist?: T;
layout?: T;
hero?:
| T
| {
height?: T;
overlay?: T;
textAlign?: T;
};
id?: T;
blockName?: T;
};
'video-embed-block'?:
| T
| {
title?: T;
videoSource?: T;
youtubeUrl?: T;
vimeoUrl?: T;
customUrl?: T;
thumbnail?: T;
caption?: T;
privacyMode?: T;
lazyLoad?: T;
aspectRatio?: T;
maxWidth?: T;
playbackOptions?:
| T
| {
autoplay?: T;
muted?: T;
loop?: T;
showControls?: T;
startTime?: T;
};
style?:
| T
| {
alignment?: T;
borderRadius?: T;
shadow?: T;
};
id?: T;
blockName?: T;
};
'featured-content-block'?:
| T
| {
title?: T;
subtitle?: T;
items?:
| T
| {
itemType?: T;
post?: T;
video?: T;
series?: T;
externalTitle?: T;
externalUrl?: T;
externalImage?: T;
externalDescription?: T;
customLabel?: T;
featured?: T;
id?: T;
};
layout?: T;
columns?: T;
showDates?: T;
showType?: T;
showDescription?: T;
showCustomLabels?: T;
backgroundColor?: T;
card?:
| T
| {
bg?: T;
shadow?: T;
border?: T;
imgRatio?: T;
hover?: T;
};
cta?:
| T
| {
showCta?: T;
ctaText?: T;
ctaUrl?: T;
};
id?: T;
blockName?: T;
};
};
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
ogImage?: T;
};
status?: T;
publishedAt?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "posts_select".
*/
export interface PostsSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
type?: T;
isFeatured?: T;
excerpt?: T;
featuredImage?: T;
featuredVideo?:
| T
| {
enabled?: T;
replaceImage?: T;
source?: T;
video?: T;
embedUrl?: T;
uploadedVideo?: T;
autoplay?: T;
muted?: T;
processedEmbedUrl?: T;
extractedVideoId?: T;
platform?: T;
thumbnailUrl?: T;
};
content?: T;
categories?: T;
tags?: T;
author?: T;
coAuthors?: T;
authorLegacy?: T;
readingTime?: T;
status?: T;
publishedAt?: T;
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
ogImage?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "categories_select".
*/
export interface CategoriesSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
description?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "social-links_select".
*/
export interface SocialLinksSelect<T extends boolean = true> {
tenant?: T;
platform?: T;
url?: T;
isActive?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "testimonials_select".
*/
export interface TestimonialsSelect<T extends boolean = true> {
tenant?: T;
quote?: T;
author?: T;
role?: T;
company?: T;
image?: T;
rating?: T;
source?: T;
sourceUrl?: T;
date?: T;
isActive?: T;
order?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "faqs_select".
*/
export interface FaqsSelect<T extends boolean = true> {
tenant?: T;
question?: T;
answer?: T;
answerPlainText?: T;
category?: T;
icon?: T;
relatedFAQs?: T;
isActive?: T;
isFeatured?: T;
order?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "team_select".
*/
export interface TeamSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
role?: T;
department?: T;
image?: T;
bio?: T;
bioShort?: T;
email?: T;
phone?: T;
showContactInfo?: T;
socialLinks?:
| T
| {
platform?: T;
url?: T;
id?: T;
};
qualifications?:
| T
| {
title?: T;
year?: T;
institution?: T;
id?: T;
};
specializations?:
| T
| {
title?: T;
id?: T;
};
languages?:
| T
| {
language?: T;
level?: T;
id?: T;
};
linkedUser?: T;
isActive?: T;
isFeatured?: T;
order?: T;
startDate?: T;
reportsTo?: T;
hierarchyLevel?: T;
allowVCard?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "service-categories_select".
*/
export interface ServiceCategoriesSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
description?: T;
icon?: T;
image?: T;
color?: T;
isActive?: T;
order?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "services_select".
*/
export interface ServicesSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
subtitle?: T;
shortDescription?: T;
description?: T;
icon?: T;
iconImage?: T;
image?: T;
gallery?:
| T
| {
image?: T;
caption?: T;
id?: T;
};
category?: T;
features?:
| T
| {
title?: T;
description?: T;
icon?: T;
id?: T;
};
pricingType?: T;
price?: T;
priceMax?: T;
priceUnit?: T;
priceNote?: T;
pricingDetails?: T;
ctaText?: T;
ctaLink?: T;
ctaStyle?: T;
secondaryCta?:
| T
| {
enabled?: T;
text?: T;
link?: T;
};
relatedServices?: T;
teamMembers?: T;
faqs?: T;
detailSections?:
| T
| {
title?: T;
content?: T;
icon?: T;
id?: T;
};
testimonialQuote?: T;
testimonialAuthor?: T;
metaTitle?: T;
metaDescription?: T;
ogImage?: T;
isActive?: T;
isFeatured?: T;
isNew?: T;
order?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "newsletter-subscribers_select".
*/
export interface NewsletterSubscribersSelect<T extends boolean = true> {
tenant?: T;
email?: T;
firstName?: T;
lastName?: T;
status?: T;
interests?: T;
source?: T;
subscribedAt?: T;
confirmedAt?: T;
unsubscribedAt?: T;
confirmationToken?: T;
ipAddress?: T;
userAgent?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "portfolio-categories_select".
*/
export interface PortfolioCategoriesSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
description?: T;
coverImage?: T;
order?: T;
isActive?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "portfolios_select".
*/
export interface PortfoliosSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
description?: T;
excerpt?: T;
category?: T;
tags?: T;
coverImage?: T;
images?:
| T
| {
image?: T;
caption?: T;
isHighlight?: T;
id?: T;
};
projectDetails?:
| T
| {
client?: T;
location?: T;
shootingDate?: T;
equipment?: T;
};
status?: T;
isFeatured?: T;
publishedAt?: T;
order?: T;
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
ogImage?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "video-categories_select".
*/
export interface VideoCategoriesSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
description?: T;
icon?: T;
coverImage?: T;
order?: T;
isActive?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "videos_select".
*/
export interface VideosSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
description?: T;
excerpt?: T;
source?: T;
videoFile?: T;
embedUrl?: T;
videoId?: T;
thumbnail?: T;
duration?: T;
durationSeconds?: T;
category?: T;
tags?: T;
videoType?: T;
playback?:
| T
| {
autoplay?: T;
muted?: T;
loop?: T;
controls?: T;
startTime?: T;
};
aspectRatio?: T;
status?: T;
isFeatured?: T;
publishedAt?: T;
relatedVideos?: T;
relatedPosts?: T;
transcript?: T;
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
ogImage?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "product-categories_select".
*/
export interface ProductCategoriesSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
description?: T;
image?: T;
icon?: T;
parent?: T;
order?: T;
isActive?: T;
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "products_select".
*/
export interface ProductsSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
sku?: T;
shortDescription?: T;
description?: T;
category?: T;
tags?:
| T
| {
tag?: T;
id?: T;
};
featuredImage?: T;
gallery?:
| T
| {
image?: T;
caption?: T;
id?: T;
};
pricing?:
| T
| {
price?: T;
salePrice?: T;
currency?: T;
priceType?: T;
priceNote?: T;
};
details?:
| T
| {
specifications?:
| T
| {
key?: T;
value?: T;
id?: T;
};
features?:
| T
| {
feature?: T;
icon?: T;
id?: T;
};
};
inventory?:
| T
| {
stockStatus?: T;
stockQuantity?: T;
deliveryTime?: T;
};
relatedProducts?: T;
downloadFiles?:
| T
| {
file?: T;
title?: T;
id?: T;
};
cta?:
| T
| {
type?: T;
buttonText?: T;
externalUrl?: T;
};
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
ogImage?: T;
};
status?: T;
isFeatured?: T;
isNew?: T;
order?: T;
publishedAt?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "timelines_select".
*/
export interface TimelinesSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
description?: T;
type?: T;
status?: T;
displayOptions?:
| T
| {
layout?: T;
sortOrder?: T;
showConnector?: T;
showImages?: T;
groupByYear?: T;
markerStyle?: T;
colorScheme?: T;
};
events?:
| T
| {
dateType?: T;
year?: T;
month?: T;
day?: T;
endYear?: T;
endMonth?: T;
ongoing?: T;
customDate?: T;
title?: T;
subtitle?: T;
description?: T;
shortDescription?: T;
image?: T;
gallery?:
| T
| {
image?: T;
caption?: T;
id?: T;
};
category?: T;
importance?: T;
stepNumber?: T;
duration?: T;
responsible?: T;
actionRequired?: T;
deliverables?:
| T
| {
name?: T;
type?: T;
id?: T;
};
icon?: T;
color?: T;
links?:
| T
| {
label?: T;
url?: T;
type?: T;
id?: T;
};
metadata?: T;
id?: T;
};
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "workflows_select".
*/
export interface WorkflowsSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
description?: T;
shortDescription?: T;
type?: T;
status?: T;
image?: T;
properties?:
| T
| {
estimatedDuration?: T;
complexity?: T;
isIterative?: T;
allowParallelPhases?: T;
};
displayOptions?:
| T
| {
layout?: T;
showPhaseNumbers?: T;
showStepNumbers?: T;
showDurations?: T;
showResponsible?: T;
showProgress?: T;
colorScheme?: T;
};
phases?:
| T
| {
name?: T;
description?: T;
icon?: T;
color?: T;
estimatedDuration?: T;
responsible?: T;
steps?:
| T
| {
name?: T;
description?: T;
shortDescription?: T;
stepType?: T;
priority?: T;
estimatedDuration?: T;
responsible?: T;
icon?: T;
dependencies?:
| T
| {
dependsOnSteps?: T;
canRunParallel?: T;
isBlocking?: T;
};
conditions?:
| T
| {
condition?: T;
nextStep?: T;
color?: T;
id?: T;
};
checklist?:
| T
| {
item?: T;
isRequired?: T;
id?: T;
};
resources?:
| T
| {
name?: T;
type?: T;
file?: T;
url?: T;
description?: T;
id?: T;
};
outputs?:
| T
| {
name?: T;
description?: T;
id?: T;
};
metadata?: T;
id?: T;
};
deliverables?:
| T
| {
name?: T;
description?: T;
id?: T;
};
id?: T;
};
globalResources?:
| T
| {
name?: T;
type?: T;
file?: T;
url?: T;
description?: T;
id?: T;
};
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "tags_select".
*/
export interface TagsSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
description?: T;
color?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "authors_select".
*/
export interface AuthorsSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
avatar?: T;
bio?: T;
bioShort?: T;
title?: T;
email?: T;
website?: T;
social?:
| T
| {
twitter?: T;
linkedin?: T;
github?: T;
instagram?: T;
};
linkedTeam?: T;
linkedUser?: T;
isActive?: T;
isGuest?: T;
featured?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "locations_select".
*/
export interface LocationsSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
type?: T;
description?: T;
image?: T;
address?:
| T
| {
street?: T;
additionalLine?: T;
zip?: T;
city?: T;
state?: T;
country?: T;
};
geo?:
| T
| {
lat?: T;
lng?: T;
zoom?: T;
};
contact?:
| T
| {
phone?: T;
fax?: T;
email?: T;
website?: T;
};
hours?:
| T
| {
display?: T;
structured?:
| T
| {
day?: T;
closed?: T;
open?: T;
close?: T;
break?:
| T
| {
hasBreak?: T;
start?: T;
end?: T;
};
id?: T;
};
note?: T;
};
directions?:
| T
| {
text?: T;
parking?: T;
publicTransport?: T;
accessibility?: T;
};
services?: T;
teamMembers?: T;
isMain?: T;
isActive?: T;
showInFooter?: T;
order?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "partners_select".
*/
export interface PartnersSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
type?: T;
logo?: T;
logoLight?: T;
description?: T;
website?: T;
caseStudy?:
| T
| {
quote?: T;
quotePerson?: T;
quoteRole?: T;
projectDescription?: T;
results?:
| T
| {
metric?: T;
label?: T;
id?: T;
};
};
certification?:
| T
| {
issuer?: T;
validFrom?: T;
validUntil?: T;
certNumber?: T;
document?: T;
};
category?: T;
tags?:
| T
| {
tag?: T;
id?: T;
};
isFeatured?: T;
isActive?: T;
order?: T;
since?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "jobs_select".
*/
export interface JobsSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
reference?: T;
department?: T;
category?: T;
type?: T;
workModel?: T;
experienceLevel?: T;
location?:
| T
| {
locationRef?: T;
city?: T;
region?: T;
country?: T;
};
summary?: T;
description?: T;
responsibilities?: T;
requirements?: T;
qualifications?: T;
benefits?: T;
benefitsList?:
| T
| {
benefit?: T;
icon?: T;
id?: T;
};
salary?:
| T
| {
show?: T;
type?: T;
min?: T;
max?: T;
currency?: T;
note?: T;
};
application?:
| T
| {
method?: T;
email?: T;
formId?: T;
externalUrl?: T;
contact?: T;
deadline?: T;
};
image?: T;
status?: T;
publishedAt?: T;
isFeatured?: T;
isUrgent?: T;
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "downloads_select".
*/
export interface DownloadsSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
description?: T;
file?: T;
fileType?: T;
fileSize?: T;
category?: T;
tags?:
| T
| {
tag?: T;
id?: T;
};
thumbnail?: T;
relatedServices?: T;
relatedProducts?: T;
access?:
| T
| {
requireLogin?: T;
requireForm?: T;
formFields?: T;
};
downloadCount?: T;
version?: T;
lastUpdated?: T;
isActive?: T;
isFeatured?: T;
order?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "events_select".
*/
export interface EventsSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
subtitle?: T;
description?: T;
excerpt?: T;
eventType?: T;
category?: T;
format?: T;
startDate?: T;
endDate?: T;
isAllDay?: T;
timezone?: T;
isRecurring?: T;
recurrence?:
| T
| {
frequency?: T;
interval?: T;
endRecurrence?: T;
description?: T;
};
location?:
| T
| {
locationRef?: T;
customLocation?: T;
venueName?: T;
street?: T;
zip?: T;
city?: T;
country?: T;
room?: T;
directions?: T;
};
online?:
| T
| {
platform?: T;
accessLink?: T;
accessInfo?: T;
};
image?: T;
gallery?:
| T
| {
image?: T;
caption?: T;
id?: T;
};
registration?:
| T
| {
required?: T;
method?: T;
formId?: T;
email?: T;
externalUrl?: T;
phone?: T;
deadline?: T;
maxParticipants?: T;
currentParticipants?: T;
waitlistEnabled?: T;
};
pricing?:
| T
| {
isFree?: T;
prices?:
| T
| {
name?: T;
price?: T;
currency?: T;
description?: T;
validUntil?: T;
id?: T;
};
priceNote?: T;
};
speakers?:
| T
| {
teamMember?: T;
isExternal?: T;
name?: T;
title?: T;
company?: T;
photo?: T;
bio?: T;
role?: T;
id?: T;
};
agenda?:
| T
| {
time?: T;
title?: T;
description?: T;
speaker?: T;
type?: T;
id?: T;
};
contact?:
| T
| {
teamMember?: T;
name?: T;
email?: T;
phone?: T;
};
relatedServices?: T;
relatedEvents?: T;
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
ogImage?: T;
};
status?: T;
isFeatured?: T;
publishedAt?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "bookings_select".
*/
export interface BookingsSelect<T extends boolean = true> {
tenant?: T;
customerName?: T;
customerEmail?: T;
customerPhone?: T;
customerCompany?: T;
serviceType?: T;
service?: T;
date?: T;
time?: T;
duration?: T;
locationType?: T;
locationAddress?: T;
participants?: T;
message?: T;
referenceImages?:
| T
| {
image?: T;
note?: T;
id?: T;
};
status?: T;
priority?: T;
pricing?:
| T
| {
estimatedPrice?: T;
finalPrice?: T;
depositAmount?: T;
depositPaid?: T;
fullyPaid?: T;
};
internalNotes?:
| T
| {
note?: T;
author?: T;
createdAt?: T;
id?: T;
};
contactHistory?:
| T
| {
type?: T;
summary?: T;
date?: T;
id?: T;
};
assignedTo?: T;
source?: T;
gdprConsent?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "certifications_select".
*/
export interface CertificationsSelect<T extends boolean = true> {
tenant?: T;
name?: T;
slug?: T;
description?: T;
shortDescription?: T;
type?: T;
category?: T;
issuer?:
| T
| {
name?: T;
logo?: T;
website?: T;
country?: T;
};
certNumber?: T;
issuedDate?: T;
validUntil?: T;
renewalCycle?: T;
logo?: T;
certificate?: T;
gallery?:
| T
| {
document?: T;
title?: T;
id?: T;
};
scope?:
| T
| {
description?: T;
locations?: T;
services?: T;
};
requirements?:
| T
| {
requirement?: T;
description?: T;
id?: T;
};
benefits?:
| T
| {
title?: T;
description?: T;
icon?: T;
id?: T;
};
audits?:
| T
| {
date?: T;
type?: T;
result?: T;
notes?: T;
id?: T;
};
status?: T;
visibility?: T;
priority?: T;
showOnHomepage?: T;
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "projects_select".
*/
export interface ProjectsSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
tagline?: T;
description?: T;
shortDescription?: T;
type?: T;
genres?: T;
platforms?: T;
featuredImage?: T;
logo?: T;
screenshots?:
| T
| {
image?: T;
caption?: T;
id?: T;
};
videos?:
| T
| {
type?: T;
title?: T;
url?: T;
thumbnail?: T;
id?: T;
};
techStack?:
| T
| {
engine?: T;
languages?: T;
tools?: T;
};
requirements?:
| T
| {
minimum?:
| T
| {
os?: T;
cpu?: T;
ram?: T;
gpu?: T;
storage?: T;
};
recommended?:
| T
| {
os?: T;
cpu?: T;
ram?: T;
gpu?: T;
storage?: T;
};
};
releaseDate?: T;
links?:
| T
| {
website?: T;
steam?: T;
itchio?: T;
epicGames?: T;
gog?: T;
playStore?: T;
appStore?: T;
github?: T;
discord?: T;
twitter?: T;
};
downloads?:
| T
| {
title?: T;
platform?: T;
version?: T;
file?: T;
externalUrl?: T;
size?: T;
id?: T;
};
features?:
| T
| {
title?: T;
description?: T;
icon?: T;
id?: T;
};
team?:
| T
| {
name?: T;
role?: T;
link?: T;
avatar?: T;
id?: T;
};
gameJam?:
| T
| {
jamName?: T;
theme?: T;
duration?: T;
ranking?: T;
jamLink?: T;
};
devlogs?: T;
status?: T;
visibility?: T;
featured?: T;
sortOrder?: T;
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
ogImage?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "favorites_select".
*/
export interface FavoritesSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
description?: T;
category?: T;
subcategory?: T;
price?: T;
priceRange?: T;
affiliateUrl?: T;
affiliateNetwork?: T;
image?: T;
badge?: T;
featured?: T;
isActive?: T;
order?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "series_select".
*/
export interface SeriesSelect<T extends boolean = true> {
tenant?: T;
title?: T;
slug?: T;
tagline?: T;
description?: T;
logo?: T;
coverImage?: T;
brandColor?: T;
accentColor?: T;
youtubePlaylistId?: T;
youtubePlaylistUrl?: T;
order?: T;
isActive?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "youtube-channels_select".
*/
export interface YoutubeChannelsSelect<T extends boolean = true> {
name?: T;
slug?: T;
youtubeChannelId?: T;
youtubeHandle?: T;
language?: T;
category?: T;
status?: T;
branding?:
| T
| {
primaryColor?: T;
secondaryColor?: T;
logo?: T;
thumbnailTemplate?: T;
};
publishingSchedule?:
| T
| {
defaultDays?: T;
defaultTime?: T;
shortsPerWeek?: T;
longformPerWeek?: T;
};
currentMetrics?:
| T
| {
subscriberCount?: T;
totalViews?: T;
videoCount?: T;
lastSyncedAt?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "youtube-content_select".
*/
export interface YoutubeContentSelect<T extends boolean = true> {
title?: T;
slug?: T;
channel?: T;
series?: T;
format?: T;
status?: T;
priority?: T;
assignedTo?: T;
createdBy?: T;
productionBatch?: T;
description?: T;
hook?: T;
keyPoints?:
| T
| {
point?: T;
id?: T;
};
callToAction?: T;
scriptUrl?: T;
scriptContent?: T;
shootDate?: T;
editDeadline?: T;
reviewDeadline?: T;
scheduledPublishDate?: T;
actualPublishDate?: T;
productionWeek?: T;
calendarWeek?: T;
productionDate?: T;
targetDuration?: T;
bRollNotes?: T;
publishTime?: T;
thumbnailText?: T;
ctaType?: T;
ctaDetail?: T;
uploadChecklist?:
| T
| {
step?: T;
completed?: T;
completedAt?: T;
id?: T;
};
disclaimers?:
| T
| {
type?: T;
text?: T;
placement?: T;
id?: T;
};
thumbnail?: T;
thumbnailAlt?: T;
videoFile?: T;
rawFootage?:
| T
| {
file?: T;
description?: T;
id?: T;
};
approvals?:
| T
| {
scriptApproval?:
| T
| {
approved?: T;
approvedBy?: T;
approvedAt?: T;
notes?: T;
};
medicalApproval?:
| T
| {
required?: T;
approved?: T;
approvedBy?: T;
approvedAt?: T;
notes?: T;
};
legalApproval?:
| T
| {
approved?: T;
approvedBy?: T;
approvedAt?: T;
disclaimerIncluded?: T;
notes?: T;
};
finalApproval?:
| T
| {
approved?: T;
approvedBy?: T;
approvedAt?: T;
notes?: T;
};
};
youtube?:
| T
| {
videoId?: T;
url?: T;
metadata?:
| T
| {
youtubeTitle?: T;
youtubeDescription?: T;
tags?:
| T
| {
tag?: T;
id?: T;
};
visibility?: T;
chapters?: T;
pinnedComment?: T;
};
};
performance?:
| T
| {
views?: T;
likes?: T;
comments?: T;
shares?: T;
watchTimeMinutes?: T;
avgViewDuration?: T;
avgViewPercentage?: T;
ctr?: T;
impressions?: T;
subscribersGained?: T;
lastSyncedAt?: T;
};
internalNotes?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-tasks_select".
*/
export interface YtTasksSelect<T extends boolean = true> {
title?: T;
description?: T;
video?: T;
channel?: T;
taskType?: T;
status?: T;
priority?: T;
assignedTo?: T;
dueDate?: T;
completedAt?: T;
completedBy?: T;
blockedReason?: T;
attachments?:
| T
| {
file?: T;
note?: T;
id?: T;
};
comments?:
| T
| {
author?: T;
content?: T;
createdAt?: T;
id?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-notifications_select".
*/
export interface YtNotificationsSelect<T extends boolean = true> {
recipient?: T;
type?: T;
title?: T;
message?: T;
link?: T;
relatedVideo?: T;
relatedTask?: T;
relatedAccount?: T;
read?: T;
readAt?: T;
emailSent?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-batches_select".
*/
export interface YtBatchesSelect<T extends boolean = true> {
name?: T;
channel?: T;
status?: T;
productionPeriodStart?: T;
productionPeriodEnd?: T;
targets?:
| T
| {
shortsTarget?: T;
longformsTarget?: T;
totalTarget?: T;
bufferDays?: T;
};
progress?:
| T
| {
shortsCompleted?: T;
longformsCompleted?: T;
percentage?: T;
};
team?:
| T
| {
producer?: T;
editor?: T;
reviewer?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-monthly-goals_select".
*/
export interface YtMonthlyGoalsSelect<T extends boolean = true> {
channel?: T;
month?: T;
displayTitle?: T;
contentGoals?:
| T
| {
longformsTarget?: T;
longformsCurrent?: T;
shortsTarget?: T;
shortsCurrent?: T;
};
audienceGoals?:
| T
| {
subscribersTarget?: T;
subscribersCurrent?: T;
viewsTarget?: T;
viewsCurrent?: T;
};
engagementGoals?:
| T
| {
avgCtrTarget?: T;
avgCtrCurrent?: T;
avgRetentionTarget?: T;
avgRetentionCurrent?: T;
};
businessGoals?:
| T
| {
newsletterSignupsTarget?: T;
newsletterSignupsCurrent?: T;
affiliateRevenueTarget?: T;
affiliateRevenueCurrent?: T;
};
customGoals?:
| T
| {
metric?: T;
target?: T;
current?: T;
status?: T;
id?: T;
};
notes?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-script-templates_select".
*/
export interface YtScriptTemplatesSelect<T extends boolean = true> {
name?: T;
channel?: T;
series?: T;
format?: T;
description?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-checklist-templates_select".
*/
export interface YtChecklistTemplatesSelect<T extends boolean = true> {
name?: T;
channel?: T;
type?: T;
format?: T;
description?: T;
items?:
| T
| {
order?: T;
task?: T;
category?: T;
details?: T;
isRequired?: T;
id?: T;
};
isDefault?: T;
isActive?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "yt-series_select".
*/
export interface YtSeriesSelect<T extends boolean = true> {
name?: T;
slug?: T;
channel?: T;
description?: T;
logo?: T;
coverImage?: T;
brandColor?: T;
accentColor?: T;
youtubePlaylistId?: T;
youtubePlaylistUrl?: T;
format?: T;
publishingFrequency?: T;
isActive?: T;
order?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "social-platforms_select".
*/
export interface SocialPlatformsSelect<T extends boolean = true> {
name?: T;
slug?: T;
icon?: T;
color?: T;
isActive?: T;
apiStatus?: T;
apiConfig?:
| T
| {
apiType?: T;
baseUrl?: T;
authType?: T;
oauthEndpoint?: T;
scopes?:
| T
| {
scope?: T;
id?: T;
};
tokenValidityDays?: T;
};
interactionTypes?:
| T
| {
type?: T;
label?: T;
icon?: T;
canReply?: T;
id?: T;
};
rateLimits?:
| T
| {
requestsPerMinute?: T;
requestsPerDay?: T;
quotaUnitsPerDay?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "social-accounts_select".
*/
export interface SocialAccountsSelect<T extends boolean = true> {
platform?: T;
linkedChannel?: T;
displayName?: T;
accountHandle?: T;
externalId?: T;
accountUrl?: T;
isActive?: T;
credentials?:
| T
| {
accessToken?: T;
refreshToken?: T;
tokenExpiresAt?: T;
apiKey?: T;
};
stats?:
| T
| {
followers?: T;
totalPosts?: T;
lastSyncedAt?: T;
};
syncSettings?:
| T
| {
autoSyncEnabled?: T;
syncIntervalMinutes?: T;
syncComments?: T;
syncDMs?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "community-interactions_select".
*/
export interface CommunityInteractionsSelect<T extends boolean = true> {
platform?: T;
socialAccount?: T;
linkedContent?: T;
type?: T;
externalId?: T;
parentInteraction?: T;
author?:
| T
| {
name?: T;
handle?: T;
profileUrl?: T;
avatarUrl?: T;
isVerified?: T;
isSubscriber?: T;
isMember?: T;
subscriberCount?: T;
};
message?: T;
messageHtml?: T;
attachments?:
| T
| {
type?: T;
url?: T;
id?: T;
};
publishedAt?: T;
analysis?:
| T
| {
sentiment?: T;
sentimentScore?: T;
confidence?: T;
topics?:
| T
| {
topic?: T;
id?: T;
};
language?: T;
suggestedTemplate?: T;
suggestedReply?: T;
analyzedAt?: T;
};
flags?:
| T
| {
isMedicalQuestion?: T;
requiresEscalation?: T;
isSpam?: T;
isFromInfluencer?: T;
};
status?: T;
priority?: T;
assignedTo?: T;
responseDeadline?: T;
response?:
| T
| {
text?: T;
usedTemplate?: T;
sentAt?: T;
sentBy?: T;
externalReplyId?: T;
};
engagement?:
| T
| {
likes?: T;
replies?: T;
isHearted?: T;
isPinned?: T;
};
internalNotes?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "community-templates_select".
*/
export interface CommunityTemplatesSelect<T extends boolean = true> {
name?: T;
category?: T;
channel?: T;
platforms?: T;
template?: T;
variables?:
| T
| {
variable?: T;
description?: T;
defaultValue?: T;
id?: T;
};
autoSuggestKeywords?:
| T
| {
keyword?: T;
id?: T;
};
requiresReview?: T;
isActive?: T;
usageCount?: T;
exampleOutput?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "community-rules_select".
*/
export interface CommunityRulesSelect<T extends boolean = true> {
name?: T;
priority?: T;
isActive?: T;
description?: T;
channel?: T;
platforms?: T;
trigger?:
| T
| {
type?: T;
keywords?:
| T
| {
keyword?: T;
matchType?: T;
id?: T;
};
sentimentValues?: T;
influencerMinFollowers?: T;
};
actions?:
| T
| {
action?: T;
value?: T;
targetUser?: T;
targetTemplate?: T;
id?: T;
};
stats?:
| T
| {
timesTriggered?: T;
lastTriggeredAt?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "report-schedules_select".
*/
export interface ReportSchedulesSelect<T extends boolean = true> {
name?: T;
enabled?: T;
frequency?: T;
dayOfWeek?: T;
dayOfMonth?: T;
time?: T;
timezone?: T;
reportType?: T;
channels?: T;
periodDays?: T;
format?: T;
recipients?:
| T
| {
email?: T;
name?: T;
id?: T;
};
lastSentAt?: T;
nextScheduledAt?: T;
sendCount?: T;
lastError?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "cookie-configurations_select".
*/
export interface CookieConfigurationsSelect<T extends boolean = true> {
tenant?: T;
title?: T;
revision?: T;
enabledCategories?: T;
translations?:
| T
| {
de?:
| T
| {
bannerTitle?: T;
bannerDescription?: T;
acceptAllButton?: T;
acceptNecessaryButton?: T;
settingsButton?: T;
saveButton?: T;
privacyPolicyUrl?: T;
categoryLabels?:
| T
| {
necessary?:
| T
| {
title?: T;
description?: T;
};
functional?:
| T
| {
title?: T;
description?: T;
};
analytics?:
| T
| {
title?: T;
description?: T;
};
marketing?:
| T
| {
title?: T;
description?: T;
};
};
};
};
styling?:
| T
| {
position?: T;
theme?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "cookie-inventory_select".
*/
export interface CookieInventorySelect<T extends boolean = true> {
tenant?: T;
name?: T;
provider?: T;
category?: T;
duration?: T;
description?: T;
isActive?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "consent-logs_select".
*/
export interface ConsentLogsSelect<T extends boolean = true> {
consentId?: T;
clientRef?: T;
tenant?: T;
categories?: T;
revision?: T;
userAgent?: T;
anonymizedIp?: T;
expiresAt?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "privacy-policy-settings_select".
*/
export interface PrivacyPolicySettingsSelect<T extends boolean = true> {
tenant?: T;
title?: T;
provider?: T;
alfright?:
| T
| {
tenantId?: T;
apiKey?: T;
language?: T;
iframeHeight?: T;
};
styling?:
| T
| {
headerColor?: T;
headerFont?: T;
headerSize?: T;
subheaderSize?: T;
fontColor?: T;
textFont?: T;
textSize?: T;
linkColor?: T;
backgroundColor?: T;
};
showCookieTable?: T;
cookieTableTitle?: T;
cookieTableDescription?: T;
seo?:
| T
| {
metaTitle?: T;
metaDescription?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "email-logs_select".
*/
export interface EmailLogsSelect<T extends boolean = true> {
tenant?: T;
to?: T;
from?: T;
subject?: T;
status?: T;
messageId?: T;
error?: T;
source?: T;
metadata?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "audit-logs_select".
*/
export interface AuditLogsSelect<T extends boolean = true> {
action?: T;
severity?: T;
entityType?: T;
entityId?: T;
user?: T;
userEmail?: T;
tenant?: T;
ipAddress?: T;
userAgent?: T;
description?: T;
previousValue?: T;
newValue?: T;
metadata?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "site-settings_select".
*/
export interface SiteSettingsSelect<T extends boolean = true> {
tenant?: T;
siteName?: T;
siteTagline?: T;
logo?: T;
favicon?: T;
contact?:
| T
| {
email?: T;
phone?: T;
fax?: T;
};
address?:
| T
| {
street?: T;
additionalLine?: T;
zip?: T;
city?: T;
state?: T;
country?: T;
};
geo?:
| T
| {
lat?: T;
lng?: T;
zoom?: T;
};
footer?:
| T
| {
copyrightText?: T;
showSocialLinks?: T;
};
seo?:
| T
| {
defaultMetaTitle?: T;
defaultMetaDescription?: T;
defaultOgImage?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "navigations_select".
*/
export interface NavigationsSelect<T extends boolean = true> {
tenant?: T;
title?: T;
mainMenu?:
| T
| {
label?: T;
type?: T;
page?: T;
url?: T;
openInNewTab?: T;
submenu?:
| T
| {
label?: T;
linkType?: T;
page?: T;
url?: T;
id?: T;
};
id?: T;
};
footerMenu?:
| T
| {
label?: T;
linkType?: T;
page?: T;
url?: T;
id?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "forms_select".
*/
export interface FormsSelect<T extends boolean = true> {
title?: T;
fields?:
| T
| {
checkbox?:
| T
| {
name?: T;
label?: T;
width?: T;
required?: T;
defaultValue?: T;
id?: T;
blockName?: T;
};
email?:
| T
| {
name?: T;
label?: T;
width?: T;
required?: T;
id?: T;
blockName?: T;
};
message?:
| T
| {
message?: T;
id?: T;
blockName?: T;
};
number?:
| T
| {
name?: T;
label?: T;
width?: T;
defaultValue?: T;
required?: T;
id?: T;
blockName?: T;
};
select?:
| T
| {
name?: T;
label?: T;
width?: T;
defaultValue?: T;
placeholder?: T;
options?:
| T
| {
label?: T;
value?: T;
id?: T;
};
required?: T;
id?: T;
blockName?: T;
};
text?:
| T
| {
name?: T;
label?: T;
width?: T;
defaultValue?: T;
required?: T;
id?: T;
blockName?: T;
};
textarea?:
| T
| {
name?: T;
label?: T;
width?: T;
defaultValue?: T;
required?: T;
id?: T;
blockName?: T;
};
};
submitButtonLabel?: T;
confirmationType?: T;
confirmationMessage?: T;
redirect?:
| T
| {
type?: T;
reference?: T;
url?: T;
};
emails?:
| T
| {
emailTo?: T;
cc?: T;
bcc?: T;
replyTo?: T;
emailFrom?: T;
subject?: T;
message?: T;
id?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "form-submissions_select".
*/
export interface FormSubmissionsSelect<T extends boolean = true> {
form?: T;
submissionData?:
| T
| {
field?: T;
value?: T;
id?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "redirects_select".
*/
export interface RedirectsSelect<T extends boolean = true> {
from?: T;
to?:
| T
| {
type?: T;
reference?: T;
url?: T;
};
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-kv_select".
*/
export interface PayloadKvSelect<T extends boolean = true> {
key?: T;
data?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-locked-documents_select".
*/
export interface PayloadLockedDocumentsSelect<T extends boolean = true> {
document?: T;
globalSlug?: T;
user?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-preferences_select".
*/
export interface PayloadPreferencesSelect<T extends boolean = true> {
user?: T;
key?: T;
value?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-migrations_select".
*/
export interface PayloadMigrationsSelect<T extends boolean = true> {
name?: T;
batch?: T;
updatedAt?: T;
createdAt?: T;
}
/**
* Globale SEO-Konfiguration und Schema.org Daten
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "seo-settings".
*/
export interface SeoSetting {
id: number;
metaDefaults?: {
/**
* Wird an jeden Seitentitel angehängt (z.B. "Startseite | Firmenname")
*/
titleSuffix?: string | null;
/**
* Wird verwendet, wenn keine spezifische Beschreibung gesetzt ist
*/
defaultDescription?: string | null;
/**
* Fallback-Bild für Social Media Shares (empfohlen: 1200x630px)
*/
defaultOgImage?: (number | null) | Media;
/**
* Globale Keywords (optional, geringe SEO-Relevanz)
*/
keywords?: string[] | null;
};
/**
* Daten für das Organization Schema
*/
organization: {
name: string;
/**
* Vollständiger rechtlicher Firmenname (falls abweichend)
*/
legalName?: string | null;
description?: string | null;
/**
* Firmenlogo für Schema.org (min. 112x112px, empfohlen: 512x512px)
*/
logo?: (number | null) | Media;
foundingDate?: string | null;
};
contact?: {
email?: string | null;
/**
* Im Format +49 123 456789
*/
phone?: string | null;
fax?: string | null;
};
address?: {
street?: string | null;
postalCode?: string | null;
city?: string | null;
region?: string | null;
country?: string | null;
/**
* ISO 3166-1 Alpha-2 Code
*/
countryCode?: string | null;
};
/**
* Für Local Business Schema
*/
geo?: {
latitude?: number | null;
longitude?: number | null;
};
/**
* URLs zu Social Media Profilen (für sameAs Schema)
*/
socialProfiles?:
| {
platform?:
| ('facebook' | 'instagram' | 'twitter' | 'linkedin' | 'youtube' | 'tiktok' | 'pinterest' | 'xing' | 'other')
| null;
url: string;
id?: string | null;
}[]
| null;
/**
* Zusätzliche Daten für lokale Unternehmen
*/
localBusiness?: {
enabled?: boolean | null;
type?:
| (
| 'LocalBusiness'
| 'Physician'
| 'Dentist'
| 'Attorney'
| 'Restaurant'
| 'Hotel'
| 'Store'
| 'HealthClub'
| 'HairSalon'
| 'AutoRepair'
| 'RealEstateAgent'
| 'FinancialService'
| 'ProfessionalService'
| 'MedicalBusiness'
)
| null;
priceRange?: ('€' | '€€' | '€€€' | '€€€€') | null;
/**
* Im Format "Mo-Fr 09:00-17:00"
*/
openingHours?:
| {
specification?: string | null;
id?: string | null;
}[]
| null;
};
robots?: {
/**
* Wenn deaktiviert, wird die gesamte Website von Suchmaschinen ausgeschlossen
*/
allowIndexing?: boolean | null;
/**
* Pfade die nicht gecrawlt werden sollen (z.B. "/intern", "/preview")
*/
additionalDisallow?: string[] | null;
};
/**
* Codes für Suchmaschinen-Verifizierung
*/
verification?: {
/**
* Meta-Tag Content (nur der Code, nicht das gesamte Tag)
*/
google?: string | null;
bing?: string | null;
yandex?: string | null;
};
updatedAt?: string | null;
createdAt?: string | null;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "seo-settings_select".
*/
export interface SeoSettingsSelect<T extends boolean = true> {
metaDefaults?:
| T
| {
titleSuffix?: T;
defaultDescription?: T;
defaultOgImage?: T;
keywords?: T;
};
organization?:
| T
| {
name?: T;
legalName?: T;
description?: T;
logo?: T;
foundingDate?: T;
};
contact?:
| T
| {
email?: T;
phone?: T;
fax?: T;
};
address?:
| T
| {
street?: T;
postalCode?: T;
city?: T;
region?: T;
country?: T;
countryCode?: T;
};
geo?:
| T
| {
latitude?: T;
longitude?: T;
};
socialProfiles?:
| T
| {
platform?: T;
url?: T;
id?: T;
};
localBusiness?:
| T
| {
enabled?: T;
type?: T;
priceRange?: T;
openingHours?:
| T
| {
specification?: T;
id?: T;
};
};
robots?:
| T
| {
allowIndexing?: T;
additionalDisallow?: T;
};
verification?:
| T
| {
google?: T;
bing?: T;
yandex?: T;
};
updatedAt?: T;
createdAt?: T;
globalType?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "auth".
*/
export interface Auth {
[k: string]: unknown;
}
declare module 'payload' {
export interface GeneratedTypes extends Config {}
}