File "under-bed-storage-fit-checker.php"
Full path: /home/u525140468/domains/productsizer.com/public_html/tools/under-bed-storage-fit-checker.php
File
size: 30.85 B (30.85 KB bytes)
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php include "../autoload.php"; ?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600;700&display=swap');
.gradient-bg {
background: linear-gradient(135deg, #1e40af 0%, #60a5fa 100%);
}
.result-card {
background: linear-gradient(145deg, #ffffff, #f0f7ff);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
transition: transform 0.3s ease, opacity 0.3s ease;
}
.result-card.hidden {
transform: translateY(20px);
opacity: 0;
}
.result-card:not(.hidden) {
transform: translateY(0);
opacity: 1;
}
.input-container {
background: linear-gradient(145deg, #ffffff, #f9fafb);
transition: all 0.3s ease;
}
.input-container:hover {
transform: translateY(-2px);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);
}
.range-input::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 20px;
height: 20px;
background: #1e40af;
border-radius: 50%;
cursor: pointer;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
}
.range-input::-moz-range-thumb {
width: 20px;
height: 20px;
background: #1e40af;
border-radius: 50%;
cursor: pointer;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
}
.btn-primary {
transition: all 0.3s ease;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2);
}
.visual-container {
background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><rect fill="%23f3f4f6" width="100" height="100"/><circle cx="50" cy="50" r="30" fill="%23dbeafe" opacity="0.5"/></svg>') repeat;
border-radius: 12px;
box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.05);
}
select {
appearance: none;
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24"><path fill="%234b5563" d="M7 10l5 5 5-5H7z"/></svg>');
background-repeat: no-repeat;
background-position: right 0.75rem center;
background-size: 12px;
}
</style>
<div class="x">
<div class="x">
<!-- Input Form -->
<div class="mb-12">
<h2 class="text-3xl font-semibold text-gray-800 mb-6">Enter Your Storage & Under-Bed/Sofa Space Details</h2>
<p class="text-gray-500 mb-8 text-lg">Input dimensions to check if your storage bins or drawers fit under the bed or sofa.</p>
<form id="underBedStorageForm" class="space-y-8">
<div class="grid grid-cols-1 md:grid-cols-4 gap-6">
<div class="space-y-3">
<label for="furnitureType" class="block text-sm font-medium text-gray-700">Furniture Type</label>
<div class="relative flex items-center">
<i data-lucide="bed" class="absolute left-4 top-1/2 transform -translate-y-1/2 text-gray-400"></i>
<select id="furnitureType" class="pl-12 pr-10 py-3 block w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-600 focus:ring focus:ring-blue-600 focus:ring-opacity-50 text-lg" required>
<option value="Bed" selected>Bed</option>
<option value="Sofa">Sofa</option>
</select>
</div>
</div>
<div class="space-y-3">
<label for="storageWidth" class="block text-sm font-medium text-gray-700">Storage Width (ft)</label>
<div class="relative flex items-center">
<i data-lucide="box" class="absolute left-4 top-1/2 transform -translate-y-1/2 text-gray-400"></i>
<input type="number" id="storageWidth" class="pl-12 pr-4 py-3 block w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-600 focus:ring focus:ring-blue-600 focus:ring-opacity-50 text-lg" placeholder="2.5" step="0.1" min="1" max="6" value="2.5" required>
</div>
<input type="range" id="storageWidthRange" class="range-input w-full h-2 bg-gray-200 rounded-lg cursor-pointer" min="1" max="6" step="0.1" value="2.5">
<p id="storageWidthValue" class="text-sm text-gray-500">2.5 ft</p>
</div>
<div class="space-y-3">
<label for="storageDepth" class="block text-sm font-medium text-gray-700">Storage Depth (ft)</label>
<div class="relative flex items-center">
<i data-lucide="expand" class="absolute left-4 top-1/2 transform -translate-y-1/2 text-gray-400"></i>
<input type="number" id="storageDepth" class="pl-12 pr-4 py-3 block w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-600 focus:ring focus:ring-blue-600 focus:ring-opacity-50 text-lg" placeholder="2.0" step="0.1" min="1" max="4" value="2.0" required>
</div>
<input type="range" id="storageDepthRange" class="range-input w-full h-2 bg-gray-200 rounded-lg cursor-pointer" min="1" max="4" step="0.1" value="2.0">
<p id="storageDepthValue" class="text-sm text-gray-500">2.0 ft</p>
</div>
<div class="space-y-3">
<label for="storageHeight" class="block text-sm font-medium text-gray-700">Storage Height (ft)</label>
<div class="relative flex items-center">
<i data-lucide="ruler" class="absolute left-4 top-1/2 transform -translate-y-1/2 text-gray-400"></i>
<input type="number" id="storageHeight" class="pl-12 pr-4 py-3 block w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-600 focus:ring focus:ring-blue-600 focus:ring-opacity-50 text-lg" placeholder="0.5" step="0.1" min="0.3" max="1.5" value="0.5" required>
</div>
<input type="range" id="storageHeightRange" class="range-input w-full h-2 bg-gray-200 rounded-lg cursor-pointer" min="0.3" max="1.5" step="0.1" value="0.5">
<p id="storageHeightValue" class="text-sm text-gray-500">0.5 ft</p>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="space-y-3">
<label for="underSpaceWidth" class="block text-sm font-medium text-gray-700">Under-Space Width (ft)</label>
<div class="relative flex items-center">
<i data-lucide="bed-double" class="absolute left-4 top-1/2 transform -translate-y-1/2 text-gray-400"></i>
<input type="number" id="underSpaceWidth" class="pl-12 pr-4 py-3 block w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-600 focus:ring focus:ring-blue-600 focus:ring-opacity-50 text-lg" placeholder="5.0" step="0.1" min="2" max="8" value="5.0" required>
</div>
<input type="range" id="underSpaceWidthRange" class="range-input w-full h-2 bg-gray-200 rounded-lg cursor-pointer" min="2" max="8" step="0.1" value="5.0">
<p id="underSpaceWidthValue" class="text-sm text-gray-500">5.0 ft</p>
</div>
<div class="space-y-3">
<label for="underSpaceDepth" class="block text-sm font-medium text-gray-700">Under-Space Depth (ft)</label>
<div class="relative flex items-center">
<i data-lucide="expand" class="absolute left-4 top-1/2 transform -translate-y-1/2 text-gray-400"></i>
<input type="number" id="underSpaceDepth" class="pl-12 pr-4 py-3 block w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-600 focus:ring focus:ring-blue-600 focus:ring-opacity-50 text-lg" placeholder="2.5" step="0.1" min="1.5" max="5" value="2.5" required>
</div>
<input type="range" id="underSpaceDepthRange" class="range-input w-full h-2 bg-gray-200 rounded-lg cursor-pointer" min="1.5" max="5" step="0.1" value="2.5">
<p id="underSpaceDepthValue" class="text-sm text-gray-500">2.5 ft</p>
</div>
<div class="space-y-3">
<label for="underSpaceHeight" class="block text-sm font-medium text-gray-700">Under-Space Height (ft)</label>
<div class="relative flex items-center">
<i data-lucide="ruler" class="absolute left-4 top-1/2 transform -translate-y-1/2 text-gray-400"></i>
<input type="number" id="underSpaceHeight" class="pl-12 pr-4 py-3 block w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-600 focus:ring focus:ring-blue-600 focus:ring-opacity-50 text-lg" placeholder="0.7" step="0.1" min="0.4" max="2" value="0.7" required>
</div>
<input type="range" id="underSpaceHeightRange" class="range-input w-full h-2 bg-gray-200 rounded-lg cursor-pointer" min="0.4" max="2" step="0.1" value="0.7">
<p id="underSpaceHeightValue" class="text-sm text-gray-500">0.7 ft</p>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-1 gap-6">
<div class="space-y-3">
<label for="clearanceSpace" class="block text-sm font-medium text-gray-700">Clearance for Access (ft)</label>
<div class="relative flex items-center">
<i data-lucide="hand" class="absolute left-4 top-1/2 transform -translate-y-1/2 text-gray-400"></i>
<input type="number" id="clearanceSpace" class="pl-12 pr-4 py-3 block w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-600 focus:ring focus:ring-blue-600 focus:ring-opacity-50 text-lg" placeholder="0.1" step="0.1" min="0.1" max="0.5" value="0.1" required>
</div>
<input type="range" id="clearanceSpaceRange" class="range-input w-full h-2 bg-gray-200 rounded-lg cursor-pointer" min="0.1" max="0.5" step="0.1" value="0.1">
<p id="clearanceSpaceValue" class="text-sm text-gray-500">0.1 ft</p>
</div>
</div>
<button type="submit" class="btn-primary w-full bg-blue-600 text-white py-4 px-8 rounded-xl hover:bg-blue-700 flex items-center justify-center text-lg">
<i data-lucide="search" class="mr-3 h-5 w-5"></i>
Check Under-Bed/Sofa Storage Fit
</button>
</form>
</div>
<!-- Result Section -->
<div id="resultSection" class="result-card rounded-2xl p-10 hidden">
<h2 class="text-3xl font-semibold text-gray-800 mb-6 flex items-center">
<i data-lucide="check-circle-2" class="mr-3 text-green-500 h-7 w-7"></i>
Your Under-Bed/Sofa Storage Fit Assessment
</h2>
<div id="resultOutput" class="text-gray-700 space-y-6 text-base">
<!-- Results will be dynamically inserted here -->
</div>
<div class="mt-10 flex flex-col md:flex-row justify-between items-center gap-6">
<div class="flex items-center text-blue-600">
<i data-lucide="info" class="mr-2 h-5 w-5"></i>
<p class="text-sm font-medium">Based on standard furniture and storage design guidelines.</p>
</div>
<button id="downloadPdf" class="btn-primary bg-green-600 text-white py-3 px-8 rounded-xl hover:bg-green-700 flex items-center text-base">
<i data-lucide="download" class="mr-2 h-5 w-5"></i>
Download PDF Report
</button>
</div>
<!-- Visual Representation -->
<div class="mt-10 visual-container p-8">
<h3 class="text-xl font-medium text-gray-800 mb-4 flex items-center">
<i data-lucide="box" class="mr-3 text-blue-500 h-6 w-6"></i>
Interactive Storage & Under-Bed/Sofa Space Visualization
</h3>
<div class="relative w-full h-96 bg-gray-200 rounded-xl overflow-hidden shadow-lg">
<canvas id="underBedCanvas" class="w-full h-full"></canvas>
</div>
<p class="text-sm text-gray-600 mt-4">Visualization showing the storage bin/drawer under the bed or sofa with clearance for access.</p>
</div>
<!-- Expert Insights -->
<div class="mt-10 bg-blue-50 p-8 rounded-xl shadow-sm">
<h3 class="text-xl font-medium text-gray-800 mb-4 flex items-center">
<i data-lucide="lightbulb" class="mr-3 text-yellow-500 h-6 w-6"></i>
Expert Insights for Under-Bed/Sofa Storage
</h3>
<ul class="list-none space-y-4 text-gray-700 text-sm">
<li class="flex items-start">
<i data-lucide="check" class="mr-2 text-green-500 h-5 w-5"></i>
<span><strong>Clearance:</strong> Allow at least 0.1 ft for easy access and sliding.</span>
</li>
<li class="flex items-start">
<i data-lucide="check" class="mr-2 text-green-500 h-5 w-5"></i>
<span><strong>Height:</strong> Ensure storage height is at least 0.2 ft less than under-space height.</span>
</li>
<li class="flex items-start">
<i data-lucide="check" class="mr-2 text-green-500 h-5 w-5"></i>
<span><strong>Material:</strong> Use sturdy bins or drawers to avoid damage.</span>
</li>
<li class="flex items-start">
<i data-lucide="check" class="mr-2 text-green-500 h-5 w-5"></i>
<span><strong>Accessibility:</strong> Consider wheels or handles for easy retrieval.</span>
</li>
<li class="flex items-start">
<i data-lucide="check" class="mr-2 text-green-500 h-5 w-5"></i>
<span><strong>Space Utilization:</strong> Maximize storage by using multiple smaller bins.</span>
</li>
</ul>
</div>
</div>
</div>
</div>
<script>
// Initialize Lucid Icons
lucide.createIcons();
// Sync range and number inputs
function syncInputs(numberId, rangeId, valueId, unit = 'ft') {
const numberInput = document.getElementById(numberId);
const rangeInput = document.getElementById(rangeId);
const valueDisplay = document.getElementById(valueId);
numberInput.addEventListener('input', () => {
rangeInput.value = numberInput.value;
valueDisplay.textContent = `${parseFloat(numberInput.value).toFixed(1)} ${unit}`;
});
rangeInput.addEventListener('input', () => {
numberInput.value = rangeInput.value;
valueDisplay.textContent = `${parseFloat(rangeInput.value).toFixed(1)} ${unit}`;
});
}
syncInputs('storageWidth', 'storageWidthRange', 'storageWidthValue');
syncInputs('storageDepth', 'storageDepthRange', 'storageDepthValue');
syncInputs('storageHeight', 'storageHeightRange', 'storageHeightValue');
syncInputs('underSpaceWidth', 'underSpaceWidthRange', 'underSpaceWidthValue');
syncInputs('underSpaceDepth', 'underSpaceDepthRange', 'underSpaceDepthValue');
syncInputs('underSpaceHeight', 'underSpaceHeightRange', 'underSpaceHeightValue');
syncInputs('clearanceSpace', 'clearanceSpaceRange', 'clearanceSpaceValue');
// Form Submission
document.getElementById('underBedStorageForm').addEventListener('submit', function (e) {
e.preventDefault();
calculateUnderBedStorageFit();
});
function calculateUnderBedStorageFit() {
const furnitureType = document.getElementById('furnitureType').value;
const storageWidth = parseFloat(document.getElementById('storageWidth').value);
const storageDepth = parseFloat(document.getElementById('storageDepth').value);
const storageHeight = parseFloat(document.getElementById('storageHeight').value);
const underSpaceWidth = parseFloat(document.getElementById('underSpaceWidth').value);
const underSpaceDepth = parseFloat(document.getElementById('underSpaceDepth').value);
const underSpaceHeight = parseFloat(document.getElementById('underSpaceHeight').value);
const clearanceSpace = parseFloat(document.getElementById('clearanceSpace').value);
if (!furnitureType || !storageWidth || !storageDepth || !storageHeight || !underSpaceWidth || !underSpaceDepth || !underSpaceHeight || !clearanceSpace ||
storageWidth < 1 || storageDepth < 1 || storageHeight < 0.3 || underSpaceWidth < 2 || underSpaceDepth < 1.5 || underSpaceHeight < 0.4 || clearanceSpace < 0.1) {
alert('Please enter valid values (Storage Width/Depth ≥ 1 ft, Height ≥ 0.3 ft, Under-Space Width ≥ 2 ft, Depth ≥ 1.5 ft, Height ≥ 0.4 ft, Clearance ≥ 0.1 ft).');
return;
}
// Calculate fit: Storage bin/drawer under bed or sofa with clearance
const totalWidth = storageWidth + (clearanceSpace * 2); // Clearance on both sides
const totalDepth = storageDepth + clearanceSpace; // Clearance at front
const totalHeight = storageHeight + clearanceSpace; // Clearance above
const widthFit = totalWidth <= underSpaceWidth;
const depthFit = totalDepth <= underSpaceDepth;
const heightFit = totalHeight <= underSpaceHeight;
const overallFit = widthFit && depthFit && heightFit ? 'Yes' : 'No';
// Calculate clearances
const widthClearance = underSpaceWidth - storageWidth;
const depthClearance = underSpaceDepth - storageDepth;
const heightClearance = underSpaceHeight - storageHeight;
// Generate output
const output = `
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 bg-white p-6 rounded-xl shadow-sm">
<div>
<p class="font-medium text-gray-700">Furniture Type</p>
<p class="text-xl text-blue-600 font-semibold">${furnitureType}</p>
</div>
<div>
<p class="font-medium text-gray-700">Storage Dimensions</p>
<p class="text-lg">${storageWidth.toFixed(1)} x ${storageDepth.toFixed(1)} x ${storageHeight.toFixed(1)} ft</p>
</div>
<div>
<p class="font-medium text-gray-700">Under-Space Dimensions</p>
<p class="text-lg">${underSpaceWidth.toFixed(1)} x ${underSpaceDepth.toFixed(1)} x ${underSpaceHeight.toFixed(1)} ft</p>
</div>
<div>
<p class="font-medium text-gray-700">Clearance for Access</p>
<p class="text-lg">${clearanceSpace.toFixed(1)} ft</p>
</div>
<div>
<p class="font-medium text-gray-700">Fit Assessment</p>
<p class="text-lg ${overallFit === 'Yes' ? 'text-green-600' : 'text-red-600'} font-semibold">
${overallFit === 'Yes' ? 'Perfect Fit' : 'May Not Fit Comfortably'}
</p>
<p class="text-sm text-gray-600">${
overallFit === 'Yes'
? `The storage fits under the ${furnitureType.toLowerCase()} with ${widthClearance.toFixed(1)} ft width clearance, ${depthClearance.toFixed(1)} ft depth clearance, and ${heightClearance.toFixed(1)} ft height clearance.`
: `Issues: ${
!widthFit ? `Insufficient width clearance (need ≥${totalWidth.toFixed(1)} ft, have ${underSpaceWidth.toFixed(1)} ft). ` : ''
}${
!depthFit ? `Insufficient depth clearance (need ≥${totalDepth.toFixed(1)} ft, have ${underSpaceDepth.toFixed(1)} ft). ` : ''
}${
!heightFit ? `Insufficient height clearance (need ≥${totalHeight.toFixed(1)} ft, have ${underSpaceHeight.toFixed(1)} ft).` : ''
}`
}</p>
</div>
</div>
<div class="bg-blue-50 p-4 rounded-lg">
<p class="text-sm"><span class="font-medium">Tip:</span> Ensure clearance for easy sliding and consider using bins with wheels for accessibility.</p>
</div>
`;
document.getElementById('resultOutput').innerHTML = output;
document.getElementById('resultSection').classList.remove('hidden');
// Draw visualization
drawVisualization(furnitureType, storageWidth, storageDepth, storageHeight, underSpaceWidth, underSpaceDepth, underSpaceHeight, clearanceSpace);
// Setup PDF download
setupPdfDownload(furnitureType, storageWidth, storageDepth, storageHeight, underSpaceWidth, underSpaceDepth, underSpaceHeight, clearanceSpace, overallFit, widthClearance, depthClearance, heightClearance);
}
function drawVisualization(furnitureType, storageWidth, storageDepth, storageHeight, underSpaceWidth, underSpaceDepth, underSpaceHeight, clearanceSpace) {
const canvas = document.getElementById('underBedCanvas');
const ctx = canvas.getContext('2d');
canvas.width = canvas.offsetWidth;
canvas.height = canvas.offsetHeight;
// Clear canvas
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Scale factors
const scale = canvas.width / (underSpaceWidth * 1.5); // Scale to fit canvas
const storageW = storageWidth * scale;
const storageD = storageDepth * scale;
const storageH = storageHeight * scale * 2; // Amplify height for visibility
const underSpaceW = underSpaceWidth * scale;
const underSpaceD = underSpaceDepth * scale;
const underSpaceH = underSpaceHeight * scale * 2;
const clearanceS = clearanceSpace * scale;
// Draw background (room interior)
const gradient = ctx.createLinearGradient(0, 0, 0, canvas.height);
gradient.addColorStop(0, '#e5e7eb');
gradient.addColorStop(1, '#d1d5db');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Draw floor
ctx.fillStyle = 'rgba(120, 113, 108, 0.2)';
ctx.fillRect(0, canvas.height * 0.7, canvas.width, canvas.height * 0.3);
// Draw bed or sofa (perspective view)
ctx.fillStyle = furnitureType === 'Bed' ? '#4b5563' : '#374151';
ctx.beginPath();
ctx.moveTo(canvas.width * 0.2, canvas.height * 0.4);
ctx.lineTo(canvas.width * 0.2 + underSpaceW, canvas.height * 0.4);
ctx.lineTo(canvas.width * 0.2 + underSpaceW * 0.9, canvas.height * 0.4 + underSpaceD);
ctx.lineTo(canvas.width * 0.2 + underSpaceW * 0.1, canvas.height * 0.4 + underSpaceD);
ctx.closePath();
ctx.fill();
// Draw under-space outline
ctx.strokeStyle = '#1e40af';
ctx.lineWidth = 2;
ctx.setLineDash([5, 5]);
ctx.strokeRect(canvas.width * 0.2, canvas.height * 0.4, underSpaceW, underSpaceD);
ctx.fillStyle = '#bfdbfe';
ctx.globalAlpha = 0.3;
ctx.fillRect(canvas.width * 0.2, canvas.height * 0.4, underSpaceW, underSpaceD);
ctx.globalAlpha = 1.0;
ctx.setLineDash([]);
// Draw storage bin/drawer
ctx.shadowColor = 'rgba(0, 0, 0, 0.4)';
ctx.shadowBlur = 15;
ctx.shadowOffsetX = 8;
ctx.shadowOffsetY = 8;
ctx.fillStyle = '#0284c7';
const storageX = canvas.width * 0.2 + clearanceS;
const storageY = canvas.height * 0.4 + (underSpaceD - storageD) / 2;
ctx.fillRect(storageX, storageY, storageW, storageD);
// Draw storage texture
const storageGradient = ctx.createLinearGradient(storageX, storageY, storageX + storageW, storageY + storageD);
storageGradient.addColorStop(0, 'rgba(255, 255, 255, 0.15)');
storageGradient.addColorStop(1, 'rgba(255, 255, 255, 0.05)');
ctx.fillStyle = storageGradient;
ctx.fillRect(storageX + 5, storageY + 5, storageW - 10, storageD - 10);
// Draw side view for height
ctx.fillStyle = '#0284c7';
ctx.fillRect(canvas.width * 0.8, canvas.height * 0.4, storageW * 0.3, storageH);
ctx.fillStyle = '#4b5563';
ctx.fillRect(canvas.width * 0.8, canvas.height * 0.4 - underSpaceH, storageW * 0.3, underSpaceH);
ctx.fillStyle = 'rgba(34, 197, 94, 0.3)';
ctx.fillRect(canvas.width * 0.8, canvas.height * 0.4 - underSpaceH, storageW * 0.3, clearanceS);
// Draw text
ctx.shadowColor = 'transparent';
ctx.fillStyle = '#ffffff';
ctx.font = 'bold 18px Poppins';
ctx.textAlign = 'center';
ctx.fillText(`Storage (${storageWidth.toFixed(1)} x ${storageDepth.toFixed(1)} ft)`, storageX + storageW / 2, storageY + storageD / 2);
ctx.fillStyle = '#1e40af';
ctx.fillText(`Under ${furnitureType} Space (${underSpaceWidth.toFixed(1)} x ${underSpaceDepth.toFixed(1)} ft)`, canvas.width * 0.2 + underSpaceW / 2, canvas.height * 0.4 + underSpaceD / 2 + 20);
ctx.font = '14px Poppins';
ctx.fillStyle = '#4b5563';
ctx.fillText(`Clearance: ${clearanceSpace.toFixed(1)} ft, Height: ${storageHeight.toFixed(1)} ft`, canvas.width / 2, canvas.height - 30);
}
function setupPdfDownload(furnitureType, storageWidth, storageDepth, storageHeight, underSpaceWidth, underSpaceDepth, underSpaceHeight, clearanceSpace, overallFit, widthClearance, depthClearance, heightClearance) {
document.getElementById('downloadPdf').onclick = function () {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
// Header
doc.setFont('helvetica', 'bold');
doc.setFontSize(20);
doc.setTextColor(31, 64, 175);
doc.text(`HomeFit Tools - Under-${furnitureType} Storage Fit Assessment Report`, 20, 20);
doc.setFont('helvetica', 'normal');
doc.setFontSize(10);
doc.setTextColor(100, 100, 100);
doc.text(`Generated on: ${new Date().toLocaleString()}`, 20, 28);
// Results
doc.setFontSize(14);
doc.setTextColor(0, 0, 0);
doc.text(`Your Under-${furnitureType} Storage Fit Assessment`, 20, 40);
doc.setFontSize(11);
doc.text(`Furniture Type: ${furnitureType}`, 20, 50);
doc.text(`Storage Dimensions: ${storageWidth.toFixed(1)} x ${storageDepth.toFixed(1)} x ${storageHeight.toFixed(1)} ft`, 20, 58);
doc.text(`Under-Space Dimensions: ${underSpaceWidth.toFixed(1)} x ${underSpaceDepth.toFixed(1)} x ${underSpaceHeight.toFixed(1)} ft`, 20, 66);
doc.text(`Clearance for Access: ${clearanceSpace.toFixed(1)} ft`, 20, 74);
doc.text(`Fit Assessment: ${overallFit === 'Yes' ? 'Perfect Fit' : 'May Not Fit Comfortably'}`, 20, 82);
doc.text(`Clearances: ${widthClearance.toFixed(1)} ft (width), ${depthClearance.toFixed(1)} ft (depth), ${heightClearance.toFixed(1)} ft (height)`, 20, 90);
doc.text(`Recommendation: ${
overallFit === 'Yes'
? `The storage fits well under the ${furnitureType.toLowerCase()}.`
: `Consider smaller storage or a higher ${furnitureType.toLowerCase()}.`
}`, 20, 98);
// Expert Insights
doc.setFont('helvetica', 'bold');
doc.setFontSize(12);
doc.text('Expert Insights', 20, 110);
doc.setFont('helvetica', 'normal');
doc.setFontSize(10);
doc.text('• Clearance: Allow at least 0.1 ft for easy access and sliding.', 20, 118);
doc.text('• Height: Ensure storage height is at least 0.2 ft less than under-space height.', 20, 126);
doc.text('• Material: Use sturdy bins or drawers to avoid damage.', 20, 134);
doc.text('• Accessibility: Consider wheels or handles for easy retrieval.', 20, 142);
doc.text('• Space Utilization: Maximize storage by using multiple smaller bins.', 20, 150);
doc.save(`HomeFit_Under_${furnitureType}_Storage_Fit_Assessment.pdf`);
};
}
</script>