1{{/*2 import — one import's progress, as the one row it is.34 A hundred-megabyte bundle takes long enough that silence reads as failure,5 so the answer is a stream rather than one answer at the end: the handler6 renders this region again, and flushes it, for every state a run reaches7 (internal/app/importing.go). Each render replaces the last -- the `import`8 partial target is an outerMorph over this section -- so what the reader sees9 is one row changing its mind, not a growing list, and the section itself is10 the same element throughout, which is what lets `aria-live` announce the11 changes to a reader who is not watching the corner.1213 The row's id carries the run's number: within a run the morph finds the same14 element and updates it, and a second run brings a different element, which15 is how its dismissal starts over instead of inheriting one that has already16 played out.1718 With no rows the section renders itself away. That is a first paint, where19 no import has happened yet -- and it is also how a cancelled picker leaves:20 the handler's last word is this region with nothing in it.21*/}}22{{define "import"}}<section id="atlas-import" class="import-rows" aria-live="polite"{{if not .Rows}} hidden{{end}}>{{range .Rows}}<p id="atlas-import-run-{{.Run}}" class="import-row{{if .Fading}} import-row-fading{{end}}" data-state="{{.State}}">{{.Detail}}</p>{{end}}</section>23{{end}}