Repository navigation
Redesign: home page - #40
Conversation
Implements #31, part of #35. - The intro: the shared Intro block with the home's text (HOME_INTRO), the "About me" button and the profiles, beside the topic map. - Projects: a tile per project from src/data/projects.ts, newest first. - Writing: the articles only, newest first, with their date, project and reading time; the section is #writing, where "All writing" goes. The activity logs keep their pages but leave the home. - Picking a dot on the map shows only the articles about its topic. An article's topics come from a `topics` frontmatter field, or else from src/data/topics.ts, which holds the prototype's reading of the 18 articles. The script also works when a ClientRouter swaps pages. - The page has its own title and meta description. - The temporary /map-preview/ page (#30) is gone, with its sitemap filter. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MdjUerTCBDeF5DG9puDd2
- Clear the map's pick when the ClientRouter leaves the home, so a map kept for the next page arrives without it. - Guard the Show all listener against clicks on non-elements, and pass the Writing list to show() instead of looking it up twice. - Take the unfiltered count text from the page, built with share.ts's plural(), rather than repeating it in the script. - Warn only about articles that have no topics at all, not about an explicit `topics: []`, and fail the build if topic-map.json's topics stop matching TOPICS. - Use readingMinutes() and the projects' own order directly. - Describe the home and its topics in AGENTS.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MdjUerTCBDeF5DG9puDd2
- Rewrite the Writing count only when it changes: it is a live region, so resetting it on arrival made screen readers read it again. - After "Show all", move the keyboard's place to the Writing heading rather than to the live region, which it would read twice. - Mark the pick on the map that was clicked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MdjUerTCBDeF5DG9puDd2
- After "Show all", always move to the Writing heading: Safari doesn't focus a clicked button, and the screen reader's place went with the button. - Hide the "—" of rows without a project from screen readers. - Underline only a project's name on hover, not the space and arrow. - Warn when src/data/topics.ts names an article that doesn't exist, as projects.ts does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MdjUerTCBDeF5DG9puDd2
At 30% or more, every article has at least one topic, so an empty list is a mistake like a missing one. Say in the script what a page restored from the back-forward cache does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013MdjUerTCBDeF5DG9puDd2
|
Preview: https://pr-40-meaningfool.josselin-perrus.workers.dev Built from cd5b9e8 with the latest content. The link stays the same and shows the latest push. Search engines are asked not to index it. |
|
Review checkpoint: accepted at Setup: Node 24.22.1, Bun 1.4.4, content at meaningfool-writing Build and tests
Against #31 and the prototype (Playwright, Chromium, the prototype with its shaders from jsDelivr)
Scope (base build against head build)
ClientRouter
Left to the owner, as the PR lists: the hover styles that aren't in the prototype, the 24px gutter, and activity logs staying in the sitemap and RSS. Generated by Claude Code |
Implements #31 (part of #35). It builds on #36 (foundations), #37 (share images), #39 (article page) and #38 (background and topic map).
What changes
src/pages/index.astro) follows the prototype's home view (docs/redesign/prototype/template.html). Its<main>drops thelegacyclass.Intro, with the label "Josselin Perrus · Product manager · Paris", the title "I build products / with AI agents." with the full stop in the accent colour, andHOME_INTROfromsrc/lib/share.tsas the text. The button "About me →" goes to/about/, followed by LinkedIn, GitHub and X. There's no RSS link. The map is beside the text, and goes under it below 1120px.src/data/projects.ts, newest first. Each has its screenshot on the grey panel, "App · May 2026", the name with ↗, and its one line. The whole tile links to the project. The heading has the prototype's "Things I built to learn" on its right.id="writing", where "← All writing" goes): the articles only, newest first. Each row shows the date, title, project and reading time; on phones, the title and reading time. The reading time isreadingMinutes(), the same as on the article page and its share image. The first row's top line lies on the heading's line. On the right of the heading it says "18 articles", or "Product · 10 of 18 · Show all" when a topic is picked.data-picked. Clicking it again, or "Show all", shows all of them.astro:page-load, resets the list and clearsdata-picked;astro:before-swap) clears the pick, so a map kept withtransition:persistarrives without it;topicmap:pick, so a dot that is a link never navigates there.src/data/topics.ts,src/content.config.ts):topicsfield, an array ofcustomer-success,productandai-agents. Any other value fails the build and names the article.src/data/topics.tsgives the 18 articles the topics from the prototype's weights inmaps.js: 2 in Customer success, 10 in Product, 12 in AI agents, the prototype's counts.topicsto the 18 articles' frontmatter and documents it in itsAGENTS.md. The site builds that repository'smain, so the data file keeps the home working until it's merged.topics.tsthat matches no article.src/data/topic-map.json, and the names come from that file./map-preview/page and its sitemap filter (TEMPORARY in Redesign: page background and topic map, prepared at build time #30), andArticlesList.astro, which only the old home used.src/data/profiles.tsholds LinkedIn, GitHub and X for the intro and theFooter; the footer's HTML is unchanged.plural()is exported fromsrc/lib/share.ts.AGENTS.mddescribes the home and its topics.Layout,Intro,TopicMap,Background,Frameandlegacy.css.legacy.cssgoes once Redesign: About page #33 is merged too.Choices to check
#aboutand#articlesare gone. Nothing on the site links to them.For #33
transition:persist, its dots still filter Writing there, but TopicMap setsaria-pressedonly on button dots.legacy.css's header comment still lists the home. I left the file alone, to avoid a conflict, since it is deleted after both are merged.Validation
Head commit
cd5b9e80d2eeb09bbccf024a16d3cc206ee6c676, on base78b78fdcbeda08341f25c4c84560d04d8aa5d36f(origin/redesign). Node 24.22.1, Bun 1.4.4. Content submodule atbf783ba, meaningfool-writing'smain(git submodule update --init --remote; the pointer isn't changed).bun install, thenbun run buildfrom an emptydist/: passes, 62 pages. The base has 63, including/map-preview/. No warnings.bun run test:documents: 10 tests, 10 passed.astro check(@astrojs/check0.9.4 and TypeScript 5.9.3, in a scratch copy): 0 errors, 0 warnings, 0 hints.tsc --noEmit: no errors.dist/is byte-identical to the build that uses the data file.topicschanged that article's row on the home.topics: ["marketing"]failed the build:topics.0: Invalid option: expected one of "customer-success"|"product"|"ai-agents".<ClientRouter />added toLayout, then removed it; it isn't committed. One full page load covered this whole run:index.htmland_redirectschange;_redirectsloses/map-preview.map-preview/index.htmland its script are removed.rss.xml, the sitemap,_headers,robots.txt, the share images and the favicons are byte-identical.llms*.txtdiffer only in their build timestamp.Review gate
There were 5 passes over the whole change: four independent code reviews, then a final read-through with every check above run again on the head commit. These were fixed:
—being read out;topic-map.json.The final read-through found nothing more at P1 or P2.
🤖 Generated with Claude Code
https://claude.ai/code/session_013MdjUerTCBDeF5DG9puDd2