mirror of
https://github.com/tiennm99/HugoBlox-kit.git
synced 2026-10-12 22:14:08 +00:00
fix: portfolio filter limits, View All logic, and status badge configuration
This commit is contained in:
1 parent
2c2d7cd403
commit
b374e3d1d9
30 files changed
+1100
-334
No files matched your search
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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/"
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 */}}
|
||||
<div class="grid grid-cols-1 {{ $grid_class }} gap-6" data-stagger="100">
|
||||
{{ 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 "") }}
|
||||
|
||||
<article
|
||||
x-show="activeFilter === '*' || {{ $item_tags_json }}.toLowerCase().includes(activeFilter.toLowerCase())"
|
||||
x-data="{ filters: {{ $card_allowed_filters_json }} }"
|
||||
x-show="filters.includes(activeFilter)"
|
||||
x-transition:enter="transition ease-out duration-300"
|
||||
x-transition:enter-start="opacity-0 scale-95 translate-y-4"
|
||||
x-transition:enter-end="opacity-100 scale-100 translate-y-0"
|
||||
@@ -252,10 +299,10 @@
|
||||
{{ end }}
|
||||
|
||||
{{/* Status Badge */}}
|
||||
{{ with $status }}
|
||||
{{ if $render_status_badge }}
|
||||
<div class="absolute top-3 right-3">
|
||||
<span class="px-2.5 py-1 text-xs font-semibold rounded-full border backdrop-blur-sm {{ $status_class }}">
|
||||
{{ . }}
|
||||
<span class="px-2.5 py-1.5 text-xs font-semibold rounded-full border {{ $status_class }}">
|
||||
{{ $status_display }}
|
||||
</span>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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+",
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -53,7 +53,7 @@ sections:
|
||||
content:
|
||||
title: "Featured Projects"
|
||||
subtitle: "A selection of my recent work"
|
||||
count: 6
|
||||
count: 0
|
||||
filters:
|
||||
folders:
|
||||
- projects
|
||||
|
||||
@@ -59,5 +59,3 @@ sections:
|
||||
color:
|
||||
light: "gray-50"
|
||||
dark: "gray-900"
|
||||
|
||||
|
||||
Reference in new issue
Block a user