From e28230bcef275b0f6e128f2f057af3a12c8c0b73 Mon Sep 17 00:00:00 2001 From: Peter Meier Date: Mon, 27 Apr 2026 18:41:22 +0200 Subject: [PATCH] feat(images): responsive srcset for posts/blocks, drop AVIF for build speed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Responsive sources Wire `ensureResponsiveImage` (multi-width × multi-format srcset) into the three remaining single-`` components: - ImageBlock (body): widths 600 + 1200, fit follows transform params - ImageGalleryBlock (single-image branch): widths 600 + 1280, fit=contain - PostCard (post-list cards): widths 400 + 800, fit=cover, ar=3:2 `resolveContentImages` now sets `block.resolvedResponsive` alongside the legacy `resolvedImageSrc`, so every Svelte block component renders `` if the responsive shape is present and falls back to a plain `` otherwise. Posts list pages (`/posts`, `/posts/page/N`, `/posts/tag/.../page/N`) call a new `resolvePostCardResponsive` helper instead of one-shot `ensureTransformedImage`. ## Drop AVIF from defaults Server-side AVIF encoding on the CMS is 5-10× slower than WebP. The bandwidth win is marginal for this site and the build time hit is severe (multi-minute hangs on each new variant). Default formats are now `["webp", "jpeg"]` for `ensureResponsiveImage`, in `Layout.astro`'s TopBanner hero, and in the post-card helper. Callers can still opt back into AVIF per-call. ## Module split for client-safe types `ResponsiveImage` is now defined in a tiny `rusty-image-types.ts` and duplicated in `rusty-image.ts` so Svelte components can `import type` the shape without dragging `rusty-image.ts` (and its `node:crypto`/`node:fs` imports) into the browser bundle. `resolvePostCardResponsive` lives in a new `server-image.ts` for the same reason — `blog-utils.ts` is imported by Svelte islands, so its server-only helpers move out. Co-Authored-By: Claude Opus 4.7 --- package.json | 1 + src/components/PostCard.svelte | 24 +- src/components/TopBanner.svelte | 99 +- src/components/blocks/ImageBlock.svelte | 29 +- .../blocks/ImageGalleryBlock.svelte | 29 +- src/layouts/Layout.astro | 77 +- src/lib/block-types.ts | 5 + src/lib/blog-utils.ts | 51 +- src/lib/cms-api.generated.ts | 15077 +--------------- src/lib/cms-media-url.ts | 54 +- src/lib/rusty-image-types.ts | 18 + src/lib/rusty-image.ts | 374 +- src/lib/server-image.ts | 19 + src/pages/post/[slug].astro | 10 +- src/pages/posts/index.astro | 17 +- src/pages/posts/page/[page].astro | 17 +- src/pages/posts/tag/[tag].astro | 15 +- src/pages/posts/tag/[tag]/page/[page].astro | 17 +- yarn.lock | 5 + 19 files changed, 1193 insertions(+), 14745 deletions(-) create mode 100644 src/lib/rusty-image-types.ts create mode 100644 src/lib/server-image.ts diff --git a/package.json b/package.json index a97f774..9c9fb26 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@iconify/svelte": "^5.2.1", "@tailwindcss/vite": "^4.1.18", "astro": "^6.1.1", + "blurhash": "^2.0.5", "json5": "^2.2.3", "marked": "^17.0.2", "react": "^19.2.4", diff --git a/src/components/PostCard.svelte b/src/components/PostCard.svelte index 2ce6d8f..a7c011d 100644 --- a/src/components/PostCard.svelte +++ b/src/components/PostCard.svelte @@ -1,9 +1,13 @@ {#if showBanner}
{#if hasImage} -
- {banner?.headline +
+ {#if hasResponsive && responsive} + + {#each responsive.sources as s (s.type)} + + {/each} + {altText} + + {:else} + {altText} + {/if} {#if hasPageTitle}
diff --git a/src/components/blocks/ImageBlock.svelte b/src/components/blocks/ImageBlock.svelte index 029dfc5..809db3e 100644 --- a/src/components/blocks/ImageBlock.svelte +++ b/src/components/blocks/ImageBlock.svelte @@ -45,12 +45,29 @@
{#if imageUrl}
- {block.caption + {#if block.resolvedResponsive} + + {#each block.resolvedResponsive.sources as s (s.type)} + + {/each} + {block.caption + + {:else} + {block.caption + {/if} {#if block.caption}
{block.caption}
{/if} diff --git a/src/components/blocks/ImageGalleryBlock.svelte b/src/components/blocks/ImageGalleryBlock.svelte index 69603f8..b5beb06 100644 --- a/src/components/blocks/ImageGalleryBlock.svelte +++ b/src/components/blocks/ImageGalleryBlock.svelte @@ -150,12 +150,29 @@

{t(T.image_gallery_empty)}

{:else if withUrl.length === 1}
- {withUrl[0].img.description + {#if withUrl[0].img.resolvedResponsive} + + {#each withUrl[0].img.resolvedResponsive.sources as s (s.type)} + + {/each} + {withUrl[0].img.description + + {:else} + {withUrl[0].img.description + {/if} {#if withUrl[0].img.description}
{withUrl[0].img.description}
{/if} diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 6d8ba3a..374964f 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -16,7 +16,13 @@ import { getPageConfigBySlug, } from "../lib/cms"; import type { NavLinkEntry, FullwidthBannerEntry } from "../lib/cms"; -import { resolveImageUrls, ensureTransformedImage } from "../lib/rusty-image"; +import { + resolveImageUrls, + ensureTransformedImage, + ensureResponsiveImage, + type ResponsiveImage, +} from "../lib/rusty-image"; +import { extractCmsImageField } from "../lib/cms-media-url"; import { DEFAULT_SOCIAL_IMAGE_URL, ROW_RESOLVE, @@ -390,6 +396,10 @@ const siteName = // Top-Banner nur laden, wenn die Seite einen Banner anzeigen soll (showBannerInLayout + topFullwidthBanner) let topBanner: FullwidthBannerEntry | null = null; let topBannerResolvedImages: string[] = []; +let topBannerResponsive: ResponsiveImage | null = null; +let topBannerFocalCss: string | null = null; +/** Responsive Banner-Breiten: mobile (640) bis Retina-Desktop (2400). */ +const BANNER_WIDTHS = [640, 960, 1280, 1600, 1920, 2400]; if ( showBannerInLayout && topFullwidthBanner != null && @@ -398,19 +408,6 @@ if ( try { if (isResolvedBanner(topFullwidthBanner)) { topBanner = topFullwidthBanner; - const bannerImages = Array.isArray(topBanner.image) - ? topBanner.image - : topBanner.image != null - ? [topBanner.image] - : []; - if (bannerImages.length > 0) { - topBannerResolvedImages = await resolveImageUrls(bannerImages, { - width: 2000, - height: 750, - fit: "cover", - format: "webp", - }); - } } else if ( typeof topFullwidthBanner === "string" && topFullwidthBanner !== "" @@ -418,18 +415,43 @@ if ( topBanner = await getFullwidthBannerBySlug(topFullwidthBanner, { locale: "de", }); - const bannerImages = Array.isArray(topBanner?.image) - ? topBanner.image - : topBanner?.image != null - ? [topBanner.image] - : []; - if (bannerImages.length > 0) { - topBannerResolvedImages = await resolveImageUrls(bannerImages, { - width: 2000, - height: 750, - fit: "cover", - format: "webp", - }); + } + + const bannerImages = Array.isArray(topBanner?.image) + ? topBanner.image + : topBanner?.image != null + ? [topBanner.image] + : []; + if (bannerImages.length > 0) { + const primary = extractCmsImageField(bannerImages[0]); + if (primary) { + // Responsives `` fürs erste Banner-Bild: original Seitenverhältnis, + // Mehr-Breiten-srcset + WebP/JPEG-Fallback, Focal-Point durchgereicht. + // AVIF bewusst weggelassen — Encoder ist server-seitig 5-10× langsamer als + // WebP, der Bandbreitengewinn rechtfertigt die Build-Zeit hier nicht. + // CSS `object-cover` (siehe TopBanner) kümmert sich um den Viewport-Crop; + // Focal landet zusätzlich als `object-position`, damit mobile (square) das Motiv trifft. + try { + topBannerResponsive = await ensureResponsiveImage(primary.url, { + widths: BANNER_WIDTHS, + fit: "contain", + formats: ["webp", "jpeg"], + quality: 78, + focal: primary.focal, + }); + topBannerResolvedImages = [topBannerResponsive.fallback]; + } catch { + // Fallback: klassisches Einzelbild + topBannerResolvedImages = await resolveImageUrls(bannerImages, { + width: 2000, + height: 750, + fit: "cover", + format: "webp", + }); + } + if (primary.focal) { + topBannerFocalCss = `${(primary.focal.x * 100).toFixed(2)}% ${(primary.focal.y * 100).toFixed(2)}%`; + } } } } catch { @@ -676,6 +698,9 @@ const cmsFromCache = getCmsFromCache(); diff --git a/src/lib/block-types.ts b/src/lib/block-types.ts index 09a049a..c228f8e 100644 --- a/src/lib/block-types.ts +++ b/src/lib/block-types.ts @@ -6,6 +6,7 @@ import type { BlockLayout } from "./block-layout"; import type { components } from "./cms-api.generated"; +import type { ResponsiveImage } from "./rusty-image-types"; /** Aufgelöster Block vom CMS (mit _type, _slug + typ-spezifische Felder). */ export type ResolvedBlock = { @@ -104,6 +105,8 @@ export interface ImageBlockData { }; /** Nach resolveContentImages: lokaler Pfad (public) zum transformierten Bild. */ resolvedImageSrc?: string; + /** Nach resolveContentImages: responsive ``-Quelle (multi-width × multi-format). */ + resolvedResponsive?: ResponsiveImage; caption?: string; aspectRatio?: number; layout?: BlockLayout; @@ -118,6 +121,8 @@ export interface ImageGalleryImage { file?: { url?: string }; /** Nach resolveContentImages: lokaler Pfad zum transformierten Bild (max. Breite, Ratio erhalten). */ resolvedSrc?: string; + /** Nach resolveContentImages: responsive ``-Quelle. */ + resolvedResponsive?: ResponsiveImage; } /** Bildergalerie (_type: "image_gallery"). images: Array von img-Objekten (src, description). */ diff --git a/src/lib/blog-utils.ts b/src/lib/blog-utils.ts index f6f3756..629f826 100644 --- a/src/lib/blog-utils.ts +++ b/src/lib/blog-utils.ts @@ -9,6 +9,7 @@ import { } from "./cms"; import type { RowContentLayout } from "./block-types"; import type { CalendarItemData } from "./block-types"; +import type { ResponsiveImage } from "./rusty-image-types"; /** rusty-image nur dynamisch importieren, damit client-seitige Importe (z. B. PostOverviewBlock) nicht node:crypto in den Browser ziehen. */ /** Aus der Tag-API: Anzeigename plus optionales Icon und Farbe (CMS-Felder icon / color). */ @@ -138,6 +139,33 @@ export function getPostImageUrl( : null; } +/** + * Wie `getPostImageUrl`, gibt zusätzlich focal + alt zurück (wenn im CMS gesetzt). + * Focal-Point steuert den Crop bei aspect-ratio-/cover-Transforms. + */ +export function getPostImageField( + postImage: PostEntry["postImage"], +): { url: string; focal?: { x: number; y: number }; alt?: string } | null { + const url = getPostImageUrl(postImage); + if (!url) return null; + if (!postImage || typeof postImage === "string") return { url }; + const obj = postImage as { + focal?: { x?: unknown; y?: unknown }; + alt?: unknown; + }; + const fx = + typeof obj.focal?.x === "number" && Number.isFinite(obj.focal.x) + ? Math.max(0, Math.min(1, obj.focal.x)) + : undefined; + const fy = + typeof obj.focal?.y === "number" && Number.isFinite(obj.focal.y) + ? Math.max(0, Math.min(1, obj.focal.y)) + : undefined; + const focal = fx != null && fy != null ? { x: fx, y: fy } : undefined; + const alt = typeof obj.alt === "string" ? obj.alt : undefined; + return { url, ...(focal ? { focal } : {}), ...(alt ? { alt } : {}) }; +} + /** Filtert Posts: behält nur solche, die mindestens einen der Tag-Slugs haben. */ export function filterPostsByTagSlugs( posts: PostEntry[], @@ -187,6 +215,7 @@ type PostWithEvent = PostEntry & { isEvent?: boolean; eventDate?: string; _resolvedImageUrl?: string; + _resolvedResponsive?: ResponsiveImage; }; export function buildPostSearchIndex(posts: PostEntry[]): PostSearchIndexEntry[] { @@ -325,19 +354,17 @@ export async function resolvePostOverviewBlocks( for (const post of posts) resolvePostTagsInPost(post, tagsMap); } for (const post of item.postsResolved as PostEntry[]) { - const raw = getPostImageUrl(post.postImage); - if (raw && import.meta.env.SSR) { + const field = getPostImageField(post.postImage); + if (field && import.meta.env.SSR) { try { - const { ensureTransformedImage } = await import("./rusty-image"); - const url = await ensureTransformedImage(raw, { - width: 400, - height: 267, - fit: "cover", - format: "webp", - }); - ( - post as PostEntry & { _resolvedImageUrl?: string } - )._resolvedImageUrl = url; + const { resolvePostCardResponsive } = await import("./server-image"); + const responsive = await resolvePostCardResponsive(field); + const target = post as PostEntry & { + _resolvedImageUrl?: string; + _resolvedResponsive?: ResponsiveImage; + }; + target._resolvedResponsive = responsive; + target._resolvedImageUrl = responsive.fallback; } catch { // Bild optional } diff --git a/src/lib/cms-api.generated.ts b/src/lib/cms-api.generated.ts index 7fde6df..b54bba1 100644 --- a/src/lib/cms-api.generated.ts +++ b/src/lib/cms-api.generated.ts @@ -69,15 +69,15 @@ export interface paths { patch?: never; trace?: never; }; - "/api/collections/badge": { + "/api/collections/note": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Get schema definition for 'badge' */ - get: operations["getBadgeSchema"]; + /** Get schema definition for 'note' */ + get: operations["getNoteSchema"]; put?: never; post?: never; delete?: never; @@ -86,656 +86,44 @@ export interface paths { patch?: never; trace?: never; }; - "/api/collections/calendar": { + "/api/content/note": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Get schema definition for 'calendar' */ - get: operations["getCalendarSchema"]; + /** List 'note' entries */ + get: operations["listNote"]; put?: never; - post?: never; + /** Create a new 'note' entry */ + post: operations["createNote"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - "/api/collections/calendar_item": { + "/api/content/note/{slug}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Get schema definition for 'calendar_item' */ - get: operations["getCalendarItemSchema"]; - put?: never; + /** Get 'note' entry by slug */ + get: operations["getNote"]; + /** Update 'note' entry */ + put: operations["updateNote"]; post?: never; - delete?: never; + /** Delete 'note' entry */ + delete: operations["deleteNote"]; options?: never; head?: never; patch?: never; trace?: never; }; - "/api/collections/campaign": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'campaign' */ - get: operations["getCampaignSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/campaigns": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'campaigns' */ - get: operations["getCampaignsSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/content_layout": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'content_layout' */ - get: operations["getContentLayoutSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/demo": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'demo' */ - get: operations["getDemoSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/footer": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'footer' */ - get: operations["getFooterSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/fullwidth_banner": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'fullwidth_banner' */ - get: operations["getFullwidthBannerSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/headline": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'headline' */ - get: operations["getHeadlineSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/html": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'html' */ - get: operations["getHtmlSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/iframe": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'iframe' */ - get: operations["getIframeSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/image": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'image' */ - get: operations["getImageSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/image_gallery": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'image_gallery' */ - get: operations["getImageGallerySchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/img": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'img' */ - get: operations["getImgSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/link": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'link' */ - get: operations["getLinkSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/link_list": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'link_list' */ - get: operations["getLinkListSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/list": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'list' */ - get: operations["getListSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/markdown": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'markdown' */ - get: operations["getMarkdownSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/navgroup": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'navgroup' */ - get: operations["getNavgroupSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/navigation": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'navigation' */ - get: operations["getNavigationSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/opnform": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'opnform' */ - get: operations["getOpnformSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/organisation": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'organisation' */ - get: operations["getOrganisationSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/organisations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'organisations' */ - get: operations["getOrganisationsSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/page": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'page' */ - get: operations["getPageSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/page_config": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'page_config' */ - get: operations["getPageConfigSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/post": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'post' */ - get: operations["getPostSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/post_overview": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'post_overview' */ - get: operations["getPostOverviewSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/product": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'product' */ - get: operations["getProductSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/quote": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'quote' */ - get: operations["getQuoteSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/searchable_text": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'searchable_text' */ - get: operations["getSearchableTextSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/seo": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'seo' */ - get: operations["getSeoSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/tag": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'tag' */ - get: operations["getTagSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/text_fragment": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'text_fragment' */ - get: operations["getTextFragmentSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/top_banner": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'top_banner' */ - get: operations["getTopBannerSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/translation_bundle": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'translation_bundle' */ - get: operations["getTranslationBundleSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/collections/youtube_video": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get schema definition for 'youtube_video' */ - get: operations["getYoutubeVideoSchema"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/badge": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'badge' entries */ - get: operations["listBadge"]; - put?: never; - /** Create a new 'badge' entry */ - post: operations["createBadge"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/badge/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'badge' entry by slug */ - get: operations["getBadge"]; - /** Update 'badge' entry */ - put: operations["updateBadge"]; - post?: never; - /** Delete 'badge' entry */ - delete: operations["deleteBadge"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/badge/{slug}/referrers": { + "/api/content/note/{slug}/referrers": { parameters: { query?: never; header?: never; @@ -743,10 +131,10 @@ export interface paths { cookie?: never; }; /** - * List referrers of 'badge' entry + * List referrers of 'note' entry * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). */ - get: operations["getBadgeReferrers"]; + get: operations["getNoteReferrers"]; put?: never; post?: never; delete?: never; @@ -755,44 +143,7 @@ export interface paths { patch?: never; trace?: never; }; - "/api/content/calendar": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'calendar' entries */ - get: operations["listCalendar"]; - put?: never; - /** Create a new 'calendar' entry */ - post: operations["createCalendar"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/calendar/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'calendar' entry by slug */ - get: operations["getCalendar"]; - /** Update 'calendar' entry */ - put: operations["updateCalendar"]; - post?: never; - /** Delete 'calendar' entry */ - delete: operations["deleteCalendar"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/calendar/{slug}/referrers": { + "/api/environments": { parameters: { query?: never; header?: never; @@ -800,56 +151,58 @@ export interface paths { cookie?: never; }; /** - * List referrers of 'calendar' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). + * List content spaces + * @description Returns the active environment list. Empty when multi-environment mode is off (no `RUSTYCMS_ENVIRONMENTS`). */ - get: operations["getCalendarReferrers"]; + get: operations["listEnvironments"]; put?: never; - post?: never; + /** + * Create a new space + * @description Creates a new environment. Body accepts optional `locales` array — when omitted, the space inherits the global locale list; `[]` disables i18n for this space only. + */ + post: operations["createEnvironment"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - "/api/content/calendar_item": { + "/api/environments/{name}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** List 'calendar_item' entries */ - get: operations["listCalendarItem"]; + get?: never; put?: never; - /** Create a new 'calendar_item' entry */ - post: operations["createCalendarItem"]; + post?: never; + /** Delete a space (including all content) */ + delete: operations["deleteEnvironment"]; + options?: never; + head?: never; + /** Rename a space */ + patch: operations["renameEnvironment"]; + trace?: never; + }; + "/api/environments/{name}/duplicate": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Deep-copy a space */ + post: operations["duplicateEnvironment"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - "/api/content/calendar_item/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'calendar_item' entry by slug */ - get: operations["getCalendarItem"]; - /** Update 'calendar_item' entry */ - put: operations["updateCalendarItem"]; - post?: never; - /** Delete 'calendar_item' entry */ - delete: operations["deleteCalendarItem"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/calendar_item/{slug}/referrers": { + "/api/environments/{name}/locales": { parameters: { query?: never; header?: never; @@ -857,11 +210,15 @@ export interface paths { cookie?: never; }; /** - * List referrers of 'calendar_item' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). + * Get a space's locale configuration + * @description Returns the active locale list (per-env override or global fallback), plus the on-disk locale folders for orphan detection ("Karteileichen"). */ - get: operations["getCalendarItemReferrers"]; - put?: never; + get: operations["getEnvironmentLocales"]; + /** + * Set or clear per-space locale override + * @description Body `{ locales: [..] }` sets an explicit override, `{ locales: null }` clears it (follow global). `[]` disables i18n for this space only. First array element becomes the default locale. Content in removed locales is kept on disk. + */ + put: operations["putEnvironmentLocales"]; post?: never; delete?: never; options?: never; @@ -869,44 +226,7 @@ export interface paths { patch?: never; trace?: never; }; - "/api/content/campaign": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'campaign' entries */ - get: operations["listCampaign"]; - put?: never; - /** Create a new 'campaign' entry */ - post: operations["createCampaign"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/campaign/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'campaign' entry by slug */ - get: operations["getCampaign"]; - /** Update 'campaign' entry */ - put: operations["updateCampaign"]; - post?: never; - /** Delete 'campaign' entry */ - delete: operations["deleteCampaign"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/campaign/{slug}/referrers": { + "/api/locales": { parameters: { query?: never; header?: never; @@ -914,10 +234,10 @@ export interface paths { cookie?: never; }; /** - * List referrers of 'campaign' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). + * Effective locale list for a space + * @description Resolves the active locale list for the environment passed via `_environment` (falls back to the default space / global list). */ - get: operations["getCampaignReferrers"]; + get: operations["listLocales"]; put?: never; post?: never; delete?: never; @@ -926,1881 +246,20 @@ export interface paths { patch?: never; trace?: never; }; - "/api/content/campaigns": { + "/api/preview-tokens": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** List 'campaigns' entries */ - get: operations["listCampaigns"]; + get?: never; put?: never; - /** Create a new 'campaigns' entry */ - post: operations["createCampaigns"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/campaigns/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'campaigns' entry by slug */ - get: operations["getCampaigns"]; - /** Update 'campaigns' entry */ - put: operations["updateCampaigns"]; - post?: never; - /** Delete 'campaigns' entry */ - delete: operations["deleteCampaigns"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/campaigns/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; /** - * List referrers of 'campaigns' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). + * Mint a signed preview token + * @description Returns an HMAC-signed token that, when passed as `?preview=` on a GET /api/content/... request, unlocks draft visibility for the targeted entry. Requires content-write authorization. RUSTYCMS_SESSION_SECRET must be configured. */ - get: operations["getCampaignsReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/content_layout": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'content_layout' entries */ - get: operations["listContentLayout"]; - put?: never; - /** Create a new 'content_layout' entry */ - post: operations["createContentLayout"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/content_layout/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'content_layout' entry by slug */ - get: operations["getContentLayout"]; - /** Update 'content_layout' entry */ - put: operations["updateContentLayout"]; - post?: never; - /** Delete 'content_layout' entry */ - delete: operations["deleteContentLayout"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/content_layout/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'content_layout' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getContentLayoutReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/demo": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'demo' entries */ - get: operations["listDemo"]; - put?: never; - /** Create a new 'demo' entry */ - post: operations["createDemo"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/demo/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'demo' entry by slug */ - get: operations["getDemo"]; - /** Update 'demo' entry */ - put: operations["updateDemo"]; - post?: never; - /** Delete 'demo' entry */ - delete: operations["deleteDemo"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/demo/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'demo' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getDemoReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/footer": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'footer' entries */ - get: operations["listFooter"]; - put?: never; - /** Create a new 'footer' entry */ - post: operations["createFooter"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/footer/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'footer' entry by slug */ - get: operations["getFooter"]; - /** Update 'footer' entry */ - put: operations["updateFooter"]; - post?: never; - /** Delete 'footer' entry */ - delete: operations["deleteFooter"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/footer/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'footer' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getFooterReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/fullwidth_banner": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'fullwidth_banner' entries */ - get: operations["listFullwidthBanner"]; - put?: never; - /** Create a new 'fullwidth_banner' entry */ - post: operations["createFullwidthBanner"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/fullwidth_banner/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'fullwidth_banner' entry by slug */ - get: operations["getFullwidthBanner"]; - /** Update 'fullwidth_banner' entry */ - put: operations["updateFullwidthBanner"]; - post?: never; - /** Delete 'fullwidth_banner' entry */ - delete: operations["deleteFullwidthBanner"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/fullwidth_banner/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'fullwidth_banner' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getFullwidthBannerReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/headline": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'headline' entries */ - get: operations["listHeadline"]; - put?: never; - /** Create a new 'headline' entry */ - post: operations["createHeadline"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/headline/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'headline' entry by slug */ - get: operations["getHeadline"]; - /** Update 'headline' entry */ - put: operations["updateHeadline"]; - post?: never; - /** Delete 'headline' entry */ - delete: operations["deleteHeadline"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/headline/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'headline' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getHeadlineReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/html": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'html' entries */ - get: operations["listHtml"]; - put?: never; - /** Create a new 'html' entry */ - post: operations["createHtml"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/html/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'html' entry by slug */ - get: operations["getHtml"]; - /** Update 'html' entry */ - put: operations["updateHtml"]; - post?: never; - /** Delete 'html' entry */ - delete: operations["deleteHtml"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/html/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'html' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getHtmlReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/iframe": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'iframe' entries */ - get: operations["listIframe"]; - put?: never; - /** Create a new 'iframe' entry */ - post: operations["createIframe"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/iframe/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'iframe' entry by slug */ - get: operations["getIframe"]; - /** Update 'iframe' entry */ - put: operations["updateIframe"]; - post?: never; - /** Delete 'iframe' entry */ - delete: operations["deleteIframe"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/iframe/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'iframe' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getIframeReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/image": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'image' entries */ - get: operations["listImage"]; - put?: never; - /** Create a new 'image' entry */ - post: operations["createImage"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/image/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'image' entry by slug */ - get: operations["getImage"]; - /** Update 'image' entry */ - put: operations["updateImage"]; - post?: never; - /** Delete 'image' entry */ - delete: operations["deleteImage"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/image/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'image' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getImageReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/image_gallery": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'image_gallery' entries */ - get: operations["listImageGallery"]; - put?: never; - /** Create a new 'image_gallery' entry */ - post: operations["createImageGallery"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/image_gallery/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'image_gallery' entry by slug */ - get: operations["getImageGallery"]; - /** Update 'image_gallery' entry */ - put: operations["updateImageGallery"]; - post?: never; - /** Delete 'image_gallery' entry */ - delete: operations["deleteImageGallery"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/image_gallery/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'image_gallery' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getImageGalleryReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/img": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'img' entries */ - get: operations["listImg"]; - put?: never; - /** Create a new 'img' entry */ - post: operations["createImg"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/img/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'img' entry by slug */ - get: operations["getImg"]; - /** Update 'img' entry */ - put: operations["updateImg"]; - post?: never; - /** Delete 'img' entry */ - delete: operations["deleteImg"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/img/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'img' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getImgReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/link": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'link' entries */ - get: operations["listLink"]; - put?: never; - /** Create a new 'link' entry */ - post: operations["createLink"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/link/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'link' entry by slug */ - get: operations["getLink"]; - /** Update 'link' entry */ - put: operations["updateLink"]; - post?: never; - /** Delete 'link' entry */ - delete: operations["deleteLink"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/link/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'link' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getLinkReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/link_list": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'link_list' entries */ - get: operations["listLinkList"]; - put?: never; - /** Create a new 'link_list' entry */ - post: operations["createLinkList"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/link_list/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'link_list' entry by slug */ - get: operations["getLinkList"]; - /** Update 'link_list' entry */ - put: operations["updateLinkList"]; - post?: never; - /** Delete 'link_list' entry */ - delete: operations["deleteLinkList"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/link_list/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'link_list' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getLinkListReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/list": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'list' entries */ - get: operations["listList"]; - put?: never; - /** Create a new 'list' entry */ - post: operations["createList"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/list/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'list' entry by slug */ - get: operations["getList"]; - /** Update 'list' entry */ - put: operations["updateList"]; - post?: never; - /** Delete 'list' entry */ - delete: operations["deleteList"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/list/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'list' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getListReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/markdown": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'markdown' entries */ - get: operations["listMarkdown"]; - put?: never; - /** Create a new 'markdown' entry */ - post: operations["createMarkdown"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/markdown/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'markdown' entry by slug */ - get: operations["getMarkdown"]; - /** Update 'markdown' entry */ - put: operations["updateMarkdown"]; - post?: never; - /** Delete 'markdown' entry */ - delete: operations["deleteMarkdown"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/markdown/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'markdown' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getMarkdownReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/navgroup": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'navgroup' entries */ - get: operations["listNavgroup"]; - put?: never; - /** Create a new 'navgroup' entry */ - post: operations["createNavgroup"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/navgroup/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'navgroup' entry by slug */ - get: operations["getNavgroup"]; - /** Update 'navgroup' entry */ - put: operations["updateNavgroup"]; - post?: never; - /** Delete 'navgroup' entry */ - delete: operations["deleteNavgroup"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/navgroup/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'navgroup' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getNavgroupReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/navigation": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'navigation' entries */ - get: operations["listNavigation"]; - put?: never; - /** Create a new 'navigation' entry */ - post: operations["createNavigation"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/navigation/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'navigation' entry by slug */ - get: operations["getNavigation"]; - /** Update 'navigation' entry */ - put: operations["updateNavigation"]; - post?: never; - /** Delete 'navigation' entry */ - delete: operations["deleteNavigation"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/navigation/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'navigation' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getNavigationReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/opnform": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'opnform' entries */ - get: operations["listOpnform"]; - put?: never; - /** Create a new 'opnform' entry */ - post: operations["createOpnform"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/opnform/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'opnform' entry by slug */ - get: operations["getOpnform"]; - /** Update 'opnform' entry */ - put: operations["updateOpnform"]; - post?: never; - /** Delete 'opnform' entry */ - delete: operations["deleteOpnform"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/opnform/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'opnform' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getOpnformReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/organisation": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'organisation' entries */ - get: operations["listOrganisation"]; - put?: never; - /** Create a new 'organisation' entry */ - post: operations["createOrganisation"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/organisation/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'organisation' entry by slug */ - get: operations["getOrganisation"]; - /** Update 'organisation' entry */ - put: operations["updateOrganisation"]; - post?: never; - /** Delete 'organisation' entry */ - delete: operations["deleteOrganisation"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/organisation/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'organisation' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getOrganisationReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/organisations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'organisations' entries */ - get: operations["listOrganisations"]; - put?: never; - /** Create a new 'organisations' entry */ - post: operations["createOrganisations"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/organisations/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'organisations' entry by slug */ - get: operations["getOrganisations"]; - /** Update 'organisations' entry */ - put: operations["updateOrganisations"]; - post?: never; - /** Delete 'organisations' entry */ - delete: operations["deleteOrganisations"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/organisations/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'organisations' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getOrganisationsReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/page": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'page' entries */ - get: operations["listPage"]; - put?: never; - /** Create a new 'page' entry */ - post: operations["createPage"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/page/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'page' entry by slug */ - get: operations["getPage"]; - /** Update 'page' entry */ - put: operations["updatePage"]; - post?: never; - /** Delete 'page' entry */ - delete: operations["deletePage"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/page/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'page' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getPageReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/page_config": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'page_config' entries */ - get: operations["listPageConfig"]; - put?: never; - /** Create a new 'page_config' entry */ - post: operations["createPageConfig"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/page_config/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'page_config' entry by slug */ - get: operations["getPageConfig"]; - /** Update 'page_config' entry */ - put: operations["updatePageConfig"]; - post?: never; - /** Delete 'page_config' entry */ - delete: operations["deletePageConfig"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/page_config/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'page_config' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getPageConfigReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/post": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'post' entries */ - get: operations["listPost"]; - put?: never; - /** Create a new 'post' entry */ - post: operations["createPost"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/post/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'post' entry by slug */ - get: operations["getPost"]; - /** Update 'post' entry */ - put: operations["updatePost"]; - post?: never; - /** Delete 'post' entry */ - delete: operations["deletePost"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/post/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'post' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getPostReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/post_overview": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'post_overview' entries */ - get: operations["listPostOverview"]; - put?: never; - /** Create a new 'post_overview' entry */ - post: operations["createPostOverview"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/post_overview/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'post_overview' entry by slug */ - get: operations["getPostOverview"]; - /** Update 'post_overview' entry */ - put: operations["updatePostOverview"]; - post?: never; - /** Delete 'post_overview' entry */ - delete: operations["deletePostOverview"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/post_overview/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'post_overview' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getPostOverviewReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/product": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'product' entries */ - get: operations["listProduct"]; - put?: never; - /** Create a new 'product' entry */ - post: operations["createProduct"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/product/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'product' entry by slug */ - get: operations["getProduct"]; - /** Update 'product' entry */ - put: operations["updateProduct"]; - post?: never; - /** Delete 'product' entry */ - delete: operations["deleteProduct"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/product/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'product' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getProductReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/quote": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'quote' entries */ - get: operations["listQuote"]; - put?: never; - /** Create a new 'quote' entry */ - post: operations["createQuote"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/quote/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'quote' entry by slug */ - get: operations["getQuote"]; - /** Update 'quote' entry */ - put: operations["updateQuote"]; - post?: never; - /** Delete 'quote' entry */ - delete: operations["deleteQuote"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/quote/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'quote' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getQuoteReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/searchable_text": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'searchable_text' entries */ - get: operations["listSearchableText"]; - put?: never; - /** Create a new 'searchable_text' entry */ - post: operations["createSearchableText"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/searchable_text/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'searchable_text' entry by slug */ - get: operations["getSearchableText"]; - /** Update 'searchable_text' entry */ - put: operations["updateSearchableText"]; - post?: never; - /** Delete 'searchable_text' entry */ - delete: operations["deleteSearchableText"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/searchable_text/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'searchable_text' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getSearchableTextReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/seo": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'seo' entries */ - get: operations["listSeo"]; - put?: never; - /** Create a new 'seo' entry */ - post: operations["createSeo"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/seo/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'seo' entry by slug */ - get: operations["getSeo"]; - /** Update 'seo' entry */ - put: operations["updateSeo"]; - post?: never; - /** Delete 'seo' entry */ - delete: operations["deleteSeo"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/seo/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'seo' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getSeoReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/tag": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'tag' entries */ - get: operations["listTag"]; - put?: never; - /** Create a new 'tag' entry */ - post: operations["createTag"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/tag/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'tag' entry by slug */ - get: operations["getTag"]; - /** Update 'tag' entry */ - put: operations["updateTag"]; - post?: never; - /** Delete 'tag' entry */ - delete: operations["deleteTag"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/tag/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'tag' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getTagReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/text_fragment": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'text_fragment' entries */ - get: operations["listTextFragment"]; - put?: never; - /** Create a new 'text_fragment' entry */ - post: operations["createTextFragment"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/text_fragment/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'text_fragment' entry by slug */ - get: operations["getTextFragment"]; - /** Update 'text_fragment' entry */ - put: operations["updateTextFragment"]; - post?: never; - /** Delete 'text_fragment' entry */ - delete: operations["deleteTextFragment"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/text_fragment/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'text_fragment' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getTextFragmentReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/top_banner": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'top_banner' entries */ - get: operations["listTopBanner"]; - put?: never; - /** Create a new 'top_banner' entry */ - post: operations["createTopBanner"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/top_banner/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'top_banner' entry by slug */ - get: operations["getTopBanner"]; - /** Update 'top_banner' entry */ - put: operations["updateTopBanner"]; - post?: never; - /** Delete 'top_banner' entry */ - delete: operations["deleteTopBanner"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/top_banner/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'top_banner' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getTopBannerReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/translation_bundle": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'translation_bundle' entries */ - get: operations["listTranslationBundle"]; - put?: never; - /** Create a new 'translation_bundle' entry */ - post: operations["createTranslationBundle"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/translation_bundle/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'translation_bundle' entry by slug */ - get: operations["getTranslationBundle"]; - /** Update 'translation_bundle' entry */ - put: operations["updateTranslationBundle"]; - post?: never; - /** Delete 'translation_bundle' entry */ - delete: operations["deleteTranslationBundle"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/translation_bundle/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'translation_bundle' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getTranslationBundleReferrers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/youtube_video": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List 'youtube_video' entries */ - get: operations["listYoutubeVideo"]; - put?: never; - /** Create a new 'youtube_video' entry */ - post: operations["createYoutubeVideo"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/youtube_video/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get 'youtube_video' entry by slug */ - get: operations["getYoutubeVideo"]; - /** Update 'youtube_video' entry */ - put: operations["updateYoutubeVideo"]; - post?: never; - /** Delete 'youtube_video' entry */ - delete: operations["deleteYoutubeVideo"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/content/youtube_video/{slug}/referrers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List referrers of 'youtube_video' entry - * @description Returns all entries that reference this entry (reverse index). Empty when not using referrer index (e.g. with RUSTYCMS_ENVIRONMENTS). - */ - get: operations["getYoutubeVideoReferrers"]; - put?: never; - post?: never; + post: operations["mintPreviewToken"]; delete?: never; options?: never; head?: never; @@ -2815,8 +274,8 @@ export interface paths { cookie?: never; }; /** - * Transform image from external URL - * @description Fetches an image from the given URL and returns it resized/cropped. Supports JPEG, PNG, WebP, AVIF output. + * Transform an image + * @description Fetches an image and returns it resized/cropped/reformatted. Source can be an absolute URL (allowlist-gated) or a relative /api/assets/... path (served directly from the asset store, no HTTP roundtrip). EXIF orientation is applied before any geometry op. Supports JPEG, PNG, WebP, AVIF. */ get: operations["transformImage"]; put?: never; @@ -2827,6 +286,66 @@ export interface paths { patch?: never; trace?: never; }; + "/api/transform/lqip": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Decode blurhash to tiny JPEG placeholder + * @description Returns a small JPEG rendered from a blurhash string. Immutable cache headers — hashes are content-addressed. + */ + get: operations["transformLqip"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/transform/metadata": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Image metadata + blurhash + * @description Returns width, height, aspect ratio, alpha flag, dominant color and blurhash for an image. Same URL resolution rules as /api/transform (asset-shortcut + allowlist). + */ + get: operations["transformMetadata"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/transform/srcset": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Precomputed srcset URLs (no image fetched) + * @description Composes ready-to-use sources + fallback URL for each (format × width). The source image is not fetched — this endpoint just builds URLs. + */ + get: operations["transformSrcset"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; } export type webhooks = Record; export interface components { @@ -2841,2581 +360,34 @@ export interface components { /** @description URL path to serve the asset (e.g. /api/assets/hero.jpg) */ url?: string; }; - badge: { + EnvironmentLocales: { + /** @description First entry in `locales`, or null when i18n is off */ + default?: string | null; + /** @description Global fallback list for UI diffing / reset */ + global?: string[]; + /** @description Active locale list (override if present, otherwise global fallback) */ + locales?: string[]; + /** @description Locale sub-directories present on disk. Values NOT in `locales` are orphans ("Karteileichen"). */ + on_disk?: string[]; + /** @description True when the space has its own `.rustycms.json5` override */ + override?: boolean; + }; + note: { /** @description Entry identifier (filename) */ readonly _slug?: string; - /** @description Optional color hint (e.g. green, #4caf50, CSS class name) */ - color?: string; - /** @description Display label shown in UI (e.g. Gründungsmitglied) */ - label: string; - /** @description Internal key (e.g. gruendungsmitglied) */ - name: string; - }; - badge_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Optional color hint (e.g. green, #4caf50, CSS class name) */ - color?: string; - /** @description Display label shown in UI (e.g. Gründungsmitglied) */ - label: string; - /** @description Internal key (e.g. gruendungsmitglied) */ - name: string; - }; - calendar: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** - * @description Include entries from post (optional) - * @default false - */ - fromPost: boolean; - /** @description Calendar entries (references to calendar_item) */ - items?: string[]; - }; - calendar_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** - * @description Include entries from post (optional) - * @default false - */ - fromPost: boolean; - /** @description Calendar entries (references to calendar_item) */ - items?: string[]; - }; - calendar_item: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Event description (optional) */ - description?: string; - /** @description Optional link (e.g. registration or details page) */ - link?: string; - /** - * Format: date-time - * @description Event date/time - */ - terminZeit: string; - /** @description Event title */ + /** @description Note content as markdown */ + body?: string; + /** @description Title of the note */ title: string; }; - calendar_item_input: { + note_input: { /** @description URL slug (used as filename) */ _slug: string; - /** @description Event description (optional) */ - description?: string; - /** @description Optional link (e.g. registration or details page) */ - link?: string; - /** - * Format: date-time - * @description Event date/time - */ - terminZeit: string; - /** @description Event title */ + /** @description Note content as markdown */ + body?: string; + /** @description Title of the note */ title: string; }; - campaign: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Optional CSS */ - css?: string; - /** @description HTML content (optional) */ - html?: string; - /** - * @description Position relative to selector - * @default beforeend - * @enum {string} - */ - insertHtml: "afterbegin" | "beforeend" | "afterend" | "beforebegin" | "replace"; - /** @description Optional JavaScript */ - javascript?: string; - /** @description Media/images (optional) */ - medias?: string[]; - /** @description CSS selector where content is inserted */ - selector: string; - /** - * Format: date-time - * @description Campaign end time (optional) - */ - timeUntil?: string; - /** @description URL pattern (e.g. regex) where campaign applies */ - urlPattern: string; - }; - campaign_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Optional CSS */ - css?: string; - /** @description HTML content (optional) */ - html?: string; - /** - * @description Position relative to selector - * @default beforeend - * @enum {string} - */ - insertHtml: "afterbegin" | "beforeend" | "afterend" | "beforebegin" | "replace"; - /** @description Optional JavaScript */ - javascript?: string; - /** @description Media/images (optional) */ - medias?: string[]; - /** @description CSS selector where content is inserted */ - selector: string; - /** - * Format: date-time - * @description Campaign end time (optional) - */ - timeUntil?: string; - /** @description URL pattern (e.g. regex) where campaign applies */ - urlPattern: string; - }; - campaigns: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Campaign list (optional) */ - campaigns?: string[]; - /** - * @description Campaigns enabled - * @default true - */ - enable: boolean; - /** @description Unique ID (e.g. campaigns-global) */ - id: string; - }; - campaigns_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Campaign list (optional) */ - campaigns?: string[]; - /** - * @description Campaigns enabled - * @default true - */ - enable: boolean; - /** @description Unique ID (e.g. campaigns-global) */ - id: string; - }; - content_layout: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** - * @description Align items for row 1 - * @default stretch - * @enum {string} - */ - row1AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 1 (references to markdown, headline, image, etc.) */ - row1Content?: string[]; - /** - * @description Justify content for row 1 - * @default start - * @enum {string} - */ - row1JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row2AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 2 */ - row2Content?: string[]; - /** - * @description Row 2: justify content - * @default start - * @enum {string} - */ - row2JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row3AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 3 */ - row3Content?: string[]; - /** - * @description Row 3: justify content - * @default start - * @enum {string} - */ - row3JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - }; - content_layout_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** - * @description Align items for row 1 - * @default stretch - * @enum {string} - */ - row1AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 1 (references to markdown, headline, image, etc.) */ - row1Content?: string[]; - /** - * @description Justify content for row 1 - * @default start - * @enum {string} - */ - row1JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row2AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 2 */ - row2Content?: string[]; - /** - * @description Row 2: justify content - * @default start - * @enum {string} - */ - row2JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row3AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 3 */ - row3Content?: string[]; - /** - * @description Row 3: justify content - * @default start - * @enum {string} - */ - row3JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - }; - demo: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description html – HTML content */ - bodyHtml?: string; - /** @description markdown – Markdown content */ - bodyMarkdown?: string; - /** @description richtext – rich text editor */ - bodyRichtext?: string; - /** @description textOrRef – inline text or file:path to load from file */ - bodyTextOrRef?: string; - /** @description number – floating point */ - count?: number; - /** @description string + widget: code, codeLanguage: css – code field with syntax highlighting and copy */ - css?: string; - /** @description boolean – checkbox, true/false */ - isActive?: boolean; - /** @description array – items type string (list of strings) */ - labels?: string[]; - /** @description object – image asset with src and alt text */ - mainImage?: { - /** @description Alt text (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - /** @description object – fixed sub-fields (key, value) */ - meta?: { - key?: string; - value?: string; - }; - /** - * Format: date-time - * @description datetime – ISO 8601 date-time - */ - publishedAt?: string; - /** @description integer – whole number */ - quantity?: number; - /** @description referenceOrInline – slug ref or inline object (collection must exist) */ - relatedPage?: string | { - /** @description Page headline */ - headline: string; - /** @description Icon identifier (optional) */ - icon?: string; - /** @description Display name in navigation */ - linkName: string; - /** @description Internal page name */ - name: string; - /** - * @description Align items for row 1 - * @default stretch - * @enum {string} - */ - row1AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 1 (references to markdown, headline, image, etc.) */ - row1Content?: string[]; - /** - * @description Justify content for row 1 - * @default start - * @enum {string} - */ - row1JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row2AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 2 */ - row2Content?: string[]; - /** - * @description Row 2: justify content - * @default start - * @enum {string} - */ - row2JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row3AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 3 */ - row3Content?: string[]; - /** - * @description Row 3: justify content - * @default start - * @enum {string} - */ - row3JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** @description Meta description for search engines (optional) */ - seoDescription?: string; - /** - * @description Robots meta directive - * @default index, follow - * @enum {string} - */ - seoMetaRobots: "index, follow" | "noindex, follow" | "index, nofollow" | "noindex, nofollow"; - /** @description SEO page title (browser tab, search results) */ - seoTitle: string; - /** @description URL slug */ - slug: string; - /** @description Optional subheadline */ - subheadline?: string; - /** @description Hero banner at the top */ - topFullwidthBanner?: string; - }; - /** @description array – items type reference (slugs to page collection) */ - relatedPages?: string[]; - /** @description array – items type number */ - scores?: number[]; - /** - * @description string + enum – single-value dropdown (Select) - * @enum {string} - */ - singleSelect?: "A" | "B" | "C"; - /** @description string – single line, optional */ - summary?: string; - /** - * @description multiSelect + enum – checkboxes, value is string[] - * @enum {string} - */ - tags?: "news" | "tutorial" | "announcement"; - /** @description string – single line (required) */ - title: string; - }; - demo_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description html – HTML content */ - bodyHtml?: string; - /** @description markdown – Markdown content */ - bodyMarkdown?: string; - /** @description richtext – rich text editor */ - bodyRichtext?: string; - /** @description textOrRef – inline text or file:path to load from file */ - bodyTextOrRef?: string; - /** @description number – floating point */ - count?: number; - /** @description string + widget: code, codeLanguage: css – code field with syntax highlighting and copy */ - css?: string; - /** @description boolean – checkbox, true/false */ - isActive?: boolean; - /** @description array – items type string (list of strings) */ - labels?: string[]; - /** @description object – image asset with src and alt text */ - mainImage?: { - /** @description Alt text (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - /** @description object – fixed sub-fields (key, value) */ - meta?: { - key?: string; - value?: string; - }; - /** - * Format: date-time - * @description datetime – ISO 8601 date-time - */ - publishedAt?: string; - /** @description integer – whole number */ - quantity?: number; - /** @description referenceOrInline – slug ref or inline object (collection must exist) */ - relatedPage?: string | { - /** @description Page headline */ - headline: string; - /** @description Icon identifier (optional) */ - icon?: string; - /** @description Display name in navigation */ - linkName: string; - /** @description Internal page name */ - name: string; - /** - * @description Align items for row 1 - * @default stretch - * @enum {string} - */ - row1AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 1 (references to markdown, headline, image, etc.) */ - row1Content?: string[]; - /** - * @description Justify content for row 1 - * @default start - * @enum {string} - */ - row1JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row2AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 2 */ - row2Content?: string[]; - /** - * @description Row 2: justify content - * @default start - * @enum {string} - */ - row2JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row3AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 3 */ - row3Content?: string[]; - /** - * @description Row 3: justify content - * @default start - * @enum {string} - */ - row3JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** @description Meta description for search engines (optional) */ - seoDescription?: string; - /** - * @description Robots meta directive - * @default index, follow - * @enum {string} - */ - seoMetaRobots: "index, follow" | "noindex, follow" | "index, nofollow" | "noindex, nofollow"; - /** @description SEO page title (browser tab, search results) */ - seoTitle: string; - /** @description URL slug */ - slug: string; - /** @description Optional subheadline */ - subheadline?: string; - /** @description Hero banner at the top */ - topFullwidthBanner?: string; - }; - /** @description array – items type reference (slugs to page collection) */ - relatedPages?: string[]; - /** @description array – items type number */ - scores?: number[]; - /** - * @description string + enum – single-value dropdown (Select) - * @enum {string} - */ - singleSelect?: "A" | "B" | "C"; - /** @description string – single line, optional */ - summary?: string; - /** - * @description multiSelect + enum – checkboxes, value is string[] - * @enum {string} - */ - tags?: "news" | "tutorial" | "announcement"; - /** @description string – single line (required) */ - title: string; - }; - footer: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Unique footer ID (e.g. footer-main) */ - id: string; - /** - * @description Align items for row 1 - * @default stretch - * @enum {string} - */ - row1AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 1 (references to markdown, headline, image, etc.) */ - row1Content?: string[]; - /** - * @description Justify content for row 1 - * @default start - * @enum {string} - */ - row1JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row2AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 2 */ - row2Content?: string[]; - /** - * @description Row 2: justify content - * @default start - * @enum {string} - */ - row2JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row3AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 3 */ - row3Content?: string[]; - /** - * @description Row 3: justify content - * @default start - * @enum {string} - */ - row3JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - }; - footer_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Unique footer ID (e.g. footer-main) */ - id: string; - /** - * @description Align items for row 1 - * @default stretch - * @enum {string} - */ - row1AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 1 (references to markdown, headline, image, etc.) */ - row1Content?: string[]; - /** - * @description Justify content for row 1 - * @default start - * @enum {string} - */ - row1JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row2AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 2 */ - row2Content?: string[]; - /** - * @description Row 2: justify content - * @default start - * @enum {string} - */ - row2JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row3AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 3 */ - row3Content?: string[]; - /** - * @description Row 3: justify content - * @default start - * @enum {string} - */ - row3JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - }; - fullwidth_banner: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Banner headline */ - headline?: string; - /** @description Banner image (optional) */ - image?: { - /** @description Alt text (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - /** @description Internal name */ - name: string; - /** @description Optional subheadline */ - subheadline?: string; - /** @description Banner body text (optional) */ - text?: string; - /** - * @description Color variant - * @default light - * @enum {string} - */ - variant: "dark" | "light"; - }; - fullwidth_banner_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Banner headline */ - headline?: string; - /** @description Banner image (optional) */ - image?: { - /** @description Alt text (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - /** @description Internal name */ - name: string; - /** @description Optional subheadline */ - subheadline?: string; - /** @description Banner body text (optional) */ - text?: string; - /** - * @description Color variant - * @default light - * @enum {string} - */ - variant: "dark" | "light"; - }; - headline: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** - * @description Text alignment - * @default left - * @enum {string} - */ - align: "left" | "center" | "right"; - /** @description Internal key (optional) */ - internal?: string; - /** @description Column width (grid) */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** - * @description HTML tag (h1–h6). Default: h2 - * @default h2 - * @enum {string} - */ - tag: "h1" | "h2" | "h3" | "h4" | "h5" | "h6"; - /** @description Headline text */ - text: string; - }; - headline_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** - * @description Text alignment - * @default left - * @enum {string} - */ - align: "left" | "center" | "right"; - /** @description Internal key (optional) */ - internal?: string; - /** @description Column width (grid) */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** - * @description HTML tag (h1–h6). Default: h2 - * @default h2 - * @enum {string} - */ - tag: "h1" | "h2" | "h3" | "h4" | "h5" | "h6"; - /** @description Headline text */ - text: string; - }; - html: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description HTML content (safely embedded) */ - html: string; - /** @description Unique component ID */ - id: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - }; - html_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description HTML content (safely embedded) */ - html: string; - /** @description Unique component ID */ - id: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - }; - iframe: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Description/content for iframe */ - content: string; - /** @description Iframe URL or embed code */ - iframe: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Internal component name */ - name: string; - /** @description Optional overlay image */ - overlayImage?: { - /** @description Alt text (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - }; - iframe_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Description/content for iframe */ - content: string; - /** @description Iframe URL or embed code */ - iframe: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Internal component name */ - name: string; - /** @description Optional overlay image */ - overlayImage?: { - /** @description Alt text (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - }; - image: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** - * @description Aspect ratio - * @default 4:3 - * @enum {string} - */ - aspectRatio: "1:1" | "4:3" | "3:2" | "16:9" | "21:9" | "2:3" | "3:4"; - /** @description Image caption */ - caption?: string; - /** @description Image asset */ - img: { - /** @description Alt text (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - /** @description Column width (grid) */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Max width in px */ - maxWidth?: number; - /** @description Internal component name */ - name: string; - }; - image_gallery: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Gallery description (optional) */ - description?: string; - /** @description Bilder (Asset-URL + optionale Bildunterschrift) */ - images: { - /** @description Bildunterschrift / Alt-Text (optional) */ - description?: string; - /** @description Asset URL */ - src: string; - }[]; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Internal gallery name */ - name: string; - }; - image_gallery_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Gallery description (optional) */ - description?: string; - /** @description Bilder (Asset-URL + optionale Bildunterschrift) */ - images: { - /** @description Bildunterschrift / Alt-Text (optional) */ - description?: string; - /** @description Asset URL */ - src: string; - }[]; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Internal gallery name */ - name: string; - }; - image_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** - * @description Aspect ratio - * @default 4:3 - * @enum {string} - */ - aspectRatio: "1:1" | "4:3" | "3:2" | "16:9" | "21:9" | "2:3" | "3:4"; - /** @description Image caption */ - caption?: string; - /** @description Image asset */ - img: { - /** @description Alt text (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - /** @description Column width (grid) */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Max width in px */ - maxWidth?: number; - /** @description Internal component name */ - name: string; - }; - img: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Alt text / description for accessibility */ - description?: string; - /** @description Image URL (e.g. /api/assets/…). Use widget for picker. */ - src: string; - }; - img_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Alt text / description for accessibility */ - description?: string; - /** @description Image URL (e.g. /api/assets/…). Use widget for picker. */ - src: string; - }; - link: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Alt text (e.g. for icon). Not used in app. */ - alt?: string; - /** @description Author (e.g. for sources). Not used in app. */ - author?: string; - /** @description Color (e.g. for buttons). Not used in app. */ - color?: string; - /** @description Date (e.g. publication). Not used in app. */ - date?: string; - /** @description Optional description. Not used in app. */ - description?: string; - /** - * @description External link. Not used in app. - * @default false - */ - external: boolean; - /** @description Icon identifier (e.g. Iconify). Used for social links; fallback 'mdi:link'. */ - icon?: string; - /** @description Internal key. Not used in app. */ - internal?: string; - /** @description Display name/label. Used in navigation and LinkListBlock. */ - linkName: string; - /** @description Internal link name. Fallback for linkName (e.g. in layout). */ - name?: string; - /** - * @description Open in new tab (LinkListBlock: target=_blank, rel=noopener noreferrer). - * @default false - */ - newTab: boolean; - /** - * @description Show text. Not used in app. - * @default true - */ - showText: boolean; - /** @description Source. Not used in app. */ - source?: string; - /** @description Target URL (href). Used everywhere: navigation, social, LinkListBlock. */ - url: string; - }; - link_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Alt text (e.g. for icon). Not used in app. */ - alt?: string; - /** @description Author (e.g. for sources). Not used in app. */ - author?: string; - /** @description Color (e.g. for buttons). Not used in app. */ - color?: string; - /** @description Date (e.g. publication). Not used in app. */ - date?: string; - /** @description Optional description. Not used in app. */ - description?: string; - /** - * @description External link. Not used in app. - * @default false - */ - external: boolean; - /** @description Icon identifier (e.g. Iconify). Used for social links; fallback 'mdi:link'. */ - icon?: string; - /** @description Internal key. Not used in app. */ - internal?: string; - /** @description Display name/label. Used in navigation and LinkListBlock. */ - linkName: string; - /** @description Internal link name. Fallback for linkName (e.g. in layout). */ - name?: string; - /** - * @description Open in new tab (LinkListBlock: target=_blank, rel=noopener noreferrer). - * @default false - */ - newTab: boolean; - /** - * @description Show text. Not used in app. - * @default true - */ - showText: boolean; - /** @description Source. Not used in app. */ - source?: string; - /** @description Target URL (href). Used everywhere: navigation, social, LinkListBlock. */ - url: string; - }; - link_list: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Link list headline */ - headline: string; - /** @description Links (references to link) */ - links: string[]; - }; - link_list_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Link list headline */ - headline: string; - /** @description Links (references to link) */ - links: string[]; - }; - list: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Internal key (optional) */ - internal?: string; - /** @description List entries */ - item: string[]; - }; - list_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Internal key (optional) */ - internal?: string; - /** @description List entries */ - item: string[]; - }; - markdown: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** - * @description Text alignment - * @default left - * @enum {string} - */ - alignment: "left" | "center" | "right"; - /** @description Markdown/body: inline text or file reference (e.g. file:slug.content.md) */ - content?: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Internal component name */ - name: string; - }; - markdown_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** - * @description Text alignment - * @default left - * @enum {string} - */ - alignment: "left" | "center" | "right"; - /** @description Markdown/body: inline text or file reference (e.g. file:slug.content.md) */ - content?: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Internal component name */ - name: string; - }; - navgroup: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Display label of the group */ - label: string; - /** @description Sub-links shown in the dropdown */ - links: string[]; - /** @description Optional URL for the group label itself */ - url?: string; - }; - navgroup_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Display label of the group */ - label: string; - /** @description Sub-links shown in the dropdown */ - links: string[]; - /** @description Optional URL for the group label itself */ - url?: string; - }; - navigation: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Internal key (e.g. navigation-header, navigation-footer) */ - internal: string; - /** @description Navigation entries (references to link, page or post) */ - links: string[]; - /** @description Display name of navigation */ - name: string; - }; - navigation_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Internal key (e.g. navigation-header, navigation-footer) */ - internal: string; - /** @description Navigation entries (references to link, page or post) */ - links: string[]; - /** @description Display name of navigation */ - name: string; - }; - opnform: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description OpnForm instance origin without trailing slash (default: https://opnform.pm86.de) */ - baseUrl?: string; - /** @description Form slug from OpnForm URL path, e.g. contact-form-ojxxgb */ - formId: string; - /** @description Unique component ID (internal) */ - id: string; - /** @description Accessible title for the iframe */ - iframeTitle?: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - }; - opnform_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description OpnForm instance origin without trailing slash (default: https://opnform.pm86.de) */ - baseUrl?: string; - /** @description Form slug from OpnForm URL path, e.g. contact-form-ojxxgb */ - formId: string; - /** @description Unique component ID (internal) */ - id: string; - /** @description Accessible title for the iframe */ - iframeTitle?: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - }; - organisation: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Badge label for this organisation (exactly one) */ - badge?: string; - /** @description Short description of the organisation (Markdown) */ - description?: string; - /** @description Optional link (website, contact, etc.) */ - link?: string; - /** @description Optional logo image */ - logo?: { - /** @description Alt text (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - /** @description Organisation name */ - name: string; - }; - organisation_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Badge label for this organisation (exactly one) */ - badge?: string; - /** @description Short description of the organisation (Markdown) */ - description?: string; - /** @description Optional link (website, contact, etc.) */ - link?: string; - /** @description Optional logo image */ - logo?: { - /** @description Alt text (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - /** @description Organisation name */ - name: string; - }; - organisations: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Optional CTA link in the dashed card (label from link.linkName) */ - addOrganisationLink?: string; - /** @description Optional markdown body for the dashed CTA card (no link here; use addOrganisationLink) */ - addOrganisationMarkdown?: string; - /** @description Optional section title shown above the organisation list */ - addOrganisationTitle?: string; - /** @description Restrict which badges may be assigned to organisations in this block */ - allowedBadges?: string[]; - /** @description Optional intro text (Markdown) */ - description?: string; - /** @description Optional block headline */ - headline?: string; - /** @description List of organisations */ - organisations?: string[]; - /** - * @description Darstellung: default (große Karten) oder compact (kompaktere Zeilenkarten) - * @default default - * @enum {string} - */ - presentation: "default" | "compact"; - }; - organisations_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Optional CTA link in the dashed card (label from link.linkName) */ - addOrganisationLink?: string; - /** @description Optional markdown body for the dashed CTA card (no link here; use addOrganisationLink) */ - addOrganisationMarkdown?: string; - /** @description Optional section title shown above the organisation list */ - addOrganisationTitle?: string; - /** @description Restrict which badges may be assigned to organisations in this block */ - allowedBadges?: string[]; - /** @description Optional intro text (Markdown) */ - description?: string; - /** @description Optional block headline */ - headline?: string; - /** @description List of organisations */ - organisations?: string[]; - /** - * @description Darstellung: default (große Karten) oder compact (kompaktere Zeilenkarten) - * @default default - * @enum {string} - */ - presentation: "default" | "compact"; - }; - page: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Page headline */ - headline: string; - /** @description Icon identifier (optional) */ - icon?: string; - /** @description Display name in navigation */ - linkName: string; - /** @description Internal page name */ - name: string; - /** - * @description Align items for row 1 - * @default stretch - * @enum {string} - */ - row1AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 1 (references to markdown, headline, image, etc.) */ - row1Content?: string[]; - /** - * @description Justify content for row 1 - * @default start - * @enum {string} - */ - row1JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row2AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 2 */ - row2Content?: string[]; - /** - * @description Row 2: justify content - * @default start - * @enum {string} - */ - row2JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row3AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 3 */ - row3Content?: string[]; - /** - * @description Row 3: justify content - * @default start - * @enum {string} - */ - row3JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** @description Meta description for search engines (optional) */ - seoDescription?: string; - /** - * @description Robots meta directive - * @default index, follow - * @enum {string} - */ - seoMetaRobots: "index, follow" | "noindex, follow" | "index, nofollow" | "noindex, nofollow"; - /** @description SEO page title (browser tab, search results) */ - seoTitle: string; - /** @description URL slug */ - slug: string; - /** @description Optional subheadline */ - subheadline?: string; - /** @description Hero banner at the top */ - topFullwidthBanner?: string; - }; - page_config: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Headline for blog overview page (optional) */ - blogPostsPageHeadline?: string; - /** @description Subheadline for blog overview page (optional) */ - blogPostsPageSubHeadline?: string; - /** @description Headline for tag page (optional) */ - blogTagPageHeadline?: string; - /** @description Footer text (e.g. copyright) */ - footerText1: string; - /** @description Logo image */ - logo: { - /** @description Alt text (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - /** @description HTML/JS snippet injected below each post. Use {{PAGE_ID}}, {{PAGE_URL}}, {{PAGE_TITLE}} as placeholders. */ - postCommentSlot?: string; - /** @description Default meta description */ - seoDescription: string; - /** @description Default SEO title for website */ - seoTitle: string; - /** @description Site name */ - siteName: string; - /** @description Website URL */ - website: string; - }; - page_config_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Headline for blog overview page (optional) */ - blogPostsPageHeadline?: string; - /** @description Subheadline for blog overview page (optional) */ - blogPostsPageSubHeadline?: string; - /** @description Headline for tag page (optional) */ - blogTagPageHeadline?: string; - /** @description Footer text (e.g. copyright) */ - footerText1: string; - /** @description Logo image */ - logo: { - /** @description Alt text (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - /** @description HTML/JS snippet injected below each post. Use {{PAGE_ID}}, {{PAGE_URL}}, {{PAGE_TITLE}} as placeholders. */ - postCommentSlot?: string; - /** @description Default meta description */ - seoDescription: string; - /** @description Default SEO title for website */ - seoTitle: string; - /** @description Site name */ - siteName: string; - /** @description Website URL */ - website: string; - }; - page_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Page headline */ - headline: string; - /** @description Icon identifier (optional) */ - icon?: string; - /** @description Display name in navigation */ - linkName: string; - /** @description Internal page name */ - name: string; - /** - * @description Align items for row 1 - * @default stretch - * @enum {string} - */ - row1AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 1 (references to markdown, headline, image, etc.) */ - row1Content?: string[]; - /** - * @description Justify content for row 1 - * @default start - * @enum {string} - */ - row1JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row2AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 2 */ - row2Content?: string[]; - /** - * @description Row 2: justify content - * @default start - * @enum {string} - */ - row2JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row3AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 3 */ - row3Content?: string[]; - /** - * @description Row 3: justify content - * @default start - * @enum {string} - */ - row3JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** @description Meta description for search engines (optional) */ - seoDescription?: string; - /** - * @description Robots meta directive - * @default index, follow - * @enum {string} - */ - seoMetaRobots: "index, follow" | "noindex, follow" | "index, nofollow" | "noindex, nofollow"; - /** @description SEO page title (browser tab, search results) */ - seoTitle: string; - /** @description URL slug */ - slug: string; - /** @description Optional subheadline */ - subheadline?: string; - /** @description Hero banner at the top */ - topFullwidthBanner?: string; - }; - post: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Post body (Markdown) */ - content: string; - /** Format: date-time */ - readonly created?: string; - /** - * Format: date-time - * @description Event date and time - */ - eventDate?: string; - /** @description Event location */ - eventLocation?: { - /** @description Latitude (optional, for map) */ - lat?: number; - /** @description Longitude (optional, for map) */ - lng?: number; - /** @description Address / description (e.g. Town hall Schleusingen) */ - text?: string; - }; - /** @description Short summary for previews */ - excerpt?: string; - /** @description Post headline */ - headline: string; - /** - * @description Hide this post from all listing pages (still accessible via direct URL) - * @default false - */ - hideFromListing: boolean; - /** @description Optional icon identifier */ - icon?: string; - /** - * @description Mark post as important - * @default false - */ - important: boolean; - /** - * @description This post is an event - * @default false - */ - isEvent: boolean; - /** @description Display name (e.g. in navigation or link lists) */ - linkName: string; - /** @description Featured image */ - postImage?: { - /** @description Alt text / caption (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - /** @description Associated tags */ - postTag?: string[]; - /** - * @description Align items for row 1 - * @default stretch - * @enum {string} - */ - row1AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 1 (references to markdown, headline, image, etc.) */ - row1Content?: string[]; - /** - * @description Justify content for row 1 - * @default start - * @enum {string} - */ - row1JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row2AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 2 */ - row2Content?: string[]; - /** - * @description Row 2: justify content - * @default start - * @enum {string} - */ - row2JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row3AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 3 */ - row3Content?: string[]; - /** - * @description Row 3: justify content - * @default start - * @enum {string} - */ - row3JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** @description Meta description for search engines (optional) */ - seoDescription?: string; - /** - * @description Robots meta directive - * @default index, follow - * @enum {string} - */ - seoMetaRobots: "index, follow" | "noindex, follow" | "index, nofollow" | "noindex, nofollow"; - /** @description SEO page title (browser tab, search results) */ - seoTitle: string; - /** - * @description Show comment section (default: true) - * @default true - */ - showCommentSection: boolean; - /** @description URL slug (e.g. demo-260325-suhl-regionalplan) */ - slug: string; - /** @description Optional subheadline below headline */ - subheadline?: string; - }; - post_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Post body (Markdown) */ - content: string; - /** - * Format: date-time - * @description Event date and time - */ - eventDate?: string; - /** @description Event location */ - eventLocation?: { - /** @description Latitude (optional, for map) */ - lat?: number; - /** @description Longitude (optional, for map) */ - lng?: number; - /** @description Address / description (e.g. Town hall Schleusingen) */ - text?: string; - }; - /** @description Short summary for previews */ - excerpt?: string; - /** @description Post headline */ - headline: string; - /** - * @description Hide this post from all listing pages (still accessible via direct URL) - * @default false - */ - hideFromListing: boolean; - /** @description Optional icon identifier */ - icon?: string; - /** - * @description Mark post as important - * @default false - */ - important: boolean; - /** - * @description This post is an event - * @default false - */ - isEvent: boolean; - /** @description Display name (e.g. in navigation or link lists) */ - linkName: string; - /** @description Featured image */ - postImage?: { - /** @description Alt text / caption (optional) */ - description?: string; - /** @description Asset URL */ - src?: string; - }; - /** @description Associated tags */ - postTag?: string[]; - /** - * @description Align items for row 1 - * @default stretch - * @enum {string} - */ - row1AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 1 (references to markdown, headline, image, etc.) */ - row1Content?: string[]; - /** - * @description Justify content for row 1 - * @default start - * @enum {string} - */ - row1JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row2AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 2 */ - row2Content?: string[]; - /** - * @description Row 2: justify content - * @default start - * @enum {string} - */ - row2JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row3AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 3 */ - row3Content?: string[]; - /** - * @description Row 3: justify content - * @default start - * @enum {string} - */ - row3JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** @description Meta description for search engines (optional) */ - seoDescription?: string; - /** - * @description Robots meta directive - * @default index, follow - * @enum {string} - */ - seoMetaRobots: "index, follow" | "noindex, follow" | "index, nofollow" | "noindex, nofollow"; - /** @description SEO page title (browser tab, search results) */ - seoTitle: string; - /** - * @description Show comment section (default: true) - * @default true - */ - showCommentSection: boolean; - /** @description URL slug (e.g. demo-260325-suhl-regionalplan) */ - slug: string; - /** @description Optional subheadline below headline */ - subheadline?: string; - }; - post_overview: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** - * @description Show all posts; if false, use filterByTag or posts - * @default false - */ - allPosts: boolean; - /** - * @description Display as cards or list (optional) - * @enum {string} - */ - design?: "cards" | "list"; - /** @description Only posts with these tags (optional) */ - filterByTag?: string[]; - /** @description Headline */ - headline: string; - /** @description Unique post overview ID */ - id: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Max. number of displayed entries (optional) */ - numberItems?: number; - /** @description Fixed list of posts when not allPosts (optional) */ - posts?: string[]; - /** - * @description Align items for row 1 - * @default stretch - * @enum {string} - */ - row1AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 1 (references to markdown, headline, image, etc.) */ - row1Content?: string[]; - /** - * @description Justify content for row 1 - * @default start - * @enum {string} - */ - row1JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row2AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 2 */ - row2Content?: string[]; - /** - * @description Row 2: justify content - * @default start - * @enum {string} - */ - row2JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row3AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 3 */ - row3Content?: string[]; - /** - * @description Row 3: justify content - * @default start - * @enum {string} - */ - row3JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** @description Meta description for search engines (optional) */ - seoDescription?: string; - /** - * @description Robots meta directive - * @default index, follow - * @enum {string} - */ - seoMetaRobots: "index, follow" | "noindex, follow" | "index, nofollow" | "noindex, nofollow"; - /** @description SEO page title (browser tab, search results) */ - seoTitle: string; - /** @description Intro text (optional) */ - text?: string; - }; - post_overview_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** - * @description Show all posts; if false, use filterByTag or posts - * @default false - */ - allPosts: boolean; - /** - * @description Display as cards or list (optional) - * @enum {string} - */ - design?: "cards" | "list"; - /** @description Only posts with these tags (optional) */ - filterByTag?: string[]; - /** @description Headline */ - headline: string; - /** @description Unique post overview ID */ - id: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Max. number of displayed entries (optional) */ - numberItems?: number; - /** @description Fixed list of posts when not allPosts (optional) */ - posts?: string[]; - /** - * @description Align items for row 1 - * @default stretch - * @enum {string} - */ - row1AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 1 (references to markdown, headline, image, etc.) */ - row1Content?: string[]; - /** - * @description Justify content for row 1 - * @default start - * @enum {string} - */ - row1JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row2AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 2 */ - row2Content?: string[]; - /** - * @description Row 2: justify content - * @default start - * @enum {string} - */ - row2JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** - * @default stretch - * @enum {string} - */ - row3AlignItems: "start" | "end" | "center" | "baseline" | "stretch"; - /** @description Content components for row 3 */ - row3Content?: string[]; - /** - * @description Row 3: justify content - * @default start - * @enum {string} - */ - row3JustifyContent: "start" | "end" | "center" | "between" | "around" | "evenly"; - /** @description Meta description for search engines (optional) */ - seoDescription?: string; - /** - * @description Robots meta directive - * @default index, follow - * @enum {string} - */ - seoMetaRobots: "index, follow" | "noindex, follow" | "index, nofollow" | "noindex, nofollow"; - /** @description SEO page title (browser tab, search results) */ - seoTitle: string; - /** @description Intro text (optional) */ - text?: string; - }; - product: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** - * @description Product category - * @enum {string} - */ - category: "electronics" | "clothing" | "books" | "food" | "other"; - /** - * Format: date-time - * @description Auto-set on create - */ - readonly created_at?: string; - /** @description Detailed product description (optional) */ - description?: string; - /** @description Product image URLs 1–10 (optional) */ - images?: string[]; - /** - * @description Whether the product is in stock - * @default true - */ - in_stock: boolean; - /** @description Price in EUR */ - price: number; - /** @description Average customer rating 0–5, null if unrated (optional) */ - rating?: number | null; - /** @description Stock Keeping Unit (e.g. EL-1234, BOOK-00042) */ - sku: string; - /** @description Product name */ - title: string; - }; - product_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** - * @description Product category - * @enum {string} - */ - category: "electronics" | "clothing" | "books" | "food" | "other"; - /** @description Detailed product description (optional) */ - description?: string; - /** @description Product image URLs 1–10 (optional) */ - images?: string[]; - /** - * @description Whether the product is in stock - * @default true - */ - in_stock: boolean; - /** @description Price in EUR */ - price: number; - /** @description Average customer rating 0–5, null if unrated (optional) */ - rating?: number | null; - /** @description Stock Keeping Unit (e.g. EL-1234, BOOK-00042) */ - sku: string; - /** @description Product name */ - title: string; - }; - quote: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Author or source of quote */ - author: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Quote text */ - quote: string; - /** - * @description Quote alignment - * @default left - * @enum {string} - */ - variant: "left" | "right"; - }; - quote_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Author or source of quote */ - author: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Quote text */ - quote: string; - /** - * @description Quote alignment - * @default left - * @enum {string} - */ - variant: "left" | "right"; - }; - searchable_text: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Description (optional) */ - description?: string; - /** @description Unique component ID */ - id: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Only search content with these tags (optional) */ - tagWhitelist?: string[]; - /** @description Searchable text fragments (references to text_fragment) */ - textFragments: string[]; - /** @description Search component title (optional) */ - title?: string; - }; - searchable_text_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Description (optional) */ - description?: string; - /** @description Unique component ID */ - id: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description Only search content with these tags (optional) */ - tagWhitelist?: string[]; - /** @description Searchable text fragments (references to text_fragment) */ - textFragments: string[]; - /** @description Search component title (optional) */ - title?: string; - }; - seo: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Meta description for search engines (optional) */ - seoDescription?: string; - /** - * @description Robots meta directive - * @default index, follow - * @enum {string} - */ - seoMetaRobots: "index, follow" | "noindex, follow" | "index, nofollow" | "noindex, nofollow"; - /** @description SEO page title (browser tab, search results) */ - seoTitle: string; - }; - seo_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Meta description for search engines (optional) */ - seoDescription?: string; - /** - * @description Robots meta directive - * @default index, follow - * @enum {string} - */ - seoMetaRobots: "index, follow" | "noindex, follow" | "index, nofollow" | "noindex, nofollow"; - /** @description SEO page title (browser tab, search results) */ - seoTitle: string; - }; - tag: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Optional pill color (CSS, e.g. #2d5a27 or rgb()). Admin: color picker + text field. */ - color?: string; - /** @description Optional Iconify icon id (e.g. mdi:map-marker, same as link.icon). */ - icon?: string; - /** @description Tag name (e.g. politik, termin). Must be unique. */ - name: string; - }; - tag_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Optional pill color (CSS, e.g. #2d5a27 or rgb()). Admin: color picker + text field. */ - color?: string; - /** @description Optional Iconify icon id (e.g. mdi:map-marker, same as link.icon). */ - icon?: string; - /** @description Tag name (e.g. politik, termin). Must be unique. */ - name: string; - }; - text_fragment: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Unique fragment ID */ - id: string; - /** @description Tags for categorisation (optional) */ - tags?: string[]; - /** @description Searchable text content */ - text: string; - /** @description Text fragment title */ - title: string; - }; - text_fragment_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Unique fragment ID */ - id: string; - /** @description Tags for categorisation (optional) */ - tags?: string[]; - /** @description Searchable text content */ - text: string; - /** @description Text fragment title */ - title: string; - }; - top_banner: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Unique ID */ - id: string; - /** @description Banner text (e.g. notice at top of page) */ - text: string; - }; - top_banner_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Unique ID */ - id: string; - /** @description Banner text (e.g. notice at top of page) */ - text: string; - }; - translation_bundle: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Map: translation key → text (e.g. searchable_text_help, footer_copyright) */ - strings: Record; - }; - translation_bundle_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Map: translation key → text (e.g. searchable_text_help, footer_copyright) */ - strings: Record; - }; - youtube_video: { - /** @description Entry identifier (filename) */ - readonly _slug?: string; - /** @description Short description (optional) */ - description?: string; - /** @description Unique ID (optional; otherwise _slug is used) */ - id?: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description URL params (e.g. start=30, autoplay=1). Optional. */ - params?: string; - /** @description Video title (optional) */ - title?: string; - /** @description YouTube video ID (from URL ?v=VIDEO_ID) */ - youtubeId: string; - }; - youtube_video_input: { - /** @description URL slug (used as filename) */ - _slug: string; - /** @description Short description (optional) */ - description?: string; - /** @description Unique ID (optional; otherwise _slug is used) */ - id?: string; - /** @description Column width (grid). Optional. */ - layout?: { - /** - * @description Breakout layout (full width) - * @default false - */ - breakout: boolean; - /** - * @description Width on desktop (optional) - * @enum {string} - */ - desktop?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Width on mobile (1–12) - * @default 12 - * @enum {string} - */ - mobile: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - /** - * @description Space below (rem) - * @default 0 - * @enum {number} - */ - spaceBottom: 0 | 0.5 | 1 | 1.5 | 2; - /** - * @description Width on tablet (optional) - * @enum {string} - */ - tablet?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12"; - }; - /** @description URL params (e.g. start=30, autoplay=1). Optional. */ - params?: string; - /** @description Video title (optional) */ - title?: string; - /** @description YouTube video ID (from URL ?v=VIDEO_ID) */ - youtubeId: string; - }; }; responses: never; parameters: never; @@ -5602,7 +574,7 @@ export interface operations { }; }; }; - getBadgeSchema: { + getNoteSchema: { parameters: { query?: never; header?: never; @@ -5627,1395 +599,33 @@ export interface operations { }; }; }; - getCalendarSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getCalendarItemSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getCampaignSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getCampaignsSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getContentLayoutSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getDemoSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getFooterSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getFullwidthBannerSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getHeadlineSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getHtmlSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getIframeSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getImageSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getImageGallerySchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getImgSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getLinkSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getLinkListSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getListSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getMarkdownSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getNavgroupSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getNavigationSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getOpnformSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getOrganisationSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getOrganisationsSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getPageSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getPageConfigSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getPostSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getPostOverviewSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getProductSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getQuoteSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getSearchableTextSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getSeoSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getTagSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getTextFragmentSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getTopBannerSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getTranslationBundleSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getYoutubeVideoSchema: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Schema definition */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Collection not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - listBadge: { + listNote: { parameters: { query?: { /** @description Field name to sort by */ _sort?: string; /** @description Sort order (default: asc) */ _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ + /** @description Page number (1-indexed). Ignored if _limit/_offset is set. */ _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by name */ - name?: string; - /** @description Filter by label */ - label?: string; - /** @description Filter by color */ - color?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["badge"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createBadge: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["badge_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["badge"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getBadge: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["badge"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateBadge: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["badge"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["badge"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteBadge: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getBadgeReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listCalendar: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by items */ - items?: string; - /** @description Filter by fromPost */ - fromPost?: boolean; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["calendar"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createCalendar: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["calendar_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["calendar"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getCalendar: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["calendar"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateCalendar: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["calendar"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["calendar"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteCalendar: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getCalendarReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listCalendarItem: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ + /** @description Items per page (max 1000). Ignored if _limit/_offset is set. */ _per_page?: number; + /** @description Maximum number of items to return (max 1000). Takes precedence over _per_page. */ + _limit?: number; + /** @description Number of items to skip. Takes precedence over _page. */ + _offset?: number; + /** @description Full-text query. Splits on whitespace → AND across terms (each term must appear in some string value). When no explicit _sort is given, results are ranked by match frequency (desc). */ + _q?: string; + /** @description Filter by status. Anonymous callers (no API key / session) are forced to "published" unless a valid ?preview= token is attached. */ + _status?: "published" | "draft" | "all"; /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ _resolve?: string; /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ _locale?: string; /** @description Filter by title */ title?: string; - /** @description Filter by terminZeit */ - terminZeit?: string; - /** @description Filter by description */ - description?: string; - /** @description Filter by link */ - link?: string; + /** @description Filter by body */ + body?: string; }; header?: never; path?: never; @@ -7030,7 +640,7 @@ export interface operations { }; content: { "application/json": { - items?: components["schemas"]["calendar_item"][]; + items?: components["schemas"]["note"][]; page?: number; per_page?: number; total?: number; @@ -7040,7 +650,7 @@ export interface operations { }; }; }; - createCalendarItem: { + createNote: { parameters: { query?: { /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ @@ -7054,7 +664,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["calendar_item_input"]; + "application/json": components["schemas"]["note_input"]; }; }; responses: { @@ -7064,7 +674,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["calendar_item"]; + "application/json": components["schemas"]["note"]; }; }; /** @description Validation error */ @@ -7083,7 +693,7 @@ export interface operations { }; }; }; - getCalendarItem: { + getNote: { parameters: { query?: { /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ @@ -7106,7 +716,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["calendar_item"]; + "application/json": components["schemas"]["note"]; }; }; /** @description Entry not found */ @@ -7118,7 +728,7 @@ export interface operations { }; }; }; - updateCalendarItem: { + updateNote: { parameters: { query?: { /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ @@ -7135,7 +745,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["calendar_item"]; + "application/json": components["schemas"]["note"]; }; }; responses: { @@ -7145,7 +755,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["calendar_item"]; + "application/json": components["schemas"]["note"]; }; }; /** @description Validation error */ @@ -7164,7 +774,7 @@ export interface operations { }; }; }; - deleteCalendarItem: { + deleteNote: { parameters: { query?: { /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ @@ -7197,7 +807,7 @@ export interface operations { }; }; }; - getCalendarItemReferrers: { + getNoteReferrers: { parameters: { query?: never; header?: never; @@ -7229,96 +839,61 @@ export interface operations { }; }; }; - listCampaign: { + listEnvironments: { parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by urlPattern */ - urlPattern?: string; - /** @description Filter by selector */ - selector?: string; - /** @description Filter by insertHtml */ - insertHtml?: string; - /** @description Filter by html */ - html?: string; - /** @description Filter by css */ - css?: string; - /** @description Filter by javascript */ - javascript?: string; - /** @description Filter by medias */ - medias?: string; - /** @description Filter by timeUntil */ - timeUntil?: string; - }; + query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { - /** @description Paginated list of entries */ + /** @description Environment list */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": { - items?: components["schemas"]["campaign"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; + default?: string | null; + environments?: string[]; }; }; }; }; }; - createCampaign: { + createEnvironment: { parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; + query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["campaign_input"]; + "application/json": { + /** @description Optional override. Omit to inherit global default. */ + locales?: string[] | null; + name: string; + }; }; }; responses: { - /** @description Entry created */ - 201: { + /** @description Space created */ + 200: { headers: { [name: string]: unknown; }; - content: { - "application/json": components["schemas"]["campaign"]; - }; + content?: never; }; - /** @description Validation error */ + /** @description Invalid name or locales */ 400: { headers: { [name: string]: unknown; }; content?: never; }; - /** @description Entry already exists */ + /** @description Space already exists */ 409: { headers: { [name: string]: unknown; @@ -7327,232 +902,72 @@ export interface operations { }; }; }; - getCampaign: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["campaign"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateCampaign: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["campaign"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["campaign"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteCampaign: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getCampaignReferrers: { + deleteEnvironment: { parameters: { query?: never; header?: never; path: { - /** @description Entry slug */ - slug: string; + name: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description List of referrers (collection, slug, field, locale) */ + /** @description Space deleted */ 200: { headers: { [name: string]: unknown; }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; + content?: never; }; - }; - }; - listCampaigns: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by id */ - id?: string; - /** @description Filter by enable */ - enable?: boolean; - /** @description Filter by campaigns */ - campaigns?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["campaigns"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createCampaigns: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["campaigns_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["campaigns"]; - }; - }; - /** @description Validation error */ + /** @description Cannot delete the last remaining space */ 400: { headers: { [name: string]: unknown; }; content?: never; }; - /** @description Entry already exists */ + /** @description Space not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + renameEnvironment: { + parameters: { + query?: never; + header?: never; + path: { + name: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + name: string; + }; + }; + }; + responses: { + /** @description Space renamed */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Space not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target name already exists */ 409: { headers: { [name: string]: unknown; @@ -7561,244 +976,40 @@ export interface operations { }; }; }; - getCampaigns: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["campaigns"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateCampaigns: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["campaigns"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["campaigns"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteCampaigns: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getCampaignsReferrers: { + duplicateEnvironment: { parameters: { query?: never; header?: never; path: { - /** @description Entry slug */ - slug: string; + /** @description Source space */ + name: string; }; cookie?: never; }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listContentLayout: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by row1JustifyContent */ - row1JustifyContent?: string; - /** @description Filter by row1AlignItems */ - row1AlignItems?: string; - /** @description Filter by row1Content */ - row1Content?: string; - /** @description Filter by row2JustifyContent */ - row2JustifyContent?: string; - /** @description Filter by row2AlignItems */ - row2AlignItems?: string; - /** @description Filter by row2Content */ - row2Content?: string; - /** @description Filter by row3JustifyContent */ - row3JustifyContent?: string; - /** @description Filter by row3AlignItems */ - row3AlignItems?: string; - /** @description Filter by row3Content */ - row3Content?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["content_layout"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createContentLayout: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; requestBody: { content: { - "application/json": components["schemas"]["content_layout_input"]; + "application/json": { + /** @description Target space name */ + name: string; + }; }; }; responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["content_layout"]; - }; - }; - /** @description Validation error */ - 400: { + /** @description Space duplicated */ + 200: { headers: { [name: string]: unknown; }; content?: never; }; - /** @description Entry already exists */ + /** @description Source space not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target name already exists */ 409: { headers: { [name: string]: unknown; @@ -7807,33 +1018,27 @@ export interface operations { }; }; }; - getContentLayout: { + getEnvironmentLocales: { parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; + query?: never; header?: never; path: { - /** @description Entry identifier (filename without extension) */ - slug: string; + name: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description The entry */ + /** @description Locale configuration for the space */ 200: { headers: { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["content_layout"]; + "application/json": components["schemas"]["EnvironmentLocales"]; }; }; - /** @description Entry not found */ + /** @description Space not found */ 404: { headers: { [name: string]: unknown; @@ -7842,170 +1047,57 @@ export interface operations { }; }; }; - updateContentLayout: { + putEnvironmentLocales: { parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; + query?: never; header?: never; path: { - /** @description Entry identifier (filename without extension) */ - slug: string; + name: string; }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["content_layout"]; + "application/json": { + locales?: string[] | null; + }; }; }; responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["content_layout"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteContentLayout: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getContentLayoutReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ + /** @description Override applied */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; + locales?: string[]; + on_disk?: string[]; + override?: boolean; + updated?: string; + }; }; }; + /** @description Invalid body or locale value */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Space not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; }; - listDemo: { + listLocales: { parameters: { query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by title */ - title?: string; - /** @description Filter by summary */ - summary?: string; - /** @description Filter by css */ - css?: string; - /** @description Filter by singleSelect */ - singleSelect?: string; - /** @description Filter by count */ - count?: number; - /** @description Filter by quantity */ - quantity?: number; - /** @description Filter by isActive */ - isActive?: boolean; - /** @description Filter by publishedAt */ - publishedAt?: string; - /** @description Filter by bodyRichtext */ - bodyRichtext?: string; - /** @description Filter by bodyHtml */ - bodyHtml?: string; - /** @description Filter by bodyMarkdown */ - bodyMarkdown?: string; - /** @description Filter by bodyTextOrRef */ - bodyTextOrRef?: string; - /** @description Filter by tags */ - tags?: string; - /** @description Filter by labels */ - labels?: string; - /** @description Filter by scores */ - scores?: string; - /** @description Filter by relatedPages */ - relatedPages?: string; - /** @description Filter by meta */ - meta?: string; - /** @description Filter by mainImage */ - mainImage?: string; - /** @description Filter by relatedPage */ - relatedPage?: string; + _environment?: string; }; header?: never; path?: never; @@ -8013,307 +1105,68 @@ export interface operations { }; requestBody?: never; responses: { - /** @description Paginated list of entries */ + /** @description Locale list */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": { - items?: components["schemas"]["demo"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; + default?: string | null; + locales?: string[]; }; }; }; }; }; - createDemo: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["demo_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["demo"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getDemo: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["demo"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateDemo: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["demo"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["demo"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteDemo: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getDemoReferrers: { + mintPreviewToken: { parameters: { query?: never; header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listFooter: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by row1JustifyContent */ - row1JustifyContent?: string; - /** @description Filter by row1AlignItems */ - row1AlignItems?: string; - /** @description Filter by row1Content */ - row1Content?: string; - /** @description Filter by row2JustifyContent */ - row2JustifyContent?: string; - /** @description Filter by row2AlignItems */ - row2AlignItems?: string; - /** @description Filter by row2Content */ - row2Content?: string; - /** @description Filter by row3JustifyContent */ - row3JustifyContent?: string; - /** @description Filter by row3AlignItems */ - row3AlignItems?: string; - /** @description Filter by row3Content */ - row3Content?: string; - /** @description Filter by id */ - id?: string; - }; - header?: never; path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": { + /** @description Collection the token unlocks */ + collection: string; + /** @description Restrict to one locale */ + locale?: string | null; + /** @description Restrict to one entry. Omit for collection-wide. */ + slug?: string | null; + /** + * @description Token lifetime (seconds). Clamped to [60, 30 days]. + * @default 86400 + */ + ttl_seconds?: number; + }; + }; + }; responses: { - /** @description Paginated list of entries */ + /** @description Token payload */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": { - items?: components["schemas"]["footer"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; + /** Format: date-time */ + expires_at?: string; + token?: string; + ttl_seconds?: number; }; }; }; - }; - }; - createFooter: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["footer_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["footer"]; - }; - }; - /** @description Validation error */ + /** @description Missing collection or RUSTYCMS_SESSION_SECRET not configured */ 400: { headers: { [name: string]: unknown; }; content?: never; }; - /** @description Entry already exists */ - 409: { + /** @description Unauthorized */ + 401: { headers: { [name: string]: unknown; }; @@ -8321,7166 +1174,44 @@ export interface operations { }; }; }; - getFooter: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["footer"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateFooter: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["footer"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["footer"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteFooter: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getFooterReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listFullwidthBanner: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by name */ - name?: string; - /** @description Filter by headline */ - headline?: string; - /** @description Filter by subheadline */ - subheadline?: string; - /** @description Filter by variant */ - variant?: string; - /** @description Filter by text */ - text?: string; - /** @description Filter by image */ - image?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["fullwidth_banner"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createFullwidthBanner: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["fullwidth_banner_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["fullwidth_banner"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getFullwidthBanner: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["fullwidth_banner"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateFullwidthBanner: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["fullwidth_banner"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["fullwidth_banner"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteFullwidthBanner: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getFullwidthBannerReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listHeadline: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by text */ - text?: string; - /** @description Filter by tag */ - tag?: string; - /** @description Filter by align */ - align?: string; - /** @description Filter by layout */ - layout?: string; - /** @description Filter by internal */ - internal?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["headline"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createHeadline: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["headline_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["headline"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getHeadline: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["headline"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateHeadline: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["headline"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["headline"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteHeadline: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getHeadlineReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listHtml: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by id */ - id?: string; - /** @description Filter by html */ - html?: string; - /** @description Filter by layout */ - layout?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["html"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createHtml: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["html_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["html"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getHtml: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["html"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateHtml: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["html"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["html"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteHtml: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getHtmlReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listIframe: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by name */ - name?: string; - /** @description Filter by iframe */ - iframe?: string; - /** @description Filter by content */ - content?: string; - /** @description Filter by overlayImage */ - overlayImage?: string; - /** @description Filter by layout */ - layout?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["iframe"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createIframe: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["iframe_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["iframe"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getIframe: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["iframe"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateIframe: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["iframe"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["iframe"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteIframe: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getIframeReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listImage: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by name */ - name?: string; - /** @description Filter by img */ - img?: string; - /** @description Filter by caption */ - caption?: string; - /** @description Filter by layout */ - layout?: string; - /** @description Filter by maxWidth */ - maxWidth?: number; - /** @description Filter by aspectRatio */ - aspectRatio?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["image"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createImage: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["image_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["image"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getImage: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["image"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateImage: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["image"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["image"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteImage: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getImageReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listImageGallery: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by name */ - name?: string; - /** @description Filter by images */ - images?: string; - /** @description Filter by layout */ - layout?: string; - /** @description Filter by description */ - description?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["image_gallery"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createImageGallery: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["image_gallery_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["image_gallery"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getImageGallery: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["image_gallery"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateImageGallery: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["image_gallery"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["image_gallery"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteImageGallery: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getImageGalleryReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listImg: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by src */ - src?: string; - /** @description Filter by description */ - description?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["img"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createImg: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["img_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["img"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getImg: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["img"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateImg: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["img"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["img"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteImg: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getImgReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listLink: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by url */ - url?: string; - /** @description Filter by linkName */ - linkName?: string; - /** @description Filter by name */ - name?: string; - /** @description Filter by newTab */ - newTab?: boolean; - /** @description Filter by icon */ - icon?: string; - /** @description Filter by description */ - description?: string; - /** @description Filter by alt */ - alt?: string; - /** @description Filter by color */ - color?: string; - /** @description Filter by external */ - external?: boolean; - /** @description Filter by internal */ - internal?: string; - /** @description Filter by showText */ - showText?: boolean; - /** @description Filter by author */ - author?: string; - /** @description Filter by date */ - date?: string; - /** @description Filter by source */ - source?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["link"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createLink: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["link_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["link"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getLink: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["link"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateLink: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["link"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["link"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteLink: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getLinkReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listLinkList: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by headline */ - headline?: string; - /** @description Filter by links */ - links?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["link_list"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createLinkList: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["link_list_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["link_list"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getLinkList: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["link_list"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateLinkList: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["link_list"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["link_list"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteLinkList: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getLinkListReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listList: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by item */ - item?: string; - /** @description Filter by internal */ - internal?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["list"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createList: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["list_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["list"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getList: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["list"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateList: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["list"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["list"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteList: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getListReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listMarkdown: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by name */ - name?: string; - /** @description Filter by content */ - content?: string; - /** @description Filter by alignment */ - alignment?: string; - /** @description Filter by layout */ - layout?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["markdown"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createMarkdown: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["markdown_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["markdown"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getMarkdown: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["markdown"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateMarkdown: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["markdown"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["markdown"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteMarkdown: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getMarkdownReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listNavgroup: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by label */ - label?: string; - /** @description Filter by url */ - url?: string; - /** @description Filter by links */ - links?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["navgroup"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createNavgroup: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["navgroup_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["navgroup"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getNavgroup: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["navgroup"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateNavgroup: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["navgroup"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["navgroup"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteNavgroup: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getNavgroupReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listNavigation: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by name */ - name?: string; - /** @description Filter by links */ - links?: string; - /** @description Filter by internal */ - internal?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["navigation"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createNavigation: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["navigation_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["navigation"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getNavigation: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["navigation"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateNavigation: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["navigation"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["navigation"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteNavigation: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getNavigationReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listOpnform: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by id */ - id?: string; - /** @description Filter by formId */ - formId?: string; - /** @description Filter by baseUrl */ - baseUrl?: string; - /** @description Filter by iframeTitle */ - iframeTitle?: string; - /** @description Filter by layout */ - layout?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["opnform"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createOpnform: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["opnform_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["opnform"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getOpnform: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["opnform"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateOpnform: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["opnform"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["opnform"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteOpnform: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getOpnformReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listOrganisation: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by name */ - name?: string; - /** @description Filter by description */ - description?: string; - /** @description Filter by logo */ - logo?: string; - /** @description Filter by link */ - link?: string; - /** @description Filter by badge */ - badge?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["organisation"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createOrganisation: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["organisation_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["organisation"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getOrganisation: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["organisation"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateOrganisation: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["organisation"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["organisation"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteOrganisation: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getOrganisationReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listOrganisations: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by headline */ - headline?: string; - /** @description Filter by description */ - description?: string; - /** @description Filter by presentation */ - presentation?: string; - /** @description Filter by addOrganisationTitle */ - addOrganisationTitle?: string; - /** @description Filter by addOrganisationMarkdown */ - addOrganisationMarkdown?: string; - /** @description Filter by addOrganisationLink */ - addOrganisationLink?: string; - /** @description Filter by allowedBadges */ - allowedBadges?: string; - /** @description Filter by organisations */ - organisations?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["organisations"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createOrganisations: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["organisations_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["organisations"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getOrganisations: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["organisations"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateOrganisations: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["organisations"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["organisations"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteOrganisations: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getOrganisationsReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listPage: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by row1JustifyContent */ - row1JustifyContent?: string; - /** @description Filter by row1AlignItems */ - row1AlignItems?: string; - /** @description Filter by row1Content */ - row1Content?: string; - /** @description Filter by row2JustifyContent */ - row2JustifyContent?: string; - /** @description Filter by row2AlignItems */ - row2AlignItems?: string; - /** @description Filter by row2Content */ - row2Content?: string; - /** @description Filter by row3JustifyContent */ - row3JustifyContent?: string; - /** @description Filter by row3AlignItems */ - row3AlignItems?: string; - /** @description Filter by row3Content */ - row3Content?: string; - /** @description Filter by seoTitle */ - seoTitle?: string; - /** @description Filter by seoDescription */ - seoDescription?: string; - /** @description Filter by seoMetaRobots */ - seoMetaRobots?: string; - /** @description Filter by slug */ - slug?: string; - /** @description Filter by name */ - name?: string; - /** @description Filter by linkName */ - linkName?: string; - /** @description Filter by icon */ - icon?: string; - /** @description Filter by headline */ - headline?: string; - /** @description Filter by subheadline */ - subheadline?: string; - /** @description Filter by topFullwidthBanner */ - topFullwidthBanner?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["page"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createPage: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["page_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["page"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getPage: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["page"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updatePage: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["page"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["page"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deletePage: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getPageReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listPageConfig: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by logo */ - logo?: string; - /** @description Filter by siteName */ - siteName?: string; - /** @description Filter by website */ - website?: string; - /** @description Filter by footerText1 */ - footerText1?: string; - /** @description Filter by seoTitle */ - seoTitle?: string; - /** @description Filter by seoDescription */ - seoDescription?: string; - /** @description Filter by blogPostsPageHeadline */ - blogPostsPageHeadline?: string; - /** @description Filter by blogPostsPageSubHeadline */ - blogPostsPageSubHeadline?: string; - /** @description Filter by blogTagPageHeadline */ - blogTagPageHeadline?: string; - /** @description Filter by postCommentSlot */ - postCommentSlot?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["page_config"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createPageConfig: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["page_config_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["page_config"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getPageConfig: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["page_config"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updatePageConfig: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["page_config"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["page_config"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deletePageConfig: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getPageConfigReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listPost: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by row1JustifyContent */ - row1JustifyContent?: string; - /** @description Filter by row1AlignItems */ - row1AlignItems?: string; - /** @description Filter by row1Content */ - row1Content?: string; - /** @description Filter by row2JustifyContent */ - row2JustifyContent?: string; - /** @description Filter by row2AlignItems */ - row2AlignItems?: string; - /** @description Filter by row2Content */ - row2Content?: string; - /** @description Filter by row3JustifyContent */ - row3JustifyContent?: string; - /** @description Filter by row3AlignItems */ - row3AlignItems?: string; - /** @description Filter by row3Content */ - row3Content?: string; - /** @description Filter by seoTitle */ - seoTitle?: string; - /** @description Filter by seoDescription */ - seoDescription?: string; - /** @description Filter by seoMetaRobots */ - seoMetaRobots?: string; - /** @description Filter by slug */ - slug?: string; - /** @description Filter by headline */ - headline?: string; - /** @description Filter by subheadline */ - subheadline?: string; - /** @description Filter by excerpt */ - excerpt?: string; - /** @description Filter by content */ - content?: string; - /** @description Filter by postImage */ - postImage?: string; - /** @description Filter by postTag */ - postTag?: string; - /** @description Filter by created */ - created?: string; - /** @description Filter by isEvent */ - isEvent?: boolean; - /** @description Filter by eventDate */ - eventDate?: string; - /** @description Filter by eventLocation */ - eventLocation?: string; - /** @description Filter by icon */ - icon?: string; - /** @description Filter by hideFromListing */ - hideFromListing?: boolean; - /** @description Filter by important */ - important?: boolean; - /** @description Filter by linkName */ - linkName?: string; - /** @description Filter by showCommentSection */ - showCommentSection?: boolean; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["post"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createPost: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["post_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["post"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getPost: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["post"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updatePost: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["post"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["post"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deletePost: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getPostReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listPostOverview: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by row1JustifyContent */ - row1JustifyContent?: string; - /** @description Filter by row1AlignItems */ - row1AlignItems?: string; - /** @description Filter by row1Content */ - row1Content?: string; - /** @description Filter by row2JustifyContent */ - row2JustifyContent?: string; - /** @description Filter by row2AlignItems */ - row2AlignItems?: string; - /** @description Filter by row2Content */ - row2Content?: string; - /** @description Filter by row3JustifyContent */ - row3JustifyContent?: string; - /** @description Filter by row3AlignItems */ - row3AlignItems?: string; - /** @description Filter by row3Content */ - row3Content?: string; - /** @description Filter by seoTitle */ - seoTitle?: string; - /** @description Filter by seoDescription */ - seoDescription?: string; - /** @description Filter by seoMetaRobots */ - seoMetaRobots?: string; - /** @description Filter by id */ - id?: string; - /** @description Filter by headline */ - headline?: string; - /** @description Filter by text */ - text?: string; - /** @description Filter by allPosts */ - allPosts?: boolean; - /** @description Filter by filterByTag */ - filterByTag?: string; - /** @description Filter by posts */ - posts?: string; - /** @description Filter by numberItems */ - numberItems?: number; - /** @description Filter by design */ - design?: string; - /** @description Filter by layout */ - layout?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["post_overview"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createPostOverview: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["post_overview_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["post_overview"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getPostOverview: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["post_overview"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updatePostOverview: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["post_overview"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["post_overview"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deletePostOverview: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getPostOverviewReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listProduct: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by sku */ - sku?: string; - /** @description Filter by title */ - title?: string; - /** @description Filter by price */ - price?: number; - /** @description Filter by category */ - category?: string; - /** @description Filter by description */ - description?: string; - /** @description Filter by images */ - images?: string; - /** @description Filter by in_stock */ - in_stock?: boolean; - /** @description Filter by rating */ - rating?: number; - /** @description Filter by created_at */ - created_at?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["product"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createProduct: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["product_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["product"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getProduct: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["product"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateProduct: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["product"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["product"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteProduct: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getProductReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listQuote: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by quote */ - quote?: string; - /** @description Filter by author */ - author?: string; - /** @description Filter by variant */ - variant?: string; - /** @description Filter by layout */ - layout?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["quote"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createQuote: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["quote_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["quote"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getQuote: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["quote"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateQuote: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["quote"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["quote"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteQuote: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getQuoteReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listSearchableText: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by id */ - id?: string; - /** @description Filter by textFragments */ - textFragments?: string; - /** @description Filter by title */ - title?: string; - /** @description Filter by tagWhitelist */ - tagWhitelist?: string; - /** @description Filter by description */ - description?: string; - /** @description Filter by layout */ - layout?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["searchable_text"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createSearchableText: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["searchable_text_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["searchable_text"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getSearchableText: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["searchable_text"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateSearchableText: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["searchable_text"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["searchable_text"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteSearchableText: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getSearchableTextReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listSeo: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by seoTitle */ - seoTitle?: string; - /** @description Filter by seoDescription */ - seoDescription?: string; - /** @description Filter by seoMetaRobots */ - seoMetaRobots?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["seo"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createSeo: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["seo_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["seo"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getSeo: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["seo"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateSeo: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["seo"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["seo"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteSeo: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getSeoReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listTag: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by name */ - name?: string; - /** @description Filter by icon */ - icon?: string; - /** @description Filter by color */ - color?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["tag"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createTag: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["tag_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["tag"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getTag: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["tag"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateTag: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["tag"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["tag"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteTag: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getTagReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listTextFragment: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by id */ - id?: string; - /** @description Filter by title */ - title?: string; - /** @description Filter by text */ - text?: string; - /** @description Filter by tags */ - tags?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["text_fragment"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createTextFragment: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["text_fragment_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["text_fragment"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getTextFragment: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["text_fragment"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateTextFragment: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["text_fragment"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["text_fragment"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteTextFragment: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getTextFragmentReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listTopBanner: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by id */ - id?: string; - /** @description Filter by text */ - text?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["top_banner"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createTopBanner: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["top_banner_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["top_banner"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getTopBanner: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["top_banner"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateTopBanner: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["top_banner"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["top_banner"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteTopBanner: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getTopBannerReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listTranslationBundle: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by strings */ - strings?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["translation_bundle"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createTranslationBundle: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["translation_bundle_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["translation_bundle"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getTranslationBundle: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["translation_bundle"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateTranslationBundle: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["translation_bundle"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["translation_bundle"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteTranslationBundle: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getTranslationBundleReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; - listYoutubeVideo: { - parameters: { - query?: { - /** @description Field name to sort by */ - _sort?: string; - /** @description Sort order (default: asc) */ - _order?: "asc" | "desc"; - /** @description Page number (1-indexed) */ - _page?: number; - /** @description Items per page */ - _per_page?: number; - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - /** @description Filter by youtubeId */ - youtubeId?: string; - /** @description Filter by title */ - title?: string; - /** @description Filter by description */ - description?: string; - /** @description Filter by params */ - params?: string; - /** @description Filter by layout */ - layout?: string; - /** @description Filter by id */ - id?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of entries */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["youtube_video"][]; - page?: number; - per_page?: number; - total?: number; - total_pages?: number; - }; - }; - }; - }; - }; - createYoutubeVideo: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["youtube_video_input"]; - }; - }; - responses: { - /** @description Entry created */ - 201: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["youtube_video"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry already exists */ - 409: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getYoutubeVideo: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The entry */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["youtube_video"]; - }; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - updateYoutubeVideo: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["youtube_video"]; - }; - }; - responses: { - /** @description Entry updated */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["youtube_video"]; - }; - }; - /** @description Validation error */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - deleteYoutubeVideo: { - parameters: { - query?: { - /** @description Resolve references: 'all' or comma-separated field names (e.g. row1Content,topFullwidthBanner). Resolved entries are embedded instead of { _type, _slug }. */ - _resolve?: string; - /** @description Locale for content (e.g. de, en). Only used when RUSTYCMS_LOCALES is set. Default = first locale. References are resolved in the same locale. */ - _locale?: string; - }; - header?: never; - path: { - /** @description Entry identifier (filename without extension) */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Entry deleted */ - 204: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Entry not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - getYoutubeVideoReferrers: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Entry slug */ - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of referrers (collection, slug, field, locale) */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Collection of the referring entry */ - collection?: string; - /** @description Field that holds the reference */ - field?: string; - /** @description Locale of the referring entry if applicable */ - locale?: string | null; - /** @description Slug of the referring entry */ - slug?: string; - }[]; - }; - }; - }; - }; transformImage: { parameters: { query: { - /** @description External image URL */ + /** @description Image URL. Absolute (https://…) or relative /api/assets/… */ url: string; /** @description Target width (alias: width) */ w?: number; /** @description Target height (alias: height) */ h?: number; - /** @description Aspect ratio before resize, e.g. 1:1 or 16:9 (center crop) */ + /** @description Device-pixel-ratio multiplier for w/h. Clamped to [1, 4]. */ + dpr?: number; + /** @description Aspect ratio before resize, e.g. 1:1 or 16:9 */ ar?: string; /** @description fill = exact w×h, contain = fit inside, cover = fill with crop */ fit?: "fill" | "contain" | "cover"; - /** @description Output format */ - format?: "jpeg" | "png" | "webp" | "avif"; - /** @description Quality 1–100 for JPEG and WebP (lossy) */ + /** @description Focal X (0..1) for aspect-ratio crops */ + fx?: number; + /** @description Focal Y (0..1) for aspect-ratio crops */ + fy?: number; + /** @description Crop anchor when no focal point given */ + anchor?: "center" | "top" | "bottom" | "left" | "right" | "top-left" | "top-right" | "bottom-left" | "bottom-right"; + /** @description Explicit crop X offset (px) */ + cx?: number; + /** @description Explicit crop Y offset (px) */ + cy?: number; + /** @description Explicit crop width (px) */ + cw?: number; + /** @description Explicit crop height (px) */ + ch?: number; + /** @description Rotation in degrees (after resize) */ + rotate?: 90 | 180 | 270; + /** @description Horizontal or vertical flip */ + flip?: "h" | "v"; + /** @description Convert to grayscale */ + grayscale?: boolean; + /** @description Output format. `auto` negotiates via Accept header (avif > webp > jpeg). */ + format?: "jpeg" | "png" | "webp" | "avif" | "auto"; + /** @description Quality 1–100 for JPEG/WebP (lossy) */ quality?: number; }; header?: never; @@ -15501,7 +1232,7 @@ export interface operations { "image/webp": string; }; }; - /** @description Invalid URL or not a valid image */ + /** @description Invalid URL, host not in allowlist, source too large, or not a valid image */ 400: { headers: { [name: string]: unknown; @@ -15517,4 +1248,122 @@ export interface operations { }; }; }; + transformLqip: { + parameters: { + query: { + /** @description Blurhash string */ + hash: string; + w?: number; + h?: number; + quality?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description JPEG placeholder */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "image/jpeg": string; + }; + }; + /** @description Invalid blurhash */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + transformMetadata: { + parameters: { + query: { + /** @description Image URL (absolute or /api/assets/…) */ + url: string; + /** @description Skip blurhash computation for a faster response */ + no_blurhash?: boolean; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Metadata */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + aspectRatio?: number; + blurhash?: string | null; + /** @description Hex color like #a8d7c5 */ + dominantColor?: string; + hasAlpha?: boolean; + height?: number; + width?: number; + }; + }; + }; + /** @description Invalid URL, host not in allowlist, or source too large */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + transformSrcset: { + parameters: { + query: { + url: string; + /** @description Comma-separated widths */ + widths: string; + /** @description Comma-separated output formats */ + formats?: string; + ar?: string; + fit?: string; + quality?: number; + fx?: number; + fy?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Source set descriptor */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + fallback?: string; + sources?: { + srcset?: string; + type?: string; + }[]; + widths?: number[]; + }; + }; + }; + /** @description Missing or invalid widths/url */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; } diff --git a/src/lib/cms-media-url.ts b/src/lib/cms-media-url.ts index 5e24086..d7e184b 100644 --- a/src/lib/cms-media-url.ts +++ b/src/lib/cms-media-url.ts @@ -49,26 +49,68 @@ export function normalizeMediaUrl(url: string): string { return u; } +/** Focal-Point aus RustyCMS-`image`-Field ({x,y} in 0..1). */ +export interface CmsFocal { + x: number; + y: number; +} + +/** Extrahierter Bildfeld-Inhalt: absolute URL + optional focal + alt. */ +export interface CmsImageField { + url: string; + focal?: CmsFocal; + alt?: string; +} + /** * Wie Image-Block / Galerie / Organisation-Logo: `string` oder Objekt mit `src` / `file.url`. * Liefert eine für `ensureTransformedImage` nutzbare URL (nach normalizeMediaUrl). */ export function absoluteUrlFromCmsImageField(field: unknown): string | null { + return extractCmsImageField(field)?.url ?? null; +} + +/** + * Wie `absoluteUrlFromCmsImageField`, gibt zusätzlich focal + alt zurück. + * Für RustyCMS `type: "image"` Felder: `{ src, alt?, focal?: {x,y}, ... }`. + */ +export function extractCmsImageField(field: unknown): CmsImageField | null { if (typeof field === "string") { const s = field.trim(); if (!s) return null; - return normalizeMediaUrl(s.startsWith("//") ? `https:${s}` : s); + const url = normalizeMediaUrl(s.startsWith("//") ? `https:${s}` : s); + return { url }; } if (field && typeof field === "object") { - const o = field as { src?: string; file?: { url?: string } }; - const u = + const o = field as { + src?: string; + file?: { url?: string }; + fields?: { file?: { url?: string } }; + focal?: { x?: unknown; y?: unknown }; + alt?: unknown; + }; + const raw = typeof o.src === "string" && o.src.trim() ? o.src : typeof o.file?.url === "string" && o.file.url.trim() ? o.file.url - : undefined; - if (!u) return null; - return normalizeMediaUrl(u.startsWith("//") ? `https:${u}` : u); + : typeof o.fields?.file?.url === "string" && o.fields.file.url.trim() + ? o.fields.file.url + : undefined; + if (!raw) return null; + const url = normalizeMediaUrl(raw.startsWith("//") ? `https:${raw}` : raw); + const fx = + typeof o.focal?.x === "number" && Number.isFinite(o.focal.x) + ? Math.max(0, Math.min(1, o.focal.x)) + : undefined; + const fy = + typeof o.focal?.y === "number" && Number.isFinite(o.focal.y) + ? Math.max(0, Math.min(1, o.focal.y)) + : undefined; + const focal = + fx !== undefined && fy !== undefined ? { x: fx, y: fy } : undefined; + const alt = typeof o.alt === "string" ? o.alt : undefined; + return focal ? { url, focal, alt } : alt !== undefined ? { url, alt } : { url }; } return null; } diff --git a/src/lib/rusty-image-types.ts b/src/lib/rusty-image-types.ts new file mode 100644 index 0000000..16109e6 --- /dev/null +++ b/src/lib/rusty-image-types.ts @@ -0,0 +1,18 @@ +/** Pure type definitions related to rusty-image. Lives in a separate file so + * client (Svelte) components can import the shape without dragging the + * implementation (which uses `node:crypto`/`node:fs`) into the browser bundle. */ + +/** Responsive `` source set: per-format srcset + fallback + dimensions. */ +export interface ResponsiveImage { + /** One srcset string per output format. Order = `` order. */ + sources: { type: string; srcset: string }[]; + /** Fallback `` (typically the largest jpeg variant). */ + fallback: string; + /** Render dimensions for the `` width/height attrs (prevents CLS). */ + width: number; + height: number; + /** All width steps that were actually generated. */ + widths: number[]; + /** Optional LQIP (Low-Quality Image Placeholder) as a data-URL, decoded from blurhash. */ + lqip?: string; +} diff --git a/src/lib/rusty-image.ts b/src/lib/rusty-image.ts index 92f4e81..37c00f2 100644 --- a/src/lib/rusty-image.ts +++ b/src/lib/rusty-image.ts @@ -9,8 +9,10 @@ import fs from "node:fs/promises"; import path from "node:path"; import { absoluteUrlFromCmsImageField, + extractCmsImageField, getCmsBaseUrl, normalizeMediaUrl, + type CmsFocal, } from "./cms-media-url"; /** Für ältere Importe von `rusty-image`; neue Nutzung: `./cms-media-url`. */ @@ -26,8 +28,12 @@ export interface RustyImageTransformParams { fit?: "fill" | "contain" | "cover"; /** Ausgabeformat */ format?: "jpeg" | "png" | "webp" | "avif"; - /** JPEG-Qualität 1–100 */ + /** JPEG/WebP-Qualität 1–100 */ quality?: number; + /** Focal-Point X (0..1) für `fit: cover` + `ar` → Crop um Motiv zentrieren. */ + focalX?: number; + /** Focal-Point Y (0..1). */ + focalY?: number; } const DEFAULT_FORMAT = "jpeg"; @@ -65,11 +71,19 @@ export function hashForTransform( fit: params.fit ?? "contain", format: params.format ?? DEFAULT_FORMAT, quality: params.quality ?? 85, + fx: normalizeFocalForHash(params.focalX), + fy: normalizeFocalForHash(params.focalY), }; const payload = JSON.stringify(normalized); return createHash("sha256").update(payload).digest("hex").slice(0, 20); } +/** Focal auf 4 Nachkommastellen runden, damit minimale Rundungs-Wackler nicht den Hash ändern. */ +function normalizeFocalForHash(v: number | undefined): number | undefined { + if (v == null || !Number.isFinite(v)) return undefined; + return Math.round(Math.max(0, Math.min(1, v)) * 10000) / 10000; +} + /** * Stellt sicher, dass das transformierte Bild in public existiert. * Wenn nicht: GET an RustyCMS /api/transform, Ergebnis in public/images/transformed/. schreiben. @@ -139,6 +153,10 @@ export async function ensureTransformedImage( if (params.format != null) searchParams.set("format", params.format); if (params.quality != null) searchParams.set("quality", String(params.quality)); + if (params.focalX != null && Number.isFinite(params.focalX)) + searchParams.set("fx", String(normalizeFocalForHash(params.focalX))); + if (params.focalY != null && Number.isFinite(params.focalY)) + searchParams.set("fy", String(normalizeFocalForHash(params.focalY))); const transformUrl = `${baseUrl}/api/transform?${searchParams.toString()}`; console.log("[rusty-image] GET", transformUrl); @@ -166,7 +184,7 @@ type ImageArrayItem = string | { src?: string }; /** * Löst ein Array von Bild-URLs/Referenzen über die Transform-API auf. * Akzeptiert string[] oder Objekte mit src (z. B. { _type: "img", src, description }). - * Gibt ein Array von öffentlichen Pfaden zurück (z. B. für Fullwidth-Banner). + * Focal-Point wird automatisch pro Eintrag übernommen, wenn gesetzt. */ export async function resolveImageUrls( items: ImageArrayItem[], @@ -174,30 +192,285 @@ export async function resolveImageUrls( ): Promise { const result: string[] = []; for (const item of items) { - const u = absoluteUrlFromCmsImageField(item); - if (!u) continue; + const extracted = extractCmsImageField(item); + if (!extracted) continue; + const perItem: RustyImageTransformParams = { + ...params, + focalX: params.focalX ?? extracted.focal?.x, + focalY: params.focalY ?? extracted.focal?.y, + }; try { - result.push(await ensureTransformedImage(u, params)); + result.push(await ensureTransformedImage(extracted.url, perItem)); } catch (e) { - console.warn("[rusty-image] resolve failed for", u, e); + console.warn("[rusty-image] resolve failed for", extracted.url, e); } } return result; } -/** Holt die Bild-URL aus einem Image-Block (image oder img: string, src oder file.url). */ -function getImageBlockUrl(block: { - image?: string | { src?: string; file?: { url?: string }; title?: string }; - img?: string | { src?: string; file?: { url?: string }; title?: string }; -}): string | null { - return absoluteUrlFromCmsImageField(block.image ?? block.img); +/** AssetInfo vom RustyCMS ?meta=true Endpoint (nur benötigte Felder). */ +interface AssetMeta { + width?: number; + height?: number; + hasAlpha?: boolean; + mimeType?: string; + blurhash?: string; } -/** URL aus einem Galerie-Bildeintrag (src oder file.url). */ -function getGalleryImageUrl( - img: { src?: string; file?: { url?: string } }, -): string | null { - return absoluteUrlFromCmsImageField(img); +/** Prozess-Cache: gleiche URL nicht doppelt abfragen pro Build/SSR. */ +const metaCache = new Map>(); + +/** + * Holt Asset-Metadaten (width/height/...) über `GET /api/assets/?meta=true`. + * Nur für RustyCMS-Asset-URLs; andere Hosts → null. Fehler → null (nicht werfen). + */ +export async function fetchAssetMeta(url: string): Promise { + const absoluteUrl = normalizeMediaUrl(url); + if (!absoluteUrl.startsWith("http")) return null; + // Nur CMS-Assets unterstützen das meta-Flag. + if (!absoluteUrl.includes("/api/assets/")) return null; + const cached = metaCache.get(absoluteUrl); + if (cached) return cached; + + const job = (async (): Promise => { + try { + const u = new URL(absoluteUrl); + u.searchParams.set("meta", "true"); + const res = await fetch(u.toString()); + if (!res.ok) return null; + const info = (await res.json()) as { + width?: number; + height?: number; + has_alpha?: boolean; + hasAlpha?: boolean; + mime_type?: string; + mimeType?: string; + blurhash?: string; + }; + return { + width: typeof info.width === "number" ? info.width : undefined, + height: typeof info.height === "number" ? info.height : undefined, + hasAlpha: + typeof info.hasAlpha === "boolean" + ? info.hasAlpha + : typeof info.has_alpha === "boolean" + ? info.has_alpha + : undefined, + mimeType: info.mimeType ?? info.mime_type, + blurhash: + typeof info.blurhash === "string" && info.blurhash.length > 0 + ? info.blurhash + : undefined, + }; + } catch (e) { + console.warn("[rusty-image] meta fetch failed for", absoluteUrl, e); + return null; + } + })(); + metaCache.set(absoluteUrl, job); + return job; +} + +/** Ergebnis eines ``-Aufbaus: mehrere Formate + Fallback + Dimensionen. + * Identisch zu `ResponsiveImage` in `./rusty-image-types`; doppelt definiert, + * damit client-seitige Importe (Svelte) den Typ ohne diese server-only Datei + * (node:crypto, node:fs) bekommen können. */ +export interface ResponsiveImage { + sources: { type: string; srcset: string }[]; + fallback: string; + width: number; + height: number; + widths: number[]; + lqip?: string; +} + +/** Optionen für `ensureResponsiveImage`. */ +export interface ResponsiveImageOptions { + /** Kandidaten-Breiten, werden gegen Original-Breite geklampt (keine Upscales). */ + widths?: number[]; + /** Seitenverhältnis (wie bei Transform: "16:9"). Wenn gesetzt → Höhe = width / ar. */ + ar?: string; + /** Fit-Modus (Default: `cover` bei ar gesetzt, sonst `contain`). */ + fit?: "fill" | "contain" | "cover"; + /** Formate in Reihenfolge. Erstes = bevorzugt (AVIF). Fallback immer als ``. */ + formats?: ("avif" | "webp" | "jpeg" | "png")[]; + /** Qualität (1–100). */ + quality?: number; + /** Focal-Point (0..1). */ + focal?: CmsFocal; + /** LQIP (Blurhash → data-URL) erzeugen, wenn Meta einen Blurhash liefert. Default: true. */ + lqip?: boolean; +} + +const DEFAULT_WIDTHS = [640, 960, 1280, 1600, 1920, 2400]; +// AVIF intentionally omitted from the default — server-side AVIF encoding is +// 5-10× slower than WebP and the bandwidth win is marginal for this site. +// Callers can still opt in via `formats: ["avif", ...]` per call. +const DEFAULT_FORMATS: ("avif" | "webp" | "jpeg")[] = ["webp", "jpeg"]; + +function parseAr(ar: string | undefined): number | null { + if (!ar) return null; + const m = ar.split(":"); + if (m.length !== 2) return null; + const a = Number(m[0]); + const b = Number(m[1]); + if (!Number.isFinite(a) || !Number.isFinite(b) || a <= 0 || b <= 0) return null; + return a / b; +} + +const MIME_FOR_FORMAT: Record = { + avif: "image/avif", + webp: "image/webp", + jpeg: "image/jpeg", + png: "image/png", +}; + +/** In-memory Cache: gleicher Blurhash → selbe data-URL (einmal dekodieren pro Build). */ +const blurhashCache = new Map>(); + +/** + * Dekodiert einen Blurhash zu einer winzigen JPEG-data-URL (typ. < 1 KB). + * 32×32 RGBA-Pixel → sharp raw → JPEG (q=40) → base64. Rendering-seitig als + * `background-image` mit CSS-`filter: blur()` + `scale()`-Bleed genutzt. + * Fehler → null (LQIP ist optional). + */ +export async function blurhashToDataUrl( + hash: string, + targetWidth = 32, + targetHeight = 32, +): Promise { + if (!hash || typeof hash !== "string") return null; + const key = `${hash}|${targetWidth}x${targetHeight}`; + const cached = blurhashCache.get(key); + if (cached) return cached; + + const job = (async (): Promise => { + try { + const { decode } = await import("blurhash"); + const sharpMod = await import("sharp"); + const sharp = sharpMod.default ?? sharpMod; + const pixels = decode(hash, targetWidth, targetHeight); + const buffer = await sharp(Buffer.from(pixels), { + raw: { + width: targetWidth, + height: targetHeight, + channels: 4, + }, + }) + .jpeg({ quality: 40, progressive: false }) + .toBuffer(); + return `data:image/jpeg;base64,${buffer.toString("base64")}`; + } catch (e) { + console.warn("[rusty-image] blurhash decode failed:", e); + return null; + } + })(); + blurhashCache.set(key, job); + return job; +} + +/** + * Baut eine responsive Bildquelle: pro Format ein `srcset` über mehrere Breiten, + * plus einen Fallback-`src`. Original-Dimensionen werden vorher via `?meta=true` + * abgefragt, damit keine Upscales erzeugt werden und das `` exakte + * width/height-Attribute bekommt (kein CLS). + */ +export async function ensureResponsiveImage( + url: string, + opts: ResponsiveImageOptions = {}, +): Promise { + const absoluteUrl = normalizeMediaUrl(url); + const requestedWidths = opts.widths && opts.widths.length > 0 ? opts.widths : DEFAULT_WIDTHS; + const formats = opts.formats && opts.formats.length > 0 ? opts.formats : DEFAULT_FORMATS; + const quality = opts.quality ?? 80; + const arValue = parseAr(opts.ar); + const effectiveFit: "fill" | "contain" | "cover" = + opts.fit ?? (opts.ar ? "cover" : "contain"); + + const meta = await fetchAssetMeta(absoluteUrl); + const originalWidth = meta?.width; + const originalHeight = meta?.height; + + // Keine Upscales: alles > originalWidth weglassen; wenn nichts übrig, originalWidth nehmen. + let widths = requestedWidths + .map((w) => Math.round(w)) + .filter((w) => w > 0) + .filter((w) => (originalWidth ? w <= originalWidth : true)); + if (widths.length === 0) { + widths = originalWidth + ? [originalWidth] + : [requestedWidths[requestedWidths.length - 1] ?? 1280]; + } + widths = Array.from(new Set(widths)).sort((a, b) => a - b); + + const largestWidth = widths[widths.length - 1]; + const renderHeight = arValue + ? Math.round(largestWidth / arValue) + : originalHeight && originalWidth + ? Math.round((largestWidth * originalHeight) / originalWidth) + : Math.round(largestWidth * 0.5625); // 16:9 als letzter Fallback + + const sources: { type: string; srcset: string }[] = []; + let fallback = ""; + + for (const format of formats) { + const parts: string[] = []; + for (const w of widths) { + const params: RustyImageTransformParams = { + width: w, + fit: effectiveFit, + format, + quality, + focalX: opts.focal?.x, + focalY: opts.focal?.y, + }; + if (opts.ar) params.ar = opts.ar; + // Bei fit=cover + ar: Höhe explizit setzen, sonst würde nur „ar-Crop" greifen ohne Skalierung. + if (arValue && (effectiveFit === "cover" || effectiveFit === "fill")) { + params.height = Math.round(w / arValue); + } + try { + const path = await ensureTransformedImage(absoluteUrl, params); + parts.push(`${path} ${w}w`); + fallback = path; + } catch (e) { + console.warn("[rusty-image] responsive variant failed", format, w, e); + } + } + if (parts.length > 0) { + sources.push({ type: MIME_FOR_FORMAT[format] ?? "image/jpeg", srcset: parts.join(", ") }); + } + } + + let lqip: string | undefined; + if ((opts.lqip ?? true) && meta?.blurhash) { + const dataUrl = await blurhashToDataUrl(meta.blurhash); + if (dataUrl) lqip = dataUrl; + } + + return { + sources, + fallback, + width: largestWidth, + height: renderHeight, + widths, + ...(lqip ? { lqip } : {}), + }; +} + +/** Holt URL + focal aus einem Image-Block (image oder img). */ +function getImageBlockField(block: { + image?: unknown; + img?: unknown; +}) { + return extractCmsImageField(block.image ?? block.img); +} + +/** URL + focal aus einem Galerie-Bildeintrag (src oder file.url). */ +function getGalleryImageField( + img: unknown, +) { + return extractCmsImageField(img); } /** RowContentLayout-typ: Zeilen mit content-Arrays. */ @@ -427,33 +700,66 @@ export async function resolveContentImages( continue; } if (block._type === "image") { - const url = getImageBlockUrl( - block as { - image?: string | { file?: { url?: string }; title?: string }; - img?: string | { file?: { url?: string }; title?: string }; - }, - ); - if (!url) continue; + const field = getImageBlockField(block); + if (!field) continue; try { - block.resolvedImageSrc = await ensureTransformedImage( - url, - transformParams, - ); + // Build responsive variants. Body-image widths target the typical + // article column on mobile/tablet/desktop; AVIF/WebP/JPEG fallback. + // Conservative variant matrix to keep build time bounded — body images + // get 2 widths × WebP/JPEG (skip AVIF here since AVIF encoding on the + // CMS is the slowest step). Hero/banner uses a richer set in Layout.astro. + const responsive = await ensureResponsiveImage(field.url, { + widths: [600, 1200], + formats: ["webp", "jpeg"], + quality: 80, + focal: field.focal, + ...(transformParams.ar ? { ar: transformParams.ar } : {}), + ...(transformParams.fit ? { fit: transformParams.fit } : {}), + }); + (block as unknown as { resolvedResponsive?: ResponsiveImage }).resolvedResponsive = responsive; + block.resolvedImageSrc = responsive.fallback; } catch (e) { - console.warn("[rusty-image] resolve failed for", url, e); + console.warn("[rusty-image] resolve failed for", field.url, e); + // Fallback: legacy single transform so the block still renders. + try { + block.resolvedImageSrc = await ensureTransformedImage(field.url, { + ...transformParams, + focalX: transformParams.focalX ?? field.focal?.x, + focalY: transformParams.focalY ?? field.focal?.y, + }); + } catch { + // give up — ImageBlock shows "Bild nicht verfügbar" + } } continue; } if (block._type === "image_gallery" && Array.isArray(block.images)) { for (const img of block.images) { if (!img || typeof img !== "object") continue; - const url = getGalleryImageUrl(img); - if (!url) continue; + const field = getGalleryImageField(img); + if (!field) continue; try { - (img as { resolvedSrc?: string }).resolvedSrc = - await ensureTransformedImage(url, galleryParams); + const responsive = await ensureResponsiveImage(field.url, { + widths: [600, 1280], + formats: ["webp", "jpeg"], + quality: 80, + focal: field.focal, + fit: "contain", + }); + (img as { resolvedResponsive?: ResponsiveImage }).resolvedResponsive = responsive; + (img as { resolvedSrc?: string }).resolvedSrc = responsive.fallback; } catch (e) { - console.warn("[rusty-image] gallery resolve failed for", url, e); + console.warn("[rusty-image] gallery responsive failed for", field.url, e); + try { + (img as { resolvedSrc?: string }).resolvedSrc = + await ensureTransformedImage(field.url, { + ...galleryParams, + focalX: galleryParams.focalX ?? field.focal?.x, + focalY: galleryParams.focalY ?? field.focal?.y, + }); + } catch { + // give up + } } } continue; diff --git a/src/lib/server-image.ts b/src/lib/server-image.ts new file mode 100644 index 0000000..34668ff --- /dev/null +++ b/src/lib/server-image.ts @@ -0,0 +1,19 @@ +/** Server-only helpers around `rusty-image`. Lives in its own file so client + * (Svelte) components that import other utilities from `blog-utils` don't + * accidentally pull `node:crypto`/`node:fs` into the browser bundle. */ + +import { ensureResponsiveImage, type ResponsiveImage } from "./rusty-image"; + +/** Build the standard post-card responsive image (3:2 cover, WebP/JPEG, mobile→desktop widths). */ +export async function resolvePostCardResponsive( + field: { url: string; focal?: { x: number; y: number } }, +): Promise { + return ensureResponsiveImage(field.url, { + widths: [400, 800], + formats: ["webp", "jpeg"], + ar: "3:2", + fit: "cover", + quality: 78, + focal: field.focal, + }); +} diff --git a/src/pages/post/[slug].astro b/src/pages/post/[slug].astro index 0f6527f..53d8a27 100644 --- a/src/pages/post/[slug].astro +++ b/src/pages/post/[slug].astro @@ -22,7 +22,7 @@ import { resolvePostTagsInPost, resolvePostOverviewBlocks, resolveSearchableTextBlocks, - getPostImageUrl, + getPostImageField, formatPostDate, } from "../../lib/blog-utils"; import { POST_RESOLVE } from "../../lib/constants"; @@ -60,12 +60,14 @@ const tagsMap = await resolvePostOverviewBlocks(post); await resolveSearchableTextBlocks(post, tagsMap); resolvePostTagsInPost(post, tagsMap); -const rawPostImageUrl = getPostImageUrl(post.postImage); -const postImageUrl = rawPostImageUrl - ? await ensureTransformedImage(rawPostImageUrl, { +const postImageField = getPostImageField(post.postImage); +const postImageUrl = postImageField + ? await ensureTransformedImage(postImageField.url, { width: 150, height: 200, fit: "cover", + focalX: postImageField.focal?.x, + focalY: postImageField.focal?.y, }) : null; diff --git a/src/pages/posts/index.astro b/src/pages/posts/index.astro index 1227696..7bcc4fb 100644 --- a/src/pages/posts/index.astro +++ b/src/pages/posts/index.astro @@ -14,7 +14,7 @@ import { getPostsPerPage, getTagsMap, resolvePostTagsInPost, - getPostImageUrl, + getPostImageField, buildPostSearchIndex, selectUpcomingEvents, } from '../../lib/blog-utils'; @@ -32,13 +32,18 @@ try { const tagsMap = await getTagsMap(); for (const p of posts) resolvePostTagsInPost(p, tagsMap); // Resolve post card images - const { ensureTransformedImage } = await import('../../lib/rusty-image'); + const { resolvePostCardResponsive } = await import('../../lib/server-image'); for (const post of posts) { - const raw = getPostImageUrl(post.postImage); - if (raw) { + const field = getPostImageField(post.postImage); + if (field) { try { - const url = await ensureTransformedImage(raw, { width: 400, height: 267, fit: 'cover', format: 'webp' }); - (post as typeof post & { _resolvedImageUrl?: string })._resolvedImageUrl = url; + const responsive = await resolvePostCardResponsive(field); + const target = post as typeof post & { + _resolvedImageUrl?: string; + _resolvedResponsive?: Awaited>; + }; + target._resolvedResponsive = responsive; + target._resolvedImageUrl = responsive.fallback; } catch { /* image optional */ } } } diff --git a/src/pages/posts/page/[page].astro b/src/pages/posts/page/[page].astro index 4d19085..f98974e 100644 --- a/src/pages/posts/page/[page].astro +++ b/src/pages/posts/page/[page].astro @@ -9,7 +9,7 @@ import { getTotalPages, paginate, getPostsPerPage, - getPostImageUrl, + getPostImageField, buildPostSearchIndex, selectUpcomingEvents, } from '../../../lib/blog-utils'; @@ -43,13 +43,18 @@ let cmsError: string | null = null; try { [posts, tags] = await Promise.all([getPosts({ resolve: ['postImage'] }), getTags()]); posts = filterHiddenPosts(sortPostsByDate(posts)); - const { ensureTransformedImage } = await import('../../../lib/rusty-image'); + const { resolvePostCardResponsive } = await import('../../../lib/server-image'); for (const post of posts) { - const raw = getPostImageUrl(post.postImage); - if (raw) { + const field = getPostImageField(post.postImage); + if (field) { try { - const url = await ensureTransformedImage(raw, { width: 400, height: 267, fit: 'cover', format: 'webp' }); - (post as typeof post & { _resolvedImageUrl?: string })._resolvedImageUrl = url; + const responsive = await resolvePostCardResponsive(field); + const target = post as typeof post & { + _resolvedImageUrl?: string; + _resolvedResponsive?: Awaited>; + }; + target._resolvedResponsive = responsive; + target._resolvedImageUrl = responsive.fallback; } catch { /* image optional */ } } } diff --git a/src/pages/posts/tag/[tag].astro b/src/pages/posts/tag/[tag].astro index dd089cc..29f9c51 100644 --- a/src/pages/posts/tag/[tag].astro +++ b/src/pages/posts/tag/[tag].astro @@ -11,7 +11,7 @@ import { getPostsPerPage, getTagsMap, resolvePostTagsInPost, - getPostImageUrl, + getPostImageField, buildPostSearchIndex, selectUpcomingEvents, } from '../../../lib/blog-utils'; @@ -56,10 +56,17 @@ try { for (const p of posts) resolvePostTagsInPost(p, tagsMap); const { ensureTransformedImage } = await import('../../../lib/rusty-image'); for (const post of posts) { - const raw = getPostImageUrl(post.postImage); - if (raw) { + const field = getPostImageField(post.postImage); + if (field) { try { - const url = await ensureTransformedImage(raw, { width: 400, height: 267, fit: 'cover', format: 'webp' }); + const url = await ensureTransformedImage(field.url, { + width: 400, + height: 267, + fit: 'cover', + format: 'webp', + focalX: field.focal?.x, + focalY: field.focal?.y, + }); (post as typeof post & { _resolvedImageUrl?: string })._resolvedImageUrl = url; } catch { /* image optional */ } } diff --git a/src/pages/posts/tag/[tag]/page/[page].astro b/src/pages/posts/tag/[tag]/page/[page].astro index 2bf3866..3f53588 100644 --- a/src/pages/posts/tag/[tag]/page/[page].astro +++ b/src/pages/posts/tag/[tag]/page/[page].astro @@ -11,7 +11,7 @@ import { getPostsPerPage, getTagsMap, resolvePostTagsInPost, - getPostImageUrl, + getPostImageField, buildPostSearchIndex, selectUpcomingEvents, } from '../../../../../lib/blog-utils'; @@ -66,13 +66,18 @@ try { posts = filterHiddenPosts(sortPostsByDate(posts)); const tagsMap = await getTagsMap(); for (const p of posts) resolvePostTagsInPost(p, tagsMap); - const { ensureTransformedImage } = await import('../../../../../lib/rusty-image'); + const { resolvePostCardResponsive } = await import('../../../../../lib/server-image'); for (const post of posts) { - const raw = getPostImageUrl(post.postImage); - if (raw) { + const field = getPostImageField(post.postImage); + if (field) { try { - const url = await ensureTransformedImage(raw, { width: 400, height: 267, fit: 'cover', format: 'webp' }); - (post as typeof post & { _resolvedImageUrl?: string })._resolvedImageUrl = url; + const responsive = await resolvePostCardResponsive(field); + const target = post as typeof post & { + _resolvedImageUrl?: string; + _resolvedResponsive?: Awaited>; + }; + target._resolvedResponsive = responsive; + target._resolvedImageUrl = responsive.fallback; } catch { /* image optional */ } } } diff --git a/yarn.lock b/yarn.lock index 86c2041..1590c22 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1933,6 +1933,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +blurhash@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-2.0.5.tgz#efde729fc14a2f03571a6aa91b49cba80d1abe4b" + integrity sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w== + boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"