{photosReady ? 'Photos ready' : 'Measure'}

{#if !photosReady}

Line up the slab with the black line, then enter length, thickness, and species.

Tilt

setTilt(Number(e.currentTarget.value))} /> {tiltShown}°

Zoom

setTape({ ...tape, zoom: Number(e.currentTarget.value) / 100 })} /> {Math.round(tape.zoom * 100)}%

Frame fill

onFill(Number(e.currentTarget.value))} /> {Math.round(cropFill * 100)}%
Length (in)
Thickness
{#if !speciesOptsReady} {:else} {/if} {#if speciesLoadErr}

{speciesLoadErr}

{/if}
{:else if state.results}
Widths (avg {fmtEighths(state.results.widths.avg)}){fmtEighths(state.results.widths.min)} – {fmtEighths(state.results.widths.max)}
Square feet{state.results.sqft.toFixed(2)}
Board feet{state.results.bdft.toFixed(2)}
Species{speciesOpts.find((o) => o.id === state.speciesId)?.name ?? (state.speciesId != null ? `#${state.speciesId}` : '—')}
{#if state.results.sourceBelowBlock} {:else if state.results.sourceBelowWarn}
This photo is a bit small. A closer shot will look sharper on the listing.
{/if}
    {#each lineupItems as item, i (i)} {#if item.kind === 'png'}
  1. {photosReadyPngAlt(item)} {#if item.role === 'calibration'} Reference photo {:else if item.role === 'overlay'} Photo with measurements {:else} Photo {(item.batchIndex ?? 0) + 1} {/if} {#if item.warn} {item.warn} {/if}
  2. {:else} {/if} {/each}
{#if lineupItems.length === 0 && pngUrl && !state.results.sourceBelowBlock}
Listing photo
{/if}
{#if onContinue} {/if}
{/if}