d86fc93ed6
Why Phone and PC need a single capture flow that ends at inventory PNG and board-foot numbers with no backend, inference, or Woo create. Scope Add frontend/ Vite+Svelte capture UI with Resume, Add photo, Mask, Length axis, and Measure. Mask runs in a worker with Auto/Green/Black and a 2.0s sensitivity debounce. Measure computes scale, widths, sqft, bdft, and a 3:4 alpha inventory PNG. Persist one device draft in IndexedDB. Serve the static build from frontend/Dockerfile via nginx (deploy/nginx-m1.conf). No FastAPI. Verification sudo docker build -f frontend/Dockerfile -t slabuploader-m1 . sudo docker run -d --name slabuploader-m1 -p 0.0.0.0:18080:80 slabuploader-m1 curl http://127.0.0.1:18080/ returns 200 Playwright: synthetic green-sheet photo through Calculate shows sqft/bdft
29 lines
932 B
Svelte
29 lines
932 B
Svelte
<script lang="ts">
|
|
export let onContinue: () => void;
|
|
export let onFresh: () => void;
|
|
</script>
|
|
|
|
<section class="panel">
|
|
<h1>Resume?</h1>
|
|
<p>You have an in-progress slab on this device.</p>
|
|
<div class="row">
|
|
<button class="primary" type="button" on:click={onContinue}>Continue</button>
|
|
<button class="ghost" type="button" on:click={onFresh}>Start fresh</button>
|
|
</div>
|
|
</section>
|
|
|
|
<style>
|
|
.panel { padding: 24px 16px; text-align: center; color: #eee; }
|
|
h1 { font-size: 1.4rem; }
|
|
p { color: #aaa; }
|
|
.row { display: flex; gap: 12px; justify-content: center; margin-top: 24px; }
|
|
.primary {
|
|
flex: 1; max-width: 200px; padding: 14px; font-size: 1.05rem; border-radius: 10px; border: 0;
|
|
background: #00e5ff; color: #002; font-weight: 700;
|
|
}
|
|
.ghost {
|
|
flex: 1; max-width: 200px; padding: 14px; border-radius: 10px; border: 1px solid #444;
|
|
background: transparent; color: #ccc;
|
|
}
|
|
</style>
|