diff --git a/.gitignore b/.gitignore index 86fad08..91b4808 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,6 @@ scripts/**/data/ # PyTorch checkpoints of the VLA article: regenerable (scripts/train-vla/pipeline.sh), 2 MB each /scripts/train-vla/runs/ + +# Another session's checkout, made by `git worktree` and never ours to commit. +.claude/worktrees/ diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx index 9c55bf0..efb1ec7 100644 --- a/app/[locale]/layout.tsx +++ b/app/[locale]/layout.tsx @@ -25,11 +25,11 @@ export function generateStaticParams() { // never our own 404. Unknown values are rendered on demand instead and end in notFound() in the page: for a // locale, a slug or a tag alike. Known pages are still prerendered (generateStaticParams). +// One colour, not a prefers-color-scheme pair: the theme is a class next-themes puts on and the default is +// dark whatever the OS says, so this is the right answer for the first paint. ThemeColor in components/theme-provider +// keeps it on whatever the reader actually chose after that. export const viewport: Viewport = { - themeColor: [ - { media: "(prefers-color-scheme: dark)", color: "#070918" }, - { media: "(prefers-color-scheme: light)", color: "#fbfbfe" }, - ], + themeColor: "#070918", }; /** @@ -67,7 +67,8 @@ export default async function LocaleLayout({ children, params }: LayoutProps<"/[ return ( - + {/* No disableTransitionOnChange: the colours are meant to fade, and components/theme-provider scopes that to the moment of the change. */} + getAllPosts(locale).slice(0, 5).map((p) => ({ slug: p.slug, no: p.no, title: p.title })); // not-found is given no params. The body reads the language from the URL instead (see NotFoundBody). export default function NotFound() { - return ; + return ( + + ); } diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 9f60233..cd85ebf 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -73,11 +73,13 @@ export default async function HomePage({ params }: PageProps<"/[locale]">) { {t.hero.ctaSecondary} - {/* Three numbers lettered like an instrument's readouts; counted from the posts, not typed in. */} -
+ {/* Three numbers lettered like an instrument's readouts; counted from the posts, not typed in. The English + labels are long enough to wrap, so they get even columns and a balanced break rather than one word + stranded on a line of its own. */} +
{readouts.map((r, i) => ( -
-
{r.label}
+
+
{r.label}
@@ -129,8 +131,13 @@ export default async function HomePage({ params }: PageProps<"/[locale]">) {

- {/* The stage is dark in both themes, like the article's own: yellow points vanish on white. */} -
+ {/* + A LIVE preview keeps a dark stage in both themes, like the article it comes from — article 007's + yellow points vanish on white. A drawn cover is made of theme tokens and belongs on the page's own + panel: forcing the dark stage under it put a black rectangle in the middle of the light theme for + every article that has no live preview, which is most of them. + */} +
{hasPreview(latest.slug) ? : } diff --git a/app/[locale]/posts/[slug]/page.tsx b/app/[locale]/posts/[slug]/page.tsx index 01393b2..d9f8578 100644 --- a/app/[locale]/posts/[slug]/page.tsx +++ b/app/[locale]/posts/[slug]/page.tsx @@ -89,16 +89,16 @@ export default async function PostPage({ params }: PageProps<"/[locale]/posts/[s