1{{define "title"}}Cartograph · sources{{end}}2{{define "content"}}3<section class="page-head">4 <h1>Sources</h1>5 <p class="dim">Each source contributes components to a volume's bundle; composition merges them by title and slug, with provenance. Re-fetching unchanged data is a no-op.</p>6</section>78<div class="columns">9{{range .Sources}}10<section class="card">11 <h2>{{.Name}} <span class="dim">{{.Slug}}</span></h2>12 <p>{{range .Components}}<span class="badge">{{.}}</span>{{end}}</p>13 <p class="dim">{{.Description}}</p>14 <form data-op action="/ops/run" method="post">15 <input type="hidden" name="op" value="fetch">16 <input type="hidden" name="source" value="{{.Slug}}">17 <input name="target" placeholder="{{.TargetHint}}" required>18 <button>Fetch</button>19 </form>20</section>21{{end}}22</div>2324<section class="card">25 <h2>Pipeline</h2>26 <p class="dim">27 repo <b>{{if .Repo}}{{.Repo}}{{else}}not found — start with -repo{{end}}</b> ·28 archive <b>{{if .Archive}}{{.Archive}}{{else}}not set — start with -archive{{end}}</b> ·29 bundles <b>{{.Bundles}}</b>30 </p>31 <form data-op action="/ops/run" method="post">32 <input type="hidden" name="op" value="tiles">33 <button>Rebuild pyramids</button>34 <span class="dim">tools/tiles derives every pyramid the archive holds into build/tiles, incrementally.</span>35 </form>36 <form data-op action="/ops/run" method="post">37 <input type="hidden" name="op" value="generate">38 <button>Recompose bundles</button>39 <span class="dim">tools/generate merges sources and installs versioned builds into the bundles directory.</span>40 </form>41</section>4243<pre id="op-output" class="console"></pre>44{{end}}