Skip to content

feat(kits/drinks): add general-purpose drinks kit (cocktails, wine, beer, spirits) #31

Description

@the-simian

Motivation

A bartender, sommelier, brewer, or drinks-app developer working in unitforge today has no domain-specific units. They can borrow from cooking (`fluidOunceUs`, `fluidOunceUk`, `milliliter`, `liter`) but lose every domain affordance: there is no `jigger`, no `pint` (and the term differs across regions anyway), no `pour`, no `keg`, no `shot` (also region-dependent), no `barspoon`.

This kit should cover the four main drinks-domain unit families: cocktails, wine, beer, and spirits. All four share the `VOLUME` dimension so they can forge across each other (1 wine pour = ? US shots = ? barspoons), but each family has its own conventions and regional foot-guns.

Proposed scope

Cocktails / bartending

  • jigger = 1.5 US fl oz = 44.36 mL (standard US shot; the bigger side of a double-ended jigger)
  • pony = 1 US fl oz = 29.57 mL (the smaller side)
  • barspoon ≈ 5 mL (metric teaspoon-equivalent stirring measure)
  • cocktail dash ≈ 0.8 mL (bitters-bottle dash; ~50 drops per oz; distinct from spice-rack dash in cooking kit)
  • cocktail drop ≈ 0.05 mL (dropper, ~20 drops per mL)
  • splash ≈ 5 mL (informal; cite that this is convention, not standard)

Wine pours

  • wine pour US = 5 US fl oz = 147.87 mL (TTB / restaurant standard)
  • wine pour EU = 125 mL exact (EU standard pour)
  • wine pour AU = 150 mL exact (Australia standard)
  • Bottle sizes: standard 750 mL, magnum 1.5 L, jeroboam 3 L, rehoboam 4.5 L, methuselah 6 L (and up; could ship the full Biblical naming or stop at magnum and jeroboam)

Beer

  • US pint = 16 US fl oz = 473.18 mL
  • UK pint = 20 imperial fl oz = 568.26 mL (the 20%-bigger Atlantic gap, same shape as the cup split in cooking)
  • bottle = 12 US fl oz = 355 mL (US standard; matches a can)
  • can = 12 US fl oz = 355 mL
  • tallboy = 16 US fl oz = 473 mL
  • growler = 64 US fl oz = 1.89 L (US standard)
  • half-barrel keg = 15.5 US gallons = 58.67 L (US commercial keg)
  • sixth-barrel keg = 5.17 US gallons = 19.57 L
  • firkin = 9 imperial gallons = 40.91 L (UK cask)
  • kilderkin = 18 imperial gallons = 81.83 L (UK cask, 2 firkins)
  • barrel (US beer) = 31 US gallons = 117.35 L

Spirits

  • shot US = 1.5 US fl oz = 44.36 mL (same as jigger; ships under both names with cross-reference)
  • shot UK = 25 mL exact (UK standard pub measure)
  • shot AU / DE = 30 mL exact
  • shot RU = 50 mL exact (the iconic Russian shot; significantly larger)
  • double UK = 50 mL exact (two UK shots)
  • nip / nipperkin ≈ 30 mL (rare; UK historical)

Scope question: one kit or split?

Two paths:

  1. One big kit (`unitforge/kits/drinks`) — all 30+ units in one barrel; subpath import works the same way.
  2. Per-domain sub-kits (`unitforge/kits/drinks/cocktails`, `unitforge/kits/drinks/wine`, `unitforge/kits/drinks/beer`, `unitforge/kits/drinks/spirits`) — tree-shake friendly; a wine-app importer doesn't pay for keg sizes.

Recommendation: one kit with explicit named exports, since tree-shake works at the named-export granularity (per the cooking kit's `/#PURE/` + no-CallExpression convention). A wine-app importer that only writes `import { winePourUs } from 'unitforge/kits/drinks'` will only bundle that one unit; per-domain sub-kits add namespace friction without bundle wins.

Design problems

Region disambiguation (the big one)

"pint," "shot," and "pour" all have different values in different regions. Same kit-discipline as the cooking kit's cup/tablespoon split: ship as separate suffixed exports (`pintUs`, `pintUk`, `shotUs`, `shotUk`, `shotAu`, `shotRu`, etc.) and never alias the bare name.

Cocktail-dash vs cooking-dash collision

The cooking kit already ships `dash` (1/8 US teaspoon ≈ 0.616 mL, spice-rack convention). The cocktail-context dash from a bitters bottle is ~0.8 mL and is a distinct convention. Two paths:

  • Ship `cocktailDash` in this kit (explicit, verbose, no collision)
  • Ship `dash` and let consumers disambiguate via import path (`drinks.dash` vs `cooking.dash`)

Recommendation: `cocktailDash` in this kit's namespace. Verbose but unambiguous; matches the kit-discipline already established by `stickOfButterUs`-style explicit suffixes.

Keg sizes: ship US or US+UK or all?

US, UK, and German keg sizes all differ. Recommendation: ship US standard sizes (half-barrel, sixth-barrel) in the main namespace plus `firkin` / `kilderkin` (UK cask sizes; they survive in real-ale circles). German Maß / Halbe pairs (1 L / 0.5 L beer-hall measures) might belong in a future `drinks/locale-german` sub-kit.

Demo possibilities

  • Cocktail recipe converter: forge a martini recipe (2 oz gin + 0.5 oz vermouth + 1 dash bitters) into metric for a European bar.
  • Pint comparator: visualize the 20% Atlantic pint gap the same way the cooking kit shows the Atlantic cup gap.
  • Keg-math calculator: how many pints in a half-barrel; how many ounces in a magnum.
  • Wine-pour pricing: cost-per-pour math ($X per bottle ÷ pours per bottle).

Citations

  • TTB (US Alcohol and Tobacco Tax and Trade Bureau) — wine pour standards, US barrel definition
  • Weights and Measures Act 1985 (UK) — pint, fl oz, gallon definitions
  • EU Council Directive 76/211/EEC — wine bottle and beer container nominal volumes
  • Standards Australia AS 2856 — beer glass sizes
  • Jerry Thomas, Bar-Tender's Guide (1862) — historical cocktail-dash convention
  • Harry Craddock, Savoy Cocktail Book (1930) — modern cocktail conventions

Effort

  • Cocktail units: ~0.5 day
  • Wine units: ~0.5 day
  • Beer units (with keg sizes): ~1 day
  • Spirit / shot regional disambiguation: ~0.5 day
  • Demo (pick one of the above ideas): ~1 day
  • Total: ~3-4 days

Acceptance criteria

  • Kit at `unitforge/kits/drinks` with subpath export
  • All four families (cocktails, wine, beer, spirits) shipped with regional disambiguation where relevant
  • Each region-ambiguous unit shipped with explicit suffix (`pintUs`, `pintUk`, `shotUs`, `shotRu`, etc.); no bare aliases
  • Docstring on `cocktailDash` cross-references cooking kit's spice-rack `dash` to prevent confusion
  • Each unit's docstring cites the relevant standard (TTB, UK W&M 1985, EU 76/211/EEC, Standards Australia AS 2856, Jerry Thomas / Harry Craddock for historical bar conventions)
  • At least one demo surface using the kit

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions