RustyCMS: File-based headless CMS with REST API, admin UI, multilingual support

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Peter Meier
2026-02-16 09:30:30 +01:00
commit aad93d145f
224 changed files with 19225 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"author": {
"description": "Author name",
"type": "string"
},
"body": {
"description": "Main content (Markdown)",
"minLength": 1,
"type": "string"
},
"created_at": {
"description": "Creation timestamp (auto-generated)",
"format": "date-time",
"readOnly": true,
"type": "string"
},
"excerpt": {
"description": "Short summary for previews",
"maxLength": 500,
"type": "string"
},
"published": {
"default": false,
"description": "Whether the post is publicly visible",
"type": "boolean"
},
"tags": {
"description": "Categorisation tags",
"items": {
"type": "string"
},
"type": "array"
},
"title": {
"description": "Title of the blog post",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"_slug",
"title",
"body"
],
"type": "object"
}

View File

@@ -0,0 +1,109 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"row1AlignItems": {
"default": "stretch",
"description": "Align items for row 1",
"enum": [
"start",
"end",
"center",
"baseline",
"stretch"
],
"type": "string"
},
"row1Content": {
"description": "Content components for row 1 (Markdown blocks)",
"items": {
"description": "Reference (slug) to collection 'markdown'",
"type": "string"
},
"type": "array"
},
"row1JustifyContent": {
"default": "start",
"description": "Justify content for row 1",
"enum": [
"start",
"end",
"center",
"between",
"around",
"evenly"
],
"type": "string"
},
"row2AlignItems": {
"default": "stretch",
"enum": [
"start",
"end",
"center",
"baseline",
"stretch"
],
"type": "string"
},
"row2Content": {
"description": "Content components for row 2",
"items": {
"description": "Reference (slug) to collection '?'",
"type": "string"
},
"type": "array"
},
"row2JustifyContent": {
"default": "start",
"enum": [
"start",
"end",
"center",
"between",
"around",
"evenly"
],
"type": "string"
},
"row3AlignItems": {
"default": "stretch",
"enum": [
"start",
"end",
"center",
"baseline",
"stretch"
],
"type": "string"
},
"row3Content": {
"description": "Content components for row 3",
"items": {
"description": "Reference (slug) to collection '?'",
"type": "string"
},
"type": "array"
},
"row3JustifyContent": {
"default": "start",
"enum": [
"start",
"end",
"center",
"between",
"around",
"evenly"
],
"type": "string"
}
},
"required": [
"_slug"
],
"type": "object"
}

View File

@@ -0,0 +1,63 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"id": {
"description": "Unique footer ID (e.g. for navigation)",
"type": "string"
},
"row1AlignItems": {
"default": "stretch",
"description": "Align items for row 1",
"enum": ["start", "end", "center", "baseline", "stretch"],
"type": "string"
},
"row1Content": {
"description": "Content components for row 1",
"items": { "type": "string" },
"type": "array"
},
"row1JustifyContent": {
"default": "start",
"description": "Justify content for row 1",
"enum": ["start", "end", "center", "between", "around", "evenly"],
"type": "string"
},
"row2AlignItems": {
"default": "stretch",
"enum": ["start", "end", "center", "baseline", "stretch"],
"type": "string"
},
"row2Content": {
"description": "Content components for row 2",
"items": { "type": "string" },
"type": "array"
},
"row2JustifyContent": {
"default": "start",
"enum": ["start", "end", "center", "between", "around", "evenly"],
"type": "string"
},
"row3AlignItems": {
"default": "stretch",
"enum": ["start", "end", "center", "baseline", "stretch"],
"type": "string"
},
"row3Content": {
"description": "Content components for row 3",
"items": { "type": "string" },
"type": "array"
},
"row3JustifyContent": {
"default": "start",
"enum": ["start", "end", "center", "between", "around", "evenly"],
"type": "string"
}
},
"required": ["_slug", "id"],
"type": "object"
}

View File

@@ -0,0 +1,46 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"headline": {
"type": "string"
},
"image": {
"description": "Image URLs",
"items": {
"type": "string"
},
"type": "array"
},
"name": {
"description": "Internal name",
"type": "string"
},
"subheadline": {
"type": "string"
},
"text": {
"description": "Banner body text",
"type": "string"
},
"variant": {
"description": "Color variant",
"enum": [
"dark",
"light"
],
"type": "string"
}
},
"required": [
"_slug",
"name",
"variant",
"headline"
],
"type": "object"
}

View File

@@ -0,0 +1,27 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": { "description": "Entry identifier", "type": "string" },
"internal": { "description": "Internal key", "type": "string" },
"text": { "description": "Headline text", "type": "string" },
"tag": {
"description": "HTML tag",
"enum": ["h1", "h2", "h3", "h4", "h5", "h6"],
"type": "string"
},
"layout": {
"properties": {
"mobile": { "default": "12", "enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], "type": "string" },
"tablet": { "enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], "type": "string" },
"desktop": { "enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"], "type": "string" },
"spaceBottom": { "enum": [0, 0.5, 1, 1.5, 2], "type": "number" }
},
"required": ["mobile"],
"type": "object"
},
"align": { "enum": ["left", "center", "right"], "type": "string" }
},
"required": ["_slug", "internal", "text", "tag"],
"type": "object"
}

48
schemas/html.schema.json Normal file
View File

@@ -0,0 +1,48 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"id": {
"description": "Unique component ID",
"type": "string"
},
"html": {
"description": "HTML content (safely embedded)",
"type": "string"
},
"layout": {
"description": "Column width (grid) like CF_ComponentLayout",
"properties": {
"mobile": {
"default": "12",
"description": "Width on mobile (112)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"tablet": {
"description": "Width on tablet (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"desktop": {
"description": "Width on desktop (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"spaceBottom": {
"description": "Space below (rem)",
"enum": [0, 0.5, 1, 1.5, 2],
"type": "number"
}
},
"required": ["mobile"],
"type": "object"
}
},
"required": ["_slug", "id", "html"],
"type": "object"
}

View File

@@ -0,0 +1,56 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"name": {
"description": "Internal component name",
"type": "string"
},
"content": {
"description": "Description/content for iframe",
"type": "string"
},
"iframe": {
"description": "Iframe URL or embed code",
"type": "string"
},
"overlayImage": {
"description": "Reference (slug) to collection 'img'",
"type": "string"
},
"layout": {
"description": "Column width (grid) like CF_ComponentLayout",
"properties": {
"mobile": {
"default": "12",
"description": "Width on mobile (112)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"tablet": {
"description": "Width on tablet (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"desktop": {
"description": "Width on desktop (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"spaceBottom": {
"description": "Space below (rem)",
"enum": [0, 0.5, 1, 1.5, 2],
"type": "number"
}
},
"required": ["mobile"],
"type": "object"
}
},
"required": ["_slug", "name", "content", "iframe"],
"type": "object"
}

60
schemas/image.schema.json Normal file
View File

@@ -0,0 +1,60 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"name": {
"description": "Internal component name",
"type": "string"
},
"image": {
"description": "Reference (slug) to collection 'img'",
"type": "string"
},
"caption": {
"description": "Image caption",
"type": "string"
},
"layout": {
"description": "Column width (grid) like CF_ComponentLayout",
"properties": {
"mobile": {
"default": "12",
"description": "Width on mobile (112)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"tablet": {
"description": "Width on tablet (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"desktop": {
"description": "Width on desktop (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"spaceBottom": {
"description": "Space below (rem)",
"enum": [0, 0.5, 1, 1.5, 2],
"type": "number"
}
},
"required": ["mobile"],
"type": "object"
},
"maxWidth": {
"description": "Max width in px",
"type": "number"
},
"aspectRatio": {
"description": "Aspect ratio (e.g. 16/9)",
"type": "number"
}
},
"required": ["_slug", "name", "image"],
"type": "object"
}

View File

@@ -0,0 +1,55 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"name": {
"description": "Internal gallery name",
"type": "string"
},
"images": {
"description": "References (slugs) to collection 'img'",
"items": {
"type": "string"
},
"type": "array"
},
"layout": {
"description": "Column width (grid) like CF_ComponentLayout",
"properties": {
"mobile": {
"default": "12",
"description": "Width on mobile (112)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"tablet": {
"description": "Width on tablet (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"desktop": {
"description": "Width on desktop (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"spaceBottom": {
"description": "Space below (rem)",
"enum": [0, 0.5, 1, 1.5, 2],
"type": "number"
}
},
"required": ["mobile"],
"type": "object"
},
"description": {
"description": "Optional gallery description",
"type": "string"
}
},
"required": ["_slug", "name", "images"],
"type": "object"
}

39
schemas/img.schema.json Normal file
View File

@@ -0,0 +1,39 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"title": {
"description": "Image title",
"type": "string"
},
"description": {
"description": "Alt text / description",
"type": "string"
},
"file": {
"type": "object",
"properties": {
"url": { "type": "string", "description": "Image URL" },
"fileName": { "type": "string" },
"contentType": { "type": "string" },
"details": {
"type": "object",
"properties": {
"size": { "type": "number" },
"image": {
"type": "object",
"properties": { "width": { "type": "number" }, "height": { "type": "number" } }
}
}
}
},
"required": ["url"]
}
},
"required": ["_slug", "title", "file"],
"type": "object"
}

68
schemas/link.schema.json Normal file
View File

@@ -0,0 +1,68 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"name": {
"description": "Internal link name",
"type": "string"
},
"internal": {
"description": "Internal key",
"type": "string"
},
"linkName": {
"description": "Display name (e.g. in navigation)",
"type": "string"
},
"url": {
"description": "Target URL",
"type": "string"
},
"icon": {
"description": "Icon identifier",
"type": "string"
},
"color": {
"description": "Color (e.g. for buttons)",
"type": "string"
},
"newTab": {
"description": "Open in new tab",
"type": "boolean"
},
"external": {
"description": "External link",
"type": "boolean"
},
"description": {
"description": "Description",
"type": "string"
},
"alt": {
"description": "Alt text (e.g. for icon)",
"type": "string"
},
"showText": {
"description": "Show text",
"type": "boolean"
},
"author": {
"description": "Author (e.g. for sources)",
"type": "string"
},
"date": {
"description": "Date (e.g. publication)",
"type": "string"
},
"source": {
"description": "Source",
"type": "string"
}
},
"required": ["_slug", "name", "internal", "linkName", "url", "author", "date", "source"],
"type": "object"
}

View File

@@ -0,0 +1,15 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": { "description": "Entry identifier", "type": "string" },
"headline": { "description": "Link list headline", "type": "string" },
"links": {
"description": "References (slugs) to collection 'link'",
"items": { "type": "string" },
"type": "array"
}
},
"required": ["_slug", "headline", "links"],
"type": "object"
}

15
schemas/list.schema.json Normal file
View File

@@ -0,0 +1,15 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": { "description": "Entry identifier", "type": "string" },
"internal": { "description": "Internal key", "type": "string" },
"item": {
"description": "List entries",
"items": { "type": "string" },
"type": "array"
}
},
"required": ["_slug", "internal", "item"],
"type": "object"
}

View File

@@ -0,0 +1,108 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"alignment": {
"default": "left",
"description": "Text alignment",
"enum": [
"left",
"center",
"right"
],
"type": "string"
},
"content": {
"description": "Markdown/body text content",
"type": "string"
},
"layout": {
"description": "Column width (grid) like CF_ComponentLayout",
"properties": {
"desktop": {
"description": "Width on desktop (optional)",
"enum": [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12"
],
"type": "string"
},
"mobile": {
"default": "12",
"description": "Width on mobile (112)",
"enum": [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12"
],
"type": "string"
},
"spaceBottom": {
"description": "Space below (rem)",
"enum": [
0,
0.5,
1,
1.5,
2
],
"type": "number"
},
"tablet": {
"description": "Width on tablet (optional)",
"enum": [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12"
],
"type": "string"
}
},
"required": [
"mobile"
],
"type": "object"
},
"name": {
"description": "Internal component name",
"type": "string"
}
},
"required": [
"_slug",
"name"
],
"type": "object"
}

View File

@@ -0,0 +1,27 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"name": {
"description": "Display name of navigation",
"type": "string"
},
"internal": {
"description": "Internal key (e.g. navigation-header, navigation-footer)",
"type": "string"
},
"links": {
"description": "References (slugs) to link, page or post",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": ["_slug", "name", "internal", "links"],
"type": "object"
}

114
schemas/page.schema.json Normal file
View File

@@ -0,0 +1,114 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"headline": {
"type": "string"
},
"icon": {
"description": "Icon identifier (optional)",
"type": "string"
},
"linkName": {
"description": "Display name in navigation",
"type": "string"
},
"name": {
"description": "Internal page name",
"type": "string"
},
"row1AlignItems": {
"default": "stretch",
"description": "Align items for row 1",
"enum": ["start", "end", "center", "baseline", "stretch"],
"type": "string"
},
"row1Content": {
"description": "Content components for row 1 (Markdown blocks)",
"items": {
"description": "Reference (slug) to collection 'markdown'",
"type": "string"
},
"type": "array"
},
"row1JustifyContent": {
"default": "start",
"description": "Justify content for row 1",
"enum": ["start", "end", "center", "between", "around", "evenly"],
"type": "string"
},
"row2AlignItems": {
"default": "stretch",
"enum": ["start", "end", "center", "baseline", "stretch"],
"type": "string"
},
"row2Content": {
"description": "Content components for row 2",
"items": {
"description": "Reference (slug) to collection '?'",
"type": "string"
},
"type": "array"
},
"row2JustifyContent": {
"default": "start",
"enum": ["start", "end", "center", "between", "around", "evenly"],
"type": "string"
},
"row3AlignItems": {
"default": "stretch",
"enum": ["start", "end", "center", "baseline", "stretch"],
"type": "string"
},
"row3Content": {
"description": "Content components for row 3",
"items": {
"description": "Reference (slug) to collection '?'",
"type": "string"
},
"type": "array"
},
"row3JustifyContent": {
"default": "start",
"enum": ["start", "end", "center", "between", "around", "evenly"],
"type": "string"
},
"seoDescription": {
"description": "Meta description for search engines",
"maxLength": 160,
"type": "string"
},
"seoMetaRobots": {
"default": "index, follow",
"description": "Robots meta directive",
"enum": [
"index, follow",
"noindex, follow",
"index, nofollow",
"noindex, nofollow"
],
"type": "string"
},
"seoTitle": {
"description": "SEO page title",
"type": "string"
},
"slug": {
"description": "URL slug",
"type": "string"
},
"subheadline": {
"type": "string"
},
"topFullwidthBanner": {
"description": "Hero banner at the top",
"type": "string"
}
},
"required": ["_slug", "seoTitle", "slug", "name", "linkName", "headline"],
"type": "object"
}

View File

@@ -0,0 +1,44 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"logo": {
"description": "Reference (slug) to collection 'img'",
"type": "string"
},
"footerText1": {
"description": "Footer text (e.g. copyright)",
"type": "string"
},
"seoTitle": {
"description": "Default SEO title for website",
"type": "string"
},
"seoDescription": {
"description": "Default meta description",
"type": "string"
},
"blogTagPageHeadline": {
"description": "Headline for tag page (blog)",
"type": "string"
},
"blogPostsPageHeadline": {
"description": "Headline for blog overview page",
"type": "string"
},
"blogPostsPageSubHeadline": {
"description": "Subheadline for blog overview page",
"type": "string"
},
"website": {
"description": "Website URL",
"type": "string"
}
},
"required": ["_slug", "logo", "footerText1", "seoTitle", "seoDescription", "website"],
"type": "object"
}

190
schemas/post.schema.json Normal file
View File

@@ -0,0 +1,190 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"created": {
"format": "date-time",
"readOnly": true,
"type": "string"
},
"excerpt": {
"description": "Short summary for previews",
"maxLength": 500,
"type": "string"
},
"headline": {
"type": "string"
},
"icon": {
"type": "string"
},
"linkName": {
"type": "string"
},
"postImage": {
"description": "Featured image",
"type": "string"
},
"postTag": {
"description": "Associated tags",
"items": {
"description": "Reference (slug) to collection 'tag'",
"type": "string"
},
"type": "array"
},
"row1AlignItems": {
"default": "stretch",
"description": "Align items for row 1",
"enum": [
"start",
"end",
"center",
"baseline",
"stretch"
],
"type": "string"
},
"row1Content": {
"description": "Content components for row 1 (Markdown blocks)",
"items": {
"description": "Reference (slug) to collection 'markdown'",
"type": "string"
},
"type": "array"
},
"row1JustifyContent": {
"default": "start",
"description": "Justify content for row 1",
"enum": [
"start",
"end",
"center",
"between",
"around",
"evenly"
],
"type": "string"
},
"row2AlignItems": {
"default": "stretch",
"enum": [
"start",
"end",
"center",
"baseline",
"stretch"
],
"type": "string"
},
"row2Content": {
"description": "Content components for row 2",
"items": {
"description": "Reference (slug) to collection '?'",
"type": "string"
},
"type": "array"
},
"row2JustifyContent": {
"default": "start",
"enum": [
"start",
"end",
"center",
"between",
"around",
"evenly"
],
"type": "string"
},
"row3AlignItems": {
"default": "stretch",
"enum": [
"start",
"end",
"center",
"baseline",
"stretch"
],
"type": "string"
},
"row3Content": {
"description": "Content components for row 3",
"items": {
"description": "Reference (slug) to collection '?'",
"type": "string"
},
"type": "array"
},
"row3JustifyContent": {
"default": "start",
"enum": [
"start",
"end",
"center",
"between",
"around",
"evenly"
],
"type": "string"
},
"seoDescription": {
"description": "Meta description for search engines",
"maxLength": 160,
"type": "string"
},
"seoMetaRobots": {
"default": "index, follow",
"description": "Robots meta directive",
"enum": [
"index, follow",
"noindex, follow",
"index, nofollow",
"noindex, nofollow"
],
"type": "string"
},
"seoTitle": {
"description": "SEO page title",
"type": "string"
},
"slug": {
"type": "string"
},
"subheadline": {
"type": "string"
},
"content": {
"description": "Post body (Markdown/HTML)",
"type": "string"
},
"date": {
"description": "Optional display date",
"format": "date-time",
"type": "string"
},
"important": {
"description": "Mark post as important",
"type": "boolean"
},
"showCommentSection": {
"default": true,
"description": "Show comment section (default: true)",
"type": "boolean"
}
},
"required": [
"_slug",
"seoTitle",
"slug",
"linkName",
"headline",
"important",
"content"
],
"type": "object"
}

View File

@@ -0,0 +1,76 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"category": {
"description": "Product category",
"enum": [
"electronics",
"clothing",
"books",
"food",
"other"
],
"type": "string"
},
"created_at": {
"format": "date-time",
"readOnly": true,
"type": "string"
},
"description": {
"description": "Detailed product description",
"maxLength": 5000,
"type": "string"
},
"images": {
"description": "Product image URLs (110)",
"items": {
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"type": "array"
},
"in_stock": {
"default": true,
"description": "Whether the product is in stock",
"type": "boolean"
},
"price": {
"description": "Price in EUR",
"minimum": 0.0,
"type": "number"
},
"rating": {
"description": "Average customer rating (null if unrated)",
"maximum": 5.0,
"minimum": 0.0,
"nullable": true,
"type": "number"
},
"sku": {
"description": "Stock Keeping Unit (e.g. EL-1234, BOOK-00042)",
"pattern": "^[A-Z]{2,4}-\\d{3,6}$",
"type": "string"
},
"title": {
"description": "Product name",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"_slug",
"title",
"sku",
"price",
"category"
],
"type": "object"
}

53
schemas/quote.schema.json Normal file
View File

@@ -0,0 +1,53 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"quote": {
"description": "Quote text",
"type": "string"
},
"author": {
"description": "Author or source of quote",
"type": "string"
},
"variant": {
"description": "Quote alignment",
"enum": ["left", "right"],
"type": "string"
},
"layout": {
"description": "Column width (grid) like CF_ComponentLayout",
"properties": {
"mobile": {
"default": "12",
"description": "Width on mobile (112)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"tablet": {
"description": "Width on tablet (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"desktop": {
"description": "Width on desktop (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"spaceBottom": {
"description": "Space below (rem)",
"enum": [0, 0.5, 1, 1.5, 2],
"type": "number"
}
},
"required": ["mobile"],
"type": "object"
}
},
"required": ["_slug", "quote", "author", "variant"],
"type": "object"
}

View File

@@ -0,0 +1,62 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"id": {
"description": "Unique component ID",
"type": "string"
},
"tagWhitelist": {
"description": "References (slugs) to collection 'tag'",
"items": { "type": "string" },
"type": "array"
},
"textFragments": {
"description": "References (slugs) to collection 'text_fragment'",
"items": { "type": "string" },
"type": "array"
},
"title": {
"description": "Search component title",
"type": "string"
},
"description": {
"description": "Description",
"type": "string"
},
"layout": {
"description": "Column width (grid) like CF_ComponentLayout",
"properties": {
"mobile": {
"default": "12",
"description": "Width on mobile (112)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"tablet": {
"description": "Width on tablet (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"desktop": {
"description": "Width on desktop (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"spaceBottom": {
"description": "Space below (rem)",
"enum": [0, 0.5, 1, 1.5, 2],
"type": "number"
}
},
"required": ["mobile"],
"type": "object"
}
},
"required": ["_slug", "id", "textFragments"],
"type": "object"
}

35
schemas/seo.schema.json Normal file
View File

@@ -0,0 +1,35 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"seoDescription": {
"description": "Meta description for search engines",
"maxLength": 160,
"type": "string"
},
"seoMetaRobots": {
"default": "index, follow",
"description": "Robots meta directive",
"enum": [
"index, follow",
"noindex, follow",
"index, nofollow",
"noindex, nofollow"
],
"type": "string"
},
"seoTitle": {
"description": "SEO page title",
"type": "string"
}
},
"required": [
"_slug",
"seoTitle"
],
"type": "object"
}

18
schemas/tag.schema.json Normal file
View File

@@ -0,0 +1,18 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"_slug",
"name"
],
"type": "object"
}

View File

@@ -0,0 +1,29 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"id": {
"description": "Unique fragment ID",
"type": "string"
},
"tags": {
"description": "References (slugs) to collection 'tag'",
"items": { "type": "string" },
"type": "array"
},
"title": {
"description": "Text fragment title",
"type": "string"
},
"text": {
"description": "Searchable text content",
"type": "string"
}
},
"required": ["_slug", "id", "title", "text"],
"type": "object"
}

View File

@@ -0,0 +1,11 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": { "description": "Entry identifier", "type": "string" },
"id": { "description": "Unique ID", "type": "string" },
"text": { "description": "Banner text", "type": "string" }
},
"required": ["_slug", "id", "text"],
"type": "object"
}

View File

@@ -0,0 +1,60 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": true,
"properties": {
"_slug": {
"description": "Entry identifier (URL slug / filename without extension)",
"type": "string"
},
"id": {
"description": "Unique ID (optional)",
"type": "string"
},
"youtubeId": {
"description": "YouTube video ID (e.g. from URL ?v=VIDEO_ID)",
"type": "string"
},
"params": {
"description": "Optional URL params (e.g. start=30, autoplay=1)",
"type": "string"
},
"title": {
"description": "Video title",
"type": "string"
},
"description": {
"description": "Short description",
"type": "string"
},
"layout": {
"description": "Column width (grid) like CF_ComponentLayout",
"properties": {
"mobile": {
"default": "12",
"description": "Width on mobile (112)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"tablet": {
"description": "Width on tablet (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"desktop": {
"description": "Width on desktop (optional)",
"enum": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
"type": "string"
},
"spaceBottom": {
"description": "Space below (rem)",
"enum": [0, 0.5, 1, 1.5, 2],
"type": "number"
}
},
"required": ["mobile"],
"type": "object"
}
},
"required": ["_slug", "youtubeId"],
"type": "object"
}