CINXE.COM
Home | Natural History Museum online shop
<!doctype html> <html lang="en"> <head > <meta charset="utf-8"/> <meta name="title" content="Home | Natural History Museum online shop"/> <meta name="description" content="Find ideas for gifts and souvenirs from the Natural History Museum online shop"/> <meta name="keywords" content="Homepage, home, online shop site, the Natural History Museum online shop, shop front"/> <meta name="robots" content="INDEX,FOLLOW"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Home | Natural History Museum online shop</title> <link rel="stylesheet" type="text/css" media="all" href="https://www.nhmshop.co.uk/static/version1731322064/frontend/Nhm/hyva/en_GB/css/styles.min.css" /> <link rel="stylesheet" type="text/css" media="all" href="https://www.nhmshop.co.uk/static/version1731322064/frontend/Nhm/hyva/en_GB/Plumrocket_CookieConsent/css/cookie-consent.min.css" /> <link rel="stylesheet" type="text/css" media="all" href="https://www.nhmshop.co.uk/static/version1731322064/frontend/Nhm/hyva/en_GB/Scommerce_Gdpr/css/cookienotice_v1.min.css" /> <link rel="stylesheet" type="text/css" media="all" href="https://www.nhmshop.co.uk/static/version1731322064/frontend/Nhm/hyva/en_GB/Scommerce_CookiePopup/css/modal.min.css" /> <link rel="icon" type="image/x-icon" href="https://www.nhmshop.co.uk/media/favicon/default/Desktop_favicon.png" /> <link rel="shortcut icon" type="image/x-icon" href="https://www.nhmshop.co.uk/media/favicon/default/Desktop_favicon.png" /> <meta name="google-site-verification" content="v503R7pqpupVO1ZE-fLcOOVwZ5pqLLUM5EkT4xW3N84" /> <meta name="google-site-verification" content="lgLxweXfklOuWgZJJqUIjRXVHP2dcetTYNu1dv1TyTg" /> <style> #cart-drawer > div { overflow-y: auto; } #cart-drawer .space-y-6>:not([hidden])~:not([hidden]) { margin-top: 0px !important } #cart-drawer-title { line-height: 2rem; } .cms-explore-discovery-gin .points img { vertical-align: bottom; } #compare-link { display: none; } .rounded-full.w-9.h-9.bg-gray-200.p-0.border-0.inline-flex.flex-shrink-0.items-center.justify-center.text-gray-500 { display: none; } .cms-explore-discovery-gin .pagebuilder-button-primary { background-color: #000; border: 1px solid #000; color: #FFFFFF; max-width: 178px; min-width: 178px; font-size: 18px; line-height: 27px; font-family: Arial, Helvetica, sans-serif; text-decoration: none !important; } .cms-explore-discovery-gin .pagebuilder-button-primary:hover { background-color: #FFF; color: #000; border: 1px solid #000; max-width: 178px; min-width: 178px; font-size: 18px; line-height: 27px; font-family: Arial, Helvetica, sans-serif; text-decoration: none !important; } .cms-explore-discovery-gin .pagebuilder-button-secondary { background-color: #FFF; border: 1px solid #FFF; color: #000; max-width: 178px; min-width: 178px; font-size: 18px; line-height: 27px; font-family: Arial, Helvetica, sans-serif; text-decoration: none !important; } .cms-explore-discovery-gin .pagebuilder-button-secondary:hover { background-color: #000; border: 1px solid #FFF; color: #FFF; max-width: 178px; min-width: 178px; font-size: 18px; line-height: 27px; font-family: Arial, Helvetica, sans-serif; text-decoration: none; font-family: Arial, Helvetica, sans-serif; text-decoration: none !important; } .cms-explore-discovery-gin .top-button .pagebuilder-button-secondary { background-color: #FFF; border: 1px solid #000; color: #000; max-width: 178px; min-width: 178px; font-size: 18px; line-height: 27px; font-family: Arial, Helvetica, sans-serif; text-decoration: none !important; } .cms-explore-discovery-gin .top-button .pagebuilder-button-secondary:hover { background-color: #000; border: 1px solid #000; color: #FFF; max-width: 178px; min-width: 178px; font-size: 18px; line-height: 27px; font-family: Arial, Helvetica, sans-serif; text-decoration: none; font-family: Arial, Helvetica, sans-serif; text-decoration: none !important; } .category-products-grid .product-items .item .price-box .price-label, .product-info-main span.price-label, .block.itemslider .product.details.product-item-details .price-label { display: none !important; } .cms-explore-discovery-gin .headline h2 { font-size: 40px; line-height: 48px; text-align: left; } #allergy { max-width: 500px; border-spacing: 0; border-collapse: collapse; } #allergy td { padding: 5px; vertical-align: top; min-width:250px; } #allergy, #allergy th, #allergy td { border: 1px solid black; } @media only screen and (max-width: 1000px) { .cms-explore-discovery-gin .headline h2 { font-size: 32px; line-height: 34px; text-align: left; } } @media only screen and (max-width: 600px) { #allergy td { min-width:auto;} } @media only screen and (min-width: 1000px) { .cms-explore-discovery-gin .desktop-990 { max-width: 990px; margin: 0 auto !important; text-align: center; } .cms-explore-discovery-gin .desktop-700 { max-width: 700px; margin: 0 auto !important; text-align: left; } } .shop-sunday-banner { text-align: center; font-size: 16px; line-height: 19.2px; } .shop-sunday-banner p { padding-bottom: 15px; } .shop-sunday-banner a { text-decoration: underline; color: #000; } .shop-sunday-banner a:hover { color: #FFFFFF; text-decoration: none; } @media only screen and (min-width: 1000px) { .shop-sunday-banner { font-size: 18px; line-height: 25px; } .shop-sunday-banner p { padding-bottom: 0px; } } .site-wide { width: 100%; background-color: rgb(248, 220, 0); } .site-wide div { max-width: 1200px; margin: 0 auto; padding: 10px; font-size: 16px; } .site-wide div a { color:#000; border-bottom: 2px solid #000; font-weight:bold; } .site-wide div a:hover { color:#00A276; text-decoration:none; border-bottom: 2px solid #00A276; font-weight:bold; } .site-wide div visited { color:#00A276; text-decoration:none; border-bottom: 2px solid #828282; font-weight:bold; } @media only screen and (min-width: 1000px) { .site-wide div { font-size: 18px; padding: 5px 0px 0px 19px !important; } } </style> <script src="https://assets.adobedtm.com/c2b29812570b/9a12dd12b8ca/launch-8ad8583b0030.min.js" async></script> <script> window.getWpCookie = function(name) { match = document.cookie.match(new RegExp(name + '=([^;]+)')); if (match) return decodeURIComponent(match[1].replace(/\+/g, ' ')) ; }; window.dataLayer = window.dataLayer || []; var dlObjects = [{"pageName":"Home | Natural History Museum online shop","pageType":"home"}]; for (var i in dlObjects) { window.dataLayer.push({ecommerce: null}); window.dataLayer.push(dlObjects[i]); } var wpCookies = ['wp_customerId','wp_customerGroup']; wpCookies.map(function(cookieName) { var cookieValue = window.getWpCookie(cookieName); if (cookieValue) { var dlObject = {}; dlObject[cookieName.replace('wp_', '')] = cookieValue; window.dataLayer.push(dlObject); } }); </script> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-PQNWTPC');</script> <!-- End Google Tag Manager --><script> var BASE_URL = 'https://www.nhmshop.co.uk/'; var THEME_PATH = 'https://www.nhmshop.co.uk/static/version1731322064/frontend/Nhm/hyva/en_GB'; var COOKIE_CONFIG = { "expires": null, "path": "\u002F", "domain": ".www.nhmshop.co.uk", "secure": true, "lifetime": "3600", "cookie_restriction_enabled": true }; var CURRENT_STORE_CODE = 'default'; var CURRENT_WEBSITE_ID = '1'; window.hyva = window.hyva || {} window.cookie_consent_groups = window.cookie_consent_groups || {} window.cookie_consent_groups['necessary'] = true; window.cookie_consent_config = window.cookie_consent_config || {}; window.cookie_consent_config['necessary'] = [].concat( window.cookie_consent_config['necessary'] || [], [ 'user_allowed_save_cookie', 'form_key', 'mage-messages', 'private_content_version', 'mage-cache-sessid', 'last_visited_store', 'section_data_ids' ] ); </script> <script> 'use strict'; (function( hyva, undefined ) { function lifetimeToExpires(options, defaults) { const lifetime = options.lifetime || defaults.lifetime; if (lifetime) { const date = new Date; date.setTime(date.getTime() + lifetime * 1000); return date; } return null; } function generateRandomString() { const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', length = 16; let formKey = '', charactersLength = allowedCharacters.length; for (let i = 0; i < length; i++) { formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] } return formKey; } const sessionCookieMarker = {noLifetime: true} const cookieTempStorage = {}; const internalCookie = { get(name) { const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); return v ? v[2] : null; }, set(name, value, days, skipSetDomain) { let expires, path, domain, secure, samesite; const defaultCookieConfig = { expires: null, path: '/', domain: null, secure: false, lifetime: null, samesite: 'lax' }; const cookieConfig = window.COOKIE_CONFIG || {}; expires = days && days !== sessionCookieMarker ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; path = cookieConfig.path || defaultCookieConfig.path; domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); secure = cookieConfig.secure || defaultCookieConfig.secure; samesite = cookieConfig.samesite || defaultCookieConfig.samesite; document.cookie = name + "=" + encodeURIComponent(value) + (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + (path ? '; path=' + path : '') + (domain ? '; domain=' + domain : '') + (secure ? '; secure' : '') + (samesite ? '; samesite=' + samesite : 'lax'); }, isWebsiteAllowedToSaveCookie() { const allowedCookies = this.get('user_allowed_save_cookie'); if (allowedCookies) { const allowedWebsites = JSON.parse(unescape(allowedCookies)); return allowedWebsites[CURRENT_WEBSITE_ID] === 1; } return false; }, getGroupByCookieName(name) { const cookieConsentConfig = window.cookie_consent_config || {}; let group = null; for (let prop in cookieConsentConfig) { if (!cookieConsentConfig.hasOwnProperty(prop)) continue; if (cookieConsentConfig[prop].includes(name)) { group = prop; break; } } return group; }, isCookieAllowed(name) { const encodedArray = '{"pr-cookie-notice-status":"necessary","user_allowed_save_cookie":"necessary","guest-view":"necessary","login_redirect":"necessary","mage-messages":"necessary","section_data_ids":"necessary","store":"necessary","amz_auth_err":"necessary","amz_auth_logout":"necessary","mage-cache-sessid":"necessary","mage-cache-storage":"necessary","stf":"necessary","recently_viewed_product":"necessary","recently_viewed_product_previous":"necessary","mage-translation-storage":"necessary","mage-translation-file-version":"necessary","product_data_storage":"necessary","recently_compared_product":"necessary","recently_compared_product_previous":"necessary","mage-cache-storage-section-invalidation":"necessary","_ga":"statistics","_gid":"statistics","_gat":"statistics","_dc_gtm_*":"statistics","pr-cookie-consent":"necessary","pr-cookie-consent-id":"necessary","form_key":"necessary","X-Magento-Vary":"necessary","private_content_version":"necessary","persistent_shopping_cart":"necessary","add_to_cart":"necessary","mage-banners-cache-storage":"necessary","remove_from_cart":"necessary","dmSessionID, recordID":"marketing"," _fbp":"marketing","fr":"marketing","1P_JAR, NID":"marketing","IDE":"marketing","test_cookie":"marketing","GPS, YSC, VISITOR_INFO1_LIVE":"marketing","lang":"marketing","CONSENT":"marketing","Affc":"marketing","t2_f8n3t7fos":"marketing","gpv_PagePath":"statistics","gpv_PageQueryString":"statistics","gpv_PageFullURL":"statistics","gpv_PageTitle":"statistics","at_check ":"necessary","adobeujs-optin":"necessary","SIDCC, __Secure-XXXSID, __Secure-XXXSIDCC, __Secure-XXXSIDTS":"necessary","AEC":"necessary","SOCS, SOCSSSID":"necessary","ar_debug ":"marketing","SID, HSID, APISID ":"marketing","SAPISID":"marketing","datr":"marketing","_rdt_uuid, csv, edgebucket, loid, pc":"marketing","_gcl_au":"marketing","nhmuid, nhmsid":"statistics","_ga_XXXXXXXXX":"statistics","_hjSessionUser_xxxxxx, _hjSession_xxxxxx, _hjMinimizedPolls":"statistics","s_cc, AMCV_##########@AdobeOrg, AMCVS_##########@AdobeOrg":"statistics","mbox":"statistics","adv_awc":"necessary"}'; const decodedArray = JSON.parse(encodedArray); const category = decodedArray.name; if(category === 'necessary') { return true; } //return false; return prCookieConsentApi.isAllowed(name); }, saveTempStorageCookies() { for (const [name, data] of Object.entries(cookieTempStorage)) { if (this.isCookieAllowed(name)) { this.set(name, data['value'], data['days'], data['skipSetDomain']); delete cookieTempStorage[name]; } } } }; hyva.getCookie = (name) => { const cookieConfig = window.COOKIE_CONFIG || {}; if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; } return internalCookie.get(name); } hyva.setCookie = (name, value, days, skipSetDomain) => { const cookieConfig = window.COOKIE_CONFIG || {}; if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { cookieTempStorage[name] = {value, days, skipSetDomain}; return; } return internalCookie.set(name, value, days, skipSetDomain); } hyva.setSessionCookie = (name, value, skipSetDomain) => { return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) } hyva.getBrowserStorage = () => { const browserStorage = window.localStorage || window.sessionStorage; if (!browserStorage) { console.warn('Browser Storage is unavailable'); return false; } try { browserStorage.setItem('storage_test', '1'); browserStorage.removeItem('storage_test'); } catch (error) { console.warn('Browser Storage is not accessible', error); return false; } return browserStorage; } hyva.postForm = (postParams) => { const form = document.createElement("form"); let data = postParams.data; if (! postParams.skipUenc && ! data.uenc) { data.uenc = btoa(window.location.href); } form.method = "POST"; form.action = postParams.action; Object.keys(postParams.data).map(key => { const field = document.createElement("input"); field.type = 'hidden' field.value = postParams.data[key]; field.name = key; form.appendChild(field); }); const form_key = document.createElement("input"); form_key.type = 'hidden'; form_key.value = hyva.getFormKey(); form_key.name="form_key"; form.appendChild(form_key); document.body.appendChild(form); form.submit(); } hyva.getFormKey = function () { let formKey = hyva.getCookie('form_key'); if (!formKey) { formKey = generateRandomString(); hyva.setCookie('form_key', formKey); } return formKey; } hyva.formatPrice = (value, showSign, options = {}) => { const formatter = new Intl.NumberFormat( 'en\u002DGB', Object.assign({ style: 'currency', currency: 'GBP', signDisplay: showSign ? 'always' : 'auto' }, options) ); return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? formatter.formatToParts(value).map(({type, value}) => { switch (type) { case 'currency': return '\u00A3' || value; case 'minusSign': return '- '; case 'plusSign': return '+ '; default : return value; } }).reduce((string, part) => string + part) : formatter.format(value); } const formatStr = function (str, nStart) { const args = Array.from(arguments).slice(2); return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { const idx = parseInt(n) - nStart; if (args[idx] === null || args[idx] === void 0) { return m; } return p.length % 2 ? p.slice(0, -1).replace('%%', '%') + args[idx] : p.replace('%%', '%') + n; }) } hyva.str = function (string) { const args = Array.from(arguments); args.splice(1, 0, 1); return formatStr.apply(undefined, args); } hyva.strf = function () { const args = Array.from(arguments); args.splice(1, 0, 0); return formatStr.apply(undefined, args); } /** * Take a html string as `content` parameter and * extract an element from the DOM to replace in * the current page under the same selector, * defined by `targetSelector` */ hyva.replaceDomElement = (targetSelector, content) => { // Parse the content and extract the DOM node using the `targetSelector` const parser = new DOMParser(); const doc = parser.parseFromString(content, 'text/html'); const contentNode = doc.querySelector(targetSelector); // Bail if content can't be found if (!contentNode) { return; } hyva.activateScripts(contentNode) // Replace the old DOM node with the new content document.querySelector(targetSelector).replaceWith(contentNode); // Reload customerSectionData and display cookie-messages if present window.dispatchEvent(new CustomEvent("reload-customer-section-data")); hyva.initMessages(); } hyva.activateScripts = (contentNode) => { // Extract all the script tags from the content. // Script tags won't execute when inserted into a dom-element directly, // therefore we need to inject them to the head of the document. const tmpScripts = contentNode.getElementsByTagName('script'); if (tmpScripts.length > 0) { // Push all script tags into an array // (to prevent dom manipulation while iterating over dom nodes) const scripts = []; for (let i = 0; i < tmpScripts.length; i++) { scripts.push(tmpScripts[i]); } // Iterate over all script tags and duplicate+inject each into the head for (let i = 0; i < scripts.length; i++) { let script = document.createElement('script'); script.innerHTML = scripts[i].innerHTML; document.head.appendChild(script); // Remove the original (non-executing) node from the content scripts[i].parentNode.removeChild(scripts[i]); } } return contentNode; } const replace = {['+']: '-', ['/']: '_', ['=']: ','}; hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); let currentTrap; const focusableElements = (rootElement) => { const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; return Array.from(rootElement.querySelectorAll(selector)) .filter(el => { return el.style.display !== 'none' && !el.disabled && el.tabIndex !== -1 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) }) } const focusTrap = (e) => { const isTabPressed = e.key === 'Tab' || e.keyCode === 9; if (!isTabPressed) return; const focusable = focusableElements(currentTrap) const firstFocusableElement = focusable[0] const lastFocusableElement = focusable[focusable.length - 1] e.shiftKey ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) }; hyva.releaseFocus = (rootElement) => { if (currentTrap && (!rootElement || rootElement === currentTrap)) { currentTrap.removeEventListener('keydown', focusTrap) currentTrap = null } } hyva.trapFocus = (rootElement) => { if (!rootElement) return; hyva.releaseFocus() currentTrap = rootElement rootElement.addEventListener('keydown', focusTrap) const firstElement = focusableElements(rootElement)[0] firstElement && firstElement.focus() } hyva.alpineInitialized = (fn) => { const initAlpine = window.deferLoadingAlpine || ((callback) => callback()) window.deferLoadingAlpine = (callback) => { initAlpine(callback) Promise.resolve().then(() => fn()) } } window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) }( window.hyva = window.hyva || {} )); </script> <script> if (!window.IntersectionObserver) { window.IntersectionObserver = function (callback) { this.observe = el => el && callback(this.takeRecords()); this.takeRecords = () => [{isIntersecting: true, intersectionRatio: 1}]; this.disconnect = () => {}; this.unobserve = () => {}; } } </script> </head> <body class="pl-thm-nhm pl-thm-nhm-hyva bg-gray-50 cms-home page-layout-1column cms-index-index page-layout-cms-full-width" id="html-body"> <script> var prCookieConsentApi = { CUSTOMER_CONSENT: 'pr-cookie-consent', SYSTEM_COOKIES: [ 'PHPSESSID', this.CUSTOMER_CONSENT, 'user_allowed_save_cookie', ], config: {}, isConfigured: false, getCookieValue: function (name) { var values = document.cookie.match('(^|;)\\s*' + name + '\\s*=\\s*([^;]+)'); return values ? decodeURIComponent(values.pop()) : ''; }, configure: function (configJson) { try { this.config = JSON.parse(configJson); if (this.config.canManageCookie === null) { console.error('Cookie restriction config is invalid'); } this.isConfigured = true; } catch (e) { console.error('Error has happened during parse JSON'); return false; } }, isAllowedCategory: function (categoryKey) { if (! this.config.canManageCookie) { return true; } if (this.isEssentialCategory(categoryKey)) { return true; } if (this.isOptIn()) { if (this.isAllCategoriesAllowed()) { return true; } return this.getCustomerConsent().includes(categoryKey); } return this.config.canUseCookieBeforeOptIn; }, isAllowed: function (cookieName) { if (prCookieConsentApi.isSystemCookie(cookieName)) { return true; } if (! this.config.canManageCookie) { return true; } cookieName = this.getTrueCookieName(cookieName); if (! prCookieConsentApi.isOptIn()) { if (this.config.canUseCookieBeforeOptIn) { return true; } if (prCookieConsentApi.isKnownCookie(cookieName)) { return this.isInEssentialCategory(cookieName); } return false; } if (! prCookieConsentApi.isKnownCookie(cookieName)) { return ! this.config.canBlockUnknownCookie; } return this.isInAllowedCategory(cookieName); }, isAllCategoriesAllowed: function () { if (null === this.cache.get('allowAllCategories')) { var customerConsent = this.getCustomerConsent(); if (customerConsent && customerConsent.includes('all') ) { this.cache.set('allowAllCategories', true); } else { var allowedWebsites = this.websiteRestriction.getAllowed(); this.cache.set('allowAllCategories', allowedWebsites[this.config.mage.website] === 1); } } return this.cache.get('allowAllCategories'); }, isEssentialCategory: function (categoryKey) { return this.config.essentialCategoryKeys.includes(categoryKey); }, isInEssentialCategory: function (cookieName) { return this.isEssentialCategory(this.getCookieCategory(cookieName)); }, isInAllowedCategory: function (cookieName) { return this.isAllowedCategory(this.getCookieCategory(cookieName)); }, getCookieCategory: function (cookieName) { return this.config.cookieToCategoryMapping[cookieName]; }, getCustomerConsent: function () { var consent = this.getCookieValue(this.CUSTOMER_CONSENT); return consent ? JSON.parse(consent) : false; }, isOptIn: function () { var allowedWebsites = this.websiteRestriction.getAllowed(); var allowedWithDefaultCookie = allowedWebsites[this.config.mage.website] === 1; return Boolean(this.getCustomerConsent()) || allowedWithDefaultCookie; }, isSystemCookie: function (cookieName) { return this.SYSTEM_COOKIES.includes(cookieName); }, isKnownCookie: function (cookieName) { return this.config.cookieToCategoryMapping.hasOwnProperty(cookieName); }, getTrueCookieName: function (cookieName) { var keys = Object.keys(this.config.dynamicNamesPatterns), key; for (var i = 0, length = keys.length; i < length; i++) { key = keys[i]; if (new RegExp(this.config.dynamicNamesPatterns[key]).test(cookieName)) { return key; } } return cookieName; }, websiteRestriction: { getAllowed: function () { var allowedWebsites = prCookieConsentApi.getCookieValue(prCookieConsentApi.config.mage.cookieName); allowedWebsites = allowedWebsites ? JSON.parse(allowedWebsites) : undefined; return (allowedWebsites !== undefined) ? allowedWebsites : {}; }, }, cache: { cacheData: {allowAllCategories: null}, get: function (key) { return this.cacheData[key]; }, set: function (key, value) { this.cacheData[key] = value; }, reset: function () { this.cacheData = {allowAllCategories: null}; } } }; prCookieConsentApi.configure('\u007B\u0022canManageCookie\u0022\u003Atrue,\u0022canUseCookieBeforeOptIn\u0022\u003Afalse,\u0022canBlockUnknownCookie\u0022\u003Afalse,\u0022consent\u0022\u003A\u007B\u0022isLoggedIn\u0022\u003Afalse,\u0022logUrl\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fwww.nhmshop.co.uk\u005C\u002Fpr\u002Dcookie\u002Dconsent\u005C\u002Fconsent_guest\u005C\u002Fupdate\u005C\u002F\u0022,\u0022reloadAfterAccept\u0022\u003Atrue,\u0022reloadAfterDecline\u0022\u003Afalse,\u0022expiry\u0022\u003A365\u007D,\u0022cookie\u0022\u003A\u007B\u0022path\u0022\u003A\u0022\u005C\u002F\u0022,\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022,\u0022parentDomain\u0022\u003A\u0022.nhmshop.co.uk\u0022\u007D,\u0022cookies\u0022\u003A\u007B\u0022pr\u002Dcookie\u002Dnotice\u002Dstatus\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022user_allowed_save_cookie\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022guest\u002Dview\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022login_redirect\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022mage\u002Dmessages\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022section_data_ids\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022store\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022amz_auth_err\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022amz_auth_logout\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022mage\u002Dcache\u002Dsessid\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022mage\u002Dcache\u002Dstorage\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022stf\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022recently_viewed_product\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022recently_viewed_product_previous\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022mage\u002Dtranslation\u002Dstorage\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022mage\u002Dtranslation\u002Dfile\u002Dversion\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022product_data_storage\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022recently_compared_product\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022recently_compared_product_previous\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022mage\u002Dcache\u002Dstorage\u002Dsection\u002Dinvalidation\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022_ga\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022_gid\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022_gat\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022_dc_gtm_\u002A\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022pr\u002Dcookie\u002Dconsent\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022pr\u002Dcookie\u002Dconsent\u002Did\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022form_key\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022X\u002DMagento\u002DVary\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022private_content_version\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022persistent_shopping_cart\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022add_to_cart\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022mage\u002Dbanners\u002Dcache\u002Dstorage\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022remove_from_cart\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022dmSessionID,\u0020recordID\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022\u0020_fbp\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022fr\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u00221P_JAR,\u0020NID\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022IDE\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022test_cookie\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022GPS,\u0020YSC,\u0020VISITOR_INFO1_LIVE\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022lang\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022CONSENT\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022Affc\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022t2_f8n3t7fos\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022gpv_PagePath\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022gpv_PageQueryString\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022gpv_PageFullURL\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022gpv_PageTitle\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022www.nhmshop.co.uk\u0022\u007D,\u0022at_check\u0020\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022adobeujs\u002Doptin\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022SIDCC,\u0020__Secure\u002DXXXSID,\u0020__Secure\u002DXXXSIDCC,\u0020__Secure\u002DXXXSIDTS\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022AEC\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022SOCS,\u0020SOCSSSID\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022ar_debug\u0020\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022SID,\u0020HSID,\u0020APISID\u0020\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022SAPISID\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022datr\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022_rdt_uuid,\u0020csv,\u0020edgebucket,\u0020loid,\u0020pc\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022_gcl_au\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022nhmuid,\u0020nhmsid\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022_ga_XXXXXXXXX\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022_hjSessionUser_xxxxxx,\u0020_hjSession_xxxxxx,\u0020_hjMinimizedPolls\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022s_cc,\u0020AMCV_\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0040AdobeOrg,\u0020AMCVS_\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0040AdobeOrg\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022mbox\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D,\u0022adv_awc\u0022\u003A\u007B\u0022domain\u0022\u003A\u0022\u0022\u007D\u007D,\u0022mage\u0022\u003A\u007B\u0022website\u0022\u003A1,\u0022cookieName\u0022\u003A\u0022user_allowed_save_cookie\u0022,\u0022lifetime\u0022\u003A31536000\u007D,\u0022cookieToCategoryMapping\u0022\u003A\u007B\u0022pr\u002Dcookie\u002Dnotice\u002Dstatus\u0022\u003A\u0022necessary\u0022,\u0022user_allowed_save_cookie\u0022\u003A\u0022necessary\u0022,\u0022guest\u002Dview\u0022\u003A\u0022necessary\u0022,\u0022login_redirect\u0022\u003A\u0022necessary\u0022,\u0022mage\u002Dmessages\u0022\u003A\u0022necessary\u0022,\u0022section_data_ids\u0022\u003A\u0022necessary\u0022,\u0022store\u0022\u003A\u0022necessary\u0022,\u0022amz_auth_err\u0022\u003A\u0022necessary\u0022,\u0022amz_auth_logout\u0022\u003A\u0022necessary\u0022,\u0022mage\u002Dcache\u002Dsessid\u0022\u003A\u0022necessary\u0022,\u0022mage\u002Dcache\u002Dstorage\u0022\u003A\u0022necessary\u0022,\u0022stf\u0022\u003A\u0022necessary\u0022,\u0022recently_viewed_product\u0022\u003A\u0022necessary\u0022,\u0022recently_viewed_product_previous\u0022\u003A\u0022necessary\u0022,\u0022mage\u002Dtranslation\u002Dstorage\u0022\u003A\u0022necessary\u0022,\u0022mage\u002Dtranslation\u002Dfile\u002Dversion\u0022\u003A\u0022necessary\u0022,\u0022product_data_storage\u0022\u003A\u0022necessary\u0022,\u0022recently_compared_product\u0022\u003A\u0022necessary\u0022,\u0022recently_compared_product_previous\u0022\u003A\u0022necessary\u0022,\u0022mage\u002Dcache\u002Dstorage\u002Dsection\u002Dinvalidation\u0022\u003A\u0022necessary\u0022,\u0022_ga\u0022\u003A\u0022statistics\u0022,\u0022_gid\u0022\u003A\u0022statistics\u0022,\u0022_gat\u0022\u003A\u0022statistics\u0022,\u0022_dc_gtm_\u002A\u0022\u003A\u0022statistics\u0022,\u0022pr\u002Dcookie\u002Dconsent\u0022\u003A\u0022necessary\u0022,\u0022pr\u002Dcookie\u002Dconsent\u002Did\u0022\u003A\u0022necessary\u0022,\u0022form_key\u0022\u003A\u0022necessary\u0022,\u0022X\u002DMagento\u002DVary\u0022\u003A\u0022necessary\u0022,\u0022private_content_version\u0022\u003A\u0022necessary\u0022,\u0022persistent_shopping_cart\u0022\u003A\u0022necessary\u0022,\u0022add_to_cart\u0022\u003A\u0022necessary\u0022,\u0022mage\u002Dbanners\u002Dcache\u002Dstorage\u0022\u003A\u0022necessary\u0022,\u0022remove_from_cart\u0022\u003A\u0022necessary\u0022,\u0022dmSessionID,\u0020recordID\u0022\u003A\u0022marketing\u0022,\u0022\u0020_fbp\u0022\u003A\u0022marketing\u0022,\u0022fr\u0022\u003A\u0022marketing\u0022,\u00221P_JAR,\u0020NID\u0022\u003A\u0022marketing\u0022,\u0022IDE\u0022\u003A\u0022marketing\u0022,\u0022test_cookie\u0022\u003A\u0022marketing\u0022,\u0022GPS,\u0020YSC,\u0020VISITOR_INFO1_LIVE\u0022\u003A\u0022marketing\u0022,\u0022lang\u0022\u003A\u0022marketing\u0022,\u0022CONSENT\u0022\u003A\u0022marketing\u0022,\u0022Affc\u0022\u003A\u0022marketing\u0022,\u0022t2_f8n3t7fos\u0022\u003A\u0022marketing\u0022,\u0022gpv_PagePath\u0022\u003A\u0022statistics\u0022,\u0022gpv_PageQueryString\u0022\u003A\u0022statistics\u0022,\u0022gpv_PageFullURL\u0022\u003A\u0022statistics\u0022,\u0022gpv_PageTitle\u0022\u003A\u0022statistics\u0022,\u0022at_check\u0020\u0022\u003A\u0022necessary\u0022,\u0022adobeujs\u002Doptin\u0022\u003A\u0022necessary\u0022,\u0022SIDCC,\u0020__Secure\u002DXXXSID,\u0020__Secure\u002DXXXSIDCC,\u0020__Secure\u002DXXXSIDTS\u0022\u003A\u0022necessary\u0022,\u0022AEC\u0022\u003A\u0022necessary\u0022,\u0022SOCS,\u0020SOCSSSID\u0022\u003A\u0022necessary\u0022,\u0022ar_debug\u0020\u0022\u003A\u0022marketing\u0022,\u0022SID,\u0020HSID,\u0020APISID\u0020\u0022\u003A\u0022marketing\u0022,\u0022SAPISID\u0022\u003A\u0022marketing\u0022,\u0022datr\u0022\u003A\u0022marketing\u0022,\u0022_rdt_uuid,\u0020csv,\u0020edgebucket,\u0020loid,\u0020pc\u0022\u003A\u0022marketing\u0022,\u0022_gcl_au\u0022\u003A\u0022marketing\u0022,\u0022nhmuid,\u0020nhmsid\u0022\u003A\u0022statistics\u0022,\u0022_ga_XXXXXXXXX\u0022\u003A\u0022statistics\u0022,\u0022_hjSessionUser_xxxxxx,\u0020_hjSession_xxxxxx,\u0020_hjMinimizedPolls\u0022\u003A\u0022statistics\u0022,\u0022s_cc,\u0020AMCV_\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0040AdobeOrg,\u0020AMCVS_\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0023\u0040AdobeOrg\u0022\u003A\u0022statistics\u0022,\u0022mbox\u0022\u003A\u0022statistics\u0022,\u0022adv_awc\u0022\u003A\u0022necessary\u0022\u007D,\u0022essentialCategoryKeys\u0022\u003A\u005B\u0022necessary\u0022\u005D,\u0022dynamicNamesPatterns\u0022\u003A\u007B\u0022_dc_gtm_\u002A\u0022\u003A\u0022_dc_gtm_.\u002A\u0022\u007D\u007D'); </script> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PQNWTPC" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <div id="body-overlay" class="overlay invisible"></div> <aside role="dialog" id="pr-cookie-modal-bottom" class="modal-custom pr-cookie-modal pr-cookie-modal-bottom show-without-overlay" aria-describedby="modal-content-65" data-role="modal" data-type="custom" tabindex="0" style="z-index: 1; display: none"> <div class="pr-cookie-notice-wrapper"> <div id="pr-cookie-notice"> <div class="pr-cookie-notice-wrap justify-between p-8 bg-gray-100"> <div> <div class="pr-cookie-notice-title text-3xl mb-3"> Accept cookies? </div> <div class="leading-7 text-black"> <p style="color:black;">We use <a href="https://www.nhmshop.co.uk/cookies-on-the-museum-online-shop"><strong><u>cookies</u></strong></a> to give you the best experience and to show personalised content and marketing. We use them to improve our website and content as well as to tailor our digital advertising our third-party platforms. You can change your preferences at any time.</p> </div> </div> <div> <div class="actions pr-cookie-notice-actions"> <button onclick="allowAll()" id="btn-cookie-allow" class="action allow primary pr-cookie-notice-btn" style="color: #FFFFFF; background-color: #000000"> Yes, accept all </button> <a href="/cookie-preferences" class="underline action pr-cookie-notice-btn pr-cookie-setting-btn"> Manage my preferences </a> </div> </div> </div> </div> </div> </aside> <script> const userScripts = []; function CookieRestriction() { /** * Allow show logs of work * * 0 - disabled * 1 - only warnings * 2 - all logs * * @type {number} */ this.debugMode = 0; /** * Contains callbacks that run after all configuration come * * @type {function[]} */ this.configuredCallbacks = []; /** * Contains callbacks that run after user consent. * * @type {function[]} */ this.consentCallbacks = []; /** * If js try to set cookie (except systems cookies) before configs are parsed we move them into the queue * After parsing configs we set all cookie from queue using * @see this.configuredCallbacks * * @type {{}} */ this.queue = {}; /** * All cookies must be set by this function * * @param cookieName * @param cookieSetter */ this.setCookieByCallBack = function (cookieName, cookieSetter) { this.log('Catch set cookie "' + cookieName + '"'); if (prCookieConsentApi.isSystemCookie(cookieName)) { this.log('System cookie "' + cookieName + '" have set'); return cookieSetter(); } if (this.isConfigured()) { if (this.isAllowed(cookieName)) { this.log('Allowed cookie "' + cookieName + '" has set'); return cookieSetter() } else { this.warn('Setting of cookie "' + cookieName + '" was blocked by cookie consent extension'); } } else { this.addToQueue(cookieName, cookieSetter); } }; /** * @return {CookieRestriction} */ this.allowAllCategories = function () { prCookieConsentApi.cache.reset(); this.setCustomerConsent(['all']); return this; }; /** * @return {CookieRestriction} */ this.declineAll = function () { prCookieConsentApi.cache.reset(); this.setCustomerConsent([]); return this; }; /** * Retrieve if configs are set * * @return {boolean} */ this.isConfigured = function () { return isConfigured; }; /** * @param {function} callback * @return {CookieRestriction} */ this.addConfiguredCallback = function (callback) { this.configuredCallbacks.push(callback); return this; }; /** * @param {function} callback * @return {CookieRestriction} */ this.addConsentCallback = function (callback) { this.consentCallbacks.push(callback); return this; }; /** * Retrieve if guest/customer has cookie consent or has allowed cookie before. * * @deprecated since 1.10.0 * @see prCookieConsentApi.isOptIn * @return {boolean} */ this.isOptIn = function () { return prCookieConsentApi.isOptIn(); }; /** * Retrieve if guest/customer has cookie consent * * @deprecated since 1.10.0 * @see prCookieConsentApi.getCustomerConsent * @return {array|null} */ this.getCustomerConsent = function () { return prCookieConsentApi.getCustomerConsent(); }; /** * Save customer consent */ this.setCustomerConsent = function (allowedCategories) { if (allowedCategories.includes('all')) { this.websiteRestriction.allowCurrent(); } else { this.websiteRestriction.disallowCurrent(); } var self = this; const config = prCookieConsentApi.config; hyva.setCookie(config.mage.cookieName, JSON.stringify(allowedCategories), config.mage.lifetime ? Math.ceil(config.mage.lifetime / 86400) : 0, config.cookie.path); prCookieConsentApi.cache.reset(); var isAccepting = allowedCategories.length; this.consentCallbacks.forEach(function (callback) { callback(allowedCategories) }); const data = {acceptedKeys: allowedCategories}; const formKey = hyva.getFormKey(); fetch(config.consent.logUrl, { "headers": { "content-type": "application/x-www-form-urlencoded; charset=UTF-8", }, "body": "form_key=" + formKey + "&acceptedKeys=" + allowedCategories, "method": "POST", "mode": "cors", "credentials": "include" }).then(function (response) { var cookieElement = document.getElementById('cookies-success-container'); if(cookieElement) { document.getElementById('cookies-success-container').style.display = 'block'; document.getElementById('cookies-success-container').scrollIntoView(); } }) } /** * This logic has php alternative in \Plumrocket\CookieConsent\Model\Cookie\IsAllowed * * @param {String} cookieName * @return {boolean} */ this.isAllowed = function (cookieName) { return prCookieConsentApi.isAllowed(cookieName); }; /** * This logic has php alternative in \Plumrocket\CookieConsent\Model\Category\IsAllowed * * @param {string} categoryKey * @return {boolean} */ this.isAllowedCategory = function (categoryKey) { return prCookieConsentApi.isAllowedCategory(categoryKey); }; this.extender = function (a, b) { for(var key in b) if(b.hasOwnProperty(key)) a[key] = b[key]; return a; } this.setCookie = function (key, value, attributes) { if (typeof document === 'undefined') { return; } attributes = this.extender({ path: '/' }, window.Cookies.defaults, attributes); if (typeof attributes.expires === 'number') { attributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5); } // We're using "expires" because "max-age" is not supported by IE attributes.expires = attributes.expires ? attributes.expires.toUTCString() : ''; try { var result = JSON.stringify(value); if (/^[\{\[]/.test(result)) { value = result; } } catch (e) {} value = converter.write ? converter.write(value, key) : encodeURIComponent(String(value)) .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent); key = encodeURIComponent(String(key)) .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) .replace(/[\(\)]/g, escape); var stringifiedAttributes = ''; for (var attributeName in attributes) { if (!attributes[attributeName]) { continue; } stringifiedAttributes += '; ' + attributeName; if (attributes[attributeName] === true) { continue; } // Considers RFC 6265 section 5.2: // ... // 3. If the remaining unparsed-attributes contains a %x3B (";") // character: // Consume the characters of the unparsed-attributes up to, // not including, the first %x3B (";") character. // ... stringifiedAttributes += '=' + attributes[attributeName].split(';')[0]; } return (document.cookie = key + '=' + value + stringifiedAttributes); } this.getCookie = function (key, json) { console.log('getCookie'); if (typeof document === 'undefined') { console.log('undefined'); return; } var jar = {}; // To prevent the for loop in the first place assign an empty array // in case there are no cookies at all. var cookies = document.cookie ? document.cookie.split('; ') : []; console.log(cookies); var i = 0; for (; i < cookies.length; i++) { var parts = cookies[i].split('='); var cookie = parts.slice(1).join('='); if (!json && cookie.charAt(0) === '"') { cookie = cookie.slice(1, -1); } try { var name = decode(parts[0]); cookie = (converter.read || converter)(cookie, name) || decode(cookie); if (json) { try { cookie = JSON.parse(cookie); } catch (e) {} } jar[name] = cookie; if (key === name) { break; } } catch (e) {} } return key ? jar[key] : jar; } this.removeCookie = function (key, attributes) { document.cookie = key+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; var str_array = window.location.hostname.split('.'); str_array.reverse(); var hostNameRebuilt = ''; for (var i = 0; i < str_array.length; i++) { if(i===0) hostNameRebuilt = str_array[i]; else hostNameRebuilt = str_array[i] + '.' + hostNameRebuilt; document.cookie = key + '=; Path=/; Domain=' + hostNameRebuilt + '; Expires=Thu, 01 Jan 1970 00:00:01 GMT;'; } document.cookie = key + '=; Path=/; Domain=.' + hostNameRebuilt + '; Expires=Thu, 01 Jan 1970 00:00:01 GMT;'; }; this.clearRejectedCookie = function () { var self = this; var cookies = document.cookie ? document.cookie.split('; ') : []; var i = 0; for (; i < cookies.length; i++) { var parts = cookies[i].split('='); var cookie = parts[0]; if(!self.isAllowed(cookie)) { self.removeCookie(cookie); } } }; /** * If cookie is system, it set immediately without any validations * * @deprecated since 1.10.0 * @see prCookieConsentApi.isSystemCookie * @param {string} cookieName * @return {boolean} */ this.isSystemCookie = function (cookieName) { return prCookieConsentApi.isSystemCookie(cookieName); }; /** * @deprecated since 1.10.0 * @see prCookieConsentApi.isKnownCookie * @param {string} cookieName * @return {boolean} */ this.isKnownCookie = function (cookieName) { return prCookieConsentApi.isKnownCookie(cookieName); }; /** * @deprecated since 1.10.0 * @see prCookieConsentApi.getTrueCookieName * @param {string} cookieName * @return {string} */ this.getTrueCookieName = function (cookieName) { return prCookieConsentApi.getTrueCookieName(cookieName); }; /** * @deprecated since 1.10.0 * @see prCookieConsentApi.isAllCategoriesAllowed * @return {boolean} */ this.isAllCategoriesAllowed = function () { return prCookieConsentApi.isAllCategoriesAllowed(); }; /** * @deprecated since 1.10.0 * @see prCookieConsentApi.getCookieCategory * @param {string} cookieName * @return {string|undefined} */ this.getCookieCategory = function (cookieName) { return prCookieConsentApi.getCookieCategory(cookieName); }; /** * @param {string} cookieName * @return {string|undefined} */ this.getDomain = function (cookieName) { return config.cookies[cookieName] ? config.cookies[cookieName].domain : null; }; /** * @deprecated since 1.10.0 * @see prCookieConsentApi.isInEssentialCategory * @param {string} cookieName * @return {boolean} */ this.isInEssentialCategory = function (cookieName) { return prCookieConsentApi.isInEssentialCategory(cookieName); }; /** * @deprecated since 1.10.0 * @see prCookieConsentApi.isEssentialCategory * @param {string} categoryKey * @return {boolean} */ this.isEssentialCategory = function (categoryKey) { return prCookieConsentApi.isEssentialCategory(categoryKey); }; /** * @deprecated since 1.10.0 * @see prCookieConsentApi.isInAllowedCategory * @return {boolean} */ this.isInAllowedCategory = function (cookieName) { return prCookieConsentApi.isInAllowedCategory(cookieName); }; /** * @param {object} prCookieConsentApi */ this.configure = function () { config = prCookieConsentApi.config; if (config.canManageCookie === null) { this.log('Cookie restriction config is invalid', this); } isConfigured = true; this.configuredCallbacks.forEach(function (callback) { callback(); }.bind(this)); this.log('Cookie restriction configuration complete', config); console.log('Aout to clear rejected cookies...'); this.clearRejectedCookie(); var self = this; var intervalId = setInterval(function () { self.log('Clear rejected cookies') self.clearRejectedCookie(); }, 2500); setTimeout(function () { clearInterval(intervalId); }, 10000); }; /** * Reload page by configuration and action * * @param isAccepting */ this.reloadAfterAction = function (isAccepting) { if (isAccepting && config.consent.reloadAfterAccept) { window.location.reload(); } if (! isAccepting && config.consent.reloadAfterDecline) { window.location.reload(); } }; /** * @param {string} cookieName * @param {function} cookieSetter */ this.addToQueue = function (cookieName, cookieSetter) { this.queue[cookieName] = cookieSetter; this.log('Cookie "' + cookieName + '" was add to queue'); }; this.runQueue = function () { if (this.queue.length !== 'undefined' && this.queue.length > 0) { this.queue.forEach(function (cookieSetter, cookieName) { this.log('Set Cookie "' + cookieName + '" by queue'); this.setCookieByCallBack(cookieName, cookieSetter); }.bind(this)); } }; this.addConfiguredCallback(this.runQueue.bind(this)); /** * Log actions if enabled debug mode */ this.log = function () { if (this.debugMode > 1) { console.log.apply(null, arguments); } }; /** * Log actions if enabled debug mode */ this.warn = function () { if (this.debugMode > 0) { console.warn.apply(null, arguments); } }; /** * Log actions if enabled debug mode */ this.error = function () { if (this.debugMode > 0) { console.error.apply(null, arguments); } }; /** * Run script after model is configured. * * @param callback */ this.execute = function (callback) { if (this.isConfigured()) { callback(); } else { this.addConfiguredCallback(callback); } }; } /** * Object for work with magento restrictions by websites */ CookieRestriction.prototype.websiteRestriction = { getAllowed: function () { return prCookieConsentApi.websiteRestriction.getAllowed(); }, allowCurrent: function () { return this.set(config.mage.website, true); }, disallowCurrent: function () { return this.set(config.mage.website, false); }, /** * @param {number} website * @param {boolean} flag * @return {CookieRestriction.websiteRestriction} */ set: function (website, flag) { var allowedWebsites = this.getAllowed(); if (flag) { allowedWebsites[website] = 1; } else { delete allowedWebsites[website]; } hyva.setCookie(config.mage.cookieName, JSON.stringify(allowedWebsites), config.mage.lifetime ? Math.ceil(config.mage.lifetime / 86400) : 0, config.cookie.path); return this; } }; /** * Object for integrating user scripts. */ CookieRestriction.prototype.userScript = { /** * @type {CookieRestriction} */ model: null, /** * Run script after model is configured. * * @param {CookieRestriction} model */ init: function (model) { this.model = model; model.addConfiguredCallback(this.executePendingScripts.bind(this)); }, /** * Run script after model is configured. * * @param {function} callback * @param {string} categoryKey */ execute: function (callback, categoryKey) { if (isConfigured) { if (this.model.isAllowedCategory(categoryKey)) { callback(); } } else { userScripts.push({callback: callback, categoryKey: categoryKey}); } }, /** * Run pending scripts. */ executePendingScripts: function () { userScripts.forEach(function (script) { if (this.model.isAllowedCategory(script.categoryKey)) { script.callback(); } }.bind(this)); }, }; function allowSpecified() { const allowedCategories = ['necessary']; if(document.getElementById('nhm-marketing').checked) { allowedCategories.push("marketing") } if(document.getElementById('nhm-performance').checked) { allowedCategories.push("statistics") } const CookieRestrictionModel = new CookieRestriction(); CookieRestrictionModel.userScript.init(CookieRestrictionModel); CookieRestrictionModel.configure(); prCookieConsentApi.cache.reset(); CookieRestrictionModel.setCustomerConsent(allowedCategories); window.dataLayer.push({event: "cookie-preferences-set" }); const dataLayerCookieEvent = new CustomEvent("cookie-preferences-set"); document.dispatchEvent(dataLayerCookieEvent); } function allowAll() { const CookieRestrictionModel = new CookieRestriction(); CookieRestrictionModel.userScript.init(CookieRestrictionModel); CookieRestrictionModel.configure(); CookieRestrictionModel.allowAllCategories(); this.closeModal(); window.dataLayer.push({event: "cookie-preferences-set" }); const dataLayerCookieEvent = new CustomEvent("cookie-preferences-set"); document.dispatchEvent(dataLayerCookieEvent); } function showModal() { document.getElementById('pr-cookie-modal-bottom').style.display = 'block'; } function closeModal() { document.getElementById('pr-cookie-modal-bottom').style.display = 'none'; document.getElementById('body-overlay').classList.add("invisible"); } document.addEventListener("DOMContentLoaded", function(event) { if(!document.cookie.match('user_allowed_save_cookie')) { showModal(); const overlay = document.getElementById('body-overlay'); document.getElementById('body-overlay').classList.remove("invisible"); } }); </script> <div data-bind="scope: 'pr-cookie-settings-bar'" class="pr-cookie-settings-bar-wrapper"> <!-- ko template: getTemplate() --><!-- /ko --> </div> <script type="text/x-magento-init"> { "*": { "Magento_Ui/js/core/app": {"components":{"pr-cookie-settings-bar":{"component":"Plumrocket_CookieConsent\/js\/view\/settings","template":"Plumrocket_CookieConsent\/settings\/left-bar","categories":[{"key":"necessary","is_essential":true,"is_pre_checked":false,"name":"Strictly necessary cookies","description":"These cookies are essential for you to browse our store and use its features, such as accessing secure areas of the website. Cookies that allow holding your cart items, cookies that keep you logged-in and cookies that save your customized preferences are an example of strictly necessary cookies. These cookies are essential to a website's functionality and cannot be disabled by users.","sort_order":0},{"key":"preferences","is_essential":false,"is_pre_checked":false,"name":"Preferences cookies","description":"Preferences cookies are also known as \u201cfunctionality cookies\u201d. These cookies allow a website to remember choices you have made in the past, like what language you prefer, your favourite search filters, or what your user name and password are so you can automatically log in.","sort_order":0},{"key":"statistics","is_essential":false,"is_pre_checked":false,"name":"Statistics cookies","description":"Statistics cookies are also known as \u201cperformance cookies\u201d. These cookies collect information about how you use a website, like which pages you visited and which links you clicked on. None of this information can be used to identify you. It is all aggregated and, therefore, anonymized. Their sole purpose is to improve website functions. This includes cookies from third-party analytics services, such as visitor analytics, heatmaps and social media analytics.","sort_order":0},{"key":"marketing","is_essential":false,"is_pre_checked":false,"name":"Marketing cookies","description":"These cookies track your online activity to help advertisers deliver more relevant advertising or to limit how many times you see an ad. These cookies can share that information with other organizations or advertisers. These are persistent cookies and almost always of third-party provenance.","sort_order":0}],"cookies":[{"name":"pr-cookie-notice-status","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":0,"durationLabel":"Session","description":"This presence of this cookie prevents the cookie banner from popping up again once cookie preferences have been saved."},{"name":"user_allowed_save_cookie","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":31536000,"durationLabel":"365 days","description":"Used for\u00a0cookie restriction mode. When cookie restriction mode is enabled, visitors to your store are notified that cookies are required for full-featured operations. "},{"name":"guest-view","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":0,"durationLabel":"Session","description":"Stores the Order ID that guest shoppers use to retrieve their order status.\u00a0"},{"name":"login_redirect","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":0,"durationLabel":"Session","description":"Preserves the destination page that was loading before the customer was directed to log in."},{"name":"mage-messages","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":31536000,"durationLabel":"365 days","description":"Tracks error messages and other notifications that are shown to the user, such as the cookie consent message, and various error messages."},{"name":"section_data_ids","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":0,"durationLabel":"Session","description":"Stores customer-specific information related to shopper-initiated actions, such as wish list display and checkout information."},{"name":"store","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":31536000,"durationLabel":"365 days","description":"Tracks the specific store view \/ locale selected by the shopper."},{"name":"amz_auth_err","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":31536000,"durationLabel":"365 days","description":"(Used by Amazon Pay) Value \u201c1\u2019 indicates an authorization error."},{"name":"amz_auth_logout","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"(Used by Amazon Pay) Value \u201c1\u201d indicates that the user should be logged out."},{"name":"mage-cache-sessid","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":0,"durationLabel":"Session","description":"The value of this cookie triggers the cleanup of local cache storage.\u00a0"},{"name":"mage-cache-storage","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":0,"durationLabel":"Session","description":"Local storage of visitor-specific content that enables ecommerce functions."},{"name":"stf","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":0,"durationLabel":"Session","description":"Records the time messages are sent by the SendFriend (Email a Friend) module."},{"name":"recently_viewed_product","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Stores product IDs of recently viewed products for easy navigation."},{"name":"recently_viewed_product_previous","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Stores product IDs of recently previously viewed products for easy navigation."},{"name":"mage-translation-storage","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Stores translated content when requested by the shopper. Used when\u00a0Translation Strategy\u00a0is configured."},{"name":"mage-translation-file-version","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Tracks the version of translations in local storage. Used when\u00a0Translation Strategy\u00a0is configured as\u00a0Dictionary."},{"name":"product_data_storage","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Stores configuration for product data related to Recently Viewed \/ Compared Products."},{"name":"recently_compared_product","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Stores product IDs of recently compared products."},{"name":"recently_compared_product_previous","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Stores product IDs of previously compared products for easy navigation."},{"name":"mage-cache-storage-section-invalidation","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Forces local storage of specific content sections that should be invalidated."},{"name":"_ga","category_key":"statistics","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":63072000,"durationLabel":"730 days","description":"Distinguishes visitors to the site."},{"name":"_gid","category_key":"statistics","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Distinguishes visitors to the site."},{"name":"_gat","category_key":"statistics","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Used to throttle request rate."},{"name":"_dc_gtm_*","category_key":"statistics","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":60,"durationLabel":"less than an hour","description":"Throttles request rate when Google Analytics is deployed with\u00a0Google Tag Manager."},{"name":"pr-cookie-consent","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":0,"durationLabel":"Session","description":"Stores your cookie consent value (i.e. all cookies enabled, only necessary cookies enabled etc)."},{"name":"pr-cookie-consent-id","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":0,"durationLabel":"Session","description":"Assigns the user a unique ID based on their cookie consent value. This is necessary in conjunction with the pr-cookie-consent cookie for the functionality of the cookie consent module."},{"name":"form_key","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":3600,"durationLabel":"1 hour","description":"A security measure that appends a random string to all form submissions to protect the data from Cross-Site Request Forgery (CSRF)."},{"name":"X-Magento-Vary","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":3600,"durationLabel":"1 hour","description":"Configuration setting that improves performance when using Varnish static content caching."},{"name":"private_content_version","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":7776000,"durationLabel":"90 days","description":"Appends a random, unique number and time to pages with customer content to prevent them from being cached on the server."},{"name":"persistent_shopping_cart","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":7776000,"durationLabel":"90 days","description":"Stores the key (ID) of persistent cart to make it possible to restore the cart for an anonymous shopper."},{"name":"add_to_cart","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":3600,"durationLabel":"1 hour","description":"Used by Google Tag Manager. Captures the product SKU, name, price and quantity removed from the cart, and makes the information available for future integration by third-party scripts."},{"name":"mage-banners-cache-storage","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":3600,"durationLabel":"1 hour","description":"Stores banner content locally to improve performance."},{"name":"remove_from_cart","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":3600,"durationLabel":"1 hour","description":"Used by\u00a0Google Tag Manager. Captures the product SKU, name, price, and quantity added to the cart, and makes the information available for future integration by third-party scripts."},{"name":"dmSessionID, recordID","category_key":"marketing","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":31536000,"durationLabel":"365 days","description":"Multiple cookies used by the email marketing company Dotdigital (previously known as DotMailer) to track when email campaign recipients land on the target website, which enables monitoring of the effectiveness of a campaign."},{"name":" _fbp","category_key":"marketing","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":7776000,"durationLabel":"90 days","description":"Used by Facebook to deliver a series of advertisement products such as real time bidding from third party advertisers."},{"name":"fr","category_key":"marketing","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":7776000,"durationLabel":"90 days","description":"Used by Facebook to collect data for targeted advertising."},{"name":"1P_JAR, NID","category_key":"marketing","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":15552000,"durationLabel":"180 days","description":"Multiple cookies used by Google to collect data that profiles the interests of web users for advertising purposes."},{"name":"IDE","category_key":"marketing","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":33696000,"durationLabel":"390 days","description":"This domain is owned by Doubleclick (Google). Doubleclick is Google's real time bidding advertising exchange."},{"name":"test_cookie","category_key":"marketing","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":900,"durationLabel":"less than an hour","description":"Used by Doubleclick (Google's real time bidding advertising exchange)."},{"name":"GPS, YSC, VISITOR_INFO1_LIVE","category_key":"marketing","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":15552000,"durationLabel":"180 days","description":"Multiple cookies used by YouTube to collect data for targeted advertising."},{"name":"lang","category_key":"marketing","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":33696000,"durationLabel":"390 days","description":"Used by Twitter to collect data that is primarily used for tracking and targeting. The data is collected from the 'Tweet this' function on the Museum's website."},{"name":"CONSENT","category_key":"marketing","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":2592000,"durationLabel":"30 days","description":"This cookie carries information about how the end user uses the website, and any advertising that the end user may have seen before visiting said website."},{"name":"Affc","category_key":"marketing","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":2592000,"durationLabel":"30 days","description":"This cookie is used by Affiliate Future to enable tracking of affiliate campaigns."},{"name":"t2_f8n3t7fos","category_key":"marketing","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":31536000,"durationLabel":"365 days","description":"Used by Reddit to deliver a series of advertisement products such as real time bidding from third party advertisers."},{"name":"gpv_PagePath","category_key":"statistics","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Used by Adobe Analytics to collect data on user's site interactions."},{"name":"gpv_PageQueryString","category_key":"statistics","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Used by Adobe Analytics to collect data on user's site interactions."},{"name":"gpv_PageFullURL","category_key":"statistics","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Used by Adobe Analytics to collect data on user's site interactions."},{"name":"gpv_PageTitle","category_key":"statistics","type":"third","typeLabel":"3rd Party","domain":"www.nhmshop.co.uk","domainLabel":"www.nhmshop.co.uk","duration":86400,"durationLabel":"1 day","description":"Used by Adobe Analytics to collect data on user's site interactions."},{"name":"at_check ","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":0,"durationLabel":"Session","description":"Used by Adobe Target to record the user's cookie preferences."},{"name":"adobeujs-optin","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":31536000,"durationLabel":"365 days","description":"Used by Adobe Analytics to record the user's cookie preferences."},{"name":"SIDCC, __Secure-XXXSID, __Secure-XXXSIDCC, __Secure-XXXSIDTS","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":31536000,"durationLabel":"365 days","description":"Used by YouTube to enable core functionality of embedded videos. "},{"name":"AEC","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":15552000,"durationLabel":"180 days","description":"Used by YouTube \/ Google to validate user sessions."},{"name":"SOCS, SOCSSSID","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":34128000,"durationLabel":"395 days","description":"Used by Google to store user privacy preferences."},{"name":"ar_debug ","category_key":"marketing","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":31536000,"durationLabel":"365 days","description":"Used by Google Ads to debug ads."},{"name":"SID, HSID, APISID ","category_key":"marketing","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":63072000,"durationLabel":"730 days","description":"Used by Google Ads to track user specific details and login behaviour."},{"name":"SAPISID","category_key":"marketing","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":63072000,"durationLabel":"730 days","description":"Used by Google Ads to display personalized advertisements on Google sites, based on recent searches and previous interactions. "},{"name":"datr","category_key":"marketing","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":63072000,"durationLabel":"730 days","description":"Used by Facebook to enable browser identification."},{"name":"_rdt_uuid, csv, edgebucket, loid, pc","category_key":"marketing","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":7776000,"durationLabel":"90 days","description":"Used by Reddit to enable targeted advertising. "},{"name":"_gcl_au","category_key":"marketing","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":7776000,"durationLabel":"90 days","description":"Used by Google Ads for conversion linking."},{"name":"nhmuid, nhmsid","category_key":"statistics","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":34560000,"durationLabel":"400 days","description":"Used to gather Adobe Analytics data. These cookies allow for insights into anonymised user behaviour during browsing sessions and over longer periods."},{"name":"_ga_XXXXXXXXX","category_key":"statistics","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":63072000,"durationLabel":"730 days","description":"Used by Google Analytics to anonymously identify individual users."},{"name":"_hjSessionUser_xxxxxx, _hjSession_xxxxxx, _hjMinimizedPolls","category_key":"statistics","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":31536000,"durationLabel":"365 days","description":"Used by Hotjar to monitor user session behaviour and to identify when messaging has been seen. "},{"name":"s_cc, AMCV_##########@AdobeOrg, AMCVS_##########@AdobeOrg","category_key":"statistics","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":63072000,"durationLabel":"730 days","description":"Multiple cookies used by Adobe Analytics to track visitor behaviour and gather performance data."},{"name":"mbox","category_key":"statistics","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":1209600,"durationLabel":"14 days","description":"Used by Adobe Target to keep track of visitor sessions during website experiments. "},{"name":"adv_awc","category_key":"necessary","type":"first","typeLabel":"1st Party","domain":"","domainLabel":"www.nhmshop.co.uk","duration":31536000,"durationLabel":"365 days","description":"AWIN commission tracking cookie."}],"displayStyle":"left_bar","canShowCookieDetails":true,"overview":{"title":"Privacy and Cookies","text":"<p>A cookie is information stored on your computer by a website you visit. Cookies provide a way for the site to recognize you and keep track of your preferences. Ecommerce websites place cookies on visitors' browsers to retain login credentials, identify customers, and provide a customized shopping experience.<\/p><p>We respect the privacy of individuals and recognize the importance of personal data entrusted to us by our customers. Any website visitor may choose not to allow some types of cookies. Click on cookie category headings and cookie details to find out more and change our default settings. However, blocking some types of cookies may impact your website experience and prevent you from using all the features on our store.<\/p>"},"consentPreferences":{"header":"Manage Consent Preferences","essential_category_status":"Always Active","cookie_details_link":"Cookie Details"},"design":{"textColor":"inherit","backgroundColor":"inherit"},"acceptButtonConfig":{"label":"Accept All","text_color":null,"text_color_on_hover":null,"background_color":null,"background_color_on_hover":null},"declineButtonConfig":{"enabled":true,"label":"Decline All","text_color":null,"text_color_on_hover":null,"background_color":null,"background_color_on_hover":null},"confirmButtonConfig":{"label":"Confirm My Choices","text_color":null,"text_color_on_hover":null,"background_color":null,"background_color_on_hover":null}}}} } } </script> <input name="form_key" type="hidden" value="2MaOZkPwvXmgCsM7" /><div class="page-wrapper"><header class="page-header"><a class="action skip sr-only contentarea" href="#contentarea"> <span> Skip to Content </span> </a> <script> function initHeader () { return { searchOpen: false, cart: {}, getData(data) { if (data.cart) { this.cart = data.cart } } } } function initCompareHeader() { return { compareProducts: null, itemCount: 0, receiveCompareData(data) { if (data['compare-products']) { this.compareProducts = data['compare-products']; this.itemCount = this.compareProducts.count; } } } } </script> <div id="header" class="relative z-30 w-full shadow border-container-lighter bg-night-blue-900 text-white" x-data="initHeader()" @keydown.window.escape="searchOpen = false;" @private-content-loaded.window="getData(event.detail.data)" > <div class="container flex flex-nowrap items-center justify-between w-full px-2 sm:px-12 py-3 mx-auto mt-0 lg:min-w-min sm:min-w-full"> <!--Logo--> <div class="order-2 sm:order-2 lg:order-1 w-full pb-2 sm:w-auto sm:pb-0"> <a class="flex items-center justify-center text-xl font-medium tracking-wide text-gray-800 no-underline hover:no-underline font-title" href="https://www.nhmshop.co.uk/" title="" aria-label="store logo"> <img src="https://www.nhmshop.co.uk/media/logo/stores/1/Online_shop_header-logo-large_1_.png" title="" alt="" width="381" height="56" /> </a> </div> <!--Main Navigation--> <div x-data="initMenuMobile_67425d87854ed()" class="z-20 order-1 sm:order-1 lg:order-3 navigation lg:hidden"> <!-- mobile --> <div @load.window="setActiveMenu($el)" class="bg-night-blue-900" :class="{'h-screen overflow-x-hidden overflow-y-auto fixed top-0 left-0 w-full' : open}" @toggle-mobile-menu.window="open = !open" @keydown.window.escape="open=false" > <div class="flex items-baseline justify-between menu-icon"> <div class="flex justify-end w-full"> <a @click="$dispatch('toggle-mobile-menu')" class="flex items-center justify-center cursor-pointer" :class="{ 'ml-auto': open }"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> <title>x</title></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="p-3" width="48" height="48" :class="{ 'hidden' : open, 'block': !open }" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"/> <title>menu</title></svg> </a> </div> </div> <nav class="hidden w-full duration-150 ease-in-out transform border-t transition-display border-container" :class="{ 'hidden' : !open }" > <div class="level-0"> <span class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container level-0" href="https://www.nhmshop.co.uk/featured.html" title="Featured"> Featured </a> <a class="absolute right-0 flex w-8 h-8 mr-8 rounded cursor-pointer" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-1584' ? 0 : 'category-node-1584'" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> <title>chevron-right</title></svg> </a> </span> <div class="absolute top-0 right-0 z-10 w-full h-full transition-transform duration-200 ease-in-out translate-x-full transform" :class="{ 'translate-x-full' : mobilePanelActiveId !== 'category-node-1584', 'translate-x-0' : mobilePanelActiveId === 'category-node-1584', }" > <a class="flex items-center px-8 py-4 border-b cursor-pointer border-container" @click="mobilePanelActiveId = 0" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> <title>chevron-left</title></svg> <span class="ml-4"> Featured </span> </a> <a href="https://www.nhmshop.co.uk/featured.html" title="Featured" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4">View All</span></a> <a href="https://www.nhmshop.co.uk/featured/wildlife-photographer-of-the-year.html" title="Wildlife Photographer of the Year" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Wildlife Photographer of the Year </span> </a> <a href="https://www.nhmshop.co.uk/featured/birds.html" title="Birds" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Birds </span> </a> <a href="https://www.nhmshop.co.uk/featured/museum-gardens.html" title="Museum Gardens" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Museum Gardens </span> </a> <a href="https://www.nhmshop.co.uk/featured/jurassic-park.html" title="Jurassic Park" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Jurassic Park </span> </a> <a href="https://www.nhmshop.co.uk/featured/william-smith.html" title="William Smith" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> William Smith </span> </a> <a href="https://www.nhmshop.co.uk/featured/food-drink.html" title="Food & drink" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Food & drink </span> </a> </div> </div> <div class="level-0"> <span class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container level-0" href="https://www.nhmshop.co.uk/christmas.html" title="Christmas"> Christmas </a> <a class="absolute right-0 flex w-8 h-8 mr-8 rounded cursor-pointer" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-1787' ? 0 : 'category-node-1787'" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> <title>chevron-right</title></svg> </a> </span> <div class="absolute top-0 right-0 z-10 w-full h-full transition-transform duration-200 ease-in-out translate-x-full transform" :class="{ 'translate-x-full' : mobilePanelActiveId !== 'category-node-1787', 'translate-x-0' : mobilePanelActiveId === 'category-node-1787', }" > <a class="flex items-center px-8 py-4 border-b cursor-pointer border-container" @click="mobilePanelActiveId = 0" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> <title>chevron-left</title></svg> <span class="ml-4"> Christmas </span> </a> <a href="https://www.nhmshop.co.uk/christmas.html" title="Christmas" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4">View All</span></a> <a href="https://www.nhmshop.co.uk/christmas/gifts-for-kids.html" title="Gifts for kids" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Gifts for kids </span> </a> <a href="https://www.nhmshop.co.uk/christmas/gifts-for-adults.html" title="Gifts for adults" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Gifts for adults </span> </a> <a href="https://www.nhmshop.co.uk/christmas/gifts-under-20.html" title="Gifts under £20" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Gifts under 拢20 </span> </a> <a href="https://www.nhmshop.co.uk/christmas/gifts-under-50.html" title="Gifts under £50" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Gifts under 拢50 </span> </a> <a href="https://www.nhmshop.co.uk/catalog/category/view/s/christmas-decor-accessories/id/1665/" title="Christmas decor & accessories" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Christmas decor & accessories </span> </a> </div> </div> <div class="level-0"> <span class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container level-0" href="https://www.nhmshop.co.uk/dinosaurs.html" title="Dinosaurs"> Dinosaurs </a> <a class="absolute right-0 flex w-8 h-8 mr-8 rounded cursor-pointer" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-1587' ? 0 : 'category-node-1587'" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> <title>chevron-right</title></svg> </a> </span> <div class="absolute top-0 right-0 z-10 w-full h-full transition-transform duration-200 ease-in-out translate-x-full transform" :class="{ 'translate-x-full' : mobilePanelActiveId !== 'category-node-1587', 'translate-x-0' : mobilePanelActiveId === 'category-node-1587', }" > <a class="flex items-center px-8 py-4 border-b cursor-pointer border-container" @click="mobilePanelActiveId = 0" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> <title>chevron-left</title></svg> <span class="ml-4"> Dinosaurs </span> </a> <a href="https://www.nhmshop.co.uk/dinosaurs.html" title="Dinosaurs" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4">View All</span></a> <a href="https://www.nhmshop.co.uk/dinosaurs/dinosaur-toys.html" title="Dinosaur toys" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Dinosaur toys </span> </a> <a href="https://www.nhmshop.co.uk/dinosaurs/dinosaur-games-activities.html" title="Dinosaur games & activities" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Dinosaur games & activities </span> </a> <a href="https://www.nhmshop.co.uk/dinosaurs/dinosaur-decor-accessories.html" title="Dinosaur decor & accessories" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Dinosaur decor & accessories </span> </a> </div> </div> <div class="level-0"> <span class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container level-0" href="https://www.nhmshop.co.uk/prints.html" title="Prints"> Prints </a> <a class="absolute right-0 flex w-8 h-8 mr-8 rounded cursor-pointer" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-1593' ? 0 : 'category-node-1593'" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> <title>chevron-right</title></svg> </a> </span> <div class="absolute top-0 right-0 z-10 w-full h-full transition-transform duration-200 ease-in-out translate-x-full transform" :class="{ 'translate-x-full' : mobilePanelActiveId !== 'category-node-1593', 'translate-x-0' : mobilePanelActiveId === 'category-node-1593', }" > <a class="flex items-center px-8 py-4 border-b cursor-pointer border-container" @click="mobilePanelActiveId = 0" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> <title>chevron-left</title></svg> <span class="ml-4"> Prints </span> </a> <a href="https://www.nhmshop.co.uk/prints.html" title="Prints" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4">View All</span></a> <a href="https://www.nhmshop.co.uk/prints/current-wildlife-photographer-of-the-year.html" title="Current Wildlife Photographer of the Year" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Current Wildlife Photographer of the Year </span> </a> <a href="https://www.nhmshop.co.uk/prints/previous-wildlife-photographer-of-the-year.html" title="Previous Wildlife Photographer of the Year" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Previous Wildlife Photographer of the Year </span> </a> </div> </div> <div class="level-0"> <span class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container level-0" href="https://www.nhmshop.co.uk/books.html" title="Books"> Books </a> <a class="absolute right-0 flex w-8 h-8 mr-8 rounded cursor-pointer" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-1641' ? 0 : 'category-node-1641'" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> <title>chevron-right</title></svg> </a> </span> <div class="absolute top-0 right-0 z-10 w-full h-full transition-transform duration-200 ease-in-out translate-x-full transform" :class="{ 'translate-x-full' : mobilePanelActiveId !== 'category-node-1641', 'translate-x-0' : mobilePanelActiveId === 'category-node-1641', }" > <a class="flex items-center px-8 py-4 border-b cursor-pointer border-container" @click="mobilePanelActiveId = 0" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> <title>chevron-left</title></svg> <span class="ml-4"> Books </span> </a> <a href="https://www.nhmshop.co.uk/books.html" title="Books" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4">View All</span></a> <a href="https://www.nhmshop.co.uk/books/dinosaur-books.html" title="Dinosaur books for kids" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Dinosaur books for kids </span> </a> <a href="https://www.nhmshop.co.uk/books/story-books.html" title="Story books for kids" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Story books for kids </span> </a> <a href="https://www.nhmshop.co.uk/books/science-books-for-kids.html" title="Science books for kids" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Science books for kids </span> </a> <a href="https://www.nhmshop.co.uk/books/activity-books-for-kids.html" title="Activity books for kids" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Activity books for kids </span> </a> <a href="https://www.nhmshop.co.uk/books/museum-related-books.html" title="Museum-related books" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Museum-related books </span> </a> <a href="https://www.nhmshop.co.uk/books/science-books.html" title="Science books" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Science books </span> </a> <a href="https://www.nhmshop.co.uk/books/coffee-table-books.html" title="Coffee-table books" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Coffee-table books </span> </a> </div> </div> <div class="level-0"> <span class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container level-0" href="https://www.nhmshop.co.uk/toys-games.html" title="Toys & games"> Toys & games </a> <a class="absolute right-0 flex w-8 h-8 mr-8 rounded cursor-pointer" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-1581' ? 0 : 'category-node-1581'" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> <title>chevron-right</title></svg> </a> </span> <div class="absolute top-0 right-0 z-10 w-full h-full transition-transform duration-200 ease-in-out translate-x-full transform" :class="{ 'translate-x-full' : mobilePanelActiveId !== 'category-node-1581', 'translate-x-0' : mobilePanelActiveId === 'category-node-1581', }" > <a class="flex items-center px-8 py-4 border-b cursor-pointer border-container" @click="mobilePanelActiveId = 0" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> <title>chevron-left</title></svg> <span class="ml-4"> Toys & games </span> </a> <a href="https://www.nhmshop.co.uk/toys-games.html" title="Toys & games" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4">View All</span></a> <a href="https://www.nhmshop.co.uk/toys-games/toys.html" title="Toys" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Toys </span> </a> <a href="https://www.nhmshop.co.uk/toys-games/games.html" title="Games" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Games </span> </a> <a href="https://www.nhmshop.co.uk/toys-games/kits-puzzles.html" title="Kits, puzzles & activities" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Kits, puzzles & activities </span> </a> </div> </div> <div class="level-0"> <span class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container level-0" href="https://www.nhmshop.co.uk/clothing-accessories.html" title="Clothing & accessories"> Clothing & accessories </a> <a class="absolute right-0 flex w-8 h-8 mr-8 rounded cursor-pointer" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-1608' ? 0 : 'category-node-1608'" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> <title>chevron-right</title></svg> </a> </span> <div class="absolute top-0 right-0 z-10 w-full h-full transition-transform duration-200 ease-in-out translate-x-full transform" :class="{ 'translate-x-full' : mobilePanelActiveId !== 'category-node-1608', 'translate-x-0' : mobilePanelActiveId === 'category-node-1608', }" > <a class="flex items-center px-8 py-4 border-b cursor-pointer border-container" @click="mobilePanelActiveId = 0" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> <title>chevron-left</title></svg> <span class="ml-4"> Clothing & accessories </span> </a> <a href="https://www.nhmshop.co.uk/clothing-accessories.html" title="Clothing & accessories" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4">View All</span></a> <a href="https://www.nhmshop.co.uk/clothing-accessories/clothing-for-kids.html" title="Clothing for kids" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Clothing for kids </span> </a> <a href="https://www.nhmshop.co.uk/clothing-accessories/accessories-for-kids.html" title="Accessories for kids" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Accessories for kids </span> </a> <a href="https://www.nhmshop.co.uk/catalog/category/view/s/costumes-for-kids/id/1740/" title="Costumes for kids" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Costumes for kids </span> </a> <a href="https://www.nhmshop.co.uk/clothing-accessories/clothing-for-adults.html" title="Clothing for adults" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Clothing for adults </span> </a> <a href="https://www.nhmshop.co.uk/clothing-accessories/accessories-for-adults.html" title="Accessories for adults" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Accessories for adults </span> </a> </div> </div> <div class="level-0"> <span class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container level-0" href="https://www.nhmshop.co.uk/home-stationery.html" title="Home & stationery"> Home & stationery </a> <a class="absolute right-0 flex w-8 h-8 mr-8 rounded cursor-pointer" @click="mobilePanelActiveId = mobilePanelActiveId === 'category-node-1635' ? 0 : 'category-node-1635'" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> <title>chevron-right</title></svg> </a> </span> <div class="absolute top-0 right-0 z-10 w-full h-full transition-transform duration-200 ease-in-out translate-x-full transform" :class="{ 'translate-x-full' : mobilePanelActiveId !== 'category-node-1635', 'translate-x-0' : mobilePanelActiveId === 'category-node-1635', }" > <a class="flex items-center px-8 py-4 border-b cursor-pointer border-container" @click="mobilePanelActiveId = 0" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> <title>chevron-left</title></svg> <span class="ml-4"> Home & stationery </span> </a> <a href="https://www.nhmshop.co.uk/home-stationery.html" title="Home & stationery" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4">View All</span></a> <a href="https://www.nhmshop.co.uk/home-stationery/homeware-decor.html" title="Homeware & decor" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Homeware & decor </span> </a> <a href="https://www.nhmshop.co.uk/catalog/category/view/s/stationery/id/1671/" title="Stationery" class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container" > <span class="w-6"></span> <span class="ml-4 text-base text-white lg:ml-0"> Stationery </span> </a> </div> </div> <div class="level-0"> <span class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer border-container level-0" href="https://www.nhmshop.co.uk/offers.html" title="Offers"> Offers </a> </span> </div> </nav> </div> </div> <script> 'use strict'; const initMenuMobile_67425d87854ed = () => { return { mobilePanelActiveId: null, open: false, setActiveMenu(menuNode) { Array.from(menuNode.querySelectorAll('a')).filter(link => { return link.href === window.location.href.split('?')[0]; }).map(item => { item.classList.add('underline'); item.closest('div.level-0') && item.closest('div.level-0').querySelector('a.level-0').classList.add('underline'); }); } } } </script> <div class="flex items-center order-3"> <!--Compare Icon--> <a id="compare-link" class="relative invisible inline-block mx-1 no-underline sm:ml-3 hover:text-white" :class="{ 'invisible': !(itemCount > 0) }" href="https://www.nhmshop.co.uk/catalog/product_compare/index/" title="Compare Products" x-data="initCompareHeader()" @private-content-loaded.window="receiveCompareData($event.detail.data)" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-8 h-8 md:h-6 md:w-6 hover:text-white" width="25" height="25" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3"/> <title>scale</title></svg> <span class="sr-only label"> Compare Products </span> <span class="absolute top-0 right-0 h-5 px-2 py-1 -mt-5 -mr-4 text-xs font-semibold leading-none text-center text-white uppercase transform -translate-x-1 translate-y-1/2 bg-yellow-500 rounded-full" > <span x-text="itemCount"></span> <span x-show="itemCount === 1" class="sr-only"> item </span> <span x-show="itemCount > 1" class="sr-only"> items </span> </span> </a> <!--Search Icon--> <button id="menu-search-icon" class="inline-block ml-1 no-underline sm:ml-3 hover:text-white" @click.prevent=" searchOpen = !searchOpen; $nextTick(() => { const searchInput = document.querySelector('#search'); searchInput.focus(); searchInput.select(); }); " > <span class="sr-only label"> Search </span> <!-- Old icon --> <!-- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-8 h-8 md:h-6 md:w-6 hover:text-white" width="25" height="25" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/> <title>search</title></svg> --> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="rgba(201, 247, 8, 1)" class="w-6 h-6 md:h-6 md:w-6 hover:stroke-white" width="25" height="25" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path> <title>search</title></svg> </button> <!--Customer Icon & Dropdown--> <div x-data="{ open: false }" class="relative inline-block"> <a href="https://www.nhmshop.co.uk/customer/account/" id="customer-menu" class="block hover:text-white" @click.prevent="open = true" :aria-expanded="open ? 'true' : 'false'" aria-label="My Account" > <!-- Old icon --> <!-- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="md:h-6 md:w-6" width="32" height="32" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/> </svg> --> <svg width="28" height="28" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="mask0_595_27148" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="28" height="28"> <rect width="28" height="28" fill="#D9D9D9"/> </mask> <g mask="url(#mask0_595_27148)"> <path d="M12 12C10.9 12 9.95833 11.6083 9.175 10.825C8.39167 10.0417 8 9.1 8 8C8 6.9 8.39167 5.95833 9.175 5.175C9.95833 4.39167 10.9 4 12 4C13.1 4 14.0417 4.39167 14.825 5.175C15.6083 5.95833 16 6.9 16 8C16 9.1 15.6083 10.0417 14.825 10.825C14.0417 11.6083 13.1 12 12 12ZM4 20V17.2C4 16.6333 4.14583 16.1125 4.4375 15.6375C4.72917 15.1625 5.11667 14.8 5.6 14.55C6.63333 14.0333 7.68333 13.6458 8.75 13.3875C9.81667 13.1292 10.9 13 12 13C13.1 13 14.1833 13.1292 15.25 13.3875C16.3167 13.6458 17.3667 14.0333 18.4 14.55C18.8833 14.8 19.2708 15.1625 19.5625 15.6375C19.8542 16.1125 20 16.6333 20 17.2V20H4ZM6 18H18V17.2C18 17.0167 17.9542 16.85 17.8625 16.7C17.7708 16.55 17.65 16.4333 17.5 16.35C16.6 15.9 15.6917 15.5625 14.775 15.3375C13.8583 15.1125 12.9333 15 12 15C11.0667 15 10.1417 15.1125 9.225 15.3375C8.30833 15.5625 7.4 15.9 6.5 16.35C6.35 16.4333 6.22917 16.55 6.1375 16.7C6.04583 16.85 6 17.0167 6 17.2V18ZM12 10C12.55 10 13.0208 9.80417 13.4125 9.4125C13.8042 9.02083 14 8.55 14 8C14 7.45 13.8042 6.97917 13.4125 6.5875C13.0208 6.19583 12.55 6 12 6C11.45 6 10.9792 6.19583 10.5875 6.5875C10.1958 6.97917 10 7.45 10 8C10 8.55 10.1958 9.02083 10.5875 9.4125C10.9792 9.80417 11.45 10 12 10Z" fill="#C9F708"/> </g> </svg> </a> <nav class="absolute right-0 z-20 hidden w-40 py-2 mt-2 -mr-4 px-1 overflow-auto origin-top-right rounded-sm shadow-lg sm:w-48 lg:mt-3 bg-night-blue-900" :class="{ 'hidden' : !open }" @click.away="open = false" aria-labelledby="customer-menu" > <a class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-night-blue-800" onclick="hyva.setCookie && hyva.setCookie( 'login_redirect', window.location.href, 1 )" href="https://www.nhmshop.co.uk/customer/account/index/"> Sign In </a> <a class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-night-blue-800" href="https://www.nhmshop.co.uk/customer/account/create/" > Create an Account </a> </nav> </div> <!--Cart Icon--> <a id="menu-cart-icon" @click.prevent.stop="$dispatch('toggle-cart',{});" class="relative inline-block ml-1 no-underline sm:ml-3 hover:text-white" href="https://www.nhmshop.co.uk/checkout/cart/index/" > <span class="sr-only label"> Cart </span> <!-- Old icon --> <!-- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-8 h-8 md:h-6 md:w-6 hover:text-white stroke-lime-green-100" width="25" height="25" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"/> <title>shopping-cart</title></svg> --> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <mask id="mask0_595_27151" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="24" height="24"> <rect width="24" height="24" fill="#D9D9D9"/> </mask> <g mask="url(#mask0_595_27151)"> <path d="M7 22C6.45 22 5.97917 21.8042 5.5875 21.4125C5.19583 21.0208 5 20.55 5 20C5 19.45 5.19583 18.9792 5.5875 18.5875C5.97917 18.1958 6.45 18 7 18C7.55 18 8.02083 18.1958 8.4125 18.5875C8.80417 18.9792 9 19.45 9 20C9 20.55 8.80417 21.0208 8.4125 21.4125C8.02083 21.8042 7.55 22 7 22ZM17 22C16.45 22 15.9792 21.8042 15.5875 21.4125C15.1958 21.0208 15 20.55 15 20C15 19.45 15.1958 18.9792 15.5875 18.5875C15.9792 18.1958 16.45 18 17 18C17.55 18 18.0208 18.1958 18.4125 18.5875C18.8042 18.9792 19 19.45 19 20C19 20.55 18.8042 21.0208 18.4125 21.4125C18.0208 21.8042 17.55 22 17 22ZM6.15 6L8.55 11H15.55L18.3 6H6.15ZM5.2 4H19.95C20.3333 4 20.625 4.17083 20.825 4.5125C21.025 4.85417 21.0333 5.2 20.85 5.55L17.3 11.95C17.1167 12.2833 16.8708 12.5417 16.5625 12.725C16.2542 12.9083 15.9167 13 15.55 13H8.1L7 15H19V17H7C6.25 17 5.68333 16.6708 5.3 16.0125C4.91667 15.3542 4.9 14.7 5.25 14.05L6.6 11.6L3 4H1V2H4.25L5.2 4Z" fill="#C9F708"/> </g> </svg> <span x-text="cart.summary_count" class="absolute top-0 right-0 hidden h-5 px-2 py-1 -mt-5 -mr-4 text-xs font-semibold leading-none text-center text-white uppercase transform -translate-x-1 translate-y-1/2 rounded-full bg-fungreen" :class="{ 'hidden': !cart.summary_count, 'block': cart.summary_count }" ></span> </a> </div> </div> <!--Search--> <div class="absolute z-10 hidden w-full border-t shadow-sm bg-container-lighter border-container-lighter" id="search-content" :class="{ 'block': searchOpen, 'hidden': !searchOpen }" @click.away="searchOpen = false" x-show="true" > <script> 'use strict'; function initMiniSearch() { return { minSearchLength: 3, suggestions: [], suggest() { const search = this.$refs.searchInput; if (search.value.length >= this.minSearchLength) { search.setCustomValidity(''); search.reportValidity(); this.fetchSuggestions(search.value); } else { this.suggestions = []; } }, fetchSuggestions(term) { fetch( window.BASE_URL + 'search/ajax/suggest?' + new URLSearchParams({q: term}), { headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => this.suggestions = result); }, search(term) { const search = this.$refs.searchInput; term = term || search.value; if (term.length < this.minSearchLength) { search.setCustomValidity('Minimum\u0020Search\u0020query\u0020length\u0020is\u00203'); search.reportValidity(); } else { search.setCustomValidity(''); search.value = term; this.$refs.form.submit(); } }, focusElement(element) { if (element && element.nodeName === "DIV") { element.focus(); return true; } else { return false; } } } } </script> <div class="container py-2 mx-auto text-black" x-data="initMiniSearch()"> <form class="form minisearch" id="search_mini_form" x-ref="form" @submit.prevent="search()" action="https://www.nhmshop.co.uk/catalogsearch/result/" method="get"> <label class="hidden" for="search" data-role="minisearch-label"> <span>Search</span> </label> <input id="search" x-ref="searchInput" type="search" autocomplete="off" name="q" value="" placeholder="Search entire store here..." maxlength="128" class="w-full p-2 text-lg leading-normal transition appearance-none text-grey-800 focus:outline-none focus:border-transparent lg:text-xl" @focus.once="suggest" @input.debounce.300="suggest" @keydown.arrow-down.prevent="focusElement($el.querySelector('[tabindex]'))" /> <template x-if="suggestions.length > 0"> <div class="w-full leading-normal transition appearance-none text-grey-800 flex flex-col mt-1"> <template x-for="suggestion in suggestions"> <div class="flex justify-between p-2 bg-container-lighter even:bg-container mb-1 cursor-pointer border border-container hover:bg-container-darker" tabindex="0" @click="search(suggestion.title)" @keydown.enter="search(suggestion.title)" @keydown.arrow-up.prevent=" focusElement($event.target.previousElementSibling) || $refs.searchInput.focus() " @keydown.arrow-down.prevent="focusElement($event.target.nextElementSibling)" > <span x-text="suggestion.title"></span> <!--<span x-text="suggestion.num_results"></span>--> </div> </template> </div> </template> <button type="submit" title="Search" class="action search sr-only" aria-label="Search" > Search </button> </form> </div> </div> <!--Cart Drawer--> <script> function initCartDrawer() { return { open: false, isLoading: false, cart: {}, maxItemsToDisplay: 20, itemsCount: 0, itemsTotal: 0, totalCartAmount: 0, totalCartQty: 0, totalCartPrice: 0, getData(data) { if (data.cart) { this.totalCartQty = 0; this.totalCartPrice = 0; for (i = 0; i < data.cart.items.length; i++) { this.totalCartQty += data.cart.items[i].qty; this.totalCartPrice += (data.cart.items[i].product_price_value * data.cart.items[i].qty); } this.cart = data.cart; this.itemsCount = data.cart.items && data.cart.items.length || 0; this.totalCartAmount = this.cart.summary_count; this.setCartItems(); } this.isLoading = false; }, cartItems: [], getItemCountTitle() { return hyva.strf('(%0 of %1)', this.maxItemsToDisplay, this.itemsCount) }, setCartItems() { this.cartItems = this.cart.items && this.cart.items.sort((a, b) => b.item_id - a.item_id) || []; if (this.maxItemsToDisplay > 0) { this.cartItems = this.cartItems.slice(0, parseInt(this.maxItemsToDisplay, 10)); } }, deleteItemFromCart(item) { const adobePostUrl = BASE_URL + 'adobe-cart/index/removeitem?item_id=' + item.item_id; fetch(adobePostUrl) .then(response => { if (!response.ok) console.log('GET request failed'); return response.json() }) .then(data => { let itemProductPrice = item.product_price.split('拢')[1]; itemProductPrice = itemProductPrice.substring(0, itemProductPrice.indexOf("<")); itemProductPrice = parseFloat(itemProductPrice) * item.qty; trackCartAction('remove', (this.totalCartQty - item.qty), (this.totalCartPrice - itemProductPrice), JSON.parse(data[2])); this.totalCartQty -= item.qty; this.totalCartPrice -= itemProductPrice; document.querySelector("body").dispatchEvent(adobeVars.dataLayerEventCart); adobeVars.dataLayerEventCart = ''; this.isLoading = true; const formKey = hyva.getFormKey(); const postUrl = BASE_URL + 'checkout/sidebar/removeItem/'; const itemId = item.item_id; fetch(postUrl, { "headers": { "content-type": "application/x-www-form-urlencoded; charset=UTF-8", }, "body": "form_key=" + formKey + "&item_id=" + itemId, "method": "POST", "mode": "cors", "credentials": "include" }).then(response => { if (response.redirected) { window.location.href = response.url; } else if (response.ok) { return response.json(); } else { window.dispatchMessages && window.dispatchMessages([{ type: 'warning', text: 'Could\u0020not\u0020remove\u0020item\u0020from\u0020quote.' }]); this.isLoading = false; } }).then(result => { window.dispatchMessages && window.dispatchMessages([{ type: result.success ? 'success' : 'error', text: result.success ? 'You\u0020removed\u0020the\u0020item.' : result.error_message }], result.success ? 5000 : 0) window.dispatchEvent(new CustomEvent('reload-customer-section-data')); }); }) .catch(error => { console.log(error); }) } } } </script> <section id="cart-drawer" x-data="initCartDrawer()" @private-content-loaded.window="getData($event.detail.data)" @toggle-cart.window="open=true" @keydown.window.escape="open=false" > <template x-if="cart && cart.summary_count"> <div role="dialog" aria-labelledby="cart-drawer-title" aria-modal="true" @click.away="open=false" class="fixed inset-y-0 right-0 z-30 flex max-w-full"> <div class="backdrop" x-show="open" x-transition:enter="ease-in-out duration-500" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in-out duration-500" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" @click="open=false" aria-label="Close panel"></div> <div class="relative w-screen max-w-md shadow-2xl" x-show="open" x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" x-transition:enter-start="translate-x-full" x-transition:enter-end="translate-x-0" x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" x-transition:leave-start="translate-x-0" x-transition:leave-end="translate-x-full" > <div x-show="open" x-transition:enter="ease-in-out duration-500" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in-out duration-500" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" class="absolute top-0 right-0 flex p-2"> <button @click="open=false" aria-label="Close panel" class="p-2 text-gray-300 transition duration-150 ease-in-out hover:text-black"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="32" height="32" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> <title>x</title></svg> </button> </div> <div class="flex flex-col h-full py-6 space-y-6 bg-white shadow-xl"> <header class="px-4 sm:px-6"> <h2 id="cart-drawer-title" class="text-2xl font-semibold font-headline leading-4 text-gray-900"> My basket <span class="items-total text-xs" x-show="maxItemsToDisplay && maxItemsToDisplay < itemsCount" x-text="getItemCountTitle()"> </span> </h2> </header> <div class="relative grid gap-6 px-4 py-6 bg-white sm:gap-8 sm:px-6 border-container pb-0"> <template x-for="item in cartItems"> <div class="mini-cart-item flex items-start p-3 -m-3 space-x-4 transition duration-150 ease-in-out border-b"> <a :href="item.product_url" class="w-1/4"> <img :src="item.product_image.src" :width="item.product_image.width" :height="item.product_image.height" loading="lazy" /> </a> <div class="w-3/4 space-y-2"> <div> <p class="text-xl font-text text-grey-900 font-semibold"> <span x-html="item.qty"></span> x <span x-html="item.product_name"></span> </p> </div> <template x-for="option in item.options"> <div> <p> <span class="font-semibold" x-text="option.label + ':'"></span> <span class="text-secondary" x-html="option.value"></span></p> </div> </template> <p class="font-semibold text-xl"><span x-html="item.product_price"></span></p> <div class="pt-4"> <a :href="item.configure_url" x-show="item.product_type !== 'grouped'" class="edit-item-in-cart inline-flex p-2 mr-2 btn btn-primary shadow-none bg-transparent text-azure-blue-600 hover:bg-transparent hover:text-azure-blue-600"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"/> <title>pencil</title></svg> </a> <button class="remove-item-from-cart inline-flex p-2 mr-2 btn btn-primary shadow-none bg-transparent text-azure-blue-600 hover:bg-transparent hover:text-azure-blue-600" @click="deleteItemFromCart(item)" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/> <title>trash</title></svg> </button> </div> </div> </div> </template> </div> <div class="relative grid gap-6 px-4 py-6 bg-white sm:gap-8 sm:px-6"> <div id="mini-cart-subtotal" class="w-full p-3 -m-3 space-x-4 transition duration-150 ease-in-out rounded-lg"> <p>Subtotal: <span x-html="cart.subtotal"></span></p> </div> <div id="mini-cart-bottom-buttons" class="w-full p-3 -m-3 space-x-4 transition duration-150 ease-in-out rounded-lg"> <a @click.prevent.stop="$dispatch('toggle-authentication', {url: 'https://www.nhmshop.co.uk/checkout/'});" href="https://www.nhmshop.co.uk/checkout/" class="inline-flex btn btn-primary bg-azure-blue-600 text-white hover:bg-azure-blue-700 hover:text-white shadow-none"> Checkout </a> <span>or</span> <a href="https://www.nhmshop.co.uk/checkout/cart/" class="underline font-semibold hover:text-azure-blue-600"> View and edit basket </a> </div> </div> </div> </div> <div class="flex flex-row justify-center items-center w-full h-full fixed select-none" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"> <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57 57" stroke="currentColor" class="text-primary" width="57" height="57" role="img"> <g fill="none" fill-rule="evenodd"> <g transform="translate(1 1)" stroke-width="2"> <circle cx="5" cy="50" r="5"> <animate attributeName="cy" begin="0s" dur="2.2s" values="50;5;50;50" calcMode="linear" repeatCount="indefinite"/> <animate attributeName="cx" begin="0s" dur="2.2s" values="5;27;49;5" calcMode="linear" repeatCount="indefinite"/> </circle> <circle cx="27" cy="5" r="5"> <animate attributeName="cy" begin="0s" dur="2.2s" from="5" to="5" values="5;50;50;5" calcMode="linear" repeatCount="indefinite"/> <animate attributeName="cx" begin="0s" dur="2.2s" from="27" to="27" values="27;49;5;27" calcMode="linear" repeatCount="indefinite"/> </circle> <circle cx="49" cy="50" r="5"> <animate attributeName="cy" begin="0s" dur="2.2s" values="50;50;5;50" calcMode="linear" repeatCount="indefinite"/> <animate attributeName="cx" from="49" to="49" begin="0s" dur="2.2s" values="49;5;27;49" calcMode="linear" repeatCount="indefinite"/> </circle> </g> </g> <title>loader</title></svg> <div class="ml-10 text-primary text-xl"> Loading... </div> </div> </div> </template> </section> <!--Authentication Pop-Up--> <script> function initAuthentication() { return { open: false, forceAuthentication: false, checkoutUrl: 'https://www.nhmshop.co.uk/checkout/index/', errors: 0, hasCaptchaToken: 0, displayErrorMessage: false, errorMessages: [], setErrorMessages: function setErrorMessages(messages) { this.errorMessages = [messages]; this.displayErrorMessage = this.errorMessages.length; }, submitForm: function () { // Do not rename $form, the variable is expected to be declared in the recaptcha output const $form = document.querySelector('#login-form'); if (this.errors === 0) { this.dispatchLoginRequest($form); } }, onPrivateContentLoaded: function (data) { const isLoggedIn = data.customer && data.customer.firstname; if (data.cart && !isLoggedIn) { this.forceAuthentication = !data.cart.isGuestCheckoutAllowed; } }, redirectIfAuthenticated: function (event) { if (event.detail && event.detail.url) { this.checkoutUrl = event.detail.url; } if (!this.forceAuthentication) { window.location.href = this.checkoutUrl; } }, dispatchLoginRequest: function(form) { this.isLoading = true; const username = this.$refs['customer-email'].value; const password = this.$refs['customer-password'].value; const formKey = hyva.getFormKey(); const bodyFields = { 'username': username, 'password': password, 'formKey': formKey }; const fieldName = 'g\u002Drecaptcha\u002Dresponse'; const recaptchaField = fieldName && form[fieldName]; if (recaptchaField) { bodyFields[fieldName] = recaptchaField.value; } fetch('https://www.nhmshop.co.uk/customer/ajax/login/', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, body: JSON.stringify(bodyFields) } ).then(response => { return response.json() } ).then(data=> { this.isLoading = false; if (data.errors) { dispatchMessages([{ type: 'error', text: data.message }], 5000); this.errors = 1; this.hasCaptchaToken = 0; } else { window.location.href = this.checkoutUrl; } }); } } } </script> <section id="authentication-popup" x-data="initAuthentication()" @private-content-loaded.window="onPrivateContentLoaded($event.detail.data)" @toggle-authentication.window="open = forceAuthentication; redirectIfAuthenticated(event)" @keydown.window.escape="open = false" > <div role="dialog" aria-modal="true" @click.away="open = false" class="hidden inset-y-0 right-0 z-30 flex max-w-full" :class="{ 'hidden': !open, 'fixed': open }" > <div class="relative w-screen max-w-md pt-16 bg-container-lighter" x-show="open" x-cloak="" x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" x-transition:enter-start="translate-x-full" x-transition:enter-end="translate-x-0" x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" x-transition:leave-start="translate-x-0" x-transition:leave-end="translate-x-full" > <div x-show="open" x-cloak="" x-transition:enter="ease-in-out duration-500" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in-out duration-500" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" class="absolute top-0 right-0 flex p-2 mt-2"> <button @click="open = false;" aria-label="Close panel" class="p-2 text-gray-300 transition duration-150 ease-in-out hover:text-black"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> <title>x</title></svg> </button> </div> <div class="flex flex-col h-full py-6 space-y-6 bg-white shadow-xl overflow-y-auto"> <div class="block-customer-login bg-container border border-container mx-4 p-4 shadow-sm"> <p id="authenticate-customer-login" class="text-lg leading-7 text-gray-900"> <strong class="font-medium">Checkout using your account</strong> </p> <form class="form form-login" method="post" @submit.prevent="submitForm();" id="login-form" > <div class="fieldset login"> <div class="field email required"> <label class="label" for="form-login-username" form="login-form" > <span>Email Address</span> </label> <div class="control"> <input name="username" id="form-login-username" x-ref="customer-email" @change="errors = 0" type="email" required class="form-input input-text" > </div> </div> <div class="field password required"> <label for="form-login-password" class="label" form="login-form"> <span>Password</span> </label> <div class="control"> <input name="password" id="form-login-password" type="password" class="form-input input-text" required x-ref="customer-password" @change="errors = 0" > </div> </div> <input name="context" type="hidden" value="checkout" /> <div class="actions-toolbar flex justify-between pt-6 pb-2 items-center"> <button type="submit" class="inline-flex btn btn-primary disabled:opacity-75" > Sign In </button> <a href="https://www.nhmshop.co.uk/customer/account/forgotpassword/" > Forgot Your Password? </a> </div> </div> </form> </div> <div class="mx-4"> </div> <div class="block-new-customer bg-container border border-container mx-4 p-4 shadow-sm"> <p id="authenticate-new-customer" class="text-lg mb-2 leading-7 text-gray-900"> <strong class="font-medium">Checkout as a new customer</strong> </p> <div class="block-content"> <p class="mb-1"> Creating an account has many benefits: </p> <ul class="list-disc pl-5"> <li> See order and shipping status</li> <li> Track order history</li> <li> Check out faster</li> </ul> <div class="actions-toolbar flex justify-between mt-6 mb-2 items-center"> <a href="https://www.nhmshop.co.uk/customer/account/create/" class="inline-flex btn btn-primary"> Create an Account </a> </div> </div> </div> </div> </div> </div> </section> </div> <div class="bg-night-blue-800"> <div x-data="initMenuDesktop_67425ed506730()" class="container z-30 order-2 sm:order-1 lg:order-2 navigation lg:block bg-night-blue-800 px-12 mx-auto mb-8" > <!-- desktop --> <div x-ref="nav-desktop" @load.window="setActiveMenu($el)" class="hidden lg:block lg:relative lg:min-h-0 lg:w-auto lg:pt-0"> <nav class="duration-150 z-10 ease-in-out transform flex justify-between items-center w-auto relative min-h-0 transition-display font-headline text-step--1 leading-5 font-semibold" > <div class="relative mr-2 level-0" @mouseenter="hoverPanelActiveId = 'category-node-1584'" @mouseleave="hoverPanelActiveId = 0" > <span class="flex items-center block p-3 text-md"> <a class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white text-step--1 leading-normal font-semibold level-0" href="https://www.nhmshop.co.uk/featured.html" title="Featured" > Featured </a> </span> <div class="absolute z-10 hidden px-6 py-4 -ml-6 shadow-lg bg-night-blue-800" :class="{ 'hidden' : hoverPanelActiveId !== 'category-node-1584', 'block' : hoverPanelActiveId === 'category-node-1584' }"> <a href="https://www.nhmshop.co.uk/featured/wildlife-photographer-of-the-year.html" title="Wildlife Photographer of the Year" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Wildlife Photographer of the Year </span> </a> <a href="https://www.nhmshop.co.uk/featured/birds.html" title="Birds" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Birds </span> </a> <a href="https://www.nhmshop.co.uk/featured/museum-gardens.html" title="Museum Gardens" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Museum Gardens </span> </a> <a href="https://www.nhmshop.co.uk/featured/jurassic-park.html" title="Jurassic Park" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Jurassic Park </span> </a> <a href="https://www.nhmshop.co.uk/featured/william-smith.html" title="William Smith" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> William Smith </span> </a> <a href="https://www.nhmshop.co.uk/featured/food-drink.html" title="Food & drink" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Food & drink </span> </a> </div> </div> <div class="relative mr-2 level-0" @mouseenter="hoverPanelActiveId = 'category-node-1787'" @mouseleave="hoverPanelActiveId = 0" > <span class="flex items-center block p-3 text-md"> <a class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white text-step--1 leading-normal font-semibold level-0" href="https://www.nhmshop.co.uk/christmas.html" title="Christmas" > Christmas </a> </span> <div class="absolute z-10 hidden px-6 py-4 -ml-6 shadow-lg bg-night-blue-800" :class="{ 'hidden' : hoverPanelActiveId !== 'category-node-1787', 'block' : hoverPanelActiveId === 'category-node-1787' }"> <a href="https://www.nhmshop.co.uk/christmas/gifts-for-kids.html" title="Gifts for kids" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Gifts for kids </span> </a> <a href="https://www.nhmshop.co.uk/christmas/gifts-for-adults.html" title="Gifts for adults" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Gifts for adults </span> </a> <a href="https://www.nhmshop.co.uk/christmas/gifts-under-20.html" title="Gifts under £20" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Gifts under 拢20 </span> </a> <a href="https://www.nhmshop.co.uk/christmas/gifts-under-50.html" title="Gifts under £50" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Gifts under 拢50 </span> </a> <a href="https://www.nhmshop.co.uk/catalog/category/view/s/christmas-decor-accessories/id/1665/" title="Christmas decor & accessories" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Christmas decor & accessories </span> </a> </div> </div> <div class="relative mr-2 level-0" @mouseenter="hoverPanelActiveId = 'category-node-1587'" @mouseleave="hoverPanelActiveId = 0" > <span class="flex items-center block p-3 text-md"> <a class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white text-step--1 leading-normal font-semibold level-0" href="https://www.nhmshop.co.uk/dinosaurs.html" title="Dinosaurs" > Dinosaurs </a> </span> <div class="absolute z-10 hidden px-6 py-4 -ml-6 shadow-lg bg-night-blue-800" :class="{ 'hidden' : hoverPanelActiveId !== 'category-node-1587', 'block' : hoverPanelActiveId === 'category-node-1587' }"> <a href="https://www.nhmshop.co.uk/dinosaurs/dinosaur-toys.html" title="Dinosaur toys" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Dinosaur toys </span> </a> <a href="https://www.nhmshop.co.uk/dinosaurs/dinosaur-games-activities.html" title="Dinosaur games & activities" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Dinosaur games & activities </span> </a> <a href="https://www.nhmshop.co.uk/dinosaurs/dinosaur-decor-accessories.html" title="Dinosaur decor & accessories" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Dinosaur decor & accessories </span> </a> </div> </div> <div class="relative mr-2 level-0" @mouseenter="hoverPanelActiveId = 'category-node-1593'" @mouseleave="hoverPanelActiveId = 0" > <span class="flex items-center block p-3 text-md"> <a class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white text-step--1 leading-normal font-semibold level-0" href="https://www.nhmshop.co.uk/prints.html" title="Prints" > Prints </a> </span> <div class="absolute z-10 hidden px-6 py-4 -ml-6 shadow-lg bg-night-blue-800" :class="{ 'hidden' : hoverPanelActiveId !== 'category-node-1593', 'block' : hoverPanelActiveId === 'category-node-1593' }"> <a href="https://www.nhmshop.co.uk/prints/current-wildlife-photographer-of-the-year.html" title="Current Wildlife Photographer of the Year" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Current Wildlife Photographer of the Year </span> </a> <a href="https://www.nhmshop.co.uk/prints/previous-wildlife-photographer-of-the-year.html" title="Previous Wildlife Photographer of the Year" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Previous Wildlife Photographer of the Year </span> </a> </div> </div> <div class="relative mr-2 level-0" @mouseenter="hoverPanelActiveId = 'category-node-1641'" @mouseleave="hoverPanelActiveId = 0" > <span class="flex items-center block p-3 text-md"> <a class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white text-step--1 leading-normal font-semibold level-0" href="https://www.nhmshop.co.uk/books.html" title="Books" > Books </a> </span> <div class="absolute z-10 hidden px-6 py-4 -ml-6 shadow-lg bg-night-blue-800" :class="{ 'hidden' : hoverPanelActiveId !== 'category-node-1641', 'block' : hoverPanelActiveId === 'category-node-1641' }"> <a href="https://www.nhmshop.co.uk/books/dinosaur-books.html" title="Dinosaur books for kids" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Dinosaur books for kids </span> </a> <a href="https://www.nhmshop.co.uk/books/story-books.html" title="Story books for kids" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Story books for kids </span> </a> <a href="https://www.nhmshop.co.uk/books/science-books-for-kids.html" title="Science books for kids" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Science books for kids </span> </a> <a href="https://www.nhmshop.co.uk/books/activity-books-for-kids.html" title="Activity books for kids" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Activity books for kids </span> </a> <a href="https://www.nhmshop.co.uk/books/museum-related-books.html" title="Museum-related books" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Museum-related books </span> </a> <a href="https://www.nhmshop.co.uk/books/science-books.html" title="Science books" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Science books </span> </a> <a href="https://www.nhmshop.co.uk/books/coffee-table-books.html" title="Coffee-table books" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Coffee-table books </span> </a> </div> </div> <div class="relative mr-2 level-0" @mouseenter="hoverPanelActiveId = 'category-node-1581'" @mouseleave="hoverPanelActiveId = 0" > <span class="flex items-center block p-3 text-md"> <a class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white text-step--1 leading-normal font-semibold level-0" href="https://www.nhmshop.co.uk/toys-games.html" title="Toys & games" > Toys & games </a> </span> <div class="absolute z-10 hidden px-6 py-4 -ml-6 shadow-lg bg-night-blue-800" :class="{ 'hidden' : hoverPanelActiveId !== 'category-node-1581', 'block' : hoverPanelActiveId === 'category-node-1581' }"> <a href="https://www.nhmshop.co.uk/toys-games/toys.html" title="Toys" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Toys </span> </a> <a href="https://www.nhmshop.co.uk/toys-games/games.html" title="Games" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Games </span> </a> <a href="https://www.nhmshop.co.uk/toys-games/kits-puzzles.html" title="Kits, puzzles & activities" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Kits, puzzles & activities </span> </a> </div> </div> <div class="relative mr-2 level-0" @mouseenter="hoverPanelActiveId = 'category-node-1608'" @mouseleave="hoverPanelActiveId = 0" > <span class="flex items-center block p-3 text-md"> <a class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white text-step--1 leading-normal font-semibold level-0" href="https://www.nhmshop.co.uk/clothing-accessories.html" title="Clothing & accessories" > Clothing & accessories </a> </span> <div class="absolute z-10 hidden px-6 py-4 -ml-6 shadow-lg bg-night-blue-800" :class="{ 'hidden' : hoverPanelActiveId !== 'category-node-1608', 'block' : hoverPanelActiveId === 'category-node-1608' }"> <a href="https://www.nhmshop.co.uk/clothing-accessories/clothing-for-kids.html" title="Clothing for kids" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Clothing for kids </span> </a> <a href="https://www.nhmshop.co.uk/clothing-accessories/accessories-for-kids.html" title="Accessories for kids" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Accessories for kids </span> </a> <a href="https://www.nhmshop.co.uk/catalog/category/view/s/costumes-for-kids/id/1740/" title="Costumes for kids" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Costumes for kids </span> </a> <a href="https://www.nhmshop.co.uk/clothing-accessories/clothing-for-adults.html" title="Clothing for adults" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Clothing for adults </span> </a> <a href="https://www.nhmshop.co.uk/clothing-accessories/accessories-for-adults.html" title="Accessories for adults" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Accessories for adults </span> </a> </div> </div> <div class="relative mr-2 level-0" @mouseenter="hoverPanelActiveId = 'category-node-1635'" @mouseleave="hoverPanelActiveId = 0" > <span class="flex items-center block p-3 text-md"> <a class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white text-step--1 leading-normal font-semibold level-0" href="https://www.nhmshop.co.uk/home-stationery.html" title="Home & stationery" > Home & stationery </a> </span> <div class="absolute z-10 hidden px-6 py-4 -ml-6 shadow-lg bg-night-blue-800" :class="{ 'hidden' : hoverPanelActiveId !== 'category-node-1635', 'block' : hoverPanelActiveId === 'category-node-1635' }"> <a href="https://www.nhmshop.co.uk/home-stationery/homeware-decor.html" title="Homeware & decor" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Homeware & decor </span> </a> <a href="https://www.nhmshop.co.uk/catalog/category/view/s/stationery/id/1671/" title="Stationery" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0" > <span class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white level-0"> Stationery </span> </a> </div> </div> <div class="relative mr-2 level-0" @mouseenter="hoverPanelActiveId = 'category-node-1764'" @mouseleave="hoverPanelActiveId = 0" > <span class="flex items-center block p-3 text-md"> <a class="w-full text-base text-white border-b border-transparent hover:border-b hover:border-solid hover:border-white text-step--1 leading-normal font-semibold level-0" href="https://www.nhmshop.co.uk/offers.html" title="Offers" > Offers </a> </span> </div> </nav> </div> </div> </div> </div> <script> 'use strict'; const initMenuDesktop_67425ed506730 = () => { return { hoverPanelActiveId: null, setActiveMenu(menuNode) { Array.from(menuNode.querySelectorAll('a')).filter(link => { return link.href.split('?')[0] === window.location.href.split('?')[0]; }).map(item => { item.closest('div.level-0') && item.closest('div.level-0').querySelector('a.level-0').classList.add('text-lime-green-100'); item.closest('div.level-0').querySelector('a.level-0').classList.add('border-lime-green-100'); item.closest('div.level-0').querySelector('a.level-0').classList.add('border-b-2'); item.closest('div.level-0').querySelector('a.level-0').classList.add('decoration-3'); }); } } } </script> </header><main id="maincontent" class="page-main-full-width"><div id="contentarea" tabindex="-1"></div> <div class="page messages"><script> function initMessages() { "use strict"; return { messages: window.mageMessages || [], isEmpty() { return this.messages.reduce( function (isEmpty, message) { return isEmpty && message === undefined }, true ) }, removeMessage(messageIndex) { this.messages[messageIndex] = undefined; }, addMessages(messages, hideAfter) { messages.map((message) => { if(message.type === 'error') { window.adobeDataLayerError = {}; window.adobeDataLayerError['event'] = 'errorShown'; window.adobeDataLayerError['error'] = { "type": "page", "text": encodeURI(message.text) } var dataLayerEvent = new CustomEvent("dataLayerEvent", {detail: window.adobeDataLayerError}); document.querySelector("body").dispatchEvent(dataLayerEvent); } this.messages = this.messages.concat(message); if (hideAfter) { this.setHideTimeOut(this.messages.length -1, hideAfter); } }); }, setHideTimeOut(messageIndex, hideAfter) { setTimeout((messageIndex) => { this.removeMessage(messageIndex); }, hideAfter, messageIndex); }, eventListeners: { ['@messages-loaded.window']() { this.addMessages(event.detail.messages, event.detail.hideAfter) }, ['@private-content-loaded.window'](event) { const data = event.detail.data; if ( data.messages && data.messages.messages && data.messages.messages.length ) { this.addMessages(data.messages.messages); } }, ['@clear-messages.window']() { this.messages = []; } } } } </script> <section id="messages" x-data="initMessages()" x-spread="eventListeners" > <template x-if="!isEmpty()"> <div class="w-full"> <div role="alert" class="messages container mx-auto py-3"> <template x-for="(message, index) in messages" :key="index"> <div> <template x-if="message"> <div class="message" :class="message.type" :ui-id="'message-' + message.type" > <span x-html="message.text"></span> <a href="#" class="close cursor-pointer" title="close" @click.prevent="removeMessage(index)"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="text-white" width="18" height="18" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> <title>x</title></svg> </a> </div> </template> </div> </template> </div> </div> </template> </section> </div><div class="columns"><div class="column main"><style>#html-body [data-pb-style=F2FMP38]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;margin:12px 0;padding:0}#html-body [data-pb-style=E01BS9L]{margin:0;padding:0}#html-body [data-pb-style=TGERSH4]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;margin:12px 0;padding:0}#html-body [data-pb-style=ANA801U]{margin:0;padding:0}#html-body [data-pb-style=CQM8RQH]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;margin:12px 0;padding:0}#html-body [data-pb-style=D76CQIC]{margin-top:0;margin-bottom:0;padding-top:0;padding-bottom:0}#html-body [data-pb-style=PWIJ85A]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;margin:12px 0;padding:0}#html-body [data-pb-style=U1O9WPA]{margin-top:0;margin-bottom:0;padding-top:0;padding-bottom:0}#html-body [data-pb-style=G3ICCVH]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;margin-top:12px;margin-bottom:12px;padding:0}#html-body [data-pb-style=ECTRCBM]{margin:0;padding:0}#html-body [data-pb-style=WQPV3JF]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;margin-top:12px;margin-bottom:12px;padding:0}#html-body [data-pb-style=JMG3X36]{margin:0;padding:0}#html-body [data-pb-style=CPHCAQG]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;margin:12px 0;padding:0}#html-body [data-pb-style=NMSL4DV]{margin-top:0;margin-bottom:0;padding-top:0;padding-bottom:0}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="F2FMP38"><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="E01BS9L" data-decoded="true"><section class="hero-image text-white" id="hero1"> <div class="relative"> <div class=" mx-auto lg:px-5"> <div class="relative sm:overflow-hidden"> <div class="absolute inset-0"> <picture style=" object-position: 84% 100%; "> <source class="h-full w-full object-cover" <img src="https://www.nhmshop.co.uk/media/wysiwyg/Homepage/Christmas2024_knitwear_family_hero_banner_1200x400.jpg"<source="" style=" object-position: 71% 118%; "> <img class="h-full w-full object-cover" src="https://www.nhmshop.co.uk/media/wysiwyg/Homepage/Christmas2024_knitwear_family_hero_banner_1200x400.jpg" alt="Two people dressed in the Museum Christmas jumper and bobble hat wrap a folded Christmas jumper on a red table, surrounded by red accessories on a red background. " width="960" height="540" style=" object-position: 65% 100%; /* width: 220px; */ /* height: 10px; */ "> </picture> </div> <div class="relative px-4 py-16 sm:px-6 sm:py-24 lg:py-32 px-8 lg:px-16"> <!-- DESKTOP HEADING --> <h1 class="hidden lg:block font-headline text-step-4 mb-2 font-semibold leading-tight text-white"> Let鈥檚 get festive! </h1> <!-- MOBILE HEADING --> <h1 class="block lg:hidden font-headline text-step-4 mb-2 font-semibold leading-tight text-white" style=" margin-left: -23px; margin-top: -10px; "> Let鈥檚 get<br> festive! </h1> <!-- DESKTOP TEXT --> <p class="hidden lg:block mb-4 font-text text-step-1 text-white font-medium leading-tight"> Our exclusive Jurassic knitwear is here </p> <!-- MOBILE TEXT --> <p class="block lg:hidden mb-4 font-text text-step-1 text-white leading-tight" style=" margin-left: -22px; "> </p> <a class="btn btn-primary text-grey-900 bg-white hover:bg-grey-50 hover:text-grey-900 text-step--1 font-text font-semibold hidden lg:inline-block shadow-none" href="/christmas.html"> Shop Christmas</a> <a class="btn btn-primary text-grey-900 bg-white hover:bg-grey-50 hover:text-grey-900 text-step--1 font-text font-semibold inline-block shadow-none md:hidden" href="/christmas.html" style=" margin-left: -28px; "> Shop Christmas</a> </div> </div> </div> </div> </section></div></div></div><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="TGERSH4"><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="ANA801U" data-decoded="true"><div class="relative mt-2"> <div class=" w-full lg:px-5"> <h2 class="mt-2 text-step-2 black text-center font-headline font-semibold bg-grey-100 text-grey-900 p-10"> <a href="#newsletter-validate-detail" class="hover:text-azure-blue-700 underline"><u>Sign up</u></a> for our emails and get 10% off your first order </h2> </div> </div></div></div></div><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="CQM8RQH"><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="D76CQIC" data-decoded="true"><div class="relative"> <div class="mx-auto grid max-w-lg gap-5 lg:max-w-none lg:grid-cols-3 lg:px-5"> <div class="flex flex-col overflow-hidden" id="pod1"> <div class="flex-shrink-0"> <a href="catalog/category/view/s/christmas-decor-accessories/id/1665/" class="mt-2 block"> <img src="https://www.nhmshop.co.uk/media/wysiwyg/Homepage/Christmas2024_decorations_small_pod_400x500.jpg" alt="" class="w-full object-cover" /> </a> </div> <div class="flex flex-1 flex-col justify-between bg-white p-6"> <div class="flex-1"> <a href="catalog/category/view/s/christmas-decor-accessories/id/1665/" class="mt-2 block"> <p class="text-step-0 font-semibold text-grey-900 font-headline leading-normal">Add character to your tree</p> <span class="text-azure-blue-600 hover:text-azure-blue-700 border-b border-azure-blue-600 hover:border-b-2 hover:border-solid hover:border-azure-blue-700 decoration-2 text-step--1 leading-normal font-semibold">Shop Christmas decorations</span> </a> </div> </div> </div> <div class="flex flex-col overflow-hidden" id="pod2"> <div class="flex-shrink-0"> <a href="christmas/gifts-for-adults.html" class="mt-2 block"> <img src="https://www.nhmshop.co.uk/media/wysiwyg/Homepage/Christmas2024_adult_gifts_blue_small_pod_400x500.jpg" alt="" class="w-full object-cover" /> </a> </div> <div class="flex flex-1 flex-col justify-between bg-white p-6"> <div class="flex-1"> <a href="christmas/gifts-for-adults.html" class="mt-2 block"> <p class="text-step-0 font-semibold text-grey-900 font-headline leading-normal">Ideas for grown-up dinosaur fans</p> <span class="mt-3 text-center text-azure-blue-600 hover:text-azure-blue-700 border-b border-azure-blue-600 hover:border-b-2 hover:border-solid hover:border-azure-blue-700 decoration-2 text-step--1 leading-normal font-semibold">Shop gifts for adults</span> </a> </div> </div> </div> <div class="flex flex-col overflow-hidden" id="pod3"> <div class="flex-shrink-0"> <a href="christmas/gifts-under-20.html" class="mt-2 block"> <img src="https://www.nhmshop.co.uk/media/wysiwyg/Homepage/Christmas2024_stockingfillers_gifts20_small_pod_400x500.jpg" alt="" class="w-full object-cover" /> </a> </div> <div class="flex flex-1 flex-col justify-between bg-white p-6"> <div class="flex-1"> <a href="christmas/gifts-under-20.html" class="mt-2 block"> <p class="text-step-0 font-semibold text-grey-900 font-headline leading-normal">Fill your stockings with great value </p> <span class="mt-3 text-center text-azure-blue-600 hover:text-azure-blue-700 border-b border-azure-blue-600 hover:border-b-2 hover:border-solid hover:border-azure-blue-700 decoration-2 text-step--1 leading-normal font-semibold">Shop gifts under 拢20</span> </a> </div> </div> </div> </div> </div></div></div></div><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="PWIJ85A"><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="U1O9WPA" data-decoded="true"><section class="text-gray-700 body-font" id="midpage1"> <div class="relative mt-2"> <div class="w-full mt-2"> <!-- UK --> <h2 class="mt-2 text-step-2 tracking-tight black text-center font-headline font-semibold bg-grey-100 text-grey-900 p-10 lg:mx-5" id="delivery"> Free UK delivery on orders of 拢50 and over - <a href="https://www.nhmshop.co.uk/delivery-information" class="hover:text-azure-blue-700 underline"><u>find out more</u></a> </h2> <!-- EU --> <h2 class="mt-2 text-step-2 tracking-tight black text-center font-headline font-semibold bg-grey-100 text-grey-900 p-10 lg:mx-5 hidden" id="delivery-eu"> We're unable to deliver to the EU and Northern Ireland yet - <a href="https://www.nhmshop.co.uk/faq" class="hover:text-azure-blue-700 underline"><u>find out why</u></a> </h2> <!-- US --> <h2 class="mt-2 text-step-2 tracking-tight black text-center font-headline font-semibold bg-grey-100 text-grey-900 p-10 lg:mx-5 hidden" id="delivery-us"> We can deliver to the USA - <a href="https://www.nhmshop.co.uk/delivery-information#worldwide" class="hover:text-azure-blue-700 underline"><u>find out how</u></a> </h2> <!-- ROW --> <h2 class="mt-2 text-step-2 tracking-tight black text-center font-headline font-semibold bg-grey-100 p-10 lg:mx-5 hidden" id="delivery-row"> We can deliver to you worldwide - <a href="https://www.nhmshop.co.uk/delivery-information#worldwide" class="text-azure-blue-600 underline"><u>find out more</u></a> </h2> </div> </div> </section></div></div></div><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="G3ICCVH"><div class="analytics-identifier-class" data-content-type="html" data-appearance="default" data-element="main" data-pb-style="ECTRCBM" data-decoded="true"><div class="md:pr-6 my-2 mx-auto lg:mx-5 flex bg-night-blue-900 md:flex-row flex-col items-center"> <div class="w-full xl:w-1/2 mb-10 md:mb-0"> <img src="https://www.nhmshop.co.uk/media/wysiwyg/Homepage/WPY60_pod_midpage_banner_480x400.jpg" class="w-full lg:w-fit object-cover object-center lg:object-left" /> </div> <div class="xl:flex-grow md:w-2/3 lg:pl-24 md:pl-16 flex flex-col md:items-start md:text-left items-center text-center"> <h2 class="title-font text-step-2 leading-tight mb-4 font-medium text-white font-headline font-semibold">Winter wonderlands</h2> <p class="mb-8 font-text text-step--1 font-normal leading-normal text-white"> Decorate your home with snowy scenes from our sixtieth Wildlife Photographer of the Year exhibition, available in a selection of formats. </p> <div class="flex justify-center mb-8"> <a href="prints/current-wildlife-photographer-of-the-year.html" class="inline-flex btn btn-primary bg-lime-green-100 text-grey-900 hover:bg-lime-green-200 hover:text-grey-900 border-2 border-solid border-lime-green-100 shadow-none text-step--1 font-semibold leading-normal">Shop prints</a> </div> </div> </div></div></div></div><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="WQPV3JF"><div class="analytics-identifier-class" data-content-type="html" data-appearance="default" data-element="main" data-pb-style="JMG3X36" data-decoded="true"><div class="md:pr-6 my-2 mx-auto lg:mx-5 flex bg-night-blue-900 md:flex-row flex-col items-center"> <div class="w-full xl:w-1/2 mb-10 md:mb-0"> <img src="https://www.nhmshop.co.uk/media/wysiwyg/Homepage/Gift_membership_1_card_hand_Hintze_Hall_midpage_banner_480x400_2.jpg" class="w-full lg:w-fit object-cover object-center lg:object-left" /> </div> <div class="xl:flex-grow md:w-2/3 lg:pl-24 md:pl-16 flex flex-col md:items-start md:text-left items-center text-center"> <h2 class="title-font text-step-2 leading-tight mb-4 font-medium text-white font-headline font-semibold">A year of discovery with gift membership</h2> <p class="mb-8 font-text text-step--1 font-normal leading-normal text-white"> Give a gift that keeps on giving this season with our gift memberships. With free entry to all our exhibitions, special members-only events and exclusive discounts, it鈥檚 a present that everyone will love! </p> <div class="flex justify-center mb-8"> <a href="https://www.nhm.ac.uk/support-us/membership/gift-membership.html" class="inline-flex btn btn-primary bg-lime-green-100 text-grey-900 hover:bg-lime-green-200 hover:text-grey-900 border-2 border-solid border-lime-green-100 shadow-none text-step--1 font-semibold leading-normal">Find out more</a> </div> </div> </div></div></div></div><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="CPHCAQG"><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="NMSL4DV" data-decoded="true"><div class="relative"> <div class=" w-full px-0"> <h2 class="text-step-2 black text-center font-headline bg-grey-100 text-grey-900 font-semibold p-10 lg:mx-5"> Shop with us and help protect our planet's future - <a href="https://www.nhmshop.co.uk/about-us"><u class="hover:text-azure-blue-700 underline">find out how</u></a> </h2> </div> </div></div></div></div><div class="product-slider"> <div> <script> 'use strict'; function initSliderComponent() { return { active: 0, itemCount: 0, getSlider() { return this.$el.querySelector('.js_slides'); }, pageSize: 4, pageFillers: 0, calcPageSize() { const slider = this.getSlider(); if (slider) { this.itemCount = slider.querySelectorAll('.js_slide').length; this.pageSize = Math.round(slider.clientWidth / slider.querySelector('.js_slide').clientWidth); this.pageFillers = ( this.pageSize * Math.ceil(this.itemCount / this.pageSize) ) - this.itemCount; } }, calcActive() { const slider = this.getSlider(); if (slider) { const sliderItems = this.itemCount + this.pageFillers; const calculatedActiveSlide = slider.scrollLeft / (slider.scrollWidth / sliderItems); this.active = Math.round(calculatedActiveSlide / this.pageSize) * this.pageSize; } }, scrollPrevious() { this.scrollTo(this.active - this.pageSize); }, scrollNext() { this.scrollTo(this.active + this.pageSize); }, scrollTo(idx) { const slider = this.getSlider(); if (slider) { const slideWidth = slider.scrollWidth / (this.itemCount + this.pageFillers); slider.scrollLeft = Math.floor(slideWidth) * idx; this.active = idx; } } } } </script> <section class="my-12 text-gray-700 body-font" x-data="initSliderComponent()" x-init="calcPageSize();" @resize.window.debounce="calcPageSize(); $nextTick( function() { calcActive() })" > <div class="relative w-3/4 m-auto"> <div class="container flex flex-col items-center pt-6 pb-3 mx-auto mb-6 border-b border-grey-300 md:flex-row"> <h3 class="text-step-1 font-bold text-gray-900 title-font leading-5"> Gift Ideas </h3> </div> <div class="flex-none relative w-full overflow-x-hidden focus-within:ring-2 ring-offset-2 active:ring-0 ring-blue-500 ring-opacity-50"> <div class="relative flex flex-nowrap w-full overflow-auto transition-all js_slides snap md:px-1 xl:px-2" @scroll.debounce="calcActive" > <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/25835/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="25835"/> <a href="https://www.nhmshop.co.uk/fern-christmas-jumper.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-25835.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/j/m/jmp00108_jmp00139_1000x1000_fern_christmas_jumper_front_arms_folded.jpg" loading="lazy" width="360" height="360" alt="The jumper’s front pattern shows a skeleton of Fern the Diplodocus in green, against a white background. The collar, hem and cuffs are bright red and there’s a row of green dinosaur skulls alternating with fir trees." title="The jumper’s front pattern shows a skeleton of Fern the Diplodocus in green, against a white background. The collar, hem and cuffs are bright red and there’s a row of green dinosaur skulls alternating with fir trees." /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/fern-christmas-jumper.html"> Fern Christmas Jumper </a> </div> <script> function initPriceBox__674257b299a9e() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b299a9e()" @update-prices-25835.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="25835" data-price-box="product-id-25835"><span class="normal-price"> <span class="price-container price-final_price tax weee" > <span class="price-label">From</span> <span id="product-price-25835" data-price-amount="45" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢45.00</span></span> </span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/25834/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="25834"/> <a href="https://www.nhmshop.co.uk/fern-christmas-jumper-for-kids.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-25834.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/j/m/jmp00207__jmp00238_1000x1000_fern_christmas_jumper_for_kids_front.jpg" loading="lazy" width="360" height="360" alt="The jumper’s front pattern shows a skeleton of Fern the Diplodocus in green, against a white background. The collar, hem and cuffs are bright red and there’s a row of green dinosaur skulls alternating with fir trees." title="The jumper’s front pattern shows a skeleton of Fern the Diplodocus in green, against a white background. The collar, hem and cuffs are bright red and there’s a row of green dinosaur skulls alternating with fir trees." /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/fern-christmas-jumper-for-kids.html"> Fern Christmas Jumper for Kids </a> </div> <script> function initPriceBox__674257b2ba9a7() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b2ba9a7()" @update-prices-25834.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="25834" data-price-box="product-id-25834"><span class="normal-price"> <span class="price-container price-final_price tax weee" > <span class="price-label">From</span> <span id="product-price-25834" data-price-amount="30" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢30.00</span></span> </span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/25770/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="25770"/> <a href="https://www.nhmshop.co.uk/wildlife-photographer-of-the-year-portfolio-34.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-25770.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/9/7/9780565095642_1000x1000_wildlife_photographer_of_the_year_portfolio_34_front_cover.jpg" loading="lazy" width="360" height="360" alt="The front cover is a black and white photograph by William Fortescue of two lions on the Serengeti National Park, Tanzania roaring at each other as storm clouds gather above." title="The front cover is a black and white photograph by William Fortescue of two lions on the Serengeti National Park, Tanzania roaring at each other as storm clouds gather above." /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/wildlife-photographer-of-the-year-portfolio-34.html"> Wildlife Photographer of the Year Portfolio 34 </a> </div> <script> function initPriceBox__674257b2d09ec() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b2d09ec()" @update-prices-25770.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="25770" data-price-box="product-id-25770"> <span class="price-container price-final_price tax weee" > <span id="product-price-25770" data-price-amount="28" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢28.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/25843/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="25843"/> <a href="https://www.nhmshop.co.uk/fern-christmas-scarf-for-kids.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-25843.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/s/c/scf00030_1000x1000_fern_christmas_scarf_for_kids_1.jpg" loading="lazy" width="360" height="360" alt="The whole scarf can be seen although it’s folded in the middle. The red trim and the green dinosaur skeleton are the main features of the white, red, blue and green pattern." title="The whole scarf can be seen although it’s folded in the middle. The red trim and the green dinosaur skeleton are the main features of the white, red, blue and green pattern." /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/fern-christmas-scarf-for-kids.html"> Fern Christmas Scarf for Kids </a> </div> <script> function initPriceBox__674257b2da1a7() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b2da1a7()" @update-prices-25843.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="25843" data-price-box="product-id-25843"> <span class="price-container price-final_price tax weee" > <span id="product-price-25843" data-price-amount="18" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢18.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/25212/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="25212"/> <a href="https://www.nhmshop.co.uk/trex-christmas-tree-topper.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-25212.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/a/2/a25444_1000x1000_t_rex_christmas_tree_topper_2.jpg" loading="lazy" width="360" height="360" alt="T. rex Christmas Tree Topper with its green body, Santa-style red and white hat and white wings. It also has a halo." title="T. rex Christmas Tree Topper with its green body, Santa-style red and white hat and white wings. It also has a halo." /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/trex-christmas-tree-topper.html"> T. rex Christmas Tree Topper </a> </div> <script> function initPriceBox__674257b2e2bad() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b2e2bad()" @update-prices-25212.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="25212" data-price-box="product-id-25212"> <span class="price-container price-final_price tax weee" > <span id="product-price-25212" data-price-amount="16" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢16.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/25866/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="25866"/> <a href="https://www.nhmshop.co.uk/fern-wooden-christmas-tree-decoration.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-25866.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/x/m/xms78064_1000x1000_fern_wooden_christmas_tree_decoration.jpg" loading="lazy" width="360" height="360" alt="The flat, round, decoration hangs on gold ribbon. Around the edge are the words: Fern the Diplodocus, Natural History Museum 2024. It shows a wood-cut scene of the Diplodocus skeleton outside the Museum at night as it snows." title="The flat, round, decoration hangs on gold ribbon. Around the edge are the words: Fern the Diplodocus, Natural History Museum 2024. It shows a wood-cut scene of the Diplodocus skeleton outside the Museum at night as it snows." /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/fern-wooden-christmas-tree-decoration.html"> Fern Wooden Christmas Tree Decoration </a> </div> <script> function initPriceBox__674257b2ea175() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b2ea175()" @update-prices-25866.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="25866" data-price-box="product-id-25866"> <span class="price-container price-final_price tax weee" > <span id="product-price-25866" data-price-amount="15" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢15.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/25781/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="25781"/> <a href="https://www.nhmshop.co.uk/wildlife-photographer-of-the-year-60-calendar-2025.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-25781.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/w/p/wpy60wc492_1000x1000_wildlife_photographer_of_the_year_60_calendar_2025_1.jpg" loading="lazy" width="360" height="360" alt="The calendar's front cover is of a white-coloured stoat leaping above the snow and arching its body towards its black-fur-tipped tail." title="The calendar's front cover is of a white-coloured stoat leaping above the snow and arching its body towards its black-fur-tipped tail." /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/wildlife-photographer-of-the-year-60-calendar-2025.html"> Wildlife Photographer of the Year 60 Calendar 2025 </a> </div> <script> function initPriceBox__674257b2f2fac() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b2f2fac()" @update-prices-25781.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="25781" data-price-box="product-id-25781"> <span class="price-container price-final_price tax weee" > <span id="product-price-25781" data-price-amount="12" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢12.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/25851/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="25851"/> <a href="https://www.nhmshop.co.uk/green-sea-turtle-christmas-tree-decoration.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-25851.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/x/m/xms10798_1000x1000_green_sea_turtle_christmas_tree_decoration_1.jpg" loading="lazy" width="360" height="360" alt="The light-green body of the turtle has a darker green shell and wears red goggles and a red and white Santa-style hat. It hangs from a green thread." title="The light-green body of the turtle has a darker green shell and wears red goggles and a red and white Santa-style hat. It hangs from a green thread." /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/green-sea-turtle-christmas-tree-decoration.html"> Green Sea Turtle Christmas Tree Decoration </a> </div> <script> function initPriceBox__674257b305c8a() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b305c8a()" @update-prices-25851.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="25851" data-price-box="product-id-25851"> <span class="price-container price-final_price tax weee" > <span id="product-price-25851" data-price-amount="12" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢12.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div :class="{ 'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex flex-shrink-0 py-1' : pageFillers > 0 }"></div> <div :class="{ 'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex flex-shrink-0 py-1' : pageFillers > 1 }"></div> <div :class="{ 'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex flex-shrink-0 py-1' : pageFillers > 2 }"></div> </div> </div> <div style="min-height: 65px"> <template x-if="itemCount > pageSize"> <div class="flex items-center justify-center py-4"> <button aria-label="Previous" tabindex="-1" class="mr-4 text-azure-blue-600 rounded-full outline-none focus:outline-none flex-none" :class="{ 'opacity-25 pointer-events-none' : active === 0 }" @click="scrollPrevious"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-5 h-5" width="25" height="25" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> <title>chevron-left</title></svg> </button> <div class="flex flex-wrap w-full md:w-auto justify-center"> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 0, 'hidden': (pageSize !== 1 && !!(0 % pageSize)) }" @click="scrollTo(0)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 1, 'hidden': (pageSize !== 1 && !!(1 % pageSize)) }" @click="scrollTo(1)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 2, 'hidden': (pageSize !== 1 && !!(2 % pageSize)) }" @click="scrollTo(2)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 3, 'hidden': (pageSize !== 1 && !!(3 % pageSize)) }" @click="scrollTo(3)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 4, 'hidden': (pageSize !== 1 && !!(4 % pageSize)) }" @click="scrollTo(4)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 5, 'hidden': (pageSize !== 1 && !!(5 % pageSize)) }" @click="scrollTo(5)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 6, 'hidden': (pageSize !== 1 && !!(6 % pageSize)) }" @click="scrollTo(6)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 7, 'hidden': (pageSize !== 1 && !!(7 % pageSize)) }" @click="scrollTo(7)"> </span> </div> <button aria-label="Next" tabindex="-1" class="ml-4 text-azure-blue-600 rounded-full outline-none focus:outline-none flex-none" :class="{ 'opacity-25 pointer-events-none' : active >= itemCount-pageSize }" @click="scrollNext"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-5 h-5" width="25" height="25" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> <title>chevron-right</title></svg> </button> </div> </template> </div> </div> </section> </div> <script> 'use strict'; window.addEventListener('DOMContentLoaded', function() { if (! window.productSliderEventHandlerInitialized) { window.productSliderEventHandlerInitialized = true; window.addEventListener('product-add-to-compare', (event) => { const productId = event.detail.productId; hyva.postForm({ action: BASE_URL + 'catalog/product_compare/add/', data: {product: productId} }) }) } }); </script> </div> <div class="product-slider"> <div> <script> 'use strict'; function initSliderComponent() { return { active: 0, itemCount: 0, getSlider() { return this.$el.querySelector('.js_slides'); }, pageSize: 4, pageFillers: 0, calcPageSize() { const slider = this.getSlider(); if (slider) { this.itemCount = slider.querySelectorAll('.js_slide').length; this.pageSize = Math.round(slider.clientWidth / slider.querySelector('.js_slide').clientWidth); this.pageFillers = ( this.pageSize * Math.ceil(this.itemCount / this.pageSize) ) - this.itemCount; } }, calcActive() { const slider = this.getSlider(); if (slider) { const sliderItems = this.itemCount + this.pageFillers; const calculatedActiveSlide = slider.scrollLeft / (slider.scrollWidth / sliderItems); this.active = Math.round(calculatedActiveSlide / this.pageSize) * this.pageSize; } }, scrollPrevious() { this.scrollTo(this.active - this.pageSize); }, scrollNext() { this.scrollTo(this.active + this.pageSize); }, scrollTo(idx) { const slider = this.getSlider(); if (slider) { const slideWidth = slider.scrollWidth / (this.itemCount + this.pageFillers); slider.scrollLeft = Math.floor(slideWidth) * idx; this.active = idx; } } } } </script> <section class="my-12 text-gray-700 body-font" x-data="initSliderComponent()" x-init="calcPageSize();" @resize.window.debounce="calcPageSize(); $nextTick( function() { calcActive() })" > <div class="relative w-3/4 m-auto"> <div class="container flex flex-col items-center pt-6 pb-3 mx-auto mb-6 border-b border-grey-300 md:flex-row"> <h3 class="text-step-1 font-bold text-gray-900 title-font leading-5"> Bestsellers </h3> </div> <div class="flex-none relative w-full overflow-x-hidden focus-within:ring-2 ring-offset-2 active:ring-0 ring-blue-500 ring-opacity-50"> <div class="relative flex flex-nowrap w-full overflow-auto transition-all js_slides snap md:px-1 xl:px-2" @scroll.debounce="calcActive" > <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/24456/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="DKlpRX4jWJqziAn2" /> <input type="hidden" name="product" value="24456"/> <a href="https://www.nhmshop.co.uk/museum-dinosaur-guess-who-game.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-24456.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/a/1/a16623-guess-who-new-12_3.jpg" loading="lazy" width="360" height="360" alt="Guess Who? Dinosaur Edition Board Game" title="Guess Who? Dinosaur Edition Board Game" /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/museum-dinosaur-guess-who-game.html"> Guess Who? Dinosaur Edition Board Game </a> </div> <script> function initPriceBox__674259cb4cde5() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674259cb4cde5()" @update-prices-24456.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="24456" data-price-box="product-id-24456"> <span class="price-container price-final_price tax weee" > <span id="product-price-24456" data-price-amount="20" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢20.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/25700/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="25700"/> <a href="https://www.nhmshop.co.uk/museum-gardens-tote-bag.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-25700.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/b/a/bag65411_1000x1000_museum_gardens_tote_bag.jpg" loading="lazy" width="360" height="360" alt="Museum Gardens Tote Bag, made from cream organic cotton with orange straps and an illustration of Fern the Diplodocus in our gardens on the front." title="Museum Gardens Tote Bag, made from cream organic cotton with orange straps and an illustration of Fern the Diplodocus in our gardens on the front." /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/museum-gardens-tote-bag.html"> Museum Gardens Tote Bag </a> </div> <script> function initPriceBox__674257b31cafc() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b31cafc()" @update-prices-25700.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="25700" data-price-box="product-id-25700"> <span class="price-container price-final_price tax weee" > <span id="product-price-25700" data-price-amount="18" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢18.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/1240/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="cTbc7VFaxMczTwY0" /> <input type="hidden" name="product" value="1240"/> <a href="https://www.nhmshop.co.uk/pocket-microscope.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-1240.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/a/1/a10110-pocket-microscope-nhm-3_4.jpg" loading="lazy" width="360" height="360" alt="Pocket Microscope" title="Pocket Microscope" /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/pocket-microscope.html"> Pocket Microscope </a> </div> <script> function initPriceBox__674259ceac7cd() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674259ceac7cd()" @update-prices-1240.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="1240" data-price-box="product-id-1240"> <span class="price-container price-final_price tax weee" > <span id="product-price-1240" data-price-amount="15" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢15.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/19571/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="19571"/> <a href="https://www.nhmshop.co.uk/plush-itsy-bitsy-diplodocus-in-egg-nhm.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-19571.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/a/2/a21269-diplodocus-with-egg-3.jpg" loading="lazy" width="360" height="360" alt="Itsy Bitsy Diplodocus in Egg" title="Itsy Bitsy Diplodocus in Egg" /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/plush-itsy-bitsy-diplodocus-in-egg-nhm.html"> Itsy Bitsy Diplodocus in Egg </a> </div> <script> function initPriceBox__674257b32bc99() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b32bc99()" @update-prices-19571.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="19571" data-price-box="product-id-19571"> <span class="price-container price-final_price tax weee" > <span id="product-price-19571" data-price-amount="12" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢12.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/25366/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="25366"/> <a href="https://www.nhmshop.co.uk/t-rex-hatching-egg-in-a-box.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-25366.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/a/2/a2197_1000x1000_t_rex_hatching_egg_in_a_box_1.jpg" loading="lazy" width="360" height="360" alt="The orange hatching egg is shown in its dark and light blue cardboard packaging, which features a T. rex and the words 'Roar' repeated in a circle." title="The orange hatching egg is shown in its dark and light blue cardboard packaging, which features a T. rex and the words 'Roar' repeated in a circle." /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/t-rex-hatching-egg-in-a-box.html"> T. rex Hatching Egg in a Box </a> </div> <script> function initPriceBox__674257b335075() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b335075()" @update-prices-25366.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="25366" data-price-box="product-id-25366"> <span class="price-container price-final_price tax weee" > <span id="product-price-25366" data-price-amount="9" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢9.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/25601/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="25601"/> <a href="https://www.nhmshop.co.uk/lion-soft-toy.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-25601.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/a/2/a21054_1000x1000s_lion_soft_toy_1.jpg" loading="lazy" width="360" height="360" alt="Lion Soft Toy positioned sat down, facing forward, showing its orange mane" title="Lion Soft Toy positioned sat down, facing forward, showing its orange mane" /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/lion-soft-toy.html"> Lion Soft Toy </a> </div> <script> function initPriceBox__674257b33c99f() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b33c99f()" @update-prices-25601.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="25601" data-price-box="product-id-25601"> <span class="price-container price-final_price tax weee" > <span id="product-price-25601" data-price-amount="8" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢8.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/8610/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="8610"/> <a href="https://www.nhmshop.co.uk/museum-dinosaur-top-trumps.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-8610.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/a/1/a16624-nhm-top-trumps-1.jpg" loading="lazy" width="360" height="360" alt="Museum Dinosaurs Top Trumps" title="Museum Dinosaurs Top Trumps" /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/museum-dinosaur-top-trumps.html"> Museum Dinosaurs Top Trumps </a> </div> <script> function initPriceBox__674257b3439d2() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b3439d2()" @update-prices-8610.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="8610" data-price-box="product-id-8610"> <span class="price-container price-final_price tax weee" > <span id="product-price-8610" data-price-amount="7" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢7.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div class="flex flex-shrink-0 w-full mr-1 p-1 js_slide md:w-1/2 lg:w-1/3 xl:w-1/4"> <form method="post" action="https://www.nhmshop.co.uk/checkout/cart/add/uenc/%25uenc%25/product/11697/" class="item product product-item product_addtocart_form card card-interactive flex flex-col w-full shadow-none rounded-none " > <input name="form_key" type="hidden" value="WQYDdotwdflzI5r3" /> <input type="hidden" name="product" value="11697"/> <a href="https://www.nhmshop.co.uk/plush-dino-snap-band.html" class="product photo product-item-photo block mx-auto mb-3 " tabindex="-1" > <img class="object-contain product-image-photo" x-data="" @update-gallery-11697.window="$el.src = $event.detail" src="https://www.nhmshop.co.uk/media/catalog/product/cache/a04ad7b203e3bc38d808857f8d4378f2/a/1/a15234-snapband-plush-dino-6.jpg" loading="lazy" width="360" height="360" alt="Dinosaur Snap Bands. Clockwise from top: Triceratops, Diplodocus, Stegosaurus, T. rex" title="Dinosaur Snap Bands. Clockwise from top: Triceratops, Diplodocus, Stegosaurus, T. rex" /> </a> <div class="product-info flex flex-col flex-grow"> <div class="mt-2 mb-1 items-center justify-center text-grey-900 font-semibold text-step-0 leading-5 text-left "> <a class="product-item-link" href="https://www.nhmshop.co.uk/plush-dino-snap-band.html"> Dinosaur Snap Band </a> </div> <script> function initPriceBox__674257b34b428() { return { updatePrice(priceData) { const regularPriceLabel = this.$el.querySelector('.normal-price .price-label'); const regularPriceElement = this.$el.querySelector('.normal-price .price-wrapper .price'); if (priceData.finalPrice.amount < priceData.oldPrice.amount) { regularPriceLabel.classList.add('hidden'); } else { regularPriceLabel.classList.remove('hidden'); } regularPriceElement.innerText = hyva.formatPrice(priceData.finalPrice.amount); } } } </script> <div class="pt-1 text-gray-900" x-data="initPriceBox__674257b34b428()" @update-prices-11697.window="updatePrice($event.detail);" > <div class="price-box price-final_price" data-role="priceBox" data-product-id="11697" data-price-box="product-id-11697"> <span class="price-container price-final_price tax weee" > <span id="product-price-11697" data-price-amount="5" data-price-type="finalPrice" class="price-wrapper " ><span class="price">拢5.00</span></span> </span> </div> </div> <div class="mt-auto pt-3 flex flex-wrap"> <button class="w-auto btn rounded-full justify-center text-step--1 font-semibold leading-6 add-to-basket text-azure-blue-600 bg-white hover:text-azure-blue-600 hover:bg-azure-blue-100 border-2 border-azure-blue-600 border-solid focus:border-azure-blue-600 shadow-none mr-auto" aria-label="Add to basket" > Add to basket </button> </div> </div> </form> </div> <div :class="{ 'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex flex-shrink-0 py-1' : pageFillers > 0 }"></div> <div :class="{ 'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex flex-shrink-0 py-1' : pageFillers > 1 }"></div> <div :class="{ 'js_dummy_slide w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex flex-shrink-0 py-1' : pageFillers > 2 }"></div> </div> </div> <div style="min-height: 65px"> <template x-if="itemCount > pageSize"> <div class="flex items-center justify-center py-4"> <button aria-label="Previous" tabindex="-1" class="mr-4 text-azure-blue-600 rounded-full outline-none focus:outline-none flex-none" :class="{ 'opacity-25 pointer-events-none' : active === 0 }" @click="scrollPrevious"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-5 h-5" width="25" height="25" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> <title>chevron-left</title></svg> </button> <div class="flex flex-wrap w-full md:w-auto justify-center"> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 0, 'hidden': (pageSize !== 1 && !!(0 % pageSize)) }" @click="scrollTo(0)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 1, 'hidden': (pageSize !== 1 && !!(1 % pageSize)) }" @click="scrollTo(1)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 2, 'hidden': (pageSize !== 1 && !!(2 % pageSize)) }" @click="scrollTo(2)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 3, 'hidden': (pageSize !== 1 && !!(3 % pageSize)) }" @click="scrollTo(3)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 4, 'hidden': (pageSize !== 1 && !!(4 % pageSize)) }" @click="scrollTo(4)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 5, 'hidden': (pageSize !== 1 && !!(5 % pageSize)) }" @click="scrollTo(5)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 6, 'hidden': (pageSize !== 1 && !!(6 % pageSize)) }" @click="scrollTo(6)"> </span> <span class="flex-shrink-0 block w-3 h-3 m-1 bg-black bg-opacity-25 rounded-full shadow cursor-pointer" :class="{ 'bg-opacity-100': active === 7, 'hidden': (pageSize !== 1 && !!(7 % pageSize)) }" @click="scrollTo(7)"> </span> </div> <button aria-label="Next" tabindex="-1" class="ml-4 text-azure-blue-600 rounded-full outline-none focus:outline-none flex-none" :class="{ 'opacity-25 pointer-events-none' : active >= itemCount-pageSize }" @click="scrollNext"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-5 h-5" width="25" height="25" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> <title>chevron-right</title></svg> </button> </div> </template> </div> </div> </section> </div> <script> 'use strict'; window.addEventListener('DOMContentLoaded', function() { if (! window.productSliderEventHandlerInitialized) { window.productSliderEventHandlerInitialized = true; window.addEventListener('product-add-to-compare', (event) => { const productId = event.detail.productId; hyva.postForm({ action: BASE_URL + 'catalog/product_compare/add/', data: {product: productId} }) }) } }); </script> </div> </div></div></main><footer class="page-footer"><div class="footer content"><div class="text-white body-font border-t border-container-darker shadow pb-16 bg-night-blue-900"> <div class="container py-8 mx-auto"> <div class="flex flex-wrap order-first gap-y-16 text-white"> <div class="pr-4 w-full lg:w-2/3"> <form class="form subscribe" action="https://www.nhmshop.co.uk/newsletter/subscriber/new/" method="post" x-data="initNewsletterForm()" @submit.prevent="submitForm()" id="newsletter-validate-detail"> <div class="mb-3 text-white text-step--1"> <style>#html-body [data-pb-style=V1N8ADI]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=IYF3PT9]{display:none}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="V1N8ADI"><div data-content-type="text" data-appearance="default" data-element="main" data-pb-style="IYF3PT9"><p>Receive email updates about our latest products, offers, sales and competitions, as well as news, exhibitions, events, services and fundraising activities. We may occasionally include third-party content from our corporate partners and other museums. We will not share your personal details with these third parties. You must be over the age of 13. <a tabindex="-1" href="https://www.nhm.ac.uk/about-us/privacy-notice.html"><u>Privacy notice</u>.</a></p></div><div data-content-type="text" data-appearance="default" data-element="main"><p class="text-white"><strong>Join our email community and get 10% off your first order. </strong><a href="https://www.nhmshop.co.uk/discounts-and-offers?from=eshop" class="underline">Ts & Cs apply</a><strong>.</strong></p> <p class="text-white">Receive regular updates about latest products, offers, sales and competitions, as well as news, exhibitions, events, services and fundraising activities. We may occasionally include third-party content from our corporate partners and other museums. We will not share your personal details with these third parties. You must be over the age of 13. <a tabindex="0" href="https://www.nhm.ac.uk/about-us/privacy-notice.html?" class="underline">Privacy notice.</a></p></div></div></div> <div class="flex mt-4" data-content-type="row" data-appearance="contained"> <label for="newsletter-subscribe" class="sr-only"> Email Address </label> <input name="email" type="email" required id="newsletter-subscribe" class="form-input inline-flex w-40 md:w-2/3 text-grey-900 mr-6 ml-2" placeholder="Enter your email address"> <input name="form_key" type="hidden" value="2MaOZkPwvXmgCsM7" /> <button class=" inline-flex flex-shrink-0 mr-10 btn btn-primary border-2 border-solid border-lime-green-100 text-grey-900 bg-lime-green-100 hover:bg-lime-green-200 hover:text-grey-900 text-step--1 font-semibold leading-normal"> Sign up </button> </div> <div> <template x-if="displayErrorMessage"> <p class="flex items-center text-red"> <span class="inline-block w-8 h-8 mr-3"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/> <title>exclamation-circle</title></svg> </span> <template x-for="errorMessage in errorMessages"> <span x-html="errorMessage"></span> </template> </p> </template> </div> </div> </form> <div class="w-full"> </div> <script> function initNewsletterForm() { return { errors: 0, hasCaptchaToken: 0, displayErrorMessage: false, errorMessages: [], setErrorMessages(messages) { this.errorMessages = [messages] this.displayErrorMessage = this.errorMessages.length }, submitForm() { // Do not rename $form, the variable is expected to be declared in the recaptcha output const $form = document.querySelector('#newsletter-validate-detail'); if (this.errors === 0) { $form.submit(); } } } } </script> </div> <style>#html-body [data-pb-style=U03BLQ4]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="U03BLQ4"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="mt-12 grid md:grid-cols-2 border-night-blue-600 gap-8 xl:col-span-2 xl:mt-0 border-t p-10 "> <div class="md:grid md:grid-cols-1 lg:grid-cols-2 md:gap-8"> <div class=md:px-1"> <svg width="127" height="64" viewBox="0 0 127 64" fill="none" xmlns="http://www.w3.org/2000/svg" class="mb-4"> <g clip-path="url(#clip0_830_27398)"> <path d="M71.7181 22.4078H73.2732V13.725L79.8501 22.4078H81.1785V11.0035H79.6234V19.7188L73.0464 11.0035H71.7181V22.4078ZM71.7181 52.6035H73.2408V44.277L75.8327 49.1044H77.0315L79.6557 44.2122V52.6035H81.1785V41.1992H79.7205L76.5131 47.2253L73.176 41.1992H71.7181L71.7181 52.6035ZM82.8632 18.358C82.8632 20.7879 84.6451 22.6022 86.913 22.6022C88.2414 22.6022 89.3429 21.9867 89.9585 20.9175V22.4078H91.4812V14.3082H89.9585V15.7661C89.3429 14.7294 88.2414 14.1138 86.913 14.1138C84.6451 14.1138 82.8632 15.9281 82.8632 18.358ZM83.1796 49.4284C83.1796 51.4695 84.4756 52.7978 86.5167 52.7978C88.5578 52.7978 89.8861 51.4695 89.8861 49.4284V44.5038H88.3634V49.5256C88.3634 50.7243 87.6506 51.5019 86.5167 51.5019C85.4151 51.5019 84.7024 50.7243 84.7024 49.5256V44.5038H83.1796V49.4284ZM84.4183 18.358C84.4183 16.7057 85.6171 15.5069 87.2046 15.5069C88.7598 15.5069 89.9585 16.7057 89.9585 18.358C89.9585 19.9779 88.7598 21.2091 87.2046 21.2091C85.6171 21.2091 84.4183 19.9779 84.4183 18.358ZM91.3117 51.9879C92.0892 52.5711 93.1584 52.7978 93.9683 52.7978C95.9447 52.7978 97.111 51.8907 97.111 50.3679C97.111 49.2016 96.5278 48.3592 94.9403 47.9705L93.9036 47.7113C93.0936 47.5169 92.802 47.1605 92.802 46.6745C92.802 46.0589 93.4176 45.6054 94.3895 45.6054C95.2643 45.6054 96.0743 45.8646 96.787 46.3505V44.8926C96.139 44.5362 95.2319 44.3094 94.2923 44.3094C92.7372 44.3094 91.3117 45.249 91.3117 46.7393C91.3117 47.7761 91.8949 48.6508 93.5148 49.0396L94.4543 49.2664C95.2967 49.4608 95.6531 49.8172 95.6531 50.4003C95.6531 51.1131 95.0375 51.5019 94.0007 51.5019C93.126 51.5019 92.0892 51.2103 91.3117 50.5299V51.9879ZM92.7124 15.6041H94.1379V19.3624C94.1379 21.5007 95.3367 22.6022 97.0538 22.6022C97.5398 22.6022 98.0905 22.4726 98.7061 22.181V20.9175C98.2201 21.1767 97.799 21.3063 97.2806 21.3063C96.341 21.3063 95.6607 20.6583 95.6607 19.33V15.6041H98.5117V14.3082H95.6607V11.9107H94.1379V14.3082H92.7124L92.7124 15.6041ZM100.002 19.2328C100.002 21.2739 101.298 22.6022 103.339 22.6022C105.38 22.6022 106.709 21.2739 106.709 19.2328V14.3082H105.186V19.33C105.186 20.5287 104.473 21.3063 103.339 21.3063C102.238 21.3063 101.525 20.5287 101.525 19.33V14.3082H100.002V19.2328ZM114.031 18.358C114.031 20.7879 115.813 22.6022 118.08 22.6022C119.409 22.6022 120.51 21.9867 121.126 20.9175V22.4078H122.649V14.3082H121.126V15.7661C120.51 14.7294 119.409 14.1138 118.08 14.1138C115.813 14.1138 114.031 15.9281 114.031 18.358ZM115.586 18.358C115.586 16.7057 116.785 15.5069 118.372 15.5069C119.927 15.5069 121.126 16.7057 121.126 18.358C121.126 19.9779 119.927 21.2091 118.372 21.2091C116.785 21.2091 115.586 19.9779 115.586 18.358ZM124.722 22.4078H126.245V11.0035H124.722V22.4078ZM108.529 22.4078V14.3082H110.051V15.8633C110.408 14.859 111.347 14.1138 112.481 14.1138C112.838 14.1138 113.226 14.1462 113.583 14.3082V15.7337C113.162 15.5717 112.773 15.5393 112.384 15.5393C111.412 15.5393 110.051 16.4141 110.051 18.2284V22.4078L108.529 22.4078ZM115.869 52.6035V44.5038H117.431V45.5406C117.73 44.7954 118.495 44.3094 119.392 44.3094C120.323 44.3094 121.154 44.763 121.553 45.6702C122.052 44.7306 122.883 44.3094 123.781 44.3094C125.376 44.3094 126.407 45.4434 126.407 47.2577V52.6035H124.844V47.1605C124.844 45.8646 124.113 45.6054 123.548 45.6054C122.584 45.6054 121.919 46.3181 121.919 47.2253V52.6035H120.357V47.2577C120.357 45.9293 119.658 45.6054 119.06 45.6054C118.096 45.6054 117.431 46.3181 117.431 47.2577V52.6035L115.869 52.6035ZM107.288 49.4284V44.5038H108.811V49.5256C108.811 50.7243 109.523 51.5019 110.657 51.5019C111.759 51.5019 112.504 50.7243 112.504 49.5256V44.5038H114.027V49.4284C114.027 51.4695 112.699 52.7978 110.657 52.7978C108.616 52.7978 107.288 51.4695 107.288 49.4284ZM105.768 48.3916C105.768 46.0589 104.569 44.3094 102.139 44.3094C99.8067 44.3094 98.1867 46.1237 98.1867 48.5536C98.1867 51.0807 99.9039 52.7978 102.366 52.7978C103.792 52.7978 104.893 52.3119 105.541 51.6963V50.1736C104.861 50.9835 103.792 51.5019 102.625 51.5019C100.876 51.5019 99.8391 50.4003 99.6771 48.91H105.736C105.768 48.6184 105.768 48.4564 105.768 48.3916ZM99.7419 47.6789C99.9687 46.3505 100.843 45.6054 102.075 45.6054C103.435 45.6054 104.213 46.4801 104.245 47.6789H99.7419ZM71.7181 37.5056H73.2732V32.4191H79.6234V37.5056H81.1785V26.1014H79.6234V30.9611H73.2732V26.1014H71.7181V37.5056ZM82.946 27.1715C82.946 27.7546 83.3996 28.2082 84.0152 28.2082C84.6308 28.2082 85.0844 27.7546 85.0844 27.1715C85.0844 26.5883 84.6308 26.1023 84.0152 26.1023C83.3996 26.1023 82.946 26.5883 82.946 27.1715ZM83.27 37.5066H84.7928V29.407H83.27V37.5066ZM86.6071 36.8911C87.417 37.4743 88.5186 37.7011 89.361 37.7011C91.3697 37.7011 92.6008 36.7939 92.6008 35.2712C92.6008 34.1048 91.9853 33.2625 90.3329 32.8737L89.2638 32.6145C88.4538 32.4201 88.1298 32.0637 88.1298 31.5777C88.1298 30.9946 88.6482 30.541 89.5553 30.5086C90.4949 30.4762 91.4021 30.7354 92.1796 31.2538V29.7958C91.5317 29.4394 90.5921 29.2126 89.6201 29.2126C88.0002 29.2126 86.6071 30.1522 86.6071 31.6425C86.6071 32.6793 87.1903 33.554 88.875 33.9428L89.8469 34.1696C90.7217 34.364 91.0781 34.7204 91.0781 35.3036C91.0781 35.9839 90.4949 36.3727 89.5229 36.4051C88.5834 36.4375 87.417 36.1459 86.6071 35.4332L86.6071 36.8911ZM93.2488 30.703H94.7391V34.4612C94.7391 36.5995 95.9379 37.7011 97.655 37.7011C98.141 37.7011 98.6917 37.5715 99.3073 37.2799V36.0163C98.8214 36.2755 98.4002 36.4051 97.8818 36.4051C96.9422 36.4051 96.2619 35.7572 96.2619 34.4288V30.703H99.2425V29.407H96.2619V27.0095H94.7391V29.407H93.2488V30.703ZM99.8401 33.4569C99.8401 35.8544 101.752 37.7011 104.181 37.7011C106.611 37.7011 108.49 35.8544 108.49 33.4569C108.49 31.0594 106.611 29.2126 104.181 29.2126C101.752 29.2126 99.8401 31.0594 99.8401 33.4569ZM101.395 33.4569C101.395 31.8369 102.594 30.6058 104.181 30.6058C105.737 30.6058 106.935 31.8369 106.935 33.4569C106.935 35.1092 105.737 36.3079 104.181 36.3079C102.594 36.3079 101.395 35.1092 101.395 33.4569ZM109.981 37.5066H111.504V33.3272C111.504 31.5129 112.864 30.6381 113.836 30.6381C114.225 30.6381 114.614 30.6705 115.035 30.8325V29.407C114.679 29.245 114.29 29.2126 113.933 29.2126C112.8 29.2126 111.86 29.9577 111.504 30.9621V29.407H109.981V37.5066ZM115.813 29.407L119.376 37.377C118.858 38.3814 118.178 38.8997 117.271 38.8997C116.882 38.8997 116.493 38.8673 116.072 38.7054V40.1309C116.428 40.2929 116.849 40.3253 117.206 40.3253C118.988 40.3253 120.089 39.1589 120.77 37.5714L124.269 29.407H122.649L120.154 35.6923L117.53 29.407L115.813 29.407Z" fill="white"/> <path d="M38.3014 30.375L42.9332 27.7223L39.6427 28.0032L39.149 27.1481L41.0376 24.4389L36.4243 27.1238L35.8069 26.1304L42.4542 22.2926L43.0833 23.3062L40.7811 26.8082L44.937 26.517L45.5002 27.5686L38.853 31.4064L38.3014 30.375ZM35.8097 37.596L42.4569 41.4338L43.086 40.4203L40.756 36.9667L44.9398 37.2094L45.503 36.1579L38.8558 32.3201L38.3042 33.3514L42.936 36.0042L39.6455 35.7232L39.1518 36.5784L41.0403 39.2876L36.4271 36.6027L35.8097 37.596ZM28.9277 38.0553V45.7309L30.12 45.7689L31.9458 42.0242L33.8275 45.7689L35.0198 45.7309V38.0553L33.8508 38.0933L33.8694 43.4309L32.4675 40.4408H31.48L30.0781 43.4309L30.0967 38.0933L28.9277 38.0553ZM25.0889 32.3249L18.4417 36.1627L19.0049 37.2143L23.1608 36.9231L20.8587 40.4251L21.4878 41.4386L28.135 37.6008L27.5176 36.6075L22.9044 39.2924L24.7929 36.5832L24.2992 35.728L21.0087 36.009L25.6405 33.3563L25.0889 32.3249ZM28.1323 26.1353L21.485 22.2975L20.8559 23.311L23.186 26.7646L19.0021 26.5218L18.4389 27.5734L25.0862 31.4112L25.6377 30.3798L21.0059 27.7271L24.2964 28.0081L24.7901 27.1529L22.9016 24.4437L27.5148 27.1286L28.1323 26.1353ZM35.0143 25.676V18.0004L33.822 17.9624L31.9961 21.7071L30.1144 17.9624L28.9221 18.0004V25.676L30.0911 25.638L30.0725 20.3004L31.4744 23.2905H32.4619L33.8638 20.3004L33.8453 25.638L35.0143 25.676Z" fill="#C9F708"/> <path d="M45.2914 13.0569L41.7211 19.8515L40.5844 19.2112L42.0662 16.3912L38.9821 14.7706L37.5003 17.5906L36.3281 17.0177L39.8984 10.2231L41.0705 10.7961L39.5887 13.6162L42.6728 15.2367L44.1546 12.4166L45.2914 13.0569ZM51.7969 20.3059L49.1743 22.1145L47.1965 19.2464L49.8191 17.4378L49.0475 16.3858L42.7287 20.7432L43.5004 21.7952L46.1229 19.9867L48.1007 22.8548L45.4782 24.6633L46.1873 25.7585L52.506 21.4011L51.7969 20.3059ZM54.898 30.843L51.7353 31.2257L51.3168 27.767L54.4794 27.3843L54.285 26.0942L46.6651 27.0163L46.8595 28.3064L50.0221 27.9237L50.4406 31.3824L47.2781 31.7651L47.397 33.0644L55.0169 32.1422L54.898 30.843ZM52.7474 41.6143L49.7691 40.4836L51.0057 37.2265L53.984 38.3573L54.4113 37.1245L47.2356 34.4002L46.8083 35.6329L49.7865 36.7636L48.5499 40.0207L45.5717 38.89L45.0732 40.0957L52.249 42.82L52.7474 41.6143ZM45.8378 50.1527L43.7261 47.7675L46.3346 45.4581L48.4463 47.8433L49.3975 46.9503L44.3096 41.2035L43.3584 42.0965L45.4701 44.4816L42.8616 46.7911L40.7499 44.4059L39.7483 45.2419L44.8362 50.9887L45.8378 50.1527ZM35.7519 54.5025L34.9904 51.4091L38.3733 50.5763L39.1348 53.6697L40.392 53.321L38.5573 45.868L37.3 46.2167L38.0615 49.31L34.6786 50.1428L33.9171 47.0495L32.6417 47.3243L34.4765 54.7773L35.7519 54.5025ZM24.7998 53.6672L25.5629 50.5743L28.9454 51.4088L28.1822 54.5018L29.4575 54.7773L31.2962 47.3253L30.0209 47.0498L29.2578 50.1427L25.8753 49.3081L26.6384 46.2152L25.3814 45.8659L23.5427 53.3179L24.7998 53.6672ZM15.4901 47.8384L17.6031 45.4542L20.2104 47.765L18.0973 50.1492L19.0985 50.9857L24.1895 45.2415L23.1883 44.405L21.0753 46.7891L18.4681 44.4783L20.581 42.0942L19.6302 41.2008L14.5393 46.9449L15.4901 47.8384ZM9.95515 38.3509L12.934 37.2217L14.1689 40.4795L11.19 41.6087L11.6879 42.8146L18.865 40.094L18.3672 38.888L15.3884 40.0172L14.1535 36.7595L17.1323 35.6303L16.7056 34.3974L9.52846 37.118L9.95515 38.3509ZM9.46283 27.3781L12.6253 27.7624L12.2049 31.2209L9.04247 30.8365L8.92287 32.1357L16.5423 33.0618L16.6619 31.7626L13.4995 31.3783L13.9199 27.9198L17.0822 28.3041L17.2773 27.0141L9.65794 26.088L9.46283 27.3781ZM14.1259 17.4331L16.7475 19.243L14.7682 22.11L12.1465 20.3001L11.4369 21.3949L17.7534 25.7556L18.463 24.6608L15.8414 22.8509L17.8207 19.9839L20.4423 21.7937L21.2145 20.7421L14.8981 16.3815L14.1259 17.4331ZM22.8762 10.7939L24.3565 13.6148L21.2716 15.2337L19.7912 12.4128L18.6541 13.0525L22.2208 19.8489L23.3579 19.2093L21.8776 16.3885L24.9625 14.7695L26.4429 17.5903L27.6153 17.018L24.0486 10.2215L22.8762 10.7939ZM33.7095 8.9812V12.1669H30.2255V8.9812L28.9214 9.01923V16.6947L30.2255 16.6567V13.4711H33.7095V16.6567L35.0136 16.6947V9.01923L33.7095 8.9812Z" fill="#0DEDF7"/> <path d="M45.1865 2.75223L42.6934 10.0115L41.5428 9.57617L39.8668 3.38668L38.1774 8.42038L36.9316 8.03275L39.4247 0.773441L40.6 1.13687L42.276 7.32636L43.9654 2.29267L45.1865 2.75223ZM52.9177 7.78971L49.6854 12.0021L50.1099 5.60379L49.1162 4.87843L44.4012 10.9349L45.4536 11.7061L48.6859 7.49365L48.2614 13.892L49.2084 14.6774L53.9234 8.62084L52.9177 7.78971ZM59.6001 15.8957L55.1752 18.8303L57.6541 12.9165L56.9499 11.9078L50.5238 16.1052L51.2688 17.1763L55.6937 14.2416L53.2147 20.1554L53.8553 21.2057L60.2814 17.0083L59.6001 15.8957ZM63.2885 25.7321L58.1504 27.071L62.4153 22.2826L62.0767 21.0998L54.6359 22.9833L54.9927 24.2382L60.1308 22.8993L55.8659 27.6878L56.1308 28.8892L63.5716 27.0057L63.2885 25.7321ZM63.5832 36.2333L58.2888 35.8313L63.8773 32.6871L63.9411 31.4585L56.2919 30.8239L56.222 32.1268L61.5164 32.5287L55.9278 35.673L55.7882 36.8953L63.4375 37.5298L63.5832 36.2333ZM60.4523 46.2611L55.5752 44.1619L61.8819 43.0026L62.3411 41.8613L55.3124 38.7775L54.8232 39.987L59.7003 42.0862L53.3936 43.2455L52.8647 44.3563L59.8935 47.4401L60.4523 46.2611ZM54.235 54.7291L50.3038 51.1601L56.6452 52.1113L57.4501 51.1809L51.8035 45.982L50.9482 46.9672L54.8794 50.5362L48.5379 49.585L47.677 50.4638L53.3237 55.6627L54.235 54.7291ZM45.6051 60.7195L43.0457 56.0674L48.7347 59.0262L49.7981 58.4075L46.1455 51.6569L45.0166 52.311L47.576 56.963L41.887 54.0043L40.7874 54.5561L44.44 61.3067L45.6051 60.7195ZM35.4977 63.5833L34.5875 58.3523L39.0076 62.9979L40.2143 62.7581L38.9514 55.1872L37.6713 55.4393L38.5815 60.6703L34.1614 56.0247L32.9423 56.1895L34.2051 63.7604L35.4977 63.5833ZM25.0081 63.0102L25.8457 57.767L28.5179 63.5961L29.7371 63.761L31.0008 56.1903L29.7083 56.0131L28.8707 61.2563L26.1984 55.4272L24.9918 55.1872L23.728 62.758L25.0081 63.0102ZM15.2729 59.0622L17.7676 54.3751L18.4023 60.756L19.5019 61.3078L23.1553 54.5576L21.9903 53.9703L19.4957 58.6574L18.8609 52.2766L17.7976 51.6578L14.1441 58.408L15.2729 59.0622ZM7.34708 52.1672L11.2284 48.544L9.75699 54.7852L10.6178 55.6642L16.265 50.466L15.3538 49.5322L11.4725 53.1554L12.9439 46.9142L12.1391 45.9837L6.49185 51.1819L7.34708 52.1672ZM2.08945 43.0722L6.93694 40.9056L3.51871 46.3309L4.04745 47.4418L11.0766 44.3588L10.5179 43.1798L5.67044 45.3464L9.08866 39.9211L8.62959 38.7797L1.60047 41.8626L2.08945 43.0722ZM0.06975 32.7629L5.35808 32.2876L0.363486 36.3092L0.502893 37.5315L8.15218 36.8979L8.00663 35.6014L2.71829 36.0766L7.71289 32.0551L7.64929 30.8265L0 31.4601L0.06975 32.7629ZM1.50683 22.3564L6.66296 23.624L0.633212 25.8059L0.368187 27.0073L7.80875 28.8917L8.09206 27.6181L2.93593 26.3506L8.96568 24.1686L9.30444 22.986L1.86387 21.1015L1.50683 22.3564ZM6.24497 12.9804L10.7102 15.8534L4.29866 15.9593L3.65792 17.0095L10.0835 21.2077L10.765 20.0952L6.29977 17.2221L12.7113 17.1162L13.4157 16.1076L6.99012 11.9094L6.24497 12.9804ZM13.7707 5.65073L17.0612 9.81793L10.9627 7.8363L10.0156 8.62158L14.7299 14.6787L15.7357 13.8477L12.4453 9.68046L18.5438 11.6621L19.5376 10.9368L14.8233 4.87975L13.7707 5.65073ZM23.2686 1.16181L25.0277 6.1716L19.9031 2.31719L18.7524 2.75242L21.2446 10.012L22.4657 9.55263L20.7066 4.54284L25.8313 8.39725L27.0066 8.03396L24.5145 0.774338L23.2686 1.16181ZM33.7095 0L33.7466 5.30952L30.1511 0L28.9214 0.038032V7.71351L30.2255 7.67548L30.1884 2.36596L33.7839 7.67548L35.0136 7.71351V0.038032L33.7095 0Z" fill="#F2BAB0"/> </g> <defs> <clipPath id="clip0_830_27398"> <rect width="126.638" height="64" fill="white"/> </clipPath> </defs> </svg> The Natural History Museum<br/> Cromwell Road<br /> London<br /> SW7 5BD<br > 020 7942 5000<br /> <a href="https://www.nhmshop.co.uk/contact" class="text-base text-white hover:underline">Contact us</a><br/> </div> <div class="mt-12 md:mt-0"> <h3 class="text-base font-semibold text-white text-step-0 leading-normal">The online shop</h3> <ul role="list" class="mt-4 space-y-4"> <li> <a href="https://www.nhmshop.co.uk/about-us" class="text-base text-white hover:underline">About us</a> </li> <li> <a href="https://www.nhmshop.co.uk/about-us" class="text-base text-white hover:underline">Sustainability</a> </li> <li> <a href="https://www.nhmshop.co.uk/terms-and-conditions" class="text-base text-white hover:underline"> Terms & conditions</a> </li> <li> <a href="https://www.nhm.ac.uk/about-us/privacy-notice.html" class="text-base text-white hover:underline">Privacy notice & cookies</a> </li> <li> <a href="/cookie-preferences" class="text-base text-white hover:underline">Cookie preferences</a> </li> <li> <a href="https://www.nhm.ac.uk/about-us/website-accessibility-statement.html" class="text-base text-white hover:underline">Website accessibility statement</a> </li> <li> <a href="https://www.nhmshop.co.uk/faq" class="text-base text-white hover:underline"> Licensing & collaborations</a> </li> <li> <a href="https://www.nhmshop.co.uk/affiliate-programme" class="text-base text-white hover:underline">Affiliates</a> </li> </ul> </div> </div> <div class="md:grid md:grid-cols-1 lg:grid-cols-2 md:gap-8"> <div> <h3 class="text-base font-semibold text-white text-step-0 leading-normal">Help</h3> <ul role="list" class="mt-4 space-y-4"> <li> <a href="https://www.nhmshop.co.uk/delivery-information" class="text-base text-white hover:underline">Christmas deliveries</a> </li> <li> <a href="https://www.nhmshop.co.uk/delivery-information" class="text-base text-white hover:underline">Delivery information</a> </li> <li> <a href="https://www.nhmshop.co.uk/faq" class="text-base text-white hover:underline">FAQs</a> </li> <li> <a href="https://www.nhmshop.co.uk/refunds-and-returns" class="text-base text-white hover:underline">Refunds & returns</a> </li> <li> <a href="https://www.nhmshop.co.uk/prints-guide" class="text-base text-white hover:underline">Prints guide</a> </li> <li> <a href="https://www.nhmshop.co.uk/discounts-and-offers" class="text-base text-white hover:underline">Discounts & offers</a> </li> </ul> </div> <div class="mt-12 md:mt-0"> <h3 class="text-base font-semibold text-white text-step-0 leading-normal">Join & support</h3> <ul role="list" class="mt-4 space-y-4"> <a href="https://www.nhm.ac.uk/support-us/membership/gift-membership.html?_gl=1*4jo5bc*_ga*MzY0MjE0MTQ2LjE2MjU0OTM1MDY.*_ga_PYMKGK73C4*MTY2OTIxNjM0NS4zNTIuMS4xNjY5MjE2NDcwLjAuMC4w&_ga=2.29594367.1519807635.1669216345-364214146.1625493506" class="text-base text-white hover:underline">Gift membership</a> </li> <li> <a href="https://www.nhm.ac.uk/support-us/membership.html?_gl=1*1g7lls6*_ga*MzY0MjE0MTQ2LjE2MjU0OTM1MDY.*_ga_PYMKGK73C4*MTY2OTIxNjM0NS4zNTIuMS4xNjY5MjE2NDcwLjAuMC4w&_ga=2.25870333.1519807635.1669216345-364214146.1625493506" class="text-base text-white hover:underline"> Become a Member</a> </li> <li> <a href="https://www.nhm.ac.uk/support-us/give.html?_gl=1*1nyfw4c*_ga*MzY0MjE0MTQ2LjE2MjU0OTM1MDY.*_ga_PYMKGK73C4*MTY2OTIxNjM0NS4zNTIuMS4xNjY5MjE2NDcwLjAuMC4w&_ga=2.70882256.1519807635.1669216345-364214146.1625493506" class="text-base text-white hover:underline">Donate online</a> </li> <li> <a href="https://www.nhm.ac.uk/visit/whats-on.html?_ga=2.100792897.1519807635.1669216345-364214146.1625493506&_gl=1*wq29k2*_ga*MzY0MjE0MTQ2LjE2MjU0OTM1MDY.*_ga_PYMKGK73C4*MTY2OTIxNjM0NS4zNTIuMS4xNjY5MjE2NjgwLjAuMC4w" class="text-base text-white hover:underline">Book tickets</a> </li> </ul> </div> </div> </div> </div> <div class="mt-12 border-t border-night-blue-600 pt-8 grid md:grid-cols-1 lg:grid-cols-2 gap-4"> <div class="mt-12 md:mt-1"> <p class="text-base text-white">© The Trustees of the Natural History Museum, London.</p> </div> <div class="mt-12 md:mt-1 flex justify-end"><img src="https://www.nhmshop.co.uk/media/wysiwyg/footer/visa_new.png" alt="" class="md:pr-1 object-fit: scale-down w-18 h-10" /> <img src="https://www.nhmshop.co.uk/media/wysiwyg/footer/mastercard_new.png" alt="" class="md:pr-1 object-fit: scale-down w-18 h-10" /> <img src="https://www.nhmshop.co.uk/media/wysiwyg/footer/maestro_new.png" alt="" class="md:pr-1 object-fit: scale-down w-18 h-10" /> <img src="https://www.nhmshop.co.uk/media/wysiwyg/footer/jcb_new.png" alt="" class="md:pr-1 object-fit: scale-down w-18 h-10" /> <img src="https://www.nhmshop.co.uk/media/wysiwyg/footer/paypal_new.png" alt="" class="md:pr-1 object-fit: scale-down w-18 h-10" /> <img src="https://www.nhmshop.co.uk/media/wysiwyg/footer/apple_pay_new.png" alt="" class="md:pr-1 object-fit: scale-down w-18 h-10" /> <img src="https://www.nhmshop.co.uk/media/wysiwyg/footer/google_pay_new.png" alt="" class="md:pr-1 object-fit: scale-down w-18 h-10" /> </div> </div> </div> <!-- reskin css overrides --> <link rel="stylesheet" href="/css/reskin.css"></div></div></div> </div> </div> </div> <button id="scrollToTopBtn" onclick="scrollToTopFunction()" title="Scroll to top" class="border-2 border-black h-10 hover:bg-gray-200 hover:text-lime-grey-900 p2 rounded fixed block bottom-10 right-10 z-99 pl-5 cursor-pointer bg-white"> Scroll to top <span class="float-right relative top-0 p-2"><img src="https://www.nhmshop.co.uk/static/version1731322064/frontend/Nhm/hyva/en_GB/Nhm_Content/images/Chevron.png" alt="Scroll to top"></span> </button> <script> // Get the button let mybutton = document.getElementById("scrollToTopBtn"); // When the user scrolls down 20px from the top of the document, show the button window.onscroll = function () { scrollFunction() }; function scrollFunction() { if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 120) { mybutton.style.display = "block"; } else { mybutton.style.display = "none"; } } // When the user clicks on the button, scroll to the top of the document function scrollToTopFunction() { window.scrollTo({top: 0, behavior: 'smooth'}); //document.body.scrollTop = 0; //document.documentElement.scrollTop = 0; } </script> </div></footer> <script type="text/javascript"> /** Variables & establishing window.adobeDataLayer data structure **/ let adobeVars = {}; adobeVars.dataLayerEventCart = ''; adobeVars.newsletterClicked = false; adobeVars.formsInteractedWith = []; adobeVars.fullActionName = encodeURI('cms_index_index'); adobeVars.referrer = encodeURI('https://www.nhmshop.co.uk/'); adobeVars.productObject = false; adobeVars.customerIdentifier = false; adobeVars.customerID1 = ''; adobeVars.customerID2 = ''; window.adobeDataLayer = {}; window.adobeDataLayer['event'] = 'pageView'; /** Suite of JS helper functions used to flesh out the data layer **/ //trackCartAction is called on page load after an item has been added or removed from the cart function trackCartAction(adobeEventName, adobeQuoteQty, adobeQuotePrice, adobeProductObject) { window.adobeDataLayerCart = {}; //Manually set some of the attributes, if required, to account for side cases if (adobeEventName === 'add') { window.adobeDataLayerCart['event'] = 'addToCart'; if(parseFloat(adobeQuotePrice) === 0.00) adobeQuotePrice = (parseFloat(adobeProductObject['finalPrice']) * adobeProductObject['quantity']); if(adobeQuoteQty === '0') adobeQuoteQty = adobeProductObject['quantity']; } else { window.adobeDataLayerCart['event'] = 'removeFromCart'; } //Add attributes to the basket object window.adobeDataLayerCart['basket'] = { "productTotal": parseInt(adobeQuoteQty), "totalPrice": parseFloat(adobeQuotePrice) }; //Add attributes to the product object window.adobeDataLayerCart['product'] = [{ "category": adobeProductObject['category'], "name": adobeProductObject['name'], "quantity": parseInt(adobeProductObject['quantity']), "finalPrice": parseFloat(adobeProductObject['finalPrice']), "originalPrice": parseFloat(adobeProductObject['originalPrice']), "discountTotal": parseFloat(adobeProductObject['discountTotal']).toFixed(2), "discountType": adobeProductObject['discountType'], "inStock": true, "variant": adobeProductObject['variant'], "customizableOptionsUsed": (adobeProductObject['customizableOptionsUsed'] === '1'), "customizableOptionsCost": parseFloat(adobeProductObject['customizableOptionsCost']) }]; //Trigger the event adobeVars.dataLayerEventCart = new CustomEvent("dataLayerEvent", {detail: window.adobeDataLayerCart}); } //Used to determine whether the customer edited their details on the previous page function getAccountDetailsUpdated() { if (adobeVars.referrer.includes('customer/address/edit') && (encodeURI(window.location.pathname) === "/customer/address/index/")) { return true; } return adobeVars.referrer.includes('customer/account/edit') && (encodeURI(window.location.pathname) === "/customer/account/"); } //Add a document-wide 'click' event listener. Attach the 'formInteractionHandler' function to any form elements document.addEventListener(`click`, e => { var elementsArray = ['input', 'select', 'textarea', 'checkbox', 'button']; Array.from(elementsArray).forEach((elementType) => { if (e.target.closest(elementType)) { let targettedElement = e.target.closest(elementType); if (targettedElement.closest('form') && !targettedElement.classList.contains('add-to-basket')) { formInteractionHandler(targettedElement); } } }); }); //When a form is first interacted with, this function will trigger a 'started' Adobe event and attach a listener for further updates to the form function formInteractionHandler(element) { const submitButtons = ["coupon-submit", "coupon-cancel", "place-order"]; if (submitButtons.includes(element.value)) { submitAdobeFormEvent('submitted', element, false, false); } if (adobeVars.formsInteractedWith.includes(element.form.id)) { return; } else { adobeVars.formsInteractedWith.push(element.form.id); } let action = 'started'; let newsletterSignup = false; let allowMarketing = false; let send = true; if (element.id === 'newsletter-subscribe') { if (adobeVars.newsletterClicked) send = false; else adobeVars.newsletterClicked = true; } //Add to Basket events are handled on page load, don't handle them here if (element.classList.contains('add-to-basket')) send = false; if (send) { element.form.addEventListener("change", (event) => { submitAdobeFormEvent('updated', event.target, false, false); }); element.form.addEventListener("submit", (event) => { submitAdobeFormEvent('submitted', event.target, false, false); }); submitAdobeFormEvent(action, element, newsletterSignup, allowMarketing); } } function trackCartRemoval(quantity, priceString, id) { const postUrl = BASE_URL + 'adobe-cart/index/removeitem?item_id=' + id; fetch(postUrl) .then(response => { if (!response.ok) console.log('GET request failed'); return response.json() }) .then(data => { var priceString2 = priceString.substring(priceString.indexOf('拢') + 1, priceString.indexOf('</span>')); var price = parseFloat(priceString2) * quantity; trackCartAction('remove', quantity, price, JSON.parse(data)); document.querySelector("body").dispatchEvent(adobeVars.dataLayerEventCart); adobeVars.dataLayerEventCart = ''; }) .catch(error => { console.log(error); }) } function pageLoadedEvent() { window.adobeDataLayer["page"]["deleteAccount"] = adobeVars.referrer.includes('scommerce_gdpr/customer/deletion'); window.adobeDataLayer["page"]["registrationSuccess"] = (adobeVars.referrer.includes('customer/account/create') && (encodeURI(window.location.pathname) === "/customer/account/")); window.adobeDataLayer["page"]["accountDetailsUpdated"] = getAccountDetailsUpdated(); /** Error Object **/ const errorMessage = document.getElementsByClassName('message error'); if (errorMessage.length > 0) { const spans = errorMessage[0].getElementsByTagName("span"); const errorMessageContent = spans[0].textContent; let errorType = "page"; if (adobeVars.fullActionName === 'checkout_index_index' || adobeVars.fullActionName === 'customer_account_login' || adobeVars.fullActionName === 'customer_account_create') { errorType = "form"; } window.adobeDataLayer['error'] = { "type": errorType, "text": [errorMessageContent] } } else if (adobeVars.fullActionName === 'cms_noroute_index') { window.adobeDataLayer['error'] = { "type": "404 - Page not found", "text": ["Sorry, the page you're looking for is extinct"] } } else { window.adobeDataLayer['error'] = { "type": '', "text": [] } } var dataLayerEvent = new CustomEvent("dataLayerEvent", {detail: window.adobeDataLayer}); document.querySelector("body").dispatchEvent(dataLayerEvent); if (adobeVars.dataLayerEventCart !== '') { document.querySelector("body").dispatchEvent(adobeVars.dataLayerEventCart); } } function submitAdobeFormEvent(action, element, newsletterSignup, allowMarketing) { let name = ''; let inputField = ''; window.adobeDataLayerForm = {}; window.adobeDataLayerForm['event'] = 'formInteraction'; if (action === 'started' || action === 'submitted') { inputField = ''; } else { if (element.name === 'warehouse') { inputField = 'Museum gifts delivery'; } else if (element.name === 'pod') { inputField = 'Wall print'; } else if (document.querySelector("[for=" + CSS.escape(element.id) + "]")) inputField = document.querySelector("[for=" + CSS.escape(element.id) + "]").textContent.trim(); else inputField = element.id; } if (action === 'submitted') { if (document.getElementById('is_subscribed')) { if (document.getElementById('is_subscribed').checked) newsletterSignup = true; } if (element.id === 'newsletter-validate-detail') newsletterSignup = true; name = element.id; } else { name = element.form.id; } if (action === 'submitted' && 'cms_index_index' === 'newsletter_manage_index' && document.getElementById('subscription').checked) { newsletterSignup = true; } if(element.id === 'nhm-newsletter-signup' || (element.id === 'customer-email' && !element.form.id)){ name = 'co-shipping-form'; if(element.id === 'customer-email'){ inputField = 'Email Address'; } else{ newsletterSignup = !document.getElementById('nhm-newsletter-signup').checked; } } if (name !== 'login-form') { window.adobeDataLayerForm['form'] = { "action": action, "name": name, "inputField": inputField, "newsletterSignup": newsletterSignup, "allowMarketing": allowMarketing } var dataLayerEvent = new CustomEvent("dataLayerEvent", {detail: window.adobeDataLayerForm}); document.querySelector("body").dispatchEvent(dataLayerEvent); } } /** Page Object **/ window.adobeDataLayer['page'] = { "site": "shop", "url": encodeURI(window.location.href), "domain": encodeURI(window.location.host), "path": encodeURI(window.location.pathname), "queryString": encodeURIComponent(window.location.search), "title": document.title, "referrer": adobeVars.referrer, "loginSuccess": Boolean((adobeVars.referrer.includes('customer/account/login')) && ''), "logoutSuccess": (adobeVars.fullActionName === 'customer_account_logoutSuccess'), "errorPage": (adobeVars.fullActionName === 'cms_noroute_index'), "productPage": (adobeVars.fullActionName === 'catalog_product_view'), "basketPage": (adobeVars.fullActionName === 'checkout_cart_index'), "checkoutPage": (adobeVars.fullActionName === 'checkout_index_index'), "purchasePage": (adobeVars.fullActionName === 'checkout_onepage_success'), "siteSearchPage": (adobeVars.fullActionName === 'catalogsearch_result_index') }; /** User Object **/ const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); if(urlParams.get('id1')){ adobeVars.customerID1 = urlParams.get('id1'); } if(urlParams.get('id2')){ adobeVars.customerID2 = urlParams.get('id2'); } if(adobeVars.customerIdentifier !== false){ adobeVars.customerID1 = adobeVars.customerIdentifier['id1']; if(adobeVars.customerIdentifier['id2']) { adobeVars.customerID2 = adobeVars.customerIdentifier['id2']; } } window.adobeDataLayer['user'] = { "id1": adobeVars.customerID1, "id2": adobeVars.customerID2 } /** siteSearch Object **/ if (adobeVars.fullActionName !== 'catalogsearch_result_index') { window.adobeDataLayer['siteSearch'] = { "term": "", "results": "", "resultPage": 0, "resultPosition": 0 } } /** purchase Object **/ if (adobeVars.fullActionName !== 'checkout_onepage_success') { window.adobeDataLayer['purchase'] = { "id": '', "productTotal": 0, "orderTotal": 0, "vat": 0, "deliveryCost": 0, "deliveryType": '', "discountTotal": 0, "discountType": 0, "paymentType": '' } } /** Product Object **/ if (adobeVars.fullActionName !== 'catalog_product_view') { if ((adobeVars.fullActionName !== 'checkout_cart_index' && adobeVars.fullActionName !== 'checkout_index_index' && adobeVars.fullActionName !== 'checkout_onepage_success') || 0 === 0) { /** Product Object **/ window.adobeDataLayer['product'] = []; } else { if (adobeVars.productObject) { const parsedProducts = JSON.parse(adobeVars.productObject); for (let index = 0; index < parsedProducts.length; index++) { parsedProducts[index]['originalPrice'] = parseFloat(parsedProducts[index]['originalPrice']); parsedProducts[index]['finalPrice'] = parseFloat(parsedProducts[index]['finalPrice']); parsedProducts[index]['discountTotal'] = parseFloat(parseFloat(parsedProducts[index]['discountTotal']).toFixed(2)); parsedProducts[index]['customizableOptionsCost'] = parseFloat(parsedProducts[index]['customizableOptionsCost']); parsedProducts[index]['inStock'] = (parsedProducts[index]['inStock'] === 'true'); parsedProducts[index]['customizableOptionsUsed'] = (parsedProducts[index]['customizableOptionsUsed'] === 'true'); } window.adobeDataLayer['product'] = parsedProducts; } } } /** Basket Object **/ window.adobeDataLayer['basket'] = { "productTotal": Number('0'), "totalPrice": parseFloat('0') } /** checkout Object **/ if (adobeVars.fullActionName === 'checkout_index_index') { window.addEventListener('hashchange', function () { if (window.location.hash === '#payment') { window.adobeDataLayer['checkout'] = { "step": 2, "name": 'Payment' } } else { window.adobeDataLayer['checkout'] = { "step": 1, "name": 'Shipping' } if (window.stepNavigation === 'opc-shipping_method') { document.getElementById('opc-shipping_method').scrollIntoView(); window.stepNavigation = ''; } } let emailInput = document.getElementById('customer-email').value; let firstName = document.getElementsByName('firstname')[0].value; let lastName = document.getElementsByName('lastname')[0].value; const postUrl = BASE_URL + 'adobe-cart/index/getidentifier?email='+emailInput+'&firstname='+firstName+'&lastname='+lastName; fetch(postUrl) .then(response => { if (! response.ok) console.warn('GET request failed'); return response.json() }) .then(data => { if(data['data'] !== 'false') { let jsonData = JSON.parse(data['data']); if(jsonData['id1']) { window.adobeDataLayer['user']['id1'] = jsonData['id1']; } if(jsonData['id2']) { window.adobeDataLayer['user']['id2'] = jsonData['id2']; } } let dataLayerEvent = new CustomEvent("dataLayerEvent", {detail: window.adobeDataLayer}); document.querySelector("body").dispatchEvent(dataLayerEvent); }) }); if (window.location.hash === '#payment') { window.adobeDataLayer['checkout'] = { "step": 2, "name": 'Payment' } } else { window.adobeDataLayer['checkout'] = { "step": 1, "name": 'Shipping' } } } else { window.adobeDataLayer['checkout'] = { "step": 0, "name": '' } } const pollForAdobeAnalytics = () => { let interval; let timer = 0; const TIME_LIMIT = 60000; interval = setInterval(() => { timer += 10; if (timer > TIME_LIMIT) { clearInterval(interval); console.log("adobe analytics failed to load within one minute"); return; } if (window.__satelliteLoaded) { pageLoadedEvent(); clearInterval(interval); } }, 10) } window.addEventListener("DOMContentLoaded", () => { pollForAdobeAnalytics(); }); </script> <script type="text/x-magento-init"> { "*": { "Plumrocket_CookieConsent/js/youtube": { "categoryKey": "marketing" } } } </script> <script id="pr_cookie_consent_on_load_activate"> function BodyScripts() { this.execute = function (element, idPrefix) { var scripts = this.collectScriptsFromChildren(element); this.executeScripts(scripts, 0, idPrefix); }; this.executeScripts = function (scripts, i, idPrefix) { var self = this; var script = scripts[i]; if (script.parentNode) { script.parentNode.removeChild(script); } this.evalScript(scripts[i], idPrefix + '_' + i, function () { if (i < scripts.length-1) { self.executeScripts(scripts, ++i, idPrefix); } }); } this.nodeName = function (elem, name) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); }; this.evalScript = function (elem, id, callback) { var data = (elem.text || elem.textContent || elem.innerHTML || ''), head = document.getElementsByTagName('head')[0] || document.documentElement; var script = document.createElement('script'); script.type = "text/javascript"; if (id !== '') { script.setAttribute('id', id); } if (elem.src !== '') { script.src = elem.src; head.appendChild(script); // Then bind the event to the callback function. // There are several events for cross browser compatibility. script.onreadystatechange = callback; script.onload = callback; } else { try { // doesn't work on ie... script.appendChild(document.createTextNode(data)); } catch (e) { // IE has funky script nodes script.text = data; } head.appendChild(script); callback(); } }; this.collectScriptsFromChildren = function (node) { var scripts = [], children_nodes = node.childNodes, child, i; if (children_nodes === undefined) { return; } for (i = 0; i<children_nodes.length; i++) { child = children_nodes[i]; if (this.nodeName(child, 'script') && (!child.type || child.type.toLowerCase() === 'text/javascript') ) { scripts.push(child); } else { var newScripts = this.collectScriptsFromChildren(child); for (var j = 0; j < newScripts.length; j++) { scripts.push(newScripts[j]); } } } return scripts; }; /** * Active <script type="pr_cookie_category/..."> scripts. * * Allowed types are: * - pr_cookie_category/all * - pr_cookie_category/{{category_name}} * * @param {HTMLScriptElement} notActiveScript */ this.activatePrCookieCategoryScript = function (notActiveScript) { var cookieCategory = notActiveScript.type.replace('pr_cookie_category/', ''); var isScriptAllowed = ('all' === cookieCategory) ? prCookieConsentApi.isAllCategoriesAllowed() : prCookieConsentApi.isAllowedCategory(cookieCategory); if (isScriptAllowed) { var script = document.createElement('script'); script.type = 'text/javascript'; if (notActiveScript.getAttribute('id')) { script.setAttribute('id', notActiveScript.getAttribute('id')); } if (notActiveScript.src) { script.src = notActiveScript.src; } else { script.text = notActiveScript.text; } notActiveScript.replaceWith(script); } }; } window.addEventListener('DOMContentLoaded', (event) => { const scripts = document.querySelectorAll('script[type^="pr_cookie_category"]'); const bodyScripts = new BodyScripts(); scripts.forEach(function (notActiveScript) { bodyScripts.activatePrCookieCategoryScript(notActiveScript); }); }); </script> <script> require(['jquery', 'iframeResizer' ], function ($) { $(function () { waitUntilExists(function() { return $('.embedded-iframe').length; }, function() { var iframe = $('.embedded-iframe'), headerHeight = $('header').outerHeight(), windowHeight = $(window).innerHeight(), availableHeight = windowHeight - headerHeight - 70, isOldIE = (navigator.userAgent.indexOf("MSIE") !== -1); iframe.css({'height': availableHeight + 'px'}); iframe.on('load', function(){ iFrameResize({ log: false, minHeight: availableHeight, resizeFrom: 'parent', scrolling: true, inPageLinks: true, autoResize: true, heightCalculationMethod: isOldIE ? 'max' : 'bodyScroll', onInit: function(iframe) { iframe.style.height = availableHeight + 'px'; }, onResized: function(messageData) { setTimeout(function() { messageData.iframe.style.visibility = 'visible'; }, 300); }, onMessage: function(messageData) { if (history.pushState && messageData.message.hasOwnProperty('trackNo')) { var newUrl = window.location.protocol + '//' + window.location.host + window.location.pathname.replace(/\/$/, '') + '/' + messageData.message.trackNo; window.history.pushState({path:newUrl}, '', newUrl); } } }, '.embedded-iframe'); }); }, function() { }); function waitUntilExists(isReady, success, error, count, interval){ if (count === undefined) { count = 300; } if (interval === undefined) { interval = 20; } if (isReady()) { success(); return; } setTimeout(function(){ if (!count) { if (error !== undefined) { error(); } } else { waitUntilExists(isReady, success, error, count -1, interval); } }, interval); } }); }); </script> <script> (function () { "use strict"; const DIRECTIVE = "intersect"; const X_ATTR_RE = /^x-([a-z-]*)\b/i; function parseHtmlAttribute(reference) { const name = reference.name; const value = reference.value; const typeMatch = name.match(X_ATTR_RE); const valueMatch = name.match(/:([a-zA-Z0-9\-:]+)/); const modifiers = name.match(/\.[^.\]]+(?=[^\]]*$)/g) || []; return { type: typeMatch ? typeMatch[1] : null, value: valueMatch ? valueMatch[1] : null, modifiers: modifiers.map((i) => i.replace(".", "")), expression: value, }; } function getXDirectives(el) { return Array.from(el.attributes) .filter(function (attr) { return X_ATTR_RE.test(attr.name); }) .map(parseHtmlAttribute); } if (window.Alpine) { console.error("Intersect plugin must be included before AlpineJs, x-intersect will not work."); } const getLengthValue = (rawValue) => { // Supported: -10px, -20 (implied px), 30 (implied px), 40px, 50% let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/) return match ? match[1] + (match[2] || 'px') : undefined } const getRootMargin = (modifiers) => { const key = 'margin' const fallback = '0px 0px 0px 0px' const index = modifiers.indexOf(key) // If the modifier isn't present, use the default. if (index === -1) return fallback // Grab the 4 subsequent length values after it: x-intersect.margin.300px.0.50%.0 let values = [] for (let i = 1; i < 5; i++) { values.push(getLengthValue(modifiers[index + i] || '')) } // Filter out undefined values (not a valid length) values = values.filter((v) => v !== undefined) return values.length ? values.join(' ').trim() : fallback } const getThreshhold = (modifiers) => { if (modifiers.includes("full")) return 0.8; if (modifiers.includes("half")) return 0.5; return 0; }; const AlpineIntersectionDirective = { start: function start() { Alpine.onBeforeComponentInitialized(function (component) { const legacyResolveBoundAttributes = component.resolveBoundAttributes; component.resolveBoundAttributes = function (el, initialUpdate, extraVars) { if (initialUpdate === void 0) { initialUpdate = false; } if (initialUpdate) { const attrs = getXDirectives(el); attrs.forEach(function (reference) { const type = reference.type; const expression = reference.expression; const value = reference.value; const modifiers = reference.modifiers; if (type === DIRECTIVE) { const options = { rootMargin: getRootMargin(modifiers), threshold: getThreshhold(modifiers), }; const observer = new IntersectionObserver((elements) => { elements.forEach((element) => { // Ignore element if intersecting in leave mode, // or not intersecting in enter mode if (element.isIntersecting === (value === 'leave')) return component.evaluateReturnExpression(el, expression, extraVars); modifiers.includes("once") && observer.disconnect(); }); }, options); observer.observe(el); } }); } return legacyResolveBoundAttributes.bind(component)(el, initialUpdate, extraVars); }; }); }, }; const initAlpine = window.deferLoadingAlpine || ((callback) => callback()); window.deferLoadingAlpine = (callback) => { AlpineIntersectionDirective.start(); initAlpine(callback); }; })(); </script> <script> (function () { "use strict"; const initAlpine = window.deferLoadingAlpine || ((callback) => callback()); window.deferLoadingAlpine = (callback) => { const origInitializeComponent = Alpine.initializeComponent; Alpine.initializeComponent = function (el) { if (! el.closest('[x-ignore]')) { origInitializeComponent.call(this, el); } }; initAlpine(callback); }; })() </script> <script> for (const [selector, deferUntil] of Object.entries({".product-slider section[x-data]":"intersect",".product-info [x-data]":"intersect","#filters-content [x-data]":"intersect","#review_form":"intersect","section[x-data^=initRecentlyViewedProductsComponent]":"intersect","div[x-data^=initBundleOptions]":"intersect","#product_addtocart_form [x-data]":"intersect","#notice-cookie-block":"intersect"})) { document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); } </script> <script> (function () { "use strict"; const hasAlpine = new Promise(resolve => { window.addEventListener('hyva-alpine:x-defer-initialized', resolve, {once: true, passive: true}) }) const hasInteract = new Promise(resolve => { (events => { const onInteract = () => { resolve(); events.forEach(type => window.removeEventListener(type, onInteract)); } events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) }); const onIntersect = (el) => { return new Promise(resolve => { const observer = new IntersectionObserver(entries => { for (const entry of entries) { if (entry.isIntersecting) { observer.disconnect() resolve(); } } }, {}); observer.observe(el); }); } function runComponent(el) { hasAlpine.then(() => { el.removeAttribute('x-ignore'); queueMicrotask(() => Alpine.initializeComponent(el)); }); } function initDeferredComponents() { document.querySelectorAll('[x-data][x-defer]').forEach(el => { el.setAttribute('x-ignore', ''); const deferUntil = (el.getAttribute('x-defer') || '').trim(); switch (deferUntil) { case 'interact': hasInteract.then(() => runComponent(el)); break; case 'intersect': onIntersect(el).then(() => runComponent(el)) break; case 'idle': window.requestIdleCallback ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) : setTimeout(() => runComponent(el), 4000); break; case 'eager': runComponent(el); break; default: if (deferUntil.startsWith('event:') && deferUntil.length > 6) { window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); } } }); } const initAlpine = window.deferLoadingAlpine || ((callback) => callback()); window.deferLoadingAlpine = (callback) => { initDeferredComponents() initAlpine(callback); window.dispatchEvent(new Event('hyva-alpine:x-defer-initialized')); }; })() </script> <script type="module" src="https://www.nhmshop.co.uk/static/version1731322064/frontend/Nhm/hyva/en_GB/Hyva_Theme/js/alpine.min.js" defer crossorigin ></script> <script> 'use strict'; function dispatchMessages(messages, hideAfter) { const messagesEvent = new CustomEvent("messages-loaded", { detail: { messages: messages, hideAfter: hideAfter } }); window.dispatchEvent(messagesEvent); } if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { console.warn("Hyv盲 helpers are not loaded yet. Make sure they are included before this script"); } (function( hyva, undefined ) { hyva.initFormKey = () => { const inputSelector = 'input[name="form_key"]', formKey = hyva.getFormKey(); Array.from(document.querySelectorAll(inputSelector)).map(function (input) { input.value = formKey }); } hyva.initMessages = () => { try { const messages = hyva.getCookie('mage-messages'); window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; dispatchMessages(window.mageMessages); // empty `mage-messages` cookie const skipSetDomain = true; hyva.setCookie('mage-messages','', -1, skipSetDomain); } catch (error) { console.warn('Error parsing Cookie Messages:', error); } } window.addEventListener('DOMContentLoaded', hyva.initFormKey); hyva.alpineInitialized(hyva.initMessages) }( window.hyva = window.hyva || {} )); </script> <script> 'use strict'; { const private_content_key = 'mage-cache-storage'; const private_content_expire_key = 'mage-cache-timeout'; const private_content_version_key = 'private_content_version'; const section_data_ids_key = 'section_data_ids'; const mage_cache_session_id_key = 'mage-cache-sessid'; const last_visited_store_key = 'last_visited_store'; const ttl = 3600; if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { console.warn("Hyv盲 helpers are not loaded yet. Make sure they are included before this script"); } function loadSectionData () { const browserStorage = hyva.getBrowserStorage(); if (!browserStorage) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "warning", text: "Please enable LocalStorage in your browser." }] ); return; } try { let isInvalid = false; if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { isInvalid = true; } hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); if (!hyva.getCookie(mage_cache_session_id_key)) { isInvalid = true; browserStorage.removeItem(private_content_key); const skipSetDomain = true; const days = false; hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) } const cookieVersion = hyva.getCookie(private_content_version_key); const storageVersion = browserStorage.getItem(private_content_version_key); if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { isInvalid = true; } const privateContentExpires = browserStorage.getItem(private_content_expire_key); if (privateContentExpires && new Date(privateContentExpires) < new Date()) { browserStorage.removeItem(private_content_key); } if (isInvalid && cookieVersion) { fetchPrivateContent([]); } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); if ( privateContent && privateContentExpires && privateContent.cart && privateContent.customer ) { dispatchPrivateContent(privateContent); } else { fetchPrivateContent([]); } } else { if (document.getElementById('default-section-data')) { const privateContent = JSON.parse(document.getElementById('default-section-data').innerText.trim()); dispatchPrivateContent(privateContent); } else { dispatchPrivateContent({}); } } } catch (error) { console.warn('Error retrieving Private Content:', error); } } hyva.alpineInitialized(loadSectionData) window.addEventListener('reload-customer-section-data', loadSectionData); function dispatchPrivateContent(data) { const privateContentEvent = new CustomEvent("private-content-loaded", { detail: { data: data } }); window.dispatchEvent(privateContentEvent); } function fetchPrivateContent(sections) { fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { method: 'GET', headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' } }) .then(response => response.json()) .then( data => { if (data) { try { const browserStorage = hyva.getBrowserStorage(); // merge new data preserving non-invalidated sections const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { delete oldSectionData['checkout-data']; } const newSectionData = Object.assign(oldSectionData, data); dispatchPrivateContent(newSectionData); // don't persist messages, they've been dispatched already if (newSectionData.messages && newSectionData.messages.messages ) { newSectionData.messages.messages = []; } browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); browserStorage.setItem(private_content_expire_key, expiresAt); const newCookieVersion = hyva.getCookie(private_content_version_key); browserStorage.setItem(private_content_version_key, newCookieVersion); // We don't need the section_data_ids in Hyv盲, but we store them for compatibility // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout hyva.setCookie( section_data_ids_key, JSON.stringify( Object.keys(data).reduce((sectionDataIds, sectionKey) => { sectionDataIds[sectionKey] = data[sectionKey]['data_id']; return sectionDataIds; }, {}) ), false, true ); } catch (error) { console.warn("Couldn't store privateContent", error); } } } ); } } </script> <script> (() => { document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); })() </script> <script> (events => { const dispatchUserInteractionEvent = () => { events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) window.dispatchEvent(new Event('init-external-scripts')) }; events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) </script> <script> function initConfigurableOptions(productId, optionConfig) { function findPathParam(key) { const baseUrl = (BASE_URL.substr(0, 2) === '//' ? 'http:' : '') + BASE_URL; const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/'); const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3); for (let i = 0; i < pathParts.length; i += 2) { if (pathParts[i] === key && pathParts.length > i) { return pathParts[i + 1]; } } } return { optionConfig, productId, itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'), allowedAttributeOptions: [], selectedValues: [], init() { this.findAllowedAttributeOptions(); this.$nextTick(() => { if (typeof this.optionConfig.defaultValues === 'object') { for (const [optionId, value] of Object.entries(this.optionConfig.defaultValues)) { this.changeOption(optionId, value + ''); } } }); }, findSimpleIndex() { this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues); }, calculateSimpleIndexForPartialSelection(selectedValues) { if (selectedValues.length === 0) return 0; let productIndexIds = Object.keys(this.optionConfig.index); Object.keys(this.optionConfig.attributes).forEach((attribute) => { const productsWithAttributeMatch = selectedValues[attribute] ? productIndexIds.filter((productIndex) => { return this.optionConfig.index[productIndex][attribute] === this.selectedValues[attribute] }) : []; productIndexIds = productsWithAttributeMatch.length ? productsWithAttributeMatch : productIndexIds }) return productIndexIds[0]; }, calculateSimpleIndexForFullSelection(selectedValues) { const productIndexes = this.optionConfig.index; return Object.keys(productIndexes).find(productIndex => { const productCandidateOptions = productIndexes[productIndex]; for (const productOption in productCandidateOptions) { if ( !selectedValues[productOption] || selectedValues[productOption] !== productCandidateOptions[productOption] ) { return false; } } return productIndex; }); }, productIndex: 0, findAllowedAttributeOptions() { this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues); }, calculateAllowedAttributeOptions(selectedValues) { const allAttributes = this.optionConfig.attributes; const allAttributesSorted = Object.values(allAttributes).sort((a, b) => { return a.position - b.position }); const productIndexes = this.optionConfig.index; let previousOption = false; let availableIndexes = Object.keys(productIndexes); const newAllowedAttributeOptions = []; allAttributesSorted.forEach(attribute => { if (previousOption && selectedValues[previousOption]) { availableIndexes = availableIndexes.filter(availableIndex => { return productIndexes[availableIndex][previousOption] === selectedValues[previousOption] }) } newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => { return !!option.products.find(product => { return availableIndexes.includes(product); }) }); previousOption = attribute.id; }); return newAllowedAttributeOptions; }, findAttributeByOptionId(optionId) { for (const attributeId in this.optionConfig.attributes) { const attributeOptions = this.optionConfig.attributes[attributeId].options || []; if (attributeOptions.find(option => option.id === optionId)) { return attributeId; } } }, getAllowedAttributeOptions(attributeId) { return this.allowedAttributeOptions[attributeId] || [] }, getProductIdsForOption(option) { const attributeId = this.findAttributeByOptionId(option.id); const allOptions = this.optionConfig.attributes[attributeId]; const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id); return opt && opt.products ? opt.products : []; }, findProductIdsForPartialSelection(optionSelection) { const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => { const newCandidates = this.getProductIdsForOption({id: optionId}); return candidates === null ? newCandidates : candidates.filter(productId => newCandidates.includes(productId)); }, null); return candidateProducts || []; }, findCheapestProductForPartialSelection(optionSelection) { const candidateProducts = this.findProductIdsForPartialSelection(optionSelection); return candidateProducts.reduce((cheapest, simpleIdx) => { // in the first iteration we start with simpleIdx as the currently cheapest product if (!this.optionConfig.optionPrices[cheapest]) return simpleIdx; const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount; return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount ? simpleIdx : cheapest; }, 0) }, findProductIdToUseForOptionPrice(option) { // try to find a product for a complete selection const attributeId = this.findAttributeByOptionId(option.id); const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id}); const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection); // if there is no complete selection, use the cheapest product for the option return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection); }, getAttributeOptionLabel(option) { const optionProduct = this.findProductIdToUseForOptionPrice(option); if ((!optionProduct) || (optionProduct === this.productIndex)) { return option.label; } const currentPrice = this.getOptionPriceAdjustmentBasePrice(); if (this.optionConfig.optionPrices[optionProduct]) { const optionPrice = this.optionConfig.optionPrices[optionProduct].finalPrice.amount; if (optionPrice !== currentPrice) { // return option.label + ' ' + hyva.formatPrice(optionPrice - currentPrice, true); return option.label; } } return option.label; }, getOptionPriceAdjustmentBasePrice() { if (this.optionConfig.optionPrices[this.productIndex]) { return this.optionConfig.optionPrices[this.productIndex].finalPrice.amount } const cheapestForSelection = this.findCheapestProductForPartialSelection(this.selectedValues); return this.optionConfig.optionPrices[cheapestForSelection] ? this.optionConfig.optionPrices[cheapestForSelection].finalPrice.amount : this.optionConfig.prices.finalPrice.amount; // default price if no option selection }, changeOption(optionId, value) { if (value === '') { // create new array so the length property is reset if no option is selected (avoiding delete) this.selectedValues = this.selectedValues.reduce((newSelection, val, opt) => { if (opt !== optionId) { newSelection[opt] = val; } return newSelection; }, []); } else { this.selectedValues[optionId] = value; } this.findSimpleIndex(); this.findAllowedAttributeOptions(); this.updatePrices(); this.updateGallery(); window.dispatchEvent( new CustomEvent( 'configurable-selection-changed', { detail: { productId: this.productId, optionId: optionId, value: value, productIndex: this.productIndex, selectedValues: this.selectedValues, candidates: this.findProductIdsForPartialSelection(this.selectedValues), } } ) ); }, calculateIsMinimalPrice() { return ( this.selectedValues.filter(value => !!value).length < Object.keys(this.optionConfig.attributes).length ); }, updatePrices() { const value = this.productIndex ? this.optionConfig.optionPrices[this.productIndex] : this.optionConfig.prices; window.dispatchEvent( new CustomEvent( "update-prices-" + this.productId, { detail: Object.assign( value, {isMinimalPrice: this.calculateIsMinimalPrice()} ) } ) ); }, updateGallery() { if (this.productIndex) { const images = this.optionConfig.images[this.productIndex]; images && window.dispatchEvent(new CustomEvent( "update-gallery", {detail: this.sortImagesByPosition(images)} )); } else { window.dispatchEvent(new Event("reset-gallery")); } }, sortImagesByPosition(images) { return images.sort((x, y) => { return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1) }); }, onGetCartData(data) { this.preselectCartItems(data); this.preselectQuerystringItems(); this.preselectLocationHashItems(); }, preselectCartItems(data) { // pre-select options based on cart data for current (quote) itemId const cart = data && data.cart; if (cart && cart.items) { const cartItem = cart.items.find((item) => { return ( item.item_id === this.itemId && item.product_id === this.productId ) }); if (cartItem && cartItem.options && cartItem.options.length) { cartItem.options.map(option => { this.changeOption(option.option_id, option.option_value); }) } } }, preselectQuerystringItems() { // pre-select option like ?size=167 const urlQueryParams = new URLSearchParams(window.location.search.replace('?', '')); Object.values(this.optionConfig.attributes).map(attribute => { urlQueryParams.get(attribute.code) && this.changeOption(attribute.id, urlQueryParams.get(attribute.code)); }); }, preselectLocationHashItems() { // pre-select option like #144=167 const urlHashParams = new URLSearchParams(window.location.hash.replace('#', '')); Object.values(this.optionConfig.attributes).map(attribute => { urlHashParams.get(attribute.id) && this.changeOption(attribute.id, urlHashParams.get(attribute.id)); }); } } } </script> <script> function initSwatchOptions(swatchConfig) { return { swatchConfig, getAttributeSwatchData(attributeId) { const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]); swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']); return swatchConfig; }, getAllAttributeOptions(attributeId) { return ( this.optionConfig.attributes[attributeId] && this.optionConfig.attributes[attributeId].options ) || [] }, optionIsActive(attributeId, optionId) { // return true if a product with this option is in stock return !!this.getAllowedAttributeOptions(attributeId).find( option => option.id === optionId ) }, optionIsEnabled(attributeId, optionId) { // return true if a product with this option is enabled for (const productId in this.optionConfig.index) { if (this.optionConfig.index[productId][attributeId] === optionId) { return true; } } return false; }, mapSwatchTypeNumberToTypeCode(typeNumber) { switch ("" + typeNumber) { case "1": return "color" case "2": return "image" case "3": return "empty" case "0": default: return "text" } }, getTypeOfFirstOption(attributeId) { for (const optionId in this.swatchConfig[attributeId]) { const option = this.swatchConfig[attributeId][optionId]; if (typeof option.type !== 'undefined') { return this.mapSwatchTypeNumberToTypeCode(option.type); } } }, getVisualSwatchType(attributeId, targetOptionId) { // If a type configuration is present for the given option id, use it const config = this.swatchConfig[attributeId]; if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') { return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type); } // Otherwise - if no config is present for the target option - use the type of the first option // with a type property from the attribute, thus assuming its the same type as the target option. // (This edge case condition can occur on single swatch products if some options are not salable) return this.getTypeOfFirstOption(attributeId); }, getSwatchType(attributeId, optionId) { // Deserialize the attribute details the first time they are used if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) { this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId); } const type = this.swatchConfig[attributeId] && this.swatchConfig[attributeId].details && this.swatchConfig[attributeId].details.swatch_input_type || "empty"; return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type; }, isTextSwatch(attributeId, optionId) { return this.getSwatchType(attributeId, optionId) === 'text'; }, isVisualSwatch(attributeId, optionId) { const type = this.getSwatchType(attributeId, optionId); return ['image', 'color'].includes(type); }, getSwatchBackgroundStyle(attributeId, optionId) { const config = this.getSwatchConfig(attributeId, optionId); const type = this.getSwatchType(attributeId, optionId); if (type === "color") { return 'background-color:' + config.value; } else if (type === "image") { return "background: #ffffff url('" + config.value + "') no-repeat center"; } else { return ''; } }, getSwatchText(attributeId, optionId) { const config = this.getSwatchConfig(attributeId, optionId); return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId); }, getOptionLabelFromOptionConfig(attributeId, optionId) { // Fallback if no value is present in swatchConfig data // Reference issue https://gitlab.hyva.io/hyva-themes/magento2-default-theme/-/issues/190 const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId); return option && option[0] && option[0].label ||''; }, getSwatchConfig(attributeId, optionId) { return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId] ? this.swatchConfig[attributeId][optionId] : false; }, activeTooltipItem: false, tooltipPositionElement: false, isTooltipVisible() { return this.activeTooltipItem && this.getSwatchConfig( this.activeTooltipItem.attribute, this.activeTooltipItem.item ); }, getTooltipImageStyle(attributeId, optionId) { const config = this.getSwatchConfig(attributeId, optionId); const type = this.getSwatchType(attributeId, optionId); if (type === "color") { return 'background-color:' + config.value + '; width: 110px; height: 90px;'; } else if (type === "image") { return "background: #ffffff url('" + config.thumb + "') center center no-repeat; width: 110px; height: 90px;"; } else { return 'display:none'; } }, getTooltipPosition() { return this.tooltipPositionElement ? `top: ${this.tooltipPositionElement.offsetTop}px;` + `left: ${ this.tooltipPositionElement.offsetLeft - ( this.tooltipPositionElement.closest('.snap') && this.tooltipPositionElement.closest('.snap').scrollLeft || 0 ) }px;` : '' }, getTooltipLabel() { return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label }, focusedLabel: false, focusLabel(optionId) { this.focusedLabel = optionId; }, blurLabel() { this.focusedLabel = false; }, showSwatches: false, initShowSwatchesIntersect() { if ('IntersectionObserver' in window && !window.scrollY) { const io = new IntersectionObserver( entries => { entries.map(entry => { if (entry.isIntersecting) { this.showSwatches = true; io.unobserve(this.$el); } }) } ); io.observe(this.$el); } else { this.showSwatches = true } } } } </script> <script> 'use strict'; (() => { const equalizeButtonWidths = (buttons) => { const buttonList = buttons.querySelectorAll('[data-element="link"], [data-element="empty_link"]'); let buttonMinWidth = 0; buttonList.forEach(button => { const buttonWidth = button.offsetWidth; if (buttonWidth > buttonMinWidth) { buttonMinWidth = buttonWidth; } }); buttonList.forEach(button => { button.style.minWidth = `${buttonMinWidth}px`; }); }; window.addEventListener('DOMContentLoaded', () => { document.querySelectorAll('[data-content-type="buttons"][data-same-width="true"]').forEach(buttons => { equalizeButtonWidths(buttons); }); }); })(); </script> <script> 'use strict'; (() => { const initCarousels = (elements) => { if (!Glider) { return; } const initProductCarousel = (carousel) => { const gliderElement = carousel.querySelector('[data-role="glider-content"]'); if (!gliderElement) { return; } const gliderDots = carousel.querySelector('.glider-dots'); const gliderPrev = carousel.querySelector('.glider-prev'); const gliderNext = carousel.querySelector('.glider-next'); const glider = new Glider(gliderElement, { slidesToShow: 2, slidesToScroll: 2, scrollLock: true, draggable: true, dragVelocity: 2.5, dots: gliderDots, arrows: { prev: gliderPrev, next: gliderNext, }, responsive: [ { breakpoint: 768, settings: { slidesToShow: 3, slidesToScroll: 3, } }, { breakpoint: 1024, settings: { slidesToShow: 4, slidesToScroll: 4, } }, ], }); carousel.classList.remove('overflow-x-scroll'); gliderPrev.classList.remove('hidden'); gliderNext.classList.remove('hidden'); if (carousel.dataset.autoplay !== 'false') { gliderAutoplay( glider, carousel.dataset.autoplaySpeed, carousel.dataset.infiniteLoop ); } }; const initSliderCarousel = (slider) => { slider.innerHTML = `<div data-role="glider-content">${slider.innerHTML}</div>`; slider.classList.add('glider-contain'); slider.insertAdjacentHTML( 'beforeend', '\u000A\u003Cdiv\u0020class\u003D\u0022carousel\u002Dnav\u0020flex\u0020items\u002Dcenter\u0020justify\u002Dcenter\u0020flex\u002D1\u0020p\u002D4\u0022\u003E\u000A\u0020\u0020\u0020\u0020\u003Cbutton\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020aria\u002Dlabel\u003D\u0022Previous\u0022\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020class\u003D\u0022glider\u002Dprev\u0020w\u002D8\u0020h\u002D8\u0020mr\u002D1\u0020text\u002Dblack\u0020rounded\u002Dfull\u0020outline\u002Dnone\u0020focus\u003Aoutline\u002Dnone\u0020hidden\u0022\u003E\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u003Csvg\u0020xmlns\u003D\u0022http\u003A\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\u0022\u0020fill\u003D\u0022none\u0022\u0020viewBox\u003D\u00220\u00200\u002024\u002024\u0022\u0020stroke\u002Dwidth\u003D\u00222\u0022\u0020stroke\u003D\u0022currentColor\u0022\u0020width\u003D\u002224\u0022\u0020height\u003D\u002224\u0022\u0020role\u003D\u0022img\u0022\u003E\u000A\u0020\u0020\u003Cpath\u0020stroke\u002Dlinecap\u003D\u0022round\u0022\u0020stroke\u002Dlinejoin\u003D\u0022round\u0022\u0020d\u003D\u0022M15\u002019l\u002D7\u002D7\u00207\u002D7\u0022\u002F\u003E\u000A\u003Ctitle\u003Echevron\u002Dleft\u003C\u002Ftitle\u003E\u003C\u002Fsvg\u003E\u000A\u0020\u0020\u0020\u0020\u003C\u002Fbutton\u003E\u000A\u0020\u0020\u0020\u0020\u003Cdiv\u0020role\u003D\u0022tablist\u0022\u0020class\u003D\u0022glider\u002Ddots\u0020select\u002Dnone\u0020flex\u0020flex\u002Dwrap\u0020mx\u002D1\u0020justify\u002Dcenter\u0020p\u002D0\u0020focus\u003Aoutline\u002Dnone\u0022\u003E\u003C\u002Fdiv\u003E\u000A\u0020\u0020\u0020\u0020\u003Cbutton\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020aria\u002Dlabel\u003D\u0022Next\u0022\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020class\u003D\u0022glider\u002Dnext\u0020w\u002D8\u0020h\u002D8\u0020ml\u002D1\u0020text\u002Dblack\u0020rounded\u002Dfull\u0020outline\u002Dnone\u0020focus\u003Aoutline\u002Dnone\u0020hidden\u0022\u003E\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u003Csvg\u0020xmlns\u003D\u0022http\u003A\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\u0022\u0020fill\u003D\u0022none\u0022\u0020viewBox\u003D\u00220\u00200\u002024\u002024\u0022\u0020stroke\u002Dwidth\u003D\u00222\u0022\u0020stroke\u003D\u0022currentColor\u0022\u0020width\u003D\u002224\u0022\u0020height\u003D\u002224\u0022\u0020role\u003D\u0022img\u0022\u003E\u000A\u0020\u0020\u003Cpath\u0020stroke\u002Dlinecap\u003D\u0022round\u0022\u0020stroke\u002Dlinejoin\u003D\u0022round\u0022\u0020d\u003D\u0022M9\u00205l7\u00207\u002D7\u00207\u0022\u002F\u003E\u000A\u003Ctitle\u003Echevron\u002Dright\u003C\u002Ftitle\u003E\u003C\u002Fsvg\u003E\u000A\u0020\u0020\u0020\u0020\u003C\u002Fbutton\u003E\u000A\u003C\u002Fdiv\u003E\u000A' ); const gliderElement = slider.querySelector('[data-role="glider-content"]'); const gliderDots = slider.querySelector('.glider-dots'); const gliderPrev = slider.querySelector('.glider-prev'); const gliderNext = slider.querySelector('.glider-next'); const glider = new Glider(gliderElement, { slidesToShow: 1, slidesToScroll: 1, scrollLock: true, scrollLockDelay: 250, draggable: true, dragVelocity: 2.5, dots: gliderDots, arrows: { prev: gliderPrev, next: gliderNext, }, }); slider.classList.add('glider-initialized'); if (slider.dataset.showArrows === 'true') { gliderPrev.classList.remove('hidden'); gliderNext.classList.remove('hidden'); } if (slider.dataset.autoplay !== 'false') { gliderAutoplay( glider, slider.dataset.autoplaySpeed, slider.dataset.infiniteLoop ); } }; const gliderAutoplay = (glider, milliseconds, loop) => { const pagesCount = glider.track.childElementCount; let slideTimeout = null; let nextIndex = 1; let paused = false; const slide = () => { slideTimeout = setTimeout( () => { if (loop && nextIndex >= pagesCount) { nextIndex = 0; } glider.scrollItem(nextIndex); }, parseInt(milliseconds) ); }; glider.ele.addEventListener('glider-animated', () => { nextIndex = glider.slide + glider.opt.slidesToScroll; window.clearInterval(slideTimeout); if (!paused && (loop || nextIndex < pagesCount)) { slide(); } }); const pause = () => { if (!paused) { clearInterval(slideTimeout); paused = true; } }; const unpause = () => { if (paused) { slide(); paused = false; } }; glider.ele.parentElement.addEventListener('mouseover', pause, {passive: true}); glider.ele.parentElement.addEventListener('touchstart', pause, {passive: true}); glider.ele.parentElement.addEventListener('mouseout', unpause, {passive: true}); glider.ele.parentElement.addEventListener('touchend', unpause, {passive: true}); slide(); }; elements.forEach(element => { if (element.dataset.contentType === 'products') { initProductCarousel(element); } if (element.dataset.contentType === 'slider') { initSliderCarousel(element); } }); }; window.addEventListener('DOMContentLoaded', () => { const carouselElements = document.querySelectorAll( `[data-content-type="products"][data-appearance="carousel"], [data-content-type="slider"]` ); if (carouselElements.length > 0) { const script = document.createElement('script'); script.type = 'text/javascript'; script.addEventListener('load', () => { initCarousels(carouselElements); }); script.src = 'https\u003A\u002F\u002Fwww.nhmshop.co.uk\u002Fstatic\u002Fversion1731322064\u002Ffrontend\u002FNhm\u002Fhyva\u002Fen_GB\u002FMagento_PageBuilder\u002Fjs\u002Fglider.min.js'; document.head.appendChild(script); } }); })(); </script> <script> 'use strict'; (() => { const initMaps = (elements) => { const renderMap = (element) => { const dataLocations = element.dataset.locations; // Hide map if no locations set if (!dataLocations || dataLocations === '[]') { element.classList.add('hidden'); return; } const map = new google.maps.Map( element, getMapOptions( element.dataset.showControls !== 'true', element.dataset.showControls === 'true' ) ); const locations = JSON.parse(dataLocations); const latitudeLongitudeBounds = new google.maps.LatLngBounds(); const bounds = []; locations.forEach(location => { const position = { lat: parseFloat(location.position.latitude), lng: parseFloat(location.position.longitude), }; bounds.push(position); const infowindow = new google.maps.InfoWindow({ content: getInfoWindowContent(location), }); const marker = new google.maps.Marker({ position: position, map, title: location.location_name, }); marker.addListener('click', () => { infowindow.open(map, marker); }); }); // Set bounds if multiple locations if (bounds.length > 1) { bounds.forEach(function (bound) { latitudeLongitudeBounds.extend(bound); }); map.fitBounds(latitudeLongitudeBounds); } // Center if single location if (bounds.length === 1) { map.setCenter(bounds[0]); } }; const getMapOptions = (disableDefaultUI, mapTypeControl) => { const style = ''; return { zoom: 8, scrollwheel: false, disableDoubleClickZoom: false, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DEFAULT, }, styles: style ? JSON.parse(style) : [], disableDefaultUI: disableDefaultUI, mapTypeControl: mapTypeControl, }; }; const getInfoWindowContent = (location) => { const title = location.location_name ? `<h3 class="text-2xl font-medium text-gray-900 title-font">${location.location_name}</h3>` : ''; const comment = location.comment ? `<p class="px-1 pt-3 text-primary">${location.comment}</p>` : ''; const phone = location.phone ? `<p class="px-1 pt-3 text-primary">Phone: ${location.phone}</p>` : ''; const street = location.address ? `${location.address}<br/>` : ''; const city = location.city ? `${location.city}<br/>` : ''; const state = location.state ? `${location.state}<br/>` : ''; const zipCode = location.zipcode ? `${location.zipcode}<br/>` : ''; const country = location.country ? location.country : ''; return `<div> ${title} ${comment} ${phone} <p class="px-1 pt-3 text-primary"> ${street} ${city} ${state} ${zipCode} ${country} </p> </div>`; }; const hideAllMaps = () => { document.querySelectorAll('[data-content-type="map"]').forEach(element => { element.classList.add('hidden'); }); }; window.gm_authFailure = () => { hideAllMaps(); }; if (typeof google.maps === 'undefined') { hideAllMaps(); return; } elements.forEach(element => { if (element.dataset.contentType === 'map') { renderMap(element); } }); }; window.addEventListener('DOMContentLoaded', () => { const mapElements = document.querySelectorAll('[data-content-type="map"]'); if (mapElements.length > 0) { const script = document.createElement('script'); script.type = 'text/javascript'; script.addEventListener('load', () => { initMaps(mapElements); }); script.src = 'https\u003A\u002F\u002Fmaps.googleapis.com\u002Fmaps\u002Fapi\u002Fjs\u003Fv\u003D3\u0026key\u003D'; document.head.appendChild(script); } }); })(); </script> <script> 'use strict'; (() => { const initParallaxImage = (element) => { if (!window.jarallax) { return; } element.classList.add('jarallax'); element.dataset.jarallax = ''; const parallaxSpeed = parseFloat(element.dataset.parallaxSpeed) || 0.5; const elementStyle = window.getComputedStyle(element); window.jarallax(element, { imgPosition: elementStyle.backgroundPosition || '50% 50%', imgRepeat: elementStyle.backgroundRepeat || 'no-repeat', imgSize: elementStyle.backgroundSize || 'cover', speed: parallaxSpeed, }); }; const initVideoBackground = (element) => { if (!window.jarallax) { return; } let slider = null; if (element.classList.contains('pagebuilder-slide-wrapper')) { const viewportElement = document.createElement('div'); slider = element.closest('[data-content-type=slider]'); viewportElement.classList.add('jarallax-viewport-element'); element.dataset.elementInViewport = '.jarallax-viewport-element'; element.appendChild(viewportElement); } element.classList.add('jarallax'); element.dataset.jarallax = ''; const parallaxSpeed = parseFloat(element.dataset.parallaxSpeed) || 0.5; window.jarallax(element, { imgSrc: element.dataset.videoFallbackSrc, speed: parallaxSpeed, videoLoop: element.dataset.videoLoop, videoPlayOnlyVisible: element.dataset.videoPlayOnlyVisible, videoLazyLoading: element.dataset.videoLazyLoad, disableVideo: false, elementInViewport: element.dataset.elementInViewport && element.querySelector(element.dataset.elementInViewport), }); if (slider) { if (slider.dataset.afterChangeIsSet) { return; } slider.addEventListener('glider-loaded', () => { slider.querySelectorAll('.jarallax').forEach(videoSlide => { videoSlide.jarallax && videoSlide.jarallax.onScroll(); }); }); slider.addEventListener('glider-animated', () => { slider.querySelectorAll('.jarallax').forEach(videoSlide => { videoSlide.jarallax && videoSlide.jarallax.onScroll(); }); }); slider.dataset.afterChangeIsSet = true; } }; window.addEventListener('DOMContentLoaded', () => { const parallaxImageElements = document.querySelectorAll( `[data-content-type="row"][data-background-type="image"][data-enable-parallax="1"], [data-content-type="row"] > [data-background-type="image"][data-enable-parallax="1"]` ); const videoBackgroundsElements = document.querySelectorAll( `[data-content-type="row"][data-background-type="video"][data-enable-parallax="1"], [data-content-type="row"] > [data-background-type="video"][data-enable-parallax="1"], [data-content-type="banner"] [data-background-type="video"], [data-content-type="slide"] [data-background-type="video"]` ); if (parallaxImageElements.length > 0 || videoBackgroundsElements.length > 0) { const jarallaxScript = document.createElement('script'); jarallaxScript.type = 'text/javascript'; jarallaxScript.addEventListener('load', () => { parallaxImageElements.forEach(row => { initParallaxImage(row); }); const jarallaxVideoScript = document.createElement('script'); jarallaxVideoScript.type = 'text/javascript'; jarallaxVideoScript.addEventListener('load', () => { videoBackgroundsElements.forEach(element => { initVideoBackground(element); }); }); jarallaxVideoScript.src = 'https\u003A\u002F\u002Fwww.nhmshop.co.uk\u002Fstatic\u002Fversion1731322064\u002Ffrontend\u002FNhm\u002Fhyva\u002Fen_GB\u002FMagento_PageBuilder\u002Fjs\u002Fjarallax\u002Dvideo.min.js'; document.head.appendChild(jarallaxVideoScript); }); jarallaxScript.src = 'https\u003A\u002F\u002Fwww.nhmshop.co.uk\u002Fstatic\u002Fversion1731322064\u002Ffrontend\u002FNhm\u002Fhyva\u002Fen_GB\u002FMagento_PageBuilder\u002Fjs\u002Fjarallax.min.js'; document.head.appendChild(jarallaxScript); } }); })(); </script> <script> 'use strict'; (() => { const applyShowOnHover = (element) => { const showOverlayOnHover = (element) => { const overlay = element.querySelector('.pagebuilder-overlay'); const color = overlay.dataset.overlayColor; element.addEventListener('mouseover', () => { overlay.style.backgroundColor = color; }); element.addEventListener('mouseout', () => { overlay.style.backgroundColor = 'transparent'; }); }; const showButtonOnHover = (element) => { const button = element.querySelector('.pagebuilder-banner-button'); element.addEventListener('mouseover', () => { button.style.opacity = '1'; button.style.visibility = 'visible'; }); element.addEventListener('mouseout', () => { button.style.opacity = '0'; button.style.visibility = 'hidden'; }); }; if (element.dataset.showOverlay === 'hover') { showOverlayOnHover(element); } if (element.dataset.showButton === 'hover') { showButtonOnHover(element); } }; window.addEventListener('DOMContentLoaded', () => { document.querySelectorAll('[data-content-type="banner"],[data-content-type="slider"]').forEach(element => { applyShowOnHover(element); }); }); })(); </script> <script> 'use strict'; (() => { document.querySelectorAll('[data-content-type="tab-item"]').forEach(tabItem => { tabItem.setAttribute('x-show', `tab === '${tabItem.id}'`); }); document.querySelectorAll('[data-content-type="tabs"]').forEach(tab => { const defaultActiveTab = parseInt(tab.dataset.activeTab) || 0; tab.querySelectorAll('.tab-header').forEach((tabHeader, index) => { const tabLink = tabHeader.querySelector('a'); const tabId = tabLink.getAttribute('href').replace('#', ''); tabHeader.setAttribute(':class', `{ 'active': tab === '${tabId}' }`); tabLink.setAttribute('x-on:click.prevent', `tab = '${tabId}'`); if (index === defaultActiveTab) { tab.setAttribute('x-data', `{ tab: '${tabId}' }`); } }); }); })(); </script> <script> 'use strict'; const grecaptchaV2LoadCallbacks = []; function executeRecaptchaLoadCallbacks () { while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) { const callback = grecaptchaV2LoadCallbacks.pop(); typeof callback === 'string' ? window[callback]() : callback(); } } (function() { const loadRecaptchaScript = (event) => { if (window.grecaptcha || !event.target.form) { return; } const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks'; const siteKey = ''; const script = document.createElement('script'); script.type = 'text/javascript'; script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`; script.async = true; document.head.appendChild(script); if (event.target.form.querySelector) { script.addEventListener('load', () => { Array.from(event.target.form.querySelectorAll('button[disabled]')).forEach(btn => btn.disabled && btn.removeAttribute('disabled')); }); } } window.forceLoadRecaptchaScript = (form) => { loadRecaptchaScript({target: {form: form || 'dummy'}}); executeRecaptchaLoadCallbacks(); }; document.body.addEventListener('input', loadRecaptchaScript, { once: true }); document.body.addEventListener('focus', loadRecaptchaScript, { once: true }); }()); </script> <!-- GOOGLE TAG MANAGER --> <script type="text/x-magento-init"> { "*": { "Magento_GoogleTagManager/js/google-tag-manager": { "isCookieRestrictionModeEnabled": 1, "currentWebsite": 1, "cookieName": "user_allowed_save_cookie", "gtmAccountId": "GTM\u002DPQNWTPC", "storeCurrencyCode": "GBP", "ordersData": [] } } } </script> <!-- END GOOGLE TAG MANAGER --> <script type="application/json" id="default-section-data"> {"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"AD":{"name":"Andorra"},"AE":{"name":"United Arab Emirates"},"AF":{"name":"Afghanistan"},"AG":{"name":"Antigua & Barbuda"},"AI":{"name":"Anguilla"},"AL":{"name":"Albania","regions":{"485":{"code":"AL-01","name":"Berat"},"486":{"code":"AL-09","name":"Dib\u00ebr"},"487":{"code":"AL-02","name":"Durr\u00ebs"},"488":{"code":"AL-03","name":"Elbasan"},"489":{"code":"AL-04","name":"Fier"},"490":{"code":"AL-05","name":"Gjirokast\u00ebr"},"491":{"code":"AL-06","name":"Kor\u00e7\u00eb"},"492":{"code":"AL-07","name":"Kuk\u00ebs"},"493":{"code":"AL-08","name":"Lezh\u00eb"},"494":{"code":"AL-10","name":"Shkod\u00ebr"},"495":{"code":"AL-11","name":"Tiran\u00eb"},"496":{"code":"AL-12","name":"Vlor\u00eb"}}},"AM":{"name":"Armenia"},"AN":{"name":null},"AO":{"name":"Angola"},"AQ":{"name":"Antarctica"},"AR":{"name":"Argentina","regions":{"498":{"code":"AR-B","name":"Buenos Aires"},"499":{"code":"AR-K","name":"Catamarca"},"500":{"code":"AR-H","name":"Chaco"},"501":{"code":"AR-U","name":"Chubut"},"497":{"code":"AR-C","name":"Ciudad Aut\u00f3noma de Buenos Aires"},"502":{"code":"AR-X","name":"C\u00f3rdoba"},"503":{"code":"AR-W","name":"Corrientes"},"504":{"code":"AR-E","name":"Entre R\u00edos"},"505":{"code":"AR-P","name":"Formosa"},"506":{"code":"AR-Y","name":"Jujuy"},"507":{"code":"AR-L","name":"La Pampa"},"508":{"code":"AR-F","name":"La Rioja"},"509":{"code":"AR-M","name":"Mendoza"},"510":{"code":"AR-N","name":"Misiones"},"511":{"code":"AR-Q","name":"Neuqu\u00e9n"},"512":{"code":"AR-R","name":"R\u00edo Negro"},"513":{"code":"AR-A","name":"Salta"},"514":{"code":"AR-J","name":"San Juan"},"515":{"code":"AR-D","name":"San Luis"},"516":{"code":"AR-Z","name":"Santa Cruz"},"517":{"code":"AR-S","name":"Santa Fe"},"518":{"code":"AR-G","name":"Santiago del Estero"},"519":{"code":"AR-V","name":"Tierra del Fuego"},"520":{"code":"AR-T","name":"Tucum\u00e1n"}}},"AS":{"name":"American Samoa"},"AT":{"name":"Austria","regions":{"102":{"code":"BL","name":"Burgenland"},"99":{"code":"KN","name":"K\u00e4rnten"},"96":{"code":"NO","name":"Nieder\u00f6sterreich"},"97":{"code":"OO","name":"Ober\u00f6sterreich"},"98":{"code":"SB","name":"Salzburg"},"100":{"code":"ST","name":"Steiermark"},"101":{"code":"TI","name":"Tirol"},"103":{"code":"VB","name":"Voralberg"},"95":{"code":"WI","name":"Wien"}}},"AU":{"name":"Australia"},"AW":{"name":"Aruba"},"AX":{"name":"\u00c5land Islands"},"AZ":{"name":"Azerbaijan"},"BA":{"name":"Bosnia & Herzegovina"},"BB":{"name":"Barbados"},"BD":{"name":"Bangladesh"},"BE":{"name":"Belgium","regions":{"528":{"code":"VAN","name":"Antwerpen"},"529":{"code":"WBR","name":"Brabant wallon"},"530":{"code":"BRU","name":"Brussels-Capital Region"},"531":{"code":"WHT","name":"Hainaut"},"533":{"code":"WLG","name":"Li\u00e8ge"},"532":{"code":"VLI","name":"Limburg"},"534":{"code":"WLX","name":"Luxembourg"},"535":{"code":"WNA","name":"Namur"},"536":{"code":"VOV","name":"Oost-Vlaanderen"},"537":{"code":"VBR","name":"Vlaams-Brabant"},"538":{"code":"VWV","name":"West-Vlaanderen"}}},"BF":{"name":"Burkina Faso"},"BG":{"name":"Bulgaria","regions":{"548":{"code":"BG-01","name":"Blagoevgrad"},"549":{"code":"BG-02","name":"Burgas"},"555":{"code":"BG-08","name":"Dobrich"},"554":{"code":"BG-07","name":"Gabrovo"},"573":{"code":"BG-26","name":"Haskovo"},"556":{"code":"BG-09","name":"Kardzhali"},"557":{"code":"BG-10","name":"Kyustendil"},"558":{"code":"BG-11","name":"Lovech"},"559":{"code":"BG-12","name":"Montana"},"560":{"code":"BG-13","name":"Pazardzhik"},"561":{"code":"BG-14","name":"Pernik"},"562":{"code":"BG-15","name":"Pleven"},"563":{"code":"BG-16","name":"Plovdiv"},"564":{"code":"BG-17","name":"Razgrad"},"565":{"code":"BG-18","name":"Ruse"},"574":{"code":"BG-27","name":"Shumen"},"566":{"code":"BG-19","name":"Silistra"},"567":{"code":"BG-20","name":"Sliven"},"568":{"code":"BG-21","name":"Smolyan"},"569":{"code":"BG-22","name":"Sofia City"},"570":{"code":"BG-23","name":"Sofia Province"},"571":{"code":"BG-24","name":"Stara Zagora"},"572":{"code":"BG-25","name":"Targovishte"},"550":{"code":"BG-03","name":"Varna"},"551":{"code":"BG-04","name":"Veliko Tarnovo"},"552":{"code":"BG-05","name":"Vidin"},"553":{"code":"BG-06","name":"Vratsa"},"575":{"code":"BG-28","name":"Yambol"}}},"BH":{"name":"Bahrain"},"BI":{"name":"Burundi"},"BJ":{"name":"Benin"},"BL":{"name":"St. Barth\u00e9lemy"},"BM":{"name":"Bermuda"},"BN":{"name":"Brunei"},"BO":{"name":"Bolivia","regions":{"540":{"code":"BO-H","name":"Chuquisaca"},"539":{"code":"BO-C","name":"Cochabamba"},"541":{"code":"BO-B","name":"El Beni"},"542":{"code":"BO-L","name":"La Paz"},"543":{"code":"BO-O","name":"Oruro"},"544":{"code":"BO-N","name":"Pando"},"545":{"code":"BO-P","name":"Potos\u00ed"},"546":{"code":"BO-S","name":"Santa Cruz"},"547":{"code":"BO-T","name":"Tarija"}}},"BQ":{"name":"Caribbean Netherlands"},"BR":{"name":"Brazil"},"BS":{"name":"Bahamas"},"BT":{"name":"Bhutan"},"BV":{"name":"Bouvet Island"},"BW":{"name":"Botswana"},"BY":{"name":"Belarus","regions":{"521":{"code":"BY-BR","name":"Bresckaja voblas\u0107"},"522":{"code":"BY-HO","name":"Homie\u013askaja voblas\u0107"},"523":{"code":"BY-HM","name":"Horad Minsk"},"524":{"code":"BY-HR","name":"Hrodzienskaja voblas\u0107"},"525":{"code":"BY-MA","name":"Mahilio\u016dskaja voblas\u0107"},"526":{"code":"BY-MI","name":"Minskaja voblas\u0107"},"527":{"code":"BY-VI","name":"Viciebskaja voblas\u0107"}}},"BZ":{"name":"Belize"},"CA":{"name":"Canada","regions":{"66":{"code":"AB","name":"Alberta"},"67":{"code":"BC","name":"British Columbia"},"68":{"code":"MB","name":"Manitoba"},"70":{"code":"NB","name":"New Brunswick"},"69":{"code":"NL","name":"Newfoundland and Labrador"},"72":{"code":"NT","name":"Northwest Territories"},"71":{"code":"NS","name":"Nova Scotia"},"73":{"code":"NU","name":"Nunavut"},"74":{"code":"ON","name":"Ontario"},"75":{"code":"PE","name":"Prince Edward Island"},"76":{"code":"QC","name":"Quebec"},"77":{"code":"SK","name":"Saskatchewan"},"78":{"code":"YT","name":"Yukon Territory"}}},"CC":{"name":"Cocos (Keeling) Islands"},"CD":{"name":"Congo - Kinshasa"},"CF":{"name":"Central African Republic"},"CG":{"name":"Congo - Brazzaville"},"CH":{"name":"Switzerland","regions":{"104":{"code":"AG","name":"Aargau"},"106":{"code":"AR","name":"Appenzell Ausserrhoden"},"105":{"code":"AI","name":"Appenzell Innerrhoden"},"108":{"code":"BL","name":"Basel-Landschaft"},"109":{"code":"BS","name":"Basel-Stadt"},"107":{"code":"BE","name":"Bern"},"110":{"code":"FR","name":"Friburg"},"111":{"code":"GE","name":"Geneva"},"112":{"code":"GL","name":"Glarus"},"113":{"code":"GR","name":"Graub\u00fcnden"},"114":{"code":"JU","name":"Jura"},"115":{"code":"LU","name":"Lucerne"},"116":{"code":"NE","name":"Neuch\u00e2tel"},"117":{"code":"NW","name":"Nidwalden"},"118":{"code":"OW","name":"Obwalden"},"120":{"code":"SH","name":"Schaffhausen"},"122":{"code":"SZ","name":"Schwyz"},"121":{"code":"SO","name":"Solothurn"},"119":{"code":"SG","name":"St. Gallen"},"123":{"code":"TG","name":"Thurgau"},"124":{"code":"TI","name":"Ticino"},"125":{"code":"UR","name":"Uri"},"126":{"code":"VD","name":"Vaud"},"127":{"code":"VS","name":"Wallis"},"128":{"code":"ZG","name":"Zug"},"129":{"code":"ZH","name":"Z\u00fcrich"}}},"CI":{"name":"C\u00f4te d\u2019Ivoire"},"CK":{"name":"Cook Islands"},"CL":{"name":"Chile","regions":{"576":{"code":"CL-AI","name":"Ais\u00e9n del General Carlos Iba\u00f1ez del Campo"},"577":{"code":"CL-AN","name":"Antofagasta"},"578":{"code":"CL-AP","name":"Arica y Parinacota"},"580":{"code":"CL-AT","name":"Atacama"},"581":{"code":"CL-BI","name":"Biob\u00edo"},"582":{"code":"CL-CO","name":"Coquimbo"},"579":{"code":"CL-AR","name":"La Araucan\u00eda"},"583":{"code":"CL-LI","name":"Libertador General Bernardo O'Higgins"},"584":{"code":"CL-LL","name":"Los Lagos"},"585":{"code":"CL-LR","name":"Los R\u00edos"},"586":{"code":"CL-MA","name":"Magallanes"},"587":{"code":"CL-ML","name":"Maule"},"588":{"code":"CL-NB","name":"\u00d1uble"},"589":{"code":"CL-RM","name":"Regi\u00f3n Metropolitana de Santiago"},"590":{"code":"CL-TA","name":"Tarapac\u00e1"},"591":{"code":"CL-VS","name":"Valpara\u00edso"}}},"CM":{"name":"Cameroon"},"CN":{"name":"China","regions":{"592":{"code":"CN-AH","name":"Anhui Sheng"},"593":{"code":"CN-BJ","name":"Beijing Shi"},"594":{"code":"CN-CQ","name":"Chongqing Shi"},"595":{"code":"CN-FJ","name":"Fujian Sheng"},"596":{"code":"CN-GS","name":"Gansu Sheng"},"597":{"code":"CN-GD","name":"Guangdong Sheng"},"598":{"code":"CN-GX","name":"Guangxi Zhuangzu Zizhiqu"},"599":{"code":"CN-GZ","name":"Guizhou Sheng"},"600":{"code":"CN-HI","name":"Hainan Sheng"},"601":{"code":"CN-HE","name":"Hebei Sheng"},"602":{"code":"CN-HL","name":"Heilongjiang Sheng"},"603":{"code":"CN-HA","name":"Henan Sheng"},"604":{"code":"CN-HK","name":"Hong Kong SAR"},"605":{"code":"CN-HB","name":"Hubei Sheng"},"606":{"code":"CN-HN","name":"Hunan Sheng"},"607":{"code":"CN-JS","name":"Jiangsu Sheng"},"608":{"code":"CN-JX","name":"Jiangxi Sheng"},"609":{"code":"CN-JL","name":"Jilin Sheng"},"610":{"code":"CN-LN","name":"Liaoning Sheng"},"611":{"code":"CN-MO","name":"Macao SAR"},"612":{"code":"CN-NM","name":"Nei Mongol Zizhiqu"},"613":{"code":"CN-NX","name":"Ningxia Huizi Zizhiqu"},"614":{"code":"CN-QH","name":"Qinghai Sheng"},"615":{"code":"CN-SN","name":"Shaanxi Sheng"},"616":{"code":"CN-SD","name":"Shandong Sheng"},"617":{"code":"CN-SH","name":"Shanghai Shi"},"618":{"code":"CN-SX","name":"Shanxi Sheng"},"619":{"code":"CN-SC","name":"Sichuan Sheng"},"620":{"code":"CN-TW","name":"Taiwan Sheng"},"621":{"code":"CN-TJ","name":"Tianjin Shi"},"622":{"code":"CN-XJ","name":"Xinjiang Uygur Zizhiqu"},"623":{"code":"CN-XZ","name":"Xizang Zizhiqu"},"624":{"code":"CN-YN","name":"Yunnan Sheng"},"625":{"code":"CN-ZJ","name":"Zhejiang Sheng"}}},"CO":{"name":"Colombia","regions":{"626":{"code":"CO-AMA","name":"Amazonas"},"627":{"code":"CO-ANT","name":"Antioquia"},"628":{"code":"CO-ARA","name":"Arauca"},"629":{"code":"CO-ATL","name":"Atl\u00e1ntico"},"630":{"code":"CO-BOL","name":"Bol\u00edvar"},"631":{"code":"CO-BOY","name":"Boyac\u00e1"},"632":{"code":"CO-CAL","name":"Caldas"},"633":{"code":"CO-CAQ","name":"Caquet\u00e1"},"634":{"code":"CO-CAS","name":"Casanare"},"635":{"code":"CO-CAU","name":"Cauca"},"636":{"code":"CO-CES","name":"Cesar"},"637":{"code":"CO-CHO","name":"Choc\u00f3"},"638":{"code":"CO-COR","name":"C\u00f3rdoba"},"639":{"code":"CO-CUN","name":"Cundinamarca"},"640":{"code":"CO-GUA","name":"Guain\u00eda"},"641":{"code":"CO-GUV","name":"Guaviare"},"642":{"code":"CO-HUL","name":"Huila"},"643":{"code":"CO-LAG","name":"La Guajira"},"644":{"code":"CO-MAG","name":"Magdalena"},"645":{"code":"CO-MET","name":"Meta"},"646":{"code":"CO-NAR","name":"Nari\u00f1o"},"647":{"code":"CO-NSA","name":"Norte de Santander"},"648":{"code":"CO-PUT","name":"Putumayo"},"649":{"code":"CO-QUI","name":"Quind\u00edo"},"650":{"code":"CO-RIS","name":"Risaralda"},"651":{"code":"CO-SAP","name":"San Andr\u00e9s y Providencia"},"652":{"code":"CO-SAN","name":"Santander"},"653":{"code":"CO-SUC","name":"Sucre"},"654":{"code":"CO-TOL","name":"Tolima"},"655":{"code":"CO-VAC","name":"Valle del Cauca"},"656":{"code":"CO-VAU","name":"Vaup\u00e9s"},"657":{"code":"CO-VID","name":"Vichada"}}},"CR":{"name":"Costa Rica"},"CU":{"name":"Cuba"},"CV":{"name":"Cape Verde"},"CW":{"name":"Cura\u00e7ao"},"CX":{"name":"Christmas Island"},"CY":{"name":"Cyprus"},"CZ":{"name":"Czechia","regions":{"1018":{"code":"CZ-31","name":"Jiho\u010desk\u00fd kraj"},"1026":{"code":"CZ-64","name":"Jihomoravsk\u00fd kraj"},"1020":{"code":"CZ-41","name":"Karlovarsk\u00fd kraj"},"1025":{"code":"CZ-63","name":"Kraj Vyso\u010dina"},"1023":{"code":"CZ-52","name":"Kr\u00e1lov\u00e9hradeck\u00fd kraj"},"1022":{"code":"CZ-51","name":"Libereck\u00fd kraj"},"1029":{"code":"CZ-80","name":"Moravskoslezsk\u00fd kraj"},"1027":{"code":"CZ-71","name":"Olomouck\u00fd kraj"},"1024":{"code":"CZ-53","name":"Pardubick\u00fd kraj"},"1019":{"code":"CZ-32","name":"Plze\u0148sk\u00fd kraj"},"1016":{"code":"CZ-10","name":"Praha, Hlavn\u00ed m\u011bsto"},"1017":{"code":"CZ-20","name":"St\u0159edo\u010desk\u00fd kraj"},"1021":{"code":"CZ-42","name":"\u00dasteck\u00fd kraj"},"1028":{"code":"CZ-72","name":"Zl\u00ednsk\u00fd kraj"}}},"DE":{"name":"Germany","regions":{"80":{"code":"BAW","name":"Baden-W\u00fcrttemberg"},"81":{"code":"BAY","name":"Bayern"},"82":{"code":"BER","name":"Berlin"},"83":{"code":"BRG","name":"Brandenburg"},"84":{"code":"BRE","name":"Bremen"},"85":{"code":"HAM","name":"Hamburg"},"86":{"code":"HES","name":"Hessen"},"87":{"code":"MEC","name":"Mecklenburg-Vorpommern"},"79":{"code":"NDS","name":"Niedersachsen"},"88":{"code":"NRW","name":"Nordrhein-Westfalen"},"89":{"code":"RHE","name":"Rheinland-Pfalz"},"90":{"code":"SAR","name":"Saarland"},"91":{"code":"SAS","name":"Sachsen"},"92":{"code":"SAC","name":"Sachsen-Anhalt"},"93":{"code":"SCN","name":"Schleswig-Holstein"},"94":{"code":"THE","name":"Th\u00fcringen"}}},"DJ":{"name":"Djibouti"},"DK":{"name":"Denmark","regions":{"658":{"code":"DK-84","name":"Hovedstaden"},"659":{"code":"DK-82","name":"Midtjylland"},"660":{"code":"DK-81","name":"Nordjylland"},"661":{"code":"DK-85","name":"Sj\u00e6lland"},"662":{"code":"DK-83","name":"Syddanmark"}}},"DM":{"name":"Dominica"},"DO":{"name":"Dominican Republic"},"DZ":{"name":"Algeria"},"EC":{"name":"Ecuador","regions":{"663":{"code":"EC-A","name":"Azuay"},"664":{"code":"EC-B","name":"Bol\u00edvar"},"665":{"code":"EC-F","name":"Ca\u00f1ar"},"666":{"code":"EC-C","name":"Carchi"},"667":{"code":"EC-H","name":"Chimborazo"},"668":{"code":"EC-X","name":"Cotopaxi"},"669":{"code":"EC-O","name":"El Oro"},"670":{"code":"EC-E","name":"Esmeraldas"},"671":{"code":"EC-W","name":"Gal\u00e1pagos"},"672":{"code":"EC-G","name":"Guayas"},"673":{"code":"EC-I","name":"Imbabura"},"674":{"code":"EC-L","name":"Loja"},"675":{"code":"EC-R","name":"Los R\u00edos"},"676":{"code":"EC-M","name":"Manab\u00ed"},"677":{"code":"EC-S","name":"Morona Santiago"},"678":{"code":"EC-N","name":"Napo"},"679":{"code":"EC-D","name":"Orellana"},"680":{"code":"EC-Y","name":"Pastaza"},"681":{"code":"EC-P","name":"Pichincha"},"682":{"code":"EC-SE","name":"Santa Elena"},"683":{"code":"EC-SD","name":"Santo Domingo de los Ts\u00e1chilas"},"684":{"code":"EC-U","name":"Sucumb\u00edos"},"685":{"code":"EC-T","name":"Tungurahua"},"686":{"code":"EC-Z","name":"Zamora Chinchipe"}}},"EE":{"name":"Estonia","regions":{"340":{"code":"EE-37","name":"Harjumaa"},"341":{"code":"EE-39","name":"Hiiumaa"},"342":{"code":"EE-44","name":"Ida-Virumaa"},"344":{"code":"EE-51","name":"J\u00e4rvamaa"},"343":{"code":"EE-49","name":"J\u00f5gevamaa"},"346":{"code":"EE-59","name":"L\u00e4\u00e4ne-Virumaa"},"345":{"code":"EE-57","name":"L\u00e4\u00e4nemaa"},"348":{"code":"EE-67","name":"P\u00e4rnumaa"},"347":{"code":"EE-65","name":"P\u00f5lvamaa"},"349":{"code":"EE-70","name":"Raplamaa"},"350":{"code":"EE-74","name":"Saaremaa"},"351":{"code":"EE-78","name":"Tartumaa"},"352":{"code":"EE-82","name":"Valgamaa"},"353":{"code":"EE-84","name":"Viljandimaa"},"354":{"code":"EE-86","name":"V\u00f5rumaa"}}},"EG":{"name":"Egypt"},"EH":{"name":"Western Sahara"},"ER":{"name":"Eritrea"},"ES":{"name":"Spain","regions":{"130":{"code":"A Coru\u0441a","name":"A Coru\u00f1a"},"131":{"code":"Alava","name":"Alava"},"132":{"code":"Albacete","name":"Albacete"},"133":{"code":"Alicante","name":"Alicante"},"134":{"code":"Almeria","name":"Almeria"},"135":{"code":"Asturias","name":"Asturias"},"136":{"code":"Avila","name":"Avila"},"137":{"code":"Badajoz","name":"Badajoz"},"138":{"code":"Baleares","name":"Baleares"},"139":{"code":"Barcelona","name":"Barcelona"},"140":{"code":"Burgos","name":"Burgos"},"141":{"code":"Caceres","name":"Caceres"},"142":{"code":"Cadiz","name":"Cadiz"},"143":{"code":"Cantabria","name":"Cantabria"},"144":{"code":"Castellon","name":"Castellon"},"145":{"code":"Ceuta","name":"Ceuta"},"146":{"code":"Ciudad Real","name":"Ciudad Real"},"147":{"code":"Cordoba","name":"Cordoba"},"148":{"code":"Cuenca","name":"Cuenca"},"149":{"code":"Girona","name":"Girona"},"150":{"code":"Granada","name":"Granada"},"151":{"code":"Guadalajara","name":"Guadalajara"},"152":{"code":"Guipuzcoa","name":"Guipuzcoa"},"153":{"code":"Huelva","name":"Huelva"},"154":{"code":"Huesca","name":"Huesca"},"155":{"code":"Jaen","name":"Jaen"},"156":{"code":"La Rioja","name":"La Rioja"},"157":{"code":"Las Palmas","name":"Las Palmas"},"158":{"code":"Leon","name":"Leon"},"159":{"code":"Lleida","name":"Lleida"},"160":{"code":"Lugo","name":"Lugo"},"161":{"code":"Madrid","name":"Madrid"},"162":{"code":"Malaga","name":"Malaga"},"163":{"code":"Melilla","name":"Melilla"},"164":{"code":"Murcia","name":"Murcia"},"165":{"code":"Navarra","name":"Navarra"},"166":{"code":"Ourense","name":"Ourense"},"167":{"code":"Palencia","name":"Palencia"},"168":{"code":"Pontevedra","name":"Pontevedra"},"169":{"code":"Salamanca","name":"Salamanca"},"170":{"code":"Santa Cruz de Tenerife","name":"Santa Cruz de Tenerife"},"171":{"code":"Segovia","name":"Segovia"},"172":{"code":"Sevilla","name":"Sevilla"},"173":{"code":"Soria","name":"Soria"},"174":{"code":"Tarragona","name":"Tarragona"},"175":{"code":"Teruel","name":"Teruel"},"176":{"code":"Toledo","name":"Toledo"},"177":{"code":"Valencia","name":"Valencia"},"178":{"code":"Valladolid","name":"Valladolid"},"179":{"code":"Vizcaya","name":"Vizcaya"},"180":{"code":"Zamora","name":"Zamora"},"181":{"code":"Zaragoza","name":"Zaragoza"}}},"ET":{"name":"Ethiopia"},"FI":{"name":"Finland","regions":{"339":{"code":"Ahvenanmaa","name":"Ahvenanmaa"},"333":{"code":"Etel\u00e4-Karjala","name":"Etel\u00e4-Karjala"},"326":{"code":"Etel\u00e4-Pohjanmaa","name":"Etel\u00e4-Pohjanmaa"},"325":{"code":"Etel\u00e4-Savo","name":"Etel\u00e4-Savo"},"337":{"code":"It\u00e4-Uusimaa","name":"It\u00e4-Uusimaa"},"322":{"code":"Kainuu","name":"Kainuu"},"335":{"code":"Kanta-H\u00e4me","name":"Kanta-H\u00e4me"},"330":{"code":"Keski-Pohjanmaa","name":"Keski-Pohjanmaa"},"331":{"code":"Keski-Suomi","name":"Keski-Suomi"},"338":{"code":"Kymenlaakso","name":"Kymenlaakso"},"320":{"code":"Lappi","name":"Lappi"},"334":{"code":"P\u00e4ij\u00e4t-H\u00e4me","name":"P\u00e4ij\u00e4t-H\u00e4me"},"328":{"code":"Pirkanmaa","name":"Pirkanmaa"},"327":{"code":"Pohjanmaa","name":"Pohjanmaa"},"323":{"code":"Pohjois-Karjala","name":"Pohjois-Karjala"},"321":{"code":"Pohjois-Pohjanmaa","name":"Pohjois-Pohjanmaa"},"324":{"code":"Pohjois-Savo","name":"Pohjois-Savo"},"329":{"code":"Satakunta","name":"Satakunta"},"336":{"code":"Uusimaa","name":"Uusimaa"},"332":{"code":"Varsinais-Suomi","name":"Varsinais-Suomi"}}},"FJ":{"name":"Fiji"},"FK":{"name":"Falkland Islands"},"FM":{"name":"Micronesia"},"FO":{"name":"Faroe Islands"},"FR":{"name":"France","regions":{"182":{"code":"1","name":"Ain"},"183":{"code":"2","name":"Aisne"},"184":{"code":"3","name":"Allier"},"185":{"code":"4","name":"Alpes-de-Haute-Provence"},"187":{"code":"6","name":"Alpes-Maritimes"},"188":{"code":"7","name":"Ard\u00e8che"},"189":{"code":"8","name":"Ardennes"},"190":{"code":"9","name":"Ari\u00e8ge"},"191":{"code":"10","name":"Aube"},"192":{"code":"11","name":"Aude"},"193":{"code":"12","name":"Aveyron"},"249":{"code":"67","name":"Bas-Rhin"},"194":{"code":"13","name":"Bouches-du-Rh\u00f4ne"},"195":{"code":"14","name":"Calvados"},"196":{"code":"15","name":"Cantal"},"197":{"code":"16","name":"Charente"},"198":{"code":"17","name":"Charente-Maritime"},"199":{"code":"18","name":"Cher"},"200":{"code":"19","name":"Corr\u00e8ze"},"201":{"code":"2A","name":"Corse-du-Sud"},"203":{"code":"21","name":"C\u00f4te-d'Or"},"204":{"code":"22","name":"C\u00f4tes-d'Armor"},"205":{"code":"23","name":"Creuse"},"261":{"code":"79","name":"Deux-S\u00e8vres"},"206":{"code":"24","name":"Dordogne"},"207":{"code":"25","name":"Doubs"},"208":{"code":"26","name":"Dr\u00f4me"},"273":{"code":"91","name":"Essonne"},"209":{"code":"27","name":"Eure"},"210":{"code":"28","name":"Eure-et-Loir"},"211":{"code":"29","name":"Finist\u00e8re"},"212":{"code":"30","name":"Gard"},"214":{"code":"32","name":"Gers"},"215":{"code":"33","name":"Gironde"},"250":{"code":"68","name":"Haut-Rhin"},"202":{"code":"2B","name":"Haute-Corse"},"213":{"code":"31","name":"Haute-Garonne"},"225":{"code":"43","name":"Haute-Loire"},"234":{"code":"52","name":"Haute-Marne"},"252":{"code":"70","name":"Haute-Sa\u00f4ne"},"256":{"code":"74","name":"Haute-Savoie"},"269":{"code":"87","name":"Haute-Vienne"},"186":{"code":"5","name":"Hautes-Alpes"},"247":{"code":"65","name":"Hautes-Pyr\u00e9n\u00e9es"},"274":{"code":"92","name":"Hauts-de-Seine"},"216":{"code":"34","name":"H\u00e9rault"},"217":{"code":"35","name":"Ille-et-Vilaine"},"218":{"code":"36","name":"Indre"},"219":{"code":"37","name":"Indre-et-Loire"},"220":{"code":"38","name":"Is\u00e8re"},"221":{"code":"39","name":"Jura"},"222":{"code":"40","name":"Landes"},"223":{"code":"41","name":"Loir-et-Cher"},"224":{"code":"42","name":"Loire"},"226":{"code":"44","name":"Loire-Atlantique"},"227":{"code":"45","name":"Loiret"},"228":{"code":"46","name":"Lot"},"229":{"code":"47","name":"Lot-et-Garonne"},"230":{"code":"48","name":"Loz\u00e8re"},"231":{"code":"49","name":"Maine-et-Loire"},"232":{"code":"50","name":"Manche"},"233":{"code":"51","name":"Marne"},"235":{"code":"53","name":"Mayenne"},"236":{"code":"54","name":"Meurthe-et-Moselle"},"237":{"code":"55","name":"Meuse"},"238":{"code":"56","name":"Morbihan"},"239":{"code":"57","name":"Moselle"},"240":{"code":"58","name":"Ni\u00e8vre"},"241":{"code":"59","name":"Nord"},"242":{"code":"60","name":"Oise"},"243":{"code":"61","name":"Orne"},"257":{"code":"75","name":"Paris"},"244":{"code":"62","name":"Pas-de-Calais"},"245":{"code":"63","name":"Puy-de-D\u00f4me"},"246":{"code":"64","name":"Pyr\u00e9n\u00e9es-Atlantiques"},"248":{"code":"66","name":"Pyr\u00e9n\u00e9es-Orientales"},"251":{"code":"69","name":"Rh\u00f4ne"},"253":{"code":"71","name":"Sa\u00f4ne-et-Loire"},"254":{"code":"72","name":"Sarthe"},"255":{"code":"73","name":"Savoie"},"259":{"code":"77","name":"Seine-et-Marne"},"258":{"code":"76","name":"Seine-Maritime"},"275":{"code":"93","name":"Seine-Saint-Denis"},"262":{"code":"80","name":"Somme"},"263":{"code":"81","name":"Tarn"},"264":{"code":"82","name":"Tarn-et-Garonne"},"272":{"code":"90","name":"Territoire-de-Belfort"},"277":{"code":"95","name":"Val-d'Oise"},"276":{"code":"94","name":"Val-de-Marne"},"265":{"code":"83","name":"Var"},"266":{"code":"84","name":"Vaucluse"},"267":{"code":"85","name":"Vend\u00e9e"},"268":{"code":"86","name":"Vienne"},"270":{"code":"88","name":"Vosges"},"271":{"code":"89","name":"Yonne"},"260":{"code":"78","name":"Yvelines"}}},"GA":{"name":"Gabon"},"GB":{"name":"United Kingdom"},"GD":{"name":"Grenada"},"GE":{"name":"Georgia"},"GF":{"name":"French Guiana"},"GG":{"name":"Guernsey"},"GH":{"name":"Ghana"},"GI":{"name":"Gibraltar"},"GL":{"name":"Greenland"},"GM":{"name":"Gambia"},"GN":{"name":"Guinea"},"GP":{"name":"Guadeloupe"},"GQ":{"name":"Equatorial Guinea"},"GR":{"name":"Greece","regions":{"700":{"code":"GR-69","name":"\u00c1gion \u00d3ros"},"687":{"code":"GR-A","name":"Anatolik\u00ed Makedon\u00eda kai Thr\u00e1ki"},"688":{"code":"GR-I","name":"Attik\u00ed"},"689":{"code":"GR-G","name":"Dytik\u00ed Ell\u00e1da"},"690":{"code":"GR-C","name":"Dytik\u00ed Makedon\u00eda"},"691":{"code":"GR-F","name":"Ion\u00eda N\u00edsia"},"692":{"code":"GR-D","name":"\u00cdpeiros"},"693":{"code":"GR-B","name":"Kentrik\u00ed Makedon\u00eda"},"694":{"code":"GR-M","name":"Kr\u00edti"},"695":{"code":"GR-L","name":"N\u00f3tio Aiga\u00edo"},"696":{"code":"GR-J","name":"Pelop\u00f3nnisos"},"697":{"code":"GR-H","name":"Stere\u00e1 Ell\u00e1da"},"698":{"code":"GR-E","name":"Thessal\u00eda"},"699":{"code":"GR-K","name":"V\u00f3reio Aiga\u00edo"}}},"GS":{"name":"South Georgia & South Sandwich Islands"},"GT":{"name":"Guatemala"},"GU":{"name":"Guam"},"GW":{"name":"Guinea-Bissau"},"GY":{"name":"Guyana","regions":{"701":{"code":"GY-BA","name":"Barima-Waini"},"702":{"code":"GY-CU","name":"Cuyuni-Mazaruni"},"703":{"code":"GY-DE","name":"Demerara-Mahaica"},"704":{"code":"GY-EB","name":"East Berbice-Corentyne"},"705":{"code":"GY-ES","name":"Essequibo Islands-West Demerara"},"706":{"code":"GY-MA","name":"Mahaica-Berbice"},"707":{"code":"GY-PM","name":"Pomeroon-Supenaam"},"708":{"code":"GY-PT","name":"Potaro-Siparuni"},"709":{"code":"GY-UD","name":"Upper Demerara-Berbice"},"710":{"code":"GY-UT","name":"Upper Takutu-Upper Essequibo"}}},"HK":{"name":"Hong Kong SAR China"},"HM":{"name":"Heard & McDonald Islands"},"HN":{"name":"Honduras"},"HR":{"name":"Croatia"},"HT":{"name":"Haiti"},"HU":{"name":"Hungary"},"ID":{"name":"Indonesia"},"IE":{"name":"Ireland"},"IL":{"name":"Israel"},"IM":{"name":"Isle of Man"},"IN":{"name":"India"},"IO":{"name":"British Indian Ocean Territory"},"IQ":{"name":"Iraq"},"IR":{"name":"Iran"},"IS":{"name":"Iceland","regions":{"717":{"code":"IS-07","name":"Austurland"},"711":{"code":"IS-01","name":"H\u00f6fu\u00f0borgarsv\u00e6\u00f0i"},"716":{"code":"IS-06","name":"Nor\u00f0urland eystra"},"715":{"code":"IS-05","name":"Nor\u00f0urland vestra"},"718":{"code":"IS-08","name":"Su\u00f0urland"},"712":{"code":"IS-02","name":"Su\u00f0urnes"},"714":{"code":"IS-04","name":"Vestfir\u00f0ir"},"713":{"code":"IS-03","name":"Vesturland"}}},"IT":{"name":"Italy","regions":{"719":{"code":"AG","name":"Agrigento"},"720":{"code":"AL","name":"Alessandria"},"721":{"code":"AN","name":"Ancona"},"722":{"code":"AO","name":"Aosta"},"724":{"code":"AR","name":"Arezzo"},"725":{"code":"AP","name":"Ascoli-Piceno"},"726":{"code":"AT","name":"Asti"},"727":{"code":"AV","name":"Avellino"},"728":{"code":"BA","name":"Bari"},"729":{"code":"BT","name":"Barletta-Andria-Trani"},"730":{"code":"BL","name":"Belluno"},"731":{"code":"BN","name":"Benevento"},"732":{"code":"BG","name":"Bergamo"},"733":{"code":"BI","name":"Biella"},"734":{"code":"BO","name":"Bologna"},"735":{"code":"BZ","name":"Bolzano"},"736":{"code":"BS","name":"Brescia"},"737":{"code":"BR","name":"Brindisi"},"738":{"code":"CA","name":"Cagliari"},"739":{"code":"CL","name":"Caltanissetta"},"740":{"code":"CB","name":"Campobasso"},"741":{"code":"CI","name":"Carbonia Iglesias"},"742":{"code":"CE","name":"Caserta"},"743":{"code":"CT","name":"Catania"},"744":{"code":"CZ","name":"Catanzaro"},"745":{"code":"CH","name":"Chieti"},"746":{"code":"CO","name":"Como"},"747":{"code":"CS","name":"Cosenza"},"748":{"code":"CR","name":"Cremona"},"749":{"code":"KR","name":"Crotone"},"750":{"code":"CN","name":"Cuneo"},"751":{"code":"EN","name":"Enna"},"752":{"code":"FM","name":"Fermo"},"753":{"code":"FE","name":"Ferrara"},"754":{"code":"FI","name":"Firenze"},"755":{"code":"FG","name":"Foggia"},"756":{"code":"FC","name":"Forli-Cesena"},"757":{"code":"FR","name":"Frosinone"},"758":{"code":"GE","name":"Genova"},"759":{"code":"GO","name":"Gorizia"},"760":{"code":"GR","name":"Grosseto"},"761":{"code":"IM","name":"Imperia"},"762":{"code":"IS","name":"Isernia"},"723":{"code":"AQ","name":"L'Aquila"},"763":{"code":"SP","name":"La-Spezia"},"764":{"code":"LT","name":"Latina"},"765":{"code":"LE","name":"Lecce"},"766":{"code":"LC","name":"Lecco"},"767":{"code":"LI","name":"Livorno"},"768":{"code":"LO","name":"Lodi"},"769":{"code":"LU","name":"Lucca"},"770":{"code":"MC","name":"Macerata"},"771":{"code":"MN","name":"Mantova"},"772":{"code":"MS","name":"Massa-Carrara"},"773":{"code":"MT","name":"Matera"},"774":{"code":"VS","name":"Medio Campidano"},"775":{"code":"ME","name":"Messina"},"776":{"code":"MI","name":"Milano"},"777":{"code":"MO","name":"Modena"},"778":{"code":"MB","name":"Monza-Brianza"},"779":{"code":"NA","name":"Napoli"},"780":{"code":"NO","name":"Novara"},"781":{"code":"NU","name":"Nuoro"},"782":{"code":"OG","name":"Ogliastra"},"783":{"code":"OT","name":"Olbia Tempio"},"784":{"code":"OR","name":"Oristano"},"785":{"code":"PD","name":"Padova"},"786":{"code":"PA","name":"Palermo"},"787":{"code":"PR","name":"Parma"},"788":{"code":"PV","name":"Pavia"},"789":{"code":"PG","name":"Perugia"},"790":{"code":"PU","name":"Pesaro-Urbino"},"791":{"code":"PE","name":"Pescara"},"792":{"code":"PC","name":"Piacenza"},"793":{"code":"PI","name":"Pisa"},"794":{"code":"PT","name":"Pistoia"},"795":{"code":"PN","name":"Pordenone"},"796":{"code":"PZ","name":"Potenza"},"797":{"code":"PO","name":"Prato"},"798":{"code":"RG","name":"Ragusa"},"799":{"code":"RA","name":"Ravenna"},"800":{"code":"RC","name":"Reggio-Calabria"},"801":{"code":"RE","name":"Reggio-Emilia"},"802":{"code":"RI","name":"Rieti"},"803":{"code":"RN","name":"Rimini"},"804":{"code":"RM","name":"Roma"},"805":{"code":"RO","name":"Rovigo"},"806":{"code":"SA","name":"Salerno"},"807":{"code":"SS","name":"Sassari"},"808":{"code":"SV","name":"Savona"},"809":{"code":"SI","name":"Siena"},"810":{"code":"SR","name":"Siracusa"},"811":{"code":"SO","name":"Sondrio"},"812":{"code":"TA","name":"Taranto"},"813":{"code":"TE","name":"Teramo"},"814":{"code":"TR","name":"Terni"},"815":{"code":"TO","name":"Torino"},"816":{"code":"TP","name":"Trapani"},"817":{"code":"TN","name":"Trento"},"818":{"code":"TV","name":"Treviso"},"819":{"code":"TS","name":"Trieste"},"820":{"code":"UD","name":"Udine"},"821":{"code":"VA","name":"Varese"},"822":{"code":"VE","name":"Venezia"},"823":{"code":"VB","name":"Verbania"},"824":{"code":"VC","name":"Vercelli"},"825":{"code":"VR","name":"Verona"},"826":{"code":"VV","name":"Vibo-Valentia"},"827":{"code":"VI","name":"Vicenza"},"828":{"code":"VT","name":"Viterbo"}}},"JE":{"name":"Jersey"},"JM":{"name":"Jamaica"},"JO":{"name":"Jordan"},"JP":{"name":"Japan"},"KE":{"name":"Kenya"},"KG":{"name":"Kyrgyzstan"},"KH":{"name":"Cambodia"},"KI":{"name":"Kiribati"},"KM":{"name":"Comoros"},"KN":{"name":"St. Kitts & Nevis"},"KP":{"name":"North Korea"},"KR":{"name":"South Korea"},"KW":{"name":"Kuwait"},"KY":{"name":"Cayman Islands"},"KZ":{"name":"Kazakhstan"},"LA":{"name":"Laos"},"LB":{"name":"Lebanon"},"LC":{"name":"St. Lucia"},"LI":{"name":"Liechtenstein"},"LK":{"name":"Sri Lanka"},"LR":{"name":"Liberia"},"LS":{"name":"Lesotho"},"LT":{"name":"Lithuania","regions":{"475":{"code":"LT-AL","name":"Alytaus Apskritis"},"476":{"code":"LT-KU","name":"Kauno Apskritis"},"477":{"code":"LT-KL","name":"Klaip\u0117dos Apskritis"},"478":{"code":"LT-MR","name":"Marijampol\u0117s Apskritis"},"479":{"code":"LT-PN","name":"Panev\u0117\u017eio Apskritis"},"480":{"code":"LT-SA","name":"\u0160iauli\u0173 Apskritis"},"481":{"code":"LT-TA","name":"Taurag\u0117s Apskritis"},"482":{"code":"LT-TE","name":"Tel\u0161i\u0173 Apskritis"},"483":{"code":"LT-UT","name":"Utenos Apskritis"},"484":{"code":"LT-VL","name":"Vilniaus Apskritis"}}},"LU":{"name":"Luxembourg"},"LV":{"name":"Latvia","regions":{"471":{"code":"\u0100da\u017eu novads","name":"\u0100da\u017eu novads"},"366":{"code":"Aglonas novads","name":"Aglonas novads"},"367":{"code":"LV-AI","name":"Aizkraukles novads"},"368":{"code":"Aizputes novads","name":"Aizputes novads"},"369":{"code":"Akn\u012bstes novads","name":"Akn\u012bstes novads"},"370":{"code":"Alojas novads","name":"Alojas novads"},"371":{"code":"Alsungas novads","name":"Alsungas novads"},"372":{"code":"LV-AL","name":"Al\u016bksnes novads"},"373":{"code":"Amatas novads","name":"Amatas novads"},"374":{"code":"Apes novads","name":"Apes novads"},"375":{"code":"Auces novads","name":"Auces novads"},"376":{"code":"Bab\u012btes novads","name":"Bab\u012btes novads"},"377":{"code":"Baldones novads","name":"Baldones novads"},"378":{"code":"Baltinavas novads","name":"Baltinavas novads"},"379":{"code":"LV-BL","name":"Balvu novads"},"380":{"code":"LV-BU","name":"Bauskas novads"},"381":{"code":"Bever\u012bnas novads","name":"Bever\u012bnas novads"},"382":{"code":"Broc\u0113nu novads","name":"Broc\u0113nu novads"},"383":{"code":"Burtnieku novads","name":"Burtnieku novads"},"384":{"code":"Carnikavas novads","name":"Carnikavas novads"},"387":{"code":"LV-CE","name":"C\u0113su novads"},"385":{"code":"Cesvaines novads","name":"Cesvaines novads"},"386":{"code":"Ciblas novads","name":"Ciblas novads"},"388":{"code":"Dagdas novads","name":"Dagdas novads"},"355":{"code":"LV-DGV","name":"Daugavpils"},"389":{"code":"LV-DA","name":"Daugavpils novads"},"390":{"code":"LV-DO","name":"Dobeles novads"},"391":{"code":"Dundagas novads","name":"Dundagas novads"},"392":{"code":"Durbes novads","name":"Durbes novads"},"393":{"code":"Engures novads","name":"Engures novads"},"472":{"code":"\u0112rg\u013cu novads","name":"\u0112rg\u013cu novads"},"394":{"code":"Garkalnes novads","name":"Garkalnes novads"},"395":{"code":"Grobi\u0146as novads","name":"Grobi\u0146as novads"},"396":{"code":"LV-GU","name":"Gulbenes novads"},"397":{"code":"Iecavas novads","name":"Iecavas novads"},"398":{"code":"Ik\u0161\u0137iles novads","name":"Ik\u0161\u0137iles novads"},"399":{"code":"Il\u016bkstes novads","name":"Il\u016bkstes novads"},"400":{"code":"In\u010dukalna novads","name":"In\u010dukalna novads"},"401":{"code":"Jaunjelgavas novads","name":"Jaunjelgavas novads"},"402":{"code":"Jaunpiebalgas novads","name":"Jaunpiebalgas novads"},"403":{"code":"Jaunpils novads","name":"Jaunpils novads"},"357":{"code":"J\u0113kabpils","name":"J\u0113kabpils"},"405":{"code":"LV-JK","name":"J\u0113kabpils novads"},"356":{"code":"LV-JEL","name":"Jelgava"},"404":{"code":"LV-JL","name":"Jelgavas novads"},"358":{"code":"LV-JUR","name":"J\u016brmala"},"406":{"code":"Kandavas novads","name":"Kandavas novads"},"412":{"code":"K\u0101rsavas novads","name":"K\u0101rsavas novads"},"473":{"code":"\u0136eguma novads","name":"\u0136eguma novads"},"474":{"code":"\u0136ekavas novads","name":"\u0136ekavas novads"},"407":{"code":"Kokneses novads","name":"Kokneses novads"},"410":{"code":"LV-KR","name":"Kr\u0101slavas novads"},"408":{"code":"Krimuldas novads","name":"Krimuldas novads"},"409":{"code":"Krustpils novads","name":"Krustpils novads"},"411":{"code":"LV-KU","name":"Kuld\u012bgas novads"},"413":{"code":"Lielv\u0101rdes novads","name":"Lielv\u0101rdes novads"},"359":{"code":"LV-LPX","name":"Liep\u0101ja"},"360":{"code":"LV-LE","name":"Liep\u0101jas novads"},"417":{"code":"L\u012bgatnes novads","name":"L\u012bgatnes novads"},"414":{"code":"LV-LM","name":"Limba\u017eu novads"},"418":{"code":"L\u012bv\u0101nu novads","name":"L\u012bv\u0101nu novads"},"415":{"code":"Lub\u0101nas novads","name":"Lub\u0101nas novads"},"416":{"code":"LV-LU","name":"Ludzas novads"},"419":{"code":"LV-MA","name":"Madonas novads"},"421":{"code":"M\u0101lpils novads","name":"M\u0101lpils novads"},"422":{"code":"M\u0101rupes novads","name":"M\u0101rupes novads"},"420":{"code":"Mazsalacas novads","name":"Mazsalacas novads"},"423":{"code":"Nauk\u0161\u0113nu novads","name":"Nauk\u0161\u0113nu novads"},"424":{"code":"Neretas novads","name":"Neretas novads"},"425":{"code":"N\u012bcas novads","name":"N\u012bcas novads"},"426":{"code":"LV-OG","name":"Ogres novads"},"427":{"code":"Olaines novads","name":"Olaines novads"},"428":{"code":"Ozolnieku novads","name":"Ozolnieku novads"},"432":{"code":"P\u0101rgaujas novads","name":"P\u0101rgaujas novads"},"433":{"code":"P\u0101vilostas novads","name":"P\u0101vilostas novads"},"434":{"code":"P\u013cavi\u0146u novads","name":"P\u013cavi\u0146u novads"},"429":{"code":"LV-PR","name":"Prei\u013cu novads"},"430":{"code":"Priekules novads","name":"Priekules novads"},"431":{"code":"Prieku\u013cu novads","name":"Prieku\u013cu novads"},"435":{"code":"Raunas novads","name":"Raunas novads"},"361":{"code":"LV-REZ","name":"R\u0113zekne"},"442":{"code":"LV-RE","name":"R\u0113zeknes novads"},"436":{"code":"Riebi\u0146u novads","name":"Riebi\u0146u novads"},"362":{"code":"LV-RIX","name":"R\u012bga"},"363":{"code":"LV-RI","name":"R\u012bgas novads"},"437":{"code":"Rojas novads","name":"Rojas novads"},"438":{"code":"Ropa\u017eu novads","name":"Ropa\u017eu novads"},"439":{"code":"Rucavas novads","name":"Rucavas novads"},"440":{"code":"Rug\u0101ju novads","name":"Rug\u0101ju novads"},"443":{"code":"R\u016bjienas novads","name":"R\u016bjienas novads"},"441":{"code":"Rund\u0101les novads","name":"Rund\u0101les novads"},"444":{"code":"Salacgr\u012bvas novads","name":"Salacgr\u012bvas novads"},"445":{"code":"Salas novads","name":"Salas novads"},"446":{"code":"Salaspils novads","name":"Salaspils novads"},"447":{"code":"LV-SA","name":"Saldus novads"},"448":{"code":"Saulkrastu novads","name":"Saulkrastu novads"},"455":{"code":"S\u0113jas novads","name":"S\u0113jas novads"},"449":{"code":"Siguldas novads","name":"Siguldas novads"},"451":{"code":"Skr\u012bveru novads","name":"Skr\u012bveru novads"},"450":{"code":"Skrundas novads","name":"Skrundas novads"},"452":{"code":"Smiltenes novads","name":"Smiltenes novads"},"453":{"code":"Stopi\u0146u novads","name":"Stopi\u0146u novads"},"454":{"code":"Stren\u010du novads","name":"Stren\u010du novads"},"456":{"code":"LV-TA","name":"Talsu novads"},"458":{"code":"T\u0113rvetes novads","name":"T\u0113rvetes novads"},"457":{"code":"LV-TU","name":"Tukuma novads"},"459":{"code":"Vai\u0146odes novads","name":"Vai\u0146odes novads"},"460":{"code":"LV-VK","name":"Valkas novads"},"364":{"code":"Valmiera","name":"Valmiera"},"461":{"code":"LV-VM","name":"Valmieras novads"},"462":{"code":"Varak\u013c\u0101nu novads","name":"Varak\u013c\u0101nu novads"},"469":{"code":"V\u0101rkavas novads","name":"V\u0101rkavas novads"},"463":{"code":"Vecpiebalgas novads","name":"Vecpiebalgas novads"},"464":{"code":"Vecumnieku novads","name":"Vecumnieku novads"},"365":{"code":"LV-VEN","name":"Ventspils"},"465":{"code":"LV-VE","name":"Ventspils novads"},"466":{"code":"Vies\u012btes novads","name":"Vies\u012btes novads"},"467":{"code":"Vi\u013cakas novads","name":"Vi\u013cakas novads"},"468":{"code":"Vi\u013c\u0101nu novads","name":"Vi\u013c\u0101nu novads"},"470":{"code":"Zilupes novads","name":"Zilupes novads"}}},"LY":{"name":"Libya"},"MA":{"name":"Morocco"},"MC":{"name":"Monaco"},"MD":{"name":"Moldova"},"ME":{"name":"Montenegro"},"MF":{"name":"St. Martin"},"MG":{"name":"Madagascar"},"MH":{"name":"Marshall Islands"},"MK":{"name":"North Macedonia"},"ML":{"name":"Mali"},"MM":{"name":"Myanmar (Burma)"},"MN":{"name":"Mongolia"},"MO":{"name":"Macao SAR China"},"MP":{"name":"Northern Mariana Islands"},"MQ":{"name":"Martinique"},"MR":{"name":"Mauritania"},"MS":{"name":"Montserrat"},"MT":{"name":"Malta"},"MU":{"name":"Mauritius"},"MV":{"name":"Maldives"},"MW":{"name":"Malawi"},"MX":{"name":"Mexico","regions":{"829":{"code":"AGU","name":"Aguascalientes"},"830":{"code":"BCN","name":"Baja California"},"831":{"code":"BCS","name":"Baja California Sur"},"832":{"code":"CAM","name":"Campeche"},"833":{"code":"CHP","name":"Chiapas"},"834":{"code":"CHH","name":"Chihuahua"},"835":{"code":"CMX","name":"Ciudad de M\u00e9xico"},"836":{"code":"COA","name":"Coahuila"},"837":{"code":"COL","name":"Colima"},"838":{"code":"DUR","name":"Durango"},"839":{"code":"MEX","name":"Estado de M\u00e9xico"},"840":{"code":"GUA","name":"Guanajuato"},"841":{"code":"GRO","name":"Guerrero"},"842":{"code":"HID","name":"Hidalgo"},"843":{"code":"JAL","name":"Jalisco"},"844":{"code":"MIC","name":"Michoac\u00e1n"},"845":{"code":"MOR","name":"Morelos"},"846":{"code":"NAY","name":"Nayarit"},"847":{"code":"NLE","name":"Nuevo Le\u00f3n"},"848":{"code":"OAX","name":"Oaxaca"},"849":{"code":"PUE","name":"Puebla"},"850":{"code":"QUE","name":"Quer\u00e9taro"},"851":{"code":"ROO","name":"Quintana Roo"},"852":{"code":"SLP","name":"San Luis Potos\u00ed"},"853":{"code":"SIN","name":"Sinaloa"},"854":{"code":"SON","name":"Sonora"},"855":{"code":"TAB","name":"Tabasco"},"856":{"code":"TAM","name":"Tamaulipas"},"857":{"code":"TLA","name":"Tlaxcala"},"858":{"code":"VER","name":"Veracruz"},"859":{"code":"YUC","name":"Yucat\u00e1n"},"860":{"code":"ZAC","name":"Zacatecas"}}},"MY":{"name":"Malaysia"},"MZ":{"name":"Mozambique"},"NA":{"name":"Namibia"},"NC":{"name":"New Caledonia"},"NE":{"name":"Niger"},"NF":{"name":"Norfolk Island"},"NG":{"name":"Nigeria"},"NI":{"name":"Nicaragua"},"NL":{"name":"Netherlands"},"NO":{"name":"Norway"},"NP":{"name":"Nepal"},"NR":{"name":"Nauru"},"NU":{"name":"Niue"},"NZ":{"name":"New Zealand"},"OM":{"name":"Oman"},"PA":{"name":"Panama"},"PE":{"name":"Peru","regions":{"880":{"code":"PE-AMA","name":"Amazonas"},"881":{"code":"PE-ANC","name":"Ancash"},"882":{"code":"PE-APU","name":"Apur\u00edmac"},"883":{"code":"PE-ARE","name":"Arequipa"},"884":{"code":"PE-AYA","name":"Ayacucho"},"885":{"code":"PE-CAJ","name":"Cajamarca"},"886":{"code":"PE-CUS","name":"Cusco"},"887":{"code":"PE-CAL","name":"El Callao"},"888":{"code":"PE-HUV","name":"Huancavelica"},"889":{"code":"PE-HUC","name":"Hu\u00e1nuco"},"890":{"code":"PE-ICA","name":"Ica"},"891":{"code":"PE-JUN","name":"Jun\u00edn"},"892":{"code":"PE-LAL","name":"La Libertad"},"893":{"code":"PE-LAM","name":"Lambayeque"},"894":{"code":"PE-LIM","name":"Lima"},"895":{"code":"PE-LOR","name":"Loreto"},"896":{"code":"PE-MDD","name":"Madre de Dios"},"897":{"code":"PE-MOQ","name":"Moquegua"},"879":{"code":"PE-LMA","name":"Municipalidad Metropolitana de Lima"},"898":{"code":"PE-PAS","name":"Pasco"},"899":{"code":"PE-PIU","name":"Piura"},"900":{"code":"PE-PUN","name":"Puno"},"901":{"code":"PE-SAM","name":"San Mart\u00edn"},"902":{"code":"PE-TAC","name":"Tacna"},"903":{"code":"PE-TUM","name":"Tumbes"},"904":{"code":"PE-UCA","name":"Ucayali"}}},"PF":{"name":"French Polynesia"},"PG":{"name":"Papua New Guinea"},"PH":{"name":"Philippines"},"PK":{"name":"Pakistan"},"PL":{"name":"Poland","regions":{"905":{"code":"PL-02","name":"dolno\u015bl\u0105skie"},"906":{"code":"PL-04","name":"kujawsko-pomorskie"},"907":{"code":"PL-06","name":"lubelskie"},"908":{"code":"PL-08","name":"lubuskie"},"911":{"code":"PL-14","name":"mazowieckie"},"910":{"code":"PL-12","name":"ma\u0142opolskie"},"912":{"code":"PL-16","name":"opolskie"},"913":{"code":"PL-18","name":"podkarpackie"},"914":{"code":"PL-20","name":"podlaskie"},"915":{"code":"PL-22","name":"pomorskie"},"916":{"code":"PL-24","name":"\u015bl\u0105skie"},"917":{"code":"PL-26","name":"\u015bwi\u0119tokrzyskie"},"918":{"code":"PL-28","name":"warmi\u0144sko-mazurskie"},"919":{"code":"PL-30","name":"wielkopolskie"},"920":{"code":"PL-32","name":"zachodniopomorskie"},"909":{"code":"PL-10","name":"\u0142\u00f3dzkie"}}},"PM":{"name":"St. Pierre & Miquelon"},"PN":{"name":"Pitcairn Islands"},"PR":{"name":"Puerto Rico"},"PS":{"name":"Palestinian Territories"},"PT":{"name":"Portugal","regions":{"921":{"code":"PT-01","name":"Aveiro"},"922":{"code":"PT-02","name":"Beja"},"923":{"code":"PT-03","name":"Braga"},"924":{"code":"PT-04","name":"Bragan\u00e7a"},"925":{"code":"PT-05","name":"Castelo Branco"},"926":{"code":"PT-06","name":"Coimbra"},"927":{"code":"PT-07","name":"\u00c9vora"},"928":{"code":"PT-08","name":"Faro"},"929":{"code":"PT-09","name":"Guarda"},"930":{"code":"PT-10","name":"Leiria"},"931":{"code":"PT-11","name":"Lisboa"},"932":{"code":"PT-12","name":"Portalegre"},"933":{"code":"PT-13","name":"Porto"},"940":{"code":"PT-30","name":"Regi\u00e3o Aut\u00f3noma da Madeira"},"939":{"code":"PT-20","name":"Regi\u00e3o Aut\u00f3noma dos A\u00e7ores"},"934":{"code":"PT-14","name":"Santar\u00e9m"},"935":{"code":"PT-15","name":"Set\u00fabal"},"936":{"code":"PT-16","name":"Viana do Castelo"},"937":{"code":"PT-17","name":"Vila Real"},"938":{"code":"PT-18","name":"Viseu"}}},"PW":{"name":"Palau"},"PY":{"name":"Paraguay","regions":{"862":{"code":"PY-16","name":"Alto Paraguay"},"863":{"code":"PY-10","name":"Alto Paran\u00e1"},"864":{"code":"PY-13","name":"Amambay"},"861":{"code":"PY-ASU","name":"Asunci\u00f3n"},"865":{"code":"PY-19","name":"Boquer\u00f3n"},"866":{"code":"PY-5","name":"Caaguaz\u00fa"},"867":{"code":"PY-6","name":"Caazap\u00e1"},"868":{"code":"PY-14","name":"Canindey\u00fa"},"869":{"code":"PY-11","name":"Central"},"870":{"code":"PY-1","name":"Concepci\u00f3n"},"871":{"code":"PY-3","name":"Cordillera"},"872":{"code":"PY-4","name":"Guair\u00e1"},"873":{"code":"PY-7","name":"Itap\u00faa"},"874":{"code":"PY-8","name":"Misiones"},"875":{"code":"PY-12","name":"\u00d1eembuc\u00fa"},"876":{"code":"PY-9","name":"Paraguar\u00ed"},"877":{"code":"PY-15","name":"Presidente Hayes"},"878":{"code":"PY-2","name":"San Pedro"}}},"QA":{"name":"Qatar"},"RE":{"name":"R\u00e9union"},"RO":{"name":"Romania","regions":{"278":{"code":"AB","name":"Alba"},"279":{"code":"AR","name":"Arad"},"280":{"code":"AG","name":"Arge\u015f"},"281":{"code":"BC","name":"Bac\u0103u"},"282":{"code":"BH","name":"Bihor"},"283":{"code":"BN","name":"Bistri\u0163a-N\u0103s\u0103ud"},"284":{"code":"BT","name":"Boto\u015fani"},"286":{"code":"BR","name":"Br\u0103ila"},"285":{"code":"BV","name":"Bra\u015fov"},"287":{"code":"B","name":"Bucure\u015fti"},"288":{"code":"BZ","name":"Buz\u0103u"},"290":{"code":"CL","name":"C\u0103l\u0103ra\u015fi"},"289":{"code":"CS","name":"Cara\u015f-Severin"},"291":{"code":"CJ","name":"Cluj"},"292":{"code":"CT","name":"Constan\u0163a"},"293":{"code":"CV","name":"Covasna"},"294":{"code":"DB","name":"D\u00e2mbovi\u0163a"},"295":{"code":"DJ","name":"Dolj"},"296":{"code":"GL","name":"Gala\u0163i"},"297":{"code":"GR","name":"Giurgiu"},"298":{"code":"GJ","name":"Gorj"},"299":{"code":"HR","name":"Harghita"},"300":{"code":"HD","name":"Hunedoara"},"301":{"code":"IL","name":"Ialomi\u0163a"},"302":{"code":"IS","name":"Ia\u015fi"},"303":{"code":"IF","name":"Ilfov"},"304":{"code":"MM","name":"Maramure\u015f"},"305":{"code":"MH","name":"Mehedin\u0163i"},"306":{"code":"MS","name":"Mure\u015f"},"307":{"code":"NT","name":"Neam\u0163"},"308":{"code":"OT","name":"Olt"},"309":{"code":"PH","name":"Prahova"},"311":{"code":"SJ","name":"S\u0103laj"},"310":{"code":"SM","name":"Satu-Mare"},"312":{"code":"SB","name":"Sibiu"},"313":{"code":"SV","name":"Suceava"},"314":{"code":"TR","name":"Teleorman"},"315":{"code":"TM","name":"Timi\u015f"},"316":{"code":"TL","name":"Tulcea"},"318":{"code":"VL","name":"V\u00e2lcea"},"317":{"code":"VS","name":"Vaslui"},"319":{"code":"VN","name":"Vrancea"}}},"RS":{"name":"Serbia"},"RU":{"name":"Russia"},"RW":{"name":"Rwanda"},"SA":{"name":"Saudi Arabia"},"SB":{"name":"Solomon Islands"},"SC":{"name":"Seychelles"},"SD":{"name":"Sudan"},"SE":{"name":"Sweden","regions":{"951":{"code":"SE-K","name":"Blekinge l\u00e4n"},"952":{"code":"SE-W","name":"Dalarnas l\u00e4n"},"954":{"code":"SE-X","name":"G\u00e4vleborgs l\u00e4n"},"953":{"code":"SE-I","name":"Gotlands l\u00e4n"},"955":{"code":"SE-N","name":"Hallands l\u00e4n"},"956":{"code":"SE-Z","name":"J\u00e4mtlands l\u00e4n"},"957":{"code":"SE-F","name":"J\u00f6nk\u00f6pings l\u00e4n"},"958":{"code":"SE-H","name":"Kalmar l\u00e4n"},"959":{"code":"SE-G","name":"Kronobergs l\u00e4n"},"960":{"code":"SE-BD","name":"Norrbottens l\u00e4n"},"970":{"code":"SE-T","name":"\u00d6rebro l\u00e4n"},"971":{"code":"SE-E","name":"\u00d6sterg\u00f6tlands l\u00e4n"},"961":{"code":"SE-M","name":"Sk\u00e5ne l\u00e4n"},"963":{"code":"SE-D","name":"S\u00f6dermanlands l\u00e4n"},"962":{"code":"SE-AB","name":"Stockholms l\u00e4n"},"964":{"code":"SE-C","name":"Uppsala l\u00e4n"},"965":{"code":"SE-S","name":"V\u00e4rmlands l\u00e4n"},"966":{"code":"SE-AC","name":"V\u00e4sterbottens l\u00e4n"},"967":{"code":"SE-Y","name":"V\u00e4sternorrlands l\u00e4n"},"968":{"code":"SE-U","name":"V\u00e4stmanlands l\u00e4n"},"969":{"code":"SE-O","name":"V\u00e4stra G\u00f6talands l\u00e4n"}}},"SG":{"name":"Singapore"},"SH":{"name":"St. Helena"},"SI":{"name":"Slovenia"},"SJ":{"name":"Svalbard & Jan Mayen"},"SK":{"name":"Slovakia"},"SL":{"name":"Sierra Leone"},"SM":{"name":"San Marino"},"SN":{"name":"Senegal"},"SO":{"name":"Somalia"},"SR":{"name":"Suriname","regions":{"941":{"code":"SR-BR","name":"Brokopondo"},"942":{"code":"SR-CM","name":"Commewijne"},"943":{"code":"SR-CR","name":"Coronie"},"944":{"code":"SR-MA","name":"Marowijne"},"945":{"code":"SR-NI","name":"Nickerie"},"946":{"code":"SR-PR","name":"Para"},"947":{"code":"SR-PM","name":"Paramaribo"},"948":{"code":"SR-SA","name":"Saramacca"},"949":{"code":"SR-SI","name":"Sipaliwini"},"950":{"code":"SR-WA","name":"Wanica"}}},"ST":{"name":"S\u00e3o Tom\u00e9 & Pr\u00edncipe"},"SV":{"name":"El Salvador"},"SX":{"name":"Sint Maarten"},"SY":{"name":"Syria"},"SZ":{"name":"Eswatini"},"TC":{"name":"Turks & Caicos Islands"},"TD":{"name":"Chad"},"TF":{"name":"French Southern Territories"},"TG":{"name":"Togo"},"TH":{"name":"Thailand"},"TJ":{"name":"Tajikistan"},"TK":{"name":"Tokelau"},"TL":{"name":"Timor-Leste"},"TM":{"name":"Turkmenistan"},"TN":{"name":"Tunisia"},"TO":{"name":"Tonga"},"TR":{"name":"Turkey"},"TT":{"name":"Trinidad & Tobago"},"TV":{"name":"Tuvalu"},"TW":{"name":"Taiwan"},"TZ":{"name":"Tanzania"},"UA":{"name":"Ukraine"},"UG":{"name":"Uganda"},"UM":{"name":"U.S. Outlying Islands"},"US":{"name":"United States","regions":{"1":{"code":"AL","name":"Alabama"},"2":{"code":"AK","name":"Alaska"},"3":{"code":"AS","name":"American Samoa"},"4":{"code":"AZ","name":"Arizona"},"5":{"code":"AR","name":"Arkansas"},"6":{"code":"AF","name":"Armed Forces Africa"},"7":{"code":"AA","name":"Armed Forces Americas"},"8":{"code":"AC","name":"Armed Forces Canada"},"9":{"code":"AE","name":"Armed Forces Europe"},"10":{"code":"AM","name":"Armed Forces Middle East"},"11":{"code":"AP","name":"Armed Forces Pacific"},"12":{"code":"CA","name":"California"},"13":{"code":"CO","name":"Colorado"},"14":{"code":"CT","name":"Connecticut"},"15":{"code":"DE","name":"Delaware"},"16":{"code":"DC","name":"District of Columbia"},"17":{"code":"FM","name":"Federated States Of Micronesia"},"18":{"code":"FL","name":"Florida"},"19":{"code":"GA","name":"Georgia"},"20":{"code":"GU","name":"Guam"},"21":{"code":"HI","name":"Hawaii"},"22":{"code":"ID","name":"Idaho"},"23":{"code":"IL","name":"Illinois"},"24":{"code":"IN","name":"Indiana"},"25":{"code":"IA","name":"Iowa"},"26":{"code":"KS","name":"Kansas"},"27":{"code":"KY","name":"Kentucky"},"28":{"code":"LA","name":"Louisiana"},"29":{"code":"ME","name":"Maine"},"30":{"code":"MH","name":"Marshall Islands"},"31":{"code":"MD","name":"Maryland"},"32":{"code":"MA","name":"Massachusetts"},"33":{"code":"MI","name":"Michigan"},"34":{"code":"MN","name":"Minnesota"},"35":{"code":"MS","name":"Mississippi"},"36":{"code":"MO","name":"Missouri"},"37":{"code":"MT","name":"Montana"},"38":{"code":"NE","name":"Nebraska"},"39":{"code":"NV","name":"Nevada"},"40":{"code":"NH","name":"New Hampshire"},"41":{"code":"NJ","name":"New Jersey"},"42":{"code":"NM","name":"New Mexico"},"43":{"code":"NY","name":"New York"},"44":{"code":"NC","name":"North Carolina"},"45":{"code":"ND","name":"North Dakota"},"46":{"code":"MP","name":"Northern Mariana Islands"},"47":{"code":"OH","name":"Ohio"},"48":{"code":"OK","name":"Oklahoma"},"49":{"code":"OR","name":"Oregon"},"50":{"code":"PW","name":"Palau"},"51":{"code":"PA","name":"Pennsylvania"},"52":{"code":"PR","name":"Puerto Rico"},"53":{"code":"RI","name":"Rhode Island"},"54":{"code":"SC","name":"South Carolina"},"55":{"code":"SD","name":"South Dakota"},"56":{"code":"TN","name":"Tennessee"},"57":{"code":"TX","name":"Texas"},"58":{"code":"UT","name":"Utah"},"59":{"code":"VT","name":"Vermont"},"60":{"code":"VI","name":"Virgin Islands"},"61":{"code":"VA","name":"Virginia"},"62":{"code":"WA","name":"Washington"},"63":{"code":"WV","name":"West Virginia"},"64":{"code":"WI","name":"Wisconsin"},"65":{"code":"WY","name":"Wyoming"}}},"UY":{"name":"Uruguay","regions":{"972":{"code":"UY-AR","name":"Artigas"},"973":{"code":"UY-CA","name":"Canelones"},"974":{"code":"UY-CL","name":"Cerro Largo"},"975":{"code":"UY-CO","name":"Colonia"},"976":{"code":"UY-DU","name":"Durazno"},"977":{"code":"UY-FS","name":"Flores"},"978":{"code":"UY-FD","name":"Florida"},"979":{"code":"UY-LA","name":"Lavalleja"},"980":{"code":"UY-MA","name":"Maldonado"},"981":{"code":"UY-MO","name":"Montevideo"},"982":{"code":"UY-PA","name":"Paysandu"},"983":{"code":"UY-RN","name":"R\u00edo Negro"},"984":{"code":"UY-RV","name":"Rivera"},"985":{"code":"UY-RO","name":"Rocha"},"986":{"code":"UY-SA","name":"Salto"},"987":{"code":"UY-SJ","name":"San Jos\u00e9"},"988":{"code":"UY-SO","name":"Soriano"},"989":{"code":"UY-TA","name":"Tacuaremb\u00f3"},"990":{"code":"UY-TT","name":"Treinta y Tres"}}},"UZ":{"name":"Uzbekistan"},"VA":{"name":"Vatican City"},"VC":{"name":"St. Vincent & Grenadines"},"VE":{"name":"Venezuela","regions":{"993":{"code":"VE-Z","name":"Amazonas"},"994":{"code":"VE-B","name":"Anzo\u00e1tegui"},"995":{"code":"VE-C","name":"Apure"},"996":{"code":"VE-D","name":"Aragua"},"997":{"code":"VE-E","name":"Barinas"},"998":{"code":"VE-F","name":"Bol\u00edvar"},"999":{"code":"VE-G","name":"Carabobo"},"1000":{"code":"VE-H","name":"Cojedes"},"1001":{"code":"VE-Y","name":"Delta Amacuro"},"991":{"code":"VE-W","name":"Dependencias Federales"},"992":{"code":"VE-A","name":"Distrito Capital"},"1002":{"code":"VE-I","name":"Falc\u00f3n"},"1003":{"code":"VE-J","name":"Gu\u00e1rico"},"1004":{"code":"VE-K","name":"Lara"},"1005":{"code":"VE-L","name":"M\u00e9rida"},"1006":{"code":"VE-M","name":"Miranda"},"1007":{"code":"VE-N","name":"Monagas"},"1008":{"code":"VE-O","name":"Nueva Esparta"},"1009":{"code":"VE-P","name":"Portuguesa"},"1010":{"code":"VE-R","name":"Sucre"},"1011":{"code":"VE-S","name":"T\u00e1chira"},"1012":{"code":"VE-T","name":"Trujillo"},"1013":{"code":"VE-X","name":"Vargas"},"1014":{"code":"VE-U","name":"Yaracuy"},"1015":{"code":"VE-V","name":"Zulia"}}},"VG":{"name":"British Virgin Islands"},"VI":{"name":"U.S. Virgin Islands"},"VN":{"name":"Vietnam"},"VU":{"name":"Vanuatu"},"WF":{"name":"Wallis & Futuna"},"WS":{"name":"Samoa"},"XK":{"name":"Kosovo"},"YE":{"name":"Yemen"},"YT":{"name":"Mayotte"},"ZA":{"name":"South Africa"},"ZM":{"name":"Zambia"},"ZW":{"name":"Zimbabwe"},"data_id":1732402901},"captcha":[],"wishlist":{"items":[]},"instant-purchase":[],"loggedAsCustomer":[],"multiplewishlist":[],"persistent":[],"review":[],"chatData":[],"gtm":[],"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[]}</script> </div> <script> function _get(object, path, value) { const pathArray = Array.isArray(path) ? path : path.split('.').filter(key => key) const pathArrayFlat = pathArray.flatMap(part => typeof part === 'string' ? part.split('.') : part) return pathArrayFlat.reduce((obj, key) => obj && obj[key], object) || value; } function whenDocumentReady(fn) { if (document.readyState !== 'loading'){ fn(); } else { document.addEventListener('DOMContentLoaded', fn); } } const WeltPixelPersistentLayer = { storageExpiryTime : 30, // specify in seconds; locStorage : hyva.getBrowserStorage(), init(options) { this.storageExpiryTime = options.storageExpiryTime || this.storageExpiryTime; const persistentObject = { persist: {} }; let pushToDatalayer = false; const promoClickObj = this.getPromotionClick(); if (promoClickObj) { persistentObject.persist.persist_promotion = {}; persistentObject.persist.persist_promotion.promotion = promoClickObj; pushToDatalayer = true; } if (pushToDatalayer) { window.dataLayer.push(persistentObject); } }, setItem(key, value) { const storedValue = { expiryTime: new Date(), value: value }; this.locStorage.setItem(key, storedValue); }, getItem(key) { const storedValue = this.locStorage.getItem(key); if (!storedValue) { return false; } if (this.isExpired(storedValue.expiryTime)) { this.removeItem(key); return false; } return storedValue.value; }, removeItem(key) { this.locStorage.removeItem(key); }, isExpired(date) { const currDate = new Date(); const startDate = new Date(date); let difference = (currDate.getTime() - startDate.getTime()) / 1000; difference /= 60; difference = Math.abs(Math.round(difference)); return difference > this.storageExpiryTime; }, setPromotionClick(promoClick) { this.setItem('promo_click', promoClick); }, getPromotionClick() { return this.getItem('promo_click'); } }; const WeltPixelGtm = { promotionViews: [], trackPromotion: function(options) { if (!options.enabled) { return; } whenDocumentReady(() => { const wpPersDl = options.persDataLayer; const promotionElements = document.querySelectorAll('[data-track-promo-id]'); promotionElements.forEach((element) => { this.attachPromotionClickEventListener(element, wpPersDl); this.addToPromotionViewDataLayer(element); }); if (this.promotionViews.length) { window.dataLayer.push({ 'event': 'promotionView', 'ecommerce': { 'promoView': { 'promotions': this.promotionViews } } }); } }); }, addToPromotionViewDataLayer(element) { const promoId = element.getAttribute('data-track-promo-id'), promoName = element.getAttribute('data-track-promo-name'), promoCreative = element.getAttribute('data-track-promo-creative'), promoPosition = element.getAttribute('data-track-promo-position'); this.promotionViews.push({ 'id': promoId, 'name': promoName, 'creative': promoCreative, 'position': promoPosition }); }, attachPromotionClickEventListener(element, wpPersDl) { element.addEventListener('click', (event) => { const $this = event.target; const promoId = $this.getAttribute('data-track-promo-id'), promoName = $this.getAttribute('data-track-promo-name'), promoCreative = $this.getAttribute('data-track-promo-creative'), promoPosition = $this.getAttribute('data-track-promo-position'); const promoObj = { 'id': promoId, 'name': promoName, 'creative': promoCreative, 'position': promoPosition }; window.dataLayer.push({ 'event': 'promotionClick', 'ecommerce': { 'promoClick': { 'promotions': [promoObj] } } }); wpPersDl.setPromotionClick(promoObj); } , false); } }; window.addEventListener('private-content-loaded', (event) => { const dataLayerData = JSON.parse(_get(event, 'detail.data.gtm.datalayer') || '[]'); dataLayerData.forEach((dataLayerItem) => { window.dataLayer.push(dataLayerItem); }); const wpPersDlOptions = { 'storageExpiryTime': 30 }; const wpGtmOptions = { 'enabled' : 0, 'persDataLayer' : WeltPixelPersistentLayer }; WeltPixelPersistentLayer.init(wpPersDlOptions); WeltPixelGtm.trackPromotion(wpGtmOptions); }); </script> </body><a hidden href="/LXQycAyD-pYu2TNKEYPDVnPNdJ_PyN-pREjHSKBKIF0=.html">LXQycAyD-pYu2TNKEYPDVnPNdJ_PyN-pREjHSKBKIF0=.html</a></html>