mirror of
https://github.com/tiennm99/HugoBlox-kit.git
synced 2026-10-11 03:12:56 +00:00
docs: edit
This commit is contained in:
1 parent
96aa04356e
commit
1352d89867
34 files changed
+161
-4302
No files matched your search
+7
-5
@@ -4,9 +4,11 @@ type: software
|
||||
|
||||
title: "HugoBlox"
|
||||
abstract: >
|
||||
HugoBlox is an open-research copilot for publishing scientific and technical content with Hugo.
|
||||
It provides a no-code block system, Markdown-first content, and research-focused
|
||||
features such as LaTeX math, BibTeX citations, and Jupyter Notebook support.
|
||||
HugoBlox is an open-source ecosystem for building high-performance research portfolios,
|
||||
lab websites, and technical documentation. Designed for data sovereignty, it enables
|
||||
data scientists and researchers to publish reproducible content directly from Markdown,
|
||||
Jupyter Notebooks, and BibTeX, eliminating the need for complex JavaScript dependencies
|
||||
or proprietary AI platforms.
|
||||
|
||||
authors:
|
||||
- family-names: "Cushen"
|
||||
@@ -19,8 +21,8 @@ url: "https://hugoblox.com"
|
||||
doi: 10.5281/zenodo.17704062
|
||||
|
||||
# Use the latest released version here
|
||||
version: "0.10.0"
|
||||
date-released: 2025-11-08
|
||||
version: "0.11.0"
|
||||
date-released: 2026-01-02
|
||||
|
||||
keywords:
|
||||
- hugo
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016-present George Cushen (https://georgecushen.com/)
|
||||
Copyright © 2016-Present [**Lore Labs**](https://lore.tech).
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
||||
@@ -1,157 +1,227 @@
|
||||
[**中文**](./README.zh.md)
|
||||
|
||||
<p align="center">
|
||||
<a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme">
|
||||
<a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme&utm_content=hero_image">
|
||||
<img src="./.github/media/hero.png" alt="Build world-class sites with HugoBlox" width="100%">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<h1 align="center">HugoBlox: Your Open Research Copilot</h1>
|
||||
<h1 align="center">HugoBlox: Your Open Publishing Stack</h1>
|
||||
|
||||
<p align="center">
|
||||
<strong>Build a "Future-Proof" Brand in the AI Era.</strong><br/>
|
||||
The choice of rockstar researchers and founders at <strong>Meta, Stanford, NVIDIA, and Y Combinator</strong>.
|
||||
<strong>Publish notebooks, docs, portfolios, and knowledge bases from Markdown + Jupyter.</strong><br/>
|
||||
Built for data scientists, AI engineers, researchers, labs, and tech startups who want speed without lock-in: Hugo + Tailwind with optional Pro automation (visual editing, imports, fixes, and upgrades).
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme"><b>🚀 Launch Copilot (Free)</b></a>
|
||||
<a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme&utm_content=cta_start"><b>Start Free in Browser</b></a>
|
||||
•
|
||||
<a href="https://hugoblox.com/pro?utm_source=github&utm_medium=readme">Go Pro</a>
|
||||
<a href="https://marketplace.visualstudio.com/items?itemName=lore.lore-studio"><b>Get Lore Studio (VS Code)</b></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://discord.gg/z8wNYzb">
|
||||
<img src="https://img.shields.io/discord/722225264733716590?label=Join%20Discord&style=social" alt="Discord">
|
||||
</a>
|
||||
<a href="https://github.com/HugoBlox/kit">
|
||||
<img src="https://img.shields.io/github/stars/HugoBlox/kit?label=Star%20Hugo%20Blox&style=social" alt="GitHub Stars">
|
||||
</a>
|
||||
<a href="https://x.com/LoreLabs_">
|
||||
<img src="https://img.shields.io/twitter/follow/LoreLabs_?label=Follow&style=social" alt="Follow on X">
|
||||
</a>
|
||||
<sub>
|
||||
<a href="#for-researchers--labs">Researchers & Labs</a>
|
||||
•
|
||||
<a href="#for-data-scientists--ai-engineers">Data Scientists & AI Engineers</a>
|
||||
•
|
||||
<a href="#for-teams--orgs">Teams & Orgs</a>
|
||||
•
|
||||
<a href="#-pricing--features-open-core">Pricing</a>
|
||||
</sub>
|
||||
</p>
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://discord.gg/z8wNYzb)
|
||||
[](https://github.com/HugoBlox/kit)
|
||||
[](https://x.com/LoreLabs_)
|
||||
[](./LICENSE.md)
|
||||
|
||||
</div>
|
||||
|
||||
<p align="center">
|
||||
<sub>
|
||||
Trusted since <strong>2016</strong> · <strong>150,000+</strong> researchers and scientists (Meta, Stanford, NVIDIA) · Rated <strong>4.9/5</strong> by users (official survey) · Used by teams like <a href="https://research.nvidia.com/research-labs">NVIDIA Research Labs</a>, <a href="https://cai4cai.ml/">King’s College London</a>, and <a href="https://www.metaconscious.org/">MIT</a> · Featured by GitHub <a href="https://github.blog/open-source/release-radar-february-2019/#hugo-academic-4-0">Release Radar</a>
|
||||
</sub>
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## Why Top Talent Chooses HugoBlox
|
||||
## ⚡️ Why teams choose HugoBlox
|
||||
|
||||
In the age of AI agents, **Markdown is the new source code**. HugoBlox empowers STEM researchers, data scientists, innovative labs, and YC startups to create stunning, high-impact websites without the hassle.
|
||||
In the age of AI, **Markdown is the new source code**. HugoBlox gives you the speed of modern tooling with the durability of a static stack: **Hugo + Tailwind** (with optional Alpine/Svelte blocks for interactivity).
|
||||
|
||||
Vibe coding tools generate fragile, "black box" React/JS apps that are a nightmare to maintain. **HugoBlox** combines AI speed with static site robustness, now supercharged with **Lore Studio** – your visual UI editor in VS Code.
|
||||
- **Own your content**: clean Markdown, YAML, and notebooks — portable, readable, and LLM-friendly.
|
||||
- **Performance without the ops tax**: static output, fast builds, no runtime database.
|
||||
- **Beautiful by default**: high-quality templates + blocks (and Pro options when you want more).
|
||||
- **A hybrid workflow**: edit in code, or use a visual editor when you want velocity.
|
||||
|
||||
- **🔮 Future-Proof & AI Ready:** Content in clean Markdown – readable by humans and LLMs. No lock-in.
|
||||
- **🧠 The "Copilot" Workflow:**
|
||||
- **Online:** AI-assisted deployer launches in 60 seconds.
|
||||
- **VS Code:** Introducing **Lore Studio** – visual editing, real-time previews, and smart configs right in your IDE.
|
||||
- **⚡ Performance without Debt:** Perfect Lighthouse scores, zero JS bloat, powered by Tailwind 4 and Hugo Modules.
|
||||
- **🎓 Research-Grade Features:** LaTeX, BibTeX auto-citations, Jupyter integration – amplify your publications.
|
||||
---
|
||||
|
||||

|
||||
*Build stunning research portfolios in minutes – focus on breakthroughs, not code.*
|
||||
## For researchers & labs
|
||||
|
||||

|
||||
*Instant previews and smart suggestions – elevate your site effortlessly.*
|
||||
- **Lab sites and academic profiles** (people, publications, projects, news)
|
||||
- **Citable output** with BibTeX/DOI workflows
|
||||
- **Notebooks + LaTeX** for technical writing that actually renders
|
||||
|
||||

|
||||
*A visual CMS in VS Code – discovery time, not deployment drudgery.*
|
||||
## For data scientists & AI engineers
|
||||
|
||||
- **Project docs** and technical blogs without heavy JavaScript stacks
|
||||
- **Notebook-first publishing** (`.ipynb`) for reports, tutorials, and results
|
||||
- **Knowledge bases** and internal docs that stay searchable and maintainable
|
||||
|
||||
## For teams & orgs
|
||||
|
||||
- **Consistent sites** across teams with templates + blocks
|
||||
- **Lower risk upgrades** with clear versioning + migration guidance
|
||||
- **Support options** when you need fast answers
|
||||
|
||||
---
|
||||
|
||||
## 🧠 Edit the way you like (code-first, visual when you want it)
|
||||
|
||||
- **Code-first**: Markdown/YAML + Hugo templates for full control.
|
||||
- **Visual editing (Pro)**: **Lore Studio** in VS Code for drag-and-drop blocks, previews, and safer config edits.
|
||||
- **AI automation (Pro)**: spend less time on formatting, YAML fixes, imports, and maintenance.
|
||||
|
||||
<p align="center">
|
||||
<a href="https://marketplace.visualstudio.com/items?itemName=lore.lore-studio"><b>📥 Download Lore Studio Now (Free)</b></a>
|
||||
<img src="./.github/media/studio/slide-1.webp" alt="Lore Studio in Action" width="100%">
|
||||
</p>
|
||||
<p align="center"><em>Lore Studio: Visual editing meets code-first control.</em></p>
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ The toolkit
|
||||
|
||||
| **Feature** | **Why it matters** |
|
||||
| :--- | :--- |
|
||||
| **Lore Studio (VS Code)** | A visual CMS inside your editor. Drag-and-drop blocks without leaving VS Code. |
|
||||
| **Notebooks & LaTeX** | Render `.ipynb` and math-heavy pages natively. |
|
||||
| **BibTeX / DOI workflows** | Build publication pages and bibliographies without manual formatting. |
|
||||
| **Polyglot Support** | Write in Markdown, Jupyter, RMarkdown, or LaTeX Math. |
|
||||
|
||||
<p align="center">
|
||||
<img src="./.github/media/templates.webp" alt="Template previews" width="900">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://hugoblox.com/templates?utm_source=github&utm_medium=readme"><b>Browse Templates →</b></a>
|
||||
<a href="https://hugoblox.com/templates?utm_source=github&utm_medium=readme&utm_content=templates"><b>Browse Templates →</b></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<sub>Want to see it working fast? Pick a template and publish in ~60 seconds with the Online Copilot.</sub><br/>
|
||||
<a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme&utm_content=cta_template_start"><b>Try a template now →</b></a>
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## Get Started
|
||||
## 🚀 Get Started
|
||||
|
||||
### Option 1: The Online Copilot (Fastest)
|
||||
Launch a professional site for your Lab, Startup, or Bio in under 2 minutes.
|
||||
Ideal for **founders, labs, and startups**. Launch a site in minutes.
|
||||
|
||||
👉 [**Start Free in Browser**](https://hugoblox.com/start?utm_source=github&utm_medium=readme)
|
||||
👉 [**Start Free in Browser**](https://hugoblox.com/start?utm_source=github&utm_medium=readme&utm_content=get_started_browser)
|
||||
|
||||
### Option 2: Lore Studio in VS Code (Visual Powerhouse)
|
||||
Supercharge your workflow with our VS Code extension – visual editing for pros.
|
||||
### Option 2: Lore Studio (Best for Data/AI teams)
|
||||
The power of a visual website builder, directly inside VS Code.
|
||||
|
||||
1. Install from [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=lore.lore-studio).
|
||||
2. Open your HugoBlox project in VS Code.
|
||||
3. Click the HugoBlox icon and start building visually!
|
||||
1. **Install** [Lore Studio from the Marketplace](https://marketplace.visualstudio.com/items?itemName=lore.lore-studio).
|
||||
2. **Open** any HugoBlox project folder.
|
||||
3. **Click** the Lore Studio icon in the menu to start visually editing.
|
||||
|
||||
### Option 3: The CLI (For Developers)
|
||||
Prefer the terminal? Scaffold with our local copilot:
|
||||
### Option 3: The CLI (For DevOps/Eng)
|
||||
Scaffold a new project locally.
|
||||
|
||||
```bash
|
||||
npx hugoblox create
|
||||
# Requires Hugo Extended & Node.js
|
||||
npm install -g hugoblox
|
||||
hugoblox create site
|
||||
```
|
||||
|
||||
*Prerequisites: [Hugo Extended & Node](https://docs.hugoblox.com/start/cli/).
|
||||
|
||||
For more guides, visit [**docs.hugoblox.com**](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme).
|
||||
Need guides and best practices? See the docs: [**docs.hugoblox.com**](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme&utm_content=docs)
|
||||
|
||||
---
|
||||
|
||||
## Free vs. Pro
|
||||
## ✅ Stability & upgrades (because your site should not break)
|
||||
|
||||
**HugoBlox** is open core. Build world-class sites for free. **Pro** accelerates with Studio and premium features.
|
||||
- **Pin versions** to keep production stable.
|
||||
- **Upgrade with confidence** using migration notes and upgrade guides.
|
||||
- **Customize safely**: prefer configuration and blocks over fragile template overrides when possible.
|
||||
- **Catch config issues early (Pro)**: visual editing + validation reduces YAML/front matter mistakes.
|
||||
|
||||
| Feature | Open Source | **HugoBlox Pro** |
|
||||
See the docs for upgrade guidance: [**docs.hugoblox.com**](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme&utm_content=upgrade_guidance)
|
||||
|
||||
---
|
||||
|
||||
## 💎 Pricing & Features (Open Core)
|
||||
|
||||
HugoBlox is **Open Core**. The **Free Kit** is production-grade and you will always own your data and code.
|
||||
|
||||
The Free Kit includes:
|
||||
|
||||
- **Templates + blocks** for portfolios, labs, docs, and landing pages
|
||||
- **Markdown/YAML-first workflow** with Hugo + Tailwind performance
|
||||
- **Notebook + LaTeX support** for technical publishing
|
||||
- **Community support** via docs, GitHub issues, and Discord
|
||||
|
||||
Upgrade to **Pro** when you want automation and lower maintenance overhead:
|
||||
|
||||
- **Less time debugging YAML** (Fix-it Bot + safer config editing)
|
||||
- **Less time formatting citations** (Magic Import + publication automation)
|
||||
- **Less time dealing with upgrades** (guided maintenance workflows)
|
||||
- **More velocity** (visual editing + previews in VS Code)
|
||||
|
||||
|
||||
| Feature | **Free Kit** (Open Source) | **Pro** (Automation) |
|
||||
| :--- | :---: | :---: |
|
||||
| **Core Framework** | ✅ | ✅ |
|
||||
| **Studio Site Editor** | ❌ | **✅ Included** |
|
||||
| **Premium Templates** (SaaS, Lab) | ❌ | **✅ Included** |
|
||||
| **Exclusive Pro Blocks** | ❌ | **✅ Included** |
|
||||
| **Remove Attribution?** | ❌ | **✅ Included** |
|
||||
| **Discord Support** | ❤️ | **⚡️ Priority** |
|
||||
| **Support Open Research** | ❤️ | **🏆 Hero Status** |
|
||||
| **Code Ownership** | ✅ 100% Yours | ✅ 100% Yours |
|
||||
| **Visual Editor in Lore Studio** | ❌ | **✅ Included** |
|
||||
| **AI "Fix-It" Bot** (Auto-fix YAML) | ❌ | **✅ Unlimited** |
|
||||
| **Magic Import** (BibTeX/DOI -> Page) | ⏳ Trial | **✅ Unlimited** |
|
||||
| **CV Generator** (Site -> PDF Resume) | ❌ | **✅ Included** |
|
||||
| **Private Discord Support** | ❌ | **✅ Priority** |
|
||||
|
||||
👉 [**Upgrade to Pro**](https://hugoblox.com/pro?utm_source=github&utm_medium=readme)
|
||||
👉 [**View Full Feature Matrix**](https://hugoblox.com/pricing?utm_source=github&utm_medium=readme&utm_content=pricing_matrix) • [**Go Pro**](https://hugoblox.com/pro?utm_source=github&utm_medium=readme&utm_content=cta_pro)
|
||||
|
||||
---
|
||||
|
||||
## What Creators Say
|
||||
> "Lore Studio saved me **40+ hours** on my lab site. Visual edits + BibTeX auto-updates = **citations up 3×**."
|
||||
> <br/>— **Dr. Sarah Yang**, AI Researcher
|
||||
|
||||
> "Lore Studio saved me 40+ hours on my lab site. Visual edits + Bibtex auto-updates = citations up 3×."
|
||||
> — **Dr. Sarah Yang**, AI Researcher
|
||||
|
||||
> "Launched docs in 10 minutes with Studio. Block system is genius; onboarding dropped 60%."
|
||||
> — **Alexandre Rodrigues**, Founder
|
||||
> "Launched docs in **10 minutes**. The block system is genius; onboarding time dropped 60%."
|
||||
> <br/>— **Alexandre Rodrigues**, Founder
|
||||
|
||||
---
|
||||
|
||||
## Support the Project
|
||||
## 🏢 Org-ready (without the enterprise bloat)
|
||||
|
||||
- 💎 **Pro (only $8/m)** — Unlock Studio, premium templates, and all updates.
|
||||
<br/>[**Go Pro →**](https://hugoblox.com/pro?utm_source=github&utm_medium=readme)
|
||||
|
||||
- ☕️ **Donate a Coffee** — Fuel open source and research.
|
||||
<br/>[**Sponsor on GitHub →**](https://github.com/sponsors/gcushen)
|
||||
|
||||
- 🤝 **Corporate Sponsors** — Reach thousands. Get your logo here.
|
||||
<br/>[**Become a Partner →**](https://github.com/sponsors/gcushen)
|
||||
- **Deploy anywhere**: static output works with your existing infra.
|
||||
- **Lower ops surface area**: no runtime app to patch.
|
||||
- **Procurement-friendly options**: priority support and commercial features when you need them.
|
||||
|
||||
---
|
||||
|
||||
## Community
|
||||
## 🗣️ Community & Support
|
||||
|
||||
Join to ask questions, share work, and improve.
|
||||
We are a community of 150,000+ researchers, engineers, and creators.
|
||||
|
||||
- 💬 [Discord](https://discord.gg/z8wNYzb)
|
||||
- 📚 [Docs & Guides](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme)
|
||||
- 🐦 [X / Twitter](https://x.com/LoreLabs_)
|
||||
- ⭐ [Star on GitHub](https://github.com/HugoBlox/kit)
|
||||
- **Need Help?** Join the [Discord Server](https://discord.gg/z8wNYzb) or search the [Documentation](https://docs.hugoblox.com/).
|
||||
- **Found a Bug?** Open an [Issue](https://github.com/HugoBlox/kit/issues).
|
||||
- **Want to Contribute?** Read our [Contributing Guide](./CONTRIBUTING.md).
|
||||
|
||||
### Sponsors
|
||||
Help us keep open-source sustainable.
|
||||
|
||||
[**❤️ Sponsor on GitHub**](https://github.com/sponsors/gcushen) | [**🏢 Become a Partner**](https://github.com/sponsors/gcushen)
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
MIT © 2016–Present [George Cushen](https://georgecushen.com/?utm_source=github&utm_medium=hbb-readme) — [License Details](./LICENSE.md)
|
||||
Copyright © 2016-Present [**Lore Labs**](https://lore.tech/?utm_source=github&utm_medium=readme).
|
||||
Released under the [MIT License](./LICENSE.md).
|
||||
|
||||
<p align="center">
|
||||
<sub>No tracking. No lock-in. Your content stays yours.</sub>
|
||||
<sub>Lore™ is a trademark of Lore Labs.</sub>
|
||||
</p>
|
||||
+3
-2
@@ -150,8 +150,9 @@ npx hugoblox create
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT © 2016–Present [George Cushen](https://georgecushen.com/?utm_source=github&utm_medium=hbb-readme) — [License 详情](./LICENSE.md)
|
||||
Copyright © 2016-Present [**Lore Labs**](https://lore.tech/?utm_source=github&utm_medium=readme).
|
||||
Released under the [MIT License](./LICENSE.md).
|
||||
|
||||
<p align="center">
|
||||
<sub>无追踪。无锁定。您的内容始终属于您。</sub>
|
||||
<sub>Lore™ is a trademark of Lore Labs.</sub>
|
||||
</p>
|
||||
@@ -1,232 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/collection.json",
|
||||
"title": "Collection",
|
||||
"description": "Displays filtered and sorted collections of pages",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "collection",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"description": "Content configuration for the collection block",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Section title (supports Markdown)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Section description (supports Markdown)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"count": {
|
||||
"type": "integer",
|
||||
"description": "Maximum number of items to display (0 means unlimited)",
|
||||
"minimum": 0,
|
||||
"default": 5
|
||||
},
|
||||
"offset": {
|
||||
"type": "integer",
|
||||
"description": "Number of items to skip from the start of the query",
|
||||
"minimum": 0,
|
||||
"default": 0
|
||||
},
|
||||
"page_type": {
|
||||
"type": "string",
|
||||
"description": "Filter by page type/section (e.g., 'post', 'publication')"
|
||||
},
|
||||
"sort_by": {
|
||||
"type": "string",
|
||||
"description": "Field to sort by",
|
||||
"enum": ["Date", "date", "Title", "title", "Weight", "weight", "Lastmod", "lastmod", "PublishDate", "publishdate"],
|
||||
"default": "Date"
|
||||
},
|
||||
"sort_ascending": {
|
||||
"type": "boolean",
|
||||
"description": "Sort in ascending order",
|
||||
"default": false
|
||||
},
|
||||
"order": {
|
||||
"type": "string",
|
||||
"enum": ["asc", "desc"],
|
||||
"description": "Sort order (alternative to sort_ascending)"
|
||||
},
|
||||
"filters": {
|
||||
"type": "object",
|
||||
"description": "Content filtering options",
|
||||
"properties": {
|
||||
"kinds": {
|
||||
"type": "array",
|
||||
"description": "Limit to Hugo page kinds",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"default": ["page"]
|
||||
},
|
||||
"folders": {
|
||||
"type": "array",
|
||||
"description": "Filter by content folders/sections",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"tags": {
|
||||
"type": "array",
|
||||
"description": "Filter by multiple tags (intersection)",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"tag": {
|
||||
"type": "string",
|
||||
"description": "Filter by a single tag"
|
||||
},
|
||||
"category": {
|
||||
"type": "string",
|
||||
"description": "Filter by category"
|
||||
},
|
||||
"publication_type": {
|
||||
"type": "string",
|
||||
"description": "Filter by publication type"
|
||||
},
|
||||
"exclude_publication_type": {
|
||||
"type": "string",
|
||||
"description": "Exclude specific publication type"
|
||||
},
|
||||
"author": {
|
||||
"type": "string",
|
||||
"description": "Filter by author"
|
||||
},
|
||||
"featured_only": {
|
||||
"type": "boolean",
|
||||
"description": "Show only featured content",
|
||||
"default": false
|
||||
},
|
||||
"exclude_featured": {
|
||||
"type": "boolean",
|
||||
"description": "Exclude featured content",
|
||||
"default": false
|
||||
},
|
||||
"exclude_past": {
|
||||
"type": "boolean",
|
||||
"description": "Exclude past-dated content",
|
||||
"default": false
|
||||
},
|
||||
"exclude_future": {
|
||||
"type": "boolean",
|
||||
"description": "Exclude future-dated content",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"archive": {
|
||||
"type": "object",
|
||||
"description": "Archive link configuration",
|
||||
"properties": {
|
||||
"enable": {
|
||||
"type": "boolean",
|
||||
"description": "Show archive link even when item count is below limit"
|
||||
},
|
||||
"link": {
|
||||
"type": "string",
|
||||
"description": "Override archive URL (defaults to derived archive page)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Override archive link text",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Layout options for collection rendering",
|
||||
"properties": {
|
||||
"view": {
|
||||
"type": "string",
|
||||
"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"
|
||||
},
|
||||
"columns": {
|
||||
"type": "integer",
|
||||
"description": "Number of columns when using grid-based views (1-4)",
|
||||
"minimum": 1,
|
||||
"maximum": 4,
|
||||
"default": 2
|
||||
},
|
||||
"fill_image": {
|
||||
"type": "boolean",
|
||||
"description": "Fill cards with cover images when available",
|
||||
"default": true
|
||||
},
|
||||
"show_date": {
|
||||
"type": "boolean",
|
||||
"description": "Display published/modified date when available",
|
||||
"default": true
|
||||
},
|
||||
"show_read_time": {
|
||||
"type": "boolean",
|
||||
"description": "Display estimated reading time when available",
|
||||
"default": true
|
||||
},
|
||||
"show_read_more": {
|
||||
"type": "boolean",
|
||||
"description": "Show a read more link on cards",
|
||||
"default": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "collection",
|
||||
"content": {
|
||||
"title": "Latest research notes",
|
||||
"text": "Fresh from the lab notebook.",
|
||||
"count": 6,
|
||||
"page_type": "post",
|
||||
"sort_by": "Date",
|
||||
"sort_ascending": false,
|
||||
"filters": {
|
||||
"folders": ["post"],
|
||||
"tags": ["alignment", "evaluations"],
|
||||
"featured_only": true
|
||||
},
|
||||
"archive": {
|
||||
"enable": true,
|
||||
"text": "All posts",
|
||||
"link": "/post/"
|
||||
}
|
||||
},
|
||||
"design": {
|
||||
"view": "card",
|
||||
"columns": 3,
|
||||
"fill_image": true,
|
||||
"show_date": true,
|
||||
"show_read_time": true,
|
||||
"show_read_more": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,250 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/contact-info.json",
|
||||
"title": "Contact Info",
|
||||
"description": "Displays lab contact details, map, social links, and an optional form",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "contact-info",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"description": "Content configuration for the contact info block",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Main section title",
|
||||
"default": "Contact Us"
|
||||
},
|
||||
"subtitle": {
|
||||
"type": "string",
|
||||
"description": "Section subtitle"
|
||||
},
|
||||
"username": {
|
||||
"type": "string",
|
||||
"description": "Author username to pull fallback contact details from",
|
||||
"default": "me"
|
||||
},
|
||||
"visit_title": {
|
||||
"type": "string",
|
||||
"description": "Title for the visit section",
|
||||
"default": "Visit Us"
|
||||
},
|
||||
"connect_title": {
|
||||
"type": "string",
|
||||
"description": "Title for the connect section",
|
||||
"default": "Connect"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Connect section intro text"
|
||||
},
|
||||
"address": {
|
||||
"description": "Physical address information",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string",
|
||||
"description": "Single-line address"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"lines": {
|
||||
"description": "Address lines",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"office_hours": {
|
||||
"description": "Office hours information",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
},
|
||||
"email": {
|
||||
"type": "string",
|
||||
"description": "Contact email address",
|
||||
"format": "email"
|
||||
},
|
||||
"phone": {
|
||||
"type": "string",
|
||||
"description": "Contact phone number"
|
||||
},
|
||||
"social": {
|
||||
"description": "Social media links",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string",
|
||||
"description": "Single social link"
|
||||
},
|
||||
{
|
||||
"type": "array",
|
||||
"items": {
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Icon name (e.g., 'brands/x', 'brands/linkedin')"
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Social media URL"
|
||||
},
|
||||
"link": {
|
||||
"type": "string",
|
||||
"description": "Alias for url"
|
||||
},
|
||||
"label": {
|
||||
"type": "string",
|
||||
"description": "Tooltip label"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Label alias"
|
||||
}
|
||||
},
|
||||
"anyOf": [
|
||||
{
|
||||
"required": ["url"]
|
||||
},
|
||||
{
|
||||
"required": ["link"]
|
||||
}
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"prospective": {
|
||||
"type": "object",
|
||||
"description": "Information for prospective members",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"default": "Prospective Members"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Short note for new collaborators or recruits",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"button": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"url": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": ["text", "url"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"map_url": {
|
||||
"type": "string",
|
||||
"description": "URL to external map service"
|
||||
},
|
||||
"map_embed": {
|
||||
"type": "string",
|
||||
"description": "HTML embed code for map (e.g., Google Maps iframe)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"show_form": {
|
||||
"type": "boolean",
|
||||
"description": "Show a basic contact form",
|
||||
"default": false
|
||||
},
|
||||
"form_action": {
|
||||
"type": "string",
|
||||
"description": "Form submission URL"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "contact-info",
|
||||
"content": {
|
||||
"title": "Contact the lab",
|
||||
"subtitle": "We respond within 2 business days.",
|
||||
"visit_title": "Visit us",
|
||||
"address": {
|
||||
"lines": ["AI Lab, Engineering Building", "123 Innovation Way", "Cambridge, MA"]
|
||||
},
|
||||
"office_hours": ["Mon\u2013Thu: 10:00\u201316:00", "Fri: Remote"],
|
||||
"map_url": "https://maps.google.com/?q=Cambridge",
|
||||
"email": "hello@hugoblox.com",
|
||||
"phone": "+1 415 000 0000",
|
||||
"social": [
|
||||
{
|
||||
"icon": "brands/linkedin",
|
||||
"url": "https://linkedin.com/company/hugoblox"
|
||||
},
|
||||
{
|
||||
"icon": "brands/x",
|
||||
"url": "https://x.com/hugoblox"
|
||||
}
|
||||
],
|
||||
"prospective": {
|
||||
"title": "Prospective members",
|
||||
"text": "Tell us about your research interests and links to prior work.",
|
||||
"button": {
|
||||
"text": "Apply",
|
||||
"url": "/apply"
|
||||
}
|
||||
},
|
||||
"show_form": true,
|
||||
"form_action": "https://formspree.io/f/example"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,107 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/cta-button-list.json",
|
||||
"title": "CTA Button List",
|
||||
"description": "Renders stacked buttons with icons",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "cta-button-list",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"buttons": {
|
||||
"type": "array",
|
||||
"description": "Buttons to render",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Button label (supports Markdown)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"label": {
|
||||
"type": "string",
|
||||
"description": "Alias for text"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Alias for text"
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Button URL"
|
||||
},
|
||||
"link": {
|
||||
"type": "string",
|
||||
"description": "Alias for url"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Optional leading icon (icon pack format: pack/icon-name)"
|
||||
},
|
||||
"new_tab": {
|
||||
"type": "boolean",
|
||||
"description": "Open link in a new tab (auto-detected for external URLs and PDFs)",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"anyOf": [
|
||||
{
|
||||
"required": ["text"]
|
||||
},
|
||||
{
|
||||
"required": ["label"]
|
||||
},
|
||||
{
|
||||
"required": ["name"]
|
||||
},
|
||||
{
|
||||
"required": ["url"]
|
||||
},
|
||||
{
|
||||
"required": ["link"]
|
||||
}
|
||||
],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"minItems": 1
|
||||
}
|
||||
},
|
||||
"required": ["buttons"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "cta-button-list",
|
||||
"content": {
|
||||
"buttons": [
|
||||
{
|
||||
"text": "Join the waitlist",
|
||||
"url": "https://hugoblox.com/waitlist",
|
||||
"icon": "hero/sparkles"
|
||||
},
|
||||
{
|
||||
"text": "Read the docs",
|
||||
"url": "/docs/",
|
||||
"icon": "hero/book-open"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,130 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/cta-card.json",
|
||||
"title": "CTA Card",
|
||||
"description": "Displays a prominent call-to-action card with title, text, and button",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "cta-card",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"description": "Content configuration for the CTA card block",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Card title (supports Markdown)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Card description text (supports Markdown)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"button": {
|
||||
"type": "object",
|
||||
"description": "Call-to-action button",
|
||||
"properties": {
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Button URL (supports hash fragments, relative paths, and absolute URLs)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Button text",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Optional button icon (icon pack format: pack/icon-name)"
|
||||
},
|
||||
"new_tab": {
|
||||
"type": "boolean",
|
||||
"description": "Open the button link in a new tab",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"required": ["url", "text"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["title", "text", "button"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Card-specific styling options",
|
||||
"properties": {
|
||||
"card": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"css_class": {
|
||||
"type": "string",
|
||||
"description": "CSS classes to apply to the card (e.g., glassmorphism-primary, glass-ring)"
|
||||
},
|
||||
"css_style": {
|
||||
"type": "string",
|
||||
"description": "Inline CSS for the card container"
|
||||
},
|
||||
"text_color": {
|
||||
"type": "string",
|
||||
"enum": ["auto", "light", "dark"],
|
||||
"description": "Text color mode for optimal contrast (auto detects based on background)",
|
||||
"default": "auto"
|
||||
},
|
||||
"overlay_opacity": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"maximum": 1,
|
||||
"description": "Glassmorphism overlay opacity for fine-tuning contrast",
|
||||
"default": 0.15
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "cta-card",
|
||||
"design": {
|
||||
"background": {
|
||||
"gradient": {
|
||||
"start": "primary-500",
|
||||
"end": "secondary-600",
|
||||
"direction": "135"
|
||||
},
|
||||
"text_color_light": true
|
||||
},
|
||||
"card": {
|
||||
"css_class": "glassmorphism-primary",
|
||||
"text_color": "auto",
|
||||
"overlay_opacity": 0.15
|
||||
}
|
||||
},
|
||||
"content": {
|
||||
"title": "Ready to launch?",
|
||||
"text": "Ship a Hugo Blox site with production-ready Tailwind 4 in minutes.",
|
||||
"button": {
|
||||
"url": "/contact/",
|
||||
"text": "Talk to us",
|
||||
"icon": "hero/arrow-right"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,109 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/cta-image-paragraph.json",
|
||||
"title": "CTA Image Paragraph",
|
||||
"description": "Alternating media and copy with optional feature bullets and button",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "cta-image-paragraph",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"type": "array",
|
||||
"description": "CTA sections with media and supporting copy",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Heading for the CTA item"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"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"]
|
||||
},
|
||||
"feature_icon": {
|
||||
"type": "string",
|
||||
"description": "Icon used before each feature bullet",
|
||||
"default": "check"
|
||||
},
|
||||
"features": {
|
||||
"type": "array",
|
||||
"description": "Bullet list shown under the paragraph",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"button": {
|
||||
"type": "object",
|
||||
"description": "Optional CTA button",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"url": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": ["text", "url"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["title", "text", "image"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"minItems": 1
|
||||
}
|
||||
},
|
||||
"required": ["items"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "cta-image-paragraph",
|
||||
"content": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Ship polished docs with Hugo Blox",
|
||||
"text": "Pair Markdown content with responsive imagery and reusable CTAs.",
|
||||
"image": "screenshots/docs.png",
|
||||
"feature_icon": "hero/check-circle",
|
||||
"features": ["Responsive images generated automatically", "Markdown-first authoring", "Works with Netlify, Vercel, and GitHub Pages"],
|
||||
"button": {
|
||||
"text": "Read the guide",
|
||||
"url": "/docs/get-started/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": "Launch production-ready marketing pages",
|
||||
"text": "Use alternating layouts to highlight product benefits.",
|
||||
"image": "screenshots/marketing.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,233 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/dev-hero.json",
|
||||
"title": "Dev Hero",
|
||||
"description": "A developer-focused hero section with gradient effects",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "dev-hero",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"description": "Content configuration for the dev hero block",
|
||||
"properties": {
|
||||
"username": {
|
||||
"type": "string",
|
||||
"description": "Author username to pull data from (matches folder name in /authors/)",
|
||||
"default": "me",
|
||||
"examples": ["me", "admin"]
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Override name/title (falls back to author title)"
|
||||
},
|
||||
"tagline": {
|
||||
"type": "string",
|
||||
"description": "Override role/tagline (falls back to author role)"
|
||||
},
|
||||
"bio": {
|
||||
"type": "string",
|
||||
"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"]
|
||||
},
|
||||
"name_prefix": {
|
||||
"type": "string",
|
||||
"description": "Prefix before the name (styled differently)",
|
||||
"examples": ["I'm", "Hey, I'm"]
|
||||
},
|
||||
"show_status": {
|
||||
"type": "boolean",
|
||||
"description": "Show status emoji badge on avatar (uses author's status.icon from profile)",
|
||||
"default": false
|
||||
},
|
||||
"show_scroll_indicator": {
|
||||
"type": "boolean",
|
||||
"description": "Show scroll down indicator at bottom",
|
||||
"default": false
|
||||
},
|
||||
"scroll_target": {
|
||||
"type": "string",
|
||||
"description": "CSS selector for scroll indicator target",
|
||||
"default": "#projects",
|
||||
"examples": ["#projects", "#about", "#contact"]
|
||||
},
|
||||
"links": {
|
||||
"type": "array",
|
||||
"description": "Override social links (falls back to author links)",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Icon identifier",
|
||||
"examples": ["brands/github", "brands/linkedin", "brands/x", "at-symbol"]
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Link URL"
|
||||
},
|
||||
"label": {
|
||||
"type": "string",
|
||||
"description": "Link label/title"
|
||||
}
|
||||
},
|
||||
"required": ["icon", "url"]
|
||||
}
|
||||
},
|
||||
"cta_buttons": {
|
||||
"type": "array",
|
||||
"description": "Call-to-action buttons",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Button text",
|
||||
"examples": ["View My Work", "Download Resume", "Contact Me"]
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Button URL",
|
||||
"examples": ["#projects", "/resume.pdf", "#contact"]
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Button icon (optional)",
|
||||
"examples": ["arrow-down", "document-arrow-down", "envelope"]
|
||||
}
|
||||
},
|
||||
"required": ["text", "url"]
|
||||
},
|
||||
"examples": [
|
||||
[
|
||||
{
|
||||
"text": "View My Work",
|
||||
"url": "#projects",
|
||||
"icon": "arrow-down"
|
||||
},
|
||||
{
|
||||
"text": "Download Resume",
|
||||
"url": "/resume.pdf",
|
||||
"icon": "document-arrow-down"
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"typewriter": {
|
||||
"type": "object",
|
||||
"description": "Typewriter animation for cycling through roles/taglines",
|
||||
"properties": {
|
||||
"enable": {
|
||||
"type": "boolean",
|
||||
"description": "Enable typewriter effect",
|
||||
"default": false
|
||||
},
|
||||
"strings": {
|
||||
"type": "array",
|
||||
"description": "Array of strings to cycle through",
|
||||
"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"]
|
||||
},
|
||||
"type_speed": {
|
||||
"type": "integer",
|
||||
"description": "Typing speed in milliseconds per character",
|
||||
"default": 80
|
||||
},
|
||||
"delete_speed": {
|
||||
"type": "integer",
|
||||
"description": "Delete speed in milliseconds per character",
|
||||
"default": 50
|
||||
},
|
||||
"pause_time": {
|
||||
"type": "integer",
|
||||
"description": "Pause time in milliseconds before deleting",
|
||||
"default": 2000
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Layout options for dev hero rendering",
|
||||
"properties": {
|
||||
"style": {
|
||||
"type": "string",
|
||||
"description": "Layout style",
|
||||
"enum": ["centered", "split"],
|
||||
"default": "centered"
|
||||
},
|
||||
"avatar_shape": {
|
||||
"type": "string",
|
||||
"description": "Avatar shape",
|
||||
"enum": ["circle", "rounded"],
|
||||
"default": "circle"
|
||||
},
|
||||
"animations": {
|
||||
"type": "boolean",
|
||||
"description": "Enable scroll and typewriter animations",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "dev-hero",
|
||||
"id": "hero",
|
||||
"content": {
|
||||
"username": "me",
|
||||
"greeting": "Hi, I'm",
|
||||
"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"
|
||||
}
|
||||
]
|
||||
},
|
||||
"design": {
|
||||
"style": "centered",
|
||||
"avatar_shape": "circle",
|
||||
"background": {
|
||||
"color": {
|
||||
"dark": "#0a0a0f"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,183 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/faq.json",
|
||||
"title": "FAQ",
|
||||
"description": "Display frequently asked questions in an accordion format with optional CTA",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "faq",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Block title"
|
||||
},
|
||||
"subtitle": {
|
||||
"type": "string",
|
||||
"description": "Block subtitle"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Introductory text (Markdown supported)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"items": {
|
||||
"type": "array",
|
||||
"description": "FAQ items",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"question": {
|
||||
"type": "string",
|
||||
"description": "The question"
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Alias for question"
|
||||
},
|
||||
"answer": {
|
||||
"type": "string",
|
||||
"description": "The answer (Markdown supported)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Alias for answer",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
}
|
||||
},
|
||||
"anyOf": [
|
||||
{
|
||||
"required": ["question", "answer"]
|
||||
},
|
||||
{
|
||||
"required": ["title", "text"]
|
||||
},
|
||||
{
|
||||
"required": ["question", "text"]
|
||||
},
|
||||
{
|
||||
"required": ["title", "answer"]
|
||||
}
|
||||
],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"minItems": 1
|
||||
},
|
||||
"button": {
|
||||
"type": "object",
|
||||
"description": "Call-to-action button",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Button text",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Button URL"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Button icon name"
|
||||
}
|
||||
},
|
||||
"required": ["text", "url"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["items"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Spacing overrides for the FAQ section",
|
||||
"properties": {
|
||||
"spacing": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"padding": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"minItems": 4,
|
||||
"maxItems": 4,
|
||||
"description": "Padding [top, right, bottom, left]",
|
||||
"default": ["20px", "0", "20px", "0"]
|
||||
},
|
||||
"padding_sm": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"minItems": 2,
|
||||
"maxItems": 2,
|
||||
"description": "Responsive padding for smaller screens [top, bottom]",
|
||||
"default": ["3rem", "0"]
|
||||
},
|
||||
"margin": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"minItems": 4,
|
||||
"maxItems": 4,
|
||||
"description": "Margin [top, right, bottom, left]",
|
||||
"default": ["0", "0", "0", "0"]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "faq",
|
||||
"content": {
|
||||
"title": "Frequently asked questions",
|
||||
"subtitle": "Fast answers for new users",
|
||||
"text": "If you do not see your question, open an issue or reach out.",
|
||||
"items": [
|
||||
{
|
||||
"question": "How do I enable Pagefind?",
|
||||
"answer": "Add `pagefind = true` to your config and run `pnpm build`."
|
||||
},
|
||||
{
|
||||
"question": "Can I customize Tailwind tokens?",
|
||||
"answer": "Yes. Edit the design tokens in `modules/blox-tailwind/assets/` and run `pnpm format`."
|
||||
}
|
||||
],
|
||||
"button": {
|
||||
"text": "View full knowledge base",
|
||||
"url": "/faq/",
|
||||
"icon": "hero/arrow-right"
|
||||
}
|
||||
},
|
||||
"design": {
|
||||
"spacing": {
|
||||
"padding": ["2.5rem", "0", "2.5rem", "0"]
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/features.json",
|
||||
"title": "Features",
|
||||
"description": "Displays a grid of features with icons, names, and descriptions",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "features",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"description": "Content configuration for the features block",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Section title (supports Markdown)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Section description (supports Markdown)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"items": {
|
||||
"type": "array",
|
||||
"description": "Array of feature items",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Feature name/title (supports Markdown)"
|
||||
},
|
||||
"description": {
|
||||
"type": "string",
|
||||
"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"]
|
||||
}
|
||||
},
|
||||
"required": ["name", "description"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"minItems": 1
|
||||
}
|
||||
},
|
||||
"required": ["items"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "features",
|
||||
"content": {
|
||||
"title": "Everything you need",
|
||||
"text": "From data to deployment, one stack.",
|
||||
"items": [
|
||||
{
|
||||
"name": "Tailwind 4",
|
||||
"description": "Pre-configured tokens, gradients, and typography.",
|
||||
"icon": "hero/swatch"
|
||||
},
|
||||
{
|
||||
"name": "Preact blocks",
|
||||
"description": "Composable UI shipped with sensible defaults.",
|
||||
"icon": "hero/puzzle-piece"
|
||||
},
|
||||
{
|
||||
"name": "Docs-ready",
|
||||
"description": "Markdown, data-driven content, and inline shortcodes.",
|
||||
"icon": "hero/book-open"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,159 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/hero.json",
|
||||
"title": "Hero",
|
||||
"description": "Displays prominent hero sections with titles, text, and calls-to-action",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "hero",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"description": "Content configuration for the hero block",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Main hero title (supports Markdown)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Hero description text (supports Markdown)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"announcement": {
|
||||
"type": "object",
|
||||
"description": "Optional announcement banner above the title",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Announcement text (supports Markdown)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"link": {
|
||||
"type": "object",
|
||||
"description": "Optional announcement link",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Link text",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Link URL or page anchor"
|
||||
}
|
||||
},
|
||||
"required": ["text", "url"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["text"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"primary_action": {
|
||||
"type": "object",
|
||||
"description": "Primary call-to-action button",
|
||||
"properties": {
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Button URL or hash anchor"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"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"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"secondary_action": {
|
||||
"type": "object",
|
||||
"description": "Secondary call-to-action link",
|
||||
"properties": {
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Link URL or page anchor"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Link text (supports Markdown)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
}
|
||||
},
|
||||
"required": ["url", "text"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Hero-specific design tweaks",
|
||||
"properties": {
|
||||
"no_padding": {
|
||||
"type": "boolean",
|
||||
"description": "Disable default vertical padding (py-32 sm:py-48 lg:py-56) applied by the hero layout",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "hero",
|
||||
"id": "intro",
|
||||
"design": {
|
||||
"no_padding": false,
|
||||
"background": {
|
||||
"gradient": {
|
||||
"start": "primary-500",
|
||||
"end": "secondary-500"
|
||||
},
|
||||
"text_color_light": true
|
||||
}
|
||||
},
|
||||
"content": {
|
||||
"announcement": {
|
||||
"text": "Latest preprint is live",
|
||||
"link": {
|
||||
"text": "Read the paper",
|
||||
"url": "/publications/rlhf-foundations"
|
||||
}
|
||||
},
|
||||
"title": "Building aligned AI together",
|
||||
"text": "Human-centred research, transparent tooling, and production-ready stacks.",
|
||||
"primary_action": {
|
||||
"text": "Start a project",
|
||||
"url": "#contact",
|
||||
"icon": "hero/arrow-right"
|
||||
},
|
||||
"secondary_action": {
|
||||
"text": "View portfolio",
|
||||
"url": "/projects/"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,139 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/knowledge-categories.json",
|
||||
"title": "Knowledge Categories",
|
||||
"description": "Lists taxonomy categories with counts and links",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "knowledge-categories",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string"
|
||||
},
|
||||
"subtitle": {
|
||||
"type": "string"
|
||||
},
|
||||
"categories": {
|
||||
"type": "array",
|
||||
"description": "Categories to render; uses real taxonomy counts when available",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"category": {
|
||||
"type": "string",
|
||||
"description": "Taxonomy category name used for lookup (defaults to `title` when omitted)"
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Display label for the category card"
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
},
|
||||
"icon": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Icon name (e.g., 'hero/book-open')"
|
||||
},
|
||||
"bg_color": {
|
||||
"type": "string",
|
||||
"description": "Background utility classes for the icon wrapper",
|
||||
"default": "bg-primary-100 dark:bg-primary-900/50"
|
||||
},
|
||||
"text_color": {
|
||||
"type": "string",
|
||||
"description": "Text color classes for the icon",
|
||||
"default": "text-primary-600 dark:text-primary-400"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"count": {
|
||||
"type": "integer",
|
||||
"description": "Optional override for item count (otherwise uses taxonomy count)",
|
||||
"minimum": 0
|
||||
},
|
||||
"link": {
|
||||
"type": "string",
|
||||
"description": "Override the category URL (defaults to taxonomy page)"
|
||||
}
|
||||
},
|
||||
"anyOf": [
|
||||
{
|
||||
"required": ["category"]
|
||||
},
|
||||
{
|
||||
"required": ["title"]
|
||||
}
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"view_all": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"link": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": ["text", "link"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["categories"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "knowledge-categories",
|
||||
"content": {
|
||||
"title": "Browse the knowledge base",
|
||||
"subtitle": "Jump into the most active categories.",
|
||||
"categories": [
|
||||
{
|
||||
"category": "research",
|
||||
"title": "Research",
|
||||
"description": "Lab notes, experiment trackers, and preprint workflows.",
|
||||
"icon": {
|
||||
"name": "hero/beaker",
|
||||
"bg_color": "bg-primary-100 dark:bg-primary-900/50",
|
||||
"text_color": "text-primary-600 dark:text-primary-400"
|
||||
}
|
||||
},
|
||||
{
|
||||
"category": "tutorials",
|
||||
"title": "Tutorials",
|
||||
"description": "Hands-on guides for Hugo Blox.",
|
||||
"count": 18
|
||||
}
|
||||
],
|
||||
"view_all": {
|
||||
"text": "See all categories",
|
||||
"link": "/categories/"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,144 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/logos.json",
|
||||
"title": "Logos",
|
||||
"description": "Showcases partner/customer logos in grid, carousel, or marquee layouts",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "logos",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string"
|
||||
},
|
||||
"subtitle": {
|
||||
"type": "string"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"logos": {
|
||||
"type": "array",
|
||||
"description": "Explicit list of logos to render",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Partner/customer name (used for alt text)"
|
||||
},
|
||||
"image": {
|
||||
"type": "string",
|
||||
"description": "Logo image filename in assets/media/"
|
||||
},
|
||||
"description": {
|
||||
"type": "string",
|
||||
"description": "Tooltip/hover description"
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Optional link URL"
|
||||
},
|
||||
"external": {
|
||||
"type": "boolean",
|
||||
"description": "Open URL in a new tab",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"required": ["image"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"logo_folder": {
|
||||
"type": "string",
|
||||
"description": "Folder in assets/media/ containing logo images (used when `logos` is not provided)"
|
||||
},
|
||||
"cta": {
|
||||
"type": "object",
|
||||
"description": "Optional call-to-action button beneath the logos",
|
||||
"properties": {
|
||||
"url": {
|
||||
"type": "string"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": ["url", "text"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Display options for the logos block",
|
||||
"properties": {
|
||||
"display_mode": {
|
||||
"type": "string",
|
||||
"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"
|
||||
},
|
||||
"show_pattern": {
|
||||
"type": "boolean",
|
||||
"description": "Render a faint gradient pattern behind the section",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "logos",
|
||||
"design": {
|
||||
"display_mode": "grid",
|
||||
"show_pattern": true
|
||||
},
|
||||
"content": {
|
||||
"title": "Trusted by leading labs",
|
||||
"subtitle": "Partners + collaborators",
|
||||
"text": "Teams building safety-first AI with us.",
|
||||
"logos": [
|
||||
{
|
||||
"name": "DeepMind",
|
||||
"image": "logos/deepmind.svg",
|
||||
"url": "https://deepmind.com",
|
||||
"external": true
|
||||
},
|
||||
{
|
||||
"name": "OpenAI",
|
||||
"image": "logos/openai.png",
|
||||
"description": "Alignment research partner"
|
||||
}
|
||||
],
|
||||
"cta": {
|
||||
"text": "See case studies",
|
||||
"url": "/case-studies/",
|
||||
"icon": "hero/arrow-right"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/markdown.json",
|
||||
"title": "Markdown",
|
||||
"description": "Renders arbitrary Markdown content with an optional heading",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "markdown",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Section heading (supports Markdown)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Markdown body content",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
}
|
||||
},
|
||||
"required": ["text"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "markdown",
|
||||
"content": {
|
||||
"title": "Why Hugo Blox?",
|
||||
"text": "Hugo Blox ships **Preact blocks**, Tailwind 4, and fast Hugo rendering. Mix Markdown, data-driven content, and components without build grief."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,210 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/portfolio.json",
|
||||
"title": "Portfolio",
|
||||
"description": "Displays filterable project cards with Alpine.js",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "portfolio",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"description": "Content configuration for the portfolio block",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Section title (supports Markdown)",
|
||||
"examples": ["Featured Projects"]
|
||||
},
|
||||
"subtitle": {
|
||||
"type": "string",
|
||||
"description": "Section subtitle (supports Markdown)",
|
||||
"examples": ["Things I've built"]
|
||||
},
|
||||
"count": {
|
||||
"type": "integer",
|
||||
"description": "Maximum number of projects to display when no filter buttons are used (0 means unlimited)",
|
||||
"minimum": 0,
|
||||
"default": 6
|
||||
},
|
||||
"sort_by": {
|
||||
"type": "string",
|
||||
"description": "Field to sort by",
|
||||
"enum": ["Date", "date", "Title", "title", "Weight", "weight", "Lastmod", "lastmod"],
|
||||
"default": "Date"
|
||||
},
|
||||
"sort_ascending": {
|
||||
"type": "boolean",
|
||||
"description": "Sort in ascending order",
|
||||
"default": false
|
||||
},
|
||||
"filters": {
|
||||
"type": "object",
|
||||
"description": "Content filtering options",
|
||||
"properties": {
|
||||
"folders": {
|
||||
"type": "array",
|
||||
"description": "Content folders to query projects from",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"default": ["projects"],
|
||||
"examples": [["projects", "software"]]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"buttons": {
|
||||
"type": "array",
|
||||
"description": "Filter buttons configuration",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Button display text",
|
||||
"examples": ["All", "Frontend", "Backend"]
|
||||
},
|
||||
"tag": {
|
||||
"type": "string",
|
||||
"description": "Tag to filter by (* for all)",
|
||||
"examples": ["*", "Frontend", "Full-Stack"]
|
||||
}
|
||||
},
|
||||
"required": ["name", "tag"]
|
||||
},
|
||||
"default": [
|
||||
{
|
||||
"name": "All",
|
||||
"tag": "*"
|
||||
}
|
||||
],
|
||||
"examples": [
|
||||
[
|
||||
{
|
||||
"name": "All",
|
||||
"tag": "*"
|
||||
},
|
||||
{
|
||||
"name": "Full-Stack",
|
||||
"tag": "Full-Stack"
|
||||
},
|
||||
{
|
||||
"name": "Frontend",
|
||||
"tag": "Frontend"
|
||||
},
|
||||
{
|
||||
"name": "Backend",
|
||||
"tag": "Backend"
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"default_button_index": {
|
||||
"type": "integer",
|
||||
"description": "Index of the default active filter button",
|
||||
"minimum": 0,
|
||||
"default": 0
|
||||
},
|
||||
"archive": {
|
||||
"type": "object",
|
||||
"description": "Archive link configuration",
|
||||
"properties": {
|
||||
"enable": {
|
||||
"type": "boolean",
|
||||
"description": "Show 'View All' link (defaults to true if more projects exist than displayed, set to false to explicitly hide)"
|
||||
},
|
||||
"link": {
|
||||
"type": "string",
|
||||
"description": "Override archive URL (defaults to the first folder in filters.folders)",
|
||||
"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"]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Layout options for portfolio rendering",
|
||||
"properties": {
|
||||
"columns": {
|
||||
"type": "integer",
|
||||
"description": "Number of columns (2, 3, or 4)",
|
||||
"default": 3,
|
||||
"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"]
|
||||
},
|
||||
"animations": {
|
||||
"type": "boolean",
|
||||
"description": "Enable staggered reveal and filter animations",
|
||||
"default": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "portfolio",
|
||||
"id": "projects",
|
||||
"content": {
|
||||
"title": "Featured Projects",
|
||||
"subtitle": "A selection of my recent work",
|
||||
"count": 6,
|
||||
"filters": {
|
||||
"folders": ["projects"]
|
||||
},
|
||||
"buttons": [
|
||||
{
|
||||
"name": "All",
|
||||
"tag": "*"
|
||||
},
|
||||
{
|
||||
"name": "Full-Stack",
|
||||
"tag": "Full-Stack"
|
||||
},
|
||||
{
|
||||
"name": "Frontend",
|
||||
"tag": "Frontend"
|
||||
},
|
||||
{
|
||||
"name": "Backend",
|
||||
"tag": "Backend"
|
||||
}
|
||||
],
|
||||
"default_button_index": 0,
|
||||
"archive": {
|
||||
"enable": true,
|
||||
"text": "View All Projects"
|
||||
}
|
||||
},
|
||||
"design": {
|
||||
"columns": 3
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,188 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/research-areas.json",
|
||||
"title": "Research Areas",
|
||||
"description": "Highlights thematic areas with optional stats and CTAs",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "research-areas",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string"
|
||||
},
|
||||
"subtitle": {
|
||||
"type": "string"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"items": {
|
||||
"type": "array",
|
||||
"description": "Research area cards",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Area title"
|
||||
},
|
||||
"description": {
|
||||
"type": "string",
|
||||
"description": "Short summary"
|
||||
},
|
||||
"gradient": {
|
||||
"type": "string",
|
||||
"description": "Tailwind gradient classes for the header",
|
||||
"examples": ["from-primary-400 to-secondary-400"]
|
||||
},
|
||||
"image": {
|
||||
"type": "string",
|
||||
"description": "Optional header image filename in assets/media/"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Optional icon displayed instead of an image"
|
||||
},
|
||||
"status": {
|
||||
"type": "string",
|
||||
"description": "Status badge (e.g., active, emerging, planning)"
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Optional external/internal link for the area title"
|
||||
},
|
||||
"topics": {
|
||||
"type": "array",
|
||||
"description": "Keywords or topics associated with the area",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"team_size": {
|
||||
"type": ["string", "number"],
|
||||
"description": "Team size metric displayed in the footer"
|
||||
},
|
||||
"publications": {
|
||||
"type": ["string", "number"],
|
||||
"description": "Publication count metric"
|
||||
},
|
||||
"funding": {
|
||||
"type": "string",
|
||||
"description": "Funding metric/label"
|
||||
},
|
||||
"cta": {
|
||||
"type": "object",
|
||||
"description": "Per-area call-to-action button",
|
||||
"properties": {
|
||||
"url": {
|
||||
"type": "string"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
}
|
||||
},
|
||||
"required": ["url", "text"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["name", "description"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"minItems": 1
|
||||
},
|
||||
"cta": {
|
||||
"type": "object",
|
||||
"description": "Global call-to-action beneath the grid",
|
||||
"properties": {
|
||||
"url": {
|
||||
"type": "string"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": ["url", "text"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["items"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Layout option for research areas",
|
||||
"properties": {
|
||||
"layout": {
|
||||
"type": "string",
|
||||
"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"
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "research-areas",
|
||||
"design": {
|
||||
"layout": "cards"
|
||||
},
|
||||
"content": {
|
||||
"title": "Research areas",
|
||||
"subtitle": "Where we invest time and curiosity",
|
||||
"text": "From alignment and evals to deployable agents.",
|
||||
"items": [
|
||||
{
|
||||
"name": "Alignment & Safety",
|
||||
"description": "Mechanistic interpretability, agent evaluations, and scalable oversight.",
|
||||
"gradient": "from-primary-400 to-secondary-400",
|
||||
"icon": "hero/shield-check",
|
||||
"status": "active",
|
||||
"topics": ["evals", "interpretability", "tooling"],
|
||||
"team_size": "6",
|
||||
"publications": "12",
|
||||
"funding": "$3.2M",
|
||||
"cta": {
|
||||
"text": "See roadmap",
|
||||
"url": "/research/alignment/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Multimodal systems",
|
||||
"description": "Unified stacks for text, image, and audio models.",
|
||||
"image": "research/multimodal.jpg",
|
||||
"status": "emerging"
|
||||
}
|
||||
],
|
||||
"cta": {
|
||||
"text": "All research areas",
|
||||
"url": "/research/"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/resume-awards.json",
|
||||
"title": "Resume Awards",
|
||||
"description": "Renders awards/certifications from the referenced author profile",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "resume-awards",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"description": "Content configuration for the awards block",
|
||||
"properties": {
|
||||
"username": {
|
||||
"type": "string",
|
||||
"description": "Author username (references data/authors/{username}.yaml)",
|
||||
"default": "me"
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Section title (supports Markdown)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Section description (supports Markdown)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Awards-specific display options",
|
||||
"properties": {
|
||||
"date_format": {
|
||||
"type": "string",
|
||||
"description": "Date format for award dates (Go time layout)",
|
||||
"default": "January 2006",
|
||||
"examples": ["2006", "Jan 2006", "January 2, 2006"]
|
||||
}
|
||||
},
|
||||
"additionalProperties": true,
|
||||
"$comment": "Award items in the author profile support: title, icon, url, awarder, date/date_start, summary, certificate_url."
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "resume-awards",
|
||||
"content": {
|
||||
"username": "me",
|
||||
"title": "Awards",
|
||||
"text": "Selected recognition and certifications."
|
||||
},
|
||||
"design": {
|
||||
"date_format": "January 2006"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,170 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/resume-biography-3.json",
|
||||
"title": "Resume Biography 3",
|
||||
"description": "Horizontal layout with banner, avatar, and profile details",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "resume-biography-3",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"username": {
|
||||
"type": "string",
|
||||
"description": "Author username (references data/authors/{username}.yaml)",
|
||||
"default": "me"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Biography text override (supports Markdown). Defaults to the author profile bio.",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"headings": {
|
||||
"type": "object",
|
||||
"description": "Optional custom headings for sections",
|
||||
"properties": {
|
||||
"about": {
|
||||
"type": "string",
|
||||
"description": "Heading for biography section (default: Professional Summary)"
|
||||
},
|
||||
"education": {
|
||||
"type": "string",
|
||||
"description": "Heading for education section (default: i18n 'education')"
|
||||
},
|
||||
"interests": {
|
||||
"type": "string",
|
||||
"description": "Heading for interests section (default: i18n 'interests')"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"button": {
|
||||
"type": "object",
|
||||
"description": "Optional call-to-action button",
|
||||
"properties": {
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Button URL"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Button text",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
}
|
||||
},
|
||||
"required": ["url", "text"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Presentation options for the biography layout",
|
||||
"properties": {
|
||||
"avatar": {
|
||||
"type": "object",
|
||||
"description": "Avatar styling options",
|
||||
"properties": {
|
||||
"size": {
|
||||
"type": "string",
|
||||
"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"],
|
||||
"description": "Avatar shape",
|
||||
"default": "circle"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"banner": {
|
||||
"type": "object",
|
||||
"description": "Optional banner image",
|
||||
"properties": {
|
||||
"filename": {
|
||||
"type": "string",
|
||||
"description": "Banner image filename (in assets/media/)"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"biography": {
|
||||
"type": "object",
|
||||
"description": "Biography text styling",
|
||||
"properties": {
|
||||
"style": {
|
||||
"type": "string",
|
||||
"description": "Custom CSS styles for biography text"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"name": {
|
||||
"type": "object",
|
||||
"description": "Profile name typography controls",
|
||||
"properties": {
|
||||
"size": {
|
||||
"type": "string",
|
||||
"enum": ["xs", "sm", "md", "lg", "xl"],
|
||||
"description": "Heading size for the profile name. Responsive sizing from xs (text-xl to text-3xl) up to xl (text-5xl to text-7xl).",
|
||||
"default": "lg"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "resume-biography-3",
|
||||
"content": {
|
||||
"username": "me",
|
||||
"text": "Research lead focused on alignment, evaluations, and safety tooling.",
|
||||
"headings": {
|
||||
"about": "Professional summary",
|
||||
"education": "Education",
|
||||
"interests": "Interests"
|
||||
},
|
||||
"button": {
|
||||
"url": "/cv.pdf",
|
||||
"text": "Download CV"
|
||||
}
|
||||
},
|
||||
"design": {
|
||||
"avatar": {
|
||||
"size": "large",
|
||||
"shape": "circle"
|
||||
},
|
||||
"name": {
|
||||
"size": "lg"
|
||||
},
|
||||
"banner": {
|
||||
"filename": "banners/research.jpg"
|
||||
},
|
||||
"biography": {
|
||||
"style": "max-width: 70ch;"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,126 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/resume-biography.json",
|
||||
"title": "Resume Biography",
|
||||
"description": "Renders author details with avatar, banner, bio, and social links",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "resume-biography",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"username": {
|
||||
"type": "string",
|
||||
"description": "Author username (references data/authors/{username}.yaml)",
|
||||
"default": "me"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Override biography text (Markdown); falls back to author profile bio when omitted",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"button": {
|
||||
"type": "object",
|
||||
"description": "Optional button beneath the bio",
|
||||
"properties": {
|
||||
"url": {
|
||||
"type": "string"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
}
|
||||
},
|
||||
"required": ["url", "text"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Presentation options for the biography",
|
||||
"properties": {
|
||||
"avatar": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"size": {
|
||||
"type": "string",
|
||||
"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"],
|
||||
"description": "Avatar shape",
|
||||
"default": "circle"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"banner": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"filename": {
|
||||
"type": "string",
|
||||
"description": "Optional banner image filename in assets/media/"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"biography": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"style": {
|
||||
"type": "string",
|
||||
"description": "Inline CSS style applied to the bio text wrapper",
|
||||
"examples": ["max-width: 60ch;"]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "resume-biography",
|
||||
"content": {
|
||||
"username": "me",
|
||||
"text": "I build AI research tooling and mentor applied ML teams.",
|
||||
"button": {
|
||||
"url": "/cv.pdf",
|
||||
"text": "Download CV"
|
||||
}
|
||||
},
|
||||
"design": {
|
||||
"avatar": {
|
||||
"size": "large",
|
||||
"shape": "circle"
|
||||
},
|
||||
"banner": {
|
||||
"filename": "banners/lab.jpg"
|
||||
},
|
||||
"biography": {
|
||||
"style": "max-width: 60ch;"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/resume-experience.json",
|
||||
"title": "Resume Experience",
|
||||
"description": "Renders work history and education timelines from an author profile",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "resume-experience",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"username": {
|
||||
"type": "string",
|
||||
"description": "Author username (references data/authors/{username}.yaml)",
|
||||
"default": "me"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Optional lead-in copy above the timelines",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Display options for experience and education timelines",
|
||||
"properties": {
|
||||
"date_format": {
|
||||
"type": "string",
|
||||
"description": "Date format for experience and education entries (Go time layout)",
|
||||
"default": "Jan 2006",
|
||||
"examples": ["Jan 2006", "January 2006", "2006"]
|
||||
},
|
||||
"is_education_first": {
|
||||
"type": "boolean",
|
||||
"description": "Show education timeline before experience",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"$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"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "resume-experience",
|
||||
"content": {
|
||||
"username": "me",
|
||||
"text": "Highlights from my recent roles and education."
|
||||
},
|
||||
"design": {
|
||||
"date_format": "January 2006",
|
||||
"is_education_first": false
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/resume-languages.json",
|
||||
"title": "Resume Languages",
|
||||
"description": "Renders language proficiency from the author profile",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "resume-languages",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"username": {
|
||||
"type": "string",
|
||||
"description": "Author username (references data/authors/{username}.yaml)",
|
||||
"default": "me"
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Section title (supports Markdown)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"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"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "resume-languages",
|
||||
"content": {
|
||||
"username": "me",
|
||||
"title": "Languages",
|
||||
"text": "Comfortable in English, French, and Mandarin."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/resume-skills.json",
|
||||
"title": "Resume Skills",
|
||||
"description": "Displays skills and proficiency pulled from an author profile",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "resume-skills",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"description": "Content configuration for the skills block",
|
||||
"properties": {
|
||||
"username": {
|
||||
"type": "string",
|
||||
"description": "Author username (references data/authors/{username}.yaml)",
|
||||
"default": "me"
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Section title (supports Markdown)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Section description (supports Markdown)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Layout options for the skills grid",
|
||||
"properties": {
|
||||
"columns": {
|
||||
"type": "integer",
|
||||
"description": "Number of columns used to render skill groups (1-5). Responsive: 2 cols applies at md, 3 at lg, 4 at xl, 5 at 2xl.",
|
||||
"default": 2,
|
||||
"minimum": 1,
|
||||
"maximum": 5,
|
||||
"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"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "resume-skills",
|
||||
"content": {
|
||||
"username": "me",
|
||||
"title": "Skills",
|
||||
"text": "Tooling and languages I use most often."
|
||||
},
|
||||
"design": {
|
||||
"columns": 3
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,123 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/search-hero.json",
|
||||
"title": "Search Hero",
|
||||
"description": "A hero section with prominent search functionality and optional stats",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "search-hero",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"badge": {
|
||||
"type": "object",
|
||||
"description": "Optional badge displayed above the title",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Badge text",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"show_pulse": {
|
||||
"type": "boolean",
|
||||
"description": "Show pulsing dot indicator",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"required": ["text"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Main title. Use ==text== syntax to apply gradient highlighting to words or phrases."
|
||||
},
|
||||
"subtitle": {
|
||||
"type": "string",
|
||||
"description": "Subtitle text"
|
||||
},
|
||||
"search_placeholder": {
|
||||
"type": "string",
|
||||
"description": "Search input placeholder",
|
||||
"default": "Search for answers..."
|
||||
},
|
||||
"suggestions": {
|
||||
"type": "array",
|
||||
"description": "Quick search suggestion chips that open Pagefind with a preset query. Clicking a suggestion opens the search modal with that text pre-filled.",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"examples": [["Get started", "Deploy with Hugo Blox", "Tailwind customization"]]
|
||||
},
|
||||
"stats": {
|
||||
"type": "array",
|
||||
"description": "Optional lightweight stats below the search box",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"value": {
|
||||
"type": "string",
|
||||
"description": "Stat value (supports Markdown)"
|
||||
},
|
||||
"label": {
|
||||
"type": "string",
|
||||
"description": "Stat label"
|
||||
}
|
||||
},
|
||||
"required": ["value", "label"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["title"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "search-hero",
|
||||
"design": {
|
||||
"background": {
|
||||
"gradient_mesh": {
|
||||
"enable": true,
|
||||
"style": "waves",
|
||||
"colors": ["primary-500/25", "secondary-500/25"],
|
||||
"animation": "float"
|
||||
}
|
||||
}
|
||||
},
|
||||
"content": {
|
||||
"badge": {
|
||||
"text": "Instant answers",
|
||||
"show_pulse": true
|
||||
},
|
||||
"title": "Master ==AI tools==. Find answers faster.",
|
||||
"subtitle": "Search our docs, playbooks, and notebooks.",
|
||||
"search_placeholder": "Search documentation...",
|
||||
"suggestions": ["Get started", "Deploy with Hugo Blox"],
|
||||
"stats": [
|
||||
{
|
||||
"value": "250+",
|
||||
"label": "articles"
|
||||
},
|
||||
{
|
||||
"value": "9/10",
|
||||
"label": "avg. satisfaction"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,138 +0,0 @@
|
||||
# Hugo Blox JSON Schemas
|
||||
|
||||
This directory contains JSON schemas for all Hugo Blox blocks, providing IDE autocomplete, validation, and documentation.
|
||||
|
||||
## Schema Organization
|
||||
|
||||
```
|
||||
blox/
|
||||
shared/schemas/
|
||||
base-block.json # Common parameters for all blocks
|
||||
sections.json # Schema for the sections array
|
||||
landing-page.json # Complete landing page front matter schema
|
||||
README.md # This file
|
||||
hero/
|
||||
schema.json # Hero-specific parameters
|
||||
features/
|
||||
schema.json # Features-specific parameters
|
||||
... # Each block has its own schema
|
||||
```
|
||||
|
||||
## Usage in IDEs
|
||||
|
||||
### VS Code
|
||||
|
||||
Add to your workspace `.vscode/settings.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"yaml.schemas": {
|
||||
"https://hugoblox.com/schemas/landing-page.json": ["content/_index.md", "content/**/index.md"],
|
||||
"https://hugoblox.com/schemas/sections.json": ["sections"]
|
||||
},
|
||||
"json.schemas": [
|
||||
{
|
||||
"fileMatch": ["**/content/_index.md"],
|
||||
"url": "https://hugoblox.com/schemas/landing-page.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Local Development
|
||||
|
||||
Schemas are mounted to `/static/schemas/` and available at:
|
||||
|
||||
- `https://your-site.com/schemas/landing-page.json`
|
||||
- `https://your-site.com/schemas/sections.json`
|
||||
- `https://your-site.com/schemas/blocks/hero.json`
|
||||
|
||||
## Schema Features
|
||||
|
||||
### Base Schema
|
||||
|
||||
All blocks inherit from `base-block.json` which provides:
|
||||
|
||||
- **Block identification**: `block` parameter (required)
|
||||
- **Legacy support**: `blox` parameter (deprecated)
|
||||
- **Section styling**: `id`, `demo` flags
|
||||
- **Design options**: background, spacing, CSS customization
|
||||
- **Layout options**: columns, view types, etc.
|
||||
|
||||
### Block-Specific Schemas
|
||||
|
||||
Each block extends the base schema with its specific parameters:
|
||||
|
||||
```yaml
|
||||
# Example: Hero block with full autocomplete support
|
||||
sections:
|
||||
- block: hero # ✅ Autocomplete available
|
||||
content:
|
||||
title: 'Welcome' # ✅ Validated parameter
|
||||
text: 'Description' # ✅ Type-checked
|
||||
primary_action: # ✅ Object structure enforced
|
||||
url: '/contact'
|
||||
text: 'Get Started'
|
||||
icon: 'hero/arrow-right'
|
||||
design:
|
||||
background: # ✅ Inherited from base schema
|
||||
color: 'navy'
|
||||
text_color_light: true
|
||||
```
|
||||
|
||||
### Validation Benefits
|
||||
|
||||
- **Parameter validation**: Catch typos and invalid values
|
||||
- **Required fields**: Ensure essential parameters are provided
|
||||
- **Type safety**: String/number/boolean/array validation
|
||||
- **Enum constraints**: Limited choice fields (e.g., avatar shapes)
|
||||
- **Deprecation warnings**: Legacy parameter notifications
|
||||
|
||||
## Schema Development
|
||||
|
||||
### Adding New Blocks
|
||||
|
||||
1. Create `blox/my-new-block/schema.json`
|
||||
2. Extend `base-block.json`
|
||||
3. Add to `sections.json` oneOf array
|
||||
4. Document block-specific parameters
|
||||
|
||||
### Schema Template
|
||||
|
||||
```json
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/my-block.json",
|
||||
"title": "My Block Schema",
|
||||
"description": "Schema for my custom block",
|
||||
"allOf": [
|
||||
{"$ref": "../shared/schemas/base-block.json"},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {"const": "my-block"},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {"type": "string"}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Context-Aware Strategy
|
||||
|
||||
Hugo Blox uses different terminology based on context:
|
||||
|
||||
| Context | Term | Example |
|
||||
| --------------------- | -------- | ---------------------- |
|
||||
| **Developer Configs** | `block` | `block: hero` |
|
||||
| **Source Structure** | `blox/` | `blox/hero/block.html` |
|
||||
| **UI/Documentation** | "Blox" | "Hugo Blox blocks" |
|
||||
| **URLs/SEO** | `blocks` | `/blocks/hero` |
|
||||
|
||||
This provides optimal developer experience while maintaining brand identity.
|
||||
|
||||
@@ -1,316 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/base-block.json",
|
||||
"title": "Hugo Blox Base Block Schema",
|
||||
"description": "Common parameters available to all Hugo Blox blocks rendered via parse_block_v3.html",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"type": "string",
|
||||
"description": "Block type identifier (required for routing to the correct template)",
|
||||
"examples": ["hero", "stats"]
|
||||
},
|
||||
"blox": {
|
||||
"type": "string",
|
||||
"description": "Legacy block type identifier (deprecated, use 'block' instead)",
|
||||
"deprecated": true,
|
||||
"examples": ["features"]
|
||||
},
|
||||
"id": {
|
||||
"type": "string",
|
||||
"description": "Optional unique identifier for this section",
|
||||
"examples": ["intro", "team"]
|
||||
},
|
||||
"demo": {
|
||||
"type": "boolean",
|
||||
"description": "Whether this section should only appear in demo mode",
|
||||
"default": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Design and styling options applied by the shared block wrapper",
|
||||
"properties": {
|
||||
"background": {
|
||||
"type": "object",
|
||||
"description": "Background styling options (colors, gradients, media, mesh)",
|
||||
"properties": {
|
||||
"color": {
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string",
|
||||
"description": "Single color value",
|
||||
"examples": ["primary-50", "#0b1021"]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"light": {
|
||||
"type": "string",
|
||||
"description": "Light mode color",
|
||||
"examples": ["#ffffff"]
|
||||
},
|
||||
"dark": {
|
||||
"type": "string",
|
||||
"description": "Dark mode color",
|
||||
"examples": ["#0b1021"]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false,
|
||||
"examples": [
|
||||
{
|
||||
"light": "#ffffff",
|
||||
"dark": "#0b1021"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"description": "Background color (supports Tailwind tokens, hex, or rgb values)"
|
||||
},
|
||||
"gradient": {
|
||||
"type": "object",
|
||||
"description": "Gradient configuration",
|
||||
"properties": {
|
||||
"start": {
|
||||
"type": "string",
|
||||
"description": "Gradient start color",
|
||||
"examples": ["primary-500"]
|
||||
},
|
||||
"end": {
|
||||
"type": "string",
|
||||
"description": "Gradient end color",
|
||||
"examples": ["secondary-600"]
|
||||
},
|
||||
"direction": {
|
||||
"type": ["string", "number"],
|
||||
"description": "Gradient direction in degrees",
|
||||
"default": "135",
|
||||
"examples": ["135", 90]
|
||||
}
|
||||
},
|
||||
"required": ["start", "end"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"gradient_mesh": {
|
||||
"type": "object",
|
||||
"description": "Layered gradient mesh backgrounds",
|
||||
"properties": {
|
||||
"enable": {
|
||||
"type": "boolean",
|
||||
"description": "Enable the gradient mesh renderer",
|
||||
"default": false
|
||||
},
|
||||
"style": {
|
||||
"type": "string",
|
||||
"enum": ["orbs", "waves", "dots", "grid"],
|
||||
"description": "Mesh style to render",
|
||||
"default": "orbs"
|
||||
},
|
||||
"animation": {
|
||||
"type": "string",
|
||||
"enum": ["pulse", "float", "rotate", "none"],
|
||||
"description": "Animation preset for mesh elements",
|
||||
"default": "pulse"
|
||||
},
|
||||
"intensity": {
|
||||
"type": "string",
|
||||
"enum": ["subtle", "medium", "bold"],
|
||||
"description": "Visual intensity of the mesh",
|
||||
"default": "subtle"
|
||||
},
|
||||
"colors": {
|
||||
"type": "array",
|
||||
"description": "Tailwind color tokens used in the mesh",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"examples": [["primary-500/20", "secondary-500/20"]]
|
||||
},
|
||||
"orb_count": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"description": "Number of orbs when using the 'orbs' style",
|
||||
"examples": [2, 3]
|
||||
},
|
||||
"positions": {
|
||||
"type": "array",
|
||||
"description": "Position utility classes for orb/wave placement",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"examples": [["top-0 left-1/4", "bottom-0 right-1/4"]]
|
||||
},
|
||||
"sizes": {
|
||||
"type": "array",
|
||||
"description": "Size utility classes per orb",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"examples": [["w-96 h-96", "w-80 h-80"]]
|
||||
},
|
||||
"wave_count": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"description": "Number of waves when using the 'waves' style",
|
||||
"examples": [3]
|
||||
},
|
||||
"dot_size": {
|
||||
"type": "string",
|
||||
"description": "Dot size utility for the 'dots' style",
|
||||
"examples": ["w-4 h-4"]
|
||||
},
|
||||
"spacing": {
|
||||
"type": ["string", "number"],
|
||||
"description": "Spacing in pixels for dots, grid, or waves",
|
||||
"examples": [16, "32"]
|
||||
},
|
||||
"line_width": {
|
||||
"type": ["string", "number"],
|
||||
"description": "Line width in pixels for the 'grid' style",
|
||||
"examples": [1, "2"]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"text_color_light": {
|
||||
"type": "boolean",
|
||||
"description": "Use light text color (for dark backgrounds)"
|
||||
},
|
||||
"image": {
|
||||
"type": "object",
|
||||
"description": "Background image options",
|
||||
"properties": {
|
||||
"filename": {
|
||||
"type": "string",
|
||||
"description": "Image filename relative to assets/media/",
|
||||
"examples": ["backgrounds/hero.jpg"]
|
||||
},
|
||||
"size": {
|
||||
"type": "string",
|
||||
"enum": ["cover", "contain", "actual"],
|
||||
"description": "Background image size behavior",
|
||||
"default": "cover"
|
||||
},
|
||||
"position": {
|
||||
"type": "string",
|
||||
"enum": ["left", "center", "right"],
|
||||
"description": "Background image position",
|
||||
"default": "center"
|
||||
},
|
||||
"parallax": {
|
||||
"type": "boolean",
|
||||
"description": "Enable parallax effect on desktop",
|
||||
"default": true
|
||||
},
|
||||
"filters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"brightness": {
|
||||
"type": "number",
|
||||
"description": "Image brightness filter (0-1, where 1 is normal)",
|
||||
"minimum": 0,
|
||||
"maximum": 1,
|
||||
"examples": [0.65]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"video": {
|
||||
"type": "object",
|
||||
"description": "Background video options",
|
||||
"properties": {
|
||||
"filename": {
|
||||
"type": "string",
|
||||
"description": "Video filename in assets/media/",
|
||||
"examples": ["loops/background.mp4"]
|
||||
},
|
||||
"flip": {
|
||||
"type": "boolean",
|
||||
"description": "Flip video horizontally",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"spacing": {
|
||||
"type": "object",
|
||||
"description": "Spacing options",
|
||||
"properties": {
|
||||
"padding": {
|
||||
"type": "array",
|
||||
"description": "Padding values [top, right, bottom, left]",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"minItems": 4,
|
||||
"maxItems": 4,
|
||||
"examples": [["4rem", "0", "4rem", "0"]]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"css_style": {
|
||||
"type": "string",
|
||||
"description": "Custom CSS styles to apply to the section",
|
||||
"examples": ["min-height: 70vh;"]
|
||||
},
|
||||
"css_class": {
|
||||
"type": "string",
|
||||
"description": "Custom CSS classes to apply to the section",
|
||||
"examples": ["relative overflow-hidden"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["block"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "hero",
|
||||
"id": "intro",
|
||||
"demo": false,
|
||||
"design": {
|
||||
"background": {
|
||||
"color": {
|
||||
"light": "#ffffff",
|
||||
"dark": "#0b1021"
|
||||
},
|
||||
"gradient": {
|
||||
"start": "primary-500",
|
||||
"end": "secondary-600",
|
||||
"direction": "135"
|
||||
},
|
||||
"gradient_mesh": {
|
||||
"enable": true,
|
||||
"style": "orbs",
|
||||
"colors": ["primary-500/20", "secondary-500/20"],
|
||||
"orb_count": 2,
|
||||
"positions": ["top-0 left-1/4", "bottom-0 right-1/4"],
|
||||
"sizes": ["w-96 h-96", "w-80 h-80"],
|
||||
"animation": "pulse",
|
||||
"intensity": "medium"
|
||||
},
|
||||
"image": {
|
||||
"filename": "backgrounds/hero.jpg",
|
||||
"parallax": true
|
||||
},
|
||||
"video": {
|
||||
"filename": "loops/background.mp4",
|
||||
"flip": false
|
||||
},
|
||||
"text_color_light": true
|
||||
},
|
||||
"spacing": {
|
||||
"padding": ["4rem", "0", "4rem", "0"]
|
||||
},
|
||||
"css_class": "relative overflow-hidden",
|
||||
"css_style": "min-height: 70vh;"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,102 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/landing-page.json",
|
||||
"title": "Hugo Blox Landing Page Schema",
|
||||
"description": "Schema for Hugo Blox landing page front matter",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Page title"
|
||||
},
|
||||
"summary": {
|
||||
"type": "string",
|
||||
"description": "Page summary/description"
|
||||
},
|
||||
"date": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Page publication date"
|
||||
},
|
||||
"lastmod": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Page last modified date"
|
||||
},
|
||||
"draft": {
|
||||
"type": "boolean",
|
||||
"description": "Whether the page is a draft",
|
||||
"default": false
|
||||
},
|
||||
"featured": {
|
||||
"type": "boolean",
|
||||
"description": "Whether the page is featured",
|
||||
"default": false
|
||||
},
|
||||
"authors": {
|
||||
"type": "array",
|
||||
"description": "Page authors",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"tags": {
|
||||
"type": "array",
|
||||
"description": "Page tags",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"categories": {
|
||||
"type": "array",
|
||||
"description": "Page categories",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"const": "landing",
|
||||
"description": "Page type (must be 'landing' for landing pages)"
|
||||
},
|
||||
"sections": {
|
||||
"$ref": "./sections.json",
|
||||
"description": "Array of content blocks for the landing page"
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Global page design options",
|
||||
"properties": {
|
||||
"spacing": {
|
||||
"type": "string",
|
||||
"description": "Default section spacing"
|
||||
}
|
||||
}
|
||||
},
|
||||
"header": {
|
||||
"type": "object",
|
||||
"description": "Page-specific header configuration",
|
||||
"properties": {
|
||||
"navbar": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"enable": {
|
||||
"type": "boolean",
|
||||
"description": "Enable/disable navbar for this page"
|
||||
},
|
||||
"block": {
|
||||
"type": "string",
|
||||
"description": "Header block to use (e.g., 'navbar', 'navbar-simple')"
|
||||
},
|
||||
"blox": {
|
||||
"type": "string",
|
||||
"description": "Legacy header block parameter (deprecated, use 'block')",
|
||||
"deprecated": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["type", "sections"],
|
||||
"additionalProperties": true
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/sections.json",
|
||||
"title": "Hugo Blox Sections Schema",
|
||||
"description": "Schema for the sections array in Hugo Blox landing pages",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"oneOf": [
|
||||
{ "$ref": "../hero/schema.json" },
|
||||
{ "$ref": "../features/schema.json" },
|
||||
{ "$ref": "../collection/schema.json" },
|
||||
{ "$ref": "../markdown/schema.json" },
|
||||
{ "$ref": "../stats/schema.json" },
|
||||
{ "$ref": "../testimonials/schema.json" },
|
||||
{ "$ref": "../cta-button-list/schema.json" },
|
||||
{ "$ref": "../cta-card/schema.json" },
|
||||
{ "$ref": "../cta-image-paragraph/schema.json" },
|
||||
{ "$ref": "../resume-experience/schema.json" },
|
||||
{ "$ref": "../resume-biography/schema.json" },
|
||||
{ "$ref": "../resume-biography-3/schema.json" },
|
||||
{ "$ref": "../resume-skills/schema.json" },
|
||||
{ "$ref": "../resume-awards/schema.json" },
|
||||
{ "$ref": "../resume-languages/schema.json" }
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,110 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/stats.json",
|
||||
"title": "Stats",
|
||||
"description": "Displays statistics in cards, compact rows, or a minimal grid",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "stats",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"description": "Content configuration for the stats block",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Section title (supports Markdown)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Section description (supports Markdown)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"items": {
|
||||
"type": "array",
|
||||
"description": "Array of statistics to display",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"statistic": {
|
||||
"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]
|
||||
},
|
||||
"description": {
|
||||
"type": "string",
|
||||
"description": "Description of the statistic (supports Markdown)"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Icon identifier (e.g., 'hero/chart-bar', 'hero/user-group')"
|
||||
},
|
||||
"sub_metric": {
|
||||
"type": "string",
|
||||
"description": "Additional context or sub-metric (supports Markdown)"
|
||||
}
|
||||
},
|
||||
"required": ["statistic", "description"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"minItems": 1
|
||||
}
|
||||
},
|
||||
"required": ["items"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Design options for the stats block",
|
||||
"properties": {
|
||||
"layout": {
|
||||
"type": "string",
|
||||
"enum": ["cards", "compact", "minimal"],
|
||||
"description": "Display layout style",
|
||||
"default": "cards"
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "stats",
|
||||
"content": {
|
||||
"title": "Impact metrics",
|
||||
"text": "Momentum across research and product work.",
|
||||
"items": [
|
||||
{
|
||||
"statistic": "120+",
|
||||
"description": "peer-reviewed papers",
|
||||
"icon": "hero/document-text"
|
||||
},
|
||||
{
|
||||
"statistic": "5M",
|
||||
"description": "dataset downloads",
|
||||
"sub_metric": "across three releases"
|
||||
},
|
||||
{
|
||||
"statistic": 42,
|
||||
"description": "team members"
|
||||
}
|
||||
]
|
||||
},
|
||||
"design": {
|
||||
"layout": "cards"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,202 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/team-showcase.json",
|
||||
"title": "Team Showcase",
|
||||
"description": "Displays team members grouped by author taxonomy",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "team-showcase",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"description": "Content configuration for the team showcase block",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Section title (supports Markdown)"
|
||||
},
|
||||
"subtitle": {
|
||||
"type": "string",
|
||||
"description": "Section subtitle (supports Markdown)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"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": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
"sort_by": {
|
||||
"type": "string",
|
||||
"description": "Per-group override of sort field"
|
||||
},
|
||||
"sort_ascending": {
|
||||
"type": "boolean",
|
||||
"description": "Per-group override of sort direction"
|
||||
}
|
||||
},
|
||||
"required": ["name"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"examples": [
|
||||
["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"],
|
||||
"default": "name_family"
|
||||
},
|
||||
"sort_ascending": {
|
||||
"type": "boolean",
|
||||
"description": "Sort direction (true for ascending, false for descending)",
|
||||
"default": true
|
||||
},
|
||||
"cta": {
|
||||
"type": "object",
|
||||
"description": "Optional call-to-action displayed beneath the grid",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Button text",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"description": "Button URL (can be relative or absolute)"
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Optional icon name (e.g., 'hero/user-plus')"
|
||||
}
|
||||
},
|
||||
"required": ["text", "url"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Display toggles for the team showcase",
|
||||
"properties": {
|
||||
"show_role": {
|
||||
"type": "boolean",
|
||||
"description": "Show the role from each author profile",
|
||||
"default": true
|
||||
},
|
||||
"show_organizations": {
|
||||
"type": "boolean",
|
||||
"description": "Display the first organization/affiliation per profile",
|
||||
"default": true
|
||||
},
|
||||
"show_interests": {
|
||||
"type": "boolean",
|
||||
"description": "Display interests per profile (capped by max_interests)",
|
||||
"default": false
|
||||
},
|
||||
"show_social": {
|
||||
"type": "boolean",
|
||||
"description": "Show social media icons pulled from the author profile links",
|
||||
"default": true
|
||||
},
|
||||
"max_interests": {
|
||||
"type": "integer",
|
||||
"description": "Maximum number of interests to display per profile (0 hides interests; default 3)",
|
||||
"default": 3,
|
||||
"minimum": 0
|
||||
},
|
||||
"align": {
|
||||
"type": "string",
|
||||
"description": "Align the section header and CTA",
|
||||
"enum": ["center", "left"],
|
||||
"default": "center"
|
||||
},
|
||||
"max_columns": {
|
||||
"type": "integer",
|
||||
"description": "Maximum number of columns on wide screens (2-4)",
|
||||
"enum": [2, 3, 4],
|
||||
"default": 4
|
||||
},
|
||||
"show_empty_groups": {
|
||||
"type": "boolean",
|
||||
"description": "If true, show an empty-state message for groups with no matching authors",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "team-showcase",
|
||||
"content": {
|
||||
"title": "Meet the team",
|
||||
"subtitle": "Research + Engineering",
|
||||
"text": "We combine safety research with high-velocity engineering.",
|
||||
"user_groups": [
|
||||
"Principal Investigators",
|
||||
"Research Engineers",
|
||||
{
|
||||
"name": "Alumni",
|
||||
"sort_by": "graduation_year",
|
||||
"sort_ascending": false
|
||||
}
|
||||
],
|
||||
"sort_by": "name_family",
|
||||
"sort_ascending": true,
|
||||
"cta": {
|
||||
"text": "Join us",
|
||||
"url": "/apply",
|
||||
"icon": "hero/user-plus"
|
||||
}
|
||||
},
|
||||
"design": {
|
||||
"show_role": true,
|
||||
"show_organizations": true,
|
||||
"show_interests": true,
|
||||
"max_interests": 3,
|
||||
"show_social": true,
|
||||
"align": "left",
|
||||
"max_columns": 3,
|
||||
"show_empty_groups": false
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,176 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/tech-stack.json",
|
||||
"title": "Tech Stack",
|
||||
"description": "Displays technologies with icons organized by category",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "tech-stack",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"description": "Content configuration for the tech stack block",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Section title (supports Markdown)",
|
||||
"examples": ["Tech Stack", "Skills & Technologies"]
|
||||
},
|
||||
"subtitle": {
|
||||
"type": "string",
|
||||
"description": "Section subtitle (supports Markdown)",
|
||||
"examples": ["Technologies I work with daily"]
|
||||
},
|
||||
"categories": {
|
||||
"type": "array",
|
||||
"description": "Categories of technologies",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Category name",
|
||||
"examples": ["Languages", "Frontend", "Backend", "DevOps"]
|
||||
},
|
||||
"items": {
|
||||
"type": "array",
|
||||
"description": "Technologies in this category",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Technology name",
|
||||
"examples": ["TypeScript", "React", "Node.js"]
|
||||
},
|
||||
"icon": {
|
||||
"type": "string",
|
||||
"description": "Icon identifier (supports devicon/, brands/, or hero icons)",
|
||||
"examples": ["devicon/typescript", "devicon/react", "brands/github"]
|
||||
},
|
||||
"level": {
|
||||
"type": "string",
|
||||
"description": "Proficiency level (optional)",
|
||||
"enum": ["expert", "advanced", "intermediate", "beginner"],
|
||||
"examples": ["expert", "advanced"]
|
||||
}
|
||||
},
|
||||
"required": ["name"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["items"]
|
||||
},
|
||||
"examples": [
|
||||
[
|
||||
{
|
||||
"name": "Languages",
|
||||
"items": [
|
||||
{
|
||||
"name": "TypeScript",
|
||||
"icon": "devicon/typescript",
|
||||
"level": "expert"
|
||||
},
|
||||
{
|
||||
"name": "Python",
|
||||
"icon": "devicon/python",
|
||||
"level": "advanced"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"required": ["categories"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"design": {
|
||||
"type": "object",
|
||||
"description": "Layout options for tech stack rendering",
|
||||
"properties": {
|
||||
"style": {
|
||||
"type": "string",
|
||||
"description": "Display style",
|
||||
"enum": ["grid", "list"],
|
||||
"default": "grid"
|
||||
},
|
||||
"show_levels": {
|
||||
"type": "boolean",
|
||||
"description": "Show proficiency level indicators",
|
||||
"default": false
|
||||
},
|
||||
"animations": {
|
||||
"type": "boolean",
|
||||
"description": "Enable hover and stagger animations",
|
||||
"default": true
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "tech-stack",
|
||||
"id": "skills",
|
||||
"content": {
|
||||
"title": "Tech Stack",
|
||||
"subtitle": "Technologies I use to build things",
|
||||
"categories": [
|
||||
{
|
||||
"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": "Frontend",
|
||||
"items": [
|
||||
{
|
||||
"name": "React",
|
||||
"icon": "devicon/react"
|
||||
},
|
||||
{
|
||||
"name": "Next.js",
|
||||
"icon": "devicon/nextjs"
|
||||
},
|
||||
{
|
||||
"name": "Tailwind CSS",
|
||||
"icon": "devicon/tailwindcss"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"design": {
|
||||
"style": "grid",
|
||||
"show_levels": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/testimonials.json",
|
||||
"title": "Testimonials",
|
||||
"description": "Displays quotes with avatars, names, and roles",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "testimonials",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Section title (supports Markdown)"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Section description (supports Markdown)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"items": {
|
||||
"type": "array",
|
||||
"description": "Testimonial entries",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"description": "Quoted testimonial text (supports Markdown)",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Person's name"
|
||||
},
|
||||
"role": {
|
||||
"type": "string",
|
||||
"description": "Role or organization"
|
||||
},
|
||||
"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"]
|
||||
}
|
||||
},
|
||||
"required": ["text", "name"],
|
||||
"additionalProperties": false
|
||||
},
|
||||
"minItems": 1
|
||||
}
|
||||
},
|
||||
"required": ["items"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "testimonials",
|
||||
"content": {
|
||||
"title": "What partners say",
|
||||
"text": "Teams build faster when they start with Hugo Blox.",
|
||||
"items": [
|
||||
{
|
||||
"text": "\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": "\u201cGreat developer experience and first-class docs. Our students love it.\u201d",
|
||||
"name": "Prof. Lee Nguyen",
|
||||
"role": "MIT CSAIL",
|
||||
"image": "people/lee.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,138 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://hugoblox.com/schemas/blocks/trending-questions.json",
|
||||
"title": "Trending Questions",
|
||||
"description": "Display trending or featured questions with optional dynamic sourcing from content marked `trending: true`",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "../shared/schemas/base-block.json"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"block": {
|
||||
"const": "trending-questions",
|
||||
"description": "Block type identifier"
|
||||
},
|
||||
"content": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string"
|
||||
},
|
||||
"subtitle": {
|
||||
"type": "string"
|
||||
},
|
||||
"count": {
|
||||
"type": "integer",
|
||||
"description": "Number of items to pull when auto-querying pages with `trending: true`",
|
||||
"default": 4,
|
||||
"minimum": 1
|
||||
},
|
||||
"questions": {
|
||||
"type": "array",
|
||||
"description": "Static fallback list of questions to render",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"question": {
|
||||
"type": "string"
|
||||
},
|
||||
"answer_preview": {
|
||||
"type": "string"
|
||||
},
|
||||
"link": {
|
||||
"type": "string",
|
||||
"description": "URL to the full answer/article"
|
||||
},
|
||||
"badge": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"color": {
|
||||
"type": "string",
|
||||
"description": "Tailwind classes applied to the badge"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"author": {
|
||||
"type": "string"
|
||||
},
|
||||
"views": {
|
||||
"type": ["string", "number"]
|
||||
},
|
||||
"upvotes": {
|
||||
"type": ["integer", "number"]
|
||||
}
|
||||
},
|
||||
"required": ["question", "link"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"view_all": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"text": {
|
||||
"type": "string",
|
||||
"x-multiline": true,
|
||||
"format": "textarea"
|
||||
},
|
||||
"link": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": ["text", "link"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["content"],
|
||||
"additionalProperties": true,
|
||||
"examples": [
|
||||
{
|
||||
"block": "trending-questions",
|
||||
"design": {
|
||||
"spacing": {
|
||||
"padding": ["3rem", "0", "3rem", "0"]
|
||||
}
|
||||
},
|
||||
"content": {
|
||||
"title": "Trending questions",
|
||||
"subtitle": "Top searches from the last 7 days.",
|
||||
"count": 4,
|
||||
"questions": [
|
||||
{
|
||||
"question": "How do I deploy Hugo Blox to Netlify?",
|
||||
"answer_preview": "Use the provided CI workflow or run `hugo --gc --minify`...",
|
||||
"link": "/docs/deploy/netlify/",
|
||||
"badge": {
|
||||
"text": "\ud83d\udd25 Popular",
|
||||
"color": "bg-amber-100 text-amber-800"
|
||||
},
|
||||
"views": 1200,
|
||||
"upvotes": 86
|
||||
},
|
||||
{
|
||||
"question": "Where can I customize Tailwind 4 tokens?",
|
||||
"answer_preview": "Tokens are defined in `modules/blox-tailwind/assets/`...",
|
||||
"link": "/docs/style/tokens/",
|
||||
"author": "geo"
|
||||
}
|
||||
],
|
||||
"view_all": {
|
||||
"text": "Browse all questions",
|
||||
"link": "/faq/"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in new issue
Block a user