1 2<!DOCTYPE html> 3<html class="no-js" lang="en-gb"> 4 <head> 5 6 7 <!-- Required meta tags always come first --> 8 <meta charset="utf-8"> 9 <meta name="viewport" content="width=device-width, initial-scale=1"> 10 <meta http-equiv="x-ua-compatible" content="ie=edge"> 11 12<meta property="og:image" content="https://www.heartinternet.uk/assets/images/heart_og.jpg"/> 13 14 15<!-- 16/** 17 * @license 18 * MyFonts Webfont Build ID 3102644, 2015-10-05T09:00:39-0400 19 * 20 * The fonts listed in this notice are subject to the End User License 21 * Agreement(s) entered into by the website owner. All other parties are 22 * explicitly restricted from using the Licensed Webfonts(s). 23 * 24 * You may obtain a valid license at the URLs below. 25 * 26 * Webfont: MuseoSansRounded-300 by exljbris 27 * URL: http://www.myfonts.com/fonts/exljbris/museo-sans-rounded/300/ 28 * 29 * Webfont: MuseoSansRounded-700 by exljbris 30 * URL: http://www.myfonts.com/fonts/exljbris/museo-sans-rounded/700/ 31 * 32 * 33 * License: http://www.myfonts.com/viewlicense?type=web&buildid=3102644 34 * Licensed pageviews: 500,000 35 * Webfonts copyright: Copyright (c) 2011 by Jos Buivenga. All rights reserved. 36 * 37 * © 2015 MyFonts Inc 38*/ 39--> 40 41<meta name="google-site-verification" content="CIdAaEKQli5cTn-RZyMbPkLa-PeaBeGg-iiGHFW3rnw" />
42<script type="text/javascript"> 43 44window.dataLayer = [{ 45 "page" : { 46 "siteSection" : "General", 47 "siteSubSection" : "Homepage", 48 "type" : "Informational" 49 } 50}] 51 52</script>
52 53<title>Hosting, Domains, Servers, Email and SSL - Heart Internet</title> 54<meta name="description" 55 content="Heart Internet offers reliable web hosting, domains, servers & Sucuri website protection." /> 56<link rel="canonical" href='https://www.heartinternet.uk/' /> 57 58<link rel="apple-touch-icon" href="apple-touch-icon.png"> 59<link rel="apple-touch-icon" sizes="57x57" href="https://www.heartinternet.uk/assets/img/favicons/apple-touch-icon-57x57.png"> 60<link rel="apple-touch-icon" sizes="60x60" href="https://www.heartinternet.uk/assets/img/favicons/apple-touch-icon-60x60.png"> 61<link rel="apple-touch-icon" sizes="72x72" href="https://www.heartinternet.uk/assets/img/favicons/apple-touch-icon-72x72.png"> 62<link rel="apple-touch-icon" sizes="76x76" href="https://www.heartinternet.uk/assets/img/favicons/apple-touch-icon-76x76.png"> 63<link rel="apple-touch-icon" sizes="114x114" href="https://www.heartinternet.uk/assets/img/favicons/apple-touch-icon-114x114.png"> 64<link rel="apple-touch-icon" sizes="120x120" href="https://www.heartinternet.uk/assets/img/favicons/apple-touch-icon-120x120.png"> 65<link rel="apple-touch-icon" sizes="144x144" href="https://www.heartinternet.uk/assets/img/favicons/apple-touch-icon-144x144.png"> 66<link rel="apple-touch-icon" sizes="152x152" href="https://www.heartinternet.uk/assets/img/favicons/apple-touch-icon-152x152.png"> 67<link rel="apple-touch-icon" sizes="180x180" href="https://www.heartinternet.uk/assets/img/favicons/apple-touch-icon-180x180.png"> 68<link rel="icon" type="image/png" href="https://www.heartinternet.uk/assets/img/favicons/favicon-32x32.png" sizes="32x32"> 69<link rel="icon" type="image/png" href="https://www.heartinternet.uk/assets/img/favicons/android-chrome-192x192.png" sizes="192x192"> 70<link rel="icon" type="image/png" href="https://www.heartinternet.uk/assets/img/favicons/favicon-96x96.png" sizes="96x96"> 71<link rel="icon" type="image/png" href="https://www.heartinternet.uk/assets/img/favicons/favicon-16x16.png" sizes="16x16"> 72<link rel="manifest" href="https://www.heartinternet.uk/assets/img/favicons/manifest.json"> 73<link rel="mask-icon" href="https://www.heartinternet.uk/assets/img/favicons/safari-pinned-tab.svg"> 74<meta name="msapplication-TileColor" content="#da532c"> 75<meta name="msapplication-TileImage" content="/mstile-144x144.png"> 76<meta name="theme-color" content="#ffffff"> 77 78<!-- Bootstrap CSS --> 79<link rel="stylesheet" href="/css/main.css?v=20221014"> 80<link rel="stylesheet" href="/css/components/trustpilot-hero-disturber.css?v=6"> 81<link rel="stylesheet" href="/css/components/trust-bar.css?v=20"> 82<link rel="stylesheet" href="/css/components/trustpilot-carousel.css?v=11"> 83<link rel="stylesheet" href="/css/components/hero-cta.css?v=4"> 84<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet"> 85<!-- slick slider css--> 86<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/jquery.slick/1.5.7/slick.css"/> 87 88<style type="text/css"> 89 .runthenet_ribbon { 90 max-width: 500px; 91 } 92 93@media (min-width: 1200px) { 94 .comp_table_1 .comp_slider { 95 padding-top: 5rem; 96 } 97} 98</style> 99 100 101<noscript><link rel="stylesheet" href="/css/nojs_header.css"></noscript> 102 103<style id="hi-ui-override"> 104 /* 105 * Prevent hi-ui Tailwind CSS (@layer utilities) from constraining Bootstrap 3 106 * containers. Tailwind sets max-width on .container at various breakpoints, but 107 * Bootstrap 3 uses fixed `width` (not max-width), so Tailwind's layered max-width 108 * leaks through. This unlayered rule beats the @layer utilities declaration. 109 */ 110 .container { 111 max-width: none; 112 } 113 114</style> 115<!-- TOM NEW STYLES--> 116<link rel="stylesheet" href="/css/2025-styling.css?v=10"> 117<!--<link rel="stylesheet" href="/css/pages/managed-wordpress.css?v=6">--> 118<link rel="stylesheet" href="/css/pages/home.css?v=17"> 119 120<!--<link rel="stylesheet" href="/css/spring-sale-2026/spring-sale-2026.css">--> 121<!-- Google Tag Manager -->
122<script>
vendor: 327 bytes, lines 122-126
122(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 123new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 124j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 125'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 126})(window,document,'script','dataLayer','
126GTM-P4C6N6ML
vendor: 3 bytes, line 126
126');
126</script>
126 127<!-- End Google Tag Manager --> 128 129<!--[if lt IE 9]>
130<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/selectivizr/1.0.2/selectivizr-min.js"></script>
vendor: 1 bytes, line 130
130
131<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min"></script>
vendor: 1 bytes, line 131
131
132<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
132 133<![endif]--> 134 135<!-- Lodash -->
136<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
136 137 138<!-- Pass site url to JS -->
139<script> 140 var site_url = 'https://www.heartinternet.uk/'; 141</script>
141 142
143<script type="text/javascript"> 144 var utag_data = { 145 'page.financeCategory' : "", // 146 'page.name' : "", // 147 'page.productCategory' : "", // 148 'page.productSubCategory' : "", // 149 'page.siteSection' : "", // 150 'page.siteSubSection' : "", // 151 'page.type' : "", // 152 'page.url' : "", // 153 'site.countryCode' : "", // 154 'site.environment' : "", // 155 'site.id' : "", // 156 'site.language' : "", // 157 'basket.checkoutSavings' : "", // 158 'basket.currency' : "", // 159 'basket.id' : "", // 160 'basket.noOfProducts' : "", // 161 'basket.products' : "", // 162 'basket.subTotal' : "", // 163 'basket.tax' : "", // 164 'basket.total' : "", // 165 'basket.voucher' : "", // 166 'basket.products.category' : "", // 167 'basket.products.extension_id' : "", // 168 'basket.products.id' : "", // 169 'basket.products.name' : "", // 170 'basket.products.numOfMonths' : "", // 171 'basket.products.price' : "", // 172 'basket.products.quantity' : "", // 173 'basket.products.sale_price' : "", // 174 'basket.products.subCategory' : "", // 175 'user.existingCustomer' : "", // 176 'user.id' : "", // 177 'user.loginState' : "", // 178 'transaction.checkoutSavings' : "", // 179 'transaction.currency' : "", // 180 'transaction.id' : "", // 181 'transaction.noOfProducts' : "", // 182 'transaction.paymentType' : "", // 183 'transaction.products' : "", // 184 'transaction.subTotal' : "", // 185 'transaction.tax' : "", // 186 'transaction.total' : "", // 187 'transaction.voucher' : "", // 188 'checkoutSteps' : "" // 189 } 190</script>
190 191 192<!-- TrustBox script -->
193<script type="text/javascript" src="https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js" async></script>
193 194<!-- End TrustBox script --> 195 196<!-- Hi-UI React Components -->
197<script crossorigin src="/hi-ui/react-18.2.0.production.min.js"></script>
vendor: 1 bytes, line 197
197
198<script crossorigin src="/hi-ui/react-dom-18.2.0.production.min.js"></script>
198 199<link rel="stylesheet" href="/hi-ui/hi-ui-v1.38.0.css" />
200<script charset="utf-8" src="/hi-ui/hi-ui-v1.38.0.js"></script>
vendor: 1 bytes, line 200
200
201<script src="/hi-ui/main-nav-data.js"></script>
vendor: 1 bytes, line 201
201
202<script src="/hi-ui/footer-data.js"></script>
202 203 204<style id="hi-ui-footer-override"> 205 /* 206 * Temporary: left-align the hi-ui footer section headings. hi-ui v1.38.0 sets 207 * no text-align on .hi-ui-footer-section__title, so the headings inherit the 208 * centring applied by the site's own styles. Loaded after hi-ui's stylesheet 209 * and matching its selector specificity. Remove once fixed upstream. 210 */ 211 #hi-ui-footer .hi-ui-footer-section__title { 212 text-align: left; 213 } 214</style> 215<!-- TrustBox script -->
216<script type="text/javascript" src="//widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js" async></script>
216 217<!-- End TrustBox script --> 218<style> 219 .domain_search_text { 220 max-height: 100px; 221 } 222 223 .domain-names-home-wrapper { 224 /*height: 45px;*/ 225 overflow: visible; 226 margin-top: 0rem; 227 padding: 0px; 228 z-index: 11; 229 position: relative; 230 background: #050B2D; 231 } 232 233 @media(max-width: 992px) { 234 .domain-names-home-wrapper { 235 height: auto; 236 margin-bottom: 0rem; 237 z-index: 0; 238 } 239 } 240 241 .background_domain_names_home { 242 background: #050B2D; 243 background-size: cover; 244 max-width: 100%; 245 border-radius: 0px; 246 } 247 248 .single-year { 249 line-height: 23px; 250 } 251 252 .text-inner strong { 253 font-weight: normal; 254 } 255 256 .wwwimage { 257 /*background: url("/assets/img/domain_names/wwwglobesmall.jpg");*/ 258 max-width: 80px; 259 margin-right: 50px; 260 margin-left: -40px; 261 display: none; 262 } 263 264 .wwwimage img { 265 max-width: 80px; 266 } 267 268 @media(min-width: 992px) { 269 .wwwimage { 270 display: inherit; 271 } 272 } 273</style> 274 275 276 277 278 279</head> 280 <body class="_page"> 281 282 283<!-- Google Tag Manager (noscript) â must be the first thing after <body> opens -->
vendor: 68 bytes, lines 283-284
283 284<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
284GTM-P4C6N6ML
vendor: 83 bytes, lines 284-285
284" 285height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
286<!-- End Google Tag Manager (noscript) --> 287 288<link rel="stylesheet" href="/css/pages/top-bar/top-bar.css">
289<script type="module" src="/assets/js/top-bar.js?v=20260729"></script>
289 290<!--
290<script src="/assets/js/snow.js"></script>
290 --> 291 292<div id="header"> 293 <div id="hi-ui-top-nav-root"></div> 294 <!-- Trustpilot pill in the top bar. It is a sibling of the nav rather than 295 inside it: hi-ui's TopNav takes no slot prop (only showSearch, 296 isLoggedIn, wwwDomain, customerDomain, className, style), so there is 297 nowhere to pass it. Light variant, because the top bar is #f8f8f8. 298 299 It shows on every page, the homepage included. Its placement depends on 300 the search input, which is why segment_1 is tested again here rather 301 than the pill simply being hidden: with a search box it sits to the 302 right of it, and without one (the homepage, where showSearch is false) 303 --start pulls it back to the left edge of the container instead of 304 leaving it floating where the input would have been. --> 305 <div class="header-disturber header-disturber--start"><!-- ============================================================================ 306 Trustpilot hero disturber 307 308 Built from Figma node 5959:721 ("Trustpilot hero widget"). A 296x45 309 pill for sitting over a hero photo: score, 4.5 stars, Trustpilot logo. 310 311 Figma geometry, kept exactly: 312 pill 296x45, rgba(0,0,0,0.7), 1px #717171, radius 5px 313 "4.7" Geologica ExtraBold 800, 22px, white, 12px from the left 314 stars 126x23, 7px after the score 315 logo 90x22, 12px after the stars, 16px from the right 316 (12 + 33 + 7 + 126 + 12 + 90 + 16 = 296) 317 318 Takes two optional embed params: 319 extraClass e.g. "tp-disturber--sm" for the two-thirds-scale version 320 light any value swaps the marks for their light-ground pair, 321 pair it with the tp-disturber--light class 322 323 The dark marks are the Figma ones: white logotype, #1CECA8 star. The 324 light pair is Trustpilot's own light treatment: near-black logotype, 325 #00B67A star, matching trustpilot-star-4.5.svg. The two star files 326 have slightly different aspect ratios, so the light one is sized by 327 height alone and lets its width follow. 328 329 NOTHING TO ADD TO THE PAGE. The stylesheet comes from _inc/css 330 site-wide, and it carries the styles, the hero placement AND the font. 331 332 DO NOT load Geologica from Google Fonts. An earlier version of this 333 comment said to add a fonts.gstatic.com preconnect and a 334 fonts.googleapis.com stylesheet; that does not work here. The CSP in 335 public_html/.htaccess sets font-src without fonts.gstatic.com, so the 336 stylesheet would load and the font file itself would be refused, 337 leaving the number in the fallback face. The @font-face in 338 components/trustpilot-hero-disturber.scss self-hosts a subset instead, 339 weight 800 only, digits and a period, 2KB against 25KB for the full 340 latin face. To add a character, fetch a new subset as that file 341 describes: 342 anything outside the subset falls back mid-string and you get two 343 typefaces inside one number. 344 345 THE SCORE IS HARD-CODED. 4.7, correct as at 22 September 2026. A 346 Trustpilot widget cannot be styled into this shape, so the number has 347 to be ours. Whoever changes it must also swap the stars SVG if the 348 rounding changes: 4.7 rounds to 4.5 stars, and the file is named for 349 what it draws. 350 ============================================================================ --> 351<a class="tp-disturber tp-disturber--sm tp-disturber--light" href="https://uk.trustpilot.com/review/heartinternet.uk" target="_blank" rel="noopener" aria-label="Rated 4.7 out of 5 on Trustpilot. Opens in a new tab."> 352 <span class="tp-disturber__score">4.7</span> 353 354 <img class="tp-disturber__stars" src="/assets/img/trustpilot/trustpilot-star-4.5.svg" alt="" height="23" aria-hidden="true"> 355 <img class="tp-disturber__logo" src="/assets/img/trustpilot/trustpilot-logo-onlight.svg" alt="" width="90" height="22" aria-hidden="true"> 356 357</a></div> 358 <div id="hi-ui-main-nav-root"></div> 359</div>
360<script> 361(function() { 362 var isLoggedIn = document.cookie.split(';').some(function(c) { 363 return c.trim().indexOf('logged_in=') === 0; 364 }); 365 var wwwDomain = window.location.hostname; 366 // Required from hi-ui v1.35.2 on. Before it, the login/account hrefs were 367 // hardcoded to the portal inside the component; now they are built from this 368 // prop, whose default is '' meaning SAME ORIGIN. That default is right on the 369 // portal, where same-origin is the portal â on www it silently turns the 370 // login link into www.heartinternet.uk/manage/, which is not the portal. 371 var customerDomain = 'customer.heartinternet.uk'; 372 373 window.HIUI.mountTopNav('hi-ui-top-nav-root', { 374 isLoggedIn: isLoggedIn, 375 showSearch: false, 376 wwwDomain: wwwDomain, 377 customerDomain: customerDomain 378 }); 379 380 var navData = window.__HI_UI_MAIN_NAV_DATA; 381 if (navData) { 382 window.HIUI.mountMainNav('hi-ui-main-nav-root', { 383 items: navData.items, 384 saleBadge: React.createElement('div', { className: 'hi-ui-sale-label' }, 'SALE'), 385 isLoggedIn: isLoggedIn, 386 wwwDomain: wwwDomain, 387 customerDomain: customerDomain, 388 isMobileFixed: false 389 }); 390 } 391})(); 392</script>
392 393 394<section class="domain-names-home-wrapper"> 395 <div class="background_domain_names_home container"> 396 <div class="row"> 397 <form class="domain_search_form" action="/domain-names"> 398 <input type="text" class="domain_search" name="domain" placeholder="Search for your ideal domain name"> 399 <button type="submit" class="btn primary_button domain_search_button" value="Search">Search</button> 400 </form> 401 <div class="domain_search_text"> 402 <div class="text-inner text-bigger"> 403 <strong> 404 <!-- Black Friday Sale 405 <img class="black-friday-sale" title="sale" alt="sale" src="/assets/black-friday-2025/sale-icon.svg" style=" 406 height: 30px; 407 margin-top: -5px;"> --> 408 409 <!-- Original --> 410 <span style="display: inline-block; 411 background: #c11731; 412 padding: 1px 7px 0; 413 border-radius: 5px; margin-right:15px;">SALE</span>Domains from 99p</strong> 414 </div> 415 <div class="wwwimage"> 416 <img src="/assets/img/domain_names/wwwglobesmall.jpg" /> 417 </div> 418 <div class="text-inner single-year"> 419 <strong>Plus discounts on single year domains</strong> 420 </div> 421 </div> 422 </div> 423 </div> 424</section> 425 426<!--- awards hero starts here (Figma: Main / Homepage Hero 5603-1238) --> 427<section class="awards-hero"> 428 <div class="container"> 429 <div class="awards-hero__flex"> 430 431 <div class="awards-hero__panel"> 432 <p class="awards-hero__eyebrow"> 433 <img src="/assets/img/homepage-hero-2026/eyebrow-mark.svg" alt="" width="13" height="19"> 434 <span>Industry judged. Customer rated.</span> 435 </p> 436 437 <h2 class="awards-hero__headline">Named the UK’s best hosting provider. <span class="awards-hero__underlined">Twice.</span></h2> 438 439 <p class="awards-hero__sub">Two separate awards for Best Hosting Provider this year, an innovation award for the engineering behind it, and <strong>4.7</strong> out of <strong>5</strong> from the people who use it every day.</p> 440 441 442 <a class="awards-hero__cta" href="#packages">View hosting plans</a> 443 </div> 444 445 <div class="awards-hero__proof"> 446 447 <div class="proof-card proof-card--ukba"> 448 <span class="proof-card__year">2026</span> 449 <img class="proof-card__logo" 450 src="/assets/img/homepage-hero-2026/tech-award-win.png" 451 srcset="/assets/img/homepage-hero-2026/tech-award-win.png 1x, 452 /assets/img/homepage-hero-2026/[email protected] 2x" 453 alt="UK Business Tech Awards 2026 winner" width="63" height="43"> 454 <span class="proof-card__text">Best UK web<br>hosting provider</span> 455 </div> 456 457 <div class="proof-card proof-card--sme"> 458 <span class="proof-card__year">2026</span> 459 <span class="sme-mark" role="img" aria-label="SME News"> 460 <span class="sme-mark__name">SME</span> 461 <span class="sme-mark__news">news</span> 462 </span> 463 <span class="proof-card__text">Best UK web<br>hosting provider</span> 464 </div> 465 466 <div class="proof-card proof-card--gapstars"> 467 <span class="proof-card__year">2026</span> 468 <img class="proof-card__icon" src="/assets/img/homepage-hero-2026/gapstars-icon.svg" alt="" width="38" height="36"> 469 <span class="proof-card__stack"> 470 <img class="proof-card__wordmark" src="/assets/img/homepage-hero-2026/gapstars-text.svg" alt="Gapstars" width="78" height="11"> 471 <span class="proof-card__text">Innovation award</span> 472 </span> 473 </div> 474 475 <div class="proof-card proof-card--cx"> 476 <span class="proof-card__year">2026</span> 477 <span class="sme-mark" role="img" aria-label="SME News"> 478 <span class="sme-mark__name">SME</span> 479 <span class="sme-mark__news">news</span> 480 </span> 481 <span class="proof-card__text">Excellence in customer experience improvement</span> 482 </div> 483 484 485 </div> 486 487 </div> 488 </div> 489</section> 490<!--- awards hero ends here --> 491 492<!-- ============================================================================ 493 Trust bar, widget row 494 495 Pairs with _components/trust-bar and shares its look: same ground, 496 same hairline, same container. The difference is what is in it: one 497 live Trustpilot Horizontal widget rather than the static awards and 498 marks. 499 500 On the 21 product pages it sits directly above the awards strip. On the 501 homepage the two are split: this one under the hero, the awards strip 502 above the footer. 503 504 Unlike the awards strip, nothing here is hard-coded. The widget renders 505 its own score, stars and review count, and keeps them current. 506 507 Three changes from the code the Trustpilot portal hands you: 508 data-locale en-US to en-GB, as every other live embed here does 509 the fallback link www.trustpilot.com to uk.trustpilot.com, as every 510 other live Trustpilot link here does 511 no data-stars the Horizontal widget shows the overall score, not 512 individual reviews, so there is nothing to filter 513 514 data-style-height is 28px, not the 50px the portal hands you. The 515 Horizontal widget draws its content at the TOP of whatever box it is 516 given, so 50px left about 20px of empty iframe underneath and the row 517 read as badly aligned however the iframe itself was centred. 28px is 518 the content's own height, so centring the iframe now centres what you 519 can actually see. 520 521 data-font-family and data-text-color are the only two controls 522 Trustpilot gives over the widget's interior; everything else inside it 523 is theirs. 524 525 The stylesheet comes from _inc/css and the Trustpilot bootstrap script 526 from _inc/js, both site-wide; no per-page link is needed. 527 ============================================================================ --> 528<section class="trust-bar trust-bar--widget"> 529 <div class="container"> 530 531 <!-- TrustBox widget. The markup carries the Horizontal one, which is 532 what ships if the swap script below never runs. --> 533 <div class="trustpilot-widget" data-tp-strip data-locale="en-GB" data-template-id="5406e65db0d04a09e042d5fc" data-businessunit-id="53ef4c00000064000579a4fa" data-style-height="28px" data-style-width="100%" data-token="931c0d9c-3f6f-4457-bc31-b1ab6c6d4a04" data-font-family="Fira Sans"> 534 <a href="https://uk.trustpilot.com/review/heartinternet.uk" target="_blank" rel="noopener">Trustpilot</a> 535 </div> 536 <!-- End TrustBox widget --> 537 <!-- ============================================================================ 538 Trustpilot widget swap 539 540 Embed this directly AFTER any Trustpilot widget that carries the 541 data-tp-strip attribute. It renders the Horizontal widget at 1100px and 542 up, and Micro TrustScore below it. 543 544 WHY. The Horizontal widget drops its own content as its iframe narrows 545 and there is no attribute to stop it. Measured on /vps: the full line 546 needs an iframe of about 1070px, at ~870 it loses "Our customers say", 547 at ~710 only "Excellent" survives, and under ~600 it is stars and a logo 548 with no score and no review count at all. 549 550 Micro TrustScore keeps the score AND the Trustpilot mark in a narrow 551 box: "Excellent 4.7 out of 5 *Trustpilot". Micro Combo was the other 552 candidate and was rejected: at 360px it renders "Excellent" and stars 553 but drops the Trustpilot logo, which is the part that makes this 554 third-party evidence rather than our own claim. Micro Review Count fits 555 too but trades the score for the volume, and the score is the better 556 number here. 557 558 ONE IFRAME, NOT TWO. Two divs toggled with CSS would be simpler, but 559 Trustpilot's bootstrap initialises hidden widgets too, so every page 560 would load both. This runs during parse, before the async bootstrap has 561 scanned the DOM, so it only ever rewrites the attributes and the 562 bootstrap then renders whichever one is correct. window.Trustpilot is 563 undefined at that point, which is exactly why the re-render call is 564 guarded. 565 566 The heights are the widgets' own content heights, not preferences. 567 Micro TrustScore lays its document out at 24px whatever 568 data-style-height says, so a shorter iframe just clips the bottom of it; 569 Horizontal does the same at 28px. If a page styles the widget's box, its 570 min-height has to match these or the spare shows as dead space under the 571 iframe. See .trust-bar--widget in components/trust-bar.scss. 572 573 The media query listener is for a large tablet turned on its side: 1024 574 to 1366 crosses the breakpoint. A phone rotating does not. 575 ============================================================================ -->
576<script> 577(function () { 578 /* every widget that opted in, not just the first: /testimonials-and-reviews 579 uses this as well as the strip under the product heroes */ 580 var els = document.querySelectorAll('[data-tp-strip]'); 581 if (!els.length || !window.matchMedia) {return;} 582 if (window.__tpStripSwap) {return;} 583 window.__tpStripSwap = true; 584 585 var wide = window.matchMedia('(min-width: 1100px)'); 586 var HORIZONTAL = { id: '5406e65db0d04a09e042d5fc', height: '28px' }; 587 var MICRO = { id: '5419b637fa0340045cd0c936', height: '24px' }; 588 589 function apply() { 590 var want = wide.matches ? HORIZONTAL : MICRO; 591 for (var i = 0; i < els.length; i++) { 592 var el = els[i]; 593 if (el.getAttribute('data-template-id') === want.id) {continue;} 594 el.setAttribute('data-template-id', want.id); 595 el.setAttribute('data-style-height', want.height); 596 /* only once the bootstrap has loaded; on first run it has not, 597 and setting the attributes is enough */ 598 if (window.Trustpilot) { 599 el.innerHTML = '<a href="https://uk.trustpilot.com/review/heartinternet.uk" target="_blank" rel="noopener">Trustpilot</a>'; 600 window.Trustpilot.loadFromElement(el, true); 601 } 602 } 603 } 604 605 apply(); 606 if (wide.addEventListener) { wide.addEventListener('change', apply); } 607 else if (wide.addListener) {wide.addListener(apply);} 608}()); 609</script>
609 610 611 612 </div> 613</section> 614 615 616<section class="chart grey_background"> 617 <div class="container"> 618 <h1>Award-winning hosting with great value domains</h1> 619 <span class="gradient-underline"></span> 620 621 <div id="packages" class="flex"> 622 <div class="col"> 623 <span class="gradient-line" data-value="5"></span> 624 <img src="/assets/img/cpanel-hosting/cpanel-hosting-icon.svg" /> 625 <h2>Web Hosting</h2> 626 627 <div class="offer-label"> 628 <span>Up to 50% off</span> 629 </div> 630 <ul> 631 <li> 632 <a data-toggle="popover" data-trigger="hover" 633 data-content="NVMe storage helps pages load quicker and keeps sites responsive."> 634 Fast UK web hosting on NVMe storage 635 </a> 636 </li> 637 <li> 638 <a data-toggle="popover" data-trigger="hover" 639 data-content="SSL gives your site the padlock. Backups help you restore if something goes wrong. Mailboxes give you email on your domain."> 640 Free SSL, backups, and mailboxes 641 </a> 642 </li> 643 <li> 644 <a data-toggle="popover" data-trigger="hover" 645 data-content="Built for reliability, our platform is designed to stay stable under real-world demand."> 646 99.9% uptime guarantee 647 </a> 648 </li> 649 </ul> 650 <div class="starting-from"> 651 From only £3 a month 652 </div> 653 <a id="Button_BuyNow_1" href="/web-hosting"> 654 <button class="btn primary_button">View packages</button> 655 </a> 656 657 </div> 658 659 <div class="col"> 660 <span class="gradient-line"></span> 661 <img src="/assets/img/managed-wordpress/wp-ai-product-icon.svg"> 662 <h2>Managed WordPress</h2> 663 664 <div class="offer-label"> 665 <span>Up to 35% off</span> 666 </div> 667 668 669 <ul> 670 <li> 671 <a data-toggle="popover" data-trigger="hover" 672 data-content="Our AI site builder helps you generate pages, layout and starter content in minutes."> 673 Build your WordPress site faster with AI 674 </a> 675 </li> 676 <li> 677 <a data-toggle="popover" data-trigger="hover" 678 data-content="Manage sites, updates and access in one place without jumping between logins."> 679 Simple management with WP Squared 680 </a> 681 </li> 682 <li> 683 <a data-toggle="popover" data-trigger="hover" 684 data-content="Test changes safely, stay protected, and roll back quickly if needed."> 685 Staging, security, and backups 686 </a> 687 </li> 688 </ul> 689 <div class="starting-from"> 690 From only £8.42 a month 691 </div> 692 <a id="Button_BuyNow_2" href="/managed-wordpress"> 693 <button class="btn primary_button">View packages</button> 694 </a> 695 </div> 696 697 <div class="col"> 698 <span class="gradient-line"></span> 699 <img src="/assets/img/vps/vps-product-icon.svg" /> 700 <h2>Virtual Private Servers</h2> 701 702 <div class="offer-label vps"> 703 Full root access 704 </div> 705 <!-- BF SALE 706 <div class="bf-sale-container"> 707 <div class="column"> 708 <div class="price"> 709 <div class="credit-price price"> 710 £29.99/mo 711 </div> 712 </div> 713 <div class="price-sub"> 714 <small class="vat-text">+ 20% VAT</small><br> 715 <small class="period">Billed monthly</small> 716 </div> 717 </div> 718 <div class="column"> 719 <div class="offer-label"> 720 <span>50<small>%</small> off</span> 721 <small>First month</small> 722 <span>jan26</span> 723 </div> 724 </div> 725 </div> --> 726 727 <ul> 728 <li> 729 <a data-toggle="popover" data-trigger="hover" 730 data-content="VPS gives you allocated CPU and RAM for steadier performance."> 731 Dedicated resources for busy sites and apps 732 </a> 733 </li> 734 <li> 735 <a data-toggle="popover" data-trigger="hover" 736 data-content="Faster disk performance helps with databases, apps and page load times."> 737 Fast, responsive NVMe storage 738 </li> 739 <li> 740 <a data-toggle="popover" data-trigger="hover" 741 data-content="Add resources when you need more headroom, without starting again."> 742 Easily scale as your traffic grows 743 </a> 744 </li> 745 </ul> 746 <div class="starting-from"> 747 From only £8.09 a month 748 </div> 749 <a id="Button_BuyNow_3" href="/vps"> 750 <button class="btn primary_button">View packages</button> 751 </a> 752 </div> 753 754 755 <div class="col">
756 <span class="gradient-line"></span> 757 <img src="/assets/img/email/email-product-icon.svg" /> 758 <h2>Business Email</h2> 759 760 <div class="offer-label"> 761 <span>Up to 50% off</span> 762 </div> 763 764 <ul> 765 <li> 766 <a data-toggle="popover" data-trigger="hover" 767 data-content="Email that matches your business name builds trust and looks the part."> 768 Professional email on your domain 769 </a> 770 </li> 771 <li> 772 <a data-toggle="popover" data-trigger="hover" 773 data-content="Helps reduce junk mail and blocks common threats before they reach your inbox."> 774 Spam and antivirus protection 775 </a> 776 </li> 777 <li> 778 <a data-toggle="popover" data-trigger="hover" 779 data-content="Shared calendars and contacts make it easier to stay organised across a team."> 780 Shared calendars and contacts 781 </a> 782 </li> 783 </ul> 784 <div class="starting-from"> 785 From only £6.50 a month 786 </div> 787 <a id="Button_BuyNow_4" href="/business-email"> 788 <button class="btn primary_button">View packages</button> 789 </a> 790 </div> 791 </div> 792</section> 793 794<section id="contact" class="gradient_background text_white"> 795 <div class="contact home pb-0"> 796 <div class="container"> 797 <div class="row mb-3"> 798 <div class="contact_text mb-3">Got a question? Our <a href="/support">Support Database</a> may have the answer, <br/>or <a href="https://customer.heartinternet.uk/manage/ticket.cgi" target="_blank">log in</a> to raise a ticket for support and access live chat</div> 799 <div class="text-center small">*Please note: you will need to accept cookies to see and use our live chat service.</div> 800 </div> 801 </div> 802 </div> 803</section> 804 805<!--- domain names starts here --> 806<section class="domain_names white_background"> 807 <div class="container"> 808 <div class="row"> 809 <h6>Great value domain names</h6> 810 <span class="gradient-underline"></span> 811 <h2>Register your perfect domain name today at a perfect price, excluding VAT at 20%</h2> 812 </div> 813 <div class="row"> 814 <div class="domain_search_container"> 815 <form action="/domain-names"> 816 <label for="domain_search"></label> 817 <input type="text" class="domain_search" name="domain" 818 placeholder="Your perfect domain name"> 819 <button type="submit" class="btn primary_button domain_search_button" id="search_banner" value="Search"><span class="hide-at-mobile">Search</span> 820 </button> 821 </form> 822 </div> 823 </div> 824 <div class="row domain-logos"> 825 <div class="domain_logo"> 826 <img class="couk" src="/assets/img/logos/couk.png" alt=".co.uk domain"> 827 <div class="price"> 828 <span class="price__previous">9.99/yr</span><br> 829 <br> 830 only <span class="pounds">£5.99*</span>/yr<br><br> 831 </div> 832 </div> 833 <div class="domain_logo"> 834 <img class="com" src="/assets/img/logos/com.png" alt=".com domain"> 835 <div class="price"> 836 <span class="price__previous">£13.99/yr</span><br> 837 <br> 838 only <span class="pounds">£9.99*</span>/yr 839 </div> 840 </div> 841 <div class="domain_logo"> 842 <img class="uk" src="/assets/img/logos/uk.png" alt=".uk domain"> 843 <div class="price"> 844 <span class="price__previous">£9.99/yr</span><br> 845 <br> 846 only <span class="pounds">£5.99*</span>/yr<br><br> 847 </div> 848 </div> 849 850 </div> 851 <div class="row"> 852 <p class="terms">* <a href="/terms">Terms & Conditions</a> apply</p> 853 </div> 854 </div> 855</section> 856<!--- domain names ends here --> 857 858<section class="why-choose grey_background"> 859 <div class="container left"> 860 <h2>Why choose Heart Internet?</h2> 861 <span class="gradient-underline"></span> 862 <div class="row"> 863 <div class="col"> 864 <h3>Because getting online should be simple.</h3> 865 866 <p>Weâve spent over 20 years helping businesses build, run and grow online with domains, email, web hosting, Managed WordPress, VPS and dedicated servers all under one roof.</p> 867 868 <p>
868With UK-based infrastructure, recently upgraded platforms, support 7 days a week and an award-winning team behind the scenes, we offer dependable products, sensible pricing and the experience to keep everything running smoothly.</p> 869 </div> 870 871 <div class="col"> 872 873 </div> 874 </div> 875 </div> 876 </div> 877</section> 878 879<!-- BEGIN CUSTOMER REVIEWS --> 880<!-- ============================================================================ 881 Trustpilot quote carousel (mockup option D) 882 883 One review at a time, centred, with arrows and dots. The quote itself is 884 our markup; the score above it and the review count below it are live 885 Trustpilot widgets. 886 887 WHY THE QUOTE IS NOT A WIDGET. Trustpilot's nearest shipping widget is 888 Quote (54d0e1d8764ea9078c79e6ee), which sets review TITLES in green 889 quotation marks, three at a time, left aligned, with its own type and 890 its own chrome. data-font-family and data-text-color are the only two 891 controls it gives over a widget's interior, so the large navy 892 blockquote, the gradient rule, the arrows and the dots in option D 893 cannot be reached from it. That part is built here instead. 894 895 WHY THE NUMBERS ARE. A widget is an iframe on widget.trustpilot.com, so 896 its score and count cannot be read out and reprinted in our own markup: 897 the browser blocks it, and it would be a licensing problem even if it 898 did not. Putting the widgets in the two slots that carry numbers is the 899 only way to keep them current, so nothing in this file states a score 900 or a review count. 901 902 Micro TrustScore (5419b637fa0340045cd0c936) gives the score and no 903 count; Micro Review Count (5419b6a8b0d04a076446a9ad) gives the count 904 and no score; Micro Combo gives stars and a count but no numeric score. 905 None gives all three, hence the two of them, one per slot. The count 906 widget renders as "See our N reviews on Trustpilot", which is the 907 read-all-reviews link this block wanted anyway. 908 909 The trade is that their interiors are Trustpilot's. data-font-family is 910 set to Fira Sans to agree with the Horizontal widget in the trust bar 911 higher up the same page; beyond that they look how Trustpilot draws 912 them, not how the mockup drew them. 913 914 THE REVIEWS THEMSELVES ARE HARD-CODED, and that is the other trade. 915 They do not refresh the way a widget's do, so they need a look at from 916 time to time. 917 918 On /web-hosting they are the same three as that page's Review JSON-LD, 919 deliberately: Google wants review markup to match visible copy, and 920 before this they were in the schema and nowhere on the page. Change 921 one, change both. NO OTHER PAGE using this component has Review 922 JSON-LD, so there is nothing to keep in step elsewhere. 923 924 NO DATES. The JSON-LD carries none, and inventing dates for real named 925 reviewers is not on. The caption says "Verified Trustpilot review" and 926 stops there. Add datePublished to the schema and the date here together 927 if they are wanted. 928 929 ADDING A REVIEW: copy a <figure class="tp-carousel__review"> and add a 930 dot button. Dots and reviews are matched by index, so the counts have 931 to agree. On /web-hosting, add it to that page's Review JSON-LD too. 932 933 The stars are per review, but there is currently only a 5-star asset 934 that matches: trustpilot-stars-5.svg, Trustpilot's square #00B67A 935 tiles at 512x96. The older 4stars.svg beside it is a different design 936 entirely - rounded dark-green #00814E tiles on a 374x69 canvas - so a 937 4-star review needs a matching asset made first, the same way 938 trustpilot-stars-5.svg was made from trustpilot-star-4.5.svg. 939 940 The stars above each quote stay static: they are that reviewer's own 941 rating, not the business score, so they are not a number that drifts. 942 943 TWO REVIEW SETS. set="domains" swaps the three reviews for the ones the 944 domain pages were already showing, which include Richie's, about 945 domains specifically. Left out, you get the hosting three. Both sets are 946 three long, which matters: the dot buttons below are static markup and 947 have to match the number of reviews. 948 949 THE HEADING takes an optional title param, so the same component can be 950 scoped per page without a copy of the file. On the embed, after the 951 template path, add: 952 title="What our web hosting customers say" 953 Left out, it falls back to "What our customers say". 954 955 The braces are left off that example ON PURPOSE. EE parses template 956 tags inside HTML comments, so a complete embed tag written out here 957 makes this file embed itself and the page dies with "template loop due 958 to improperly nested sub-templates". Never write a whole embed tag in a 959 comment in this codebase. It carries the 960 site's standard <span class="gradient-underline"> like every other 961 section heading on the page. 962 963 That underline is navy-to-green, and so was the rule under the quote in 964 the mockup. Two of them 250px apart said the same thing twice, so the 965 one under the quote is now a quiet neutral hairline: it still separates 966 the quote from the attribution, without competing with the heading. 967 968 The stylesheet comes from _inc/css and the Trustpilot bootstrap script 969 from _inc/js, both site-wide; no per-page link is needed. 970 ============================================================================ --> 971<section class="tp-carousel"> 972 <div class="container"> 973 974 <h2 class="tp-carousel__title">What our customers are saying about us</h2> 975 <span class="gradient-underline"></span> 976 977 <!-- TrustBox widget - Micro TrustScore --> 978 <div class="tp-carousel__score trustpilot-widget" data-locale="en-GB" data-template-id="5419b637fa0340045cd0c936" data-businessunit-id="53ef4c00000064000579a4fa" data-style-height="24px" data-style-width="100%" data-style-alignment="center" data-font-family="Fira Sans"> 979 <a href="https://uk.trustpilot.com/review/heartinternet.uk" target="_blank" rel="noopener">Trustpilot</a> 980 </div> 981 <!-- End TrustBox widget --> 982 983 <div class="tp-carousel__frame" data-tp-carousel> 984 985 <button class="tp-carousel__arrow" type="button" data-tp-carousel-prev aria-label="Previous review"> 986 <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 18l-6-6 6-6"></path></svg> 987 </button> 988 989 <div class="tp-carousel__track"> 990 991 992 <figure class="tp-carousel__review is-current" data-tp-carousel-review> 993 <img class="tp-carousel__stars" src="/assets/img/trustpilot/trustpilot-stars-5.svg" alt="Rated 5 out of 5" width="149" height="28"> 994 <blockquote class="tp-carousel__text">“It’s becoming increasingly difficult to find ‘skilled human beings’ rather than chatbots at the end of support lines, but I’ve been with this company for over 25 years now and their tech support has, without fail been first rate and courteous.”</blockquote> 995 <span class="tp-carousel__accent" aria-hidden="true"></span> 996 <figcaption class="tp-carousel__who"> 997 <b>Dave R</b> 998 <span>Verified Trustpilot review</span> 999 </figcaption> 1000 </figure> 1001 1002 <figure class="tp-carousel__review" data-tp-carousel-review> 1003 <img class="tp-carousel__stars" src="/assets/img/trustpilot/trustpilot-stars-5.svg" alt="Rated 5 out of 5" width="149" height="28"> 1004 <blockquote class="tp-carousel__text">“The service just keeps getting better and better and I am not only very happy about it but most appreciative that Heart Internet is a one-stop-shop for many services we required to keep our sites and domains safe and efficie
1004nt.”</blockquote> 1005 <span class="tp-carousel__accent" aria-hidden="true"></span> 1006 <figcaption class="tp-carousel__who"> 1007 <b>Moradeyo Adewunmi</b> 1008 <span>Verified Trustpilot review</span> 1009 </figcaption> 1010 </figure> 1011 1012 <figure class="tp-carousel__review" data-tp-carousel-review> 1013 <img class="tp-carousel__stars" src="/assets/img/trustpilot/trustpilot-stars-5.svg" alt="Rated 5 out of 5" width="149" height="28"> 1014 <blockquote class="tp-carousel__text">“I’ve worked with Heart Internet for many years now and have always found the support team to be helpful and resourceful, solving problems for me quickly.”</blockquote> 1015 <span class="tp-carousel__accent" aria-hidden="true"></span> 1016 <figcaption class="tp-carousel__who"> 1017 <b>Paul Alderson</b> 1018 <span>Verified Trustpilot review</span> 1019 </figcaption> 1020 </figure> 1021 1022 </div> 1023 1024 <button class="tp-carousel__arrow" type="button" data-tp-carousel-next aria-label="Next review"> 1025 <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 18l6-6-6-6"></path></svg> 1026 </button> 1027 1028 </div> 1029 1030 <div class="tp-carousel__dots"> 1031 <button class="tp-carousel__dot is-current" type="button" data-tp-carousel-dot aria-label="Review 1 of 3"></button> 1032 <button class="tp-carousel__dot" type="button" data-tp-carousel-dot aria-label="Review 2 of 3"></button> 1033 <button class="tp-carousel__dot" type="button" data-tp-carousel-dot aria-label="Review 3 of 3"></button> 1034 </div> 1035 1036 <!-- TrustBox widget - Micro Review Count --> 1037 <div class="tp-carousel__more trustpilot-widget" data-locale="en-GB" data-template-id="5419b6a8b0d04a076446a9ad" data-businessunit-id="53ef4c00000064000579a4fa" data-style-height="24px" data-style-width="100%" data-style-alignment="center" data-font-family="Fira Sans"> 1038 <a href="https://uk.trustpilot.com/review/heartinternet.uk" target="_blank" rel="noopener">Trustpilot</a> 1039 </div> 1040 <!-- End TrustBox widget --> 1041 1042 </div> 1043</section> 1044
1045<script> 1046/* Quote carousel. 1047 1048 Vanilla and self-contained, so the component is one embed with nothing 1049 to wire up. No jQuery: _inc/js does not load it, and the only other 1050 thing this would need is Slick, which is a lot of CDN for three reviews. 1051 1052 The reviews are all stacked in one CSS grid cell, so the track is as 1053 tall as the longest and nothing reflows when they change. Swapping 1054 .is-current is the whole animation; the crossfade is in the stylesheet. 1055 1056 Auto-advance stops for good on the first click, pauses on hover and on 1057 keyboard focus, and never starts at all under prefers-reduced-motion. 1058 The reviews are still all in the DOM and reachable in that case. */ 1059(function () { 1060 /* every instance on the page, not just the first. The component is 1061 documented as reusable, and document.querySelector would have bound a 1062 second copy's arrows and dots to the first copy's reviews. */ 1063 var frames = document.querySelectorAll('[data-tp-carousel]'); 1064 for (var f = 0; f < frames.length; f++) {init(frames[f]);} 1065 1066 function init(frame) { 1067 var root = frame.closest('.tp-carousel') || frame.parentNode; 1068 var reviews = frame.querySelectorAll('[data-tp-carousel-review]'); 1069 var dots = root.querySelectorAll('[data-tp-carousel-dot]'); 1070 if (reviews.length < 2) {return;} 1071 1072 var current = 0; 1073 var timer = null; 1074 var stopped = false; 1075 1076 function show(next) { 1077 current = (next + reviews.length) % reviews.length; 1078 for (var i = 0; i < reviews.length; i++) { 1079 reviews[i].classList.toggle('is-current', i === current); 1080 if (dots[i]) { dots[i].classList.toggle('is-current', i === current); } 1081 } 1082 } 1083 1084 function pause() { 1085 if (timer) { clearInterval(timer); timer = null; } 1086 } 1087 1088 function resume() { 1089 pause(); 1090 if (!stopped) { timer = setInterval(function () { show(current + 1); }, 7000); } 1091 } 1092 1093 /* any deliberate move is the reader taking over, so the timer does not 1094 come back and start moving the quote out from under them */ 1095 function takeOver(next) { 1096 stopped = true; 1097 pause(); 1098 show(next); 1099 } 1100 1101 frame.querySelector('[data-tp-carousel-prev]').addEventListener('click', function () { takeOver(current - 1); }); 1102 frame.querySelector('[data-tp-carousel-next]').addEventListener('click', function () { takeOver(current + 1); }); 1103 1104 for (var i = 0; i < dots.length; i++) { 1105 (function (index) { 1106 dots[index].addEventListener('click', function () {takeOver(index);}); 1107 })(i); 1108 } 1109 1110 if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) {return;} 1111 1112 root.addEventListener('mouseenter', pause); 1113 root.addEventListener('mouseleave', resume); 1114 root.addEventListener('focusin', function () { stopped = true; pause(); }); 1115 1116 resume(); 1117 } 1118}()); 1119</script>
1119 1120<!-- END CUSTOMER REVIEWS --> 1121 1122 1123 1124<link rel="stylesheet" href="/css/components/popular-domains.css"> 1125<section class="popular-domains-section grey_background"> 1126 <div class="container"> 1127 <h2>Popular domains from only 99p</h2> 1128 <span class="gradient-underline"></span> 1129 <p>Get big savings on our most popular domain types when bought multi-year. Find the perfect fit for your brand.</p> 1130 <div class="popular-domains-grid"> 1131 1132 <a href="/domain-names/co-uk" class="popular-domain-card"> 1133 <img src="/assets/img/domain_names/tlds/couk-logo-color.svg" alt=".co.uk domain"> 1134 <span class="popular-domain-price">from 99p</span> 1135 </a> 1136 1137 <a href="/domain-names/com" class="popular-domain-card"> 1138 <img src="/assets/img/domain_names/tlds/com-logo-color.svg" alt=".com domain"> 1139 <span class="popular-domain-price">from 99p</span> 1140 </a> 1141 1142 <a href="/domain-names/net" class="popular-domain-card"> 1143 <img src="/assets/img/domain_names/tlds/net-logo-color.svg" alt=".net domain"> 1144 <span class="popular-domain-price">from £2.99</span> 1145 </a> 1146 1147 <a href="/domain-names/org" class="popular-domain-card"> 1148 <img src="/assets/img/domain_names/tlds/org-logo-color.svg" alt=".org domain"> 1149 <span class="popular-domain-price">from £1.99</span> 1150 </a> 1151 1152 <a href="/domain-names/uk" class="popular-domain-card"> 1153 <img src="/assets/img/domain_names/tlds/uk-logo-color.svg" alt=".uk domain"> 1154 <span class="popular-domain-price">from 99p</span> 1155 </a> 1156 1157 </div> 1158 <div class="popular-domains-cta"> 1159 <a href="/domain-names" class="btn primary_button">Find your domain now</a> 1160 </div> 1161 </div> 1162</section> 1163<style> 1164 .eco-block { 1165 background-color:#14441D; 1166 color:#fff; 1167 } 1168 1169 .eco-block .flex { 1170 flex-direction: column; 1171 } 1172 1173 .eco-block h2 { 1174 color:#fff; 1175 font-family: 'MuseoSansRounded-500',sans-serif; 1176 font-size:30px; 1177 text-align:left; 1178 } 1179 1180 @media (min-width: 768px) { 1181 .eco-block h2 {font-size:42px;} 1182 } 1183 1184 @media (min-width: 992px) { 1185 .eco-block h2 {font-size:52px;} 1186 } 1187 1188 .eco-block h3 { 1189 font-family: 'MuseoSansRounded-300', sans-serif; 1190 font-weight: normal; 1191 line-height: 1.6; 1192 padding-bottom: 0rem; 1193 font-size: 16px; 1194 } 1195 1196 @media (min-width: 768px) { 1197 .eco-block h3 { 1198 font-family: 'MuseoSansRounded-300',sans-serif; 1199 font-weight: normal; 1200 line-height:34px; 1201 padding-bottom: 2rem; 1202 font-size:24px; 1203 max-width:415px; 1204 } 1205 } 1206 1207 .eco-block a { 1208 color:white; 1209 text-decoration: underline; 1210 } 1211 1212 .eco-block p { 1213 color:white; 1214 font-size:14px; 1215 margin-bottom:0px; 1216 } 1217 1218 @media (min-width: 768px) { 1219 .eco-block p { 1220 color:white; 1221 font-size:16px; 1222 margin-bottom:0px; 1223 } 1224 } 1225 1226 .eco-block strong { 1227 font-family: 'MuseoSansRounded-700',sans-serif; 1228 } 1229 1230 .eco-block .col {position:relative;} 1231 1232 @media (min-width: 768px) { 1233 .eco-block .col {width:50%;} 1234 } 1235 1236 .eco-block .gwf-logo { 1237 margin-top: 15px; 1238 height:25px; 1239 } 1240 1241 @media (min-width: 1170px) { 1242 .eco-block .gwf-logo { 1243 position: absolute; 1244 right: 45px; 1245 bottom: 15px; 1246 top:initial; 1247 height:auto; 1248 } 1249 } 1250 1251 .eco-block .eco-collage { 1252 display: block; 1253 margin: 0 auto; 1254 max-width: 100%; 1255 } 1256 1257 @media (min-width: 768px) { 1258 .eco-block { 1259 padding-top: 4rem; 1260 padding-bottom: 4rem; 1261 } 1262 1263 .eco-block .flex { 1264 flex-direction: row; 1265 } 1266 } 1267</style> 1268 1269<!-- ECO Energy Block--> 1270<section class="eco-block"> 1271 <div class="container"> 1272 <div class="flex"> 1273 <div class="col"> 1274 <h2>Itâs not just our <br />logo thatâs green.</h2> 1275 <h3>All our hosting packages are powered by <strong>100% Renewable Energy</strong></h3> 1276 <p>Energy usage verified by the <a href="https://www.thegreenwebfoundation.org/green-web-check/?url=heartinternet.uk" target="_blank">Green Web Foundation</a>.</p> 1277 <img class="gwf-logo" src="/assets/img/eco-block/green-web-foundation-logo.svg" /> 1278 </div> 1279 1280 <div class="col"> 1281 <img class="eco-collage" src="/assets/img/eco-block/eco-collage.svg" /> 1282 </div> 1283 </div> 1284 </div> 1285</div> 1286</section> 1287<!-- End ECO Energy Block--> 1288 1289<!-- ============================================================================ 1290 Trust bar 1291 1292 Full-width 55px band for sitting directly below a hero, holding the 1293 four 2026 awards as equal columns. 1294 1295 No Trustpilot here: _components/trust-bar-widget carries it live. 1296 Keeping a hard-coded score in this strip as well would have stated it 1297 twice, about 60px apart, and the two had already drifted apart by a 1298 review. 1299 1300 The two strips are stacked, widget above awards, on all 21 product 1301 pages. The homepage is the exception: there the widget strip sits under 1302 the hero and this one sits above the footer, so nothing is directly 1303 above it. 1304 1305 The awards are static because they are facts with a year on them. 1306 1307 Each carries a popover naming the awarding body, which the visible 1308 label does not: "Best UK web hosting provider 2026" appears twice, and 1309 only the logo says which of the two it is. Bootstrap popovers are 1310 initialised globally for [data-toggle="popover"], so the attributes are 1311 all that is needed. 1312 1313 They open upward, over whatever is above this strip. That is not a 1314 choice made here: the global init passes placement: "top" as an option,
1315 and in Bootstrap 3 an option set in JS beats a data-placement 1316 attribute, so adding one has no effect. Every other popover on the site 1317 opens upward for the same reason. 1318 1319 All four 2026 awards are here. The SME News mark is sme-news.svg, 1320 converted from the CSS version the homepage draws in pages/home.scss 1321 (.sme-mark): its glyphs are real outlines now, so it needs no font and 1322 renders the same on every OS. The CSS one does not, because it sets 1323 "news" in Arial, which is not on Linux or Android. 1324 1325 The stylesheet comes from _inc/css, site-wide; no per-page link is 1326 needed. No Trustpilot script either: nothing here is a widget any 1327 more. 1328 ============================================================================ --> 1329<section class="trust-bar trust-bar--raised"> 1330 <div class="container"> 1331 <div class="trust-bar__inner"> 1332 1333 <div class="trust-bar__item" data-toggle="popover" data-trigger="hover" data-content="Awarded by the UK Business Tech Awards, 2026."> 1334 <img class="trust-bar__logo" 1335 src="/assets/img/homepage-hero-2026/tech-award-win.png" 1336 srcset="/assets/img/homepage-hero-2026/tech-award-win.png 1x, 1337 /assets/img/homepage-hero-2026/[email protected] 2x" 1338 alt="UK Business Tech Awards 2026 winner" width="41" height="28"> 1339 <span class="trust-bar__text">Best UK web hosting provider <b>2026</b></span> 1340 </div> 1341 1342 <span class="trust-bar__rule" aria-hidden="true"></span> 1343 1344 <div class="trust-bar__item" data-toggle="popover" data-trigger="hover" data-content="Awarded by SME News, 2026."> 1345 <img class="trust-bar__sme" src="/assets/img/homepage-hero-2026/sme-news.svg" alt="SME News 2026 winner" width="49" height="29"> 1346 <span class="trust-bar__text">Best UK web hosting provider <b>2026</b></span> 1347 </div> 1348 1349 <span class="trust-bar__rule" aria-hidden="true"></span> 1350 1351 <div class="trust-bar__item" data-toggle="popover" data-trigger="hover" data-content="Awarded by Gapstars for the engineering behind our hosting platform, 2026."> 1352 <img class="trust-bar__icon" src="/assets/img/homepage-hero-2026/gapstars-icon.svg" alt="" width="30" height="28" aria-hidden="true"> 1353 <span class="trust-bar__stack"> 1354 <img class="trust-bar__wordmark" src="/assets/img/homepage-hero-2026/gapstars-text.svg" alt="Gapstars" width="62" height="9"> 1355 <span class="trust-bar__text">Innovation award <b>2026</b></span> 1356 </span> 1357 </div> 1358 1359 <span class="trust-bar__rule" aria-hidden="true"></span> 1360 1361 <div class="trust-bar__item" data-toggle="popover" data-trigger="hover" data-content="Awarded by SME News for improvements to our customer experience, 2026."> 1362 <img class="trust-bar__sme" src="/assets/img/homepage-hero-2026/sme-news.svg" alt="SME News" width="49" height="29"> 1363 <span class="trust-bar__text">Excellence in customer experience <b>2026</b></span> 1364 </div> 1365 1366 </div> 1367 </div> 1368</section> 1369 1370 1371<div id="hi-ui-footer-root"></div>
1372<script> 1373(function() { 1374 var footerData = window.__HI_UI_FOOTER_DATA; 1375 if (!footerData) return; 1376 1377 window.HIUI.mountFooter('hi-ui-footer-root', { 1378 sections: footerData.sections, 1379 socialLinks: footerData.socialLinks, 1380 blogLink: footerData.blogLink, 1381 wwwDomain: window.location.hostname 1382 }); 1383})(); 1384</script>
1384 1385 1386<!-- jquery -->
1387<script type="text/javascript" src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
1387 1388 1389<!-- Bootstrap JS. -->
1390<script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
vendor: 1 bytes, line 1390
1390
1391<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/js-cookie/2.1.3/js.cookie.min.js"></script>
1391 1392<!-- bits and fixes needed everywhere --> 1393
1394<script type="text/javascript" src="/assets/js/min/global-min.js"></script>
1394 1395 1396 1397<!-- Lodash -->
1398<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
1398 1399 1400<!-- Pass site url to JS -->
1401<script> 1402 var site_url = 'https://www.heartinternet.uk/'; 1403</script>
1403 1404
1405<script type="text/javascript"> 1406 // Wait for the document to become ready 1407 $(function () { 1408 $("a[data-popup='true']").on('click', function (e) { 1409 window.open(this.href, "myWindowName", "width=600, height=400");; 1410 // Prevent the link from actually being followed 1411 e.preventDefault(); 1412 }); 1413 }); 1414</script>
1414 1415
1416<script type="text/javascript"> 1417 // Replace Bootstrap affix on the subnav with CSS sticky. 1418 // Must run in $(function(){}) so it fires *after* global-min.js's document.ready 1419 // callback, which calls .affix() and then checkPosition() â .css('top','') which 1420 // strips the top threshold needed for sticky to work. 1421 $(function () { 1422 var $subpages = $('.subpages'); 1423 if (!$subpages.length) return; 1424 1425 // Tear down Bootstrap affix (BS3 has no destroy method) 1426 $subpages 1427 .data('bs.affix', null) 1428 .removeData('bs.affix') 1429 .removeClass('affix affix-top affix-bottom'); 1430 1431 // Detach affix's window scroll/resize listeners 1432 $(window).off('scroll.bs.affix.data-api resize.bs.affix.data-api'); 1433 1434 // Page templates wrap the subpage_menu embed in a named div (e.g. .wordpress-pro) 1435 // that closes shortly after, constraining sticky to a box the same height as the 1436 // bar itself. Move the element to be a direct sibling of #header so its sticky 1437 // constraint spans the full page. 1438 var $header = $('#header'); 1439 if ($header.length) {$header.after($subpages.detach());} 1440 1441 // Apply sticky â no scroll handlers, no layout shifts, no flicker 1442 $subpages.css({ position: 'sticky', top: 0, 'z-index': 900 }); 1443 }); 1444</script>
1444 1445
1446<script> 1447 document.addEventListener('click', function(e) { 1448 var btn = e.target.closest('.copy-code'); 1449 if (!btn) return; 1450 var code = btn.dataset.code; 1451 if (!code) return; 1452 navigator.clipboard.writeText(code).then(function() { 1453 var popup = document.createElement('span'); 1454 popup.className = 'copy-popup'; 1455 popup.textContent = 'Copied to clipboard'; 1456 btn.appendChild(popup); 1457 requestAnimationFrame(function() {popup.classList.add('copy-popup--show');}); 1458 setTimeout(function() { 1459 popup.classList.remove('copy-popup--show'); 1460 popup.addEventListener('transitionend', function() {popup.remove();}, { once: true }); 1461 }, 1800); 1462 }); 1463 }); 1464</script>
1464 1465 1466<!-- homepage specific -->
1467<script src="/assets/js/min/home-min.js" type="text/javascript"></script>
1467 1468
1469<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"6d573e88177549ddbe95c13809ecf063","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 1469
1469
1470<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a43a4c5b1ed9d94c',t:'MTc5MDg0NTQ0OQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
1470</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.