��<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Made to Measure Wardrobes | Cardiff & Caerphilly Carpentry</title> <meta name="description" content="Professional skirting and decking installation in Cardiff & Caerphilly. Feather edge, panel skirting, composite decking, and bespoke gates. heavy duty Installation guarantees."> <meta name="keywords" content="Carpenter, Carpentry, Kitchen & Bathroom Fitting, Bespoke Furniture, Wardrobes, Door Hanging, Decking, Wood Flooring, Property Maintenance, Timber Repair, Cladding, Laminate Flooring, City & Guilds Qualified, Carpenter Cardiff, Carpentry Cardiff, Kitchen & Bathroom Fitting Cardiff, Bespoke Furniture Cardiff, Wardrobes Cardiff, Door Hanging Cardiff, Decking Cardiff, Wood Flooring Cardiff, Property Maintenance Cardiff, Timber Repair Cardiff, Cladding Cardiff, Laminate Flooring Cardiff, City & Guilds Qualified Cardiff, Carpenters Cardiff"> <!-- Fonts --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Outfit:wght@500;700;800&display=swap" rel="stylesheet"> <!-- Icons --> <script src="https://unpkg.com/lucide@latest"></script> <!-- Styles --> <link rel="stylesheet" href="css/styles.css?v=3"> <!-- Schema.org JSON-LD --> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Carpenter", "name": "Cardiff & Caerphilly Carpentry", "image": "https://www.cardiffandcaerphillycarpentry.com/assets/images/staircase-renovation.png", "url": "https://www.cardiffandcaerphillycarpentry.com/under-stairs-storage.html", "telephone": "07803083422", "priceRange": "�%��%�", "address": { "@type": "PostalAddress", "addressLocality": "Cardiff", "addressRegion": "Wales", "addressCountry": "UK" }, "geo": { "@type": "GeoCoordinates", "latitude": 51.4816, "longitude": -3.1791 }, "openingHoursSpecification": { "@type": "OpeningHoursSpecification", "dayOfWeek": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ], "opens": "08:00", "closes": "18:00" }, "areaServed": [ "Cardiff", "Caerphilly", "Newport", "Penarth", "Barry", "South Wales" ] } </script> <link rel="canonical" href="https://www.cardiffandcaerphillycarpentry.com/under-stairs-storage.html"> </head> <body> <!-- Emergency Top Bar --> <div class="emergency-top-bar"> <i data-lucide="alert-triangle" size="14"></i> <span>24/7 Emergency Call-Outs: On-Site Within 90 Mins</span> <a href="multi-trade.html">View Trades</a> </div> <!-- Header --> <header class="header"> <div class="container header-container"> <a href="index.html" class="logo"> <i data-lucide="ruler" class="text-primary"></i> <span>Cardiff & Caerphilly <span class="text-accent">Carpentry</span></span> </a> <nav class="nav-links"> <a href="index.html">Home</a> <div class="dropdown"> <a href="services.html" class="dropdown-toggle">Services <i data-lucide="chevron-down" size="16"></i></a> <div class="dropdown-menu"> <a href="garden-rooms.html" class="dropdown-item">Garden Rooms & Sheds</a> <a href="kitchen-fitting.html" class="dropdown-item">Kitchen & Bathroom Fitting</a> <a href="bespoke-furniture.html" class="dropdown-item">Bespoke Furniture</a> <a href="under-stairs-storage.html" class="dropdown-item">Under Stairs Storage</a> <a href="media-walls.html" class="dropdown-item">Media Walls</a> <a href="wardrobes.html" class="dropdown-item">Wardrobes & Joinery</a> <a href="alcove-storage.html" class="dropdown-item">Alcove Storage</a> <a href="wall-paneling.html" class="dropdown-item">Wall Paneling</a> <a href="electric-fires.html" class="dropdown-item">Electric Fires</a> <a href="multi-trade.html" class="dropdown-item" style="color: #dc2626; font-weight: 600;"><i data-lucide="alert-triangle" size="14" style="margin-right: 4px; vertical-align: middle;"></i>Emergency & Multi-Trade</a> <a href="services.html" class="dropdown-item" style="border-top: 1px solid #eee; margin-top: 0.25rem; font-weight: 600;">View All Services</a> </div> </div> <a href="about-us.html">About Us</a> <a href="blog.html">Blog</a> <a href="news.html">Weekly Updates</a> <a href="contact.html">Contact</a> <form class="nav-search" action="search.html" method="GET" style="display:flex; align-items:center; margin-left:1rem; position:relative;"> <input type="text" name="q" placeholder="Search products..." style="padding: 0.6rem 2.5rem 0.6rem 1rem; border-radius: 25px; border: 1px solid #e5e5e5; background: #fdfbf7; font-family: 'Inter', sans-serif; font-size: 0.95rem; width: 220px; transition: border-color 0.3s, box-shadow 0.3s;" onfocus="this.style.borderColor='#1c1917'; this.style.boxShadow='0 0 0 2px rgba(28,25,23,0.1)';" onblur="this.style.borderColor='#e5e5e5'; this.style.boxShadow='none';" required> <button type="submit" aria-label="Search" style="position:absolute; right:12px; background:none; border:none; color:#57534e; cursor:pointer; display:flex; align-items:center; justify-content:center; padding:0; transition: color 0.3s;" onmouseover="this.style.color='#1c1917';" onmouseout="this.style.color='#57534e';"><i data-lucide="search" size="18"></i></button> </form> </nav> <div class="cta-group"> <a href="javascript:void(0)" onclick="window.openChatWindow()" class="btn" style="background-color: var(--color-primary-dark); color: white !important; border: 1px solid var(--color-accent); padding: 0.5rem 1rem; margin-right: 0.5rem; display: inline-flex; align-items: center; gap: 0.5rem; border-radius: 99px; font-weight: 600; text-decoration: none;"> <i data-lucide="message-square" size="16"></i> <span class="desktop-only text-sm">Live AI Chat</span> </a> <a href="tel:07803083422" class="btn btn-primary" style="padding: 0.5rem 1rem; white-space: nowrap;"> <i data-lucide="phone" size="18" style="margin-right: 0.5rem; vertical-align: middle;"></i> 07803 083422 </a> <button class="mobile-toggle"> <i data-lucide="menu"></i> </button> </div> </div> </header> <!-- Hero Section --> <section id="home" class="hero" style="background: linear-gradient(rgba(0,0,0,0.6), rgba(0,0,0,0.6)), url('assets/images/staircase-renovation.png'); background-size: cover; background-position: center;"> <div class="container"> <div class="hero-content animate-fade-in" style="max-width: 800px; margin: 0 auto; text-align: center; display: flex; flex-direction: column; align-items: center;"> <div class="hero-title-wrapper" style="width: 100%; display: block !important;"> <h1><span class="text-accent">STORAGE</span> SOLUTIONS</h1> <span class="text-accent" style="font-size: 0.8em; display: block; margin-top: 0.5rem;">Storage solutions Cardiff and South Wales.</span> <p style="font-size: 1.25rem; margin-bottom: 2rem; color: #f8fafc; font-weight: 500; max-width: 600px; margin-left: auto; margin-right: auto; text-align: center;"> Secure your property and extend your living space. We supply and install high-quality timber skirting, gates, and durable decking systems.</p> <div class="hero-actions" style="justify-content: center;"> <a href="https://tradevaultai-production-5bf2.up.railway.app/enquiry" class="btn btn-primary">Get A Quote</a> <a href="#services" class="btn btn-accent">View Options</a> </div> </div> </div> </section> <!-- HTML/CSS Visual Configurator --> <style> .us-viz-container { width: 100%; max-width: 600px; margin: 2rem auto; position: relative; background: #f1f5f9; border-radius: 8px; overflow: hidden; border: 2px solid #e2e8f0; display: none; box-shadow: inset 0 2px 10px rgba(0, 0, 0, 0.05); } .us-viz-shape { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: #e2e8f0; z-index: 10; /* Default slope, overridden by JS */ clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); } .us-viz-grid { position: relative; z-index: 5; display: grid; width: 100%; } .us-viz-col { position: relative; height: 100%; background: #ffffff; cursor: pointer; transition: background 0.2s; display: flex; flex-direction: column; justify-content: flex-end; padding: 2%; gap: 2%; } .us-viz-col:hover { background: #f8fafc; } .us-door { background: #e0e7ff; flex-grow: 1; border: 1px solid #c7d2fe; border-radius: 4px; display: flex; align-items: flex-end; justify-content: center; padding-bottom: 1.5rem; font-size: 0.75rem; font-weight: bold; color: #4f46e5; text-align: center; } .us-drawer { background: #dbeafe; min-height: 25%; max-height: 33%; border: 1px solid #bfdbfe; border-radius: 4px; display: flex; align-items: center; justify-content: center; font-size: 0.7rem; font-weight: bold; color: #2563eb; } .us-tall-drawer { background: #dbeafe; flex-grow: 1; border: 1px solid #bfdbfe; border-radius: 4px; display: flex; align-items: center; justify-content: center; font-size: 0.75rem; font-weight: bold; color: #2563eb; text-align: center; } .us-indicators-container { display: none; flex-direction: row; flex-wrap: wrap; gap: 2rem; width: 100%; justify-content: center; } .us-indicator-box { flex: 1 1 200px; min-width: 200px; max-width: 280px; background: white; border: 2px solid #e2e8f0; border-radius: 8px; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 1rem 0.5rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); text-align: center; transition: transform 0.2s, box-shadow 0.2s; } .us-indicator-box:hover { transform: translateY(-2px); box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } </style> <section id="builder" class="section-padding" style="background-color: #fdfbf7;"> <div class="container"> <div class="section-title text-center"> <h2>Design Your <span class="text-accent">Under Stairs</span> Instantly</h2> <p>Enter your exact dimensions and click the graphic to build your layout.</p> </div> <div class="builder-container" style="max-width: 900px; margin: 2rem auto; background: white; border-radius: 12px; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); overflow: hidden;"> <div style="padding: 2rem;"> <!-- Step 1: Exact Dimensions --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 1rem; margin-bottom: 2rem;"> <div> <label style="font-size:0.85rem; font-weight:600; color:#475569;">High Wall Side</label> <select id="us-side" class="us-dim" style="width:100%; padding:0.6rem; border:1px solid #cbd5e1; border-radius:4px; background:white;"> <option value="left">Left</option> <option value="right">Right</option> </select> </div> <div> <label style="font-size:0.85rem; font-weight:600; color:#475569;">Max Height (mm)</label> <input type="number" id="us-high" class="us-dim" placeholder="e.g. 2400" style="width:100%; padding:0.6rem; border:1px solid #cbd5e1; border-radius:4px;"> </div> <div> <label style="font-size:0.85rem; font-weight:600; color:#475569;">Min Height (mm)</label> <input type="number" id="us-low" class="us-dim" placeholder="e.g. 600" style="width:100%; padding:0.6rem; border:1px solid #cbd5e1; border-radius:4px;"> </div> <div> <label style="font-size:0.85rem; font-weight:600; color:#475569;">Total Width (mm)</label> <input type="number" id="us-width" class="us-dim" placeholder="e.g. 1800" style="width:100%; padding:0.6rem; border:1px solid #cbd5e1; border-radius:4px;"> </div> <div> <label style="font-size:0.85rem; font-weight:600; color:#475569;">Depth (mm)</label> <input type="number" id="us-depth" class="us-dim" placeholder="e.g. 900" style="width:100%; padding:0.6rem; border:1px solid #cbd5e1; border-radius:4px;"> </div> </div> <!-- Step 2: The Visual Interactive Canvas --> <div style="padding: 2rem; background: #f8fafc; border: 1px dashed #cbd5e1; border-radius: 8px; text-align: center;"> <div id="us-visual-prompt" style="color: #64748b; font-weight: 500;"> Please enter your Area Height and Width above to generate your stairs. </div> <!-- Dynamic CSS Grid Container --> <div style="display: flex; flex-direction: column; gap: 2.5rem; align-items: center; justify-content: center; max-width: 100%;"> <!-- The Stairs Canvas --> <div id="us-visual-grid" class="us-viz-container" style="flex-grow: 1; min-width: 280px; max-width: 600px;"> <div id="us-cols-wrapper" class="us-viz-grid"> <!-- JS Injects columns here --> </div> <!-- This overlays the top diagonal to hide the square top --> <div id="us-shape-overlay" class="us-viz-shape" style="pointer-events: none; background: white;"></div> </div> <!-- Design / Colour Indicators --> <div id="us-indicators" class="us-indicators-container" style="display: none;"> <!-- Door Design Indicator --> <div class="us-indicator-box"> <div style="font-size: 0.75rem; font-weight: 700; color: #64748b; text-transform: uppercase; margin-bottom: 0.5rem; letter-spacing: 0.5px;"> Design</div> <div style="display: flex; align-items: center; justify-content: space-between; width: 100%;"> <button type="button" onclick="cycleOption('us-style', -1)" style="padding: 0.25rem; color: #94a3b8; cursor: pointer; border-radius: 50%;" onmouseover="this.style.background='#f1f5f9'" onmouseout="this.style.background='none'"> <i data-lucide="chevron-left" style="width: 20px; height: 20px;"></i> </button> <div id="ind-door-icon" style="flex-grow: 1; display: flex; align-items: center; justify-content: center; cursor: pointer;" onclick="try { document.getElementById('us-style').showPicker(); } catch(e) { document.getElementById('us-style').focus(); }" title="Click to view all list"> <!-- JS will inject an icon or image here --> <i data-lucide="layout-template" style="width: 40px; height: 40px; color: #94a3b8;"></i> </div> <button type="button" onclick="cycleOption('us-style', 1)" style="padding: 0.25rem; color: #94a3b8; cursor: pointer; border-radius: 50%;" onmouseover="this.style.background='#f1f5f9'" onmouseout="this.style.background='none'"> <i data-lucide="chevron-right" style="width: 20px; height: 20px;"></i> </button> </div> <div id="ind-door-name" style="font-size: 0.8rem; font-weight: 600; color: #1e293b; margin-top: 0.5rem;"> Select Style</div> </div> <!-- Colour Finish Indicator --> <div class="us-indicator-box"> <div style="font-size: 0.75rem; font-weight: 700; color: #64748b; text-transform: uppercase; margin-bottom: 0.5rem; letter-spacing: 0.5px;"> Colour</div> <div style="display: flex; align-items: center; justify-content: space-between; width: 100%;"> <button type="button" onclick="cycleOption('us-finish', -1)" style="padding: 0.25rem; color: #94a3b8; cursor: pointer; border-radius: 50%;" onmouseover="this.style.background='#f1f5f9'" onmouseout="this.style.background='none'"> <i data-lucide="chevron-left" style="width: 20px; height: 20px;"></i> </button> <div style="cursor: pointer;" onclick="try { document.getElementById('us-finish').showPicker(); } catch(e) { document.getElementById('us-finish').focus(); }" title="Click to view all list"> <div id="ind-color-swatch" style="width: 80px; height: 80px; border-radius: 50%; background: #f1f5f9; border: 2px solid #cbd5e1; box-shadow: inset 0 2px 4px rgba(0,0,0,0.1);"> </div> </div> <button type="button" onclick="cycleOption('us-finish', 1)" style="padding: 0.25rem; color: #94a3b8; cursor: pointer; border-radius: 50%;" onmouseover="this.style.background='#f1f5f9'" onmouseout="this.style.background='none'"> <i data-lucide="chevron-right" style="width: 20px; height: 20px;"></i> </button> </div> <div id="ind-color-name" style="font-size: 0.8rem; font-weight: 600; color: #1e293b; margin-top: 0.5rem;"> Select Finish</div> </div> </div> </div> <p style="font-size: 0.8rem; color:#94a3b8; margin-top:1rem;">* Click on each generated column below the stairs to toggle between Cupboards, Drawers, & Tall Drawers.</p> </div> <!-- Step 3: Finish & Style --> <div style="margin-top: 2rem; border-top: 1px solid #e2e8f0; padding-top: 1.5rem;"> <div style="display: flex; justify-content: space-between; align-items: baseline; flex-wrap: wrap; margin-bottom: 1rem;"> <label style="display: block; font-size: 0.95rem; font-weight: 700; color: #1e293b;">Door Style & Finish</label> <a href="assets/cardiff-caerphilly-carpentry-brochure.pdf" target="_blank" style="font-size: 0.85rem; color: var(--color-accent); font-weight: 600; text-decoration: none; display: flex; align-items: center; gap: 0.25rem;"> <i data-lucide="book-open" style="width: 14px; height: 14px;"></i> View Full Catalogue & Colours </a> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1.5rem;"> <div> <label style="display: block; font-size: 0.9rem; font-weight: 600; color: #475569; margin-bottom: 0.5rem;">Door Style</label> <select id="us-style" class="w-100 p-2 border rounded text-slate-700 focus:outline-none focus:border-blue-500"> <option value="alaska">Alaska</option> <option value="allerford">Allerford</option> <option value="amalfi">Amalfi</option> <option value="amsterdam">Amsterdam</option> <option value="annabelle">Annabelle</option> <option value="aria">Aria</option> <option value="ashford">Ashford</option> <option value="athlone">Athlone</option> <option value="auckland">Auckland</option> <option value="barnbrook">Barnbrook</option> <option value="basel">Basel</option> <option value="bastille">Bastille</option> <option value="berwick">Berwick</option> <option value="bonn">Bonn</option> <option value="bourbon">Bourbon</option> <option value="calcutta">Calcutta</option> <option value="capital_arch">Capital Arch</option> <option value="capital_square">Capital Square</option> <option value="carmen">Carmen</option> <option value="cathedral_single">Cathedral Single</option> <option value="chatham">Chatham</option> <option value="chelsea">Chelsea</option> <option value="conway">Conway</option> <option value="cutler">Cutler</option> <option value="danforth">Danforth</option> <option value="ealing">Ealing</option> <option value="ella">Ella</option> <option value="euroline">Euroline</option> <option value="fenwick">Fenwick</option> <option value="frankfurt">Frankfurt</option> <option value="galaxy">Galaxy</option> <option value="gibson">Gibson</option> <option value="hariette_single">Hariette Single</option> <option value="harlem">Harlem</option> <option value="hazel">Hazel</option> <option value="hillwell">Hillwell</option> <option value="horton">Horton</option> <option value="jaypull">Jaypull</option> <option value="jones">Jones</option> <option value="kassel">Kassel</option> <option value="lanark">Lanark</option> <option value="lane">Lane</option> <option value="lena">Lena</option> <option value="leon">Leon</option> <option value="lincoln">Lincoln</option> <option value="loretto">Loretto</option> <option value="madrid">Madrid</option> <option value="marino">Marino</option> <option value="mason">Mason</option> <option value="melrose">Melrose</option> <option value="mercury">Mercury</option> <option value="mila">Mila</option> <option value="mona">Mona</option> <option value="monza">Monza</option> <option value="neptune">Neptune</option> <option value="newport">Newport</option> <option value="olivia">Olivia</option> <option value="orion">Orion</option> <option value="oslo">Oslo</option> <option value="pembrook">Pembrook</option> <option value="rana">Rana</option> <option value="rathlin">Rathlin</option> <option value="salisbury">Salisbury</option> <option value="savon">Savon</option> <option value="saxon_arch">Saxon Arch</option> <option value="saxon_square">Saxon Square</option> <option value="seymour">Seymour</option> <option value="shepford">Shepford</option> <option value="shutter_groove">Shutter Groove</option> <option value="siesta">Siesta</option> <option value="st_ives">St Ives</option> <option value="taunton">Taunton</option> <option value="trenton">Trenton</option> <option value="verona">Verona</option> <option value="vilo">Vilo</option> <option value="washington">Washington</option> <option value="welsford">Welsford</option> <option value="westbury">Westbury</option> <option value="windsor">Windsor</option> <option value="woking">Woking</option> </select> </div> <div> <label style="display: block; font-size: 0.9rem; font-weight: 600; color: #475569; margin-bottom: 0.5rem;">Paint Finish</label> <select id="us-finish" class="us-cfg" style="width: 100%; padding: 0.75rem; border: 1px solid #e2e8f0; border-radius: 6px;"> <!-- Dynamically populated by JS from ALL_COLOURS array --> </select> </div> <div> <label style="display: block; font-size: 0.9rem; font-weight: 600; color: #475569; margin-bottom: 0.5rem;">Material Finish Level</label> <select id="us-finish-level" class="us-cfg" style="width: 100%; padding: 0.75rem; border: 2px solid var(--color-accent); border-radius: 6px; background-color: #f8fafc; font-weight: 600; color: var(--color-accent); cursor: pointer; box-shadow: 0 2px 4px rgba(0,0,0,0.05);"> <option value="fully_finished">Fully Finished (Standard)</option> <option value="fronts_only">Fronts Finished, Inside Unfinished (-20% Materials) </option> <option value="unfinished">Unfinished / Bare MDF (-30% Materials)</option> </select> </div> </div> <!-- Step 4: Add-ons --> <div style="margin-top: 2rem; padding: 1.5rem; background: #fdfbf7; border: 1px solid #e2e8f0; border-radius: 8px;"> <label style="display: block; font-size: 0.95rem; font-weight: 700; color: #1e293b; margin-bottom: 1rem;">Premium Add-ons</label> <div style="display: flex; flex-wrap: wrap; gap: 1.5rem;"> <label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer; font-size: 0.9rem; color: #475569;" title="Removal of existing skirting, plaster patch-ups, framing adjustments"> <input type="checkbox" id="us-addon-prep" class="us-addon" style="width: 1.2rem; height: 1.2rem; accent-color: var(--color-accent);"> <span id="us-label-prep">Prep Work (+,%�150)</span> </label> <label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer; font-size: 0.9rem; color: #475569;"> <input type="checkbox" id="us-addon-lighting" class="us-addon" style="width: 1.2rem; height: 1.2rem; accent-color: var(--color-accent);"> Integrated Sensor Lighting (+,%�150) </label> <label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer; font-size: 0.9rem; color: #475569;"> <input type="checkbox" id="us-addon-rails" class="us-addon" style="width: 1.2rem; height: 1.2rem; accent-color: var(--color-accent);"> Pull-Out Coat Rails (+,%�80) </label> </div> </div> </div> <!-- Results Block --> <div id="us-result-box" style="display: none; background: #1e293b; color: white; padding: 2rem; border-top: 4px solid var(--color-accent);"> <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 1rem;"> <div> <div style="font-size: 0.85rem; text-transform: uppercase; letter-spacing: 1px; color: #94a3b8; font-weight: 700; margin-bottom: 0.5rem;"> Total Configuration Price</div> <div id="us-total-price" style="font-size: 2.5rem; font-weight: 800; color: white;"> ,%�0.00 </div> </div> <div style="text-align: right; margin-left: auto;"> <!-- File upload for Formal Quote --> <div style="margin-bottom: 0.5rem; text-align: left;"> <label style="font-size: 0.75rem; color:#cbd5e1;">Attach Space Photos (Optional)</label> <input type="file" multiple accept="image/*" style="width: 100%; font-size:0.75rem;"> </div> <button type="button" id="us-submit-btn" class="btn btn-primary" style="background: white; color: #1e293b; border: none; width:100%;">Submit For Formal Quote</button> </div> </div> <div id="us-price-breakdown" style="margin-top: 1.5rem; padding-top: 1.5rem; border-top: 1px solid rgba(255,255,255,0.1);"> <!-- Details injected by JS --> </div> </div> </div> </div> </section> \n <!-- E-Commerce Product Gallery Section --> <section class="products-section section-padding" style="background-color: var(--color-surface);"> <div class="container"> <div class="section-title text-center"> <h2>Our <span class="text-accent">Under Stairs</span> Solutions</h2> <p>Unlock the hidden potential of your home with custom under stairs storage designed specifically for Cardiff properties.</p> </div> <div class="grid" style="margin-top: 3rem;"> <!-- Product 1 --> <article class="card"> <div class="card-image" style="position: relative;"> <img src="assets/images/under-stairs-pull-out.png" loading="lazy" alt="Pull-out Shoe Drawers"> <div class="price-badge" style="position: absolute; top: 15px; right: 15px; background: var(--color-accent); color: white; padding: 0.5rem 1rem; border-radius: 20px; font-weight: bold; box-shadow: 0 4px 10px rgba(0,0,0,0.2);"> From �%�850</div> </div> <div class="card-content" style="text-align: center; display: flex; flex-direction: column; justify-content: space-between;"> <div> <h3>Pull-Out Master Drawers</h3> <p>Heavy-duty soft close runners holding up to 50kg per drawer. Ideal for hiding the family's muddy shoes and boots.</p> </div> <a href="contact.html" class="btn btn-primary" style="width: 100%; margin-top: 1.5rem;">Enquire Now</a> </div> </article> <!-- Product 2 --> <article class="card"> <div class="card-image" style="position: relative;"> <img src="assets/images/under-stairs-office.png" loading="lazy" alt="Home Office Nook"> <div class="price-badge" style="position: absolute; top: 15px; right: 15px; background: var(--color-accent); color: white; padding: 0.5rem 1rem; border-radius: 20px; font-weight: bold; box-shadow: 0 4px 10px rgba(0,0,0,0.2);"> From �%�1,200</div> </div> <div class="card-content" style="text-align: center; display: flex; flex-direction: column; justify-content: space-between;"> <div> <h3>The Hidden Office Nook</h3> <p>A compact, fully functional home office equipped with hidden cable management, LED lighting, and an oak veneer desk.</p> </div> <a href="contact.html" class="btn btn-primary" style="width: 100%; margin-top: 1.5rem;">Enquire Now</a> </div> </article> <!-- Product 3 --> <article class="card"> <div class="card-image" style="position: relative;"> <img src="assets/images/under-stairs-open.png" loading="lazy" alt="Open Shelving Display"> <div class="price-badge" style="position: absolute; top: 15px; right: 15px; background: var(--color-accent); color: white; padding: 0.5rem 1rem; border-radius: 20px; font-weight: bold; box-shadow: 0 4px 10px rgba(0,0,0,0.2);"> From �%�600</div> </div> <div class="card-content" style="text-align: center; display: flex; flex-direction: column; justify-content: space-between;"> <div> <h3>Open Display Shelving</h3> <p>Beautiful floating shelves styled perfectly into the angled alcove for displaying trailing plants, books, or family photos.</p> </div> <a href="contact.html" class="btn btn-primary" style="width: 100%; margin-top: 1.5rem;">Enquire Now</a> </div> </article> <!-- Product 4 --> <article class="card"> <div class="card-image" style="position: relative;"> <img src="assets/images/under-stairs-wine.png" loading="lazy" alt="Bespoke Wine Storage"> <div class="price-badge" style="position: absolute; top: 15px; right: 15px; background: var(--color-accent); color: white; padding: 0.5rem 1rem; border-radius: 20px; font-weight: bold; box-shadow: 0 4px 10px rgba(0,0,0,0.2);"> From �%�1,500</div> </div> <div class="card-content" style="text-align: center; display: flex; flex-direction: column; justify-content: space-between;"> <div> <h3>The Sommelier Cellar</h3> <p>Custom wine racking carved seamlessly under the stairs, complete with backlit glass doors and space for a drinks cooler.</p> </div> <a href="contact.html" class="btn btn-primary" style="width: 100%; margin-top: 1.5rem;">Enquire Now</a> </div> </article> <!-- Product 5 --> <article class="card"> <div class="card-image" style="position: relative;"> <img src="assets/images/under-stairs-wardrobe.png" loading="lazy" alt="Coat & Boot Room Rack"> <div class="price-badge" style="position: absolute; top: 15px; right: 15px; background: var(--color-accent); color: white; padding: 0.5rem 1rem; border-radius: 20px; font-weight: bold; box-shadow: 0 4px 10px rgba(0,0,0,0.2);"> From �%�1,100</div> </div> <div class="card-content" style="text-align: center; display: flex; flex-direction: column; justify-content: space-between;"> <div> <h3>Tall Coat Wardrobe</h3> <p>Maximize the highest point of the stairs. Internal pull-down rails make storing long winter coats effortless and organized.</p> </div> <a href="contact.html" class="btn btn-primary" style="width: 100%; margin-top: 1.5rem;">Enquire Now</a> </div> </article> <!-- Product 6 --> <article class="card"> <div class="card-image" style="position: relative;"> <img src="assets/images/under-stairs-dog-den.png" loading="lazy" alt="Luxury Pet Den"> <div class="price-badge" style="position: absolute; top: 15px; right: 15px; background: var(--color-accent); color: white; padding: 0.5rem 1rem; border-radius: 20px; font-weight: bold; box-shadow: 0 4px 10px rgba(0,0,0,0.2);"> From �%�950</div> </div> <div class="card-content" style="text-align: center; display: flex; flex-direction: column; justify-content: space-between;"> <div> <h3>The Luxury Pet Den</h3> <p>Give your dog their own cozy sanctuary. Built-in sleep area with integrated storage above for leashes and treats.</p> </div> <a href="contact.html" class="btn btn-primary" style="width: 100%; margin-top: 1.5rem;">Enquire Now</a> </div> </article> </div> </div> </section> <!-- Footer --> <footer class="footer"> <div class="container"> <div class="footer-main"> <div class="footer-col"> <h3>Cardiff & Caerphilly Carpentry</h3> <p>Improving and maintaining properties for over 15 years.</p> <div style="margin-top: 1rem; display: flex; gap: 1rem; color: white;"> <i data-lucide="facebook"></i> <i data-lucide="instagram"></i> <i data-lucide="twitter"></i> </div> </div> <div class="footer-col"> <h3>Services</h3> <ul class="footer-links"> <li><a href="garden-rooms.html">Garden Rooms & Sheds</a></li> <li><a href="kitchen-fitting.html">Kitchen & Bathroom Fitting</a></li> <li><a href="bespoke-furniture.html">Bespoke Furniture</a></li> <li><a href="wall-paneling.html">Wall Paneling</a></li> <li><a href="wardrobes.html">Wardrobes & Joinery</a></li> <li><a href="media-walls.html">Media Walls</a></li> <li><a href="under-stairs-storage.html">Under Stairs Storage</a></li> <li><a href="alcove-storage.html">Alcove Storage</a></li> </ul> </div> <div class="footer-col"> <h3>Service Areas</h3> <ul class="footer-links"> <li><a href="cardiff.html">Cardiff</a></li> <li><a href="caerphilly.html">Caerphilly</a></li> <li><a href="newport.html">Newport</a></li> <li><a href="barry.html">Barry</a></li> <li><a href="penarth.html">Penarth</a></li> <li><a href="pontypridd.html">Pontypridd</a></li> <li><a href="radyr.html">Radyr</a></li> <li><a href="lisvane.html">Lisvane</a></li> <li><a href="llanishen.html">Llanishen</a></li> <li><a href="roath.html">Roath</a></li> <li><a href="whitchurch.html">Whitchurch</a></li> <li><a href="heath.html">Heath</a></li> <li><a href="birchgrove.html">Birchgrove</a></li> </ul> </div> <div class="footer-col"> <h3>Contact</h3> <ul class="footer-links"> <li><i data-lucide="phone" size="14"></i> 07803 083422</li> <li><i data-lucide="mail" size="14"></i> info@www.cardiffandcaerphillycarpentry.com</li> <li><i data-lucide="map-pin" size="14"></i> Cardiff, UK</li> </ul> </div> </div> <div class="copyright"> <p>&copy; 2024 Cardiff & Caerphilly Carpentry. All rights reserved.</p> </div> </div> </footer> <script> lucide.createIcons(); const mobileToggle = document.querySelector('.mobile-toggle'); const navLinks = document.querySelector('.nav-links'); if (mobileToggle) { mobileToggle.addEventListener('click', () => { navLinks.classList.toggle('active'); }); } </script> <!-- Mobile Navigation Dropdown Logic --> <script> document.addEventListener('DOMContentLoaded', () => { const dropdownToggles = document.querySelectorAll('.dropdown-toggle'); dropdownToggles.forEach(toggle => { toggle.addEventListener('click', (e) => { if (window.innerWidth <= 900) { const dropdown = toggle.closest('.dropdown'); // If it's not active, prevent navigation and just open it if (!dropdown.classList.contains('active')) { e.preventDefault(); // Close other dropdowns if any exist document.querySelectorAll('.dropdown').forEach(d => { if (d !== dropdown) d.classList.remove('active'); }); dropdown.classList.add('active'); } // If it IS active, the second click will navigate naturally } }); }); // Optional: Close dropdown if clicked outside on mobile (or desktop) document.addEventListener('click', (e) => { if (!e.target.closest('.dropdown')) { document.querySelectorAll('.dropdown').forEach(d => d.classList.remove('active')); } }); }); </script> <script src="js/under-stairs-calculator.js"></script>\n <!-- n8n Chat Widget --> <link href="https://cdn.jsdelivr.net/npm/@n8n/chat/dist/style.css" rel="stylesheet" /> <script type="module"> import { createChat } from 'https://cdn.jsdelivr.net/npm/@n8n/chat/dist/chat.bundle.es.js'; window.openChatWindow = function() { const chatToggle = document.querySelector('.chat-window-toggle'); if(chatToggle) { chatToggle.click(); } }; createChat({ webhookUrl: 'https://cccgroup.app.n8n.cloud/webhook/tradevault-chat-widget-webhook/chat', initialMessages: [ "Hi there! ����", "I'm Cindy from Cardiff & Caerphilly Carpentry.", "Tell me what you're looking to build, and I'll see if I can get someone out to you to quote!" ] }); </script> </body> </html>