{#- The upload machine, and only that: the versions table above it is described (`crate::quasi::item_files`). This is the bespoke region that panel mounts, which is where markup driven by client-side state belongs -- a queue, a progress bar, a speed readout, a cancel, a retry and an error surface, all of it `static/item-upload.js`. The wrapper keeps its own id and the address to land on when the run finishes: the script reads both, and a described region carries no host dataset. `data-upload-goes` is the same attribute the described uploads already answer to (`static/upload.js`), so the surface names where it goes once rather than the script rebuilding the URL from an item id. Whether this region can be described was counted on 2026-08-30 and the answer is written down in `crate::quasi::item_files`, "Can the uploader move to the description layer?". Short version: the progress surface and the success/error surfaces need no new vocabulary and are the host's to draw already, and the one shape that is missing is a queue of picked files with a field per row. `quasi_router::Repeating` is the near miss and its own docs rule it out; the answer is a ruling in `quasi-router` and `makeover-layout` rather than a change here. -#}
{#- The version number and the notes beside it, described: `crate::quasi::upload_field::version_details`. The grid is this template's, because two questions sitting in two columns is a fact about this panel and not about either question. -#}
{{ crate::quasi::upload_field::version_details()|safe }}
{#- What the queue takes, how many of them, and the help beside it is described: `crate::quasi::upload_field::version_queue`. It carries no destination on purpose, because nothing is sent until Upload All names the version. The picker sits above the rows it fills rather than below them, which is also the order the described field's own label reads in. -#} {{ crate::quasi::upload_field::version_queue()|safe }} {#- A slot per picked file, each named by its file and asking for the label that names its platform: `crate::quasi::upload_field::version_file_queue`. The slots come from the picker above, which is why no add control is drawn. -#} {{ crate::quasi::upload_field::version_file_queue()|safe }} {#- Where the run begins and that it waits: `crate::quasi::upload_field::version_upload_all`. The host makes the calls, so the script finds this control by the address it carries rather than by an id. -#} {{ crate::quasi::upload_field::version_upload_all(item.id.as_str())|safe }}
{#- One described field per version that has no file yet. Each carries its own address, so picking a file uploads it to that version and nothing has to remember which button was pressed. Shown rather than revealed. The reveal was an "Upload File" button in the version's table row that unhid the panel here, and a described cell holds leaves and acts rather than a region to unhide. See `crate::quasi::item_files`, "What the reveal dance cost". -#} {% for version in versions %}{% if !version.has_file %} {#- `data-upload-goes` rather than `data-upload-refreshes`: that one names a control to click, and it named the tab *button* `#tab-files`, which the described strip (`6b24f2df`) stopped emitting. The item's audio upload already lands here the same way. -#}
{{ crate::quasi::upload_field::existing_version(version.id.as_str())|safe }}
{% endif %}{% endfor %}