Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 2026-01-27

- Home page: keep testimonial links clickable while skipping keyboard focus (#18, thanks @wilfriedladenhauf).

## 2026-01-16

- `install.sh`: warn when the user’s original shell `PATH` likely won’t find the installed `clawdbot` binary (common Node/npm global bin issues); link to docs.
Expand Down
42 changes: 40 additions & 2 deletions src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,14 @@ const duration2 = (row2.length / 2 * pixelsPerItem) / pixelsPerSecond;
<h2 class="section-title">
<span class="claw-accent">⟩</span> What People Say
</h2>
<a href="/shoutouts" class="section-link">View all β†’</a>
<a href="/shoutouts" class="section-link">View all <span class="sr-only">community shoutouts</span>
<span aria-hidden="true">β†’</span>
</a>
</div>
<div class="testimonials-track">
<div class="testimonials-row row-1" style={`--duration: ${duration1}s`}>
{row1.map((t) => (
<a href={t.url} target="_blank" rel="noopener" class="testimonial-card">
<a href={t.url} target="_blank" rel="noopener" class="testimonial-card" tabindex="-1">
<img
src={`https://unavatar.io/x/${t.author}`}
alt={t.author}
Expand Down Expand Up @@ -1765,6 +1767,10 @@ const duration2 = (row2.length / 2 * pixelsPerItem) / pixelsPerSecond;
);
}

.testimonials-track:focus-within .testimonials-row {
animation-play-state: paused;
}

.testimonials-row {
display: flex;
gap: 16px;
Expand Down Expand Up @@ -1958,4 +1964,36 @@ const duration2 = (row2.length / 2 * pixelsPerItem) / pixelsPerSecond;
font-size: 0.9rem;
}
}

/* Accessibility Utilities */

/* Hides content visually but keeps it available for screen readers */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}

/* Global Focus State: Replaces the default browser ring with your theme colors */
:focus-visible {
outline: 3px solid var(--cyan-bright);
outline-offset: 4px;
border-radius: 4px;
}

/* Respect user's system settings for reduced motion */
@media (prefers-reduced-motion: reduce) {
*, ::before, ::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
</style>