mirror of
https://github.com/agentskills/agentskills.git
synced 2026-06-18 15:54:06 +08:00
278196525d
Collapse the two-row `LogoCarousel` into a single row and compute its scroll duration from the total cycle width using a fixed `PX_PER_SECOND`, so scroll speed stays consistent regardless of how many logos appear or how they are scaled. Drop the now-unneeded vertical padding on `.logo-carousel-track`. Rename the "Adoption" heading to "Where can I use Agent Skills?" and rewrite its blurb to point readers at the Client Showcase page, matching the question-led style of the neighboring sections. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
50 lines
1.6 KiB
React
50 lines
1.6 KiB
React
{/*
|
|
LogoCarousel component for the Agent Skills documentation.
|
|
Shuffles clients on each page load for fair exposure.
|
|
*/}
|
|
export const LogoCarousel = ({clients}) => {
|
|
const [shuffled, setShuffled] = useState(clients);
|
|
|
|
/* Shuffle clients on component mount */
|
|
useEffect(() => {
|
|
const shuffle = (items) => {
|
|
const copy = [...items];
|
|
for (let i = copy.length - 1; i > 0; i--) {
|
|
const j = Math.floor(Math.random() * (i + 1));
|
|
[copy[i], copy[j]] = [copy[j], copy[i]];
|
|
}
|
|
return copy;
|
|
};
|
|
setShuffled(shuffle(clients));
|
|
}, []);
|
|
|
|
const doubled = [...shuffled, ...shuffled];
|
|
|
|
const GAP_PX = 48; // 3rem at the default 16px base
|
|
const PX_PER_SECOND = 40;
|
|
const cycleWidth = shuffled.reduce(
|
|
(sum, client) => sum + 150 * (client.scale || 1) + GAP_PX,
|
|
0,
|
|
);
|
|
const cycleDuration = cycleWidth / PX_PER_SECOND;
|
|
|
|
const Logo = ({ client }) => (
|
|
<a href={client.url} className="block no-underline border-none w-full h-full">
|
|
<img className="block dark:hidden object-contain w-full h-full !my-0" src={client.lightSrc} alt={client.name} noZoom />
|
|
<img className="hidden dark:block object-contain w-full h-full !my-0" src={client.darkSrc} alt={client.name} noZoom />
|
|
</a>
|
|
);
|
|
|
|
return (
|
|
<div className="logo-carousel">
|
|
<div className="logo-carousel-track" style={{ animation: `logo-scroll ${cycleDuration}s linear infinite` }}>
|
|
{doubled.map((client, i) => (
|
|
<div key={`${client.name}-${i}`} style={{ width: 150 * (client.scale || 1), maxWidth: "100%" }}>
|
|
<Logo client={client} />
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|