Quantix S Heat Pumps – Efficient Air-to-Water Systems Ireland
Quantix S Heat Pumps
— High-Efficiency Air-to-Water Systems

Get Your Free Quote
Which of these describes you best?
RVR Energy Technology offers efficient air-to-water heat pump systems trusted by Irish installers and homeowners alike.
The Quantix S delivers powerful, energy-efficient heating while helping reduce energy costs for Irish homes.
Ideal for Various Heating Projects Across Ireland

New Builds
New builds requiring energy-efficient home heating systems

Upgrading
Homes upgrading from older gas or oil boilers to heat pumps

Retrofit Projects
Retrofit heating system replacement projects

BER Improvement
Homeowners improving BER ratings

Eco-Friendly
Anyone looking for a clean, eco-friendly heating solution
Why Choose the Quantix S Heat Pump?
High-Efficiency Heat Pump System
Engineered to provide maximum efficiency, helping homeowners reduce heating costs by up to 50–70%. Installers trust this system for reliable performance and long-term savings.
Perfect for All Irish Climates
Built to perform in cold, damp Irish weather, the Quantix S is reliable year-round and suitable for homes across Ireland.
Ultra-Quiet Performance
Whisper-quiet operation makes it ideal for residential properties and family homes.
Long-Term Peace of Mind
RVR Energy Technology offers extended support and warranty coverage for peace of mind, one of the strongest among heat pump systems in Ireland.
Smart Heating Controls for Maximum Savings
Modern features include:

- ✓Mobile app control
- ✓Smart thermostat integration
- ✓Real-time energy monitoring
- ✓Temperature scheduling
- ✓Adaptive performance for Irish weather
These features allow homeowners to optimize energy usage while installers can confidently recommend RVR systems.
Reduce Energy Bills With a High-Efficiency Heat Pump
Homeowners switching from older systems typically achieve:
Lower Heating Costs
vs oil boilers
Savings
vs gas boilers
Improved Comfort
& energy efficiency
RVR heat pumps provide reliable, high-performance heating solutions for Irish homes.
Reliable Heating in Irish Winters
The Quantix S system is designed for harsh winter conditions, with:
Low-temperature operation
Anti-frost technology
Advanced defrost management
High-output compressor performance
Installer & Homeowner Trusted Brand
Years of Heating Experience
Trusted by Certified Installers
Air-to-water heat pump installers across Ireland
Reliable Nationwide Supply
Across Ireland
Transparent Pricing
& support for installers and homeowners
Request a Quote
Whether you're an installer looking to supply RVR systems or a homeowner exploring options, our team is here to help. Fill out the form to request product details, pricing, and expert guidance.
Which of these describes you best?
import Hero from './components/Hero';
import UseCases from './components/UseCases';
import WhyChoose from './components/WhyChoose';
import SmartControls from './components/SmartControls';
import Savings from './components/Savings';
import WinterPerformance from './components/WinterPerformance';
import Trust from './components/Trust';
import QuizCTA from './components/QuizCTA';
Initialize Lucide icons if needed, but react-lucide handles this per component
Smooth scroll behavior is handled by CSS
div className="app-container"
motion, useInView, useAnimation
const isInView = useInView(ref,
const mainControls = useAnimation();
const hasTriggered = useRef(false);
hasTriggered.current = true;
mainControls.start("visible");
Fallback: Use IntersectionObserver directly for more reliable detection
const element = ref.current;
Try using IntersectionObserver directly as fallback
observer = new IntersectionObserver(
if (entry.isIntersecting && !hasTriggered.current)
root: null, // Use viewport
rootMargin: '50px', // Trigger 50px before entering viewport
threshold: 0.1 // Trigger when 10% visible
observer.observe(element);
IntersectionObserver not supported, will rely on manual check
Manual fallback check - ALWAYS run as backup (even if IntersectionObserver exists)
This ensures it works even if IntersectionObserver doesn't fire in Shopify's context
const checkVisibility = () =
if (hasTriggered.current) return;
const rect = element.getBoundingClientRect();
const viewportHeight = window.innerHeight || document.documentElement.clientHeight;
More strict: element must be actually entering viewport (top visible or approaching)
const isEnteringViewport = (
viewportHeight && // Top is above bottom of viewport
Bottom is below top of viewport
triggerBuffer // Not too far above (within buffer)
Disconnect observer if it exists since we triggered manually
Always set up manual checks as backup
const interval = setInterval(checkVisibility, 200);
const scrollHandler = () =
requestAnimationFrame(checkVisibility);
window.addEventListener('scroll', scrollHandler,
document.addEventListener('scroll', scrollHandler,
window.addEventListener('resize', checkVisibility,
Fallback timeout - longer to avoid premature triggering (20 seconds)
const timeout = setTimeout(() =
if (!hasTriggered.current)
window.removeEventListener('scroll', scrollHandler);
document.removeEventListener('scroll', scrollHandler);
window.removeEventListener('resize', checkVisibility);
All directions now use simple fade animation
position: "relative", width
duration, delay, ease: "easeOut"
className="reveal-content"
import React from 'react';
from './animations/Reveal';
import HeroQuiz from './HeroQuiz';
section className="relative min-h-screen flex items-center pt-24 pb-10 px-4 overflow-hidden"
Background with Orange Gradient overlay */
div className="absolute inset-0 bg-gradient-to-br from-[#FFF5F0] to-white -z-10"
div className="container-custom"
div className="grid grid-cols-1 lg:grid-cols-2 gap-8 lg:gap-16 items-start"
Left Column - Title & Image */
div className="order-1 flex flex-col gap-6"
h1 className="text-4xl md:text-5xl lg:text-6xl font-extrabold leading-tight"
span className="text-gradient"
span className="block mt-2 text-xl md:text-2xl lg:text-3xl text-neutral-charcoal"
High-Efficiency Air-to-Water Systems
Reveal width="100%" delay=
div className="relative rounded-2xl overflow-hidden shadow-xl h-[225px] md:h-[260px] w-full"
getAssetUrl('/assets/hero-landscape.jpg')
alt="Quantix S Heat Pump System"
className="w-full h-full object-cover object-center transform hover:scale-105 transition-transform duration-700"
Right Column - Quiz CTA */
div className="relative z-10"
Bottom Row - Subtext Spanning Full Width */
div className="order-3 lg:col-span-2 mt-4"
div className="text-lg text-neutral-greyMid space-y-4"
RVR Energy Technology offers efficient air-to-water heat pump systems trusted by Irish installers and homeowners alike.
The Quantix S delivers powerful, energy-efficient heating while helping reduce energy costs for Irish homes.
useState, useRef, useEffect
ArrowLeft, ArrowRight, CheckCircle, RotateCcw, AlertCircle
Jotform submission endpoint and field mappings
const JOTFORM_SUBMIT_URL = 'https://eu-submit.jotform.com/submit/253305766862060';
formID: '253305766862060',
buildDate: 'q5_q5_radio3',
techAssessment: 'q6_q6_radio4',
hliAvailable: 'q8_q8_radio6',
hliUnder23: 'q9_q9_radio7',
buildingType: 'q10_q10_radio8',
firstName: 'q12_q12_textbox10',
lastName: 'q13_q13_textbox11',
company: 'q14_q14_textbox12',
address: 'q15_q15_textarea13',
eircode: 'q16_q16_textbox14',
mobile: 'q18_q18_phone16[full]',
info: 'q20_q20_textarea18',
fileUpload: 'q21_q21_fileupload19', // File upload field - array format with []
ask: 'Which of these describes you best?',
label: 'A) Installer', value: 'Installer', next: 'collect_installer_lead'
label: 'B) Homeowner or Landlord', value: 'Homeowner or Landlord', next: 'check_build_date'
label: 'C) Other industry professional', value: 'Other industry professional', next: 'collect_professional_inquiry'
message: 'We would love to hear from you and would be happy to quote for your project.',
fields: ['firstName', 'lastName', 'info', 'fileUpload', 'company', 'email', 'mobile']
collect_professional_inquiry:
message: 'We would love to hear from you and would be happy to give you further information.',
intro: 'Under the most recent SEAI rules, many properties are now grant eligible. Please answer a few short questions and we\'ll let you know if your home is eligible and what to do next. A max of 7 short questions and you will have a much better idea!',
ask: 'When was your home built? (MPRN connection date)',
label: 'Up to and including 2006', value: 'Up to and including 2006', next: 'check_tech_assessment'
label: '2007 or Later', value: '2007 to 2020', next: 'check_2020_occupancy'
ask: 'Do you have a technical assessment?',
label: 'Yes', value: 'Yes', next: 'check_hli_from_assessment'
label: 'No', value: 'No', next: 'bounce_seai_lookup'
label: 'Not sure', value: 'Not sure', next: 'check_ber_cert'
check_hli_from_assessment:
ask: 'Check the assessment please - Is the HLI:',
label: 'a) Under 2.3', value: 'Yes', next: 'ask_property_type_standard', setFields:
label: 'b) 2.3 or higher', value: 'No', next: 'ask_property_type_upgrades', setFields:
ask: 'Do you have a BER Cert for the property?',
label: 'Yes', value: 'Yes', next: 'check_ber_has_hli'
label: 'No', value: 'No', next: 'bounce_recommend_assessment'
label: 'Not sure', value: 'Not sure', next: 'bounce_seai_lookup'
footer: 'If you have your Electricity MPRN No, you can check the following link to search for your most recent BER. If you are not sure if you have a BER Cert, check the BER Register.',
text: 'SEAI National BER Register', url: 'https://ndber.seai.ie/pass/ber/search.aspx'
ask: 'Great! Check the BER please. Does it have a HLI figure on it?',
label: 'Yes', value: 'Yes', next: 'check_hli_value_from_ber'
label: 'a) Under 2.3', value: 'Yes', next: 'ask_property_type_standard'
label: 'b) 2.3 or higher', value: 'No', next: 'bounce_ber_high_hli'
message: 'It is likely you could access a grant as long as you carry out some other measures to bring the HLI under 2.3. We recommend that in the first instance you get a technical assessor to carry out a technical assessment.',
text: 'Find a Technical Advisor (SEAI list)', url: 'https://www.seai.ie/sites/default/files/publications/SEAI-Registered-Technical-Advisors.pdf'
text: 'Learn more about heat pump grants', url: 'https://www.seai.ie/grants/home-energy-grants/individual-grants/heat-pump-systems'
bounce_recommend_assessment:
message: 'We recommend you get a technical assessment done in the first instance. The following SEAI links have useful information.',
ask: 'Was it built and occupied up to and including 2020 (MPRN activation date)?',
label: 'Yes', value: '2007 to 2020', next: 'ask_property_type_post_2006'
label: 'No', value: '2021+', next: 'not_eligible'
ask_property_type_standard:
ask: 'Is your property a House or Apartment?',
label: 'House', value: 'House', next: 'eligible_standard_house'
label: 'Apartment', value: 'Apartment', next: 'eligible_standard_apartment'
ask_property_type_upgrades:
label: 'House', value: 'House', next: 'eligible_upgrades_house'
label: 'Apartment', value: 'Apartment', next: 'eligible_upgrades_apartment'
ask_property_type_post_2006:
label: 'House', value: 'House', next: 'eligible_post_2006_house'
label: 'Apartment', value: 'Apartment', next: 'eligible_post_2006_apartment'
message: 'Good news - you are almost certainly eligible for a grant of up to €6,500. We would love to hear from you and would be happy to quote for your project.',
fields: ['firstName', 'lastName', 'info', 'fileUpload', 'address', 'eircode', 'email', 'mobile']
message: 'Good news - you are almost certainly eligible for a grant of up to €6,500. We would love to hear from you and would be happy to quote for your project. Bear in mind you will need to take other measures in conjunction with the heat pump to bring HLI under 2.3.',
message: 'Good news - you are almost certainly eligible for a grant of up to €6,500. You will just need to sign a declaration confirming the build date for the SEAI. We would love to hear from you and would be happy to quote for your project.',
eligible_standard_apartment:
message: 'Good news - you are almost certainly eligible for a grant of up to €4,500. We would love to hear from you and would be happy to quote for your project.',
eligible_upgrades_apartment:
message: 'Good news - you are almost certainly eligible for a grant of up to €4,500. We would love to hear from you and would be happy to quote for your project. Bear in mind you will need to take other measures in conjunction with the heat pump to bring HLI under 2.3.',
eligible_post_2006_apartment:
message: 'Good news - you are almost certainly eligible for a grant of up to €4,500. You will just need to sign a declaration confirming the build date for the SEAI. We would love to hear from you and would be happy to quote for your project.',
message: 'Unfortunately you are most likely not eligible for a grant at this point. We would love to hear from you and would be happy to give you further information.',
label: 'First Name', type: 'text', required: true
label: 'Last Name', type: 'text', required: true
label: 'Project Info / Query', type: 'textarea', required: true
label: 'Upload Files (up to 5)', type: 'file', required: false, multiple: true, maxFiles: 5
label: 'Company', type: 'text', required: false
label: 'Address', type: 'textarea', required: false
label: 'Eircode', type: 'text', required: false
label: 'Email', type: 'email', required: true
label: 'Mobile', type: 'tel', required: true
const [currentNode, setCurrentNode] = useState('start');
const [history, setHistory] = useState([]);
const [quizAnswers, setQuizAnswers] = useState(
const [formData, setFormData] = useState(
const [uploadedFiles, setUploadedFiles] = useState([]);
const [submitted, setSubmitted] = useState(false);
const [submitting, setSubmitting] = useState(false);
const [submitError, setSubmitError] = useState(null);
const node = nodes[currentNode];
const handleChoice = (option) =
newAnswers[node.field] = option.value;
Object.assign(newAnswers, option.setFields);
setQuizAnswers(newAnswers);
node: currentNode, choice: option.label, answers: quizAnswers
setCurrentNode(option.next);
const newHistory = [...history];
const lastStep = newHistory.pop();
setCurrentNode(lastStep.node);
setQuizAnswers(lastStep.answers);
const handleRestart = () =
const handleInputChange = (field, value) =
const formatFileSize = (bytes) =
if (bytes === 0) return '0 Bytes';
const mb = bytes / (1024 * 1024);
const getTotalFileSize = (files) =
return files.reduce((total, file) =
const handleFileChange = (e) =
const newFiles = Array.from(e.target.files);
const maxTotalSize = 50 * 1024 * 1024; // 50MB in bytes
Combine existing files with new files
const combinedFiles = [...uploadedFiles, ...newFiles];
alert(`You can upload a maximum of $
const allowedNewFiles = newFiles.slice(0, maxFiles - uploadedFiles.length);
if (allowedNewFiles.length
const finalFiles = [...uploadedFiles, ...allowedNewFiles];
if (getTotalFileSize(finalFiles)
alert('Total file size exceeds 50MB limit.');
setUploadedFiles(finalFiles);
if (getTotalFileSize(combinedFiles)
alert('Total file size exceeds 50MB limit. Please remove some files or choose smaller files.');
setUploadedFiles(combinedFiles);
const removeFile = (indexToRemove) =
setUploadedFiles(uploadedFiles.filter((_, index) =
index !== indexToRemove));
const handleSubmit = async (e) =
const submitData = new FormData();
submitData.append('formID', JOTFORM_FIELDS.formID);
submitData.append(JOTFORM_FIELDS.category, quizAnswers.category);
submitData.append(JOTFORM_FIELDS.buildDate, quizAnswers.buildDate);
submitData.append(JOTFORM_FIELDS.techAssessment, quizAnswers.techAssessment);
submitData.append(JOTFORM_FIELDS.ber, quizAnswers.ber);
submitData.append(JOTFORM_FIELDS.hliAvailable, quizAnswers.hliAvailable);
submitData.append(JOTFORM_FIELDS.hliUnder23, quizAnswers.hliUnder23);
submitData.append(JOTFORM_FIELDS.buildingType, quizAnswers.buildingType);
const currentFields = node.fields || [];
submitData.append(JOTFORM_FIELDS.firstName, formData.firstName || '');
submitData.append(JOTFORM_FIELDS.lastName, formData.lastName || '');
submitData.append(JOTFORM_FIELDS.info, formData.info || '');
submitData.append(JOTFORM_FIELDS.company, currentFields.includes('company') ? (formData.company || '') : 'N/A');
submitData.append(JOTFORM_FIELDS.address, currentFields.includes('address') ? (formData.address || '') : 'N/A');
submitData.append(JOTFORM_FIELDS.eircode, currentFields.includes('eircode') ? (formData.eircode || '') : 'N/A');
submitData.append(JOTFORM_FIELDS.email, formData.email || '');
submitData.append(JOTFORM_FIELDS.mobile, formData.mobile || '');
uploadedFiles.forEach((file) =
submitData.append('simple_spc', '253305766862060-253305766862060');
await fetch(JOTFORM_SUBMIT_URL,
console.error('Submission error:', error);
setSubmitError('There was an error submitting the form. Please try again.');
div className="hero-quiz-card"
div className="quiz-thank-you"
div className="success-icon-container"
color: '#2D3748', marginBottom: '1rem'
Thanks for getting in touch!
color: '#2D3748', marginBottom: '2rem'
We will be in contact with you soon.
background: linear-gradient(135deg, var(--color-orange-primary), var(--color-orange-deep));
color: var(--color-white);
box-shadow: 0 10px 25px rgba(0,0,0,0.1);
div className="hero-quiz-card" data-1p-ignore="true" data-lpignore="true"
div className="text-center mb-6"
h2 className="text-2xl font-bold text-white mb-2"
div className="quiz-content-wrapper" role="presentation" data-1p-ignore="true" data-lpignore="true"
div className="quiz-content" role="presentation" data-1p-ignore="true" data-lpignore="true"
node.type === 'question' && (
div className="quiz-question-container"
div className="quiz-intro"
div className="intro-icon-wrapper"
h3 className="quiz-question"
div className="quiz-options"
node.options.map((option, i) =
className="quiz-option-btn"
node.type === 'action' && (
div className="quiz-action-container"
div className="quiz-message quiz-message-green"
div className="quiz-error"
node.fields.map((fieldKey) =
const config = fieldConfig[fieldKey];
if (config.type === 'file')
className="form-group full-width"
div className="file-upload-wrapper"
label className="file-browse-btn"
input type="file" multiple onChange=
className="file-input-hidden" /
div className="text-xs mt-1"
if (config.type === 'textarea')
handleInputChange(fieldKey, e.target.value)
div className="form-submit"
button type="submit" disabled=
className="btn btn-form-submit"
submitting ? 'Sending...' : 'Submit Inquiry'
node.type === 'bounce' && (
div className="quiz-bounce-container"
div className="quiz-message"
div className="quiz-navigation mt-6 pt-4 border-t border-white/20"
className="nav-btn nav-back text-white flex items-center gap-2 hover:underline"
background: linear-gradient(135deg, #FF8C42, #E03E1A);
box-shadow: 0 20px 40px rgba(0,0,0,0.15);
margin-bottom: 1.5rem !important;
justify-content: space-between;
background: rgba(255,255,255,0.1);
border: 1px solid rgba(255,255,255,0.2);
background: rgba(255,255,255,0.2);
transform: translateX(5px);
grid-template-columns: 1fr;
color: rgba(255,255,255,0.9);
form-group input, .form-group textarea
border: 1px solid rgba(255,255,255,0.3);
background: rgba(255,255,255,0.95);
background: rgba(255,255,255,0.15);
border: 1px dashed rgba(255,255,255,0.4);
text-decoration: underline;
const sectionRef = useRef(null);
Scroll to top of section when submitted
smoothScrollTo('quote', 800);
Scroll to top of quiz section
Reset the input so the same file can be selected again if removed
Build FormData for Jotform submission
Form fields - use N/A for fields not shown
File uploads - append each file with array notation (Jotform uses [])
mode: 'no-cors' // Jotform doesn't allow CORS, so we submit blindly
With no-cors, we can't read the response, but submission typically works
smoothScrollTo('faq', 800);
section className="section section-quiz" ref=
div className="quiz-card-full"
h2 className="text-white mb-4"
p className="text-white mb-8"
className="btn btn-secondary btn-on-orange" data-1p-ignore data-lpignore="true"
background-color: var(--color-charcoal);
background: var(--color-white);
color: var(--color-orange-deep);
background: var(--color-charcoal);
section className="section section-quiz" id="quote" ref=
div className="section-header text-center"
span className="text-orange"
p className="section-subhead section-subhead-light"
Whether you're an installer looking to supply RVR systems or a homeowner exploring options, our team is here to help. Fill out the form to request product details, pricing, and expert guidance.
div className="quiz-card-full" data-1p-ignore="true" data-lpignore="true"
Breadcrumbs - hidden but kept for testing */
div className="quiz-breadcrumbs" style=
span className="breadcrumb-label"
className="breadcrumb-item"
className="breadcrumb-icon" /
div className="quiz-question-container" role="group" aria-label="Quiz question" data-1p-ignore="true" data-lpignore="true"
div className="quiz-options" role="group" aria-label="Answer options" data-1p-ignore="true" data-lpignore="true"
if (e.key === 'Enter' || e.key === ' ') handleChoice(option);
div className="quiz-footer-card"
div className="quiz-footer-links"
node.footerLinks.map((link, i) =
target="_blank" rel="noopener noreferrer" className="quiz-footer-link"
const totalSize = getTotalFileSize(uploadedFiles);
Max 5 files. Supported: Images, PDF, Word, Excel, and more
div className="uploaded-files-list"
uploadedFiles.map((file, index) =
className="uploaded-file-item"
span className="file-number"
span className="file-name"
span className="file-size"
className="file-remove-btn"
div className="files-total"
accept=".pdf,.doc,.docx,.xls,.xlsx,.csv,.txt,.rtf,.html,.zip,.mp3,.wma,.mpg,.flv,.avi,.jpg,.jpeg,.png,.gif"
className="file-input-hidden"
submitting ? 'Submitting...' : 'Submit Inquiry'
div className="bounce-links"
node.links.map((link, i) =
target="_blank" rel="noopener noreferrer" className="bounce-link"
div className="quiz-navigation"
className="nav-btn nav-back" data-1p-ignore data-lpignore="true"
className="nav-btn nav-restart" data-1p-ignore data-lpignore="true"
quiz-card-full .reveal-wrapper,
quiz-card-full .reveal-content
color: var(--color-white) !important;
margin-bottom: 24px !important;
quiz-card-full p, .quiz-card-full label
color: rgba(255, 255, 255, 0.95);
color: #cccccc !important;
Breadcrumbs - hidden but kept */
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
background: rgba(255, 255, 255, 0.1);
Content area - full width */
Options - light bg with dark text */
background: rgba(255, 255, 255, 0.95);
border: 2px solid rgba(255, 255, 255, 1);
color: var(--color-charcoal);
transition: all 0.2s ease;
border-color: var(--color-charcoal);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
transform: translateX(-10px);
quiz-option-btn:hover .option-icon
Intro - consistent style with messages */
color: var(--color-charcoal) !important;
background: var(--color-orange-primary);
Action container - full width */
Messages - unified style */
border-left: 4px solid var(--color-green-eco);
background: rgba(0, 0, 0, 0.2);
grid-template-columns: 1fr 1fr;
background: rgba(255, 255, 255, 0.9);
form-group input:focus, .form-group textarea:focus
outline: 2px solid var(--color-white);
background: rgba(0, 0, 0, 0.15);
background: rgba(255, 255, 255, 0.12);
uploaded-file-item:last-child
background: rgba(255, 100, 100, 0.25);
background: rgba(255, 80, 80, 0.5);
border-top: 1px solid rgba(255, 255, 255, 0.15);
color: var(--color-orange-deep) !important;
color: var(--color-orange-primary);
color: var(--color-orange-primary) !important;
transform: translateX(4px);
border-top: 1px solid rgba(255, 255, 255, 0.2);
border: 1px solid rgba(255, 255, 255, 0.4);
border-color: var(--color-white);
const handleSubmit = (e) =
alert('Form submission would be handled by your backend.');
section className="section bg-gradient-orange-warm" id="quote"
div className="text-center mb-[50px]"
p className="text-xl text-grey-mid mt-4 max-w-[700px] mx-auto"
form className="max-w-[700px] mx-auto bg-white p-12 rounded-lg shadow-card-hover" onSubmit=
div className="grid grid-cols-1 md:grid-cols-2 gap-5 mb-5"
div className="flex flex-col gap-2"
label htmlFor="name" className="font-semibold text-charcoal"
className="p-3 border-2 border-grey-light rounded font-body text-base transition-all focus:outline-none focus:border-orange-primary focus:ring-4 focus:ring-orange-primary/10"
label htmlFor="email" className="font-semibold text-charcoal"
placeholder="your@email.com"
label htmlFor="phone" className="font-semibold text-charcoal"
label htmlFor="type" className="font-semibold text-charcoal"
div className="flex flex-col gap-2 mb-8"
label htmlFor="message" className="font-semibold text-charcoal"
placeholder="Tell us about your project..."
className="p-3 border-2 border-grey-light rounded font-body text-base min-h-[120px] resize-y transition-all focus:outline-none focus:border-orange-primary focus:ring-4 focus:ring-orange-primary/10"
div className="text-center mt-[30px]"
button type="submit" className="btn btn-primary text-base px-12 py-4"
section className="section bg-white"
Reduce Energy Bills With a
Homeowners switching from older systems typically achieve:
div className="grid grid-cols-1 md:grid-cols-3 gap-[30px] mt-[50px]"
div className="card text-center border-2 border-orange-primary bg-gradient-to-br from-[#FFF5F0] to-white"
div className="text-5xl font-extrabold text-orange-deep font-heading mb-2"
div className="flex justify-center mb-2"
className="text-green-eco" /
p className="text-center text-grey mt-[50px] text-lg"
RVR heat pumps provide reliable, high-performance heating solutions for Irish homes.
import smartControlsImage from '../assets/smart-controls.jpg';
const SmartControls = () =
section className="section bg-light"
Smart Heating Controls for
div className="grid grid-cols-1 md:grid-cols-2 gap-[60px] items-center mt-[50px]"
getAssetUrl('/assets/smart-controls.jpg')
className="w-full rounded-lg shadow-card"
Smart thermostat integration",
Real-time energy monitoring",
Adaptive performance for Irish weather"
className="flex items-center gap-3 text-lg"
span className="inline-flex items-center justify-center w-6 h-6 rounded-full bg-green-eco text-white font-bold text-sm flex-shrink-0"
p className="text-grey mt-[30px] text-lg"
These features allow homeowners to optimize energy usage while installers can confidently recommend RVR systems.
export default SmartControls;
Calendar, Users, MapPin, CheckCircle
div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-[40px] mt-[50px]"
div className="card text-center"
div className="icon-circle"
Years of Heating Experience
Trusted by Certified Installers
Air-to-water heat pump installers across Ireland
Reliable Nationwide Supply
support for installers and homeowners
Home, RefreshCw, Wrench, TrendingUp, Leaf
getAssetUrl('/resources/New Build.jpeg')
width: '120px', height: '120px', objectFit: 'contain', marginBottom: '1.5rem', marginLeft: 'auto', marginRight: 'auto', display: 'block'
description: "New builds requiring energy-efficient home heating systems"
getAssetUrl('/resources/Upgrading.jpeg')
description: "Homes upgrading from older gas or oil boilers to heat pumps"
getAssetUrl('/resources/Retrofit.jpeg')
alt="Retrofit Projects" style=
title: "Retrofit Projects",
description: "Retrofit heating system replacement projects"
getAssetUrl('/resources/BER.jpeg')
alt="BER Improvement" style=
description: "Homeowners improving BER ratings"
getAssetUrl('/resources/Eco.jpeg')
description: "Anyone looking for a clean, eco-friendly heating solution"
Ideal for Various Heating Projects
div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-5 gap-[30px] mt-[50px]"
className="card text-center"
item.title === 'BER Improvement' ?
Zap, CloudSnow, VolumeX, ShieldCheck
title: "High-Efficiency Heat Pump System",
description: "Engineered to provide maximum efficiency, helping homeowners reduce heating costs by up to 50–70%. Installers trust this system for reliable performance and long-term savings."
title: "Perfect for All Irish Climates",
description: "Built to perform in cold, damp Irish weather, the Quantix S is reliable year-round and suitable for homes across Ireland."
title: "Ultra-Quiet Performance",
description: "Whisper-quiet operation makes it ideal for residential properties and family homes."
title: "Long-Term Peace of Mind",
description: "RVR Energy Technology offers extended support and warranty coverage for peace of mind, one of the strongest among heat pump systems in Ireland."
section className="section bg-dark"
div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-[40px] mt-[50px]"
features.map((feature, index) =
className="card card-dark"
div className="icon-circle icon-circle-dark"
h3 className="text-white text-xl mb-4"
p className="text-white/80"
const WinterPerformance = () =
icon: "❄️", text: "Low-temperature operation"
icon: "🛡️", text: "Anti-frost technology"
icon: "🌡️", text: "Advanced defrost management"
icon: "⚙️", text: "High-output compressor performance"
p className="text-xl text-white/80 mt-4 max-w-[700px] mx-auto"
The Quantix S system is designed for harsh winter conditions, with:
div className="grid grid-cols-1 md:grid-cols-2 gap-[30px] mt-[50px]"
className="flex items-center gap-5 p-6 bg-white/5 border border-white/10 rounded-lg"
h4 className="text-white text-xl m-0"
export default WinterPerformance;
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
ReactDOM.createRoot(document.getElementById('quantix-app')).render(
Helper to resolve asset URLs for both local development and Shopify.
In Shopify, assets are served from a CDN. We inject the base URL via a global variable
window.shopify_asset_url in the Liquid template.
Usage: getAssetUrl('/assets/my-image.jpg')
Local: "/assets/my-image.jpg"
Shopify: "https://cdn.shopify.com/.../assets/my-image.jpg"
export const getAssetUrl = (path) =
if (typeof window !== 'undefined' && window.shopify_asset_url)
let filename = path.split('/').pop();
Special handling for resources which are renamed during build/upload
The vite.config.js renaming logic: 'resources-' + file.replace(/ /g, '-')
if (path.includes('/resources/'))
filename = 'resources-' + filename.replace(/ /g, '-');
Smooth scroll to element with easing animation (bell curve / ease-in-out)
targetId - The ID of the element to scroll to (without #)
duration - Duration of the scroll animation in ms (default: 800)
offset - Offset from the top of the element (default: 0)
export const smoothScrollTo = (targetId, duration = 800, offset = 0) =
const target = document.getElementById(targetId);
const targetPosition = target.getBoundingClientRect().top + window.pageYOffset - offset;
const startPosition = window.pageYOffset;
const distance = targetPosition - startPosition;
Ease-in-out (bell curve) easing function
const easeInOutCubic = (t) =
Math.pow(-2 * t + 2, 3) / 2;
const animation = (currentTime) =
if (startTime === null) startTime = currentTime;
const timeElapsed = currentTime - startTime;
const progress = Math.min(timeElapsed / duration, 1);
const easeProgress = easeInOutCubic(progress);
window.scrollTo(0, startPosition + distance * easeProgress);
requestAnimationFrame(animation);
Smooth scroll to element and execute callback after scroll completes
callback - Function to execute after scroll completes
export const smoothScrollToWithCallback = (targetId, callback, duration = 800, offset = 0) =
# Quantix S Heat Pumps — High-Efficiency Air-to-Water Systems
RVR Energy Technology offers efficient air-to-water heat pump systems trusted by Irish installers and homeowners alike. The Quantix S delivers powerful, energy-efficient heating while helping reduce energy costs for Irish homes.
## Ideal for Various Heating Projects Across Ireland
- New builds requiring energy-efficient home heating systems
- Homes upgrading from older gas or oil boilers to heat pumps
- Retrofit heating system replacement projects
- Homeowners improving BER ratings
- Anyone looking for a clean, eco-friendly heating solution
## Why Choose the Quantix S Heat Pump?
### High-Efficiency Heat Pump System
Engineered to provide maximum efficiency, helping homeowners reduce heating costs by up to 50–70%. Installers trust this system for reliable performance and long-term savings.
### Perfect for All Irish Climates
Built to perform in cold, damp Irish weather, the Quantix S is reliable year-round and suitable for homes across Ireland.
### Ultra-Quiet Performance
Whisper-quiet operation makes it ideal for residential properties and family homes.
### Long-Term Peace of Mind
RVR Energy Technology offers extended support and warranty coverage for peace of mind, one of the strongest among heat pump systems in Ireland.
## Smart Heating Controls for Maximum Savings
Modern features include:
- Mobile app control
- Smart thermostat integration
- Real-time energy monitoring
- Temperature scheduling
- Adaptive performance for Irish weather
These features allow homeowners to optimize energy usage while installers can confidently recommend RVR systems.
## Reduce Energy Bills With a High-Efficiency Heat Pump
Homeowners switching from older systems typically achieve:
- 50–70% lower heating costs vs oil boilers
- 40–60% savings vs gas boilers
- Improved home comfort and energy efficiency
RVR heat pumps provide reliable, high-performance heating solutions for Irish homes.
## Reliable Heating in Irish Winters
The Quantix S system is designed for harsh winter conditions, with:
- Low-temperature operation
- Anti-frost technology
- Advanced defrost management
- High-output compressor performance
## Installer & Homeowner Trusted Brand
- 40+ years of heating experience
- Trusted by certified air-to-water heat pump installers
- Reliable nationwide supply across Ireland
- Transparent pricing & support for installers and homeowners
## Request a Quote
Whether you’re an installer looking to supply RVR systems or a homeowner exploring options, our team is here to help. Fill out the form to request product details, pricing, and expert guidance.
Meta Title:
Quantix S Heat Pumps – Efficient Air-to-Water Systems Ireland
Meta Description
RVR Energy Technology offers high-efficiency Quantix S heat pumps for Irish homes. Trusted by installers and homeowners for reliable, energy-saving heating.