Sakani

Blog Listing

Cards for an article index: the standard tile and the larger featured variant.

Cover
Engineering11 mins read

Why your design system drifts

Two artefacts maintained by hand will always diverge. Generating one from the other is the only fix that holds.

Amara Chen · Aug 12, 2026

Dates and read times are strings

Neither card parses a Date or counts words. Format both upstream, where you know the reader's locale and how you want to round — "11 mins read" vs "~10 min" is an editorial choice, not something a card should decide.

Horizontal layout

Engineering6 mins read

Shipping dark mode from day one

Retrofitting a second theme is expensive. Building both from the same semantic layer costs almost nothing.

Daniel Osei · Sep 2, 2026

Featured card

Featured

A year of shipping from one Figma file

What we learned exporting 114 components 1:1, and the three places the approach nearly broke.

BlogListingCard props

PropTypeDefaultDescription
image / imageAltstringCover image and alt text.
categorystringCategory label above the title.
readTimestringPre-formatted, e.g. "11 mins read" — nothing is computed from word count.
titlestringPost title.
excerptstringRequired. The standfirst under the title.
author{ name: string; date: string; avatarSrc?: string; avatarAlt?: string }Byline. date is pre-formatted and rendered after the name.
layout'default' | 'horizontal''default'Horizontal puts the image beside the text, for list views.

BlogListingFeaturedCard props

PropTypeDefaultDescription
image / imageAltstringCover image and alt text.
badgeLabelstring'Featured'The pill on the image.
titlestringPost title.
excerptstringRequired. The standfirst under the title.
author{ name; date; avatarSrc?; avatarAlt?; initials? }Byline. initials render when there's no avatar image.
orientation'horizontal' | 'vertical''horizontal'Layout of image against text.