Khalid / Docs / Templates: the look of your blog
Workbench
Workbench is the template for blogs that review and compare tools or products. It is built for the post that weighs five options against each other: a table that shows them at a glance, a section per option with its pros and cons and its price, and a plain list of further reading at the end.
Who it suits
- A software company that publishes "best tools for" lists and head-to-head comparisons.
- A team that writes buying guides, where readers scan a table first and read the detail second.
- A blog that grows its newsletter, because Workbench offers the sign-up form twice on the front page and once after each post.
It suits writing with clear sections and tables. For long essays with few headings, classic reads more calmly.
Pick it
[template]
name = "workbench"
Your colours, fonts and logo still come from theme sync. Before you sync, Workbench uses its own: a grey-white bench, graphite text and one verdict green, in your system's sans and code fonts. Labels, rules and panels always use your tokens.
What the front page shows
- Your blog's name in very large type on squared paper, over a thick rule, and a "Categories" button that opens a menu of your categories. The menu works without scripts.
- The newest post marked
featured: true, large, under a green rule. Its picture keeps a 16 by 9 shape. - "Latest posts": the next five posts as numbered rows, 01 to 05, each with its category, title, date and reading time. On a wide screen they sit beside the featured post.
- The newsletter form.
- "More posts": the rest as picture cards in ruled cells, like one sheet, up to four in a row on a wide screen.
- The newsletter form again, then the page links and "See all posts", which opens the archive.
What a post shows
- The category as a small label, the title, and the post's
descriptionas a subtitle. - The writers, the date and the reading time.
- The contents in an open box at the top.
- The body. Each section opens under a green rule. A paragraph that starts with a bold label, such as Price:, shows the label in the code font, like a line on a spec sheet. Wide tables can grow past the text, up to 60rem on large screens, so a comparison table has room. The header row sits on your surface colour, and on a phone the first column stays in place while the table scrolls sideways.
- A closing line in italics: who wrote it, when it was published and when it was updated.
- Share links, the author box, the newsletter form, and six related posts as plain links.
Writing a comparison post
Workbench styles the blocks a comparison needs. Write them in your post as usual:
- A criteria list: a list where each item starts with bold words.
- The table: a normal markdown table. Wrap a long one in
:::table{fold=8}so it shows eight rows and a line to open the rest. To mark the winner in a row, write its cell all in bold: Workbench tints that cell in your accent colour. - Each option's section: a
##heading, then:::prosconsfor its pros and cons, then:::reviewfor its rating, or a line with its price in bold. - The questions readers ask:
::::faq. - Your call to action:
::ctaon its own line, once you have[template.cta].
Options
Set these under [template.options]. An option you leave out takes the default.
| Option | Default | What it does |
|---|---|---|
hero_stats |
none | Up to four numbers under the front page's title, each written number | what it counts. Nothing shows until you write them. |
topic_tabs |
false |
Tabs on the front page, one per topic, each with its four newest posts. They work with scripts off. |
video_section |
true |
A row of the newest posts with a video, when there are any. |
podcast_section |
true |
A row of the newest posts with a podcast or other sound player, when there are any. |
logo |
true |
The header shows your logo from [brand] logo in place of the blog's name. |
breadcrumbs |
false |
Each page shows the trail of links from the front page to it. |
dek |
true |
A post shows its description as a subtitle under its title. |
updated_note |
false |
An updated post says why it was updated, from its updated_note. |
cards |
image |
The shape of post cards in lists: image, text, row, compact or ranked. |
card_reading_time |
true |
Each card shows how long the post takes to read. |
card_author_role |
false |
Each card shows its author's role. |
featured |
true |
The newest post with featured: true shows large at the top. |
pagination |
pages |
The links under a long list: pages for newer and older, or numbered. |
related |
links |
How related posts are laid out: grid, list, row, scroll or links. |
related_count |
6 |
How many related posts show, from 3 to 10. |
contents |
inline |
Where the contents go: inline, inline-folded, side-end, side-start or none. |
reading_progress |
bar |
A thin line at the top of a post that fills as the reader scrolls: bar or none. |
header_search |
button |
What the header's search does on a served blog: button opens a search dialog, link opens the search page, none hides it. |
contents_numbers |
numbered |
How the contents are numbered: numbered, nested or none. |
share |
end |
Where share links show: none, top, end or both. |
share_networks |
["linkedin", "x", "email"] |
Which networks the share links go to, in order. |
newsletter |
both |
Where the newsletter form shows: none, post, home or both. On the front page, home and both show it twice. |
cta_band |
none |
Where the band with your [template.cta] shows: none, post, home or both. |
cta_button |
true |
The header shows your [template.cta] as a button. |
lead_image |
true |
A post shows its lead picture under its title, framed on a shadow of the accent. Turn it off when your comparison posts open with their table. |
closing_line |
true |
A post ends with one line naming its writers and its dates. Turned off, the updated date shows beside the published date instead. |
newsletter_note |
none | One line under the front page's newsletter forms, such as how often you send. |
For example:
[template.options]
newsletter_note = ["A new review every Tuesday."]
related_count = 4
share = "both"
The newsletter form shows only when your blog can take sign-ups: mode = "server" with a [mail] table.
Sizes
Workbench sets these defaults in crates/khalid-theme/packs/workbench/tokens.toml. A value in your theme/tokens.toml wins.
| Token | Workbench |
|---|---|
| Colours | background #f7f7f5, surface #ecedea, text #1a1c1e, muted #52575c, link #0d6a43, accent #11794c, border #d3d6d0 |
| Fonts | the system sans for headings and text, the system code font for labels, dates and prices |
| Body text | 1.0625rem to 1.1875rem |
h1, h2, h3, h4 |
2.25rem to 3.5rem, 1.5rem to 2rem, 1.1875rem to 1.375rem, 1.0625rem to 1.125rem |
| Small text | 0.875rem |
| Line height | 1.6 |
Line length (measure) |
38rem, about 70 letters a line |
Corners (radius) |
0.125rem, nearly square |
| Spacing | a 0.5rem step, 3.5rem between sections |
| Frame | 84rem for the header, the lists and the footer |
Good to know
- The "Categories" menu needs your categories on the front page. Khalid does not fill them in yet, so the menu stays hidden until it does.
- The category on the rows under "Latest posts" and above a post's title works the same way: it shows once Khalid fills in a post's category.
- Workbench reads with scripts off, and adds no script.
Design
This is Workbench's design brief. It fixes how the template should look, so every change to its stylesheet keeps the same character. Your own colours and fonts from theme sync still replace the ones named here.
Who it is for. A team that tests tools or products and publishes "best of" lists and head-to-head comparisons. Readers scan a table first and read the detail second.
The one idea. A test lab's bench sheet. Heavy, tight headings over thick rules, squared paper behind the name, numbered rows, ruled cells and every fact in the code font. You should be able to name it from a small picture of its front page.
Reference blogs, by kind. Their pictures are kept with the design notes, outside the repository.
- A product testing lab's review site. A count of products bought and tested above every guide, each pick under a heavy accent rule with its name, its test pictures and a row of scores, the specs as short labelled pairs, and a note on how the lab tests.
- A consumer technology review site. Buying guides with a quick list of picks, specs tables and ratings, and lists of reviews as rows.
| Part | Workbench |
|---|---|
| Type pairing | A technical grotesque for headings over a plain engineering sans for text, with mono details: prices, ratings, dates and labels. With no theme, the pack uses the system sans and the system mono. |
| Type scale | Display type is heavy (800) with tight tracking (-0.04em to -0.05em). The front page's name runs from 3rem on a phone to 6.5rem on a wide screen, a list page's title to 5rem, a post's title to 3.75rem (5rem from 1280 px) and the pick's title to 3.25rem. |
| Front page structure | The masthead owns the top: the name on squared paper over a thick rule. Below it, a lead grid: the pick on the left, a numbered rail of the five newest posts on the right. Then the rest as ruled cells of one sheet: twelve picture cells on a wide screen, then the sheet's ruled rows, two across, each a title, its date and its category. The front page still links every post. |
| Colour | A grey-white bench ground, graphite text and one verdict colour (green) for picks, labels and pros. Panels a shade darker than the ground. Workbench now has a full palette of its own. |
| Spacing rhythm | A base step of 0.5rem on a strict grid. Ruled sections 3.5rem apart. Table rows 0.75rem high in padding. |
| Frame at 1440 px and wider | At least 80rem. A comparison table may grow past the text to 60rem, so the frame leaves it room. |
| Post at 1280 px and wider | A spec sheet across the frame: the title (up to 5rem) and a wider lead picture (2 by 1) span 61rem; below them the contents box sits in a rail that stays in view beside the text. The text grows to 1.25rem and its measure to 40rem, so a line still holds 60 to 75 letters. |
| Cards and lists | Picture cards with square corners in ruled cells that share their rules, the category as a mono label, the title, the date. The featured picture keeps a fixed ratio (16 by 9) and never fills the window: on a list page it sits beside its words. |
| Phone header and menu | The blog's name and the "Categories" button on one row; the menu opens below with no script. The site menu is one row you can swipe, its last 2rem faded so it reads as more to see. |
| Phone lists | The first six cells two across, as a contact sheet: picture, date and title. Every later post is a ruled row: the title and the date small. The 40-post demo's front page stays near 6,000 px. |
| Tabs and indexes at 390 px | Topic tabs as one row you can swipe. A wide comparison table scrolls sideways inside its frame, with the first column fixed. |
| Link, card and focus states | Links underlined in the verdict colour. A card's top rule turns the verdict colour on hover. Focus is a 2 px ring in the text colour. |
| Signature details | The comparison table as the hero of a post: header row on the panel colour, the winning cell marked. Pros and cons as two ruled columns with plus and minus marks. Mono labels for prices and ratings, and for the bold label that opens a paragraph. Numbered rows (01, 02) in the newest posts, the contents and the related links. |
Sample brand. The demo uses fixtures/showcase-brands/workbench/theme/: verdict green (#10744a links, #117d50 accent) on a grey-white bench (#fafaf8), Space Grotesk for headings and IBM Plex Sans for text, and a hex-and-check mark.
Written in the Khalid repository. Edit this page on GitHub.