diff --git a/modules/blox-tailwind/blox/collection/schema.json b/modules/blox-tailwind/blox/collection/schema.json index ebc0034f..d1126f16 100644 --- a/modules/blox-tailwind/blox/collection/schema.json +++ b/modules/blox-tailwind/blox/collection/schema.json @@ -11,7 +11,8 @@ "type": "object", "properties": { "block": { - "const": "collection" + "const": "collection", + "description": "Block type identifier" }, "content": { "type": "object", @@ -26,24 +27,24 @@ "description": "Section description (supports Markdown)" }, "count": { - "type": "number", - "description": "Maximum number of items to display", + "type": "integer", + "description": "Maximum number of items to display (0 means unlimited)", "minimum": 0, "default": 5 }, "offset": { - "type": "number", - "description": "Number of items to skip", + "type": "integer", + "description": "Number of items to skip from the start of the query", "minimum": 0, "default": 0 }, "page_type": { "type": "string", - "description": "Filter by page type (e.g., 'post', 'publication')" + "description": "Filter by page type/section (e.g., 'post', 'publication')" }, "sort_by": { "type": "string", - "description": "Field to sort by", + "description": "Field to sort by (e.g., Date, title, weight, lastmod)", "default": "Date" }, "sort_ascending": { @@ -60,6 +61,14 @@ "type": "object", "description": "Content filtering options", "properties": { + "kinds": { + "type": "array", + "description": "Limit to Hugo page kinds", + "items": { + "type": "string" + }, + "default": ["page"] + }, "folders": { "type": "array", "description": "Filter by content folders/sections", @@ -67,9 +76,16 @@ "type": "string" } }, + "tags": { + "type": "array", + "description": "Filter by multiple tags (intersection)", + "items": { + "type": "string" + } + }, "tag": { "type": "string", - "description": "Filter by tag" + "description": "Filter by a single tag" }, "category": { "type": "string", @@ -107,11 +123,103 @@ "description": "Exclude future-dated content", "default": false } - } + }, + "additionalProperties": false + }, + "archive": { + "type": "object", + "description": "Archive link configuration", + "properties": { + "enable": { + "type": "boolean", + "description": "Show archive link even when item count is below limit" + }, + "link": { + "type": "string", + "description": "Override archive URL (defaults to derived archive page)" + }, + "text": { + "type": "string", + "description": "Override archive link text" + } + }, + "additionalProperties": false } + }, + "additionalProperties": false + }, + "design": { + "type": "object", + "description": "Layout options for collection rendering", + "properties": { + "view": { + "type": "string", + "enum": ["card", "compact", "showcase", "citation", "list", "masonry"], + "description": "Display view type", + "default": "card" + }, + "columns": { + "type": ["integer", "string"], + "description": "Number of columns when using grid-based views", + "default": 2 + }, + "fill_image": { + "type": "boolean", + "description": "Fill cards with cover images when available", + "default": true + }, + "show_date": { + "type": "boolean", + "description": "Display published/modified date when available", + "default": true + }, + "show_read_time": { + "type": "boolean", + "description": "Display estimated reading time when available", + "default": true + }, + "show_read_more": { + "type": "boolean", + "description": "Show a read more link on cards", + "default": true + } + }, + "additionalProperties": true + } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "collection", + "content": { + "title": "Latest research notes", + "text": "Fresh from the lab notebook.", + "count": 6, + "page_type": "post", + "sort_by": "Date", + "sort_ascending": false, + "filters": { + "folders": ["post"], + "tags": ["alignment", "evaluations"], + "featured_only": true + }, + "archive": { + "enable": true, + "text": "All posts", + "link": "/post/" + } + }, + "design": { + "view": "card", + "columns": 3, + "fill_image": true, + "show_date": true, + "show_read_time": true, + "show_read_more": true } } - } + ] } ] } diff --git a/modules/blox-tailwind/blox/contact-info/schema.json b/modules/blox-tailwind/blox/contact-info/schema.json index d8e6a222..7e00d9a8 100644 --- a/modules/blox-tailwind/blox/contact-info/schema.json +++ b/modules/blox-tailwind/blox/contact-info/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/contact-info.json", "title": "Contact Info Block Schema", - "description": "Schema for the Contact Info block - displays lab contact information in a modern card layout", + "description": "Schema for the Contact Info block - displays lab contact details, map, social links, and an optional form", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,7 +11,8 @@ "type": "object", "properties": { "block": { - "const": "contact-info" + "const": "contact-info", + "description": "Block type identifier" }, "content": { "type": "object", @@ -47,7 +48,8 @@ "type": "string" } } - } + }, + "additionalProperties": false }, "office_hours": { "type": "array", @@ -58,7 +60,8 @@ }, "email": { "type": "string", - "description": "Contact email address" + "description": "Contact email address", + "format": "email" }, "phone": { "type": "string", @@ -78,7 +81,9 @@ "type": "string", "description": "Social media URL" } - } + }, + "required": ["icon", "url"], + "additionalProperties": false } }, "prospective": { @@ -90,7 +95,8 @@ "default": "Prospective Members" }, "text": { - "type": "string" + "type": "string", + "description": "Short note for new collaborators or recruits" }, "button": { "type": "object", @@ -101,9 +107,12 @@ "url": { "type": "string" } - } + }, + "required": ["text", "url"], + "additionalProperties": false } - } + }, + "additionalProperties": false }, "map_url": { "type": "string", @@ -115,16 +124,56 @@ }, "show_form": { "type": "boolean", - "description": "Show contact form", + "description": "Show a basic contact form", "default": false }, "form_action": { "type": "string", "description": "Form submission URL" } + }, + "additionalProperties": false + } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "contact-info", + "content": { + "title": "Contact the lab", + "subtitle": "We respond within 2 business days.", + "visit_title": "Visit us", + "address": { + "lines": ["AI Lab, Engineering Building", "123 Innovation Way", "Cambridge, MA"] + }, + "office_hours": ["Mon–Thu: 10:00–16:00", "Fri: Remote"], + "map_url": "https://maps.google.com/?q=Cambridge", + "email": "hello@hugoblox.com", + "phone": "+1 415 000 0000", + "social": [ + { + "icon": "brands/linkedin", + "url": "https://linkedin.com/company/hugoblox" + }, + { + "icon": "brands/x", + "url": "https://x.com/hugoblox" + } + ], + "prospective": { + "title": "Prospective members", + "text": "Tell us about your research interests and links to prior work.", + "button": { + "text": "Apply", + "url": "/apply" + } + }, + "show_form": true, + "form_action": "https://formspree.io/f/example" } } - } + ] } ] } diff --git a/modules/blox-tailwind/blox/cta-button-list/schema.json b/modules/blox-tailwind/blox/cta-button-list/schema.json index 23fa172c..af4d4355 100644 --- a/modules/blox-tailwind/blox/cta-button-list/schema.json +++ b/modules/blox-tailwind/blox/cta-button-list/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/cta-button-list.json", "title": "CTA Button List Block Schema", - "description": "Schema for the CTA Button List block - displays a vertical list of call-to-action buttons", + "description": "Schema for the CTA Button List block - renders stacked buttons with icons", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,38 +11,62 @@ "type": "object", "properties": { "block": { - "const": "cta-button-list" + "const": "cta-button-list", + "description": "Block type identifier" }, "content": { "type": "object", - "description": "Content configuration for the CTA button list block", "properties": { "buttons": { "type": "array", - "description": "Array of buttons to display", + "description": "Buttons to render", "items": { "type": "object", "properties": { + "text": { + "type": "string", + "description": "Button label (supports Markdown)" + }, "url": { "type": "string", "description": "Button URL" }, - "text": { - "type": "string", - "description": "Button text (supports Markdown)" - }, "icon": { "type": "string", - "description": "Optional button icon (icon pack format: pack/icon-name)" + "description": "Optional leading icon (icon pack format: pack/icon-name)" } }, - "required": ["url", "text"] - } + "required": ["text", "url"], + "additionalProperties": false + }, + "minItems": 1 } }, - "required": ["buttons"] + "required": ["buttons"], + "additionalProperties": false } - } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "cta-button-list", + "content": { + "buttons": [ + { + "text": "Join the waitlist", + "url": "https://hugoblox.com/waitlist", + "icon": "hero/sparkles" + }, + { + "text": "Read the docs", + "url": "/docs/", + "icon": "hero/book-open" + } + ] + } + } + ] } ] } diff --git a/modules/blox-tailwind/blox/cta-card/schema.json b/modules/blox-tailwind/blox/cta-card/schema.json index c7f68fef..29e83b04 100644 --- a/modules/blox-tailwind/blox/cta-card/schema.json +++ b/modules/blox-tailwind/blox/cta-card/schema.json @@ -11,7 +11,8 @@ "type": "object", "properties": { "block": { - "const": "cta-card" + "const": "cta-card", + "description": "Block type identifier" }, "content": { "type": "object", @@ -42,21 +43,27 @@ "description": "Optional button icon (icon pack format: pack/icon-name)" } }, - "required": ["url", "text"] + "required": ["url", "text"], + "additionalProperties": false } - } + }, + "required": ["title", "text", "button"], + "additionalProperties": false }, "design": { "type": "object", - "description": "Design and styling options", + "description": "Card-specific styling options", "properties": { "card": { "type": "object", - "description": "Card-specific styling", "properties": { "css_class": { "type": "string", - "description": "CSS classes to apply to the card (supports glassmorphism classes: glassmorphism-primary, glassmorphism-dark, glass-ring, glass-shadow, noise-texture)" + "description": "CSS classes to apply to the card (e.g., glassmorphism-primary, glass-ring)" + }, + "css_style": { + "type": "string", + "description": "Inline CSS for the card container" }, "text_color": { "type": "string", @@ -70,79 +77,45 @@ "maximum": 1, "description": "Glassmorphism overlay opacity for fine-tuning contrast", "default": 0.15 - }, - "css_style": { - "type": "string", - "description": "Custom CSS styles to apply to the card" } - } - }, + }, + "additionalProperties": false + } + }, + "additionalProperties": true + } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "cta-card", + "design": { "background": { - "type": "object", - "description": "Modern background options supporting layered effects", - "properties": { - "color": { - "type": "string", - "description": "Background color" - }, - "gradient": { - "type": "object", - "description": "Modern gradient syntax for 2025 glassmorphism", - "properties": { - "start": { - "type": "string", - "description": "Gradient start color (e.g., 'primary-500', 'blue-600')" - }, - "end": { - "type": "string", - "description": "Gradient end color (e.g., 'primary-700', 'blue-800')" - }, - "direction": { - "type": "number", - "description": "Gradient angle in degrees (default: 90)", - "default": 90 - } - } - }, - "image": { - "type": "object", - "description": "Background image (layers with gradient for glassmorphism)", - "properties": { - "filename": { - "type": "string", - "description": "Image filename in assets/media/" - }, - "size": { - "type": "string", - "enum": ["cover", "contain", "auto", "100px", "50%"], - "description": "Background size", - "default": "cover" - }, - "position": { - "type": "string", - "enum": ["center", "top", "bottom", "left", "right", "repeat", "top left", "top right", "bottom left", "bottom right"], - "description": "Background position (use 'repeat' for tiling textures)", - "default": "center" - }, - "repeat": { - "type": "string", - "enum": ["repeat", "repeat-x", "repeat-y", "no-repeat"], - "description": "Explicit background-repeat control", - "default": "no-repeat" - }, - "opacity": { - "type": "number", - "minimum": 0, - "maximum": 1, - "description": "Image opacity for subtle textures" - } - } - } - } + "gradient": { + "start": "primary-500", + "end": "secondary-600", + "direction": "135" + }, + "text_color_light": true + }, + "card": { + "css_class": "glassmorphism-primary", + "text_color": "auto", + "overlay_opacity": 0.15 + } + }, + "content": { + "title": "Ready to launch?", + "text": "Ship a Hugo Blox site with production-ready Tailwind 4 in minutes.", + "button": { + "url": "/contact/", + "text": "Talk to us", + "icon": "hero/arrow-right" } } } - } + ] } ] } diff --git a/modules/blox-tailwind/blox/cta-image-paragraph/schema.json b/modules/blox-tailwind/blox/cta-image-paragraph/schema.json index 6ba2220b..b9485e36 100644 --- a/modules/blox-tailwind/blox/cta-image-paragraph/schema.json +++ b/modules/blox-tailwind/blox/cta-image-paragraph/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/cta-image-paragraph.json", "title": "CTA Image Paragraph Block Schema", - "description": "Schema for the CTA Image Paragraph block - displays alternating image and text sections with features and buttons", + "description": "Schema for the CTA Image Paragraph block - alternating media and copy with optional feature bullets and button", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,65 +11,95 @@ "type": "object", "properties": { "block": { - "const": "cta-image-paragraph" + "const": "cta-image-paragraph", + "description": "Block type identifier" }, "content": { "type": "object", - "description": "Content configuration for the CTA image paragraph block", "properties": { "items": { "type": "array", - "description": "Array of image-paragraph items", + "description": "CTA sections with media and supporting copy", "items": { "type": "object", "properties": { "title": { "type": "string", - "description": "Item title (supports Markdown)" + "description": "Heading for the CTA item" }, "text": { "type": "string", - "description": "Item description text (supports Markdown)" + "description": "Supporting paragraph (supports Markdown)" }, "image": { "type": "string", - "description": "Image filename (in assets/media/)" + "description": "Image filename in assets/media/", + "examples": ["screenshots/product.png"] + }, + "feature_icon": { + "type": "string", + "description": "Icon used before each feature bullet", + "default": "check" }, "features": { "type": "array", - "description": "Array of feature list items", + "description": "Bullet list shown under the paragraph", "items": { "type": "string" } }, - "feature_icon": { - "type": "string", - "description": "Icon for feature list items (icon pack format: pack/icon-name)", - "default": "check" - }, "button": { "type": "object", - "description": "Optional call-to-action button", + "description": "Optional CTA button", "properties": { - "url": { - "type": "string", - "description": "Button URL" - }, "text": { - "type": "string", - "description": "Button text" + "type": "string" + }, + "url": { + "type": "string" } }, - "required": ["url", "text"] + "required": ["text", "url"], + "additionalProperties": false } }, - "required": ["title", "text", "image"] - } + "required": ["title", "text", "image"], + "additionalProperties": false + }, + "minItems": 1 } }, - "required": ["items"] + "required": ["items"], + "additionalProperties": false } - } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "cta-image-paragraph", + "content": { + "items": [ + { + "title": "Ship polished docs with Hugo Blox", + "text": "Pair Markdown content with responsive imagery and reusable CTAs.", + "image": "screenshots/docs.png", + "feature_icon": "hero/check-circle", + "features": ["Responsive images generated automatically", "Markdown-first authoring", "Works with Netlify, Vercel, and GitHub Pages"], + "button": { + "text": "Read the guide", + "url": "/docs/get-started/" + } + }, + { + "title": "Launch production-ready marketing pages", + "text": "Use alternating layouts to highlight product benefits.", + "image": "screenshots/marketing.png" + } + ] + } + } + ] } ] } diff --git a/modules/blox-tailwind/blox/faq/schema.json b/modules/blox-tailwind/blox/faq/schema.json index 7883596e..d3e01b15 100644 --- a/modules/blox-tailwind/blox/faq/schema.json +++ b/modules/blox-tailwind/blox/faq/schema.json @@ -1,94 +1,138 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "FAQ Block", - "description": "Display frequently asked questions in an accordion format with FAQPage structured data", - "properties": { - "content": { + "$id": "https://hugoblox.com/schemas/blocks/faq.json", + "title": "FAQ Block Schema", + "description": "Display frequently asked questions in an accordion format with optional CTA", + "allOf": [ + { + "$ref": "../shared/schemas/base-block.json" + }, + { "type": "object", "properties": { - "title": { - "type": "string", - "description": "Block title" + "block": { + "const": "faq", + "description": "Block type identifier" }, - "subtitle": { - "type": "string", - "description": "Block subtitle" - }, - "text": { - "type": "string", - "description": "Introductory text (Markdown supported)" - }, - "items": { - "type": "array", - "description": "FAQ items", - "items": { - "type": "object", - "properties": { - "question": { - "type": "string", - "description": "The question" - }, - "answer": { - "type": "string", - "description": "The answer (Markdown supported)" - } - }, - "required": ["question", "answer"] - } - }, - "button": { + "content": { "type": "object", - "description": "Call-to-action button", "properties": { + "title": { + "type": "string", + "description": "Block title" + }, + "subtitle": { + "type": "string", + "description": "Block subtitle" + }, "text": { "type": "string", - "description": "Button text" + "description": "Introductory text (Markdown supported)" }, - "url": { - "type": "string", - "description": "Button URL" - }, - "icon": { - "type": "string", - "description": "Button icon name" - } - } - } - } - }, - "design": { - "type": "object", - "properties": { - "spacing": { - "type": "object", - "properties": { - "padding": { + "items": { "type": "array", + "description": "FAQ items", "items": { - "type": "string" + "type": "object", + "properties": { + "question": { + "type": "string", + "description": "The question" + }, + "answer": { + "type": "string", + "description": "The answer (Markdown supported)" + } + }, + "required": ["question", "answer"], + "additionalProperties": false }, - "description": "Padding [top, right, bottom, left]" + "minItems": 1 }, - "margin": { - "type": "array", - "items": { - "type": "string" + "button": { + "type": "object", + "description": "Call-to-action button", + "properties": { + "text": { + "type": "string", + "description": "Button text" + }, + "url": { + "type": "string", + "description": "Button URL" + }, + "icon": { + "type": "string", + "description": "Button icon name" + } }, - "description": "Margin [top, right, bottom, left]" + "required": ["text", "url"], + "additionalProperties": false } - } + }, + "required": ["items"], + "additionalProperties": false }, - "background": { + "design": { "type": "object", + "description": "Spacing overrides for the FAQ section", "properties": { - "color": { - "type": "string", - "description": "Background color CSS class" + "spacing": { + "type": "object", + "properties": { + "padding": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Padding [top, right, bottom, left]" + }, + "margin": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Margin [top, right, bottom, left]" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": true + } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "faq", + "content": { + "title": "Frequently asked questions", + "subtitle": "Fast answers for new users", + "text": "If you do not see your question, open an issue or reach out.", + "items": [ + { + "question": "How do I enable Pagefind?", + "answer": "Add `pagefind = true` to your config and run `pnpm build`." + }, + { + "question": "Can I customize Tailwind tokens?", + "answer": "Yes. Edit the design tokens in `modules/blox-tailwind/assets/` and run `pnpm format`." + } + ], + "button": { + "text": "View full knowledge base", + "url": "/faq/", + "icon": "hero/arrow-right" + } + }, + "design": { + "spacing": { + "padding": ["2.5rem", "0", "2.5rem", "0"] } } } - } + ] } - } + ] } diff --git a/modules/blox-tailwind/blox/features/schema.json b/modules/blox-tailwind/blox/features/schema.json index cfd90c1b..3f49e04f 100644 --- a/modules/blox-tailwind/blox/features/schema.json +++ b/modules/blox-tailwind/blox/features/schema.json @@ -11,7 +11,8 @@ "type": "object", "properties": { "block": { - "const": "features" + "const": "features", + "description": "Block type identifier" }, "content": { "type": "object", @@ -44,13 +45,44 @@ "description": "Feature icon (icon pack format: pack/icon-name)" } }, - "required": ["name", "description"] - } + "required": ["name", "description"], + "additionalProperties": false + }, + "minItems": 1 } }, - "required": ["items"] + "required": ["items"], + "additionalProperties": false } - } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "features", + "content": { + "title": "Everything you need", + "text": "From data to deployment, one stack.", + "items": [ + { + "name": "Tailwind 4", + "description": "Pre-configured tokens, gradients, and typography.", + "icon": "hero/swatch" + }, + { + "name": "Preact blocks", + "description": "Composable UI shipped with sensible defaults.", + "icon": "hero/puzzle-piece" + }, + { + "name": "Docs-ready", + "description": "Markdown, data-driven content, and inline shortcodes.", + "icon": "hero/book-open" + } + ] + } + } + ] } ] } diff --git a/modules/blox-tailwind/blox/hero/schema.json b/modules/blox-tailwind/blox/hero/schema.json index 6e54473c..c7da5f11 100644 --- a/modules/blox-tailwind/blox/hero/schema.json +++ b/modules/blox-tailwind/blox/hero/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/hero.json", "title": "Hero Block Schema", - "description": "Schema for the Hero block - displays prominent hero sections with title, text, and call-to-action buttons", + "description": "Schema for the Hero block - displays prominent hero sections with titles, text, and calls-to-action", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -28,7 +28,7 @@ }, "announcement": { "type": "object", - "description": "Optional announcement banner", + "description": "Optional announcement banner above the title", "properties": { "text": { "type": "string", @@ -44,7 +44,7 @@ }, "url": { "type": "string", - "description": "Link URL" + "description": "Link URL or page anchor" } }, "required": ["text", "url"], @@ -60,7 +60,7 @@ "properties": { "url": { "type": "string", - "description": "Button URL" + "description": "Button URL or hash anchor" }, "text": { "type": "string", @@ -80,7 +80,7 @@ "properties": { "url": { "type": "string", - "description": "Link URL" + "description": "Link URL or page anchor" }, "text": { "type": "string", @@ -92,10 +92,58 @@ } }, "additionalProperties": false + }, + "design": { + "type": "object", + "description": "Hero-specific design tweaks", + "properties": { + "no_padding": { + "type": "boolean", + "description": "Disable default vertical padding applied by the hero layout", + "default": false + } + }, + "additionalProperties": true } }, "required": ["content"], - "additionalProperties": false + "additionalProperties": true, + "examples": [ + { + "block": "hero", + "id": "intro", + "design": { + "no_padding": false, + "background": { + "gradient": { + "start": "primary-500", + "end": "secondary-500" + }, + "text_color_light": true + } + }, + "content": { + "announcement": { + "text": "Latest preprint is live", + "link": { + "text": "Read the paper", + "url": "/publications/rlhf-foundations" + } + }, + "title": "Building aligned AI together", + "text": "Human-centred research, transparent tooling, and production-ready stacks.", + "primary_action": { + "text": "Start a project", + "url": "#contact", + "icon": "hero/arrow-right" + }, + "secondary_action": { + "text": "View portfolio", + "url": "/projects/" + } + } + } + ] } ] } diff --git a/modules/blox-tailwind/blox/knowledge-categories/schema.json b/modules/blox-tailwind/blox/knowledge-categories/schema.json index d2a534f1..7538d1d6 100644 --- a/modules/blox-tailwind/blox/knowledge-categories/schema.json +++ b/modules/blox-tailwind/blox/knowledge-categories/schema.json @@ -1,74 +1,132 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "Knowledge Categories Block", - "description": "Grid of knowledge base category cards", - "properties": { - "content": { + "$id": "https://hugoblox.com/schemas/blocks/knowledge-categories.json", + "title": "Knowledge Categories Block Schema", + "description": "Schema for the Knowledge Categories block - lists taxonomy categories with counts and links", + "allOf": [ + { + "$ref": "../shared/schemas/base-block.json" + }, + { "type": "object", "properties": { - "title": { - "type": "string" + "block": { + "const": "knowledge-categories", + "description": "Block type identifier" }, - "subtitle": { - "type": "string" - }, - "categories": { - "type": "array", - "items": { - "type": "object", - "properties": { - "category": { - "type": "string", - "description": "Category name (e.g., 'Getting Started', 'ChatGPT') - will be auto-slugified for URL" - }, - "title": { - "type": "string", - "description": "Display title (optional - defaults to category name)" - }, - "description": { - "type": "string" - }, - "icon": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "bg_color": { - "type": "string" - }, - "text_color": { - "type": "string" - } - } - }, - "count": { - "type": "number" - } - } - } - }, - "view_all": { + "content": { "type": "object", "properties": { - "text": { + "title": { "type": "string" }, - "link": { + "subtitle": { "type": "string" + }, + "categories": { + "type": "array", + "description": "Categories to render; uses real taxonomy counts when available", + "items": { + "type": "object", + "properties": { + "category": { + "type": "string", + "description": "Taxonomy category name used for lookup (defaults to `title` when omitted)" + }, + "title": { + "type": "string", + "description": "Display label for the category card" + }, + "description": { + "type": "string" + }, + "icon": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Icon name (e.g., 'hero/book-open')" + }, + "bg_color": { + "type": "string", + "description": "Background utility classes for the icon wrapper", + "default": "bg-primary-100 dark:bg-primary-900/50" + }, + "text_color": { + "type": "string", + "description": "Text color classes for the icon", + "default": "text-primary-600 dark:text-primary-400" + } + }, + "additionalProperties": false + }, + "count": { + "type": "integer", + "description": "Optional override for item count (otherwise uses taxonomy count)" + } + }, + "anyOf": [ + { + "required": ["category"] + }, + { + "required": ["title"] + } + ], + "additionalProperties": false + } + }, + "view_all": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "link": { + "type": "string" + } + }, + "required": ["text", "link"], + "additionalProperties": false + } + }, + "required": ["categories"], + "additionalProperties": false + } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "knowledge-categories", + "content": { + "title": "Browse the knowledge base", + "subtitle": "Jump into the most active categories.", + "categories": [ + { + "category": "research", + "title": "Research", + "description": "Lab notes, experiment trackers, and preprint workflows.", + "icon": { + "name": "hero/beaker", + "bg_color": "bg-primary-100 dark:bg-primary-900/50", + "text_color": "text-primary-600 dark:text-primary-400" + } + }, + { + "category": "tutorials", + "title": "Tutorials", + "description": "Hands-on guides for Hugo Blox.", + "count": 18 + } + ], + "view_all": { + "text": "See all categories", + "link": "/categories/" } } } - } - }, - "design": { - "type": "object", - "properties": { - "spacing": { - "type": "object" - } - } + ] } - } + ] } diff --git a/modules/blox-tailwind/blox/logos/schema.json b/modules/blox-tailwind/blox/logos/schema.json index 265e0fa1..fe3250ea 100644 --- a/modules/blox-tailwind/blox/logos/schema.json +++ b/modules/blox-tailwind/blox/logos/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/logos.json", "title": "Logos Block Schema", - "description": "Schema for the Logos block - displays partner/sponsor logos with various display modes", + "description": "Schema for the Logos block - showcases partner/customer logos in grid, carousel, or marquee layouts", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,96 +11,130 @@ "type": "object", "properties": { "block": { - "const": "logos" + "const": "logos", + "description": "Block type identifier" }, "content": { "type": "object", - "description": "Content configuration for the logos block", "properties": { "title": { - "type": "string", - "description": "Main section title" + "type": "string" }, "subtitle": { - "type": "string", - "description": "Section subtitle" + "type": "string" }, "text": { - "type": "string", - "description": "Section description text" + "type": "string" }, "logos": { "type": "array", - "description": "Array of logo items with details", + "description": "Explicit list of logos to render", "items": { "type": "object", "properties": { "name": { "type": "string", - "description": "Partner/sponsor name" + "description": "Partner/customer name (used for alt text)" }, "image": { "type": "string", - "description": "Path to logo image relative to assets/media/" - }, - "url": { - "type": "string", - "description": "Link to partner website" - }, - "external": { - "type": "boolean", - "description": "Open link in new tab", - "default": true + "description": "Logo image filename in assets/media/" }, "description": { "type": "string", - "description": "Short description shown on hover" + "description": "Tooltip/hover description" + }, + "url": { + "type": "string", + "description": "Optional link URL" + }, + "external": { + "type": "boolean", + "description": "Open URL in a new tab", + "default": false } - } + }, + "required": ["image"], + "additionalProperties": false } }, "logo_folder": { "type": "string", - "description": "Legacy: Folder containing logo images (deprecated, use logos array instead)" + "description": "Folder in assets/media/ containing logo images (used when `logos` is not provided)" }, "cta": { "type": "object", - "description": "Call to action button", + "description": "Optional call-to-action button beneath the logos", "properties": { - "text": { - "type": "string", - "description": "Button text" - }, "url": { - "type": "string", - "description": "Button URL" + "type": "string" + }, + "text": { + "type": "string" }, "icon": { - "type": "string", - "description": "Optional icon name" + "type": "string" } - } + }, + "required": ["url", "text"], + "additionalProperties": false } - } + }, + "additionalProperties": false }, "design": { "type": "object", - "description": "Design options for the logos block", + "description": "Display options for the logos block", "properties": { "display_mode": { "type": "string", "enum": ["grid", "carousel", "marquee"], - "description": "How to display the logos", + "description": "Layout style for the logos", "default": "grid" }, "show_pattern": { "type": "boolean", - "description": "Show decorative background pattern", + "description": "Render a faint gradient pattern behind the section", "default": false } + }, + "additionalProperties": true + } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "logos", + "design": { + "display_mode": "grid", + "show_pattern": true + }, + "content": { + "title": "Trusted by leading labs", + "subtitle": "Partners + collaborators", + "text": "Teams building safety-first AI with us.", + "logos": [ + { + "name": "DeepMind", + "image": "logos/deepmind.svg", + "url": "https://deepmind.com", + "external": true + }, + { + "name": "OpenAI", + "image": "logos/openai.png", + "description": "Alignment research partner" + } + ], + "cta": { + "text": "See case studies", + "url": "/case-studies/", + "icon": "hero/arrow-right" + } } } - } + ] } ] } diff --git a/modules/blox-tailwind/blox/markdown/schema.json b/modules/blox-tailwind/blox/markdown/schema.json index f8861284..47fd457c 100644 --- a/modules/blox-tailwind/blox/markdown/schema.json +++ b/modules/blox-tailwind/blox/markdown/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/markdown.json", "title": "Markdown Block Schema", - "description": "Schema for the Markdown block - displays markdown content with optional title", + "description": "Schema for the Markdown block - renders arbitrary Markdown content with an optional heading", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,24 +11,36 @@ "type": "object", "properties": { "block": { - "const": "markdown" + "const": "markdown", + "description": "Block type identifier" }, "content": { "type": "object", - "description": "Content configuration for the markdown block", "properties": { "title": { "type": "string", - "description": "Section title (supports Markdown)" + "description": "Section heading (supports Markdown)" }, "text": { "type": "string", - "description": "Markdown content (supports full Markdown syntax)" + "description": "Markdown body content" } }, - "required": ["text"] + "required": ["text"], + "additionalProperties": false } - } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "markdown", + "content": { + "title": "Why Hugo Blox?", + "text": "Hugo Blox ships **Preact blocks**, Tailwind 4, and fast Hugo rendering. Mix Markdown, data-driven content, and components without build grief." + } + } + ] } ] } diff --git a/modules/blox-tailwind/blox/research-areas/schema.json b/modules/blox-tailwind/blox/research-areas/schema.json index 870861bd..b85801f4 100644 --- a/modules/blox-tailwind/blox/research-areas/schema.json +++ b/modules/blox-tailwind/blox/research-areas/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/research-areas.json", "title": "Research Areas Block Schema", - "description": "Schema for the Research Areas block - displays research focus areas with rich visuals and metrics", + "description": "Schema for the Research Areas block - highlights thematic areas with optional stats and CTAs", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,129 +11,172 @@ "type": "object", "properties": { "block": { - "const": "research-areas" + "const": "research-areas", + "description": "Block type identifier" }, "content": { "type": "object", - "description": "Content configuration for the research areas block", "properties": { "title": { - "type": "string", - "description": "Section title" + "type": "string" }, "subtitle": { - "type": "string", - "description": "Section subtitle" + "type": "string" }, "text": { - "type": "string", - "description": "Section description text" + "type": "string" }, "items": { "type": "array", - "description": "Array of research area items", + "description": "Research area cards", "items": { "type": "object", "properties": { "name": { "type": "string", - "description": "Research area name", - "required": true + "description": "Area title" }, "description": { "type": "string", - "description": "Research area description", - "required": true - }, - "icon": { - "type": "string", - "description": "Icon identifier (e.g., 'hero/beaker', 'devicon/python')" - }, - "emoji": { - "type": "string", - "description": "Emoji as alternative to icon" - }, - "image": { - "type": "string", - "description": "Image path relative to assets/media/" + "description": "Short summary" }, "gradient": { "type": "string", - "description": "Tailwind gradient classes (e.g., 'from-blue-400 to-purple-400')" + "description": "Tailwind gradient classes for the header", + "examples": ["from-primary-400 to-secondary-400"] }, - "url": { + "image": { "type": "string", - "description": "Link to detailed page" + "description": "Optional header image filename in assets/media/" + }, + "icon": { + "type": "string", + "description": "Optional icon displayed instead of an image" }, "status": { "type": "string", - "enum": ["active", "emerging", "planning"], - "description": "Research area status" + "description": "Status badge (e.g., active, emerging, planning)" + }, + "url": { + "type": "string", + "description": "Optional external/internal link for the area title" }, "topics": { "type": "array", - "description": "Key topics/keywords", + "description": "Keywords or topics associated with the area", "items": { "type": "string" } }, "team_size": { - "type": "string", - "description": "Number of team members (e.g., '12 researchers')" + "type": ["string", "number"], + "description": "Team size metric displayed in the footer" }, "publications": { - "type": "string", - "description": "Number of publications (e.g., '45 papers')" + "type": ["string", "number"], + "description": "Publication count metric" }, "funding": { "type": "string", - "description": "Funding amount (e.g., '$2.5M')" + "description": "Funding metric/label" }, "cta": { "type": "object", - "description": "Call to action for this area", + "description": "Per-area call-to-action button", "properties": { - "text": { - "type": "string" - }, "url": { "type": "string" + }, + "text": { + "type": "string" } - } + }, + "required": ["url", "text"], + "additionalProperties": false } - } - } + }, + "required": ["name", "description"], + "additionalProperties": false + }, + "minItems": 1 }, "cta": { "type": "object", - "description": "Global call to action", + "description": "Global call-to-action beneath the grid", "properties": { - "text": { + "url": { "type": "string" }, - "url": { + "text": { "type": "string" }, "icon": { "type": "string" } - } + }, + "required": ["url", "text"], + "additionalProperties": false } - } + }, + "required": ["items"], + "additionalProperties": false }, "design": { "type": "object", - "description": "Design options for the research areas block", + "description": "Layout option for research areas", "properties": { "layout": { "type": "string", "enum": ["cards", "hexagon", "timeline"], - "description": "Layout style for research areas", + "description": "Choose between card grid, hexagon swarm, or timeline layout", "default": "cards" } + }, + "additionalProperties": true + } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "research-areas", + "design": { + "layout": "cards" + }, + "content": { + "title": "Research areas", + "subtitle": "Where we invest time and curiosity", + "text": "From alignment and evals to deployable agents.", + "items": [ + { + "name": "Alignment & Safety", + "description": "Mechanistic interpretability, agent evaluations, and scalable oversight.", + "gradient": "from-primary-400 to-secondary-400", + "icon": "hero/shield-check", + "status": "active", + "topics": ["evals", "interpretability", "tooling"], + "team_size": "6", + "publications": "12", + "funding": "$3.2M", + "cta": { + "text": "See roadmap", + "url": "/research/alignment/" + } + }, + { + "name": "Multimodal systems", + "description": "Unified stacks for text, image, and audio models.", + "image": "research/multimodal.jpg", + "status": "emerging" + } + ], + "cta": { + "text": "All research areas", + "url": "/research/" + } } } - } + ] } ] } diff --git a/modules/blox-tailwind/blox/resume-awards/schema.json b/modules/blox-tailwind/blox/resume-awards/schema.json index 2258febe..64640649 100644 --- a/modules/blox-tailwind/blox/resume-awards/schema.json +++ b/modules/blox-tailwind/blox/resume-awards/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/resume-awards.json", "title": "Resume Awards Block Schema", - "description": "Schema for the Resume Awards block - displays awards and certifications from author profile", + "description": "Schema for the Resume Awards block - renders awards/certifications from the referenced author profile", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,16 +11,17 @@ "type": "object", "properties": { "block": { - "const": "resume-awards" + "const": "resume-awards", + "description": "Block type identifier" }, "content": { "type": "object", - "description": "Content configuration for the resume awards block", + "description": "Content configuration for the awards block", "properties": { "username": { "type": "string", - "description": "Author username (references authors/{username}/ page)", - "default": "admin" + "description": "Author username (references data/authors/{username}.yaml)", + "default": "me" }, "title": { "type": "string", @@ -30,26 +31,38 @@ "type": "string", "description": "Section description (supports Markdown)" } - } + }, + "additionalProperties": false }, "design": { - "allOf": [ - { - "$ref": "../shared/schemas/base-block.json#/properties/design" - }, - { - "type": "object", - "properties": { - "date_format": { - "type": "string", - "description": "Date format for award dates", - "default": "January 2006" - } - } + "type": "object", + "description": "Awards-specific display options", + "properties": { + "date_format": { + "type": "string", + "description": "Date format for award dates (Go time layout)", + "default": "January 2006", + "examples": ["2006", "Jan 2006", "January 2, 2006"] } - ] + }, + "additionalProperties": true } - } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "resume-awards", + "content": { + "username": "me", + "title": "Awards", + "text": "Selected recognition and certifications." + }, + "design": { + "date_format": "January 2006" + } + } + ] } ] } diff --git a/modules/blox-tailwind/blox/resume-biography-3/schema.json b/modules/blox-tailwind/blox/resume-biography-3/schema.json index 6843c26a..7339b5bd 100644 --- a/modules/blox-tailwind/blox/resume-biography-3/schema.json +++ b/modules/blox-tailwind/blox/resume-biography-3/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/resume-biography-3.json", "title": "Resume Biography 3 Block Schema", - "description": "Schema for the Resume Biography 3 block - displays author bio with avatar, interests, and education in horizontal layout", + "description": "Schema for the Resume Biography 3 block - horizontal layout with banner, avatar, and profile details", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,20 +11,20 @@ "type": "object", "properties": { "block": { - "const": "resume-biography-3" + "const": "resume-biography-3", + "description": "Block type identifier" }, "content": { "type": "object", - "description": "Content configuration for the resume biography 3 block", "properties": { "username": { "type": "string", - "description": "Author username (references authors/{username}/ page)", - "default": "admin" + "description": "Author username (references data/authors/{username}.yaml)", + "default": "me" }, "text": { "type": "string", - "description": "Biography text override (supports Markdown). If not provided, uses author page content." + "description": "Biography text override (supports Markdown). Defaults to the author profile bio." }, "headings": { "type": "object", @@ -36,13 +36,14 @@ }, "education": { "type": "string", - "description": "Heading for education section (default: from i18n 'education')" + "description": "Heading for education section (default: i18n 'education')" }, "interests": { "type": "string", - "description": "Heading for interests section (default: from i18n 'interests')" + "description": "Heading for interests section (default: i18n 'interests')" } - } + }, + "additionalProperties": false }, "button": { "type": "object", @@ -57,73 +58,109 @@ "description": "Button text" } }, - "required": ["url", "text"] + "required": ["url", "text"], + "additionalProperties": false } - } + }, + "additionalProperties": false }, "design": { - "allOf": [ - { - "$ref": "../shared/schemas/base-block.json#/properties/design" - }, - { + "type": "object", + "description": "Presentation options for the biography layout", + "properties": { + "avatar": { "type": "object", + "description": "Avatar styling options", "properties": { - "avatar": { - "type": "object", - "description": "Avatar styling options", - "properties": { - "size": { - "type": "string", - "enum": ["small", "medium", "large", "xl", "xxl"], - "description": "Avatar size", - "default": "medium" - }, - "shape": { - "type": "string", - "enum": ["circle", "square", "rounded"], - "description": "Avatar shape", - "default": "circle" - } - } + "size": { + "type": "string", + "enum": ["small", "medium", "large", "xl", "xxl"], + "description": "Avatar size", + "default": "large" }, - "banner": { - "type": "object", - "description": "Optional banner image", - "properties": { - "filename": { - "type": "string", - "description": "Banner image filename (in assets/media/)" - } - } - }, - "biography": { - "type": "object", - "description": "Biography text styling", - "properties": { - "style": { - "type": "string", - "description": "Custom CSS styles for biography text" - } - } - }, - "name": { - "type": "object", - "description": "Profile name typography controls", - "properties": { - "size": { - "type": "string", - "enum": ["xs", "sm", "md", "lg", "xl"], - "description": "Heading size for the profile name to suit different name lengths", - "default": "lg" - } - } + "shape": { + "type": "string", + "enum": ["circle", "square", "rounded"], + "description": "Avatar shape", + "default": "circle" } - } + }, + "additionalProperties": false + }, + "banner": { + "type": "object", + "description": "Optional banner image", + "properties": { + "filename": { + "type": "string", + "description": "Banner image filename (in assets/media/)" + } + }, + "additionalProperties": false + }, + "biography": { + "type": "object", + "description": "Biography text styling", + "properties": { + "style": { + "type": "string", + "description": "Custom CSS styles for biography text" + } + }, + "additionalProperties": false + }, + "name": { + "type": "object", + "description": "Profile name typography controls", + "properties": { + "size": { + "type": "string", + "enum": ["xs", "sm", "md", "lg", "xl"], + "description": "Heading size for the profile name", + "default": "lg" + } + }, + "additionalProperties": false } - ] + }, + "additionalProperties": true } - } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "resume-biography-3", + "content": { + "username": "me", + "text": "Research lead focused on alignment, evaluations, and safety tooling.", + "headings": { + "about": "Professional summary", + "education": "Education", + "interests": "Interests" + }, + "button": { + "url": "/cv.pdf", + "text": "Download CV" + } + }, + "design": { + "avatar": { + "size": "large", + "shape": "circle" + }, + "name": { + "size": "lg" + }, + "banner": { + "filename": "banners/research.jpg" + }, + "biography": { + "style": "max-width: 70ch;" + } + } + } + ] } ] } diff --git a/modules/blox-tailwind/blox/resume-biography/schema.json b/modules/blox-tailwind/blox/resume-biography/schema.json index e7a61463..6d4b3cbc 100644 --- a/modules/blox-tailwind/blox/resume-biography/schema.json +++ b/modules/blox-tailwind/blox/resume-biography/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/resume-biography.json", "title": "Resume Biography Block Schema", - "description": "Schema for the Resume Biography block - displays author biography with avatar, social links, and bio text", + "description": "Schema for the Biography block - renders author details with avatar, banner, bio, and social links", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,89 +11,112 @@ "type": "object", "properties": { "block": { - "const": "resume-biography" + "const": "resume-biography", + "description": "Block type identifier" }, "content": { "type": "object", - "description": "Content configuration for the resume biography block", "properties": { "username": { "type": "string", - "description": "Author username (references authors/{username}/ page)", - "default": "admin" + "description": "Author username (references data/authors/{username}.yaml)", + "default": "me" }, "text": { "type": "string", - "description": "Biography text override (supports Markdown). If not provided, uses author page content." + "description": "Override biography text (Markdown); falls back to author profile bio when omitted" }, "button": { "type": "object", - "description": "Optional call-to-action button", + "description": "Optional button beneath the bio", "properties": { "url": { - "type": "string", - "description": "Button URL" + "type": "string" }, "text": { - "type": "string", - "description": "Button text" + "type": "string" } }, - "required": ["url", "text"] + "required": ["url", "text"], + "additionalProperties": false } - } + }, + "additionalProperties": false }, "design": { - "allOf": [ - { - "$ref": "../shared/schemas/base-block.json#/properties/design" - }, - { + "type": "object", + "description": "Presentation options for the biography", + "properties": { + "avatar": { "type": "object", "properties": { - "avatar": { - "type": "object", - "description": "Avatar styling options", - "properties": { - "size": { - "type": "string", - "enum": ["small", "medium", "large", "xl", "xxl"], - "description": "Avatar size", - "default": "medium" - }, - "shape": { - "type": "string", - "enum": ["circle", "square", "rounded"], - "description": "Avatar shape", - "default": "circle" - } - } + "size": { + "type": "string", + "enum": ["small", "medium", "large", "xl", "xxl"], + "description": "Avatar display size", + "default": "medium" }, - "banner": { - "type": "object", - "description": "Optional banner image", - "properties": { - "filename": { - "type": "string", - "description": "Banner image filename (in assets/media/)" - } - } - }, - "biography": { - "type": "object", - "description": "Biography text styling", - "properties": { - "style": { - "type": "string", - "description": "Custom CSS styles for biography text" - } - } + "shape": { + "type": "string", + "enum": ["circle", "square", "rounded"], + "description": "Avatar shape", + "default": "circle" } - } + }, + "additionalProperties": false + }, + "banner": { + "type": "object", + "properties": { + "filename": { + "type": "string", + "description": "Optional banner image filename in assets/media/" + } + }, + "additionalProperties": false + }, + "biography": { + "type": "object", + "properties": { + "style": { + "type": "string", + "description": "Inline CSS style applied to the bio text wrapper", + "examples": ["max-width: 60ch;"] + } + }, + "additionalProperties": false } - ] + }, + "additionalProperties": true } - } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "resume-biography", + "content": { + "username": "me", + "text": "I build AI research tooling and mentor applied ML teams.", + "button": { + "url": "/cv.pdf", + "text": "Download CV" + } + }, + "design": { + "avatar": { + "size": "large", + "shape": "circle" + }, + "banner": { + "filename": "banners/lab.jpg" + }, + "biography": { + "style": "max-width: 60ch;" + } + } + } + ] } ] } diff --git a/modules/blox-tailwind/blox/resume-experience/schema.json b/modules/blox-tailwind/blox/resume-experience/schema.json index 12fbd10f..3694c753 100644 --- a/modules/blox-tailwind/blox/resume-experience/schema.json +++ b/modules/blox-tailwind/blox/resume-experience/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/resume-experience.json", "title": "Resume Experience Block Schema", - "description": "Schema for the Resume Experience block - displays work experience and education from author profile", + "description": "Schema for the Experience block - renders work history and education timelines from an author profile", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,46 +11,58 @@ "type": "object", "properties": { "block": { - "const": "resume-experience" + "const": "resume-experience", + "description": "Block type identifier" }, "content": { "type": "object", - "description": "Content configuration for the resume experience block", "properties": { "username": { "type": "string", - "description": "Author username (references authors/{username}/ page)", - "default": "admin" + "description": "Author username (references data/authors/{username}.yaml)", + "default": "me" }, "text": { "type": "string", - "description": "Optional section description (supports Markdown)" + "description": "Optional lead-in copy above the timelines" } - } + }, + "additionalProperties": false }, "design": { - "allOf": [ - { - "$ref": "../shared/schemas/base-block.json#/properties/design" + "type": "object", + "description": "Display options for experience and education timelines", + "properties": { + "date_format": { + "type": "string", + "description": "Date format for experience and education entries (Go time layout)", + "default": "January 2006", + "examples": ["Jan 2006", "2006"] }, - { - "type": "object", - "properties": { - "date_format": { - "type": "string", - "description": "Date format for experience dates", - "default": "January 2006" - }, - "is_education_first": { - "type": "boolean", - "description": "Display education before work experience", - "default": false - } - } + "is_education_first": { + "type": "boolean", + "description": "Show education timeline before experience", + "default": false } - ] + }, + "additionalProperties": true } - } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "resume-experience", + "content": { + "username": "me", + "text": "Highlights from my recent roles and education." + }, + "design": { + "date_format": "January 2006", + "is_education_first": false + } + } + ] } ] } diff --git a/modules/blox-tailwind/blox/resume-languages/schema.json b/modules/blox-tailwind/blox/resume-languages/schema.json index 03a42bd8..3fed0589 100644 --- a/modules/blox-tailwind/blox/resume-languages/schema.json +++ b/modules/blox-tailwind/blox/resume-languages/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/resume-languages.json", "title": "Resume Languages Block Schema", - "description": "Schema for the Resume Languages block - displays language proficiency with circular progress indicators", + "description": "Schema for the Languages block - renders language proficiency from the author profile", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,16 +11,16 @@ "type": "object", "properties": { "block": { - "const": "resume-languages" + "const": "resume-languages", + "description": "Block type identifier" }, "content": { "type": "object", - "description": "Content configuration for the resume languages block", "properties": { "username": { "type": "string", - "description": "Author username (references authors/{username}/ page)", - "default": "admin" + "description": "Author username (references data/authors/{username}.yaml)", + "default": "me" }, "title": { "type": "string", @@ -30,9 +30,22 @@ "type": "string", "description": "Section description (supports Markdown)" } + }, + "additionalProperties": false + } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "resume-languages", + "content": { + "username": "me", + "title": "Languages", + "text": "Comfortable in English, French, and Mandarin." } } - } + ] } ] } diff --git a/modules/blox-tailwind/blox/resume-skills/schema.json b/modules/blox-tailwind/blox/resume-skills/schema.json index f3f59acb..440a2d47 100644 --- a/modules/blox-tailwind/blox/resume-skills/schema.json +++ b/modules/blox-tailwind/blox/resume-skills/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/resume-skills.json", "title": "Resume Skills Block Schema", - "description": "Schema for the Resume Skills block - displays skills from author profile with optional progress bars", + "description": "Schema for the Resume Skills block - displays skills and proficiency pulled from an author profile", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,16 +11,17 @@ "type": "object", "properties": { "block": { - "const": "resume-skills" + "const": "resume-skills", + "description": "Block type identifier" }, "content": { "type": "object", - "description": "Content configuration for the resume skills block", + "description": "Content configuration for the skills block", "properties": { "username": { "type": "string", - "description": "Author username (references authors/{username}/ page)", - "default": "admin" + "description": "Author username (references data/authors/{username}.yaml)", + "default": "me" }, "title": { "type": "string", @@ -30,20 +31,40 @@ "type": "string", "description": "Section description (supports Markdown)" } - } + }, + "additionalProperties": false }, "design": { - "allOf": [ - { - "$ref": "../shared/schemas/base-block.json#/properties/design" - }, - { - "type": "object", - "properties": {} + "type": "object", + "description": "Layout options for the skills grid", + "properties": { + "columns": { + "type": "integer", + "description": "Number of columns used to render skill groups", + "default": 2, + "minimum": 1, + "maximum": 5, + "examples": [2, 3] } - ] + }, + "additionalProperties": true } - } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "resume-skills", + "content": { + "username": "me", + "title": "Skills", + "text": "Tooling and languages I use most often." + }, + "design": { + "columns": 3 + } + } + ] } ] } diff --git a/modules/blox-tailwind/blox/search-hero/schema.json b/modules/blox-tailwind/blox/search-hero/schema.json index 63eca263..98d3f631 100644 --- a/modules/blox-tailwind/blox/search-hero/schema.json +++ b/modules/blox-tailwind/blox/search-hero/schema.json @@ -1,114 +1,120 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "Search Hero Block", - "description": "A hero section with prominent search functionality for knowledge bases", - "properties": { - "content": { - "type": "object", - "properties": { - "badge": { - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "Badge text" - }, - "show_pulse": { - "type": "boolean", - "description": "Show pulsing dot indicator" - } - } - }, - "title": { - "type": "string", - "description": "Main title. Use ==text== syntax to apply gradient highlighting to any words or phrases. Example: 'Master ==AI Tools==. ==Boost Your Productivity.=='" - }, - "subtitle": { - "type": "string", - "description": "Subtitle text" - }, - "search_placeholder": { - "type": "string", - "description": "Search input placeholder" - }, - "suggestions": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Quick search suggestions" - }, - "stats": { - "type": "array", - "items": { - "type": "object", - "properties": { - "value": { - "type": "string", - "description": "Stat value" - }, - "label": { - "type": "string", - "description": "Stat label" - } - } - } - } - } + "$id": "https://hugoblox.com/schemas/blocks/search-hero.json", + "title": "Search Hero Block Schema", + "description": "A hero section with prominent search functionality and optional stats", + "allOf": [ + { + "$ref": "../shared/schemas/base-block.json" }, - "design": { + { "type": "object", "properties": { - "spacing": { - "type": "object" + "block": { + "const": "search-hero", + "description": "Block type identifier" }, - "background": { + "content": { "type": "object", "properties": { - "color": { - "type": "string", - "description": "Background color (Tailwind class)" - }, - "gradient_mesh": { + "badge": { "type": "object", - "description": "Animated gradient mesh background", + "description": "Optional badge displayed above the title", "properties": { - "enable": { + "text": { + "type": "string", + "description": "Badge text" + }, + "show_pulse": { "type": "boolean", - "description": "Enable animated gradient mesh" - }, - "style": { - "type": "string", - "enum": ["orbs", "waves", "dots", "grid"], - "description": "Visual style of gradient mesh", - "default": "orbs" - }, - "animation": { - "type": "string", - "enum": ["pulse", "float", "rotate", "none"], - "description": "Animation type", - "default": "pulse" - }, - "intensity": { - "type": "string", - "enum": ["subtle", "medium", "bold"], - "description": "Visual intensity", - "default": "subtle" - }, - "colors": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Tailwind colors with opacity (e.g., 'primary-500/20')", - "default": ["primary-500/20", "primary-600/20"] + "description": "Show pulsing dot indicator", + "default": false } + }, + "required": ["text"], + "additionalProperties": false + }, + "title": { + "type": "string", + "description": "Main title. Use ==text== syntax to apply gradient highlighting to words or phrases." + }, + "subtitle": { + "type": "string", + "description": "Subtitle text" + }, + "search_placeholder": { + "type": "string", + "description": "Search input placeholder", + "default": "Search for answers..." + }, + "suggestions": { + "type": "array", + "description": "Quick search suggestion chips that open Pagefind with a preset query", + "items": { + "type": "string" + } + }, + "stats": { + "type": "array", + "description": "Optional lightweight stats below the search box", + "items": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "Stat value (supports Markdown)" + }, + "label": { + "type": "string", + "description": "Stat label" + } + }, + "required": ["value", "label"], + "additionalProperties": false } } + }, + "required": ["title"], + "additionalProperties": false + } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "search-hero", + "design": { + "background": { + "gradient_mesh": { + "enable": true, + "style": "waves", + "colors": ["primary-500/25", "secondary-500/25"], + "animation": "float" + } + } + }, + "content": { + "badge": { + "text": "Instant answers", + "show_pulse": true + }, + "title": "Master ==AI tools==. Find answers faster.", + "subtitle": "Search our docs, playbooks, and notebooks.", + "search_placeholder": "Search documentation...", + "suggestions": ["Get started", "Deploy with Hugo Blox"], + "stats": [ + { + "value": "250+", + "label": "articles" + }, + { + "value": "9/10", + "label": "avg. satisfaction" + } + ] } } - } + ] } - } + ] } diff --git a/modules/blox-tailwind/blox/shared/schemas/base-block.json b/modules/blox-tailwind/blox/shared/schemas/base-block.json index 03aead59..f2bd7043 100644 --- a/modules/blox-tailwind/blox/shared/schemas/base-block.json +++ b/modules/blox-tailwind/blox/shared/schemas/base-block.json @@ -2,21 +2,24 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/base-block.json", "title": "Hugo Blox Base Block Schema", - "description": "Common parameters available to all Hugo Blox blocks", + "description": "Common parameters available to all Hugo Blox blocks rendered via parse_block_v3.html", "type": "object", "properties": { "block": { "type": "string", - "description": "Block type identifier (required)" + "description": "Block type identifier (required for routing to the correct template)", + "examples": ["hero", "stats"] }, "blox": { "type": "string", "description": "Legacy block type identifier (deprecated, use 'block' instead)", - "deprecated": true + "deprecated": true, + "examples": ["features"] }, "id": { "type": "string", - "description": "Optional unique identifier for this section" + "description": "Optional unique identifier for this section", + "examples": ["intro", "team"] }, "demo": { "type": "boolean", @@ -25,34 +28,43 @@ }, "design": { "type": "object", - "description": "Design and styling options", + "description": "Design and styling options applied by the shared block wrapper", "properties": { "background": { "type": "object", - "description": "Background styling options", + "description": "Background styling options (colors, gradients, media, mesh)", "properties": { "color": { "oneOf": [ { "type": "string", - "description": "Single color value" + "description": "Single color value", + "examples": ["primary-50", "#0b1021"] }, { "type": "object", "properties": { "light": { "type": "string", - "description": "Light mode color" + "description": "Light mode color", + "examples": ["#ffffff"] }, "dark": { "type": "string", - "description": "Dark mode color" + "description": "Dark mode color", + "examples": ["#0b1021"] } }, - "additionalProperties": false + "additionalProperties": false, + "examples": [ + { + "light": "#ffffff", + "dark": "#0b1021" + } + ] } ], - "description": "Background color (supports Tailwind colors, hex, rgb)" + "description": "Background color (supports Tailwind tokens, hex, or rgb values)" }, "gradient": { "type": "object", @@ -60,24 +72,108 @@ "properties": { "start": { "type": "string", - "description": "Gradient start color" + "description": "Gradient start color", + "examples": ["primary-500"] }, "end": { "type": "string", - "description": "Gradient end color" + "description": "Gradient end color", + "examples": ["secondary-600"] }, "direction": { - "type": "string", + "type": ["string", "number"], "description": "Gradient direction in degrees", - "default": "135" + "default": "135", + "examples": ["135", 90] } }, "required": ["start", "end"], "additionalProperties": false }, + "gradient_mesh": { + "type": "object", + "description": "Layered gradient mesh backgrounds", + "properties": { + "enable": { + "type": "boolean", + "description": "Enable the gradient mesh renderer", + "default": false + }, + "style": { + "type": "string", + "enum": ["orbs", "waves", "dots", "grid"], + "description": "Mesh style to render", + "default": "orbs" + }, + "animation": { + "type": "string", + "enum": ["pulse", "float", "rotate", "none"], + "description": "Animation preset for mesh elements", + "default": "pulse" + }, + "intensity": { + "type": "string", + "enum": ["subtle", "medium", "bold"], + "description": "Visual intensity of the mesh", + "default": "subtle" + }, + "colors": { + "type": "array", + "description": "Tailwind color tokens used in the mesh", + "items": { + "type": "string" + }, + "examples": [["primary-500/20", "secondary-500/20"]] + }, + "orb_count": { + "type": "integer", + "minimum": 1, + "description": "Number of orbs when using the 'orbs' style", + "examples": [2, 3] + }, + "positions": { + "type": "array", + "description": "Position utility classes for orb/wave placement", + "items": { + "type": "string" + }, + "examples": [["top-0 left-1/4", "bottom-0 right-1/4"]] + }, + "sizes": { + "type": "array", + "description": "Size utility classes per orb", + "items": { + "type": "string" + }, + "examples": [["w-96 h-96", "w-80 h-80"]] + }, + "wave_count": { + "type": "integer", + "minimum": 1, + "description": "Number of waves when using the 'waves' style", + "examples": [3] + }, + "dot_size": { + "type": "string", + "description": "Dot size utility for the 'dots' style", + "examples": ["w-4 h-4"] + }, + "spacing": { + "type": ["string", "number"], + "description": "Spacing in pixels for dots, grid, or waves", + "examples": [16, "32"] + }, + "line_width": { + "type": ["string", "number"], + "description": "Line width in pixels for the 'grid' style", + "examples": [1, "2"] + } + }, + "additionalProperties": false + }, "text_color_light": { "type": "boolean", - "description": "Whether to use light text color (for dark backgrounds)" + "description": "Use light text color (for dark backgrounds)" }, "image": { "type": "object", @@ -85,7 +181,8 @@ "properties": { "filename": { "type": "string", - "description": "Image filename in assets/media/" + "description": "Image filename relative to assets/media/", + "examples": ["backgrounds/hero.jpg"] }, "size": { "type": "string", @@ -111,11 +208,14 @@ "type": "number", "description": "Image brightness filter (0-1, where 1 is normal)", "minimum": 0, - "maximum": 1 + "maximum": 1, + "examples": [0.65] } - } + }, + "additionalProperties": false } - } + }, + "additionalProperties": false }, "video": { "type": "object", @@ -123,16 +223,19 @@ "properties": { "filename": { "type": "string", - "description": "Video filename in assets/media/" + "description": "Video filename in assets/media/", + "examples": ["loops/background.mp4"] }, "flip": { "type": "boolean", "description": "Flip video horizontally", "default": false } - } + }, + "additionalProperties": false } - } + }, + "additionalProperties": false }, "spacing": { "type": "object", @@ -145,64 +248,69 @@ "type": "string" }, "minItems": 4, - "maxItems": 4 + "maxItems": 4, + "examples": [["4rem", "0", "4rem", "0"]] } - } - }, - "clip_path": { - "type": "string", - "description": "CSS clip-path value" + }, + "additionalProperties": false }, "css_style": { "type": "string", - "description": "Custom CSS styles to apply to the section" + "description": "Custom CSS styles to apply to the section", + "examples": ["min-height: 70vh;"] }, "css_class": { "type": "string", - "description": "Custom CSS classes to apply to the section" - }, - "columns": { - "type": ["string", "number"], - "description": "Number of columns for layout", - "default": "1" - }, - "view": { - "type": "string", - "description": "Display view type (used by collection block)", - "enum": ["card", "compact", "showcase", "citation", "list", "masonry"] - }, - "loop": { - "type": "boolean", - "description": "Enable looping (for slider blocks)", - "default": true - }, - "interval": { - "type": ["string", "number"], - "description": "Interval in milliseconds (for slider blocks)", - "default": "3000" - }, - "no_padding": { - "type": "boolean", - "description": "Disable default padding (for hero block)", - "default": false - }, - "card": { - "type": "object", - "description": "Card styling options (for CTA card block)", - "properties": { - "css_class": { - "type": "string", - "description": "CSS classes for the card" - }, - "css_style": { - "type": "string", - "description": "CSS styles for the card" - } - } + "description": "Custom CSS classes to apply to the section", + "examples": ["relative overflow-hidden"] } } } }, "required": ["block"], - "additionalProperties": true + "additionalProperties": true, + "examples": [ + { + "block": "hero", + "id": "intro", + "demo": false, + "design": { + "background": { + "color": { + "light": "#ffffff", + "dark": "#0b1021" + }, + "gradient": { + "start": "primary-500", + "end": "secondary-600", + "direction": "135" + }, + "gradient_mesh": { + "enable": true, + "style": "orbs", + "colors": ["primary-500/20", "secondary-500/20"], + "orb_count": 2, + "positions": ["top-0 left-1/4", "bottom-0 right-1/4"], + "sizes": ["w-96 h-96", "w-80 h-80"], + "animation": "pulse", + "intensity": "medium" + }, + "image": { + "filename": "backgrounds/hero.jpg", + "parallax": true + }, + "video": { + "filename": "loops/background.mp4", + "flip": false + }, + "text_color_light": true + }, + "spacing": { + "padding": ["4rem", "0", "4rem", "0"] + }, + "css_class": "relative overflow-hidden", + "css_style": "min-height: 70vh;" + } + } + ] } diff --git a/modules/blox-tailwind/blox/stats/schema.json b/modules/blox-tailwind/blox/stats/schema.json index b5d2e4bc..03c34685 100644 --- a/modules/blox-tailwind/blox/stats/schema.json +++ b/modules/blox-tailwind/blox/stats/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/stats.json", "title": "Stats Block Schema", - "description": "Schema for the Stats block - displays statistics in a grid layout", + "description": "Schema for the Stats block - displays statistics in cards, compact rows, or a minimal grid", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,7 +11,8 @@ "type": "object", "properties": { "block": { - "const": "stats" + "const": "stats", + "description": "Block type identifier" }, "content": { "type": "object", @@ -32,8 +33,9 @@ "type": "object", "properties": { "statistic": { - "type": "string", - "description": "The statistic value/number (supports Markdown)" + "type": ["string", "number"], + "description": "The statistic value/number (supports Markdown)", + "examples": ["120+", 3.2] }, "description": { "type": "string", @@ -48,11 +50,14 @@ "description": "Additional context or sub-metric (supports Markdown)" } }, - "required": ["statistic", "description"] - } + "required": ["statistic", "description"], + "additionalProperties": false + }, + "minItems": 1 } }, - "required": ["items"] + "required": ["items"], + "additionalProperties": false }, "design": { "type": "object", @@ -64,9 +69,40 @@ "description": "Display layout style", "default": "cards" } + }, + "additionalProperties": true + } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "stats", + "content": { + "title": "Impact metrics", + "text": "Momentum across research and product work.", + "items": [ + { + "statistic": "120+", + "description": "peer-reviewed papers", + "icon": "hero/document-text" + }, + { + "statistic": "5M", + "description": "dataset downloads", + "sub_metric": "across three releases" + }, + { + "statistic": 42, + "description": "team members" + } + ] + }, + "design": { + "layout": "cards" } } - } + ] } ] } diff --git a/modules/blox-tailwind/blox/team-showcase/schema.json b/modules/blox-tailwind/blox/team-showcase/schema.json index 8f226bda..7beecf73 100644 --- a/modules/blox-tailwind/blox/team-showcase/schema.json +++ b/modules/blox-tailwind/blox/team-showcase/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/team-showcase.json", "title": "Team Showcase Block Schema", - "description": "Schema for the Team Showcase block - displays team members with filtering and grouping", + "description": "Schema for the Team Showcase block - displays team members grouped by author taxonomy", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,7 +11,8 @@ "type": "object", "properties": { "block": { - "const": "team-showcase" + "const": "team-showcase", + "description": "Block type identifier" }, "content": { "type": "object", @@ -31,24 +32,15 @@ }, "user_groups": { "type": "array", - "description": "User groups to display (e.g., 'Principal Investigators', 'PhD Students')", + "description": "Filter to authors that belong to these user groups (defaults to all authors)", "items": { "type": "string" - } - }, - "sort_by": { - "type": "string", - "description": "Field to sort team members by", - "default": "Params.last_name" - }, - "sort_ascending": { - "type": "boolean", - "description": "Sort in ascending order", - "default": true + }, + "examples": [["Principal Investigators", "PhD Students"]] }, "cta": { "type": "object", - "description": "Call to action button", + "description": "Optional call-to-action displayed beneath the grid", "properties": { "text": { "type": "string", @@ -56,43 +48,71 @@ }, "url": { "type": "string", - "description": "Button URL" + "description": "Button URL (can be relative or absolute)" }, "icon": { "type": "string", - "description": "Optional icon name" + "description": "Optional icon name (e.g., 'hero/user-plus')" } - } + }, + "required": ["text", "url"], + "additionalProperties": false } - } + }, + "additionalProperties": false }, "design": { "type": "object", - "description": "Design options for the team showcase", + "description": "Display toggles for the team showcase", "properties": { "show_role": { "type": "boolean", - "description": "Show team member roles", + "description": "Show the role from each author profile", "default": true }, "show_organizations": { "type": "boolean", - "description": "Show team member organizations", + "description": "Display the first organization/affiliation per profile", "default": false }, "show_interests": { "type": "boolean", - "description": "Show team member interests", + "description": "Display up to three interests per profile", "default": false }, "show_social": { "type": "boolean", - "description": "Show social media links", + "description": "Show social media icons pulled from the author profile links", "default": true } + }, + "additionalProperties": true + } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "team-showcase", + "content": { + "title": "Meet the team", + "subtitle": "Research + Engineering", + "text": "We combine safety research with high-velocity engineering.", + "user_groups": ["Principal Investigators", "PhD Students"], + "cta": { + "text": "Join us", + "url": "/apply", + "icon": "hero/user-plus" + } + }, + "design": { + "show_role": true, + "show_organizations": true, + "show_interests": false, + "show_social": true } } - } + ] } ] } diff --git a/modules/blox-tailwind/blox/testimonials/schema.json b/modules/blox-tailwind/blox/testimonials/schema.json index 342f1feb..724e6978 100644 --- a/modules/blox-tailwind/blox/testimonials/schema.json +++ b/modules/blox-tailwind/blox/testimonials/schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/testimonials.json", "title": "Testimonials Block Schema", - "description": "Schema for the Testimonials block - displays customer testimonials with quotes and author info", + "description": "Schema for the Testimonials block - displays quotes with avatars, names, and roles", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -11,11 +11,11 @@ "type": "object", "properties": { "block": { - "const": "testimonials" + "const": "testimonials", + "description": "Block type identifier" }, "content": { "type": "object", - "description": "Content configuration for the testimonials block", "properties": { "title": { "type": "string", @@ -27,34 +27,62 @@ }, "items": { "type": "array", - "description": "Array of testimonials", + "description": "Testimonial entries", "items": { "type": "object", "properties": { "text": { "type": "string", - "description": "Testimonial quote text (supports Markdown)" + "description": "Quoted testimonial text (supports Markdown)" }, "name": { "type": "string", - "description": "Author name" + "description": "Person's name" }, "role": { "type": "string", - "description": "Author role/title" + "description": "Role or organization" }, "image": { "type": "string", - "description": "Author avatar image filename (in assets/media/)" + "description": "Avatar filename in assets/media/" } }, - "required": ["text", "name"] - } + "required": ["text", "name"], + "additionalProperties": false + }, + "minItems": 1 } }, - "required": ["items"] + "required": ["items"], + "additionalProperties": false } - } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "testimonials", + "content": { + "title": "What partners say", + "text": "Teams build faster when they start with Hugo Blox.", + "items": [ + { + "text": "“Hugo Blox let us ship a research microsite in days instead of weeks.”", + "name": "Dr. Casey Smith", + "role": "Research Lead, OpenAI", + "image": "people/casey.jpg" + }, + { + "text": "“Great developer experience and first-class docs. Our students love it.”", + "name": "Prof. Lee Nguyen", + "role": "MIT CSAIL", + "image": "people/lee.png" + } + ] + } + } + ] } ] } diff --git a/modules/blox-tailwind/blox/trending-questions/schema.json b/modules/blox-tailwind/blox/trending-questions/schema.json index 6106d480..c17b8dbe 100644 --- a/modules/blox-tailwind/blox/trending-questions/schema.json +++ b/modules/blox-tailwind/blox/trending-questions/schema.json @@ -1,83 +1,134 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "Trending Questions Block", - "description": "Display trending or featured questions", - "properties": { - "content": { + "$id": "https://hugoblox.com/schemas/blocks/trending-questions.json", + "title": "Trending Questions Block Schema", + "description": "Display trending or featured questions with optional dynamic sourcing from content marked `trending: true`", + "allOf": [ + { + "$ref": "../shared/schemas/base-block.json" + }, + { "type": "object", "properties": { - "title": { - "type": "string" + "block": { + "const": "trending-questions", + "description": "Block type identifier" }, - "subtitle": { - "type": "string" - }, - "questions": { - "type": "array", - "items": { - "type": "object", - "properties": { - "question": { - "type": "string" - }, - "answer_preview": { - "type": "string" - }, - "link": { - "type": "string" - }, - "badge": { - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "color": { - "type": "string" - } - } - }, - "author": { - "type": "string" - }, - "views": { - "type": "string" - }, - "upvotes": { - "type": "number" - } - } - } - }, - "view_all": { + "content": { "type": "object", "properties": { - "text": { + "title": { "type": "string" }, - "link": { + "subtitle": { "type": "string" + }, + "count": { + "type": "integer", + "description": "Number of items to pull when auto-querying pages with `trending: true`", + "default": 4, + "minimum": 1 + }, + "questions": { + "type": "array", + "description": "Static fallback list of questions to render", + "items": { + "type": "object", + "properties": { + "question": { + "type": "string" + }, + "answer_preview": { + "type": "string" + }, + "link": { + "type": "string", + "description": "URL to the full answer/article" + }, + "badge": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "color": { + "type": "string", + "description": "Tailwind classes applied to the badge" + } + }, + "additionalProperties": false + }, + "author": { + "type": "string" + }, + "views": { + "type": ["string", "number"] + }, + "upvotes": { + "type": ["integer", "number"] + } + }, + "required": ["question", "link"], + "additionalProperties": false + } + }, + "view_all": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "link": { + "type": "string" + } + }, + "required": ["text", "link"], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "required": ["content"], + "additionalProperties": true, + "examples": [ + { + "block": "trending-questions", + "design": { + "spacing": { + "padding": ["3rem", "0", "3rem", "0"] + } + }, + "content": { + "title": "Trending questions", + "subtitle": "Top searches from the last 7 days.", + "count": 4, + "questions": [ + { + "question": "How do I deploy Hugo Blox to Netlify?", + "answer_preview": "Use the provided CI workflow or run `hugo --gc --minify`...", + "link": "/docs/deploy/netlify/", + "badge": { + "text": "🔥 Popular", + "color": "bg-amber-100 text-amber-800" + }, + "views": 1200, + "upvotes": 86 + }, + { + "question": "Where can I customize Tailwind 4 tokens?", + "answer_preview": "Tokens are defined in `modules/blox-tailwind/assets/`...", + "link": "/docs/style/tokens/", + "author": "geo" + } + ], + "view_all": { + "text": "Browse all questions", + "link": "/faq/" } } } - } - }, - "design": { - "type": "object", - "properties": { - "spacing": { - "type": "object" - }, - "background": { - "type": "object", - "properties": { - "color": { - "type": "string" - } - } - } - } + ] } - } + ] }