size-and-capacity first build

Size + capacity demo

Fixture exercising the size + capacity interaction on items. Each lane shows a single combination so the driver token (size chip or duration literal) and capacity suffix are easy to read on the rendered SVG. Pairs nicely with tests/capacity-items.nowline (capacity glyph variants) and examples/long.nowline (size catalog without capacity). Meta line: one **driver** token only — the `duration:` literal when present, else the size chip. Bar width encodes derived calendar span for sized items without repeating it in text. Then optional owner / remaining, then the capacity suffix — see specs/rendering.md § Item size chip.

theme: light now: 2026-02-09

bea64f3 Publish the review gallery to review.nowline.dev (#187)

First build in the history; nothing to compare against.

tests/size-and-capacity.nowline
nowline v1

// Fixture exercising the size + capacity interaction on items. Each
// lane shows a single combination so the driver token (size chip or
// duration literal) and capacity suffix are easy to read on the rendered
// SVG. Pairs nicely with tests/capacity-items.nowline (capacity glyph
// variants) and examples/long.nowline (size catalog without capacity).
//
// Meta line: one **driver** token only — the `duration:` literal when
// present, else the size chip. Bar width encodes derived calendar span
// for sized items without repeating it in text. Then optional owner /
// remaining, then the capacity suffix — see specs/rendering.md § Item
// size chip.

config

style fte
  capacity-icon: person

style pair
  capacity-icon: people

roadmap r "Size + capacity demo" start:2026-01-05 length:8w

// Sizes with t-shirt opt-in titles. Authors who want lowercase ids on the
// chip just leave the title off (`size sm effort:3d`); see the `verbose-`
// lanes below for the alternative.
size sm "S"  effort:3d
size md "M"  effort:1w
size lg "L"  effort:2w
size xl "XL" effort:4w

// Lane 1 — size only, default capacity (1). Bar width = effort.
//   driver: "S" on meta (no duration text; bar is 3d wide)
swimlane size-only-s "size:sm (capacity defaults to 1)"
  item s1 "Solo" size:sm

//   driver: "L" on meta (bar is 2w wide)
swimlane size-only-l "size:lg (capacity defaults to 1)"
  item l1 "Solo large" size:lg

// Lane 2 — size + capacity, multiplier glyph (default).
//   driver: "L" on meta; bar is 1w (effort 2w / capacity 2); suffix: "2×"
swimlane team-of-2 "size:lg capacity:2 (default × glyph)"
  item t1 "Two-engineer large" size:lg capacity:2

//   driver: "XL" on meta; bar is 1w (effort 4w / capacity 4); suffix: "4×"
swimlane team-of-4 "size:xl capacity:4 (default × glyph)"
  item t2 "Four-engineer XL" size:xl capacity:4

// Lane 3 — size + capacity with a custom glyph.
//   driver: "M" on meta; bar is 1d (effort 1w / capacity 5); suffix: "5 [person]"
swimlane fte-lane "size:md capacity:5 (person glyph)"
  item f1 "Five FTEs on a medium" size:md capacity:5 style:fte

//   driver: "L" on meta; bar is 1w (effort 2w / capacity 2); suffix: "2 [people]"
swimlane pair-lane "size:lg capacity:2 (people glyph)"
  item f2 "Pair on a large" size:lg capacity:2 style:pair

// Lane 4 — explicit duration: literal wins; size chip omitted from meta.
//   driver: "1w" only (effort would have been 4w for XL, but literal wins)
swimlane override "size:xl duration:1w (literal overrides effort)"
  item o1 "XL annotation, week-long bar" size:xl duration:1w

//   driver: "3d" + suffix: "3×"; size:lg still in DSL but not on meta line
swimlane override-cap "size:lg duration:3d capacity:3 (literal + capacity)"
  item o2 "Annotated short burst" size:lg duration:3d capacity:3

// Lane 5 — sized item in-progress with literal `remaining:`.
//   driver: "L" — meta: "L — 1w remaining" (1w of 2w single-eng effort left)
swimlane progress "size:lg capacity:2 status:in-progress remaining:1w"
  item p1 "Halfway through" size:lg capacity:2 status:in-progress remaining:1w

// Lane 6 — id-as-typed case preservation. No title, so the id appears
// on the chip exactly how the author wrote it.
size verbose "verbose" effort:1w
size MED          effort:1w

//   chip: "verbose" — title used (matches id text)
swimlane id-verbose "size:verbose (lowercase title 'verbose')"
  item v1 "Lowercase chip" size:verbose

//   chip: "MED" — id verbatim (no title, no case folding)
swimlane id-MED "size:MED (no title, id case preserved)"
  item v2 "Author-uppercased id" size:MED