Skip to content

Autoflow rule: phrase-bullets

Priority 75 · Headline + 2-3 short bullets cycles through 4 layouts: cards → pills → alternating → staggered.

The “1 short headline + 2-3 short bullets” shape is everywhere in real decks and renders flat as “title + bulleted list”. This rule detects the shape and cycles through a 4-variant palette across the deck so two consecutive matches don’t pick the same layout. Anti-monotony as a rule.

  • The slide has exactly 1 heading line (h1/h2/h3)
  • 2-3 bullet items, each ≤6 words
  • The headline ≤8 words
  • No images, no extra paragraphs (just heading + bullets)

The rule reads ctx.state.lastPhraseBulletsLayout and picks the next variant in the palette:

1st phrase+bullets in deck → cards (horizontal cards side by side)
2nd → pills (#[fit] headline + tag pills)
3rd → alternating (bullets alternate accent)
4th → staggered (bullets indented differently)
5th → cards, 6th → pills, ...

The autoflow injects [.bullets-layout: <variant>] into the slide. The parser converts that to data-bullets-layout="..." on the section, and CSS in css/layout.css renders each variant.

Bullets become horizontal cards side by side, like a “categories” or “dimensions” slide. Each bullet gets a subtle border and background.

Headline becomes #[fit] (giant) and the bullets become inline pill tags below it. Strong impact + light context tags. Good for “the X we’re focusing on” slides.

Bullets alternate between heading color and accent color (no special layout — just color rhythm). Works as a subtle anti-monotony shift without changing the overall feel of the deck.

Each bullet gets a different indent (25% / 5% / 35% / 15%), creating a visual zigzag down the slide. Makes a flat list feel kinetic.

The fixture below has 4 phrase+bullets slides — one per palette variant.

footer: autoflow rules · phrase-bullets
slidenumbers: true
autoflow: true
theme: nordic
scheme: 1
# Cover
(slide 0 — sets up the deck before the palette starts cycling)
---
<!--
RULE: phrase-bullets (priority 75)
TRIGGERS WHEN:
- The slide has exactly 1 heading line (h1/h2/h3)
- 2-3 bullet items, each ≤6 words
- The headline ≤8 words
- No images, no extra paragraphs
EFFECT:
- Picks layout from a 4-variant palette via ctx.state.lastPhraseBulletsLayout
- cycles: cards → pills → alternating → staggered → cards → ...
- Injects [.bullets-layout: <variant>] which the parser turns into
data-bullets-layout="..." on the section, and CSS renders the variant.
The 4 slides below show one full cycle of the palette.
-->
# Three forces reshaping work
- AI agents that write code
- Vibe coders without CS
- Hiring for problems
---
# Three skills the new dev needs
- Curiosity
- Taste and judgment
- Speed and rhythm
---
# What good engineers do
- Read docs and source
- Reject mediocre output
- Throw away failed work
---
# How to ship faster
- Smaller commits
- Earlier reviews
- Tests as you go

A single anti-monotony layout still becomes monotonous if it fires 5x in a deck. Cycling through 4 variants means even a deck with many “headline

  • bullets” slides keeps shifting visually. The rule with state proves its value here — without ctx.state, every slide would land on the same default layout.