lini 0.9.0

Pretty diagrams from plain text, with fine-grained control. Compiles to clean, themeable SVG.
Documentation
// The Lini hero — a colourful service map. Palette colours, a gradient entry
// point, mixed link styles. Source for assets/hero.png.
{
  layout: column; gap: 52; padding: 26; font-weight: normal; link: --gray-deep; link-width: 2; clearance: 16;

  |edge::box| { fill: --sky-wash; stroke: --sky-deep; color: --sky-ink; }
  |svc::box| { fill: --teal-wash; stroke: --teal-deep; color: --teal-ink; }
  |api::sign| {
    symbol: octagon; fill: --green-wash; stroke: --green-deep; color: --green-ink;
  }
  |auth::sign| {
    symbol: shield; fill: --purple-wash; stroke: --purple-deep; color: --purple-ink; translate: 0 2;
  }
  |store::cyl| { fill: --rose-wash; stroke: --rose-deep; color: --rose-ink; }

  .flow { link: --blue-deep; }
  .cache { link: --teal-deep; }
  .async { link: --amber-deep; }
  .auth { link: --purple-deep; }
}

users |oval| {
  width: 156; height: 62; fill: gradient(--sky, --purple); stroke: none; color: white; font-weight: bold;
} "Users"

edge |group| { layout: row; gap: 28; } [
      |caption| "Edge"
  lb  |edge| [
    "Load balancer"
    |badge| "v2"
  ]
  cdn |edge| { stack: 5; } "CDN"
]

svc |group| { layout: row; gap: 28; } [
         |caption| "Services"
  api    |api|     "API"
  auth   |auth|    [
    "Auth" { translate: 0 -4; }
  ]
  worker |svc|     [
    "Worker"
    |badge| "NEW"
  ]
]

data |group| { layout: row; gap: 28; } [
        |caption| "Data"
  pg    |store| "Postgres"
  redis |store| "Redis"
  queue |svc| { fill: --amber-wash; stroke: --amber-deep; color: --amber-ink; } "Queue"
]

users -> edge.lb .flow "https"
edge.lb -> svc.api
edge.lb -> svc.auth .auth
svc.api -> data.pg .flow
svc.api --> data.redis .cache "cache"
svc.worker ~> data.queue .async "jobs"