Products / Plasterboard Faced Access Panel

Access Panels

Plasterboard Faced

120m Fire Rated | 48dB Acoustic Rated | Airtight Rated | Smoke Tested

Built for performance

ISO 9001 | 14001 | 45001 | NBS | RIBA | Constructionline Gold

Get the highlights.

Featured Products

Fire Ratings

Integrity Fire Ratings (BS EN 1364 – 1 : 2014) Up to 120 Minutes Insulated Fire Ratings (BS EN 1364 – 1 : 2014) Unavailable

Acoustic Ratings

Up to 37 dB

Airtight Rated

Available (BS EN 1364-3 : 2004)

Smoke Tested

Available (BS EN 1634-3 : 2004)

Take a closer look.

Door Types

Plasterboard Door

Frame Types

Beaded Frame Exposed Edge Frame Custom Frame Types

Wall Sizes

Minimum: 100 x 100 Maximum: No Maximum

Ceiling Sizes

Minimum: 100 x 100 Maximum: No Maximum

Door Configurations

Single Door Multiple Doors

Lock Types

3 Point Euro Cylinder 3 Way Lock 5mm Bit Budget Lock Castellated Key Lock Key Retaining Lock Touch Catch [tcb-script](function() { const sliderTrack = document.getElementById(‘appleSliderTrack’); const prevBtn = document.getElementById(‘applePrevBtn’); const nextBtn = document.getElementById(‘appleNextBtn’); const sliderDotsContainer = document.getElementById(‘appleSliderDots’); const playButton = document.getElementById(‘applePlayButton’); const playIcon = document.getElementById(‘applePlayIcon’); const pauseIcon = document.getElementById(‘applePauseIcon’); const replayIcon = document.getElementById(‘appleReplayIcon’); const cards = document.querySelectorAll(‘#appleSliderTrack .apple-product-card’); let currentIndex = 0; let startX = 0; let currentTranslate = 0; let prevTranslate = 0; let isDragging = false; let animationID = 0; let autoplayInterval = null; let isPlaying = false; let isCompleted = false; const getCardWidth = () => { if (cards.length > 0) { // Force a reflow to get accurate dimensions const cardWidth = cards[0].getBoundingClientRect().width; return cardWidth; } return 1000; }; let cardWidth = 1000; const gap = 30; let slideWidth = cardWidth + gap; const maxIndex = cards.length – 1; // Calculate and apply centering padding function applyCenterPadding() { const viewportWidth = window.innerWidth; const currentCardWidth = cards.length > 0 ? cards[0].getBoundingClientRect().width : 0; const centerPadding = (viewportWidth – currentCardWidth) / 2; sliderTrack.style.paddingLeft = `${Math.max(centerPadding, 0)}px`; // Apply same padding to first title const container = sliderTrack.closest(‘.apple-slider-container’); const title = container.querySelector(‘.apple-slider-main-title’); if (title) { title.style.paddingLeft = `${Math.max(centerPadding, 0)}px`; } } // Initialize after a short delay to ensure cards are rendered setTimeout(() => { cardWidth = getCardWidth(); slideWidth = cardWidth + gap; applyCenterPadding(); setSliderPosition(); }, 200); // Update card width on resize with debounce let resizeTimeout; window.addEventListener(‘resize’, () => { clearTimeout(resizeTimeout); resizeTimeout = setTimeout(() => { cardWidth = getCardWidth(); slideWidth = cardWidth + gap; applyCenterPadding(); setSliderPosition(); }, 50); }); // Create dots cards.forEach((_, index) => { const dot = document.createElement(‘div’); dot.classList.add(‘apple-dot’); if (index === 0) dot.classList.add(‘active’); // Add progress bar inside dot const progress = document.createElement(‘div’); progress.classList.add(‘apple-dot-progress’); dot.appendChild(progress); dot.addEventListener(‘click’, () => goToSlide(index)); sliderDotsContainer.appendChild(dot); }); const dots = document.querySelectorAll(‘#appleSliderDots .apple-dot’); function updateDots() { dots.forEach((dot, index) => { dot.classList.toggle(‘active’, index === currentIndex); }); } function startAutoplay() { isPlaying = true; isCompleted = false; playIcon.style.display = ‘none’; pauseIcon.style.display = ‘block’; replayIcon.style.display = ‘none’; // Start progress animation on current dot animateProgress(); autoplayInterval = setInterval(() => { if (currentIndex < maxIndex) { currentIndex++; setSliderPosition(); animateProgress(); } else { // Reached the end stopAutoplay(); isCompleted = true; playIcon.style.display = ‘none’; pauseIcon.style.display = ‘none’; replayIcon.style.display = ‘block’; } }, 5000); } function animateProgress() { // Reset all progress bars dots.forEach(dot => { const progress = dot.querySelector(‘.apple-dot-progress’); if (progress) { progress.classList.remove(‘animating’); progress.style.width = ‘0%’; } }); // Animate current dot’s progress const currentDot = dots[currentIndex]; if (currentDot && isPlaying) { const progress = currentDot.querySelector(‘.apple-dot-progress’); if (progress) { // Force reflow to restart animation void progress.offsetWidth; progress.classList.add(‘animating’); progress.style.width = ‘100%’; } } } function stopAutoplay() { isPlaying = false; playIcon.style.display = ‘block’; pauseIcon.style.display = ‘none’; if (autoplayInterval) { clearInterval(autoplayInterval); autoplayInterval = null; } // Reset all progress bars dots.forEach(dot => { const progress = dot.querySelector(‘.apple-dot-progress’); if (progress) { progress.classList.remove(‘animating’); progress.style.width = ‘0%’; } }); } function toggleAutoplay() { if (isCompleted) { // Replay from beginning currentIndex = 0; setSliderPosition(); isCompleted = false; startAutoplay(); } else if (isPlaying) { stopAutoplay(); } else { startAutoplay(); } } playButton.addEventListener(‘click’, toggleAutoplay); function setSliderPosition() { cardWidth = getCardWidth(); // Update card width each time slideWidth = cardWidth + gap; const offset = currentIndex * slideWidth; currentTranslate = -offset; prevTranslate = currentTranslate; sliderTrack.style.transform = `translateX(${currentTranslate}px)`; updateDots(); } function goToSlide(index) { stopAutoplay(); isCompleted = false; currentIndex = Math.max(0, Math.min(index, maxIndex)); setSliderPosition(); } function nextSlide() { stopAutoplay(); isCompleted = false; if (currentIndex < maxIndex) { currentIndex++; setSliderPosition(); } } function prevSlide() { stopAutoplay(); isCompleted = false; if (currentIndex > 0) { currentIndex–; setSliderPosition(); } } // Touch events let startY = 0; let isHorizontalSwipe = false; function touchStart(index) { return function(event) { stopAutoplay(); isCompleted = false; isDragging = true; startX = event.type.includes(‘mouse’) ? event.pageX : event.touches[0].clientX; startY = event.type.includes(‘mouse’) ? event.pageY : event.touches[0].clientY; isHorizontalSwipe = false; animationID = requestAnimationFrame(animation); sliderTrack.style.cursor = ‘grabbing’; } } function touchMove(event) { if (isDragging) { const currentX = event.type.includes(‘mouse’) ? event.pageX : event.touches[0].clientX; const currentY = event.type.includes(‘mouse’) ? event.pageY : event.touches[0].clientY; const diffX = Math.abs(currentX – startX); const diffY = Math.abs(currentY – startY); // Determine if this is a horizontal swipe if (!isHorizontalSwipe && diffX > 5) { isHorizontalSwipe = diffX > diffY; } // Prevent vertical scrolling if horizontal swipe if (isHorizontalSwipe && event.cancelable) { event.preventDefault(); } // Always track movement while dragging const diff = currentX – startX; currentTranslate = prevTranslate + diff; } } function touchEnd() { isDragging = false; isHorizontalSwipe = false; cancelAnimationFrame(animationID); sliderTrack.style.cursor = ‘grab’; const movedBy = currentTranslate – prevTranslate; if (movedBy < -50 && currentIndex < maxIndex) { currentIndex++; } if (movedBy > 50 && currentIndex > 0) { currentIndex–; } setSliderPosition(); } function animation() { if (isDragging) { sliderTrack.style.transform = `translateX(${currentTranslate}px)`; requestAnimationFrame(animation); } } // Event listeners sliderTrack.addEventListener(‘mousedown’, touchStart(0)); sliderTrack.addEventListener(‘touchstart’, touchStart(0), { passive: true }); sliderTrack.addEventListener(‘mousemove’, touchMove); sliderTrack.addEventListener(‘touchmove’, touchMove, { passive: false }); sliderTrack.addEventListener(‘mouseup’, touchEnd); sliderTrack.addEventListener(‘mouseleave’, touchEnd); sliderTrack.addEventListener(‘touchend’, touchEnd); prevBtn.addEventListener(‘click’, prevSlide); nextBtn.addEventListener(‘click’, nextSlide); // Prevent default drag behavior sliderTrack.addEventListener(‘dragstart’, (e) => e.preventDefault()); // Keyboard navigation document.addEventListener(‘keydown’, (e) => { if (e.key === ‘ArrowLeft’) prevSlide(); if (e.key === ‘ArrowRight’) nextSlide(); }); // Initialize setSliderPosition(); // ========================================== // SECOND SLIDER // ========================================== const secondSliderTrack = document.getElementById(‘appleSecondSliderTrack’); const secondPrevBtn = document.getElementById(‘appleSecondPrevBtn’); const secondNextBtn = document.getElementById(‘appleSecondNextBtn’); const secondSliderDotsContainer = document.getElementById(‘appleSecondSliderDots’); const secondPlayButton = document.getElementById(‘appleSecondPlayButton’); const secondPlayIcon = document.getElementById(‘appleSecondPlayIcon’); const secondPauseIcon = document.getElementById(‘appleSecondPauseIcon’); const secondReplayIcon = document.getElementById(‘appleSecondReplayIcon’); const secondCards = document.querySelectorAll(‘#appleSecondSliderTrack .apple-product-card’); let secondCurrentIndex = 0; let secondStartX = 0; let secondCurrentTranslate = 0; let secondPrevTranslate = 0; let secondIsDragging = false; let secondAnimationID = 0; let secondAutoplayInterval = null; let secondIsPlaying = false; let secondIsCompleted = false; let secondStartY = 0; let secondIsHorizontalSwipe = false; const getSecondCardWidth = () => { if (secondCards.length > 0) { const cardWidth = secondCards[0].getBoundingClientRect().width; return cardWidth; } return 1000; }; let secondCardWidth = 1000; const secondGap = 30; let secondSlideWidth = secondCardWidth + secondGap; const secondMaxIndex = secondCards.length – 1; // Calculate and apply centering padding for second slider function applySecondCenterPadding() { const viewportWidth = window.innerWidth; const currentCardWidth = secondCards.length > 0 ? secondCards[0].getBoundingClientRect().width : 0; const centerPadding = (viewportWidth – currentCardWidth) / 2; secondSliderTrack.style.paddingLeft = `${Math.max(centerPadding, 0)}px`; // Apply same padding to second title const container = secondSliderTrack.closest(‘.apple-slider-container’); const title = container.querySelector(‘.apple-slider-main-title’); if (title) { title.style.paddingLeft = `${Math.max(centerPadding, 0)}px`; } } setTimeout(() => { secondCardWidth = getSecondCardWidth(); secondSlideWidth = secondCardWidth + secondGap; applySecondCenterPadding(); setSecondSliderPosition(); }, 200); let secondResizeTimeout; window.addEventListener(‘resize’, () => { clearTimeout(secondResizeTimeout); secondResizeTimeout = setTimeout(() => { secondCardWidth = getSecondCardWidth(); secondSlideWidth = secondCardWidth + secondGap; applySecondCenterPadding(); setSecondSliderPosition(); }, 50); }); // Create dots for second slider secondCards.forEach((_, index) => { const dot = document.createElement(‘div’); dot.classList.add(‘apple-dot’); if (index === 0) dot.classList.add(‘active’); const progress = document.createElement(‘div’); progress.classList.add(‘apple-dot-progress’); dot.appendChild(progress); dot.addEventListener(‘click’, () => goToSecondSlide(index)); secondSliderDotsContainer.appendChild(dot); }); const secondDots = document.querySelectorAll(‘#appleSecondSliderDots .apple-dot’); function updateSecondDots() { secondDots.forEach((dot, index) => { dot.classList.toggle(‘active’, index === secondCurrentIndex); }); } function startSecondAutoplay() { secondIsPlaying = true; secondIsCompleted = false; secondPlayIcon.style.display = ‘none’; secondPauseIcon.style.display = ‘block’; secondReplayIcon.style.display = ‘none’; animateSecondProgress(); secondAutoplayInterval = setInterval(() => { if (secondCurrentIndex < secondMaxIndex) { secondCurrentIndex++; setSecondSliderPosition(); animateSecondProgress(); } else { stopSecondAutoplay(); secondIsCompleted = true; secondPlayIcon.style.display = ‘none’; secondPauseIcon.style.display = ‘none’; secondReplayIcon.style.display = ‘block’; } }, 5000); } function animateSecondProgress() { secondDots.forEach(dot => { const progress = dot.querySelector(‘.apple-dot-progress’); if (progress) { progress.classList.remove(‘animating’); progress.style.width = ‘0%’; } }); const currentDot = secondDots[secondCurrentIndex]; if (currentDot && secondIsPlaying) { const progress = currentDot.querySelector(‘.apple-dot-progress’); if (progress) { void progress.offsetWidth; progress.classList.add(‘animating’); progress.style.width = ‘100%’; } } } function stopSecondAutoplay() { secondIsPlaying = false; secondPlayIcon.style.display = ‘block’; secondPauseIcon.style.display = ‘none’; if (secondAutoplayInterval) { clearInterval(secondAutoplayInterval); secondAutoplayInterval = null; } secondDots.forEach(dot => { const progress = dot.querySelector(‘.apple-dot-progress’); if (progress) { progress.classList.remove(‘animating’); progress.style.width = ‘0%’; } }); } function toggleSecondAutoplay() { if (secondIsCompleted) { secondCurrentIndex = 0; setSecondSliderPosition(); secondIsCompleted = false; startSecondAutoplay(); } else if (secondIsPlaying) { stopSecondAutoplay(); } else { startSecondAutoplay(); } } secondPlayButton.addEventListener(‘click’, toggleSecondAutoplay); function setSecondSliderPosition() { secondCardWidth = getSecondCardWidth(); // Update card width each time secondSlideWidth = secondCardWidth + secondGap; const offset = secondCurrentIndex * secondSlideWidth; secondCurrentTranslate = -offset; secondPrevTranslate = secondCurrentTranslate; secondSliderTrack.style.transform = `translateX(${secondCurrentTranslate}px)`; updateSecondDots(); } function goToSecondSlide(index) { stopSecondAutoplay(); secondIsCompleted = false; secondCurrentIndex = Math.max(0, Math.min(index, secondMaxIndex)); setSecondSliderPosition(); } function nextSecondSlide() { stopSecondAutoplay(); secondIsCompleted = false; if (secondCurrentIndex < secondMaxIndex) { secondCurrentIndex++; setSecondSliderPosition(); } } function prevSecondSlide() { stopSecondAutoplay(); secondIsCompleted = false; if (secondCurrentIndex > 0) { secondCurrentIndex–; setSecondSliderPosition(); } } function secondTouchStart(index) { return function(event) { stopSecondAutoplay(); secondIsCompleted = false; secondIsDragging = true; secondStartX = event.type.includes(‘mouse’) ? event.pageX : event.touches[0].clientX; secondStartY = event.type.includes(‘mouse’) ? event.pageY : event.touches[0].clientY; secondIsHorizontalSwipe = false; secondAnimationID = requestAnimationFrame(secondAnimation); secondSliderTrack.style.cursor = ‘grabbing’; } } function secondTouchMove(event) { if (secondIsDragging) { const currentX = event.type.includes(‘mouse’) ? event.pageX : event.touches[0].clientX; const currentY = event.type.includes(‘mouse’) ? event.pageY : event.touches[0].clientY; const diffX = Math.abs(currentX – secondStartX); const diffY = Math.abs(currentY – secondStartY); if (!secondIsHorizontalSwipe && diffX > 5) { secondIsHorizontalSwipe = diffX > diffY; } if (secondIsHorizontalSwipe && event.cancelable) { event.preventDefault(); } // Always track movement while dragging const diff = currentX – secondStartX; secondCurrentTranslate = secondPrevTranslate + diff; } } function secondTouchEnd() { secondIsDragging = false; secondIsHorizontalSwipe = false; cancelAnimationFrame(secondAnimationID); secondSliderTrack.style.cursor = ‘grab’; const movedBy = secondCurrentTranslate – secondPrevTranslate; if (movedBy < -50 && secondCurrentIndex < secondMaxIndex) { secondCurrentIndex++; } if (movedBy > 50 && secondCurrentIndex > 0) { secondCurrentIndex–; } setSecondSliderPosition(); } function secondAnimation() { if (secondIsDragging) { secondSliderTrack.style.transform = `translateX(${secondCurrentTranslate}px)`; requestAnimationFrame(secondAnimation); } } secondSliderTrack.addEventListener(‘mousedown’, secondTouchStart(0)); secondSliderTrack.addEventListener(‘touchstart’, secondTouchStart(0), { passive: true }); secondSliderTrack.addEventListener(‘mousemove’, secondTouchMove); secondSliderTrack.addEventListener(‘touchmove’, secondTouchMove, { passive: false }); secondSliderTrack.addEventListener(‘mouseup’, secondTouchEnd); secondSliderTrack.addEventListener(‘mouseleave’, secondTouchEnd); secondSliderTrack.addEventListener(‘touchend’, secondTouchEnd); secondPrevBtn.addEventListener(‘click’, prevSecondSlide); secondNextBtn.addEventListener(‘click’, nextSecondSlide); secondSliderTrack.addEventListener(‘dragstart’, (e) => e.preventDefault()); document.addEventListener(‘keydown’, (e) => { if (e.key === ‘ArrowLeft’) prevSecondSlide(); if (e.key === ‘ArrowRight’) nextSecondSlide(); }); setSecondSliderPosition();})();[/tcb-script]

Access panels designed & engineered for quality.

Our access panels aren’t just about access, they’re a key part of the building envelope. Whether you need fire resistance, soundproofing, airtightness, or a clean metal finish, we’ve got a panel that fits your spec and your programme. 

Every panel is made in-house so we control the quality, the finish, and the lead times. Standard lead time: 3–5 working days. Fire-rated options: up to 120 mins. BIM-ready files available.

Advantages of Plasterboard Faced Access Panel

Access panels provide clean, concealed access to essential building services while maintaining safety, compliance and a seamless interior finish.

Service access made easy.

Maintains Clean Interior Aesthetic.

Versatile & Customisable.

Fire & Acoustic Rated Options.

Easy to Install.

Speeds Up Maintenance.

Applications

Plasterboard Faced Access Panel

Access panels are used across a wide range of building types and environments to allow safe, compliant, and discreet access to building services.

Healthcare & Hospitals

Used for access to medical gases, ductwork, and service risers. Fire-rated panels are essential for escape routes and plant rooms, while acoustic-rated panels are ideal for patient areas and wards.

Education Buildings

Provide service access to electrical and AV systems in both walls and ceilings. Secure riser access is common in corridors and stairwells, and airtight variants support energy efficiency in new-build schools.

Commercial & Office Spaces

Installed to give concealed access to HVAC, lighting control, and sprinkler systems. Often placed in lobbies and meeting rooms with custom-finished panels to preserve interior aesthetics.

Residential & High-Rise Buildings

Used for loft hatches, meter boxes, and riser door access in communal areas. Airtight and acoustic-rated panels support sound insulation and thermal efficiency in flats and apartment buildings.

Retail & Hospitality

Enable service access for lighting, plumbing, and fire alarms behind the scenes. Fire-rated access panels are often required behind kitchens or bars, with flush-fit options used in public-facing areas.

Airports, Stations & Transport Hubs

Provide secure access to systems in restricted zones. These environments typically require fire-rated, acoustic-rated, and durable tamper-resistant metal-faced panels.

Laboratories & Clean Rooms

Support controlled environments with airtight and vapour-resistant designs. Panels allow access to specialist ventilation while maintaining hygienic, flush-fit finishes.

Heritage & Refurbishment Projects

Custom-sized access panels are used to fit legacy structures. Plasterboard-faced panels blend seamlessly into original finishes, making them ideal for sensitive or listed environments.

[tcb-script](function() { // APPLICATIONS SLIDER const appsSliderTrack = document.getElementById(‘appsSliderTrack’); const appsPrevBtn = document.getElementById(‘appsPrevBtn’); const appsNextBtn = document.getElementById(‘appsNextBtn’); const appsCards = document.querySelectorAll(‘#appsSliderTrack .apps-card-wrapper’); let appsCurrentIndex = 0; let appsStartX = 0; let appsCurrentTranslate = 0; let appsPrevTranslate = 0; let appsIsDragging = false; let appsAnimationID = 0; let appsStartY = 0; let appsIsHorizontalSwipe = false; const getAppsCardWidth = () => { if (appsCards.length > 0) { const cardWidth = appsCards[0].getBoundingClientRect().width; return cardWidth; } return 760; }; let appsCardWidth = 760; const appsGap = 20; let appsSlideWidth = appsCardWidth + appsGap; const appsMaxIndex = appsCards.length – 1; function applyAppsCenterPadding() { // No padding needed – cards start at left edge } setTimeout(() => { appsCardWidth = getAppsCardWidth(); appsSlideWidth = appsCardWidth + appsGap; applyAppsCenterPadding(); setAppsSliderPosition(); }, 200); let appsResizeTimeout; const appsResizeHandler = () => { clearTimeout(appsResizeTimeout); appsResizeTimeout = setTimeout(() => { appsCardWidth = getAppsCardWidth(); appsSlideWidth = appsCardWidth + appsGap; applyAppsCenterPadding(); setAppsSliderPosition(); }, 50); }; window.addEventListener(‘resize’, appsResizeHandler); function updateAppsDots() { updateAppsNavButtons(); } function updateAppsNavButtons() { // Update prev button if (appsCurrentIndex === 0) { appsPrevBtn.classList.add(‘disabled’); appsPrevBtn.classList.remove(‘active’); } else { appsPrevBtn.classList.remove(‘disabled’); appsPrevBtn.classList.add(‘active’); } // Update next button if (appsCurrentIndex === appsMaxIndex) { appsNextBtn.classList.add(‘disabled’); appsNextBtn.classList.remove(‘active’); } else { appsNextBtn.classList.remove(‘disabled’); appsNextBtn.classList.add(‘active’); } } function setAppsSliderPosition() { appsCardWidth = getAppsCardWidth(); appsSlideWidth = appsCardWidth + appsGap; const viewportWidth = window.innerWidth; const trackStartPosition = (viewportWidth / 2) + Math.max(-800, -viewportWidth / 2 + 20); const totalContentWidth = (appsCards.length * appsSlideWidth) – appsGap; const availableWidth = viewportWidth – trackStartPosition – 60; let translateX = 0; if (appsCurrentIndex === 0) { // First card: stay at left edge translateX = 0; } else if (appsCurrentIndex === appsMaxIndex) { // Last card: stop when fully visible on right translateX = Math.max(0, totalContentWidth – availableWidth); } else { // Middle cards: center on screen const cardPosition = appsCurrentIndex * appsSlideWidth; const centerOffset = (viewportWidth – appsCardWidth) / 2 – trackStartPosition; translateX = cardPosition – centerOffset; // Make sure we don’t go past the bounds translateX = Math.max(0, translateX); translateX = Math.min(translateX, totalContentWidth – availableWidth); } appsCurrentTranslate = -translateX; appsPrevTranslate = appsCurrentTranslate; appsSliderTrack.style.transform = `translateX(${appsCurrentTranslate}px)`; updateAppsDots(); } function goToAppsSlide(index) { appsCurrentIndex = Math.max(0, Math.min(index, appsMaxIndex)); setAppsSliderPosition(); } function nextAppsSlide() { if (appsCurrentIndex === appsMaxIndex) return; if (appsCurrentIndex < appsMaxIndex) { appsCurrentIndex++; setAppsSliderPosition(); } } function prevAppsSlide() { if (appsCurrentIndex === 0) return; if (appsCurrentIndex > 0) { appsCurrentIndex–; setAppsSliderPosition(); } } function appsTouchStart(index) { return function(event) { appsIsDragging = true; appsStartX = event.type.includes(‘mouse’) ? event.pageX : event.touches[0].clientX; appsStartY = event.type.includes(‘mouse’) ? event.pageY : event.touches[0].clientY; appsIsHorizontalSwipe = false; appsAnimationID = requestAnimationFrame(appsAnimation); appsSliderTrack.style.cursor = ‘grabbing’; } } function appsTouchMove(event) { if (appsIsDragging) { const currentX = event.type.includes(‘mouse’) ? event.pageX : event.touches[0].clientX; const currentY = event.type.includes(‘mouse’) ? event.pageY : event.touches[0].clientY; const diffX = Math.abs(currentX – appsStartX); const diffY = Math.abs(currentY – appsStartY); if (!appsIsHorizontalSwipe && diffX > 5) { appsIsHorizontalSwipe = diffX > diffY; } if (appsIsHorizontalSwipe && event.cancelable) { event.preventDefault(); } const diff = currentX – appsStartX; appsCurrentTranslate = appsPrevTranslate + diff; } } function appsTouchEnd() { appsIsDragging = false; appsIsHorizontalSwipe = false; cancelAnimationFrame(appsAnimationID); appsSliderTrack.style.cursor = ‘grab’; const movedBy = appsCurrentTranslate – appsPrevTranslate; if (movedBy < -50 && appsCurrentIndex < appsMaxIndex) { appsCurrentIndex++; } if (movedBy > 50 && appsCurrentIndex > 0) { appsCurrentIndex–; } setAppsSliderPosition(); } function appsAnimation() { if (appsIsDragging) { appsSliderTrack.style.transform = `translateX(${appsCurrentTranslate}px)`; requestAnimationFrame(appsAnimation); } } appsSliderTrack.addEventListener(‘mousedown’, appsTouchStart(0)); appsSliderTrack.addEventListener(‘touchstart’, appsTouchStart(0), { passive: true }); appsSliderTrack.addEventListener(‘mousemove’, appsTouchMove); appsSliderTrack.addEventListener(‘touchmove’, appsTouchMove, { passive: false }); appsSliderTrack.addEventListener(‘mouseup’, appsTouchEnd); appsSliderTrack.addEventListener(‘mouseleave’, appsTouchEnd); appsSliderTrack.addEventListener(‘touchend’, appsTouchEnd); appsPrevBtn.addEventListener(‘click’, prevAppsSlide); appsNextBtn.addEventListener(‘click’, nextAppsSlide); appsSliderTrack.addEventListener(‘dragstart’, (e) => e.preventDefault()); setAppsSliderPosition();})();[/tcb-script]

Access Panel

Frequently Asked Questions

Why Rapid is the best place to spec Access Panels

Fast Lead Times

Fast Lead Times

Manufactured and dispatched in 4–7 working days

Manufacturer-Direct

Manufacturer-Direct

Complete control over quality and turnaround

Dedicated Professional Services

Dedicated Professional Services

Full project support from spec to install

Fully Customisable

Fully Customisable

Any size, rating, or finish to match your spec

Compliance Built-In

Compliance Built-In

Fire-tested, acoustic-rated, fully compliant

Seamless Aesthetic

Seamless Aesthetic

Flush, discreet finish for high-visibility areas

Price–Performance Balance

Price–Performance Balance

Right panel for the right environment

[tcb-script](function() { // RAPID SLIDER const rapidSliderTrack = document.getElementById(‘rapidSliderTrack’); const rapidPrevBtn = document.getElementById(‘rapidPrevBtn’); const rapidNextBtn = document.getElementById(‘rapidNextBtn’); const rapidCards = document.querySelectorAll(‘#rapidSliderTrack .rapid-product-card’); let rapidCurrentIndex = 0; let rapidStartX = 0; let rapidCurrentTranslate = 0; let rapidPrevTranslate = 0; let rapidIsDragging = false; let rapidAnimationID = 0; let rapidStartY = 0; let rapidIsHorizontalSwipe = false; const getRapidCardWidth = () => { if (rapidCards.length > 0) { const cardWidth = rapidCards[0].getBoundingClientRect().width; return cardWidth; } return 370; }; let rapidCardWidth = 370; const rapidGap = 20; let rapidSlideWidth = rapidCardWidth + rapidGap; const rapidMaxIndex = rapidCards.length – 1; function applyRapidCenterPadding() { // No padding needed – cards start at left edge } setTimeout(() => { rapidCardWidth = getRapidCardWidth(); rapidSlideWidth = rapidCardWidth + rapidGap; applyRapidCenterPadding(); setRapidSliderPosition(); }, 200); let rapidResizeTimeout; const rapidResizeHandler = () => { clearTimeout(rapidResizeTimeout); rapidResizeTimeout = setTimeout(() => { rapidCardWidth = getRapidCardWidth(); rapidSlideWidth = rapidCardWidth + rapidGap; applyRapidCenterPadding(); setRapidSliderPosition(); }, 50); }; window.addEventListener(‘resize’, rapidResizeHandler); function updateRapidDots() { updateNavButtons(); } function updateNavButtons() { // Update prev button if (rapidCurrentIndex === 0) { rapidPrevBtn.classList.add(‘disabled’); rapidPrevBtn.classList.remove(‘active’); } else { rapidPrevBtn.classList.remove(‘disabled’); rapidPrevBtn.classList.add(‘active’); } // Update next button if (rapidCurrentIndex === rapidMaxIndex) { rapidNextBtn.classList.add(‘disabled’); rapidNextBtn.classList.remove(‘active’); } else { rapidNextBtn.classList.remove(‘disabled’); rapidNextBtn.classList.add(‘active’); } } function setRapidSliderPosition() { rapidCardWidth = getRapidCardWidth(); rapidSlideWidth = rapidCardWidth + rapidGap; // Calculate the maximum offset so the last card stops when fully visible const viewportWidth = window.innerWidth; const trackStartPosition = (viewportWidth / 2) + Math.max(-800, -viewportWidth / 2 + 20); const availableWidth = viewportWidth – trackStartPosition – 60; // 60px padding from right edge const totalContentWidth = (rapidCards.length * rapidSlideWidth) – rapidGap; // Maximum translate should stop when last card is fully visible const maxTranslate = Math.min( rapidCurrentIndex * rapidSlideWidth, Math.max(0, totalContentWidth – availableWidth) ); rapidCurrentTranslate = -maxTranslate; rapidPrevTranslate = rapidCurrentTranslate; rapidSliderTrack.style.transform = `translateX(${rapidCurrentTranslate}px)`; updateRapidDots(); } function goToRapidSlide(index) { rapidCurrentIndex = Math.max(0, Math.min(index, rapidMaxIndex)); setRapidSliderPosition(); } function nextRapidSlide() { if (rapidCurrentIndex === rapidMaxIndex) return; if (rapidCurrentIndex < rapidMaxIndex) { rapidCurrentIndex++; setRapidSliderPosition(); } } function prevRapidSlide() { if (rapidCurrentIndex === 0) return; if (rapidCurrentIndex > 0) { rapidCurrentIndex–; setRapidSliderPosition(); } } function rapidTouchStart(index) { return function(event) { rapidIsDragging = true; rapidStartX = event.type.includes(‘mouse’) ? event.pageX : event.touches[0].clientX; rapidStartY = event.type.includes(‘mouse’) ? event.pageY : event.touches[0].clientY; rapidIsHorizontalSwipe = false; rapidAnimationID = requestAnimationFrame(rapidAnimation); rapidSliderTrack.style.cursor = ‘grabbing’; } } function rapidTouchMove(event) { if (rapidIsDragging) { const currentX = event.type.includes(‘mouse’) ? event.pageX : event.touches[0].clientX; const currentY = event.type.includes(‘mouse’) ? event.pageY : event.touches[0].clientY; const diffX = Math.abs(currentX – rapidStartX); const diffY = Math.abs(currentY – rapidStartY); if (!rapidIsHorizontalSwipe && diffX > 5) { rapidIsHorizontalSwipe = diffX > diffY; } if (rapidIsHorizontalSwipe && event.cancelable) { event.preventDefault(); } const diff = currentX – rapidStartX; rapidCurrentTranslate = rapidPrevTranslate + diff; } } function rapidTouchEnd() { rapidIsDragging = false; rapidIsHorizontalSwipe = false; cancelAnimationFrame(rapidAnimationID); rapidSliderTrack.style.cursor = ‘grab’; const movedBy = rapidCurrentTranslate – rapidPrevTranslate; if (movedBy < -50 && rapidCurrentIndex < rapidMaxIndex) { rapidCurrentIndex++; } if (movedBy > 50 && rapidCurrentIndex > 0) { rapidCurrentIndex–; } setRapidSliderPosition(); } function rapidAnimation() { if (rapidIsDragging) { rapidSliderTrack.style.transform = `translateX(${rapidCurrentTranslate}px)`; requestAnimationFrame(rapidAnimation); } } rapidSliderTrack.addEventListener(‘mousedown’, rapidTouchStart(0)); rapidSliderTrack.addEventListener(‘touchstart’, rapidTouchStart(0), { passive: true }); rapidSliderTrack.addEventListener(‘mousemove’, rapidTouchMove); rapidSliderTrack.addEventListener(‘touchmove’, rapidTouchMove, { passive: false }); rapidSliderTrack.addEventListener(‘mouseup’, rapidTouchEnd); rapidSliderTrack.addEventListener(‘mouseleave’, rapidTouchEnd); rapidSliderTrack.addEventListener(‘touchend’, rapidTouchEnd); rapidPrevBtn.addEventListener(‘click’, prevRapidSlide); rapidNextBtn.addEventListener(‘click’, nextRapidSlide); rapidSliderTrack.addEventListener(‘dragstart’, (e) => e.preventDefault()); setRapidSliderPosition(); // Modal functionality const modal = document.getElementById(‘rapidModal’); const modalOverlay = document.getElementById(‘rapidModalOverlay’); const modalClose = document.getElementById(‘rapidModalClose’); const modalIcon = document.getElementById(‘rapidModalIcon’); const modalTitle = document.getElementById(‘rapidModalTitle’); const modalDescription = document.getElementById(‘rapidModalDescription’); let scrollPosition = 0; const cardData = [ { icon: ‘https://wordpress-1463117-5515653.cloudwaysapps.com/wp-content/uploads/2025/12/fast-lead-time.png’, title: ‘Fast Lead Times’, description: ‘Panels are manufactured and dispatched in 4–7 working days, including custom sizes and specialist performance options. This keeps your programme moving without delays and gives you predictable delivery for tight construction schedules.’ }, { icon: ‘https://wordpress-1463117-5515653.cloudwaysapps.com/wp-content/uploads/2025/12/Manufacture-direct.png’, title: ‘Manufacturer-Direct’, description: ‘Every panel is produced in-house, giving you complete control over quality, finish, turnaround, and compliance. No third-party bottlenecks. No fragmented supply chain. Just consistent, reliable manufacturing from start to finish.’ }, { icon: ‘https://wordpress-1463117-5515653.cloudwaysapps.com/wp-content/uploads/2025/12/deadicated-prof-service.png’, title: ‘Dedicated Professional Services’, description: ‘Get full project support whenever you need it: custom design services, technical guidance, on-site technical assistance, distribution partner support, and large-quote handling for complex or multi-phase builds. We work with your team to ensure smooth specification, procurement, and installation from end to end.’ }, { icon: ‘https://wordpress-1463117-5515653.cloudwaysapps.com/wp-content/uploads/2025/12/fully-customisable.png’, title: ‘Fully Customisable’, description: ‘Available in sizes from 300 × 300 mm up to 2400 × 2500 mm, with options for custom fire ratings, acoustic performance, airtightness, frame styles, and metal or plasterboard finishes. Whatever your specification, we build to match it.’ }, { icon: ‘https://wordpress-1463117-5515653.cloudwaysapps.com/wp-content/uploads/2025/12/compliance-built-in.png’, title: ‘Compliance Built-In’, description: ‘Panels are fire-tested, acoustic-rated, airtight, and smoke-tested, giving you a compliant, specification-ready solution that meets the demands of modern building regulations. Documentation and test data are available for every model.’ }, { icon: ‘https://wordpress-1463117-5515653.cloudwaysapps.com/wp-content/uploads/2025/12/seamless-aesthetic.png’, title: ‘Seamless Aesthetic’, description: ‘Choose between concealed and beaded frame designs for a flush, discreet finish that blends seamlessly into walls or ceilings. Ideal for high-visibility areas where performance cannot compromise design.’ }, { icon: ‘https://wordpress-1463117-5515653.cloudwaysapps.com/wp-content/uploads/2025/12/price-performance.png’, title: ‘Price–Performance Balance’, description: ‘A complete range of performance options allows you to match the right panel to the right environment — from cost-effective solutions to high-performance builds. Ideal for value engineering while maintaining compliance and build quality.’ } ]; function openModal(index) { const data = cardData[index]; modalIcon.innerHTML = `<img src=”${data.icon}” alt=”${data.title}”>`; modalTitle.textContent = data.title; modalDescription.textContent = data.description; // Save scroll position scrollPosition = window.pageYOffset || document.documentElement.scrollTop; // Lock scroll document.body.style.position = ‘fixed’; document.body.style.top = `-${scrollPosition}px`; document.body.style.width = ‘100%’; document.body.classList.add(‘rapid-modal-open’); modal.classList.add(‘active’); } function closeModal() { modal.classList.remove(‘active’); // Restore scroll document.body.classList.remove(‘rapid-modal-open’); document.body.style.position = ”; document.body.style.top = ”; document.body.style.width = ”; window.scrollTo(0, scrollPosition); } // Add click event to each card rapidCards.forEach((card, index) => { card.addEventListener(‘click’, (e) => { // Don’t open modal if currently dragging if (!rapidIsDragging) { openModal(index); } }); }); // Close modal events modalClose.addEventListener(‘click’, closeModal); modalOverlay.addEventListener(‘click’, closeModal); // Close on Escape key document.addEventListener(‘keydown’, (e) => { if (e.key === ‘Escape’ && modal.classList.contains(‘active’)) { closeModal(); } });})();[/tcb-script]

Built to support better buildings.

What matters to you matters to Rapid Access. From safer, tested construction to faster delivery and better project outcomes. Every panel is engineered to meet the demands of modern buildings while reducing rework, delays and system failures on site.

Compliance you can trust. Every access panel is tested for fire, acoustic, airtight and smoke performance, helping you meet building regulations with confidence.

More on compliance and testing >

Quality that lasts. Manufactured in-house for full control over quality, finish and consistency. Our panels are designed for durability, reliability and long-term performance across demanding environments.

More on quality and manufacturing >

Support at every stage. From technical design support to on-site assistance, we help your team deliver projects smoothly, efficiently and with fewer snags.

More on professional services >