Skip to content

Strip landing page to essentials, move detail to sub-pages - #23

Open
drmowinckels wants to merge 11 commits into
mainfrom
minimal-landing-page
Open

drmowinckels wants to merge 11 commits into
mainfrom
minimal-landing-page

Conversation

@drmowinckels

Copy link
Copy Markdown
Contributor

Summary

Responds to the feedback from @markus and José Luis: people were not getting what CAPRO is, what it does, or how to use it. The landing page stacked all 12 sections, so "what do you do" competed with pricing, skills, fun facts and testimonials.

The landing page is now hero → How we can help → contact. Everything else moved to its own page, in the spirit of the 7T facility's landing → user-information split that Markus linked.

Before After
/ 12 sections, ~8 screens 3 sections, ~3 screens
nav 6 #anchor jumps on one page 6 real pages + #contact
sitemap 45 URLs (18 of them empty) 27 real URLs

New pages, all reusing the existing section partials:

  • /services — full service detail + feature + CTA
  • /about — about + skills + funfacts + CTA
  • /team — team + CTA
  • /portfolio — works + testimonials
  • /pricing — cost estimates + CTA
  • /news — unchanged

Copy changes (en + no)

  • Hero: "Unlock Your Research Potential" → "We build the data workflows behind your research", plus a sentence saying who CAPRO is and who it's for. Two buttons: What we can do / Get in touch.
  • About: "We're Creative" / "We're Professional" → "A team inside the university" / "Engineers who have done research" / "You own what we build".
  • Services: each gained a short: one-liner — that's what the six landing-page cards show.
  • Contact: the hardcoded English "Get in touch" paragraph moved into the language files, so the Norwegian page is no longer half-English.

Copy is a first pass and the point of the preview — wording is yours to redline.

Structural fixes

  • content/service → content/services. I first used a front-matter url:, but that is not language-prefixed and the Norwegian page silently collided with the English one at the same path. Renaming the section is the correct fix.
  • feature, skill, funfacts, cta, testimonial each built an empty page at their own URL. Now build.render: false — content still feeds the partials, 18 junk URLs leave the sitemap.
  • Pricing's "Book a time" button pointed at #book, which exists nowhere in the site. Now resolves to the contact section, per language.
  • Extracted helpers/section-title.html, helpers/section-intro.html, helpers/link.html — these blocks were duplicated across 8 partials.
  • Removed dead code: sections/news.html, the empty sections/map.html, .btn-hero and .contact-icon CSS, the now-unused viewAllPost string.

Test plan

CI builds the site and deploys the preview, so that's covered. What CI does not check:

  • Wording, English and Norwegian — especially the hero and the six service one-liners.
  • Nav ordering — 7 items now; say if that's too many and I'll fold /about in elsewhere.
  • Whether dropping testimonials and fun facts off the landing page is the right call.
  • Norwegian /no/ pages — I wrote that copy, a native read would be good.

Two things I deliberately did not do:

  1. No email or social links exist anywhere in the config, so contact is still only the booking link, address and map. If you want an email on the landing page it's a one-line addition.
  2. CI pins Hugo 0.145.0 (.hugo_version) while I built locally on 0.167. The build: front-matter key replaced _build in exactly 0.145.0, so it should be fine, but the preview build is the real check.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

✅ Preview deployed at https://23--capro-uio.netlify.app
Please check it looks ok before merging.

@drmowinckels

Copy link
Copy Markdown
Contributor Author

Correction on the Hugo version note

The PR description says the 0.145.0 (CI) vs 0.167.0 (local) gap "should be fine" and that the preview build would confirm it. The build passing did not confirm it — it produced different, wrong output, and I only caught it by checking the deployed URLs rather than the build status.

What broke: the /service/ → /services/ redirect was set on both language files. Hugo 0.167 language-prefixes aliases on non-default languages; 0.145.0 does not. So on CI the Norwegian entry claimed the root /service/ and overwrote the English one — /service/ redirected to /no/services/, and /no/service/ was never built at all.

Fix (95cf942): the alias now lives only on the default-language file, which both versions resolve to /service/ identically.

This is the second time the same class of issue has bitten in this PR — the first was front-matter url: not being language-prefixed, which silently collided the two /services/ pages. Worth considering a follow-up to bump .hugo_version so local and CI agree; I have deliberately not done that here, since it would need the whole site re-verified on the new version and that is a separate change from this one.

Takeaway for reviewing this PR: a green check means the build did not error, not that the output is right. The deployed URLs are worth spot-checking.

@github-actions

Copy link
Copy Markdown

✅ Accessibility: no issues

axe-core over 19 routes × 2 viewports (one page per layout), plus 69 manual checks.

All 69 manual checks passed.

Automated tooling catches roughly a third of accessibility problems. A clean run is a floor, not a ceiling.

drmowinckels and others added 11 commits October 16, 2026 21:55
The landing page stacked all 12 sections, so visitors could not quickly
see what CAPRO does or how to get in touch. It is now hero, "How we can
help", and contact; everything else moved to its own page.

New section pages reusing the existing partials:
  /services  service detail + feature + CTA
  /about     about + skills + funfacts + CTA
  /team      team + CTA
  /portfolio works + testimonials
  /pricing   cost estimates + CTA
  /news      unchanged list

Nav links are now real pages instead of #anchors, so each page is
linkable and the active state works.

Copy (en + no):
- Hero says what CAPRO is and who it is for, with two buttons.
- About replaces "We're Creative"/"We're Professional" with concrete
  statements.
- Services gained a short: one-liner, which is what the six landing
  cards show.
- Contact's hardcoded English paragraph moved into the language files,
  and the booking URL is now an explicit booking: param rather than
  being scraped out of prose.

Structure:
- content/service -> content/services. Front-matter url: is not
  language-prefixed, so the Norwegian page collided with the English
  one at /services/; renaming the section fixes it properly.
- feature, skill, funfacts, cta and testimonial each built an empty
  page at their own URL. They are now build.render: false, which drops
  18 junk URLs from the sitemap while still feeding the partials.
- Extracted helpers/section-title.html, helpers/section-intro.html and
  helpers/link.html, replacing blocks duplicated across 8 partials.
- Pricing's "Book a time" pointed at #book, which exists nowhere; it
  now resolves to the contact section per language.
- Removed dead partials (news, empty map), dead CSS (btn-hero,
  contact-icon) and the now-unused viewAllPost string.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The section rename left /service/ returning 404. It was a thin,
childless list page, but it was indexable, so send it to the new
URL instead of breaking any existing link.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Drops the "Happy Clients / Projects completed / Cups of Coffee"
section and everything only it used: the funfacts partial and content,
counter.js, the .counter-card styles and the background image.

counter.js was concatenated into the site-wide JS bundle, so this also
takes it off every page.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The alias was set on both language files. CI pins Hugo 0.145.0, which
does not language-prefix aliases on non-default languages, so the
Norwegian entry claimed the root /service/ and overwrote the English
one: /service/ redirected to /no/services/ and /no/service/ was never
built. Local Hugo 0.167 prefixes it and hid the problem.

Keep the alias only on the default language, which both versions agree
resolves to /service/.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Seven top-level items made the nav a list to read rather than scan.
They are now grouped by the question a visitor is asking:

  What we do  ->  Services, Our work, Prices
  Who we are  ->  The team, About CAPRO, News
  Contact     ->  stays top level; it is the action, not a category

Three top-level items instead of seven.

Dropdowns open on click, not hover: hover menus are awkward on touch
and unpredictable on the way to a neighbouring item. Escape closes and
returns focus to the button, clicking outside closes, tabbing out
closes, and aria-expanded tracks state. A parent shows as active when
one of its children is the current page.

On mobile the groups render already open as labelled sections. Making
someone tap to reveal three links is cost without benefit at this size.

Renames for the grouped labels: Portfolio -> Our work, About us ->
About CAPRO, Team -> The team. "Portfolio" reads as a design-studio
word; "our work" is what it actually is.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Three changes that turned out to be one:

Team is back on the landing page as a compact strip — faces, names and
one role each, linking to the full profiles. Not the full bio cards:
the testimonials name individuals, so the people are a reason to get
in touch, but they should not cost three screens to say so. The
landing page is now hero, how we can help, the team, contact.

/about/ is gone. Its three statements ("A team inside the university",
"Engineers who have done research", "You own what we build") are real
trust content, so rather than delete them with the page they moved to
/team/, which now genuinely is the who-we-are page. The about section
is data-only (build.render false), the same pattern the other detail
sections use. /about/ was a live URL, so it aliases to /team/ — on the
default language only, since Hugo 0.145 does not language-prefix
aliases and the Norwegian entry would claim the root path.

Nav drops to three: What we do (Services, Our work, Prices), News,
Contact. With the team on the landing page the "Who we are" group had
nothing left but News, and a one-item dropdown is not a menu.

Booking is replaced by email. The reclaim.ai link is not in use; the
address is capro-contact@psykologi.uio.no and it is now the one
action in the contact section. The address itself is the link text
rather than a "book a consultation" button — people want to read and
copy an address, not fire a mail client they may not use.

Footer gains links to team, services, news and contact, so /team/ is
reachable from every page now that it is not in the nav.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The first version invented a circular-portrait component, so the site
said "team" two different ways: bordered square cards on /team/ and
circles on the landing page. The height concern was real but it argued
for showing less, not for looking different.

Now a .team-card--compact variant of the same component: same border,
same square grayscale photo, same hover, bio dropped and meta tightened.
Removes the bespoke people.css entirely.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
axe-core 4.14 (WCAG 2.0/2.1/2.2 A+AA plus best-practice) over 14 routes
in both languages, at desktop and mobile, including the open nav
dropdown and open mobile menu. 91 violations across 5 types, now zero.

Contrast (WCAG 1.4.3, serious)
  --color-primary as a text colour is 3.10:1 on dark and 2.68:1 on
  grey, below AA. Every text use now takes --color-primary-text
  (5.29 / 4.58); background and border uses are unchanged. --color-light
  is 4.09:1 on grey, so small text using it moves to --color-muted.
  Chroma's monokai comment colour is 3.03:1 on its own background;
  github-dark clears it at 6.15:1.

Links in prose (WCAG 1.4.1, serious)
  Body-copy links were distinguished by colour alone at 1.36:1 against
  surrounding text. Now underlined.

Headings
  List pages had no h1 at all; the first section title on a page is now
  promoted to h1, and item headings inside it move to h2 so levels never
  skip. Team profiles made the generic "About Member" label the only
  heading and the person's name an h3 — the name is now the h1 and the
  label is no longer a heading. One news post started at h3.

Landmarks and bypass
  The banner sat outside <main>. Added a skip link, which was missing
  entirely (WCAG 2.4.1).

Robustness
  .reveal starts at opacity 0 and is shown by scroll-reveal.js, so
  content was gated on JavaScript and on the observer firing. It is now
  visible immediately under prefers-reduced-motion, with a <noscript>
  fallback.

Verified separately: skip link is the first tab stop and visible on
focus, no keyboard trap, focus indicators on all interactive elements,
reduced-motion honoured, no horizontal scroll at 320px or 200% zoom,
alt text and lang on every page.

Note: section-title writes its two heading levels out in full because
Go's html/template cannot compute an output context for a dynamic
element name and silently renders nothing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The generated file conflicted during the rebase; its sources merged
cleanly, so this is just the rebuilt output.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two false failures surfaced when the gate first ran against the
grouped nav, and a check that cries wolf is one people learn to ignore.

It probed the first match of each selector, which for `header nav a` is
a link inside a closed dropdown: display:none computes to
outline-style:none. It now probes the first visible match, and checks
the dropdown's own links separately with the panel open.

Opening that panel with a click then reported the links as having no
focus ring, because :focus-visible stops matching once the input
modality is pointer. It opens the panel with the keyboard instead,
which is the case that actually matters.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Three files carried formatting from before Prettier landed on main.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant