build.nix

{ pkgs, h }:

let
  sierpinski = depth: x: y: size:
    if depth == 0 then
      let
        x1 = x;
        y1 = y;
        x2 = x + size;
        y2 = y;
        x3 = x + size / 2;
        y3 = y - size * 0.866;
      in
        [ "polygon" { points = "${toString x1},${toString y1} ${toString x2},${toString y2} ${toString x3},${toString y3}"; } ]
    else
      let
        half = size / 2;
        height = size * 0.866;
      in [
        (sierpinski (depth - 1) x y half)
        (sierpinski (depth - 1) (x + half) y half)
        (sierpinski (depth - 1) (x + half / 2) (y - height / 2) half)
      ];

  page = h.renderPretty [
    "html" { lang = "en"; }
    [ "head"
      [ "meta" { charset = "utf-8"; } ]
      [ "title" "Sierpinski Triangle" ]
      [ "style" (h.raw ''
        body { margin: 0; display: flex; justify-content: center; align-items: center; min-height: 100vh; background: #1a1a2e; }
        svg { max-width: 90vmin; max-height: 90vmin; }
        polygon { fill: #e94560; }
      '') ]
    ]
    [ "body"
      [ "svg" { viewBox = "0 0 100 90"; xmlns = "http://www.w3.org/2000/svg"; }
        (sierpinski 6 0.0 86.0 100.0)
      ]
    ]
  ];

in pkgs.runCommand "art" {} ''
  mkdir -p $out
  cp ${pkgs.writeText "index.html" page} $out/index.html
''