diff --git a/AGENTS.md b/AGENTS.md index a4de7bac5..1917d6c42 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -84,8 +84,12 @@ trust the theme, so a commit message is part of the product. - **Never narrate the process.** No first-person account of what was tried, what was missed, or what was learned. "The gate is scoped to the demo deployment" belongs here; "I only tested two states" does not. -- **No tool or session trailers.** No `Co-Authored-By` for an assistant, and no - links to an AI session. Some tooling adds these by default — remove them. +- **Assistant trailers stay.** A commit written with an assistant ends with a + `Co-Authored-By` line naming it and a `Claude-Session` link to the session + that produced it. The tooling adds both and they are kept, so the authorship + recorded on a commit matches who wrote it. This file asked for them to be + stripped until 2026-09-05, while 218 commits on `main` carried them; the rule + now says what the history does. - **Present tense, describing the code after the change.** "Scope demo content to the demo deployment", not "Fixed the demo leaking". - **The subject names the change; it does not argue for it.** "Rewrite the diff --git a/src/assets/projects/astro-rocket-hero-blue.jpg b/src/assets/projects/astro-rocket-hero-blue.jpg new file mode 100644 index 000000000..de7bc03a5 Binary files /dev/null and b/src/assets/projects/astro-rocket-hero-blue.jpg differ diff --git a/src/assets/projects/astro-rocket-hero-purple.jpg b/src/assets/projects/astro-rocket-hero-purple.jpg new file mode 100644 index 000000000..c9e5b2b4d Binary files /dev/null and b/src/assets/projects/astro-rocket-hero-purple.jpg differ diff --git a/src/assets/projects/astro-rocket-hero-teal.jpg b/src/assets/projects/astro-rocket-hero-teal.jpg new file mode 100644 index 000000000..0dd05184e Binary files /dev/null and b/src/assets/projects/astro-rocket-hero-teal.jpg differ diff --git a/src/assets/projects/ecommerce-store-catalog.svg b/src/assets/projects/ecommerce-store-catalog.svg deleted file mode 100644 index a2c776b0a..000000000 --- a/src/assets/projects/ecommerce-store-catalog.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/projects/ecommerce-store-checkout.svg b/src/assets/projects/ecommerce-store-checkout.svg deleted file mode 100644 index 24fe74c05..000000000 --- a/src/assets/projects/ecommerce-store-checkout.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/projects/ecommerce-store-product.svg b/src/assets/projects/ecommerce-store-product.svg deleted file mode 100644 index d6e5c5599..000000000 --- a/src/assets/projects/ecommerce-store-product.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/projects/hans-martens-dev-astro-rocket.jpg b/src/assets/projects/hans-martens-dev-astro-rocket.jpg deleted file mode 100644 index a0ed143b4..000000000 Binary files a/src/assets/projects/hans-martens-dev-astro-rocket.jpg and /dev/null differ diff --git a/src/components/projects/ProjectCarousel.astro b/src/components/projects/ProjectCarousel.astro index 9c3929316..190286d96 100644 --- a/src/components/projects/ProjectCarousel.astro +++ b/src/components/projects/ProjectCarousel.astro @@ -111,8 +111,13 @@ const posters = await Promise.all(
+ {/* The dot a visitor sees is 8px, which is far below the 24px minimum + a touch target needs. The button carries the 24x24 target and the + span carries the appearance, so the control is thumb-sized without + drawing a thumb-sized dot. The row has no gap: the targets meet + edge to edge rather than overlapping. */}
( + > + + ))}
-
+ {/* As in ProjectCarousel: the button carries a 24x24 touch target and the + span carries the 6px dot, so the control is thumb-sized without the + dot growing. The active state is an attribute rather than a rewritten + class list, so the target sizing cannot be overwritten at runtime. */} +
{images.map((_, i) => ( ))}
@@ -206,11 +214,9 @@ const slideData = images.map((item, i) => nextBtn.disabled = index === total - 1; pauseInactiveVideos(index); dots.forEach((dot, i) => { - if (i === index) { - dot.className = 'h-1.5 rounded-full transition-all duration-300 w-5 bg-brand-500'; - } else { - dot.className = 'h-1.5 rounded-full transition-all duration-300 w-1.5 bg-border'; - } + const active = i === index; + dot.setAttribute('data-active', active ? 'true' : 'false'); + dot.setAttribute('aria-selected', active ? 'true' : 'false'); }); } diff --git a/src/content/blog/en/project-gallery-video-slides.mdx b/src/content/blog/en/project-gallery-video-slides.mdx index 1cd47ded8..4da54c8bc 100644 --- a/src/content/blog/en/project-gallery-video-slides.mdx +++ b/src/content/blog/en/project-gallery-video-slides.mdx @@ -89,4 +89,4 @@ ffmpeg -i recording.mov -vf "scale=1280:720" -c:v libx264 -crf 28 \ For reference: the slide union is validated in `src/content.config.ts` (a slide is *either* `src`+`alt` *or* `video`+`poster`+`alt` — anything else fails the build), the shared `GallerySlide` type lives in `src/lib/gallery.ts`, and the rendering happens in `ProjectCarousel.astro` (hero) and `ProjectGallery.astro` (body + lightbox). No new dependencies, no client framework — the same native scroll-snap carousel, with a `