Each group comes from one board. Select a piece for its cutting diagram.
{matches.boardKeys.length ? `${matches.boardKeys.length} matching board${matches.boardKeys.length === 1 ? '' : 's'}` : 'No matching boards or cuts.'}
)}Buy {flooring.boardCount} boards · {wholeFloor.wholeBoards} laid uncut {wholeFloor.readyOffcuts > 0 && ` · ${wholeFloor.readyOffcuts} offcuts need no further cuts`}
{floorStocks.map((stock) => { const key = `floor:${stock.id}`, done = completed.has(key), group = floorGroups.get(stock.id) ?? [], label = group.length ? `cuts ${group.map((piece) => piece.id).join(' + ')}` : 'uncut floorboard'; return ({cutMm(piece.length, piece.blankLength)} ×{' '} {cutMm(piece.width, piece.blankWidth)} mm
{roomName(piece.roomId)} · Row {piece.row}
{piece.reused && ({piece.cut ? 'Cut from the remaining offcut' : 'Use the offcut as it is'}
)}Installed uncut ·{' '} {flooring.pieces .filter((piece) => piece.stockId === stock.id) .map((piece) => roomName(piece.roomId)) .join(', ')}
)}{searching ? 'No matching floorboards.' : flooring.pieces.length ? 'No flooring cuts needed.' : 'Complete the outline and flooring measurements to calculate cuts.'}
)}Buy {skirting.stockCount} lengths ·{' '} {wholeSkirt.reduce((sum, group) => sum + group.count, 0)} installed uncut
{skirtStocks.map((stock) => { const key = `skirting:${stock.id}`, done = completed.has(key), group = skirtGroups.get(stock.id) ?? [], label = group.length ? `cuts ${group.map((piece) => piece.id).join(' + ')}` : 'uncut skirting board'; return ({cutMm(piece.length, piece.blankLength)} mm{' '} long point
{roomName(piece.roomId)} · Wall {piece.wallIndex + 1}
Left: {skirtingEndLabel(piece, 'left')}
Right: {skirtingEndLabel(piece, 'right')}
Installed uncut ·{' '} {skirting.pieces .filter((piece) => piece.stockId === stock.id) .map((piece) => roomName(piece.roomId)) .join(', ')}
)}{searching ? 'No matching skirting boards.' : skirting.pieces.length ? 'No skirting cuts needed.' : 'Complete the outline and skirting measurements to calculate cuts.'}
)}