Issue 04
Systems in the wild
How tokens stay honest when the product ships every week.
Cards bundle one idea: a title, proof, and optional action. Swipers (horizontal snap rows) are for peer content where each slide is whole — issues, episodes, comparable tiers — not for stacking unrelated widgets.
.sermona-card) Default: elevated surface, hairline border, card shadow, generous padding.
| Modifier | Use |
|---|---|
.sermona-card--flat | Quiet cards on already-elevated bands; removes shadow. |
.sermona-card--dense | Tighter padding in dense dashboards or nested layouts. |
.sermona-card--stack | Flex column + gap; pair with .sermona-card__footer and margin-top: auto on the footer for pinned footers (e.g. CTA at bottom). |
.sermona-card--interactive | Hover lift + border brightening; use on <a> for whole-card links — add focus-visible outline (included for a.sermona-card). |
| Pattern | When |
|---|---|
.sermona-card-grid | Two or more cards that can wrap; same hierarchy; no strong “peek” of the next item. |
.sermona-swiper | Ordered deck (carousel of equals), mobile-first exploration, or full-bleed editorial rails where the next card should peek. |
.sermona-service-grid | Pricing / tier columns (already paired with .sermona-service-card). |
Avoid swipers for tabular or long-form content — use Data & tables or prose.
Issue 04
Systems in the wild
How tokens stay honest when the product ships every week.
Workshop
Audit to library
A repeatable pass from Figma audit to published CSS.
Interactive
Whole-card affordance for drill-down (not nested links — one destination).
Structure:
.sermona-swiper — optional .sermona-swiper--bleed (full viewport width inside a centered layout), .sermona-swiper--fade (right-edge gradient hint), .sermona-swiper--peek (narrower slides so the next card shows), .sermona-swiper--wide (wider default slide width)..sermona-swiper__label — kicker-style row title..sermona-swiper__track — tabindex="0" when it should be keyboard-scrollable; label with aria-label or aria-labelledby..sermona-swiper__slide — one logical unit per slide (card, tile, or quote block).On non–page backgrounds, set the fade to match the band, e.g. style="--sermona-swiper-fade-bg: var(--sermona-color-bg-elevated)" on .sermona-swiper.
Contained track (no bleed): three service-style slides with snap.
Use .sermona-swiper--bleed when the section lives inside .sermona-layout (or any centered measure) but the scroll rail should run edge to edge. Keep tabindex + role="region" + visible or screen-reader title.
<a class="sermona-service-card"> is supported: no underline, focus-visible ring, inherited text color. Don’t nest interactive elements that steal the same gesture (no button inside a card-link without tabindex="-1" / careful a11y).
prefers-reduced-motion; only smooth scrolling is limited to users who allow motion.