129 Commits
Author SHA1 Message Date
github-actions[bot] 68cbf33530 chore(templates): update modules to latest commits 2026-05-27 02:54:14 +00:00
George Cushen 26c336eb6d feat(publications): improve structure + awards/funding/license metadata
Restructure `publication` frontmatter from a flat Markdown string into a
structured object (name, short_name, volume, issue, pages, publisher),
resolved through a new `functions/resolve_publication.html` partial that
also emits a per-page warning pointing legacy sites at `hugoblox migrate
publications`. APA/MLA citation rendering and the publication metadata
row both consume the resolver - no parsing of conventional Markdown
strings at render time.

Add work-level metadata fields surfaced via a new reusable
`components/award_badge.html` partial (variants: pill, card-corner,
inline, row; level-driven icon + colour tokens; pagefind filter):

- `awards[]` - name, level (winner/runner_up/honorable_mention/nominee/
  selected/featured), issuer, date, note, url; skim-row pills above the
  featured image, full row in the metadata grid, corner badges on card
  and slides-gallery views, inline marker on citation views, pill on
  date-title-summary
- `funding[]` - funder + grant + url, rendered as a metadata grid row
- `license` - SPDX-friendly string, metadata grid row
- `peer_reviewed`, `open_access` - status pills, decoupled from
  the publication block so preprints can surface them

Demo content updated in academic-cv (and the same shape in research-lab).
2026-05-27 03:53:21 +01:00
github-actions[bot] a93892fc61 chore(templates): update modules to latest commits 2026-05-27 02:39:19 +00:00
George Cushen f107371dc2 fix(tpl): hugo v0.161+ pnpm support 2026-05-04 07:58:10 +01:00
George Cushen 1cf3eacddb ci: update node/actions due to GH node v20 deprecation
Still on node20 - blocked on upstream releases:

peaceiris/actions-hugo@v3 - the maintainer merged a node24 upgrade to main but hasn't cut a new release tag yet; nothing to do until v3.1.0 drops
HugoBlox/gh-action-updater@v2 - needs update
2026-05-02 22:09:13 +01:00
George Cushen 5767dde5e9 fix: hugo v0.161 insufficient tailwind security perms 2026-05-02 21:58:20 +01:00
github-actions[bot] 3702dd316c chore(templates): update modules to latest commits 2026-05-02 20:35:03 +00:00
George Cushen b8ad554028 refactor(template): rename startup-landing-page → saas-landing-page
The template's redesigned content (around fictional Beacon - a B2B SaaS feedback platform)

What's renamed (internal only):
- templates/startup-landing-page/ → templates/saas-landing-page/
- hugoblox.yaml: template id "landing-page" → "saas-landing-page",
  name "Landing Page" → "SaaS Landing Page"
- CI workflows: source path in ci-build-starters-matrix.yml and
  release-package-splitter.yml
- README.md: slug in URLs, CLI command (`npx hugoblox
  create site --template saas-landing-page`)
- splitter target repo: hugo-theme-startup-landing-page →
  hugo-theme-saas-landing-page
2026-05-02 21:30:50 +01:00
George Cushen f584ad1610 fix(parse_block_v3): replace section_break mask-image with gradient overlay
The mask-image approach for section_break was wrong: making pixels
transparent reveals the body background, not the next sibling section
(which sits below in document flow, not behind in z-order). When the
body bg didn't match the adjacent section, this produced a visible
white/light strip between sections — exactly what the fade was
supposed to prevent.

Replace mask-image with absolutely-positioned gradient overlay divs at
the section's top/bottom edges. The overlay fades from transparent to
a user-specified colour matching the adjacent sibling's background.
Explicit colour declaration is required because Hugo can't reliably
auto-detect the next sibling's bg at parse time.

API change (no backward-compat — feature was added this session, no
sites depend on the legacy string form):

  # before
  section_break: fade-bottom

  # after
  section_break:
    fade_bottom: "#101828"   # CSS colour matching next section's bg
    fade_top:    "#0a0e27"   # optional, independent
    size:        "6rem"      # optional, default 6rem

Update the landing page hero (fade-bottom into dark logos band) and
cta-card (fade-top from white FAQ section above) to the new form.
2026-05-02 18:25:18 +01:00
George Cushen 0e2d96a8ce style(template): convert logos band to dark mode for visual rhythm
Switch the logos section to a dark band (bg-gray-900 + force `dark`
mode within the section) and white logo style. Extends the dark zone
from the hero so the hero's section_break: fade-bottom transitions
dark → dark instead of revealing a light strip.

The logos block itself keeps supporting both light and dark — only the
landing page config changes here. Other templates can opt for a light
band by reverting to `bg-gray-50 dark:bg-gray-900` + `logo_style:
grayscale`.
2026-05-02 18:14:00 +01:00
George Cushen 80913c028a feat(hero): Phase 3 — media slot and split-layout variants
- New `content.media` field accepts image (Hugo-pipeline-processed for
  responsive srcset) or video (passes through as <video>). Optional
  `dark_src` provides a dark-mode image variant.
- New `design.layout` enum: centered (default) | split-left |
  split-right | stacked. Split layouts auto-set alignment to 'left'
  unless explicitly overridden.
- Bump trust-strip star size from w-4 to w-5 for visual presence.
- Two new shared partials in layouts/_partials/functions/:
  - resolve_image_resource: path → {resource | fallback_url}
  - process_image_for_props: path → {src, srcset, width, height}
  These factor out the resource-resolution + responsive-processing
  pipeline so media-bearing blocks don't have to inline it.
- Capabilities registry: media-image, media-video, split-layouts.
- Landing page _index.md: keeps the centered hero (no behavioural
  change) but documents the opt-in pattern for split layouts inline.
2026-05-02 17:52:57 +01:00
George Cushen 6f61c4ac30 feat(hero): Phase 1 — title highlight, eyebrow, CTA styles, trust strip, announcement badge
- Title: [bracket] syntax wraps word(s) in primary→secondary gradient
  span (negative lookahead avoids markdown link conflicts)
- Eyebrow: small primary-coloured uppercase label rendered just above
  the title — distinct from the announcement pill
- CTAs: per-action style field (gradient | solid | outline | ghost |
  text), rounded-full pill default, primary defaults to gradient with
  brand-coloured shadow glow, secondary defaults to text
- Secondary action: now supports an icon (replaces trailing arrow)
- Trust strip: optional {stars, text} block rendered below CTAs with
  amber star strip and supporting copy
- Announcement: optional {text, color} badge prefix (NEW/BETA chips)
- preact-wrapper: resolves secondary_action.icon into secondary_icon_svg
- Capabilities registry: title-highlight, eyebrow, cta-styles,
  announcement-badge, trust-strip
2026-05-02 17:23:56 +01:00
George Cushen b564ceaffa chore: apply biome formatter to source files 2026-05-02 17:06:08 +01:00
George Cushen 27711e4f42 style(template): 2026 redesign of startup landing page
Applies full visual polish to the startup-landing-page starter:
- Hero: deep navy base with radial violet glow, gradient mesh orbs,
  section_break fade-bottom
- Stats: minimal layout with gradient numbers
- Features: bento layout, reordered items, richer descriptions
- Comparison table and FAQ sections added
- CTA card: primary-to-secondary gradient with fade-top section break
- Navigation: Compare, Pricing, FAQ menu items added
2026-05-02 17:04:57 +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 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 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 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 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
George Cushen 0bb02ee2cf docs: edit 2026-04-02 21:59:22 +01:00
George Cushen e8fcdf2e86 ci: format 2026-04-02 21:26:33 +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 f53402d057 chore: update workspace 2026-04-02 20:21:07 +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 ee683c8cd1 feat(hugo): replace deprecated cascade._target for Hugo v0.156+ compatibility 2026-03-27 04:17:17 +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 2bb78df692 refactor(frontmatter): rename hide_date → show_date for consistent positive booleans
All other display toggles use positive naming (show_*, toc, share, etc.).
Flipping to show_date (default: true) aligns the API and reduces cognitive load.

BREAKING CHANGE
2026-03-26 23:17:42 +00:00
George Cushen 7bc44d0a31 ci: format 2026-03-03 00:31:09 +00:00
George Cushen 24dc36f6d7 feat(typography): extend typography system with Google Fonts and font packs 2026-03-03 00:30:27 +00:00
github-actions[bot] 4fcfe33cc0 chore(templates): update modules to latest commits 2026-02-19 15:29:19 +00:00
George Cushen 764756ab50 feat(hugo): add support for Hugo v0.153 breaking changes
migrate deprecated `includeFiles` to `files` glob slice (Hugo >= 0.153.0)

Replace `module.mounts.includeFiles` with the new `files` setting
introduced in Hugo v0.153.0. Update minimum Hugo version accordingly.

Affected files:
- modules/blox/hugo.yaml
- All template module.yaml configs (7 templates)

BREAKING CHANGE

See: https://gohugo.io/configuration/module/#files
2026-02-19 14:57:09 +00:00
George Cushen a3c21b401e fix: lint 2026-02-19 14:15:26 +00:00
George Cushen ab44db81d7 feat(blocks): add columns footer block 2026-02-18 22:09:10 +00:00
George Cushen ef8a34e33a feat: convert remaining Landing Page blocks from Go HTML to React 2026-02-18 19:21:54 +00:00