Bosia Bosia v0.8.11

Blog Sections

Blog sections — post-list cards, a post header, a prose body wrapper and a related-posts row.

Blog sections for a content site. Each is a self-contained, full-width Svelte <section> built only from semantic tokens, so it restyles across every theme. Try the theme switcher above the preview.

Preview

Product

Shipping beats polishing

Why a released rough edge teaches you more than an unreleased perfect one.

Jeki Maulana

Jeki Maulana

6 min read

Desk with an open notebook and laptop

The fastest way to learn what a feature is worth is to put it in front of people who didn't build it. Polish delays that lesson; shipping collects it.

Rough edges are feedback magnets

Users forgive an honest rough edge far more readily than a missing capability. What they won't do is imagine the feature you kept on a branch.

A released rough edge teaches you more than an unreleased perfect one.

What we do instead

  • Ship the smallest slice that answers a real question.
  • Watch how it's used for a week before touching it again.
  • Polish only the paths people actually walk.

None of this is an argument against quality. It's an argument about sequence: quality earns its keep after usefulness is proven, not before.

Install

bun x bosia@latest add block blog/post-list
bun x bosia@latest add block blog/post-header
bun x bosia@latest add block blog/post-body
bun x bosia@latest add block blog/related

post-body pulls ui/typography for its prose styles.

The blocks

  • post-list — heading and intro over a vertical stack of post cards (tag, date, title, excerpt).
  • post-header — tag, date, title, excerpt, author byline with reading time and a cover image.
  • post-body — a 70ch prose article; pass an html string, a children snippet, or keep the sample prose.
  • related — a "keep reading" row of up to three compact post cards.

Usage

<script lang="ts">
	import PostList from "$lib/blocks/blog/post-list/block.svelte";
</script>

<PostList />

Every block ships with sample posts so it renders standalone. To feed real data, pass props: post-list and related take posts (array of { slug, title, excerpt, tag, date, datetime }), post-header takes the post fields directly, and post-body takes html. Post links go to {base}/{slug}base defaults to /blog. Install the blog feature for a database-backed posts table with server loaders that produce exactly this shape.

post-body renders html unescaped — only pass trusted content (your own database), never user input.

Source

src/lib/blocks/blog/*/block.svelte