hearts.gno
2.04 Kb · 59 lines
1package home
2
3import (
4 "encoding/base64"
5 "strconv"
6 "strings"
7)
8
9// The hearts wall draws one red heart per address that sent one, row by row,
10// with the slots still free in the last row left as outlines. Past
11// wallCols*wallMaxRows hearts the wall stays full and a line under it counts
12// the rest, so the image never grows past ten rows.
13
14const (
15 wallCols = 24
16 wallMaxRows = 10
17 wallCell = 28
18 heartRed = "#e63946"
19 heartPath = "M12 21C12 21 3 15.5 3 9.5 3 6.5 5.4 4 8.3 4 10 4 11.2 5 12 6.2 12.8 5 14 4 15.7 4 18.6 4 21 6.5 21 9.5 21 15.5 12 21 12 21Z"
20)
21
22// renderHeartsWall returns the wall as a markdown image; with no heart yet it
23// is one row of empty slots.
24func renderHeartsWall() string {
25 n := Hearts()
26 shown := n
27 if limit := wallCols * wallMaxRows; shown > limit {
28 shown = limit
29 }
30 rows := shown/wallCols + 1
31 if rows > wallMaxRows {
32 rows = wallMaxRows
33 }
34 w := 24 + wallCols*wallCell
35 h := 24 + rows*wallCell
36 more := n - shown
37 if more > 0 {
38 h += 26
39 }
40 var b strings.Builder
41 b.WriteString(`<svg xmlns="http://www.w3.org/2000/svg" width="` + strconv.Itoa(w) + `" height="` + strconv.Itoa(h) +
42 `" viewBox="0 0 ` + strconv.Itoa(w) + ` ` + strconv.Itoa(h) + `"><defs><path id="h" d="` + heartPath + `"/></defs>`)
43 b.WriteString(`<rect width="` + strconv.Itoa(w) + `" height="` + strconv.Itoa(h) + `" rx="12" fill="#10231c"/>`)
44 for i := 0; i < rows*wallCols; i++ {
45 x := 14 + (i%wallCols)*wallCell
46 y := 14 + (i/wallCols)*wallCell
47 style := `fill="` + heartRed + `"`
48 if i >= shown {
49 style = `fill="none" stroke="#6b8f7f" stroke-width="1.5"`
50 }
51 b.WriteString(`<use href="#h" x="` + strconv.Itoa(x) + `" y="` + strconv.Itoa(y) + `" ` + style + `/>`)
52 }
53 if more > 0 {
54 b.WriteString(`<text x="` + strconv.Itoa(w/2) + `" y="` + strconv.Itoa(h-14) + `" text-anchor="middle" ` +
55 `fill="#9fc9b4" style="font:13px sans-serif">and ` + strconv.Itoa(more) + ` more</text>`)
56 }
57 b.WriteString("</svg>")
58 return ")) + ")\n"
59}