Files: prototype and documentation files on features, with versions. Adding, replacing or removing a file is a feature revision with a change note. Types come from the extension; uploads are capped at 25 MB and stored under opaque paths. Every file URL checks project access, then redirects to a short-lived signed URL on the bucket, or streams with nosniff and a CSP sandbox when no bucket is configured. HTML prototypes run in a sandboxed iframe without same-origin access. Threads: whole-file threads and pins at a point on an image, drawn as an SVG overlay in percentages. Pins are placed with number fields, or by clicking the image with JS. Implementations: name, link and status, plus a per-feature status grid stamped with the feature revision, marked behind when the feature changes, and confirmable without changing the status. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
19 lines
736 B
HTML
19 lines
736 B
HTML
<table>
|
|
<caption class="visually-hidden">{{ caption }} implementations</caption>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">Implementation</th>
|
|
<th scope="col">Link</th>
|
|
<th scope="col">Features</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for impl in impls %}
|
|
<tr>
|
|
<th scope="row"><a href="{% url 'implementations:detail' org_slug=project.org.slug project_slug=project.slug impl_id=impl.pk %}">{{ impl.name }}</a></th>
|
|
<td><a href="{{ impl.url }}" rel="noopener noreferrer">{{ impl.url }}</a></td>
|
|
<td>{% for label, count in impl.summary %}{{ label }}: {{ count }}{% if not forloop.last %}; {% endif %}{% empty %}No features yet{% endfor %}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|