Services Grid
A three-column grid of services, each an icon, a title and a line of copy.
6 个框架初级
Image-and-copy rows that alternate sides down the page.
<!--
The zigzag is decoration, not meaning: the source order is always copy then
image, and only CSS moves the picture to the other side. Reversing the DOM to
get the visual would hand a keyboard and a screen reader a different reading
order than the one on screen - the classic failure of this layout.
-->
<section class="svc-alt" aria-labelledby="svc-alt-title">
<h2 class="svc-alt__title" id="svc-alt-title">How we work with you</h2>
<div class="svc-alt__row">
<div class="svc-alt__copy">
<p class="svc-alt__kicker">Discovery</p>
<h3 class="svc-alt__row-title">Understand before we build</h3>
<p class="svc-alt__text">
Two weeks of interviews, analytics and a hard look at what you already own.
</p>
<a class="svc-alt__link" href="/services/discovery">Explore discovery</a>
</div>
<div class="svc-alt__media">
<img src="/promo/all-access.svg" alt="" width="560" height="420" />
</div>
</div>
<div class="svc-alt__row svc-alt__row--reverse">
<div class="svc-alt__copy">
<p class="svc-alt__kicker">Delivery</p>
<h3 class="svc-alt__row-title">Ship in fortnightly slices</h3>
<p class="svc-alt__text">
Every increment is deployable, typed and behind a flag you control.
</p>
<a class="svc-alt__link" href="/services/delivery">Explore delivery</a>
</div>
<div class="svc-alt__media">
<img src="/promo/all-access.svg" alt="" width="560" height="420" />
</div>
</div>
</section>| Prop | 类型 | 默认值 | 说明 |
|---|---|---|---|
kicker | string | - | 显示在标题上方的小标签。 |
title必填 | string | - | 卡片的标题文本。 |
rows必填 | ServiceRow[] | - | 图文交替排列的行,按顺序显示。 |
className | string | - | 合并到根元素上的额外类名。 |
The zigzag is decoration, and the code treats it that way: the copy is always first in the DOM and only `md:order-first` moves the picture on odd rows. Reversing the markup to get the visual is the classic failure of this layout - it hands a keyboard and a screen reader a reading order that no longer matches the screen. Below `md` the grid is one column and the rule is inert, so the mobile stack is always copy-then-image. Swap `<img>` for `next/image` as the Next.js variant does, and keep the `sizes` hint in step with the column split or mobile downloads the desktop asset.