- commit
- ff6b52303227d6a8d312a309c37759f0c9015b39
- parent
- 2ee41790fc6530b5926b819c4a7bc9c056a7bc3d
- author
- Dami <dami.etoile@gmail.com>
| A | apps/ | 63 | ++++++++++++++++++++++++++++++ |
| M | apps/ | 2 | + |
| M | apps/ | 34 | ++++++++++++++++ |
@@ -0,0 +1,63 @@
1+import { useDeviceCapabilities } from "./use-device-capabilities.ts";2+import { settleUiMutation } from "./ui-mutation.ts";3+4+export default function DeviceStatus() {5+ const { report, requestPersistence } = useDeviceCapabilities();6+ if (!report) return <p class="device-status">Checking durable-storage capabilities…</p>;7+8+ return (9+ <section class="device-status" aria-labelledby="device-status-title">10+ <header>11+ <p class="eyebrow">Device gate</p>12+ <h2 id="device-status-title">13+ {report.durableDriverSupported ? "Durable driver supported" : "Durable driver blocked"}14+ </h2>15+ </header>16+ <dl>17+ <div>18+ <dt>Context</dt>19+ <dd>{report.secureContext ? "secure" : "not secure"}</dd>20+ </div>21+ <div>22+ <dt>OPFS</dt>23+ <dd>{report.opfs ? "available" : "missing"}</dd>24+ </div>25+ <div>26+ <dt>SharedWorker</dt>27+ <dd>{report.sharedWorker ? "available" : "missing"}</dd>28+ </div>29+ <div>30+ <dt>Web Locks</dt>31+ <dd>{report.webLocks ? "available" : "missing"}</dd>32+ </div>33+ <div>34+ <dt>Storage persistence</dt>35+ <dd>{report.persistentPermission}</dd>36+ </div>37+ <div>38+ <dt>Display mode</dt>39+ <dd>{report.displayMode}</dd>40+ </div>41+ <div>42+ <dt>Identity</dt>43+ <dd>device-local key</dd>44+ </div>45+ <div>46+ <dt>Passkey backup</dt>47+ <dd>blocked by alpha security review</dd>48+ </div>49+ </dl>50+ <button type="button" onClick={() => void settleUiMutation(requestPersistence())}>51+ Request storage persistence52+ </button>53+ <p>54+ OPFS capability and eviction protection are separate. A declined persistence request does55+ not mean the Jazz driver is using memory.56+ </p>57+ <p>58+ Clearing site data destroys the device-local identity unless a separate recovery mechanism59+ has been verified. This reference does not claim passkey recovery.60+ </p>61+ </section>62+ );63+}@@ -1,5 +1,6 @@
11 ---22 import ChecklistIsland from "../islands/ChecklistIsland";3+import DeviceStatus from "../_lofi/DeviceStatus";34 import ReferenceShell from "../_lofi/ReferenceShell.astro";45 import "../styles/global.css";56 ---@@ -21,5 +22,6 @@ import "../styles/global.css";
2122 <strong>Identity stays on this device.</strong> Clearing site data removes access because2223 passkey backup and recovery are not enabled in this reference application.2324 </aside>25+ <DeviceStatus client:load />2426 <footer>Thin Preact adapter · static Astro shell · Deno command surface</footer>2527 </ReferenceShell>@@ -65,6 +65,40 @@ h1 {
6565 margin: 0.25rem 0 1.5rem;6666 }6767 68+.device-status {69+ background: #1d2b25;70+ border: 1px solid #3b594c;71+ border-radius: 0.7rem;72+ margin-top: 1rem;73+ padding: 1.4rem;74+}75+76+.device-status h2 {77+ margin: 0.25rem 0 1rem;78+}79+80+.device-status dl {81+ display: grid;82+ gap: 0.5rem;83+ grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));84+}85+86+.device-status dl div {87+ background: #18231f;88+ padding: 0.75rem;89+}90+91+.device-status dt {92+ color: #9bc9b1;93+ font-size: 0.75rem;94+ font-weight: 800;95+ text-transform: uppercase;96+}97+98+.device-status dd {99+ margin: 0.25rem 0 0;100+}101+68102 label {69103 display: block;70104 font-weight: 750;