PageSourceSearch

https://www.heartinternet.uk/

html heartinternet.uk collected 2026-10-01 09:04:10 UTC 60,621 bytes, 1,470 lines download raw bytes

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&rsquo;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              &pound;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">&pound;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">&pound;13.99/yr</span><br>
837          <br>
838          only <span class="pounds">&pound;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">&pound;9.99/yr</span><br>
845          <br>
846          only <span class="pounds">&pound;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&nbsp;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">&ldquo;It&rsquo;s becoming increasingly difficult to find &lsquo;skilled human beings&rsquo; rather than chatbots at the end of support lines, but I&rsquo;ve been with this company for over 25 years now and their tech support has, without fail been first rate and courteous.&rdquo;</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">&ldquo;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.&rdquo;</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">&ldquo;I&rsquo;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.&rdquo;</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.