lini 0.22.0

Pretty diagrams, charts, and technical drawings from plain text, with fine-grained control. Compiles to clean, themeable SVG.
Documentation
// Phosphor icons. `|icon| { symbol: … }` paints like a node — `fill` is the body,
// `stroke` the line, `stroke-width` (default 2) counter-scaled to stay even at any
// size. `|sign|` is a larger preset and an ordinary wireable node. Source for
// assets/icons.png.
{
  gap: 16; padding: 8 28 24 28; align: center; clearance: 14;
  |-| { stroke: --gray-ink; stroke-width: 2; }

  |row| { align: end; }
  |tile::column| { gap: 9; align: center; font-size: 13; }
  |lbl::block| {
    font-size: 13; font-weight: bold; color: --gray-ink; padding: 16 0 0 0;
  }
  |cap::block| { font-size: 11; color: --gray-deep; }
  |sign| { font-size: 12; }

  // Two-tone colour classes — a soft `wash` body under an `ink` line. Wear one on
  // any node (`|icon| .rose`, `|box| .teal`, …) to paint the pair at once.
  .rose { fill: --rose-wash; stroke: --rose-ink; color: --rose-ink; }
  .amber { fill: --amber-wash; stroke: --amber-ink; color: --amber-ink; }
  .teal { fill: --teal-wash; stroke: --teal-ink; color: --teal-ink; }
  .sky { fill: --sky-wash; stroke: --sky-ink; color: --sky-ink; }
  .purple { fill: --purple-wash; stroke: --purple-ink; color: --purple-ink; }
  .lime { fill: --lime-wash; stroke: --lime-ink; color: --lime-ink; }
}

|lbl| "Icons"
|group| { gap: 40; direction: row; fill: none; } [
  |tile| [
    |icon| { symbol: house; }
    |cap| "default"
  ]
  |tile| [
    |icon| .rose { symbol: heart; }
    |cap| "two-tone"
  ]
  |tile| [
    |icon| { symbol: cloud; fill: none; stroke: --sky-deep; }
    |cap| "line"
  ]
  |tile| [
    |icon| .teal { symbol: user; }
    |cap| "user"
  ]
  |tile| [
    |icon| .amber { symbol: bell; } [
      "3" { translate: 0 -2; }
    ]
    |cap| "+ label"
  ]
  |tile| [
    |icon| .purple { symbol: star; }
    |cap| "star"
  ]
]

|lbl| "Signs, fit: auto"
|row#a| { gap: 44; } [
  |sign#web| .sky { symbol: ghost; fit: auto; }
  |sign#auth| .purple { symbol: rocket; fit: auto; }
  |sign#svc| .teal { symbol: gear; fit: auto; }
  |sign#cpu| .amber { symbol: cpu; fit: auto; }
  |sign#store| .rose { symbol: database; fit: auto; }

  web -> auth
  auth -> svc
  svc -> cpu
  cpu -> store
]

|lbl| "Signs + Text"
|row#b| { gap: 44; } [
  |sign#web| .teal { symbol: folder-simple; } [
    "Folder" { translate: 0 2; }
  ]
  |sign#auth| .lime { symbol: presentation; } [
    "Canvas" { translate: 0 -3; }
  ]
  |sign#svc| .purple { symbol: seal; } [ "Alert" ]
  |sign#cpu| .rose { symbol: video-camera; } [
    "video" { translate: -6 0; }
  ]
  |sign#store| .amber { symbol: wall; }

  web ---< auth
  auth --> svc
  svc --> cpu
  cpu ~> store
]