feat: rebuild the landing page around the product

The home page led with a text hero, a boxed stats strip, a numbered
how-it-works list, a trust card and three Bootstrap featurettes with
postage-stamp screenshots. It now shows the product first and stays
flat:

- Hero: copy on the left, the anonymize form in a browser frame on the
  right, one primary CTA plus a link to a real anonymized repository,
  and three reassurance points (free, read-only, expires).
- Proof and live stats collapse into hairline strips with no cards;
  the stat bars keep their daily-delta charts and the "+N today" line.
- Before/after example gets a section head and shows the actual XXXX-n
  masks, each labelled for screen readers.
- "What you get" is one large screenshot with three vertical tabs
  (Anonymize, Review, Manage) instead of three columns. Tabs are real
  buttons with tablist/tab/tabpanel roles, roving tabindex and arrow-key
  navigation; the description and link sit outside the button. Signed-out
  visitors are sent to sign in rather than to a dashboard that redirects.
- FAQ teaser with the three questions that come up most, linking into
  the FAQ anchors.
- Phone layout: tabs become a strip above the screenshot with the
  selected description below it, stats go two-up, panes stack, the CTA
  fills the width, and horizontal overflow is clipped so the hero bleed
  can never cause sideways scrolling.

Removes the dead how-it-works, trust, featurette and metrics styles and
the legacy mobile hero font overrides that fought the new sizes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
tdurieux
2026-09-09 12:21:02 +02:00
co-authored by Claude Fable 5.1
parent b9189953d3
commit 88d8225f00
7 changed files with 887 additions and 561 deletions
+83 -1
View File
@@ -1386,7 +1386,9 @@ angular
"$scope",
"$http",
"$location",
function ($scope, $http, $location) {
"$window",
"$timeout",
function ($scope, $http, $location, $window, $timeout) {
if ($scope.user && !$scope.user.status) {
$location.url("/dashboard");
}
@@ -1396,6 +1398,86 @@ angular
}
});
// "What you get": one screenshot, three tabs. The selected key drives
// both the expanded description and the visible panel.
$scope.features = [
{
key: "anonymize",
num: "01",
eyebrow: "Anonymize",
title: "Double-anonymous,",
accent: "your rules.",
text:
"Choose what reviewers may see: links, images, PDFs, notebooks, GitHub Pages. Add your own terms, with regex if you need it, and pick the expiration date.",
cta: "Start an anonymization",
href: "/anonymize",
url: "anonymous.4open.science/anonymize",
img: "/imgs/anonymize.png",
alt: "The anonymize form: source repository, terms to redact, options and a live README preview",
},
{
key: "review",
num: "02",
eyebrow: "Review",
title: "Reviewers browse",
accent: "the real thing.",
text:
"Highlighted source code, rendered PDFs, images, and notebooks, in a familiar file explorer. GitHub Pages is also supported.",
cta: "Open the example",
href: "https://anonymous.4open.science/r/840c8c57-3c32-451e-bf12-0e20be300389/",
target: "_self",
url: "anonymous.4open.science/r/840c8c57-…",
img: "/imgs/explorer.png",
alt: "The repository explorer with a file tree and a rendered README",
},
{
key: "manage",
num: "03",
eyebrow: "Manage",
title: "One dashboard,",
accent: "until the decision.",
text:
"Monitor views, edit configuration, remove or update your repository. Program chairs can group submissions under a conference with one shared expiry.",
cta: "Open the dashboard",
href: "/dashboard",
needsUser: true,
url: "anonymous.4open.science/dashboard",
img: "/imgs/dashboard.png",
alt: "The dashboard listing anonymized repositories with status, views and expiry",
},
];
$scope.feature = $scope.features[0].key;
$scope.selectFeature = function (key) {
$scope.feature = key;
};
// Signed-out visitors cannot open the dashboard; send them to sign in.
$scope.featureHref = function (f) {
return f.needsUser && !$scope.user ? "/github/login" : f.href;
};
$scope.featureTarget = function (f) {
return f.needsUser && !$scope.user ? "_self" : f.target || undefined;
};
$scope.featureKeydown = function ($event, index) {
const step = {
ArrowDown: 1,
ArrowRight: 1,
ArrowUp: -1,
ArrowLeft: -1,
Home: "first",
End: "last",
}[$event.key];
if (step === undefined) return;
$event.preventDefault();
const n = $scope.features.length;
const next =
step === "first" ? 0 : step === "last" ? n - 1 : (index + step + n) % n;
$scope.feature = $scope.features[next].key;
$timeout(() => {
const el = $window.document.getElementById("feature-tab-" + $scope.feature);
if (el) el.focus();
});
};
$scope.cards = [
{ key: "repositories", total: 0, label: "repositories anonymized" },
{ key: "users", total: 0, label: "researchers" },
+1 -1
View File
File diff suppressed because one or more lines are too long