Commit Graph
2247 Commits
Author SHA1 Message Date
George Cushen c0458a2e8f feat(blox): add comparison-table block
Responsive desktop table + mobile stacked-cards competitor comparison.
Supports category headings, boolean check/cross/partial and text cell
values, row striping, highlighted column with gradient border, and a
CTA row. Per-cell zebra striping opts out on the highlighted column to
avoid ring paint-order conflicts.
2026-05-02 17:03:41 +01:00
George Cushen dc14b48b42 feat(faq): migrate FAQ block from Go HTML to Preact
Replaces block.html with a Preact component featuring smooth CSS grid
0fr→1fr height animation, icon rotation, and multi-paragraph answer
support via renderRich(). Single-open accordion with question/title and
answer/text field aliases for backward compatibility.
2026-05-02 17:03:36 +01:00
George Cushen 237a7e2d59 fix(templates): use hoisted node-linker so Hugo v0.161 can resolve tailwindcss
Hugo v0.161's css.TailwindCSS reads node_modules/.bin/tailwindcss and
expects either a symlink or a Node-shebang script. pnpm's default
isolated linker creates shell wrappers (#!/bin/sh with NODE_PATH
manipulation), which Hugo rejects with "binary tailwindcss is not a
Node.js script". With node-linker=hoisted, pnpm flattens node_modules
and creates plain symlinks for Node-shebang bins — same shape npm
produces, which Hugo handles via its symlink branch in resolveNodeBin
(common/hexec/exec.go).

- Add .npmrc with node-linker=hoisted to all 9 templates and test/
- Verified end-to-end: academic-cv builds cleanly against published
  modules/blox with Hugo v0.161.1
- Kit root and modules/blox keep pnpm's isolated linker for monorepo
2026-05-02 03:29:43 +01:00
George Cushen f5aabdd310 feat(blox): add comparison-table block 2026-05-02 03:08:09 +01:00
George Cushen 8fb7186068 fix(templates): make shipped build.yml compatible with Hugo v0.161
The shipped per-template GitHub Actions build workflow still pinned
Node 20 and fell back to Hugo 0.154.5 on missing config - both
incompatible with Hugo v0.161's css.TailwindCSS Node permission sandbox
(Node >= 22, npm @tailwindcss/cli required). Sites upgraded via
`hugoblox upgrade` (which only touches go.mod) hit this immediately.

- Bump NODE_VERSION 20 -> 22 in all 9 templates' .github/workflows/build.yml
- Bump fallback DEFAULT_VERSION 0.154.5 -> 0.161.0 to match the framework's
  new module.hugoVersion.min
- Add a "Verify Tailwind CSS dependency" step that fails fast with an
  actionable ::error message if @tailwindcss/cli is not resolvable,
  replacing Hugo's cryptic "binary tailwindcss is not a Node.js script"
2026-05-02 03:08:09 +01:00
George Cushen 23e0bb1269 feat(blox): add steps block
Steps block:
- Three layouts: vertical (stacked with connector line), horizontal
  (side-by-side, connector above), timeline (alternating cards on centre
  line)
- Three marker styles: number (decimal/padded/roman/alpha), icon, dot
- Layout-aware marker sizing - bare 40px icon for horizontal, tinted
  circle for vertical/timeline
- Staggered IntersectionObserver entrance animation
- Code span rendering in step body text
- Added to startup-landing-page template as a horizontal how-it-works
  section
2026-05-02 03:08:09 +01:00
github-actions[bot] 4fd86541d0 chore(templates): update modules to latest commits 2026-04-30 21:03:18 +00:00
George Cushen 3b70b325af feat(blocks): migrate logos block to Preact with marquee, grid, and per-item overrides
Replace legacy static Go HTML logos block with a Preact component. Adds three
layouts (row, grid, marquee), three filter styles (grayscale/color/white),
and three sizes (sm/md/lg). Fixed-width slots normalise visual weight across
SVG aspect ratios; per-item `scale` compensates for viewBox whitespace and
per-item `style` allows individual colour exceptions.  Add logos block to startup-landing-page template.
2026-04-30 22:01:41 +01:00
George Cushen 4c13c45536 feat(blox): add pricing block
New block with 2–4 column tier grid, monthly/yearly billing toggle
(per-billing price_note_monthly/yearly fields), highlighted tier with
primary tint + scale, per-tier feature checklists (included/excluded +
optional note), and per-tier CTA buttons.

startup-landing-page template wired up with a
3-tier Starter/Pro/Business example.
2026-04-30 20:49:53 +01:00
George Cushen 6aa2898258 chore(deps): upgrade to Hugo v0.161.0 (css.TailwindCSS Node.js sandbox)
Hugo v0.161 dropped the standalone tailwindcss binary; @tailwindcss/cli
npm package is now the only accepted transformer, invoked via
`node --permission` (Node >= 22 required).

- Bump module.hugoVersion.min to 0.161.0 in modules/blox/hugo.yaml;
  add comment explaining why security.node.permissions is left to
  Hugo's built-in defaults
- Bump hugo_version / HUGO_VERSION / devcontainer image tag to 0.161.0
  across all 9 templates (hugoblox.yaml, netlify.toml, devcontainer.json)
- Bump devcontainer base image Node 20 → 22 and default Hugo version
- Add scripts/check-template-deps.mjs to assert every template declares
  tailwindcss + @tailwindcss/cli; wire as pnpm check:template-deps
- Harden CI: new audit-template-deps job gates all build jobs; add
  `require.resolve('@tailwindcss/cli/package.json')` check after each
  pnpm install to catch the exact "binary is not a Node.js script" failure
2026-04-30 20:12:37 +01:00
George Cushen a034cf7dbe docs: edit 2026-04-29 10:29:48 +01:00
George Cushen 00c52d4a5d refactor(blox): rename collection -> content-collection 2026-04-29 10:25:39 +01:00
George Cushen f019cbac21 refactor(blox): namespace vertical-locked blocks; generalise focus-areas
- research-areas → focus-areas (general scope: services, programs,
  research themes, expertise). Metric fields refactored from hardcoded
  team_size/publications/funding into a generic
  `metrics: [{icon, value, label}]` array; legacy fields kept as a
  backcompat fallback so existing content renders identically.
- knowledge-categories → help-categories
- trending-questions → help-questions

The `help-` prefix matches public-facing help-center conventions and mirrors the existing `resume-` namespace
pattern for vertical-locked blocks. Aliases in
data/blox_aliases.yaml preserve backwards compatibility -
templates keep working without content edits.
2026-04-29 00:45:11 +01:00
George Cushen 752539141a docs: edit 2026-04-22 23:53:37 +01:00
George Cushen f4e98c42b3 docs: fix links 2026-04-22 02:02:59 +01:00
George Cushen 456a0faf43 tpl(starter): add minimal Tailwind starter template 2026-04-22 01:40:43 +01:00
George Cushen 3fc7cd05e4 docs: edit 2026-04-21 20:53:19 +01:00
George Cushen 8e726a3518 fix(footer): don't default to CC license when param null 2026-04-21 20:48:51 +01:00
George Cushen 032e2ce5c5 docs: edit 2026-04-19 07:02:21 +01:00
George Cushen ab31415552 docs: edit 2026-04-19 06:52:37 +01:00
George Cushen fe1f4d6a23 fix(render-image): warn with source position on unresolved local images
BREAKING CHANGE:

Requires Hugo v0.160
2026-04-16 02:18:38 +01:00
George Cushen ca9888609e fix(sections): update stale singular section path references to plural
- Fix build_links.html project/ → projects/ GetPage lookup (breaking bug)
- Fix collection block.html event/publication → events/publications type checks
- Update academic-cv publication archetypes, import workflow (publication/ → publications/)
- Update data-science-blog import workflow, notebook, author RSS URL (post/ → blog/)
- Update documentation and startup-landing-page author RSS URLs (post/ → blog/)
2026-04-16 02:16:23 +01:00
George Cushen 3f5e979aa1 fix(icons): replace hand-rolled entity decoder with browser-native parser (CWE-116) 2026-04-08 19:31:46 +01:00
George Cushen 87a8fc714e fix(rss): hide private/unlisted pages in RSS feed 2026-04-08 19:02:34 +01:00
George Cushen 9b2f6809f3 docs: edit 2026-04-08 18:19:15 +01:00
George Cushen a955161dbb fix(spacing): connect section spacing to design token system
Wire .hbb-section to var(--hb-spacing-section) instead of hardcoded 6rem,
enabling hugoblox.layout.spacing (compact/comfortable/spacious) to take effect.

- Default to "spacious" (6rem) to preserve existing visual layouts
- Per-section override via design.spacing.padding still works (inline > class)
- Remove dead design.spacing frontmatter field from all templates
- Set correct layout.spacing token in each template's params.yaml

Closes #3314
2026-04-08 18:19:15 +01:00
github-actions[bot] 117881f658 chore(templates): bump modules and Hugo 2026-04-02 21:02:26 +00:00
github-actions[bot] bf6e028728 chore(blox): prepare v0.12.0 2026-04-02 21:02:25 +00:00
George Cushen 0bb02ee2cf docs: edit 2026-04-02 21:59:22 +01:00
George Cushen ae1b67e9d1 docs: edit 2026-04-02 21:52:19 +01:00
George Cushen e8fcdf2e86 ci: format 2026-04-02 21:26:33 +01:00
George Cushen a17ae9d6de chore: bump v 2026-04-02 21:25:53 +01:00
George Cushen 73f56fc1aa fix(biography): fix Resume section spacing and implement show_status option
- Use design.spacing.padding to remove top padding on biography section
  with banner image (previously caused a large 96px gap above the banner)
- Add proper vertical spacing (mt-4) between bio text and Download Résumé button
- Implement design.show_status option in both biography and biography-3 blocks
  (config was accepted but never checked — status emoji always rendered)
2026-04-02 21:18:29 +01:00
George Cushen 060a7e41fe fix(team-showcase): align section header with standard block pattern 2026-04-02 20:32:52 +01:00
George Cushen f53402d057 chore: update workspace 2026-04-02 20:21:07 +01:00
George Cushen 3468c50da0 fix(portfolio): remove leave transition to prevent grid reflow jump on filter
Removes x-transition:leave directives from portfolio cards so hidden items
exit the grid flow immediately. This fixes two visual glitches when clicking
filter buttons: "ghost" cards briefly appearing during the overlap of enter
and leave animations, and cards snapping from their original grid position
to the start after a delayed reflow.

Fixes #3309
2026-03-30 20:37:44 +01:00
Aki ArigaandClaude Opus 4.6 611be3562f feat: use get_featured_image partial consistently for og:image and JSON-LD (#3311)
site_head.html, jsonld/article.html, jsonld/qapage.html, and
jsonld/event.html hardcode `(.Resources.ByType "image").GetMatch
"*featured*"` to find featured images. This ignores custom filenames
set via `.Params.image.filename` in front matter, causing og:image
and JSON-LD image to fall back to the site icon.

Replace the hardcoded pattern with the `get_featured_image` partial
(already used by jsonld/webpage.html), which properly searches for:
1. Files matching `*featured*` in the page directory
2. Custom filename from `.Params.image.filename` in the page directory
3. Custom filename in `assets/media/` directory

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 20:29:18 +01:00
George Cushen f972c65119 fix(ci): detect .github dir changes in template splitter workflow 2026-03-30 19:55:50 +01:00
George Cushen 6a2f1ba2ae fix(tpl): resolve broken assets on GitHub Pages subdirectory deployments
Add `actions/configure-pages` step to all template build workflows and
pass the detected base_url to `hugo --baseURL`, so sites deployed to
subdirectory paths (e.g. user.github.io/repo-name/) generate correct
asset URLs. Also fix leading-slash relURL calls in slides layout that
would ignore the baseURL path component.
2026-03-30 19:27:42 +01:00
George Cushen 26e1f775a2 chore(ci): bump GitHub Actions to Node.js 24-compatible versions
Bumps actions across all template and repo workflows to avoid the
Node.js 20 deprecation (enforced June 2026):
- actions/checkout v3/v4 → v6
- actions/cache v4 → v5
- actions/setup-go v5 → v6
- actions/setup-python v4/v5 → v6
- peter-evans/create-pull-request v5/v6 → v7
2026-03-30 19:20:15 +01:00
George Cushen ec5aca1fdb chore(tpl): migrate support for Hugo Content adaptor in Hugo v0.158+ 2026-03-30 19:04:08 +01:00
George Cushen 1c3e70a5f5 chore(tpl): devicon renamed aws icon 2026-03-30 19:03:13 +01:00
George Cushen 27313292ed chore(tpl): fix hugo version detection 2026-03-30 18:52:22 +01:00
github-actions[bot] f54d1c825e chore(templates): update modules to latest commits 2026-03-27 04:45:11 +00:00
George Cushen 76023f9461 refactor(images): adopt Hugo reflect.IsImageResource* API for type-safe image processing
Replace manual format detection (printf "%T", MediaType.SubType whitelists,
duck-typing) with Hugo's new reflect.IsResource, reflect.IsImageResource, and
reflect.IsImageResourceProcessable functions across 19 template files.

Key changes:
- process_responsive_image: collapse 15-line format whitelist into single
  reflect.IsImageResourceProcessable call
- Unify three-way SVG/processable/GIF branches into two-way $canProcess guard
- Remove duplicate GIF passthrough branches in single.html, events/page.html
- Add missing SVG guard in research-areas block (was calling .Fill unprotected)
- Replace nil checks with reflect.IsResource in get_cover_image/get_featured_image

Design decision: GIFs are intentionally excluded from processing despite Hugo
supporting it — processing strips animation frames, so we preserve user-optimized
animated GIFs by checking (IsImageResourceProcessable AND not GIF).
2026-03-27 04:35:53 +00:00
George Cushen ee683c8cd1 feat(hugo): replace deprecated cascade._target for Hugo v0.156+ compatibility 2026-03-27 04:17:17 +00:00
George Cushen 4fa40b91e2 feat(css): co-locate block CSS with auto-discovery via Tailwind pipeline
Move block-specific CSS from centralized assets/css/blox/ to co-located
style.css files within each block directory. The css.html partial now
auto-discovers style.css files from bundled and community blocks and
concatenates them into the Tailwind entry via resources.Concat, enabling
full @apply support while avoiding VFS path resolution issues.

Shared biography styles (avatar, ruby) are extracted to blox/shared/css/
and auto-included before per-block styles. Navbar CSS moves to
components/ as it's a framework-level concern. The separate community
CSS pipeline in site_head.html is removed — all block CSS now flows
through a single Tailwind entry point.
2026-03-27 04:15:49 +00:00
George Cushen 13dde12ae0 refactor(hugo): use strings.ReplacePairs for chained replacements
Adopt Hugo v0.158's strings.ReplacePairs in rss.xml and
parse_block_v3.html to replace nested replace calls.
2026-03-27 03:33:15 +00:00
George Cushen 815d25ca9d feat(hugo): replace deprecated language APIs for Hugo v0.158+ compatibility
Replace site.LanguageCode → site.Language.Locale and
.Language.LanguageCode → .Language.Locale in module layouts,
and languageCode → locale in all template language configs.
2026-03-27 03:30:44 +00:00
George Cushen ef8ed449c7 feat(hugo): replace deprecated APIs for Hugo v0.156+ compatibility
Migrate site.Data → hugo.Data (42 occurrences), site.IsMultiLingual →
hugo.IsMultilingual, and site.AllPages → hugo.Sites nested range.
Simplify Netlify redirects template to use pre-processed aliases
instead of relLangURL per gohugoio/hugo#14408.
2026-03-27 03:25:42 +00:00