diff --git a/modules/blox/blox/collection/schema.json b/modules/blox/blox/collection/schema.json index 878b62bc..a272c826 100644 --- a/modules/blox/blox/collection/schema.json +++ b/modules/blox/blox/collection/schema.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/collection.json", - "title": "Collection Block Schema", - "description": "Schema for the Collection block - displays filtered and sorted collections of pages", + "title": "Collection", + "description": "Displays filtered and sorted collections of pages", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -24,7 +24,9 @@ }, "text": { "type": "string", - "description": "Section description (supports Markdown)" + "description": "Section description (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "count": { "type": "integer", @@ -45,7 +47,18 @@ "sort_by": { "type": "string", "description": "Field to sort by", - "enum": ["Date", "date", "Title", "title", "Weight", "weight", "Lastmod", "lastmod", "PublishDate", "publishdate"], + "enum": [ + "Date", + "date", + "Title", + "title", + "Weight", + "weight", + "Lastmod", + "lastmod", + "PublishDate", + "publishdate" + ], "default": "Date" }, "sort_ascending": { @@ -55,7 +68,10 @@ }, "order": { "type": "string", - "enum": ["asc", "desc"], + "enum": [ + "asc", + "desc" + ], "description": "Sort order (alternative to sort_ascending)" }, "filters": { @@ -68,7 +84,9 @@ "items": { "type": "string" }, - "default": ["page"] + "default": [ + "page" + ] }, "folders": { "type": "array", @@ -141,7 +159,9 @@ }, "text": { "type": "string", - "description": "Override archive link text" + "description": "Override archive link text", + "x-multiline": true, + "format": "textarea" } }, "additionalProperties": false @@ -155,7 +175,17 @@ "properties": { "view": { "type": "string", - "enum": ["card", "compact", "showcase", "citation", "list", "masonry", "article-grid", "date-title-summary", "slides-gallery"], + "enum": [ + "card", + "compact", + "showcase", + "citation", + "list", + "masonry", + "article-grid", + "date-title-summary", + "slides-gallery" + ], "description": "Display view type. 'card' shows full cards with images, 'compact' shows minimal list items, 'showcase' highlights featured content, 'citation' for academic publications, 'article-grid' for blog layouts.", "default": "card" }, @@ -190,7 +220,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { @@ -203,8 +235,13 @@ "sort_by": "Date", "sort_ascending": false, "filters": { - "folders": ["post"], - "tags": ["alignment", "evaluations"], + "folders": [ + "post" + ], + "tags": [ + "alignment", + "evaluations" + ], "featured_only": true }, "archive": { diff --git a/modules/blox/blox/contact-info/schema.json b/modules/blox/blox/contact-info/schema.json index 0554891d..11785743 100644 --- a/modules/blox/blox/contact-info/schema.json +++ b/modules/blox/blox/contact-info/schema.json @@ -1,8 +1,8 @@ { "$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 details, map, social links, and an optional form", + "title": "Contact Info", + "description": "Displays lab contact details, map, social links, and an optional form", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -136,7 +136,18 @@ "description": "Label alias" } }, - "anyOf": [{ "required": ["url"] }, { "required": ["link"] }], + "anyOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "link" + ] + } + ], "additionalProperties": false } ] @@ -154,19 +165,26 @@ }, "text": { "type": "string", - "description": "Short note for new collaborators or recruits" + "description": "Short note for new collaborators or recruits", + "x-multiline": true, + "format": "textarea" }, "button": { "type": "object", "properties": { "text": { - "type": "string" + "type": "string", + "x-multiline": true, + "format": "textarea" }, "url": { "type": "string" } }, - "required": ["text", "url"], + "required": [ + "text", + "url" + ], "additionalProperties": false } }, @@ -178,7 +196,9 @@ }, "map_embed": { "type": "string", - "description": "HTML embed code for map (e.g., Google Maps iframe)" + "description": "HTML embed code for map (e.g., Google Maps iframe)", + "x-multiline": true, + "format": "textarea" }, "show_form": { "type": "boolean", @@ -193,7 +213,9 @@ "additionalProperties": false } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { @@ -203,9 +225,16 @@ "subtitle": "We respond within 2 business days.", "visit_title": "Visit us", "address": { - "lines": ["AI Lab, Engineering Building", "123 Innovation Way", "Cambridge, MA"] + "lines": [ + "AI Lab, Engineering Building", + "123 Innovation Way", + "Cambridge, MA" + ] }, - "office_hours": ["Mon–Thu: 10:00–16:00", "Fri: Remote"], + "office_hours": [ + "Mon\u2013Thu: 10:00\u201316:00", + "Fri: Remote" + ], "map_url": "https://maps.google.com/?q=Cambridge", "email": "hello@hugoblox.com", "phone": "+1 415 000 0000", diff --git a/modules/blox/blox/cta-button-list/schema.json b/modules/blox/blox/cta-button-list/schema.json index f7f509e9..9230b10f 100644 --- a/modules/blox/blox/cta-button-list/schema.json +++ b/modules/blox/blox/cta-button-list/schema.json @@ -1,8 +1,8 @@ { "$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 - renders stacked buttons with icons", + "title": "CTA Button List", + "description": "Renders stacked buttons with icons", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -25,7 +25,9 @@ "properties": { "text": { "type": "string", - "description": "Button label (supports Markdown)" + "description": "Button label (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "label": { "type": "string", @@ -54,22 +56,46 @@ } }, "anyOf": [ - { "required": ["text"] }, - { "required": ["label"] }, - { "required": ["name"] }, - { "required": ["url"] }, - { "required": ["link"] } + { + "required": [ + "text" + ] + }, + { + "required": [ + "label" + ] + }, + { + "required": [ + "name" + ] + }, + { + "required": [ + "url" + ] + }, + { + "required": [ + "link" + ] + } ], "additionalProperties": false }, "minItems": 1 } }, - "required": ["buttons"], + "required": [ + "buttons" + ], "additionalProperties": false } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/cta-card/schema.json b/modules/blox/blox/cta-card/schema.json index ee2b8ed6..e2f6e1b7 100644 --- a/modules/blox/blox/cta-card/schema.json +++ b/modules/blox/blox/cta-card/schema.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/cta-card.json", - "title": "CTA Card Block Schema", - "description": "Schema for the CTA Card block - displays a prominent call-to-action card with title, text, and button", + "title": "CTA Card", + "description": "Displays a prominent call-to-action card with title, text, and button", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -24,7 +24,9 @@ }, "text": { "type": "string", - "description": "Card description text (supports Markdown)" + "description": "Card description text (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "button": { "type": "object", @@ -36,7 +38,9 @@ }, "text": { "type": "string", - "description": "Button text" + "description": "Button text", + "x-multiline": true, + "format": "textarea" }, "icon": { "type": "string", @@ -48,11 +52,18 @@ "default": false } }, - "required": ["url", "text"], + "required": [ + "url", + "text" + ], "additionalProperties": false } }, - "required": ["title", "text", "button"], + "required": [ + "title", + "text", + "button" + ], "additionalProperties": false }, "design": { @@ -72,7 +83,11 @@ }, "text_color": { "type": "string", - "enum": ["auto", "light", "dark"], + "enum": [ + "auto", + "light", + "dark" + ], "description": "Text color mode for optimal contrast (auto detects based on background)", "default": "auto" }, @@ -90,7 +105,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/cta-image-paragraph/schema.json b/modules/blox/blox/cta-image-paragraph/schema.json index 736212ef..ef925ac4 100644 --- a/modules/blox/blox/cta-image-paragraph/schema.json +++ b/modules/blox/blox/cta-image-paragraph/schema.json @@ -1,8 +1,8 @@ { "$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 - alternating media and copy with optional feature bullets and button", + "title": "CTA Image Paragraph", + "description": "Alternating media and copy with optional feature bullets and button", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -29,12 +29,17 @@ }, "text": { "type": "string", - "description": "Supporting paragraph (supports Markdown)" + "description": "Supporting paragraph (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "image": { "type": "string", "description": "Image filename in assets/media/. Responsive images are generated automatically (400-1200px). GIFs are converted to webp.", - "examples": ["screenshots/product.png", "features/demo.jpg"] + "examples": [ + "screenshots/product.png", + "features/demo.jpg" + ] }, "feature_icon": { "type": "string", @@ -53,27 +58,40 @@ "description": "Optional CTA button", "properties": { "text": { - "type": "string" + "type": "string", + "x-multiline": true, + "format": "textarea" }, "url": { "type": "string" } }, - "required": ["text", "url"], + "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"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { @@ -85,7 +103,11 @@ "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"], + "features": [ + "Responsive images generated automatically", + "Markdown-first authoring", + "Works with Netlify, Vercel, and GitHub Pages" + ], "button": { "text": "Read the guide", "url": "/docs/get-started/" diff --git a/modules/blox/blox/dev-hero/schema.json b/modules/blox/blox/dev-hero/schema.json index b6126edf..9deba5f1 100644 --- a/modules/blox/blox/dev-hero/schema.json +++ b/modules/blox/blox/dev-hero/schema.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/dev-hero.json", - "title": "Dev Hero Block Schema", - "description": "Schema for the Dev Hero block - a developer-focused hero section with gradient effects", + "title": "Dev Hero", + "description": "A developer-focused hero section with gradient effects", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -22,7 +22,10 @@ "type": "string", "description": "Author username to pull data from (matches folder name in /authors/)", "default": "me", - "examples": ["me", "admin"] + "examples": [ + "me", + "admin" + ] }, "title": { "type": "string", @@ -34,17 +37,26 @@ }, "bio": { "type": "string", - "description": "Override bio text (falls back to author bio)" + "description": "Override bio text (falls back to author bio)", + "x-multiline": true, + "format": "textarea" }, "greeting": { "type": "string", "description": "Small greeting text above the name", - "examples": ["Hi, I'm", "Hello, I'm", "Welcome"] + "examples": [ + "Hi, I'm", + "Hello, I'm", + "Welcome" + ] }, "name_prefix": { "type": "string", "description": "Prefix before the name (styled differently)", - "examples": ["I'm", "Hey, I'm"] + "examples": [ + "I'm", + "Hey, I'm" + ] }, "show_status": { "type": "boolean", @@ -60,7 +72,11 @@ "type": "string", "description": "CSS selector for scroll indicator target", "default": "#projects", - "examples": ["#projects", "#about", "#contact"] + "examples": [ + "#projects", + "#about", + "#contact" + ] }, "links": { "type": "array", @@ -71,7 +87,12 @@ "icon": { "type": "string", "description": "Icon identifier", - "examples": ["brands/github", "brands/linkedin", "brands/x", "at-symbol"] + "examples": [ + "brands/github", + "brands/linkedin", + "brands/x", + "at-symbol" + ] }, "url": { "type": "string", @@ -82,7 +103,10 @@ "description": "Link label/title" } }, - "required": ["icon", "url"] + "required": [ + "icon", + "url" + ] } }, "cta_buttons": { @@ -94,25 +118,48 @@ "text": { "type": "string", "description": "Button text", - "examples": ["View My Work", "Download Resume", "Contact Me"] + "examples": [ + "View My Work", + "Download Resume", + "Contact Me" + ] }, "url": { "type": "string", "description": "Button URL", - "examples": ["#projects", "/resume.pdf", "#contact"] + "examples": [ + "#projects", + "/resume.pdf", + "#contact" + ] }, "icon": { "type": "string", "description": "Button icon (optional)", - "examples": ["arrow-down", "document-arrow-down", "envelope"] + "examples": [ + "arrow-down", + "document-arrow-down", + "envelope" + ] } }, - "required": ["text", "url"] + "required": [ + "text", + "url" + ] }, "examples": [ [ - { "text": "View My Work", "url": "#projects", "icon": "arrow-down" }, - { "text": "Download Resume", "url": "/resume.pdf", "icon": "document-arrow-down" } + { + "text": "View My Work", + "url": "#projects", + "icon": "arrow-down" + }, + { + "text": "Download Resume", + "url": "/resume.pdf", + "icon": "document-arrow-down" + } ] ] }, @@ -128,13 +175,24 @@ "strings": { "type": "array", "description": "Array of strings to cycle through", - "items": { "type": "string" }, - "examples": [["Full-Stack Developer", "Open Source Contributor", "Tech Enthusiast"]] + "items": { + "type": "string" + }, + "examples": [ + [ + "Full-Stack Developer", + "Open Source Contributor", + "Tech Enthusiast" + ] + ] }, "prefix": { "type": "string", "description": "Static text before the animated part", - "examples": ["I'm a", "I build"] + "examples": [ + "I'm a", + "I build" + ] }, "type_speed": { "type": "integer", @@ -163,13 +221,19 @@ "style": { "type": "string", "description": "Layout style", - "enum": ["centered", "split"], + "enum": [ + "centered", + "split" + ], "default": "centered" }, "avatar_shape": { "type": "string", "description": "Avatar shape", - "enum": ["circle", "rounded"], + "enum": [ + "circle", + "rounded" + ], "default": "circle" }, "animations": { @@ -181,7 +245,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { @@ -193,8 +259,16 @@ "show_status": true, "show_scroll_indicator": true, "cta_buttons": [ - { "text": "View My Work", "url": "#projects", "icon": "arrow-down" }, - { "text": "Get In Touch", "url": "#contact", "icon": "envelope" } + { + "text": "View My Work", + "url": "#projects", + "icon": "arrow-down" + }, + { + "text": "Get In Touch", + "url": "#contact", + "icon": "envelope" + } ] }, "design": { diff --git a/modules/blox/blox/faq/schema.json b/modules/blox/blox/faq/schema.json index 440c11fa..bf9b364a 100644 --- a/modules/blox/blox/faq/schema.json +++ b/modules/blox/blox/faq/schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/faq.json", - "title": "FAQ Block Schema", + "title": "FAQ", "description": "Display frequently asked questions in an accordion format with optional CTA", "allOf": [ { @@ -27,7 +27,9 @@ }, "text": { "type": "string", - "description": "Introductory text (Markdown supported)" + "description": "Introductory text (Markdown supported)", + "x-multiline": true, + "format": "textarea" }, "items": { "type": "array", @@ -45,18 +47,42 @@ }, "answer": { "type": "string", - "description": "The answer (Markdown supported)" + "description": "The answer (Markdown supported)", + "x-multiline": true, + "format": "textarea" }, "text": { "type": "string", - "description": "Alias for answer" + "description": "Alias for answer", + "x-multiline": true, + "format": "textarea" } }, "anyOf": [ - { "required": ["question", "answer"] }, - { "required": ["title", "text"] }, - { "required": ["question", "text"] }, - { "required": ["title", "answer"] } + { + "required": [ + "question", + "answer" + ] + }, + { + "required": [ + "title", + "text" + ] + }, + { + "required": [ + "question", + "text" + ] + }, + { + "required": [ + "title", + "answer" + ] + } ], "additionalProperties": false }, @@ -68,7 +94,9 @@ "properties": { "text": { "type": "string", - "description": "Button text" + "description": "Button text", + "x-multiline": true, + "format": "textarea" }, "url": { "type": "string", @@ -79,11 +107,16 @@ "description": "Button icon name" } }, - "required": ["text", "url"], + "required": [ + "text", + "url" + ], "additionalProperties": false } }, - "required": ["items"], + "required": [ + "items" + ], "additionalProperties": false }, "design": { @@ -101,7 +134,12 @@ "minItems": 4, "maxItems": 4, "description": "Padding [top, right, bottom, left]", - "default": ["20px", "0", "20px", "0"] + "default": [ + "20px", + "0", + "20px", + "0" + ] }, "padding_sm": { "type": "array", @@ -111,7 +149,10 @@ "minItems": 2, "maxItems": 2, "description": "Responsive padding for smaller screens [top, bottom]", - "default": ["3rem", "0"] + "default": [ + "3rem", + "0" + ] }, "margin": { "type": "array", @@ -121,7 +162,12 @@ "minItems": 4, "maxItems": 4, "description": "Margin [top, right, bottom, left]", - "default": ["0", "0", "0", "0"] + "default": [ + "0", + "0", + "0", + "0" + ] } }, "additionalProperties": false @@ -130,7 +176,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { @@ -157,7 +205,12 @@ }, "design": { "spacing": { - "padding": ["2.5rem", "0", "2.5rem", "0"] + "padding": [ + "2.5rem", + "0", + "2.5rem", + "0" + ] } } } diff --git a/modules/blox/blox/features/schema.json b/modules/blox/blox/features/schema.json index fb078142..5267533f 100644 --- a/modules/blox/blox/features/schema.json +++ b/modules/blox/blox/features/schema.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/features.json", - "title": "Features Block Schema", - "description": "Schema for the Features block - displays a grid of features with icons, names, and descriptions", + "title": "Features", + "description": "Displays a grid of features with icons, names, and descriptions", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -24,7 +24,9 @@ }, "text": { "type": "string", - "description": "Section description (supports Markdown)" + "description": "Section description (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "items": { "type": "array", @@ -38,25 +40,39 @@ }, "description": { "type": "string", - "description": "Feature description (supports Markdown)" + "description": "Feature description (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "icon": { "type": "string", "description": "Feature icon. Supports hero/ (Heroicons), brands/ (brand logos), devicon/ (dev tools), or custom packs. Format: 'pack/icon-name' or just 'icon-name' for hero.", - "examples": ["hero/swatch", "hero/puzzle-piece", "brands/github", "devicon/python"] + "examples": [ + "hero/swatch", + "hero/puzzle-piece", + "brands/github", + "devicon/python" + ] } }, - "required": ["name", "description"], + "required": [ + "name", + "description" + ], "additionalProperties": false }, "minItems": 1 } }, - "required": ["items"], + "required": [ + "items" + ], "additionalProperties": false } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/hero/schema.json b/modules/blox/blox/hero/schema.json index b0ae7ea1..d0846c5f 100644 --- a/modules/blox/blox/hero/schema.json +++ b/modules/blox/blox/hero/schema.json @@ -1,8 +1,8 @@ { "$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 titles, text, and calls-to-action", + "title": "Hero", + "description": "Displays prominent hero sections with titles, text, and calls-to-action", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -24,7 +24,9 @@ }, "text": { "type": "string", - "description": "Hero description text (supports Markdown)" + "description": "Hero description text (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "announcement": { "type": "object", @@ -32,7 +34,9 @@ "properties": { "text": { "type": "string", - "description": "Announcement text (supports Markdown)" + "description": "Announcement text (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "link": { "type": "object", @@ -40,18 +44,25 @@ "properties": { "text": { "type": "string", - "description": "Link text" + "description": "Link text", + "x-multiline": true, + "format": "textarea" }, "url": { "type": "string", "description": "Link URL or page anchor" } }, - "required": ["text", "url"], + "required": [ + "text", + "url" + ], "additionalProperties": false } }, - "required": ["text"], + "required": [ + "text" + ], "additionalProperties": false }, "primary_action": { @@ -64,14 +75,19 @@ }, "text": { "type": "string", - "description": "Button text (supports Markdown)" + "description": "Button text (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "icon": { "type": "string", "description": "Optional button icon (icon pack format: pack/icon-name)" } }, - "required": ["url", "text"], + "required": [ + "url", + "text" + ], "additionalProperties": false }, "secondary_action": { @@ -84,10 +100,15 @@ }, "text": { "type": "string", - "description": "Link text (supports Markdown)" + "description": "Link text (supports Markdown)", + "x-multiline": true, + "format": "textarea" } }, - "required": ["url", "text"], + "required": [ + "url", + "text" + ], "additionalProperties": false } }, @@ -106,7 +127,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/knowledge-categories/schema.json b/modules/blox/blox/knowledge-categories/schema.json index ef55fa19..0a6e20ad 100644 --- a/modules/blox/blox/knowledge-categories/schema.json +++ b/modules/blox/blox/knowledge-categories/schema.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$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", + "title": "Knowledge Categories", + "description": "Lists taxonomy categories with counts and links", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -72,10 +72,14 @@ }, "anyOf": [ { - "required": ["category"] + "required": [ + "category" + ] }, { - "required": ["title"] + "required": [ + "title" + ] } ], "additionalProperties": false @@ -85,21 +89,30 @@ "type": "object", "properties": { "text": { - "type": "string" + "type": "string", + "x-multiline": true, + "format": "textarea" }, "link": { "type": "string" } }, - "required": ["text", "link"], + "required": [ + "text", + "link" + ], "additionalProperties": false } }, - "required": ["categories"], + "required": [ + "categories" + ], "additionalProperties": false } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/logos/schema.json b/modules/blox/blox/logos/schema.json index d12de9e2..4e846d22 100644 --- a/modules/blox/blox/logos/schema.json +++ b/modules/blox/blox/logos/schema.json @@ -1,8 +1,8 @@ { "$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 - showcases partner/customer logos in grid, carousel, or marquee layouts", + "title": "Logos", + "description": "Showcases partner/customer logos in grid, carousel, or marquee layouts", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -24,7 +24,9 @@ "type": "string" }, "text": { - "type": "string" + "type": "string", + "x-multiline": true, + "format": "textarea" }, "logos": { "type": "array", @@ -54,7 +56,9 @@ "default": false } }, - "required": ["image"], + "required": [ + "image" + ], "additionalProperties": false } }, @@ -70,13 +74,18 @@ "type": "string" }, "text": { - "type": "string" + "type": "string", + "x-multiline": true, + "format": "textarea" }, "icon": { "type": "string" } }, - "required": ["url", "text"], + "required": [ + "url", + "text" + ], "additionalProperties": false } }, @@ -88,7 +97,11 @@ "properties": { "display_mode": { "type": "string", - "enum": ["grid", "carousel", "marquee"], + "enum": [ + "grid", + "carousel", + "marquee" + ], "description": "Layout style: 'grid' shows all logos statically, 'carousel' scrolls horizontally with pause-on-hover, 'marquee' provides continuous horizontal scroll", "default": "grid" }, @@ -101,7 +114,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/markdown/schema.json b/modules/blox/blox/markdown/schema.json index 47fd457c..0ebcc72e 100644 --- a/modules/blox/blox/markdown/schema.json +++ b/modules/blox/blox/markdown/schema.json @@ -1,8 +1,8 @@ { "$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 - renders arbitrary Markdown content with an optional heading", + "title": "Markdown", + "description": "Renders arbitrary Markdown content with an optional heading", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -23,14 +23,20 @@ }, "text": { "type": "string", - "description": "Markdown body content" + "description": "Markdown body content", + "x-multiline": true, + "format": "textarea" } }, - "required": ["text"], + "required": [ + "text" + ], "additionalProperties": false } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/portfolio/README.md b/modules/blox/blox/portfolio/README.md index 05d98417..7c397faa 100644 --- a/modules/blox/blox/portfolio/README.md +++ b/modules/blox/blox/portfolio/README.md @@ -81,13 +81,14 @@ featured: true |-----------|------|---------|-------------| | `title` | string | - | Section title | | `subtitle` | string | - | Section subtitle | -| `count` | integer | 6 | Number of projects to display | +| `count` | integer | 0 (all) | Number of projects to display (set to `0` or omit to show all) | | `filters.folders` | array | `["projects"]` | Content folders to query | | `buttons` | array | `[{name: "All", tag: "*"}]` | Filter buttons | | `default_button_index` | integer | 0 | Default active filter | | `archive.enable` | boolean | auto | Show "View All" link (auto-shown if more projects exist, set to `false` to hide) | | `archive.link` | string | auto | Archive URL (defaults to first folder in `filters.folders`) | | `archive.text` | string | i18n | Archive link text (uses i18n `portfolio_view_all`) | +| `status.text` | string | - | Override status badge text (falls back to each item's `status`) | ### Design @@ -95,6 +96,7 @@ featured: true |-----------|------|---------|-------------| | `columns` | integer | 3 | Grid columns (2, 3, or 4) | | `fallback_icon` | string | `code-bracket` | Icon shown when item has no image. Supports all Hugo Blox icon packs (hero, brands, devicon, emoji, custom). Format: `icon-name` or `pack/icon-name` | +| `status_badge.enable` | boolean | true | Show or hide the status badge | ## Link Types diff --git a/modules/blox/blox/portfolio/block.html b/modules/blox/blox/portfolio/block.html index 8cf128af..fc9f16ac 100644 --- a/modules/blox/blox/portfolio/block.html +++ b/modules/blox/blox/portfolio/block.html @@ -55,6 +55,7 @@ {{ $sort_ascending := partial "functions/coerce_bool" (dict "value" (index $content "sort_ascending") "default" false) }} {{ $sort_order := cond $sort_ascending "asc" "desc" }} {{ $query = sort $query $sort_by $sort_order }} +{{ $all_items := $query }} {{/* Get filter buttons */}} {{ $buttons_raw := index $content "buttons" }} @@ -72,54 +73,90 @@ {{ if lt $default_idx (len $buttons) }} {{ with index $buttons $default_idx }} {{ if reflect.IsMap . }} - {{ with index . "tag" }}{{ $default_tag = printf "%v" . }}{{ end }} + {{ with index . "tag" }}{{ $default_tag = strings.TrimSpace (printf "%v" .) }}{{ end }} {{ end }} {{ end }} {{ end }} +{{ if eq $default_tag "" }}{{ $default_tag = "*" }}{{ end }} -{{/* Store total count before limiting; keep full set when filtering so buttons work */}} -{{ $total_count := len $query }} -{{ $has_multiple_filters := gt (len $buttons) 1 }} +{{/* Status configuration */}} +{{ $status_content := index $content "status" }} +{{ if not (reflect.IsMap $status_content) }}{{ $status_content = dict }}{{ end }} +{{ $status_text_override := "" }} +{{ with index $status_content "text" }} + {{ if eq (printf "%T" .) "string" }}{{ $status_text_override = strings.TrimSpace (printf "%v" .) }}{{ end }} +{{ end }} +{{ $status_design := index $design "status_badge" }} +{{ if not (reflect.IsMap $status_design) }}{{ $status_design = dict }}{{ end }} +{{ $show_status_badge := partial "functions/coerce_bool" (dict "value" (index $status_design "enable") "default" true) }} -{{/* Limit */}} -{{ $count := partial "functions/coerce_int" (dict "value" (index $content "count") "default" 6 "min" 0) }} -{{ if gt $count 0 }} - {{ if $has_multiple_filters }} - {{/* Build a union of up to $count items per button tag to keep filters populated while respecting count */}} - {{ $collected := slice }} - {{ $seen := dict }} - {{ range $buttons }} - {{ if reflect.IsMap . }} - {{ $tag := "*" }} - {{ with index . "tag" }}{{ $tag = strings.TrimSpace (printf "%v" .) }}{{ end }} - {{ $tag_lower := lower $tag }} - {{ $items := slice }} - {{ if eq $tag_lower "*" }} - {{ $items = first $count $query }} - {{ else }} - {{ $items = first $count (where $query "Params.tags" "intersect" (slice $tag_lower)) }} - {{ if eq (len $items) 0 }} - {{/* fallback to case-sensitive tags if lowercase intersect yields none */}} - {{ $items = first $count (where $query "Params.tags" "intersect" (slice $tag)) }} - {{ end }} +{{/* Store total count before limiting */}} +{{ $total_count := len $all_items }} + +{{/* Limit per filter while keeping per-button visibility accurate */}} +{{ $count := partial "functions/coerce_int" (dict "value" (index $content "count") "default" 0 "min" 0) }} +{{ $button_items := dict }} +{{ $allowed_map := dict }} + +{{ range $buttons }} + {{ if reflect.IsMap . }} + {{ $tag := "*" }} + {{ with index . "tag" }}{{ $tag = strings.TrimSpace (printf "%v" .) }}{{ end }} + {{ if eq $tag "" }}{{ $tag = "*" }}{{ end }} + {{ $tag_key := lower $tag }} + {{ $items := slice }} + {{ if le $count 0 }} + {{ if eq $tag_key "*" }} + {{ $items = $all_items }} + {{ else }} + {{ $items = where $all_items "Params.tags" "intersect" (slice $tag_key) }} + {{ if eq (len $items) 0 }} + {{ $items = where $all_items "Params.tags" "intersect" (slice $tag) }} {{ end }} - {{ range $items }} - {{ $key := .RelPermalink }} - {{ if not (isset $seen $key) }} - {{ $collected = $collected | append . }} - {{ $seen = merge $seen (dict $key true) }} - {{ end }} + {{ end }} + {{ else }} + {{ if eq $tag_key "*" }} + {{ $items = first $count $all_items }} + {{ else }} + {{ $items = first $count (where $all_items "Params.tags" "intersect" (slice $tag_key)) }} + {{ if eq (len $items) 0 }} + {{ $items = first $count (where $all_items "Params.tags" "intersect" (slice $tag)) }} {{ end }} {{ end }} {{ end }} - {{ if gt (len $collected) 0 }} - {{ $query = $collected }} + {{ $button_items = merge $button_items (dict $tag_key $items) }} + + {{ range $items }} + {{ $key := .RelPermalink }} + {{ $allowed := slice }} + {{ with index $allowed_map $key }}{{ $allowed = . }}{{ end }} + {{ if not (in $allowed $tag) }} + {{ $allowed = $allowed | append $tag }} + {{ end }} + {{ $allowed_map = merge $allowed_map (dict $key $allowed) }} {{ end }} - {{ else }} - {{ $query = first $count $query }} {{ end }} {{ end }} -{{ $displayed_count := len $query }} + +{{/* Build render list in sorted order, only keeping items that belong to a filter */}} +{{ $render_items := slice }} +{{ range $all_items }} + {{ if isset $allowed_map .RelPermalink }} + {{ $render_items = $render_items | append . }} + {{ end }} +{{ end }} + +{{/* Fallback to all items if something went wrong */}} +{{ if eq (len $render_items) 0 }} + {{ $render_items = $all_items }} + {{ range $render_items }} + {{ $allowed_map = merge $allowed_map (dict .RelPermalink (slice "*")) }} + {{ end }} +{{ end }} + +{{ $query = $render_items }} +{{ $default_items := index $button_items (lower $default_tag) | default (slice) }} +{{ $displayed_count := len $default_items }} {{/* Columns */}} {{ $columns := partial "functions/coerce_int" (dict "value" (index $design "columns") "default" 3 "min" 1 "max" 4) }} @@ -178,6 +215,11 @@ {{/* Project Grid with staggered reveal animation */}}
{{ range $index, $item := $query }} + {{ $item_key := $item.RelPermalink }} + {{ $card_allowed_filters := index $allowed_map $item_key }} + {{ if not $card_allowed_filters }}{{ $card_allowed_filters = slice "*" }}{{ end }} + {{ $card_allowed_filters_json := $card_allowed_filters | jsonify }} + {{/* Get tags as comma-separated string */}} {{ $tags := slice }} {{ $tags_raw := $item.Params.tags }} @@ -199,8 +241,6 @@ {{ end }} {{ end }} {{ end }} - {{ $item_tags := delimit $tags "," }} - {{ $item_tags_json := $item_tags | jsonify }} {{/* Get status */}} {{ $status := "" }} @@ -208,16 +248,23 @@ {{ if eq (printf "%T" $status_raw) "string" }} {{ $status = strings.TrimSpace $status_raw }} {{ end }} - {{ $status_norm := upper $status }} - {{ $status_class := "bg-emerald-500/20 text-emerald-600 dark:text-emerald-400 border-emerald-500/30" }} - {{ if eq $status_norm "WIP" }} - {{ $status_class = "bg-amber-500/20 text-amber-600 dark:text-amber-400 border-amber-500/30" }} - {{ else if eq $status_norm "ARCHIVED" }} - {{ $status_class = "bg-gray-500/20 text-gray-600 dark:text-gray-400 border-gray-500/30" }} + {{ $status_display := $status }} + {{ if ne $status_text_override "" }} + {{ $status_display = $status_text_override }} {{ end }} + {{ $status_color_source := cond (ne $status "" ) $status $status_display }} + {{ $status_norm := upper $status_color_source }} + {{ $status_class := "bg-emerald-600 text-white border-emerald-500 shadow-md shadow-emerald-500/30 dark:bg-emerald-500 dark:border-emerald-400" }} + {{ if eq $status_norm "WIP" }} + {{ $status_class = "bg-amber-500 text-white border-amber-400 shadow-md shadow-amber-400/30 dark:bg-amber-500" }} + {{ else if eq $status_norm "ARCHIVED" }} + {{ $status_class = "bg-gray-600 text-white border-gray-500 shadow-md shadow-gray-500/30 dark:bg-gray-500" }} + {{ end }} + {{ $render_status_badge := and $show_status_badge (ne $status_display "") }}
- - {{ . }} + + {{ $status_display }}
{{ end }} diff --git a/modules/blox/blox/portfolio/schema.json b/modules/blox/blox/portfolio/schema.json index d46cb49e..a226c076 100644 --- a/modules/blox/blox/portfolio/schema.json +++ b/modules/blox/blox/portfolio/schema.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/portfolio.json", - "title": "Portfolio Block Schema", - "description": "Schema for the Portfolio block - displays filterable project cards with Alpine.js", + "title": "Portfolio", + "description": "Displays filterable project cards with Alpine.js", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -21,12 +21,16 @@ "title": { "type": "string", "description": "Section title (supports Markdown)", - "examples": ["Featured Projects"] + "examples": [ + "Featured Projects" + ] }, "subtitle": { "type": "string", "description": "Section subtitle (supports Markdown)", - "examples": ["Things I've built"] + "examples": [ + "Things I've built" + ] }, "count": { "type": "integer", @@ -37,7 +41,16 @@ "sort_by": { "type": "string", "description": "Field to sort by", - "enum": ["Date", "date", "Title", "title", "Weight", "weight", "Lastmod", "lastmod"], + "enum": [ + "Date", + "date", + "Title", + "title", + "Weight", + "weight", + "Lastmod", + "lastmod" + ], "default": "Date" }, "sort_ascending": { @@ -55,8 +68,15 @@ "items": { "type": "string" }, - "default": ["projects"], - "examples": [["projects", "software"]] + "default": [ + "projects" + ], + "examples": [ + [ + "projects", + "software" + ] + ] } }, "additionalProperties": false @@ -70,23 +90,51 @@ "name": { "type": "string", "description": "Button display text", - "examples": ["All", "Frontend", "Backend"] + "examples": [ + "All", + "Frontend", + "Backend" + ] }, "tag": { "type": "string", "description": "Tag to filter by (* for all)", - "examples": ["*", "Frontend", "Full-Stack"] + "examples": [ + "*", + "Frontend", + "Full-Stack" + ] } }, - "required": ["name", "tag"] + "required": [ + "name", + "tag" + ] }, - "default": [{ "name": "All", "tag": "*" }], + "default": [ + { + "name": "All", + "tag": "*" + } + ], "examples": [ [ - { "name": "All", "tag": "*" }, - { "name": "Full-Stack", "tag": "Full-Stack" }, - { "name": "Frontend", "tag": "Frontend" }, - { "name": "Backend", "tag": "Backend" } + { + "name": "All", + "tag": "*" + }, + { + "name": "Full-Stack", + "tag": "Full-Stack" + }, + { + "name": "Frontend", + "tag": "Frontend" + }, + { + "name": "Backend", + "tag": "Backend" + } ] ] }, @@ -107,12 +155,19 @@ "link": { "type": "string", "description": "Override archive URL (defaults to the first folder in filters.folders)", - "examples": ["/projects/", "/work/"] + "examples": [ + "/projects/", + "/work/" + ] }, "text": { "type": "string", "description": "Override archive link text (uses i18n 'portfolio_view_all' by default)", - "examples": ["View All Projects", "See My Work", "Browse Portfolio"] + "examples": [ + "View All Projects", + "See My Work", + "Browse Portfolio" + ] } }, "additionalProperties": false @@ -128,14 +183,30 @@ "type": "integer", "description": "Number of columns (2, 3, or 4)", "default": 3, - "enum": [2, 3, 4], - "examples": [2, 3, 4] + "enum": [ + 2, + 3, + 4 + ], + "examples": [ + 2, + 3, + 4 + ] }, "fallback_icon": { "type": "string", "description": "Icon to display when no image is provided. Supports all Hugo Blox icon packs: hero (default), brands, devicon, emoji, or custom packs. Format: 'icon-name' or 'pack/icon-name'", "default": "code-bracket", - "examples": ["code-bracket", "academic-cap", "beaker", "paint-brush", "brands/github", "devicon/python", "emoji/rocket"] + "examples": [ + "code-bracket", + "academic-cap", + "beaker", + "paint-brush", + "brands/github", + "devicon/python", + "emoji/rocket" + ] }, "animations": { "type": "boolean", @@ -146,7 +217,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { @@ -157,13 +230,27 @@ "subtitle": "A selection of my recent work", "count": 6, "filters": { - "folders": ["projects"] + "folders": [ + "projects" + ] }, "buttons": [ - { "name": "All", "tag": "*" }, - { "name": "Full-Stack", "tag": "Full-Stack" }, - { "name": "Frontend", "tag": "Frontend" }, - { "name": "Backend", "tag": "Backend" } + { + "name": "All", + "tag": "*" + }, + { + "name": "Full-Stack", + "tag": "Full-Stack" + }, + { + "name": "Frontend", + "tag": "Frontend" + }, + { + "name": "Backend", + "tag": "Backend" + } ], "default_button_index": 0, "archive": { diff --git a/modules/blox/blox/research-areas/schema.json b/modules/blox/blox/research-areas/schema.json index 9249fadb..8b7c49f1 100644 --- a/modules/blox/blox/research-areas/schema.json +++ b/modules/blox/blox/research-areas/schema.json @@ -1,8 +1,8 @@ { "$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 - highlights thematic areas with optional stats and CTAs", + "title": "Research Areas", + "description": "Highlights thematic areas with optional stats and CTAs", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -24,7 +24,9 @@ "type": "string" }, "text": { - "type": "string" + "type": "string", + "x-multiline": true, + "format": "textarea" }, "items": { "type": "array", @@ -43,7 +45,9 @@ "gradient": { "type": "string", "description": "Tailwind gradient classes for the header", - "examples": ["from-primary-400 to-secondary-400"] + "examples": [ + "from-primary-400 to-secondary-400" + ] }, "image": { "type": "string", @@ -69,11 +73,17 @@ } }, "team_size": { - "type": ["string", "number"], + "type": [ + "string", + "number" + ], "description": "Team size metric displayed in the footer" }, "publications": { - "type": ["string", "number"], + "type": [ + "string", + "number" + ], "description": "Publication count metric" }, "funding": { @@ -88,14 +98,22 @@ "type": "string" }, "text": { - "type": "string" + "type": "string", + "x-multiline": true, + "format": "textarea" } }, - "required": ["url", "text"], + "required": [ + "url", + "text" + ], "additionalProperties": false } }, - "required": ["name", "description"], + "required": [ + "name", + "description" + ], "additionalProperties": false }, "minItems": 1 @@ -108,17 +126,24 @@ "type": "string" }, "text": { - "type": "string" + "type": "string", + "x-multiline": true, + "format": "textarea" }, "icon": { "type": "string" } }, - "required": ["url", "text"], + "required": [ + "url", + "text" + ], "additionalProperties": false } }, - "required": ["items"], + "required": [ + "items" + ], "additionalProperties": false }, "design": { @@ -127,7 +152,11 @@ "properties": { "layout": { "type": "string", - "enum": ["cards", "hexagon", "timeline"], + "enum": [ + "cards", + "hexagon", + "timeline" + ], "description": "Layout style: 'cards' shows rich detail cards with images/icons and metrics, 'hexagon' displays a visual swarm of octagonal shapes, 'timeline' presents areas in an alternating vertical timeline", "default": "cards" } @@ -135,7 +164,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { @@ -154,7 +185,11 @@ "gradient": "from-primary-400 to-secondary-400", "icon": "hero/shield-check", "status": "active", - "topics": ["evals", "interpretability", "tooling"], + "topics": [ + "evals", + "interpretability", + "tooling" + ], "team_size": "6", "publications": "12", "funding": "$3.2M", diff --git a/modules/blox/blox/resume-awards/schema.json b/modules/blox/blox/resume-awards/schema.json index 5a9aab85..47fea60b 100644 --- a/modules/blox/blox/resume-awards/schema.json +++ b/modules/blox/blox/resume-awards/schema.json @@ -1,8 +1,8 @@ { "$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 - renders awards/certifications from the referenced author profile", + "title": "Resume Awards", + "description": "Renders awards/certifications from the referenced author profile", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -29,7 +29,9 @@ }, "text": { "type": "string", - "description": "Section description (supports Markdown)" + "description": "Section description (supports Markdown)", + "x-multiline": true, + "format": "textarea" } }, "additionalProperties": false @@ -42,14 +44,20 @@ "type": "string", "description": "Date format for award dates (Go time layout)", "default": "January 2006", - "examples": ["2006", "Jan 2006", "January 2, 2006"] + "examples": [ + "2006", + "Jan 2006", + "January 2, 2006" + ] } }, "additionalProperties": true, "$comment": "Award items in the author profile support: title, icon, url, awarder, date/date_start, summary, certificate_url." } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/resume-biography-3/schema.json b/modules/blox/blox/resume-biography-3/schema.json index 6da55880..6abbe453 100644 --- a/modules/blox/blox/resume-biography-3/schema.json +++ b/modules/blox/blox/resume-biography-3/schema.json @@ -1,8 +1,8 @@ { "$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 - horizontal layout with banner, avatar, and profile details", + "title": "Resume Biography 3", + "description": "Horizontal layout with banner, avatar, and profile details", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -24,7 +24,9 @@ }, "text": { "type": "string", - "description": "Biography text override (supports Markdown). Defaults to the author profile bio." + "description": "Biography text override (supports Markdown). Defaults to the author profile bio.", + "x-multiline": true, + "format": "textarea" }, "headings": { "type": "object", @@ -55,10 +57,15 @@ }, "text": { "type": "string", - "description": "Button text" + "description": "Button text", + "x-multiline": true, + "format": "textarea" } }, - "required": ["url", "text"], + "required": [ + "url", + "text" + ], "additionalProperties": false } }, @@ -74,13 +81,23 @@ "properties": { "size": { "type": "string", - "enum": ["small", "medium", "large", "xl", "xxl"], + "enum": [ + "small", + "medium", + "large", + "xl", + "xxl" + ], "description": "Avatar display size. Sizes: small (150px), medium (200px), large (320px), xl (400px), xxl (500px). Images are generated at 2x for retina displays.", "default": "large" }, "shape": { "type": "string", - "enum": ["circle", "square", "rounded"], + "enum": [ + "circle", + "square", + "rounded" + ], "description": "Avatar shape", "default": "circle" } @@ -115,7 +132,13 @@ "properties": { "size": { "type": "string", - "enum": ["xs", "sm", "md", "lg", "xl"], + "enum": [ + "xs", + "sm", + "md", + "lg", + "xl" + ], "description": "Heading size for the profile name. Responsive sizing from xs (text-xl to text-3xl) up to xl (text-5xl to text-7xl).", "default": "lg" } @@ -126,7 +149,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/resume-biography/schema.json b/modules/blox/blox/resume-biography/schema.json index fa3716cb..642f52da 100644 --- a/modules/blox/blox/resume-biography/schema.json +++ b/modules/blox/blox/resume-biography/schema.json @@ -1,8 +1,8 @@ { "$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 Biography block - renders author details with avatar, banner, bio, and social links", + "title": "Resume Biography", + "description": "Renders author details with avatar, banner, bio, and social links", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -24,7 +24,9 @@ }, "text": { "type": "string", - "description": "Override biography text (Markdown); falls back to author profile bio when omitted" + "description": "Override biography text (Markdown); falls back to author profile bio when omitted", + "x-multiline": true, + "format": "textarea" }, "button": { "type": "object", @@ -34,10 +36,15 @@ "type": "string" }, "text": { - "type": "string" + "type": "string", + "x-multiline": true, + "format": "textarea" } }, - "required": ["url", "text"], + "required": [ + "url", + "text" + ], "additionalProperties": false } }, @@ -52,13 +59,23 @@ "properties": { "size": { "type": "string", - "enum": ["small", "medium", "large", "xl", "xxl"], + "enum": [ + "small", + "medium", + "large", + "xl", + "xxl" + ], "description": "Avatar display size. Sizes: small (150px), medium (200px), large (320px), xl (400px), xxl (500px). Images are generated at 2x for retina displays.", "default": "medium" }, "shape": { "type": "string", - "enum": ["circle", "square", "rounded"], + "enum": [ + "circle", + "square", + "rounded" + ], "description": "Avatar shape", "default": "circle" } @@ -81,7 +98,9 @@ "style": { "type": "string", "description": "Inline CSS style applied to the bio text wrapper", - "examples": ["max-width: 60ch;"] + "examples": [ + "max-width: 60ch;" + ] } }, "additionalProperties": false @@ -90,7 +109,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/resume-experience/schema.json b/modules/blox/blox/resume-experience/schema.json index 89b51c0d..683ae1bc 100644 --- a/modules/blox/blox/resume-experience/schema.json +++ b/modules/blox/blox/resume-experience/schema.json @@ -1,8 +1,8 @@ { "$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 Experience block - renders work history and education timelines from an author profile", + "title": "Resume Experience", + "description": "Renders work history and education timelines from an author profile", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -24,7 +24,9 @@ }, "text": { "type": "string", - "description": "Optional lead-in copy above the timelines" + "description": "Optional lead-in copy above the timelines", + "x-multiline": true, + "format": "textarea" } }, "additionalProperties": false @@ -37,7 +39,11 @@ "type": "string", "description": "Date format for experience and education entries (Go time layout)", "default": "Jan 2006", - "examples": ["Jan 2006", "January 2006", "2006"] + "examples": [ + "Jan 2006", + "January 2006", + "2006" + ] }, "is_education_first": { "type": "boolean", @@ -49,7 +55,9 @@ }, "$comment": "Experience and education items in the author profile support: role/position, org/company_name, start/date_start, end/date_end, summary, icon, tags (array), and button (object with url, text, icon)." }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/resume-languages/schema.json b/modules/blox/blox/resume-languages/schema.json index 2eae0413..078b4aef 100644 --- a/modules/blox/blox/resume-languages/schema.json +++ b/modules/blox/blox/resume-languages/schema.json @@ -1,8 +1,8 @@ { "$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 Languages block - renders language proficiency from the author profile", + "title": "Resume Languages", + "description": "Renders language proficiency from the author profile", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -28,14 +28,18 @@ }, "text": { "type": "string", - "description": "Section description (supports Markdown)" + "description": "Section description (supports Markdown)", + "x-multiline": true, + "format": "textarea" } }, "additionalProperties": false }, "$comment": "Language items in the author profile support: name (string), level (1-5 numeric or text like 'Native'), label (display label), percent (0-100 override). Numeric levels are converted to percentage (level * 20)." }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/resume-skills/schema.json b/modules/blox/blox/resume-skills/schema.json index dd5d8829..1b90f2a7 100644 --- a/modules/blox/blox/resume-skills/schema.json +++ b/modules/blox/blox/resume-skills/schema.json @@ -1,8 +1,8 @@ { "$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 and proficiency pulled from an author profile", + "title": "Resume Skills", + "description": "Displays skills and proficiency pulled from an author profile", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -29,7 +29,9 @@ }, "text": { "type": "string", - "description": "Section description (supports Markdown)" + "description": "Section description (supports Markdown)", + "x-multiline": true, + "format": "textarea" } }, "additionalProperties": false @@ -44,14 +46,19 @@ "default": 2, "minimum": 1, "maximum": 5, - "examples": [2, 3] + "examples": [ + 2, + 3 + ] } }, "additionalProperties": true, "$comment": "Skill groups in the author profile support: name, description, color (progress bar fill), color_border, items (array). Each item supports: label/name, description, icon, level (1-5 for progress bar)." } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/search-hero/schema.json b/modules/blox/blox/search-hero/schema.json index 0cc92d94..e9503fb0 100644 --- a/modules/blox/blox/search-hero/schema.json +++ b/modules/blox/blox/search-hero/schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/search-hero.json", - "title": "Search Hero Block Schema", + "title": "Search Hero", "description": "A hero section with prominent search functionality and optional stats", "allOf": [ { @@ -23,7 +23,9 @@ "properties": { "text": { "type": "string", - "description": "Badge text" + "description": "Badge text", + "x-multiline": true, + "format": "textarea" }, "show_pulse": { "type": "boolean", @@ -31,7 +33,9 @@ "default": false } }, - "required": ["text"], + "required": [ + "text" + ], "additionalProperties": false }, "title": { @@ -53,7 +57,13 @@ "items": { "type": "string" }, - "examples": [["Get started", "Deploy with Hugo Blox", "Tailwind customization"]] + "examples": [ + [ + "Get started", + "Deploy with Hugo Blox", + "Tailwind customization" + ] + ] }, "stats": { "type": "array", @@ -70,16 +80,23 @@ "description": "Stat label" } }, - "required": ["value", "label"], + "required": [ + "value", + "label" + ], "additionalProperties": false } } }, - "required": ["title"], + "required": [ + "title" + ], "additionalProperties": false } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { @@ -89,7 +106,10 @@ "gradient_mesh": { "enable": true, "style": "waves", - "colors": ["primary-500/25", "secondary-500/25"], + "colors": [ + "primary-500/25", + "secondary-500/25" + ], "animation": "float" } } @@ -102,7 +122,10 @@ "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"], + "suggestions": [ + "Get started", + "Deploy with Hugo Blox" + ], "stats": [ { "value": "250+", diff --git a/modules/blox/blox/stats/schema.json b/modules/blox/blox/stats/schema.json index 75ea018d..00639b76 100644 --- a/modules/blox/blox/stats/schema.json +++ b/modules/blox/blox/stats/schema.json @@ -1,8 +1,8 @@ { "$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 cards, compact rows, or a minimal grid", + "title": "Stats", + "description": "Displays statistics in cards, compact rows, or a minimal grid", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -24,7 +24,9 @@ }, "text": { "type": "string", - "description": "Section description (supports Markdown)" + "description": "Section description (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "items": { "type": "array", @@ -33,9 +35,18 @@ "type": "object", "properties": { "statistic": { - "type": ["string", "number"], + "type": [ + "string", + "number" + ], "description": "The statistic value/number. Can include formatting like '120+', '5M', or '$3.2M'. Animated counter extracts numeric portion.", - "examples": ["120+", "5M", "$3.2M", 42, 3.2] + "examples": [ + "120+", + "5M", + "$3.2M", + 42, + 3.2 + ] }, "description": { "type": "string", @@ -50,13 +61,18 @@ "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": { @@ -65,7 +81,11 @@ "properties": { "layout": { "type": "string", - "enum": ["cards", "compact", "minimal"], + "enum": [ + "cards", + "compact", + "minimal" + ], "description": "Display layout style", "default": "cards" } @@ -73,7 +93,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { diff --git a/modules/blox/blox/team-showcase/schema.json b/modules/blox/blox/team-showcase/schema.json index 242e9fcc..a52a643b 100644 --- a/modules/blox/blox/team-showcase/schema.json +++ b/modules/blox/blox/team-showcase/schema.json @@ -1,8 +1,8 @@ { "$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 grouped by author taxonomy", + "title": "Team Showcase", + "description": "Displays team members grouped by author taxonomy", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -28,18 +28,24 @@ }, "text": { "type": "string", - "description": "Section description (supports Markdown)" + "description": "Section description (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "user_groups": { "type": "array", "description": "Filter to authors that belong to these user groups (defaults to all authors). Accepts strings or objects { name, sort_by?, sort_ascending? } for per-group sorting.", "items": { "oneOf": [ - { "type": "string" }, + { + "type": "string" + }, { "type": "object", "properties": { - "name": { "type": "string" }, + "name": { + "type": "string" + }, "sort_by": { "type": "string", "description": "Per-group override of sort field" @@ -49,20 +55,41 @@ "description": "Per-group override of sort direction" } }, - "required": ["name"], + "required": [ + "name" + ], "additionalProperties": false } ] }, "examples": [ - ["Principal Investigators", "PhD Students"], - [{ "name": "Alumni", "sort_by": "graduation_year", "sort_ascending": false }, "Research Engineers"] + [ + "Principal Investigators", + "PhD Students" + ], + [ + { + "name": "Alumni", + "sort_by": "graduation_year", + "sort_ascending": false + }, + "Research Engineers" + ] ] }, "sort_by": { "type": "string", "description": "Field to sort authors by. Common values: 'name_family' (last name), 'weight', 'graduation_year'. The legacy 'Params.' prefix is optional for compatibility.", - "enum": ["name_family", "name.family", "family", "last_name", "family_name", "weight", "graduation_year", "title"], + "enum": [ + "name_family", + "name.family", + "family", + "last_name", + "family_name", + "weight", + "graduation_year", + "title" + ], "default": "name_family" }, "sort_ascending": { @@ -76,7 +103,9 @@ "properties": { "text": { "type": "string", - "description": "Button text" + "description": "Button text", + "x-multiline": true, + "format": "textarea" }, "url": { "type": "string", @@ -87,7 +116,10 @@ "description": "Optional icon name (e.g., 'hero/user-plus')" } }, - "required": ["text", "url"], + "required": [ + "text", + "url" + ], "additionalProperties": false } }, @@ -126,13 +158,20 @@ "align": { "type": "string", "description": "Align the section header and CTA", - "enum": ["center", "left"], + "enum": [ + "center", + "left" + ], "default": "center" }, "max_columns": { "type": "integer", "description": "Maximum number of columns on wide screens (2-4)", - "enum": [2, 3, 4], + "enum": [ + 2, + 3, + 4 + ], "default": 4 }, "show_empty_groups": { @@ -144,7 +183,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { @@ -156,7 +197,11 @@ "user_groups": [ "Principal Investigators", "Research Engineers", - { "name": "Alumni", "sort_by": "graduation_year", "sort_ascending": false } + { + "name": "Alumni", + "sort_by": "graduation_year", + "sort_ascending": false + } ], "sort_by": "name_family", "sort_ascending": true, diff --git a/modules/blox/blox/tech-stack/schema.json b/modules/blox/blox/tech-stack/schema.json index 94915cfd..49c24266 100644 --- a/modules/blox/blox/tech-stack/schema.json +++ b/modules/blox/blox/tech-stack/schema.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/tech-stack.json", - "title": "Tech Stack Block Schema", - "description": "Schema for the Tech Stack block - displays technologies with icons organized by category", + "title": "Tech Stack", + "description": "Displays technologies with icons organized by category", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -21,12 +21,17 @@ "title": { "type": "string", "description": "Section title (supports Markdown)", - "examples": ["Tech Stack", "Skills & Technologies"] + "examples": [ + "Tech Stack", + "Skills & Technologies" + ] }, "subtitle": { "type": "string", "description": "Section subtitle (supports Markdown)", - "examples": ["Technologies I work with daily"] + "examples": [ + "Technologies I work with daily" + ] }, "categories": { "type": "array", @@ -37,7 +42,12 @@ "name": { "type": "string", "description": "Category name", - "examples": ["Languages", "Frontend", "Backend", "DevOps"] + "examples": [ + "Languages", + "Frontend", + "Backend", + "DevOps" + ] }, "items": { "type": "array", @@ -48,40 +58,70 @@ "name": { "type": "string", "description": "Technology name", - "examples": ["TypeScript", "React", "Node.js"] + "examples": [ + "TypeScript", + "React", + "Node.js" + ] }, "icon": { "type": "string", "description": "Icon identifier (supports devicon/, brands/, or hero icons)", - "examples": ["devicon/typescript", "devicon/react", "brands/github"] + "examples": [ + "devicon/typescript", + "devicon/react", + "brands/github" + ] }, "level": { "type": "string", "description": "Proficiency level (optional)", - "enum": ["expert", "advanced", "intermediate", "beginner"], - "examples": ["expert", "advanced"] + "enum": [ + "expert", + "advanced", + "intermediate", + "beginner" + ], + "examples": [ + "expert", + "advanced" + ] } }, - "required": ["name"] + "required": [ + "name" + ] } } }, - "required": ["items"] + "required": [ + "items" + ] }, "examples": [ [ { "name": "Languages", "items": [ - { "name": "TypeScript", "icon": "devicon/typescript", "level": "expert" }, - { "name": "Python", "icon": "devicon/python", "level": "advanced" } + { + "name": "TypeScript", + "icon": "devicon/typescript", + "level": "expert" + }, + { + "name": "Python", + "icon": "devicon/python", + "level": "advanced" + } ] } ] ] } }, - "required": ["categories"], + "required": [ + "categories" + ], "additionalProperties": false }, "design": { @@ -91,7 +131,10 @@ "style": { "type": "string", "description": "Display style", - "enum": ["grid", "list"], + "enum": [ + "grid", + "list" + ], "default": "grid" }, "show_levels": { @@ -108,7 +151,9 @@ "additionalProperties": true } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { @@ -121,17 +166,38 @@ { "name": "Languages", "items": [ - { "name": "TypeScript", "icon": "devicon/typescript", "level": "expert" }, - { "name": "Python", "icon": "devicon/python", "level": "advanced" }, - { "name": "Go", "icon": "devicon/go", "level": "intermediate" } + { + "name": "TypeScript", + "icon": "devicon/typescript", + "level": "expert" + }, + { + "name": "Python", + "icon": "devicon/python", + "level": "advanced" + }, + { + "name": "Go", + "icon": "devicon/go", + "level": "intermediate" + } ] }, { "name": "Frontend", "items": [ - { "name": "React", "icon": "devicon/react" }, - { "name": "Next.js", "icon": "devicon/nextjs" }, - { "name": "Tailwind CSS", "icon": "devicon/tailwindcss" } + { + "name": "React", + "icon": "devicon/react" + }, + { + "name": "Next.js", + "icon": "devicon/nextjs" + }, + { + "name": "Tailwind CSS", + "icon": "devicon/tailwindcss" + } ] } ] diff --git a/modules/blox/blox/testimonials/schema.json b/modules/blox/blox/testimonials/schema.json index c9e62567..bbe871b0 100644 --- a/modules/blox/blox/testimonials/schema.json +++ b/modules/blox/blox/testimonials/schema.json @@ -1,8 +1,8 @@ { "$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 quotes with avatars, names, and roles", + "title": "Testimonials", + "description": "Displays quotes with avatars, names, and roles", "allOf": [ { "$ref": "../shared/schemas/base-block.json" @@ -23,7 +23,9 @@ }, "text": { "type": "string", - "description": "Section description (supports Markdown)" + "description": "Section description (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "items": { "type": "array", @@ -33,7 +35,9 @@ "properties": { "text": { "type": "string", - "description": "Quoted testimonial text (supports Markdown)" + "description": "Quoted testimonial text (supports Markdown)", + "x-multiline": true, + "format": "textarea" }, "name": { "type": "string", @@ -46,20 +50,30 @@ "image": { "type": "string", "description": "Avatar filename in assets/media/. Image is processed to 96x96 (displayed at 48x48 for retina).", - "examples": ["people/casey.jpg", "testimonials/avatar.png"] + "examples": [ + "people/casey.jpg", + "testimonials/avatar.png" + ] } }, - "required": ["text", "name"], + "required": [ + "text", + "name" + ], "additionalProperties": false }, "minItems": 1 } }, - "required": ["items"], + "required": [ + "items" + ], "additionalProperties": false } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { @@ -69,13 +83,13 @@ "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.”", + "text": "\u201cHugo Blox let us ship a research microsite in days instead of weeks.\u201d", "name": "Dr. Casey Smith", "role": "Research Lead, OpenAI", "image": "people/casey.jpg" }, { - "text": "“Great developer experience and first-class docs. Our students love it.”", + "text": "\u201cGreat developer experience and first-class docs. Our students love it.\u201d", "name": "Prof. Lee Nguyen", "role": "MIT CSAIL", "image": "people/lee.png" diff --git a/modules/blox/blox/trending-questions/schema.json b/modules/blox/blox/trending-questions/schema.json index c17b8dbe..186ed7af 100644 --- a/modules/blox/blox/trending-questions/schema.json +++ b/modules/blox/blox/trending-questions/schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://hugoblox.com/schemas/blocks/trending-questions.json", - "title": "Trending Questions Block Schema", + "title": "Trending Questions", "description": "Display trending or featured questions with optional dynamic sourcing from content marked `trending: true`", "allOf": [ { @@ -49,7 +49,9 @@ "type": "object", "properties": { "text": { - "type": "string" + "type": "string", + "x-multiline": true, + "format": "textarea" }, "color": { "type": "string", @@ -62,13 +64,22 @@ "type": "string" }, "views": { - "type": ["string", "number"] + "type": [ + "string", + "number" + ] }, "upvotes": { - "type": ["integer", "number"] + "type": [ + "integer", + "number" + ] } }, - "required": ["question", "link"], + "required": [ + "question", + "link" + ], "additionalProperties": false } }, @@ -76,27 +87,39 @@ "type": "object", "properties": { "text": { - "type": "string" + "type": "string", + "x-multiline": true, + "format": "textarea" }, "link": { "type": "string" } }, - "required": ["text", "link"], + "required": [ + "text", + "link" + ], "additionalProperties": false } }, "additionalProperties": false } }, - "required": ["content"], + "required": [ + "content" + ], "additionalProperties": true, "examples": [ { "block": "trending-questions", "design": { "spacing": { - "padding": ["3rem", "0", "3rem", "0"] + "padding": [ + "3rem", + "0", + "3rem", + "0" + ] } }, "content": { @@ -109,7 +132,7 @@ "answer_preview": "Use the provided CI workflow or run `hugo --gc --minify`...", "link": "/docs/deploy/netlify/", "badge": { - "text": "🔥 Popular", + "text": "\ud83d\udd25 Popular", "color": "bg-amber-100 text-amber-800" }, "views": 1200, diff --git a/templates/dev-portfolio/content/_index.md b/templates/dev-portfolio/content/_index.md index a1d5b2e2..d887b891 100644 --- a/templates/dev-portfolio/content/_index.md +++ b/templates/dev-portfolio/content/_index.md @@ -53,7 +53,7 @@ sections: content: title: "Featured Projects" subtitle: "A selection of my recent work" - count: 6 + count: 0 filters: folders: - projects diff --git a/test/data/pages/home.yaml b/test/data/pages/home.yaml index ca48bb59..4edad934 100644 --- a/test/data/pages/home.yaml +++ b/test/data/pages/home.yaml @@ -59,5 +59,3 @@ sections: color: light: "gray-50" dark: "gray-900" - -