Full Code of HugoBlox/kit for AI

main e02d32190aa4 cached
779 files
6.8 MB
1.8M tokens
135 symbols
1 requests
Download .txt
Showing preview only (7,235K chars total). Download the full file or copy to clipboard to get everything.
Repository: HugoBlox/kit
Branch: main
Commit: e02d32190aa4
Files: 779
Total size: 6.8 MB

Directory structure:
gitextract_4a7sb44i/

├── .cursorindexingignore
├── .devcontainer/
│   └── base.Dockerfile
├── .editorconfig
├── .github/
│   ├── CLA.md
│   ├── CODEOWNERS
│   ├── CODE_OF_CONDUCT.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.yml
│   │   ├── config.yml
│   │   └── feature-request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── SECURITY.md
│   ├── SUPPORT.md
│   ├── dependabot.yml
│   ├── labeler.yml
│   └── workflows/
│       ├── ci-build-starters-matrix.yml
│       ├── ci-lint.yml
│       ├── ci-pr-labeler.yml
│       ├── codeql.yml
│       ├── community-welcome.yml
│       ├── devcontainer-image.yml
│       ├── maintenance-stale.yml
│       ├── release-hugoblox-modules.yml
│       ├── release-package-splitter.yml
│       └── security-codeql.yml
├── .gitignore
├── .prettierignore
├── .prettierrc.js
├── .stylelintignore
├── CITATION.cff
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── README.zh.md
├── biome.json
├── hugoblox.code-workspace
├── modules/
│   ├── README.md
│   ├── analytics/
│   │   ├── README.md
│   │   ├── go.mod
│   │   ├── hugo.yaml
│   │   └── layouts/
│   │       └── _partials/
│   │           └── blox-analytics/
│   │               ├── index.html
│   │               ├── services/
│   │               │   ├── baidu_tongji.html
│   │               │   ├── fathom.html
│   │               │   ├── google_analytics.html
│   │               │   ├── google_tag_manager.html
│   │               │   ├── index.html
│   │               │   ├── microsoft_clarity.html
│   │               │   ├── pirsch.html
│   │               │   └── plausible.html
│   │               └── verification.html
│   ├── blox/
│   │   ├── .npmrc
│   │   ├── README.md
│   │   ├── archetypes/
│   │   │   ├── faq.md
│   │   │   └── questions.md
│   │   ├── assets/
│   │   │   ├── css/
│   │   │   │   ├── README.md
│   │   │   │   ├── animations.css
│   │   │   │   ├── blox/
│   │   │   │   │   ├── all.css
│   │   │   │   │   ├── biography.css
│   │   │   │   │   ├── navbar.css
│   │   │   │   │   └── skills.css
│   │   │   │   ├── chroma.css
│   │   │   │   ├── color-utilities.css
│   │   │   │   ├── components/
│   │   │   │   │   ├── all.css
│   │   │   │   │   ├── author-notes.css
│   │   │   │   │   ├── cards.css
│   │   │   │   │   ├── charts.css
│   │   │   │   │   ├── copy.css
│   │   │   │   │   ├── cover.css
│   │   │   │   │   ├── glassmorphism.css
│   │   │   │   │   ├── math.css
│   │   │   │   │   ├── notebook.css
│   │   │   │   │   ├── page.css
│   │   │   │   │   ├── sidebar-left.css
│   │   │   │   │   ├── steps.css
│   │   │   │   │   └── task-list.css
│   │   │   │   ├── config/
│   │   │   │   │   ├── safelist.css
│   │   │   │   │   ├── tailwind.css
│   │   │   │   │   └── theme.css
│   │   │   │   ├── framework/
│   │   │   │   │   ├── base.css
│   │   │   │   │   └── components.css
│   │   │   │   ├── hb-search.css
│   │   │   │   ├── layout-utilities.css
│   │   │   │   ├── libs/
│   │   │   │   │   └── chroma/
│   │   │   │   │       ├── dark.css
│   │   │   │   │       └── light.css
│   │   │   │   ├── main.css
│   │   │   │   ├── themes/
│   │   │   │   │   ├── amber.css
│   │   │   │   │   ├── blue.css
│   │   │   │   │   ├── cyan.css
│   │   │   │   │   ├── emerald.css
│   │   │   │   │   ├── fuchsia.css
│   │   │   │   │   ├── green.css
│   │   │   │   │   ├── indigo.css
│   │   │   │   │   ├── lime.css
│   │   │   │   │   ├── orange.css
│   │   │   │   │   ├── pink.css
│   │   │   │   │   ├── purple.css
│   │   │   │   │   ├── red.css
│   │   │   │   │   ├── rose.css
│   │   │   │   │   ├── sky.css
│   │   │   │   │   ├── slate.css
│   │   │   │   │   ├── stone.css
│   │   │   │   │   ├── teal.css
│   │   │   │   │   ├── violet.css
│   │   │   │   │   ├── yellow.css
│   │   │   │   │   └── zinc.css
│   │   │   │   └── views/
│   │   │   │       ├── all.css
│   │   │   │       └── attachments.css
│   │   │   ├── dist/
│   │   │   │   └── lib/
│   │   │   │       ├── markmap/
│   │   │   │       │   └── index.js
│   │   │   │       └── vendor-libs.mjs
│   │   │   └── js/
│   │   │       ├── hb-animations.js
│   │   │       ├── hb-citation.js
│   │   │       ├── hb-clipboard.js
│   │   │       ├── hb-code-copy.js
│   │   │       ├── hb-head.js
│   │   │       ├── hb-i18n.js
│   │   │       ├── hb-init.js
│   │   │       ├── hb-mermaid-config.js
│   │   │       ├── hb-nav.js
│   │   │       ├── hb-notifier.js
│   │   │       ├── hb-search.js
│   │   │       ├── hb-sidebar.js
│   │   │       ├── hb-theme.js
│   │   │       ├── katex-config.js
│   │   │       └── vendor-libs.js
│   │   ├── blox/
│   │   │   ├── collection/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── contact-info/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── cta-button-list/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── cta-card/
│   │   │   │   ├── README.md
│   │   │   │   ├── client.jsx
│   │   │   │   ├── component.jsx
│   │   │   │   └── manifest.json
│   │   │   ├── cta-image-paragraph/
│   │   │   │   ├── README.md
│   │   │   │   ├── client.jsx
│   │   │   │   ├── component.jsx
│   │   │   │   └── manifest.json
│   │   │   ├── dev-hero/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── faq/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── features/
│   │   │   │   ├── README.md
│   │   │   │   ├── client.jsx
│   │   │   │   ├── component.jsx
│   │   │   │   └── manifest.json
│   │   │   ├── hero/
│   │   │   │   ├── README.md
│   │   │   │   ├── client.jsx
│   │   │   │   ├── component.jsx
│   │   │   │   └── manifest.json
│   │   │   ├── knowledge-categories/
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── logos/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── markdown/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── portfolio/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── research-areas/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── resume-awards/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── resume-biography/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── resume-biography-3/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── resume-experience/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── resume-languages/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── resume-skills/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── search-hero/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── shared/
│   │   │   │   └── js/
│   │   │   │       └── components/
│   │   │   │           └── Icon.jsx
│   │   │   ├── stats/
│   │   │   │   ├── README.md
│   │   │   │   ├── client.jsx
│   │   │   │   ├── component.jsx
│   │   │   │   └── manifest.json
│   │   │   ├── team-showcase/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── tech-stack/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── testimonials/
│   │   │   │   ├── README.md
│   │   │   │   ├── client.jsx
│   │   │   │   ├── component.jsx
│   │   │   │   └── manifest.json
│   │   │   └── trending-questions/
│   │   │       ├── block.html
│   │   │       └── manifest.json
│   │   ├── data/
│   │   │   ├── address_formats.toml
│   │   │   ├── blox_aliases.yaml
│   │   │   ├── fonts/
│   │   │   │   ├── academic.yaml
│   │   │   │   ├── developer.yaml
│   │   │   │   ├── editorial.yaml
│   │   │   │   ├── geometric.yaml
│   │   │   │   ├── humanist.yaml
│   │   │   │   ├── modern.yaml
│   │   │   │   └── system.yaml
│   │   │   ├── hugoblox.yaml
│   │   │   ├── icons/
│   │   │   │   ├── academicons.json
│   │   │   │   ├── brands.yaml
│   │   │   │   ├── devicon.json
│   │   │   │   ├── hb.yaml
│   │   │   │   └── hero.json
│   │   │   ├── languages.yaml
│   │   │   ├── link_types.yaml
│   │   │   ├── page_sharer.yaml
│   │   │   └── themes/
│   │   │       ├── coffee.yaml
│   │   │       ├── contrast.yaml
│   │   │       ├── cupcake.yaml
│   │   │       ├── default.yaml
│   │   │       ├── dracula.yaml
│   │   │       ├── marine.yaml
│   │   │       ├── matcha.yaml
│   │   │       ├── minimal.yaml
│   │   │       ├── retro.yaml
│   │   │       ├── solar.yaml
│   │   │       └── synthwave.yaml
│   │   ├── go.mod
│   │   ├── hugo.yaml
│   │   ├── i18n/
│   │   │   ├── ar.yaml
│   │   │   ├── bn.yaml
│   │   │   ├── ca.yaml
│   │   │   ├── cs.yaml
│   │   │   ├── da.yaml
│   │   │   ├── de.yaml
│   │   │   ├── el.yaml
│   │   │   ├── en.yaml
│   │   │   ├── es.yaml
│   │   │   ├── et.yaml
│   │   │   ├── eu.yaml
│   │   │   ├── fa.yaml
│   │   │   ├── fi.yaml
│   │   │   ├── fr.yaml
│   │   │   ├── he.yaml
│   │   │   ├── hi.yaml
│   │   │   ├── hr.yaml
│   │   │   ├── ht.yaml
│   │   │   ├── hu.yaml
│   │   │   ├── id.yaml
│   │   │   ├── it.yaml
│   │   │   ├── ja.yaml
│   │   │   ├── km.yaml
│   │   │   ├── ko.yaml
│   │   │   ├── lt.yaml
│   │   │   ├── lv.yaml
│   │   │   ├── mg.yaml
│   │   │   ├── ms-Arab.yaml
│   │   │   ├── ms.yaml
│   │   │   ├── nb.yaml
│   │   │   ├── nl.yaml
│   │   │   ├── pl.yaml
│   │   │   ├── pt.yaml
│   │   │   ├── ro.yaml
│   │   │   ├── ru.yaml
│   │   │   ├── so.yaml
│   │   │   ├── sv.yaml
│   │   │   ├── tr.yaml
│   │   │   ├── uk.yaml
│   │   │   ├── vi.yaml
│   │   │   ├── zh-Hant.yaml
│   │   │   └── zh.yaml
│   │   ├── layouts/
│   │   │   ├── 404.html
│   │   │   ├── _markup/
│   │   │   │   ├── render-blockquote.html
│   │   │   │   ├── render-codeblock-markmap.html
│   │   │   │   ├── render-codeblock-mermaid.html
│   │   │   │   ├── render-image.html
│   │   │   │   ├── render-link.backlinks.json
│   │   │   │   └── render-link.html
│   │   │   ├── _partials/
│   │   │   │   ├── blox/
│   │   │   │   │   ├── contact-info/
│   │   │   │   │   │   └── config.html
│   │   │   │   │   ├── dev-hero/
│   │   │   │   │   │   └── config.html
│   │   │   │   │   ├── portfolio/
│   │   │   │   │   │   └── config.html
│   │   │   │   │   ├── preact-wrapper.html
│   │   │   │   │   └── tech-stack/
│   │   │   │   │       └── config.html
│   │   │   │   ├── comments/
│   │   │   │   │   ├── disqus.html
│   │   │   │   │   └── giscus.html
│   │   │   │   ├── comments.html
│   │   │   │   ├── components/
│   │   │   │   │   ├── backlinks.html
│   │   │   │   │   ├── breadcrumb.html
│   │   │   │   │   ├── cover.html
│   │   │   │   │   ├── feedback.html
│   │   │   │   │   ├── footers/
│   │   │   │   │   │   ├── columns.html
│   │   │   │   │   │   └── minimal.html
│   │   │   │   │   ├── headers/
│   │   │   │   │   │   ├── floating-theme-toggler.html
│   │   │   │   │   │   ├── navbar-simple.html
│   │   │   │   │   │   └── navbar.html
│   │   │   │   │   ├── language-chooser.html
│   │   │   │   │   ├── last-edited.html
│   │   │   │   │   ├── next-in-series.html
│   │   │   │   │   ├── page_sharer.html
│   │   │   │   │   ├── paginator.html
│   │   │   │   │   ├── search-modal.html
│   │   │   │   │   ├── sidebar.html
│   │   │   │   │   ├── slides-embed.html
│   │   │   │   │   └── toc.html
│   │   │   │   ├── css.html
│   │   │   │   ├── docs_layout.html
│   │   │   │   ├── functions/
│   │   │   │   │   ├── build_links.html
│   │   │   │   │   ├── coerce_bool.html
│   │   │   │   │   ├── coerce_int.html
│   │   │   │   │   ├── deep_merge.html
│   │   │   │   │   ├── demo_theme_styles.html
│   │   │   │   │   ├── embed/
│   │   │   │   │   │   ├── github.html
│   │   │   │   │   │   ├── hbx_content_section.html
│   │   │   │   │   │   ├── hbx_platform_icon.html
│   │   │   │   │   │   ├── hbx_title_section.html
│   │   │   │   │   │   └── huggingface.html
│   │   │   │   │   ├── generate_color_scale.html
│   │   │   │   │   ├── get-block-scripts.html
│   │   │   │   │   ├── get-build-id.html
│   │   │   │   │   ├── get_address.html
│   │   │   │   │   ├── get_author_name.html
│   │   │   │   │   ├── get_author_profile.html
│   │   │   │   │   ├── get_authors_data.html
│   │   │   │   │   ├── get_branding.html
│   │   │   │   │   ├── get_cover_image.html
│   │   │   │   │   ├── get_event_dates.html
│   │   │   │   │   ├── get_featured_image.html
│   │   │   │   │   ├── get_hook.html
│   │   │   │   │   ├── get_icon.html
│   │   │   │   │   ├── get_icon_data.html
│   │   │   │   │   ├── get_logo.html
│   │   │   │   │   ├── get_logo_url.html
│   │   │   │   │   ├── get_page_title.html
│   │   │   │   │   ├── get_site_icon.html
│   │   │   │   │   ├── get_sort_by_parameter.html
│   │   │   │   │   ├── get_summary.html
│   │   │   │   │   ├── get_theme_config.html
│   │   │   │   │   ├── has_attachments.html
│   │   │   │   │   ├── hbx_verify.html
│   │   │   │   │   ├── layout_tokens.html
│   │   │   │   │   ├── load_font_pack.html
│   │   │   │   │   ├── load_theme_pack.html
│   │   │   │   │   ├── logger.html
│   │   │   │   │   ├── notebook/
│   │   │   │   │   │   └── render.html
│   │   │   │   │   ├── parse_block_v3.html
│   │   │   │   │   ├── process_responsive_image.html
│   │   │   │   │   ├── render_callout.html
│   │   │   │   │   ├── render_view.html
│   │   │   │   │   ├── theme_generator.html
│   │   │   │   │   ├── theme_variables.html
│   │   │   │   │   ├── typography.html
│   │   │   │   │   └── uid.html
│   │   │   │   ├── hbx/
│   │   │   │   │   ├── resolve-block-param.html
│   │   │   │   │   ├── resolve.html
│   │   │   │   │   └── sections.html
│   │   │   │   ├── hooks/
│   │   │   │   │   └── body-end/
│   │   │   │   │       ├── hbx-debug-export.html
│   │   │   │   │       └── hbx-debug-hud.html
│   │   │   │   ├── init.html
│   │   │   │   ├── jsonld/
│   │   │   │   │   ├── article.html
│   │   │   │   │   ├── breadcrumbs.html
│   │   │   │   │   ├── business.html
│   │   │   │   │   ├── collectionpage.html
│   │   │   │   │   ├── event.html
│   │   │   │   │   ├── faqpage.html
│   │   │   │   │   ├── main.html
│   │   │   │   │   ├── qapage.html
│   │   │   │   │   ├── webpage.html
│   │   │   │   │   └── website.html
│   │   │   │   ├── landing_page.html
│   │   │   │   ├── libraries.html
│   │   │   │   ├── notification-container.html
│   │   │   │   ├── page_author.html
│   │   │   │   ├── page_author_card.html
│   │   │   │   ├── page_edit.html
│   │   │   │   ├── page_footer.html
│   │   │   │   ├── page_links.html
│   │   │   │   ├── page_links_div.html
│   │   │   │   ├── page_metadata_authors.html
│   │   │   │   ├── page_related.html
│   │   │   │   ├── site_footer.html
│   │   │   │   ├── site_footer_license.html
│   │   │   │   ├── site_head.html
│   │   │   │   ├── social_links.html
│   │   │   │   ├── tags.html
│   │   │   │   ├── tailwind_sources.html
│   │   │   │   └── views/
│   │   │   │       ├── article-grid--end.html
│   │   │   │       ├── article-grid--start.html
│   │   │   │       ├── article-grid.html
│   │   │   │       ├── card--end.html
│   │   │   │       ├── card--start.html
│   │   │   │       ├── card.html
│   │   │   │       ├── citation--end.html
│   │   │   │       ├── citation--start.html
│   │   │   │       ├── citation.html
│   │   │   │       ├── date-title-summary--end.html
│   │   │   │       ├── date-title-summary--start.html
│   │   │   │       ├── date-title-summary.html
│   │   │   │       ├── slides-gallery--end.html
│   │   │   │       ├── slides-gallery--start.html
│   │   │   │       └── slides-gallery.html
│   │   │   ├── _shortcodes/
│   │   │   │   ├── audio.html
│   │   │   │   ├── bilibili.html
│   │   │   │   ├── button.html
│   │   │   │   ├── callout.html
│   │   │   │   ├── card.html
│   │   │   │   ├── cards.html
│   │   │   │   ├── chart.html
│   │   │   │   ├── cite.html
│   │   │   │   ├── embed.html
│   │   │   │   ├── icon.html
│   │   │   │   ├── include.html
│   │   │   │   ├── math.html
│   │   │   │   ├── mention.html
│   │   │   │   ├── notebook.html
│   │   │   │   ├── spoiler.html
│   │   │   │   ├── steps.html
│   │   │   │   ├── table.html
│   │   │   │   ├── toc.html
│   │   │   │   └── video.html
│   │   │   ├── authors/
│   │   │   │   └── term.html
│   │   │   ├── baseof.html
│   │   │   ├── docs/
│   │   │   │   ├── list.html
│   │   │   │   └── single.html
│   │   │   ├── events/
│   │   │   │   └── page.html
│   │   │   ├── faq/
│   │   │   │   ├── list.html
│   │   │   │   └── single.html
│   │   │   ├── home.backlinks.json
│   │   │   ├── home.html
│   │   │   ├── index.llm.txt
│   │   │   ├── index.webmanifest
│   │   │   ├── landing/
│   │   │   │   ├── list.html
│   │   │   │   └── single.html
│   │   │   ├── list.html
│   │   │   ├── questions/
│   │   │   │   ├── list.html
│   │   │   │   └── single.html
│   │   │   ├── robots.txt
│   │   │   ├── rss.xml
│   │   │   ├── single.html
│   │   │   ├── sitemap.xml
│   │   │   ├── taxonomy.html
│   │   │   └── terms.html
│   │   ├── package.json
│   │   ├── pnpm-workspace.yaml
│   │   ├── schemas/
│   │   │   └── blocks.json
│   │   └── theme.toml
│   ├── integrations/
│   │   └── netlify/
│   │       ├── README.md
│   │       ├── config.yaml
│   │       ├── go.mod
│   │       └── src/
│   │           └── layouts/
│   │               ├── index.headers
│   │               └── index.redirects
│   └── slides/
│       ├── README.md
│       ├── assets/
│       │   ├── css/
│       │   │   ├── libs/
│       │   │   │   └── chroma/
│       │   │   │       ├── dracula.css
│       │   │   │       ├── github-dark.css
│       │   │   │       └── github-light.css
│       │   │   └── slides-branding.css
│       │   └── js/
│       │       └── hugoblox-slides.js
│       ├── config/
│       │   └── _default/
│       │       └── hugo.yaml
│       ├── go.mod
│       └── layouts/
│           ├── _partials/
│           │   ├── components/
│           │   │   └── slide-branding.html
│           │   ├── functions/
│           │   │   └── slides_get_hook.html
│           │   ├── hooks/
│           │   │   ├── slide-body-end/
│           │   │   │   └── _example.html
│           │   │   ├── slide-footer/
│           │   │   │   └── _example.html
│           │   │   ├── slide-head-end/
│           │   │   │   └── _example.html
│           │   │   └── slide-header/
│           │   │       └── _example.html
│           │   └── slides.html
│           ├── _shortcodes/
│           │   ├── fragment.html
│           │   ├── slide.html
│           │   └── speaker_note.html
│           └── slides/
│               ├── baseof.html
│               ├── baseof.present.html
│               ├── list.html
│               ├── presenter.html
│               ├── single.html
│               └── single.present.html
├── package.json
├── pyproject.toml
├── scripts/
│   ├── list_language_packs.py
│   ├── release_modules.py
│   ├── rm-hugo-cache.sh
│   ├── sync_i18n.py
│   ├── test_release_modules.py
│   ├── update_template_hugo.py
│   ├── view-starter-dev.sh
│   ├── view-starter-prod.sh
│   └── view-test.sh
├── templates/
│   ├── academic-cv/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       ├── import-publications.yml
│   │   │       ├── internal-readme-news.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── media/
│   │   │       └── icons/
│   │   │           └── custom/
│   │   │               └── .gitkeep
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── languages.yaml
│   │   │       ├── menus.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   ├── authors/
│   │   │   │   └── _index.md
│   │   │   ├── blog/
│   │   │   │   ├── _index.md
│   │   │   │   ├── data-visualization/
│   │   │   │   │   ├── index.md
│   │   │   │   │   ├── line-chart.json
│   │   │   │   │   └── results.csv
│   │   │   │   ├── get-started/
│   │   │   │   │   └── index.md
│   │   │   │   ├── notebook-onboarding/
│   │   │   │   │   ├── hugoblox-onboarding.ipynb
│   │   │   │   │   └── index.md
│   │   │   │   ├── project-management/
│   │   │   │   │   └── index.md
│   │   │   │   ├── second-brain/
│   │   │   │   │   └── index.md
│   │   │   │   └── teach-courses/
│   │   │   │       └── index.md
│   │   │   ├── courses/
│   │   │   │   ├── _index.md
│   │   │   │   └── hugo-blox/
│   │   │   │       ├── _index.md
│   │   │   │       ├── getting-started.md
│   │   │   │       ├── guide/
│   │   │   │       │   ├── _index.md
│   │   │   │       │   ├── configuration.md
│   │   │   │       │   ├── formatting/
│   │   │   │       │   │   ├── _index.md
│   │   │   │       │   │   ├── button.md
│   │   │   │       │   │   ├── callout.md
│   │   │   │       │   │   ├── cards.md
│   │   │   │       │   │   ├── media.md
│   │   │   │       │   │   ├── steps.md
│   │   │   │       │   │   └── toggle.md
│   │   │   │       │   └── project-structure.md
│   │   │   │       └── reference/
│   │   │   │           ├── _index.md
│   │   │   │           ├── customization.md
│   │   │   │           └── i18n.md
│   │   │   ├── events/
│   │   │   │   ├── _index.md
│   │   │   │   └── example/
│   │   │   │       └── index.md
│   │   │   ├── experience.md
│   │   │   ├── projects/
│   │   │   │   ├── _index.md
│   │   │   │   ├── pandas/
│   │   │   │   │   └── index.md
│   │   │   │   ├── pytorch/
│   │   │   │   │   └── index.md
│   │   │   │   └── scikit/
│   │   │   │       └── index.md
│   │   │   ├── publications/
│   │   │   │   ├── _index.md
│   │   │   │   ├── conference-paper/
│   │   │   │   │   ├── cite.bib
│   │   │   │   │   └── index.md
│   │   │   │   ├── journal-article/
│   │   │   │   │   ├── cite.bib
│   │   │   │   │   └── index.md
│   │   │   │   └── preprint/
│   │   │   │       └── index.md
│   │   │   └── slides/
│   │   │       └── example/
│   │   │           └── index.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── layouts/
│   │   │   └── _partials/
│   │   │       └── hooks/
│   │   │           └── head-end/
│   │   │               └── github-button.html
│   │   ├── netlify.toml
│   │   └── package.json
│   ├── data-science-blog/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       ├── import-notebooks.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── media/
│   │   │       └── icons/
│   │   │           └── custom/
│   │   │               └── .gitkeep
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── languages.yaml
│   │   │       ├── menus.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   ├── authors/
│   │   │   │   └── _index.md
│   │   │   ├── blog/
│   │   │   │   ├── _index.md
│   │   │   │   ├── data-visualization/
│   │   │   │   │   ├── index.md
│   │   │   │   │   ├── line-chart.json
│   │   │   │   │   └── results.csv
│   │   │   │   ├── get-started/
│   │   │   │   │   └── index.md
│   │   │   │   ├── project-management/
│   │   │   │   │   └── index.md
│   │   │   │   ├── second-brain/
│   │   │   │   │   └── index.md
│   │   │   │   └── teach-courses/
│   │   │   │       └── index.md
│   │   │   ├── tags/
│   │   │   │   └── _index.md
│   │   │   └── uses.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── netlify.toml
│   │   ├── notebooks/
│   │   │   └── blog-with-jupyter.ipynb
│   │   └── package.json
│   ├── dev-portfolio/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── media/
│   │   │       └── icons/
│   │   │           └── custom/
│   │   │               └── .gitkeep
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── languages.yaml
│   │   │       ├── menus.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   ├── authors/
│   │   │   │   └── _index.md
│   │   │   ├── blog/
│   │   │   │   ├── _index.md
│   │   │   │   ├── building-rest-api/
│   │   │   │   │   └── index.md
│   │   │   │   ├── docker-deployment/
│   │   │   │   │   └── index.md
│   │   │   │   └── react-performance/
│   │   │   │       └── index.md
│   │   │   └── projects/
│   │   │       ├── _index.md
│   │   │       ├── ecommerce-platform/
│   │   │       │   └── index.md
│   │   │       ├── task-manager/
│   │   │       │   └── index.md
│   │   │       └── weather-app/
│   │   │           └── index.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── netlify.toml
│   │   └── package.json
│   ├── documentation/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .editorconfig
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── media/
│   │   │       └── icons/
│   │   │           └── custom/
│   │   │               └── .gitkeep
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── languages.yaml
│   │   │       ├── menus.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   ├── authors/
│   │   │   │   └── _index.md
│   │   │   ├── blog/
│   │   │   │   ├── _index.md
│   │   │   │   ├── v1.0.0/
│   │   │   │   │   └── index.md
│   │   │   │   └── v2.0.0/
│   │   │   │       └── index.md
│   │   │   ├── community/
│   │   │   │   └── index.md
│   │   │   ├── docs/
│   │   │   │   ├── _index.md
│   │   │   │   ├── getting-started.md
│   │   │   │   ├── guide/
│   │   │   │   │   ├── _index.md
│   │   │   │   │   ├── configuration.md
│   │   │   │   │   ├── project-structure.md
│   │   │   │   │   └── shortcodes/
│   │   │   │   │       ├── _index.md
│   │   │   │   │       ├── button.md
│   │   │   │   │       ├── callout.md
│   │   │   │   │       ├── cards.md
│   │   │   │   │       ├── steps.md
│   │   │   │   │       └── toggle.md
│   │   │   │   └── reference/
│   │   │   │       ├── _index.md
│   │   │   │       ├── customization.md
│   │   │   │       └── i18n.md
│   │   │   └── showcase/
│   │   │       ├── _index.md
│   │   │       └── nvidia/
│   │   │           └── index.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── netlify.toml
│   │   ├── package.json
│   │   ├── static/
│   │   │   └── uploads/
│   │   │       └── .gitkeep
│   │   └── theme.toml
│   ├── link-in-bio/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── media/
│   │   │       └── icons/
│   │   │           └── custom/
│   │   │               └── .gitkeep
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── languages.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   └── authors/
│   │   │       └── _index.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── layouts/
│   │   │   └── _partials/
│   │   │       └── hooks/
│   │   │           └── body-end/
│   │   │               └── change-background-color.html
│   │   ├── netlify.toml
│   │   └── package.json
│   ├── markdown-slides/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── menus.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   └── slides/
│   │   │       ├── _index.md
│   │   │       ├── example/
│   │   │       │   └── index.md
│   │   │       ├── hugo-static-sites/
│   │   │       │   └── index.md
│   │   │       └── ml-research-overview/
│   │   │           └── index.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── netlify.toml
│   │   └── package.json
│   ├── resume/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── media/
│   │   │       └── icons/
│   │   │           └── custom/
│   │   │               └── .gitkeep
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── languages.yaml
│   │   │       ├── menus.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   └── authors/
│   │   │       └── _index.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── netlify.toml
│   │   └── package.json
│   └── startup-landing-page/
│       ├── .devcontainer/
│       │   └── devcontainer.json
│       ├── .github/
│       │   ├── FUNDING.yml
│       │   └── workflows/
│       │       ├── build.yml
│       │       ├── deploy.yml
│       │       └── upgrade.yml
│       ├── .gitignore
│       ├── .vscode/
│       │   └── extensions.json
│       ├── LICENSE.md
│       ├── README.md
│       ├── assets/
│       │   └── media/
│       │       └── icons/
│       │           └── custom/
│       │               └── .gitkeep
│       ├── config/
│       │   └── _default/
│       │       ├── hugo.yaml
│       │       ├── languages.yaml
│       │       ├── menus.yaml
│       │       ├── module.yaml
│       │       └── params.yaml
│       ├── content/
│       │   ├── _index.md
│       │   ├── authors/
│       │   │   ├── _content.gotmpl
│       │   │   └── _index.md
│       │   ├── blog/
│       │   │   ├── _index.md
│       │   │   ├── data-visualization/
│       │   │   │   ├── index.md
│       │   │   │   ├── line-chart.json
│       │   │   │   └── results.csv
│       │   │   ├── get-started/
│       │   │   │   └── index.md
│       │   │   ├── project-management/
│       │   │   │   └── index.md
│       │   │   ├── second-brain/
│       │   │   │   └── index.md
│       │   │   └── teach-courses/
│       │   │       └── index.md
│       │   ├── changelog/
│       │   │   ├── _index.md
│       │   │   ├── v1.0/
│       │   │   │   └── index.md
│       │   │   └── v1.1/
│       │   │       └── index.md
│       │   ├── privacy.md
│       │   └── terms.md
│       ├── data/
│       │   └── authors/
│       │       └── me.yaml
│       ├── go.mod
│       ├── hugoblox.yaml
│       ├── netlify.toml
│       ├── package.json
│       └── theme.toml
├── test/
│   ├── config.yaml
│   ├── content/
│   │   ├── _index.md
│   │   └── linked/
│   │       └── index.md
│   ├── data/
│   │   ├── blocks/
│   │   │   ├── features_basic.yaml
│   │   │   └── hero_basic.yaml
│   │   └── pages/
│   │       └── home.yaml
│   ├── go.mod
│   └── package.json
└── vite.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .cursorindexingignore
================================================

# Don't index SpecStory auto-save files, but allow explicit context inclusion via @ references
.specstory/**


================================================
FILE: .devcontainer/base.Dockerfile
================================================
# syntax=docker/dockerfile:1.5
# HugoBlox devcontainer base image

FROM mcr.microsoft.com/devcontainers/go:1.22-bookworm

ARG NODE_VERSION=20
ARG PNPM_VERSION=10.14.0
ARG HUGO_VERSION=0.152.2

ENV DEBIAN_FRONTEND=noninteractive
ENV PNPM_HOME=/home/vscode/.local/share/pnpm
ENV PATH=${PNPM_HOME}:/usr/local/go/bin:${PATH}

USER root

RUN set -eux; \
    apt-get update; \
    apt-get install -y --no-install-recommends ca-certificates curl gnupg; \
    NODE_MAJOR="${NODE_VERSION%%.*}"; \
    curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | bash -; \
    apt-get install -y --no-install-recommends nodejs; \
    corepack enable; \
    corepack prepare "pnpm@${PNPM_VERSION}" --activate; \
    mkdir -p "${PNPM_HOME}"; \
    chown -R vscode:vscode "${PNPM_HOME}"; \
    ARCH="$(uname -m)"; \
    if [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "amd64" ]; then \
        HUGO_ARCH="amd64"; \
    elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then \
        HUGO_ARCH="arm64"; \
    else \
        echo "Unsupported architecture: ${ARCH}"; \
        exit 1; \
    fi; \
    HUGO_PKG="hugo_extended_${HUGO_VERSION}_Linux-${HUGO_ARCH}.tar.gz"; \
    curl -fsSL -o "/tmp/${HUGO_PKG}" "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/${HUGO_PKG}"; \
    tar -xzf "/tmp/${HUGO_PKG}" -C /tmp hugo; \
    install -m 0755 /tmp/hugo /usr/local/bin/hugo; \
    rm -rf "/tmp/${HUGO_PKG}" /tmp/hugo; \
    apt-get clean; \
    rm -rf /var/lib/apt/lists/*

USER vscode


================================================
FILE: .editorconfig
================================================
# editorconfig.org

root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.{yaml,yml}]
max_line_length = 150

[*.md]
trim_trailing_whitespace = false
max_line_length = off

[*.py]
indent_size = 4

[Makefile]
indent_style = tab

[*.go]
indent_style = tab
tab_width = 8

[{**/layouts/_shortcodes/*.html, **/layouts/_markup/*.html}]
insert_final_newline = false


================================================
FILE: .github/CLA.md
================================================
# HugoBlox Contributor License Agreement

By contributing to this project, you agree to the following terms:

1.  **Grant of License:** You grant to **George Cushen ("HugoBlox")** a perpetual, worldwide, royalty-free, and irrevocable license to use, modify, reproduce, distribute, and re-license your contributions for any purpose, including in commercial products.

2.  **No Warranty:** You provide your contributions "AS IS" and WITHOUT ANY WARRANTY OR CONDITION. As far as the law allows, you will not be liable for any damages related to your contributions or this agreement.

3.  **Your Representation:** You confirm that you are legally entitled to grant this license and that your contribution is your original work.


================================================
FILE: .github/CODEOWNERS
================================================
# CODEOWNERS helps route reviews automatically.
# Update these owners to the correct team(s) as needed.

* @gcushen

# Core theme and modules
modules/** @gcushen

# Starters
starters/** @gcushen




================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
# Code of Conduct

We want to foster a positive, inclusive, and welcoming environment 💜

We expect you to follow our [Code of Conduct](https://docs.hugoblox.com/reference/contribute/) to fulfil this goal.


================================================
FILE: .github/FUNDING.yml
================================================
github: gcushen
custom: https://hugoblox.com/sponsor/


================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.yml
================================================
name: 🐛 Bug Report
description: Something isn't working as expected? Report your bugs here.
labels: ['needs triage']
body:
  - type: markdown
    attributes:
      value: |
        # Welcome 👋

        Thanks for taking the time to fill out this bug report.

        We use GitHub Issues for project management, **NOT for support**.

        🚑 For **help** and **questions**, search if your question has already been asked on the community **[chat](https://discord.gg/z8wNYzb)** and **[forum](https://github.com/HugoBlox/kit/discussions)**, and if not, ask your question there instead.

        Bug reports also shouldn't be used for support requests about a specific problem in your site, only if the issue can be reproduced on a fresh HugoBlox Kit template.

        Also, you can search and browse the extensive [HugoBlox Kit](https://docs.hugoblox.com) and [Hugo](https://gohugo.io/documentation/) **documentation**.

        For questions on _RStudio/Blogdown_, please reach out to the [RStudio/Blogdown community](https://github.com/rstudio/blogdown).

        Please fill out each section below. This info allows HugoBlox Kit contributors to diagnose (and fix!) your issue as quickly as possible. Otherwise we might need to close the issue (e.g. when it's missing clear steps to reproduce).

        Also, please verify that your issue is present in the very latest `main` version.
  - type: checkboxes
    attributes:
      label: Preliminary Checks
      description: Please make sure that you verify each checkbox and follow the instructions for them.
      options:
        - label: "This issue is not a duplicate. Before opening a new issue, please search existing issues: https://github.com/HugoBlox/kit/issues?q=is%3Aissue"
          required: true
        - label: "This issue is not a question, feature request, or anything other than a bug report directly related to HugoBlox Kit. Please post those things on Discord: https://discord.gg/z8wNYzb"
          required: true
  - type: textarea
    attributes:
      label: Description
      description: Describe the issue that you're seeing.
      placeholder: Be as precise as you can. Feel free to share screenshots, videos, or data from the devtools of your browser.
    validations:
      required: true
  - type: input
    id: reproduction-link
    attributes:
      label: Reproduction Link
      placeholder: "https://github.com/username/repository-name/"
      description: |
        Link to a minimal reproduction of the issue (GitHub repository).

        **Ideally, create a minimal reproduction of the issue on a fresh template rather than linking to your site's repository: https://hugoblox.com/hugo-themes/
    validations:
      required: true
  - type: textarea
    attributes:
      label: Steps to Reproduce
      description: Clear steps describing how to reproduce the issue.
      value: |
        1.
        2.
        3.
        ...
    validations:
      required: true
  - type: textarea
    attributes:
      label: Expected Result
      description: Describe what you expected to happen.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Actual Result
      description: Describe what actually happened.
    validations:
      required: true
  - type: textarea
    attributes:
      label: What Hugo Module versions does your site use?
      description: Paste your `go.mod` here.
    validations:
      required: true
  - type: dropdown
    id: os
    attributes:
      label: What operating system(s) are you seeing the problem on?
      multiple: true
      options:
        - Windows
        - macOS
        - Android
        - iOS
        - Linux
    validations:
      required: true
  - type: dropdown
    id: browser
    attributes:
      label: What browser(s) are you seeing the problem on?
      multiple: true
      options:
        - Chrome
        - Safari
        - Firefox
        - Microsoft Edge
        - Other
  - type: input
    id: hb-tpl
    attributes:
      label: Which Hugo Blox template are you using?
      description: 'For example, a template from https://hugoblox.com/templates/'
      placeholder: 'e.g., Academic CV'
    validations:
      required: true
  - type: input
    id: version-hugo
    attributes:
      label: What version of Hugo are you using?
      description: 'Run `hugo version` or check your `netlify.toml`'
      placeholder: 'Hugo Extended 0.101.0'
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: 💬 Contributing chat (Discord)
    url: https://discord.gg/z8wNYzb
    about: Ask quick questions in the Contributing channel and coordinate with Geo & contributors.

  - name: 🧪 Troubleshooting Guide
    url: https://docs.hugoblox.com/reference/troubleshooting/
    about: Fix common issues fast and follow the reproducible-issue checklist before filing.

  - name: 🏷️ Help-wanted issues (good first tasks)
    url: https://github.com/HugoBlox/kit/labels/help%20wanted
    about: Pick a bite-sized task and open your first PR in minutes.

  - name: 🧭 Contributing Guide
    url: https://github.com/HugoBlox/kit/blob/main/CONTRIBUTING.md
    about: How we work, environment setup, style, and PR tips.

  - name: 🧵 Discussions (Q&A, ideas)
    url: https://github.com/HugoBlox/kit/discussions
    about: Ask for help, propose features, or share learnings.

  - name: 📚 Documentation
    url: https://docs.hugoblox.com/
    about: Explore all Hugo Blox docs, tutorials, and references.

  - name: 💚 Support Hugo Blox (All Access)
    url: https://hugoblox.com/all-access
    about: Too busy to contribute? Support development and get lifetime template updates.

  - name: 🫶 Sponsor on GitHub
    url: https://github.com/sponsors/gcushen
    about: Prefer monthly or one-time sponsorship via GitHub.


================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.yml
================================================
name: 🚀 Feature request
description: Suggest an improvement.
labels: [proposal]
assignees: []
body:
- type: checkboxes
  attributes:
    label: Prerequisites
    description: Take a minute to help our open source contributors.
    options:
    - label: I have [searched](https://github.com/HugoBlox/kit/issues?q=is%3Aissue) for duplicate or closed feature requests
      required: true
    - label: I am mindful of the project [scope](https://github.com/HugoBlox/kit/blob/main/CONTRIBUTING.md#scope)
      required: true
- type: textarea
  id: proposal
  attributes:
    label: Proposal
    description: Provide detailed information for what we should add, including relevant links to screenshots, code, or live demos whenever possible.
  validations:
    required: true
- type: textarea
  id: motivation
  attributes:
    label: Motivation and context
    description: Tell us why this change is needed or helpful, and what problems it may help solve.
  validations:
    required: true


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
### 🚀 What type of change is this?

- [ ] 🐛 **Bug fix** (A non-breaking change that fixes an issue)
- [ ] ✨ **New feature** (A non-breaking change that adds functionality)
- [ ] 💅 **Style change** (A change that only affects formatting, visuals, or styling)
- [ ] 📚 **Documentation update** (Changes to documentation only)
- [ ] 🧹 **Refactor or chore** (A code change that neither fixes a bug nor adds a feature)
- [ ] 💥 **Breaking change** (A fix or feature that would cause existing functionality to not work as expected)

---

### 🎯 What is the purpose of this change?

---

### 📸 Screenshots or Screencast (if applicable)

---

### ℹ️ Documentation Check

- [ ] No, this change does not require a documentation update.
- [ ] Yes, I have updated the documentation accordingly (or will in a follow-up PR).

---

### 📜 Contributor Agreement

**Thank you for your contribution!**

- [ ] By checking this box, I confirm that I have read and agree to the [HugoBlox Contributor License Agreement (CLA)](/.github/CLA.md).


================================================
FILE: .github/SECURITY.md
================================================
# Security Policy

We take security seriously and appreciate responsible disclosures.

## Supported Versions

We generally support the latest release of Hugo Blox modules and starters. Security fixes may be backported at the maintainers' discretion.

## Reporting a Vulnerability

- Do not open a public issue.
- Instead, open a private GitHub Security Advisory for this repository (Security tab → Report a vulnerability).
- If you cannot access advisories, email the maintainers via the repository's contact links on GitHub.

Please include:

- A clear description and minimal reproduction
- Impact assessment and potential exploit scenario
- Suggested remediation, if known

We will acknowledge receipt within 72 hours and keep you updated.

## Scope

- This repository and official Hugo Blox modules/starters
- Third-party templates and plugins are out of scope

Thank you for helping keep the community safe.


================================================
FILE: .github/SUPPORT.md
================================================
# Support

Need help? Here’s how to get support efficiently:

- Discord: https://discord.gg/z8wNYzb
- GitHub Discussions: https://github.com/HugoBlox/kit/discussions
- Docs & Guides: https://docs.hugoblox.com/
- Issues: use for confirmed bugs or well-scoped feature requests only

Tips for fast responses:

- Share versions (Hugo, module, OS) and a minimal reproduction
- Paste relevant logs/console output
- State expected vs actual behavior
- Attach screenshots to visually explain the issue

Pro support & templates:

- Pro templates: https://hugoblox.com/pricing
- Pro Discord Channel (request to be added): https://discord.gg/z8wNYzb


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  # Update GitHub Actions
  - package-ecosystem: 'github-actions'
    directory: '/'
    schedule:
      interval: 'weekly'
    open-pull-requests-limit: 10
    labels:
      - 'dependencies'
      - 'github-actions'
    commit-message:
      prefix: 'ci'
      include: 'scope'

  # Update GitHub Actions in main starter template (academic-cv)
  # Other starters can be manually updated from this template
  - package-ecosystem: 'github-actions'
    directory: '/starters/academic-cv'
    schedule:
      interval: 'weekly'
    open-pull-requests-limit: 3
    labels:
      - 'dependencies'
      - 'starters'
      - 'template'
    commit-message:
      prefix: 'ci'
      include: 'scope'


================================================
FILE: .github/labeler.yml
================================================
documentation:
  - changed-files:
      - any-glob-to-any-file: "**/*.md"

ci:
  - changed-files:
      - any-glob-to-any-file: ".github/workflows/**"

modules:
  - changed-files:
      - any-glob-to-any-file: "modules/**"

starters:
  - changed-files:
      - any-glob-to-any-file: "starters/**"

config:
  - changed-files:
      - any-glob-to-any-file:
          - "package.json"
          - "pnpm-lock.yaml"
          - "biome.json"
          - ".stylelintrc.yaml"
          - "vite.config.js"


================================================
FILE: .github/workflows/ci-build-starters-matrix.yml
================================================
name: CI - Build Starters Matrix
run-name: ${{ github.workflow }} - ${{ github.ref_name }}

on:
    schedule:
        - cron: "0 2 * * *"
    workflow_dispatch:
    push:
        branches: [main]
        paths:
            - "modules/**"
            - "templates/**"
            - "test/**"
            - "scripts/**"
            - "package.json"
            - "pnpm-lock.yaml"
            - "biome.json"
            - "vite.config.js"
    pull_request:
        types:
            - opened
            - reopened
            - synchronize
            - ready_for_review
        paths:
            - "modules/**"
            - "templates/**"
            - "test/**"
            - "scripts/**"
            - "package.json"
            - "pnpm-lock.yaml"
            - "biome.json"
            - "vite.config.js"

permissions:
    contents: read

concurrency:
    group: templates-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
    cancel-in-progress: true

env:
    NODE_VERSION: "22"

jobs:
    build-templates:
        runs-on: ubuntu-latest
        strategy:
            fail-fast: false
            matrix:
                starter:
                    - name: academic-cv
                      path: templates/academic-cv
                    - name: startup-landing-page
                      path: templates/startup-landing-page
                    - name: dev-portfolio
                      path: templates/dev-portfolio

        steps:
            - name: Checkout
              uses: actions/checkout@v6
              with:
                  submodules: true
                  fetch-depth: 0

            - name: Compute resources cache key
              id: reskey
              run: |
                  set -euo pipefail
                  P=${{ matrix.starter.path }}
                  # Hash tracked files under assets/config and key files for invalidation
                  HASH=$(git ls-files -s "$P/assets" "$P/config" "$P/hugoblox.yaml" "$P/package.json" 2>/dev/null | sha256sum | cut -d' ' -f1 || true)
                  if [ -z "$HASH" ]; then HASH="nohash"; fi
                  echo "key=${{ runner.os }}-hugo-resources-${{ matrix.starter.name }}-$HASH" >> $GITHUB_OUTPUT

            - name: Cache Hugo resources (starter)
              uses: actions/cache@v5
              with:
                  path: ${{ matrix.starter.path }}/resources/
                  key: ${{ steps.reskey.outputs.key }}
                  restore-keys: |
                      ${{ runner.os }}-hugo-resources-${{ matrix.starter.name }}-

            - name: Enable Corepack (for pnpm cache)
              run: corepack enable

            - name: Setup Node.js
              uses: actions/setup-node@v6
              with:
                  node-version: "${{ env.NODE_VERSION }}"
                  cache: "pnpm"

            - name: Activate pnpm from root package.json
              run: pnpm --version

            - name: Install template dependencies
              working-directory: ${{ matrix.starter.path }}
              # Don't use --frozen-lockfile as starters have auto-generated package.json with simple deps (Tailwind CLI)
              # and may not have lock files checked into the repo
              run: pnpm install --no-frozen-lockfile

            - name: Read Hugo version from template
              id: hugo
              run: |
                  set -euo pipefail
                  P=${{ matrix.starter.path }}
                  VERSION=$(grep -E "^\s*hugo_version:\s*['\"]?" "$P/hugoblox.yaml" | sed -E "s/.*hugo_version:\s*['\"]?([^'\"]+)['\"]?.*/\1/")
                  if [ -z "$VERSION" ]; then
                    echo "::error::Could not read hugo_version from $P/hugoblox.yaml"
                    exit 1
                  fi
                  echo "version=$VERSION" >> $GITHUB_OUTPUT

            - name: Setup Hugo
              uses: peaceiris/actions-hugo@v3
              with:
                  hugo-version: "${{ steps.hugo.outputs.version }}"
                  extended: true

            - name: Build ${{ matrix.starter.name }}
              working-directory: ${{ matrix.starter.path }}
              run: hugo --minify --panicOnWarning

    smoke-test-latest:
        name: Test site on latest Hugo (allowed to fail)
        runs-on: ubuntu-latest
        continue-on-error: true
        steps:
            - name: Checkout
              uses: actions/checkout@v6
              with:
                  submodules: true
                  fetch-depth: 0

            - name: Enable Corepack (for pnpm cache)
              run: corepack enable

            - name: Setup Node.js
              uses: actions/setup-node@v6
              with:
                  node-version: "${{ env.NODE_VERSION }}"
                  cache: "pnpm"

            - name: Install root dependencies
              run: pnpm install --no-frozen-lockfile

            - name: Install test dependencies
              working-directory: test
              run: pnpm install --no-frozen-lockfile

            - name: Cache Hugo resources (test)
              uses: actions/cache@v5
              with:
                  path: test/resources/
                  key: ${{ runner.os }}-hugo-resources-test-${{ hashFiles('test/assets/**/*', 'test/config.yaml', 'test/package.json') }}
                  restore-keys: |
                      ${{ runner.os }}-hugo-resources-test-

            - name: Setup Hugo (latest)
              uses: peaceiris/actions-hugo@v3
              with:
                  hugo-version: latest
                  extended: true

            - name: Build test site (latest)
              working-directory: test
              run: hugo --minify --panicOnWarning --templateMetrics --templateMetricsHints

    canary-academic-latest:
        name: academic-cv on latest Hugo (allowed to fail)
        runs-on: ubuntu-latest
        continue-on-error: true
        steps:
            - name: Checkout
              uses: actions/checkout@v6
              with:
                  submodules: true
                  fetch-depth: 0

            - name: Enable Corepack (for pnpm cache)
              run: corepack enable

            - name: Setup Node.js
              uses: actions/setup-node@v6
              with:
                  node-version: "${{ env.NODE_VERSION }}"
                  cache: "pnpm"

            - name: Install template dependencies
              working-directory: templates/academic-cv
              run: pnpm install --no-frozen-lockfile

            - name: Cache Hugo resources (template)
              uses: actions/cache@v5
              with:
                  path: templates/academic-cv/resources/
                  key: ${{ runner.os }}-hugo-resources-academic-latest-${{ hashFiles('templates/academic-cv/assets/**/*', 'templates/academic-cv/config/**/*', 'templates/academic-cv/hugoblox.yaml', 'templates/academic-cv/package.json') }}
                  restore-keys: |
                      ${{ runner.os }}-hugo-resources-academic-latest-

            - name: Setup Hugo (latest)
              uses: peaceiris/actions-hugo@v3
              with:
                  hugo-version: latest
                  extended: true

            - name: Build academic-cv (latest)
              working-directory: templates/academic-cv
              run: hugo --minify --panicOnWarning

    smoke-test-min:
        name: Test site on minimum supported Hugo
        runs-on: ubuntu-latest
        steps:
            - name: Checkout
              uses: actions/checkout@v6
              with:
                  submodules: true
                  fetch-depth: 0

            - name: Enable Corepack (for pnpm cache)
              run: corepack enable

            - name: Setup Node.js
              uses: actions/setup-node@v6
              with:
                  node-version: "${{ env.NODE_VERSION }}"
                  cache: "pnpm"

            - name: Install root dependencies
              run: pnpm install --no-frozen-lockfile

            - name: Install test dependencies
              working-directory: test
              run: pnpm install --no-frozen-lockfile

            - name: Read minimum Hugo version from framework
              id: min
              run: |
                  set -euo pipefail
                  VERSION=$(grep -E "^[[:space:]]*min:[[:space:]]*['\"]?" modules/blox/hugo.yaml | head -n1 | sed -E "s/.*min:[[:space:]]*['\"]?([^'\"#]+).*/\\1/")
                  if [ -z "$VERSION" ]; then
                    echo "::error::Could not read module.hugoVersion.min from modules/blox/hugo.yaml"
                    exit 1
                  fi
                  echo "version=$VERSION" >> $GITHUB_OUTPUT

            - name: Cache Hugo resources (test - min)
              uses: actions/cache@v5
              with:
                  path: test/resources/
                  key: ${{ runner.os }}-hugo-resources-test-min-${{ steps.min.outputs.version }}-${{ hashFiles('test/assets/**/*', 'test/config.yaml', 'test/package.json') }}
                  restore-keys: |
                      ${{ runner.os }}-hugo-resources-test-min-

            - name: Setup Hugo (min)
              uses: peaceiris/actions-hugo@v3
              with:
                  hugo-version: "${{ steps.min.outputs.version }}"
                  extended: true

            - name: Build test site (min)
              working-directory: test
              run: hugo --minify --panicOnWarning --templateMetrics --templateMetricsHints


================================================
FILE: .github/workflows/ci-lint.yml
================================================
name: CI - Lint
run-name: ${{ github.workflow }} - ${{ github.ref_name }}

on:
  push:
    branches: [main]
    paths:
      - "modules/**"
      - "test/**"
      - "scripts/**"
      - "package.json"
      - "pnpm-lock.yaml"
      - "biome.json"
      - "vite.config.js"
  pull_request:
    branches: [main]
    paths:
      - "modules/**"
      - "test/**"
      - "scripts/**"
      - "package.json"
      - "pnpm-lock.yaml"
      - "biome.json"
      - "vite.config.js"

permissions:
  contents: read

concurrency:
  group: lint-${{ github.ref }}
  cancel-in-progress: true

env:
  NODE_VERSION: "22"

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Enable Corepack (for pnpm cache)
        run: corepack enable
      - uses: actions/setup-node@v6
        with:
          node-version: "${{ env.NODE_VERSION }}"
          cache: "pnpm"
      - name: Activate pnpm from root package.json
        run: pnpm --version
      - name: Install dependencies
        run: pnpm install --frozen-lockfile
      - name: Lint (Biome + Stylelint)
        run: pnpm run lint


================================================
FILE: .github/workflows/ci-pr-labeler.yml
================================================
name: CI - PR Labeler
run-name: ${{ github.workflow }} - ${{ github.ref_name }}

on:
  pull_request_target:
    types: [opened, synchronize]

permissions:
  contents: read
  pull-requests: write

jobs:
  label:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/labeler@v6
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          configuration-path: .github/labeler.yml


================================================
FILE: .github/workflows/codeql.yml
================================================
name: Security - CodeQL
run-name: ${{ github.workflow }} - ${{ github.ref_name }}

on:
  schedule:
    - cron: "0 3 * * 0"
  push:
    branches: [main]
    paths:
      - "**/*.js"
      - "**/*.jsx"
      - "**/*.ts"
      - "**/*.tsx"
      - "**/*.py"
      - ".github/workflows/codeql.yml"
  pull_request:
    branches: [main]
    paths:
      - "**/*.js"
      - "**/*.jsx"
      - "**/*.ts"
      - "**/*.tsx"
      - "**/*.py"

permissions:
  actions: read
  contents: read
  security-events: write

jobs:
  analyze:
    name: Analyze (CodeQL)
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v4
        with:
          languages: "javascript-typescript,python"

      - name: Autobuild
        uses: github/codeql-action/autobuild@v4

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v4
        with:
          category: "/language:javascript-typescript"


================================================
FILE: .github/workflows/community-welcome.yml
================================================
name: Community - Welcome New Contributor
run-name: ${{ github.workflow }} - ${{ github.ref_name }}

on:
    pull_request_target:
        types:
            - opened
    issues:
        types:
            - opened

permissions:
    contents: read
    issues: write
    pull-requests: write

jobs:
    greeting:
        runs-on: ubuntu-latest
        steps:
            - uses: actions/first-interaction@v3
              with:
                  repo_token: ${{ secrets.GITHUB_TOKEN }}
                  issue_message: >
                      Hey, thanks for your first issue! 🚀 Your feedback is vital for improving the project for everyone.


                      Feeling empowered? Squashing this bug yourself could be a great first open-source contribution! We're here to help you. Here's our [Contributor Guide](https://github.com/HugoBlox/kit/blob/main/CONTRIBUTING.md).


                      Let's connect on [Discord](https://discord.gg/z8wNYzb) to chat about it. We've got a super helpful community!
                  pr_message: >
                      Wow, your first PR! Welcome to the community! 🎉


                      Thank you for this contribution to open source and open research. It makes a huge impact for the thousands of innovators building with Hugo Blox.


                      If you're wondering about next steps, please read our [Contributor Guide](https://github.com/HugoBlox/kit/blob/main/CONTRIBUTING.md) for coding standards, how to run the project locally, and how to get help.


                      We hope this is just the start of your journey with us. Let's build the future together! Join us on [Discord](https://discord.gg/z8wNYzb) to connect with the team and community.


                      Awesome work, we'll take a look soon! ✨


================================================
FILE: .github/workflows/devcontainer-image.yml
================================================
name: Build HugoBlox devcontainer image

on:
  push:
    branches: [main]
    paths:
      - ".devcontainer/base.Dockerfile"
      - ".github/workflows/devcontainer-image.yml"
  workflow_dispatch:
    inputs:
      hugo_versions:
        description: "Comma-separated Hugo versions to build (e.g. 0.152.2,0.154.0)"
        required: false

env:
  IMAGE_NAME: ghcr.io/hugoblox/hugo-blox-dev
  DEFAULT_HUGO_VERSION: 0.152.2
  NODE_VERSION: 20
  PNPM_VERSION: 10.14.0

jobs:
  prepare-matrix:
    runs-on: ubuntu-latest
    outputs:
      versions: ${{ steps.versions.outputs.matrix }}
    steps:
      - name: Select Hugo versions
        id: versions
        env:
          VERSIONS: ${{ github.event.inputs.hugo_versions || env.DEFAULT_HUGO_VERSION }}
        run: |
          MATRIX=$(python - <<'PY'
          import os, json
          versions = [v.strip() for v in os.environ["VERSIONS"].split(",") if v.strip()]
          print(json.dumps(versions))
          PY
          )
          echo "matrix=${MATRIX}" >> "$GITHUB_OUTPUT"

  build-and-push:
    needs: prepare-matrix
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    strategy:
      fail-fast: false
      matrix:
        hugo: ${{ fromJson(needs.prepare-matrix.outputs.versions) }}
    steps:
      - name: Checkout
        uses: actions/checkout@v6

      - name: Log in to GHCR
        uses: docker/login-action@v4
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Compute tags
        id: tags
        env:
          HUGO_VERSION: ${{ matrix.hugo }}
        run: |
          TAGS="${IMAGE_NAME}:hugo${HUGO_VERSION}"
          if [ "${HUGO_VERSION}" = "${DEFAULT_HUGO_VERSION}" ]; then
            TAGS="${TAGS}\n${IMAGE_NAME}:latest"
          fi
          {
            echo "list<<EOF"
            printf "%b\n" "$TAGS"
            echo "EOF"
          } >> "$GITHUB_OUTPUT"

      - name: Build and push image
        uses: docker/build-push-action@v7
        with:
          context: .
          file: .devcontainer/base.Dockerfile
          push: true
          build-args: |
            HUGO_VERSION=${{ matrix.hugo }}
            NODE_VERSION=${{ env.NODE_VERSION }}
            PNPM_VERSION=${{ env.PNPM_VERSION }}
          tags: ${{ steps.tags.outputs.list }}


================================================
FILE: .github/workflows/maintenance-stale.yml
================================================
name: "Maintenance - Close Stale Issues and PRs"
run-name: ${{ github.workflow }} - ${{ github.ref_name }}
on:
  schedule:
    - cron: "30 1 * * *"

permissions:
  contents: write # only for delete-branch option
  issues: write
  pull-requests: write

jobs:
  stale:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/stale@v10
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          stale-issue-message: |
            This issue is stale because it has not had any recent activity. The resources of the project maintainers are limited, and so we are asking for your help.

            If this is a **bug** and you can still reproduce this error on the <code>main</code> branch, consider contributing a Pull Request with a fix.

            If this is a **feature request**, and you feel that it is still relevant and valuable, consider contributing a Pull Request for review.

            This issue will automatically close soon if no further activity occurs. Thank you for your contributions.
          stale-pr-message: |
            This PR is stale because it has not had any recent activity. The resources of the project maintainers are limited, and so we are asking for your help.

            If you feel that the PR is still relevant in the latest release, consider making the PR easier to review and finding developers to help review the PR.

            Please be _mindful_ that although we encourage PRs, we cannot expand the scope of the project in every possible direction. There will be requests that don't make the roadmap.

            This PR will automatically close soon if no further activity occurs. Thank you for your contributions.
          days-before-stale: 30
          days-before-close: 5
          stale-issue-label: stale
          stale-pr-label: stale
          exempt-issue-labels: "keep,enhancement,bug,documentation"
          exempt-pr-labels: "keep,enhancement,bug,documentation"


================================================
FILE: .github/workflows/release-hugoblox-modules.yml
================================================
name: Release - HugoBlox Modules
run-name: ${{ github.workflow }} - ${{ github.ref_name }}

on:
    workflow_dispatch:
        inputs:
            dry_run:
                description: "Run without committing/tagging"
                type: boolean
                default: true
            propagate:
                description: "Propagate dependency bumps to dependents"
                type: boolean
                default: true
            update_templates_to_commits:
                description: "Update templates to use latest module commits instead of tagged versions"
                type: boolean
                default: false

permissions:
    contents: write

concurrency:
    group: release-modules
    cancel-in-progress: false

jobs:
    release:
        runs-on: ubuntu-latest
        env:
            LOG_LEVEL: INFO
        steps:
            - name: Checkout
              uses: actions/checkout@v6
              with:
                  fetch-depth: 0

            - name: Set up Python
              uses: actions/setup-python@v6
              with:
                  python-version: "3.13"

            - name: Install Poetry
              uses: snok/install-poetry@v1
              with:
                  version: 1.8.3
                  virtualenvs-create: true
                  virtualenvs-in-project: true

            - name: Install dependencies
              run: |
                  poetry --version
                  poetry install --no-interaction --no-ansi

            - name: Configure Git identity
              run: |
                  git config user.name "github-actions[bot]"
                  git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

            # Skip plan display when updating templates to commits as it's not relevant for that operation
            - name: Show plan (dry run)
              if: ${{ inputs.dry_run && !inputs.update_templates_to_commits }}
              run: |
                  poetry run python scripts/release_modules.py --print-plan --log-level $LOG_LEVEL

            # Dedicated step for updating templates to use latest commits instead of tagged versions
            # Only runs when specifically requested and not in dry run mode
            - name: Update templates to commits
              if: ${{ inputs.update_templates_to_commits && !inputs.dry_run }}
              run: |
                  poetry run python scripts/release_modules.py --yes --update-starters-to-commits --log-level $LOG_LEVEL

            # Standard release process - only runs when not in dry run mode and not updating templates to commits
            # These operations are mutually exclusive - we either do a normal release or update starters to commits
            - name: Release (commit, tag, push)
              if: ${{ !inputs.dry_run && !inputs.update_templates_to_commits }}
              run: |
                  if [ "${{ inputs.propagate }}" = "true" ]; then
                    poetry run python scripts/release_modules.py --yes --propagate --log-level $LOG_LEVEL
                  else
                    poetry run python scripts/release_modules.py --yes --no-propagate --log-level $LOG_LEVEL
                  fi


================================================
FILE: .github/workflows/release-package-splitter.yml
================================================
name: "Release - Package Splitter"
run-name: ${{ github.workflow }} - ${{ github.ref_name }}

on:
    push:
        branches:
            - main
    workflow_dispatch:
        inputs:
            force_all:
                description: "Force split/push of all template repos, even if no changes detected"
                required: false
                type: boolean
                default: false
    # IMPORTANT: workflows below must match the upstream workflow's `name:` exactly
    workflow_run:
        workflows:
            - Release - HugoBlox Modules
        types:
            - completed

env:
    GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}

jobs:
    determine_changed:
        runs-on: ubuntu-latest
        outputs:
            matrix: ${{ steps.set-matrix.outputs.matrix }}
            has_changes: ${{ steps.set-matrix.outputs.has_changes }}

        steps:
            - uses: actions/checkout@v6
              with:
                  fetch-depth: 0

            - id: changed
              # Only run change detection for push events
              if: ${{ github.event_name == 'push' }}
              uses: tj-actions/changed-files@v47
              with:
                  files: |
                      templates/academic-cv/**
                      templates/resume/**
                      templates/blog/**
                      templates/documentation/**
                      templates/link-in-bio/**
                      templates/landing-page/**
                      templates/dev-portfolio/**
                      templates/markdown-slides/**
                  dir_names: true
                  dir_names_max_depth: 2
                  dir_names_exclude_current_dir: true

            # Build dynamic matrix
            - name: Build dynamic matrix
              id: set-matrix
              env:
                  CHANGED_DIRS: ${{ steps.changed.outputs.dir_names || '' }}
                  FORCE_ALL: ${{ github.event.inputs.force_all || 'false' }}
              run: |
                  # Define the full mapping
                  declare -A STARTER_MAP=(
                    ["templates/academic-cv"]="hugo-theme-academic-cv"
                    ["templates/resume"]="hugo-theme-resume"
                    ["templates/data-science-blog"]="hugo-theme-data-science-blog"
                    ["templates/documentation"]="hugo-theme-documentation"
                    ["templates/link-in-bio"]="hugo-theme-link-in-bio"
                    ["templates/startup-landing-page"]="hugo-theme-startup-landing-page"
                    ["templates/dev-portfolio"]="hugo-theme-developer-portfolio"
                    ["templates/markdown-slides"]="hugo-theme-markdown-slides"
                  )

                  build_full_matrix() {
                    local JSON="[" FIRST=true
                    local ROOTS=()

                    # Sort keys to keep output stable across runs
                    readarray -t ROOTS < <(printf "%s\n" "${!STARTER_MAP[@]}" | sort)

                    for ROOT in "${ROOTS[@]}"; do
                      if [ "$FIRST" = true ]; then
                        FIRST=false
                      else
                        JSON+=","
                      fi
                      JSON+="{\"local_path\":\"$ROOT\",\"split_repository\":\"${STARTER_MAP[$ROOT]}\"}"
                    done

                    JSON+="]"
                    echo "$JSON"
                  }

                  # Manual override to force splitting all templates
                  if [ "$FORCE_ALL" = "true" ]; then
                    echo "Force mode enabled; splitting all templates"
                    FULL_MATRIX=$(build_full_matrix)
                    echo "matrix=$FULL_MATRIX" >> "$GITHUB_OUTPUT"
                    echo "has_changes=true" >> "$GITHUB_OUTPUT"
                    exit 0
                  fi

                  # For non-push events, always use full matrix derived from the map above
                  if [ "${{ github.event_name }}" != "push" ]; then
                    echo "Using full matrix for ${{ github.event_name }} event"
                    FULL_MATRIX=$(build_full_matrix)
                    echo "matrix=$FULL_MATRIX" >> "$GITHUB_OUTPUT"
                    echo "has_changes=true" >> "$GITHUB_OUTPUT"
                    exit 0
                  fi

                  echo "Detected template directories: $CHANGED_DIRS"

                  # If no changes, set empty matrix
                  if [ -z "$CHANGED_DIRS" ]; then
                    echo "No templates changed"
                    echo "matrix=[]" >> "$GITHUB_OUTPUT"
                    echo "has_changes=false" >> "$GITHUB_OUTPUT"
                    exit 0
                  fi

                  # Build JSON array for changed templates
                  JSON="["
                  FIRST=true
                  # tj-actions outputs space-separated list
                  for DIR in $CHANGED_DIRS; do
                    # Normalize potential trailing slash
                    DIR="${DIR%/}"

                    # Collapse to the template root (first two path segments), e.g. templates/landing-page
                    IFS='/' read -r SEG1 SEG2 _ <<< "$DIR"
                    if [[ -n "$SEG1" && -n "$SEG2" ]]; then
                      ROOT="$SEG1/$SEG2"
                    else
                      ROOT="$DIR"
                    fi

                    # Only process if it's a known starter
                    if [[ -n "${STARTER_MAP[$ROOT]}" ]]; then
                      if [ "$FIRST" = true ]; then
                        FIRST=false
                      else
                        JSON+=","
                      fi
                      JSON+="{\"local_path\":\"$ROOT\",\"split_repository\":\"${STARTER_MAP[$ROOT]}\"}"
                    fi
                  done
                  JSON+="]"

                  # Check if we actually added any starters
                  if [ "$JSON" = "[]" ]; then
                    echo "No valid starters found in changed directories"
                    echo "matrix=[]" >> "$GITHUB_OUTPUT"
                    echo "has_changes=false" >> "$GITHUB_OUTPUT"
                  else
                    echo "matrix=$JSON" >> "$GITHUB_OUTPUT"
                    echo "has_changes=true" >> "$GITHUB_OUTPUT"
                  fi

    packages_split:
        needs: determine_changed
        # Run when:
        #  • Event is not workflow_run OR upstream workflow succeeded.
        #  • Event is not push OR at least one starter changed.
        if: ${{ (github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success') && needs.determine_changed.outputs.has_changes == 'true' }}

        runs-on: ubuntu-latest

        strategy:
            fail-fast: false
            matrix:
                package: ${{ fromJson(needs.determine_changed.outputs.matrix) }}

        steps:
            - uses: actions/checkout@v6
              with:
                  fetch-depth: 0

            # step if no tag is pushed
            - if: ${{ !startsWith(github.ref, 'refs/tags/') }}
              uses: "symplify/monorepo-split-github-action@v2.4.4"
              with:
                  package_directory: "${{ matrix.package.local_path }}"
                  repository_organization: "HugoBlox"
                  repository_name: "${{ matrix.package.split_repository }}"
                  user_name: "Splitter Bot"
                  user_email: "no.reply@hugoblox.com"


================================================
FILE: .github/workflows/security-codeql.yml
================================================
name: Security - CodeQL
run-name: ${{ github.workflow }} - ${{ github.ref_name }}

on:
  schedule:
    - cron: "0 3 * * 0"
  push:
    branches: [main]
    paths:
      - "**/*.js"
      - "**/*.jsx"
      - "**/*.ts"
      - "**/*.tsx"
      - "**/*.py"
      - ".github/workflows/codeql.yml"
  pull_request:
    branches: [main]
    paths:
      - "**/*.js"
      - "**/*.jsx"
      - "**/*.ts"
      - "**/*.tsx"
      - "**/*.py"

permissions:
  actions: read
  contents: read
  security-events: write

jobs:
  analyze:
    name: Analyze (CodeQL)
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v4
        with:
          languages: "javascript-typescript,python"

      - name: Autobuild
        uses: github/codeql-action/autobuild@v4

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v4
        with:
          category: "/language:javascript-typescript"


================================================
FILE: .gitignore
================================================
# ============================================================================
# HugoBlox Kit - Monorepo .gitignore
# ============================================================================

# ============================================================================
# Build Artifacts & Generated Files
# ============================================================================

# Hugo build artifacts
public/
resources/
.hugo_build.lock
hugo_stats.json

# Go modules
go.sum

# Node.js
node_modules/

# Pagefind search index (generated at build time)
**/pagefind/

# JSConfig files (auto-generated by Hugo)
**/assets/jsconfig.json

# pnpm lock files in starters (keep template clean)
starters/**/pnpm-lock.yaml

# ============================================================================
# Development Environment
# ============================================================================

# Environment variables
.env
.env.local
.env.*.local

# IDE & Editor files
.idea/
/.vscode/
.specstory/
/docs/

# ============================================================================
# Language & Framework Specific
# ============================================================================

# Python (for scripts)
__pycache__/
*.py[cod]
*$py.class
.pytest_cache/
*.egg-info/

# Jupyter Notebooks
.ipynb_checkpoints/

# ============================================================================
# Operating System
# ============================================================================

# macOS
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes

# Windows
Thumbs.db
ehthumbs.db
Desktop.ini

# Linux
*~
.nfs*

# ============================================================================
# Logs & Temporary Files
# ============================================================================

# Log files
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Temporary directories
tmp/
temp/
.tmp/
backups/


================================================
FILE: .prettierignore
================================================
# Vendor directories
_vendor/
vendor/

# Generated directories
public/
resources/
node_modules/

# We use go-template parser for HTML, but still ignore some specific files
modules/blox-tailwind/assets/dist/

# JSON files with specific formats (although typically Biome now processes JSON)
modules/blox-tailwind/layouts/index.json
modules/blox-tailwind/layouts/index.webmanifest


================================================
FILE: .prettierrc.js
================================================
module.exports = {
  bracketSpacing: false,
  singleQuote: false,
  jsxBracketSameLine: true,
  trailingComma: "all",
  printWidth: 150,
  overrides: [
    {
      files: ["*.html"],
      options: {
        parser: "go-template",
      },
    },
    {
      files: ["*.md"],
      options: {
        proseWrap: "preserve",
      },
    },
  ],
};


================================================
FILE: .stylelintignore
================================================
**/public/**
**/dist/**
**/libs/**
modules/blox-tailwind/assets/css/color-utilities.css
starters/**/static/**


================================================
FILE: CITATION.cff
================================================
cff-version: 1.2.0
message: "If you use HugoBlox in your work, please cite it as below."
type: software

title: "HugoBlox"
abstract: >
  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"
    given-names: "George"
    orcid: "https://orcid.org/0000-0003-0526-3793"

license: "MIT"
repository-code: "https://github.com/HugoBlox/kit"
url: "https://hugoblox.com"
doi: 10.5281/zenodo.17704062

# Use the latest released version here
version: "0.11.0"
date-released: 2026-01-02

keywords:
  - hugo
  - copilot
  - ai
  - static-site-generator
  - website-builder
  - markdown
  - academic-websites
  - documentation
  - blog
  - portfolio
  - research
  - academic
  - open-source
  - no-code  


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Hugo Blox 🚀

> **Welcome, researchers and academics!** Whether you're a professor sharing your publications, a PhD student building your first portfolio, or an AI researcher showcasing your work — this guide will help you contribute to the tool that powers 100,000s of researcher and lab websites worldwide.

[![All Access](https://img.shields.io/badge/Support-All%20Access-2ea44f?logo=heart)](https://hugoblox.com/all-access)
[![GitHub Sponsors](https://img.shields.io/badge/Sponsor-GitHub%20Sponsors-ea4aaa?logo=github)](https://github.com/sponsors/gcushen)
[![Star us](https://img.shields.io/github/stars/HugoBlox/kit?style=social)](https://github.com/HugoBlox/kit)
[![Discord](https://img.shields.io/discord/722225264733716590?logo=discord)](https://discord.gg/z8wNYzb)

## ❤️ Love Hugo Blox? Help keep it thriving.

> If Hugo Blox has saved you hours, taught you something, or helped you share your work, please take 2 minutes to give back. Most people won't — but if a small part of the community pitches in today, we can ship faster, fix more bugs, and keep the project healthy for everyone.

We want contributing to Hugo Blox to be fun, enjoyable, and educational for anyone and everyone. All contributions are welcome, including new plugins (such as new widgets, shortcodes, theme packs, and language packs), templates, features, documentation as well as updates and tweaks, blog posts, YouTube tutorials, live streaming customizations, meetups, and more.

## 🎯 Why Contribute?

### For Your Career

- **📝 Add to your CV**: Open source contributions demonstrate technical skills and collaboration
- **🌍 Build your reputation**: Your contributions are publicly visible and credited
- **🤝 Network with peers**: Connect with researchers and developers worldwide
- **📚 Learn modern web tech**: Gain experience with Hugo, Tailwind CSS, and modern web development

### For the Community

- **🔬 Shape the tool you use**: Directly influence features that matter to academics
- **⚡ Get fixes faster**: Contributing means your needs get addressed sooner
- **🌱 Support open research**: Keep academic tools free and accessible to all
- **🏆 Join 9k+ stars**: Be part of a thriving academic community

## 🚀 Quick Wins (Pick One!)

### ⏱️ 30 Seconds

- **⭐ Star the repository**: [github.com/HugoBlox/kit](https://github.com/HugoBlox/kit)
- **👍 Vote on issues**: Shape the roadmap by [upvoting features](https://github.com/HugoBlox/kit/issues) you need
- **💡 Suggest an enhancement**: Have an idea? [Create a GitHub Issue](https://github.com/HugoBlox/kit/issues) for the community to vote on
- **📢 Share your site**: Post your Hugo Blox site on X/LinkedIn/Reddit with #HugoBlox

### 🕐 5-10 Minutes

- **📸 Share a screenshot**: Show your beautiful site in [Discussions](https://github.com/HugoBlox/kit/discussions)
- **🐛 Report issues clearly**: Found a bug? Help us fix it with clear steps to reproduce
- **💬 Help in Discord**: Answer a question in our [Discord community](https://discord.gg/z8wNYzb)
- **✏️ Fix documentation typos**: Spot an error? Fix it directly on GitHub (no setup needed!)

### 🕓 ~1 Hour

- **🔧 Implement a small issue**: See [help-wanted issues](https://github.com/HugoBlox/kit/labels/help%20wanted)
- **📚 Write documentation**: Help keep the documentation complete and up-to-date

### 🕘 A Few Hours

- **🧩 Take a larger issue**: Contribute a significant feature or improvement
- **🎥 Create tutorials**: Record a YouTube video or write a detailed blog post

## Where to Start

Join the **Contributing** channel on the **[community Discord](https://discord.gg/z8wNYzb)**.

## General ways to help

Whether or not you're a developer, there are plenty of non-technical ways that you can help. We always need help with:

- Helping the Hugo Blox community via the live [chat](https://discord.gg/z8wNYzb) and [forum](https://github.com/HugoBlox/kit/discussions)
- Investigating and reviewing open [Issues](https://github.com/HugoBlox/kit/issues) and [Pull Requests](https://github.com/HugoBlox/kit/pulls)
  - Influence the roadmap! Give a thumbs up 👍 to upvote a feature request you would like to use
- Improving the [documentation](https://docs.hugoblox.com/) and writing tutorials
  - Just click the _Edit_ button at the bottom of pages or open an issue with your proposed improvement
- Testing and quality assurance, such as checking the latest version of the templates work as you expect and fixing any dead-links etc.
- Translating the Hugo Blox templates or the Hugo Blox documentation
- Hosting local Hugo Blox themed events or meetups
- Promoting Hugo Blox to others by blogging, vlogging, code streaming, talking etc.

### For technical contributions

## 🛠️ Development Setup

> **No Go experience needed!** Most contributions only require basic HTML/CSS knowledge.

### Prerequisites

1. **Install Node.js** (for Tailwind CSS v4)

   ```bash
   # macOS/Linux (using Homebrew)
   brew install node

   # Windows (download from nodejs.org)
   # Or use WSL2 for a Linux environment
   ```

2. **Install pnpm** (our package manager)

   ```bash
   npm install -g pnpm
   ```

3. **Install Hugo Extended** (latest version)

   ```bash
   # macOS
   brew install hugo

   # Windows (using Chocolatey)
   choco install hugo-extended

   # Linux
   snap install hugo --channel=extended
   ```

### Getting Started

1. **Fork & Clone**

   ```bash
   # Fork on GitHub first, then:
   git clone https://github.com/YOUR-USERNAME/kit.git
   cd kit
   ```

2. **Install Dependencies**

   ```bash
   pnpm install
   ```

3. **View a Starter Site**

   ```bash
   # View the academic-cv starter (most popular)
   ./scripts/view-starter-dev.sh academic-cv

   # Site opens at http://localhost:8081
   ```

That's it! You're ready to contribute. 🎉

### Repository structure

```
kit/
├── modules/
│   └── blox/               # Main theme module
│       ├── layouts/        # HTML templates (easy to edit!)
│       ├── assets/css/     # Tailwind CSS v4 styles
│       └── i18n/           # Translations (help translate!)
├── templates/
│   ├── academic-cv/        # CV/Resume template
│   ├── blog/               # Blog template
│   └── documentation/      # Docs template
└── scripts/                # Helper scripts
```

**Note**: To contribute an improvement to a template, make your changes to the relevant template within the `templates/` folder. **Do not submit PRs to the dedicated template repositories as they are read-only (changes are automatically propagated there from this mono-repository).**

#### What are some good issues to contribute to?

If you're a developer looking to contribute, but you're not sure where to begin, check out the [help wanted](https://github.com/HugoBlox/kit/labels/help%20wanted) label on Github, which contains issues which need some love.

#### How can I propose an improvement?

If you have a straightforward bug fix or improvement, feel free to contribute it in a [Pull Request](https://github.com/HugoBlox/kit/pulls) for the community to review.

If you have an idea for a new feature, please start by [searching the issues](https://github.com/HugoBlox/kit/issues) to check that the feature has not already been suggested and then suggest it by [opening a new issue](https://github.com/HugoBlox/kit/issues/new/choose), as adding new features to Hugo Blox first requires some analysis around the design and spec.

Please be mindful of the project [scope](#scope).

### Contribute Blox

[Create and publish your own blox](https://github.com/HugoBlox/create-blox)

### Contribute a shortcode

[Create and publish your own shortcode](https://github.com/HugoBlox/create-shortcode)

### Contribute a language pack

To contribute a **new language pack** or an improvement to a language pack, refer to the [language pack guide](https://docs.hugoblox.com/reference/language/#create-or-modify-a-language-pack). Once created, [fork HugoBlox Kit](https://github.com/HugoBlox/kit), place your language pack in `modules/blox/i18n/`, add the language metadata to `modules/blox/data/languages.yaml`, and open a Pull Request on Github with these two files.

### Contribute a theme pack

[View the guide](https://docs.hugoblox.com/getting-started/customize/#appearance) to contributing a color and font theme pack.

### Contribute a template

Consider duplicating a bare-bones template, such as the [Link In Bio](https://github.com/HugoBlox/kit/tree/main/templates/link-in-bio) folder, and building up your own template using the Hugo Blox. Reach out on the **Contributing** channel in Discord to submit your template.

### Contribute to the Publication importer

To contribute to **Hugo Academic CLI**, the automatic publication and blog post importer, refer to [its dedicated Github repository](https://github.com/GetRD/academic-file-converter) and Issue queue.

## 🤝 Getting Help

### Where to Ask Questions

- **🗣️ Discord**: Real-time chat in [#contributing channel](https://discord.gg/z8wNYzb)
- **💬 Discussions**: Async help in [GitHub Discussions](https://github.com/HugoBlox/kit/discussions)
- **🐛 Issues**: Bug reports and feature requests

### Tips for Getting Quick Help

1. **Share your environment**: Hugo version, HugoBlox version in `go.mod`, OS, browser
2. **Provide minimal reproduction**: Smallest example showing the issue
3. **Check existing issues**: Your question might be answered
4. **Be specific**: "Publications not showing" → "BibTeX import fails with DOI links"

## 🏆 Recognition & Rewards

### How We Thank Contributors

- **🎖️ Credits**: Named in release notes
- **🏷️ Contributor badge**: On your GitHub profile
- **📣 Social shoutouts**: Featured on our social media
- **🎯 Direct impact**: Your needs prioritized
- **🤝 Network access**: Connect with core team

### Hall of Fame

Check our [Contributors page](https://github.com/HugoBlox/kit/graphs/contributors) to see everyone who's helped!

## 💚 Can't Contribute Code? Support the Project!

### Other Ways to Help

- **💰 Sponsor**:
  - [All Access](https://hugoblox.com/all-access) - One-time payment for exclusive Pro templates and blocks
  - [GitHub Sponsors](https://github.com/sponsors/gcushen) - Monthly donation to support open source development
  - ☕️ [Donate a coffee](https://github.com/sponsors/gcushen?frequency=one-time)
- **📢 Spread the Word**: Share your Hugo Blox site and experience
- **📝 Write Tutorials**: Blog about your Hugo Blox setup
- **🎥 Create Videos**: YouTube tutorials help many researchers
- **🌍 Translate**: Help make Hugo Blox accessible globally

## Best practices

To create a consistent experience for all contributors and help prevent bugs, we have some best practices.

### Conventional Commits Specification

Please follow the [Conventional Commits Specification](https://www.conventionalcommits.org/en/v1.0.0/).

For example:

- new feature: `feat: add the X parameter`
- bug fix: `fix: typo in implementation of X parameter`
- performance: `perf: speed up init by pre-warming only pages`
- refactor: `refactor: simplify citation logic`
- docs: `docs: document the X parameter`
- style: `style: change font color from black to blue`
- build-related: `chore: rebuild JS assets`

### Linting and formatting

```sh
pnpm install
pnpm run lint
pnpm run format
```

## Scope

Please be _mindful_ that although we encourage feature requests, we cannot expand the scope of the project in every possible direction. There will be feature requests that don't make the roadmap.

Every feature requires effort not just to analyse the requirements, design it, implement it, test it, document it, merge it, write release notes for it, and release it, but also to continuously support users with it and maintain it (fixing and refactoring the feature as the project and its dependencies evolve).

The more regular active volunteers (rather than one-off contributors) we have supporting users and maintaining the project, the more feasible it becomes to expand the scope of the project.

The project's scope also has to be constrained so that it doesn't get too complex and unwieldy, from an architectural perspective, a testing perspective, and from a usability perspective.

Plugins (widgets, shortcodes, theme packs, language packs, and third-party JavaScript integrations) as well as templates allow the community to add major features without needing to contribute to Hugo Blox itself.

## 📋 Contribution Checklist

Before submitting a PR:

- [ ] **Test locally**: Run `./scripts/view-starter-dev.sh academic-cv`
- [ ] **Check formatting**: Run `pnpm run lint:js` (if you edited JS)
- [ ] **Update docs**: If adding features, document them in the code and in the PR
- [ ] **Add examples**: Show how to use new features
- [ ] **Write clear commit messages**: Help future contributors understand changes

## 🙏 Thank You!

Every contribution matters — whether it's fixing a typo, adding a translation, or building a new feature. You're helping thousands of researchers share their work with the world.

**Welcome to the Hugo Blox community!** 🎉

---

_Questions? Join our [Discord](https://discord.gg/z8wNYzb) or start a [Discussion](https://github.com/HugoBlox/kit/discussions)._ 

_This project follows the [Contributor Covenant Code of Conduct](.github/CODE_OF_CONDUCT.md)._ 

## ⚖️ Our Contributor License Agreement (CLA)

### Why We Have a CLA

A Contributor License Agreement (CLA) is a standard best practice in professional open-source. It's a simple agreement that protects you (our contributor), our users, and the Hugo Blox project itself.

- It protects you: the CLA clarifies that you are entitled to contribute the code and that your contribution is provided "as is," without any warranty.
- It protects the project: it grants us the permanent legal rights needed to use your contribution as part of the project and defend the project from legal challenges.
- It enables our future: having a proper CLA allows us to confidently continue to enhance and support the Hugo Blox ecosystem.

This agreement doesn't change your ownership of your code; it simply grants us a clear license to use it as part of Hugo Blox.

### Your Agreement

By submitting a Pull Request to this repository, you agree to our [Contributor License Agreement (CLA)](.github/CLA.md). Please ensure you have read and understood it.


================================================
FILE: LICENSE.md
================================================
The MIT License (MIT)

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
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: README.md
================================================
[**中文**](./README.zh.md)

<p align="center">
  <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 Publishing Stack</h1>

<p align="center">
  <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 Researcher Plan automation (visual editing, imports, fixes, and upgrades).
</p>

<p align="center">
  <a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme&utm_content=cta_start"><b>Start Free in Browser</b></a>
  &nbsp;•&nbsp;
  <a href="https://marketplace.visualstudio.com/items?itemName=ownable.ownable"><b>Get HugoBlox Studio (VS Code)</b></a>
</p>

<p align="center">
  <sub>
    <a href="#for-researchers--labs">Researchers & Labs</a>
    &nbsp;•&nbsp;
    <a href="#for-data-scientists--ai-engineers">Data Scientists & AI Engineers</a>
    &nbsp;•&nbsp;
    <a href="#for-teams--orgs">Teams & Orgs</a>
    &nbsp;•&nbsp;
    <a href="#plans">Automations & Plans</a>
  </sub>
</p>

<div align="center">

<a href="https://discord.gg/z8wNYzb">
    <img src="https://img.shields.io/discord/722225264733716590?label=Join%20Discord&logo=discord&logoColor=white&style=flat-square&color=5865F2" alt="Discord">
  </a>
  <a href="https://github.com/HugoBlox/kit">
    <img src="https://img.shields.io/github/stars/HugoBlox/kit?label=Star%20HugoBlox&logo=github&logoColor=white&style=flat-square&color=181717" alt="GitHub Stars">
  </a>
  <a href="https://x.com/MakeOwnable">
    <img src="https://img.shields.io/twitter/follow/MakeOwnable?label=Follow&logo=x&logoColor=white&style=flat-square&color=000000" alt="Follow on X">
  </a>
  <a href="https://marketplace.visualstudio.com/items?itemName=ownable.ownable">
    <img src="https://img.shields.io/visual-studio-marketplace/i/ownable.ownable?label=VS%20Code%20Installs&logo=visualstudiocode&logoColor=white&style=flat-square&color=007ACC" alt="VS Code Installs">
  </a>
  <a href="https://marketplace.visualstudio.com/items?itemName=ownable.ownable">
    <img src="https://img.shields.io/visual-studio-marketplace/stars/ownable.ownable?label=VS%20Code%20Rating&logo=visualstudiocode&logoColor=white&style=flat-square&color=007ACC" alt="VS Code Rating">
  </a>

</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>

https://github.com/user-attachments/assets/a0be0c48-b8d5-4b40-a11b-85fedcdf89bc

---

## ⚡️ Why teams choose HugoBlox

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).

- **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 Researcher Plan options when you want more).
- **A hybrid workflow**: edit in code, or use a visual editor when you want velocity.

---

## For researchers & labs

- **Lab sites and academic profiles** (people, publications, projects, news)
- **Citable output** with BibTeX/DOI workflows
- **Notebooks + LaTeX** for technical writing that actually renders

## 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 (Researcher Plan)**: **HugoBlox Studio** in VS Code for drag-and-drop blocks, previews, and safer config edits.
- **AI automation (Researcher Plan)**: spend less time on formatting, YAML fixes, imports, and maintenance.

<p align="center">
  <img src="./.github/media/studio/slide-1.webp" alt="HugoBlox Studio in Action" width="100%">
</p>
<p align="center"><em>HugoBlox Studio: Visual editing meets code-first control.</em></p>

---

## 🛠️ The toolkit

| **Feature** | **Why it matters** |
| :--- | :--- |
| **HugoBlox 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&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

### Option 1: The Online Copilot (Fastest)
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&utm_content=get_started_browser)

### Option 2: HugoBlox Studio (Best for Data/AI teams)
The power of a visual website builder, directly inside VS Code.

1. **Install** [HugoBlox Studio from the Marketplace](https://marketplace.visualstudio.com/items?itemName=ownable.ownable).
2. **Open** any HugoBlox project folder.
3. **Click** the HugoBlox Studio icon in the menu to start visually editing.

### Option 3: The CLI (For DevOps/Eng)
Scaffold a new project locally.

```bash
  # Requires Hugo Extended & Node.js
  npm install -g hugoblox
  hugoblox create site
```

Need guides and best practices? See the docs: [**docs.hugoblox.com**](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme&utm_content=docs)

---

## ✅ Stability & upgrades (because your site should not break)

- **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 (Researcher Plan)**: visual editing + validation reduces YAML/front matter mistakes.

See the docs for upgrade guidance: [**docs.hugoblox.com**](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme&utm_content=upgrade_guidance)

<a name="plans"></a>
## ⚡️ Unlock Automations & Premium

HugoBlox is **Open Core**. The **Free Kit** is production-grade and you will always own your data and code.

The Free Kit includes:

- **[HugoBlox Studio](https://marketplace.visualstudio.com/items?itemName=ownable.ownable) Core**: Visual site configuration, theming, and content editing
- **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

### 🤖 Pro (Automation)

Upgrade to **Pro** for [HugoBlox Studio](https://marketplace.visualstudio.com/items?itemName=ownable.ownable) (requires extension login) 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) |
| :--- | :---: | :---: |
| **Site Ownership** | ✅ 100% Yours | ✅ 100% Yours |
| **Visual Page Editor** | ❌ | **✅ Included** |
| **AI Assistant** | ⏳ Trial | **✅ Included** |
| **Auto Sync with GitHub** | ❌ | **✅ 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 Open Research** | 💜 | **🏆 Hero Status** |

👉 [**View Full Feature Matrix**](https://hugoblox.com/pricing?utm_source=github&utm_medium=readme&utm_content=pricing_matrix) &nbsp;•&nbsp; [**Get Pro**](https://hugoblox.com/pricing?utm_source=github&utm_medium=readme&utm_content=cta_pro)

> "HugoBlox Studio saved me **40+ hours** on my lab site. Visual edits + BibTeX auto-updates = **citations up 3×**."
> <br/>— **Dr. Sarah Yang**, AI Researcher

### 🎨 HugoBlox Premium

**Get the complete kit.** Instant access to premium templates, blocks, and community support to help you launch faster.

| Feature | Open Source | **HugoBlox Premium** |
| :--- | :---: | :---: |
| **Core Framework** | ✅ | ✅ |
| **Premium Templates** (SaaS, Lab) | ❌ | **✅ Included** |
| **Premium Blocks** | ❌ | **✅ Included** |
| **Remove Attribution?** | ❌ | **✅ Included** |
| **Private Discord** | ❌ | ✅ |
| **Support Open Research** | 💜 | **🏆 Hero Status** |

👉 [**Get Premium Templates Bundle**](https://hugoblox.com/premium?utm_source=github&utm_medium=readme&utm_content=cta_premium)

> "Launched my startup site with built-in docs in **10 minutes**. The premium block system is genius; onboarding time dropped 60%."
> <br/>— **Alexandre Rodrigues**, Founder

---

## 🏢 Org-ready (without the enterprise bloat)

- **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 & Support

We are a community of 150,000+ researchers, engineers, and creators.

- **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

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>HugoBlox™ is a trademark of Lore Labs.</sub>
</p>


================================================
FILE: README.zh.md
================================================
[**English**](./README.md)

<p align="center">
  <a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme&utm_content=hero_image">
    <img src="./.github/media/hero.zh.png" alt="用 HugoBlox 打造世界级站点" width="100%">
  </a>
</p>

<h1 align="center">HugoBlox: 您的开源发布栈</h1>

<p align="center">
  <strong>基于 Markdown + Jupyter 发布笔记、文档、作品集和知识库。</strong><br/>
  专为追求速度且拒绝锁定的数据科学家、AI 工程师、研究人员、实验室和科技初创公司打造:Hugo + Tailwind 核心,可选 Researcher Plan 自动化(可视化编辑、一键导入、自动修复和升级)。
</p>

<p align="center">
  <a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme&utm_content=cta_start"><b>浏览器中免费试用</b></a>
  &nbsp;•&nbsp;
  <a href="https://marketplace.visualstudio.com/items?itemName=ownable.ownable"><b>获取 HugoBlox Studio (VS Code)</b></a>
</p>

<p align="center">
  <sub>
    <a href="#面向研究人员与实验室">研究人员与实验室</a>
    &nbsp;•&nbsp;
    <a href="#面向数据科学家与-ai-工程师">数据科学家与 AI 工程师</a>
    &nbsp;•&nbsp;
    <a href="#面向团队与组织">团队与组织</a>
    &nbsp;•&nbsp;
    <a href="#plans">自动化与订阅计划</a>
  </sub>
</p>

<div align="center">

<a href="https://discord.gg/z8wNYzb">
    <img src="https://img.shields.io/discord/722225264733716590?label=%E5%8A%A0%E5%85%A5%20Discord&logo=discord&logoColor=white&style=flat-square&color=5865F2" alt="Discord">
  </a>
  <a href="https://github.com/HugoBlox/kit">
    <img src="https://img.shields.io/github/stars/HugoBlox/kit?label=%E7%82%B9%E8%B5%9E%20HugoBlox&logo=github&logoColor=white&style=flat-square&color=181717" alt="GitHub Stars">
  </a>
  <a href="https://x.com/MakeOwnable">
    <img src="https://img.shields.io/twitter/follow/MakeOwnable?label=%E5%85%B3%E6%B3%A8&logo=x&logoColor=white&style=flat-square&color=000000" alt="Follow on X">
  </a>
  <a href="https://marketplace.visualstudio.com/items?itemName=ownable.ownable">
    <img src="https://img.shields.io/visual-studio-marketplace/i/ownable.ownable?label=VS%20Code%20%E5%AE%89%E8%A3%85%E9%87%8F&logo=visualstudiocode&logoColor=white&style=flat-square&color=007ACC" alt="VS Code Installs">
  </a>
  <a href="https://marketplace.visualstudio.com/items?itemName=ownable.ownable">
    <img src="https://img.shields.io/visual-studio-marketplace/stars/ownable.ownable?label=VS%20Code%20%E8%AF%84%E5%88%86&logo=visualstudiocode&logoColor=white&style=flat-square&color=007ACC" alt="VS Code Rating">
  </a>

</div>

<p align="center">
  <sub>
    源自 <strong>2016</strong> · <strong>150,000+</strong> 研究人员与科学家信赖 (Meta, Stanford, NVIDIA) · 用户评分 <strong>4.9/5</strong> (官方调研) · 被 <a href="https://research.nvidia.com/research-labs">NVIDIA Research Labs</a>, <a href="https://cai4cai.ml/">King’s College London</a>, 以及 <a href="https://www.metaconscious.org/">MIT</a> 等团队使用 · 入选 GitHub <a href="https://github.blog/open-source/release-radar-february-2019/#hugo-academic-4-0">Release Radar</a>
  </sub>
</p>

---

## ⚡️ 为什么团队选择 HugoBlox

在 AI 时代,**Markdown 就是新的源代码**。HugoBlox 赋予您现代工具的速度与静态技术栈的持久性:**Hugo + Tailwind**(支持可选的 Alpine/Svelte 模块以增强交互性)。

- **拥有您的内容**:纯净的 Markdown、YAML 和 Notebooks —— 便携、可读且对 LLM 友好。
- **无运维负担的极致性能**:静态输出,极速构建,无运行时数据库。
- **默认即美**:高质量的模板 + 积木(需要更多功能时可选 Researcher Plan)。
- **混合工作流**:代码中直接编辑,或在需要速度时使用可视化编辑器。

---

## 面向研究人员与实验室

- **实验室站点与学术主页**(人员、出版物、项目、新闻)
- **可引用的输出**,支持 BibTeX/DOI 工作流
- **Notebooks + LaTeX**,让技术写作完美渲染

## 面向数据科学家与 AI 工程师

- **项目文档**与无需繁重 JavaScript 栈的技术博客
- **Notebook 优先发布** (`.ipynb`),用于报告、教程和结果展示
- **知识库**与内部文档,保持可搜索与可维护

## 面向团队与组织

- **一致的站点**,通过模板 + 积木实现跨团队统一
- **低风险升级**,提供清晰的版本控制 + 迁移指南
- **支持选项**,当您需要快速解答时

---

## 🧠 随心所欲地编辑(代码优先,亦可可视化)

- **代码优先**:Markdown/YAML + Hugo 模板,掌控全局。
- **可视化编辑 (Researcher Plan)**:VS Code 中的 **HugoBlox Studio**,提供拖拽式积木、实时预览和更安全的配置编辑。
- **AI 自动化 (Researcher Plan)**:减少在格式调整、YAML 修复、导入和维护上花费的时间。

<p align="center">
  <img src="./.github/media/studio/slide-1.webp" alt="HugoBlox Studio 实战" width="100%">
</p>
<p align="center"><em>HugoBlox Studio: 可视化编辑与代码优先掌控的完美结合。</em></p>

---

## 🛠️ 工具箱

| **功能** | **核心价值** |
| :--- | :--- |
| **HugoBlox Studio (VS Code)** | 编辑器内的可视化 CMS。无需离开 VS Code 即可拖拽积木。 |
| **Notebooks & LaTeX** | 原生渲染 `.ipynb` 和重数学公式页面。 |
| **BibTeX / DOI 工作流** | 构建出版物页面和参考文献,无需手动格式化。 |
| **多语言支持** | 使用 Markdown, Jupyter, RMarkdown, 或 LaTeX Math 写作。 |

<p align="center">
  <img src="./.github/media/templates.webp" alt="模板预览" width="900">
</p>

<p align="center">
  <a href="https://hugoblox.com/templates?utm_source=github&utm_medium=readme&utm_content=templates"><b>浏览模板 →</b></a>
</p>

<p align="center">
  <sub>想看它快速运行?选择一个模板,使用 Online Copilot 在约 60 秒内发布。</sub><br/>
  <a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme&utm_content=cta_template_start"><b>立即尝试模板 →</b></a>
</p>

---

## 🚀 快速开始

### 选项 1:在线 Copilot(最快)
适合 **创始人、实验室和初创公司**。几分钟内上线站点。

👉 [**浏览器中免费试用**](https://hugoblox.com/start?utm_source=github&utm_medium=readme&utm_content=get_started_browser)

### 选项 2:HugoBlox Studio(适合数据/AI 团队)
可视化网站构建器的力量,直接集成在 VS Code 中。

1. **安装** [VS Code 市场中的 HugoBlox Studio](https://marketplace.visualstudio.com/items?itemName=ownable.ownable).
2. **打开** 任意 HugoBlox 项目文件夹。
3. **点击** 菜单中的 HugoBlox Studio 图标开始可视化编辑。

### 选项 3:命令行 CLI(适合 DevOps/工程师)
在本地搭建新项目骨架。

```bash
  # 需要 Hugo Extended & Node.js
  npm install -g hugoblox
  hugoblox create site
```

需要指南和最佳实践?查看文档:[**docs.hugoblox.com**](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme&utm_content=docs)

---

## ✅ 稳定性与升级(您的站点不应崩溃)

- **锁定版本** 以保持生产环境稳定。
- **自信升级**,使用迁移说明和升级指南。
- **安全定制**:尽可能优先使用配置和积木,而非脆弱的模板覆盖。
- **尽早发现配置问题 (Researcher Plan)**:可视化编辑 + 验证减少 YAML/Front Matter 错误。

查看文档获取升级指导:[**docs.hugoblox.com**](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme&utm_content=upgrade_guidance)

<a name="plans"></a>
## ⚡️ 解锁自动化与 Premium

HugoBlox 采用 **Open Core** 模式。**免费套件 (Free Kit)** 达到生产级标准,您将永远拥有您的数据和代码。

免费套件包含:

- **[HugoBlox Studio](https://marketplace.visualstudio.com/items?itemName=ownable.ownable) 核心**:可视化站点配置、主题设置和内容编辑
- **模板 + 积木**,用于作品集、实验室、文档和落地页
- **Markdown/YAML 优先工作流**,具备 Hugo + Tailwind 性能
- **Notebook + LaTeX 支持**,用于技术发布
- **社区支持**,通过文档、GitHub Issues 和 Discord

### 🤖 Researcher Plan (自动化)

当您需要自动化和更低的维护开销时,升级到 [HugoBlox Studio](https://marketplace.visualstudio.com/items?itemName=ownable.ownable) 的 **Researcher Plan (研究员计划)**(需登录扩展):

- **更少时间调试 YAML** (自动修复机器人 + 更安全的配置编辑)
- **更少时间格式化引用** (魔法导入 + 出版物自动化)
- **更少时间处理升级** (引导式维护工作流)
- **更高速度** (VS Code 中的可视化编辑 + 预览)


| 功能 | **免费套件** (开源) | **Researcher Plan** (自动化) |
| :--- | :---: | :---: |
| **站点所有权** | ✅ 100% 归您所有 | ✅ 100% 归您所有 |
| **可视化页面编辑器** | ❌ | **✅ 包含** |
| **AI 助手** | ⏳ 试用 | **✅ 包含** |
| **GitHub 自动同步** | ❌ | **✅ 包含** |
| **AI "自动修复" 机器人** (自动修复 YAML) | ❌ | **✅ 无限** |
| **魔法导入** (BibTeX/DOI -> 页面) | ⏳ 试用 | **✅ 无限** |
| **CV 生成器** (站点 -> PDF 简历) | ❌ | **✅ 包含** |
| **私有 Discord** | ❌ | ✅ |
| **支持开放科研** | 💜 | **🏆 Hero 身份** |

👉 [**查看完整功能矩阵**](https://hugoblox.com/pricing?utm_source=github&utm_medium=readme&utm_content=pricing_matrix) &nbsp;•&nbsp; [**升级到 Researcher Plan**](https://hugoblox.com/pricing?utm_source=github&utm_medium=readme&utm_content=cta_pro)

> "HugoBlox Studio 帮我的实验室网站节省了 **40+ 小时**。可视化编辑 + BibTeX 自动更新 = **引用量提升了 3 倍**。"
> <br/>— **Dr. Sarah Yang**, AI 研究员

### 🎨 HugoBlox Premium

**获取完整套件。** 即刻访问高级模板、高级积木和社区支持,助您更快上线。

| 功能 | 开源版 | **HugoBlox Premium** |
| :--- | :---: | :---: |
| **核心框架** | ✅ | ✅ |
| **高级模板** (SaaS, 实验室) | ❌ | **✅ 包含** |
| **高级积木** | ❌ | **✅ 包含** |
| **移除归属声明?** | ❌ | **✅ 包含** |
| **私有 Discord** | ❌ | ✅ |
| **支持开放科研** | 💜 | **🏆 Hero 身份** |

👉 [**获取 Premium 模板包**](https://hugoblox.com/premium?utm_source=github&utm_medium=readme&utm_content=cta_premium)

> "用了不到 **10 分钟** 就上线了我的初创公司网站和文档。高级积木系统太天才了;新手上手时间缩短了 60%。"
> <br/>— **Alexandre Rodrigues**, 创始人

---

## 🏢 企业级就绪(拒绝臃肿)

- **随处部署**:静态输出适用于您现有的基础设施。
- **更低的运维面**:无需修补运行时应用漏洞。
- **采购友好的选项**:按需提供优先支持和商业功能。

---

## 🗣️ 社区与支持

我们是一个由 150,000+ 研究人员、工程师和创作者组成的社区。

- **需要帮助?** 加入 [Discord 服务器](https://discord.gg/z8wNYzb) 或搜索 [文档](https://docs.hugoblox.com/)。
- **发现 Bug?** 提交 [Issue](https://github.com/HugoBlox/kit/issues)。
- **想要贡献?** 阅读我们的 [贡献指南](./CONTRIBUTING.md)。

### 赞助商
帮助我们维持开源的可持续性。

[**❤️ 在 GitHub 上赞助**](https://github.com/sponsors/gcushen) | [**🏢 成为合作伙伴**](https://github.com/sponsors/gcushen)

---

## 许可证

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>Lore™ is a trademark of Lore Labs.</sub>
</p>


================================================
FILE: biome.json
================================================
{
  "$schema": "https://biomejs.dev/schemas/2.3.2/schema.json",
  "files": {
    "includes": [
      "**",
      "!modules/**/*.html",
      "!**/node_modules",
      "!**/public",
      "!**/resources",
      "!**/_gen",
      "!**/assets/dist",
      "!**/*.min.js",
      "!**/*.min.css",
      "!**/pagefind",
      "!**/_vendor",
      "!**/vendor",
      "!**/*.html",
      "!**/layouts/**/*.html",
      "!**/*.webmanifest",
      "!**/*.backlinks.json",
      "!**/hugo_stats.json",
      "!**/*.code-workspace",
      "!**/modules/blox/data/icons/devicon.json",
      "!**/templates/**/*.html",
      "!**/test",
      "!**/modules/**/package.json",
      "!**/assets/jsconfig.json",
      "!**/docs-local",
      "!**/backups",
      "!**/modules/blox/assets/css/config/safelist.css"
    ]
  },
  "formatter": {
    "enabled": true,
    "indentStyle": "space",
    "indentWidth": 2,
    "lineWidth": 150
  },
  "javascript": {
    "formatter": {
      "quoteStyle": "double",
      "trailingCommas": "all",
      "bracketSpacing": false
    },
    "globals": ["PagefindUI"]
  },
  "json": {
    "formatter": {
      "trailingCommas": "none"
    }
  },
  "linter": {
    "enabled": true,
    "rules": {
      "recommended": true,
      "style": {},
      "complexity": {},
      "suspicious": {
        "noEmptyBlock": "off"
      },
      "security": {
        "noDangerouslySetInnerHtml": "off"
      }
    }
  },
  "assist": {
    "actions": {
      "source": {
        "organizeImports": "on"
      }
    }
  },
  "css": {
    "parser": {
      "tailwindDirectives": true
    },
    "formatter": {
      "enabled": true,
      "indentStyle": "space",
      "indentWidth": 2,
      "lineWidth": 150
    },
    "linter": {
      "enabled": true
    }
  }
}


================================================
FILE: hugoblox.code-workspace
================================================
{
  "folders": [
    {
      "path": "."
    }
  ],
  "settings": {
    "files.trimFinalNewlines": true,
    "editor.formatOnSaveMode": "modificationsIfAvailable",
    "yaml.format.enable": false,
      
    "files.exclude": {
      "**/node_modules/**": true,
      "**/public/**": true,
      "**/resources/**": true,
      "**/pagefind/**": true,
      "**/dist/**": true
    },
    "search.exclude": {
      "**/node_modules/**": true,
      "**/public/**": true,
      "**/resources/**": true,
      "**/pagefind/**": true,
      "**/dist/**": true
    },
    "files.watcherExclude": {
      "**/node_modules/**": true,
      "**/public/**": true,
      "**/resources/**": true,
      "**/pagefind/**": true,
      "**/dist/**": true
    },
    "explorer.excludeGitIgnore": false,
    "workbench.editor.labelFormat": "medium",
    "breadcrumbs.enabled": true,
    "npm.packageManager": "pnpm",
    "editor.detectIndentation": false,
    "editor.formatOnSave": true,
    "editor.defaultFormatter": null,
    "editor.codeActionsOnSave": {
      "source.fixAll.biome": "explicit"
    },

    "[javascript]": { "editor.defaultFormatter": "biomejs.biome" },
    "[typescript]": { "editor.defaultFormatter": "biomejs.biome" },
    "[json]": { "editor.defaultFormatter": "biomejs.biome" },
    "[css]": { "editor.defaultFormatter": "biomejs.biome" },
    "[markdown]": {
      "editor.defaultFormatter": "prettier.prettier-vscode",
      "files.trimTrailingWhitespace": false
    },
    "[python]": {
      "editor.tabSize": 4,
      "editor.insertSpaces": true,
      "editor.defaultFormatter": "charliermarsh.ruff"
    },
    "[yaml]": {
      "editor.defaultFormatter": "prettier.prettier-vscode"
    },
    "[toml]": {
      "editor.defaultFormatter": "prettier.prettier-vscode"
    },
    "files.associations": {
      "**/layouts/**/*.html": "hugo",
      "**/layouts/**/*.htm": "hugo",
      "modules/**/*.html": "hugo",
      "modules/**/*.htm": "hugo",
      "templates/**/*.html": "hugo",
      "templates/**/*.htm": "hugo",
      "test/**/*.html": "hugo",
      "test/**/*.htm": "hugo"
    },
    "[hugo]": {
      "editor.formatOnSave": false,
      "editor.defaultFormatter": null
    },
    "emmet.excludeLanguages": [
      "hugo"
    ],
    "html.format.enable": true,
    "biome.formatter.enabled": false,

    "tailwindCSS.emmetCompletions": true,
    "tailwindCSS.includeLanguages": {
      "hugo": "html"
    },
    "tailwindCSS.experimental.classRegex": [
      ":class\\s*=\\s*\"([^\"]*)\"",
      "x-bind:class\\s*=\\s*\"([^\"]*)\""
    ],
    "yaml.validate": true,

    "[html]": {
      "editor.defaultFormatter": "prettier.prettier-vscode",
      "editor.formatOnSave": true
    }
  },
  "extensions": {
    "recommendations": [
      "redhat.vscode-yaml",
      "DavidAnson.vscode-markdownlint",
      "mikestead.dotenv",
      "eamodio.gitlens",
      "biomejs.biome",
      "prettier.prettier-vscode",
      "charliermarsh.ruff",
      "bradlc.vscode-tailwindcss"
    ]
  }
}


================================================
FILE: modules/README.md
================================================
# HugoBlox Kit Modules

Install HugoBlox features as **Hugo Modules**.

## Quick start (most sites)

Add HugoBlox Kit core to `config/_default/module.yaml` (or `hugo.yaml`):

```yaml
module:
  imports:
    - path: github.com/HugoBlox/kit/modules/blox
```

That’s it — **`analytics` is already included** when you use `modules/blox`.

## Module map

- **Core framework**: `github.com/HugoBlox/kit/modules/blox`
  - Layouts, blocks (Blox), Tailwind pipeline, shortcodes, defaults
  - Includes: `github.com/HugoBlox/kit/modules/analytics`
- **Slides (content type)**: `github.com/HugoBlox/kit/modules/slides`
  - Markdown slide decks (powered by Reveal.js)
- **Integrations**: `github.com/HugoBlox/kit/modules/integrations/*`
  - Netlify: `github.com/HugoBlox/kit/modules/integrations/netlify`

## Optional installs

### Slides

```yaml
module:
  imports:
    - path: github.com/HugoBlox/kit/modules/blox
    - path: github.com/HugoBlox/kit/modules/slides
```

### Netlify integration (security headers + redirects outputs)

```yaml
module:
  imports:
    - path: github.com/HugoBlox/kit/modules/blox
    - path: github.com/HugoBlox/kit/modules/integrations/netlify
```

Then enable Hugo outputs for Netlify:

```yaml
outputs:
  home: [HTML, RSS, headers, redirects]
```

## Updating

```bash
hugo mod get -u github.com/HugoBlox/kit/modules/blox@main
hugo mod tidy
```


================================================
FILE: modules/analytics/README.md
================================================
# Analytics module

**A Hugo Blox module for website analytics and search engine verification.**

Are you using the `blox` module? The analytics module is already included, so you do not need to install it. For all other sites, refer to the installation guide below.

## Install

Get analytics and verification for your Hugo site by following the guide below:

1. Add the module to your `config/_default/hugo.yaml`:

   ```yaml
   module:
     imports:
       - path: github.com/HugoBlox/kit/modules/analytics
   ```

2. Load the module in your site's `<head>` with:

   ```go
   {{ partial "blox-analytics/index" . }}
   ```

## Usage

[View the documentation](https://docs.hugoblox.com/reference/analytics/)


================================================
FILE: modules/analytics/go.mod
================================================
module github.com/HugoBlox/kit/modules/analytics

go 1.19


================================================
FILE: modules/analytics/hugo.yaml
================================================
module:
  mounts:
    - source: layouts
      target: layouts


================================================
FILE: modules/analytics/layouts/_partials/blox-analytics/index.html
================================================
{{/* HUGO BLOX: MARKETING MODULE */}}

{{/* VERIFICATIONS */}}

{{ partial "blox-analytics/verification" . }}

{{/* ANALYTICS */}}

{{ partial "blox-analytics/services/index" . }}


================================================
FILE: modules/analytics/layouts/_partials/blox-analytics/services/baidu_tongji.html
================================================
{{ $baidu_tongji := site.Params.hugoblox.analytics.baidu.site_id | default "" }}

{{ if hugo.IsProduction | and $baidu_tongji }}
  <script>
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "https://hm.baidu.com/hm.js?{{ $baidu_tongji }}";
      var s = document.getElementsByTagName("script")[0];
      s.parentNode.insertBefore(hm, s);
    })();
  </script>
{{ end }}


================================================
FILE: modules/analytics/layouts/_partials/blox-analytics/services/fathom.html
================================================
{{ $fathom := site.Params.hugoblox.analytics.fathom.site_id | default "" }}

{{ if hugo.IsProduction | and $fathom }}
<script src="https://cdn.usefathom.com/script.js" data-site="{{$fathom}}" defer></script>
{{ end }}


================================================
FILE: modules/analytics/layouts/_partials/blox-analytics/services/google_analytics.html
================================================
{{ $ga := site.Params.hugoblox.analytics.google.measurement_id | default "" }}

{{ if hugo.IsProduction | and $ga }}

{{ $gtag_config := cond (site.Params.hugoblox.privacy.anonymize_analytics | default true) "{ 'anonymize_ip': true }" "{}" }}
<script async src="https://www.googletagmanager.com/gtag/js?id={{$ga}}"></script>
<script>
  window.dataLayer = window.dataLayer || [];

  function gtag() {
      dataLayer.push(arguments);
  }

  function trackOutboundLink(url, target) {
    gtag('event', 'click', {
         'event_category': 'outbound',
         'event_label': url,
         'transport_type': 'beacon',
         'event_callback': function () {
           if (target !== '_blank') {
             document.location = url;
           }
         }
    });
    console.debug("Outbound link clicked: " + url);
  }

  function onClickCallback(event) {
    if ((event.target.tagName !== 'A') || (event.target.host === window.location.host)) {
      return;
    }
    trackOutboundLink(event.target, event.target.getAttribute('target'));  // Send GA event.
  }

  gtag('js', new Date());
  gtag('config', '{{$ga}}', {{$gtag_config|safeJS}});
  gtag('set', {'cookie_flags': 'SameSite=None;Secure'});

  // Outbound link tracking.
  document.addEventListener('click', onClickCallback, false);
</script>
{{ end }}


================================================
FILE: modules/analytics/layouts/_partials/blox-analytics/services/google_tag_manager.html
================================================
{{ $gt := site.Params.hugoblox.analytics.google_tag_manager.container_id | default "" }}
{{ if hugo.IsProduction | and $gt }}
<script>
  (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
  new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
  j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
  'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
  })(window,document,'script','dataLayer','{{$gt}}');
</script>
{{ end }}


================================================
FILE: modules/analytics/layouts/_partials/blox-analytics/services/index.html
================================================
{{ partial "blox-analytics/services/google_analytics" . }}
{{ partial "blox-analytics/services/google_tag_manager" . }}
{{ partial "blox-analytics/services/microsoft_clarity" . }}
{{ partial "blox-analytics/services/baidu_tongji" . }}
{{ partial "blox-analytics/services/plausible" . }}
{{ partial "blox-analytics/services/fathom" . }}
{{ partial "blox-analytics/services/pirsch" . }}


================================================
FILE: modules/analytics/layouts/_partials/blox-analytics/services/microsoft_clarity.html
================================================
{{ $clarity := site.Params.hugoblox.analytics.clarity.project_id | default "" }}
{{ if hugo.IsProduction | and $clarity }}
<script>
  (function(c,l,a,r,i,t,y){
      c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
      t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
      y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
  })(window, document, "clarity", "script", '{{$clarity}}');
</script>
{{ end }}


================================================
FILE: modules/analytics/layouts/_partials/blox-analytics/services/pirsch.html
================================================
{{ $pirsch := site.Params.hugoblox.analytics.pirsch.site_id | default "" }}

{{ if hugo.IsProduction | and $pirsch }}
<script defer src="https://api.pirsch.io/pirsch.js" id="pirschjs" data-code="{{$pirsch}}"></script>
{{ end }}


================================================
FILE: modules/analytics/layouts/_partials/blox-analytics/services/plausible.html
================================================
{{ $plausible := site.Params.hugoblox.analytics.plausible.domain | default "" }}

{{ if hugo.IsProduction | and $plausible }}
<script defer data-domain="{{$plausible}}" src="https://plausible.io/js/script.js"></script>
{{ end }}


================================================
FILE: modules/analytics/layouts/_partials/blox-analytics/verification.html
================================================
{{/* Site Verification with Third Party Services */}}

{{- with site.Params.hugoblox.verification.google -}}
<meta name="google-site-verification" content="{{ . }}" />
{{- end -}}

{{- with site.Params.hugoblox.verification.bing -}}
<meta name="msvalidate.01" content="{{ . }}" />
{{- end -}}

{{- with site.Params.hugoblox.verification.yandex -}}
<meta name="yandex-verification" content="{{ . }}" />
{{- end -}}

{{- with site.Params.hugoblox.verification.pinterest -}}
<meta name="p:domain_verify" content="{{ . }}" />
{{- end -}}

{{- with site.Params.hugoblox.verification.baidu -}}
<meta name="baidu-site-verification" content="{{ . }}" />
{{- end -}}

{{ with site.Params.hugoblox.verification.naver }}
  <meta name="naver-site-verification" content="{{ . }}" />
{{- end -}}

================================================
FILE: modules/blox/.npmrc
================================================
# pnpm compatibility settings
auto-install-peers=true
strict-peer-dependencies=false
public-hoist-pattern[]=*


================================================
FILE: modules/blox/README.md
================================================
# Hugo Blox (core)

The Hugo Blox web framework powered by [Tailwind CSS v4](https://tailwindcss.com/) with Hugo's native integration for styling components with Tailwind v4.

## Requirements

- Hugo v0.148.2+ (Extended Edition)
- Node.js v20+ 
- pnpm (see `packageManager` field in package.json)

## Quick Start

### 1. Install Dependencies

```bash
pnpm install
```

### 2. Run Development Server

```bash
hugo server
```

Tailwind CSS is processed automatically by Hugo using the `css.TailwindCSS` function.

## Features

- **Tailwind CSS v4**: Latest version with improved performance over Tailwind v3
- **Hugo Native Integration**: Uses Hugo's built-in `css.TailwindCSS` function
- **Dynamic CSS Generation**: Only includes utilities actually used in your content for ultra-fast page loads
- **No Pre-compilation**: CSS is generated on-demand (previously Tailwind v3 was pre-compiled in Hugo Blox as `wc.min.css`)
- **Community Components**: Community components work seamlessly without manual compilation

## Configuration

The Tailwind configuration is now in CSS format at `assets/css/main.css` using the `@theme` directive. The configuration includes:

- Hugo Blox color schemes (primary, secondary, neutral)
- Typography settings
- Safelist patterns for dynamic classes
- Dark mode support

## Migration from Tailwind v3

If you're upgrading from Tailwind v3:

1. Install the new dependencies: `pnpm install`
2. Remove any `assets/dist/wc.min.css` files
3. Add the `package.json` file from the latest templates
4. Update your deployment scripts to install it with `pnpm install` (refer to the latest `.github` folder in the templates)
5. The old `tailwind.config.js` and `postcss.config.js` files are no longer needed

## Development

For module development:

```bash
# Install dependencies
pnpm install

# Run development server
hugo server --disableFastRender

# Build for production
hugo --minify
```

## Vendor Libraries

The module includes several third-party vendor libraries that are distributed with the module. These are copied from node_modules to the assets/dist/lib directory during the build process.

To update the vendor libraries:

```bash
# Update vendor libraries to the latest versions and rebuild
pnpm vendor:update-and-build

# Just rebuild vendor libraries without updating versions
pnpm vendor:libs
```

The following libraries are included:
- mermaid (diagrams)
- plotly.js (interactive charts)
- katex (math rendering)
- markmap-autoloader (mind maps)
- alpinejs (interactivity)
- preact (interactive components)


================================================
FILE: modules/blox/archetypes/faq.md
================================================
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: false

# Summary for SEO
summary: ""

# Mark this as an FAQ page to enable FAQPage structured data
faq_page: true

# Categories and tags
categories: []
tags: []

# Pagefind search metadata (automatically indexed)
# type: faq (auto-added by layout)
# category: first category from categories array above

# Option 1: Define FAQs inline
faqs:
  - question: "What is your question here?"
    answer: "Your answer here. Can use **Markdown** formatting."
  
  - question: "Another question?"
    answer: "Another answer with more details."
  
  # Add more Q&As as needed

# Option 2: Alternatively, create child pages under this FAQ section
# and they will automatically be included

# SEO settings
seo:
  title: ""
  description: ""

# Show breadcrumb navigation
show_breadcrumb: true
---

Add an introductory text here that will appear before the FAQ accordion.

This is a great place to provide context about the FAQ section.



================================================
FILE: modules/blox/archetypes/questions.md
================================================
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: false

# The question (can also use title)
question: "{{ replace .Name "-" " " | title }}"

# Short answer (optional - can also use content below)
answer: ""

# Summary for SEO and previews
summary: ""

# Difficulty level (optional)
difficulty: ""  # e.g., "Beginner", "Intermediate", "Advanced"

# Categories and tags for organization
categories: []
tags: []

# Pagefind search metadata (automatically indexed)
# type: questions (auto-added by layout)
# category: first category from categories array above
# difficulty: value from difficulty field below

# Vote counts (optional - for display and structured data)
upvote_count: 0
downvote_count: 0

# Additional/suggested answers (optional)
# suggested_answer:
#   - text: "Alternative answer text here..."
#     author: "Author Name"
#     date: 2024-01-15
#     upvote_count: 5

# Related questions (optional - can also be auto-generated)
# related:
#   - link-to-related-question

# SEO settings
seo:
  title: ""
  description: ""

# Show breadcrumb navigation
show_breadcrumb: true
---

Write your detailed answer here using Markdown.

You can include:
- Code blocks
- Images
- Lists
- Links
- And more!

## Additional Details

Add sections as needed to provide comprehensive information.


================================================
FILE: modules/blox/assets/css/README.md
================================================
# Hugo Blox Tailwind CSS v4 Color System

## Architecture Overview

This system leverages Tailwind CSS v4's automatic utility generation to provide a comprehensive color system with minimal code.

### How It Works

1. **Theme Configuration** (`config/theme.css`)

   - Colors defined in `@theme` block automatically generate ALL utilities
   - Includes standard Tailwind colors: gray, slate, zinc, neutral, stone
   - Includes themeable colors: primary, secondary

2. **Theme Files** (`themes/*.css`)

   - Small files that override `--color-primary-*` and `--color-secondary-*` variables
   - Users switch themes by loading different theme CSS files
   - No utilities redefined - just color values changed

3. **Custom Utilities** (`color-utilities.css`)
   - Only 42 lines vs previous 1,228 lines!
   - Contains only custom colors not auto-generated (like `hb-dark`)

### Available Colors

**Standard Colors (always available):**

- `gray-*` - Neutral grays
- `slate-*` - Cool grays
- `zinc-*` - True grays
- `neutral-*` - Pure grays
- `stone-*` - Warm grays

**Themeable Colors (vary by theme):**

- `primary-*` - Main theme color
- `secondary-*` - Accent theme color

**Custom Colors:**

- `hb-dark` - Hugo Blox brand dark color

### Auto-Generated Utilities

For every color defined in `@theme`, Tailwind automatically creates:

- Background: `bg-{color}-{shade}`
- Text: `text-{color}-{shade}`
- Border: `border-{color}-{shade}`
- Hover: `hover:bg-{color}-{shade}`, `hover:text-{color}-{shade}`
- Dark mode: `dark:bg-{color}-{shade}`, `dark:text-{color}-{shade}`
- Gradients: `from-{color}-{shade}`, `to-{color}-{shade}`
- Focus rings: `focus:ring-{color}-{shade}`
- All other Tailwind color variants

### Shades Available

All colors include 11 shades: `50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950`

### Usage Examples

```html
<!-- Standard colors (always available) -->
<div class="bg-gray-100 dark:bg-gray-800">...</div>
<div class="text-slate-700 hover:text-slate-900">...</div>

<!-- Themeable colors (change with theme) -->
<div class="bg-primary-500 hover:bg-primary-600">...</div>
<div class="bg-gradient-to-r from-primary-600 to-secondary-600">...</div>

<!-- Custom colors -->
<div class="bg-hb-dark text-white">...</div>
```

### Benefits

1. **Dramatically Reduced File Size**: 1,228 lines → 42 lines (97% reduction!)
2. **Automatic Generation**: No manual utility definitions needed
3. **Maintainable**: Add new colors just by defining them in `@theme`
4. **Consistent**: All Tailwind variants automatically available
5. **Themeable**: Easy theme switching via CSS variable overrides

### Adding New Colors

To add a new color scale:

1. Define in `config/theme.css`:

   ```css
   --color-brand-500: 59 130 246;
   --color-brand-600: 37 99 235;
   /* etc. */
   ```

2. Tailwind automatically generates all utilities:
   - `bg-brand-500`, `text-brand-600`, `hover:bg-brand-500`, etc.

No manual utility definitions required!


================================================
FILE: modules/blox/assets/css/animations.css
================================================
/**
 * Hugo Blox Animations
 * Scroll-triggered reveals and micro-interactions
 */

/* Typewriter cursor */
.typewriter-cursor {
  display: inline-block;
  width: 3px;
  margin-left: 2px;
  background-color: currentColor;
  animation: blink 1s step-end infinite;
}

@keyframes blink {
  50% {
    opacity: 0;
  }
}

/* Reveal animations base */
[x-reveal] {
  opacity: 0;
}

/* Stagger container */
[data-stagger] > [data-stagger-item] {
  opacity: 0;
  transform: translateY(20px);
  transition:
    opacity 0.5s ease-out,
    transform 0.5s ease-out;
}

[data-stagger].revealed > [data-stagger-item] {
  opacity: 1;
  transform: translateY(0);
}

/* Hover enhancements for cards */
.card-hover-lift {
  transition:
    transform 0.3s ease-out,
    box-shadow 0.3s ease-out;
}

.card-hover-lift:hover {
  transform: translateY(-4px);
  box-shadow: 0 12px 40px -12px rgba(0, 0, 0, 0.3);
}

/* Hover glow effect */
.hover-glow {
  position: relative;
  transition: all 0.3s ease-out;
}

.hover-glow::before {
  content: "";
  position: absolute;
  inset: -2px;
  border-radius: inherit;
  background: linear-gradient(135deg, var(--color-primary-500), var(--color-secondary-500));
  opacity: 0;
  z-index: -1;
  transition: opacity 0.3s ease-out;
  filter: blur(8px);
}

.hover-glow:hover::before {
  opacity: 0.5;
}

/* Icon bounce on hover */
.icon-bounce:hover {
  animation: iconBounce 0.5s ease-out;
}

@keyframes iconBounce {
  0%,
  100% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(-4px);
  }
}

/* Scale up on hover */
.scale-hover {
  transition: transform 0.2s ease-out;
}

.scale-hover:hover {
  transform: scale(1.05);
}

/* Button pulse */
.btn-pulse {
  position: relative;
}

.btn-pulse::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  box-shadow: 0 0 0 0 currentColor;
  opacity: 0.4;
  animation: pulse-ring 2s infinite;
}

@keyframes pulse-ring {
  0% {
    box-shadow: 0 0 0 0 currentColor;
    opacity: 0.4;
  }
  100% {
    box-shadow: 0 0 0 12px currentColor;
    opacity: 0;
  }
}

/* Float animation for background orbs */
@keyframes float {
  0%,
  100% {
    transform: translateY(0) translateX(0);
  }
  25% {
    transform: translateY(-20px) translateX(10px);
  }
  50% {
    transform: translateY(-10px) translateX(-10px);
  }
  75% {
    transform: translateY(-30px) translateX(5px);
  }
}

.animate-float {
  animation: float 8s ease-in-out infinite;
}

/* Slow rotate for decorative elements */
@keyframes rotate-slow {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

.animate-rotate-slow {
  animation: rotate-slow 30s linear infinite;
}

/* Fade in up - for scroll reveals */
@keyframes fadeInUp {
  from {
    opacity: 0;
    transform: translateY(30px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.animate-fade-in-up {
  animation: fadeInUp 0.6s ease-out forwards;
}

/* Scale in - for icons/badges */
@keyframes scaleIn {
  from {
    opacity: 0;
    transform: scale(0.8);
  }
  to {
    opacity: 1;
    transform: scale(1);
  }
}

.animate-scale-in {
  animation: scaleIn 0.4s ease-out forwards;
}

/* Slide in from left */
@keyframes slideInLeft {
  from {
    opacity: 0;
    transform: translateX(-30px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

.animate-slide-in-left {
  animation: slideInLeft 0.5s ease-out forwards;
}

/* Respect reduced motion */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms;
    animation-iteration-count: 1;
    transition-duration: 0.01ms;
  }

  .typewriter-cursor {
    animation: none;
    opacity: 1;
  }

  [x-reveal],
  [data-stagger] > [data-stagger-item] {
    opacity: 1;
    transform: none;
  }
}

/* Dark mode adjustments */
.dark .hover-glow::before {
  opacity: 0;
}

.dark .hover-glow:hover::before {
  opacity: 0.3;
}

/* Dark mode icon visibility fix */
/* For icons that are dark/black and invisible on dark backgrounds */
.dark .dark-mode-icon svg,
.dark .dark-mode-icon img {
  filter: invert(1) brightness(2);
}

/* Alternative: Add subtle background to icon containers */
.dark .dark-mode-icon {
  background: rgba(255, 255, 255, 0.08);
  border-radius: 0.5rem;
  padding: 0.25rem;
}

/* Hover state restores some contrast */
.dark .group:hover .dark-mode-icon svg,
.dark .group:hover .dark-mode-icon img {
  filter: invert(1) brightness(1.5);
}


================================================
FILE: modules/blox/assets/css/blox/all.css
================================================
@import "biography.css";
@import "skills.css";
@import "navbar.css";


================================================
FILE: modules/blox/assets/css/blox/biography.css
================================================
.resume-biography {
  #profile {
    text-align: center;
    padding: 30px 10px;
    position: relative;
  }

  /* Custom avatar size on homepage - size controlled by template params */
  .avatar {
    width: auto;
    height: auto;
    object-fit: cover;
  }

  .network-icon {
    display: inline-flex;
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: center;
    list-style: none;
    padding: 0;
    margin: 0;
  }

  #profile .network-icon {
    margin-top: 0.5rem;
  }

  .network-icon li {
    margin-right: 10px;

    @media (max-width: 640px) {
      /* Min 48px Lighthouse tap targets on mobile */
      margin-right: 12px;
    }
  }

  .network-icon li:last-of-type {
    margin-right: 0;
  }

  .network-icon li:hover {
    transform: scale(1.2);
  }

  .big-icon {
    font-size: 2rem;
  }

  .ul-interests li {
    font-size: 0.9rem;
  }

  .ul-edu li .description p.course {
    font-size: 0.9rem;
  }

  .ul-edu li .description p.institution {
    font-size: 0.75rem;
  }

  .network-icon .big-icon {
    font-size: 1.5rem;
  }

  .bio-text {
    max-width: 680px;
  }
}

/* Modern Biography Block Enhancements */
.resume-biography-modern {
  /* Ensure proper stacking context for gradients and effects */
  position: relative;
  z-index: 1;
}

/* Ruby pronunciation styling - 2026+ modern design */
.hb-ruby-name {
  ruby-position: over;
  display: ruby;
  text-align: center;
}

.hb-ruby-name rt {
  /* Elegant, subdued annotation text */
  font-size: 0.45em;
  font-weight: var(--hb-font-weight-body-bold, 600);
  letter-spacing: 0.08em;
  line-height: 1.2;

  /* Subtle gradient text for premium feel */
  background: linear-gradient(135deg, var(--color-gray-500) 0%, var(--color-gray-400) 100%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;

  /* Smooth reveal animation */
  opacity: 0.85;
  transition:
    opacity 0.3s ease,
    transform 0.3s ease;
}

.dark .hb-ruby-name rt {
  background: linear-gradient(135deg, var(--color-gray-400) 0%, var(--color-gray-300) 100%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

/* Hover enhancement - subtle lift */
.hb-ruby-name:hover rt {
  opacity: 1;
  transform: translateY(-1px);
}

/* CJK-optimized variant - larger annotation for CJK characters over Latin */
.hb-ruby-name--cjk rt {
  font-size: 0.5em;
  font-weight: 400;
  letter-spacing: 0.12em;
}

/* Latin-optimized variant - smaller annotation for romanization over CJK */
.hb-ruby-name--latin rt {
  font-size: 0.4em;
  font-weight: var(--hb-font-weight-body-bold, 600);
  text-transform: none;
}

/* Accessibility: respect reduced motion */
@media (prefers-reduced-motion: reduce) {
  .hb-ruby-name rt {
    transition: none;
  }

  .hb-ruby-name:hover rt {
    transform: none;
  }
}

/* Fallback styling for browsers without ruby support */
@supports not (display: ruby) {
  .hb-ruby-name {
    display: inline-block;
  }

  .hb-ruby-name rt {
    display: block;
    font-size: 0.6em;
    margin-bottom: 0.25em;
  }
}

/* Legacy class support */
.ruby-modern {
  ruby-position: over;
}

.ruby-modern rt {
  font-size: 0.7em;
  opacity: 0.8;
  letter-spacing: 0.05em;
}

/* Enhanced backdrop blur support */
@supports (backdrop-filter: blur(10px)) {
  .resume-biography-modern [class*="backdrop-blur"] {
    backdrop-filter: blur(10px);
  }
}

/* Smooth animations for all interactive elements */
.resume-biography-modern * {
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}

/* Enhanced focus states for accessibility */
.resume-biography-modern a:focus-visible {
  outline: 2px solid var(--color-primary-500);
  outline-offset: 2px;
  border-radius: 0.5rem;
}

/* Improved text selection styling */
.resume-biography-modern ::selection {
  background-color: color-mix(in oklch, var(--color-primary-200) 30%, transparent);
  color: var(--color-primary-900);
}

.dark .resume-biography-modern ::selection {
  background-color: color-mix(in oklch, var(--color-primary-800) 30%, transparent);
  color: var(--color-primary-100);
}

/* Enhanced gradient text support */
.resume-biography-modern .bg-clip-text {
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

/* Ensure text remains readable on fallback */
@supports not (background-clip: text) {
  .resume-biography-modern .bg-clip-text {
    color: var(--color-neutral-900);
  }

  .dark .resume-biography-modern .bg-clip-text {
    color: var(--color-neutral-100);
  }
}

.avatar-wrapper {
  position: relative;
  /* width and height controlled by template params */
  margin-left: auto;
  margin-right: auto;
}

.avatar-emoji {
  position: absolute;
  width: 40px;
  height: 40px;
  line-height: 40px;
  border-radius: 100%;
  bottom: 0;
  right: 0;
  text-align: center;
  font-size: 20px;
  background-color: #fff;
  color: #000;
  /* override parent alpha */
  box-shadow:
    0 10px 20px rgb(0 0 0 / 4%),
    0 2px 6px rgb(0 0 0 / 4%),
    0 0 1px rgb(0 0 0 / 4%);
}

.dark .avatar-emoji {
  background-color: #000;
  box-shadow:
    0 10px 20px rgb(0 0 0 / 4%),
    0 2px 6px rgb(0 0 0 / 4%),
    0 0 1px rgb(255 255 255 / 96%);
}

/* Biography Block */

.hbx-bg-gradient {
  position: relative;
  isolation: isolate;
}

.hbx-bg-gradient::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
  background-attachment: fixed;
  transition: opacity 0.5s ease-in-out;
  opacity: 1;
}

/* Light Mode Gradient */
.hbx-bg-gradient::before {
  background-image:
    radial-gradient(at 20% 25%, hsla(212, 80%, 95%, 1) 0px, transparent 50%), radial-gradient(at 75% 30%, hsla(160, 80%, 95%, 1) 0px, transparent 50%),
    radial-gradient(at 25% 80%, hsla(280, 80%, 95%, 1) 0px, transparent 50%), radial-gradient(at 75% 85%, hsla(30, 80%, 95%, 1) 0px, transparent 50%);
}

/* Dark Mode Gradient */
.dark .hbx-bg-gradient::before {
  background-image:
    radial-gradient(at 20% 25%, hsla(212, 35%, 15%, 1) 0px, transparent 50%), radial-gradient(at 75% 30%, hsla(160, 35%, 15%, 1) 0px, transparent 50%),
    radial-gradient(at 25% 80%, hsla(280, 35%, 15%, 1) 0px, transparent 50%), radial-gradient(at 75% 85%, hsla(30, 35%, 15%, 1) 0px, transparent 50%);
}


================================================
FILE: modules/blox/assets/css/blox/navbar.css
================================================
/* Navigation Styles */

.navbar {
  @apply relative flex flex-wrap items-center justify-between;
}

.navbar-brand {
  /* @apply text-black dark:text-white text-xl font-semibold; */
  color: var(--hb-color-header-fg);
  @apply text-xl font-semibold;
}

.navbar-brand svg {
  @apply max-h-full max-w-full h-[1em] w-auto inline-block;
}

.navbar-brand img {
  /* To shrink to line height, add: h-[1em] */
  @apply max-h-full w-auto inline-block;
}

/* Ensure interactive controls show hand cursor */
.theme-toggle,
[data-search-toggle],
#search-toggle,
[data-te-collapse-init],
.nav-dropdown > .nav-link[role="button"] {
  @apply cursor-pointer;
}

/* navbar toggler */
input#nav-toggle:checked + label #show-button {
  @apply hidden;
}

input#nav-toggle:checked + label #hide-button {
  @apply block;
}

input#nav-toggle:checked ~ #nav-menu {
  @apply block;
}

#site-header.header {
  background-color: var(--hb-color-header-bg);
  color: var(--hb-color-header-fg);
  @apply py-3 shadow;
}

/* navbar items */

.navbar-nav {
  @apply text-center lg:text-left;
}

.nav-link {
  /* @apply dark:text-white block p-3 font-semibold transition lg:px-2 lg:py-3; */
  color: var(--hb-color-header-fg);
  @apply block p-3 font-semibold transition lg:px-2 lg:py-3;
}

.nav-link:hover {
  color: var(--color-primary-700);
}

.dark .nav-link:hover {
  color: var(--color-primary-300);
}

.nav-dropdown {
  @apply mr-0;
}

.nav-dropdown > svg {
  @apply pointer-events-none;
}

.nav-dropdown-list {
  @apply bg-white dark:bg-slate-900 z-10 min-w-[180px] rounded py-4 shadow hidden lg:invisible lg:absolute lg:block lg:opacity-0;
  /* Ensure dropdown appears above content and under header */
  top: 100%;
  left: 0;
}

.nav-dropdown.active .nav-dropdown-list {
  @apply block lg:visible lg:opacity-100;
}

/* Ensure hover opens dropdown in desktop (CSS-driven) */
@media (min-width: 1024px) {
  .nav-dropdown:hover > .nav-dropdown-list {
    @apply visible opacity-100;
  }
}

.nav-dropdown-item {
  @apply px-4 [&:not(:last-child)]:mb-2;
}

.dark .nav-dropdown-item:hover {
  background-color: var(--color-primary-500);
}

.nav-dropdown-link {
  @apply dark:text-white dark:hover:text-white block py-1 font-semibold transition;
}

.nav-dropdown-link:hover {
  color: var(--color-primary-700);
}


================================================
FILE: modules/blox/assets/css/blox/skills.css
================================================
/*************************************************
 *  Hugo Blox: Skills
 **************************************************/

/* MOVED TO HTML */
/* .skill-group-title { */
/*  display: inline-block; */
/*  margin-bottom: 15px; */
/*  padding-bottom: 5px; */
/*  border-bottom: 2px solid #c7c7c7; */
/*  font-size: 1rem; */
/*  line-height: 30px; */
/*  font-weight: 600; */
/*  text-transform: uppercase; */
/*  letter-spacing: 1px; */
/* } */

.skills-content {
  margin-bottom: 15px;
}

.skills-name {
  margin-bottom: 6px;
  /* color: #888; */ /* Inaccessible */
  font-size: 1rem;
  letter-spacing: 1px;
  text-transform: uppercase;
}

/* .dark .skills-name { */
/*  color: #eee; */
/* } */

.skills-description {
  margin-bottom: 6px;
  font-size: 0.7rem;
  text-transform: none;
}

.skills-icon {
  margin-right: 0.5em;
}

.skills-wrapper {
  position: relative;
  overflow: hidden;
  width: 100%;
  height: 10px;
  border: 1px solid var(--color-primary-200, #cbd5f5);
  border-radius: 10px;
}

.skills-percent {
  position: absolute;
  width: 60%;
  height: 10px;
  background-color: var(--color-primary-600, #2563eb);
}


================================================
FILE: modules/blox/assets/css/chroma.css
================================================
@import "./libs/chroma/light.css";
@import "./libs/chroma/dark.css";

/* Code Blocks: Apply theme background */
/* Requires relative position for Code Copy button */
.prose .chroma,
.prose pre {
  @apply relative rounded-md;

  color: var(--color-neutral-700);
  background-color: var(--color-neutral-50);
}

.dark .prose .chroma,
.dark .prose pre {
  color: white;
  background-color: rgb(71 85 105); /* slate-700 equivalent */
}

/* Fix LaTeX/TeX math rendering in code blocks - prevent inheriting italic from Chroma in dark mode */
.chroma .language-latex,
.chroma .language-latex *,
.chroma .language-tex,
.chroma .language-tex * {
  /* biome-ignore lint/complexity/noImportantStyles: Required to override Chroma's default italic for LaTeX/TeX */
  font-style: normal !important;
}


================================================
FILE: modules/blox/assets/css/color-utilities.css
================================================
/* Hugo Blox Custom Color Utilities for Tailwind v4 */
/* 
 * Standard color utilities (bg-*, text-*, border-*, hover:*, dark:*, from-*, to-*, etc.) 
 * are automatically generated by Tailwind v4 from colors defined in @theme block.
 * 
 * This file only contains custom utilities not auto-generated by Tailwind.
 */

@layer utilities {
  /* Custom Hugo Blox Dark Color */
  .bg-hb-dark {
    background-color: var(--color-hb-dark, rgb(23 24 28));
  }
  .text-hb-dark {
    color: var(--color-hb-dark, rgb(23 24 28));
  }
  .border-hb-dark {
    border-color: var(--color-hb-dark, rgb(23 24 28));
  }

  /* Dark mode variants */
  .dark\:bg-hb-dark:where(.dark, .dark *) {
    background-color: var(--color-hb-dark, rgb(23 24 28));
  }
  .dark\:text-hb-dark:where(.dark, .dark *) {
    color: var(--color-hb-dark, rgb(23 24 28));
  }
}

/* 
 * Available Auto-Generated Utilities (from @theme colors):
 * 
 * Standard Colors: gray, slate, zinc, neutral, stone
 * Theme Colors: primary, secondary (overridden by theme files)
 * 
 * Auto-generated utilities include:
 * - Background: .bg-{color}-{shade}
 * - Text: .text-{color}-{shade}  
 * - Border: .border-{color}-{shade}
 * - Hover: .hover:bg-{color}-{shade}, .hover:text-{color}-{shade}
 * - Dark: .dark:bg-{color}-{shade}, .dark:text-{color}-{shade}
 * - Gradients: .from-{color}-{shade}, .to-{color}-{shade}
 * - Focus: .focus:ring-{color}-{shade}
 * - And all other Tailwind color variants
 * 
 * Shades: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950
 */


================================================
FILE: modules/blox/assets/css/components/all.css
================================================
@import "page.css";
@import "task-list.css";
@import "copy.css";
@import "sidebar-left.css";
@import "charts.css";
@import "steps.css";
@import "cards.css";
@import "math.css";
@import "notebook.css";
@import "author-notes.css";
@import "glassmorphism.css";
@import "cover.css";


================================================
FILE: modules/blox/assets/css/components/author-notes.css
================================================
/* Author Notes Tooltip Styles */

/* Hide elements with x-cloak until Alpine.js initializes */
[x-cloak] {
  /* biome-ignore lint/complexity/noImportantStyles: Required to reliably hide until Alpine initializes */
  display: none !important;
}

/* Ensure tooltip appears above other content */
.author-notes-tooltip {
  z-index: 9999;
}

/* Smooth hover effect for the info icon */
.author-notes {
  @apply inline-flex items-center justify-center;
  @apply transition-all duration-200 ease-in-out;
}

/* Focus styles for accessibility */
.author-notes:focus {
  @apply outline-none ring-2 ring-primary-500 ring-offset-2 rounded-full;
}

/* Additional responsive styles for mobile */
@media (max-width: 640px) {
  /* On mobile, tooltips should be wider if needed */
  .author-notes-tooltip {
    white-space: normal;
    max-width: 200px;
  }
}

/* Print styles - show author notes inline when printing */
@media print {
  .author-notes {
    display: none;
  }

  /* Show author notes as superscript numbers in print */
  .author-notes::after {
    display: inline;
    content: attr(data-tooltip);
    vertical-align: super;
    font-size: 0.75em;
    margin-left: 0.25em;
  }
}


================================================
FILE: modules/blox/assets/css/components/cards.css
================================================
:root {
  --hb-cols: 2;
}

.hb-cards {
  grid-template-columns: repeat(auto-fill, minmax(max(250px, calc((100% - 1rem * 2) / var(--hb-cols))), 1fr));
}

.hb-card {
  @apply flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-transparent hover:shadow-gray-100 dark:hover:shadow-transparent shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200;
  @apply hover:border-gray-300 bg-transparent shadow-sm hover:bg-slate-50 hover:shadow-md;

  border-color: var(--color-neutral-700);
}

.dark .hb-card {
  border-color: var(--color-neutral-700);
}

.dark .hb-card:hover {
  border-color: var(--color-neutral-600);
  background-color: var(--color-neutral-800);
}

.hb-card-title {
  @apply flex font-semibold gap-2 text-gray-700 hover:text-gray-900 items-center;

  color: var(--color-neutral-700);
}

.hb-card-title:hover {
  color: var(--color-neutral-900);
}

.dark .hb-card-title {
  color: var(--color-neutral-200);
}

.dark .hb-card-title:hover {
  color: var(--color-neutral-50);
}

.hb-card-subtitle {
  @apply line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2;
}

.hb-card svg {
  color: var(--color-neutral-700);
  width: 1.5rem;
  transition: color 0.3s ease;
}

.hb-card:hover svg {
  color: currentcolor;
}

.hb-card p {
  margin-top: 0.5rem;
}

.dark .hb-card svg {
  color: var(--color-neutral-300);
}

.dark .hb-card:hover svg {
  color: currentcolor;
}


================================================
FILE: modules/blox/assets/css/components/charts.css
================================================
/* Mermaid.js diagram div */
div.mermaid {
  width: 100%;
  margin-bottom: 1rem;

  svg {
    margin-left: auto;
    margin-right: auto;
  }
}

/* Plotly chart */
div.chart {
  max-width: 100%;
  margin-left: auto;
  margin-right: auto;
  margin-bottom: 1rem;

  /* Add horizontal scroll on mobile since Plotly */
  overflow-x: auto;
}


================================================
FILE: modules/blox/assets/css/components/copy.css
================================================
/* Code Copy */

/* Hugo's Code Block Wrapper Class */

.highlight {
  @apply relative z-0;
}

.copy-button {
  @apply invisible absolute right-0 top-0 z-10 w-20 py-1 cursor-pointer font-mono text-sm whitespace-nowrap rounded-bl-md rounded-tr-md bg-neutral-200 text-neutral-700 opacity-90 dark:bg-neutral-600 dark:text-neutral-200;
}

/* Copy Button */

.highlight:hover > .copy-button {
  @apply visible;
}

.copy-button:hover,
.copy-button:focus,
.copy-button:active,
.copy-button:active:hover {
  background-color: var(--color-primary-100);
}

.dark .copy-button:hover,
.dark .copy-button:focus,
.dark .copy-button:active,
.dark .copy-button:active:hover {
  background-color: var(--color-primary-600);
}


================================================
FILE: modules/blox/assets/css/components/cover.css
================================================
/**
 * Article Cover Component Styles
 * Notion-inspired page cover with icon overlay
 */

.article-cover {
  @apply relative w-full;
  /* Height is set inline via style attribute, but ensure it displays */
  min-height: 200px;
  /* Allow icon to overflow bottom */
  overflow: visible;
  /* Add margin for overlapping icon */
  margin-bottom: 2.5rem;

  /* Responsive height adjustments for mobile */
  @media (max-width: 768px) {
    height: 240px;
    min-height: 240px;
  }
}

/* Cover image container */
.article-cover img {
  @apply w-full h-full object-cover;
}

/* Cover icon container base styles */
.article-cover-icon {
  @apply flex items-center justify-center w-full h-full;
  transition: transform 0.2s ease-in-out;
}

.article-cover-icon:hover {
  @apply scale-105;
}

/* Glass morphism effect for icons */
.article-cover-icon.glass {
  background: rgba(255, 255, 255, 0.9);
  backdrop-filter: blur(12px) saturate(180%);
  border: 1px solid rgba(255, 255, 255, 0.3);
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
}

.dark .article-cover-icon.glass {
  background: rgba(0, 0, 0, 0.7);
  border-color: rgba(255, 255, 255, 0.1);
}

/* Fade effect styles */
.article-cover-fade {
  @apply absolute left-0 right-0 pointer-events-none;
  bottom: -1px;
  background: linear-gradient(to bottom, transparent, white);
}

.dark .article-cover-fade {
  background: linear-gradient(to bottom, transparent, rgb(15, 23, 42));
}

/* Style variants */
.article-cover[data-cover-style="minimal"] {
  @apply shadow-sm;
}

.article-cover[data-cover-style="glass"] {
  @apply overflow-visible;
}

.article-cover[data-cover-style="gradient"] {
  /* Applied via inline overlay divs */
}

/* Ensure cover works well with dark mode */
.dark .article-cover {
  @apply border-b border-gray-800;
}

/* Caption styles */
.article-cover .cover-caption {
  @apply absolute bottom-4 left-4 right-4 text-sm text-white/90;
  @apply bg-black/50 backdrop-blur-sm px-3 py-2 rounded-lg;
}

/* Responsive adjustments */
@media (max-width: 640px) {
  .article-cover-icon {
    @apply scale-90;
  }
}

/* Parallax effect support (optional feature) */
.article-cover.parallax {
  transform-style: preserve-3d;
}

.article-cover.parallax img {
  transform: translateZ(-1px) scale(1.5);
}

/* Link hover effect if cover is clickable */
.article-cover a {
  @apply block w-full h-full;
}

.article-cover a:hover img {
  @apply scale-105 transition-transform duration-500;
}

/* Print styles - show cover but optimize */
@media print {
  .article-cover {
    max-height: 200px;
    page-break-after: avoid;
  }

  .article-cover-fade,
  .article-cover-icon {
    @apply hidden;
  }
}

/* Accessibility: Reduced motion */
@media (prefers-reduced-motion: reduce) {
  .article-cover,
  .article-cover *,
  .article-cover-icon {
    animation: none;
    transition: none;
  }

  .article-cover.parallax img {
    transform: none;
  }
}

/* High contrast mode support */
@media (prefers-contrast: high) {
  .article-cover-icon {
    @apply border-2 border-current;
  }

  .article-cover .cover-caption {
    @apply bg-black text-white;
  }
}


================================================
FILE: modules/blox/assets/css/components/glassmorphism.css
================================================
/**
 * 2025 Hugo Blox Glassmorphism Utility Classes
 *
 * Modern glassmorphism effects for Hugo Blox CTA cards and other components
 */

/* ==========================================================================
   Glassmorphism Base Classes
   ========================================================================== */

.glassmorphism-primary {
  @apply relative overflow-hidden;
  background: linear-gradient(
    135deg,
    color-mix(in oklch, var(--color-primary-500) 90%, transparent),
    color-mix(in oklch, var(--color-primary-600) 95%, transparent),
    color-mix(in oklch, var(--color-primary-700) 90%, transparent)
  );
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
}

.glassmorphism-primary::before {
  content: "";
  @apply absolute inset-0 pointer-events-none;
  background: linear-gradient(45deg, rgb(0 0 0 / 0.1), transparent, rgb(255 255 255 / 0.1));
  mix-blend-mode: overlay;
}

.glassmorphism-secondary {
  @apply relative overflow-hidden;
  background: linear-gradient(
    135deg,
    color-mix(in oklch, var(--color-secondary-500) 90%, transparent),
    color-mix(in oklch, var(--color-secondary-600) 95%, transparent),
    color-mix(in oklch, var(--color-secondary-700) 90%, transparent)
  );
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
}

.glassmorphism-secondary::before {
  content: "";
  @apply absolute inset-0 pointer-events-none;
  background: linear-gradient(45deg, rgb(0 0 0 / 0.1), transparent, rgb(255 255 255 / 0.1));
  mix-blend-mode: overlay;
}

.glassmorphism-dark {
  @apply relative overflow-hidden;
  background: linear-gradient(135deg, rgb(0 0 0 / 0.7), rgb(31 41 55 / 0.8), rgb(0 0 0 / 0.9));
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
}

.glassmorphism-dark::before {
  content: "";
  @apply absolute inset-0 pointer-events-none;
  background: linear-gradient(45deg, rgb(255 255 255 / 0.05), transparent, rgb(255 255 255 / 0.1));
  mix-blend-mode: overlay;
}

.glassmorphism-light {
  @apply relative overflow-hidden;
  background: linear-gradient(135deg, rgb(255 255 255 / 0.9), rgb(248 250 252 / 0.95), rgb(241 245 249 / 0.9));
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
}

.glassmorphism-light::before {
  content: "";
  @apply absolute inset-0 pointer-events-none;
  background: linear-gradient(45deg, rgb(0 0 0 / 0.02), transparent, rgb(255 255 255 / 0.05));
  mix-blend-mode: overlay;
}

/* ==========================================================================
   Noise Texture Classes (when used as background image)
   ========================================================================== */

.noise-texture {
  position: relative;
}

.noise-texture::after {
  content: "";
  @apply absolute inset-0 pointer-events-none;
  background-image: url("/media/textures/noise-pattern.svg");
  background-size: 100px 100px;
  background-repeat: repeat;
  opacity: 0.03;
  mix-blend-mode: multiply;
}

.dark .noise-texture::after {
  mix-blend-mode: screen;
  opacity: 0.02;
}

/* ==========================================================================
   Enhanced Ring Classes for 2025 Design
   ========================================================================== */

.glass-ring {
  @apply ring-1 ring-white/20 hover:ring-white/40 dark:ring-gray-700/50 dark:hover:ring-gray-600/70;
}

.glass-shadow {
  box-shadow:
    0 25px 50px -12px rgb(0 0 0 / 0.25),
    0 0 0 1px rgb(255 255 255 / 0.1),
    inset 0 1px 0 rgb(255 255 255 / 0.1);
}

.dark .glass-shadow {
  box-shadow:
    0 25px 50px -12px rgb(0 0 0 / 0.5),
    0 0 0 1px rgb(255 255 255 / 0.05),
    inset 0 1px 0 rgb(255 255 255 / 0.05);
}

/* ==========================================================================
   CTA Card Glassmorphism Overlay (works with section backgrounds)
   ========================================================================== */

.cta-glassmorphism {
  @apply relative;

  /* Dynamic overlay opacity control */
  --glassmorphism-opacity: 0.15;

  /* Subtle overlay tint that works with any background */
  background: linear-gradient(
    135deg,
    rgb(255 255 255 / var(--glassmorphism-opacity)) 0%,
    rgb(255 255 255 / calc(var(--glassmorphism-opacity) * 0.5)) 50%,
    rgb(255 255 255 / var(--glassmorphism-opacity)) 100%
  );

  /* Enhanced glassmorphism effects */
  backdrop-filter: blur(20px) saturate(1.2);
  -webkit-backdrop-filter: blur(20px) saturate(1.2);

  /* Modern border and shadow for light mode */
  border: 1px solid rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.1));
  box-shadow:
    0 32px 64px -12px rgb(0 0 0 / 0.25),
    inset 0 1px 0 rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.05));
}

.cta-glassmorphism:hover {
  /* Enhanced hover state */
  background: linear-gradient(
    135deg,
    rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.05)) 0%,
    rgb(255 255 255 / calc(var(--glassmorphism-opacity) * 0.7)) 50%,
    rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.05)) 100%
  );

  border: 1px solid rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.2));
  box-shadow:
    0 40px 80px -16px rgb(0 0 0 / 0.3),
    inset 0 1px 0 rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.1));
}

/* Dark mode adjustments for CTA glassmorphism */
.dark .cta-glassmorphism {
  background: linear-gradient(
    135deg,
    rgb(255 255 255 / calc(var(--glassmorphism-opacity) * 0.5)) 0%,
    rgb(255 255 255 / calc(var(--glassmorphism-opacity) * 0.25)) 50%,
    rgb(255 255 255 / calc(var(--glassmorphism-opacity) * 0.5)) 100%
  );

  border: 1px solid rgb(255 255 255 / var(--glassmorphism-opacity));
  box-shadow:
    0 32px 64px -12px rgb(0 0 0 / 0.4),
    inset 0 1px 0 rgb(255 255 255 / calc(var(--glassmorphism-opacity) * 0.5));
}

.dark .cta-glassmorphism:hover {
  background: linear-gradient(
    135deg,
    rgb(255 255 255 / calc(var(--glassmorphism-opacity) * 0.75)) 0%,
    rgb(255 255 255 / calc(var(--glassmorphism-opacity) * 0.4)) 50%,
    rgb(255 255 255 / calc(var(--glassmorphism-opacity) * 0.75)) 100%
  );

  border: 1px solid rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.05));
}

/* ==========================================================================
   CTA Button Glassmorphism (nested within CTA cards)
   ========================================================================== */

.cta-glassmorphism .group {
  /* Ensure proper text contrast in light mode */
  color: var(--color-gray-900);
}

.dark .cta-glassmorphism .group {
  /* Maintain white text in dark mode */
  color: var(--color-gray-100);
}

/* Enhanced button glassmorphism for light mode visibility */
.cta-glassmorphism .group > div:first-child {
  /* Light mode button background */
  background: rgb(255 255 255 / 0.9);
  border: 1px solid rgb(0 0 0 / 0.1);
  box-shadow:
    0 10px 25px -5px rgb(0 0 0 / 0.1),
    0 4px 6px -2px rgb(0 0 0 / 0.1),
    inset 0 1px 0 rgb(255 255 255 / 0.3);
}

.dark .cta-glassmorphism .group > div:first-child {
  /* Dark mode button background */
  background: rgb(0 0 0 / 0.4);
  border: 1px solid rgb(255 255 255 / 0.2);
  box-shadow:
    0 10px 25px -5px rgb(0 0 0 / 0.3),
    0 4px 6px -2px rgb(0 0 0 / 0.2),
    inset 0 1px 0 rgb(255 255 255 / 0.1);
}

.cta-glassmorphism .group:hover > div:first-child {
  background: rgb(255 255 255);
  border: 1px solid rgb(0 0 0 / 0.15);
  box-shadow:
    0 20px 40px -8px rgb(0 0 0 / 0.15),
    0 8px 12px -4px rgb(0 0 0 / 0.1),
    inset 0 1px 0 rgb(255 255 255 / 0.4);
}

.dark .cta-glassmorphism .group:hover > div:first-child {
  background: rgb(0 0 0 / 0.6);
  border: 1px solid rgb(255 255 255 / 0.3);
}


================================================
FILE: modules/blox/assets/css/components/math.css
================================================
/* Prevent long equations overflowing on small screens by scrolling horizontally instead. */
.katex-display {
  overflow: auto hidden;
}


================================================
FILE: modules/blox/assets/css/components/notebook.css
================================================
.hb-notebook {
  --hb-notebook-output-max-height: 26rem;
  @apply relative isolate my-10 rounded-3xl border border-zinc-200/70 bg-white/90 p-6 shadow-xl shadow-primary-500/5 transition-shadow duration-300;
  @apply dark:border-zinc-800/70 dark:bg-zinc-900/70 dark:shadow-black/30 text-zinc-800 dark:text-zinc-50;
}

.hb-notebook::after {
  content: "";
  @apply pointer-events-none absolute inset-0 rounded-3xl bg-gradient-to-r from-primary-500/5 via-transparent to-secondary-500/5 opacity-0 transition-opacity duration-300;
}

.hb-notebook:hover::after {
  @apply opacity-100;
}

.hb-notebook--dense {
  @apply p-4;
}

.hb-notebook-header {
  @apply flex flex-wrap items-start justify-between gap-4 border-b border-zinc-200/70 pb-4 dark:border-zinc-800/70;
}

.hb-notebook-heading {
  @apply space-y-1;
}

.hb-notebook-title {
  @apply text-lg font-semibold text-zinc-900 dark:text-white tracking-tight;
}

.hb-notebook-subtitle {
  @apply text-sm font-medium text-zinc-500 dark:text-zinc-400;
}

.hb-notebook-download {
  @apply inline-flex items-center gap-2 rounded-full border border-primary-500/70 px-4 py-2 text-sm font-medium text-primary-600 no-underline transition-all duration-200;
  @apply hover:-translate-y-0.5 hover:bg-primary-50/60 hover:text-primary-700 dark:text-primary-300 dark:border-primary-400/60 dark:hover:bg-primary-500/10;
}

.hb-notebook-download svg {
  @apply h-4 w-4;
}

.hb-notebook-metadata {
  @apply mt-4 grid gap-3 rounded-2xl border border-dashed border-zinc-200/70 px-4 py-3 text-sm;
  @apply dark:border-zinc-800/70;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
}

.hb-notebook-metadata dt {
  @apply text-xs uppercase tracking-wide text-zinc-500 dark:text-zinc-400;
}

.hb-notebook-metadata dd {
  @apply font-medium text-zinc-800 dark:text-zinc-100;
}

.hb-notebook-body {
  @apply mt-6 flex flex-col gap-5;
}

.hb-notebook-cell {
  @apply rounded-2xl border border-zinc-200/70 bg-white p-4 shadow-sm shadow-zinc-200/60 transition-all duration-200;
  @apply dark:border-zinc-800/60 dark:bg-zinc-900/70 dark:shadow-none;
}

.hb-notebook-cell--markdown {
  @apply bg-gradient-to-br from-white via-white to-primary-50/40 dark:from-zinc-900 dark:via-zinc-900 dark:to-primary-900/10;
}

.hb-notebook-cell-header {
  @apply mb-3 flex flex-wrap items-center gap-3;
}

.hb-notebook-pill {
  @apply inline-flex items-center rounded-full bg-zinc-100 px-3 py-1 text-xs font-semibold uppercase tracking-wide text-zinc-600;
  @apply dark:bg-zinc-800 dark:text-zinc-300;
}

.hb-notebook-tags {
  @apply flex flex-wrap gap-1;
}

.hb-notebook-tags span {
  @apply inline-flex items-center rounded-full bg-primary-100/80 px-2 py-0.5 text-[11px] font-medium text-primary-700;
  @apply dark:bg-primary-400/20 dark:text-primary-200;
}

.hb-notebook-code {
  @apply overflow-hidden rounded-2xl border border-zinc-900/10 bg-zinc-950/95 shadow-inner shadow-black/30;
}

.hb-notebook-code pre {
  @apply m-0 overflow-auto rounded-2xl p-5 text-sm leading-relaxed;
}

.hb-notebook-markdown {
  @apply prose-h1:text-2xl prose-h2:text-xl prose-p:leading-relaxed prose-a:text-primary-600 max-w-none;
}

.hb-notebook-raw {
  @apply rounded-xl border border-dashed border-zinc-300/80 bg-zinc-50 p-4 font-mono text-sm text-zinc-700;
  @apply dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-200 overflow-auto;
}

.hb-notebook-outputs {
  @apply mt-4 space-y-3 rounded-2xl border border-zinc-100/80 bg-zinc-50/80 p-4;
  @apply dark:border-zinc-800/60 dark:bg-zinc-900/50;
}

.hb-notebook-output {
  @apply overflow-auto rounded-xl border border-transparent bg-white/90 p-3 text-sm leading-relaxed text-zinc-700;
  @apply dark:bg-zinc-950/50 dark:text-zinc-100;
  max-height: var(--hb-notebook-output-max-height, 26rem);
}

.hb-notebook-output--stream {
  @apply font-mono bg-zinc-900 text-zinc-100;
}

.hb-notebook-output--error {
  @apply border-red-200 bg-red-50/90 text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200;
}

.hb-notebook-output--image {
  @apply bg-transparent p-0 border-none;
}

.hb-notebook-output--image img,
.hb-notebook-output--image svg {
  @apply h-auto w-full rounded-xl border border-zinc-100/80 bg-white object-contain dark:border-zinc-800/60 dark:bg-zinc-900;
}

.hb-notebook-output--markdown {
  @apply bg-transparent p-0 border-none;
}

.hb-notebook-output pre {
  @apply m-0;
}

.hb-notebook-output code {
  @apply font-mono text-sm;
}

.hb-notebook-empty {
  @apply mt-4 rounded-2xl border border-dashed border-zinc-300/70 bg-zinc-50/80 px-4 py-3 text-center text-sm text-zinc-500;
  @apply dark:border-zinc-700 dark:bg-zinc-900/40 dark:text-zinc-300;
}


================================================
FILE: modules/blox/assets/css/components/page.css
================================================
/* Page layout to push footer to bottom of page */

.page-wrapper {
  /* Min height = viewport height - navbar height */
  min-height: 100vh;
  display: grid;
  grid-template-rows: auto 1fr auto;
  grid-template-columns: 100%;
}

.page-header,
.page-footer {
  flex-shrink: 0;
}

.page-body {
  flex-grow: 1;
}

.article-header {
  position: relative; /* Required for caption positioning */
  clear: both;
}

.article-banner {
  width: 100%;
  height: 260px;
  object-fit: cover;

  /* @include media-breakpoint-up(lg) { */
  /*  height: 310px; !* Increased height on desktop *! */
  /* } */
}

.featured-image-wrapper {
  position: relative;
  padding-left: 0; /* Override container padding. */
  padding-right: 0; /* Override container padding. */
}

.featured-image {
  position: relative;
  width: 100%;
  display: block;
  margin: 0 auto;
}

.article-header-caption {
  position: absolute;
  bottom: 0;
  right: 0;
  margin: 0 auto;
  padding: 2px 5px;
  color: #fff;
  font-size: 0.7em;
  background: #000;
  text-align: right;
  z-index: 5;
  opacity: 0.65;
  border-radius: 5px 0 0;
}

@media (min-width: 64em) {
  .article-header-caption {
    padding: 5px 10px;
  }
}

.article-header-caption a {
  color: #fff;
  text-decoration: none;
}

#page-bg {
  position: fixed;
  left: 0;
  right: 0;
  height: 100%;
  width: 100%;
  z-index: -1;
  display: block;
}

.backlink {
  @apply text-xs font-medium text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-gray-100 contrast-more:text-gray-800 contrast-more:dark:text-gray-50;
}

/* For ToC shortcode, Spoiler shortcode, and direct HTML Details snippets. */
details > summary {
  @apply cursor-pointer font-semibold;

  color: var(--color-primary-700);
}

.dark details > summary {
  color: var(--color-primary-300);
}


================================================
FILE: modules/blox/assets/css/components/sidebar-left.css
================================================
/* Match Tailwind lg (default 1024px): https://tailwindcss.com/docs/screens */
@media (max-width: 1024px) {
  .hb-sidebar-container {
    @apply fixed top-0 w-full bottom-0 z-[15] pt-[calc(var(--navbar-height))] overscroll-contain;

    contain: layout style;
    transition: transform 0.8s cubic-bezier(0.52, 0.16, 0.04, 1);
    will-change: transform, opacity;
    backface-visibility: hidden;
  }
}

.hb-sidebar-container {
  @apply flex flex-col print:hidden lg:top-16 lg:shrink-0 lg:w-64 lg:self-start;

  li > div {
    @apply h-0;
  }

  li.open > div {
    @apply h-auto pt-1;
  }

  li.open > a > span > svg > path {
    @apply rotate-90;
  }
}

.hb-sidebar-list {
  @apply relative flex flex-col gap-1 before:absolute before:inset-y-1 before:w-px before:bg-gray-200 before:content-[""] ltr:ml-3 ltr:pl-3 ltr:before:left-0 rtl:mr-3 rtl:pr-3 rtl:before:right-0;
}

.hb-sidebar-list::before {
  background-color: var(--color-neutral-200);
}

.dark .hb-sidebar-list::before {
  background-color: var(--color-neutral-700);
}

.hb-scrollbar {
  @apply overflow-y-auto overflow-x-hidden p-4 grow;

  scrollbar-width: thin;
  scrollbar-color: oklch(55.55% 0 0 / 40%) transparent;
  scrollbar-gutter: stable;

  &::-webkit-scrollbar {
    @apply w-3 h-3;
  }

  &::-webkit-scrollbar-track {
    @apply bg-transparent;
  }

  &::-webkit-scrollbar-thumb {
    @apply rounded-[10px];
  }

  &:hover::-webkit-scrollbar-thumb {
    border: 3px solid transparent;
    background-color: var(--tw-shadow-color);
    background-clip: content-box;
    @apply shadow-neutral-500/20 hover:shadow-neutral-500/40;
  }
}

.hb-docs-link {
  @apply flex rounded px-2 py-1.5 text-sm transition-colors [word-break:break-word] cursor-pointer [-webkit-tap-highlight-color:transparent] [-webkit-touch-callout:none] gap-2 before:opacity-25 before:content-['#'] text-gray-500 hover:bg-gray-100 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-50;
}

.dark .hb-docs-link:hover {
  background-color: color-mix(in oklch, var(--color-primary-100) 5%, transparent);
}

.hb-sidebar-mobile-menu {
  @apply [transition:background-color_0.5s_ease];
}

.hb-sidebar-mobile-toc {
  @apply flex flex-col gap-1 relative before:absolute before:inset-y-1 before:w-px before:bg-gray-200 before:content-[""] ltr:pl-3 ltr:before:left-0 rtl:pr-3 rtl:before:right-0 ltr:ml-3 rtl:mr-3;
}

.hb-sidebar-mobile-toc::before {
  background-color: var(--color-neutral-200);
}

.dark .hb-sidebar-mobile-toc::before {
  background-color: var(--color-neutral-800);
}

.hb-sidebar-custom-link {
  @apply flex items-center justify-between gap-2 cursor-pointer rounded px-2 py-1.5 text-sm transition-colors [-webkit-tap-highlight-color:transparent] [-webkit-touch-callout:none] [word-break:break-word];
}


================================================
FILE: modules/blox/assets/css/components/steps.css
================================================
.hb-steps {
  @apply ml-4 mb-12 pl-6 border-l border-gray-200 [counter-reset:hb_step];

  border-left-color: var(--color-neutral-200);
}

.dark .hb-steps {
  border-left-color: var(--color-neutral-600);
}

.hb-steps h3 {
  counter-increment: hb-step;

  &::before {
    @apply absolute w-[33px] h-[33px];
    @apply rounded-full border-4 border-white dark:border-slate-300;
    @apply bg-gray-100 dark:bg-hb-dark;
    @apply text-base font-normal text-center -indent-px;
    @apply mt-[3px] ml-[-41px];

    color: var(--color-neutral-700);
    content: counter(hb-step);
  }
}

.dark .hb-steps h3::before {
  color: var(--color-neutral-200);
}


================================================
FILE: modules/blox/assets/css/components/task-list.css
================================================
/* HugoBlox Kit - https://hugoblox.com
 * Task List Component
 * License: https://github.com/HugoBlox/kit/blob/main/LICENSE.md
 */

ul.task-list {
  list-style: none;
}

ul.task-list li input[type="checkbox"] {
  margin-right: 0.5rem;
}

ul.task-list input[type="checkbox"]:checked {
  appearance: none;
  width: 1em;
  height: 1em;
  border: none;
  background: initial;
  position: relative;
}

ul.task-list input[type="checkbox"]:not(:checked) {
  width: 0.9em;
  height: 0.9em;
}

ul.task-list input[type="checkbox"]:checked::after {
  content: "✅";
}


================================================
FILE: modules/blox/assets/css/config/safelist.css
================================================
/* Safelist patterns for dynamic classes */
/* Note: In v4, we use @source inline to ensure these are included */
/* This ensures Tailwind generates these classes even if not found in templates */

/* Inline safelist for classes used in dynamic content and YAML configuration */
/* Includes search modal Quick Actions dynamic color classes */
@source inline("<div class='block hidden dark:block dark:hidden'></div><div class='task-list'></div><div class='pl-4 pl-8 pl-12'></div><div class='min-h-screen'></div><div class='border-l-2 border-primary-600 bg-primary-50 dark:bg-primary-900/20'></div><div class='overflow-hidden animate-pulse animate-float animate-rotate-slow'></div><div class='blur-2xl blur-3xl -z-10'></div><div class='top-0 bottom-0 left-0 right-0 left-1/4 right-1/4 left-1/2 right-1/2 left-1/3 right-1/3'></div><div class='w-64 w-72 w-80 w-96 h-64 h-72 h-80 h-96 h-48 h-56 rounded-full'></div><div class='skew-y-2 -skew-y-2 skew-y-3 -skew-y-3'></div><div class='md:grid-cols-1 md:grid-cols-2 md:grid-cols-3 md:grid-cols-4 md:grid-cols-5 md:grid-cols-6'></div><div class='bg-white bg-gray-50 bg-gray-100 bg-gray-200 bg-gray-300 bg-gray-400 bg-gray-500 bg-gray-600 bg-gray-700 bg-gray-800 bg-gray-900'></div><div class='bg-neutral-50 bg-neutral-100 bg-neutral-200 bg-neutral-300 bg-neutral-400 bg-neutral-500 bg-neutral-600 bg-neutral-700 bg-neutral-800 bg-neutral-900'></div><div class='dark:bg-neutral-700 dark:bg-neutral-800 dark:bg-neutral-900'></div><div class='bg-primary-50 bg-primary-100 bg-primary-200 bg-primary-300 bg-primary-400 bg-primary-500 bg-primary-600 bg-primary-700 bg-primary-800 bg-primary-900'></div><div class='bg-primary-500/10 bg-primary-500/20 bg-primary-500/30 bg-primary-500/40 bg-primary-600/10 bg-primary-600/20 bg-primary-600/30 bg-primary-600/40'></div><div class='via-transparent from-primary-500/20 to-primary-600/20'></div><div class='bg-secondary-50 bg-secondary-100 bg-secondary-200 bg-secondary-300 bg-secondary-400 bg-secondary-500 bg-secondary-600 bg-secondary-700 bg-secondary-800 bg-secondary-900'></div><div class='text-primary-50 text-primary-100 text-primary-200 text-primary-300 text-primary-400 text-primary-500 text-primary-600 text-primary-700 text-primary-800 text-primary-900'></div><div class='text-secondary-50 text-secondary-100 text-secondary-200 text-secondary-300 text-secondary-400 text-secondary-500 text-secondary-600 text-secondary-700 text-secondary-800 text-secondary-900'></div><div class='text-neutral-50 text-neutral-100 text-neutral-200 text-neutral-300 text-neutral-400 text-neutral-500 text-neutral-600 text-neutral-700 text-neutral-800 text-neutral-900'></div><div class='text-white text-black dark:text-white'></div><div class='dark:text-neutral-300 dark:text-neutral-400'></div><div class='border-primary-50 border-primary-100 border-primary-200 border-primary-300 border-primary-400 border-primary-500 border-primary-600 border-primary-700 border-primary-800 border-primary-900'></div><div class='border-secondary-50 border-secondary-100 border-secondary-200 border-secondary-300 border-secondary-400 border-secondary-500 border-secondary-600 border-secondary-700 border-secondary-800 border-secondary-900'></div><div class='border-neutral-50 border-neutral-100 border-neutral-200 border-neutral-300 border-neutral-400 border-neutral-500 border-neutral-600 border-neutral-700 border-neutral-800 border-neutral-900'></div><div class='bg-gradient-to-t bg-gradient-to-tr bg-gradient-to-r bg-gradient-to-br bg-gradient-to-b bg-gradient-to-bl bg-gradient-to-l bg-gradient-to-tl'></div><div class='from-primary-50 from-primary-100 from-primary-200 from-primary-300 from-primary-400 from-primary-500 from-primary-600 from-primary-700 from-primary-800 from-primary-900'></div><div class='from-secondary-50 from-secondary-100 from-secondary-200 from-secondary-300 from-secondary-400 from-secondary-500 from-secondary-600 from-secondary-700 from-secondary-800 from-secondary-900'></div><div class='to-primary-50 to-primary-100 to-primary-200 to-primary-300 to-primary-400 to-primary-500 to-primary-600 to-primary-700 to-primary-800 to-primary-900'></div><div class='to-secondary-50 to-secondary-100 to-secondary-200 to-secondary-300 to-secondary-400 to-secondary-500 to-secondary-600 to-secondary-700 to-secondary-800 to-secondary-900'></div><div class='hover:from-primary-500 hover:from-secondary-500 hover:to-primary-500 hover:to-secondary-500'></div><div class='hover:bg-primary-50 hover:bg-primary-100 hover:bg-primary-200 hover:bg-primary-300 hover:bg-primary-400 hover:bg-primary-500 hover:bg-primary-600 hover:bg-primary-700 hover:bg-primary-800 hover:bg-primary-900'></div><div class='hover:bg-neutral-50 hover:bg-neutral-100 hover:bg-neutral-200 hover:bg-neutral-300 hover:bg-neutral-400 hover:bg-neutral-500 hover:bg-neutral-600 hover:bg-neutral-700 hover:bg-neutral-800 hover:bg-neutral-900'></div><div class='hover:text-primary hover:text-primary-50 hover:text-primary-100 hover:text-primary-200 hover:text-primary-300 hover:text-primary-400 hover:text-primary-500 hover:text-primary-600 hover:text-primary-700 hover:text-primary-800 hover:text-primary-900'></div><div class='hover:text-neutral-50 hover:text-neutral-100 hover:text-neutral-200 hover:text-neutral-300 hover:text-neutral-400 hover:text-neutral-500 hover:text-neutral-600 hover:text-neutral-700 hover:text-neutral-800 hover:text-neutral-900'></div><div class='dark:hover:bg-primary-50 dark:hover:bg-primary-100 dark:hover:bg-primary-200 dark:hover:bg-primary-300 dark:hover:bg-primary-400 dark:hover:bg-primary-500 dark:hover:bg-primary-600 dark:hover:bg-primary-700 dark:hover:bg-primary-800 dark:hover:bg-primary-900'></div><div class='dark:hover:text-neutral-50 dark:hover:text-neutral-100 dark:hover:text-neutral-200 dark:hover:text-neutral-300 dark:hover:text-neutral-400 dark:hover:text-neutral-500 dark:hover:text-neutral-600 dark:hover:text-neutral-700 dark:hover:text-neutral-800 dark:hover:text-neutral-900'></div><div class='bg-indigo-50 bg-indigo-100 bg-indigo-200 bg-indigo-300 bg-indigo-400 bg-indigo-500 bg-indigo-600 bg-indigo-700 bg-indigo-800 bg-indigo-900 bg-indigo-950'></div><div class='bg-purple-50 bg-purple-100 bg-purple-200 bg-purple-300 bg-purple-400 bg-purple-500 bg-purple-600 bg-purple-700 bg-purple-800 bg-purple-900 bg-purple-950'></div><div class='bg-pink-50 bg-pink-100 bg-pink-200 bg-pink-300 bg-pink-400 bg-pink-500 bg-pink-600 bg-pink-700 bg-pink-800 bg-pink-900 bg-pink-950'></div><div class='bg-red-50 bg-red-100 bg-red-200 bg-red-300 bg-red-400 bg-red-500 bg-red-600 bg-red-700 bg-red-800 bg-red-900 bg-red-950'></div><div class='bg-orange-50 bg-orange-100 bg-orange-200 bg-orange-300 bg-orange-400 bg-orange-500 bg-orange-600 bg-orange-700 bg-orange-800 bg-orange-900 bg-orange-950'></div><div class='bg-amber-50 bg-amber-100 bg-amber-200 bg-amber-300 bg-amber-400 bg-amber-500 bg-amber-600 bg-amber-700 bg-amber-800 bg-amber-900 bg-amber-950'></div><div class='bg-yellow-50 bg-yellow-100 bg-yellow-200 bg-yellow-300 bg-yellow-400 bg-yellow-500 bg-yellow-600 bg-yellow-700 bg-yellow-800 bg-yellow-900 bg-yellow-950'></div><div class='bg-lime-50 bg-lime-100 bg-lime-200 bg-lime-300 bg-lime-400 bg-lime-500 bg-lime-600 bg-lime-700 bg-lime-800 bg-lime-900 bg-lime-950'></div><div class='bg-green-50 bg-green-100 bg-green-200 bg-green-300 bg-green-400 bg-green-500 bg-green-600 bg-green-700 bg-green-800 bg-green-900 bg-green-950'></div><div class='bg-emerald-50 bg-emerald-100 bg-emerald-200 bg-emerald-300 bg-emerald-400 bg-emerald-500 bg-emerald-600 bg-emerald-700 bg-emerald-800 bg-emerald-900 bg-emerald-950'></div><div class='bg-teal-50 bg-teal-100 bg-teal-200 bg-teal-300 bg-teal-400 bg-teal-500 bg-teal-600 bg-teal-700 bg-teal-800 bg-teal-900 bg-teal-950'></div><div class='bg-cyan-50 bg-cyan-100 bg-cyan-200 bg-cyan-300 bg-cyan-400 bg-cyan-500 bg-cyan-600 bg-cyan-700 bg-cyan-800 bg-cyan-900 bg-cyan-950'></div><div class='bg-sky-50 bg-sky-100 bg-sky-200 bg-sky-300 bg-sky-400 bg-sky-500 bg-sky-600 bg-sky-700 bg-sky-800 bg-sky-900 bg-sky-950'></div><div class='bg-blue-50 bg-blue-100 bg-blue-200 bg-blue-300 bg-blue-400 bg-blue-500 bg-blue-600 bg-blue-700 bg-blue-800 bg-blue-900 bg-blue-950'></div><div class='bg-violet-50 bg-violet-100 bg-violet-200 bg-violet-300 bg-violet-400 bg-violet-500 bg-violet-600 bg-violet-700 bg-violet-800 bg-violet-900 bg-violet-950'></div><div class='from-indigo-950 from-purple-900 to-indigo-950 to-purple-900'></div><div class='hover:border-primary-500 hover:border-green-500 hover:border-blue-500 hover:border-red-500 hover:border-amber-500 hover:border-purple-500'></div><div class='text-primary-600 text-green-600 text-blue-600 text-red-600 text-amber-600 text-purple-600'></div><div class='dark:bg-primary-900 dark:bg-green-900 dark:bg-blue-900 dark:bg-red-900 dark:bg-amber-900 dark:bg-purple-900'></div><div class='dark:text-primary-400 dark:text-green-400 dark:text-blue-400 dark:text-red-400 dark:text-amber-400 dark:text-purple-400'></div><div class='dark:hover:bg-primary-900/10 dark:hover:bg-green-900/10 dark:hover:bg-blue-900/10 dark:hover:bg-red-900/10 dark:hover:bg-amber-900/10 dark:hover:bg-purple-900/10'></div>");

/* Force generation of all CSS custom properties for dynamic usage in YAML front matter */
/* Hidden utility class that forces all color variables to be generated */
.force-all-color-vars {
  /* Primary Colors */
  color: var(--color-primary-50);
  color: var(--color-primary-100);
  color: var(--color-primary-200);
  color: var(--color-primary-300);
  color: var(--color-primary-400);
  color: var(--color-primary-500);
  color: var(--color-primary-600);
  color: var(--color-primary-700);
  color: var(--color-primary-800);
  color: var(--color-primary-900);
  color: var(--color-primary-950);

  /* Secondary Colors */
  color: var(--color-secondary-50);
  color: var(--color-secondary-100);
  color: var(--color-secondary-200);
  color: var(--color-secondary-300);
  color: var(--color-secondary-400);
  color: var(--color-secondary-500);
  color: var(--color-secondary-600);
  color: var(--color-secondary-700);
  color: var(--color-secondary-800);
  color: var(--color-secondary-900);
  color: var(--color-secondary-950);

  /* Extended Color Palette for Dynamic Gradients */
  color: var(--color-indigo-50);
  color: var(--color-indigo-100);
  color: var(--color-indigo-200);
  color: var(--color-indigo-300);
  color: var(--color-indigo-400);
  color: var(--color-indigo-500);
  color: var(--color-indigo-600);
  color: var(--color-indigo-700);
  color: var(--color-indigo-800);
  color: var(--color-indigo-900);
  color: var(--color-indigo-950);

  color: var(--color-purple-50);
  color: var(--color-purple-100);
  color: var(--color-purple-200);
  color: var(--color-purple-300);
  color: var(--color-purple-400);
  color: var(--color-purple-500);
  color: var(--color-purple-600);
  color: var(--color-purple-700);
  color: var(--color-purple-800);
  color: var(--color-purple-900);
  color: var(--color-purple-950);

  color: var(--color-pink-50);
  color: var(--color-pink-100);
  color: var(--color-pink-200);
  color: var(--color-pink-300);
  color: var(--color-pink-400);
  color: var(--color-pink-500);
  color: var(--color-pink-600);
  color: var(--color-pink-700);
  color: var(--color-pink-800);
  color: var(--color-pink-900);
  color: var(--color-pink-950);

  color: var(--color-red-50);
  color: var(--color-red-100);
  color: var(--color-red-200);
  color: var(--color-red-300);
  color: var(--color-red-400);
  color: var(--color-red-500);
  color: var(--color-red-600);
  color: var(--color-red-700);
  color: var(--color-red-800);
  color: var(--color-red-900);
  color: var(--color-red-950);

  color: var(--color-orange-50);
  color: var(--color-orange-100);
  color: var(--color-orange-200);
  color: var(--color-orange-300);
  color: var(--color-orange-400);
  color: var(--color-orange-500);
  color: var(--color-orange-600);
  color: var(--color-orange-700);
  color: var(--color-orange-800);
  color: var(--color-orange-900);
  color: var(--color-orange-950);

  color: var(--color-amber-50);
  color: var(--color-amber-100);
  color: var(--color-amber-200);
  color: var(--color-amber-300);
  color: var(--color-amber-400);
  color: var(--color-amber-500);
  color: var(--color-amber-600);
  color: var(--color-amber-700);
  color: var(--color-amber-800);
  color: var(--color-amber-900);
  color: var(--color-amber-950);

  color: var(--color-yellow-50);
  color: var(--color-yellow-100);
  color: var(--color-yellow-200);
  color: var(--color-yellow-300);
  color: var(--color-yellow-400);
  color: var(--color-yellow-500);
  color: var(--color-yellow-600);
  color: var(--color-yellow-700);
  color: var(--color-yellow-800);
  color: var(--color-yellow-900);
  color: var(--color-yellow-950);

  color: var(--color-lime-50);
  color: var(--color-lime-100);
  color: var(--color-lime-200);
  color: var(--color-lime-300);
  color: var(--color-lime-400);
  color: var(--color-lime-500);
  color: var(--color-lime-600);
  color: var(--color-lime-700);
  color: var(--color-lime-800);
  color: var(--color-lime-900);
  color: var(--color-lime-950);

  color: var(--color-green-50);
  color: var(--color-green-100);
  color: var(--color-green-200);
  color: var(--color-green-300);
  color: var(--color-green-400);
  color: var(--color-green-500);
  color: var(--color-green-600);
  color: var(--color-green-700);
  color: var(--color-green-800);
  color: var(--color-green-900);
  color: var(--color-green-950);

  color: var(--color-emerald-50);
  color: var(--color-emerald-100);
  color: var(--color-emerald-200);
  color: var(--color-emerald-300);
  color: var(--color-emerald-400);
  color: var(--color-emerald-500);
  color: var(--color-emerald-600);
  color: var(--color-emerald-700);
  color: var(--color-emerald-800);
  color: var(--color-emerald-900);
  color: var(--color-emerald-950);

  color: var(--color-teal-50);
  color: var(--color-teal-100);
  color: var(--color-teal-200);
  color: var(--color-teal-300);
  color: var(--color-teal-400);
  color: var(--color-teal-500);
  color: var(--color-teal-600);
  color: var(--color-teal-700);
  color: var(--color-teal-800);
  color: var(--color-teal-900);
  color: var(--color-teal-950);

  color: var(--color-cyan-50);
  color: var(--color-cyan-100);
  color: var(--color-cyan-200);
  color: var(--color-cyan-300);
  color: var(--color-cyan-400);
  color: var(--color-cyan-500);
  color: var(--color-cyan-600);
  color: var(--color-cyan-700);
  color: var(--color-cyan-800);
  color: var(--color-cyan-900);
  color: var(--color-cyan-950);

  color: var(--color-sky-50);
  color: var(--color-sky-100);
  color: var(--color-sky-200);
  color: var(--color-sky-300);
  color: var(--color-sky-400);
  color: var(--color-sky-500);
  color: var(--color-sky-600);
  color: var(--color-sky-700);
  color: var(--color-sky-800);
  color: var(--color-sky-900);
  color: var(--color-sky-950);

  color: var(--color-blue-50);
  color: var(--color-blue-100);
  color: var(--color-blue-200);
  color: var(--color-blue-300);
  color: var(--color-blue-400);
  color: var(--color-blue-500);
  color: var(--color-blue-600);
  color: var(--color-blue-700);
  color: var(--color-blue-800);
  color: var(--color-blue-900);
  color: var(--color-blue-950);

  color: var(--color-violet-50);
  color: var(--color-violet-100);
  color: var(--color-violet-200);
  color: var(--color-violet-300);
  color: var(--color-violet-400);
  color: var(--color-violet-500);
  color: var(--color-violet-600);
  color: var(--color-violet-700);
  color: var(--color-violet-800);
  color: var(--color-violet-900);
  color: var(--color-violet-950);

  /* Never display this class */
  display: none !important;
}

/* Support for dual light/dark background colors in parse_block_v2.html */
@media (prefers-color-scheme: dark) {
  .home-section-bg[style*="--dark-bg-color"] {
    background-color: var(--dark-bg-color) !important;
  }
}

.dark .home-section-bg[style*="--dark-bg-color"] {
  background-color: var(--dark-bg-color) !important;
}


================================================
FILE: modules/blox/assets/css/config/tailwind.css
================================================
/* Tailwind CSS v4 Configuration */
/* Content detection and plugin configuration */

/* Typography plugin for prose styles */
@plugin "@tailwindcss/typography";

/* Content detection sources */
/* Note: @source is a Tailwind v4 directive - linters may show warnings that can be ignored */
/* Hugo stats file contains all detected classes from templates */
@source "hugo_stats.json";

/* Custom Variants Configuration */
/* Configure dark mode to use class strategy */
@custom-variant dark (&:where(.dark, .dark *));

/* Configure hover to work on all devices (like v3 behavior) */
@custom-variant hover (&:hover);

/* Dark mode configuration */
@media (prefers-color-scheme: dark) {
  :root {
    color-scheme: dark;
  }
}


================================================
FILE: modules/blox/assets/css/config/theme.css
================================================
/* Tailwind CSS v4 Hugo BloxTheme Configuration */

/* Theme Configuration */
@theme {
  /* Custom Colors */
  --color-hb-dark: rgb(23 24 28);

  /* Standard Tailwind Color Scales - Provide variables as valid CSS colors */
  /* Gray */
  --color-gray-50: rgb(249 250 251);
  --color-gray-100: rgb(243 244 246);
  --color-gray-200: rgb(229 231 235);
  --color-gray-300: rgb(209 213 219);
  --color-gray-400: rgb(156 163 175);
  --color-gray-500: rgb(107 114 128);
  --color-gray-600: rgb(75 85 99);
  --color-gray-700: rgb(55 65 81);
  --color-gray-800: rgb(31 41 55);
  --color-gray-900: rgb(17 24 39);
  --color-gray-950: rgb(3 7 18);

  /* Slate */
  --color-slate-50: rgb(248 250 252);
  --color-slate-100: rgb(241 245 249);
  --color-slate-200: rgb(226 232 240);
  --color-slate-300: rgb(203 213 225);
  --color-slate-400: rgb(148 163 184);
  --color-slate-500: rgb(100 116 139);
  --color-slate-600: rgb(71 85 105);
  --color-slate-700: rgb(51 65 85);
  --color-slate-800: rgb(30 41 59);
  --color-slate-900: rgb(15 23 42);
  --color-slate-950: rgb(2 6 23);

  /* Zinc */
  --color-zinc-50: rgb(250 250 250);
  --color-zinc-100: rgb(244 244 245);
  --color-zinc-200: rgb(228 228 231);
  --color-zinc-300: rgb(212 212 216);
  --color-zinc-400: rgb(161 161 170);
  --color-zinc-500: rgb(113 113 122);
  --color-zinc-600: rgb(82 82 91);
  --color-zinc-700: rgb(63 63 70);
  --color-zinc-800: rgb(39 39 42);
  --color-zinc-900: rgb(24 24 27);
  --color-zinc-950: rgb(9 9 11);

  /* Neutral */
  --color-neutral-50: rgb(250 250 250);
  --color-neutral-100: rgb(245 245 245);
  --color-neutral-200: rgb(229 229 229);
  --color-neutral-300: rgb(212 212 212);
  --color-neutral-400: rgb(163 163 163);
  --color-neutral-500: rgb(115 115 115);
  --color-neutral-600: rgb(82 82 82);
  --color-neutral-700: rgb(64 64 64);
  --color-neutral-800: rgb(38 38 38);
  --color-neutral-900: rgb(23 23 23);
  --color-neutral-950: rgb(10 10 10);

  /* Stone */
  --color-stone-50: rgb(250 250 249);
  --color-stone-100: rgb(245 245 244);
  --color-stone-200: rgb(231 229 228);
  --color-stone-300: rgb(214 211 209);
  --color-stone-400: rgb(168 162 158);
  --color-stone-500: rgb(120 113 108);
  --color-stone-600: rgb(87 83 78);
  --color-stone-700: rgb(68 64 60);
  --color-stone-800: rgb(41 37 36);
  --color-stone-900: rgb(28 25 23);
  --color-stone-950: rgb(12 10 9);

  /* Red */
  --color-red-50: rgb(254 242 242);
  --color-red-100: rgb(254 226 226);
  --color-red-200: rgb(254 202 202);
  --color-red-300: rgb(252 165 165);
  --color-red-400: rgb(248 113 113);
  --color-red-500: rgb(239 68 68);
  --color-red-600: rgb(220 38 38);
  --color-red-700: rgb(185 28 28);
  --color-red-800: rgb(153 27 27);
  --color-red-900: rgb(127 29 29);
  --color-red-950: rgb(69 10 10);

  /* Orange */
  --color-orange-50: rgb(255 247 237);
  --color-orange-100: rgb(255 237 213);
  --color-orange-200: rgb(254 215 170);
  --color-orange-300: rgb(253 186 116);
  --color-orange-400: rgb(251 146 60);
  --color-orange-500: rgb(249 115 22);
  --color-orange-600: rgb(234 88 12);
  --color-orange-700: rgb(194 65 12);
  --color-orange-800: rgb(154 52 18);
  --color-orange-900: rgb(124 45 18);
  --color-orange-950: rgb(67 20 7);

  /* Amber */
  --color-amber-50: rgb(255 251 235);
  --color-amber-100: rgb(254 243 199);
  --color-amber-200: rgb(253 230 138);
  --color-amber-300: rgb(252 211 77);
  --color-amber-400: rgb(251 191 36);
  --color-amber-500: rgb(245 158 11);
  --color-amber-600: rgb(217 119 6);
  --color-amber-700: rgb(180 83 9);
  --color-amber-800: rgb(146 64 14);
  --color-amber-900: rgb(120 53 15);
  --color-amber-950: rgb(69 26 3);

  /* Yellow */
  --color-yellow-50: rgb(254 252 232);
  --color-yellow-100: rgb(254 249 195);
  --color-yellow-200: rgb(254 240 138);
  --color-yellow-300: rgb(253 224 71);
  --color-yellow-400: rgb(250 204 21);
  --color-yellow-500: rgb(234 179 8);
  --color-yellow-600: rgb(202 138 4);
  --color-yellow-700: rgb(161 98 7);
  --color-yellow-800: rgb(133 77 14);
  --color-yellow-900: rgb(113 63 18);
  --color-yellow-950: rgb(66 32 6);

  /* Lime */
  --color-lime-50: rgb(247 254 231);
  --color-lime-100: rgb(236 252 203);
  --color-lime-200: rgb(217 249 157);
  --color-lime-300: rgb(190 242 100);
  --color-lime-400: rgb(163 230 53);
  --color-lime-500: rgb(132 204 22);
  --color-lime-600: rgb(101 163 13);
  --color-lime-700: rgb(77 124 15);
  --color-lime-800: rgb(63 98 18);
  --color-lime-900: rgb(54 83 20);
  --color-lime-950: rgb(26 46 5);

  /* Green */
  --color-green-50: rgb(240 253 244);
  --color-green-100: rgb(220 252 231);
  --color-green-200: rgb(187 247 208);
  --color-green-300: rgb(134 239 172);
  --color-green-400: rgb(74 222 128);
  --color-green-500: rgb(34 197 94);
  --color-green-600: rgb(22 163 74);
  --color-green-700: rgb(21 128 61);
  --color-green-800: rgb(22 101 52);
  --color-green-900: rgb(20 83 45);
  --color-green-950: rgb(5 46 22);

  /* Emerald */
  --color-emerald-50: rgb(236 253 245);
  --color-emerald-100: rgb(209 250 229);
  --color-emerald-200: rgb(167 243 208);
  --color-emerald-300: rgb(110 231 183);
  --color-emerald-400: rgb(52 211 153);
  --color-emerald-500: rgb(16 185 129);
  --color-emerald-600: rgb(5 150 105);
  --color-emerald-700: rgb(4 120 87);
  --color-emerald-800: rgb(6 95 70);
  --color-emerald-900: rgb(6 78 59);
  --color-emerald-950: rgb(2 44 34);

  /* Teal */
  --color-teal-50: rgb(240 253 250);
  --color-teal-100: rgb(204 251 241);
  --color-teal-200: rgb(153 246 228);
  --color-teal-300: rgb(94 234 212);
  --color-teal-400: rgb(45 212 191);
  --color-teal-500: rgb(20 184 166);
  --color-teal-600: rgb(13 148 136);
  --color-teal-700: rgb(15 118 110);
  --color-teal-800: rgb(17 94 89);
  --color-teal-900: rgb(19 78 74);
  --color-teal-950: rgb(4 47 46);

  /* Cyan */
  --color-cyan-50: rgb(236 254 255);
  --color-cyan-100: rgb(207 250 254);
  --color-cyan-200: rgb(165 243 252);
  --color-cyan-300: rgb(103 232 249);
  --color-cyan-400: rgb(34 211 238);
  --color-cyan-500: rgb(6 182 212);
  --color-cyan-600: rgb(8 145 178);
  --color-cyan-700: rgb(14 116 144);
  --color-cyan-800: rgb(21 94 117);
  --color-cyan-900: rgb(22 78 99);
  --color-cyan-950: rgb(8 51 68);

  /* Sky */
  --color-sky-50: rgb(240 249 255);
  --color-sky-100: rgb(224 242 254);
  --color-sky-200: rgb(186 230 253);
  --color-sky-300: rgb(125 211 252);
  --color-sky-400: rgb(56 189 248);
  --color-sky-500: rgb(14 165 233);
  --color-sky-600: rgb(2 132 199);
  --color-sky-700: rgb(3 105 161);
  --color-sky-800: rgb(7 89 133);
  --color-sky-900: rgb(12 74 110);
  --color-sky-950: rgb(8 47 73);

  /* Blue */
  --color-blue-50: rgb(239 246 255);
  --color-blue-100: rgb(219 234 254);
  --color-blue-200: rgb(191 219 254);
  --color-blue-300: rgb(147 197 253);
  --color-blue-400: rgb(96 165 250);
  --color-blue-500: rgb(59 130 246);
  --color-blue-600: rgb(37 99 235);
  --color-blue-700: rgb(29 78 216);
  --color-blue-800: rgb(30 64 175);
  --color-blue-900: rgb(30 58 138);
  --color-blue-950: rgb(23 37 84);

  /* Indigo */
  --color-indigo-50: rgb(238 242 255);
  --color-indigo-100: rgb(224 231 255);
  --color-indigo-200: rgb(199 210 254);
  --color-indigo-300: rgb(165 180 252);
  --color-indigo-400: rgb(129 140 248);
  --color-indigo-500: rgb(99 102 241);
  --color-indigo-600: rgb(79 70 229);
  --color-indigo-700: rgb(67 56 202);
  --color-indigo-800: rgb(55 48 163);
  --color-indigo-900: rgb(49 46 129);
  --color-indigo-950: rgb(30 27 75);

  /* Violet */
  --color-violet-50: rgb(245 243 255);
  --color-violet-100: rgb(237 233 254);
  --color-violet-200: rgb(221 214 254);
  --color-violet-300: rgb(196 181 253);
  --color-violet-400: rgb(167 139 250);
  --color-violet-500: rgb(139 92 246);
  --color-violet-600: rgb(124 58 237);
  --color-violet-700: rgb(109 40 217);
  --color-violet-800: rgb(91 33 182);
  --color-violet-900: rgb(76 29 149);
  --color-violet-950: rgb(46 16 101);

  /* Purple */
  --color-purple-50: rgb(250 245 255);
  --color-purple-100: rgb(243 232 255);
  --color-purple-200: rgb(233 213 255);
  --color-purple-300: rgb(216 180 254);
  --color-purple-400: rgb(192 132 252);
  --color-purple-500: rgb(168 85 247);
  --color-purple-600: rgb(147 51 234);
  --color-purple-700: rgb(126 34 206);
  --color-purple-800: rgb(107 33 168);
  --color-purple-900: rgb(88 28 135);
  --color-purple-950: rgb(59 7 100);

  /* Fuchsia */
  --color-fuchsia-50: rgb(253 244 255);
  --color-fuchsia-100: rgb(250 232 255);
  --color-fuchsia-200: rgb(245 208 254);
  --color-fuchsia-300: rgb(240 171 252);
  --color-fuchsia-400: rgb(232 121 249);
  --color-fuchsia-500: rgb(217 70 239);
  --color-fuchsia-600: rgb(192 38 211);
  --color-fuchsia-700: rgb(162 28 175);
  --color-fuchsia-800: rgb(134 25 143);
  --color-fuchsia-900: rgb(112 26 117);
  --color-fuchsia-950: rgb(74 4 78);

  /* Pink */
  --color-pink-50: rgb(253 242 248);
  --color-pink-100: rgb(252 231 243);
  --color-pink-200: rgb(251 207 232);
  --color-pink-300: rgb(249 168 212);
  --color-pink-400: rgb(244 114 182);
  --color-pink-500: rgb(236 72 153);
  --color-pink-600: rgb(219 39 119);
  --color-pink-700: rgb(190 24 93);
  --color-pink-800: rgb(157 23 77);
  --color-pink-900: rgb(131 24 67);
  --color-pink-950: rgb(80 7 36);

  /* Rose */
  --color-rose-50: rgb(255 241 242);
  --color-rose-100: rgb(255 228 230);
  --color-rose-200: rgb(254 205 211);
  --color-rose-300: rgb(253 164 175);
  --color-rose-400: rgb(251 113 133);
  --color-rose-500: rgb(244 63 94);
  --color-rose-600: rgb(225 29 72);
  --color-rose-700: rgb(190 18 60);
  --color-rose-800: rgb(159 18 57);
  --color-rose-900: rgb(136 19 55);
  --color-rose-950: rgb(76 5 25);

  /* Themeable Colors */
  --color-primary-50: rgb(var(--hb-primary-50-rgb, 239 246 255));
  --color-primary-100: rgb(var(--hb-primary-100-rgb, 219 234 254));
  --color-primary-200: rgb(var(--hb-primary-200-rgb, 191 219 254));
  --color-primary-300: rgb(var(--hb-primary-300-rgb, 147 197 253));
  --color-primary-400: rgb(var(--hb-primary-400-rgb, 96 165 250));
  --color-primary-500: rgb(var(--hb-primary-500-rgb, 59 130 246));
  --color-primary-600: rgb(var(--hb-primary-600-rgb, 37 99 235));
  --color-primary-700: rgb(var(--hb-primary-700-rgb, 29 78 216));
  --color-primary-800: rgb(var(--hb-primary-800-rgb, 30 64 175));
  --color-primary-900: rgb(var(--hb-primary-900-rgb, 30 58 138));
  --color-primary-950: rgb(var(--hb-primary-950-rgb, 23 37 84));

  /* Semantic UI Colors - Defined in theme_generator.html */
  /* Do not redeclare them here to avoid circular references */

  --color-secondary-50: rgb(var(--hb-secondary-50-rgb, 236 254 255));
  --color-secondary-100: rgb(var(--hb-secondary-100-rgb, 207 250 254));
  --color-secondary-200: rgb(var(--hb-secondary-200-rgb, 165 243 252));
  --color-secondary-300: rgb(var(--hb-secondary-300-rgb, 103 232 249));
  --color-secondary-400: rgb(var(--hb-secondary-400-rgb, 34 211 238));
  --color-secondary-500: rgb(var(--hb-secondary-500-rgb, 6 182 212));
  --color-secondary-600: rgb(var(--hb-secondary-600-rgb, 8 145 178));
  --color-secondary-700: rgb(var(--hb-secondary-700-rgb, 14 116 144));
  --color-secondary-800: rgb(var(--hb-secondary-800-rgb, 21 94 117));
  --color-secondary-900: rgb(var(--hb-secondary-900-rgb, 22 78 99));
  --color-secondary-950: rgb(var(--hb-secondary-950-rgb, 8 51 68));

  /* Note: Providing these palettes in @theme ensures theme-pack mappings like var(--color-rose-600) always resolve */

  /* Font families */
  --hb-font-family-sans: inter var, ui-sans-serif, system-ui, sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol, noto color emoji;
  --hb-font-heading: var(--hb-font-family-sans);
  --hb-font-body: var(--hb-font-family-sans);
  --hb-font-code: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
  --hb-font-nav: var(--hb-font-heading);

  /* Font weights */
  --hb-font-weight-heading: 700;
  --hb-font-weight-body: 400;
  --hb-font-weight-body-bold: 600;

  /* Line heights */
  --hb-font-leading-heading: 1.2;
  --hb-font-leading-body: 1.6;
  --hb-font-leading-code: 1.5;

  /* Letter spacing */
  --hb-font-tracking-heading: -0.02em;
  --hb-font-tracking-body: 0;
  --hb-font-tracking-caps: 0.05em;

  /* Font sizes */
  --font-size-xs: 0.75rem;
  --font-size-sm: 0.875rem;
  --font-size-base: 1rem;
  --font-size-lg: 1.125rem;
  --font-size-xl: 1.25rem;
  --font-size-2xl: 1.5rem;
  --font-size-3xl: 1.875rem;
  --font-size-4xl: 2.25rem;
  --font-size-5xl: 3rem;
  --font-size-6xl: 4rem;
}


================================================
FILE: modules/blox/assets/css/framework/base.css
================================================
/* Base styles for better text rendering */
@layer base {
  html {
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizelegibility;
    /* Apply the runtime font vars injected by Hugo's typography partial */
    font-family: var(--hb-font-body);
  }

  body {
    font-family: var(--hb-font-body);
    font-weight: var(--hb-font-weight-body, 400);
    line-height: var(--hb-font-leading-body, 1.6);
    letter-spacing: var(--hb-font-tracking-body, 0);
  }

  h1,
  h2,
  h3,
  h4,
  h5,
  h6 {
    font-family: var(--hb-font-heading);
    font-weight: var(--hb-font-weight-heading, 700);
    line-height: var(--hb-font-leading-heading, 1.2);
    letter-spacing: var(--hb-font-tracking-heading, -0.02em);
  }

  code,
  pre,
  kbd,
  samp {
    font-family: var(--hb-font-code);
  }
}

/* Gradient Mesh Animations */
@keyframes float {
  0%,
  100% {
    transform: translateY(0) translateX(0);
  }

  25% {
    transform: translateY(-20px) translateX(10px);
  }

  50% {
    transform: translateY(-10px) translateX(-10px);
  }

  75% {
    transform: translateY(-30px) translateX(5px);
  }
}

@keyframes rotate-slow {
  from {
    transform: rotate(0deg);
  }

  to {
    transform: rotate(360deg);
  }
}

.animate-float {
  animation: float 8s ease-in-out infinite;
}

.animate-rotate-slow {
  animation: rotate-slow 20s linear infinite;
}

/* Custom utilities and components */
@utility task-list {
  list-style: none;
  padding-left: 1.5rem;
}

/* Custom typography styles - the plugin handles the base styles */
/* Additional customization for prose elements */
@layer components {
  .prose a {
    text-decoration: underline;
    text-decoration-color: var(--color-primary-300);
    font-weight: var(--hb-font-weight-body-bold, 600);
  }

  .prose a:hover {
    color: var(--color-primary-600);
    text-decoration: none;
    border-radius: 0.09rem;
  }

  .prose mark {
    color: var(--color-neutral-900);
    background-color: var(--color-primary-200);
    padding: 0.1rem 0.2rem;
    border-radius: 0.25rem;
  }

  .dark .prose-invert a {
    text-decoration-color: var(--color-neutral-500);
  }

  .dark .prose-invert a:hover {
    color: var(--color-primary-300);
  }

  .dark .prose-invert mark {
    background-color: var(--color-primary-400);
    color: black;
  }

  /* Inline Code Styling */
  .prose code:not(:where(pre *)) {
    @apply rounded-md bg-neutral-100 px-1.5 py-0.5 text-[0.875em] font-normal text-primary-700;
    @apply dark:bg-neutral-700/50 dark:text-primary-300;
  }

  .prose code:not(:where(pre *))::before,
  .prose code:not(:where(pre *))::after {
    content: none;
  }
}


================================================
FILE: modules/blox/assets/css/framework/components.css
================================================
/* Hugo Blox Framework Custom Classes */
@layer components {
  /* Section styles for Hugo Blox blocks */
  .hbb-section {
    padding-top: 6rem;
    padding-bottom: 6rem;
  }

  .section-subheading {
    font-size: 1.25rem;
    font-weight: var(--hb-font-weight-heading, 700);
  }

  /* Home section background styles */
  .home-section-bg {
    position: absolute;
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    z-index: -1;
  }

  .home-section-bg.bg-image {
    background-position: center;
    background-repeat: no-repeat;
    background-size: cover;
  }

  /* 2025 Glassmorphism texture support - disable conflicting defaults */
  .home-section-bg.bg-image[style*="background-size"][style*="background-repeat"] {
    /* biome-ignore lint/complexity/noImportantStyles: Required to override inline background-size for glass textures */
    background-size: revert !important;
    /* biome-ignore lint/complexity/noImportantStyles: Required to override inline background-repeat for glass textures */
    background-repeat: revert !important;
    /* biome-ignore lint/complexity/noImportantStyles: Required to override inline background-position for glass textures */
    background-position: revert !important;
  }

  /* Specific glassmorphism texture class override */
  .blox-cta-card .home-section-bg.bg-image {
    background-size: revert;
    background-repeat: revert;
    background-position: revert;
  }

  /* Video background */
  .bg-video {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center center;
    opacity: 1;
  }

  /* Flip video horizontally */
  .bg-video.flip {
    transform: scaleX(-1);
  }

  /* Container styles */
  .universal-wrapper {
    margin: 0 auto;
    padding-right: 1rem;
    padding-left: 1rem;
    width: 100%;
  }

  @media (min-width: 1200px) {
    .universal-wrapper {
      max-width: 1200px;
    }
  }

  .article-container {
    max-width: 760px;
    margin: 0 auto;
  }

  /* Button toolbar */
  .btn-toolbar {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 0.5rem;
  }

  /* Documentation specific */
  .docs-article-container {
    max-width: 760px;
  }

  /* Powered-by footer styles */
  .powered-by {
    font-size: 0.75rem;
  }

  .powered-by a {
    color: inherit;
    text-decoration: none;
  }

  .powered-by a:hover {
    text-decoration: underline;
  }

  /* Parallax effect */
  .parallax {
    background-attachment: fixed;
    background-position: center;
    background-repeat: no-repeat;
    background-size: cover;
    position: relative;
  }

  /* When parallax is used with home-section-bg, preserve absolute positioning */
  .home-section-bg.parallax {
    position: absolute;
  }

  /* Section color schemes - for backward compatibility */
  section.light {
    background-color: transparent;
  }

  section.dark {
    background-color: transparent;
  }
}


================================================
FILE: modules/blox/assets/css/hb-search.css
================================================
/* Hugo Blox Search - Custom Pagefind Implementation */

/* Animations */
@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}

.animate-spin {
  animation: spin 1s linear infinite;
}

/* Search result highlights */
.search-result mark {
  background-color: rgb(254 240 138);
  color: rgb(17 24 39);
  font-weight: var(--hb-font-weight-body-bold, 600);
  padding: 0.05rem 0.2rem;
  border-radius: 0.125rem;
}

.dark .search-result mark {
  background-color: rgb(133 77 14);
  color: rgb(254 240 138);
}

/* Result hover state */
.search-result:hover mark {
  background-color: rgb(253 224 71);
}

.dark .search-result:hover mark {
  background-color: rgb(161 98 7);
}

/* Smooth transitions */
.search-modal-enter {
  animation: slide-in-up 0.2s ease-out;
}

@keyframes slide-in-up {
  from {
    opacity: 0;
    transform: translateY(1rem) scale(0.95);
  }

  to {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}

/* Loading skeleton */
.search-skeleton {
  background: linear-gradient(90deg, rgb(229 231 235) 25%, rgb(243 244 246) 50%, rgb(229 231 235) 75%);
  background-size: 200% 100%;
  animation: shimmer 1.5s infinite;
}

.dark .search-skeleton {
  background: linear-gradient(90deg, rgb(55 65 81) 25%, rgb(75 85 99) 50%, rgb(55 65 81) 75%);
  background-size: 200% 100%;
}

@keyframes shimmer {
  0% {
    background-position: 200% 0;
  }

  100% {
    background-position: -200% 0;
  }
}

/* Keyboard navigation highlight - handled by Alpine :class binding */
/* Smooth transition for selection state */
.search-result {
  transition: all 0.15s ease;
}

/* Additional hover effects for keyboard-selected items */
.search-result:focus-visible {
  outline: 2px solid rgb(59 130 246);
  outline-offset: -2px;
}


================================================
FILE: modules/blox/assets/css/layout-utilities.css
================================================
/*
  Hugo Blox Layout Utilities
  
  Provides CSS utilities that use the configurable layout tokens:
  - --hb-radius: Border radius token
  - --hb-spacing-base: Base spacing unit
  - --hb-spacing-section: Section padding
  - --hb-font-size-base: Base font size
*/

/* Border radius utility - use instead of hardcoded rounded-* classes */
.hb-rounded {
  border-radius: var(--hb-radius, 0.5rem);
}

.hb-rounded-sm {
  border-radius: calc(var(--hb-radius, 0.5rem) * 0.5);
}

.hb-rounded-lg {
  border-radius: calc(var(--hb-radius, 0.5rem) * 1.5);
}

.hb-rounded-xl {
  border-radius: calc(var(--hb-radius, 0.5rem) * 2);
}

/* Section spacing */
.hb-section {
  padding-top: var(--hb-spacing-section, 4rem);
  padding-bottom: var(--hb-spacing-section, 4rem);
}

.hb-section-sm {
  padding-top: calc(var(--hb-spacing-section, 4rem) * 0.5);
  padding-bottom: calc(var(--hb-spacing-section, 4rem) * 0.5);
}

/* Component spacing */
.hb-gap {
  gap: var(--hb-spacing-base, 1rem);
}

.hb-gap-sm {
  gap: calc(var(--hb-spacing-base, 1rem) * 0.5);
}

.hb-gap-lg {
  gap: calc(var(--hb-spacing-base, 1rem) * 1.5);
}

/* Padding utilities */
.hb-p {
  padding: var(--hb-spacing-base, 1rem);
}

.hb-px {
  padding-left: var(--hb-spacing-base, 1rem);
  padding-right: var(--hb-spacing-base, 1rem);
}

.hb-py {
  padding-top: var(--hb-spacing-base, 1rem);
  padding-bottom: var(--hb-spacing-base, 1rem);
}

/* Margin utilities */
.hb-m {
  margin: var(--hb-spacing-base, 1rem);
}

.hb-mx {
  margin-left: var(--hb-spacing-base, 1rem);
  margin-right: var(--hb-spacing-base, 1rem);
}

.hb-my {
  margin-top: var(--hb-spacing-base, 1rem);
  margin-bottom: var(--hb-spacing-base, 1rem);
}


================================================
FILE: modules/blox/assets/css/libs/chroma/dark.css
================================================
/* Dracula dark theme */
.dark .highlight {
  /* Background */ /*.bg { color: #f8f8f2; background-color: #282a36 }*/
  /* PreWrapper */ /*.chroma { color: #f8f8f2; background-color: #282a36; }*/

  /* Other */

  .chroma .x {
  }

  /* Error */

  .chroma .err {
  }

  /* CodeLine */

  .chroma .cl {
  }

  /* LineTableTD */

  .chroma .lntd {
    vertical-align: top;
    padding: 0;
    margin: 0;
    border: 0;
  }

  /* LineTable */

  .chroma .lntable {
    border-spacing: 0;
    padding: 0;
    margin: 0;
    border: 0;
  }

  /* LineHighlight */

  .chroma .hl {
    background-color: #ffc;
  }

  /* LineNumbersTable */

  .chroma .lnt {
    white-space: pre;
    user-select: none;
    margin-right: 0.4em;
    padding: 0 0.4em 0 0.4em;
    color: #7f7f7f;
  }

  /* LineNumbers */

  .chroma .ln {
    white-space: pre;
    user-select: none;
    margin-right: 0.4em;
    padding: 0 0.4em 0 0.4em;
    color: #7f7f7f;
  }

  /* Line */

  .chroma .line {
    display: flex;
  }

  /* Keyword */

  .chroma .k {
    color: #ff79c6;
  }

  /* KeywordConstant */

  .chroma .kc {
    color: #ff79c6;
  }

  /* KeywordDeclaration */

  .chroma .kd {
    color: #8be9fd;
    font-style: italic;
  }

  /* KeywordNamespace */

  .chroma .kn {
    color: #ff79c6;
  }

  /* KeywordPseudo */

  .chroma .kp {
    color: #ff79c6;
  }

  /* KeywordReserved */

  .chroma .kr {
    color: #ff79c6;
  }

  /* KeywordType */

  .chroma .kt {
    color: #8be9fd;
  }

  /* Name */

  .chroma .n {
  }

  /* NameAttribute */

  .chroma .na {
    color: #50fa7b;
  }

  /* NameBuiltin */

  .chroma .nb {
    color: #8be9fd;
    font-style: italic;
  }

  /* NameBuiltinPseudo */

  .chroma .bp {
  }

  /* NameClass */

  .chroma .nc {
    color: #50fa7b;
  }

  /* NameConstant */

  .chroma .no {
  }

  /* NameDecorator */

  .chroma .nd {
  }

  /* NameEntity */

  .chroma .ni {
  }

  /* NameException */

  .chroma .ne {
  }

  /* NameFunction */

  .chroma .nf {
    color: #50fa7b;
  }

  /* NameFunctionMagic */

  .chroma .fm {
  }

  /* NameLabel */

  .chroma .nl {
    color: #8be9fd;
    font-style: italic;
  }

  /* NameNamespace */

  .chroma .nn {
  }

  /* NameOther */

  .chroma .nx {
  }

  /* NameProperty */

  .chroma .py {
  }

  /* NameTag */

  .chroma .nt {
    color: #ff79c6;
  }

  /* NameVariable */

  .chroma .nv {
    color: #8be9fd;
    font-style: italic;
  }

  /* NameVariableClass */

  .chroma .vc {
    color: #8be9fd;
    font-style: italic;
  }

  /* NameVariableGlobal */

  .chroma .vg {
    color: #8be9fd;
    font-style: italic;
  }

  /* NameVariableInstance */

  .chroma .vi {
    color: #8be9fd;
    font-style: italic;
  }

  /* NameVariableMagic */

  .chroma .vm {
  }

  /* Literal */

  .chroma .l {
  }

  /* LiteralDate */

  .chroma .ld {
  }

  /* LiteralString */

  .chroma .s {
    color: #f1fa8c;
  }

  /* LiteralStringAffix */

  .chroma .sa {
    color: #f1fa8c;
  }

  /* LiteralStringBacktick */

  .chroma .sb {
    color: #f1fa8c;
  }

  /* LiteralStringChar */

  .chroma .sc {
    color: #f1fa8c;
  }

  /* LiteralStringDelimiter */

  .chroma .dl {
    color: #f1fa8c;
  }

  /* LiteralStringDoc */

  .chroma .sd {
    color: #f1fa8c;
  }

  /* LiteralStringDouble */

  .chroma .s2 {
    color: #f1fa8c;
  }

  /* LiteralStringEscape */

  .chroma .se {
    color: #f1fa8c;
  }

  /* LiteralStringHeredoc */

  .chroma .sh {
    color: #f1fa8c;
  }

  /* LiteralStringInterpol */

  .chroma .si {
    color: #f1fa8c;
  }

  /* LiteralStringOther */

  .chroma .sx {
    color: #f1fa8c;
  }

  /* LiteralStringRegex */

  .chroma .sr {
    color: #f1fa8c;
  }

  /* LiteralStringSingle */

  .chroma .s1 {
    color: #f1fa8c;
  }

  /* LiteralStringSymbol */

  .chroma .ss {
    color: #f1fa8c;
  }

  /* LiteralNumber */

  .chroma .m {
    color: #bd93f9;
  }

  /* LiteralNumberBin */

  .chroma .mb {
    color: #bd93f9;
  }

  /* LiteralNumberFloat */

  .chroma .mf {
    color: #bd93f9;
  }

  /* LiteralNumberHex */

  .chroma .mh {
    color: #bd93f9;
  }

  /* LiteralNumberInteger */

  .chroma .mi {
    color: #bd93f9;
  }

  /* LiteralNumberIntegerLong */

  .chroma .il {
    color: #bd93f9;
  }

  /* LiteralNumberOct */

  .chroma .mo {
    color: #bd93f9;
  }

  /* Operator */

  .chroma .o {
    color: #ff79c6;
  }

  /* OperatorWord */

  .chroma .ow {
    color: #ff79c6;
  }

  /* Punctuation */

  .chroma .p {
  }

  /* Comment */

  .chroma .c {
    color: #6272a4;
  }

  /* CommentHashbang */

  .chroma .ch {
    color: #6272a4;
  }

  /* CommentMultiline */

  .chroma .cm {
    color: #6272a4;
  }

  /* CommentSingle */

  .chroma .c1 {
    color: #6272a4;
  }

  /* CommentSpecial */

  .chroma .cs {
    color: #6272a4;
  }

  /* CommentPreproc */

  .chroma .cp {
    color: #ff79c6;
  }

  /* CommentPreprocFile */

  .chroma .cpf {
    color: #ff79c6;
  }

  /* Generic */

  .chroma .g {
  }

  /* GenericDeleted */

  .chroma .gd {
    color: #f55;
  }

  /* GenericEmph */

  .chroma .ge {
    text-decoration: underline;
  }

  /* GenericError */

  .chroma .gr {
  }

  /* GenericHeading */

  .chroma .gh {
    font-weight: bold;
  }

  /* GenericInserted */

  .chroma .gi {
    color: #50fa7b;
    font-weight: bold;
  }

  /* GenericOutput */

  .chroma .go {
    color: #44475a;
  }

  /* GenericPrompt */

  .chroma .gp {
  }

  /* GenericStrong */

  .chroma .gs {
  }

  /* GenericSubheading */
Download .txt
gitextract_4a7sb44i/

├── .cursorindexingignore
├── .devcontainer/
│   └── base.Dockerfile
├── .editorconfig
├── .github/
│   ├── CLA.md
│   ├── CODEOWNERS
│   ├── CODE_OF_CONDUCT.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.yml
│   │   ├── config.yml
│   │   └── feature-request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── SECURITY.md
│   ├── SUPPORT.md
│   ├── dependabot.yml
│   ├── labeler.yml
│   └── workflows/
│       ├── ci-build-starters-matrix.yml
│       ├── ci-lint.yml
│       ├── ci-pr-labeler.yml
│       ├── codeql.yml
│       ├── community-welcome.yml
│       ├── devcontainer-image.yml
│       ├── maintenance-stale.yml
│       ├── release-hugoblox-modules.yml
│       ├── release-package-splitter.yml
│       └── security-codeql.yml
├── .gitignore
├── .prettierignore
├── .prettierrc.js
├── .stylelintignore
├── CITATION.cff
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── README.zh.md
├── biome.json
├── hugoblox.code-workspace
├── modules/
│   ├── README.md
│   ├── analytics/
│   │   ├── README.md
│   │   ├── go.mod
│   │   ├── hugo.yaml
│   │   └── layouts/
│   │       └── _partials/
│   │           └── blox-analytics/
│   │               ├── index.html
│   │               ├── services/
│   │               │   ├── baidu_tongji.html
│   │               │   ├── fathom.html
│   │               │   ├── google_analytics.html
│   │               │   ├── google_tag_manager.html
│   │               │   ├── index.html
│   │               │   ├── microsoft_clarity.html
│   │               │   ├── pirsch.html
│   │               │   └── plausible.html
│   │               └── verification.html
│   ├── blox/
│   │   ├── .npmrc
│   │   ├── README.md
│   │   ├── archetypes/
│   │   │   ├── faq.md
│   │   │   └── questions.md
│   │   ├── assets/
│   │   │   ├── css/
│   │   │   │   ├── README.md
│   │   │   │   ├── animations.css
│   │   │   │   ├── blox/
│   │   │   │   │   ├── all.css
│   │   │   │   │   ├── biography.css
│   │   │   │   │   ├── navbar.css
│   │   │   │   │   └── skills.css
│   │   │   │   ├── chroma.css
│   │   │   │   ├── color-utilities.css
│   │   │   │   ├── components/
│   │   │   │   │   ├── all.css
│   │   │   │   │   ├── author-notes.css
│   │   │   │   │   ├── cards.css
│   │   │   │   │   ├── charts.css
│   │   │   │   │   ├── copy.css
│   │   │   │   │   ├── cover.css
│   │   │   │   │   ├── glassmorphism.css
│   │   │   │   │   ├── math.css
│   │   │   │   │   ├── notebook.css
│   │   │   │   │   ├── page.css
│   │   │   │   │   ├── sidebar-left.css
│   │   │   │   │   ├── steps.css
│   │   │   │   │   └── task-list.css
│   │   │   │   ├── config/
│   │   │   │   │   ├── safelist.css
│   │   │   │   │   ├── tailwind.css
│   │   │   │   │   └── theme.css
│   │   │   │   ├── framework/
│   │   │   │   │   ├── base.css
│   │   │   │   │   └── components.css
│   │   │   │   ├── hb-search.css
│   │   │   │   ├── layout-utilities.css
│   │   │   │   ├── libs/
│   │   │   │   │   └── chroma/
│   │   │   │   │       ├── dark.css
│   │   │   │   │       └── light.css
│   │   │   │   ├── main.css
│   │   │   │   ├── themes/
│   │   │   │   │   ├── amber.css
│   │   │   │   │   ├── blue.css
│   │   │   │   │   ├── cyan.css
│   │   │   │   │   ├── emerald.css
│   │   │   │   │   ├── fuchsia.css
│   │   │   │   │   ├── green.css
│   │   │   │   │   ├── indigo.css
│   │   │   │   │   ├── lime.css
│   │   │   │   │   ├── orange.css
│   │   │   │   │   ├── pink.css
│   │   │   │   │   ├── purple.css
│   │   │   │   │   ├── red.css
│   │   │   │   │   ├── rose.css
│   │   │   │   │   ├── sky.css
│   │   │   │   │   ├── slate.css
│   │   │   │   │   ├── stone.css
│   │   │   │   │   ├── teal.css
│   │   │   │   │   ├── violet.css
│   │   │   │   │   ├── yellow.css
│   │   │   │   │   └── zinc.css
│   │   │   │   └── views/
│   │   │   │       ├── all.css
│   │   │   │       └── attachments.css
│   │   │   ├── dist/
│   │   │   │   └── lib/
│   │   │   │       ├── markmap/
│   │   │   │       │   └── index.js
│   │   │   │       └── vendor-libs.mjs
│   │   │   └── js/
│   │   │       ├── hb-animations.js
│   │   │       ├── hb-citation.js
│   │   │       ├── hb-clipboard.js
│   │   │       ├── hb-code-copy.js
│   │   │       ├── hb-head.js
│   │   │       ├── hb-i18n.js
│   │   │       ├── hb-init.js
│   │   │       ├── hb-mermaid-config.js
│   │   │       ├── hb-nav.js
│   │   │       ├── hb-notifier.js
│   │   │       ├── hb-search.js
│   │   │       ├── hb-sidebar.js
│   │   │       ├── hb-theme.js
│   │   │       ├── katex-config.js
│   │   │       └── vendor-libs.js
│   │   ├── blox/
│   │   │   ├── collection/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── contact-info/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── cta-button-list/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── cta-card/
│   │   │   │   ├── README.md
│   │   │   │   ├── client.jsx
│   │   │   │   ├── component.jsx
│   │   │   │   └── manifest.json
│   │   │   ├── cta-image-paragraph/
│   │   │   │   ├── README.md
│   │   │   │   ├── client.jsx
│   │   │   │   ├── component.jsx
│   │   │   │   └── manifest.json
│   │   │   ├── dev-hero/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── faq/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── features/
│   │   │   │   ├── README.md
│   │   │   │   ├── client.jsx
│   │   │   │   ├── component.jsx
│   │   │   │   └── manifest.json
│   │   │   ├── hero/
│   │   │   │   ├── README.md
│   │   │   │   ├── client.jsx
│   │   │   │   ├── component.jsx
│   │   │   │   └── manifest.json
│   │   │   ├── knowledge-categories/
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── logos/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── markdown/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── portfolio/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── research-areas/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── resume-awards/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── resume-biography/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── resume-biography-3/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── resume-experience/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── resume-languages/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── resume-skills/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── search-hero/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── shared/
│   │   │   │   └── js/
│   │   │   │       └── components/
│   │   │   │           └── Icon.jsx
│   │   │   ├── stats/
│   │   │   │   ├── README.md
│   │   │   │   ├── client.jsx
│   │   │   │   ├── component.jsx
│   │   │   │   └── manifest.json
│   │   │   ├── team-showcase/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── tech-stack/
│   │   │   │   ├── README.md
│   │   │   │   ├── block.html
│   │   │   │   └── manifest.json
│   │   │   ├── testimonials/
│   │   │   │   ├── README.md
│   │   │   │   ├── client.jsx
│   │   │   │   ├── component.jsx
│   │   │   │   └── manifest.json
│   │   │   └── trending-questions/
│   │   │       ├── block.html
│   │   │       └── manifest.json
│   │   ├── data/
│   │   │   ├── address_formats.toml
│   │   │   ├── blox_aliases.yaml
│   │   │   ├── fonts/
│   │   │   │   ├── academic.yaml
│   │   │   │   ├── developer.yaml
│   │   │   │   ├── editorial.yaml
│   │   │   │   ├── geometric.yaml
│   │   │   │   ├── humanist.yaml
│   │   │   │   ├── modern.yaml
│   │   │   │   └── system.yaml
│   │   │   ├── hugoblox.yaml
│   │   │   ├── icons/
│   │   │   │   ├── academicons.json
│   │   │   │   ├── brands.yaml
│   │   │   │   ├── devicon.json
│   │   │   │   ├── hb.yaml
│   │   │   │   └── hero.json
│   │   │   ├── languages.yaml
│   │   │   ├── link_types.yaml
│   │   │   ├── page_sharer.yaml
│   │   │   └── themes/
│   │   │       ├── coffee.yaml
│   │   │       ├── contrast.yaml
│   │   │       ├── cupcake.yaml
│   │   │       ├── default.yaml
│   │   │       ├── dracula.yaml
│   │   │       ├── marine.yaml
│   │   │       ├── matcha.yaml
│   │   │       ├── minimal.yaml
│   │   │       ├── retro.yaml
│   │   │       ├── solar.yaml
│   │   │       └── synthwave.yaml
│   │   ├── go.mod
│   │   ├── hugo.yaml
│   │   ├── i18n/
│   │   │   ├── ar.yaml
│   │   │   ├── bn.yaml
│   │   │   ├── ca.yaml
│   │   │   ├── cs.yaml
│   │   │   ├── da.yaml
│   │   │   ├── de.yaml
│   │   │   ├── el.yaml
│   │   │   ├── en.yaml
│   │   │   ├── es.yaml
│   │   │   ├── et.yaml
│   │   │   ├── eu.yaml
│   │   │   ├── fa.yaml
│   │   │   ├── fi.yaml
│   │   │   ├── fr.yaml
│   │   │   ├── he.yaml
│   │   │   ├── hi.yaml
│   │   │   ├── hr.yaml
│   │   │   ├── ht.yaml
│   │   │   ├── hu.yaml
│   │   │   ├── id.yaml
│   │   │   ├── it.yaml
│   │   │   ├── ja.yaml
│   │   │   ├── km.yaml
│   │   │   ├── ko.yaml
│   │   │   ├── lt.yaml
│   │   │   ├── lv.yaml
│   │   │   ├── mg.yaml
│   │   │   ├── ms-Arab.yaml
│   │   │   ├── ms.yaml
│   │   │   ├── nb.yaml
│   │   │   ├── nl.yaml
│   │   │   ├── pl.yaml
│   │   │   ├── pt.yaml
│   │   │   ├── ro.yaml
│   │   │   ├── ru.yaml
│   │   │   ├── so.yaml
│   │   │   ├── sv.yaml
│   │   │   ├── tr.yaml
│   │   │   ├── uk.yaml
│   │   │   ├── vi.yaml
│   │   │   ├── zh-Hant.yaml
│   │   │   └── zh.yaml
│   │   ├── layouts/
│   │   │   ├── 404.html
│   │   │   ├── _markup/
│   │   │   │   ├── render-blockquote.html
│   │   │   │   ├── render-codeblock-markmap.html
│   │   │   │   ├── render-codeblock-mermaid.html
│   │   │   │   ├── render-image.html
│   │   │   │   ├── render-link.backlinks.json
│   │   │   │   └── render-link.html
│   │   │   ├── _partials/
│   │   │   │   ├── blox/
│   │   │   │   │   ├── contact-info/
│   │   │   │   │   │   └── config.html
│   │   │   │   │   ├── dev-hero/
│   │   │   │   │   │   └── config.html
│   │   │   │   │   ├── portfolio/
│   │   │   │   │   │   └── config.html
│   │   │   │   │   ├── preact-wrapper.html
│   │   │   │   │   └── tech-stack/
│   │   │   │   │       └── config.html
│   │   │   │   ├── comments/
│   │   │   │   │   ├── disqus.html
│   │   │   │   │   └── giscus.html
│   │   │   │   ├── comments.html
│   │   │   │   ├── components/
│   │   │   │   │   ├── backlinks.html
│   │   │   │   │   ├── breadcrumb.html
│   │   │   │   │   ├── cover.html
│   │   │   │   │   ├── feedback.html
│   │   │   │   │   ├── footers/
│   │   │   │   │   │   ├── columns.html
│   │   │   │   │   │   └── minimal.html
│   │   │   │   │   ├── headers/
│   │   │   │   │   │   ├── floating-theme-toggler.html
│   │   │   │   │   │   ├── navbar-simple.html
│   │   │   │   │   │   └── navbar.html
│   │   │   │   │   ├── language-chooser.html
│   │   │   │   │   ├── last-edited.html
│   │   │   │   │   ├── next-in-series.html
│   │   │   │   │   ├── page_sharer.html
│   │   │   │   │   ├── paginator.html
│   │   │   │   │   ├── search-modal.html
│   │   │   │   │   ├── sidebar.html
│   │   │   │   │   ├── slides-embed.html
│   │   │   │   │   └── toc.html
│   │   │   │   ├── css.html
│   │   │   │   ├── docs_layout.html
│   │   │   │   ├── functions/
│   │   │   │   │   ├── build_links.html
│   │   │   │   │   ├── coerce_bool.html
│   │   │   │   │   ├── coerce_int.html
│   │   │   │   │   ├── deep_merge.html
│   │   │   │   │   ├── demo_theme_styles.html
│   │   │   │   │   ├── embed/
│   │   │   │   │   │   ├── github.html
│   │   │   │   │   │   ├── hbx_content_section.html
│   │   │   │   │   │   ├── hbx_platform_icon.html
│   │   │   │   │   │   ├── hbx_title_section.html
│   │   │   │   │   │   └── huggingface.html
│   │   │   │   │   ├── generate_color_scale.html
│   │   │   │   │   ├── get-block-scripts.html
│   │   │   │   │   ├── get-build-id.html
│   │   │   │   │   ├── get_address.html
│   │   │   │   │   ├── get_author_name.html
│   │   │   │   │   ├── get_author_profile.html
│   │   │   │   │   ├── get_authors_data.html
│   │   │   │   │   ├── get_branding.html
│   │   │   │   │   ├── get_cover_image.html
│   │   │   │   │   ├── get_event_dates.html
│   │   │   │   │   ├── get_featured_image.html
│   │   │   │   │   ├── get_hook.html
│   │   │   │   │   ├── get_icon.html
│   │   │   │   │   ├── get_icon_data.html
│   │   │   │   │   ├── get_logo.html
│   │   │   │   │   ├── get_logo_url.html
│   │   │   │   │   ├── get_page_title.html
│   │   │   │   │   ├── get_site_icon.html
│   │   │   │   │   ├── get_sort_by_parameter.html
│   │   │   │   │   ├── get_summary.html
│   │   │   │   │   ├── get_theme_config.html
│   │   │   │   │   ├── has_attachments.html
│   │   │   │   │   ├── hbx_verify.html
│   │   │   │   │   ├── layout_tokens.html
│   │   │   │   │   ├── load_font_pack.html
│   │   │   │   │   ├── load_theme_pack.html
│   │   │   │   │   ├── logger.html
│   │   │   │   │   ├── notebook/
│   │   │   │   │   │   └── render.html
│   │   │   │   │   ├── parse_block_v3.html
│   │   │   │   │   ├── process_responsive_image.html
│   │   │   │   │   ├── render_callout.html
│   │   │   │   │   ├── render_view.html
│   │   │   │   │   ├── theme_generator.html
│   │   │   │   │   ├── theme_variables.html
│   │   │   │   │   ├── typography.html
│   │   │   │   │   └── uid.html
│   │   │   │   ├── hbx/
│   │   │   │   │   ├── resolve-block-param.html
│   │   │   │   │   ├── resolve.html
│   │   │   │   │   └── sections.html
│   │   │   │   ├── hooks/
│   │   │   │   │   └── body-end/
│   │   │   │   │       ├── hbx-debug-export.html
│   │   │   │   │       └── hbx-debug-hud.html
│   │   │   │   ├── init.html
│   │   │   │   ├── jsonld/
│   │   │   │   │   ├── article.html
│   │   │   │   │   ├── breadcrumbs.html
│   │   │   │   │   ├── business.html
│   │   │   │   │   ├── collectionpage.html
│   │   │   │   │   ├── event.html
│   │   │   │   │   ├── faqpage.html
│   │   │   │   │   ├── main.html
│   │   │   │   │   ├── qapage.html
│   │   │   │   │   ├── webpage.html
│   │   │   │   │   └── website.html
│   │   │   │   ├── landing_page.html
│   │   │   │   ├── libraries.html
│   │   │   │   ├── notification-container.html
│   │   │   │   ├── page_author.html
│   │   │   │   ├── page_author_card.html
│   │   │   │   ├── page_edit.html
│   │   │   │   ├── page_footer.html
│   │   │   │   ├── page_links.html
│   │   │   │   ├── page_links_div.html
│   │   │   │   ├── page_metadata_authors.html
│   │   │   │   ├── page_related.html
│   │   │   │   ├── site_footer.html
│   │   │   │   ├── site_footer_license.html
│   │   │   │   ├── site_head.html
│   │   │   │   ├── social_links.html
│   │   │   │   ├── tags.html
│   │   │   │   ├── tailwind_sources.html
│   │   │   │   └── views/
│   │   │   │       ├── article-grid--end.html
│   │   │   │       ├── article-grid--start.html
│   │   │   │       ├── article-grid.html
│   │   │   │       ├── card--end.html
│   │   │   │       ├── card--start.html
│   │   │   │       ├── card.html
│   │   │   │       ├── citation--end.html
│   │   │   │       ├── citation--start.html
│   │   │   │       ├── citation.html
│   │   │   │       ├── date-title-summary--end.html
│   │   │   │       ├── date-title-summary--start.html
│   │   │   │       ├── date-title-summary.html
│   │   │   │       ├── slides-gallery--end.html
│   │   │   │       ├── slides-gallery--start.html
│   │   │   │       └── slides-gallery.html
│   │   │   ├── _shortcodes/
│   │   │   │   ├── audio.html
│   │   │   │   ├── bilibili.html
│   │   │   │   ├── button.html
│   │   │   │   ├── callout.html
│   │   │   │   ├── card.html
│   │   │   │   ├── cards.html
│   │   │   │   ├── chart.html
│   │   │   │   ├── cite.html
│   │   │   │   ├── embed.html
│   │   │   │   ├── icon.html
│   │   │   │   ├── include.html
│   │   │   │   ├── math.html
│   │   │   │   ├── mention.html
│   │   │   │   ├── notebook.html
│   │   │   │   ├── spoiler.html
│   │   │   │   ├── steps.html
│   │   │   │   ├── table.html
│   │   │   │   ├── toc.html
│   │   │   │   └── video.html
│   │   │   ├── authors/
│   │   │   │   └── term.html
│   │   │   ├── baseof.html
│   │   │   ├── docs/
│   │   │   │   ├── list.html
│   │   │   │   └── single.html
│   │   │   ├── events/
│   │   │   │   └── page.html
│   │   │   ├── faq/
│   │   │   │   ├── list.html
│   │   │   │   └── single.html
│   │   │   ├── home.backlinks.json
│   │   │   ├── home.html
│   │   │   ├── index.llm.txt
│   │   │   ├── index.webmanifest
│   │   │   ├── landing/
│   │   │   │   ├── list.html
│   │   │   │   └── single.html
│   │   │   ├── list.html
│   │   │   ├── questions/
│   │   │   │   ├── list.html
│   │   │   │   └── single.html
│   │   │   ├── robots.txt
│   │   │   ├── rss.xml
│   │   │   ├── single.html
│   │   │   ├── sitemap.xml
│   │   │   ├── taxonomy.html
│   │   │   └── terms.html
│   │   ├── package.json
│   │   ├── pnpm-workspace.yaml
│   │   ├── schemas/
│   │   │   └── blocks.json
│   │   └── theme.toml
│   ├── integrations/
│   │   └── netlify/
│   │       ├── README.md
│   │       ├── config.yaml
│   │       ├── go.mod
│   │       └── src/
│   │           └── layouts/
│   │               ├── index.headers
│   │               └── index.redirects
│   └── slides/
│       ├── README.md
│       ├── assets/
│       │   ├── css/
│       │   │   ├── libs/
│       │   │   │   └── chroma/
│       │   │   │       ├── dracula.css
│       │   │   │       ├── github-dark.css
│       │   │   │       └── github-light.css
│       │   │   └── slides-branding.css
│       │   └── js/
│       │       └── hugoblox-slides.js
│       ├── config/
│       │   └── _default/
│       │       └── hugo.yaml
│       ├── go.mod
│       └── layouts/
│           ├── _partials/
│           │   ├── components/
│           │   │   └── slide-branding.html
│           │   ├── functions/
│           │   │   └── slides_get_hook.html
│           │   ├── hooks/
│           │   │   ├── slide-body-end/
│           │   │   │   └── _example.html
│           │   │   ├── slide-footer/
│           │   │   │   └── _example.html
│           │   │   ├── slide-head-end/
│           │   │   │   └── _example.html
│           │   │   └── slide-header/
│           │   │       └── _example.html
│           │   └── slides.html
│           ├── _shortcodes/
│           │   ├── fragment.html
│           │   ├── slide.html
│           │   └── speaker_note.html
│           └── slides/
│               ├── baseof.html
│               ├── baseof.present.html
│               ├── list.html
│               ├── presenter.html
│               ├── single.html
│               └── single.present.html
├── package.json
├── pyproject.toml
├── scripts/
│   ├── list_language_packs.py
│   ├── release_modules.py
│   ├── rm-hugo-cache.sh
│   ├── sync_i18n.py
│   ├── test_release_modules.py
│   ├── update_template_hugo.py
│   ├── view-starter-dev.sh
│   ├── view-starter-prod.sh
│   └── view-test.sh
├── templates/
│   ├── academic-cv/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       ├── import-publications.yml
│   │   │       ├── internal-readme-news.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── media/
│   │   │       └── icons/
│   │   │           └── custom/
│   │   │               └── .gitkeep
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── languages.yaml
│   │   │       ├── menus.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   ├── authors/
│   │   │   │   └── _index.md
│   │   │   ├── blog/
│   │   │   │   ├── _index.md
│   │   │   │   ├── data-visualization/
│   │   │   │   │   ├── index.md
│   │   │   │   │   ├── line-chart.json
│   │   │   │   │   └── results.csv
│   │   │   │   ├── get-started/
│   │   │   │   │   └── index.md
│   │   │   │   ├── notebook-onboarding/
│   │   │   │   │   ├── hugoblox-onboarding.ipynb
│   │   │   │   │   └── index.md
│   │   │   │   ├── project-management/
│   │   │   │   │   └── index.md
│   │   │   │   ├── second-brain/
│   │   │   │   │   └── index.md
│   │   │   │   └── teach-courses/
│   │   │   │       └── index.md
│   │   │   ├── courses/
│   │   │   │   ├── _index.md
│   │   │   │   └── hugo-blox/
│   │   │   │       ├── _index.md
│   │   │   │       ├── getting-started.md
│   │   │   │       ├── guide/
│   │   │   │       │   ├── _index.md
│   │   │   │       │   ├── configuration.md
│   │   │   │       │   ├── formatting/
│   │   │   │       │   │   ├── _index.md
│   │   │   │       │   │   ├── button.md
│   │   │   │       │   │   ├── callout.md
│   │   │   │       │   │   ├── cards.md
│   │   │   │       │   │   ├── media.md
│   │   │   │       │   │   ├── steps.md
│   │   │   │       │   │   └── toggle.md
│   │   │   │       │   └── project-structure.md
│   │   │   │       └── reference/
│   │   │   │           ├── _index.md
│   │   │   │           ├── customization.md
│   │   │   │           └── i18n.md
│   │   │   ├── events/
│   │   │   │   ├── _index.md
│   │   │   │   └── example/
│   │   │   │       └── index.md
│   │   │   ├── experience.md
│   │   │   ├── projects/
│   │   │   │   ├── _index.md
│   │   │   │   ├── pandas/
│   │   │   │   │   └── index.md
│   │   │   │   ├── pytorch/
│   │   │   │   │   └── index.md
│   │   │   │   └── scikit/
│   │   │   │       └── index.md
│   │   │   ├── publications/
│   │   │   │   ├── _index.md
│   │   │   │   ├── conference-paper/
│   │   │   │   │   ├── cite.bib
│   │   │   │   │   └── index.md
│   │   │   │   ├── journal-article/
│   │   │   │   │   ├── cite.bib
│   │   │   │   │   └── index.md
│   │   │   │   └── preprint/
│   │   │   │       └── index.md
│   │   │   └── slides/
│   │   │       └── example/
│   │   │           └── index.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── layouts/
│   │   │   └── _partials/
│   │   │       └── hooks/
│   │   │           └── head-end/
│   │   │               └── github-button.html
│   │   ├── netlify.toml
│   │   └── package.json
│   ├── data-science-blog/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       ├── import-notebooks.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── media/
│   │   │       └── icons/
│   │   │           └── custom/
│   │   │               └── .gitkeep
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── languages.yaml
│   │   │       ├── menus.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   ├── authors/
│   │   │   │   └── _index.md
│   │   │   ├── blog/
│   │   │   │   ├── _index.md
│   │   │   │   ├── data-visualization/
│   │   │   │   │   ├── index.md
│   │   │   │   │   ├── line-chart.json
│   │   │   │   │   └── results.csv
│   │   │   │   ├── get-started/
│   │   │   │   │   └── index.md
│   │   │   │   ├── project-management/
│   │   │   │   │   └── index.md
│   │   │   │   ├── second-brain/
│   │   │   │   │   └── index.md
│   │   │   │   └── teach-courses/
│   │   │   │       └── index.md
│   │   │   ├── tags/
│   │   │   │   └── _index.md
│   │   │   └── uses.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── netlify.toml
│   │   ├── notebooks/
│   │   │   └── blog-with-jupyter.ipynb
│   │   └── package.json
│   ├── dev-portfolio/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── media/
│   │   │       └── icons/
│   │   │           └── custom/
│   │   │               └── .gitkeep
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── languages.yaml
│   │   │       ├── menus.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   ├── authors/
│   │   │   │   └── _index.md
│   │   │   ├── blog/
│   │   │   │   ├── _index.md
│   │   │   │   ├── building-rest-api/
│   │   │   │   │   └── index.md
│   │   │   │   ├── docker-deployment/
│   │   │   │   │   └── index.md
│   │   │   │   └── react-performance/
│   │   │   │       └── index.md
│   │   │   └── projects/
│   │   │       ├── _index.md
│   │   │       ├── ecommerce-platform/
│   │   │       │   └── index.md
│   │   │       ├── task-manager/
│   │   │       │   └── index.md
│   │   │       └── weather-app/
│   │   │           └── index.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── netlify.toml
│   │   └── package.json
│   ├── documentation/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .editorconfig
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── media/
│   │   │       └── icons/
│   │   │           └── custom/
│   │   │               └── .gitkeep
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── languages.yaml
│   │   │       ├── menus.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   ├── authors/
│   │   │   │   └── _index.md
│   │   │   ├── blog/
│   │   │   │   ├── _index.md
│   │   │   │   ├── v1.0.0/
│   │   │   │   │   └── index.md
│   │   │   │   └── v2.0.0/
│   │   │   │       └── index.md
│   │   │   ├── community/
│   │   │   │   └── index.md
│   │   │   ├── docs/
│   │   │   │   ├── _index.md
│   │   │   │   ├── getting-started.md
│   │   │   │   ├── guide/
│   │   │   │   │   ├── _index.md
│   │   │   │   │   ├── configuration.md
│   │   │   │   │   ├── project-structure.md
│   │   │   │   │   └── shortcodes/
│   │   │   │   │       ├── _index.md
│   │   │   │   │       ├── button.md
│   │   │   │   │       ├── callout.md
│   │   │   │   │       ├── cards.md
│   │   │   │   │       ├── steps.md
│   │   │   │   │       └── toggle.md
│   │   │   │   └── reference/
│   │   │   │       ├── _index.md
│   │   │   │       ├── customization.md
│   │   │   │       └── i18n.md
│   │   │   └── showcase/
│   │   │       ├── _index.md
│   │   │       └── nvidia/
│   │   │           └── index.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── netlify.toml
│   │   ├── package.json
│   │   ├── static/
│   │   │   └── uploads/
│   │   │       └── .gitkeep
│   │   └── theme.toml
│   ├── link-in-bio/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── media/
│   │   │       └── icons/
│   │   │           └── custom/
│   │   │               └── .gitkeep
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── languages.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   └── authors/
│   │   │       └── _index.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── layouts/
│   │   │   └── _partials/
│   │   │       └── hooks/
│   │   │           └── body-end/
│   │   │               └── change-background-color.html
│   │   ├── netlify.toml
│   │   └── package.json
│   ├── markdown-slides/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── menus.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   └── slides/
│   │   │       ├── _index.md
│   │   │       ├── example/
│   │   │       │   └── index.md
│   │   │       ├── hugo-static-sites/
│   │   │       │   └── index.md
│   │   │       └── ml-research-overview/
│   │   │           └── index.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── netlify.toml
│   │   └── package.json
│   ├── resume/
│   │   ├── .devcontainer/
│   │   │   └── devcontainer.json
│   │   ├── .github/
│   │   │   ├── FUNDING.yml
│   │   │   └── workflows/
│   │   │       ├── build.yml
│   │   │       ├── deploy.yml
│   │   │       └── upgrade.yml
│   │   ├── .gitignore
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── LICENSE.md
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── media/
│   │   │       └── icons/
│   │   │           └── custom/
│   │   │               └── .gitkeep
│   │   ├── config/
│   │   │   └── _default/
│   │   │       ├── hugo.yaml
│   │   │       ├── languages.yaml
│   │   │       ├── menus.yaml
│   │   │       ├── module.yaml
│   │   │       └── params.yaml
│   │   ├── content/
│   │   │   ├── _index.md
│   │   │   └── authors/
│   │   │       └── _index.md
│   │   ├── data/
│   │   │   └── authors/
│   │   │       └── me.yaml
│   │   ├── go.mod
│   │   ├── hugoblox.yaml
│   │   ├── netlify.toml
│   │   └── package.json
│   └── startup-landing-page/
│       ├── .devcontainer/
│       │   └── devcontainer.json
│       ├── .github/
│       │   ├── FUNDING.yml
│       │   └── workflows/
│       │       ├── build.yml
│       │       ├── deploy.yml
│       │       └── upgrade.yml
│       ├── .gitignore
│       ├── .vscode/
│       │   └── extensions.json
│       ├── LICENSE.md
│       ├── README.md
│       ├── assets/
│       │   └── media/
│       │       └── icons/
│       │           └── custom/
│       │               └── .gitkeep
│       ├── config/
│       │   └── _default/
│       │       ├── hugo.yaml
│       │       ├── languages.yaml
│       │       ├── menus.yaml
│       │       ├── module.yaml
│       │       └── params.yaml
│       ├── content/
│       │   ├── _index.md
│       │   ├── authors/
│       │   │   ├── _content.gotmpl
│       │   │   └── _index.md
│       │   ├── blog/
│       │   │   ├── _index.md
│       │   │   ├── data-visualization/
│       │   │   │   ├── index.md
│       │   │   │   ├── line-chart.json
│       │   │   │   └── results.csv
│       │   │   ├── get-started/
│       │   │   │   └── index.md
│       │   │   ├── project-management/
│       │   │   │   └── index.md
│       │   │   ├── second-brain/
│       │   │   │   └── index.md
│       │   │   └── teach-courses/
│       │   │       └── index.md
│       │   ├── changelog/
│       │   │   ├── _index.md
│       │   │   ├── v1.0/
│       │   │   │   └── index.md
│       │   │   └── v1.1/
│       │   │       └── index.md
│       │   ├── privacy.md
│       │   └── terms.md
│       ├── data/
│       │   └── authors/
│       │       └── me.yaml
│       ├── go.mod
│       ├── hugoblox.yaml
│       ├── netlify.toml
│       ├── package.json
│       └── theme.toml
├── test/
│   ├── config.yaml
│   ├── content/
│   │   ├── _index.md
│   │   └── linked/
│   │       └── index.md
│   ├── data/
│   │   ├── blocks/
│   │   │   ├── features_basic.yaml
│   │   │   └── hero_basic.yaml
│   │   └── pages/
│   │       └── home.yaml
│   ├── go.mod
│   └── package.json
└── vite.config.js
Download .txt
SYMBOL INDEX (135 symbols across 26 files)

FILE: modules/blox/assets/dist/lib/markmap/index.js
  function checkUrl (line 10) | async function checkUrl(url, signal) {
  class UrlBuilder (line 19) | class UrlBuilder {
    method constructor (line 20) | constructor() {
    method getFastestProvider (line 28) | async getFastestProvider(timeout = 5e3, path = testPath) {
    method findFastestProvider (line 52) | async findFastestProvider(timeout, path) {
    method setProvider (line 56) | setProvider(name, factory) {
    method getFullUrl (line 63) | getFullUrl(path, provider = this.provider) {
  function defer (line 76) | function defer() {
  function memoize (line 84) | function memoize(fn) {
  function h (line 111) | function h(type, props, ...children) {
  function jsx (line 117) | function jsx(type, props) {
  function Fragment (line 128) | function Fragment(props) {
  function insertDom (line 134) | function insertDom(parent, nodes) {
  function mountAttributes (line 139) | function mountAttributes(domElement, props, env) {
  function setDOMAttribute (line 158) | function setDOMAttribute(el, attr, value, isSVG) {
  function flatten (line 173) | function flatten(arr) {
  function mountChildren (line 176) | function mountChildren(children, env) {
  function mount (line 179) | function mount(vnode, env = DEFAULT_ENV) {
  function mountDom (line 240) | function mountDom(vnode) {
  function hm (line 243) | function hm(...args) {
  function loadJSItem (line 257) | async function loadJSItem(item, context) {
  function loadCSSItem (line 286) | async function loadCSSItem(item) {
  function loadJS (line 315) | async function loadJS(items, context) {
  function loadCSS (line 330) | async function loadCSS(items) {
  function buildJSItem (line 333) | function buildJSItem(path) {
  function buildCSSItem (line 341) | function buildCSSItem(path) {
  function initialize (line 362) | async function initialize() {
  function transform (line 396) | function transform(transformer, content) {
  function render (line 408) | function render(el) {
  function renderAllUnder (line 443) | async function renderAllUnder(container) {
  function renderAll (line 447) | function renderAll() {

FILE: modules/blox/assets/js/hb-animations.js
  method init (line 19) | init() {
  method type (line 24) | type() {

FILE: modules/blox/assets/js/hb-citation.js
  function initializeCitation (line 23) | function initializeCitation() {
  function prefetchAllCitations (line 38) | function prefetchAllCitations() {
  function prefetchOnHover (line 53) | function prefetchOnHover(e) {
  function fetchAndCacheCitation (line 69) | async function fetchAndCacheCitation(filename) {
  function handleCiteClick (line 90) | function handleCiteClick(e) {
  function fetchAndCopyWithFallback (line 131) | async function fetchAndCopyWithFallback(filename, button) {
  function updateButtonText (line 163) | function updateButtonText(button) {

FILE: modules/blox/assets/js/hb-clipboard.js
  function copyToClipboard (line 16) | async function copyToClipboard(text) {
  function copyToClipboardSync (line 41) | function copyToClipboardSync(text) {
  function copyUsingExecCommand (line 72) | function copyUsingExecCommand(text) {
  function isClipboardAPIAvailable (line 127) | function isClipboardAPIAvailable() {
  class ClipboardCache (line 135) | class ClipboardCache {
    method constructor (line 136) | constructor() {
    method set (line 145) | set(key, content) {
    method get (line 157) | get(key) {
    method has (line 166) | has(key) {
    method clear (line 173) | clear() {
    method size (line 181) | get size() {

FILE: modules/blox/assets/js/hb-code-copy.js
  constant NOTIFICATION_DURATION (line 4) | const NOTIFICATION_DURATION = 2000;
  constant DEBOUNCE_DELAY (line 5) | const DEBOUNCE_DELAY = 300;
  function copyCodeToClipboard (line 34) | async function copyCodeToClipboard(button, codeWrapper) {
  function copiedNotification (line 76) | function copiedNotification(copyBtn) {
  function createCopyButton (line 92) | function createCopyButton() {
  function getCodeWrapper (line 106) | function getCodeWrapper(codeblock) {
  function initializeCodeCopyButtons (line 133) | function initializeCodeCopyButtons() {

FILE: modules/blox/assets/js/hb-init.js
  function initTheme (line 2) | function initTheme() {
  function applyHugoStyleFixes (line 25) | function applyHugoStyleFixes() {

FILE: modules/blox/assets/js/hb-mermaid-config.js
  function getCssVar (line 1) | function getCssVar(name) {

FILE: modules/blox/assets/js/hb-notifier.js
  function showNotification (line 18) | function showNotification(message, type = "success", duration = 3000) {
  function getOrCreateContainer (line 56) | function getOrCreateContainer() {
  function createNotificationElement (line 80) | function createNotificationElement(message, type) {
  function removeNotification (line 144) | function removeNotification(notification) {
  function ensureAnimationStyles (line 160) | function ensureAnimationStyles() {

FILE: modules/blox/assets/js/hb-sidebar.js
  function toggleMenu (line 29) | function toggleMenu() {

FILE: modules/blox/assets/js/hb-theme.js
  function addThemeToggleListener (line 6) | function addThemeToggleListener() {

FILE: modules/blox/blox/cta-card/client.jsx
  function renderCtaCardBlock (line 4) | function renderCtaCardBlock() {

FILE: modules/blox/blox/cta-card/component.jsx
  function renderText (line 10) | function renderText(text) {

FILE: modules/blox/blox/cta-image-paragraph/client.jsx
  function renderCtaImageParagraphBlocks (line 8) | function renderCtaImageParagraphBlocks() {

FILE: modules/blox/blox/cta-image-paragraph/component.jsx
  function renderText (line 10) | function renderText(text) {
  function CtaItem (line 30) | function CtaItem({item, idx, imageData, featureIconSvg}) {

FILE: modules/blox/blox/features/client.jsx
  function renderFeaturesBlocks (line 8) | function renderFeaturesBlocks() {

FILE: modules/blox/blox/features/component.jsx
  function renderText (line 9) | function renderText(text) {

FILE: modules/blox/blox/hero/client.jsx
  function renderHeroBlocks (line 10) | function renderHeroBlocks() {

FILE: modules/blox/blox/hero/component.jsx
  function renderText (line 9) | function renderText(text) {
  function processUrl (line 18) | function processUrl(url) {

FILE: modules/blox/blox/stats/client.jsx
  function renderStatsBlocks (line 9) | function renderStatsBlocks() {

FILE: modules/blox/blox/stats/component.jsx
  function renderText (line 13) | function renderText(text) {
  function parseTarget (line 22) | function parseTarget(statistic) {
  function extractParts (line 30) | function extractParts(text) {
  function useCounterAnimation (line 41) | function useCounterAnimation(containerRef) {
  function gridColsClass (line 113) | function gridColsClass(count) {

FILE: modules/blox/blox/testimonials/client.jsx
  function renderTestimonialsBlocks (line 8) | function renderTestimonialsBlocks() {

FILE: modules/blox/blox/testimonials/component.jsx
  function renderText (line 21) | function renderText(text) {
  function TestimonialItem (line 29) | function TestimonialItem({item, avatarUrl, isLast}) {

FILE: scripts/release_modules.py
  function run_cmd (line 50) | def run_cmd(args: List[str], cwd: Optional[Path] = None, check: bool = T...
  function get_latest_hugo_version (line 64) | def get_latest_hugo_version() -> Optional[str]:
  function get_module_latest_commit_info (line 76) | def get_module_latest_commit_info(module: Module) -> Optional[Tuple[str,...
  function format_pseudo_version (line 97) | def format_pseudo_version(commit_hash: str, timestamp: datetime, base_ve...
  function update_go_mod_require_pseudo_version (line 108) | def update_go_mod_require_pseudo_version(go_mod_text: str, dep_module_pa...
  function _bump_hugo_image_tag (line 116) | def _bump_hugo_image_tag(image: str, latest_hugo: str) -> Optional[str]:
  function update_devcontainer_hugo (line 131) | def update_devcontainer_hugo(starter_dir: Path, latest_hugo: Optional[st...
  class Module (line 174) | class Module:
    method tag_prefix (line 182) | def tag_prefix(self) -> str:
    method current_version_tag (line 186) | def current_version_tag(self) -> Optional[str]:
    method last_version (line 199) | def last_version(self) -> Optional[str]:
  function _extract_requires_from_go_mod (line 207) | def _extract_requires_from_go_mod(content: str) -> Set[str]:
  function discover_modules (line 222) | def discover_modules() -> Dict[str, Module]:
  function get_commits_since_tag (line 263) | def get_commits_since_tag(module: Module, tag: Optional[str]) -> List[str]:
  function has_changes_since_tag (line 274) | def has_changes_since_tag(module: Module, tag: Optional[str]) -> bool:
  function determine_bump_from_commits (line 283) | def determine_bump_from_commits(commits: List[str]) -> str:
  function bump_semver (line 296) | def bump_semver(version: Optional[str], bump: str, enforced_major: Optio...
  function write_blox_tailwind_theme_version (line 336) | def write_blox_tailwind_theme_version(module: Module, version: str) -> L...
  function update_citation_release_info (line 356) | def update_citation_release_info(module: Module, version: str) -> List[P...
  function update_go_mod_require_version (line 388) | def update_go_mod_require_version(go_mod_text: str, dep_module_path: str...
  function update_module_requirements_to_latest (line 403) | def update_module_requirements_to_latest(
  function stage_and_maybe_commit (line 435) | def stage_and_maybe_commit(paths: List[Path], message: str, commit: bool...
  function create_and_push_tag (line 461) | def create_and_push_tag(module: Module, version: str, yes: bool) -> None:
  function topological_order (line 471) | def topological_order(modules: Dict[str, Module]) -> List[Module]:
  function update_dependents_for_release (line 495) | def update_dependents_for_release(
  function update_starters (line 524) | def update_starters(modules: Dict[str, Module], commit: bool, push: bool...
  function update_starters_to_commits (line 581) | def update_starters_to_commits(modules: Dict[str, Module], commit: bool,...
  function ensure_clean_worktree (line 652) | def ensure_clean_worktree() -> None:
  function main (line 660) | def main() -> None:

FILE: scripts/test_release_modules.py
  class _DummyResponse (line 18) | class _DummyResponse:
    method json (line 21) | def json(self):
  function _noop_parse (line 32) | def _noop_parse(content: str):
  function _noop_dumps (line 35) | def _noop_dumps(data):
  class _DummyYAML (line 47) | class _DummyYAML:
    method load (line 50) | def load(self, stream):
    method dump (line 53) | def dump(self, data, stream=None):
  class _DummyScalarString (line 58) | class _DummyScalarString(str):
  class UpdateCitationReleaseInfoTests (line 76) | class UpdateCitationReleaseInfoTests(unittest.TestCase):
    method setUp (line 77) | def setUp(self) -> None:
    method tearDown (line 81) | def tearDown(self) -> None:
    method _patch_repo_root_with_citation (line 85) | def _patch_repo_root_with_citation(self, content: str) -> Path:
    method test_updates_version_and_date_for_blox (line 93) | def test_updates_version_and_date_for_blox(self) -> None:
    method test_noop_for_non_blox_tailwind_module (line 121) | def test_noop_for_non_blox_tailwind_module(self) -> None:

FILE: scripts/update_template_hugo.py
  function update_file_regex (line 8) | def update_file_regex(path, pattern, replacement):
  function update_devcontainer (line 24) | def update_devcontainer(path, new_version):
  function main (line 47) | def main():

FILE: vite.config.js
  constant MODULE_DIR (line 15) | const MODULE_DIR = "modules/blox";
  constant OUTPUT_DIR (line 16) | const OUTPUT_DIR = resolve(MODULE_DIR, "assets/dist/lib");
Condensed preview — 779 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,376K chars).
[
  {
    "path": ".cursorindexingignore",
    "chars": 110,
    "preview": "\n# Don't index SpecStory auto-save files, but allow explicit context inclusion via @ references\n.specstory/**\n"
  },
  {
    "path": ".devcontainer/base.Dockerfile",
    "chars": 1490,
    "preview": "# syntax=docker/dockerfile:1.5\n# HugoBlox devcontainer base image\n\nFROM mcr.microsoft.com/devcontainers/go:1.22-bookworm"
  },
  {
    "path": ".editorconfig",
    "chars": 455,
    "preview": "# editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_style = space\nindent_size = 2\ninsert_final_"
  },
  {
    "path": ".github/CLA.md",
    "chars": 724,
    "preview": "# HugoBlox Contributor License Agreement\n\nBy contributing to this project, you agree to the following terms:\n\n1.  **Gran"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 197,
    "preview": "# CODEOWNERS helps route reviews automatically.\n# Update these owners to the correct team(s) as needed.\n\n* @gcushen\n\n# C"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "chars": 205,
    "preview": "# Code of Conduct\n\nWe want to foster a positive, inclusive, and welcoming environment 💜\n\nWe expect you to follow our [Co"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 54,
    "preview": "github: gcushen\ncustom: https://hugoblox.com/sponsor/\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.yml",
    "chars": 4468,
    "preview": "name: 🐛 Bug Report\ndescription: Something isn't working as expected? Report your bugs here.\nlabels: ['needs triage']\nbod"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 1349,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: 💬 Contributing chat (Discord)\n    url: https://discord.gg/z8wNYzb\n "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request.yml",
    "chars": 987,
    "preview": "name: 🚀 Feature request\ndescription: Suggest an improvement.\nlabels: [proposal]\nassignees: []\nbody:\n- type: checkboxes\n "
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1018,
    "preview": "### 🚀 What type of change is this?\n\n- [ ] 🐛 **Bug fix** (A non-breaking change that fixes an issue)\n- [ ] ✨ **New featur"
  },
  {
    "path": ".github/SECURITY.md",
    "chars": 913,
    "preview": "# Security Policy\n\nWe take security seriously and appreciate responsible disclosures.\n\n## Supported Versions\n\nWe general"
  },
  {
    "path": ".github/SUPPORT.md",
    "chars": 639,
    "preview": "# Support\n\nNeed help? Here’s how to get support efficiently:\n\n- Discord: https://discord.gg/z8wNYzb\n- GitHub Discussions"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 712,
    "preview": "version: 2\nupdates:\n  # Update GitHub Actions\n  - package-ecosystem: 'github-actions'\n    directory: '/'\n    schedule:\n "
  },
  {
    "path": ".github/labeler.yml",
    "chars": 497,
    "preview": "documentation:\n  - changed-files:\n      - any-glob-to-any-file: \"**/*.md\"\n\nci:\n  - changed-files:\n      - any-glob-to-an"
  },
  {
    "path": ".github/workflows/ci-build-starters-matrix.yml",
    "chars": 9519,
    "preview": "name: CI - Build Starters Matrix\nrun-name: ${{ github.workflow }} - ${{ github.ref_name }}\n\non:\n    schedule:\n        - "
  },
  {
    "path": ".github/workflows/ci-lint.yml",
    "chars": 1117,
    "preview": "name: CI - Lint\nrun-name: ${{ github.workflow }} - ${{ github.ref_name }}\n\non:\n  push:\n    branches: [main]\n    paths:\n "
  },
  {
    "path": ".github/workflows/ci-pr-labeler.yml",
    "chars": 396,
    "preview": "name: CI - PR Labeler\nrun-name: ${{ github.workflow }} - ${{ github.ref_name }}\n\non:\n  pull_request_target:\n    types: ["
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 1062,
    "preview": "name: Security - CodeQL\nrun-name: ${{ github.workflow }} - ${{ github.ref_name }}\n\non:\n  schedule:\n    - cron: \"0 3 * * "
  },
  {
    "path": ".github/workflows/community-welcome.yml",
    "chars": 1779,
    "preview": "name: Community - Welcome New Contributor\nrun-name: ${{ github.workflow }} - ${{ github.ref_name }}\n\non:\n    pull_reques"
  },
  {
    "path": ".github/workflows/devcontainer-image.yml",
    "chars": 2372,
    "preview": "name: Build HugoBlox devcontainer image\n\non:\n  push:\n    branches: [main]\n    paths:\n      - \".devcontainer/base.Dockerf"
  },
  {
    "path": ".github/workflows/maintenance-stale.yml",
    "chars": 1947,
    "preview": "name: \"Maintenance - Close Stale Issues and PRs\"\nrun-name: ${{ github.workflow }} - ${{ github.ref_name }}\non:\n  schedul"
  },
  {
    "path": ".github/workflows/release-hugoblox-modules.yml",
    "chars": 3214,
    "preview": "name: Release - HugoBlox Modules\nrun-name: ${{ github.workflow }} - ${{ github.ref_name }}\n\non:\n    workflow_dispatch:\n "
  },
  {
    "path": ".github/workflows/release-package-splitter.yml",
    "chars": 7487,
    "preview": "name: \"Release - Package Splitter\"\nrun-name: ${{ github.workflow }} - ${{ github.ref_name }}\n\non:\n    push:\n        bran"
  },
  {
    "path": ".github/workflows/security-codeql.yml",
    "chars": 1062,
    "preview": "name: Security - CodeQL\nrun-name: ${{ github.workflow }} - ${{ github.ref_name }}\n\non:\n  schedule:\n    - cron: \"0 3 * * "
  },
  {
    "path": ".gitignore",
    "chars": 1983,
    "preview": "# ============================================================================\n# HugoBlox Kit - Monorepo .gitignore\n# =="
  },
  {
    "path": ".prettierignore",
    "chars": 378,
    "preview": "# Vendor directories\n_vendor/\nvendor/\n\n# Generated directories\npublic/\nresources/\nnode_modules/\n\n# We use go-template pa"
  },
  {
    "path": ".prettierrc.js",
    "chars": 348,
    "preview": "module.exports = {\n  bracketSpacing: false,\n  singleQuote: false,\n  jsxBracketSameLine: true,\n  trailingComma: \"all\",\n  "
  },
  {
    "path": ".stylelintignore",
    "chars": 110,
    "preview": "**/public/**\n**/dist/**\n**/libs/**\nmodules/blox-tailwind/assets/css/color-utilities.css\nstarters/**/static/**\n"
  },
  {
    "path": "CITATION.cff",
    "chars": 1066,
    "preview": "cff-version: 1.2.0\nmessage: \"If you use HugoBlox in your work, please cite it as below.\"\ntype: software\n\ntitle: \"HugoBlo"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 14273,
    "preview": "# Contributing to Hugo Blox 🚀\n\n> **Welcome, researchers and academics!** Whether you're a professor sharing your publica"
  },
  {
    "path": "LICENSE.md",
    "chars": 1108,
    "preview": "The MIT License (MIT)\n\nCopyright © 2016-Present [**Lore Labs**](https://lore.tech).\n\nPermission is hereby granted, free "
  },
  {
    "path": "README.md",
    "chars": 11521,
    "preview": "[**中文**](./README.zh.md)\n\n<p align=\"center\">\n  <a href=\"https://hugoblox.com/start?utm_source=github&utm_medium=readme&u"
  },
  {
    "path": "README.zh.md",
    "chars": 8340,
    "preview": "[**English**](./README.md)\n\n<p align=\"center\">\n  <a href=\"https://hugoblox.com/start?utm_source=github&utm_medium=readme"
  },
  {
    "path": "biome.json",
    "chars": 1769,
    "preview": "{\n  \"$schema\": \"https://biomejs.dev/schemas/2.3.2/schema.json\",\n  \"files\": {\n    \"includes\": [\n      \"**\",\n      \"!modul"
  },
  {
    "path": "hugoblox.code-workspace",
    "chars": 3004,
    "preview": "{\n  \"folders\": [\n    {\n      \"path\": \".\"\n    }\n  ],\n  \"settings\": {\n    \"files.trimFinalNewlines\": true,\n    \"editor.for"
  },
  {
    "path": "modules/README.md",
    "chars": 1366,
    "preview": "# HugoBlox Kit Modules\n\nInstall HugoBlox features as **Hugo Modules**.\n\n## Quick start (most sites)\n\nAdd HugoBlox Kit co"
  },
  {
    "path": "modules/analytics/README.md",
    "chars": 710,
    "preview": "# Analytics module\n\n**A Hugo Blox module for website analytics and search engine verification.**\n\nAre you using the `blo"
  },
  {
    "path": "modules/analytics/go.mod",
    "chars": 58,
    "preview": "module github.com/HugoBlox/kit/modules/analytics\n\ngo 1.19\n"
  },
  {
    "path": "modules/analytics/hugo.yaml",
    "chars": 62,
    "preview": "module:\n  mounts:\n    - source: layouts\n      target: layouts\n"
  },
  {
    "path": "modules/analytics/layouts/_partials/blox-analytics/index.html",
    "chars": 180,
    "preview": "{{/* HUGO BLOX: MARKETING MODULE */}}\n\n{{/* VERIFICATIONS */}}\n\n{{ partial \"blox-analytics/verification\" . }}\n\n{{/* ANAL"
  },
  {
    "path": "modules/analytics/layouts/_partials/blox-analytics/services/baidu_tongji.html",
    "chars": 429,
    "preview": "{{ $baidu_tongji := site.Params.hugoblox.analytics.baidu.site_id | default \"\" }}\n\n{{ if hugo.IsProduction | and $baidu_t"
  },
  {
    "path": "modules/analytics/layouts/_partials/blox-analytics/services/fathom.html",
    "chars": 218,
    "preview": "{{ $fathom := site.Params.hugoblox.analytics.fathom.site_id | default \"\" }}\n\n{{ if hugo.IsProduction | and $fathom }}\n<s"
  },
  {
    "path": "modules/analytics/layouts/_partials/blox-analytics/services/google_analytics.html",
    "chars": 1315,
    "preview": "{{ $ga := site.Params.hugoblox.analytics.google.measurement_id | default \"\" }}\n\n{{ if hugo.IsProduction | and $ga }}\n\n{{"
  },
  {
    "path": "modules/analytics/layouts/_partials/blox-analytics/services/google_tag_manager.html",
    "chars": 503,
    "preview": "{{ $gt := site.Params.hugoblox.analytics.google_tag_manager.container_id | default \"\" }}\n{{ if hugo.IsProduction | and $"
  },
  {
    "path": "modules/analytics/layouts/_partials/blox-analytics/services/index.html",
    "chars": 385,
    "preview": "{{ partial \"blox-analytics/services/google_analytics\" . }}\n{{ partial \"blox-analytics/services/google_tag_manager\" . }}\n"
  },
  {
    "path": "modules/analytics/layouts/_partials/blox-analytics/services/microsoft_clarity.html",
    "chars": 452,
    "preview": "{{ $clarity := site.Params.hugoblox.analytics.clarity.project_id | default \"\" }}\n{{ if hugo.IsProduction | and $clarity "
  },
  {
    "path": "modules/analytics/layouts/_partials/blox-analytics/services/pirsch.html",
    "chars": 228,
    "preview": "{{ $pirsch := site.Params.hugoblox.analytics.pirsch.site_id | default \"\" }}\n\n{{ if hugo.IsProduction | and $pirsch }}\n<s"
  },
  {
    "path": "modules/analytics/layouts/_partials/blox-analytics/services/plausible.html",
    "chars": 229,
    "preview": "{{ $plausible := site.Params.hugoblox.analytics.plausible.domain | default \"\" }}\n\n{{ if hugo.IsProduction | and $plausib"
  },
  {
    "path": "modules/analytics/layouts/_partials/blox-analytics/verification.html",
    "chars": 781,
    "preview": "{{/* Site Verification with Third Party Services */}}\n\n{{- with site.Params.hugoblox.verification.google -}}\n<meta name="
  },
  {
    "path": "modules/blox/.npmrc",
    "chars": 110,
    "preview": "# pnpm compatibility settings\nauto-install-peers=true\nstrict-peer-dependencies=false\npublic-hoist-pattern[]=*\n"
  },
  {
    "path": "modules/blox/README.md",
    "chars": 2549,
    "preview": "# Hugo Blox (core)\n\nThe Hugo Blox web framework powered by [Tailwind CSS v4](https://tailwindcss.com/) with Hugo's nativ"
  },
  {
    "path": "modules/blox/archetypes/faq.md",
    "chars": 999,
    "preview": "---\ntitle: \"{{ replace .Name \"-\" \" \" | title }}\"\ndate: {{ .Date }}\ndraft: false\n\n# Summary for SEO\nsummary: \"\"\n\n# Mark t"
  },
  {
    "path": "modules/blox/archetypes/questions.md",
    "chars": 1319,
    "preview": "---\ntitle: \"{{ replace .Name \"-\" \" \" | title }}\"\ndate: {{ .Date }}\ndraft: false\n\n# The question (can also use title)\nque"
  },
  {
    "path": "modules/blox/assets/css/README.md",
    "chars": 2955,
    "preview": "# Hugo Blox Tailwind CSS v4 Color System\n\n## Architecture Overview\n\nThis system leverages Tailwind CSS v4's automatic ut"
  },
  {
    "path": "modules/blox/assets/css/animations.css",
    "chars": 4438,
    "preview": "/**\n * Hugo Blox Animations\n * Scroll-triggered reveals and micro-interactions\n */\n\n/* Typewriter cursor */\n.typewriter-"
  },
  {
    "path": "modules/blox/assets/css/blox/all.css",
    "chars": 69,
    "preview": "@import \"biography.css\";\n@import \"skills.css\";\n@import \"navbar.css\";\n"
  },
  {
    "path": "modules/blox/assets/css/blox/biography.css",
    "chars": 6280,
    "preview": ".resume-biography {\n  #profile {\n    text-align: center;\n    padding: 30px 10px;\n    position: relative;\n  }\n\n  /* Custo"
  },
  {
    "path": "modules/blox/assets/css/blox/navbar.css",
    "chars": 2283,
    "preview": "/* Navigation Styles */\n\n.navbar {\n  @apply relative flex flex-wrap items-center justify-between;\n}\n\n.navbar-brand {\n  /"
  },
  {
    "path": "modules/blox/assets/css/blox/skills.css",
    "chars": 1130,
    "preview": "/*************************************************\n *  Hugo Blox: Skills\n **********************************************"
  },
  {
    "path": "modules/blox/assets/css/chroma.css",
    "chars": 786,
    "preview": "@import \"./libs/chroma/light.css\";\n@import \"./libs/chroma/dark.css\";\n\n/* Code Blocks: Apply theme background */\n/* Requi"
  },
  {
    "path": "modules/blox/assets/css/color-utilities.css",
    "chars": 1518,
    "preview": "/* Hugo Blox Custom Color Utilities for Tailwind v4 */\n/* \n * Standard color utilities (bg-*, text-*, border-*, hover:*,"
  },
  {
    "path": "modules/blox/assets/css/components/all.css",
    "chars": 279,
    "preview": "@import \"page.css\";\n@import \"task-list.css\";\n@import \"copy.css\";\n@import \"sidebar-left.css\";\n@import \"charts.css\";\n@impo"
  },
  {
    "path": "modules/blox/assets/css/components/author-notes.css",
    "chars": 1181,
    "preview": "/* Author Notes Tooltip Styles */\n\n/* Hide elements with x-cloak until Alpine.js initializes */\n[x-cloak] {\n  /* biome-i"
  },
  {
    "path": "modules/blox/assets/css/components/cards.css",
    "chars": 1488,
    "preview": ":root {\n  --hb-cols: 2;\n}\n\n.hb-cards {\n  grid-template-columns: repeat(auto-fill, minmax(max(250px, calc((100% - 1rem * "
  },
  {
    "path": "modules/blox/assets/css/components/charts.css",
    "chars": 336,
    "preview": "/* Mermaid.js diagram div */\ndiv.mermaid {\n  width: 100%;\n  margin-bottom: 1rem;\n\n  svg {\n    margin-left: auto;\n    mar"
  },
  {
    "path": "modules/blox/assets/css/components/copy.css",
    "chars": 708,
    "preview": "/* Code Copy */\n\n/* Hugo's Code Block Wrapper Class */\n\n.highlight {\n  @apply relative z-0;\n}\n\n.copy-button {\n  @apply i"
  },
  {
    "path": "modules/blox/assets/css/components/cover.css",
    "chars": 3105,
    "preview": "/**\n * Article Cover Component Styles\n * Notion-inspired page cover with icon overlay\n */\n\n.article-cover {\n  @apply rel"
  },
  {
    "path": "modules/blox/assets/css/components/glassmorphism.css",
    "chars": 7644,
    "preview": "/**\n * 2025 Hugo Blox Glassmorphism Utility Classes\n *\n * Modern glassmorphism effects for Hugo Blox CTA cards and other"
  },
  {
    "path": "modules/blox/assets/css/components/math.css",
    "chars": 137,
    "preview": "/* Prevent long equations overflowing on small screens by scrolling horizontally instead. */\n.katex-display {\n  overflow"
  },
  {
    "path": "modules/blox/assets/css/components/notebook.css",
    "chars": 4637,
    "preview": ".hb-notebook {\n  --hb-notebook-output-max-height: 26rem;\n  @apply relative isolate my-10 rounded-3xl border border-zinc-"
  },
  {
    "path": "modules/blox/assets/css/components/page.css",
    "chars": 1792,
    "preview": "/* Page layout to push footer to bottom of page */\n\n.page-wrapper {\n  /* Min height = viewport height - navbar height */"
  },
  {
    "path": "modules/blox/assets/css/components/sidebar-left.css",
    "chars": 2759,
    "preview": "/* Match Tailwind lg (default 1024px): https://tailwindcss.com/docs/screens */\n@media (max-width: 1024px) {\n  .hb-sideba"
  },
  {
    "path": "modules/blox/assets/css/components/steps.css",
    "chars": 645,
    "preview": ".hb-steps {\n  @apply ml-4 mb-12 pl-6 border-l border-gray-200 [counter-reset:hb_step];\n\n  border-left-color: var(--color"
  },
  {
    "path": "modules/blox/assets/css/components/task-list.css",
    "chars": 556,
    "preview": "/* HugoBlox Kit - https://hugoblox.com\n * Task List Component\n * License: https://github.com/HugoBlox/kit/blob/main/LICE"
  },
  {
    "path": "modules/blox/assets/css/config/safelist.css",
    "chars": 16067,
    "preview": "/* Safelist patterns for dynamic classes */\n/* Note: In v4, we use @source inline to ensure these are included */\n/* Thi"
  },
  {
    "path": "modules/blox/assets/css/config/tailwind.css",
    "chars": 724,
    "preview": "/* Tailwind CSS v4 Configuration */\n/* Content detection and plugin configuration */\n\n/* Typography plugin for prose sty"
  },
  {
    "path": "modules/blox/assets/css/config/theme.css",
    "chars": 12502,
    "preview": "/* Tailwind CSS v4 Hugo BloxTheme Configuration */\n\n/* Theme Configuration */\n@theme {\n  /* Custom Colors */\n  --color-h"
  },
  {
    "path": "modules/blox/assets/css/framework/base.css",
    "chars": 2666,
    "preview": "/* Base styles for better text rendering */\n@layer base {\n  html {\n    -webkit-font-smoothing: antialiased;\n    -moz-osx"
  },
  {
    "path": "modules/blox/assets/css/framework/components.css",
    "chars": 2958,
    "preview": "/* Hugo Blox Framework Custom Classes */\n@layer components {\n  /* Section styles for Hugo Blox blocks */\n  .hbb-section "
  },
  {
    "path": "modules/blox/assets/css/hb-search.css",
    "chars": 1740,
    "preview": "/* Hugo Blox Search - Custom Pagefind Implementation */\n\n/* Animations */\n@keyframes spin {\n  to {\n    transform: rotate"
  },
  {
    "path": "modules/blox/assets/css/layout-utilities.css",
    "chars": 1671,
    "preview": "/*\n  Hugo Blox Layout Utilities\n  \n  Provides CSS utilities that use the configurable layout tokens:\n  - --hb-radius: Bo"
  },
  {
    "path": "modules/blox/assets/css/libs/chroma/dark.css",
    "chars": 5642,
    "preview": "/* Dracula dark theme */\n.dark .highlight {\n  /* Background */ /*.bg { color: #f8f8f2; background-color: #282a36 }*/\n  /"
  },
  {
    "path": "modules/blox/assets/css/libs/chroma/light.css",
    "chars": 6152,
    "preview": "/* Github light theme */\nhtml:not(.dark) .highlight {\n  /* Background */ /*.bg { background-color: #fff }*/\n  /* PreWrap"
  },
  {
    "path": "modules/blox/assets/css/main.css",
    "chars": 1221,
    "preview": "/* \n  Hugo Blox Tailwind CSS v4 - Main Entry Point\n  \n  This file orchestrates all CSS imports in the correct order:\n  1"
  },
  {
    "path": "modules/blox/assets/css/themes/amber.css",
    "chars": 909,
    "preview": "/* Hugo Blox color theme: AMBER */\n:root {\n  /* Amber Primary Palette */\n  --hb-primary-50-rgb: 255 251 235;\n  --hb-prim"
  },
  {
    "path": "modules/blox/assets/css/themes/blue.css",
    "chars": 898,
    "preview": "/* Hugo Blox color theme: BLUE */\n:root {\n  /* TW Blue Palette */\n  --hb-primary-50-rgb: 239 246 255;\n  --hb-primary-100"
  },
  {
    "path": "modules/blox/assets/css/themes/cyan.css",
    "chars": 907,
    "preview": "/* Hugo Blox color theme: CYAN */\n:root {\n  /* Cyan Primary Palette */\n  --hb-primary-50-rgb: 236 254 255;\n  --hb-primar"
  },
  {
    "path": "modules/blox/assets/css/themes/emerald.css",
    "chars": 910,
    "preview": "/* Hugo Blox color theme: EMERALD */\n:root {\n  /* Emerald Primary Palette */\n  --hb-primary-50-rgb: 236 253 245;\n  --hb-"
  },
  {
    "path": "modules/blox/assets/css/themes/fuchsia.css",
    "chars": 928,
    "preview": "/* Hugo Blox color theme: FUCHSIA */\n:root {\n  /* Fuchsia Primary Palette */\n  --hb-primary-50-rgb: 253 244 255;\n  --hb-"
  },
  {
    "path": "modules/blox/assets/css/themes/green.css",
    "chars": 909,
    "preview": "/* Hugo Blox color theme: GREEN */\n:root {\n  /* Green Primary Palette */\n  --hb-primary-50-rgb: 240 253 244;\n  --hb-prim"
  },
  {
    "path": "modules/blox/assets/css/themes/indigo.css",
    "chars": 917,
    "preview": "/* Hugo Blox color theme: INDIGO */\n:root {\n  /* Indigo Primary Palette */\n  --hb-primary-50-rgb: 238 242 255;\n  --hb-pr"
  },
  {
    "path": "modules/blox/assets/css/themes/lime.css",
    "chars": 908,
    "preview": "/* Hugo Blox color theme: LIME */\n:root {\n  /* Lime Primary Palette */\n  --hb-primary-50-rgb: 247 254 231;\n  --hb-primar"
  },
  {
    "path": "modules/blox/assets/css/themes/orange.css",
    "chars": 914,
    "preview": "/* Hugo Blox color theme: ORANGE */\n:root {\n  /* Orange Primary Palette */\n  --hb-primary-50-rgb: 255 247 237;\n  --hb-pr"
  },
  {
    "path": "modules/blox/assets/css/themes/pink.css",
    "chars": 912,
    "preview": "/* Hugo Blox color theme: PINK */\n:root {\n  /* Pink Primary Palette */\n  --hb-primary-50-rgb: 253 242 248;\n  --hb-primar"
  },
  {
    "path": "modules/blox/assets/css/themes/purple.css",
    "chars": 926,
    "preview": "/* Hugo Blox color theme: PURPLE */\n:root {\n  /* Purple Primary Palette */\n  --hb-primary-50-rgb: 250 245 255;\n  --hb-pr"
  },
  {
    "path": "modules/blox/assets/css/themes/red.css",
    "chars": 911,
    "preview": "/* Hugo Blox color theme: RED */\n:root {\n  /* Red Primary Palette */\n  --hb-primary-50-rgb: 254 242 242;\n  --hb-primary-"
  },
  {
    "path": "modules/blox/assets/css/themes/rose.css",
    "chars": 912,
    "preview": "/* Hugo Blox color theme: ROSE */\n:root {\n  /* Rose Primary Palette */\n  --hb-primary-50-rgb: 255 241 242;\n  --hb-primar"
  },
  {
    "path": "modules/blox/assets/css/themes/sky.css",
    "chars": 906,
    "preview": "/* Hugo Blox color theme: SKY */\n:root {\n  /* Sky Primary Palette */\n  --hb-primary-50-rgb: 240 249 255;\n  --hb-primary-"
  },
  {
    "path": "modules/blox/assets/css/themes/slate.css",
    "chars": 909,
    "preview": "/* Hugo Blox color theme: SLATE */\n:root {\n  /* Slate Primary Palette */\n  --hb-primary-50-rgb: 248 250 252;\n  --hb-prim"
  },
  {
    "path": "modules/blox/assets/css/themes/stone.css",
    "chars": 909,
    "preview": "/* Hugo Blox color theme: STONE */\n:root {\n  /* Stone Primary Palette */\n  --hb-primary-50-rgb: 250 250 249;\n  --hb-prim"
  },
  {
    "path": "modules/blox/assets/css/themes/teal.css",
    "chars": 907,
    "preview": "/* Hugo Blox color theme: TEAL */\n:root {\n  /* Teal Primary Palette */\n  --hb-primary-50-rgb: 240 253 250;\n  --hb-primar"
  },
  {
    "path": "modules/blox/assets/css/themes/violet.css",
    "chars": 927,
    "preview": "/* Hugo Blox color theme: VIOLET */\n:root {\n  /* Violet Primary Palette */\n  --hb-primary-50-rgb: 245 243 255;\n  --hb-pr"
  },
  {
    "path": "modules/blox/assets/css/themes/yellow.css",
    "chars": 910,
    "preview": "/* Hugo Blox color theme: YELLOW */\n:root {\n  /* Yellow Primary Palette */\n  --hb-primary-50-rgb: 254 252 232;\n  --hb-pr"
  },
  {
    "path": "modules/blox/assets/css/themes/zinc.css",
    "chars": 906,
    "preview": "/* Hugo Blox color theme: ZINC */\n:root {\n  /* Zinc Primary Palette */\n  --hb-primary-50-rgb: 250 250 250;\n  --hb-primar"
  },
  {
    "path": "modules/blox/assets/css/views/all.css",
    "chars": 27,
    "preview": "@import \"attachments.css\";\n"
  },
  {
    "path": "modules/blox/assets/css/views/attachments.css",
    "chars": 608,
    "preview": ".hb-attachment-link {\n  @apply inline-block font-semibold uppercase outline-none mr-4 mb-1.5 transition-all text-sm trac"
  },
  {
    "path": "modules/blox/assets/dist/lib/markmap/index.js",
    "chars": 13728,
    "preview": "this.markmap = this.markmap || {};\n(function(exports) {\n  \"use strict\";\n  var _a;\n  const testPath = \"npm2url/dist/index"
  },
  {
    "path": "modules/blox/assets/dist/lib/vendor-libs.mjs",
    "chars": 41,
    "preview": "const e = {};\nexport {\n  e as default\n};\n"
  },
  {
    "path": "modules/blox/assets/js/hb-animations.js",
    "chars": 3633,
    "preview": "/**\n * Hugo Blox Animations\n * Typewriter effect and scroll-triggered animations using Alpine.js\n */\n\ndocument.addEventL"
  },
  {
    "path": "modules/blox/assets/js/hb-citation.js",
    "chars": 5651,
    "preview": "/**\n * Citation clipboard handler for Hugo Blox Kit\n * Copies BibTeX citation to clipboard when cite button is clicked\n "
  },
  {
    "path": "modules/blox/assets/js/hb-clipboard.js",
    "chars": 4459,
    "preview": "/**\n * Clipboard Utilities for Hugo Blox Kit\n * Provides cross-browser clipboard functionality\n */\n\nimport {hugoEnvironm"
  },
  {
    "path": "modules/blox/assets/js/hb-code-copy.js",
    "chars": 4760,
    "preview": "import {hugoEnvironment, i18n} from \"@params\";\n\n// Constants\nconst NOTIFICATION_DURATION = 2000; // milliseconds\nconst D"
  },
  {
    "path": "modules/blox/assets/js/hb-head.js",
    "chars": 964,
    "preview": "import {applyHugoStyleFixes, initTheme} from \"./hb-init.js\";\n\n// Initialize Hugo Blox Kit global object\nconst root = doc"
  },
  {
    "path": "modules/blox/assets/js/hb-i18n.js",
    "chars": 1278,
    "preview": "window.addEventListener(\"DOMContentLoaded\", () => {\n  // Toggle language chooser sub-menu\n  const languageChoosers = doc"
  },
  {
    "path": "modules/blox/assets/js/hb-init.js",
    "chars": 1623,
    "preview": "// Hugo Blox JS Global Init (CSP-friendly)\nexport function initTheme() {\n  const root = document.documentElement;\n  cons"
  },
  {
    "path": "modules/blox/assets/js/hb-mermaid-config.js",
    "chars": 891,
    "preview": "function getCssVar(name) {\n  const value = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n  r"
  },
  {
    "path": "modules/blox/assets/js/hb-nav.js",
    "chars": 1399,
    "preview": "// Navigation\n\nconst applyScrollPadding = () => {\n  const header = document.querySelector(\".page-header\");\n  const posit"
  },
  {
    "path": "modules/blox/assets/js/hb-notifier.js",
    "chars": 6901,
    "preview": "/**\n * Notification/Toast System for Hugo Blox Kit\n * Provides reusable notification functionality\n */\n\nimport {hugoEnvi"
  },
  {
    "path": "modules/blox/assets/js/hb-search.js",
    "chars": 1133,
    "preview": "// Hugo Blox Search - Custom Pagefind API Implementation\n// Search is handled by Alpine.js component in search-modal.htm"
  },
  {
    "path": "modules/blox/assets/js/hb-sidebar.js",
    "chars": 2126,
    "preview": "document.addEventListener(\"DOMContentLoaded\", () => {\n  const buttons = document.querySelectorAll(\"[data-hb-sidebar-togg"
  },
  {
    "path": "modules/blox/assets/js/hb-theme.js",
    "chars": 2514,
    "preview": "// Hugo Blox Kit Light / Dark theme toggle\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n  addThemeToggleListene"
  },
  {
    "path": "modules/blox/assets/js/katex-config.js",
    "chars": 356,
    "preview": "document.addEventListener(\"DOMContentLoaded\", () => {\n  window.renderMathInElement(document.body, {\n    delimiters: [\n  "
  },
  {
    "path": "modules/blox/assets/js/vendor-libs.js",
    "chars": 382,
    "preview": "/**\n * Dummy entry file for Vite lib mode.\n *\n * This file exists as an entry point for the Vite build process.\n * The a"
  },
  {
    "path": "modules/blox/blox/collection/README.md",
    "chars": 2086,
    "preview": "# Collection Block\n\n**Transform your content into stunning, organized displays**\n\nThe Collection block is your ultimate "
  },
  {
    "path": "modules/blox/blox/collection/block.html",
    "chars": 12085,
    "preview": "{{/* Hugo Blox: Collection */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.com/H"
  },
  {
    "path": "modules/blox/blox/collection/manifest.json",
    "chars": 531,
    "preview": "{\n  \"id\": \"collection\",\n  \"name\": \"Collection\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"content\",\n  \"ta"
  },
  {
    "path": "modules/blox/blox/contact-info/README.md",
    "chars": 4466,
    "preview": "# Contact Info Block\n\nDisplay comprehensive contact information for your lab or organization with a modern, responsive c"
  },
  {
    "path": "modules/blox/blox/contact-info/block.html",
    "chars": 27733,
    "preview": "{{/* Hugo Blox: Contact Info Block */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://gith"
  },
  {
    "path": "modules/blox/blox/contact-info/manifest.json",
    "chars": 576,
    "preview": "{\n  \"id\": \"contact-info\",\n  \"name\": \"Contact Info\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"content\",\n "
  },
  {
    "path": "modules/blox/blox/cta-button-list/README.md",
    "chars": 2251,
    "preview": "# CTA Button List Block\n\n**Drive action with beautiful, conversion-focused button lists**\n\nTransform your visitors into "
  },
  {
    "path": "modules/blox/blox/cta-button-list/block.html",
    "chars": 2869,
    "preview": "{{/* Hugo Blox: Buttons */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.com/Hugo"
  },
  {
    "path": "modules/blox/blox/cta-button-list/manifest.json",
    "chars": 527,
    "preview": "{\n  \"id\": \"cta-button-list\",\n  \"name\": \"CTA Button List\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"marke"
  },
  {
    "path": "modules/blox/blox/cta-card/README.md",
    "chars": 6008,
    "preview": "# CTA Card Block\n\n**Create irresistible calls-to-action that convert**\n\nMake a bold statement and drive immediate action"
  },
  {
    "path": "modules/blox/blox/cta-card/client.jsx",
    "chars": 709,
    "preview": "import {render} from \"preact\";\nimport {CtaCardBlock} from \"./component.jsx\";\n\nfunction renderCtaCardBlock() {\n  const bl"
  },
  {
    "path": "modules/blox/blox/cta-card/component.jsx",
    "chars": 5058,
    "preview": "/**\n * CTA Card Block Component\n * A centered card with title, text, and primary action button.\n * Supports glassmorphis"
  },
  {
    "path": "modules/blox/blox/cta-card/manifest.json",
    "chars": 506,
    "preview": "{\n  \"id\": \"cta-card\",\n  \"name\": \"CTA Card\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"marketing\",\n  \"tags"
  },
  {
    "path": "modules/blox/blox/cta-image-paragraph/README.md",
    "chars": 2620,
    "preview": "# CTA Image Paragraph Block\n\n**Tell your story with stunning visuals and compelling copy**\n\nEngage your audience with th"
  },
  {
    "path": "modules/blox/blox/cta-image-paragraph/client.jsx",
    "chars": 754,
    "preview": "/**\n * CTA Image Paragraph Block - Client-side Hydration\n */\n\nimport {render} from \"preact\";\nimport {CtaImageParagraphBl"
  },
  {
    "path": "modules/blox/blox/cta-image-paragraph/component.jsx",
    "chars": 4530,
    "preview": "/**\n * CTA Image Paragraph Block Component - Single source of truth\n * Alternating image + text sections with feature li"
  },
  {
    "path": "modules/blox/blox/cta-image-paragraph/manifest.json",
    "chars": 552,
    "preview": "{\n  \"id\": \"cta-image-paragraph\",\n  \"name\": \"CTA Image Paragraph\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\""
  },
  {
    "path": "modules/blox/blox/dev-hero/README.md",
    "chars": 3650,
    "preview": "# Dev Hero Block\n\nA modern, developer-focused hero section optimized for dark mode with gradient effects, animated backg"
  },
  {
    "path": "modules/blox/blox/dev-hero/block.html",
    "chars": 22062,
    "preview": "{{/* Hugo Blox: Dev Hero */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.com/Hug"
  },
  {
    "path": "modules/blox/blox/dev-hero/manifest.json",
    "chars": 510,
    "preview": "{\n  \"id\": \"dev-hero\",\n  \"name\": \"Dev Hero\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"hero\",\n  \"tags\": [\""
  },
  {
    "path": "modules/blox/blox/faq/README.md",
    "chars": 1704,
    "preview": "# FAQ Block\n\nDisplay frequently asked questions in an interactive accordion format with automatic FAQPage structured dat"
  },
  {
    "path": "modules/blox/blox/faq/block.html",
    "chars": 7062,
    "preview": "{{- $wcPage := .wcPage -}}\n{{- $wcBlock := .wcBlock -}}\n{{- $wcIdentifier := .wcIdentifier -}}\n{{- $content := $wcBlock."
  },
  {
    "path": "modules/blox/blox/faq/manifest.json",
    "chars": 241,
    "preview": "{\n  \"name\": \"faq\",\n  \"version\": \"1\",\n  \"title\": \"FAQ\",\n  \"description\": \"Display frequently asked questions in an accord"
  },
  {
    "path": "modules/blox/blox/features/README.md",
    "chars": 2589,
    "preview": "# Features Block\n\n**Showcase what makes you special with stunning feature grids**\n\nPresent your key features, services, "
  },
  {
    "path": "modules/blox/blox/features/client.jsx",
    "chars": 674,
    "preview": "/**\n * Features Block - Client-side Hydration\n */\n\nimport {render} from \"preact\";\nimport {FeaturesBlock} from \"./compone"
  },
  {
    "path": "modules/blox/blox/features/component.jsx",
    "chars": 2351,
    "preview": "/**\n * Features Block Component - Single source of truth\n * Responsive grid of feature items with icon, name, and descri"
  },
  {
    "path": "modules/blox/blox/features/manifest.json",
    "chars": 513,
    "preview": "{\n  \"id\": \"features\",\n  \"name\": \"Features\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"content\",\n  \"tags\":"
  },
  {
    "path": "modules/blox/blox/hero/README.md",
    "chars": 2692,
    "preview": "# Hero Block\n\n**Make an unforgettable first impression**\n\nCapture attention and drive action from the moment visitors la"
  },
  {
    "path": "modules/blox/blox/hero/client.jsx",
    "chars": 1144,
    "preview": "/**\n * Hero Block - Client-side Hydration\n * Uses the shared component for consistency\n */\n\nimport {render} from \"preact"
  },
  {
    "path": "modules/blox/blox/hero/component.jsx",
    "chars": 5203,
    "preview": "/**\n * Hero Block Component - Single source of truth\n * Used for both SSR and client-side hydration\n */\n\nimport {Icon} f"
  },
  {
    "path": "modules/blox/blox/hero/manifest.json",
    "chars": 515,
    "preview": "{\n  \"id\": \"hero\",\n  \"name\": \"Hero\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"marketing\",\n  \"tags\": [\"her"
  },
  {
    "path": "modules/blox/blox/knowledge-categories/block.html",
    "chars": 7176,
    "preview": "{{- $wcPage := .wcPage -}}\n{{- $wcBlock := .wcBlock -}}\n{{- $wcIdentifier := .wcIdentifier -}}\n{{- $content := $wcBlock."
  },
  {
    "path": "modules/blox/blox/knowledge-categories/manifest.json",
    "chars": 219,
    "preview": "{\n  \"name\": \"knowledge-categories\",\n  \"version\": \"1\",\n  \"title\": \"Knowledge Categories\",\n  \"description\": \"Grid of knowl"
  },
  {
    "path": "modules/blox/blox/logos/README.md",
    "chars": 5990,
    "preview": "# Logos Block\n\nDisplay partner, sponsor, or collaborator logos with modern interactive effects and multiple display mode"
  },
  {
    "path": "modules/blox/blox/logos/block.html",
    "chars": 15375,
    "preview": "{{/* Hugo Blox: Logos Block */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.com/"
  },
  {
    "path": "modules/blox/blox/logos/manifest.json",
    "chars": 542,
    "preview": "{\n  \"id\": \"logos\",\n  \"name\": \"Logos\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"content\",\n  \"tags\": [\"log"
  },
  {
    "path": "modules/blox/blox/markdown/README.md",
    "chars": 2959,
    "preview": "# Markdown Block\n\n**Beautiful typography for your content**\n\nTransform your written content into beautifully formatted, "
  },
  {
    "path": "modules/blox/blox/markdown/block.html",
    "chars": 997,
    "preview": "{{/* Hugo Blox: Markdown */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.com/Hug"
  },
  {
    "path": "modules/blox/blox/markdown/manifest.json",
    "chars": 501,
    "preview": "{\n  \"id\": \"markdown\",\n  \"name\": \"Markdown\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"content\",\n  \"tags\":"
  },
  {
    "path": "modules/blox/blox/portfolio/README.md",
    "chars": 9400,
    "preview": "# Portfolio Block\n\nA flexible, filterable portfolio block for showcasing work with Alpine.js-powered filtering and moder"
  },
  {
    "path": "modules/blox/blox/portfolio/block.html",
    "chars": 22977,
    "preview": "{{/* Hugo Blox: Portfolio */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.com/Hu"
  },
  {
    "path": "modules/blox/blox/portfolio/manifest.json",
    "chars": 543,
    "preview": "{\n  \"id\": \"portfolio\",\n  \"name\": \"Portfolio\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"content\",\n  \"tags"
  },
  {
    "path": "modules/blox/blox/research-areas/README.md",
    "chars": 7786,
    "preview": "# Research Areas Block\n\nDisplay your research focus areas with stunning visuals, metrics, and interactive layouts. Perfe"
  },
  {
    "path": "modules/blox/blox/research-areas/block.html",
    "chars": 20928,
    "preview": "{{/* Hugo Blox: Research Areas Block */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://gi"
  },
  {
    "path": "modules/blox/blox/research-areas/manifest.json",
    "chars": 531,
    "preview": "{\n  \"id\": \"research-areas\",\n  \"name\": \"Research Areas\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"content"
  },
  {
    "path": "modules/blox/blox/resume-awards/README.md",
    "chars": 3081,
    "preview": "# Resume Awards Block\n\n**Highlight your achievements with professional elegance**\n\nShowcase your professional accomplish"
  },
  {
    "path": "modules/blox/blox/resume-awards/block.html",
    "chars": 7027,
    "preview": "{{/* Hugo Blox: Awards */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.com/HugoB"
  },
  {
    "path": "modules/blox/blox/resume-awards/manifest.json",
    "chars": 546,
    "preview": "{\n  \"id\": \"resume-awards\",\n  \"name\": \"Resume Awards\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"resume\",\n"
  },
  {
    "path": "modules/blox/blox/resume-biography/README.md",
    "chars": 3337,
    "preview": "# Resume Biography Block\n\n**Make a powerful personal first impression**\n\nPresent yourself professionally with the Resume"
  },
  {
    "path": "modules/blox/blox/resume-biography/block.html",
    "chars": 14887,
    "preview": "{{/* Hugo Blox: Biography */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.com/Hu"
  },
  {
    "path": "modules/blox/blox/resume-biography/manifest.json",
    "chars": 542,
    "preview": "{\n  \"id\": \"resume-biography\",\n  \"name\": \"Resume Biography\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"res"
  },
  {
    "path": "modules/blox/blox/resume-biography-3/README.md",
    "chars": 4234,
    "preview": "# Resume Biography 3 Block\n\n**Comprehensive professional profile with integrated academic details**\n\nPresent a complete "
  },
  {
    "path": "modules/blox/blox/resume-biography-3/block.html",
    "chars": 24485,
    "preview": "{{/* Hugo Blox: Biography 3 */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.com/"
  },
  {
    "path": "modules/blox/blox/resume-biography-3/manifest.json",
    "chars": 545,
    "preview": "{\n  \"id\": \"resume-biography-3\",\n  \"name\": \"Resume Biography 3\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": "
  },
  {
    "path": "modules/blox/blox/resume-experience/README.md",
    "chars": 3525,
    "preview": "# Resume Experience Block\n\n**Tell your professional journey with timeline elegance**\n\nPresent your career progression an"
  },
  {
    "path": "modules/blox/blox/resume-experience/block.html",
    "chars": 20942,
    "preview": "{{/* Hugo Blox: Experience - 2026 Redesign */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: http"
  },
  {
    "path": "modules/blox/blox/resume-experience/manifest.json",
    "chars": 557,
    "preview": "{\n  \"id\": \"resume-experience\",\n  \"name\": \"Resume Experience\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"r"
  },
  {
    "path": "modules/blox/blox/resume-languages/README.md",
    "chars": 3464,
    "preview": "# Resume Languages Block\n\n**Showcase your multilingual capabilities with visual elegance**\n\nHighlight your language skil"
  },
  {
    "path": "modules/blox/blox/resume-languages/block.html",
    "chars": 4205,
    "preview": "{{/* Hugo Blox: Languages */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.com/Hu"
  },
  {
    "path": "modules/blox/blox/resume-languages/manifest.json",
    "chars": 573,
    "preview": "{\n  \"id\": \"resume-languages\",\n  \"name\": \"Resume Languages\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"res"
  },
  {
    "path": "modules/blox/blox/resume-skills/README.md",
    "chars": 3614,
    "preview": "# Resume Skills Block\n\n**Demonstrate expertise with organized skill categories and visual progress**\n\nPresent your techn"
  },
  {
    "path": "modules/blox/blox/resume-skills/block.html",
    "chars": 5947,
    "preview": "{{/* Hugo Blox: Skills */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.com/HugoB"
  },
  {
    "path": "modules/blox/blox/resume-skills/manifest.json",
    "chars": 559,
    "preview": "{\n  \"id\": \"resume-skills\",\n  \"name\": \"Resume Skills\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"resume\",\n"
  },
  {
    "path": "modules/blox/blox/search-hero/README.md",
    "chars": 5978,
    "preview": "# Search Hero Block\n\nA modern hero section with prominent search functionality, perfect for knowledge bases and document"
  },
  {
    "path": "modules/blox/blox/search-hero/block.html",
    "chars": 6819,
    "preview": "{{- $wcPage := .wcPage -}}\n{{- $wcBlock := .wcBlock -}}\n{{- $wcIdentifier := .wcIdentifier -}}\n\n{{/* Enable Alpine.js fo"
  },
  {
    "path": "modules/blox/blox/search-hero/manifest.json",
    "chars": 211,
    "preview": "{\n  \"name\": \"search-hero\",\n  \"version\": \"1\",\n  \"title\": \"Search Hero\",\n  \"description\": \"Hero section with prominent sea"
  },
  {
    "path": "modules/blox/blox/shared/js/components/Icon.jsx",
    "chars": 2352,
    "preview": "// biome-ignore lint/correctness/noUnusedImports: Classic Preact JSX runtime may require 'h' for JSX transform\nimport {h"
  },
  {
    "path": "modules/blox/blox/stats/README.md",
    "chars": 6527,
    "preview": "# Stats Block\n\nDisplay impressive statistics with modern animations, icons, and engaging visual effects. Perfect for sho"
  },
  {
    "path": "modules/blox/blox/stats/client.jsx",
    "chars": 891,
    "preview": "/**\n * Stats Block - Client-side Hydration\n * Uses the shared StatsBlock component for consistency\n */\n\nimport {render} "
  },
  {
    "path": "modules/blox/blox/stats/component.jsx",
    "chars": 10763,
    "preview": "/**\n * Stats Block Component - Single source of truth\n * Used for both SSR (via preact-wrapper) and SaaS live preview\n *"
  },
  {
    "path": "modules/blox/blox/stats/manifest.json",
    "chars": 572,
    "preview": "{\n  \"id\": \"stats\",\n  \"name\": \"Stats\",\n  \"version\": \"2.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"content\",\n  \"tags\": [\"sta"
  },
  {
    "path": "modules/blox/blox/team-showcase/README.md",
    "chars": 5923,
    "preview": "# Team Showcase Block\n\nDisplay your team members with a beautiful, responsive grid layout featuring rich profiles, socia"
  },
  {
    "path": "modules/blox/blox/team-showcase/block.html",
    "chars": 29071,
    "preview": "{{/* Hugo Blox: Team Showcase */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.co"
  },
  {
    "path": "modules/blox/blox/team-showcase/manifest.json",
    "chars": 516,
    "preview": "{\n  \"id\": \"team-showcase\",\n  \"name\": \"Team Showcase\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"category\": \"content\","
  },
  {
    "path": "modules/blox/blox/tech-stack/README.md",
    "chars": 3228,
    "preview": "# Tech Stack Block\n\nA visual grid display of technologies and skills organized by category, with icon support and option"
  },
  {
    "path": "modules/blox/blox/tech-stack/block.html",
    "chars": 8605,
    "preview": "{{/* Hugo Blox: Tech Stack */}}\n{{/* Documentation: https://hugoblox.com/blocks/ */}}\n{{/* License: https://github.com/H"
  }
]

// ... and 579 more files (download for full content)

About this extraction

This page contains the full source code of the HugoBlox/kit GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 779 files (6.8 MB), approximately 1.8M tokens, and a symbol index with 135 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!