1{{define "title"}}Project{{end}}2{{define "content"}}3<section class="page-head">4 <p class="eyebrow">One manifest → one native volume</p>5 <h1>{{if .Project.Title}}{{.Project.Title}}{{else}}Atlas project{{end}}</h1>6 <p class="dim"><b>{{.Targets.Project}}</b></p>7 {{if .Notice}}<p class="notice">{{.Notice}}</p>{{end}}8 {{if .Error}}<p class="warn">{{.Error}}</p>{{end}}9</section>1011<section class="card area-authoring" aria-labelledby="area-authoring-title">12 <header class="authoring-head">13 <div>14 <p class="eyebrow">Geographic selection · U.S. source coverage</p>15 <h2 id="area-authoring-title">Choose any Earth area</h2>16 <p class="dim">The boundary may be anywhere on Earth. The bundled USGS/TIGER pack only promises data inside its stated U.S. coverage.</p>17 </div>18 <ol class="authoring-flow" aria-label="Authoring flow">19 <li class="active">Area</li><li>Sources</li><li>Contracts</li><li>Build</li><li>Compiled preview</li>20 </ol>21 </header>2223 <form class="area-form" method="post" action="/project/us-area" data-us-area-form>24 <fieldset class="area-bounds">25 <legend>Area · WGS84 bbox</legend>26 <div class="area-map-toolbar">27 <label>Region28 <select data-map-region>29 <option value="world">World</option><option value="conus">Lower 48</option><option value="alaska">Alaska</option><option value="hawaii">Hawaii</option><option value="puerto-rico">Puerto Rico</option>30 </select>31 </label>32 <span>Drag to draw · aligned source window is outlined</span>33 </div>34 <canvas class="area-map" width="720" height="300" tabindex="0" aria-label="Drag to select a rectangular map area" data-area-map></canvas>35 <label>West<input type="number" name="west" value="-105.1" min="-180" max="180" step="0.000001" required></label>36 <label>South<input type="number" name="south" value="39.6" min="-90" max="90" step="0.000001" required></label>37 <label>East<input type="number" name="east" value="-104.9" min="-180" max="180" step="0.000001" required></label>38 <label>North<input type="number" name="north" value="39.8" min="-90" max="90" step="0.000001" required></label>39 <label class="detail-control">Detail zoom <output data-detail-output>12</output>40 <input type="range" name="detail" value="12" min="6" max="16" step="1">41 </label>42 </fieldset>4344 <fieldset class="source-picker">45 <legend>Official sources · U.S. coverage</legend>46 <label class="source-choice topo"><input type="checkbox" name="topo" value="true" checked><span><b>USGS Topo</b><small>raster · public domain</small></span></label>47 <label class="source-choice roads"><input type="checkbox" name="roads" value="true" checked><span><b>TIGER roads</b><small>paths · typed class</small></span></label>48 <label class="source-choice hydro"><input type="checkbox" name="hydro" value="true" checked><span><b>TIGER hydro</b><small>paths + areas</small></span></label>49 <label class="source-choice counties"><input type="checkbox" name="counties" value="true" checked><span><b>TIGER counties</b><small>areas · context</small></span></label>50 </fieldset>5152 <aside class="budget-preview" aria-live="polite" data-budget-preview>53 <span class="node-kind">Selection budget</span>54 <b><output data-budget-tiles>estimating</output> raster tiles</b>55 <span><output data-budget-size>—</output> local pixel plane</span>56 <span><output data-budget-state>Adjust the box or detail to preview.</output></span>57 </aside>5859 <fieldset class="presentation-editor">60 <legend>Presentation · compiled into layers, styles + legend</legend>61 <div class="presentation-head"><span>Layer</span><span>Legend label</span><span>Style</span><span>Order</span></div>62 <label class="presentation-row">63 <span><input type="checkbox" name="road-visible" value="true" checked> Roads visible</span>64 <input type="text" name="road-label" value="Roads" maxlength="48" required aria-label="Road legend label">65 <input type="color" name="road-color" value="#b45f3c" aria-label="Road color">66 <input type="number" name="road-order" value="40" min="0" max="999" required aria-label="Road layer order">67 </label>68 <label class="presentation-row">69 <span><input type="checkbox" name="hydro-visible" value="true" checked> Water visible</span>70 <input type="text" name="hydro-label" value="Water" maxlength="48" required aria-label="Water legend label">71 <span class="color-pair"><input type="color" name="hydro-color" value="#4b8db8" aria-label="Water line color"><input type="color" name="hydro-fill" value="#b9d9ea" aria-label="Water fill color"></span>72 <input type="number" name="hydro-order" value="20" min="0" max="999" required aria-label="Water layer order">73 </label>74 <label class="presentation-row">75 <span><input type="checkbox" name="county-visible" value="true" checked> Counties visible</span>76 <input type="text" name="county-label" value="Counties" maxlength="48" required aria-label="County legend label">77 <input type="color" name="county-color" value="#766b5b" aria-label="County color">78 <input type="number" name="county-order" value="10" min="0" max="999" required aria-label="County layer order">79 </label>80 </fieldset>81 <button class="generate-manifest">Generate single manifest</button>82 </form>8384 <div class="contract-preview">85 <div>86 <span class="node-kind">Typed FeatureSets</span>87 <p><span class="contract-pill path">roads · path</span><span class="contract-pill path">waterways · path</span><span class="contract-pill area">water bodies · area</span><span class="contract-pill area">counties · area</span></p>88 <p class="dim">Stable identities, typed properties, EPSG:3857 → local affine geometry, provenance on every source.</p>89 </div>90 <i class="graph-arrow" aria-hidden="true">→</i>91 <div>92 <span class="node-kind">Presentation</span>93 <p class="style-stack"><i class="swatch county"></i><i class="swatch water"></i><i class="swatch road"></i> counties · water · roads over topo</p>94 <p class="dim">Layers, styles, labels and legend compile into the artifact.</p>95 </div>96 <i class="graph-arrow" aria-hidden="true">→</i>97 <div class="truth-preview">98 <span class="node-kind">Compiled Atlas truth</span>99 <b>{{if and .Run.Artifact (not .Run.Failed)}}Ready to inspect{{else}}Available after build{{end}}</b>100 <span class="dim">Preview never substitutes browser-side source data.</span>101 {{if and .Run.Artifact (not .Run.Failed)}}<a href="/project/inspect">Inspect compiled artifact</a>{{end}}102 </div>103 </div>104</section>105106{{if .Project.ID}}107<section class="card contract-graph" aria-labelledby="contract-graph-title">108 <header class="graph-head">109 <div>110 <p class="eyebrow">Resolved authoring contract</p>111 <h2 id="contract-graph-title">Sources become semantic FeatureSets</h2>112 </div>113 <p class="graph-totals"><b>{{.SourceCount}}</b> feature sources · <b>{{.FeatureSets}}</b> semantic sets · <b>{{.RasterCount}}</b> raster pyramids · <b>{{.LayerCount}}</b> presentation layers</p>114 </header>115116 <div class="contract-groups">117 {{range .Graph.FeatureSets}}118 <section class="contract-group" aria-labelledby="feature-set-{{.ID}}">119 <div class="source-lanes">120 {{range .Sources}}121 <div class="source-lane">122 <article class="graph-node source-node">123 <span class="node-kind">Source</span>124 <b>{{.ID}}</b>125 <span class="node-detail" title="{{.Locator}}">{{.Locator}}</span>126 <span class="status-chip {{if .Cached}}ready{{else}}fetch{{end}}">{{.Cache}}</span>127 </article>128 <i class="graph-arrow" aria-hidden="true">→</i>129 <article class="graph-node adapter-node">130 <span class="node-kind">Adapter</span>131 <b>{{.Adapter}}</b>132 <span class="node-detail">immutable evidence</span>133 </article>134 <i class="graph-arrow" aria-hidden="true">→</i>135 <article class="graph-node mapping-node">136 <span class="node-kind">Mapping</span>137 <b>{{.Geometry}} · {{.Transform}}</b>138 <span class="node-detail">{{.Identity}} → {{.FeatureTitle}}</span>139 <span class="node-detail">{{.SourceSpace}} → world</span>140 <span class="node-counts">{{.PropertyCount}} properties{{if .RelationCount}} · {{.RelationCount}} relationships{{end}}</span>141 </article>142 </div>143 {{end}}144 </div>145 <i class="graph-arrow merge-arrow" aria-hidden="true">→</i>146 <article class="graph-node contract-node">147 <span class="node-kind">FeatureSet contract</span>148 <h3 id="feature-set-{{.ID}}">{{.Title}}</h3>149 <code>{{.ID}}</code>150 <p><span class="status-chip semantic">{{.SemanticType}}</span><span class="status-chip geometry">{{.Geometry}}</span></p>151 <details class="contract-detail">152 <summary>{{len .Properties}} typed properties</summary>153 {{if .Properties}}<dl class="contract-list">154 {{range .Properties}}<div><dt>{{.Name}}</dt><dd><code>{{.Type}}</code>{{if .Optional}} <span class="dim">optional</span>{{end}}</dd></div>{{end}}155 </dl>{{else}}<p class="dim">No typed properties.</p>{{end}}156 </details>157 <details class="contract-detail">158 <summary>{{len .Relations}} relationships</summary>159 {{if .Relations}}<dl class="contract-list">160 {{range .Relations}}<div><dt>{{.Predicate}}</dt><dd>→ <code>{{.Target}}</code>{{if .Optional}} <span class="dim">optional</span>{{end}}</dd></div>{{end}}161 </dl>{{else}}<p class="dim">No relationships.</p>{{end}}162 </details>163 </article>164 </section>165 {{end}}166 </div>167168 <div class="artifact-flow">169 <div class="side-inputs" aria-label="Other artifact inputs">170 {{range .Graph.Rasters}}<span class="side-input"><b>{{.ID}}</b> · {{.Adapter}} <i class="status-chip {{if .Cached}}ready{{else}}fetch{{end}}">{{.Cache}}</i></span>{{end}}171 {{range .Graph.Assets}}<span class="side-input"><b>{{.ID}}</b> · asset <i class="status-chip {{if .Cached}}ready{{else}}fetch{{end}}">{{.Cache}}</i></span>{{end}}172 <span class="side-input"><b>{{.Graph.Layers}}</b> layers · <b>{{.Graph.Styles}}</b> styles</span>173 </div>174 <i class="graph-arrow" aria-hidden="true">→</i>175 <div class="graph-node artifact-node">176 <span class="node-kind">Artifact</span>177 <b>.atlas</b>178 <span class="node-detail">native vNext · planned</span>179 </div>180 </div>181</section>182183<div class="columns project-columns">184<section class="card">185 <h2>Resolved plan</h2>186 <p class="score">{{.CachedCount}} / {{.RequestCount}} requests cached</p>187 <dl class="terms">188 <div><dt>project digest</dt><dd><code>{{short .Plan.ProjectDigest}}</code></dd></div>189 <div><dt>world</dt><dd>{{.Plan.World}}</dd></div>190 <div><dt>estimated input</dt><dd>{{.Plan.Estimated}} bytes</dd></div>191 <div><dt>Capture requests</dt><dd>{{.RequestCount}}</dd></div>192 <div><dt>Raster tiles</dt><dd>{{.Plan.RasterTiles}}</dd></div>193 <div><dt>output library</dt><dd>{{.Plan.Output}}</dd></div>194 </dl>195 <details class="plan-detail">196 <summary>{{len .Plan.Requests}} evidence requests</summary>197 <table>198 <thead><tr><th>source</th><th>adapter</th><th>kind</th><th>cache</th></tr></thead>199 <tbody>{{range .Plan.Requests}}<tr><td>{{.Source}}</td><td>{{.Adapter}}</td><td>{{.Kind}}</td><td>{{if .Cached}}ready{{else}}fetch{{end}}</td></tr>{{end}}</tbody>200 </table>201 </details>202 <details class="plan-detail">203 <summary>{{len .Plan.Licenses}} provenance obligations</summary>204 {{range .Plan.Licenses}}<p><b>{{.Source}}</b>{{if .License}} · {{.License}}{{end}}{{if .Attribution}}<br><span class="dim">{{.Attribution}}</span>{{end}}</p>{{end}}205 </details>206</section>207208<section class="card build-control">209 <h2>Build</h2>210 <p class="dim">Capture immutable evidence, observe, assemble semantics and presentation, compile, validate, then atomically install.</p>211 <form method="post" action="/project/build">212 <button>Build native Atlas</button>213 <label><input type="checkbox" name="offline" value="true"> offline / cached only</label>214 </form>215 {{template "project-run" .}}216</section>217</div>218{{end}}219220<details class="card manifest-editor"{{if .Error}} open{{end}}>221 <summary><b>Portable manifest</b> <span class="dim">Edit the single configuration file</span></summary>222 <p class="dim">Captured evidence stays in the shared cache; completed volumes stay in the Atlas library.</p>223 <form method="post" action="/project/save">224 <textarea name="manifest" spellcheck="false" aria-label="Atlas project manifest">{{.Manifest}}</textarea>225 <button>Validate and save</button>226 </form>227</details>228{{end}}229230{{define "project-run"}}231<div id="project-run"{{if .Run.Running}} hx-get="/project/run" hx-trigger="load, every 1s" hx-swap="outerHTML"{{end}}>232 <ol class="stage-rail" aria-label="Build stages">233 {{range .Stages}}<li class="{{.State}}" data-stage="{{.ID}}"><span aria-hidden="true"></span><b>{{.Label}}</b></li>{{end}}234 </ol>235 {{if .Run.Name}}236 <p class="run-state {{if .Run.Failed}}failed{{else if .Run.Running}}running{{else}}done{{end}}">237 {{if .Run.Running}}Building… safe to leave this page{{else if .Run.Failed}}Build failed{{else}}Build complete{{end}}238 </p>239 <details class="build-log"{{if .Run.Failed}} open{{end}}>240 <summary>Raw diagnostics <span class="dim">{{len .Run.Rows}} rows</span></summary>241 <div id="op-log" class="console" aria-live="polite">242 {{range .Run.Rows}}{{template "op-row" .}}{{end}}243 </div>244 </details>245 {{end}}246 {{if and .Run.Artifact (not .Run.Running) (not .Run.Failed)}}247 <div class="artifact-handoff" draggable="true" data-artifact-handoff248 data-artifact-name="{{.ArtifactName}}" data-artifact-path="{{.Run.Artifact}}">249 <div><span class="file-icon">A</span><b>{{.ArtifactName}}</b><br><span class="dim">Drag this file onto an Atlas window</span></div>250 <a href="/project/inspect">Inspect packed data</a>251 <form method="post" action="/project/open"><button>Open in Atlas</button></form>252 </div>253 {{end}}254</div>255{{end}}