PageSourceSearch

https://joyearbuds.com/products/tinys-earbuds-desinged-for-women-joy-friends-club

html joyearbuds.com collected 2026-10-04 19:05:31 UTC 585,781 bytes, 8,099 lines download raw bytes

1<!doctype html>
2<html class="no-js" lang="en" dir="ltr">
3<head>
4  
5  <!-- Google Tag Manager --> 
5<script> !function(){"use strict";function l(e){for(var t=e,r=0,n=document.cookie.split(";");r<n.length;r++){var o=n[r].split("=");if(o[0].trim()===t)return o[1]}}function s(e){return localStorage.getItem(e)}function u(e){return window[e]}function A(e,t){e=document.querySelector(e);return t?null==e?void 0:e.getAttribute(t):null==e?void 0:e.textContent}var e=window,t=document,r="script",n="dataLayer",o="https://ct.joyearbuds.com",a="https://load.ct.joyearbuds.com",i="4a7swiosqoimr",c="3azg=GwlUKCU%2BQj0xWyUrSUBJH09fR15XFwFUGAIQChABDRwWHkcMHh4%3D",g="jsVariable",v="_sbp",E="",d=!1;try{var d=!!g&&(m=navigator.userAgent,!!(m=new RegExp("Version/([0-9._]+)(.*Mobile)?.*Safari.*").exec(m)))&&16.4<=parseFloat(m[1]),f="stapeUserId"===g,I=d&&!f?function(e,t,r){void 0===t&&(t="");var n={cookie:l,localStorage:s,jsVariable:u,cssSelector:A},t=Array.isArray(t)?t:[t];if(e&&n[e])for(var o=n[e],a=0,i=t;a<i.length;a++){var c=i[a],c=r?o(c,r):o(c);if(c)return c}else console.warn("invalid uid source",e)}(g,v,E):void 0;d=d&&(!!I||f)}catch(e){console.error(e)}var m=e,g=(m[n]=m[n]||[],m[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),t.getElementsByTagName(r)[0]),v=I?"&bi="+encodeURIComponent(I):"",E=t.createElement(r),f=(d&&(i=8<i.length?i.replace(/([a-z]{8}$)/,"kp$1"):"kp"+i),!d&&a?a:o);E.async=!0,E.src=f+"/"+i+".js?"+c+v,null!=(e=g.parentNode)&&e.insertBefore(E,g)}(); </script>
5 <!-- End Google Tag Manager -->
6
7  
8  <!-- Google Consent Mode V2 Consentmo -->
9<script>
10  window.consentmo_gcm_initial_state = "7";
11  window.consentmo_gcm_state = "1";
12  window.consentmo_gcm_security_storage = "strict";
13  window.consentmo_gcm_ad_storage = "marketing";
14  window.consentmo_gcm_analytics_storage = "analytics";
15  window.consentmo_gcm_functionality_storage = "functionality";
16  window.consentmo_gcm_personalization_storage = "functionality";
17  window.consentmo_gcm_ads_data_redaction = "true";
18  window.consentmo_gcm_url_passthrough = "false";
19  window.consentmo_gcm_data_layer_name = "dataLayer";
20  
21  // Google Consent Mode V2 integration script from Consentmo GDPR
22  window.isenseRules = {};
23  window.isenseRules.gcm = {
24      gcmVersion: 2,
25      integrationVersion: 3,
26      customChanges: false,
27      consentUpdated: false,
28      initialState: 7,
29      isCustomizationEnabled: false,
30      adsDataRedaction: true,
31      urlPassthrough: false,
32      dataLayer: 'dataLayer',
33      categories: { ad_personalization: "marketing", ad_storage: "marketing", ad_user_data: "marketing", analytics_storage: "analytics", functionality_storage: "functionality", personalization_storage: "functionality", security_storage: "strict"},
34      storage: { ad_personalization: "false", ad_storage: "false", ad_user_data: "false", analytics_storage: "false", functionality_storage: "false", personalization_storage: "false", security_storage: "false", wait_for_update: 2000 }
35  };
36  if(window.consentmo_gcm_state !== null && window.consentmo_gcm_state !== "" && window.consentmo_gcm_state !== "0") {
37    window.isenseRules.gcm.isCustomizationEnabled = true;
38    window.isenseRules.gcm.initialState = window.consentmo_gcm_initial_state === null || window.consentmo_gcm_initial_state.trim() === "" ? window.isenseRules.gcm.initialState : window.consentmo_gcm_initial_state;
39    window.isenseRules.gcm.categories.ad_storage = window.consentmo_gcm_ad_storage === null || window.consentmo_gcm_ad_storage.trim() === "" ? window.isenseRules.gcm.categories.ad_storage : window.consentmo_gcm_ad_storage;
40    window.isenseRules.gcm.categories.ad_user_data = window.consentmo_gcm_ad_storage === null || window.consentmo_gcm_ad_storage.trim() === "" ? window.isenseRules.gcm.categories.ad_user_data : window.consentmo_gcm_ad_storage;
41    window.isenseRules.gcm.categories.ad_personalization = window.consentmo_gcm_ad_storage === null || window.consentmo_gcm_ad_storage.trim() === "" ? window.isenseRules.gcm.categories.ad_personalization : window.consentmo_gcm_ad_storage;
42    window.isenseRules.gcm.categories.analytics_storage = window.consentmo_gcm_analytics_storage === null || window.consentmo_gcm_analytics_storage.trim() === "" ? window.isenseRules.gcm.categories.analytics_storage : window.consentmo_gcm_analytics_storage;
43    window.isenseRules.gcm.categories.functionality_storage = window.consentmo_gcm_functionality_storage === null || window.consentmo_gcm_functionality_storage.trim() === "" ? window.isenseRules.gcm.categories.functionality_storage : window.consentmo_gcm_functionality_storage;
44    window.isenseRules.gcm.categories.personalization_storage = window.consentmo_gcm_personalization_storage === null || window.consentmo_gcm_personalization_storage.trim() === "" ? window.isenseRules.gcm.categories.personalization_storage : window.consentmo_gcm_personalization_storage;
45    window.isenseRules.gcm.categories.security_storage = window.consentmo_gcm_security_storage === null || window.consentmo_gcm_security_storage.trim() === "" ? window.isenseRules.gcm.categories.security_storage : window.consentmo_gcm_security_storage;
46    window.isenseRules.gcm.urlPassthrough = window.consentmo_gcm_url_passthrough === null || window.consentmo_gcm_url_passthrough.trim() === "" ? window.isenseRules.gcm.urlPassthrough : window.consentmo_gcm_url_passthrough;
47    window.isenseRules.gcm.adsDataRedaction = window.consentmo_gcm_ads_data_redaction === null || window.consentmo_gcm_ads_data_redaction.trim() === "" ? window.isenseRules.gcm.adsDataRedaction : window.consentmo_gcm_ads_data_redaction;
48    window.isenseRules.gcm.dataLayer = window.consentmo_gcm_data_layer_name === null || window.consentmo_gcm_data_layer_name.trim() === "" ? window.isenseRules.gcm.dataLayer : window.consentmo_gcm_data_layer_name;
49  }
50  window.isenseRules.initializeGcm = function (rules) {
51    if(window.isenseRules.gcm.isCustomizationEnabled) {
52      rules.initialState = window.isenseRules.gcm.initialState;
53      rules.urlPassthrough = window.isenseRules.gcm.urlPassthrough === true || window.isenseRules.gcm.urlPassthrough === 'true';
54      rules.adsDataRedaction = window.isenseRules.gcm.adsDataRedaction === true || window.isenseRules.gcm.adsDataRedaction === 'true';
55    }
56    
57    let initialState = parseInt(rules.initialState);
58    let marketingBlocked = initialState === 0 || initialState === 2 || initialState === 5 || initialState === 7;
59    let analyticsBlocked = initialState === 0 || initialState === 3 || initialState === 6 || initialState === 7;
60    let functionalityBlocked = initialState === 4 || initialState === 5 || initialState === 6 || initialState === 7;
61
62    let gdprCache = localStorage.getItem('gdprCache') ? JSON.parse(localStorage.getItem('gdprCache')) : null;
63    if (gdprCache && typeof gdprCache.updatedPreferences !== "undefined") {
64      let updatedPreferences = gdprCache.updatedPreferences;
65      marketingBlocked = parseInt(updatedPreferences.indexOf('marketing')) > -1;
66      analyticsBlocked = parseInt(updatedPreferences.indexOf('analytics')) > -1;
67      functionalityBlocked = parseInt(updatedPreferences.indexOf('functionality')) > -1;
68    }
69
70    Object.entries(rules.categories).forEach(category => {
71      if(rules.storage.hasOwnProperty(category[0])) {
72        switch(category[1]) {
73          case 'strict':
74            rules.storage[category[0]] = "granted";
75            break;
76          case 'marketing':
77            rules.storage[category[0]] = marketingBlocked ? "denied" : "granted";
78            break;
79          case 'analytics':
80            rules.storage[category[0]] = analyticsBlocked ? "denied" : "granted";
81            break;
82          case 'functionality':
83            rules.storage[category[0]] = functionalityBlocked ? "denied" : "granted";
84            break;
85        }
86      }
87    });
88    rules.consentUpdated = true;
89    isenseRules.gcm = rules;
90  }
91
92  window[window.isenseRules.gcm.dataLayer] = window[window.isenseRules.gcm.dataLayer] || [];
93  function gtag() { window[window.isenseRules.gcm.dataLayer].push(arguments); }
94
95  function initialConsentUpdate() {
96    // Google Consent Mode - initialization start
97    window.isenseRules.initializeGcm({
98      ...window.isenseRules.gcm,
99      adsDataRedaction: true,
100      urlPassthrough: false,
101      initialState: 7
102    });
103
104    /*
105    * initialState acceptable values:
106    * 0 - Set both ad_storage and analytics_storage to denied
107    * 1 - Set all categories to granted
108    * 2 - Set only ad_storage to denied
109    * 3 - Set only analytics_storage to denied
110    * 4 - Set only functionality_storage to denied
111    * 5 - Set both ad_storage and functionality_storage to denied
112    * 6 - Set both analytics_storage and functionality_storage to denied
113    * 7 - Set all categories to denied
114    */
115
116    gtag("consent", "default", isenseRules.gcm.storage);
117    isenseRules.gcm.adsDataRedaction && gtag("set", "ads_data_redaction", isenseRules.gcm.adsDataRedaction);
118    isenseRules.gcm.urlPassthrough && gtag("set", "url_passthrough", isenseRules.gcm.urlPassthrough);
119  }
120
121  let isInitConsentmoSignal = true;
122  document.addEventListener("consentmoSignal", function(e) {
123    if (isInitConsentmoSignal) {
124      initialConsentUpdate();
125      isInitConsentmoSignal = false;
126    }
127  });
128</script>
128
129<!--LOOMI SDK-->
130<!--DO NOT EDIT-->
131<link rel="preconnect"  href="https://live.visually-io.com" crossorigin data-em-disable>
132<link rel="dns-prefetch" href="https://live.visually-io.com" data-em-disable>
133<script type="text/javascript" data-em-disable data-vsly>
134    (()=> {
135        const env = 2;
136        var store = "joy-planet-finland.myshopify.com";
137        var alias = store.replace(".myshopify.com", "").replaceAll("-", "_").toUpperCase();
138        var jitsuKey =  "js.65680310506";
139        var themeId = 162073870678;
140        var role = "main";
141        window.loomi_ctx = {...(window.loomi_ctx || {}),storeAlias:alias,jitsuKey,env,themeId,role};
142        
143        
144    
145	
146	var product = {};
147	var variants = [];
148	
149	variants.push({id:54276348870998,policy:"continue",price:15900,iq:-6});
150	
151	variants.push({id:54276348936534,policy:"continue",price:15900,iq:-18});
152	
153	variants.push({id:55061249950038,policy:"continue",price:15900,iq:-7});
154	
155	product.variants = variants;
156	product.oos = !true;
157	product.price = 15900 ;
158	window.loomi_ctx.current_product=product;
159	window.loomi_ctx.productId=10882379907414;
160	window.loomi_ctx.variantId = 54276348870998;
161	
162        
163        window.loomi_ctx.blockingConcent = false;
164        loomi_ctx.ttl=1793729266;
165        
166    })()
167</script>
vendor: 1 bytes, line 167
167
168<script type="text/javascript" data-em-disable>
169    !function(){var e,t,n;!function(e){e.JSCondition="jsCondition",e.JSFunction="jsFunction",e.JSEvent="jsEvent",e.Selector="selector",e.ElementEvent="elementEvent",e.PageLoad="pageLoad",e.Timeout="timeout",e.Inactivity="inactivity",e.ExitIntent="exitIntent",e.Conjunction="conjunction"}(e||(e={})),function(e){e[e.PAUSED=4]="PAUSED"}(t||(t={})),function(e){e[e.LOCAL=0]="LOCAL",e[e.STAGE=1]="STAGE",e[e.PROD=2]="PROD",e[e.TEST=3]="TEST"}(n||(n={}));const r="lmi_preview";var o;!function(e){e.USE_CASE="USE_CASE",e.ADD_TO_CART="ADD_TO_CART"}(o||(o={}));const i=function(e){void 0===e&&(e=()=>window);try{return Promise.resolve(v(()=>void 0!==_(()=>e().removeEventListener),100,100)).then(function(){return Promise.resolve()})}catch(e){return Promise.reject(e)}},s=function(e,t){void 0===e&&(e=()=>window),void 0===t&&(t=!1);try{function n(){return Promise.resolve()}const r=t&&a()?Promise.resolve(v(()=>c,1e3,10)).then(function(){}):Promise.resolve(v(()=>void 0!==_(()=>e().addEventListener),10,1e3)).then(function(){});return Promise.resolve(r&&r.then?r.then(n):n())}catch(o){return Promise.reject(o)}};let c=!1;function a(){return!0===_(()=>window.vslyDeferResources)}function u(e,t){void 0===t&&(t=20);let n=0;return function(){clearTimeout(n),n=setTimeout(()=>e(...[].slice.call(arguments)),t)}}window.addEventListener("load",()=>{setTimeout(()=>{c=!0},2e3)});const l="vsly-hide-theme-preview",d="vslyCtags",m=()=>{_(()=>{const e=window.loomi_ctx.ctags||[];0===e.length?window.loomi_ctx.ctags=JSON.parse(localStorage.getItem(d)||"[]"):localStorage.setItem(d,JSON.stringify(e)),_(()=>{const e=JSON.parse(localStorage.getItem("vslyCustomCtags")||"[]");e&&e.length>0&&(window.loomi_ctx.ctags=[...window.loomi_ctx.ctags||[],...e])})})},f=()=>new Date(1e3*Math.floor(Date.now()/1e3));function h(e,t){void 0===t&&(t={async:!1,defer:!1});const n=_(()=>window.visually.flags["bunny-cdn"]),r=A();return p(`vsly-lib-${e}`,`https://${n?"assets.visually.io":r}/vsly/lib/${e}.js`,t)}function p(e,t,n){return void 0===n&&(n={async:!1,defer:!1}),new Promise((r,o)=>{let i=document.getElementById(e);i?r(document.getElementById(e)):(i=document.createElement("script"),i.id=e,i.src=t,i.async=n.async||!1,i.defer=n.defer||!1,i.setAttribute("data-em-disable",""),i.onload=()=>r(i),i.onerror=()=>o(new Error(`Failed to load ${t}`)),document.head.appendChild(i))})}function v(e,t,n,r){return void 0===t&&(t=500),void 0===n&&(n=4),new Promise((o,i)=>{e()?o(0):0!==n?setTimeout(()=>{r&&r()&&i(`condition rejected ${_(()=>e.toString())}`),v(e,t,n-1).then(o).catch(i)},t):i(`condition rejected ${_(()=>e.toString())}`)})}function w(e,t){void 0===t&&(t=500);const n=_(()=>window.visually_io_editor)?Date.now()+1e4:Infinity;function r(o){try{const i=e();i?o(i):Date.now()>=n?o(void 0):setTimeout(()=>r(o),t)}catch(e){console.error("vsly-when",e),Date.now()>=n?o(void 0):setTimeout(()=>r(o),t)}}return new Promise(e=>{r(e)})}function y(e){return!Array.isArray(e)||0===e.length}function g(e){return btoa(unescape(encodeURIComponent(JSON.stringify(e))))}function _(e,t){void 0===t&&(t=void 0);try{return e()}catch{return t}}const S=e=>e&&decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"+encodeURIComponent(e).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))||null;function E(){const e=window.loomi_ctx?.clientId;return e?(window.localStorage.setItem("vsly__st",String(e)),String(e)):window.localStorage.getItem("vsly__st")}function P(e,t,n){void 0===t&&(t=5),void 0===n&&(n=500),t>=0&&!_(e)&&setTimeout(()=>{_(e)||P(e,t-1)},n)}const A=function(e){return void 0===e&&(e=window.loomi_ctx.env),e===n.STAGE?"sdk.loomi-stg.xyz":"live.visually-io.com"};function I(e){return e.replace(/[^a-z_A-Z0-9]/gi,"_")}const b=()=>!!_(()=>x()()),x=()=>_(()=>window.Shopify.customerPrivacy.analyticsProcessingAllowed)||_(()=>window.Shopify.customerPrivacy.userCanBeTracked)||_(()=>window.visually.analyticsProcessingAllowed);function C(){const e=function(){try{return Promise.resolve(v(()=>!!_(()=>window.loomi.jitsu),a()?1e3:500,120)).then(function(){return _(()=>window.loomi.jitsu)})}catch(e){return Promise.reject(e)}}();return{register(t,n,r,o){e.then(e=>_(()=>e.register(t,n,r,o)))},track:function(t,n,r){return Promise.resolve(e).then(function(e){return Promise.resolve(_(()=>e.track(t,n,r))).then(function(){})})},trackExt:function(t,n){return Promise.resolve(e).then(function(e){return Promise.resolve(_(()=>e.trackExt(t,n))).then(function(){})})}}}let k=!1,T=!1;function N(e,t,n){return{id:T?"lmi-000":"lmi-"+ ++j,isApplied:!1,kind:e,selector:t,value:n}}function O(e,t){let n,r=!1;return null!==e.previousElementSibling?n=e.previousElementSibling:(n=e.parentElement,r=!0),n?(e.outerHTML=t,r?n.firstElementChild:n.nextElementSibling):e}let j=Math.round(1e4*Math.random()),L=[],$=new Map;const R="lmid",D="lmwv";function U(){return!!_(()=>window.vsly_fbs)}function M(){return window.location.search.includes("lmi_debug")||U()}function q(){M()&&console.debug("loomi-editor",...[].slice.call(arguments))}function F(){M()&&console.error("loomi-editor",...[].slice.call(arguments))}let B=!0,J={};class V{constructor(e,t){this._value=void 0,this._addedAt=void 0,this._value=e,this._addedAt=t||(new Date).getTime()}value(){return this._value}addedAt(){return this._addedAt}}class H{constructor(e,t){this.backend=void 0,this.ttlMillis=void 0,this.backend=e,this.ttlMillis=t}isValid(e){return!!e&&(new Date).getTime()-e.addedAt()<=this.ttlMillis}get(e){const t=this.backend.get(e),n=this.isValid(t);if(t&&n)return t.value();n||this.backend.remove(e)}set(e,t,n){const r=new V(t,n);this.backend.set(e,r)}}class G{constructor(e){this.namespace=void 0,this.namespace=`vsly_cache_${e}`,window[this.namespace]={}}get(e){return _(()=>window[this.namespace][e])}remove(e){_(()=>delete window[this.namespace][e])}set(e,t){window[this.namespace][e]=t}}class z{constructor(e){this.namespace=void 0,this.namespace=`vsly_cache_${e}`}get(e){return _(()=>{const t=sessionStorage.getItem(`${this.namespace}_${e}`);if(!t)return;const n=JSON.parse(t);return new V(n._value,n._addedAt)})}remove(e){sessionStorage.removeItem(`${this.namespace}_${e}`)}set(e,t){sessionStorage.setItem(`${this.namespace}_${e}`,JSON.stringify(t))}}class K extends H{constructor(e,t){super(new G(e),t)}}const W=function(e,t){void 0===t&&(t=8397271938200529);let n=3735928559^t,r=1103547991^t;for(let t,o=0;o<e.length;
169o++)t=e.charCodeAt(o),n=Math.imul(n^t,2654435761),r=Math.imul(r^t,1597334677);return n=Math.imul(n^n>>>16,2246822507)^Math.imul(r^r>>>13,3266489909),r=Math.imul(r^r>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),`${4294967296*(2097151&r)+(n>>>0)}`},Q="targeting-changed",Y="vslyThemeTest",Z="0891c521a9aa47c6a9fd965198b7ed44",X="_203";function ee(e,t,n,r,o){void 0===n&&(n=10),void 0===r&&(r=!1),void 0===o&&(o="none");const{_USE_CASE:i,_USE_CASE_VARIANT:s,_USE_CASE_AUDIENCES:c,_USE_CASE_VERSION:a,_USE_CASE_GA_VARIANT:u,_USE_CASE_GA:l}=e;if(U()||ie())return;if(!function(e){try{const t=location.pathname,n=new URL(e);if(location.search.includes("vsly-redirected-from"))return!1;if(!0===_(()=>window.visually.flags["sdk-kill-advanced-redirect-checks"]))return!0;{let e=!1;const r=decodeURIComponent(location.search);return n.searchParams.forEach((t,n)=>{const o=decodeURIComponent(`${n}=${t}`);r.includes(o)||(e=!0)}),!!((_(()=>Array.from(n.searchParams.values()).length)||0)>0&&e)||t!==n.pathname}}catch(e){return!1}}(t))return;if(!function(e,t,n){const r=`vsly-redirect-${W(`${n._USE_CASE}-${n._USE_CASE_VARIANT}-${n._USE_CASE_VERSION}-${e}`)}`;return"session"===t?"true"!==sessionStorage.getItem(r)&&(sessionStorage.setItem(r,"true"),!0):"user"!==t||"true"!==localStorage.getItem(r)&&(localStorage.setItem(r,"true"),!0)}(t,o,e))return;h();const d=`${i}-${s}`,m={type:"USE_CASE",ts:f().valueOf(),payload:{sid:_(()=>window.loomi_ctx.session.id),user:{anonymous_id:_(()=>window.loomi_ctx.userId)},use_case:i,use_case_variant:s,...a?{version:a}:{},...c?{audiences:c}:{}},options:{gaName:_(()=>I(l)),gaVariant:_(()=>I(u))}};function h(){document.body&&(document.body.style.opacity=0)}_(()=>{ce(i)&&(m.payload.clickId="redirect",m.options.isRedirect=!0)}),window.vsly_redirecting=!0,setTimeout(function(){try{h();const e=JSON.stringify(m),n=g(m),o=!d.includes(re);let i=t;try{new URLSearchParams(location.search).forEach((e,t)=>{(r||oe(t))&&(i=te(i,t,e))})}catch(t){q("e87",{redirectUrl:i,key:d,event:e,ex:t})}return i=te(i,"vsly-redirected-from",d),o&&(i=te(i,"vsly-redirected-event",n)),location.replace&&location.replace(i),Promise.resolve()}catch(e){return Promise.reject(e)}},n)}function te(e,t,n){try{const r=new URL(e);return r.searchParams.append(t,n),r.href}catch(t){return`${e}${e.includes("?")?"&":"?"}key=${n}`}}function ne(e){return{_USE_CASE:e.experienceId,_USE_CASE_VARIANT:e.variantId,_USE_CASE_VERSION:e.version,_USE_CASE_AUDIENCES:_(()=>window.loomi_ctx.audiences.join("|"),""),_USE_CASE_GA:e.gaExperienceName,_USE_CASE_GA_VARIANT:e.gaVariantName}}const re="theme_test_redirect_back_to_main",oe=e=>e.toLowerCase().startsWith("utm");function ie(){return _(()=>window.Shopify.designMode,!1)}function se(){return _(()=>window.Shopify.country)||_(()=>window.visually.country)}const ce=e=>window.loomi.conf.experiments.find(t=>t.name===e).isRedirect,ae=(e,t)=>{_(()=>!0===window.visually.flags["sdk-disable-dynamic-height-strategy"],!1)||e&&function(e,t,n){let r=e,o=0;for(;r.parentElement&&o<10;)n(r.parentElement),r=r.parentElement,o+=1}(e,0,e=>{const t=e.style.height;var n;(n=t)&&""!==n&&(e.style.removeProperty("height"),e.style.minHeight=t)})};function ue(e,t,n,r){if(!document.body.contains(r)){const r=document.querySelector(n);return r?(t(),e(),{element:r,isDetached:!0}):{isDetached:!1}}return{isDetached:!1}}function le(e){if(!_(()=>window.visually.flags["visibility-redo"]))return document.querySelector(e);const t=document.querySelectorAll(e);for(let e=0;e<t.length;e++){const n=t.item(e);if(de(n))return n}return _(()=>t[0])}function de(e){try{if(!_(()=>window.visually.flags["visibility-redo"]))return!0;if(!e)return!1;const t=e.getBoundingClientRect(),n=getComputedStyle(e);return!_(()=>"none"==n.display||"0"==n.opacity||"hidden"==n.visibility||t.width<=5&&t.height<=5||"none"==e.style.display||"0"==e.style.opacity||"hidden"==e.style.visibility)}catch(e){return!0}}function me(e){return _(()=>window.visually.flags[e],!1)}function fe(){return _(()=>!0===window.vslyDeferWidgets||me("sdk-defer-widgets"),!1)}const he="visually",pe="widgets";let ve;function we(e,t){const n=e+t,r=`vslyw-${n}`;if(!document.getElementById(r)){const e=document.createElement("script");e.id=r,e.type="text/javascript";
169const t=_(()=>window.visually.flags["bunny-cdn"]),o=A();e.src=`https://${t?"assets.visually.io":o}/widgets/${n}.js`,document.head.appendChild(e)}}window.IntersectionObserver&&(ve=new IntersectionObserver((e,t)=>{e.forEach(e=>{if(e.isIntersecting){const n=e.target;(function(e){const t=e.getAttribute("lmw"),n=e.getAttribute(D);if(t&&n){const r=t+n;return v(()=>_(()=>!!window[he][pe][r])&&_(()=>!!window.preact),50,500).then(()=>{_(()=>window[he][pe][r](`#${e.id}`))}),!0}return!1})(n)&&t.unobserve(n)}})},{root:null,rootMargin:window.vslyDeferWidgetsMargin||"100px",threshold:.1}));const ye="vsly-orig-sel";function ge(e,t){try{var n=e()}catch(e){return t(e)}return n&&n.then?n.then(void 0,t):n}const _e=function(e){try{return Promise.resolve(ge(function(){return Promise.resolve(v(()=>!!_(()=>document.querySelector(e)),250,100)).then(function(){return Promise.resolve(document.querySelector(e))})},function(e){return Promise.reject(e)}))}catch(e){return Promise.reject(e)}};function Se(e,t,n){const r=t.extra;return n&&n>=3?void 0!==r&&!!_(()=>e.childNodes[r]):!!r&&!!_(()=>e.childNodes[r])}function Ee(e,t,n){void 0===n&&(n=10),me("kill-theme-testing")||Pe(t)||(Ae(e,t),ee(e,Ie(t).href,n,!0,"session"))}const Pe=e=>{if(xe())return!0;_(function(){try{return Promise.resolve(v(()=>!!document&&!!document.head,10,2e3)).then(function(){const e=document.head||document.getElementsByTagName("head")[0];if(!e.querySelector(`#${l}`)){const t=document.createElement("style");t.id=l,t.appendChild(document.createTextNode("#preview-bar-iframe,#PBarNextFrameWrapper,#PBarNextFrame { display: none !important;}")),e.appendChild(t)}})}catch(e){return Promise.reject(e)}});const t=window.loomi_ctx.themeId||_(()=>window.Shopify.theme.id),n=window.loomi_ctx.role||_(()=>window.Shopify.theme.role),r=!Ne({id:t,role:n}),o=_(()=>!window.loomi_ctx.testedThemes.includes(t));return!(!r||!o)||Te({id:t,role:n},e)},Ae=(e,t)=>{const n=e._USE_CASE!==re;Le(t)&&n&&[sessionStorage,localStorage].forEach(e=>Oe(e))},Ie=e=>{let t=Re();return _(()=>!!window.loomi_api.vslyResolveThemeTestUrl)&&(t=_(()=>window.loomi_api.vslyResolveThemeTestUrl(t),t)),t.searchParams.append("preview_theme_id",`${e||""}`),t},be=()=>{const e="vsly-tts";if($e(e)||De(e))return;ke();const t=Ie("");t.searchParams.append(e,"1"),sessionStorage.setItem(e,`${f().valueOf()}`),document.body.style.opacity=0,location.replace(t.href)},xe=()=>
169{const e="vsly_disableThemeTest",t=$e("disableThemeTest")||!!sessionStorage.getItem(e);return t&&sessionStorage.setItem(e,"1"),ie()||t},Ce=()=>0===(window.loomi_ctx.embeddedTests||[]).filter(e=>e.experiment.isThemeTest).length,ke=()=>[sessionStorage,localStorage].forEach(e=>e.removeItem(Y)),Te=(e,t)=>e.id===t||Ne(e)&&!t,Ne=e=>"main"===e.role,Oe=e=>e.setItem(Y,"1"),je=e=>e.getItem(Y),Le=e=>!!e,$e=e=>_(()=>Re().searchParams.has(e)),Re=()=>_(()=>new URL(window.location.href)),De=e=>{const t=sessionStorage.getItem(e);if(t){const e=f().valueOf()-Number(t);return Number.isFinite(e)&&e<864e5}return t},Ue="data-rid",Me="data-alchemy-element-root";let qe,Fe=0;function Be(e){return e.hasAttribute(Ue)||e.hasAttribute(Me)}const Je=function(e,t){try{return Promise.resolve(v(()=>!!document&&!!document.body&&!!document.querySelector,50,200)).then(function(){!function(){if("undefined"==typeof document)return;Ve||(Ve=new MutationObserver(He)),He();const e="spa"===_(()=>window.vslyIntegrationType,"static")?document:document.body;Ve.observe(e,{childList:!0,subtree:!0,characterData:!0,attributes:!1})}(),e&&(k=e),t&&(T=t)})}catch(e){return Promise.reject(e)}};let Ve;function He(){L.filter(e=>!e.isApplied).forEach(e=>{try{const t=_(()=>document.body.querySelector(e.selector));if(!t)return void function(e,t,n,r,o){void 0===r&&(r=100),void 0===o&&(o=10);const i=!!t,s=_(()=>J[e])||0;!i&&B&&s<o&&(B=!1,J[e]=(_(()=>J[e])||0)+1,setTimeout(()=>{try{n()}catch(t){F("failed to run setTimeout on refreshAllElementsSets",e,t)}B=!0},r+50*s))}(e.selector,t,He,100,10);if($.has(e.id))return;if(function(e,t){if(e&&(void 0===qe&&(qe=!!document.querySelector(`[${Me}],[${Ue}]`)),qe)&&function(e){return["replace","appendBefore","appendAfter","compound","widget","moveElem"].includes(e.kind)}(t))for(let t=e;t;t=t.parentElement)if(Be(t))return!0;return!1}(t,e)&&!function(){if(U())return!0;const e=window.vslyHydrationSize||1,t=!!window.elementIdToRuntimeInitialized&&Object.values(window.elementIdToRuntimeInitialized).length>=e;t&&0===Fe&&(Fe=Date.now());const n=Date.now()-Fe,r=window.vslyHydrationGrace||500;return t&&n>r}())return;const n=Ge(e,t);n&&($.set(e.id,n),e.isApplied=!0)}catch(t){!function(){M()&&console.warn("loomi-editor",...[].slice.call(arguments))}("failed to resolve command from mutation request with exception.",t,e)}}),Ke()}function Ge(e,t){if("replace"===e.kind)return function(e,t,n,r,o){let i=o||e,s=!1;const c=n.outerHTML;return{id:e,isApplied:()=>s,kind:"replace",do:()=>{s||(k&&n.setAttribute(R,i),n.outerHTML!==r&&(n=O(n,r),ae(n),k&&n.setAttribute(R,i),s=!0))},undo:()=>{s&&n.outerHTML!==c&&(n=O(n,c),s=!1)},redoIfNeeded:()=>!1,setDebugId:e=>i=e}}(e.id,0,t,e.value,e.id);if("appendBefore"===e.kind||"appendAfter"===e.kind)return function(e,t,n,r,o){let i=o||e,s=!1,c=document.querySelector(t),a=document.createElement("div");const u=()=>{s||("appendBefore"===r&&(c=document.querySelector(t),_(()=>c.parentNode.insertBefore(a,c)),ae(c),a=O(a,n),k&&a.setAttribute(R,i),s=!0),"appendAfter"===r&&(s||(c=document.querySelector(t),c.nextSibling?(_(()=>c.parentNode.insertBefore(a,c.nextSibling)),ae(c)):(_(()=>c.parentNode.appendChild(a)),ae(c)),a=O(a,n),k&&a.setAttribute(R,i),s=!0)),s=!0)},l=()=>{s&&(a.remove(),s=!1)};return{id:e,isApplied:()=>s,kind:r,do:u,undo:l,redoIfNeeded:()=>{const e=ue(u,l,t,c);return e.element&&(c=e.element),e.isDetached},setDebugId:e=>i=e}}(e.id,e.selector,e.value,e.kind,e.id);if("appendCss"===e.kind)return function(e,t,n,r){let o=r||e,i=!1,s=document.querySelector(t);const c=document.createElement("style"),a=()=>{i||(c.innerHTML=n,k&&c.setAttribute(R,o),document.head.appendChild(c),i=!0)},u=()=>{i&&(c.remove(),i=!1)};return{id:e,kind:"appendCss",isApplied:()=>i,do:a,undo:u,redoIfNeeded:()=>{const e=ue(a,u,t,s);return e.element&&(s=e.element),e.isDetached},setDebugId:e=>o=e}}(e.id,e.selector,e.value,e.id);if("appendJs"===e.kind)return function(e,t,n,r,o){let i=r||e,s=!1,c=document.querySelector(t),a=null;const u=()=>{s||(a||(a=document.createElement("script")),a.setAttribute("type","application/javascript"),a.innerHTML=function(e,t){return e&&t?`(async () => {\n    const _USE_CASE = "${t.experienceId}";
169\n    const _USE_CASE_VARIANT = "${t.variantId}";\n    const _USE_CASE_VERSION = ${_(()=>t.version||0,0)};\n    const _USE_CASE_AUDIENCES = "${_(()=>window.loomi_ctx.audiences.join("|"),"")}";\n    const _USE_CASE_GA = "${_(()=>t.gaExperienceName.replace(/"/g,'\\"'),t.gaExperienceName)}";\n    const _USE_CASE_GA_VARIANT = "${_(()=>t.gaVariantName.replace(/"/g,'\\"'),t.gaVariantName)}";\n    const _USE_CASE_CTX = {_USE_CASE,_USE_CASE_VARIANT,_USE_CASE_VERSION,_USE_CASE_AUDIENCES,_USE_CASE_GA,_USE_CASE_GA_VARIANT};\n    const __currentScriptElement = document.currentScript;\n    ${e}\n    if (typeof vslyCleanup !== 'undefined') {     \n      if (__currentScriptElement) {\n        __currentScriptElement.__vslyCleanup = vslyCleanup;\n      }\n    }\n  })()`:!t&&e?`\n(async () => {\n  const __currentScriptElement = document.currentScript;\n  ${e}\n    if (typeof vslyCleanup !== 'undefined') {     \n      if (__currentScriptElement) {\n        __currentScriptElement.__vslyCleanup = vslyCleanup;\n      }\n    }\n})();\n`:e}(n,o),k&&(a.id=i),document.body.appendChild(a),s=!0)},l=()=>{if(!s)return;const e=(()=>{try{const e=a.__vslyCleanup;if(e)return e(),!0}catch(e){k&&console.error("vslyCleanup error:",e)}return!1})();a&&a.remove(),e&&(a=null),s=!1};return{id:e,kind:"appendJs",isApplied:()=>s,do:u,undo:l,redoIfNeeded:()=>{const e=ue(u,l,t,c);return e.element&&(c=e.element),e.isDetached},setDebugId:e=>i=e}}(e.id,e.selector,e.value,e.id,e.options);if("appendFont"===e.kind){const t=JSON.parse(e.value);if(t&&t.family&&t.weights)return function(e,t,n){n=n||e;let r=!1;const o=document.createElement("link"),i=(c=t.weights,(s=t.family).toLowerCase().includes("jetbrains")&&(s="JetBrains Mono"),`https://fonts.googleapis.com/css2?family=${encodeURIComponent(s)}:wght@${_(()=>c.join(";"))}&display=block`);var s,c;return o.setAttribute("href",i),o.setAttribute("rel","stylesheet"),{id:e,isApplied:()=>r,kind:"appendFont",do:()=>{r||(k&&o.setAttribute(R,n),document.head.appendChild(o),r=!0)},undo:()=>{r&&(o.remove(),r=!1)},redoIfNeeded:()=>!1}}(e.id,t,e.id)}else{if("compound"===e.kind){const n=e.value.map(n=>(n.options=e.options,Ge(n,t))).filter(e=>e);return function(e,t,n){let r=!1;return{id:e,isApplied:()=>r,kind:"compound",do:()=>{r||(t.filter(e=>!e.isApplied()).forEach(e=>{e.setDebugId&&e.setDebugId(n),e.do()}),r=!0)},undo:()=>{r&&(t.filter(e=>e.isApplied()).reverse().forEach(e=>e.undo()),r=!1)},redoIfNeeded:()=>t.map(e=>e.redoIfNeeded()).filter(e=>e).length>0}}(e.id,n,e.id)}if("widget"===e.kind){const t=_(()=>e.block.value),n=_(()=>t.env.sectionId.substring(1),e.id);return function(e,t,n,r,o,i,s){void 0===s&&(s="");const c=i||t;let a=!1;const u=`vslyp-${t}`;let l=null,d=null,m=[];const f=()=>{a||(we(r,s),"replace"===e?w():y(),fe()&&ve||h(),a=!0)},h=()=>{const e=r+s;v(()=>_(()=>!!window[he][pe][e])&&_(()=>!!window.preact),50,500).then(()=>{ae(l),_(()=>window[he][pe][e](`#${t}`))})},p=()=>{if(!a)return;d&&d.remove();const t=document.getElementById(u);if(t&&t.remove(),"replace"===e&&l&&l.children&&l.children.length>0){let e=0;for(const t of l.children)t.style.display=m[e],e+=1}a=!1},w=()=>
169{if(l=le(n),l){if(m=[],l.children&&l.children.length>0)for(const e of l.children){const t=e;t&&!t.getAttribute("preact")&&(m.push(t.style.display),t.style.display="none")}g(),l.appendChild(d),fe()&&ve&&ve.observe(d)}else F("vsly",`failed to find element with selector: ${n} when trying to replace with widget`)},y=()=>{l=le(n),l?(g(),l.insertAdjacentElement("appendBefore"===e?"beforebegin":"afterend",d),fe()&&ve&&ve.observe(d)):F("vsly",`failed to find element with selector: ${n} when trying to append widget`)},g=()=>{if(d=document.getElementById(t),!d){d=document.createElement("section"),d.style.all="unset",d.style.width="100%",d.setAttribute("preact","1"),k&&d.setAttribute(R,c),d.setAttribute("lmw",r),d.setAttribute(D,s),d.id=t;const e=document.createElement("script");e.id=u,e.setAttribute("type","text/props"),e.innerHTML=JSON.stringify(o),_(()=>document.body.appendChild(e))}};return{id:t,isApplied:()=>a,kind:"widget",do:f,undo:p,redoIfNeeded:()=>{const e=ue(f,p,n,l);return e.element&&(l=e.element),e.isDetached}}}(t.htmlKind,n,e.selector,t.widgetId,t.env,n,t.version)}if("moveElem"===e.kind){const t=_(()=>e.block.value);return function(e,t,n,r){let o=!1,i={display:""},s=null,c=null;const a=()=>{o||v(()=>(s=document.querySelector(t),c=document.querySelector(n),!!s&&!!c),50,500).then(()=>{s=document.querySelector(t),c=document.querySelector(n),u()})},u=()=>{c&&s&&(i={display:c.style.display,parentNode:s.parentElement,nextSib:s.nextElementSibling,prevSib:s.previousElementSibling},"appendBefore"===r?c.insertAdjacentElement("beforebegin",s):"appendAfter"===r?c.insertAdjacentElement("afterend",s):"replace"===r&&(c.style.display="none!important",c.insertAdjacentElement("afterend",s)),s.setAttribute(ye,t),o=!0)};return{id:e,isApplied:()=>o,kind:"moveElem",do:a,undo:()=>{o&&c&&s&&(i&&i.prevSib?i.prevSib.insertAdjacentElement("afterend",s):i&&i.nextSib?i.nextSib.insertAdjacentElement("beforebegin",s):i&&i.parentNode&&i.parentNode.appendChild(s),"replace"===r&&(c.style.display=i.display),s.removeAttribute(ye),o=!1)},redoIfNeeded:()=>!(_(()=>s.hasAttribute(ye))&&document.body.contains(s)||(o=!1,a(),0))}}(e.id,e.selector,t.destSelector,_(()=>t.htmlKind))}if("automation"===e.kind)return function(e){let t=!1;return{id:`automation-${(new Date).getDate()}`,kind:"automation",isApplied:()=>t,do:()=>{if(!t){t=!0;try{e.sort((e,t)=>e.order-t.order).map(e=>{switch(e.kind){case"click":return()=>function(e){try{return Promise.resolve(ge(function(){return q("fake-click","about to click on:",e.selector),Promise.resolve(_e(e.selector)).then(function(e){return e&&e.click(),Promise.resolve()})},function(e){return Promise.reject(e)}))}catch(e){return Promise.reject(e)}}(e);case"type":return()=>function(e){try{return Promise.resolve(ge(function(){return q("fake-click","about to type on:",e.selector,"with text: ",e.data),Promise.resolve(_e(e.selector)).then(function(t){const n=_(()=>Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,"value").set);_(()=>n.call(t,e.data||""));const r=new Event("input",{bubbles:!0});return t.dispatchEvent(r),Promise.resolve()})},function(e){return Promise.reject(e)}))}catch(e){return Promise.reject(e)}}(e);case"scroll":return()=>function(e){try{return Promise.resolve(ge(function(){return q("fake-click","about to scroll to:",e.selector),Promise.resolve(_e(e.selector)).then(function(e){return e.scrollIntoView(!0),Promise.resolve()})},function(e){return Promise.reject(e)}))}catch(e){return Promise.reject(e)}}(e);case"wait":return()=>function(e){try{try{return q("fake-click",`about to wait for: ${e.data}ms`),Promise.resolve(new Promise(t=>{setTimeout(()=>t(),_(()=>e.data)||1e3)}))}catch(e){return Promise.reject(e)}}catch(e){return Promise.reject(e)}}(e);default:return()=>Promise.resolve()}}).reduce((e,t)=>e.then(e=>t()),Promise.resolve()).then()}catch(e){F("failed to run automation with exception:",e)}}},undo:()=>{},redoIfNeeded:()=>!1}}(_(()=>e.block.value).steps);if("visualEdit"===e.kind){const t=_(()=>e.block.value);return function(e,t){let n=!1,r={};const o=function(e,t,n){void 0===n&&(n=!0);const o=t.subChanges.map(n=>{switch(n.kind){case"text":return((e,t,n)=>{if(!e)return()=>{};const r=t.extra;if(Se(e,t,n)){const n=e.childNodes[r].textContent;return e.childNodes[r].textContent=t.value,()=>e.childNodes[r].textContent=n}{const n=e.textContent;return e.textContent=t.value,()=>e.textContent=n}})(e,n,t.version);case"style":return((e,t)=>{if(!e)return()=>{};const n=_(()=>e.style[t.key],null);return e.style.setProperty(t.key,t.value,"important"),()=>e.style.setProperty(t.key,n)})(e,n);case"image":return((e,t)=>{if(!e||!e.removeAttribute||!e.getAttribute)return()=>{};const n=e.getAttribute("srcset")||"";e.removeAttribute("srcset");const r=_(()=>e.src,void 0);e.src=t.value;const o=e.parentElement,i=o&&"PICTURE"===o.nodeName,s=[];
169return i&&o.querySelectorAll("source").forEach(e=>{s.push(e.getAttribute("srcset")||""),e.removeAttribute("srcset")}),()=>{e.setAttribute("srcset",n),e.src=r,i&&o.querySelectorAll("source").forEach((e,t)=>{e.setAttribute("srcset",s[t])})}})(e,n);case"video":return((e,t)=>{if(!e||!e.setAttribute)return()=>{};const n=e.innerHTML;e.innerHTML="";const r=e.getAttribute("src")||"";return e.setAttribute("src",t.value),()=>{e.innerHTML=n,e.setAttribute("src",r)}})(e,n);case"attr":return((e,t)=>{if(!e||!e.setAttribute||!e.getAttribute)return()=>{};const n=e.getAttribute(t.key);return e.setAttribute(t.key,t.value),()=>n?e.setAttribute(t.key,n):e.removeAttribute(t.key)})(e,n)}});n&&(r[t.selector]={ve:t,elem:e,reverts:o})};return{id:e,kind:"visualEdit",isApplied:()=>n,do:()=>{n||(n=!0,t.forEach(e=>{v(()=>!!document.querySelector(e.selector),250,300).then(()=>{const t=document.querySelector(e.selector);o(t,e)})}))},undo:()=>{n&&(n=!1,Object.values(r).forEach(e=>e.reverts.forEach(e=>e())),r={})},redoIfNeeded:()=>{if(!n)return!1;let e=!1;return Object.values(r).forEach(t=>{e=document.body.contains(t.elem)?function(e,t){return e.ve.subChanges.forEac
169h((n,r)=>{n.value!==((e,t,n)=>{switch(t.kind){case"text":return((e,t,n)=>{const r=t.extra;return Se(e,t,n)?e.childNodes[r].textContent:e.textContent})(e,t,n);case"attr":return((e,t)=>e.getAttribute(t.key))(e,t);case"style":return((e,t)=>_(()=>e.style[t.key],null))(e,t);case"image":case"video":return(e=>e.src)(e)}})(e.elem,n,e.ve.version)&&(_(()=>e.reverts[r]()),o(e.elem,{selector:e.ve.selector,subChanges:[n]},!1),t=!0)}),t}(t,e):function(e){e.reverts.forEach(e=>e());const t=document.querySelector(e.ve.selector);return t&&o(t,e.ve),!0}(t)}),e}}}(e.id,t.changes)}if("pageRedirect"===e.kind){const t=_(()=>e.block.value);if(t)return n=t,r=e.options,{id:e.id,kind:"pageRedirect",isApplied:()=>!1,do:()=>{ee(ne(r),n.destUrl,n.redirectAfter,!0===n.retainQueryParams,n.stickinessMode)},undo:()=>{},redoIfNeeded:()=>!1,setDebugId:e=>""}}else if("themeTest"===e.kind){const t=_(()=>e.block.value);if(t)return function(e,t,n){const r=()=>!1;return{id:e,kind:"themeTest",isApplied:r,do:()=>Ee(ne(n),t.targetThemeId),undo:r,redoIfNeeded:r,setDebugId:r}}(e.id,t,e.options)}}var n,r}let ze=!1;function Ke(){ze||(ze=!0,requestAnimationFrame(We))}function We(){$.forEach(e=>{try{e.isApplied()?e.redoIfNeeded():e.do()}catch(t){F("failed to apply mutation command with exception:",t,e)}}),ze=!1}function Qe(e){try{const n=$.get(e),r=n&&n.undo();$.delete(e);const o=L.findIndex(t=>t.id==e);return(t=_(()=>L[o].selector))&&_(()=>J[t])&&delete J[t],L.splice(o,1),Ke(),r}catch(e){return}var t}function Ye(e){return"div"===e.selector&&(e.selector="body div"),L.push(e),He(),{revert:()=>Qe(e.id),mutationId:e.id}}function Ze(){const e=_(()=>window.loomi_ctx.cart);if(e)return e;const t=localStorage.getItem("loomi-cart");if(t)try{return JSON.parse(t)}catch(e){}}var Xe;!function(e){e.CART_CHANGE="CART_CHANGE",e.LOYALTY_CHANGE="LOYALTY_CHANGE"}(Xe||(Xe={}));const et=u((e,t)=>{const n=function(e,t){const n=new Event(Q);return n.key=e,n.value=t,n}(e,t);document.dispatchEvent(n),console.debug("Targeting has changed:",n)},80),tt=()=>window.loomi_ctx.session.id;function nt(e){return _(()=>e.items.map(e=>_(()=>e.selling_plan_allocation.selling_plan.name.toLowerCase())).filter(e=>!!e),[])}function rt(){return JSON.parse(localStorage.getItem("loomi-cart-history")||"[]")}function ot(){const e=_(()=>window.loomi_ctx.sessionProducts);if(e)return e;const t=localStorage.getItem("loomi_session_products"),n=t?JSON.parse(t):[];return _(()=>n.filter(e=>""!=e.handle).reverse().slice(0,20))}function it(e){return JSON.parse(localStorage.getItem(e)||"[]")}function st(e,t,n,r){e=e||[],t=t||[];const o=_(()=>t.filter(t=>!e.find(n(t))))||[],i=[...e,...o].slice(0,25);return i.length>0&&localStorage.setItem(r,JSON.stringify(i)),i}function ct(){return JSON.parse(localStorage.getItem("loomi_purchased_products")||"[]")}const at="vsly_params_history",ut="vsly_visited_pages",lt=function(e){try{const t=e.matches?ht.MOBILE:ht.DESKTOP,n=function(){if(dt!=t){q("device-listener",`device changed to ${t} from ${dt}`),window.loomi_ctx.deviceOverride=t===ht.MOBILE?"m":"d",dt=t;const e=_(()=>window.visually.reload),n=function(){if(e)return Promise.resolve(e()).then(function(){});F("device-listener","can't find reload function")}();if(n&&n.then)return n.then(function(){})}}();return Promise.resolve(n&&n.then?n.then(function(){}):void 0)}catch(e){return Promise.reject(e)}};let dt;function mt(){a()?function(){try{return Promise.resolve(v(()=>c,1e3,10)).then(function(){return ft(),Promise.resolve()})}catch(e){return Promise.reject(e)}}().catch(console.error):ft()}function ft(){let e=_(()=>window.vslyDesktopBreakpoint)||960;e<=0&&(e=960);const t=window.matchMedia(`(max-width: ${e}px)`);t.removeEventListener("change",lt),t.addEventListener("change",lt)}var ht;!function(e){e.MOBILE="MOBILE",e.DESKTOP="DESKTOP"}(ht||(ht={}));const pt=()=>edgetag("getUserId");function vt(){const e="vsly_edgetag";return P(()=>(pt()&&localStorage.setItem(e,pt()),!0)),_(pt)||localStorage.getItem(e)}const wt="lmi_type",yt="lmi_from",gt="lmi_class",_t="lmi_utm_data",St={utm_source:"source",utm_medium:"medium",utm_campaign:"campaign",utm_term:"term",utm_content:"content"},Et=function(e,t){void 0===t&&(t=3);let n=e;for(let e=0;e<t;e++)try{const e=decodeURIComponent(n);if(e===n)break;n=e}catch{break}return n},Pt=function(e){void 0===e&&(e=window.location.search);const t={utm:{},lmi_params:{}};return _(()=>
169new URLSearchParams(e)).forEach((e,n)=>{if(e){const r=St[n],o=Et(e);r?t.utm[r]=o:function(e){return _(()=>[gt,yt,wt].includes(e))}(n)&&(t.lmi_params[n]=o)}}),t};function At(){const e=function(e){let t=[];const n=localStorage.getItem(_t);return null!=n&&(t=[...JSON.parse(n)].slice(0,20)),e&&(e.ts=f(),t=[e,...t]),t}(function(e){if(function(e){return!e||"{}"===JSON.stringify(e)}(e))return null;const t={};return e.campaign&&(t.campaign=e.campaign),e.medium&&(t.medium=e.medium),e.source&&(t.source=e.source),e.term&&(t.term=e.term),e.content&&(t.content=e.content),t}(_(()=>Pt().utm)));return localStorage.setItem(_t,JSON.stringify(e)),e}function It(){const e=_(()=>At(),[]);if(!Array.isArray(e)||0===e.length)return"";const t=e.filter(e=>e.campaign);return 0===t.length?"":_(()=>t.reduce((e,t)=>t.ts>e.ts?t:e,t[0]).campaign,"")||""}const bt=function(e){return Promise.resolve(xt()).then(function(t){return new Promise((n,r)=>{const o=t.transaction([kt],"readonly").objectStore(kt).get(e);o.onerror=e=>{r("IDB e:r"+e.target.error)},o.onsuccess=e=>{n(e.target.result)}})})},xt=function(){try{const e=function(){if(!Tt)return Promise.resolve(new Promise((e,t)=>{const n=indexedDB.open(Ct,1);n.onerror=e=>{t("IDB e:o"+e.target.error)},n.onsuccess=t=>{Tt=t.target.result,e(Tt)},n.onupgradeneeded=e=>{e.target.result.createObjectStore(kt,{keyPath:"id"}).createIndex("id","id",{unique:!0})}})).then(function(){})}();return Promise.resolve(e&&e.then?e.then(function(){return Tt}):Tt)}catch(e){return Promise.reject(e)}},Ct="VISUALLY_IO",kt=Ct;let Tt=null;function Nt(){const e={},t=window.loomi_ctx||{};t.productId&&(e.productId=t.productId);const n=_(()=>{const e=new URL(location.href).searchParams,t="variant";return e.has(t)&&function(e){const t=Number(e),n=isNaN(t)?Number(`${e}`.replace(/[^\d.]+/g,""))||void 0:t;if(void 0!==n&&0!==n)return`${n}`}(e.get(t))})||t.variantId;return n&&(e.variantId=n),e}function Ot(){return _(()=>Ze().items.map(e=>({variantId:e.variant_id||0,quantity:e.quantity||0,productId:e.product_id||0,price:e.price||0})))||[]}const jt=function(e){return void 0===e&&(e=Ze()),_(()=>(("spa"==window.vslyIntegrationType?_(()=>e.attributes.map(e=>e.key)):_(()=>Object.keys(e.attributes)))||[]).filter(e=>!e.startsWith("vsly")&&e.length<20).slice(0,50))||[]};function Lt(){const e=new URL(window.location.href);return e.protocol+"//"+e.hostname+e.pathname}const $t=function(e,t){try{let n;const r=this.cart;if(!r)return Promise.resolve(0);const o=function(){try{var o=r.currency===e?(n=1,r.total_price/100):function(){if(t)return Promise.resolve(v(()=>!!window.loomi_ctx.Currency,100,10)).then(function(){const t=(window.loomi_ctx.Currency.convert(r.total_price,r.currency,e)||0)/100;return n=1,t})}()}catch(e){return}return o&&o.then?o.then(void 0,function(){}):o}();return Promise.resolve(o&&o.then?o.then(function(e){return n?e:0}):n?o:0)}catch(e){return Promise.reject(e)}};function Rt(){const e=_(()=>this.cart.items);if(e&&e.length>0){const t=tt(),n=localStorage.getItem("vsly-last-atc-sid");if(!n)return!1;if(n!==t)return!0;const r=e.map(e=>`${e.variant_id}`);return!!_(()=>rt().find(e=>!!e.sid&&r.includes(`${e.variant_id}`)&&`${e.sid}`!=t))}return!1}function Dt(e){return jt(this.cart).includes(e)}function Ut(e,t){function n(e){return e.toLowerCase()}const r={"==":t=>n(t)==n(e),"!=":t=>n(t)!=n(e),contains:t=>n(t).includes(n(e)),matches:t=>new RegExp(e).test(t)};return!!this.CartSubs().find(e=>r[t](e))}function Mt(){return nt(this.cart)}function qt(e){const t=this.cart;return!!_(()=>t.items.find(t=>t.handle===e))}function Ft(e,t){return"contains"!==t?qt.call(this,e):this.cart?.items?.some(t=>t.handle?.includes(e))??!1}function Bt(e){const t=this.cart;return!!_(()=>t.items.find(t=>!!t.tags&&t.tags.includes(e)))}function Jt(e,t){return"contains"!==t?Bt.call(this,e):this.cart?.items?.some(t=>t.tags?.some(t=>t.includes(e)))??!1}function Vt(e){const t=this.cart;if(t.items.length<=0)return!1;const n=_(()=>t.items.filter(t=>!!t.tags&&t.tags.includes(e)));return _(()=>n.length===t.items.length,!1)}function Ht(e,t){const n=this.cart?.items;return!!n?.length&&n.every(n=>(n.tags||[]).some(n=>"contains"===t?n.includes(e):n===e))}function Gt(e){const t=this.cart;return!!_(()=>t.items.find(t=>!!t.collections&&t.collections.includes(e)))}function zt(){return!0===_(()=>window.loomi_ctx.loyalty.isMember,!1)}function Kt(){return _(()=>
169window.loomi_ctx.loyalty.pointsBalance,0)}function Wt(){return _(()=>window.loomi_ctx.loyalty.earnedPoints,0)}const Qt="__eventn_id";function Yt(){const{id:e,firstSeen:t}=function(e){const t=function(e){try{const t=S(e),{firstSeen:n,id:r}=en(t);if(t)return{id:r,firstSeen:n||nn()}}catch(e){}}(e),n=function(e){const t=window.localStorage.getItem(e),{id:n,firstSeen:r}=en(t);if(t)return{id:n,firstSeen:r||nn()}}(e);if(!t&&!n){const{newId:t,newEpoch:n}=function(){const e=Math.random().toString(36).substring(2,12),t=nn();return{newId:e,newEpoch:t,value:tn(e,t)}}();return Zt(t,n,e),{id:t,firstSeen:n}}if(!n&&t)return Zt(t.id,t.firstSeen,e),t;if(!t&&n)return Zt(n.id,n.firstSeen,e),n;const r=Math.min(t.firstSeen,n.firstSeen);let o=t.firstSeen<=n.firstSeen?t.id:n.id;return Xt(t,n)&&(o=t.id<=n.id?t.id:n.id),n.id==t.id&&n.firstSeen==t.firstSeen||Zt(o,r,e),{id:o,firstSeen:r}}(Qt);return{id:e,firstSession:rn(t),firstSeen:t}}function Zt(e,t,n){void 0===n&&(n=Qt);const r=tn(e,t);_(()=>localStorage.setItem(n,r)),((e,t,n,r)=>{_(()=>window.loomi_ctx.cc)&&!b()||(document.cookie=encodeURIComponent(e)+"="+t+"; path=/; expires=Fri, 31 Dec 9999 23:59:59 GMT"+(n?"; domain="+n:"")+(r?"; secure":""))})(n,r,document.location.hostname.replace("www.","").replace("checkout.",""),"http:"!==document.location.protocol)}const Xt=(e,t)=>e.firstSeen===t.firstSeen&&e.id!==t.id;function en(e){return{firstSeen:_(()=>parseInt(e.split(".")[1]),null),id:_(()=>e.split(".")[0])}}function tn(e,t){return`${e}.${t}`}function nn(){return Math.trunc((new Date).getTime()/1e3)}const rn=e=>(new Date).getTime()/1e3-e<=7200,on="vsly_vid",sn="lmi_debug";function cn(e){return _(()=>new URL(window.location.href).searchParams.get(e)||void 0)}const an=["Roboto","Open Sans","Fredoka","Fredoka","Smooch Sans","Rubik","Lato","Poppins","Oswald","League Spartan","Noto Sans","Raleway","Merriweather","Playfair Display","Inter","JetBrains Mono","Jetbrains Mono"];function un(e){try{(function(e){const t=e.flatMap(e=>_(()=>e.code)).filter(e=>!!e).filter(e=>"widget"===e.kind).map(e=>ln(e.value.env)),n=new Map;return function(e,t){e.forEach(e=>{!function(e,t){const n=new Map;e.forEach(e=>{let[t,r]=e;const o=".font.";if(t.includes(o)){const e=t.split(o)[0]+o;n.has(e)||n.set(e,{families:new Set,weights:new Set});const i=n.get(e);if(t.endsWith(".fontFamily"))i.families.add(r);else if(t.endsWith(".fontWeight")){const e=parseInt(r,10)||500;i.weights.add(e)}}}),function(e,t){e.forEach(e=>{if(e.families.size>0){const n=e.weights.size>0?e.weights:new Set([500]);e.families.forEach(e=>{dn(t,e,n)})}})}(n,t)}(Object.entries(e),t),function(e,t){const n=function(e){const t=".text.isRichText",n=new Set;return e.forEach(e=>{let[r,o]=e;if(r.endsWith(t)&&!0===o){const e=`${r.split(t)[0]}.text.value`;n.add(e)}}),n}(e);0!==n.size&&e.filter(e=>{let[t]=e;return n.has(t)}).forEach(e=>{let[n,r]=e;return function(e,t){var n;if(e)try{!function(e,t){e.querySelectorAll("[style]").forEach(e=>{const n=e.style;if(n.fontFamily){const e=n.fontFamily,r=parseInt(n.fontWeight,10)||500;dn(t,e,new Set([r]))}})}((n=decodeURIComponent(e),(new DOMParser).parseFromString(n,"text/html")),t)}catch(e){console.error("Failed to parse rich text HTML",e)}}(r,t)})}(Object.entries(e),t)})}(t,n),function(e){return Array.from(e.entries()).map(e=>{let[t,n]=e;return{family:t,weights:Array.from(n).sort()}})}(n)})(e).forEach(e=>{let{family:t,weights:n}=e;return function(e,t){return Ye(N("appendFont","div",JSON.stringify({family:e,weights:t})))}(t,n)})}catch(e){F("failed to install custom fonts",e)}}function ln(e){const t={};for(const n in e)if("object"!=typeof e[n]||Array.isArray(e[n]))t[n]=e[n];else{const r=ln(e[n]);for(const e in r)t[`${n}.${e}`]=r[e]}return t}function dn(e,t,n){if(!t)return;const r=t.replaceAll("'","").replaceAll('"',"");if(!function(e){return an.includes(e)}(r))return;e.has(r)||e.set(r,new Set);const o=e.get(r);
169o.add(400),n.forEach(e=>{o.add(e)})}const mn=function(e,t,n,r){void 0===n&&(n=!0),void 0===r&&(r=void 0);try{const o=_(()=>window.loomi_api.addToCart),i=function(){if(o)return Promise.resolve(window.loomi_api.addToCart(e,t,n,r)).then(function(){})}();return Promise.resolve(i&&i.then?i.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},fn=function(e){try{let n;function t(t){return n?t:e.map(e=>{const t=String(e.id),n=pn.get(gn(e.id))||r[t];return n?{...e,variants:Array.isArray(e.variants)?e.variants.map(e=>{const t=_n(e,n);return t?{...e,fixed_price_currency:t.price.currencyCode,price:parseFloat(t.price.amount),compare_at_price:t.compareAtPrice?parseFloat(t.compareAtPrice.amount):e.compare_at_price}:e}):e.variants}:e})}if(!e||0===e.length)return Promise.resolve(e);let r={};const{productIdsToFetch:o}=Sn(e),i=function(){if(o.length>0)return function(t,n){try{var o=Promise.resolve(hn(e)).then(function(e){r=e,Object.entries(r).forEach(e=>{let[t,n]=e;return pn.set(gn(t),n)})})}catch(e){return n(e)}return o&&o.then?o.then(void 0,n):o}(0,function(t){return console.error("vsly",t),n=1,e})}();return Promise.resolve(i&&i.then?i.then(t):t(i))}catch(s){return Promise.reject(s)}},hn=function(e){try{return Promise.resolve(fetch(`https://${wn()}/api/2025-10/graphql.json`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({query:vn(e)})})).then(function(e){if(!e.ok)throw new Error(`Shopify API error: ${e.status}`);return Promise.resolve(e.json()).then(function(e){if(e.errors)throw new Error(`GraphQL errors: ${JSON.stringify(e.errors)}`);const t={};for(const n in e.data){const r=e.data[n];if(!r)continue;const o=yn(r.id);t[o]={variants:{}}
169,r.variants.edges.forEach(e=>{const n=yn(e.node.id);t[o].variants[n]={price:e.node.price,compareAtPrice:e.node.compareAtPrice}})}return t})})}catch(e){return Promise.reject(e)}},pn=new class extends H{constructor(e,t){super(new z(e),t)}}("p",18e5);function vn(e){const{productIdsToFetch:t,maxVariantsPerProduct:n}=Sn(e),r=se();return`\n    query GetProductPrices ${r?`@inContext(country: ${r})`:""} {\n      ${t.map(e=>`\n    product_${e}: product(id: "gid://shopify/Product/${e}") {\n      id\n      variants(first: ${n}) {\n        edges {\n          node {\n            id\n            price {\n              amount\n              currencyCode\n            }\n            compareAtPrice {\n              amount\n              currencyCode\n            }\n          }\n        }\n      }\n    }\n  `).join("\n")}\n    }\n  `}const wn=()=>window.loomi_ctx.storeAlias.toLowerCase().replaceAll("_","-")+".myshopify.com";function yn(e){const t=e.match(/\/(\d+)$/);return t?t[1]:e}const gn=e=>String(e)+se(),_n=(e,t)=>{let n=String(e.variant_id);const r=Object.keys(t.variants);return 1==r.length&&(n=r[0]),t.variants[n]},Sn=e=>{let t=1,n=!0;return{productIdsToFetch:e.map(e=>{if(!Array.isArray(e.variants))return{id:String(e.id),needsFetch:!1};const r=new Set(e.variants.map(e=>e.price)).size>1;r&&(n=!1),e.variants.length>t&&(t=e.variants.length);const o=((e,t,n)=>{if(!e)return!0;if(!n)return!1;const r=e.variants||{};return t.some(e=>void 0===r[e])})(pn.get(gn(e.id)),e.variants.map(e=>String(e.variant_id)),r);return{id:String(e.id),needsFetch:o}}).filter(e=>e.needsFetch).map(e=>e.id),maxVariantsPerProduct:n?1:t}},En=new K("recs_cache",300001),Pn=function(e,t){try{const n=Promise.resolve([]);return Promise.resolve(function(r,o){try{var i=function(){if(!e)return n;let r=_(()=>e.recommendationOptions);if(!r)return n;var o;!function(e){const{productId:t,variantId:n}=Nt();(t||n)&&(e.productId={productId:t,variantId:n})}(r),r.cartItems=(o=Ot(),_(()=>o.filter(e=>!!e.productId).map(e=>({productId:`${e.productId}`,variantId:`${e.variantId}`,quantity:e.quantity||1})))),r.currency=_(()=>Ze().currency||"USD","USD"),r.cart_total=_(()=>Ze().total_price,0),_(()=>+Date.now()-window.loomi_ctx.last_vid_atc.ts<5e3)&&(r.last_vid_atc=window.loomi_ctx.last_vid_atc),r.respSize=_(()=>window.visually.recsPerVariant[t.variantId]),["RECENTLY_VIEWED","VIEWED_WITH_RECENTLY_VIEWED"].find(e=>An(r,e))&&(r.recentlyViewed=ot().filter(e=>!!e.productId).map(e=>({productId:`${e.productId}`,variantId:`${e.variantId||""}`,...e.ts?{ts:e.ts}:{}})));const i=ct();return i.length>0&&(r.pastPurchases=i),(An(r,"CART_ITEMS")||function(e){return _(()=>!!e.layeredRuling.find(e=>"latest_added"==e.ruleCond.itemSelection))}(r))&&(r.cartHistory=kn()),r.userId=_(()=>window.loomi_ctx.userId,""),t&&(r.widgetContext=t),_(()=>!!window.loomi_ctx.storeAlias)&&(r.storeAlias=window.loomi_ctx.storeAlias),r.locale=_(()=>window.Shopify.locale)||_(()=>window.visually.locale),E()&&(r.clientId=E()),r.country=se(),Promise.resolve(function(e,t){const n=_(()=>window.loomi_api.updateRecsOpts),r=_(()=>n.get(function(e){return e.widgetId+e.experienceId+e.variantId+e.sectionId}(e))(t),t);return _(()=>n.get(window.loomi_ctx.storeAlias)(r),r)}(t,r)).then(function(e){return r=e,Promise.resolve(Cn(r))})}()}catch(e){return o(e)}return i&&i.then?i.then(void 0,o):i}(0,function(e){return F("loomi-widget,recProducts failed:",e),n}))}catch(e){return Promise.reject(e)}};function An(e,t){return e.type===t||_(()=>e.strategyPerSlot.find(e=>e.strategy===t))||_(()=>!!Object.values(e.conditions).find(e=>e.qbProps.envKey===t))||_(()=>!!e.layeredRuling.find(e=>e.strategy===t||!!_(()=>e.strategyPerSlot.slots.find(e=>e.strategy===t))))}function In(e){const t=function(){const e=window.innerWidth;return e<=360?200:e<=480?360:e<=640?480:e<=768?640:e<=960?768:1024}();e.products.forEach(e=>{const n=new URL(e.image.src);n.searchParams.set("width",`${Math.min(t,e.image.width||1280)}`),e.image.src=n.href})}function bn(){return`https://${A(window.loomi_ctx.env)}/api/recommendations/web/public/v2/recommend`}const xn=new Map,Cn=function(e){try{function t(){return _(()=>o.products)}const n=g(e),r=W(n);let o=En.get(r);const i=function(){if(!o){let e=!0;return me("kill-locale-currency")&&(e=!1),Promise.resolve(((e,t,n)=>{if(xn.has(e))return xn.get(e);const r=window.vslyNativeFetch||window.fetch,o=function(){try{return Promise.resolve(function(e,o){try{var i=function(){function e(){return Promise.resolve(o.json()).then(function(e){const t=function(){if(e.fetchPrices&&n)return Promise.resolve(fn(e.products)).then(function(t){e.products=t})}();return t&&t.then?t.then(function(){return e}):e})}let o;const i=t.length>1e4&&!me("disable-recs-post")?Promise.resolve(r(bn(),{method:"POST",headers:{"Content-Type":"text/plain"},body:t})).then(function(e){o=e}):Promise.resolve(r(`${bn()}?q=${t}`)).then(function(e){o=e});return i&&i.then?i.then(e):e()}()}catch(e){return o(!0,e)}return i&&i.then?i.then(o.bind(null,!1),o.bind(null,!0)):o(!1,i)}(0,function(t,n){if(xn.delete(e),t)throw n;return n}))}catch(e){return Promise.reject(e)}}();return xn.set(e,o),o})(r,n,e)).then(function(e){o=e,_(()=>
169[In,window.loomi_api.onRecsResp].forEach(e=>e&&e(o))),En.set(r,o)})}}();return Promise.resolve(i&&i.then?i.then(t):t())}catch(s){return Promise.reject(s)}},kn=()=>rt().map(e=>{const t={...e};return delete t.sid,t});function Tn(e){return`vsly_pi_${e}`}function Nn(e){return`vsly_hbt_${e}`}function On(e){return`vsly_hbc_${e}`}function jn(e){return Array(e).fill(0).map(()=>Math.floor(10*Math.random())).join("")}function Ln(){try{const e=_(()=>window.vslyAntiFlickerReveal,void 0);e&&e()}catch(e){}}const $n=function(e,t){try{if(y(e)||y(t))return Promise.resolve({products:[]});const n=function(e,t){const n=window.loomi_ctx.storeAlias||"",r=new URLSearchParams({byHandle:g({handles:e}),al:n,slimResp:"1"});return t&&t.length>0&&r.set("metafields",g({fields:t})),`${bn()}?${r.toString()}`}(e,t);return Promise.resolve(fetch(n)).then(function(e){if(!e.ok)throw new Error(`vsly 400 ${e.statusText}`);return e.json()})}catch(e){return Promise.reject(e)}},Rn=function(e){try{try{const t=g(e),n=window.loomi_ctx.storeAlias,r=W(`${n}_${t}_${se()}`),o=Un.get(r);if(o)return Promise.resolve(o);if(Mn.has(r))return Promise.resolve(Mn.get(r));const i=function(){try{return Promise.resolve(function(e,o){try{var i=function(e,o){try{var i=function(){const e=new URL(bn());e.searchParams.set("al",n),e.searchParams.set("productQuery",t);const o=window.vslyNativeFetch||window.fetch;return Promise.resolve(o(e.toString(),{method:"GET",headers:{Accept:"application/json"}})).then(function(e){return e.ok?Promise.resolve(e.json()).then(function(e){return Promise.resolve(function(e){try{if(!e||!e.results||"object"!=typeof e.results)return Promise.resolve({results:{}});const t=e.results,n=function(e){return Object.keys(e).map(t=>{const n=e[t];return n&&n.id?{key:t,product:n}:null}).filter(e=>!!e)}(t);if(0===n.length)return Promise.resolve({...e,results:t});let r=n.map(e=>e.product);return r=function(e){const t={products:e};return In(t),t.products}(r),Promise.resolve(Dn(r)).then(function(o){return r=o,r=function(e){const t=window.loomi_api;if(!t||!t.onRecsResp)return e;try{const n={products:e};return t.onRecsResp(n),n.products}catch(t){return F("onRecsResp hook failed",t),e}}(r),function(e,t,n){t.forEach((t,r)=>{const o=n[r];o&&o.id&&(e[t.key]=o)})}(t,n,r),{...e,results:t}})}catch(e){return Promise.reject(e)}}(e)).then(function(e){return Un.set(r,e),e})}):{results:{}}})}()}catch(e){return o(e)}return i&&i.then?i.then(void 0,o):i}(0,function(e){return F("queryProducts failed:",e),{results:{}}})}catch(e){return o(!0,e)}return i&&i.then?i.then(o.bind(null,!1),o.bind(null,!0)):o(!1,i)}(0,function(e,t){if(Mn.delete(r),e)throw t;return t}))}catch(e){return Promise.reject(e)}}();return Mn.set(r,i),Promise.resolve(i)}catch(e){return F("queryProducts setup failed:",e),Promise.resolve({results:{}})}}catch(e){return Promise.reject(e)}},Dn=function(e){try{return me("kill-locale-currency")||_(()=>!Array.isArray(e[0].variants))?Promise.resolve(e):Promise.resolve(fn(e))}catch(e){return Promise.reject(e)}},Un=new K("ai_recs_cache",300001),Mn=new Map,qn=function(e,t,n){try{const o=Yt(),i=function(e,t,n){const r=function(){const e=Ot(),t={path:window.location.pathname,host:window.location.hostname};_(()=>e.length)>0&&(t.cartItems=e);const n=_(()=>Ze().token);n&&(t.cartToken=n);const r=At();r&&(t.trafficSources=r),t.productsSeenInSession=ot(),t.isCustomer=!!E(),t.query=window.location.search||"",t.hash=window.location.hash||"";const o=jt();return o&&(t.cartAttributes=o),t}();r.storeAlias=e;const o=E();o&&(r.clientId=o),r.anonymousId=t.id,r.firstSeen=t.firstSeen,r.firstSession=t.firstSession,r.gaId=_(()=>document.cookie.split(";").map(e=>e.split("=")).find(e=>{let[t,n]=e;return"_ga"==t.trim()})[1],"");const i=window.loomi_ctx;r.customerTags=_(()=>i.ctags.slice(0,20)),r.landingPage=_(()=>i.session.landing_page),r.hasSubs=!!_(()=>nt(Ze()).length>0);const s=vt();s&&(r.edgetag=s);const c=function(){try{const e=_(()=>new URL(window.location.href));if(_(()=>e.searchParams.get("forceOverride"))){const t=_(()=>e.searchParams.get("targeting"));if(t)return JSON.parse(decodeURIComponent(escape(atob(t))))}}catch(e){F("preview overrides",e)}return{}}(),a=it(at),u=function(){const e=it(ut);function t(e){return new Date(e.ts).valueOf()}function n(){const e=new URL(location.href);return["vslyvid","vslywgid","vslysid","lmi_preview","targeting","vsly_vid"].forEach(t=>e.searchParams.delete(t)),e.search||""}return bt(ut).then(r=>{const o={ts:new Date,name:Lt(),search:_(n,"")},i=!!o.search,s=(_(()=>r.visits)||e||[]).filter(e=>!i||!(e.name===o.name&&!e.search)).filter(e=>
169!(e.name===o.name&&(o.search===e.search||i&&!e.search))).sort((e,n)=>t(n)-t(e)).slice(0,500);var c;s.unshift(o),(c={id:ut,visits:s},Promise.resolve(xt()).then(function(e){return new Promise((t,n)=>{const r=e.transaction([kt],"readwrite").objectStore(kt).put(c);r.onerror=e=>{n("IDB e:w"+e.target.error)},r.onsuccess=()=>{t("")}})})).catch()}).catch(),st([{ts:f(),name:Lt()}],e,e=>t=>e.name===t.name,ut)}(),l=ct(),d={deviceKind:_(()=>window.loomi_ctx.deviceOverride,void 0),...n||{}},m=!!_(()=>navigator.userAgent.includes("Macintosh")&&"ontouchend"in document),h=_(()=>window.innerWidth,0),p=_(()=>window.vslyDesktopBreakpoint)||960,v=_(()=>S("cart_currency"))||_(()=>Ze().currency)||"",w=_(()=>i.current_product);if(w){r.oos=_(()=>w.oos),r.price=_(()=>w.price),r.iq=_(()=>w.variants.reduce((e,t)=>t.iq+e,0)),r.productId=_(()=>{const e=Nt().productId;return Number.isFinite(Number(e))?e.toString():""},"");const e=1*i.variantId;Number.isFinite(e)&&(r.vid=e)}const y=_(tt);"spa"==window.vslyIntegrationType&&(r.spa=!0);const g=_(()=>i.ttl);return{cartCurrency:v,...r,queryHistory:a,isIPadPro:m,windowInnerWidth:h,desktopBreakpoint:p,visitedPages:u,ttl:Number.isFinite(g)?g:0,purchasedLineItems:l,sid:y,...d||{},...c||{}}}(e,o,n);return Promise.resolve(function(e,t){try{const n=g(t),o=function(e){const{previewKey:t,debugAllocator:n,previewVariantId:o}=function(){[r,on].map(e=>{const t=cn(e);t&&sessionStorage.setItem(e,t)});const e=sessionStorage.getItem(r),t=sessionStorage.getItem(on);return{previewKey:e,debugAllocator:cn(sn),previewVariantId:t}}();let i=new URL(e);return t&&i.searchParams.append(r,t),n&&i.searchParams.append(sn,"true"),o&&i.searchParams.append(on,o),i}(Vn(e).cfgUrl);o.searchParams.append("q",n);const i=W(o.href),s=window.vslyNativeFetch||window.fetch,c=Bn.has(i)?Bn.get(i):s(o.href,{priority:"high"}).finally(()=>Bn.delete(i));return Bn.set(i,c),Promise.resolve(c).then(function(e){if(e.ok)return Promise.resolve(e.json());throw new Error(`failed to load config: ${e.statusText}`)})}catch(e){return Promise.reject(e)}}(t,i)).then(function(e){return _(()=>{window.loomi_ctx.audiences=e.audiences,_(()=>e.audiences&&localStorage.setItem("vsly_audiences",JSON.stringify(e.audiences))),window.loomi_ctx.testedThemes=e.testedThemes||[]}),function(e){const t=e.currentVariant;window.loomi_ctx={...window.loomi_ctx||{}};const n=_(()=>t.pid);n&&(window.loomi_ctx.productId=`${n}`);const r=_(()=>t.vid);r&&(window.loomi_ctx.variantId=`${r}`);const o=_(()=>t.price);o&&(window.loomi_ctx.variantPrice=o);const i=_(()=>t.meta);i&&(window.loomi_ctx.productMeta=`${i}`)}(e),st(e.queryHistory,i.queryHistory,e=>t=>t.v===e.v&&t.k===e.k,at),function(e){var t;(t=e.experiments)&&t.findIndex(e=>{const t=_(()=>e.clientTargetingFormula.toString(),"")||"";return t.includes("CartItemHasTag")||t.includes("CartItemHasCollection")||t.includes("AllCartItemsHasTag")})>-1||!0===_(()=>e.flags["sdk-enable-cart-enrichment"],!1)&&(e.flags["sdk-enable-cart-enrichment"]=!1)}(e),{configuration:e,tracking:o}})}catch(e){return Promise.reject(e)}},Fn="vslyb",Bn=new Map;function Jn(e){if("number"==typeof e.chance&&e.chance<100){const t={experienceId:e.name,variantId:e.variant,storeAlias:_(()=>window.loomi_ctx.storeAlias),anonymousId:_(()=>window.loomi_ctx.userId)};e.version&&(t.version=e.version);const r=g(t),o=_(()=>window.loomi_ctx.env,n.PROD),i=new URL(Vn(o).cfgUrl.replace("/allocate","/match"));i.searchParams.append("q",r),fetch(i)}}function Vn(e){let t="/api/allocator/web/public/v2/allocate";return Gn(e)&&(t="/allocate"),{cfgUrl:`${Hn(e)}${t}`}}function Hn(e){return Gn(e)?"http://localhost:8080":`https://${A()}`}function Gn(e){return[n.TEST,n.LOCAL].includes(e)}function zn(e){window.visually={..._(()=>window.visually)||{},flags:e},localStorage.setItem("loomi-flags",JSON.stringify(e))}function Kn(e,t,n){const r=function(r){_(()=>!!r.persisted)&&(window.loomi_ctx.cart=void 0,n(e,t,500).catch(e=>{F("failed reloading sdk",e)}))};_(()=>!window.loomi_ctx.pageshow)&&(q("pageshow initialized"),s().then(()=>{window.addEventListener("pageshow",r),window.loomi_ctx.pageshow=!0}))}function Wn(e){return`${e.name}-${e.variant}`}function Qn(e){return`${e.name}-${e.variant}-${e.version||0}`}function Yn(e){$.forEach(t=>{e&&!e(t)||(t.undo(),t.do())})}const Zn=(e,t)=>!!_(()=>e.audiences.includes(t)),Xn=e=>{const t={},n=Zn(e,"d"),r=Zn(e,"m");return n||r?(_(()=>e.experiments.filter(e=>
169!!e.code).forEach(e=>e.code.forEach(r=>{const o=_(()=>r.value.env.general.recsCount),i=_(()=>n?o.desktop.value:o.value);i>(t[e.variant]||0)&&"number"==typeof i&&(t[e.variant]=i)}))),t):t},er=function(e){void 0===e&&(e={});try{const t=Z+X;return we(Z,X),Promise.resolve(v(()=>_(()=>window.visually.widgets[t]),100,50)).then(function(){const n="#vsly-overlay",r="#vslyp-vsly-overlay";if(!document.querySelector(r)){const e=document.createElement("div");e.id=n.replace("#",""),e.textContent=".",e.style.opacity="0",e.style.display="none",document.body.appendChild(e);const t=document.createElement("script");t.id=r.replace("#",""),t.type="text/props",t.textContent="{}",document.body.appendChild(t)}return window.visually.widgets[t](n),Promise.resolve(v(()=>!!window.loomi_api._openProductOverlay,100,50)).then(function(){window.loomi_api._openProductOverlay((e=>{const t=_(()=>e.widgetContext)||_(()=>e.mpCtx)||_(()=>e.overlay.mpCtx);return t?{...e,overlay:{...e.overlay||{},mpCtx:t}}:e})(e))})})}catch(e){return Promise.reject(e)}};function tr(e,t,n,r){const[o,i]=t.split(",");return new Promise(t=>{bt(ut).then(n=>{for(const s of function(e,t,n){const r=(new Date).valueOf();return(_(()=>e.visits,[])||[]).filter(e=>{const o=new Date(e.ts).valueOf(),i=36e5,s=parseInt(t);switch(n.replaceAll('"',"")){case"hours":return o>r-s*i;case"weeks":return o>r-s*i*24*7;case"days":return o>r-s*i*24;default:return!1}})}(n,o,i))if(r||cr(e)){if(rr(s,e))return void t(!0)}else if(nr(s,e))return void t(!0);t(!1)})})}function nr(e,t){return!![or(e),sr(or(e))].find(e=>e.includes(t))}function rr(e,t){const n=e.search||"",r=or(e)+n;return!![r,sr(r)].find(e=>e.includes(ir(t)))}function or(e){return ir(function(e){const t=_(()=>new URL(e));if(!t)return e;const n=t.pathname.split("/");return/^[a-z]{2}-[a-z]{2}$/.test(n[1])&&(t.pathname=n.slice(2).join("/")),ir(t.href)}(e.name))}function ir(e){const t=_(()=>new URL(e));return t&&t.pathname.endsWith("/")?"/"===t.pathname?t.href.slice(0,-1):(t.pathname=t.pathname.slice(0,-1),t.href):e}function sr(e){return e.includes("/products/")&&e.includes("/collections/")?e.replace(/\/collections\/[^/]+/,""):e}function cr(e){return _(()=>!!new URL(e).search)}const ar=function(e){try{return Er(),yr(e.clientTargetingFormula)&&(mr[hr(e)]=e),Promise.resolve(Sr(e)).then(function(t){return t?(vr(e),!0):(q(`exp: ${e.gaName} not run client targeting: ${e.clientTargetingFormula} => false`),!1)})}catch(e){return Promise.reject(e)}},ur=function(e){try{const t=Object.entries(mr).map(t=>{let[n,r]=t;return yr(r.clientTargetingFormula)&&(mr[hr(r)]=r),{exp:r,shouldBeApplied:lr(r.clientTargetingFormula,e,r.name),hasBeenApplied:()=>!!fr[hr(r)]}});return Promise.resolve(gr(t)).then(function(e){!function(e){e.filter(e=>e.hasBeenApplied()&&!e.shouldBeApplied).flatMap(e=>{const t=_(()=>fr[hr(e.exp)]);return t&&delete fr[hr(e.exp)],t}).forEach(e=>{_(e.revert)})}(e),function(e){e.filter(e=>e.shouldBeApplied&&!e.hasBeenApplied()).forEach(e=>{var t,n,r;vr(e.exp),t=e.exp,n=wr,void 0===r&&(r=C()),n.has(t.variant)||(xr(r,t),n.add(t.variant),Jn(t))})}(e)})}catch(e){return Promise.reject(e)}},lr=function(e,t,n){void 0===n&&(n="");try{if(void 0===t&&(t=pr()),yr(e)){t.Total=$t,t.CartHasSubs=Ut,t.CartSubs=Mt,t.CartHasItem=qt,t.CartHasItemMatching=Ft,t.CartItemHasTagMatching=Jt,t.CartItemHasTag=Bt,t.AllCartItemsHasTag=Vt,t.AllCartItemsHasTagMatching=Ht,t.CartItemHasCollection=Gt,t.IsLoyaltyCustomer=zt,t.LoyaltyPointsBalance=Kt,t.LoyaltyPointsEarned=Wt,t.PageVisit=tr,t.CustomerTag=Pr,t.IsGuest=Ar,t.AbandonedCart=Rt,t.CartAttrName=Dt,t.UseCaseId=n;const r=()=>new Function(`\n        const c = arguments[0];\n        return ${function(e){const t=t=>_(()=>e.includes(t));for(const n of["PageVisit","Total"])t(`c.${n}`)&&!t(`await c.${n}`)&&(e=`( ${e.replaceAll(`c.${n}`,`await c.${n}`)} )`);return!t("(async ()")&&t("await")?`(async () => (${e}))()`:e}(e)}`)(t);return Promise.resolve(new Promise(e=>e(r())).catch(e=>(F("client side formula err",e),!1)))}return Promise.resolve(!0)}catch(e){return Promise.reject(e)}};let dr=!1;const mr={},fr={},hr=e=>`${e.name}-${e.variant}`;function pr(){return{cart:Ze(),Total:$t,CartHasSubs:Ut,CartSubs:Mt,CartHasItem:qt,CartHasItemMatching:Ft,CartItemHasTagMatching:Jt,CartItemHasTag:Bt,AllCartItemsHasTag:Vt,AllCartItemsHasTagMatching:Ht,CartItemHasCollection:Gt,IsLoyaltyCustomer:zt,LoyaltyPointsBalance:Kt,LoyaltyPointsEarned:Wt,PageVisit:tr,CustomerTag:Pr,IsGuest:Ar,AbandonedCart:Rt,CartAttrName:Dt}}function vr(e){const t={experienceId:e.name,variantId:e.variant,gaExperienceName:e.gaName,gaVariantName:e.gaVariant,reportGa:e.ga,publishedAt:e.publishedAt,version:e.version};var n;n=_(()=>e.code.map(e=>{try{return function(e,t){if("compound"===e.kind){const n=e.value,r=function(e,t,n,r,o){const i=[];return n&&""!==n&&i.push(N(e,t,n)),r&&""!==r&&i.push(N("appendCss",t,r)),o&&""!==o&&i.push(N("appendJs",t,o)),i}(n.htmlKind,e.selector,n.html,n.css,n.js),o=N(e.kind,e.selector,r);o.options=t;const i=Ye(o);return i.htmlId=r[0].id,r[1]&&(i.cssId=r[1].id),r[2]&&(i.jsId=r[2].id),i}if("widget"===e.kind){const n=N(e.kind,e.selector,"");n.options=t,n.block=e;const r=function(e,t){const n=_(()=>e.block.value);return{...t,sectionId:_(()=>n.env.sectionId),widgetId:_(()=>n.widgetId),widgetVersion:_(()=>n.version)}}(n,t);!function(e,t){const n=_(()=>e.block.value.env);
169n&&Object.entries(t).forEach(e=>{let[t,r]=e;return n[t]=r})}(n,r);const o=Ye(n);return o.htmlId=n.id,o}if(["pageRedirect","themeTest"].includes(e.kind)){const n=N(e.kind,e.selector,"");return n.options=t,n.block=e,Ye(n)}if(["moveElem","automation","visualEdit"].includes(e.kind)){const n=N(e.kind,e.selector,"");n.options=t,n.block=e;const r=Ye(n);return r.htmlId=n.id,r}const n=N(e.kind,e.selector,e.value);return n.options=t,Ye(n)}(e,t)}catch(e){}}).filter(e=>!!e),[]),fr[hr(e)]=n,function(e){if(!0!==window.visually?.flags?.["experience-applied-callback"])return;const t=window.vslyOnExperienceApplied;if("function"!=typeof t)return;const n={experienceId:e.name,variantId:e.variant,experienceName:e.gaName,variantName:e.gaVariant,version:e.version??0};try{Promise.resolve(t(n)).catch(e=>F("vslyOnExperienceApplied callback failed",e))}catch(e){F("vslyOnExperienceApplied callback failed",e)}}(e)}const wr=new Set;function yr(e){return!!e&&""!==e}const gr=function(e){try{return Promise.resolve(Promise.all(e.map(function(e){try{return Promise.resolve(e.shouldBeApplied).then(function(t){return{...e,shouldBeApplied:t}})}catch(e){return Promise.reject(e)}})))}catch(e){return Promise.reject(e)}},_r=e=>{const t=_(()=>e.key),n=_(()=>e.value),r=pr();t===Xe.CART_CHANGE?(ur({...r,cart:n}),_(()=>window.loomi_ctx.maintainCartAttributes(n))):t===Xe.LOYALTY_CHANGE&&ur(r)};function Sr(e){return lr(e.clientTargetingFormula,void 0,e.name)}function Er(){dr||s(()=>document).then(()=>{document.addEventListener(Q,_r),dr=!0})}function Pr(e,t){if(void 0===t&&(t=""),"contains"===t)return _(()=>window.loomi_ctx.ctags?.some(t=>t.includes(e)))||!1;const n=["!","not in"].some(e=>t.includes(e)),r=_(()=>window.loomi_ctx.ctags.includes(e))||!1;return n?!r:r}function Ar(){return Promise.resolve(_(()=>!window.loomi_ctx.clientId))}function Ir(e){const t=hr(e),n=fr[t];n&&(n.forEach(e=>_(e.revert)),delete fr[t]),delete mr[t]}const br=function(e,t,n){try{let r;return Promise.resolve(n()).then(function(n){n?(xr(t,e),(yr(e.clientTargetingFormula)||function(e){return!!me("trigger-delayed-allocation")&&_(()=>["jsFunction","jsCondition"].includes(e.trigger.type))}(e))&&Jn(e)):r=1})}catch(e){return Promise.reject(e)}};function xr(e,t){return _(()=>{e.register(t.name,t.variant,t.gaVariant,t.gaName);const n=t.ga;return e.track(o.USE_CASE,{use_case:t.name,use_case_variant:t.variant,...t.version?{version:t.version}:{}},{isAudience:t.isAudience,isRedirect:t.isRedirect,immediate:t.immediate,gaName:t.gaName,gaVariant:t.gaVariant,...n?{reportGa:n}:{}})})}const Cr=new Set,kr=new Set,Tr=new Set,Nr=new Set;let Or;function jr(e){void 0===Or&&(Or=new MutationObserver(Lr(e)),Or.observe(document.body,{childList:!0,subtree:!0,attributes:!1,characterData:!1}))}function Lr(e){return()=>{$r(Cr,Tr,(t,n)=>{br(n,e,()=>(t.add(Rr(n.trigger.selector,n)),ar(n)))}),$r(kr,Nr,(t,n,r)=>{const o=n.trigger;t.add(Rr(o.selector,n)),r.addEventListener(o.name,()=>br(n,e,()=>ar(n)),{once:void 0!==o.once&&o.once})})}}function $r(e,t,n){e.forEach(e=>{_(()=>{const r=e.trigger.selector;document.body.querySelectorAll(r).forEach(o=>{t.has(Rr(r,e))||n(t,e,o)})})})}function Rr(e,t){return`${e}-${t.name}`}function Dr(e){const t=JSON.stringify({ts:(new Date).getTime(),...e});let n,r,o=0;if(0===t.length)return o;for(n=0;n<t.length;n++)r=t.charCodeAt(n),o=(o<<5)-o+r,o|=0;return o}function Ur(e){const t=Dr(e);return Br(t),v(()=>new Function(e.code)(window),e.timeoutMillis,e.retries,()=>void 0===Jr(t))}function Mr(e){return JSON.parse(localStorage.getItem(e)||"[]")}let qr=[];const Fr=function(e,t,n){_(()=>t.experiments.forEach(t=>{n&&n.matches(t)?n.onSubscribeCall(t):Gr(t,e)}))},Br=(e,t)=>{qr.push({handler:e,experienceKey:t})},Jr=e=>qr.find(t=>t.handler===e),Vr=function(e){qr.filter(t=>t.experienceKey===e).forEach(e=>{try{"number"!=typeof e.handler&&e.handler()}catch(e){}}),qr=qr.filter(t=>t.experienceKey!==e)};function Hr(e,t){Gr(e,t)}function Gr(t,n){switch(_(()=>t.trigger.type)){case e.PageLoad:!function(e,t){br(e,t,()=>ar(e))}(t,n);break;case e.Timeout:!function(e,t){const n=setTimeout(()=>{br(e,t,()=>ar(e))},e.trigger.timeoutMillis);Br(()=>{n&&clearTimeout(n)})}
169(t,n);break;case e.Inactivity:!function(e,t){const n=e.trigger.timeoutMillis;let r;function o(){clearTimeout(r),r=setTimeout(()=>{br(e,t,function(){try{return Promise.resolve(Sr(e)).then(function(t){return t&&ar(e),t})}catch(e){return Promise.reject(e)}})},n)}o();const c=["mousemove","keypress","scroll","touchstart","touchmove"];Br(()=>{clearTimeout(r),i(()=>document).then(()=>c.forEach(e=>document.removeEventListener(e,o)))}),s(()=>document,!0).then(()=>{c.forEach(e=>document.addEventListener(e,o,{passive:!0}))})}(t,n);break;case e.Selector:!function(e,t){jr(e),Cr.add(t),Lr(e)()}(n,t);break;case e.ExitIntent:!function(e,t){const n=r=>{_(()=>!r.toElement&&!r.relatedTarget)&&br(e,t,()=>{const t=ar(e);return i(()=>document).then(()=>{document.removeEventListener("mouseout",n)}),t})};s(()=>document,!0).then(()=>{document.addEventListener("mouseout",n,{passive:!0})}),Br(()=>{i(()=>document).then(()=>{document.removeEventListener("mouseout",n)})})}(t,n);break;case e.JSCondition:!function(e,t){Ur(e.trigger).then(()=>{br(e,t,()=>ar(e))}).catch(()=>{})}(t,n);break;case e.JSFunction:!function(e,t){!function(n){try{const r=new Function(`return async function() { ${n.code} }`)()(),o=Dr(n);Br(o),r.then(()=>void 0!==Jr(o)&&void br(e,t,()=>ar(e)))}catch(e){}}(e.trigger)}(t,n);break;case e.JSEvent:!function(e,t){const n=e.trigger,r="vsly-js-events";function o(n){n&&br(e,t,()=>ar(e))}const c=e=>{let t;try{t=new Function(n.jsEvent.matchCode)(e),localStorage.setItem(r,JSON.stringify([...Mr(r),{event:{detail:e.detail},ts:(new Date).valueOf()/1e3}].splice(0,25)))}catch(e){F("handleJsEvent",e),t=!1}o(t)};o(function(e,t){return _(()=>!!Mr(e).find(e=>{const n=e.ts;return(new Date).valueOf()/1e3-n<2628e3&&new Function(t)(e.event)}))}(r,n.jsEvent.matchCode)),s(()=>window).then(()=>{window.addEventListener(n.jsEvent.name,c)}),Br(()=>{i().then(()=>{window.removeEventListener(n.jsEvent.name,c)})})}(t,n);break;case e.Conjunction:!function(t,n){if(function(t){return[e.ExitIntent,e.Selector,e.Timeout].includes(t.trigger.condition.type)}(t)){const e=t.trigger;Ur(e.jsCond).then(()=>{Gr({...t,trigger:e.condition},n)}).catch(()=>{})}}(t,n);break;case e.ElementEvent:!function(e,t){jr(t),kr.add(e),Lr(t)()}(t,n)}}const zr=["vsly-backdrop-container","__loomi_crosshair_container"];function Kr(e){let t=_(()=>e.target),n=!1;for(;t;){if(zr.includes(_(()=>t.id))){n=!0;break}t=_(()=>t.parentElement)}n&&(q("vsly","about to stop propagation of event",e),_(()=>e.stopImmediatePropagation()),_(()=>e.stopPropagation()))}function Wr(e,t){const n=_(()=>window.Shopify.currency.active,"USD"),r=_(()=>window.Shopify.locale,"en-US"),o=new Intl.NumberFormat(r,{style:"currency",currency:n,minimumFractionDigits:!0===_(()=>window.visually.flags["op-locale-currency-always-show-decimals"],!1)?2:0,maximumFractionDigits:2});if(t){if(Zr()){const t=_(()=>window.visually.priceRound)||Math.round;return o.format(t(e,n))}return o.format(e)}const i=_(()=>window.Shopify.currency.rate,"1");let s=Number.parseFloat(i);s=Number.isNaN(s)?1:s;let c=e*s;return 1!=s&&me("exchange-fee")&&(c*=1.02),c=Qr(s,c,n),o.format(c)}const Qr=(e,t,n)=>1!==e&&me("exchange-round")||Zr()?(_(()=>window.visually.priceRound)||Math.round)(t,n):t;function Yr(){const e=_(()=>!0===window.visually.flags["kill-locale-currency"]),t=_(()=>window.Shopify.currency,{}),n=!!_(()=>t.active),r=_(()=>t.rate),o=!!r&&!Number.isNaN(Number.parseFloat(r));return!e&&n&&o}const Zr=()=>!me("op-locale-currency-no-round");let Xr=window.location.href;const eo=()=>{requestAnimationFrame(()=>{Xr!==window.location.href&&(Xr=window.location.href,window.dispatchEvent(new CustomEvent("vslyUrlChanged",{detail:{prev:Xr,curr:window.location.href}})))})};var to;!function(e){e.NONE="none",e.YOTPO="yotpo"}(to||(to={}));const no={isMember:!1,provider:to.NONE};function ro(e,t){try{var n=e()}catch(e){return t(e)}return n&&n.then?n.then(void 0,t):n}const oo="vsly-loyalty-ctx",io=(()=>{const e=["swell:customer:updated","swell:redemption","swell:initialized","swell:setup","vsly:loyalty-changed"];let t;const n=()=>{const e=_(()=>window.swellConfig.customer);return e?{id:e.local_customer_id,providerId:e.id,email:e.email,earnedPoints:e.points_earned,isMember:!0===e.is_member,pointsBalance:e.points_balance,adjustedPointsBalance:_(()=>e.adjusted_points_balance,0),provider:to.YOTPO}:no},r=e=>{_(()=>"vsly:loyalty-changed"===e.type)&&_(()=>window.swellAPI.refreshCustomerDetails()),t(n())};return{provide:n,onChange:function(n){try{t=n;const o=ro(function(){return Promise.resolve(v(()=>
169!!window.jQuery,50,200)).then(function(){e.forEach(e=>{window.jQuery(document).on(e,r)})})},function(){e.forEach(e=>{document.addEventListener(e,r)})});return Promise.resolve(o&&o.then?o.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},connect:()=>v(()=>!!_(()=>window.swellConfig.customer.local_customer_id),400,20),disconnect:function(){try{const t=ro(function(){return Promise.resolve(v(()=>!!window.jQuery,50,200)).then(function(){e.forEach(e=>{window.jQuery(document).off(e,r)})})},function(){e.forEach(e=>{document.removeEventListener(e,r)})});return Promise.resolve(t&&t.then?t.then(function(){}):void 0)}catch(e){return Promise.reject(e)}}}})();function so(e){et(Xe.LOYALTY_CHANGE,e),sessionStorage.setItem(oo,JSON.stringify({ts:(new Date).getTime(),ctx:e})),window.loomi_ctx={...window.loomi_ctx||{},loyalty:e}}const co="vsly_session";function ao(e){return Et((e||"").replace("+"," "))}function uo(){const e=window.loomi_ctx.storeAlias,t={id:W(e+window.loomi_ctx.userId+f()+It()+fo()),utm_campaign:It(),last_interaction:new Date,landing_page:_(()=>location.href,""),start_at:new Date};return lo(t),t}function lo(e){const t=JSON.stringify(e);localStorage.setItem(co,t),window.loomi_ctx.session=e}function mo(){const e=function(){window.loomi_ctx=window.loomi_ctx||{};let e=window.loomi_ctx.session||_(()=>{const e=JSON.parse(localStorage.getItem(co));return e.last_interaction=new Date(e.last_interaction),e.start_at=new Date(e.start_at),e})||uo();return function(e){const t=new Date,n=e.last_interaction;return(t.valueOf()-n.valueOf())/6e4>30||ao(It())!==ao(e.utm_campaign)||e.last_interaction.getDate()!==t.getDate()}(e)&&(e=uo()),window.loomi_ctx.session=e,e}();e.last_interaction=new Date,lo(e)}const fo=()=>Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15);function ho(e,t){try{var n=e()}catch(e){return t(!0,e)}return n&&n.then?n.then(t.bind(null,!1),t.bind(null,!0)):t(!1,n)}const po=function(e,t,r){void 0===r&&(r=1e3);try{return vo?(console.debug("vsly-sdk","cannot reload since another reload is in progress"),Promise.resolve()):(vo=!0,Promise.resolve(ho(function(){console.debug("vsly-sdk","about to reload sdk");const o=me("sdk-reconcile")?Promise.resolve(function(e,t,n){try{return Promise.resolve(n(t,e)).then(function(e){let{configuration:t}=e;const n=_(()=>window.loomi.conf.experiments)||[],r=new Map,o=t.experiments||[],i=new Map,s=new Set(Object.keys(fr)),c=C();n.forEach(e=>r.set(Wn(e),e)),o.forEach(e=>i.set(Wn(e),e)),(e=>{window.loomi={..._(()=>window.loomi)||{},conf:e},window.visually={..._(()=>window.visually)||{},flags:e.flags,recsPerVariant:Xn(e)},zn(e.flags)})(t),((e,t,n)=>{e.forEach((e,r)=>{t.has(r)||(n.has(r)&&Ir(e),Vr(r))})})(r,i,s),document.dispatchEvent(Object.assign(new Event("reset-widget"),{value:"reload"})),document.dispatchEvent(Object.assign(new Event("targeting-changed"),{value:"#reload",key:"CART_CHANGE"})),((e,t,n,r)=>{e.forEach((e,o)=>{const i=t.get(o);i?Qn(i)!==Qn(e)&&(r.has(o)&&Ir(i),Vr(o),un([e]),Hr(e,n)):(un([e]),Hr(e,n))})})(i,r,c,s)})}catch(e){return Promise.reject(e)}}(e,t,wo)).then(function(){}):Promise.resolve(function(){try{return dr&&i(()=>document).then(()=>{document.removeEventListener(Q,_r),dr=!1}),qr.forEach(e=>{try{"number"!=typeof e.handler&&e.handler()}catch(e){}}),qr=[],Array.from($.keys()).forEach(e=>{Qe(e)}),Ve&&Ve.disconnect(),Promise.resolve()}catch(e){return Promise.reject(e)}}()).then(function(){return Promise.resolve((o=r,void 0===o&&(o=40),new Promise(e=>setTimeout(e,o)))).then(function(){return Promise.resolve(function(e,t){try{return void 0===e&&(e=n.PROD),Promise.resolve(ho(function(){return function(r,o){try{var i=(function(){if(window.vsly_blocked)throw Ln(),new Error(Fn)}(),function(e,t){window.loomi_ctx=window.loomi_ctx||{},window.loomi_ctx.env=window.loomi_ctx.env||e,window.loomi_ctx.storeAlias=window.loomi_ctx.storeAlias||t}(e,t),Promise.resolve(function(e,t){try{return void 0===e&&(e=n.PROD),Promise.resolve(yo(t,e,void 0)).then(function(n){let{configuration:r,tracking:o}=n;return go(r,t,e,o)})}catch(e){return Promise.reject(e)}}(e,t)).then(function(n){let{jitsu:r,configuration:o}=n;if(!_(()=>o.flags["kill-switch"]))return Promise.resolve(Je()).then(function(){un(o.experiments),Fr(r,o),Kn(e,t,po),mt()})}))}catch(e){return o(e)}return i&&i.then?i.then(void 0,o):i}(0,function(e){_(()=>e.message)!==Fn&&F("failed initialising sdk",e)})},function(e,t){if(Ln(),e)throw t;return t}))}catch(e){return Promise.reject(e)}}(e,t)).then(function(){})});var o});if(o&&o.then)return o.then(function(){})},function(e,t){if(vo=!1,e)throw t;return t})))}catch(e){return Promise.reject(e)}};let vo=!1;const wo=function(e,t,n){try{return m(),Promise.resolve(qn(e,t,n))}catch(e){return Promise.reject(e)}},yo=function(e,t,n){try{return _(mo),m(),Promise.resolve(qn(e,t,n))}catch(e){return Promise.reject(e)}},go=function(e,t,n,r){try{return zn(e.flags),function(e,t,n,r,o,i){Er(),window.loomi_ctx={..._(()=>window.loomi_ctx)||{},env:t,storeAlias:e,apply:e=>{un([e]),ar(e)},shouldApply:lr};const s=_(()=>
169o.productId),c=window.loomi_ctx;s&&!c.productId&&(c.productId=s);const a=_(()=>o.variantId);a&&!c.variantId&&(c.variantId=a),window.loomi={..._(()=>window.loomi)||{},conf:n},window.visually={..._(()=>window.visually)||{},flags:n.flags,enabledIntegrations:n.integrations,recsPerVariant:Xn(n),sdk_api:{addToCart:mn,recommendProducts:Pn,getProductsMetafields:$n,fetchRecs:Cn},reAllocate:i,rerender:Yn,reload:function(){try{return Promise.resolve(r(t,e,1e3)).then(function(){})}catch(e){return Promise.reject(e)}}}}(t,n,e,po,Nt(),wo),function(e){try{if(e.noActiveThemeTests&&Ce()){if(Pe(0))return;be()}else(e=>!(e.experiments||[]).find(e=>e.isThemeTest)&&_(Ce)&&!![localStorage,sessionStorage].find(je))(e)&&be()}catch(e){}}(e),Promise.resolve(Eo()).then(function(){var o,c,a,l;(function(e,t,n){window.loomi_api||(window.loomi_api={}),window.loomi_api.when=w,window.loomi_api.awaitCondition=v,window.loomi_api.loadVisuallyLib=h,window.loomi_api.queryProducts=Rn,window.loomi_api.debounce=u,window.loomi_api.allocatorQuery=e=>function(e,t){try{function n(){return Promise.resolve(r)}const r={results:{}},o={...e};o.queries=function(e,t){return e.queries.filter(e=>{const n=_(()=>e.oneOf.productInfo);if(n){const r=Tn(n.handle),o=sessionStorage.getItem(r);if(!o)return!0;const i=JSON.parse(o);return!!function(e,t){return!((!e.includeCollections||t.collections)&&(!e.includeTags||t.tags)&&(!e.includeSales||t.sales)&&(!e.includeVariants||t.variants))}(n,i)||(i.cached=!0,t.results[e.name]=i,!1)}const r=_(()=>e.oneOf.handlesByTag);if(r){const n=Nn(r),o=sessionStorage.getItem(n);if(!o)return!0;const i=JSON.parse(o);return i.cached=!0,t.results[e.name]=i,!1}const o=_(()=>e.oneOf.handlesByCollection);if(o){const n=On(o),r=sessionStorage.getItem(n);if(!r)return!0;const i=JSON.parse(r);return i.cached=!0,t.results[e.name]=i,!1}return!0})}(e,r);const i=function(){if(o.queries.length>0){const{query:e,hashedQuery:n}=function(e,t){e.timestamp=`${jn(4)}${t}${jn(5)}`,e.alias=window.loomi_ctx.storeAlias||"",e.userId=window.loomi_ctx.userId||"";const n=g(e);return{query:n,hashedQuery:(n+window.loomi_ctx.userId+window.loomi_ctx.storeAlias+t).split("").reduce((e,t)=>(e=(e<<5)-e+t.charCodeAt(0))&e,0)}}(o,t),i=Vn(window.loomi_ctx.env).cfgUrl.replace("/allocate",`/query?q=${e}&h=${n}`);return Promise.resolve(fetch(i)).then(function(e){const t=function(){if(e.ok)return Promise.resolve(e.json()).then(function(e){e.results&&Object.entries(e.results).forEach(e=>{let[t,n]=e;!function(e,t,n){if(t)if("ProductInfo"===t.kind){const r=n.queries.find(t=>t.name===e);r&&(_(()=>r.oneOf.productInfo.includeTags,!1)&&!t.tags&&(t.tags=[]),_(()=>r.oneOf.productInfo.includeCollections,!1)&&!t.collections&&(t.collections=[]),_(()=>r.oneOf.productInfo.includeSales,!1)&&!t.sales&&(t.sales=""),_(()=>r.oneOf.productInfo.includeVariants,!1)&&!t.variants&&(t.variants=[]),sessionStorage.setItem(Tn(t.handle),JSON.stringify(t)))}else if("HandlesByCollection"===t.kind){const r=n.queries.find(t=>t.name===e);if(r){const e=_(()=>r.oneOf.handlesByCollection,"")||"";sessionStorage.setItem(On(e),JSON.stringify(t))}}else if("HandlesByTag"===t.kind){const r=n.queries.find(t=>t.name===e);if(r){const e=_(()=>r.oneOf.handlesByTag,"")||"";sessionStorage.setItem(Nn(e),JSON.stringify(t))}}}(t,n,o),r.results[t]=n})})}();if(t&&t.then)return t.then(function(){})})}}();return Promise.resolve(i&&i.then?i.then(n):n())}catch(s){return Promise.reject(s)}}(e,`${(new Date).getTime()+Math.round(1e6*Math.random())}`),window.loomi_api.openProductOverlay=er,_(()=>e.shopApi.forEach(e=>{let{js:t,windowKey:n}=e;try{window.loomi_api[n]=new Function(t)}catch(e){}})),window.loomi_api.formatLocaleMoney=function(){var e=[].slice.call(arguments);return n()?t(...e):(_(()=>window.loomi_api.formatMoney)||(()=>`${_(()=>e[0],"")}`))(...e)},window.loomi_api.redirectTest=ee})(e,Wr,Yr),a=e.first_seen,(c=e.uid)!==(l=r.id)&&c&&a>0?(window.loomi_ctx.userId=c,Zt(c,a)):window.loomi_ctx.userId=l,function(e,t){try{return _(()=>window.loomi_ctx.cc)&&v(b,1e3,120).then(()=>Zt(e,t||(new Date).getTime()/1e3)),Promise.resolve()}catch(e){return Promise.reject(e)}}(window.loomi_ctx.userId,a),(o=e.flags)["sdk-auto-clean"]&&!o["sdk-kill-auto-clean"]&&h("price_test_cleanup_v2",{async:!1,defer:!0}).then(),_(()=>!0===window.visually.flags["op-focus-trap-removal"])&&s(()=>document,!0).then(()=>{document.addEventListener("focusin",Kr,{capture:!0,passive:!0}),document.addEventListener("mousedown",Kr,{capture:!0,passive:!0}),document.addEventListener("touchstart",Kr,{capture:!0,passive:!0}),document.addEventListener("touchend",Kr,{capture:!0,passive:!0})}),function(e,t){if(me("kill-sdk-reload-url-detection")||!me("sdk-reload")&&!["/products/","/collections/"].find(e=>window.location.href.includes(e)))return;const n=function(){const r=(()=>{requestAnimationFrame(()=>{(me("sdk-reload-url-detection-href")?So!==window.location.href:new URL(So).pathname!==new URL(window.location.href).pathname)&&(So=window.location.href,n(),_o(e,t,10))})})||eo,o=["click","touchend","pdpresp"];return s(()=>document.body,!0).then(()=>
169{o.forEach(e=>document.body.addEventListener(e,r,!0))}),()=>{i(()=>document.body).then(()=>{o.forEach(e=>{document.body.removeEventListener(e,r,!0)})})}}()}(n,t),function(){try{return Promise.resolve(function(e,t){try{var n=function(){so(function(){const e=sessionStorage.getItem(oo);if(e){const t=_(()=>JSON.parse(e));if(t&&t.ts>(new Date).getTime()-3e5)return t.ctx}}()||no);const e=_(()=>!0===window.visually.flags["loyalty-targeting"]),t=function(){if(e)return Promise.resolve(function(e){try{return e.onChange(e=>{so(e)}),Promise.resolve(e.connect()).then(function(){const t=e.provide();return so(t),{ctx:t,disconnect:e.disconnect}})}catch(e){return Promise.reject(e)}}(io)).then(function(){const e=document.querySelectorAll('[href*="/account/logout"]');e&&Array.from(e).forEach(e=>{e.addEventListener("click",()=>(sessionStorage.removeItem(oo),!0))})})}();if(t&&t.then)return t.then(function(){})}()}catch(e){return t(e)}return n&&n.then?n.then(void 0,t):n}(0,function(e){console.debug("vsly-loyalty","unable to find loyalty provider",e)}))}catch(e){return Promise.reject(e)}}();const d=C();return{configuration:e,jitsu:d}})}catch(e){return Promise.reject(e)}},_o=u(po,10);let So=window.location.href;const Eo=function(){try{return Promise.resolve(function(){if(me("block-do-not-track"))return Promise.resolve(x()).then(function(e){if(!e)throw new Error(Fn)})}())}catch(e){return Promise.reject(e)}};function Po(e){return e.startsWith("https://")?e.substring(8):e}function Ao(e){try{return decodeURIComponent(e.replace(/\+/g," "))}catch{return""}}var Io;!function(e){e.SIGNUP="SIGNUP",e.ADD_TO_CART="ADD_TO_CART",e.CHANGE_QTY="CHANGE_QTY",e.REMOVE_FROM_CART="REMOVE_FROM_CART",e.PAGE_LOAD="PAGE_LOAD",e.CLICK="CLICK",e.LOGIN="LOGIN",e.LOGOUT="LOGOUT",e.TIME_SPENT="TIME_SPENT",e.USE_CASE="USE_CASE",e.LEAD_SUBMISSION_EMAIL="LEAD_SUBMISSION_EMAIL",e.LEAD_SUBMISSION_PHONE="LEAD_SUBMISSION_PHONE"}(Io||(Io={}));let bo=[];const xo=function(e,t){if(void 0===t&&(t=0),0===bo.length)return;const n=bo;bo=[];const r=ko(n),o=Co(n);e({bulk:o,shared:r},!0).catch(()=>{const r=n.concat(bo);r.length<100&&(bo=r,t<2&&setTimeout(()=>xo(e,t+1),500*Math.pow(2,t)))})};u(xo,100);const Co=e=>e.map(e=>{const t=JSON.parse(JSON.stringify(e));return delete t.user,delete t.event_id,delete t.user_agent,delete t.utc_time,delete t.local_tz_offset,delete t.doc_host,delete t.ids_ga,delete t.alias,delete t.userCanBeTracked,delete t.userDataCanBeSold,delete t.edgetag,delete t.api_key,delete t.src,t}),ko=e=>{const t=_(()=>String(e[0].user.anonymous_id),""),n=_(()=>String(e[0].user_agent),""),r=_(()=>String(e[0].event_id),""),o=_(()=>String(e[0].utc_time),""),i=_(()=>Number(e[0].local_tz_offset)||0),s=_(()=>String(e[0].doc_host),""),c=_(()=>String(e[0].ids_ga),""),a=_(()=>String(e[0].alias),""),u=_(()=>Boolean(e[0].userCanBeTracked),!0),l=_(()=>Boolean(e[0].userDataCanBeSold),!0),d=_(()=>String(e[0].edgetag),""),m=_(()=>String(e[0].api_key),""),f=_(()=>String(e[0].src),"");return Object.entries({anonymous_id:t,event_id:r,user_agent:n,utc_time:o,local_tz_offset:i,doc_host:s,ids_ga:c,alias:a,userCanBeTracked:u,userDataCanBeSold:l,edgetag:d,api_key:m,src:f}).reduce((e,t)=>{let[n,r]=t;if(r){if("undefined"===r)return e;e[n]=r}return e},{})},To=function(e){try{let r;function t(e){return r?e:Promise.resolve(!1)}const o=function(){if(_(()=>e.eventPayload.bulk.length>0,!1)){const t=_(()=>JSON.parse(JSON.stringify(e.eventPayload.bulk[0])),void 0);if(!t){const e=Promise.resolve(!1);return r=1,e}const o=_(()=>JSON.parse(JSON.stringify(t.ga)),void 0);return delete t.ga,Promise.resolve(function(e){try{return Promise.resolve(function(t,r){try{var o=function(){const t=window.loomi_ctx.jitsuKey,r=function(e){const t={trackingHost:"https://live.visually-io.com"};return e===n.TEST&&(t.trackingHost="http://localhost:8088"),e===n.STAGE&&(t.trackingHost="https://sdk.loomi-stg.xyz"),t}(window.loomi_ctx.env).trackingHost;return Promise.resolve(fetch(`${r}/api/s?token=${t}&bulk=1`,{headers:{"content-type":"text/plain"},body:JSON.stringify(e.eventPayload),method:"POST",mode:"cors",credentials:"omit",keepalive:!0})).then(function(e){return e.ok})}()}catch(e){return r(e)}return o&&o.then?o.then(void 0,r):o}(0,function(e){return console.error("vsly: Failed to send event",e),!1}))}catch(e){return Promise.reject(e)}}(e)).then(function(n){return Promise.resolve(function(e){try{try{const t=e.eventPayload,n=t.bulk[0],r=window.loomi_ctx.env,o=t.shared,i=g({experienceId:n.use_case,variantId:n.use_case_variant,storeAlias:o.alias,anonymousId:o.anonymous_id,version:n.version}),s=new URL(Vn(r).cfgUrl.replace("/allocate","/match"));s.searchParams.append("q",i),fetch(s.toString())}catch(e){console.error("vsly: Failed to persist allocation",e)}return Promise.resolve()}catch(e){return Promise.reject(e)}}(e)).then(function(){return o&&C().trackExt(t,o).then().catch(e=>{console.error("vsly: Failed track ext event",e,t,o)}),r=1,n})})}}();return Promise.resolve(o&&o.then?o.then(t):t(o))}catch(i){return Promise.reject(i)}},No="vsly_analytics_queue";function Oo(e,t,n){void 0===n&&(n=!1);try{const r=window.loomi_ctx,o=r.storeAlias,i=r.jitsuKey,s=Pt(),c={id:`${Date.now()}-${Math.random().toString(36).substring(2,9)}`,timestamp:Date.now(),eventPayload:{bulk:[{url:location.href,doc_path:location.pathname,doc_search:location.search,sid:r.session.id,sid_start:r.session.start_at,utm:s.utm,lmi_params:s.lmi_params,event_type:"USE_CASE",use_case:e._USE_CASE,use_case_variant:e._USE_CASE_VARIANT,version:e._USE_CASE_VERSION||1,ga:{isAudience:!1,gaName:e._USE_CASE_GA||e._USE_CASE,gaVariant:e._USE_CASE_GA_VARIANT||e._USE_CASE_VARIANT,reportGa:n}}],shared:{anonymous_id:t.id,user_agent:navigator.userAgent,utc_time:(new Date).toISOString(),local_tz_offset:(new Date).getTimezoneOffset(),doc_host:location.host,alias:o,api_key:i}},retries:0},a=jo();a.push(c),Lo(a)}catch(e){console.error("vsly: Failed to queue analytics event",e)}}function jo(){try{const e=localStorage.getItem(No);if(!e)return[];const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch(e){return console.error("vsly: Failed to read analytics queue",e),[]}}function Lo(e){try{localStorage.setItem(No,JSON.stringify(e))}catch(e){console.error("vsly: Failed to save analytics queue",e)}}const $o=(e,t)=>{try{localStorage.setItem(e,JSON.stringify({variant:t.experiment.variant,version:t.experiment.version||0}))}catch(e){}},Ro=(e,t)=>{let n=null;try{const r=localStorage.getItem(e);if(r){let e;const o=JSON.parse(r);if(o&&"object"==typeof o&&"variant"in o){e=o;const r=t.find(t=>t.experiment.variant===e.variant);r&&(r.experiment.version||0)===(e.version||0)&&(n=r)}}}catch(e){}return n},Do=e=>`vsly_redirect_test_${e[0].experiment.name}`,Uo=(e,t)=>{if(e){const n=e.experiment;t.some(e=>{const t=e.experiment;return t.variant===n.variant&&t.version===n.version})||(e=!1)}if(!e){const n=100*Math.random();let r=0;for(const o of t)if(r+=o.targeting.chance,n<=r){e=o;break}}return e},Mo=function(e){void 0===e&&(e=!0);const t=window.loomi_ctx.consent;t.allowed=e,t.fin||(t.fin=qo())},qo=()=>(new Date).getTime(),Fo=()=>window.Shopify.customerPrivacy,Bo=["AT","BE","BG","HR","CY","CZ","DK","EE","FI","FR","DE","GR","HU","IE","IT","LV","LT","LU","MT","NL","PL","PT","RO","SK","SI","ES","SE","NO","IS","LI"],Jo=function(e){void 0===e&&(e=!0);const t=window.loomi_ctx.consent;t.allowed=e,t.fin||(t.fin=Vo())},Vo=()=>(new Date).getTime(),Ho=()=>window.Shopify.customerPrivacy,Go=()=>Promise.resolve(),zo=()=>(window.loomi_ctx=window.loomi_ctx||{},window.loomi_ctx.performanceMetrics=window.loomi_ctx.performanceMetrics||{},window.loomi_ctx.performanceMetrics);function Ko(){try{const e=zo().as;
169if(void 0===e)return;const t=performance.now();Object.assign(zo(),{ae:t,ad:t-e}),(e=>{try{if("function"!=typeof performance.getEntriesByType)return;const t=performance.getEntriesByType("resource").filter(t=>t.startTime>=e&&(e=>{try{return new URL(e.name).pathname.endsWith("/allocate")}catch{return!1}})(t)).pop();if(!t)return;Object.assign(zo(),{ars:t.startTime,afs:t.fetchStart,aqs:t.requestStart,aps:t.responseStart,ape:t.responseEnd,ard:t.duration,ardl:t.startTime-e,aprd:t.requestStart-t.startTime,arwd:t.responseStart-t.requestStart,ardd:t.responseEnd-t.responseStart})}catch{}})(e)}catch(e){}}function Wo(e,t){try{var n=e()}catch(e){return t(e)}return n&&n.then?n.then(void 0,t):n}function Qo(){return _(mo),Yt(),function(e){void 0===e&&(e=window.loomi_ctx.embeddedTests);try{if(!e)return;if(0===e.length)return;const t=e.filter(e=>e.experiment.isThemeTest);t.length>0&&function(e){const t=Do(e);let n=Ro(t,e);if(n=Uo(n,e),!n)return;if(!n.experiment)return;$o(t,n);const r=n.experiment,o=_(()=>r.code.find(e=>"themeTest"===e.kind).value.targetThemeId)||0,i=ne({experienceId:r.name,variantId:r.variant,version:r.version,gaExperienceName:r.gaName,gaVariantName:r.gaVariant});Oo(i,Yt(),_(()=>!!r.ga)||!1),Ee(i,o)}(t);const n=e.filter(e=>!e.experiment.isThemeTest);n.length>0&&function(e){const t=e.filter(e=>function(e){if(!e)return!0;try{const t=e.match(/UrlTarget\(([^)]+)\)/);if(!t)return!1;const n=function(e){try{const t=e.match(/^"([^"]*)",\s*"([^"]*)",\s*(true|false)$/);return t?{value:t[1],op:t[2],includeQueryParam:"true"===t[3]}:null}catch{return null}}(t[1]);return!!n&&function(e,t,n){const r=window.location.search||"",o=window.location.href||"",i=(s=function(e){const t=e.startsWith("/")?e:"/"+e,n=t.split("/");if(n.length<2)return t;const r=n[1];let o=!1;return r.length>0&&r.length<=7&&(2===r.length||r.length>2&&"-"===r[2])&&(o=!0),o?"/"+n.slice(2).join("/"):t}(window.location.pathname),["STORY_IL","MAYVEN_GLOBAL","JDSPORT_IL"].includes(window.loomi_ctx.storeAlias)?s.toLowerCase():s);var s;const{hostPath:c,rawQuery:a}=function(e){const t=Po(e),n=t.indexOf("?");return-1!==n?{hostPath:t.substring(0,n),rawQuery:t.substring(n+1)}:{hostPath:t,rawQuery:""}}(e),u=c.toLowerCase();let l=Po(o.split("?")[0]).toLowerCase(),d="",m=u;if(d=(new URL(o).host+i).toLowerCase(),n){const e=r?Ao(r.substring(1)):"";if(e&&(l+="?"+e,d+="?"+e),a){const e=Ao(a);e&&(m+="?"+e)}}return function(e,t,n,r){switch(r){case"contains":return e.includes(n)||t.includes(n);case"matches":try{const r=new RegExp(n);return r.test(e)||r.test(t)}catch{return!1}case"==":return e===n||t===n;case"!=":return e===t?e!==n:t!==n;default:return!1}}(l,d,m,t)}(n.value,n.op,n.includeQueryParam)}catch(e){return console.error("vsly: Failed to evaluate targeting formula",e),!1}}(e.targeting.formula));if(0===t.length)return;const n=Do(t);let r=Ro(n,t);if(r=Uo(r,t),!r)return;if(!r.experiment)return;$o(n,r);const o=r.experiment,i=ne({experienceId:o.name,variantId:o.variant,version:o.version,gaExperienceName:o.gaName,gaVariantName:o.gaVariant});Oo(i,Yt(),_(()=>!!o.ga)||!1);const s=_(()=>o.code.find(e=>"pageRedirect"===e.kind).value);s&&ee(i,s.destUrl,s.redirectAfter||1,s.retainQueryParams,s.stickinessMode)}(n)}catch(e){console.error("vsly ETT",e)}}(),window.vsly_redirecting}const Yo=()=>window.loomi_ctx.blockingConcent;(function(){try{let t;function e(e){if(t)return e;(function(){const e=jo();e.length>0&&Promise.allSettled(e.map(To)).then(t=>{Lo(e.filter((e,n)=>{const r=t[n];return("fulfilled"!==r.status||!r.value)&&(e.retries++,(e=>!(Date.now()-e.timestamp>18e5||e.retries>3))(e))}))}).catch(e=>{console.error("vsly: Failed to process analytics queue",e)})})(),(()=>{const e=()=>{const e=se();return!!e&&!Bo.includes(e)};return new Promise((t,n)=>{const r=window.loomi_ctx.consent||={};r.init=Vo(),(se()?Go():v(se,50,200)).then(()=>{e()&&(Jo(),t())}),(_(()=>Ho().analyticsProcessingAllowed)?Go():v(()=>_(()=>Ho().analyticsProcessingAllowed),50,200)).then(()=>{const r=Ho().analyticsProcessingAllowed()||e();Jo(r),r?t():n()}),r.ccListener||(document.addEventListener("visitorConsentCollected",r=>{const o=r.detail.analyticsAllowed||e();Jo(o),o?t():n()}),r.ccListener=!0)})})().catch(),function(){try{zo().as=performance.now()}catch(e){}}();const s=yo(o,i);return s.then(Ko),s.then(e=>{let{configuration:t,tracking:r}=e;return(e=>{p("vsly-a",`${(e=>e==n.STAGE?"https://sdk.loomi-stg.xyz/":"https://assets.visually.io/")(e)}v/visually-a.js?cb=${window.loomi_ctx.sdk_version}`,{defer:!0}).catch()}
169)(i),function(e){let{configuration:t,tracking:n}=e;try{return Promise.resolve(function(e,t){try{const{storeAlias:n,env:r}=window.loomi_ctx;return Promise.resolve(Wo(function(){return Promise.resolve(go(e,n,r,t)).then(function(e){let{jitsu:t,configuration:o}=e;if(!_(()=>o.flags["kill-switch"]))return Promise.resolve(Je()).then(function(){un(o.experiments),Fr(t,o),Kn(r,n,po),mt()})})},function(e){_(()=>e.message)!==Fn&&F("fail initialising sdk",e)}))}catch(e){return Promise.reject(e)}}(t,n)).then(function(){window.dispatchEvent(new Event("visually_loaded"))})}catch(e){return Promise.reject(e)}}({configuration:t,tracking:r})}).catch(r).finally(Ln)}const r=e=>console.error(e);if(window.fetch&&(window.vslyNativeFetch=window.fetch),window.vsly_init=!0,window.vslyIntegrationType="static",(()=>{if(_(()=>window.visually_io_editor))return!0;const e=_(()=>window.loomi_ctx.ttl);return!("number"!=typeof e||!Number.isFinite(e)||e<=0)&&e<Math.floor(Date.now()/1e3)})())return console.log("sdk blocked"),Promise.resolve();window.loomi_ctx.sdk_version="0.12.169";const{storeAlias:o,env:i}=window.loomi_ctx;if(!Yo()&&Qo())return Promise.resolve();const s=function(){if(Yo()){function e(e){return t?e:window.loomi_ctx.consent.allowed?void(Qo()&&(t=1)):(Ln(),void(t=1))}const n=Wo(function(){return Promise.resolve((console.log("consent api init"),new Promise((e,t)=>{const n=window.loomi_ctx.consent||={};n.init=qo(),(_(()=>Fo().analyticsProcessingAllowed)?Promise.resolve():v(()=>_(()=>Fo().analyticsProcessingAllowed),50,200)).then(()=>{const n=window.Shopify.customerPrivacy.analyticsProcessingAllowed();console.log("consent api",n),Mo(n),n?e():t()}),n.ccListener||(document.addEventListener("visitorConsentCollected",()=>{const n=window.Shopify.customerPrivacy.analyticsProcessingAllowed();console.log("visitorConsentCollected",n),Mo(n),n?e():t()}),n.ccListener=!0)}))).then(function(){})},function(){Ln(),t=1});return n&&n.then?n.then(e):e(n)}}();return Promise.resolve(s&&s.then?s.then(e):e(s))}catch(c){return Promise.reject(c)}})().then(()=>console.log("vsly sdk with embed init"))}();
170
171</script>
vendor: 1 bytes, line 171
171
172<script data-vsly="preact2" type="text/javascript" data-em-disable>
173    // Preact
174!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):n(e.preact={})}(this,function(e){var b,n,t,_,o,r,l,x={},C=[],u=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function w(e,n){for(var t in n)e[t]=n[t];return e}function g(e){var n=e.parentNode;n&&n.removeChild(e)}function i(e,n,t){var _,o=arguments,l={};for(_ in n)"key"!==_&&"ref"!==_&&(l[_]=n[_]);if(3<arguments.length)for(t=[t],_=3;_<arguments.length;_++)t.push(o[_]);if(null!=t&&(l.children=t),"function"==typeof e&&null!=e.defaultProps)for(_ in e.defaultProps)void 0===l[_]&&(l[_]=e.defaultProps[_]);return k(e,l,n&&n.key,n&&n.ref,null)}function k(e,n,t,_,o){var l={type:e,props:n,key:t,ref:_,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:o};return null==o&&(l.__v=l),b.vnode&&b.vnode(l),l}function S(e){return e.children}function P(e,n){this.props=e,this.context=n}function N(e,n){if(null==n)return e.__?N(e.__,e.__.__k.indexOf(e)+1):null;for(var t;n<e.__k.length;n++)if(null!=(t=e.__k[n])&&null!=t.__e)return t.__e;return"function"==typeof e.type?N(e):null}function c(e){var n,t;if(null!=(e=e.__)&&null!=e.__c){for(e.__e=e.__c.base=null,n=0;n<e.__k.length;n++)if(null!=(t=e.__k[n])&&null!=t.__e){e.__e=e.__c.base=t.__e;break}return c(e)}}function s(e){(!e.__d&&(e.__d=!0)&&t.push(e)&&!p.__r++||o!==b.debounceRendering)&&((o=b.debounceRendering)||_)(p)}function p(){for(var e;p.__r=t.length;)e=t.sort(function(e,n){return e.__v.__b-n.__v.__b}),t=[],e.some(function(e){var n,t,_,o,l,r,u;e.__d&&(r=(l=(n=e).__v).__e,(u=n.__P)&&(t=[],o=D(u,l,(_=w({},l)).__v=_,n.__n,void 0!==u.ownerSVGElement,null,t,null==r?N(l):r),d(t,l),o!=r&&c(l)))})}function E(e,n,t,_,o,l,r,u,i,c){var s,p,f,a,d,h,y,v=_&&_.__k||C,m=v.length;for(i==x&&(i=null!=r?r[0]:m?N(_,0):null),t.__k=[],s=0;s<n.length;s++)if(null!=(a=t.__k[s]=null==(a=n[s])||"boolean"==typeof a?null:"string"==typeof a||"number"==typeof a?k(null,a,null,null,a):Array.isArray(a)?k(S,{children:a},null,null,null):null!=a.__e||null!=a.__c?k(a.type,a.props,a.key,null,a.__v):a)){if(a.__=t,a.__b=t.__b+1,null===(f=v[s])||f&&a.key==f.key&&a.type===f.type)v[s]=void 0;else for(p=0;p<m;p++){if((f=v[p])&&a.key==f.key&&a.type===f.type){v[p]=void 0;break}f=null}d=D(e,a,f=f||x,o,l,r,u,i,c),(p=a.ref)&&f.ref!=p&&(y=y||[],f.ref&&y.push(f.ref,null,a),y.push(p,a.__c||d,a)),null!=d?(null==h&&(h=d),i=U(e,a,f,v,r,d,i),"option"==t.type?e.value="":"function"==typeof t.type&&(t.__d=i)):i&&f.__e==i&&i.parentNode!=e&&(i=N(f))}if(t.__e=h,null!=r&&"function"!=typeof t.type)for(s=r.length;s--;)null!=r[s]&&g(r[s]);for(s=m;s--;)null!=v[s]&&W(v[s],v[s]);if(y)for(s=0;s<y.length;s++)T(y[s],y[++s],y[++s])}function U(e,n,t,_,o,l,r){var u,i,c;if(void 0!==n.__d)u=n.__d,n.__d=void 0;else if(o==t||l!=r||null==l.parentNode)e:if(null==r||r.parentNode!==e)e.appendChild(l),u=null;else{for(i=r,c=0;(i=i.nextSibling)&&c<_.length;c+=2)if(i==l)break e;e.insertBefore(l,r),u=r}return void 0!==u?u:l.nextSibling}function f(e,n,t){"-"===n[0]?e.setProperty(n,t):e[n]="number"==typeof t&&!1===u.test(n)?t+"px":null==t?"":t}function A(e,n,t,_,o){var l,r,u,i,c;if(o?"className"===n&&(n="class"):"class"===n&&(n="className"),"style"===n)if(l=e.style,"string"==typeof t)l.cssText=t;else{if("string"==typeof _&&(l.cssText="",_=null),_)for(i in _)t&&i in t||f(l,i,"");if(t)for(c in t)_&&t[c]===_[c]||f(l,c,t[c])}else"o"===n[0]&&"n"===n[1]?(r=n!==(n=n.replace(/Capture$/,"")),n=((u=n.toLowerCase())in e?u:n).slice(2),t?(_||e.addEventListener(n,a,r),(e.l||(e.l={}))[n]=t):e.removeEventListener(n,a,r)):"list"!==n&&"tagName"!==n&&"form"!==n&&"type"!==n&&"size"!==n&&!o&&n in e?e[n]=null==t?"":t:"function"!=typeof t&&"dangerouslySetInnerHTML"!==n&&(n!==(n=n.replace(/^xlink:?/,""))?null==t||!1===t?e.removeAttributeNS("http://www.w3.org/1999/xlink",n.toLowerCase()):e.setAttributeNS("http://www.w3.org/1999/xlink",n.toLowerCase(),t):null==t||!1===t&&!/^ar/.test(n)?e.removeAttribute(n):e.setAttribute(n,t))}function a(e){this.l[e.type](b.event?b.event(e):e)}function D(e,n,t,_,o,l,r,u,i){var c,s,p,f,a,d,h,y,v,m,g,k=n.type;if(void 0!==n.constructor)return null;(c=b.__b)&&c(n);try{e:if("function"==typeof k){if(y=n.props,v=(c=k.contextType)&&_[c.__c],m=c?v?v.props.value:c.__:_,t.__c?h=(s=n.__c=t.__c).__=s.__E:("prototype"in k&&k.prototype.render?n.__c=s=new k(y,m):(n.__c=s=new P(y,m),s.constructor=k,s.render=L),v&&v.sub(s),s.props=y,s.state||(s.state={}),s.context=m,s.__n=_,p=s.__d=!0,s.__h=[]),null==s.__s&&(s.__s=s.state),null!=k.getDerivedStateFromProps&&(s.__s==s.state&&(s.__s=w({},s.__s)),w(s.__s,k.getDerivedStateFromProps(y,s.__s))),f=s.props,a=s.state,p)null==k.getDerivedStateFromProps&&null!=s.componentWillMount&&s.componentWillMount(),null!=s.componentDidMount&&s.__h.push(s.componentDidMount);else{if(null==k.getDerivedStateFromProps&&y!==f&&null!=s.componentWillReceiveProps&&s.componentWillReceiveProps(y,m),!s.__e&&null!=s.shouldComponentUpdate&&!1===s.shouldComponentUpdate(y,s.__s,m)||n.__v===t.__v){s.props=y,s.state=s.__s,n.__v!==t.__v&&(s.__d=!1),(s.__v=n).__e=t.__e,n.__k=t.__k,s.__h.length&&r.push(s),function e(n,t,_){for(var o,l=0;l<n.__k.length;l++)(o=n.__k[l])&&(o.__=n,o.__e&&("function"==typeof o.type&&1<o.__k.length&&e(o,t,_),t=U(_,o,o,n.__k,null,o.__e,t),"function"==typeof n.type&&(n.__d=t)))}(n,u,e);break e}null!=s.componentWillUpdate&&s.componentWillUpdate(y,s.__s,m),null!=s.componentDidUpdate&&s.__h.push(function(){s.componentDidUpdate(f,a,d)})}s.context=m,s.props=y,s.state=s.__s,(c=b.__r)&&c(n),s.__d=!1,s.__v=n,s.__P=e,c=s.render(s.props,s.state,s.context),s.state=s.__s,null!=s.getChildContext&&(_=w(w({},_),s.getChildContext())),p||null==s.getSnapshotBeforeUpdate||(d=s.getSnapshotBeforeUpdate(f,a)),g=null!=c&&c.type==S&&null==c.key?c.props.children:c,E(e,Array.isArray(g)?g:[g],n,t,_,o,l,r,u,i),s.base=n.__e,s.__h.length&&r.push(s),h&&(s.__E=s.__=null),s.__e=!1}else null==l&&n.__v===t.__v?(n.__k=t.__k,n.__e=t.__e):n.__e=function(e,n,t,_,o,l,r,u){var i,c,s,p,f,a=t.props,d=n.props;if(o="svg"===n.type||o,null!=l)for(i=0;i<l.length;i++)if(null!=(c=l[i])&&((null===n.type?3===c.nodeType:c.localName===n.type)||e==c)){e=c,l[i]=null;break}
174if(null==e){if(null===n.type)return document.createTextNode(d);e=o?document.createElementNS("http://www.w3.org/2000/svg",n.type):document.createElement(n.type,d.is&&{is:d.is}),l=null,u=!1}if(null===n.type)a!==d&&e.data!=d&&(e.data=d);else{if(null!=l&&(l=C.slice.call(e.childNodes)),s=(a=t.props||x).dangerouslySetInnerHTML,p=d.dangerouslySetInnerHTML,!u){if(null!=l)for(a={},f=0;f<e.attributes.length;f++)a[e.attributes[f].name]=e.attributes[f].value;(p||s)&&(p&&s&&p.__html==s.__html||(e.innerHTML=p&&p.__html||""))}(function(e,n,t,_,o){var l;for(l in t)"children"===l||"key"===l||l in n||A(e,l,null,t[l],_);for(l in n)o&&"function"!=typeof n[l]||"children"===l||"key"===l||"value"===l||"checked"===l||t[l]===n[l]||A(e,l,n[l],t[l],_)})(e,d,a,o,u),p?n.__k=[]:(i=n.props.children,E(e,Array.isArray(i)?i:[i],n,t,_,"foreignObject"!==n.type&&o,l,r,x,u)),u||("value"in d&&void 0!==(i=d.value)&&i!==e.value&&A(e,"value",i,a.value,!1),"checked"in d&&void 0!==(i=d.checked)&&i!==e.checked&&A(e,"checked",i,a.checked,!1))}return e}(t.__e,n,t,_,o,l,r,i);(c=b.diffed)&&c(n)}catch(e){n.__v=null,b.__e(e,n,t)}return n.__e}function d(e,n){b.__c&&b.__c(n,e),e.some(function(n){try{e=n.__h,n.__h=[],e.some(function(e){e.call(n)})}catch(e){b.__e(e,n.__v)}})}function T(e,n,t){try{"function"==typeof e?e(n):e.current=n}catch(e){b.__e(e,t)}}function W(e,n,t){var _,o,l;if(b.unmount&&b.unmount(e),(_=e.ref)&&(_.current&&_.current!==e.__e||T(_,null,n)),t||"function"==typeof e.type||(t=null!=(o=e.__e)),e.__e=e.__d=void 0,null!=(_=e.__c)){if(_.componentWillUnmount)try{_.componentWillUnmount()}catch(e){b.__e(e,n)}
174_.base=_.__P=null}if(_=e.__k)for(l=0;l<_.length;l++)_[l]&&W(_[l],n,t);null!=o&&g(o)}function L(e,n,t){return this.constructor(e,t)}function h(e,n,t){var _,o,l;b.__&&b.__(e,n),o=(_=t===r)?null:t&&t.__k||n.__k,e=i(S,null,[e]),l=[],D(n,(!_&&t||n).__k=e,o||x,x,void 0!==n.ownerSVGElement,t&&!_?[t]:!o&&n.childNodes.length?C.slice.call(n.childNodes):null,l,t||x,_),d(l,e)}b={__e:function(e,n){for(var t,_;n=n.__;)if((t=n.__c)&&!t.__)try{if(t.constructor&&null!=t.constructor.getDerivedStateFromError&&(_=!0,t.setState(t.constructor.getDerivedStateFromError(e))),null!=t.componentDidCatch&&(_=!0,t.componentDidCatch(e)),_)return s(t.__E=t)}catch(n){e=n}throw e}},n=function(e){return null!=e&&void 0===e.constructor},P.prototype.setState=function(e,n){var t=this.__s!==this.state?this.__s:this.__s=w({},this.state);"function"==typeof e&&(e=e(t,this.props)),e&&w(t,e),null!=e&&this.__v&&(n&&this.__h.push(n),s(this))},P.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),s(this))},P.prototype.render=S,t=[],_="function"==typeof Promise?Promise.prototype.then.bind(Prom
174ise.resolve()):setTimeout,p.__r=0,r=x,l=0,e.render=h,e.hydrate=function(e,n){h(e,n,r)},e.createElement=i,e.h=i,e.Fragment=S,e.createRef=function(){return{current:null}},e.isValidElement=n,e.Component=P,e.cloneElement=function(e,n){var t,_;for(_ in n=w(w({},e.props),n),2<arguments.length&&(n.children=C.slice.call(arguments,2)),t={},n)"key"!==_&&"ref"!==_&&(t[_]=n[_]);return k(e.type,t,n.key||e.key,n.ref||e.ref,null)},e.createContext=function(e){var n={},o={__c:"__cC"+l++,__:e,Consumer:function(e,n){return e.children(n)},Provider:function(e){var t,_=this;return this.getChildContext||(t=[],this.getChildContext=function(){return n[o.__c]=_,n},this.shouldComponentUpdate=function(n){_.props.value!==n.value&&t.some(function(e){e.context=n.value,s(e)})},this.sub=function(e){t.push(e);var n=e.componentWillUnmount;e.componentWillUnmount=function(){t.splice(t.indexOf(e),1),n&&n.call(e)}}),e.children}};return(o.Consumer.contextType=o).Provider.__=o},e.toChildArray=function e(n){return null==n||"boolean"==typeof n?[]:Array.isArray(n)?C.concat.apply([],n.map(e)):[n]},e.__u=W,e.options=b});
175// Preact Hooks
176!function(_,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("preact")):n(_.preactHooks={},_.preact)}(this,function(_,o){var e,u,t,i=0,r=[],c=o.options.__r,f=o.options.diffed,n=o.options.__c,s=o.options.unmount;function a(_,n){o.options.__h&&o.options.__h(u,_,i||n),i=0;var t=u.__H||(u.__H={__:[],__h:[]});return _>=t.__.length&&t.__.push({}),t.__[_]}function p(_){return i=1,h(b,_)}function h(_,n,t){var o=a(e++,2);return o.t=_,o.__c||(o.__c=u,o.__=[t?t(n):b(void 0,n),function(_){var n=o.t(o.__[0],_);o.__[0]!==n&&(o.__=[n,o.__[1]],o.__c.setState({}))}]),o.__}function m(_,n){var t=a(e++,4);!o.options.__s&&E(t.__H,n)&&(t.__=_,t.__H=n,u.__h.push(t))}function v(_,n){var t=a(e++,7);return E(t.__H,n)?(t.__H=n,t.__h=_,t.__=_()):t.__}function H(){r.some(function(n){if(n.__P)try{n.__H.__h.forEach(l),n.__H.__h.forEach(y),n.__H.__h=[]}catch(_){return n.__H.__h=[],o.options.__e(_,n.__v),!0}}),r=[]}o.options.__r=function(_){c&&c(_),e=0;var n=(u=_.__c).__H;n&&(n.__h.forEach(l),n.__h.forEach(y),n.__h=[])},o.options.diffed=function(_){f&&f(_);var n=_.__c;n&&n.__H&&n.__H.__h.length&&(1!==r.push(n)&&t===o.options.requestAnimationFrame||((t=o.options.requestAnimationFrame)||function(_){function n(){clearTimeout(o),d&&cancelAnimationFrame(t),setTimeout(_)}var t,o=setTimeout(n,100);d&&(t=requestAnimationFrame(n))})(H))},o.options.__c=function(_,t){t.some(function(n){try{n.__h.forEach(l),n.__h=n.__h.filter(function(_){return!_.__||y(_)})}catch(_){t.some(function(_){_.__h&&(_.__h=[])}),t=[],o.options.__e(_,n.__v)}}),n&&n(_,t)},o.options.unmount=function(_){s&&s(_);var n=_.__c;if(n&&n.__H)try{n.__H.__.forEach(l)}catch(_){o.options.__e(_,n.__v)}};var d="function"==typeof requestAnimationFrame;function l(_){"function"==typeof _.u&&_.u()}function y(_){_.u=_.__()}function E(t,_){return!t||_.some(function(_,n){return _!==t[n]})}function b(_,n){return"function"==typeof n?n(_):n}_.useState=p,_.useReducer=h,_.useEffect=function(_,n){var t=a(e++,3);!o.options.__s&&E(t.__H,n)&&(t.__=_,t.__H=n,u.__H.__h.push(t))},_.useLayoutEffect=m,_.useRef=function(_){return i=5,v(function(){return{current:_}},[])},_.useImperativeHandle=function(_,n,t){i=6,m(function(){"function"==typeof _?_(n()):_&&(_.current=n())},null==t?t:t.concat(_))},_.useMemo=v,_.useCallback=function(_,n){return i=8,v(function(){return _},n)},_.useContext=function(_){var n=u.context[_.__c],t=a(e++,9);return t.__c=_,n?(null==t.__&&(t.__=!0,n.sub(u)),n.props.value):_.__},_.useDebugValue=function(_,n){o.options.useDebugValue&&o.options.useDebugValue(n?n(_):_)},_.useErrorBoundary=function(_){var n=a(e++,10),t=p();return n.__=_,u.componentDidCatch||(u.componentDidCatch=function(_){n.__&&n.__(_),t[1](_)}),[t[0],function(){t[1](void 0)}]}});
177// Preact Compat
178!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("preact/hooks"),require("preact")):t(e.compat={},e.preactHooks,e.preact)}(this,function(t,n,u){function r(e,t){for(var n in t)e[n]=t[n];return e}function i(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var o in t)if("__source"!==o&&e[o]!==t[o])return!0;return!1}var o,e,a,l=(o=u.Component,a=o,(e=c).prototype=Object.create(a.prototype),(e.prototype.constructor=e).__proto__=a,c.prototype.shouldComponentUpdate=function(e,t){return i(this.props,e)||i(this.state,t)},c);function c(e){var t;return(t=o.call(this,e)||this).isPureReactComponent=!0,t}function p(t,o){function n(e){var t=this.props.ref,n=t==e.ref;return!n&&t&&(t.call?t(null):t.current=null),o?!o(this.props,e)||!n:i(this.props,e)}function e(e){return this.shouldComponentUpdate=n,u.createElement(t,e)}return e.prototype.isReactComponent=!0,e.displayName="Memo("+(t.displayName||t.name)+")",e.t=!0,e}var f=u.options.__b;u.options.__b=function(e){e.type&&e.type.t&&e.ref&&(e.props.ref=e.ref,e.ref=null),f&&f(e)};var s="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function d(o){function e(e,t){var n=r({},e);return delete n.ref,o(n,(t=e.ref||t)&&("object"!=typeof t||"current"in t)?t:null)}return e.$$typeof=s,(e.render=e).prototype.isReactComponent=e.t=!0,e.displayName="ForwardRef("+(o.displayName||o.name)+")",e}function _(e,o){return e?u.toChildArray(e).reduce(function(e,t,n){return e.concat(o(t,n))},[]):null}var h={map:_,forEach:_,count:function(e){return e?u.toChildArray(e).length:0},only:function(e){if(1!==(e=u.toChildArray(e)).length)throw new Error("Children.only() expects only one child.");return e[0]},toArray:u.toChildArray},m=u.options.__e;function v(e){return e&&((e=r({},e)).__c=null,e.__k=e.__k&&e.__k.map(v)),e}function y(){this.__u=0,this.u=null,this.__b=null}function C(e){var t=e.__.__c;return t&&t.o&&t.o(e)}function b(t){var n,o,r;function e(e){if(n||(n=t()).then(function(e){o=e.default||e},function(e){r=e}),r)throw r;if(!o)throw n;return u.createElement(o,e)}return e.displayName="Lazy",e.t=!0,e}function k(){this.i=null,this.l=null}u.options.__e=function(e,t,n){if(e.then)for(var o,r=t;r=r.__;)if((o=r.__c)&&o.__c)return o.__c(e,t.__c);m(e,t,n)},(y.prototype=new u.Component).__c=function(e,t){var n=this;null==n.u&&(n.u=[]),n.u.push(t);function o(){i||(i=!0,r?r(u):u())}var r=C(n.__v),i=!1;t.__c=t.componentWillUnmount,t.componentWillUnmount=function(){o(),t.__c&&t.__c()};var u=function(){var e;if(!--n.__u)for(n.__v.__k[0]=n.state.o,n.setState({o:n.__b=null});e=n.u.pop();)e.forceUpdate()};n.__u++||n.setState({o:n.__b=n.__v.__k[0]}),e.then(o,o)},y.prototype.render=function(e,t){return this.__b&&(this.__v.__k&&
178(this.__v.__k[0]=v(this.__b)),this.__b=null),[u.createElement(u.Fragment,null,t.o?null:e.children),t.o&&e.fallback]};function g(e,t,n){if(++n[1]===n[0]&&e.l.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.l.size))for(n=e.i;n;){for(;3<n.length;)n.pop()();if(n[1]<n[0])break;e.i=n=n[2]}}(k.prototype=new u.Component).o=function(n){var o=this,r=C(o.__v),i=o.l.get(n);return i[0]++,function(e){function t(){o.props.revealOrder?(i.push(e),g(o,n,i)):e()}r?r(t):t()}},k.prototype.render=function(e){this.i=null,this.l=new Map;var t=u.toChildArray(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.l.set(t[n],this.i=[1,0,this.i]);return e.children},k.prototype.componentDidUpdate=k.prototype.componentDidMount=function(){var n=this;n.l.forEach(function(e,t){g(n,t,e)})};var E,N=((E=S.prototype).getChildContext=function(){return this.props.context},E.render=function(e){return e.children},S);function S(){}function x(e){var t=this,n=e.container,o=u.createElement(N,{context:t.context},e.vnode);return t.s&&t.s!==n&&(t.h.parentNode&&t.s.removeChild(t.h),u.__u(t.v),t.p=!1),e.vnode?t.p?(n.__k=t.__k,u.render(o,n),t.__k=n.__k):(t.h=document.createTextNode(""),u.hydrate("",n),n.appendChild(t.h),t.p=!0,t.s=n,u.render(o,n,t.h),t.__k=t.h.__k):t.p&&(t.h.parentNode&&t.s.removeChild(t.h),u.__u(t.v)),t.v=o,t.componentWillUnmount=function(){t.h.parentNode&&t.s.removeChild(t.h),u.__u(t.v)},null}function w(e,t){return u.createElement(x,{vnode:e,container:t})}var A=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/;u.Component.prototype.isReactComponent={};var R="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103;function U(e,t,n){if(null==t.__k)for(;t.firstChild;)t.removeChild(t.firstChild);return u.render(e,t),"function"==typeof n&&n(),e?e.__c:null}function P(e,t,n){return u.hydrate(e,t),"function"==typeof n&&n(),e?e.__c:null}var F=u.options.event;function O(e,t){e["UNSAFE_"+t]&&!e[t]&&Object.defineProperty(e,t,{configurable:!1,get:function(){return this["UNSAFE_"+t]}
178,set:function(e){this["UNSAFE_"+t]=e}})}u.options.event=function(e){F&&(e=F(e));var t=!(e.persist=function(){}),n=!1,o=e.stopPropagation;e.stopPropagation=function(){o.call(e),t=!0};var r=e.preventDefault;return e.preventDefault=function(){r.call(e),n=!0},e.isPropagationStopped=function(){return t},e.isDefaultPrevented=function(){return n},e.nativeEvent=e};var L={configurable:!0,get:function(){return this.class}},M=u.options.vnode;function D(e){return u.createElement.bind(null,e)}function V(e){return!!e&&e.$$typeof===R}function W(e){return V(e)?u.cloneElement.apply(null,arguments):e}function $(e){return!!e.__k&&(u.render(null,e),!0)}function j(e){return e&&(e.base||1===e.nodeType&&e)||null}u.options.vnode=function(i){i.$$typeof=R;var e,t,n,o=i.type,r=i.props;if(o){if(r.class!=r.className&&(L.enumerable="className"in r,null!=r.className&&(r.class=r.className),Object.defineProperty(r,"className",L)),"function"!=typeof o){for(n in r.defaultValue&&void 0!==r.value&&(r.value||0===r.value||(r.value=r.defaultValue),delete r.defaultValue),Array.isArray(r.value)&&r.multiple&&"select"===o&&(u.toChildArray(r.children).forEach(function(e){-1!=r.value.indexOf(e.props.value)&&(e.props.selected=!0)}),delete r.value),r)if(e=A.test(n))break;if(e)for(n in t=i.props={},r)t[A.test(n)?n.replace(/[A-Z0-9]/,"-$&").toLowerCase():n]=r[n]}!function(){var e=i.type,t=i.props;if(t&&"string"==typeof e){var n,o={};for(var r in t)/^on(Ani|Tra|Tou)/.test(r)&&(t[r.toLowerCase()]=t[r],delete t[r]),o[r.toLowerCase()]=r;o.ondoubleclick&&(t.ondblclick=t[o.ondoubleclick],delete t[o.ondoubleclick]),o.onbeforeinput&&(t.onbeforeinput=t[o.onbeforeinput],delete t[o.onbeforeinput]),o.onchange&&("textarea"===e||"input"===e.toLowerCase()&&!/^fil|che|ra/i.test(t.type))&&(t[n=o.oninput||"oninput"]||(t[n]=t[o.onchange],delete t[o.onchange]))}}(),"function"==typeof o&&!o.m&&o.prototype&&(O(o.prototype,"componentWillMount"),O(o.prototype,"componentWillReceiveProps"),O(o.prototype,"componentWillUpdate"),o.m=!0)}M&&M(i)};function z(e,t){return e(t)}var H=u.Fragment,T={useState:n.useState,useReducer:n.useReducer,useEffect:n.useEffect,useLayoutEffect:n.useLayoutEffect,useRef:n.useRef,useImperativeHandle:n.useImperativeHandle,useMemo:n.useMemo,useCallback:n.useCallback,useContext:n.useContext,useDebugValue:n.useDebugValue,version:"16.8.0",Children:h,render:U,hydrate:P,unmountComponentAtNode:$,createPortal:w,createElement:u.createElement,createContext:u.createContext,createFactory:D,cloneElement:W,createRef:u.createRef,Fragment:u.Fragment,isValidElement:V,findDOMNode:j,Component:u.Component,PureComponent:l,memo:p,forwardRef:d,unstable_batchedUpdates:z,StrictMode:H,Suspense:y,SuspenseList:k,lazy:b};Object.keys(n).forEach(function(e){t[e]=n[e]}),t.createElement=u.createElement,t.createContext=u.createContext,t.createRef=u.createRef,t.Fragment=u.Fragment,t.Component=u.Component,t.version="16.8.0",t.Children=h,t.render=U,t.hydrate=P,t.unmountComponentAtNode=$,t.createPortal=w,t.createFactory=D,t.cloneElement=W,t.isValidElement=V,t.findDOMNode=j,t.PureComponent=l,t.memo=p,t.forwardRef=d,t.unstable_batchedUpdates=z,t.StrictMode=H,t.Suspense=y,t.SuspenseList=k,t.lazy=b,t.default=T});
179// Goober
180!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):t((e||self).goober={})}(this,function(e){let t={data:""},r=e=>"object"==typeof window?((e?e.querySelector("#_goober"):window._goober)||Object.assign((e||document.head).appendChild(document.createElement("style")),{innerHTML:" ",id:"_goober"})).firstChild:e||t,l=/(?:([\u0080-\uFFFF\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\s*)/g,n=/\/\*[^]*?\*\/|  +/g,o=/\n+/g,a=(e,t)=>{let r="",l="",n="";for(let o in e){let s=e[o];"@"==o[0]?"i"==o[1]?r=o+" "+s+";":l+="f"==o[1]?a(s,o):o+"{"+a(s,"k"==o[1]?"":t)+"}":"object"==typeof s?l+=a(s,t?t.replace(/([^,])+/g,e=>o.replace(/(^:.*)|([^,])+/g,t=>/&/.test(t)?t.replace(/&/g,e):e?e+" "+t:t)):o):null!=s&&(o=/^--/.test(o)?o:o.replace(/[A-Z]/g,"-$&").toLowerCase(),n+=a.p?a.p(o,s):o+":"+s+";")}return r+(t&&n?t+"{"+n+"}":n)+l},s={},i=e=>{if("object"==typeof e){let t="";for(let r in e)t+=r+i(e[r]);return t}return e},c=(e,t,r,c,f)=>{let p=i(e),u=s[p]||(s[p]=(e=>{let t=0,r=11;for(;t<e.length;)r=101*r+e.charCodeAt(t++)>>>0;return"go"+r})(p));if(!s[u]){let t=p!==e?e:(e=>{let t,r,a=[{}];for(;t=l.exec(e.replace(n,""));)t[4]?a.shift():t[3]?(r=t[3].replace(o," ").trim(),a.unshift(a[0][r]=a[0][r]||{})):a[0][t[1]]=t[2].replace(o," ").trim();return a[0]})(e);
180s[u]=a(f?{["@keyframes "+u]:t}:t,r?"":"."+u)}return((e,t,r)=>{-1==t.data.indexOf(e)&&(t.data=r?e+t.data:t.data+e)})(s[u],t,c),u},f=(e,t,r)=>e.reduce((e,l,n)=>{let o=t[n];if(o&&o.call){let e=o(r),t=e&&e.props&&e.props.className||/^go/.test(e)&&e;o=t?"."+t:e&&"object"==typeof e?e.props?"":a(e,""):!1===e?"":e}return e+l+(null==o?"":o)},"");function p(e){let t=this||{},l=e.call?e(t.p):e;return c(l.unshift?l.raw?f(l,[].slice.call(arguments,1),t.p):l.reduce((e,r)=>Object.assign(e,r&&r.call?r(t.p):r),{}):l,r(t.target),t.g,t.o,t.k)}let u,d,g,b=p.bind({g:1}),h=p.bind({k:1});e.css=p,e.extractCss=e=>{let t=r(e),l=t.data;return t.data="",l},e.glob=b,e.keyframes=h,e.setup=function(e,t,r,l){a.p=t,u=e,d=r,g=l},e.styled=function(e,t){let r=this||{};return function(){let l=arguments;function n(o,a){let s=Object.assign({},o),i=s.className||n.className;r.p=Object.assign({theme:d&&d()},s),r.o=/ *go\d+/.test(i),s.className=p.apply(r,l)+(i?" "+i:""),t&&(s.ref=a);let c=e;return e[0]&&(c=s.as||e,delete s.as),g&&c[0]&&g(s),u(c,s)}return t?t(n):n}}});
181
182</script>
182
183<!--LOOMI SDK-->
184
185
186<!-- Start of Shoplift scripts -->
187<!-- 2024-10-18T14:58:49.7413776Z -->
188<style>.shoplift-hide { opacity: 0 !important; }</style>
189<script type="text/javascript">(function(rootPath, template, themeRole, themeId, isThemePreview){ /* Generated on 2025-01-02T06:15:26.0070562Z */var C=Object.defineProperty;var I=(g,u,d)=>u in g?C(g,u,{enumerable:!0,configurable:!0,writable:!0,value:d}):g[u]=d;var c=(g,u,d)=>I(g,typeof u!="symbol"?u+"":u,d);(function(){"use strict";var g=" daum[ /]| deusu/| yadirectfetcher|(?:^|[^g])news(?!sapphire)|(?<! (?:channel/|google/))google(?!(app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!(?: ya| yandex|^job|inapp;) ?)search|(?<!(?:lib))http|(?<![hg]m)score|@[a-z][\\w-]+\\.|\\(\\)|\\.com|\\b\\d{13}\\b|^<|^[\\w \\.\\-\\(?:\\):]+(?:/v?\\d+(?:\\.\\d+)?(?:\\.\\d{1,10})*?)?(?:,|$)|^[^ ]{50,}$|^\\d+\\b|^\\w+/[\\w\\(\\)]*$|^active|^ad muncher|^amaya|^avsdevicesdk/|^biglotron|^bot|^bw/|^clamav[ /]|^client/|^cobweb/|^custom|^ddg[_-]android|^discourse|^dispatch/\\d|^downcast/|^duckduckgo|^facebook|^getright/|^gozilla/|^hobbit|^hotzonu|^hwcdn/|^jeode/|^jetty/|^jigsaw|^microsoft bits|^movabletype|^mozilla/\\d\\.\\d \\(compatible;?\\)$|^mozilla/\\d\\.\\d \\w*$|^navermailapp|^netsurf|^offline|^owler|^postman|^python|^rank|^read|^reed|^rest|^rss|^snapchat|^space bison|^svn|^swcd |^taringa|^thumbor/|^track|^valid|^w3c|^webbandit/|^webcopier|^wget|^whatsapp|^wordpress|^xenu link sleuth|^yahoo|^yandex|^zdm/\\d|^zoom marketplace/|^{{.*}}$|admin|analyzer|archive|ask jeeves/teoma|bit\\.ly/|bluecoat drtr|browsex|burpcollaborator|capture|catch|check|chrome-lighthouse|chromeframe|classifier|clean|cloud|crawl|cypress/|dareboost|datanyze|dejaclick|detect|dmbrowser|download|evc-batch/|feed|firephp|gomezagent|headless|httrack|hubspot marketing grader|hydra|ibisbrowser|images|insight|inspect|iplabel|ips-agent|java(?!;)|library|mail\\.ru/|manager|measure|neustar wpm|node|nutch|offbyone|optimize|pageburst|pagespeed|parser|perl|phantomjs|pingdom|powermarks|preview|proxy|ptst[ /]\\d|reputation|resolver|retriever|rexx;|rigor|rss\\b|scan|scrape|server|sogou|sparkler/|speedcurve|spider|splash|statuscake|synapse|synthetic|tools|torrent|trace|transcoder|url|virtuoso|wappalyzer|watch|webglance|webkit2png|whatcms/|zgrab",u=/bot|spider|crawl|http|lighthouse/i,d;function w(){if(d instanceof RegExp)return d;try{d=new RegExp(g,"i")}catch{d=u}return d}function v(p){return!!p&&w().test(p)}class m{constructor(){c(this,"timestamp");this.timestamp=new Date}}class S extends m{constructor(e,s,i){super();c(this,"type");c(this,"testId");c(this,"hypothesisId");this.type=3,this.testId=e,this.hypothesisId=s,this.timestamp=i}}class b extends m{constructor(e){super();c(this,"type");c(this,"path");this.type=4,this.path=e}}class k extends m{constructor(e){super();c(this,"type");c(this,"cart");this.type=5,this.cart=e}}class f extends Error{constructor(){super();c(this,"isBot");this.isBot=!0}}class T{constructor(t,e,s,i,o,a,n,r,l){c(this,"shop");c(this,"essentialSessionKey","Shoplift_Essential");c(this,"analyticsSessionKey","Shoplift_Analytics");c(this,"legacySessionKey");c(this,"host");c(this,"eventHost");c(this,"cssHideClass");c(this,"testConfigs");c(this,"sendPageView",!1);c(this,"shopliftDebug",!1);c(this,"useGtag",!1);c(this,"getCountryTimeout");c(this,"state");c(this,"shopifyAnalyticsId");c(this,"baseVisitor");c(this,"cookie",document.cookie);c(this,"isSyncing",!1);c(this,"fetch");c(this,"localStorageSet");c(this,"localStorageGet");c(this,"urlParams",new URLSearchParams(window.location.search));this.shop=t,this.legacySessionKey=`SHOPLIFT_SESSION_${this.shop}`,this.host=e,this.eventHost=s,this.cssHideClass=i?"shoplift-hide":"",this.testConfigs=l,this.sendPageView=!!o,this.shopliftDebug=a===!0,this.useGtag=n===!0,this.fetch=window.fetch.bind(window),this.localStorageSet=window.localStorage.setItem.bind(window.localStorage),this.localStorageGet=window.localStorage.getItem.bind(window.localStorage),this.state=this.loadState(),this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.baseVisitor=this.buildBaseVisitor(),this.testConfigs=l,this.getCountryTimeout=r===1000?1e3:r,this.log("State Loaded",JSON.stringify(this.state))}
189async init(){try{if(this.log("Shoplift script initializing"),window.Shopify&&window.Shopify.designMode){this.log("Skipping script for design mode");return}if(window.location.href.includes("slScreenshot=true")){this.log("Skipping script for screenshot"),this.setShoplift();return}if(window.location.hostname.endsWith(".shopifypreview.com")||window.location.hostname.endsWith(".edgemesh.com")){this.log("Skipping script for preview");return}if(window.location.href.includes("isShopliftMerchant")){const e=this.urlParams.get("isShopliftMerchant")==="true";this.log("Setting merchant session to %s",e),this.state.essential.isMerchant=e,this.persistEssentialState()}if(v(navigator.userAgent)||(this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.monitorConsentChange(),this.checkForThemePreview()))return;if(await this.handleVisitorTest()){this.log("Redirecting for visitor test");return}this.setShoplift(),this.showPage(),await this.finalize(),console.log("SHOPLIFT SCRIPT INITIALIZED!")}catch(t){if(t instanceof f)return;throw t}finally{typeof window.shoplift!="object"&&(window.shoplift={isHypothesisActive:async t=>!1,setAnalyticsConsent:t=>{throw"Shoplift not initialized"},getVisitorData:()=>{throw"Shoplift not initialized"}})}}async finalize(){const t=await this.getCartState();t!==null&&this.queueCartUpdate(t),this.saveState(),await this.syncAllEvents()}setShoplift(){this.log("Setting up public API");const e=this.urlParams.get("slVariant")==="true",s=e?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:async i=>{if(this.log("Script checking variant for hypothesis '%s'",i),e)return this.log("Forcing variant for hypothesis '%s'",i),!0;if(s!==null)return this.log("Forcing hypothesis '%s'",s),i===s;const o=this.testConfigs.find(n=>n.hypotheses.some(r=>r.id===i));if(!o)return this.log("No test found for hypothesis '%s'",i),!1;const a=this.state.essential.visitorTests.find(n=>n.testId===o.id);return a?(this.log("Active visitor test found",i),a.hypothesisId===i):(await this.manuallySplitVisitor(o),this.testConfigs.some(n=>n.hypotheses.some(r=>r.id===i&&this.state.essential.visitorTests.some(l=>l.hypothesisId===r.id))))},setAnalyticsConsent:async i=>{await this.onConsentChange(i,!0)},getVisitorData:()=>({visitor:this.state.analytics.visitor,visitorTests:this.state.essential.visitorTests.filter(i=>!i.isInvalid).map(i=>{const{shouldSendToGa:o,...a}=i;return a})})}}async manuallySplitVisitor(t){this.log("Starting manual split for test '%s'",t.id),await this.handleVisitorTest([t]),this.saveState(),this.syncAllEvents()}async handleVisitorTest(t){const e=await this.filterTestsByAudience(this.testConfigs,this.state.analytics.visitor||this.baseVisitor,this.state.essential.visitorTests);let s=(t==null?void 0:t.filter(o=>e.some(a=>a.id===o.id)))??this.testsForUrl(e);if(s.length>0){this.log("Is on test page");const o=this.getVisitorHypothesis(s);if(o){this.log("Found current visitor test");const r=this.considerRedirect(o);return r&&(this.log("Redirecting for current visitor test"),this.redirect(o)),r}if(this.log("No existing relation for test page"),this.hasThemeAndOtherTestTypes(e)){const r=this.visitorActiveTestType();this.log("Current visitor test type is '%s'",r);let l;switch(r){case"templateOrUrlRedirect":l=h=>h!=="theme";break;case"theme":l=h=>h==="theme";break;case null:l=Math.random()>.5?h=>h==="theme":h=>h!=="theme";break}s=s.filter(h=>h.hypotheses.some(y=>y.isControl&&l(y.type)))}if(s.length===0)return this.log("No tests found"),!1;const a=s[Math.floor(Math.random()*s.length)],n=this.pickHypothesis(a);if(n){this.log("Adding local visitor to test '%s', hypothesis '%s'",a.id,n.id),this.queueAddVisitorToTest(a,n);const r=this.considerRedirect(n);return r&&(this.log("Redirecting for new test"),this.redirect(n)),r}this.log("No hypothesis found")}return!1}considerRedirect(t){if(this.log("Considering redirect for hypothesis '%s'",t.id),t.isControl)return this.log("Skipping redirect for control"),!1;if(t.type==="basicScript"||t.type==="manualScript")return this.log("Skipping redirect for script test"),!1;const e=this.state.essential.visitorTests.find(a=>a.hypothesisId===t.id),s=new URL(window.location.toString()),o=new URLSearchParams(window.location.search).get("view");if(t.type==="theme"){if(!(t.themeId===themeId)){if(this.log("Theme id '%s' is not hypothesis theme ID '%s'",t.themeId,themeId),e&&e.themeId!==t.themeId&&(e.themeId===themeId||!this.isThemePreview()))this.log("On old theme, redirecting and updating local visitor"),e.themeId=t.themeId;else if(this.isThemePreview())return this.log("On non-test theme, skipping redirect"),!1;return this.log("Hiding page to redirect for theme test"),this.hidePage(),!0}return!1}else if(t.affix!==template.suffix&&t.affix!==o||t.redirectPath&&!s.pathname.endsWith(t.redirectPath))return this.log("Hiding page to redirect for template test"),this.hidePage(),!0;return this.log("Not redirecting"),!1}redirect(t){if(this.log("Redirecting to hypothesis '%s'",t.id),t.isControl)return;const e=new URL(window.location.toString());if(t.redirectPath){const s=RegExp("^(/w{2}-w{2})/").exec(e.pathname);if(s&&s.length>1){const i=s[1];e.pathname=`${i}${t.redirectPath}`}else e.pathname=t.redirectPath}else t.type==="theme"?(e.searchParams.set("_ab","0"),e.searchParams.set("_fd","0"),e.searchParams.set("_sc","1"),e.searchParams.set("preview_theme_id",t.themeId.toString())):t.type!=="urlRedirect"&&e.searchParams.set("view",t.affix);this.queueRedirect(e)}buildBaseVisitor(){const t=this.getDeviceType();return{shopifyAnalyticsId:this.shopifyAnalyticsId,device:t!=="tablet"?t:"mobile",...this.getInitialState()}}getInitialState(){const t=this.getUTMValue("utm_source")??"",e=this.getUTMValue("utm_medium")??"",s=this.getUTMValue("utm_campaign")??"",i=this.getUTMValue("utm_content")??"",o=window.document.referrer;return{createdAt:new Date,utmSource:t,utmMedium:e,utmCampaign:s,utmContent:i,referrer:o}}checkForThemePreview(){if(this.log("Checking for theme preview"),!this.isThemePreview())return this.log("Not on theme preview"),!1;if(this.state.essential.isMerchant)return this.log("Merchant previewing theme"),!0;if(this.state.essential.visitorTests.some(t=>{var e;return t.isThemeTest&&((e=this.getHypothesis(t.hypothesisId))==null?void 0:e.themeId)===themeId}))return this.log("On active theme test"),this.clearThemeBar(),!1;if(this.state.essential.isFirstLoad||this.state.essential.visitorTests.some(t=>t.isThemeTest&&!this.getHypothesis(t.hypothesisId)&&(t.themeId==null||t.themeId===themeId))){this.log("Missing visitor or hypothesis, redirecting to main theme"),this.hidePage();const t=new URL(window.location.toString());return t.searchParams.set("preview_theme_id",""),this.queueRedirect(t),!0}return this.state.essential.visitorTests.some(t=>t.themeId===themeId)?(this.log("Falling back to clearing theme bar"),this.clearThemeBar(),!1):(this.log("No tests on current theme, skipping script"),!0)}testsForUrl(t){const e=new URL(window.location.href),s=this.typeFromTemplate();return t.filter(i=>i.hypotheses.some(o=>o.isControl&&o.type===s&&o.affix===template.suffix||o.type==="theme"||o.isControl&&o.type==="urlRedirect"&&o.redirectPath&&e.pathname.endsWith(o.redirectPath)||o.type==="basicScript")&&(!e.searchParams.has("view")||i.hypotheses.filter(o=>!o.isControl).map(o=>o.affix).includes(e.searchParams.get("view")??"")))}async filterTestsByAudience(t,e,s){const i=[];for(const o of t){this.log("Checking audience for test '%s'",o.id);const a=this.visitorCreatedDuringTestActive(o.statusHistory);(s.some(r=>r.testId===o.id)||await this.isTargetAudience(o,e,a))&&(this.log("Visitor is in audience for test '%s'",o.id),i.push(o))}return i}async isTargetAudience(t,e,s){let i=null;t.requiresCountry&&(this.log("Hiding page to check geoip"),this.hidePage(),i=await this.makeJsonRequest({method:"get",url:`${this.host}/api/v0/visitors/get-country`,signal:AbortSignal.timeout(this.getCountryTimeout)}).catch(a=>(this.log("Error getting country",a),null)));const o=this.getChannel(e);return(t.device==="all"||t.device===e.device)&&(t.visitorOption==="all"||t.visitorOption==="new"&&s||t.visitorOption==="returning"&&!s)&&(t.targetAudiences.length===0||t.targetAudiences.reduce((a,n)=>a||n.reduce((r,l)=>r&&l(e,s,o,i),!0),!1))}visitorCreatedDuringTestActive(t){let e="";for(const s of t){if(this.state.analytics.visitor!==null&&this.state.analytics.visitor.createdAt<s.createdAt||this.state.essential.initialState.createdAt<s.createdAt)break;e=s.status}return e==="active"}getVisitorHypothesis(t){return t.reduce((e,s)=>e.concat(s.hypotheses),[]).find(e=>this.state.essential.visitorTests.some(s=>s.hypothesisId===e.id))}getHypothesis(t){return this.testConfigs.filter(e=>e.hypotheses.some(s=>s.id===t)).map(e=>e.hypotheses.find(s=>s.id===t))[0]}hasThemeTest(t){return t.some(e=>e.hypotheses.some(s=>s.type==="theme"))}hasTestThatIsNotThemeTest(t){return t.some(e=>e.hypotheses.some(s=>s.type!=="theme"))}hasThemeAndOtherTestTypes(t){return this.hasThemeTest(t)&&this.hasTestThatIsNotThemeTest(t)}visitorActiveTestType(){const t=this.state.essential.visitorTests.filter(e=>this.testConfigs.some(s=>s.hypotheses.some(i=>i.id==e.hypothesisId)));return t.length===0?null:t.some(e=>e.isThemeTest)?"theme":"templateOrUrlRedirect"}pickHypothesis(t){let e=Math.random();const s=t.hypotheses.reduce((o,a)=>o+a.visitorCount,0);return t.hypotheses.sort((o,a)=>o.isControl?a.isControl?0:-1:a.isControl?1:0).reduce((o,a)=>
189{if(o!==null)return o;const r=t.hypotheses.reduce((l,h)=>l&&h.visitorCount>20,!0)?a.visitorCount/s-a.trafficPercentage:0;return e<=a.trafficPercentage-r?a:(e-=a.trafficPercentage,null)},null)}typeFromTemplate(){switch(template.type){case"collection-list":return"collectionList";case"page":return"landing";case"article":case"blog":case"cart":case"collection":case"index":case"product":case"search":return template.type;default:return null}}queueRedirect(t){this.saveState(),window.setTimeout(()=>window.location.assign(t),0)}async syncAllEvents(){const t=async()=>{if(this.isSyncing){window.setTimeout(()=>void(async()=>await t())(),500);return}try{this.isSyncing=!0,await this.syncEvents(),this.syncGAEvents()}finally{this.isSyncing=!1}};await t()}async syncEvents(){if(!this.state.essential.consentApproved||!this.shopifyAnalyticsId||this.state.analytics.queue.length===0)return;const t=this.state.analytics.queue.length,e=this.state.analytics.queue.splice(0,t);this.log("Syncing %s events",t);try{const s=this.getDeviceType(),i={shop:this.shop,visitorDetails:{shopifyAnalyticsId:this.shopifyAnalyticsId,device:s!=="tablet"?s:"mobile",...this.state.essential.initialState},events:this.state.essential.visitorTests.filter(n=>!n.isInvalid&&!n.isSaved).map(n=>new S(n.testId,n.hypothesisId,n.createdAt)).concat(e)},o=await this.sendEvents(i);let a;({visitorTests:a,...this.state.analytics.visitor}=o);for(const n of this.state.essential.visitorTests.filter(r=>!a.some(l=>l.testId===r.testId)))n.isSaved=!0,n.isInvalid=!0;for(const n of a)this.state.essential.visitorTests.some(l=>l.testId===n.testId)||this.state.essential.visitorTests.push(n);this.state.analytics.visitor.storedAt=new Date}catch{this.state.analytics.queue.splice(0,0,...e)}finally{this.saveState()}}syncGAEvents(){if(!this.useGtag||!this.state.essential.consentApproved)return;const t=this.state.essential.visitorTests.filter(e=>e.shouldSendToGa);this.log("Syncing %s ga events",length);try{for(const e of t)this.sendGtagEvent(e.testId,e.hypothesisId),e.shouldSendToGa=!1}catch(e){this.log("Failed sending event to gtag",e)}finally{this.persistEssentialState()}}sendGtagEvent(t,e){this.log("Sending gtag event for",t,e);const s={exp_variant_string:`SL-${t}-${e}`};
189this.shopliftDebug&&Object.assign(s,{debug_mode:!0}),typeof window.gtag=="function"?gtag("event","experience_impression",s):(this.log("gtag not found, pushing to dataLayer"),window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"experience_impression",...s}))}async sendEvents(t){return await this.makeJsonRequest({method:"post",url:`${this.host}/api/v0/events`,data:JSON.stringify(t)})}async getRemoteVisitor(t){return await this.makeJsonRequest({method:"get",url:`${this.host}/api/v0/visitors/${t}`})}async updateShopifyAnalyticsId(t,e){return await this.makeJsonRequest({method:"put",url:`${this.host}/api/v0/visitors/${t}`,data:JSON.stringify({shop:this.shop,shopifyAnalyticsId:e})})}getUTMValue(t){const s=decodeURIComponent(window.location.search.substring(1)).split("&");for(let i=0;i<s.length;i++){const o=s[i].split("=");if(o[0]===t)return o[1]||null}return null}hidePage(){this.log("Hiding page"),this.cssHideClass&&!window.document.documentElement.classList.contains(this.cssHideClass)&&(window.document.documentElement.classList.add(this.cssHideClass),setTimeout(this.removeAsyncHide(this.cssHideClass),2e3))}showPage(){this.cssHideClass&&this.removeAsyncHide(this.cssHideClass)()}getDeviceType(){function t(){let s=!1;return function(i){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(i)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(i.substr(0,4)))&&(s=!0)}(navigator.userAgent||navigator.vendor),s}function e(){let s=!1;return function(i){(/android|ipad|playbook|silk/i.test(i)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|
189sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(i.substr(0,4)))&&(s=!0)}(navigator.userAgent||navigator.vendor),s}return t()?"mobile":e()?"tablet":"desktop"}removeAsyncHide(t){return()=>{t&&window.document.documentElement.classList.remove(t)}}async getCartState(){try{let t=await this.makeJsonRequest({method:"get",url:`${window.location.origin}/cart.js`});return t.note===null&&(t=await this.makeJsonRequest({method:"post",url:`${window.location.origin}/cart/update.js`,data:JSON.stringify({note:""})})),t}catch(t){return this.log("Error sending cart info",t),null}}async makeJsonRequest(t){return(await this.makeRequest(t)).json()}async makeRequest(t){const{url:e,method:s,headers:i,data:o,signal:a}=t,n=new Headers;if(i)for(const l in i)n.append(l,i[l]);(!i||!i.Accept)&&n.append("Accept","application/json"),(!i||!i["Content-Type"])&&n.append("Content-Type","application/json"),(this.host.includes("ngrok.io")||this.host.includes("ngrok-free.app"))&&n.append("ngrok-skip-browser-warning","1234");const r=await this.fetch(e,{method:s,headers:n,body:o,signal:a});if(!r.ok){if(r.status==422){const l=await r.json();if(typeof l<"u"&&l.isBot)throw new f}throw new Error(`Error sending shoplift request ${r.status}`)}return r}queueAddVisitorToTest(t,e){this.state.essential.visitorTests.some(s=>s.testId===t.id)||this.state.essential.visitorTests.push({createdAt:new Date,testId:t.id,hypothesisId:e.id,isThemeTest:e.type==="theme",themeId:e.themeId,isSaved:!1,isInvalid:!1,shouldSendToGa:!0})}queueCartUpdate(t){this.queueEvent(new k(t))}queuePageView(t){this.queueEvent(new b(t))}queueEvent(t){!this.state.essential.consentApproved&&this.state.essential.hasConsentInteraction||this.state.analytics.queue.length>30||this.state.analytics.queue.push(t)}legacyGetLocalStorageVisitor(){const t=this.localStorageGet(this.legacySessionKey);if(t)try{return JSON.parse(t)}catch{}return null}saveState(){this.persistEssentialState(),this.persistAnalyticsState()}loadState(){const t=this.loadAnalyticsState(),e={analytics:t,essential:this.loadEssentialState(t)},s=this.legacyGetLocalStorageVisitor(),i=this.legacyGetCookieVisitor(),o=[s,i].filter(a=>a!==null).sort((a,n)=>+n.storedAt-+a.storedAt)[0];return e.analytics.visitor===null&&o&&({visitorTests:e.essential.visitorTests,...e.analytics.visitor}=o,this.deleteCookie("SHOPLIFT"),this.deleteLocalStorage(this.legacySessionKey)),!e.essential.consentApproved&&e.essential.hasConsentInteraction&&this.deleteLocalStorage(this.analyticsSessionKey),e}loadEssentialState(t){const e=this.loadLocalStorage(this.essentialSessionKey),s=this.loadCookie(this.essentialSessionKey),i=this.getInitialState(),o={timestamp:new Date,consentApproved:!1,hasConsentInteraction:!1,debugMode:!1,initialState:i,visitorTests:[],isMerchant:!1,isFirstLoad:!0},a=[e,s].filter(n=>n!==null).sort((n,r)=>+r.timestamp-+n.timestamp)[0]??o;return a.initialState||(t.visitor!==null?a.initialState=t.visitor:(a.initialState=this.getInitialState(),a.initialState.createdAt=a.timestamp)),a}loadAnalyticsState(){const t=this.loadLocalStorage(this.analyticsSessionKey),e=this.loadCookie(this.analyticsSessionKey),s={timestamp:new Date,visitor:null,queue:[]};return[t,e].filter(i=>i!==null).sort((i,o)=>+o.timestamp-+i.timestamp)[0]??s}persistEssentialState(){this.log("Persisting essential state"),this.state.essential.isFirstLoad=!1,this.persistLocalStorageState(this.essentialSessionKey,this.state.essential),this.persistCookieState(this.essentialSessionKey,this.state.essential)}persistAnalyticsState(){this.log("Persisting analytics state"),this.state.essential.consentApproved&&(this.persistLocalStorageState(this.analyticsSessionKey,this.state.analytics),this.persistCookieState(this.analyticsSessionKey,this.state.analytics))}loadLocalStorage(t){const e=this.localStorageGet(t);return e===null?null:JSON.parse(e)}loadCookie(t){const e=this.getCookie(t);return e===null?null:JSON.parse(e)}persistLocalStorageState(t,e){e.timestamp=new Date,this.localStorageSet(t,JSON.stringify(e))}persistCookieState(t,e){e.timestamp=new Date;const s=JSON.stringify(e),i=new Date(new Date().getTime()+864e5*365).toUTCString();document.cookie=`${t}=${s};domain=.${window.location.hostname};path=/;expires=${i};SameSite=Strict;`}deleteCookie(t){const e=new Date(0).toUTCString();document.cookie=`${t}=;domain=.${window.location.hostname};path=/;expires=${e};`}deleteLocalStorage(t){window.localStorage.removeItem(t)}getChannel(t){var s;return((s=[{"name":"cross-network","test":(v) => new RegExp(".*cross-network.*", "i").test(v.utmCampaign)}
189,{"name":"direct","test":(v) => v.utmSource === "" && v.utmMedium === ""},{"name":"paid-shopping","test":(v) => (new RegExp("^(?:Google|IGShopping|aax-us-east\.amazon-adsystem\.com|aax\.amazon-adsystem\.com|alibaba|alibaba\.com|amazon|amazon\.co\.uk|amazon\.com|apps\.shopify\.com|checkout\.shopify\.com|checkout\.stripe\.com|cr\.shopping\.naver\.com|cr2\.shopping\.naver\.com|ebay|ebay\.co\.uk|ebay\.com|ebay\.com\.au|ebay\.de|etsy|etsy\.com|m\.alibaba\.com|m\.shopping\.naver\.com|mercadolibre|mercadolibre\.com|mercadolibre\.com\.ar|mercadolibre\.com\.mx|message\.alibaba\.com|msearch\.shopping\.naver\.com|nl\.shopping\.net|no\.shopping\.net|offer\.alibaba\.com|one\.walmart\.com|order\.shopping\.yahoo\.co\.jp|partners\.shopify\.com|s3\.amazonaws\.com|se\.shopping\.net|shop\.app|shopify|shopify\.com|shopping\.naver\.com|shopping\.yahoo\.co\.jp|shopping\.yahoo\.com|shopzilla|shopzilla\.com|simplycodes\.com|store\.shopping\.yahoo\.co\.jp|stripe|stripe\.com|uk\.shopping\.net|walmart|walmart\.com)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|k
189akao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"display","test":(v) =>
189 new RegExp("^(?:display|banner|expandable|interstitial|cpm)$", "i").test(v.utmMedium)},{"name":"paid-other","test":(v) => new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"organic-shopping","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)},{"name":"organic-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|k
189akao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) || new RegExp("^(?:social|social-network|social-media|sm|social network|social media)$", "i").test(v.utmMedium)},{"name":"organic-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) || new RegExp("^(.*video.*)$", "i").test(v.utmMedium)},{"name":"organic-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|y
189andex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || v.utmMedium.toLowerCase() === "organic"},{"name":"referral","test":(v) => new RegExp("^(?:referral|app|link)$", "i").test(v.utmMedium)},{"name":"email","test":(v) => new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmMedium) || new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmSource)},{"name":"affiliate","test":(v) => v.utmMedium.toLowerCase() === "affiliate"},{"name":"audio","test":(v) => v.utmMedium.toLowerCase() === "audio"},{"name":"sms","test":(v) => v.utmSource.toLowerCase() === "sms" || v.utmMedium.toLowerCase() === "sms"},{"name":"mobile-push-notification","test":(v) => v.utmSource.toLowerCase() === "firebase" || new RegExp("(?:.*mobile.*|.*notification.*|push$)", "i").test(v.utmMedium)}].find(i=>i.test(t)))==null?void 0:s.name)??"other"}getShopifyAnalyticsId(){return this.getCookie("_shopify_y")}legacyGetCookieVisitor(){const t=this.getCookie("SHOPLIFT");return t===null?null:JSON.parse(t)}getCookie(t){const e=this.cookie.split("; ").filter(s=>s.split("=").at(0)===t).at(0);return e===void 0?null:e.split("=").slice(1).join("=")}monitorConsentChange(){document.addEventListener("visitorConsentCollected",t=>void(async()=>await this.onConsentChange(t.detail.analyticsAllowed,!0))()),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.loadShopifyConsentApiWithRetry()):this.loadShopifyConsentApiWithRetry()}loadShopifyConsentApiWithRetry(){let t=0;const e=()=>{this.loadShopifyConsentApi()||t++<10&&window.setTimeout(e,100)};e()}loadShopifyConsentApi(){if(window.Shopify){this.log("Loading Shopify features");const t=async()=>{if(!window.Shopify){this.log("Shopify object missing... suddenly?");return}if(window.Shopify.customerPrivacy===void 0){this.log("Shopify CustomerPrivacy api still missing, trying again in 1000ms"),e=window.setTimeout(()=>void(async()=>await t())(),1e3);return}const s=window.Shopify.customerPrivacy.getTrackingConsent();await this.onConsentChange(window.Shopify.customerPrivacy.analyticsProcessingAllowed(),s!=="no_interaction")};let e=window.setTimeout(()=>void(async()=>await t())(),5e3);return window.Shopify.loadFeatures([{name:"consent-tracking-api",version:"0.1"}],s=>{(async()=>{if(window.clearTimeout(e),s){this.log("Error loading consent tracking",s);return}await t()})()}),!0}return!1}async onConsentChange(t,e){try{if(this.log("Consent change detected"),this.state.essential.consentApproved=t,this.state.essential.hasConsentInteraction=e,!this.state.essential.consentApproved){this.state.essential.hasConsentInteraction&&(this.state.analytics.queue.length=0),this.saveState();return}this.cookie=document.cookie,this.shopifyAnalyticsId=this.getShopifyAnalyticsId();for(const s of this.state.analytics.queue.filter(i=>i.type===1||i.type===2)){const i=s;i.shopifyAnalyticsId=this.shopifyAnalyticsId}this.saveState(),await this.syncAllEvents()}catch(s){this.log("Error syncing on consent change",s)}}isThemePreview(){try{return isThemePreview}catch(t){if(t instanceof ReferenceError)try{return themeRole!=="main"}catch(e){if(e instanceof ReferenceError)return window.document.cookie.includes("preview_theme=1");throw e}else throw t}}clearThemeBar(){this.log("Setting theme bar to be cleared"),this.waitForElement("#preview-bar-iframe").then(t=>{this.log("Clearing theme bar"),t.remove()}).catch(t=>console.error(t))}waitForElement(t){return new Promise(e=>{const s=document.querySelector(t);if(s){e(s);return}const i=new MutationObserver(o=>{const a=document.querySelector(t);if(a){i.disconnect(),e(a);return}});i.observe(document.documentElement,{childList:!0,subtree:!0})})}setDebug(t){this.state.essential.debugMode=t,this.saveState()}log(t,...e){!this.state.essential.debugMode&&!this.shopliftDebug||console.debug(`[SL] ${t}`,...e)}debug(){const t={state:this.state,storage:{essential:this.loadLocalStorage(this.essentialSessionKey),analytics:this.loadLocalStorage(this.analyticsSessionKey)},params:{shop:this.shop,host:this.host,eventHost:this.eventHost,cssHideClass:this.cssHideClass,testConfigs:this.testConfigs,sendPageView:this.sendPageView}};console.log(JSON.stringify(t))}}(async function(){window.shopliftInstance||(window.shopliftInstance=new T("joy-planet-finland.myshopify.com","https://app.shoplift.ai","https://events.shoplift.ai",false,false,false,false,1000,[]),await window.shopliftInstance.init())})()})(); })("/", { suffix: "tinys-paasivu", type: "product" }, "main", 162073870678, false)</script>
189
190<!-- End of Shoplift scripts -->
191
192
193<meta name="google-site-verification" content="v4fNW4P80oysfe8cyZ6Rp6X_TriC84z95DSlRxzibN8" />
194
195  <meta charset="utf-8">
196  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
197  <meta name="viewport" content="width=device-width,initial-scale=1">
198  <meta name="theme-color" content="#111111">
199  <link rel="canonical" href="https://joyearbuds.com/products/tinys-earbuds-desinged-for-women-joy-friends-club">
200  <link rel="preconnect" href="https://cdn.shopify.com" crossorigin>
201  <link rel="preconnect" href="https://fonts.shopifycdn.com" crossorigin>
202  <link rel="dns-prefetch" href="https://productreviews.shopifycdn.com">
203  <link rel="dns-prefetch" href="https://ajax.googleapis.com">
204  <link rel="dns-prefetch" href="https://maps.googleapis.com">
205  <link rel="dns-prefetch" href="https://maps.gstatic.com">
206
207  
208<link rel="shortcut icon" href="//joyearbuds.com/cdn/shop/files/favicon_3d919db1-a75f-42c0-8a40-83ce60f20e3e_32x32.png?v=1715578740" type="image/png" /><title>Premium Nappikuulokkeet - Sopii jokaiseen korvaan
209&ndash; Joy Planet Finland
210</title>
211<meta name="description" content="TinyS Premium Nappikuulokkeet jotka on suunniteltu sopimaan jokaiseen korvaan."><meta property="og:site_name" content="Joy Planet Finland">
212  <meta property="og:url" content="https://joyearbuds.com/products/tinys-earbuds-desinged-for-women-joy-friends-club">
213  <meta property="og:title" content="TinyS">
214  <meta property="og:type" content="product">
215  <meta property="og:description" content="TinyS Premium Nappikuulokkeet jotka on suunniteltu sopimaan jokaiseen korvaan."><meta property="og:image" content="http://joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205">
216    <meta property="og:image:secure_url" content="https://joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205">
217    <meta property="og:image:width" content="1254">
218    <meta property="og:image:height" content="1254"><meta name="twitter:site" content="@">
219  <meta name="twitter:card" content="summary_large_image">
220  <meta name="twitter:title" content="TinyS">
221  <meta name="twitter:description" content="TinyS Premium Nappikuulokkeet jotka on suunniteltu sopimaan jokaiseen korvaan.">
222<style data-shopify>@font-face {
223  font-family: Inter;
224  font-weight: 700;
225  font-style: normal;
226  font-display: swap;
227  src: url("//joyearbuds.com/cdn/fonts/inter/inter_n7.02711e6b374660cfc7915d1afc1c204e633421e4.woff2") format("woff2"),
228       url("//joyearbuds.com/cdn/fonts/inter/inter_n7.6dab87426f6b8813070abd79972ceaf2f8d3b012.woff") format("woff");
229}
230
231  @font-face {
232  font-family: Inter;
233  font-weight: 400;
234  font-style: normal;
235  font-display: swap;
236  src: url("//joyearbuds.com/cdn/fonts/inter/inter_n4.b2a3f24c19b4de56e8871f609e73ca7f6d2e2bb9.woff2") format("woff2"),
237       url("//joyearbuds.com/cdn/fonts/inter/inter_n4.af8052d517e0c9ffac7b814872cecc27ae1fa132.woff") format("woff");
238}
239
240
241  @font-face {
242  font-family: Inter;
243  font-weight: 600;
244  font-style: normal;
245  font-display: swap;
246  src: url("//joyearbuds.com/cdn/fonts/inter/inter_n6.771af0474a71b3797eb38f3487d6fb79d43b6877.woff2") format("woff2"),
247       url("//joyearbuds.com/cdn/fonts/inter/inter_n6.88c903d8f9e157d48b73b7777d0642925bcecde7.woff") format("woff");
248}
249
250  @font-face {
251  font-family: Inter;
252  font-weight: 400;
253  font-style: italic;
254  font-display: swap;
255  src: url("//joyearbuds.com/cdn/fonts/inter/inter_i4.feae1981dda792ab80d117249d9c7e0f1017e5b3.woff2") format("woff2"),
256       url("//joyearbuds.com/cdn/fonts/inter/inter_i4.62773b7113d5e5f02c71486623cf828884c85c6e.woff") format("woff");
257}
258
259  @font-face {
260  font-family: Inter;
261  font-weight: 600;
262  font-style: italic;
263  font-display: swap;
264  src: url("//joyearbuds.com/cdn/fonts/inter/inter_i6.3bbe0fe1c7ee4f282f9c2e296f3e4401a48cbe19.woff2") format("woff2"),
265       url("//joyearbuds.com/cdn/fonts/inter/inter_i6.8bea21f57a10d5416ddf685e2c91682ec237876d.woff") format("woff");
266}
267
268</style><link href="//joyearbuds.com/cdn/shop/t/54/assets/theme.css?v=84240404310353492641789032338" rel="stylesheet" type="text/css" media="all" />
269  <link href="//joyearbuds.com/cdn/shop/t/54/assets/custom.css?v=7548050675163428991789036848" rel="stylesheet" type="text/css" media="all" />
270<style data-shopify>:root {
271    --typeHeaderPrimary: Inter;
272    --typeHeaderFallback: sans-serif;
273    --typeHeaderSize: 36px;
274    --typeHeaderWeight: 700;
275    --typeHeaderLineHeight: 1.2;
276    --typeHeaderSpacing: 0.0em;
277
278    --typeBasePrimary:Inter;
279    --typeBaseFallback:sans-serif;
280    --typeBaseSize: 16px;
281    --typeBaseWeight: 400;
282    --typeBaseLineHeight: 1.6;
283    --typeBaseSpacing: 0.0em;
284    
285
286    --iconWeight: 3px;
287    --iconLinecaps: miter;
288  }
289
290  
291.collection-hero__content:before,
292  .hero__image-wrapper:before,
293  .hero__media:before {
294    background-image: linear-gradient(to bottom, rgba(28, 28, 28, 0.0) 0%, rgba(28, 28, 28, 0.0) 40%, rgba(0, 0, 0, 0.62) 100%);
295  }
296
297  .skrim__item-content .skrim__overlay:after {
298    background-image: linear-gradient(to bottom, rgba(28, 28, 28, 0.0) 30%, rgba(0, 0, 0, 0.62) 100%);
299  }
300
301  .placeholder-content {
302    background-image: linear-gradient(100deg, #ffffff 40%, #f7f7f7 63%, #ffffff 79%);
303  }</style>
303<script>
304    document.documentElement.className = document.documentElement.className.replace('no-js', 'js');
305
306    window.theme = window.theme || {};
307    theme.routes = {
308      home: "/",
309      cart: "/cart.js",
310      cartPage: "/cart",
311      cartAdd: "/cart/add.js",
312      cartChange: "/cart/change.js",
313      search: "/search",
314      predictiveSearch: "/search/suggest"
315    };
316    theme.strings = {
317      soldOut: "Sold Out",
318      unavailable: "Unavailable",
319      inStockLabel: "Available for order – Delivery time 2-3 weeks.",
320      oneStockLabel: "Low stock - [count] item left",
321      otherStockLabel: "Low stock - [count] items left",
322      willNotShipUntil: "Ready to ship [date]",
323      willBeInStockAfter: "Back in stock [date]",
324      waitingForStock: "Available for order – Delivery time 2-3 weeks.",
325      cartSavings: "You're saving [savings]",
326      cartEmpty: "Your cart is currently empty.",
327      cartTermsConfirmation: "You must agree with the terms and conditions of sales to check out",
328      searchCollections: "Collections",
329      searchPages: "Pages",
330      searchArticles: "Articles",
331      maxQuantity: "You can only have [quantity] of [title] in your cart."
332    };
333    theme.settings = {
334      cartType: "drawer",
335      isCustomerTemplate: false,
336      moneyFormat: "{{amount_with_comma_separator}} €",
337      predictiveSearch: true,
338      predictiveSearchType: null,
339      quickView: true,
340      themeName: 'Motion',
341      themeVersion: "10.4.0"
342    };
343  </script>
343
344
345  
345<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
345<meta name="facebook-domain-verification" content="kebxxkfnjthmtqfgjjyrhqzs5z24cs">
346<meta name="google-site-verification" content="J45FGc70g9uamErQqnu166gLIa0E_hzLiTO8UCFTLL8">
347<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/65680310506/digital_wallets/dialog">
348<link rel="ucp" href="/.well-known/ucp" version="2026-08-25"><link rel="buy" href="/cart/54276348870998:1?ucp/version=2026-08-25&amp;context/payment/0/handler=dev.shopify.shop_pay" payment="dev.shopify.shop_pay com.google.pay dev.shopify.card"><link rel="alternate" hreflang="x-default" href="https://joyearbuds.com/products/tinys-earbuds-desinged-for-women-joy-friends-club">
349<link rel="alternate" hreflang="en" href="https://joyearbuds.com/products/tinys-earbuds-desinged-for-women-joy-friends-club">
350<link rel="alternate" hreflang="fi" href="https://joyearbuds.com/fi/products/tinys-earbuds-desinged-for-women-joy-friends-club">
351<link rel="alternate" hreflang="de" href="https://joyearbuds.com/de/products/tinys-earbuds-desinged-for-women-joy-friends-club">
352<link rel="alternate" hreflang="fi-FI" href="https://joyearbuds.com/fi-fi/products/tinys-earbuds-desinged-for-women-joy-friends-club">
353<link rel="alternate" hreflang="en-FI" href="https://joyearbuds.com/en-fi/products/tinys-earbuds-desinged-for-women-joy-friends-club">
354<link rel="alternate" hreflang="en-DE" href="https://joyearbuds.com/en-de/products/tinys-earbuds-desinged-for-women-joy-friends-club">
355<link rel="alternate" hreflang="de-DE" href="https://joyearbuds.com/de-de/products/tinys-earbuds-desinged-for-women-joy-friends-club">
356<link rel="alternate" type="application/json+oembed" href="https://joyearbuds.com/products/tinys-earbuds-desinged-for-women-joy-friends-club.oembed">
357<script async="async" src="/checkouts/internal/preloads.js?locale=en-US"></script>
357
358<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
359<script async="async" src="https://shop.app/checkouts/internal/preloads.js?locale=en-US&shop_id=65680310506" crossorigin="anonymous"></script>
vendor: 1 bytes, line 359
359
360<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":65680310506,"countryCode":"FI","currencyCode":"EUR","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/65680310506","merchantName":"Joy Planet Finland","requiredBillingContactFields":["postalAddress","email","phone"],"requiredShippingContactFields":["postalAddress","email","phone"],"shippingType":"shipping","supportedNetworks":["visa","maestro","masterCard","amex"],"total":{"type":"pending","label":"Joy Planet Finland","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 360
360
361<script id="shopify-features" type="application/json">{"accessToken":"f604ba8429a1e1b5e31b0cacaa8d55e9","betas":["rich-media-storefront-analytics"],"domain":"joyearbuds.com","predictiveSearch":true,"shopId":65680310506,"locale":"en"}</script>
vendor: 1 bytes, line 361
361
362<script>var Shopify = Shopify || {};
363Shopify.shop = "joy-planet-finland.myshopify.com";
364Shopify.locale = "en";
365Shopify.currency = {"active":"EUR","rate":"1.0"};
366Shopify.country = "US";
367Shopify.theme = {"name":"JOY Earbuds New v1.0 (05.2024)","id":162073870678,"schema_name":"Motion","schema_version":"10.4.0","theme_store_id":847,"role":"main"};
368Shopify.theme.handle = "null";
369Shopify.theme.style = {"id":null,"handle":null};
370Shopify.cdnHost = "joyearbuds.com/cdn";
371Shopify.routes = Shopify.routes || {};
372Shopify.routes.root = "/";
373Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js";
374Shopify.SignInWithShop = Shopify.SignInWithShop || {};
375Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {};
376Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 376
376
377<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 377
377
378<script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script>
vendor: 1 bytes, line 378
378
379<script>
380  window.ShopifyPay = window.ShopifyPay || {};
381  window.ShopifyPay.apiHost = "shop.app\/pay";
382  window.ShopifyPay.redirectState = null;
383</script>
vendor: 1 bytes, line 383
383
384<script>
385  window.Shopify = window.Shopify || {};
386  window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {};
387  window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 };
388  window.Shopify.SignInWithShop.eligible = true;
389</script>
vendor: 1 bytes, line 389
389
390<script id="shop-js-analytics" type="application/json">{"pageType":"product"}</script>
vendor: 1 bytes, line 390
390
391<script defer="defer" async type="module" src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"></script>
vendor: 1 bytes, line 391
391
392<script type="module">
393  await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js");
394
395  window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true});
396
397</script>
vendor: 1 bytes, line 397
397
398<script>
399  window.Shopify = window.Shopify || {};
400  if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {};
401  window.Shopify.featureAssets['shop-js'] = {"avatar":["modules/v2/loader.avatar.en.esm.js"],"checkout-modal":["modules/v2/loader.checkout-modal.en.esm.js"],"init-customer-accounts-sign-up":["modules/v2/loader.init-customer-accounts-sign-up.en.esm.js"],"init-customer-accounts":["modules/v2/loader.init-customer-accounts.en.esm.js"],"init-fed-cm":["modules/v2/loader.init-fed-cm.en.esm.js"],"init-shop-cart-sync":["modules/v2/loader.init-shop-cart-sync.en.esm.js"],"init-shop-email-lookup-coordinator":["modules/v2/loader.init-shop-email-lookup-coordinator.en.esm.js"],"init-shop-for-new-customer-accounts":["modules/v2/loader.init-shop-for-new-customer-accounts.en.esm.js"],"init-shop-user-recognition":["modules/v2/loader.init-shop-user-recognition.en.esm.js"],"init-windoid":["modules/v2/loader.init-windoid.en.esm.js"],"lead-capture":["modules/v2/loader.lead-capture.en.esm.js"],"listener":["modules/v2/loader.listener.en.esm.js"],"pay-button":["modules/v2/loader.pay-button.en.esm.js"],"payment-terms":["modules/v2/loader.payment-terms.en.esm.js"],"shop-button":["modules/v2/loader.shop-button.en.esm.js"],"shop-cart-sync":["modules/v2/loader.shop-cart-sync.en.esm.js"],"shop-cash-offers":["modules/v2/loader.shop-cash-offers.en.esm.js"],"shop-follow-button":["modules/v2/loader.shop-follow-button.en.esm.js"],"shop-login-button":["modules/v2/loader.shop-login-button.en.esm.js"],"shop-login":["modules/v2/loader.shop-login.en.esm.js"],"shop-toast-manager":["modules/v2/loader.shop-toast-manager.en.esm.js"],"shop-user-recognition":["modules/v2/loader.shop-user-recognition.en.esm.js"]};
402</script>
vendor: 1 bytes, line 402
402
403<script>(function() {
404  var isLoaded = false;
405  function asyncLoad() {
406    if (isLoaded) return;
407    isLoaded = true;
408    var urls = ["https:\/\/loox.io\/widget\/V1b_4RDNrT\/loox.1667989271762.js?shop=joy-planet-finland.myshopify.com","https:\/\/cdn.weglot.com\/weglot_script_tag.js?shop=joy-planet-finland.myshopify.com","https:\/\/static.klaviyo.com\/onsite\/js\/klaviyo.js?company_id=Ru4nY2\u0026shop=joy-planet-finland.myshopify.com","https:\/\/widgetic.com\/sdk\/sdk.js?shop=joy-planet-finland.myshopify.com","https:\/\/config.gorgias.chat\/bundle-loader\/01J158RGPVVQWF61M6B9SDBD2V?source=shopify1click\u0026shop=joy-planet-finland.myshopify.com","https:\/\/rapid-cdn.yottaa.com\/rapid\/lib\/5vmlSIt_hzLbCA.js?shop=joy-planet-finland.myshopify.com","https:\/\/media.9gtb.com\/loader.js?g_cvt_id=5b466dcf-27cb-4f2b-9631-ff635a9b7128\u0026shop=joy-planet-finland.myshopify.com","https:\/\/cdn-bundler.nice-team.net\/app\/js\/bundler.js?shop=joy-planet-finland.myshopify.com","\/\/cdn.shopify.com\/proxy\/ed1ff838acb2e66564e219901f6ae989514710b813918f744de0672be31b5674\/pixel.wetracked.io\/joy-planet-finland.myshopify.com\/events.js?shop=joy-planet-finland.myshopify.com\u0026sp-cache-control=cHVibGljLCBtYXgtYWdlPTkwMA"];
409    for (var i = 0; i < urls.length; i++) {
410      var s = document.createElement('script');
411      s.type = 'text/javascript';
412      s.async = true;
413      s.src = urls[i];
414      var x = document.getElementsByTagName('script')[0];
415      x.parentNode.insertBefore(s, x);
416    }
417  };
418  if(window.attachEvent) {
419    window.attachEvent('onload', asyncLoad);
420  } else {
421    window.addEventListener('load', asyncLoad, false);
422  }
423})();</script>
vendor: 1 bytes, line 423
423
424<script id="__st">var __st={"a":65680310506,"offset":10800,"reqid":"910fffe3-095c-4fca-84bc-c5f7a384d934-1791140730","pageurl":"joyearbuds.com\/products\/tinys-earbuds-desinged-for-women-joy-friends-club","u":"8d072e1a18a3","p":"product","rtyp":"product","rid":10882379907414};</script>
vendor: 1 bytes, line 424
424
425<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 425
425
426<script id="captcha-bootstrap">!function(){'use strict';const t='contact',e='account',n='new_comment',o=[[t,t],['blogs',n],['comments',n],[t,'customer']],c=[[e,'customer_login'],[e,'guest_login'],[e,'recover_customer_password'],[e,'create_customer']],r=t=>t.map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(','),a=t=>()=>t?[...document.querySelectorAll(t)].map((t=>t.form)):[];function s(){const t=[...o],e=r(t);return a(e)}const i='password',u='form_key',d=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',i],f=()=>{try{return window.sessionStorage}catch{return}},m='__shopify_v',_=t=>t.elements[u];function p(t,e,n=!1){try{const o=window.sessionStorage,c=JSON.parse(o.getItem(e)),{data:r}=function(t){const{data:e,action:n}=t;return t[m]||n?{data:e,action:n}:{data:t,action:n}}(c);for(const[e,n]of Object.entries(r))t.elements[e]&&(t.elements[e].value=n);n&&o.removeItem(e)}catch(o){console.error('form repopulation failed',{error:o})}}const l='form_type',E='cptcha';function T(t){t.dataset[E]=!0}const w=window,h=w.document,L='Shopify',v='ce_forms',y='captcha';let A=!1;((t,e)=>{const n=(g='f06e6c50-85a8-45c8-87d0-21a2b65856fe',I='https://cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/ce_storefront_forms_captcha_hcaptcha.v1.5.3.iife.js',D={infoText:'Protected by hCaptcha',privacyText:'Privacy',termsText:'Terms'},(t,e,n)=>{const o=w[L][v],c=o.bindForm;if(c)return c(t,g,e,D).then(n);var r;o.q.push([[t,g,e,D],n]),r=I,A||(h.body.append(Object.assign(h.createElement('script'),{id:'captcha-provider',async:!0,src:r})),A=!0)});var g,I,D;w[L]=w[L]||{},w[L][v]=w[L][v]||{},w[L][v].q=[],w[L][y]=w[L][y]||{},w[L][y].protect=function(t,e){n(t,void 0,e),T(t)},Object.freeze(w[L][y]),function(t,e,n,w,h,L){const[v,y,A,g]=function(t,e,n){const i=e?o:[],u=t?c:[],d=[...i,...u],f=r(d),m=r(i),_=r(d.filter((([t,e])=>n.includes(e))));return[a(f),a(m),a(_),s()]}(w,h,L),I=t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form},D=t=>v().includes(t);t.addEventListener('submit',(t=>{const e=I(t);if(!e)return;const n=D(e)&&!e.dataset.hcaptchaBound&&!e.dataset.recaptchaBound,o=_(e),c=g().includes(e)&&(!o||!o.value);(n||c)&&t.preventDefault(),c&&!n&&(function(t){try{if(!f())return;!function(t){const e=f();if(!e)return;const n=_(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){_(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:u})),t.elements[u].value=e}(t,e),function(t,e){const n=f();if(!n)return;const o=[...t.querySelectorAll(`input[type='${i}']`)].map((({name:t})=>t)),c=[...d,...o],r={};for(const[a,s]of new FormData(t).entries())c.includes(a)||(r[a]=s);n.setItem(e,JSON.stringify({[m]:1,action:t.action,data:r}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(e),e.submit())}));const S=(t,e)=>{t&&!t.dataset[E]&&(n(t,e.some((e=>e===t))),T(t))};for(const o of['focusin','change'])t.addEventListener(o,(t=>{const e=I(t);D(e)&&S(e,y())}));const B=e.get('form_key'),M=e.get(l),P=B&&M;t.addEventListener('DOMContentLoaded',(()=>{const t=y();if(P)for(const e of t)e.elements[l].value===M&&p(e,B);[...new Set([...A(),...v().filter((t=>'true'===t.dataset.shopifyCaptcha))])].forEach((e=>S(e,t)))}))}(h,new URLSearchParams(w.location.search),n,t,e,['guest_login'])})(!0,!0)}();</script>
vendor: 1 bytes, line 426
426
427<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//joyearbuds.com/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 427
427
428<script>(function () {var userAgent = navigator.userAgent;var platform = navigator.platform;var maxTouchPoints = navigator.maxTouchPoints || 0;var isIOS = /iPad|iPhone|iPod/.test(platform) || (platform === 'MacIntel' && maxTouchPoints > 1);var isMacSafari = platform.indexOf('Mac') === 0 && /Safari/.test(userAgent) && !/Chrome|Chromium|CriOS|FxiOS|Edg|OPR|Android/.test(userAgent);var isAppleSafari = isIOS || isMacSafari;if (isAppleSafari) {fetch('/sf_private_access_tokens' + location.search).catch(function () {});}function browserMajorVersion(pattern) {var match = userAgent.match(pattern);return match ? parseInt(match[1], 10) : null;}function shouldLoadAutosizesPolyfill() {if (!window.PerformanceObserver?.supportedEntryTypes?.includes('paint')) {return false;}var chromeVersion = browserMajorVersion(/Chrome\/(\d+)/);if (chromeVersion !== null) {return chromeVersion < 126;}var firefoxVersion = browserMajorVersion(/Firefox\/(\d+)/);if (firefoxVersion !== null) {return firefoxVersion < 150;}var safariVersion = isAppleSafari ? browserMajorVersion(/Version\/(\d+).*Safari\//) : null;if (safariVersion !== null) {return safariVersion < 27;}return true;}if (shouldLoadAutosizesPolyfill()) {var autosizesScript = document.createElement('script');autosizesScript.async = true;autosizesScript.crossOrigin = 'anonymous';autosizesScript.src = "//joyearbuds.com/cdn/shopifycloud/storefront/assets/storefront/autosizes-84416378.js";(document.head || document.documentElement).appendChild(autosizesScript);}window.ShopifyAnalytics = window.ShopifyAnalytics || {};window.ShopifyAnalytics.performance = window.ShopifyAnalytics.performance || {};(function () {var LONG_FRAME_THRESHOLD = 50;var longAnimationFrames = [];var activeRafId = null;function collectLongFrames() {var previousTime = null;function rafMonitor(now) {if (activeRafId === null) {return;}var delta = now - previousTime;if (delta > LONG_FRAME_THRESHOLD) {longAnimationFrames.push({startTime: previousTime,endTime: now,});}previousTime = now;activeRafId = requestAnimationFrame(rafMonitor);}previousTime = performance.now();activeRafId = requestAnimationFrame(rafMonitor);}if (!window.PerformanceObserver?.supportedEntryTypes?.includes('long-animation-frame')) {collectLongFrames();var timeoutId = setTimeout(function () {cancelAnimationFrame(activeRafId);}, 10000);window.ShopifyAnalytics.performance.getLongAnimationFrames = function (stopCollection) {if (stopCollection === undefined) {stopCollection = false;}if (stopCollection) {clearTimeout(timeoutId);cancelAnimationFrame(activeRafId);}return longAnimationFrames;};}})();})();</script>
428<script crossorigin="anonymous" defer="defer" src="//joyearbuds.com/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-616277c7.js?v=20250812"></script>
vendor: 1 bytes, line 428
428
429<script id="shopify-origin-trials" async="async" integrity="sha256-qJbe/jEZBHtr5W/BlA2cKAz3vkXu6vJQyLjgvgCC86g=" src="//cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-318ab40a.js" crossorigin="anonymous" onload="window.__shopifyOriginTrialsDone = true" onerror="window.__shopifyOriginTrialsDone = true"></script>
vendor: 1 bytes, line 429
429
430<script>
431  window.Shopify = window.Shopify || {};
432  window.Shopify.MCP = window.Shopify.MCP || {};
433  window.Shopify.MCP.enabled = true;
434  window.Shopify.MCP.shop = "joy-planet-finland.myshopify.com";
435  window.Shopify.MCP.mcpEndpoint = "https:\/\/joyearbuds.com\/api\/mcp";
436  window.Shopify.MCP.tools = [{"name":"search_shop_policies_and_faqs","description":"Used to get facts about the stores policies, products, or services.\nSome examples of questions you can ask are:\n  - What is your return policy?\n  - What is your shipping policy?\n  - What is your phone number?\n  - What are your hours of operation?\"\n","inputSchema":{"$schema":"https:\/\/json-schema.org\/draft\/2020-12\/schema","type":"object","properties":{"query":{"type":"string","description":"A natural language query."},"context":{"type":"string","description":"Additional information about the request such as user demographics, mood, location, or other relevant details that could help in tailoring the response appropriately."}},"required":["query"]}}];
437</script>
vendor: 1 bytes, line 437
437
438<script>(()=>{var d="shopify:webmcp_adapter_loaded",n=Symbol.for("shopify.webmcp_adapter_loading");function s(c,a,{win:r=window,doc:o=document}={}){function p(){try{return r.localStorage.getItem(d)==="true"}catch{return!1}}function l(){try{r.localStorage.setItem(d,"true")}catch{}}function u(){return typeof(o.modelContext||r.navigator?.modelContext)?.registerTool=="function"}function f(){if(r[n]||!u())return;let t=o.head||o.getElementsByTagName("head")[0];if(!t)return;let e=o.createElement("script");e.type="module",e.crossOrigin="anonymous",a&&(e.integrity=a),e.src=c,e.addEventListener("load",l,{once:!0}),e.addEventListener("error",()=>{r[n]=!1},{once:!0}),t.appendChild(e),r[n]=!0}function _(t){let e=o.getElementById("shopify-origin-trials");if(!e||r.__shopifyOriginTrialsDone){t();return}e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}function i(){_(()=>r.setTimeout(f,0))}function m(){o.addEventListener("DOMContentLoaded",i,{once:!0})}p()?i():m()}s("\/\/joyearbuds.com\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})();
439</script>
vendor: 1 bytes, line 439
439
440<script data-source-attribution="shopify.dynamic_checkout.dynamic.init">var Shopify=Shopify||{};Shopify.PaymentButton=Shopify.PaymentButton||{isStorefrontPortableWallets:!0,init:function(){window.Shopify.PaymentButton.init=function(){};var t=document.createElement("script");t.src="https://joyearbuds.com/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}};
441</script>
vendor: 1 bytes, line 441
441
442<script data-source-attribution="shopify.dynamic_checkout.buyer_consent">
443  function portableWalletsHideBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.add("hidden"),t.setAttribute("aria-hidden","true"),n.removeEventListener("click",e))}function portableWalletsShowBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.remove("hidden"),t.removeAttribute("aria-hidden"),n.addEventListener("click",e))}window.Shopify?.PaymentButton&&(window.Shopify.PaymentButton.hideBuyerConsent=portableWalletsHideBuyerConsent,window.Shopify.PaymentButton.showBuyerConsent=portableWalletsShowBuyerConsent);
444</script>
vendor: 1 bytes, line 444
444
445<script data-source-attribution="shopify.dynamic_checkout.cart.bootstrap">document.addEventListener("DOMContentLoaded",(function(){function t(){return document.querySelector("shopify-accelerated-checkout-cart, shopify-accelerated-checkout")}if(t())Shopify.PaymentButton.init();else{new MutationObserver((function(e,n){t()&&(Shopify.PaymentButton.init(),n.disconnect())})).observe(document.body,{childList:!0,subtree:!0})}}));
446</script>
446
447<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://joyearbuds.com/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous">
448<style id="shopify-accelerated-checkout-cart">
449        #shopify-buyer-consent {
450  margin-top: 1em;
451  display: inline-block;
452  width: 100%;
453}
454
455#shopify-buyer-consent.hidden {
456  display: none;
457}
458
459#shopify-subscription-policy-button {
460  background: none;
461  border: none;
462  padding: 0;
463  text-decoration: underline;
464  font-size: inherit;
465  cursor: pointer;
466}
467
468#shopify-subscription-policy-button::before {
469  box-shadow: none;
470}
471
472      </style>
473
474<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
474
475
476  
476<script src="//joyearbuds.com/cdn/shop/t/54/assets/vendor-scripts-v14.js" defer="defer"></script>
476
477  
477<script src="//joyearbuds.com/cdn/shop/t/54/assets/jquery.js?v=184217876181003224711715577105"></script>
477
478  
478<script src="//joyearbuds.com/cdn/shop/t/54/assets/custom.js?v=156544722039075780811786637498" defer="defer"></script>
478<script src="//joyearbuds.com/cdn/shop/t/54/assets/theme.js?v=100599903906535249751751976538" defer="defer"></script>
478
479
480
481  
482  
483
484
485
486
487 
488
489
490
491
492
493  <meta name="google-site-verification" content="LcBkUhf9QYEkYHDIxrU56q9VDsEIF03-RwqZc_bogoI" />
494
495
496
497  
498
499  
500    <!-- slick slider -->
501<link rel="stylesheet" href="//joyearbuds.com/cdn/shop/t/54/assets/slick.min.css?v=105347522073496785561745997777">
502<link rel="stylesheet" href="//joyearbuds.com/cdn/shop/t/54/assets/slick-theme.min.css?v=10541884051976483521745997785">
503<!-- custom css -->
504<link rel="stylesheet" href="//joyearbuds.com/cdn/shop/t/54/assets/landing.css?v=130597943354725318571776247560">
505  
506  <link rel="preconnect" href="https://app.wayby.io/scripts/wayby.js" />
507<style>html.prehide {visibility: hidden}</style>
508<script>document.documentElement.classList.add("prehide")</script>
vendor: 1 bytes, line 508
508
509<script src="https://app.wayby.io/scripts/wayby.js" data-website-id="2ba683d0-6f9c-4f93-9d2f-137534699e12"></script>
vendor: 1 bytes, line 509
509
510<script>setTimeout(() => {document.documentElement.classList.remove("prehide")},2000)</script>
510
511
512<!-- BEGIN app block: shopify://apps/consentmo-gdpr/blocks/gdpr_cookie_consent/4fbe573f-a377-4fea-9801-3ee0858cae41 -->
513<link rel="preconnect" href="https://app.consentmo.com" crossorigin data-csm-preconnect="app">
514<link rel="dns-prefetch" href="https://workers.consentmo.com" data-csm-preconnect="workers">
515<link rel="dns-prefetch" href="https://storage.consentmo.com" data-csm-preconnect="storage">
516<link rel="preconnect" href="https://cdn.consentmo.com" crossorigin data-csm-preconnect="cdn"><link rel="prefetch" href="https://cdn.shopify.com/extensions/01a0fcf5-9827-75b1-9d7e-ea3a10d70819/gdpr-backpack-903/assets/layout-cookie-bar.consentmo.js" crossorigin data-csm-layout-prefetch="banner">
517  <link rel="prefetch" href="https://cdn.shopify.com/extensions/01a0fcf5-9827-75b1-9d7e-ea3a10d70819/gdpr-backpack-903/assets/layout-cookie-dialog.consentmo.js" crossorigin data-csm-layout-prefetch="dialog">
518  <link rel="prefetch" href="https://cdn.shopify.com/extensions/01a0fcf5-9827-75b1-9d7e-ea3a10d70819/gdpr-backpack-903/assets/layout-cookie-box.consentmo.js" crossorigin data-csm-layout-prefetch="box">
519  <link rel="prefetch" href="https://cdn.shopify.com/extensions/01a0fcf5-9827-75b1-9d7e-ea3a10d70819/gdpr-backpack-903/assets/layout-cookie-smart-banner.consentmo.js" crossorigin data-csm-layout-prefetch="smart">
520  <link rel="prefetch" href="https://cdn.shopify.com/extensions/01a0fcf5-9827-75b1-9d7e-ea3a10d70819/gdpr-backpack-903/assets/layout-mobile-cookie-bar.consentmo.js" crossorigin data-csm-layout-prefetch="mobile">
520<script>
521(function () {
522  try {
523    document.documentElement.classList.add('csm-cookie-embed');
524  } catch (e) {}
525})();
526</script>
526<script data-consentmo-data-src-bootstrap>
527(function () {
528  'use strict';
529  if (window.__consentmoDataSrcBootstrapInit) return;
530  window.__consentmoDataSrcBootstrapInit = true;
531
532  var DATA_SRC_SELECTOR = [
533    'script[data-src*="consentmo_cookie_consent"]',
534    'script[data-src*="gdpr_cookie_consent.min"]',
535    'script[data-src*="gdrp_cookie_consent_unlimited"]'
536  ].join(',');
537
538  function activateConsentmoDataSrcScripts() {
539    if (!window.Shopify || !window.Shopify.shop) return;
540    document.querySelectorAll(DATA_SRC_SELECTOR).forEach(function (scriptEl) {
541      // getAttribute: src="" must not count as "already has src" (.src === page URL).
542      if (scriptEl.getAttribute('src')) return;
543      var url = scriptEl.getAttribute('data-src');
544      if (!url) return;
545      if (scriptEl.getAttribute('type') === 'text/plain') {
546        scriptEl.removeAttribute('type');
547      }
548      scriptEl.src = url;
549    });
550  }
551  function scheduleActivation() {
552    activateConsentmoDataSrcScripts();
553    // Retry on next task so other DCL handlers (lazy-loaders) can finish setting Shopify.shop / data-src first.
554    setTimeout(activateConsentmoDataSrcScripts, 0);
555  }
556  if (document.readyState === 'loading') {
557    document.addEventListener('DOMContentLoaded', scheduleActivation, { once: true });
558  } else {
559    scheduleActivation();
560  }
561})();
562</script>
562
563
564
565<!-- END app block --><!-- BEGIN app block: shopify://apps/bundler/blocks/bundler-script-append/7a6ae1b8-3b16-449b-8429-8bb89a62c664 -->
565<script defer="defer">
566	/**	Bundler script loader, version number: 2.0 */
567	(function(){
568		var loadScript=function(a,b){var c=document.createElement("script");c.type="text/javascript",c.readyState?c.onreadystatechange=function(){("loaded"==c.readyState||"complete"==c.readyState)&&(c.onreadystatechange=null,b())}:c.onload=function(){b()},c.src=a,document.getElementsByTagName("head")[0].appendChild(c)};
569		appendScriptUrl('joy-planet-finland.myshopify.com');
570
571		// get script url and append timestamp of last change
572		function appendScriptUrl(shop) {
573
574			var timeStamp = Math.floor(Date.now() / (1000*1*1));
575			var timestampUrl = 'https://bundler.nice-team.net/app/shop/status/'+shop+'.js?'+timeStamp;
576
577			loadScript(timestampUrl, function() {
578				// append app script
579				if (typeof bundler_settings_updated == 'undefined') {
580					console.log('settings are undefined');
581					bundler_settings_updated = 'default-by-script';
582				}
583				var scriptUrl = "https://cdn-bundler.nice-team.net/app/js/bundler-script.js?shop="+shop+"&"+bundler_settings_updated;
584				loadScript(scriptUrl, function(){});
585			});
586		}
587	})();
588
589	var BndlrScriptAppended = true;
590	
591
592	
593		var BndlrMarketId = 10944577770;
594	
595</script>
595
596
597<!-- END app block --><!-- BEGIN app block: shopify://apps/kaching-bundles/blocks/app-embed-block-v2/6c637362-a106-4a32-94ac-94dcfd68cdb8 --><!-- Kaching Bundles App Embed V2 -->
598
599<!-- BEGIN app snippet: app-embed-content -->
600
601
602
603
604
605
606
607
608<script>
609  // Prevent duplicate initialization if both app embeds are enabled
610  if (window.kachingBundlesAppEmbedLoaded) {
611    console.warn('[Kaching Bundles] Multiple app embed blocks detected. Please disable one of them. Skipping duplicate initialization.');
612  } else {
613    window.kachingBundlesAppEmbedLoaded = true;
614    window.kachingBundlesEnabled = true;
615    window.kachingBundlesInitialized = false;
616
617    // Allow calling kachingBundlesInitialize before the script is loaded
618    (() => {
619      let shouldInitialize = false;
620      let realInitialize = null;
621
622      window.kachingBundlesInitialize = () => {
623        if (realInitialize) {
624          realInitialize();
625        } else {
626          shouldInitialize = true;
627        }
628      };
629
630      Object.defineProperty(window, '__kachingBundlesInitializeInternal', {
631        set(fn) {
632          realInitialize = fn;
633          if (shouldInitialize) {
634            shouldInitialize = false;
635            fn();
636          }
637        },
638        get() {
639          return realInitialize;
640        }
641      });
642    })();
643  }
644</script>
644
645
646
647
648<script id="kaching-bundles-config" type="application/json">
649  {
650    "shopifyDomain": "joy-planet-finland.myshopify.com",
651    "moneyFormat": "{{amount_with_comma_separator}} €",
652    "locale": "en",
653    "liquidLocale": "en",
654    "country": "US",
655    "currencyRate": 1,
656    "marketCurrencyCode": "EUR",
657    "marketId": 10944577770,
658    "productId": 10882379907414,
659    "storefrontAccessToken": "f6905fb95d3c93ead34c8e3df741713a",
660    "includeSellingPlans": true,
661    "includeAvailableQuantity": true,
662    "customApiHost": null,
663    "keepQuantityInput": false,
664    "ignoreDeselect": false,
665    "ignoreUnitPrice": false,
666    "requireCustomerLogin": false,
667    "abTestsRunning": false,
668    "webPixel": true,
669    "b2bCustomer": false,
670    "isLoggedIn": false,
671    "isDeprecatedAppEmbed": true,
672    "preview": false,
673    "defaultTranslations": {
674      "system.out_of_stock": "There\u0026#39;s not enough items in our stock, please select smaller bundle.",
675      "system.invalid_variant": "Sorry, this is not currently available.",
676      "system.unavailable_option_value": "Unavailable",
677      "system.confirm": "Confirm",
678      "system.cancel": "Cancel",
679      "system.free": "FREE",
680      "system.search": "Search",
681      "system.sort_by": "Sort by",
682      "system.sort_relevance": "Relevance",
683      "system.sort_newest_first": "Newest first",
684      "system.sort_price_low_to_high": "Price: Low → High",
685      "system.sort_price_high_to_low": "Price: High → Low",
686      "system.no_results_found": "No results found",
687      "system.no_results_description": "We can’t find any item matching your search.",
688      "system.clear_search": "Clear search",
689      "system.no_products_available": "No products available",
690      "system.letters_only": "Only letters are allowed.",
691      "system.numbers_only": "Only numbers are allowed.",
692      "system.select_variant_alert": "Please select a variant.",
693      "system.select_variant_placeholder": "Select",
694      "system.personalisation_required_alert": "Please add personalisation for every item to continue.",
695      "system.quantity": "Quantity",
696      "system.subscription_plan": "Subscription plan",
697      "system.remove": "Remove",
698      "system.original_price": "Original price:",
699      "system.price": "Price:"
700    },
701    "customSelectors": {
702      "quantity": null,
703      "addToCartButton": null,
704      "variantPicker": null,
705      "price": null,
706      "priceCompare": null,
707      "label": null
708    },
709    "shopCustomStyles": "",
710    "brandColors": {"error":"#D72C2C","border":"#12D8FA4D","overlay":"#000000","badgeText":"#000000","primaryText":"#000000","primaryAccent":"#12D8FA","secondaryText":"#555555","badgeBackgroun
710d":"#12D8FA","primaryAccentText":"#000000","primaryBackground":"#FFFFFF","secondaryBackground":"#F0F0F0"},
711    "featureFlags": {"atc_total_price":false,"cart_change_response_rewrite":false,"cart_interceptor_dedupe_disabled":false,"cart_interceptor_json_encoding":false,"debug_cart_add":false,"disable_nested_cart_lines":false,"early_fetch_override":false,"hide_missing_variants":true,"initialize_with_form_variant":true,"intercept_cart_request":true,"legacy_saved_percentage":false,"native_swatches_disabled":false,"observe_external_selling_plan":false,"observe_form_selling_plan":true,"percentage_cents_rounding_workaround":false,"pos_extension":false,"preserve_variant_selections":false,"price_rounding_v2":true,"propagate_line_properties":false,"propagate_picker_option_changes":false,"reinitialize_morphed_placeholders":true,"remove_variant_change_delay":false,"rever_non_returnable":false,"split_bxgy_items":false,"storefront_metaobjects":false,"variant_images":true}
712
713  }
714</script>
714
715
716<!-- BEGIN app snippet: translations -->
717
718
719  
720  
720<script id="kaching-bundles-translations" type="application/json">
721    [{"locale":"fi","translations":{"system":{"system.unavailable_option_value":"Ei saatavilla: Tilapäisesti loppuunmyyty."},"dealBlocks":{"2d788284-7a4e-4374-b330-28d37abbe9ea":{"SAVE 50,00 €":"Säästät 50,00 €","SAVE {{saved_total}}":"Kokonaisalennus {{saved_total}}"}}}}]
722  </script>
722
723  
724
725<!-- END app snippet -->
726
727
728  
729    <!-- BEGIN app snippet: product -->
730  
730<script class="kaching-bundles-product" data-product-id="10882379907414" data-main="true" type="application/json">
731    {
732      "id": 10882379907414,
733      "handle": "tinys-earbuds-desinged-for-women-joy-friends-club",
734      "url": "\/products\/tinys-earbuds-desinged-for-women-joy-friends-club",
735      "availableForSale": true,
736      "title": "TinyS",
737      "image": "\/\/joyearbuds.com\/cdn\/shop\/files\/ChatGPT_Image_May_28_2026_5.png?height=200\u0026v=1779964205",
738      "collectionIds": [639365841238,660933574998,707928949078,702182555990,707229352278,617235186006,668751593814],
739      "options": [
740        
741          {
742            "defaultName": "Color",
743            "name": "Color",
744            "position": 1,
745            "optionValues": [
746              
747                {
748                  "id": 11274523574614,
749                  "defaultName": "Black",
750                  "name": "Black",
751                  "swatch": {
752                    "color": null,
753                    "image": null
754                  }
755                },
756              
757                {
758                  "id": 11274524557654,
759                  "defaultName": "Pink",
760                  "name": "Pink",
761                  "swatch": {
762                    "color": null,
763                    "image": null
764                  }
765                },
766              
767                {
768                  "id": 11274526097750,
769                  "defaultName": "Gold",
770                  "name": "Gold",
771                  "swatch": {
772                    "color": null,
773                    "image": null
774                  }
775                }
776              
777            ]
778          }
779        
780      ],
781      "selectedVariantId": 54276348870998,
782      "variants": [
783        
784          {
785            "id": 54276348870998,
786            "availableForSale": true,
787            "price": 15900,
788            "compareAtPrice": null,
789            "options": ["Black"],
790            "imageId": 72008685551958,
791            "image": "\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?height=200\u0026v=1776769855",
792            "inventoryManagement": "shopify",
793            "inventoryPolicy": "continue",
794            "inventoryQuantity": -6,
795            "unitPriceMeasurement": null,
796            "sellingPlans": [
797              
798            ]
799          },
800        
801          {
802            "id": 54276348936534,
803            "availableForSale": true,
804            "price": 15900,
805            "compareAtPrice": null,
806            "options": ["Pink"],
807            "imageId": 72008741683542,
808            "image": "\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?height=200\u0026v=1776769855",
809            "inventoryManagement": "shopify",
810            "inventoryPolicy": "continue",
811            "inventoryQuantity": -18,
812            "unitPriceMeasurement": null,
813            "sellingPlans": [
814              
815            ]
816          },
817        
818          {
819            "id": 55061249950038,
820            "availableForSale": true,
821            "price": 15900,
822            "compareAtPrice": null,
823            "options": ["Gold"],
824            "imageId": 72936309490006,
825            "image": "\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?height=200\u0026v=1773758930",
826            "inventoryManagement": "shopify",
827            "inventoryPolicy": "continue",
828            "inventoryQuantity": -7,
829            "unitPriceMeasurement": null,
830            "sellingPlans": [
831              
832            ]
833          }
834        
835      ],
836      "requiresSellingPlan": false,
837      "sellingPlans": [
838        
839      ],
840      "isNativeBundle": null,
841      "metafields": {
842        "text": null,
843        "text2": null,
844        "text3": null,
845        "text4": null
846      }
847    }
848  </script>
848
849
850<!-- END app snippet -->
851    
852      <!-- BEGIN app snippet: deal_blocks -->
853
854  
855
856  
857    
858      
859    
860  
861
862  
863    
864  
865
866  
867    
868  
869
870  
871    
871<script class="kaching-bundles-deal-block-settings" data-product-id="10882379907414" type="application/json"></script>
871
872  
873
874  
875
876<!-- END app snippet -->
877    
878  
879
880
881
882  
883  
884
885  <link rel="modulepreload" href="https://cdn.shopify.com/extensions/01a1008a-386d-7582-96f4-b3f382a090cd/kaching-bundles-2026/assets/kaching-bundles.js" crossorigin="anonymous" fetchpriority="high">
886  
887  
887<script type="module" src="https://cdn.shopify.com/extensions/01a1008a-386d-7582-96f4-b3f382a090cd/kaching-bundles-2026/assets/loader.js" crossorigin="anonymous" fetchpriority="high"></script>
887
888  <link rel="stylesheet" href="https://cdn.shopify.com/extensions/01a1008a-386d-7582-96f4-b3f382a090cd/kaching-bundles-2026/assets/kaching-bundles.css" media="print" onload="this.media='all'" fetchpriority="high">
889
890  <style>
891    .kaching-bundles__block {
892      display: none;
893    }
894
895    .kaching-bundles-sticky-atc {
896      display: none;
897    }
898  </style>
899
900
901
902<!-- END app snippet -->
903
904<!-- Kaching Bundles App Embed V2 End -->
905
906
907<!-- END app block --><!-- BEGIN app block: shopify://apps/gift-box/blocks/head/f53ea332-e066-453a-9116-800349284dfb -->
907<script>
908const isProductPage = window.location.pathname.includes("/products/");
909
910// Allow redirect only on product pages.
911if (isProductPage) {
912  const GHOST_PRODUCT_TYPE = "giftbox_ghost_product";
913  // Use product handle to check the type of the product.
914  const product_type = "";
915  if (product_type == GHOST_PRODUCT_TYPE) {
916    // Redirect to the GP parent URL stored in the GP's metafields.
917    const parent_product_url = '';
918    if (parent_product_url === null || parent_product_url === '') {
919      window.location.replace("/");
920    } else {
921      window.location.replace(parent_product_url);
922    }
923  }
924}
925</script>
925
926
927<script
928  src="https://giftbox.ds-cdn.com/static/main.js?shop=joy-planet-finland.myshopify.com"
929
930  async
931
932></script>
932
933
934
935<!-- END app block --><!-- BEGIN app block: shopify://apps/zoorix-sticky-atc/blocks/zoorix-head/16cf6adc-8b22-4e73-be2b-b93c1acde1da -->
935<script>
936  window.zoorix_sticky_atc_template = "product.tinys-paasivu";
937  window.zoorix_sticky_atc_money_format = "{{amount_with_comma_separator}} €";
938  window.zoorix_sticky_atc_money_format_with_currency = "€{{amount_with_comma_separator}} EUR";
939  window.zoorix_shop_name = "joy-planet-finland.myshopify.com";
940  
941  
942  
943  window.zoorix_sticky_atc_config = null;
944
945  
946    window.zoorix_sticky_collection_handle = null;
947  
948
949  
950    window.zoorix_sticky_page_handle = null;
951  
952
953  
954    window.zoorix_sticky_blog_handle = null;
955  
956
957  
958    window.zoorix_sticky_article_handle = null;
959  
960</script>
960
961
962
963
964
965
966
967
968
969
970
971  
972    
973      
973<script>
974        window.zoorix_sticky_atc_product_load_handle = "tinys-earbuds-desinged-for-women-joy-friends-club";
975      </script>
975
976    
977  
978
979
980<script>
981  var zrxLoadStickyAtc = false;
982  var zrxLoadQuickAtc = false;
983
984  if (window.zoorix_sticky_atc_config) {
985    // there is a config in the metafield. Load accordingly
986    if (window.zoorix_sticky_atc_config.enabled) {
987      zrxLoadStickyAtc = true;
988      if (
989        window.zoorix_sticky_atc_config.quickAddToCart &&
990        (window.zoorix_sticky_atc_template === 'index' ||
991          window.zoorix_sticky_collection_handle ||
992          window.zoorix_sticky_atc_template.includes('product'))
993      ) {
994        zrxLoadQuickAtc = true;
995      }
996    }
997  } else {
998    // there is mo metafield, load the old way
999    var script = document.createElement('script');
1000    script.src = 'https://public.zoorix.com/sticky-atc/domains/' + window.zoorix_shop_name + '/sticky-atc-core.js';
1001    script.async = true;
1002    document.head.appendChild(script);
1003  }
1004
1005  if (zrxLoadQuickAtc || zrxLoadStickyAtc) {
1006    window.zoorixFrontendUtils = window.zoorixFrontendUtils || [];
1007    var widget_dev = window.zoorix_sticky_atc_config.widget_dev;
1008    // Points at satc-storefront's Worker + R2-backed /dev/<n>/ route now
1009    // (see satc-storefront/plans/REPO_CONSOLIDATION.md, "Cloudflare for
1010    // dev") instead of the old AWS S3/CloudFront path. widget_dev itself
1011    // is unchanged — still the same per-shop integer set on the Settings
1012    // page. Every prod URL below (fe-utils.zoorix-satc.com,
1013    // satc-display-cloudflare.zoorix.com,
1014    // quick-atc-widget-cloudflare.zoorix.com, and the sticky-atc-core.js
1015    // no-metafield fallback above) is untouched — this only changes what
1016    // shops with widget_dev already set resolve to.
1017    var widget_dev_path = 'https://storefront.zoorix-satc.com/dev/' + widget_dev;
1018    // Opened to every shop. Was staged early access
1019    // (/^zrx-fe-.+\.myshopify\.com$/.test(window.zoorix_shop_name)) — kept
1020    // as `true` rather than removed so a rollback is a one-line revert of
1021    // this file, not a Cloudflare domain change: the old infra
1022    // (fe-utils.zoorix-satc.com, satc-display-cloudflare.zoorix.com,
1023    // quick-atc-widget-cloudflare.zoorix.com) is intentionally still live
1024    // and untouched, just unused, as a fallback.
1025    var isEarlyAccessShop = true;
1026
1027    document.addEventListener('zrxRequestLoadJsCss', function() {
1028      document.removeEventListener('zrxRequestLoadJsCss', arguments.callee);
1029      if (window.zoorix_sticky_atc_config.custom_css) {
1030        const styleTag = document.createElement('style');
1031        styleTag.type = 'text/css';
1032        const cssChild = document.createTextNode(window.zoorix_sticky_atc_config.custom_css);
1033        styleTag.appendChild(cssChild);
1034        document.head.appendChild(styleTag);
1035      }
1036
1037      if (window.zoorix_sticky_atc_config.custom_js) {
1038        const scriptTag = document.createElement('script');
1039        scriptTag.setAttribute('type', 'text/javascript');
1040        const scriptChild = document.createTextNode(window.zoorix_sticky_atc_config.custom_js);
1041        scriptTag.appendChild(scriptChild);
1042        document.head.appendChild(scriptTag);
1043      }
1044    });
1045
1046    if (zrxLoadQuickAtc) {
1047      var script = document.createElement('script');
1048      script.src = widget_dev
1049        ? widget_dev_path + '/core-utils.js'
1050        : (isEarlyAccessShop ? 'https://storefront.zoorix-satc.com/core-utils.js' : 'https://fe-utils.zoorix-satc.com/core-utils.js');
1051      script.async = true;
1052      script.setAttribute('type', 'module');
1053      document.head.appendChild(script);
1054
1055      var script = document.createElement('script');
1056      script.src = widget_dev
1057        ? widget_dev_path + '/quick-add.js'
1058        : (isEarlyAccessShop ? 'https://storefront.zoorix-satc.com/quick-add.js' : 'https://quick-atc-widget-cloudflare.zoorix.com/quick-add.js');
1059      script.async = true;
1060      script.setAttribute('type', 'module');
1061      document.head.appendChild(script);
1062    }
1063
1064    if (zrxLoadStickyAtc) {
1065      var script = document.createElement('script');
1066      script.src = widget_dev
1067        ? widget_dev_path + '/core-bar.js'
1068        : (isEarlyAccessShop ? 'https://storefront.zoorix-satc.com/core-bar.js' : 'https://satc-display-cloudflare.zoorix.com/core-bar.js');
1069      script.async = true;
1070      script.setAttribute('type', 'module');
1071      document.head.appendChild(script);
1072    }
1073  }
1074</script>
1074
1075
1076
1077<!-- END app block --><!-- BEGIN app block: shopify://apps/weglot-translate-your-store/blocks/weglot/3097482a-fafe-42ff-bc33-ea19e35c4a20 -->
1078
1079  
1080
1081  
1082
1083  
1084  
1085    
1086  
1087
1088
1089<!--Start Weglot Script-->
1090<script src="https://cdn.weglot.com/weglot.min.js?api_key=" async></script>
1090
1091<!--End Weglot Script-->
1092
1093<!-- END app block --><!-- BEGIN app block: shopify://apps/kaching-bundles/blocks/app-embed-block/6c637362-a106-4a32-94ac-94dcfd68cdb8 -->
1094<!-- Kaching Bundles App Embed -->
1095
1096<!-- BEGIN app snippet: app-embed-content -->
1097
1098
1099
1100
1101
1102
1103
1104
1105<script>
1106  // Prevent duplicate initialization if both app embeds are enabled
1107  if (window.kachingBundlesAppEmbedLoaded) {
1108    console.warn('[Kaching Bundles] Multiple app embed blocks detected. Please disable one of them. Skipping duplicate initialization.');
1109  } else {
1110    window.kachingBundlesAppEmbedLoaded = true;
1111    window.kachingBundlesEnabled = true;
1112    window.kachingBundlesInitialized = false;
1113
1114    // Allow calling kachingBundlesInitialize before the script is loaded
1115    (() => {
1116      let shouldInitialize = false;
1117      let realInitialize = null;
1118
1119      window.kachingBundlesInitialize = () => {
1120        if (realInitialize) {
1121          realInitialize();
1122        } else {
1123          shouldInitialize = true;
1124        }
1125      };
1126
1127      Object.defineProperty(window, '__kachingBundlesInitializeInternal', {
1128        set(fn) {
1129          realInitialize = fn;
1130          if (shouldInitialize) {
1131            shouldInitialize = false;
1132            fn();
1133          }
1134        },
1135        get() {
1136          return realInitialize;
1137        }
1138      });
1139    })();
1140  }
1141</script>
1141
1142
1143
1144
1145<script id="kaching-bundles-config" type="application/json">
1146  {
1147    "shopifyDomain": "joy-planet-finland.myshopify.com",
1148    "moneyFormat": "{{amount_with_comma_separator}} €",
1149    "locale": "en",
1150    "liquidLocale": "en",
1151    "country": "US",
1152    "currencyRate": 1,
1153    "marketCurrencyCode": "EUR",
1154    "marketId": 10944577770,
1155    "productId": 10882379907414,
1156    "storefrontAccessToken": "f6905fb95d3c93ead34c8e3df741713a",
1157    "includeSellingPlans": true,
1158    "includeAvailableQuantity": true,
1159    "customApiHost": null,
1160    "keepQuantityInput": false,
1161    "ignoreDeselect": false,
1162    "ignoreUnitPrice": false,
1163    "requireCustomerLogin": false,
1164    "abTestsRunning": false,
1165    "webPixel": true,
1166    "b2bCustomer": false,
1167    "isLoggedIn": false,
1168    "isDeprecatedAppEmbed": false,
1169    "preview": false,
1170    "defaultTranslations": {
1171      "system.out_of_stock": "There\u0026#39;s not enough items in our stock, please select smaller bundle.",
1172      "system.invalid_variant": "Sorry, this is not currently available.",
1173      "system.unavailable_option_value": "Unavailable",
1174      "system.confirm": "Confirm",
1175      "system.cancel": "Cancel",
1176      "system.free": "FREE",
1177      "system.search": "Search",
1178      "system.sort_by": "Sort by",
1179      "system.sort_relevance": "Relevance",
1180      "system.sort_newest_first": "Newest first",
1181      "system.sort_price_low_to_high": "Price: Low → High",
1182      "system.sort_price_high_to_low": "Price: High → Low",
1183      "system.no_results_found": "No results found",
1184      "system.no_results_description": "We can’t find any item matching your search.",
1185      "system.clear_search": "Clear search",
1186      "system.no_products_available": "No products available",
1187      "system.letters_only": "Only letters are allowed.",
1188      "system.numbers_only": "Only numbers are allowed.",
1189      "system.select_variant_alert": "Please select a variant.",
1190      "system.select_variant_placeholder": "Select",
1191      "system.personalisation_required_alert": "Please add personalisation for every item to continue.",
1192      "system.quantity": "Quantity",
1193      "system.subscription_plan": "Subscription plan",
1194      "system.remove": "Remove",
1195      "system.original_price": "Original price:",
1196      "system.price": "Price:"
1197    },
1198    "customSelectors": {
1199      "quantity": null,
1200      "addToCartButton": null,
1201      "variantPicker": null,
1202      "price": null,
1203      "priceCompare": null,
1204      "label": null
1205    },
1206    "shopCustomStyles": "",
1207    "brandColors": {"error":"#D72C2C","border":"#12D8FA4D","overlay":"#000000","badgeText":"#000000","primaryText":"#000000","primaryAccent":"#12D8FA","secondaryText":"#555555","badgeBackgroun
1207d":"#12D8FA","primaryAccentText":"#000000","primaryBackground":"#FFFFFF","secondaryBackground":"#F0F0F0"},
1208    "featureFlags": {"atc_total_price":false,"cart_change_response_rewrite":false,"cart_interceptor_dedupe_disabled":false,"cart_interceptor_json_encoding":false,"debug_cart_add":false,"disable_nested_cart_lines":false,"early_fetch_override":false,"hide_missing_variants":true,"initialize_with_form_variant":true,"intercept_cart_request":true,"legacy_saved_percentage":false,"native_swatches_disabled":false,"observe_external_selling_plan":false,"observe_form_selling_plan":true,"percentage_cents_rounding_workaround":false,"pos_extension":false,"preserve_variant_selections":false,"price_rounding_v2":true,"propagate_line_properties":false,"propagate_picker_option_changes":false,"reinitialize_morphed_placeholders":true,"remove_variant_change_delay":false,"rever_non_returnable":false,"split_bxgy_items":false,"storefront_metaobjects":false,"variant_images":true}
1209
1210  }
1211</script>
1211
1212
1213<!-- BEGIN app snippet: translations -->
1214
1215
1216  
1217  
1217<script id="kaching-bundles-translations" type="application/json">
1218    [{"locale":"fi","translations":{"system":{"system.unavailable_option_value":"Ei saatavilla: Tilapäisesti loppuunmyyty."},"dealBlocks":{"2d788284-7a4e-4374-b330-28d37abbe9ea":{"SAVE 50,00 €":"Säästät 50,00 €","SAVE {{saved_total}}":"Kokonaisalennus {{saved_total}}"}}}}]
1219  </script>
1219
1220  
1221
1222<!-- END app snippet -->
1223
1224
1225  
1226    <!-- BEGIN app snippet: product -->
1227  
1227<script class="kaching-bundles-product" data-product-id="10882379907414" data-main="true" type="application/json">
1228    {
1229      "id": 10882379907414,
1230      "handle": "tinys-earbuds-desinged-for-women-joy-friends-club",
1231      "url": "\/products\/tinys-earbuds-desinged-for-women-joy-friends-club",
1232      "availableForSale": true,
1233      "title": "TinyS",
1234      "image": "\/\/joyearbuds.com\/cdn\/shop\/files\/ChatGPT_Image_May_28_2026_5.png?height=200\u0026v=1779964205",
1235      "collectionIds": [639365841238,660933574998,707928949078,702182555990,707229352278,617235186006,668751593814],
1236      "options": [
1237        
1238          {
1239            "defaultName": "Color",
1240            "name": "Color",
1241            "position": 1,
1242            "optionValues": [
1243              
1244                {
1245                  "id": 11274523574614,
1246                  "defaultName": "Black",
1247                  "name": "Black",
1248                  "swatch": {
1249                    "color": null,
1250                    "image": null
1251                  }
1252                },
1253              
1254                {
1255                  "id": 11274524557654,
1256                  "defaultName": "Pink",
1257                  "name": "Pink",
1258                  "swatch": {
1259                    "color": null,
1260                    "image": null
1261                  }
1262                },
1263              
1264                {
1265                  "id": 11274526097750,
1266                  "defaultName": "Gold",
1267                  "name": "Gold",
1268                  "swatch": {
1269                    "color": null,
1270                    "image": null
1271                  }
1272                }
1273              
1274            ]
1275          }
1276        
1277      ],
1278      "selectedVariantId": 54276348870998,
1279      "variants": [
1280        
1281          {
1282            "id": 54276348870998,
1283            "availableForSale": true,
1284            "price": 15900,
1285            "compareAtPrice": null,
1286            "options": ["Black"],
1287            "imageId": 72008685551958,
1288            "image": "\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?height=200\u0026v=1776769855",
1289            "inventoryManagement": "shopify",
1290            "inventoryPolicy": "continue",
1291            "inventoryQuantity": -6,
1292            "unitPriceMeasurement": null,
1293            "sellingPlans": [
1294              
1295            ]
1296          },
1297        
1298          {
1299            "id": 54276348936534,
1300            "availableForSale": true,
1301            "price": 15900,
1302            "compareAtPrice": null,
1303            "options": ["Pink"],
1304            "imageId": 72008741683542,
1305            "image": "\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?height=200\u0026v=1776769855",
1306            "inventoryManagement": "shopify",
1307            "inventoryPolicy": "continue",
1308            "inventoryQuantity": -18,
1309            "unitPriceMeasurement": null,
1310            "sellingPlans": [
1311              
1312            ]
1313          },
1314        
1315          {
1316            "id": 55061249950038,
1317            "availableForSale": true,
1318            "price": 15900,
1319            "compareAtPrice": null,
1320            "options": ["Gold"],
1321            "imageId": 72936309490006,
1322            "image": "\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?height=200\u0026v=1773758930",
1323            "inventoryManagement": "shopify",
1324            "inventoryPolicy": "continue",
1325            "inventoryQuantity": -7,
1326            "unitPriceMeasurement": null,
1327            "sellingPlans": [
1328              
1329            ]
1330          }
1331        
1332      ],
1333      "requiresSellingPlan": false,
1334      "sellingPlans": [
1335        
1336      ],
1337      "isNativeBundle": null,
1338      "metafields": {
1339        "text": null,
1340        "text2": null,
1341        "text3": null,
1342        "text4": null
1343      }
1344    }
1345  </script>
1345
1346
1347<!-- END app snippet -->
1348    
1349      <!-- BEGIN app snippet: deal_blocks -->
1350
1351  
1352
1353  
1354    
1355      
1356    
1357  
1358
1359  
1360    
1361  
1362
1363  
1364    
1365  
1366
1367  
1368    
1368<script class="kaching-bundles-deal-block-settings" data-product-id="10882379907414" type="application/json"></script>
1368
1369  
1370
1371  
1372
1373<!-- END app snippet -->
1374    
1375  
1376
1377
1378
1379  
1380  
1381
1382  <link rel="modulepreload" href="https://cdn.shopify.com/extensions/01a1008a-386d-7582-96f4-b3f382a090cd/kaching-bundles-2026/assets/kaching-bundles.js" crossorigin="anonymous" fetchpriority="high">
1383  
1384  
1384<script type="module" src="https://cdn.shopify.com/extensions/01a1008a-386d-7582-96f4-b3f382a090cd/kaching-bundles-2026/assets/loader.js" crossorigin="anonymous" fetchpriority="high"></script>
1384
1385  <link rel="stylesheet" href="https://cdn.shopify.com/extensions/01a1008a-386d-7582-96f4-b3f382a090cd/kaching-bundles-2026/assets/kaching-bundles.css" media="print" onload="this.media='all'" fetchpriority="high">
1386
1387  <style>
1388    .kaching-bundles__block {
1389      display: none;
1390    }
1391
1392    .kaching-bundles-sticky-atc {
1393      display: none;
1394    }
1395  </style>
1396
1397
1398
1399<!-- END app snippet -->
1400
1401<!-- Kaching Bundles App Embed End -->
1402
1403
1404<!-- END app block --><!-- BEGIN app block: shopify://apps/image-translate-easy/blocks/image-swapper/019b1a70-a299-727e-9cf1-0670c9110ad1 -->
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443<script>
1444document.querySelectorAll('img').forEach(function(img) { img.classList.add('it-ready'); });
1445</script>
1445
1446
1447
1448
1449
1450<!-- END app block --><!-- BEGIN app block: shopify://apps/microsoft-clarity/blocks/clarity_js/31c3d126-8116-4b4a-8ba1-baeda7c4aeea -->
1451<script type="text/javascript">
1452  (function (c, l, a, r, i, t, y) {
1453    c[a] = c[a] || function () { (c[a].q = c[a].q || []).push(arguments); };
1454    t = l.createElement(r); t.async = 1; t.src = "https://www.clarity.ms/tag/" + i + "?ref=shopify";
1455    y = l.getElementsByTagName(r)[0]; y.parentNode.insertBefore(t, y);
1456
1457    c.Shopify.loadFeatures([{ name: "consent-tracking-api", version: "0.1" }], error => {
1458      if (error) {
1459        console.error("Error loading Shopify features:", error);
1460        return;
1461      }
1462
1463      c[a]('consentv2', {
1464        ad_Storage: c.Shopify.customerPrivacy.marketingAllowed() ? "granted" : "denied",
1465        analytics_Storage: c.Shopify.customerPrivacy.analyticsProcessingAllowed() ? "granted" : "denied",
1466        source: 101,
1467      });
1468    });
1469
1470    l.addEventListener("visitorConsentCollected", function (e) {
1471      c[a]('consentv2', {
1472        ad_Storage: e.detail.marketingAllowed ? "granted" : "denied",
1473        analytics_Storage: e.detail.analyticsAllowed ? "granted" : "denied",
1474        source: 101,
1475      });
1476    });
1477  })(window, document, "clarity", "script", "wip0bsx81c");
1478</script>
1478
1479
1480
1481
1482<!-- END app block --><!-- BEGIN app block: shopify://apps/klaviyo-email-marketing-sms/blocks/klaviyo-onsite-embed/2632fe16-c075-4321-a88b-50b567f42507 -->
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495  
1495<script async src="https://static.klaviyo.com/onsite/js/Ru4nY2/klaviyo.js?company_id=Ru4nY2"></script>
1495
1496  
1496<script>!function(){if(!window.klaviyo){window._klOnsite=window._klOnsite||[];try{window.klaviyo=new Proxy({},{get:function(n,i){return"push"===i?function(){var n;(n=window._klOnsite).push.apply(n,arguments)}:function(){for(var n=arguments.length,o=new Array(n),w=0;w<n;w++)o[w]=arguments[w];var t="function"==typeof o[o.length-1]?o.pop():void 0,e=new Promise((function(n){window._klOnsite.push([i].concat(o,[function(i){t&&t(i),n(i)}]))}));return e}}})}catch(n){window.klaviyo=window.klaviyo||[],window.klaviyo.push=function(){var n;(n=window._klOnsite).push.apply(n,arguments)}}}}();</script>
1496
1497
1498  
1499    
1499<script id="viewed_product">
1500      if (item == null) {
1501        var _learnq = _learnq || [];
1502
1503        var MetafieldReviews = null
1504        var MetafieldYotpoRating = null
1505        var MetafieldYotpoCount = null
1506        var MetafieldLooxRating = null
1507        var MetafieldLooxCount = null
1508        var okendoProduct = null
1509        var okendoProductReviewCount = null
1510        var okendoProductReviewAverageValue = null
1511        try {
1512          // The following fields are used for Customer Hub recently viewed in order to add reviews.
1513          // This information is not part of __kla_viewed. Instead, it is part of __kla_viewed_reviewed_items
1514          MetafieldReviews = {"rating":{"scale_min":"1.0","scale_max":"5.0","value":"4.7"},"rating_count":481};
1515          MetafieldYotpoRating = null
1516          MetafieldYotpoCount = null
1517          MetafieldLooxRating = "4.7"
1518          MetafieldLooxCount = 481
1519
1520          okendoProduct = null
1521          // If the okendo metafield is not legacy, it will error, which then requires the new json formatted data
1522          if (okendoProduct && 'error' in okendoProduct) {
1523            okendoProduct = null
1524          }
1525          okendoProductReviewCount = okendoProduct ? okendoProduct.reviewCount : null
1526          okendoProductReviewAverageValue = okendoProduct ? okendoProduct.reviewAverageValue : null
1527        } catch (error) {
1528          console.error('Error in Klaviyo onsite reviews tracking:', error);
1529        }
1530
1531        var item = {
1532          Name: "TinyS",
1533          ProductID: 10882379907414,
1534          Categories: ["All products excluding Varaosat","Gift-card ENABLED","JOY4v alet","Loox alet","Main products","No-Discounts","XMAS 2025 META"],
1535          ImageURL: "https://joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5_grande.png?v=1779964205",
1536          URL: "https://joyearbuds.com/products/tinys-earbuds-desinged-for-women-joy-friends-club",
1537          Brand: "Joy Planet Finland",
1538          Price: "159,00 €",
1539          Value: "159,00",
1540          CompareAtPrice: "0,00 €"
1541        };
1542        _learnq.push(['track', 'Viewed Product', item]);
1543        _learnq.push(['trackViewedItem', {
1544          Title: item.Name,
1545          ItemId: item.ProductID,
1546          Categories: item.Categories,
1547          ImageUrl: item.ImageURL,
1548          Url: item.URL,
1549          Metadata: {
1550            Brand: item.Brand,
1551            Price: item.Price,
1552            Value: item.Value,
1553            CompareAtPrice: item.CompareAtPrice
1554          },
1555          metafields:{
1556            reviews: MetafieldReviews,
1557            yotpo:{
1558              rating: MetafieldYotpoRating,
1559              count: MetafieldYotpoCount,
1560            },
1561            loox:{
1562              rating: MetafieldLooxRating,
1563              count: MetafieldLooxCount,
1564            },
1565            okendo: {
1566              rating: okendoProductReviewAverageValue,
1567              count: okendoProductReviewCount,
1568            }
1569          }
1570        }]);
1571      }
1572    </script>
1572
1573  
1574
1575
1576
1577
1578  
1578<script>
1579    window.klaviyoReviewsProductDesignMode = false
1580  </script>
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590<!-- END app block --><!-- BEGIN app block: shopify://apps/gorgias-live-chat-helpdesk/blocks/gorgias/a66db725-7b96-4e3f-916e-6c8e6f87aaaa -->
1591<script defer data-gorgias-loader-chat src="https://config.gorgias.chat/bundle-loader/shopify/joy-planet-finland.myshopify.com"></script>
1591
1592
1593
1594<script defer data-gorgias-loader-convert  src="https://content.9gtb.com/loader.js"></script>
1594
1595
1596
1597<script defer data-gorgias-loader-mailto-replace  src="https://config.gorgias.help/api/contact-forms/replace-mailto-script.js?shopName=joy-planet-finland"></script>
1597
1598
1599
1600<!-- END app block -->
1600<script src="https://cdn.shopify.com/extensions/01a0f7c3-dc79-7a84-bbec-a0894fd9ef1e/discounty-3.4.5/assets/sdk.js" type="text/javascript" defer="defer"></script>
vendor: 1 bytes, line 1600
1600
1601<script src="https://cdn.shopify.com/extensions/019feb7b-2b89-71ba-a248-f1c8ef9b3368/stape-remix-56/assets/widget.js" type="text/javascript" defer="defer"></script>
vendor: 1 bytes, line 1601
1601
1602<script src="https://cdn.shopify.com/extensions/01a0fcf5-9827-75b1-9d7e-ea3a10d70819/gdpr-backpack-903/assets/consentmo_cookie_consent.js" type="text/javascript" defer="defer"></script>
1602
1603<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
1604<script>(function(){if ("sendBeacon" in navigator && "performance" in window) {try {var session_token_from_headers = performance.getEntriesByType('navigation')[0].serverTiming.find(x => x.name == '_s').description;} catch {var session_token_from_headers = undefined;}var session_cookie_matches = document.cookie.match(/_shopify_s=([^;]*)/);var session_token_from_cookie = session_cookie_matches && session_cookie_matches.length === 2 ? session_cookie_matches[1] : "";var session_token = session_token_from_headers || session_token_from_cookie || "";function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 65680310506,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "product"};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
vendor: 1 bytes, line 1604
1604
1605<script>
1606  window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || [];
1607</script>
vendor: 1 bytes, line 1607
1607
1608<script>(function(){var wpmLoader=function(){"use strict";var e=/Googlebot|Storebot-Google|bingbot|Baiduspider|YandexBot|DuckDuckBot|Slurp|facebookexternalhit|Twitterbot|LinkedInBot|Applebot|AdsBot-Google|Mediapartners-Google|APIs-Google|PetalBot|SemrushBot|AhrefsBot|MJ12bot|DotBot|Acunetix|PerplexityBot|Perplexity-User/i,t=/bytedance/i;function i(){try{var e=document.cookie;if(!e||"string"!=typeof e)return;for(var t=0,i=e.split(";");t<i.length;t++){var n=i[t],r=n.indexOf("=");if(-1!==r){var o=n.slice(0,r).trim();if(o){var a=void 0;try{a=decodeURIComponent(o)}catch(e){a=o}if("_shopify_s"===a){var d=n.slice(r+1).trim();try{return decodeURIComponent(d)}catch(e){return d}}}}}return}catch(e){return}}function n(e){try{"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}catch(e){}}function r(e,t){return"string"==typeof e&&e.length>0&&e.length<=t?e:void 0}function o(e){var t;switch(null==(t=null==e?void 0:e.navigation)?void 0:t.type){case 0:return"navigate";case 1:return"reload";case 2:return"back_forward";default:return}}function a(){var e,t,i;try{var n=null==(i=null==(t=null==(e=self.ShopifyAnalytics)?void 0:e.lib)?void 0:t.trekkie)?void 0:i.state;return"awaiting-consent"===n||"initialized"===n?n:void 0}catch(e){return}}return function(d,s,u,l){var c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};try{var p=c.trekkieShim;!0!==p&&"true"!==p||null!=window.__TREKKIE_SHIM_QUEUE||(window.__TREKKIE_SHIM_QUEUE=[])}catch(e){}var f,v,h,y,g=(v=(f={modern:/Edge?\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(9{2}|\d{3,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.\d+|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9{2}|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]\d+|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/([2-9]\d|\d{3,})\.\d+/,legacy:/Edge?\/(1[6-9]|[2-9]\d|\d{3,})\.\d+(\.\d+|)|Firefox\/(5[4-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/(5[1-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)([\d.]+$|.*Safari\/(?![\d.]+ Edge\/[\d.]+$))|(Maci|X1{2}).+ Version\/(10\.\d+|(1[1-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(3[89]|[4-9]\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(10[._]\d+|(1[1-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(5\.\d+|([6-9]|\d{2,})\.\d+)|Android.+MQ{2}Browser\/(14(\.(9|\d{2,})|)|(1[5-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(3\.\d+|([4-9]|\d{2,})\.\d+)(\.\d+|)/}).modern,h=f.legacy,(y=navigator.userAgent).match(e)?"bot":y.match(v)?"modern":y.match(h)?"legacy":y.match(t)?"bot":"unknown"),m=function(e){var t,i,n=r(e,128);try{var a=window.performance,d=null==(t=null==a?void 0:a.getEntriesByType)?void 0:t.call(a,"navigation")[0];if(!d)return{requestId:n,navigationType:o(a)};var s="type"in d?r(d.type,64):void 0,u="serverTiming"in d&&Array.isArray(d.serverTiming)?d.serverTiming:[];return{requestId:null!=n?n:r(null==(i=u.find(function(e){return"requestID"===e.name}))?void 0:i.description,128),navigationType:s}}catch(e){return{requestId:n}}}(c.requestId),w=function(e){var t=e.version,r=e.browserTarget,o=e.surface,a=e.shopId,d=e.monorailEndpoint,s=window.location.href;return{emit:function(e){var u=e.status,l=e.errorMsg,c=e.failureReason,p=e.useKeepaliveFallback,f=void 0!==p&&p,v=e.navigationType,h=e.pagehidePersisted,y=e.requestId,g=e.trekkieState;if(d){var m,w;try{var b=(new Date).getTime();m=JSON.stringify({metadata:{event_sent_at_ms:b},events:[{schema_id:"web_pixels_manager_load/3.3",payload:{version:t,bundle_target:r,page_url:s,status:u,surface:o,error_msg:l,failure_reason:c,navigation_type:v,pagehide_persisted:h,request_id:y,trekkie_state:g,shop_id:a,visit_token:i()},metadata:{event_created_at_ms:b}}]})}catch(e){return}try{if("function"==typeof window.navigator.sendBeacon&&-1===(w=window.navigator.userAgent).indexOf("iPhone; CPU iPhone OS 12_")&&-1===w.indexOf("iPad; CPU OS 12_")&&-1===w.indexOf("iPod touch; CPU iPhone OS 12_")&&window.navigator.sendBeacon.bind(window.navigator)(d,m))return}catch(e){}if(f)try{"function"==typeof window.fetch&&window.fetch(d,{method:"POST",headers:{"Content-Type":"text/plain"},body:m,keepalive:!0}
1608).catch(function(){})}catch(e){}else try{var _=new XMLHttpRequest;_.open("POST",d,!0),_.setRequestHeader("Content-Type","text/plain"),_.send(m)}catch(e){n("[Web Pixels Manager] Got an unhandled error while logging to Monorail.")}}else n("[Web Pixels Manager] No Monorail endpoint provided, skipping logging.")}}}({version:u,browserTarget:g,surface:d.surface,shopId:d.shopId,monorailEndpoint:d.monorailEndpoint});if(Boolean(null==(_=null==(b=window.Shopify)?void 0:b.analytics)?void 0:_.replayQueue))w.emit({status:"setup-skipped",errorMsg:"replay queue already initialized."});else{var b,_;w.emit({status:"setup-started"}),window.Shopify=window.Shopify||{};var S=window.Shopify;S.analytics=S.analytics||{};var P=S.analytics;P.replayQueue=[],P.publish=function(e,t,i){return P.replayQueue.push([e,t,i]),!0};try{self.performance.mark("wpm:start")}catch(e){}var k,C="modern"===g?"modern":"legacy",E=(null!=l?l:{modern:"",legacy:""})[C],I=[(k={baseUrl:s,hashVersion:u,buildTarget:C}).baseUrl,"/wpm","/b",k.hashVersion,"modern"===k.buildTarget?"m":"l",".js"].join(""),O=!1,T=!1;try{c.browserTarget=g,function(){O=!0;try{window.addEventListener("pagehide",M)}catch(e){O=!1}}(),R(function(){try{R(x)}catch(e){D(e)}}),w.emit({status:"loading",requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()})}catch(e){D(e)}}function U(){var e;if(q(),!function(){var e,t;return Boolean(null==(t=null==(e=window.Shopify)?void 0:e.analytics)?void 0:t.initialized)}()){var t,i,n;try{if("function"!=typeof(null==(e=window.webPixelsManager)?void 0:e.init))return void A();if(!(null!==(n=i=t=window.webPixelsManager.init(d))&&"function"!=typeof n&&Object(n)===n&&"publish"in i&&"function"==typeof i.publish&&"publishCustomEvent"in i&&"function"==typeof i.publishCustomEvent&&"visitor"in i&&"function"==typeof i.visitor))return void A()}catch(e){return void A(e)}var r=window.Shopify.analytics;r.replayQueue.forEach(function(e){var i=e[0],n=e[1],r=e[2];t.publishCustomEvent(i,n,r)}),r.replayQueue=[],r.publish=t.publishCustomEvent,r.visitor=t.visitor,r.initialized=!0}}function A(e){B("manager_api_unavailable",void 0===e?void 0:Q(e))}function x(){B("script_load_failed","".concat(I," has failed to load"))}function B(e,t){T||(T=!0,q(),w.emit({status:"failed",errorMsg:t,failureReason:e,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function M(e){O&&(q(),w.emit({status:"pagehide-while-loading",useKeepaliveFallback:!0,pagehidePersisted:e.persisted,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function q(){O=!1;try{window.removeEventListener("pagehide",M)}catch(e){}}function R(e){var t;!function(e){var t=e.src,i=e.async,n=void 0===i||i,r=e.onload,o=e.onerror,a=e.sri,d=e.scriptDataAttributes,s=void 0===d?{}:d,u=document.createElement("script"),l=document.querySelector("head"),c=document.querySelector("body");if(u.async=n,u.src=t,a&&(u.integrity=a,u.crossOrigin="anonymous"),s)for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))try{u.dataset[p]=String(s[p])}catch(e){}if(r&&u.addEventListener("load",r),o&&u.addEventListener("error",o),l)l.appendChild(u);else{if(!c)throw new Error("Did not find a head or body element to append the script");c.appendChild(u)}}({src:I,async:!0,onload:U,onerror:e,sri:(t=E,"string"==typeof t&&/^sha384-[A-Za-z0-9+/=]+$/.test(t)?E:""),scriptDataAttributes:c})}function D(e){B("script_append_failed",Q(e))}function Q(e){return e instanceof Error?e.message:"Unknown error"}}}();wpmLoader({shopId: 65680310506,storefrontBaseUrl: "https://joyearbuds.com",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://joyearbuds.com/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["4c64608a","16072cab","8450a54b","7ee89bf1"],webPixelsConfigList: [{"id":"5586682198","configuration":"{\"myshopifyDomain\":\"joy-planet-finland.myshopify.com\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"23b97d18e2aa74363140dc29c9284e87","type":"APP","apiClientId":2775569,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_phone","read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"5579833686","configuration":"{\"pixel_id\":\"176786487088598\",\"pixel_type\":\"facebook_pixel\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"96420dbe9ea96c426a1b7f364f977719","type":"APP","apiClientId":2329312,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"5090017622","configuration":"{\"config\":\"{\\\"google_tag_ids\\\":[\\\"G-QRKGD2WTE9\\\",\\\"GT-KFT5S977\\\",\\\"G-MHQB6278VB\\\"],\\\"target_country\\\":\\\"FI\\\",\\\"gtag_events\\\":[{\\\"type\\\":\\\"search\\\",\\\"action_label\\\":\\\"G-MHQB6278VB\\\"},{\\\"type\\\":\\\"begin_checkout\\\",\\\"action_label\\\":[\\\"AW-11093337982\\\/azL9CIjE1b0cEP7O26kp\\\",\\\"AW-11093337982\\\/URAaCICmyu8bEP7O26kp\\\",\\\"G-MHQB6278VB\\\"]},{\\\"type\\\":\\\"view_item\\\",\\\"action_label\\\":[\\\"MC-HKNCPDNC2Z\\\",\\\"G-MHQB6278VB\\\"]},{\\\"type\\\":\\\"purchase\\\",\\\"action_label\\\":[\\\"AW-11093337982\\\/P_LNCOe91b0cEP7O26kp\\\",\\\"MC-HKNCPDNC2Z\\\",\\\"AW-11093337982\\\/E3FgCJn9ye8bEP7O26kp\\\",\\\"G-MHQB6278VB\\\"]},{\\\"type\\\":\\\"page_view\\\",\\\"action_label\\\":[\\\"MC-HKNCPDNC2Z\\\",\\\"G-MHQB6278VB\\\"]},{\\\"type\\\":\\\"add_payment_info\\\",\\\"action_label\\\":[\\\"AW-11093337982\\\/vtXuCIvE1b0cEP7O26kp\\\",\\\"G-MHQB6278VB\\\"]},{\\\"type\\\":\\\"add_to_cart\\\",\\\"action_label\\\":[\\\"AW-11093337982\\\/OmaFCPrcu-8bEP7O26kp\\\",\\\"G-MHQB6278VB\\\"]}],\\\"enable_monitoring_mode\\\":false}\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"a3321ca85cf5aaf6b57585fcd8d67b3a","type":"APP","apiClientId":1780363,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"4759552342","configuration":"{\"projectId\":\"wip0bsx81c\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"d8a2bb2ccbb513dc8e8b6937f4b8033e","type":"APP","apiClientId":240074326017,"privacyPurposes":[],"capabilities":["advanced_dom_events"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]}
1608,"dataSharingState":"unrestricted"},{"id":"4671996246","configuration":"{\"shopifyDomain\":\"joy-planet-finland.myshopify.com\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"14b26290829f755f27eefbf196eb8024","type":"APP","apiClientId":2935586817,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_email","read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"4110156118","configuration":"{\"accountID\":\"65680310506\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"9cf281f576a3744d05c8685f9f7f3f72","type":"APP","apiClientId":10250649601,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"3911614806","configuration":"{\"accountID\":\"wp_2430576\", \"storeID\":\"65680310506\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"709656c015f722c724bbecad2c42bc3e","type":"APP","apiClientId":6762325,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"3807183190","configuration":"{\"accountID\":\"Ru4nY2\",\"webPixelConfig\":\"eyJlbmFibGVBZGRlZFRvQ2FydEV2ZW50cyI6IHRydWV9\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"c63c5b72c8d77be5f2d27d14c081da38","type":"APP","apiClientId":123074,"privacyPurposes":["ANALYTICS","MARKETING"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"2734358870","configuration":"{\"pixelCode\":\"D2DL5SJC77U4VAMQSV6G\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"22e92c2ad45662f435e4801458fb78cc","type":"APP","apiClientId":4383523,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":[]},"dataSharingState":"optimized"},{"id":"1715110230","configuration":"{ \"alias\": \"JOY_PLANET_FINLAND\", \"apiKey\": \"ux4ung2maf2gh5lxklpkp.fc64n2iubntb63ae5o2db\" }","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"089c563d4539df58b1e71259ac47d388","type":"APP","apiClientId":6779637,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"564068694","configuration":"{\"shopDomain\":\"joy-planet-finland.myshopify.com\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"1cc50c06a2fd060c142979e7a3df92db","type":"APP","apiClientId":2436932,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"297730390","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"3","type":"CUSTOM","privacyPurposes":[],"name":"DataLayer"},{"id":"342131030","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"1","type":"CUSTOM","privacyPurposes":["SALE_OF_DATA"],"name":"stape events"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"Joy Planet Finland","paymentSettings":{"currencyCode":"EUR"},"myshopifyDomain":"joy-planet-finland.myshopify.com","countryCode":"FI","storefrontUrl":"https:\/\/joyearbuds.com"},"customer":null,"cart":null,"checkout":null,"productVariants":[{"price":{"amount":159.0,"currencyCode":"EUR"},"product":{"title":"TinyS","vendor":"Joy Planet Finland","id":"10882379907414","untranslatedTitle":"TinyS","url":"\/products\/tinys-earbuds-desinged-for-women-joy-friends-club","type":""},"id":"54276348870998","image":{"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855"},"sku":"H-PRM-N-BL-TinyS","title":"Black","untranslatedTitle":"Black"},{"price":{"amount":159.0,"currencyCode":"EUR"},"product":{"title":"TinyS","vendor":"Joy Planet Finland","id":"10882379907414","untranslatedTitle":"TinyS","url":"\/products\/tinys-earbuds-desinged-for-women-joy-friends-club","type":""},"id":"54276348936534","image":{"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?v=1776769855"},"sku":"H-PRM-N-PI-TinyS","title":"Pink","untranslatedTitle":"Pink"},{"price":{"amount":159.0,"currencyCode":"EUR"},"product":{"title":"TinyS","vendor":"Joy Planet Finland","id":"10882379907414","untranslatedTitle":"TinyS","url":"\/products\/tinys-earbuds-desinged-for-women-joy-friends-club","type":""},"id":"55061249950038","image":{"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?v=1773758930"},"sku":null,"title":"Gold","untranslatedTitle":"Gold"}
1608],"products":[{"id":"10882379907414","handle":"tinys-earbuds-desinged-for-women-joy-friends-club","isCollective":null,"title":"TinyS","type":null,"untranslatedTitle":"TinyS","url":"\/products\/tinys-earbuds-desinged-for-women-joy-friends-club","vendor":"Joy Planet Finland","remoteShopId":null,"variants":[{"id":"54276348870998","image":{"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855"},"price":{"amount":159.0,"currencyCode":"EUR"},"sku":"H-PRM-N-BL-TinyS","title":"Black","untranslatedTitle":"Black"},{"id":"54276348936534","image":{"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?v=1776769855"},"price":{"amount":159.0,"currencyCode":"EUR"},"sku":"H-PRM-N-PI-TinyS","title":"Pink","untranslatedTitle":"Pink"},{"id":"55061249950038","image":{"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?v=1773758930"},"price":{"amount":159.0,"currencyCode":"EUR"},"sku":null,"title":"Gold","untranslatedTitle":"Gold"}]},{"id":"8033926512874","handle":"tinys®","isCollective":null,"title":"TinyS®","type":"GIFT_CARD_ENABLED","untranslatedTitle":"TinyS®","url":"\/products\/tinys%C2%AE","vendor":"Joy Planet Finland","remoteShopId":null,"variants":[{"id":"43801205014762","image":{"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_3f59b54d-59e0-4972-bef4-45616984d816.png?v=1776769855"},"price":{"amount":159.0,"currencyCode":"EUR"},"sku":"H-PRM-N-PI-TinyS","title":"Pink","untranslatedTitle":"Pink"}]},{"id":"10259673448790","handle":"tinys®-earbudsforwomen","isCollective":null,"title":"JOY TinyS","type":null,"untranslatedTitle":"JOY TinyS","url":"\/products\/tinys%C2%AE-earbudsforwomen","vendor":"Joy Planet Finland","remoteShopId":null,"variants":[{"id":"52813102088534","image":{"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?v=1776769855"},"price":{"amount":109.0,"currencyCode":"EUR"},"sku":"H-PRM-N-PI-TinyS","title":"Pink","untranslatedTitle":"Pink"}]},{"id":"9486202765654","handle":"c2c-kangaskaapeli","isCollective":null,"title":"C2C fast fabric cable","type":"Varaosat","untranslatedTitle":"C2C fast fabric cable","url":"\/products\/c2c-kangaskaapeli","vendor":"Joy Planet Finland","remoteShopId":null,"variants":[{"id":"49936931684694","image":{"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/ctoc.png?v=1758873157"},"price":{"amount":17.9,"currencyCode":"EUR"},"sku":"X-GEN-N-BL-CTOC","title":"Default Title","untranslatedTitle":"Default Title"}]}],"purchasingCompany":null},},"https://joyearbuds.com/cdn","5982071ew7ea472e3p69b68784m2150dfea",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"true","themeId":"162073870678","themeStoreId":"847","themePublished":"true","eventMetadataId":"4b9302f3-9c45-44fa-b85b-fcc52e9724f8","pageType":"product","resourceId":"10882379907414","shopId":"65680310506","storefrontBaseUrl":"https:\/\/joyearbuds.com","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"4c64608a\", \"16072cab\", \"8450a54b\", \"7ee89bf1\"]","isMerchantRequest":"false","hashVersion":"5982071ew7ea472e3p69b68784m2150dfea","publish":"custom","events":"[[\"page_viewed\",{}],[\"product_viewed\",{\"productVariant\":{\"price\":{\"amount\":159.0,\"currencyCode\":\"EUR\"},\"product\":{\"title\":\"TinyS\",\"vendor\":\"Joy Planet Finland\",\"id\":\"10882379907414\",\"untranslatedTitle\":\"TinyS\",\"url\":\"\/products\/tinys-earbuds-desinged-for-women-joy-friends-club\",\"type\":\"\"},\"id\":\"54276348870998\",\"image\":{\"src\":\"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855\"},\"sku\":\"H-PRM-N-BL-TinyS\",\"title\":\"Black\",\"untranslatedTitle\":\"Black\"}}]]"});})();</script>
1608<script>
1609  window.ShopifyAnalytics = window.ShopifyAnalytics || {};
1610  window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {};
1611  window.ShopifyAnalytics.meta.currency = 'EUR';
1612  var meta = {"product":{"id":10882379907414,"gid":"gid:\/\/shopify\/Product\/10882379907414","vendor":"Joy Planet Finland","type":"","handle":"tinys-earbuds-desinged-for-women-joy-friends-club","variants":[{"id":54276348870998,"price":15900,"name":"TinyS - Black","public_title":"Black","sku":"H-PRM-N-BL-TinyS"},{"id":54276348936534,"price":15900,"name":"TinyS - Pink","public_title":"Pink","sku":"H-PRM-N-PI-TinyS"},{"id":55061249950038,"price":15900,"name":"TinyS - Gold","public_title":"Gold","sku":null}],"remote":false},"page":{"pageType":"product","resourceType":"product","resourceId":10882379907414,"requestId":"910fffe3-095c-4fca-84bc-c5f7a384d934-1791140730"}};
1613  for (var attr in meta) {
1614    window.ShopifyAnalytics.meta[attr] = meta[attr];
1615  }
1616</script>
vendor: 1 bytes, line 1616
1616
1617<script class="analytics">
1618  (function () {
1619    var customDocumentWrite = function(content) {
1620      var jquery = null;
1621
1622      if (window.jQuery) {
1623        jquery = window.jQuery;
1624      } else if (window.Checkout && window.Checkout.$) {
1625        jquery = window.Checkout.$;
1626      }
1627
1628      if (jquery) {
1629        jquery('body').append(content);
1630      }
1631    };
1632
1633    var hasLoggedConversion = function(token) {
1634      if (token) {
1635        return document.cookie.indexOf('loggedConversion=' + token) !== -1;
1636      }
1637      return false;
1638    }
1639
1640    var setCookieIfConversion = function(token) {
1641      if (token) {
1642        var twoMonthsFromNow = new Date(Date.now());
1643        twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2);
1644
1645        document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow;
1646      }
1647    }
1648
1649    var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || [];
1650    window.ShopifyAnalytics.lib.trekkie = window.trekkie;
1651    if (trekkie.integrations) {
1652      return;
1653    }
1654    trekkie.methods = [
1655      'identify',
1656      'page',
1657      'ready',
1658      'track',
1659      'trackForm',
1660      'trackLink'
1661    ];
1662    trekkie.factory = function(method) {
1663      return function() {
1664        var args = Array.prototype.slice.call(arguments);
1665        args.unshift(method);
1666        trekkie.push(args);
1667        if (method == 'track' || method == 'page') {
1668          var pageUrl;
1669          try {
1670            pageUrl = window.location.href;
1671          } catch (e) {}
1672          var pageReferrer;
1673          try {
1674            pageReferrer = document.referrer;
1675          } catch (e) {}
1676          try {
1677            if (window.__TREKKIE_SHIM_QUEUE == null) {
1678              window.__TREKKIE_SHIM_QUEUE = [];
1679            }
1680            window.__TREKKIE_SHIM_QUEUE.push({
1681              from: 'trekkie-stub',
1682              method: method,
1683              args: args.slice(1),
1684              pageContext: {
1685                url: pageUrl,
1686                referrer: pageReferrer
1687              }
1688            });
1689          } catch (e) {
1690            // no-op
1691          }
1692        }
1693        return trekkie;
1694      };
1695    };
1696    for (var i = 0; i < trekkie.methods.length; i++) {
1697      var key = trekkie.methods[i];
1698      trekkie[key] = trekkie.factory(key);
1699    }
1700    trekkie.load = function(config) {
1701      trekkie.config = config || {};
1702      trekkie.config.initialDocumentCookie = document.cookie;
1703      var first = document.getElementsByTagName('script')[0];
1704var script = document.createElement('script');
1705script.type = 'text/javascript';
1706script.onerror = function(e) {
1707  var scriptFallback = document.createElement('script');
1708  scriptFallback.type = 'text/javascript';
1709  scriptFallback.onerror = function(error) {
1710          var Monorail = {
1711      produce: function produce(monorailDomain, schemaId, payload) {
1712        var currentMs = new Date().getTime();
1713        var event = {
1714          schema_id: schemaId,
1715          payload: payload,
1716          metadata: {
1717            event_created_at_ms: currentMs,
1718            event_sent_at_ms: currentMs
1719          }
1720        };
1721        return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event));
1722      },
1723      sendRequest: function sendRequest(endpointUrl, payload) {
1724        // Try the sendBeacon API
1725        if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) {
1726          var blobData = new window.Blob([payload], {
1727            type: 'text/plain'
1728          });
1729
1730          if (window.navigator.sendBeacon(endpointUrl, blobData)) {
1731            return true;
1732          } // sendBeacon was not successful
1733
1734        } // XHR beacon
1735
1736        var xhr = new XMLHttpRequest();
1737
1738        try {
1739          xhr.open('POST', endpointUrl);
1740          xhr.setRequestHeader('Content-Type', 'text/plain');
1741          xhr.send(payload);
1742        } catch (e) {
1743          console.log(e);
1744        }
1745
1746        return false;
1747      },
1748      isIos12: function isIos12() {
1749        return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1;
1750      }
1751    };
1752    Monorail.produce('monorail-edge.shopifysvc.com',
1753      'trekkie_storefront_load_errors/1.1',
1754      {shop_id: 65680310506,
1755      theme_id: 162073870678,
1756      app_name: "storefront",
1757      context_url: window.location.href,
1758      source_url: "//joyearbuds.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js"});
1759
1760  };
1761  scriptFallback.async = true;
1762  scriptFallback.src = '//joyearbuds.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js';
1763  first.parentNode.insertBefore(scriptFallback, first);
1764};
1765script.async = true;
1766script.src = '//joyearbuds.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js';
1767first.parentNode.insertBefore(script, first);
1768
1769    };
1770    trekkie.load(
1771      {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":65680310506,"isMerchantRequest":null,"themeId":162073870678,"themeCityHash":"9710838500565601613","contentLanguage":"en","currency":"EUR","eventMetadataId":"4b9302f3-9c45-44fa-b85b-fcc52e9724f8"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b","7ee89bf1","4c64608a"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":true,"source":"trekkie-storefront-renderer","apiClientId":580111}}
1772    );
1773
1774    var loaded = false;
1775    trekkie.ready(function() {
1776      if (loaded) return;
1777      loaded = true;
1778
1779      window.ShopifyAnalytics.lib = window.trekkie;
1780
1781      var originalDocumentWrite = document.write;
1782      document.write = customDocumentWrite;
1783      try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {};
1784      document.write = originalDocumentWrite;
1785
1786      var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/)
1787      var token = match? match[1]: undefined;
1788      if (!hasLoggedConversion(token)) {
1789        setCookieIfConversion(token);
1790        window.ShopifyAnalytics.lib.track("Viewed Product",{"currency":"EUR","variantId":54276348870998,"productId":10882379907414,"productGid":"gid:\/\/shopify\/Product\/10882379907414","name":"TinyS - Black","price":"159.00","sku":"H-PRM-N-BL-TinyS","brand":"Joy Planet Finland","variant":"Black","category":"","nonInteraction":true,"remote":false,"available":true},undefined,undefined,{"shopifyEmitted":true});
1791      }
1792    });
1793
1794    window.ShopifyAnalytics.lib.page(null,{"pageType":"product","resourceType":"product","resourceId":10882379907414,"requestId":"910fffe3-095c-4fca-84bc-c5f7a384d934-1791140730","shopifyEmitted":true});
1795
1796    var eventsListenerScript = document.createElement('script');
1797    eventsListenerScript.async = true;
1798    eventsListenerScript.src = "//joyearbuds.com/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js";
1799    document.getElementsByTagName('head')[0].appendChild(eventsListenerScript);
1800})();</script>
vendor: 1 bytes, line 1800
1800
1801<script
1802  defer
1803  src="https://joyearbuds.com/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.4.min.js"
1804  data-application="storefront-renderer"
1805  data-shop-id="65680310506"
1806  data-render-region="gcp-us-west1"
1807  data-page-type="product"
1808  data-theme-instance-id="162073870678"
1809  data-theme-name="Motion"
1810  data-theme-version="10.4.0"
1811  data-monorail-region="shop_domain"
1812  data-resource-timing-sampling-rate="10"
1813  data-shs="true"
1814  data-shs-beacon="true"
1815  data-shs-export-with-fetch="true"
1816  data-shs-logs-sample-rate="1"
1817  data-shs-beacon-endpoint="https://joyearbuds.com/api/collect"
1818></script>
1818
1819<meta name="shopify-y" content="fe8ad3cc-d992-4b10-82f5-71e44d910358" data-expiration="1822698330000"><meta name="shopify-s" content="4f85cbae-3d99-466a-992f-a376d634612c" data-expiration="1791142530000"><meta name="new-cookie-storage-activated" content="t">
1820</head>
1821
1822<body class="tinys-paasivu template-product  tinys-earbuds-desinged-for-women-joy-friends-club  " data-transitions="true" data-type_header_capitalize="true" data-type_base_accent_transform="false" data-type_header_accent_transform="true" data-animate_sections="true" data-animate_underlines="true" data-animate_buttons="true" data-animate_images="true" data-animate_page_transition_style="page-fade-in-up" data-type_header_text_alignment="true" data-animate_images_style="fade-in">
1823
1824  
1825    
1825<script type="text/javascript">window.setTimeout(function() { document.body.className += " loaded"; }, 25);</script>
1825
1826  
1827
1828  <a class="in-page-link visually-hidden skip-link" href="#MainContent">Skip to content</a>
1829
1830  <div id="PageContainer" class="page-container">
1831    <div class="transition-body"><!-- BEGIN sections: header-group -->
1832<div id="shopify-section-sections--21527965565270__header" class="shopify-section shopify-section-group-header-group"><div id="NavDrawer" class="drawer drawer--left">
1833  <div class="drawer__contents">
1834    <div class="drawer__fixed-header">
1835      <div class="drawer__header appear-animation appear-delay-2">
1836        <div class="drawer__title"></div>
1837        <div class="drawer__close">
1838          <button type="button" class="drawer__close-button js-drawer-close">
1839            <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg>
1840            <span class="icon__fallback-text">Close menu</span>
1841          </button>
1842        </div>
1843      </div>
1844    </div>
1845    <div class="drawer__scrollable">
1846      <ul class="mobile-nav" role="navigation" aria-label="Primary"><li class="mobile-nav__item appear-animation appear-delay-3 products"><div class="mobile-nav__has-sublist products"><button type="button" class="mobile-nav__link--button collapsible-trigger collapsible--auto-height  is-open " aria-controls="Linklist-1"  aria-expanded="true" >
1847                    <span class="mobile-nav__faux-link">Products</span>
1848                    <div class="mobile-nav__toggle">
1849                      <span><span class="collapsible-trigger__icon collapsible-trigger__icon--open" role="presentation">
1850  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
1851</span>
1852</span>
1853                    </div>
1854                  </button></div><div id="Linklist-1" class="mobile-nav__sublist collapsible-content collapsible-content--all  is-open "  style="height: 200px;" >
1855                <div class="collapsible-content__inner">
1856                  <ul class="mobile-nav__sublist"><li class="mobile-nav__item">
1857                        <div class="mobile-nav__child-item"><button type="button" class="mobile-nav__link--button mobile-nav__link--button-small collapsible-trigger" aria-controls="Sublinklist-1-1">
1858                              <span class="mobile-nav__faux-link">Headphones</span>
1859                              <div class="mobile-nav__toggle">
1860                                <span><span class="collapsible-trigger__icon collapsible-trigger__icon--open collapsible-trigger__icon--circle" role="presentation">
1861  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-plus" viewBox="0 0 20 20"><path fill="#444" d="M17.409 8.929h-6.695V2.258c0-.566-.506-1.029-1.071-1.029s-1.071.463-1.071 1.029v6.671H1.967C1.401 8.929.938 9.435.938 10s.463 1.071 1.029 1.071h6.605V17.7c0 .566.506 1.029 1.071 1.029s1.071-.463 1.071-1.029v-6.629h6.695c.566 0 1.029-.506 1.029-1.071s-.463-1.071-1.029-1.071z"/></svg>
1862  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-minus" viewBox="0 0 20 20"><path fill="#444" d="M17.543 11.029H2.1A1.032 1.032 0 0 1 1.071 10c0-.566.463-1.029 1.029-1.029h15.443c.566 0 1.029.463 1.029 1.029 0 .566-.463 1.029-1.029 1.029z"/></svg>
1863</span>
1864</span>
1865                              </div>
1866                            </button></div><div id="Sublinklist-1-1" class="mobile-nav__sublist collapsible-content collapsible-content--all" aria-labelledby="Sublabel-1">
1867                            <div class="collapsible-content__inner">
1868                              <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item mobile-nav__item--active">
1869                                    <a href="/products/tinys-earbuds-desinged-for-women-joy-friends-club" class="mobile-nav__link">
1870                                      TinyS®
1871                                    </a>
1872                                  </li><li class="mobile-nav__item">
1873                                    <a href="/products/tinys-pro-main" class="mobile-nav__link">
1874                                      TinyS Pro
1875                                    </a>
1876                                  </li><li class="mobile-nav__item">
1877                                    <a href="/products/joybuds" class="mobile-nav__link">
1878                                      JoyBuds
1879                                    </a>
1880                                  </li><li class="mobile-nav__item">
1881                                    <a href="/products/joytiny-wireless%C2%AE" class="mobile-nav__link">
1882                                      Tiny® 
1883                                    </a>
1884                                  </li><li class="mobile-nav__item">
1885                                    <a href="/products/tinysport%C2%AE" class="mobile-nav__link">
1886                                      SportBud® 
1887                                    </a>
1888                                  </li><li class="mobile-nav__item">
1889                                    <a href="https://fi.joyearbuds.com/products/joy-soundmate-3-over-ear-kuulokkeet-1" class="mobile-nav__link">
1890                                      SoundMate 3
1891                                    </a>
1892                                  </li><li class="mobile-nav__item">
1893                                    <a href="/products/koru-earbuds-2026" class="mobile-nav__link">
1894                                      Koru
1895                                    </a>
1896                                  </li><li class="mobile-nav__item">
1897                                    <a href="/collections/varaosat" class="mobile-nav__link">
1898                                      Spare parts
1899                                    </a>
1900                                  </li></ul>
1901                            </div>
1902                          </div></li><li class="mobile-nav__item">
1903                        <div class="mobile-nav__child-item"><button type="button" class="mobile-nav__link--button mobile-nav__link--button-small collapsible-trigger" aria-controls="Sublinklist-1-2">
1904                              <span class="mobile-nav__faux-link">Powerbanks</span>
1905                              <div class="mobile-nav__toggle">
1906                                <span><span class="collapsible-trigger__icon collapsible-trigger__icon--open collapsible-trigger__icon--circle" role="presentation">
1907  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-plus" viewBox="0 0 20 20"><path fill="#444" d="M17.409 8.929h-6.695V2.258c0-.566-.506-1.029-1.071-1.029s-1.071.463-1.071 1.029v6.671H1.967C1.401 8.929.938 9.435.938 10s.463 1.071 1.029 1.071h6.605V17.7c0 .566.506 1.029 1.071 1.029s1.071-.463 1.071-1.029v-6.629h6.695c.566 0 1.029-.506 1.029-1.071s-.463-1.071-1.029-1.071z"/></svg>
1908  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-minus" viewBox="0 0 20 20"><path fill="#444" d="M17.543 11.029H2.1A1.032 1.032 0 0 1 1.071 10c0-.566.463-1.029 1.029-1.029h15.443c.566 0 1.029.463 1.029 1.029 0 .566-.463 1.029-1.029 1.029z"/></svg>
1909</span>
1910</span>
1911                              </div>
1912                            </button></div><div id="Sublinklist-1-2" class="mobile-nav__sublist collapsible-content collapsible-content--all" aria-labelledby="Sublabel-2">
1913                            <div class="collapsible-content__inner">
1914                              <ul class="mobile-nav__grandchildlist"><li class="mobile-nav__item">
1915                                    <a href="/products/tenpower" class="mobile-nav__link">
1916                                      TenPower
1917                                    </a>
1918                                  </li><li class="mobile-nav__item">
1919                                    <a href="https://fi.joyearbuds.com/products/goldpower%C2%AE" class="mobile-nav__link">
1920                                      GoldPower®
1921                                    </a>
1922                                  </li><li class="mobile-nav__item">
1923                                    <a href="/products/tinypower%C2%AE" class="mobile-nav__link">
1924                                      TinyPower®
1925                                    </a>
1926                                  </li></ul>
1927                            </div>
1928                          </div></li></ul></div>
1929              </div></li><li class="mobile-nav__item appear-animation appear-delay-4 instructions-support"><a href="https://fi.joyearbuds.com/pages/help?hcUrl=%2Ffi-FI" class="mobile-nav__link">Instructions & Support</a></li><li class="mobile-nav__item appear-animation appear-delay-5 joy-with-own-logo"><a href="/pages/b2b" class="mobile-nav__link">JOY with own logo</a></li><li class="mobile-nav__item appear-animation appear-delay-6 brand"><a href="/pages/the-brand" class="mobile-nav__link">Brand</a></li><li class="mobile-nav__item appear-animation appear-delay-7 sustainability"><a href="/pages/sustainability" class="mobile-nav__link">Sustainability</a></li><li class="mobile-nav__item appear-animation appear-delay-8 newsletter"><a href="https://joyearbuds.com/pages/subscribe" class="mobile-nav__link">Newsletter</a></li><li class="mobile-nav__item appear-animation appear-delay-9">
1930              <a href="https://joyearbuds.com/customer_authentication/redirect?locale=en&region_country=US" class="mobile-nav__link">Log in</a>
1931            </li><li class="mobile-nav__spacer"></li>
1932      </ul>
1933
1934      <ul class="no-bullets social-icons mobile-nav__social"><li>
1935      <a target="_blank" rel="noopener" href="https://www.instagram.com/joyearbuds/" title="Joy Planet Finland on Instagram">
1936        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-instagram" viewBox="0 0 32 32"><title>instagram</title><path fill="#444" d="M16 3.094c4.206 0 4.7.019 6.363.094 1.538.069 2.369.325 2.925.544.738.287 1.262.625 1.813 1.175s.894 1.075 1.175 1.813c.212.556.475 1.387.544 2.925.075 1.662.094 2.156.094 6.363s-.019 4.7-.094 6.363c-.069 1.538-.325 2.369-.544 2.925-.288.738-.625 1.262-1.175 1.813s-1.075.894-1.813 1.175c-.556.212-1.387.475-2.925.544-1.663.075-2.156.094-6.363.094s-4.7-.019-6.363-.094c-1.537-.069-2.369-.325-2.925-.544-.737-.288-1.263-.625-1.813-1.175s-.894-1.075-1.175-1.813c-.212-.556-.475-1.387-.544-2.925-.075-1.663-.094-2.156-.094-6.363s.019-4.7.094-6.363c.069-1.537.325-2.369.544-2.925.287-.737.625-1.263 1.175-1.813s1.075-.894 1.813-1.175c.556-.212 1.388-.475 2.925-.544 1.662-.081 2.156-.094 6.363-.094zm0-2.838c-4.275 0-4.813.019-6.494.094-1.675.075-2.819.344-3.819.731-1.037.4-1.913.944-2.788 1.819S1.486 4.656 1.08 5.688c-.387 1-.656 2.144-.731 3.825-.
1936075 1.675-.094 2.213-.094 6.488s.019 4.813.094 6.494c.075 1.675.344 2.819.731 3.825.4 1.038.944 1.913 1.819 2.788s1.756 1.413 2.788 1.819c1 .387 2.144.656 3.825.731s2.213.094 6.494.094 4.813-.019 6.494-.094c1.675-.075 2.819-.344 3.825-.731 1.038-.4 1.913-.944 2.788-1.819s1.413-1.756 1.819-2.788c.387-1 .656-2.144.731-3.825s.094-2.212.094-6.494-.019-4.813-.094-6.494c-.075-1.675-.344-2.819-.731-3.825-.4-1.038-.944-1.913-1.819-2.788s-1.756-1.413-2.788-1.819c-1-.387-2.144-.656-3.825-.731C20.812.275 20.275.256 16 .256z"/><path fill="#444" d="M16 7.912a8.088 8.088 0 0 0 0 16.175c4.463 0 8.087-3.625 8.087-8.088s-3.625-8.088-8.088-8.088zm0 13.338a5.25 5.25 0 1 1 0-10.5 5.25 5.25 0 1 1 0 10.5zM26.294 7.594a1.887 1.887 0 1 1-3.774.002 1.887 1.887 0 0 1 3.774-.003z"/></svg>
1937        <span class="icon__fallback-text">Instagram</span>
1938      </a>
1939    </li><li>
1940      <a target="_blank" rel="noopener" href="https://www.facebook.com/JOYearbuds" title="Joy Planet Finland on Facebook">
1941        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-facebook" viewBox="0 0 14222 14222"><path d="M14222 7112c0 3549.352-2600.418 6491.344-6000 7024.72V9168h1657l315-2056H8222V5778c0-562 275-1111 1159-1111h897V2917s-814-139-1592-139c-1624 0-2686 984-2686 2767v1567H4194v2056h1806v4968.72C2600.418 13603.344 0 10661.352 0 7112 0 3184.703 3183.703 1 7111 1s7111 3183.703 7111 7111Zm-8222 7025c362 57 733 86 1111 86-377.945 0-749.003-29.485-1111-86.28Zm2222 0v-.28a7107.458 7107.458 0 0 1-167.717 24.267A7407.158 7407.158 0 0 0 8222 14137Zm-167.717 23.987C7745.664 14201.89 7430.797 14223 7111 14223c319.843 0 634.675-21.479 943.283-62.013Z"/></svg>
1942        <span class="icon__fallback-text">Facebook</span>
1943      </a>
1944    </li></ul>
1945
1946    </div>
1947  </div>
1948</div>
1949  <div id="CartDrawer" class="drawer drawer--right">
1950  
1951    <form id="CartDrawerForm" action="/checkout?locale=en" method="post" novalidate class="drawer__contents" data-location="cart-drawer">
1952      <div class="drawer__fixed-header">
1953        <div class="drawer__header appear-animation appear-delay-1">
1954          <div class="drawer__title">Cart</div>
1955          <div class="drawer__close">
1956            <button type="button" class="drawer__close-button js-drawer-close">
1957              <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg>
1958              <span class="icon__fallback-text">Close cart</span>
1959            </button>
1960          </div>
1961        </div>
1962      </div>
1963
1964      <div class="drawer__inner">
1965        <div class="drawer__scrollable">
1966          <div data-products class="appear-animation appear-delay-2"></div>
1967          
1968          
1969        </div>
1970        
1971            <div id="upsell-slider" class="upsell-slider appear-animation appear-delay-2">
1972                <h5>We also recommend</h5>
1973                <div class="upsell-products"></div>
1974            </div>
1975        
1976        <div class="drawer__footer appear-animation appear-delay-4">
1977          <div data-discounts>
1978            
1979          </div>
1980
1981
1982
1983          <div class="cart__item-sub cart__item-row">
1984            <div class="cart__subtotal">Subtotal</div>
1985            <div data-subtotal>0,00 €</div>
1986          </div>
1987
1988          <div class="cart__item-row cart__savings text-center hide" data-savings></div>
1989
1990          <div class="cart__item-row text-center ajaxcart__note">
1991            <small>
1992              Shipping, taxes, and discount codes calculated at checkout.<br />
1993            </small>
1994          </div>
1995
1996          
1997
1998          <div class="cart__checkout-wrapper">
1999            <button type="submit" name="checkout" data-terms-required="false" class="btn cart__checkout">
2000              Check out
2001            </button>
2002
2003            
2004          </div>
2005        </div>
2006      </div>
2007
2008      <div class="drawer__cart-empty appear-animation appear-delay-2">
2009        <div class="drawer__scrollable">
2010          Your cart is currently empty.
2011        </div>
2012      </div>
2013    </form>
2014
2015
2016  </div>
2017
2018<style data-shopify>.site-nav__link,
2019  .site-nav__dropdown-link {
2020    font-size: 18px;
2021  }.site-header {
2022      border-bottom: 1px solid;
2023      border-bottom-color: #e8e8e1;
2024    }</style><div data-section-id="sections--21527965565270__header" data-section-type="header">
2025  <div id="HeaderWrapper" class="header-wrapper">
2026    <header
2027      id="SiteHeader"
2028      class="site-header"
2029      data-sticky="true"
2030      data-overlay="false">
2031      <div class="page-width">
2032        <div
2033          class="header-layout header-layout--center-drawer"
2034          data-logo-align="center"><div class="header-item header-item--left header-item--navigation" role="navigation" aria-label="Primary"><div class="site-nav">
2035                <button
2036                  type="button"
2037                  class="site-nav__link site-nav__link--icon js-drawer-open-nav"
2038                  aria-controls="NavDrawer">
2039                  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-hamburger" viewBox="0 0 64 64"><title>icon-hamburger</title><path d="M7 15h51M7 32h43M7 49h51"/></svg>
2040                  <span class="icon__fallback-text">Site navigation</span>
2041                </button>
2042              </div><style data-shopify>.lang-pill { position: relative; display: inline-flex; }
2043      .lang-pill__form { margin: 0; display: inline-flex; }
2044
2045      .lang-pill__toggle {
2046        display: inline-flex;
2047        align-items: center;
2048        gap: 7px;
2049        padding: 6px 10px 6px 9px;
2050        margin: 0;
2051        border: 1px solid rgba(0, 0, 0, 0.14);
2052        border-radius: 999px;
2053        background: transparent;
2054        color: inherit;
2055        font: inherit;
2056        font-size: 12px;
2057        font-weight: 600;
2058        letter-spacing: 0.04em;
2059        line-height: 1;
2060        cursor: pointer;
2061        transition: border-color 0.18s ease, background-color 0.18s ease;
2062      }
2063      .lang-pill__toggle:hover { border-color: rgba(0, 0, 0, 0.34); background: rgba(0, 0, 0, 0.03); }
2064      .lang-pill__toggle:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }
2065
2066      .lang-pill__chev {
2067        width: 9px; height: 9px;
2068        flex-shrink: 0;
2069        opacity: 0.55;
2070        transition: transform 0.2s ease;
2071      }
2072      .lang-pill__toggle[aria-expanded="true"] .lang-pill__chev { transform: rotate(180deg); }
2073
2074      .lang-flag {
2075        display: block;
2076        width: 18px; height: 12px;
2077        flex-shrink: 0;
2078        border-radius: 2px;
2079        overflow: hidden;
2080        box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.09);
2081      }
2082      .lang-flag svg { display: block; width: 100%; height: 100%; }
2083
2084      .lang-pill__list {
2085        position: absolute;
2086        top: calc(100% + 8px);
2087        z-index: 60;
2088        min-width: 172px;
2089        margin: 0;
2090        padding: 6px;
2091        list-style: none;
2092        background: #fff;
2093        color: #111;
2094        border-radius: 14px;
2095        box-shadow: 0 10px 30px rgba(0, 0, 0, 0.14), 0 1px 3px rgba(0, 0, 0, 0.08);
2096        opacity: 0;
2097        visibility: hidden;
2098        transform: translateY(-4px);
2099        transition: opacity 0.16s ease, transform 0.16s ease, visibility 0.16s;
2100      }
2101      .lang-pill__list--right { right: 0; }
2102      .lang-pill__list--left  { left: 0; }
2103      .lang-pill.is-open .lang-pill__list { opacity: 1; visibility: visible; transform: translateY(0); }
2104
2105      .lang-pill__option {
2106        display: flex;
2107        align-items: center;
2108        gap: 9px;
2109        width: 100%;
2110        padding: 8px 10px;
2111        border: 0;
2112        border-radius: 9px;
2113        background: transparent;
2114        color: inherit;
2115        font: inherit;
2116        font-size: 13px;
2117        line-height: 1.2;
2118        text-align: left;
2119        cursor: pointer;
2120      }
2121      .lang-pill__option:hover { background: rgba(0, 0, 0, 0.05); }
2122      .lang-pill__option.is-current { font-weight: 700; }
2123      .lang-pill__check { width: 12px; height: 12px; margin-left: auto; opacity: 0; flex-shrink: 0; }
2124      .lang-pill__option.is-current .lang-pill__check { opacity: 1; }
2125
2126      /* Vaalea teksti läpinäkyvän/overlay-headerin päällä */
2127      .header-wrapper--overlay.is-light .lang-pill__toggle { border-color: rgba(255, 255, 255, 0.4); }
2128      .header-wrapper--overlay.is-light .lang-pill__toggle:hover { border-color: rgba(255, 255, 255, 0.75); background: rgba(255, 255, 255, 0.1); }
2129
2130      /* --- Mobiili: kompakti pelkkä lippu + chevron, dropdown säilyy --- */
2131      @media screen and (max-width: 768px) {
2132        .lang-pill__toggle { gap: 4px; padding: 5px 7px; }
2133        .lang-pill__code { display: none; }
2134        .lang-pill__list { min-width: 168px; top: calc(100% + 10px); }
2135        .lang-pill__option { padding: 11px 10px; font-size: 14px; }
2136      }
2137
2138      /* Header ei saa leikata pudotusvalikkoa */
2139      .header-wrapper,
2140      .site-header,
2141      .header-layout,
2142      .header-item--icons,
2143      .site-nav--icons,
2144      .site-nav__icons { overflow: visible; }
2145
2146      /* Valitsin headerin ikonirivissä */
2147      .site-nav__icons .lang-pill-wrap { display: inline-flex; align-items: center; padding: 0 6px; }
2148
2149      @media (prefers-reduced-motion: reduce) {
2150        .lang-pill__list, .lang-pill__chev { transition: none; }
2151      }</style><div class="lang-pill" data-lang-pill><form method="post" action="/localization" id="localization_form" accept-charset="UTF-8" class="lang-pill__form" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="✓" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/products/tinys-earbuds-desinged-for-women-joy-friends-club" /><button
2152        type="button"
2153        class="lang-pill__toggle"
2154        aria-expanded="false"
2155        aria-haspopup="listbox"
2156        aria-controls="LangPill-sections--21527965565270__header-list"
2157        aria-label="Language"
2158        data-lang-toggle><span class="lang-flag" aria-hidden="true"><svg viewBox="0 0 18 12" xmlns="http://www.w3.org/2000/svg"><rect width="18" height="12" fill="#012169"/><path d="M0 0l18 12M18 0L0 12" stroke="#fff" stroke-width="2.4"/><path d="M0 0l18 12M18 0L0 12" stroke="#C8102E" stroke-width="1.1"/><path d="M9 0v12M0 6h18" stroke="#fff" stroke-width="4"/><path d="M9 0v12M0 6h18" stroke="#C8102E" stroke-width="2.2"/></svg></span><span class="lang-pill__code">EN</span><svg class="lang-pill__chev" viewBox="0 0 10 6" fill="none" aria-hidden="true">
2159          <path d="M1 1l4 4 4-4" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
2160        </svg>
2161      </button>
2162
2163      <ul id="LangPill-sections--21527965565270__header-list" class="lang-pill__list lang-pill__list--right" role="listbox" data-lang-list><li role="none">
2164            <button
2165              type="submit"
2166              name="locale_code"
2167              value="en"
2168              role="option"
2169              lang="en"
2170              aria-selected="true"
2171              class="lang-pill__option is-current"><span class="lang-flag" aria-hidden="true"><svg viewBox="0 0 18 12" xmlns="http://www.w3.org/2000/svg"><rect width="18" height="12" fill="#012169"/><path d="M0 0l18 12M18 0L0 12" stroke="#fff" stroke-width="2.4"/><path d="M0 0l18 12M18 0L0 12" stroke="#C8102E" stroke-width="1.1"/><path d="M9 0v12M0 6h18" stroke="#fff" stroke-width="4"/><path d="M9 0v12M0 6h18" stroke="#C8102E" stroke-width="2.2"/></svg></span><span>English</span>
2172              <svg class="lang-pill__check" viewBox="0 0 12 12" fill="none" aria-hidden="true">
2173                <path d="M1.5 6.2l3 3 6-6.4" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
2174              </svg>
2175            </button>
2176          </li><li role="none">
2177            <button
2178              type="submit"
2179              name="locale_code"
2180              value="fi"
2181              role="option"
2182              lang="fi"
2183              
2184              class="lang-pill__option"><span class="lang-flag" aria-hidden="true"><svg viewBox="0 0 18 12" xmlns="http://www.w3.org/2000/svg"><rect width="18" height="12" fill="#fff"/><rect x="5" width="3.6" height="12" fill="#003580"/><rect y="4.2" width="18" height="3.6" fill="#003580"/></svg></span><span>Suomi</span>
2185              <svg class="lang-pill__check" viewBox="0 0 12 12" fill="none" aria-hidden="true">
2186                <path d="M1.5 6.2l3 3 6-6.4" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
2187              </svg>
2188            </button>
2189          </li><li role="none">
2190            <button
2191              type="submit"
2192              name="locale_code"
2193              value="de"
2194              role="option"
2195              lang="de"
2196              
2197              class="lang-pill__option"><span class="lang-flag" aria-hidden="true"><svg viewBox="0 0 18 12" xmlns="http://www.w3.org/2000/svg"><rect width="18" height="4" fill="#000"/><rect y="4" width="18" height="4" fill="#DD0000"/><rect y="8" width="18" height="4" fill="#FFCE00"/></svg></span><span>Deutsch</span>
2198              <svg class="lang-pill__check" viewBox="0 0 12 12" fill="none" aria-hidden="true">
2199                <path d="M1.5 6.2l3 3 6-6.4" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
2200              </svg>
2201            </button>
2202          </li></ul></form></div>
2203
2204  
2204<script>
2205    (function () {
2206      if (window.__langPillInit) return;
2207      window.__langPillInit = true;
2208
2209      function closeAll(except) {
2210        document.querySelectorAll('[data-lang-pill].is-open').forEach(function (el) {
2211          if (el === except) return;
2212          el.classList.remove('is-open');
2213          var t = el.querySelector('[data-lang-toggle]');
2214          if (t) t.setAttribute('aria-expanded', 'false');
2215        });
2216      }
2217
2218      document.addEventListener('click', function (e) {
2219        var toggle = e.target.closest('[data-lang-toggle]');
2220        if (toggle) {
2221          var pill = toggle.closest('[data-lang-pill]');
2222          var open = pill.classList.toggle('is-open');
2223          toggle.setAttribute('aria-expanded', open ? 'true' : 'false');
2224          closeAll(pill);
2225          return;
2226        }
2227        if (!e.target.closest('[data-lang-pill]')) closeAll();
2228      });
2229
2230      document.addEventListener('keydown', function (e) {
2231        if (e.key === 'Escape') closeAll();
2232      });
2233    })();
2234  </script>
2234</div><div class="header-item header-item--logo"><style data-shopify>.header-item--logo,
2235  .header-layout--left-center .header-item--logo,
2236  .header-layout--left-center .header-item--icons {
2237    -webkit-box-flex: 0 1 100px;
2238    -ms-flex: 0 1 100px;
2239    flex: 0 1 100px;
2240  }
2241
2242  @media only screen and (min-width: 769px) {
2243    .header-item--logo,
2244    .header-layout--left-center .header-item--logo,
2245    .header-layout--left-center .header-item--icons {
2246      -webkit-box-flex: 0 0 100px;
2247      -ms-flex: 0 0 100px;
2248      flex: 0 0 100px;
2249    }
2250  }
2251
2252  .site-header__logo a {
2253    max-width: 100px;
2254  }
2255  .is-light .site-header__logo .logo--inverted {
2256    max-width: 100px;
2257  }
2258  @media only screen and (min-width: 769px) {
2259    .site-header__logo a {
2260      max-width: 100px;
2261    }
2262
2263    .is-light .site-header__logo .logo--inverted {
2264      max-width: 100px;
2265    }
2266  }</style><div id="LogoContainer" class="h1 site-header__logo" itemscope itemtype="http://schema.org/Organization">
2267  <a
2268    href="/"
2269    itemprop="url"
2270    class="site-header__logo-link logo--has-inverted"
2271    style="padding-top: 38.80597014925373%">
2272
2273    
2274
2275
2276
2277
2278
2279<image-element data-aos="image-fade-in" data-aos-offset="150">
2280
2281
2282  
2283    
2284    <img src="//joyearbuds.com/cdn/shop/files/logo-black.svg?v=1742390067&amp;width=200" alt="" srcset="//joyearbuds.com/cdn/shop/files/logo-black.svg?v=1742390067&amp;width=100 100w, //joyearbuds.com/cdn/shop/files/logo-black.svg?v=1742390067&amp;width=200 200w" width="100" height="38.80597014925373" loading="eager" class="small--hide image-element" sizes="100px" itemprop="logo" style="max-height: 38.80597014925373px;max-width: 100px;">
2285  
2286
2287
2288</image-element>
2289
2290
2291
2292
2293
2294
2295<image-element data-aos="image-fade-in" data-aos-offset="150">
2296
2297
2298  
2299    
2300    <img src="//joyearbuds.com/cdn/shop/files/logo-black.svg?v=1742390067&amp;width=200" alt="" srcset="//joyearbuds.com/cdn/shop/files/logo-black.svg?v=1742390067&amp;width=100 100w, //joyearbuds.com/cdn/shop/files/logo-black.svg?v=1742390067&amp;width=200 200w" width="100" height="38.80597014925373" loading="eager" class="medium-up--hide image-element" sizes="100px" style="max-height: 38.80597014925373px;max-width: 100px;">
2301  
2302
2303
2304</image-element>
2305
2306
2307</a><a
2308      href="/"
2309      itemprop="url"
2310      class="site-header__logo-link logo--inverted"
2311      style="padding-top: 38.80597014925373%">
2312
2313      
2314
2315
2316
2317
2318
2319<image-element data-aos="image-fade-in" data-aos-offset="150">
2320
2321
2322  
2323    
2324    <img src="//joyearbuds.com/cdn/shop/files/logo-white.svg?v=1742390039&amp;width=200" alt="" srcset="//joyearbuds.com/cdn/shop/files/logo-white.svg?v=1742390039&amp;width=100 100w, //joyearbuds.com/cdn/shop/files/logo-white.svg?v=1742390039&amp;width=200 200w" width="100" height="38.80597014925373" loading="eager" class="small--hide image-element" sizes="100px" itemprop="logo" style="max-height: 38.80597014925373px;max-width: 100px;">
2325  
2326
2327
2328</image-element>
2329
2330
2331
2332
2333
2334
2335<image-element data-aos="image-fade-in" data-aos-offset="150">
2336
2337
2338  
2339    
2340    <img src="//joyearbuds.com/cdn/shop/files/logo-white.svg?v=1742390039&amp;width=200" alt="" srcset="//joyearbuds.com/cdn/shop/files/logo-white.svg?v=1742390039&amp;width=100 100w, //joyearbuds.com/cdn/shop/files/logo-white.svg?v=1742390039&amp;width=200 200w" width="100" height="38.80597014925373" loading="eager" class="medium-up--hide image-element" sizes="100px" style="max-height: 38.80597014925373px;max-width: 100px;">
2341  
2342
2343
2344</image-element>
2345
2346
2347</a></div></div><div class="header-item header-item--icons"><div class="site-nav site-nav--icons">
2348   <div class="site-nav__link site-nav__link--icon">
2349  
2350  <div class="site-nav__icons">
2351    
2352      <a class="site-nav__link site-nav__link--icon medium-down--hide" href="/account">
2353        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-user" viewBox="0 0 64 64"><title>account</title><path d="M35 39.84v-2.53c3.3-1.91 6-6.66 6-11.41 0-7.63 0-13.82-9-13.82s-9 6.19-9 13.82c0 4.75 2.7 9.51 6 11.41v2.53c-10.18.85-18 6-18 12.16h42c0-6.19-7.82-11.31-18-12.16Z"/></svg>
2354        <span class="icon__fallback-text">
2355          
2356            Log in
2357          
2358        </span>
2359      </a>
2360    
2361
2362    
2363      <a href="/search" class="site-nav__link site-nav__link--icon js-search-header js-no-transition">
2364        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-search" viewBox="0 0 64 64"><title>icon-search</title><path d="M47.16 28.58A18.58 18.58 0 1 1 28.58 10a18.58 18.58 0 0 1 18.58 18.58ZM54 54 41.94 42"/></svg>
2365        <span class="icon__fallback-text">Search</span>
2366      </a>
2367    
2368
2369    
2370
2371    <a href="/cart" class="site-nav__link site-nav__link--icon js-drawer-open-cart js-no-transition" aria-controls="CartDrawer" data-icon="cart">
2372      <span class="cart-link"><svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-cart" viewBox="0 0 64 64"><title>icon-cart</title><path d="M14 17.44h46.79l-7.94 25.61H20.96l-9.65-35.1H3"/><circle cx="27" cy="53" r="2"/><circle cx="47" cy="53" r="2"/></svg><span class="icon__fallback-text">Cart</span>
2373        <span class="cart-link__bubble"></span>
2374      </span>
2375    </a>
2376  </div>
2377</div>
2378</div>
2379        </div></div>
2380      <div class="site-header__search-container">
2381        <div class="site-header__search">
2382          <div class="page-width">
2383            <predictive-search data-context="header" data-enabled="true" data-dark="false">
2384  <div class="predictive__screen" data-screen></div>
2385  <form action="/search" method="get" role="search">
2386    <label for="Search" class="hidden-label">Search</label>
2387    <div class="search__input-wrap">
2388      <input
2389        class="search__input"
2390        id="Search"
2391        type="search"
2392        name="q"
2393        value=""
2394        role="combobox"
2395        aria-expanded="false"
2396        aria-owns="predictive-search-results"
2397        aria-controls="predictive-search-results"
2398        aria-haspopup="listbox"
2399        aria-autocomplete="list"
2400        autocorrect="off"
2401        autocomplete="off"
2402        autocapitalize="off"
2403        spellcheck="false"
2404        placeholder="Search"
2405        tabindex="0"
2406      >
2407      <input name="options[prefix]" type="hidden" value="last">
2408      <button class="btn--search" type="submit">
2409        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-search" viewBox="0 0 64 64"><defs><style>.cls-1{fill:none;stroke:#000;stroke-miterlimit:10;stroke-width:2px}</style></defs><path class="cls-1" d="M47.16 28.58A18.58 18.58 0 1 1 28.58 10a18.58 18.58 0 0 1 18.58 18.58zM54 54L41.94 42"/></svg>
2410        <span class="icon__fallback-text">Search</span>
2411      </button>
2412    </div>
2413
2414    <button class="btn--close-search">
2415      <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><defs><style>.cls-1{fill:none;stroke:#000;stroke-miterlimit:10;stroke-width:2px}</style></defs><path class="cls-1" d="M19 17.61l27.12 27.13m0-27.13L19 44.74"/></svg>
2416    </button>
2417    <div id="predictive-search" class="search__results" tabindex="-1"></div>
2418  </form>
2419</predictive-search>
2420
2421          </div>
2422        </div>
2423      </div>
2424    </header>
2425  </div>
2426</div>
2427<style> #shopify-section-sections--21527965565270__header ul.mobile-nav > li.mobile-nav__item.appear-animation.appear-delay-9.joy-omalla-logolla > a {font-size: 16px;} </style></div><div id="shopify-section-sections--21527965565270__announcement-bar" class="shopify-section shopify-section-group-header-group"><div class="announcement">
2428
2429
2430
2431  
2432
2433  
2434
2435
2436  
2437</div>
2438
2439
2440
2441<style data-shopify>
2442.announcement {
2443  padding-top: 0px;
2444}
2445</style></div>
2446<!-- END sections: header-group --><!-- BEGIN sections: popup-group -->
2447
2448<!-- END sections: popup-group --><main class="main-content" id="MainContent">
2449        <div class="lp-2026"><div id="shopify-section-template--31561534275926__product_new_RapwTf" class="shopify-section cpc-wrapper"><div id="cpc-template--31561534275926__product_new_RapwTf" class="cpc" data-section-id="template--31561534275926__product_new_RapwTf" data-discount=""
2450  data-soldout-text="SOLD OUT" data-soldout-cta="Loppuunmyyty"
2451  data-low-threshold="10" data-low-text="Vain [n] jäljellä"
2452  data-presale-cta="Pre-order" data-combo-text="Tätä yhdistelmää ei ole"><div class="cpc__visual">
2453    <div class="cpc__product-wrap"><div class="cpc__soldout-flag" id="cpc-soldout-template--31561534275926__product_new_RapwTf" hidden>SOLD OUT</div><img src="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205&amp;width=900" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205&amp;width=480 480w, //joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205&amp;width=600 600w, //joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205&amp;width=900 900w" width="900" height="900" loading="eager" class="cpc__main-img" id="cpc-main-img-template--31561534275926__product_new_RapwTf" fetchpriority="high" sizes="(max-width: 960px) 90vw, 50vw">
2454<div class="cpc__carousel" id="cpc-carousel-template--31561534275926__product_new_RapwTf">
2455        <button class="cpc__carousel-arrow cpc__carousel-arrow--prev" id="cpc-prev-template--31561534275926__product_new_RapwTf" type="button" aria-label="Edellinen kuva">
2456          <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="15 18 9 12 15 6"/></svg>
2457        </button>
2458        <div class="cpc__thumbs" id="cpc-thumbs-template--31561534275926__product_new_RapwTf" role="list" aria-label="Tuotekuvat"><button
2459            class="cpc__thumb cpc__thumb--active"
2460            type="button"
2461            role="listitem"
2462            aria-label="Kuva 1"
2463            data-full="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205&width=900"
2464            data-srcset="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205&width=480 480w, //joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205&width=900 900w"
2465            data-index="0"
2466          >
2467            <img src="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2468          </button><button
2469            class="cpc__thumb"
2470            type="button"
2471            role="listitem"
2472            aria-label="Kuva 2"
2473            data-full="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_27_2026_Delete_all_text.png?v=1779962850&width=900"
2474            data-srcset="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_27_2026_Delete_all_text.png?v=1779962850&width=480 480w, //joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_27_2026_Delete_all_text.png?v=1779962850&width=900 900w"
2475            data-index="1"
2476          >
2477            <img src="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_27_2026_Delete_all_text.png?v=1779962850&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_27_2026_Delete_all_text.png?v=1779962850&amp;width=160 160w" width="160" height="156" class="cpc__thumb-img">
2478          </button><button
2479            class="cpc__thumb"
2480            type="button"
2481            role="listitem"
2482            aria-label="Kuva 3"
2483            data-full="//joyearbuds.com/cdn/shop/files/1_50a6ac3e-56e8-43e3-b4bd-cfe325f8be6f.png?v=1779962834&width=900"
2484            data-srcset="//joyearbuds.com/cdn/shop/files/1_50a6ac3e-56e8-43e3-b4bd-cfe325f8be6f.png?v=1779962834&width=480 480w, //joyearbuds.com/cdn/shop/files/1_50a6ac3e-56e8-43e3-b4bd-cfe325f8be6f.png?v=1779962834&width=900 900w"
2485            data-index="2"
2486          >
2487            <img src="//joyearbuds.com/cdn/shop/files/1_50a6ac3e-56e8-43e3-b4bd-cfe325f8be6f.png?v=1779962834&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/1_50a6ac3e-56e8-43e3-b4bd-cfe325f8be6f.png?v=1779962834&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2488          </button><button
2489            class="cpc__thumb"
2490            type="button"
2491            role="listitem"
2492            aria-label="Kuva 4"
2493            data-full="//joyearbuds.com/cdn/shop/files/2_5d3c594c-47d4-445e-9b74-80ead40f1514.png?v=1779962942&width=900"
2494            data-srcset="//joyearbuds.com/cdn/shop/files/2_5d3c594c-47d4-445e-9b74-80ead40f1514.png?v=1779962942&width=480 480w, //joyearbuds.com/cdn/shop/files/2_5d3c594c-47d4-445e-9b74-80ead40f1514.png?v=1779962942&width=900 900w"
2495            data-index="3"
2496          >
2497            <img src="//joyearbuds.com/cdn/shop/files/2_5d3c594c-47d4-445e-9b74-80ead40f1514.png?v=1779962942&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/2_5d3c594c-47d4-445e-9b74-80ead40f1514.png?v=1779962942&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2498          </button><button
2499            class="cpc__thumb"
2500            type="button"
2501            role="listitem"
2502            aria-label="Kuva 5"
2503            data-full="//joyearbuds.com/cdn/shop/files/black_buds_transparent_1.png?v=1776769855&width=900"
2504            data-srcset="//joyearbuds.com/cdn/shop/files/black_buds_transparent_1.png?v=1776769855&width=480 480w, //joyearbuds.com/cdn/shop/files/black_buds_transparent_1.png?v=1776769855&width=900 900w"
2505            data-index="4"
2506          >
2507            <img src="//joyearbuds.com/cdn/shop/files/black_buds_transparent_1.png?v=1776769855&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/black_buds_transparent_1.png?v=1776769855&amp;width=160 160w" width="160" height="159" class="cpc__thumb-img">
2508          </button><button
2509            class="cpc__thumb"
2510            type="button"
2511            role="listitem"
2512            aria-label="Kuva 6"
2513            data-full="//joyearbuds.com/cdn/shop/files/3_654fec4f-4a97-402e-b
2513c52-b36b89ed0da2.png?v=1779962833&width=900"
2514            data-srcset="//joyearbuds.com/cdn/shop/files/3_654fec4f-4a97-402e-bc52-b36b89ed0da2.png?v=1779962833&width=480 480w, //joyearbuds.com/cdn/shop/files/3_654fec4f-4a97-402e-bc52-b36b89ed0da2.png?v=1779962833&width=900 900w"
2515            data-index="5"
2516          >
2517            <img src="//joyearbuds.com/cdn/shop/files/3_654fec4f-4a97-402e-bc52-b36b89ed0da2.png?v=1779962833&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/3_654fec4f-4a97-402e-bc52-b36b89ed0da2.png?v=1779962833&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2518          </button><button
2519            class="cpc__thumb"
2520            type="button"
2521            role="listitem"
2522            aria-label="Kuva 7"
2523            data-full="//joyearbuds.com/cdn/shop/products/PhotoRoom-20220726_171617_fe67b567-4b9e-48b7-b85c-e1b289a252e0.png?v=1776769855&width=900"
2524            data-srcset="//joyearbuds.com/cdn/shop/products/PhotoRoom-20220726_171617_fe67b567-4b9e-48b7-b85c-e1b289a252e0.png?v=1776769855&width=480 480w, //joyearbuds.com/cdn/shop/products/PhotoRoom-20220726_171617_fe67b567-4b9e-48b7-b85c-e1b289a252e0.png?v=1776769855&width=900 900w"
2525            data-index="6"
2526          >
2527            <img src="//joyearbuds.com/cdn/shop/products/PhotoRoom-20220726_171617_fe67b567-4b9e-48b7-b85c-e1b289a252e0.png?v=1776769855&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/products/PhotoRoom-20220726_171617_fe67b567-4b9e-48b7-b85c-e1b289a252e0.png?v=1776769855&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2528          </button><button
2529            class="cpc__thumb"
2530            type="button"
2531            role="listitem"
2532            aria-label="Kuva 8"
2533            data-full="//joyearbuds.com/cdn/shop/files/PinkkiKotelo.png?v=1776769855&width=900"
2534            data-srcset="//joyearbuds.com/cdn/shop/files/PinkkiKotelo.png?v=1776769855&width=480 480w, //joyearbuds.com/cdn/shop/files/PinkkiKotelo.png?v=1776769855&width=900 900w"
2535            data-index="7"
2536          >
2537            <img src="//joyearbuds.com/cdn/shop/files/PinkkiKotelo.png?v=1776769855&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/PinkkiKotelo.png?v=1776769855&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2538          </button><button
2539            class="cpc__thumb"
2540            type="button"
2541            role="listitem"
2542            aria-label="Kuva 9"
2543            data-full="//joyearbuds.com/cdn/shop/files/pink_3f59b54d-59e0-4972-bef4-45616984d816.png?v=1776769855&width=900"
2544            data-srcset="//joyearbuds.com/cdn/shop/files/pink_3f59b54d-59e0-4972-bef4-45616984d816.png?v=1776769855&width=480 480w, //joyearbuds.com/cdn/shop/files/pink_3f59b54d-59e0-4972-bef4-45616984d816.png?v=1776769855&width=900 900w"
2545            data-index="8"
2546          >
2547            <img src="//joyearbuds.com/cdn/shop/files/pink_3f59b54d-59e0-4972-bef4-45616984d816.png?v=1776769855&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/pink_3f59b54d-59e0-4972-bef4-45616984d816.png?v=1776769855&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2548          </button><button
2549            class="cpc__thumb"
2550            type="button"
2551            role="listitem"
2552            aria-label="Kuva 10"
2553            data-full="//joyearbuds.com/cdn/shop/files/4_3c6a5910-dfa3-4a19-8d54-61d6db19a4c5.png?v=1779962833&width=900"
2554            data-srcset="//joyearbuds.com/cdn/shop/files/4_3c6a5910-dfa3-4a19-8d54-61d6db19a4c5.png?v=1779962833&width=480 480w, //joyearbuds.com/cdn/shop/files/4_3c6a5910-dfa3-4a19-8d54-61d6db19a4c5.png?v=1779962833&width=900 900w"
2555            data-index="9"
2556          >
2557            <img src="//joyearbuds.com/cdn/shop/files/4_3c6a5910-dfa3-4a19-8d54-61d6db19a4c5.png?v=1779962833&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/4_3c6a5910-dfa3-4a19-8d54-61d6db19a4c5.png?v=1779962833&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2558          </button><button
2559            class="cpc__thumb"
2560            type="button"
2561            role="listitem"
2562            aria-label="Kuva 11"
2563            data-full="//joyearbuds.com/cdn/shop/files/black_1_b576a09d-169e-4603-b
25636ad-98353c1a5fea.png?v=1776769855&width=900"
2564            data-srcset="//joyearbuds.com/cdn/shop/files/black_1_b576a09d-169e-4603-b6ad-98353c1a5fea.png?v=1776769855&width=480 480w, //joyearbuds.com/cdn/shop/files/black_1_b576a09d-169e-4603-b6ad-98353c1a5fea.png?v=1776769855&width=900 900w"
2565            data-index="10"
2566          >
2567            <img src="//joyearbuds.com/cdn/shop/files/black_1_b576a09d-169e-4603-b6ad-98353c1a5fea.png?v=1776769855&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/black_1_b576a09d-169e-4603-b6ad-98353c1a5fea.png?v=1776769855&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2568          </button><button
2569            class="cpc__thumb"
2570            type="button"
2571            role="listitem"
2572            aria-label="Kuva 12"
2573            data-full="//joyearbuds.com/cdn/shop/files/WhatsApp_Image_2025-05-07_at_12.48.32_1.jpg?v=1776769855&width=900"
2574            data-srcset="//joyearbuds.com/cdn/shop/files/WhatsApp_Image_2025-05-07_at_12.48.32_1.jpg?v=1776769855&width=480 480w, //joyearbuds.com/cdn/shop/files/WhatsApp_Image_2025-05-07_at_12.48.32_1.jpg?v=1776769855&width=900 900w"
2575            data-index="11"
2576          >
2577            <img src="//joyearbuds.com/cdn/shop/files/WhatsApp_Image_2025-05-07_at_12.48.32_1.jpg?v=1776769855&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/WhatsApp_Image_2025-05-07_at_12.48.32_1.jpg?v=1776769855&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2578          </button><button
2579            class="cpc__thumb"
2580            type="button"
2581            role="listitem"
2582            aria-label="Kuva 13"
2583            data-full="//joyearbuds.com/cdn/shop/files/white_buds_transparent.png?v=1776769855&width=900"
2584            data-srcset="//joyearbuds.com/cdn/shop/files/white_buds_transparent.png?v=1776769855&width=480 480w, //joyearbuds.com/cdn/shop/files/white_buds_transparent.png?v=1776769855&width=900 900w"
2585            data-index="12"
2586          >
2587            <img src="//joyearbuds.com/cdn/shop/files/white_buds_transparent.png?v=1776769855&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/white_buds_transparent.png?v=1776769855&amp;width=160 160w" width="160" height="154" class="cpc__thumb-img">
2588          </button><button
2589            class="cpc__thumb"
2590            type="button"
2591            role="listitem"
2592            aria-label="Kuva 14"
2593            data-full="//joyearbuds.com/cdn/shop/files/42_615c91ae-ee7c-453f-b77a-75ecd556c676.png?v=1776769855&width=900"
2594            data-srcset="//joyearbuds.com/cdn/shop/files/42_615c91ae-ee7c-453f-b77a-75ecd556c676.png?v=1776769855&width=480 480w, //joyearbuds.com/cdn/shop/files/42_615c91ae-ee7c-453f-b77a-75ecd556c676.png?v=1776769855&width=900 900w"
2595            data-index="13"
2596          >
2597            <img src="//joyearbuds.com/cdn/shop/files/42_615c91ae-ee7c-453f-b77a-75ecd556c676.png?v=1776769855&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/42_615c91ae-ee7c-453f-b77a-75ecd556c676.png?v=1776769855&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2598          </button><button
2599            class="cpc__thumb"
2600            type="button"
2601            role="listitem"
2602            aria-label="Kuva 15"
2603            data-full="//joyearbuds.com/cdn/shop/files/pink_buds_transparent_1_1.png?v=1776769855&width=900"
2604            data-srcset="//joyearbuds.com/cdn/shop/files/pink_buds_transparent_1_1.png?v=1776769855&width=480 480w, //joyearbuds.com/cdn/shop/files/pink_buds_transparent_1_1.png?v=1776769855&width=900 900w"
2605            data-index="14"
2606          >
2607            <img src="//joyearbuds.com/cdn/shop/files/pink_buds_transparent_1_1.png?v=1776769855&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/pink_buds_transparent_1_1.png?v=1776769855&amp;width=160 160w" width="160" height="174" class="cpc__thumb-img">
2608          </button><button
2609            class="cpc__thumb"
2610            type="button"
2611            role="listitem"
2612            aria-label="Kuva 16"
2613            data-full="//joyearbuds.com/cdn/shop/files/43_5766c3bd-ab34-43e3-80d0-690c6aaa3912.png?v=1776769855&width=900"
2614            data-srcset="//joyearbuds.com/cdn/shop/files/43_5766c3bd-ab34-43e3-80d0-690c6aaa3912.png?v=1776769855&width=480 480w, //joyearbuds.com/cdn/shop/files/43_5766c3bd-ab34-43e3-80d0-690c6aaa3912.png?v=1776769855&width=900 900w"
2615            data-index="15"
2616          >
2617            <img src="//joyearbuds.com/cdn/shop/files/43_5766c3bd-ab34-43e3-80d0-690c6aaa3912.png?v=1776769855&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/43_5766c3bd-ab34-43e3-80d0-690c6aaa3912.png?v=1776769855&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2618          </button><button
2619            class="cpc__thumb"
2620            type="button"
2621            role="listitem"
2622            aria-label="Kuva 17"
2623            data-full="//joyearbuds.com/cdn/shop/files/TINYS_28.png?v=1773758930&width=900"
2624            data-srcset="//joyearbuds.com/cdn/shop/files/TINYS_28.png?v=1773758930&width=480 480w, //joyearbuds.com/cdn/shop/files/TINYS_28.png?v=1773758930&width=900 900w"
2625            data-index="16"
2626          >
2627            <img src="//joyearbuds.com/cdn/shop/files/TINYS_28.png?v=1773758930&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/TINYS_28.png?v=1773758930&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2628          </button><button
2629            class="cpc__thumb"
2630            type="button"
2631            role="listitem"
2632            aria-label="Kuva 18"
2633            data-full="//joyearbuds.com/cdn/shop/files/TINYS_9.png?v=1766923740&width=900"
2634            data-srcset="//joyearbuds.com/cdn/shop/files/TINYS_9.png?v=1766923740&width=480 480w, //joyearbuds.com/cdn/shop/files/TINYS_9.png?v=1766923740&width=900 900w"
2635            data-index="17"
2636          >
2637            <img src="//joyearbuds.com/cdn/shop/files/TINYS_9.png?v=1766923740&amp;width=160" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/TINYS_9.png?v=1766923740&amp;width=160 160w" width="160" height="160" class="cpc__thumb-img">
2638          </button></div>
2639        <button class="cpc__carousel-arrow cpc__carousel-arrow--next" id="cpc-next-template--31561534275926__product_new_RapwTf" type="button" aria-label="Seuraava kuva">
2640          <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"/></svg>
2641        </button>
2642      </div></div>
2643  </div><div class="cpc__offer">
2644
2645    <input type="hidden" id="cpc-main-template--31561534275926__product_new_RapwTf" value="54276348870998"><div class="cpc__camp-tag" >Earbuds designes for small ears</div><div id="shopify-block-AemNaV2MxQ2VGc3Bne__loox_reviews_loox_rating_Dz7qna" class="shopify-block shopify-app-block">
2646
2647  <a  href="#looxReviewsFrame"  aria-label="Scroll to reviews">
2648    <div class="loox-rating loox-widget"
2649       data-content-size="16" 
2650      
2651      
2652      
2653      
2654
2655      
2656
2657      data-loox-block-id="AemNaV2MxQ2VGc3Bne__loox_reviews_loox_rating_Dz7qna"
2658      
2659      
2660
2661       
2662       data-color-text="" 
2663
2664       
2665       data-color-star="" 
2666
2667      
2668          data-id="10882379907414"
2669          data-rating="4.7"
2670          data-raters="481"
2671      
2672      data-testid="loox-rating-widget"
2673    ></div>
2674  </a>
2675
2676
2677
2678</div>
2679<h1 class="cpc__h1" >
2680            TinyS®
2681</h1><p class="cpc__sub">Smallest earbuds on the market, made for a woman's ear. They stay put — on a run, at work, all day. Premium HiFi sound and 7 tip sizes for the perfect fit.</p><div class="cpc__price"  data-badge-tpl="Save [pct] %">
2682            <span class="cpc__price-now" data-wg-notranslate>159,00 €</span>
2683            <s class="cpc__price-was" data-wg-notranslate hidden></s><span class="cpc__price-badge" data-wg-notranslate hidden>Save 0 %</span><span class="cpc__price-soldout" hidden>SOLD OUT</span>
2684          </div><div class="cpc__presale" >
2685            <span class="cpc__presale-icon" aria-hidden="true">
2686              <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
2687            </span>
2688            <div class="cpc__presale-body"><div class="cpc__presale-title">The color is sold out- choose another color or pre-order the new batch!</div><div class="cpc__presale-text">Reserve yours in advance. We ship orders in order of arrival.</div></div>
2689          </div><div class="cpc__html-block" >
2690            <div class="golden-tinys-banner">
2691  <div class="gt-photo">
2692    <img src="https://cdn.shopify.com/s/files/1/0656/8031/0506/files/ChatGPT_Image_Aug_18_2026_from_New_Chat.png?v=1787048955">
2693  </div>
2694</div>
2695          </div><div class="cpc__bundle-wrap" style="--bimg: 120px;" data-main-variant="54276348870998" ><div class="color_title"><h6>Choose your colors:</h6></div><div class="bundle-products"><div class="bundle-item">
2696                <img src="//joyearbuds.com/cdn/shop/files/black_buds_transparent_1.png?v=1776769855&amp;width=600" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/black_buds_transparent_1.png?v=1776769855&amp;width=352 352w, //joyearbuds.com/cdn/shop/files/black_buds_transparent_1.png?v=1776769855&amp;width=600 600w" width="600" height="597" loading="eager" id="main-bundle-img-template--31561534275926__product_new_RapwTf" class="bundle-img">
2697                <div class="bundle-info">
2698                  <div class="bundle-title">Joy TinyS - Small premium earbuds</div>
2699                  <div class="bundle-color">
2700                    <span class="bundle-sel">Valittu: <span id="main-selected-template--31561534275926__product_new_RapwTf">Black</span></span>
2701                    <span class="bundle-soldout-tag" id="main-soldout-tag-template--31561534275926__product_new_RapwTf" hidden>SOLD OUT</span>
2702                    <span class="bundle-presale-tag" id="main-presale-tag-template--31561534275926__product_new_RapwTf">Pre sale</span>
2703                  </div><div class="cpc__opts" id="cpc-opts-template--31561534275926__product_new_RapwTf"><div class="cpc__opt-row" data-opt="1">
2704                        <div class="cpc__opt-head"><span class="cpc__opt-name">Väri</span>
2705                          <span class="cpc__opt-val" data-opt-val="1">Black</span>
2706                        </div>
2707                        <div class="color-swatches"><button
2708                              type="button"
2709                              class="main-opt swatch active"
2710                              data-opt="1"
2711                              data-value="Black"
2712                              style="background: #222222;"
2713                              
2714                              aria-label="Color: Black"
2715                            ></button><button
2716                              type="button"
2717                              class="main-opt swatch"
2718                              data-opt="1"
2719                              data-value="Pink"
2720                              style="background: #FFB3CF;"
2721                              
2722                              aria-label="Color: Pink"
2723                            ></button><button
2724                              type="button"
2725                              class="main-opt swatch"
2726                              data-opt="1"
2727                              data-value="Gold"
2728                              style="background: #d1b255;"
2729                              
2730                              aria-label="Color: Gold"
2731                            ></button></div>
2732                      </div></div>
2732<script type="application/json" id="cpc-variants-template--31561534275926__product_new_RapwTf">[{"id":54276348870998,"o":["Black",null,null],"title":"Black","available":true,"img":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855\u0026width=600","full":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855\u0026width=900","srcset":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855\u0026width=480 480w, \/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855\u0026width=900 900w","delivery":"Delivery time: 1-3 days","presale":true,"presaleDelivery":"Delivery time ~ 3 weeks"},{"id":54276348936534,"o":["Pink",null,null],"title":"Pink","available":true,"img":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?v=1776769855\u0026width=600","full":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?v=1776769855\u0026width=900","srcset":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?v=1776769855\u0026width=480 480w, \/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?v=1776769855\u0026width=900 900w","delivery":"Delivery time: 1-3 days","presale":false,"presaleDelivery":""},{"id":55061249950038,"o":["Gold",null,null],"title":"Gold","available":true,"img":"\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?v=1773758930\u0026width=600","full":"\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?v=1773758930\u0026width=900","srcset":"\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?v=1773758930\u0026width=480 480w, \/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?v=1773758930\u0026width=900 900w","delivery":"Delivery time: 1-3 days","presale":true,"presaleDelivery":"Delivery time ~ 4 weeks"}]</script>
2732<div class="bundle-low-stock" id="main-lowstock-template--31561534275926__product_new_RapwTf" hidden></div><div class="bundle-delivery bundle-delivery--presale" id="main-delivery-template--31561534275926__product_new_RapwTf">
2733                    <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="1" y="3" width="15" height="13" rx="1"/><path d="M16 8h4l3 5v4h-7V8z"/><circle cx="5.5" cy="18.5" r="2.5"/><circle cx="18.5" cy="18.5" r="2.5"/></svg>
2734                    <span id="main-delivery-text-template--31561534275926__product_new_RapwTf">Delivery time ~ 3 weeks</span>
2735                  </div>
2736                </div>
2737              </div></div>
2738          </div><div id="shopify-block-AV01tN2N3c1FiS2QyQ__loox_reviews_loox_snippets_widget_3tTrgW" class="shopify-block shopify-app-block"><loox-snippets-widget
2739	
2740	reviews-type='product-reviews'
2741	product-id='8033926512874'
2742	review-count='481'
2743	show-border='false'
2744	show-rating='true'
2745	color-scheme='default'
2746	shadow=''
2747	font-size='14px'
2748	background-color=''
2749	text-color=''
2750	name-color=''
2751	border-color=''
2752	rating-icon-color=''
2753	border-radius='16px'
2754	show-image='true'
2755	hide-arrows-mobile='false'
2756	reviews-limit='10'
2757	shadow-color=''
2758	alignment='left'
2759	max-width=''
2760	class="loox-widget"
2761>
2762</loox-snippets-widget>
2763
2764
2765</div>
2766<div class="cpc__spacer" style="height: 16px;" ></div><button
2767            class="cpc__cta"
2768            id="cpc-btn-template--31561534275926__product_new_RapwTf"
2769            type="button"
2770            aria-busy="false"
2771            data-text="Order Now"
2772            
2773            
2774          >
2775            <span class="cpc__cta-txt">Order Now</span>
2776            <span class="cpc__spinner" aria-hidden="true"></span>
2777          </button>
2778          <div class="cpc__error" id="cpc-err-template--31561534275926__product_new_RapwTf" role="alert" hidden></div><div class="cpc__trust" ><div class="cpc__t-badge">
2779              <span class="cpc__t-icon" aria-hidden="true"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/></svg></span>
2780              <span class="cpc__t-text">FREE DELIVERY</span>
2781            </div><div class="cpc__t-badge">
2782              <span class="cpc__t-icon" aria-hidden="true"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="3" width="15" height="13" rx="1"/><path d="M16 8h4l3 5v4h-7V8z"/><circle cx="5.5" cy="18.5" r="2.5"/><circle cx="18.5" cy="18.5" r="2.5"/></svg></span>
2783              <span class="cpc__t-text">60-DAY RETURNS</span>
2784            </div><div class="cpc__t-badge">
2785              <span class="cpc__t-icon" aria-hidden="true"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="6"/><path d="M8.21 13.89 7 23l5-3 5 3-1.21-9.12"/></svg></span>
2786              <span class="cpc__t-text">3 YEARS WARRANTY</span>
2787            </div></div><div class="cpc__html-block" >
2788            <div class="hexu-guarantee" style="margin-top: 30px;">
2789<div class="g-text">
2790<b>60-DAY SATISFACTION GUARANTEE</b>
2791<br>CEO Hexu guarantees your satisfaction.<br>
2792</div>
2793<div class="g-sign">
2794<img src="https://cdn.shopify.com/s/files/1/0656/8031/0506/files/signature.png?v=1732541846">
2795</div>
2796<div class="g-photo">
2797<img src="https://cdn.shopify.com/s/files/1/0656/8031/0506/files/hexu.png?v=1732541846">
2798</div>
2799</div>
2800          </div><div class="cpc__delivery" id="cpc-delivery-template--31561534275926__product_new_RapwTf-14" 
2801            data-label-order="Ordered"
2802            data-label-ship="Dispatch"
2803            data-label-delivered="Delivered"
2804            data-order-text=""
2805            data-ship-offset="0"
2806            data-min-days="2"
2807            data-max-days="4"
2808            data-cutoff-hour="15"
2809          ><div class="cpc__delivery-title">ESTIMATED DELIVERY <br>(CHECK PRODUCT AVAILABILITY)</div><div class="cpc__delivery-steps">
2810              <div class="cpc__delivery-step cpc__delivery-step--active">
2811                <div class="cpc__delivery-dot">
2812                  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="20 6 9 17 4 12"/></svg>
2813                </div>
2814                <div class="cpc__delivery-label">Ordered</div>
2815                <div class="cpc__delivery-date" data-step="order">–</div>
2816              </div>
2817              <div class="cpc__delivery-step">
2818                <div class="cpc__delivery-dot">
2819                  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="1" y="3" width="15" height="13"/><polygon points="16 8 20 8 23 11 23 16 16 16 16 8"/><circle cx="5.5" cy="18.5" r="2.5"/><circle cx="18.5" cy="18.5" r="2.5"/></svg>
2820                </div>
2821                <div class="cpc__delivery-label">Dispatch</div>
2822                <div class="cpc__delivery-date" data-step="ship">–</div>
2823              </div>
2824              <div class="cpc__delivery-step">
2825                <div class="cpc__delivery-dot">
2826                  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
2827                </div>
2828                <div class="cpc__delivery-label">Delivered</div>
2829                <div class="cpc__delivery-date" data-step="delivered">–</div>
2830              </div>
2831            </div>
2832          </div><div class="cpc-icon-grid" style="--icon-size: 40px; --icon-font: 19px; --icon-text: 13px;" ><div class="cpc-icon-grid__items"><div class="cpc-icon-item">
2833                    <div class="cpc-icon-circle"><img src="//joyearbuds.com/cdn/shop/files/002-human.png?v=1745998846&amp;width=240" alt="" srcset="//joyearbuds.com/cdn/shop/files/002-human.png?v=1745998846&amp;width=80 80w" width="80" height="80" style="object-fit:contain;">
2834</div>
2835                    <div class="cpc-icon-text">Fits even the smallest ears</div>
2836                  </div><div class="cpc-icon-item">
2837                    <div class="cpc-icon-circle"><img src="//joyearbuds.com/cdn/shop/files/001-musical-note.png?v=1745998847&amp;width=240" alt="" srcset="//joyearbuds.com/cdn/shop/files/001-musical-note.png?v=1745998847&amp;width=80 80w" width="80" height="80" style="object-fit:contain;">
2838</div>
2839                    <div class="cpc-icon-text">Premium HiFi sound quality</div>
2840                  </div><div class="cpc-icon-item">
2841                    <div class="cpc-icon-circle"><img src="//joyearbuds.com/cdn/shop/files/003-battery-1.png?v=1745998848&amp;width=240" alt="" srcset="//joyearbuds.com/cdn/shop/files/003-battery-1.png?v=1745998848&amp;width=80 80w" width="80" height="80" style="object-fit:contain;">
2842</div>
2843                    <div class="cpc-icon-text">20h with charging case</div>
2844                  </div><div class="cpc-icon-item">
2845                    <div class="cpc-icon-circle"><img src="//joyearbuds.com/cdn/shop/files/001-rewind.png?v=1745998846&amp;width=240" alt="" srcset="//joyearbuds.com/cdn/shop/files/001-rewind.png?v=1745998846&amp;width=80 80w" width="80" height="80" style="object-fit:contain;">
2846</div>
2847                    <div class="cpc-icon-text">6h continuous playback</div>
2848                  </div><div class="cpc-icon-item">
2849                    <div class="cpc-icon-circle"><img src="//joyearbuds.com/cdn/shop/files/003-mic.png?v=1745998847&amp;width=240" alt="" srcset="//joyearbuds.com/cdn/shop/files/003-mic.png?v=1745998847&amp;width=80 80w" width="80" height="80" style="object-fit:contain;">
2850</div>
2851                    <div class="cpc-icon-text">Crystal-clear microphone</div>
2852                  </div><div class="cpc-icon-item">
2853                    <div class="cpc-icon-circle"><img src="//joyearbuds.com/cdn/shop/files/002-battery.png?v=1745998846&amp;width=240" alt="" srcset="//joyearbuds.com/cdn/shop/files/002-battery.png?v=1745998846&amp;width=80 80w" width="80" height="80" style="object-fit:contain;">
2854</div>
2855                    <div class="cpc-icon-text">Full charge in just 1.5 hours</div>
2856                  </div></div>
2857          </div><div id="shopify-block-AaGM3eTd3QzNvaW94a__loox_reviews_loox_video_slider_HCeLA6" class="shopify-block shopify-app-block"><loox-video-slider-widget
2858	
2859	class="loox-widget"
2860
2861	
2862		show-by-tag
2863	
2864
2865	
2866		layout='spotlight'
2867	
2868
2869	
2870		shadow=''
2871	
2872
2873	
2874		show-rating
2875	
2876
2877	
2878		show-reviewer-name
2879	
2880
2881	
2882		hide-arrows-mobile
2883	
2884
2885	
2886		auto-play
2887	
2888
2889	
2890
2891	
2892		border-width='1'
2893	
2894
2895	
2896		border-radius='16'
2897	
2898
2899	
2900		text-color=''
2901	
2902
2903	
2904		rating-icon-color=''
2905	
2906
2907	
2908		border-color=''
2909	
2910
2911	
2912		play-button-color=''
2913	
2914
2915	
2916		shadow-color=''
2917	
2918
2919	
2920		product-id=''
2921	
2922>
2923</loox-video-slider-widget>
2924
2925
2926</div>
2927</div></div><div class="cpc-sticky" id="cpc-sticky-template--31561534275926__product_new_RapwTf" aria-hidden="true"
2928  style="--grad: linear-gradient(135deg,#ff3d85 0%,#ff8042 100%); --pink: #ff3d85; --orange: #ff8042;">
2929  <div class="cpc-sticky__inner">
2930    <div class="cpc-sticky__info"><img src="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205&amp;width=120" alt="TinyS" srcset="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?v=1779964205&amp;width=48 48w" width="48" height="48" class="cpc-sticky__img">
2931<div>
2932        <div class="cpc-sticky__title">TinyS</div>
2933        <div class="cpc-sticky__price"><s class="cpc-sticky__compare" hidden></s>
2934          <span class="cpc-sticky__current">159,00 €</span>
2935        </div>
2936      </div>
2937    </div>
2938    <button class="cpc-sticky__btn" id="cpc-sticky-btn-template--31561534275926__product_new_RapwTf" type="button" aria-busy="false" data-text="Tilaa nyt" >
2939      <span class="cpc-sticky__btn-txt">Tilaa nyt</span>
2940      <span class="cpc-sticky__spinner" aria-hidden="true"></span>
2941    </button>
2942  </div>
2943</div><style>
2944  #cpc-template--31561534275926__product_new_RapwTf {
2945    --pink:#ff3d85;--orange:#ff8042;
2946    --grad:linear-gradient(135deg,#ff3d85 0%,#ff8042 100%);
2947    --ink:#0D0D0D;--ink2:#555;--ink3:#888;--bg:#FFF;--bg2:#F6F6F6;--bg3:#EFEFEF;--border:#E4E4E4;--gold:#FFB800;--green:#00A87A;--red:#C8102E;--glow:rgba(255, 255, 255, 0);
2948    display:grid;grid-template-columns:1fr 1fr;align-items:start;background:var(--bg);font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;color:var(--ink);max-width:1400px;margin:0 auto;
2949  }
2950  #cpc-template--31561534275926__product_new_RapwTf .cpc__visual{display:flex;align-items:flex-start;justify-content:center;padding:40px 24px 32px 0;position:sticky;top:80px;}
2951  #cpc-template--31561534275926__product_new_RapwTf .cpc__product-wrap{position:relative;width:100%;max-width:480px;}
2952  #cpc-template--31561534275926__product_new_RapwTf .cpc__main-img{width:100%;height:auto;display:block;border-radius:16px;background:var(--bg2);transition:opacity .2s;}
2953  #cpc-template--31561534275926__product_new_RapwTf .cpc__img-placeholder{width:100%;min-height:380px;border-radius:16px;background:var(--bg2);display:flex;align-items:center;justify-content:center;color:var(--ink3);font-size:14px;font-weight:600;padding:24px;text-align:center;}#cpc-template--31561534275926__product_new_RapwTf .cpc__soldout-flag{position:absolute;top:14px;left:14px;z-index:5;background:#0D0D0D;color:#fff;font-size:12px;font-weight:900;letter-spacing:2px;text-transform:uppercase;padding:8px 14px;border-radius:6px;box-shadow:0 4px 16px rgba(0,0,0,.25);}
2954  #cpc-template--31561534275926__product_new_RapwTf .cpc__soldout-flag[hidden]{display:none;}
2955  #cpc-template--31561534275926__product_new_RapwTf .cpc__price-soldout{background:#0D0D0D;color:#fff;font-size:12px;font-weight:900;letter-spacing:1.5px;padding:5px 10px;border-radius:6px;text-transform:uppercase;}
2956  #cpc-template--31561534275926__product_new_RapwTf .cpc__price-soldout[hidden]{display:none;}
2957  #cpc-template--31561534275926__product_new_RapwTf .cpc__price--soldout .cpc__price-now{color:var(--ink3);text-decoration:line-through;}
2958  #cpc-template--31561534275926__product_new_RapwTf .bundle-soldout-tag{display:inline-block;margin-left:6px;background:#0D0D0D;color:#fff;font-size:9.5px;font-weight:900;letter-spacing:1.2px;text-transform:uppercase;padding:2.5px 7px;border-radius:4px;vertical-align:middle;}
2959  #cpc-template--31561534275926__product_new_RapwTf .bundle-soldout-tag[hidden]{display:none;}#cpc-template--31561534275926__product_new_RapwTf .bundle-presale-tag{display:inline-block;margin-left:6px;background:#534AB7;color:#fff;font-size:9.5px;font-weight:900;letter-spacing:1.2px;text-transform:uppercase;padding:2.5px 7px;border-radius:4px;vertical-align:middle;}
2960  #cpc-template--31561534275926__product_new_RapwTf .bundle-presale-tag[hidden]{display:none;}
2961  #cpc-template--31561534275926__product_new_RapwTf .bundle-delivery--presale{color:#534AB7;}
2962  #cpc-template--31561534275926__product_new_RapwTf .bundle-delivery--presale svg{color:#534AB7;}
2963
2964  #cpc-template--31561534275926__product_new_RapwTf .bundle-low-stock{display:flex;align-items:center;gap:6px;margin-top:8px;font-size:12.5px;font-weight:700;color:#D9541E;}
2965  #cpc-template--31561534275926__product_new_RapwTf .bundle-low-stock[hidden]{display:none;}
2966  #cpc-template--31561534275926__product_new_RapwTf .bundle-low-stock::before{content:'';width:7px;height:7px;border-radius:50%;background:#f07d3f;flex-shrink:0;animation:cpc-blink-template--31561534275926__product_new_RapwTf 1.6s ease-in-out infinite;}
2967  #cpc-template--31561534275926__product_new_RapwTf .bundle-low-stock--out{color:var(--red);}
2968  #cpc-template--31561534275926__product_new_RapwTf .bundle-low-stock--out::before{background:var(--red);animation:none;}#cpc-template--31561534275926__product_new_RapwTf .cpc__opts{display:flex;flex-direction:column;gap:18px;margin-top:14px;}
2969  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-head{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:9px;}
2970  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-name{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:1.2px;color:var(--ink3);}
2971  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-val{font-size:13px;font-weight:700;color:var(--ink);}
2972  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-row .color-swatches{margin-top:0;}
2973  #cpc-template--31561534275926__product_new_RapwTf .bundle-sel[hidden]{display:none;}
2974  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-pills{display:grid;grid-template-columns:repeat(auto-fit,minmax(112px,1fr));gap:8px;}
2975  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-pill{display:flex;align-items:center;justify-content:center;text-align:center;min-height:46px;padding:8px 12px;border:1.5px solid var(--border);border-radius:10px;background:#fff;color:var(--ink);font-size:14px;font-weight:700;line-height:1.25;cursor:pointer;transition:border-color .15s,background .15s,color .15s;}
2976  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-pill[data-wide]{grid-column:1 / -1;}
2977  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-pill-label{display:block;}
2978  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-pill:hover{border-color:var(--ink);}
2979  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-pill.active{border-color:var(--ink);background:var(--ink);color:#fff;}
2980  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-pill--soldout{color:var(--ink3);border-style:dashed;background:var(--bg2);}
2981  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-pill--soldout .cpc__opt-pill-label{text-decoration:line-through;text-decoration-color:var(--red);text-decoration-thickness:1.5px;}
2982  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-pill--soldout.active{background:var(--ink);color:#fff;border-style:solid;border-color:var(--red);}
2983  #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-pill:focus-visible,#cpc-template--31561534275926__product_new_RapwTf .swatch:focus-visible{outline:2.5px solid var(--pink);outline-offset:3px;}
2984
2985  #cpc-template--31561534275926__product_new_RapwTf .cpc__carousel{display:flex;align-items:center;gap:6px;margin-top:12px;position:relative;}
2986  #cpc-template--31561534275926__product_new_RapwTf .cpc__thumbs{display:flex;gap:8px;overflow-x:auto;scroll-behavior:smooth;scrollbar-width:none;-ms-overflow-style:none;flex:1;padding:4px 2px;}
2987  #cpc-template--31561534275926__product_new_RapwTf .cpc__thumbs::-webkit-scrollbar{display:none;}
2988  #cpc-template--31561534275926__product_new_RapwTf .cpc__thumb{width:68px;height:68px;border:2px solid var(--border);border-radius:10px;padding:4px;background:var(--bg2);cursor:pointer;overflow:hidden;flex-shrink:0;transition:border-color .15s,box-shadow .15s;display:flex;align-items:center;justify-content:center;}
2989  #cpc-template--31561534275926__product_new_RapwTf .cpc__thumb:hover{border-color:var(--pink);}
2990  #cpc-template--31561534275926__product_new_RapwTf .cpc__thumb--active{border-color:var(--pink);box-shadow:0 0 0 2px var(--glow);}
2991  #cpc-template--31561534275926__product_new_RapwTf .cpc__thumb-img{width:100%;height:100%;object-fit:contain;display:block;}
2992  #cpc-template--31561534275926__product_new_RapwTf .cpc__carousel-arrow{width:32px;height:32px;border-radius:50%;border:1.5px solid var(--border);background:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;color:var(--ink);transition:border-color .15s,background .15s,opacity .15s;padding:0;}
2993  #cpc-template--31561534275926__product_new_RapwTf .cpc__carousel-arrow:hover{border-color:var(--pink);color:var(--pink);}
2994  #cpc-template--31561534275926__product_new_RapwTf .cpc__carousel-arrow[disabled]{opacity:.3;cursor:default;}
2995  #cpc-template--31561534275926__product_new_RapwTf .cpc__offer{padding:40px 40px 32px 40px;border-left:1px solid var(--border);}
2996  #cpc-template--31561534275926__product_new_RapwTf .cpc__camp-tag{display:inline-block;background:var(--grad);color:#fff;font-size:10px;font-weight:900;letter-spacing:2px;text-transform:uppercase;padding:5px 13px;border-radius:5px;margin-bottom:14px;}
2997  #cpc-template--31561534275926__product_new_RapwTf .cpc__h1{font-size:clamp(24px,2.8vw,42px);font-weight:900;color:var(--ink);line-height:1.08;letter-spacing:-1.5px;margin-bottom:10px;margin-top:8px;}
2998  #cpc-template--31561534275926__product_new_RapwTf .cpc__hl{background:var(--grad);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;}
2999  #cpc-template--31561534275926__product_new_RapwTf .cpc__sub{font-size:14px;color:var(--ink2);line-height:1.6;margin-bottom:20px;}
3000  #cpc-template--31561534275926__product_new_RapwTf .cpc__text-block,#cpc-template--31561534275926__product_new_RapwTf .cpc__html-block{margin-bottom:14px;}
3001  #cpc-template--31561534275926__product_new_RapwTf .cpc__countdown{display:inline-flex;flex-direction:column;gap:10px;background:#fff;border:1px solid var(--border);border-radius:14px;padding:14px 18px;margin-bottom:14px;width:100%;box-sizing:border-box;}
3002  #cpc-template--31561534275926__product_new_RapwTf .cpc__countdown-label{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:2px;color:var(--pink);}
3003  #cpc-template--31561534275926__product_new_RapwTf .cpc__countdown-digits{display:flex;align-items:stretch;gap:0;}
3004  #cpc-template--31561534275926__product_new_RapwTf .cpc__digit-box{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;flex:1;padding:10px 4px 8px;border-radius:10px;background:var(--bg2);position:relative;overflow:hidden;}
3005  #cpc-template--31561534275926__product_new_RapwTf .cpc__digit-box::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:var(--grad);border-radius:2px 2px 0 0;}
3006  #cpc-template--31561534275926__product_new_RapwTf .cpc__digit{font-size:28px;font-weight:900;font-variant-numeric:tabular-nums;color:var(--ink);line-height:1;letter-spacing:-1px;}
3007  #cpc-template--31561534275926__product_new_RapwTf .cpc__digit-lbl{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:1.2px;color:var(--ink3);}
3008  #cpc-template--31561534275926__product_new_RapwTf .cpc__digit-sep{dis
3008play:flex;align-items:center;justify-content:center;padding:0 6px 16px;font-size:20px;font-weight:900;color:var(--pink);flex-shrink:0;align-self:center;}
3009  #cpc-template--31561534275926__product_new_RapwTf .cpc__price{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:4px 0 18px;}
3010  #cpc-template--31561534275926__product_new_RapwTf .cpc__price-now{font-size:28px;font-weight:900;color:#C8102E;letter-spacing:-0.5px;line-height:1;}
3011  #cpc-template--31561534275926__product_new_RapwTf .cpc__price-was{font-size:17px;color:var(--ink3);font-weight:500;}
3012  #cpc-template--31561534275926__product_new_RapwTf .cpc__price-badge{background:#C8102E;color:#fff;font-size:12px;font-weight:800;padding:5px 10px;border-radius:6px;letter-spacing:.3px;}
3013  #cpc-template--31561534275926__product_new_RapwTf .cpc__price-was[hidden],#cpc-template--31561534275926__product_new_RapwTf .cpc__price-badge[hidden],#cpc-template--31561534275926__product_new_RapwTf .cpc__compare-price[hidden],#cpc-template--31561534275926__product_new_RapwTf .cpc__val-saving[hidden]{display:none;}
3014  #cpc-template--31561534275926__product_new_RapwTf .cpc__val-box{background:var(--bg2);border:1px solid var(--border);border-radius:12px;padding:13px 16px;margin-bottom:14px;}
3015  #cpc-template--31561534275926__product_new_RapwTf .cpc__val-row{display:flex;justify-content:space-between;align-items:center;font-size:13px;color:var(--ink2);padding:4px 0;}
3016  #cpc-template--31561534275926__product_new_RapwTf .cpc__val-row--total{border-top:1px solid var(--border);margin-top:6px;padding-top:10px;color:var(--ink);font-weight:700;font-size:14px;}
3017  #cpc-template--31561534275926__product_new_RapwTf .cpc__main-price{display:flex;align-items:center;gap:6px;}
3018  #cpc-template--31561534275926__product_new_RapwTf .cpc__compare-price{color:var(--ink3);font-weight:400;font-size:12px;}
3019  #cpc-template--31561534275926__product_new_RapwTf .cpc__free-lbl{color:var(--green);font-weight:700;}
3020  #cpc-template--31561534275926__product_new_RapwTf .cpc__free-lbl s{color:var(--ink3);font-weight:400;margin-left:5px;}
3021  #cpc-template--31561534275926__product_new_RapwTf .cpc__big-price{font-size:22px;font-weight:900;letter-spacing:-0.5px;}
3022  #cpc-template--31561534275926__product_new_RapwTf .cpc__val-hero{text-align:center;padding-bottom:12px;margin-bottom:10px;border-bottom:1px solid var(--border);}
3023  #cpc-template--31561534275926__product_new_RapwTf .cpc__val-hero-num{display:block;font-size:44px;font-weight:900;letter-spacing:-1.5px;line-height:1;background:var(--grad);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;padding:4px 0;}
3024  #cpc-template--31561534275926__product_new_RapwTf .cpc__val-hero-lbl{display:block;font-size:13px;font-weight:700;color:var(--ink2);margin-top:4px;}
3025  #cpc-template--31561534275926__product_new_RapwTf .cpc__val-saving{margin-top:10px;text-align:center;font-size:13px;font-weight:800;color:var(--green);}
3026  .bundle-products{display:flex;flex-direction:column;gap:0;margin-bottom:14px;}
3027  .color_title{margin-bottom:12px;}
3028  .color_title h6{font-size:13px;font-weight:700;color:var(--ink);margin:0;letter-spacing:-0.1px;}
3029  .bundle-item{display:flex;gap:16px;align-items:flex-start;padding:14px 0;}
3030  .bundle-item + .bundle-item{border-top:1px solid var(--border);}
3031  .bundle-img{width:var(--bimg,120px);height:var(--bimg,120px);background:#f4f4f4;border-radius:14px;object-fit:contain;padding:10px;flex-shrink:0;}
3032  .bundle-info{flex:1;min-width:0;}
3033  .bundle-title{font-size:15px;font-weight:700;color:var(--ink);line-height:1.3;letter-spacing:-0.2px;}
3034  .bundle-color{font-size:13px;color:var(--ink3);margin-top:4px;}
3035  .color-swatches{display:flex;gap:10px;margin-top:12px;flex-wrap:wrap;}
3036  .swatch{width:28px;height:28px;border-radius:50%;border:2px solid transparent;cursor:pointer;flex-shrink:0;font-size:0;transition:transform .15s;outline:2px solid rgba(0,0,0,0.12);outline-offset:1px;position:relative;}
3037  .swatch:hover{transform:scale(1.1);}
3038  .swatch.active{outline:2.5px solid #111;outline-offset:2px;}.swatch--soldout{opacity:.45;filter:grayscale(.35);}
3039  .swatch--soldout::after{
3040    content:'';position:absolute;
3040left:-3px;right:-3px;top:50%;height:2px;
3041    background:#C8102E;transform:rotate(-45deg);transform-origin:center;border-radius:2px;
3042    box-shadow:0 0 0 1px rgba(255,255,255,.75);
3043  }
3044  .swatch--soldout:hover{transform:none;}
3045  .swatch--soldout.active{outline-color:#C8102E;}
3046
3047  .bundle-img-link{display:block;flex-shrink:0;}
3048  .bundle-free{display:flex;align-items:center;gap:8px;margin-top:6px;}
3049  .bundle-free-badge{display:inline-block;background:#E6F7F1;color:#00A87A;font-size:11px;font-weight:900;letter-spacing:1px;text-transform:uppercase;padding:3px 8px;border-radius:5px;line-height:1.3;}
3050  .bundle-free-was{font-size:13px;color:#888;font-weight:500;}#cpc-template--31561534275926__product_new_RapwTf .cpc__offer-box{background:var(--bg2);border:1px solid var(--border);border-radius:14px;padding:18px 20px 16px;margin:4px 0 18px;}
3051  #cpc-template--31561534275926__product_new_RapwTf .cpc__ob-price{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding-bottom:14px;border-bottom:1px solid var(--border);}
3052  #cpc-template--31561534275926__product_new_RapwTf .cpc__ob-now{font-size:clamp(30px,3vw,38px);font-weight:900;color:var(--ink);letter-spacing:-1px;line-height:1;}
3053  #cpc-template--31561534275926__product_new_RapwTf .cpc__ob-was{font-size:16px;color:var(--ink3);font-weight:500;}
3054  #cpc-template--31561534275926__product_new_RapwTf .cpc__ob-badge{background:var(--grad);color:#fff;font-size:12px;font-weight:800;padding:4px 10px;border-radius:999px;letter-spacing:.2px;}
3055  #cpc-template--31561534275926__product_new_RapwTf .cpc__ob-was[hidden],#cpc-template--31561534275926__product_new_RapwTf .cpc__ob-badge[hidden],#cpc-template--31561534275926__product_new_RapwTf .cpc__ob-row[hidden],#cpc-template--31561534275926__product_new_RapwTf .cpc__offer-box .cpc__price-soldout[hidden]{display:none;}
3056  #cpc-template--31561534275926__product_new_RapwTf .cpc__offer-box--soldout .cpc__ob-now{color:var(--ink3);text-decoration:line-through;}
3057  #cpc-template--31561534275926__product_new_RapwTf .cpc__ob-rows{display:flex;flex-direction:column;gap:9px;padding-top:14px;}
3058  #cpc-template--31561534275926__product_new_RapwTf .cpc__ob-row{display:flex;align-items:center;gap:8px;font-size:14px;color:var(--ink2);line-height:1.4;}
3059  #cpc-template--31561534275926__product_new_RapwTf .cpc__ob-row strong{color:var(--ink);font-weight:800;}
3060  #cpc-template--31561534275926__product_new_RapwTf .cpc__ob-row svg{flex-shrink:0;color:var(--green);}
3061  #cpc-template--31561534275926__product_new_RapwTf .cpc__ob-green,#cpc-template--31561534275926__product_new_RapwTf .cpc__ob-row strong.cpc__ob-green{color:var(--green);font-weight:700;}
3062  #cpc-template--31561534275926__product_new_RapwTf .cpc__ob-row--delivery{font-size:13px;font-weight:600;}
3063  @media (max-width:480px){#cpc-template--31561534275926__product_new_RapwTf .cpc__offer-box{padding:16px 14px 14px;}#cpc-template--31561534275926__product_new_RapwTf .cpc__ob-row{font-size:13px;}}
3064  .bundle-title--link{display:block;color:var(--ink);text-decoration:none;font-size:15px;font-weight:700;line-height:1.3;letter-spacing:-0.2px;}
3065  .bundle-title--link:hover{text-decoration:underline;}
3066  .bundle-delivery{display:flex;align-items:center;gap:5px;margin-top:8px;font-size:12px;font-weight:600;color:var(--green);}
3067  .bundle-delivery svg{flex-shrink:0;color:var(--green);}
3068  #cpc-template--31561534275926__product_new_RapwTf .cpc__qty-wrap{display:flex;align-items:center;gap:16px;margin-bottom:14px;}
3069  #cpc-template--31561534275926__product_new_RapwTf .cpc__qty-label{font-size:13px;font-weight:700;color:var(--ink);white-space:nowrap;}
3070  #cpc-template--31561534275926__product_new_RapwTf .cpc__qty-ctrl{display:flex;align-items:center;border:1.5px solid var(--border);border-radius:10px;overflow:hidden;background:var(--bg);}
3071  #cpc-template--31561534275926__product_new_RapwTf .cpc__qty-btn{width:42px;height:42px;border:none;background:transparent;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ink);transition:background .15s,color .15s;flex-shrink:0;padding:0;}
3072  #cpc-template--31561534275926__product_new_RapwTf .cpc__qty-btn:hover:not([disabled]){background:var(--bg2);color:var(--pink);}
3073  #cpc-template--31561534275926__product_new_RapwTf .cpc__qty-btn[disabled]{opacity:.3;cursor:not-allowed;}
3074  #cpc-template--31561534275926__product_new_RapwTf .cpc__qty-input{width:52px;text-align:center;border:none;border-left:1.5px solid var(--border);border-right:1.5px solid var(--border);font-size:17px;font-weight:800;font-variant-numeric:tabular-nums;color:var(--ink);background:transparent;-moz-appearance:textfield;padding:0;height:42px;outline:none;cursor:default;}
3075  #cpc-template--31561534275926__product_new_RapwTf .cpc__qty-input::-webkit-outer-spin-button,#cpc-template--31561534275926__product_new_RapwTf .cpc__qty-input::-webkit-inner-spin-button{-webkit-appearance:none;}
3076  #cpc-template--31561534275926__product_new_RapwTf .cpc__stock{display:flex;align-items:center;gap:7px;font-size:13px;color:#000;margin-bottom:14px;}
3077  #cpc-template--31561534275926__product_new_RapwTf .cpc__stock strong{color:var(--ink);}
3078  #cpc-template--31561534275926__product_new_RapwTf .cpc__stock-dot{width:8px;height:8px;background:#f07d3f;border-radius:50%;flex-shrink:0;animation:cpc-blink-template--31561534275926__product_new_RapwTf 1.6s ease-in-out infinite;}
3079  @keyframes cpc-blink-template--31561534275926__product_new_RapwTf{0%,100%{opacity:1}50%{opacity:.2}}
3080  #cpc-template--31561534275926__product_new_RapwTf .cpc__presale{display:flex;gap:12px;align-items:flex-start;background:#EEEDFE;border:1px solid #CECBF6;border-radius:12px;padding:13px 16px;margin-bottom:14px;}
3081  #cpc-template--31561534275926__product_new_RapwTf .cpc__presale-icon{color:#534AB7;flex-shrink:0;margin-top:1px;}
3082  #cpc-template--31561534275926__product_new_RapwTf .cpc__presale-title{font-size:14px;font-weight:800;color:#3C3489;line-height:1.4;}
3083  #cpc-template--31561534275926__product_new_RapwTf .cpc__presale-text{font-size:13px;color:#534AB7;line-height:1.5;margin-top:2px;}
3084  #cpc-template--31561534275926__product_new_RapwTf .cpc__gift-offer{display:flex;gap:12px;align-items:center;background:#FFF0F6;border:1.5px dashed var(--pink);border-radius:12px;padding:13px 16px;margin-bottom:14px;}
3085  #cpc-template--31561534275926__product_new_RapwTf .cpc__gift-icon{color:var(--pink);flex-shrink:0;}
3086  #cpc-template--31561534275926__product_new_RapwTf .cpc__gift-body{flex:1;min-width:0;}
3087  #cpc-template--31561534275926__product_new_RapwTf .cpc__gift-title{font-size:14px;font-weight:800;color:var(--ink);line-height:1.35;}
3088  #cpc-template--31561534275926__product_new_RapwTf .cpc__gift-text{font-size:12.5px;color:var(--ink2);margin-top:2px;line-height:1.45;}
3089  #cpc-template--31561534275926__product_new_RapwTf .cpc__gift-price{text-align:right;flex-shrink:0;display:flex;flex-direction:column;align-items:flex-end;
3089gap:2px;}
3090  #cpc-template--31561534275926__product_new_RapwTf .cpc__gift-price s{font-size:12px;color:var(--ink3);font-weight:400;}
3091  #cpc-template--31561534275926__product_new_RapwTf .cpc__gift-price span{font-size:15px;font-weight:900;color:var(--green);}
3092  #cpc-template--31561534275926__product_new_RapwTf .cpc__reserve{margin-bottom:14px;}
3093  #cpc-template--31561534275926__product_new_RapwTf .cpc__reserve-row{display:flex;justify-content:space-between;align-items:baseline;font-size:13px;color:var(--ink2);margin-bottom:6px;}
3094  #cpc-template--31561534275926__product_new_RapwTf .cpc__reserve-row strong{color:var(--ink);font-weight:800;font-variant-numeric:tabular-nums;}
3095  #cpc-template--31561534275926__product_new_RapwTf .cpc__reserve-bar{height:8px;background:var(--bg3);border-radius:4px;overflow:hidden;}
3096  #cpc-template--31561534275926__product_new_RapwTf .cpc__reserve-fill{height:100%;background:var(--grad);border-radius:4px;}
3097  #cpc-template--31561534275926__product_new_RapwTf .cpc__reserve-note{font-size:11.5px;color:var(--ink3);margin-top:6px;}
3098  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery{border:1px solid var(--border);border-radius:14px;padding:16px 14px 14px;margin-bottom:14px;background:var(--bg);}
3099  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-title{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:2px;color:var(--ink3);margin-bottom:14px;text-align:center;}
3100  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-steps{display:flex;align-items:flex-start;}
3101  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-step{flex:1;display:flex;flex-direction:column;align-items:center;text-align:center;position:relative;}
3102  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-dot{width:30px;height:30px;border-radius:50%;background:var(--bg2);border:2px solid var(--border);display:flex;align-items:center;justify-content:center;z-index:2;position:relative;}
3103  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-dot svg{width:14px;height:14px;stroke:var(--ink3);}
3104  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-step--active .cpc__delivery-dot{background:#EAF9F3;border-color:var(--green);}
3105  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-step--active .cpc__delivery-dot svg{stroke:var(--green);}
3106  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-step::after{content:'';position:absolute;top:14px;left:50%;width:100%;height:2px;background:var(--border);z-index:1;}
3107  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-step:last-child::after{display:none;}
3108  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-step--active::after{background:linear-gradient(90deg,var(--green),var(--border));}
3109  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-label{font-size:11px;font-weight:800;color:var(--ink);margin-top:8px;}
3110  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-date{font-size:11px;font-weight:600;color:var(--ink2);margin-top:2px;}
3111  #cpc-template--31561534275926__product_new_RapwTf .cpc__delivery-step--active .cpc__delivery-date{color:var(--green);}
3112  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta{width:100%;background:var(--grad);color:#fff;border:none;border-radius:12px;padding:18px 22px;font-size:16px;font-weight:900;cursor:pointer;transition:transform .15s,box-shadow .15s;box-shadow:0 6px 24px rgba(255, 61, 132, 0);margin-bottom:14px;display:flex;align-items:center;justify-content:center;gap:10px;letter-spacing:0.2px;position:relative;min-height:56px;}
3113  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta:hover:not([disabled]):not([aria-busy="true"]){transform:translateY(-2px);box-shadow:0 12px 36px rgba(255, 61, 132, 0);}
3114  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta:active:not([disabled]){transform:none;}
3115  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta[disabled]{background:var(--bg3);color:var(--ink3);box-shadow:none;cursor:not-allowed;letter-spacing:2px;text-transform:uppercase;font-size:14px;}
3116  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta[aria-busy="true"]{opacity:.75;cursor:wait;}
3117  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta[aria-busy="true"] .cpc__cta-txt{opacity:0;}
3118  #cpc-template--31561534275926__product_new_RapwTf .cpc__spinner{display:none;width:20px;height:20px;border:2.5px solid rgba(255,255,255,0.35);border-top-color:#fff;border-radius:50%;animation:cpc-spin-template--31561534275926__product_new_RapwTf .7s linear infinite;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);}
3119  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta[aria-busy="true"] .cpc__spinner{display:block;}
3120  @keyframes cpc-spin-template--31561534275926__product_new_RapwTf{to{transform:translate(-50%,-50%) rotate(360deg);}}
3121  #cpc-template--31561534275926__product_new_RapwTf .cpc__error{background:#FFF2F2;border:1px solid #FFCCCC;border-radius:8px;padding:10px 14px;font-size:13px;color:#CC2222;margin-bottom:12px;}
3122  #cpc-template--31561534275926__product_new_RapwTf .cpc__error[hidden]{display:none;}
3123  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta-secondary{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;margin:0 0 14px;background:transparent;color:var(--ink);border:1.5px solid var(--border);border-radius:12px;padding:15px 22px;font-size:15px;font-weight:700;text-decoration:none;transition:border-color .15s,background .15s;}
3124  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta-secondary:hover{border-color:var(--ink);background:var(--bg2);color:var(--ink);}
3125  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta-secondary svg{flex-shrink:0;transition:transform .15s;}
3126  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta-secondary:hover svg{transform:translateX(3px);}
3127  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta-secondary--link{border:none;padding:4px 0;font-size:14px;font-weight:600;color:var(--ink2);text-decoration:underline;text-underline-offset:3px;}
3128  #cpc-template--31561534275926__product_new_RapwTf .cpc__cta-secondary--link:hover{background:transparent;color:var(--ink);}
3129  #cpc-template--31561534275926__product_new_RapwTf .cpc__payment{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap;}
3130  #cpc-template--31561534275926__product_new_RapwTf .cpc__payment-lbl{font-size:11px;color:var(--ink3);white-space:nowrap;}
3131  #cpc-template--31561534275926__product_new_RapwTf .cpc__payment-icons{display:flex;gap:5px;align-items:center;flex-wrap:wrap;}
3132  #cpc-template--31561534275926__product_new_RapwTf .cpc__pay-icon{height:22px;width:auto;border-radius:3px;opacity:.7;transition:opacity .15s;}
3133  #cpc-template--31561534275926__product_new_RapwTf .cpc__pay-icon:hover{opacity:1;}
3134  #cpc-template--31561534275926__product_new_RapwTf .cpc__trust{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin:20px 0;}
3135  #cpc-template--31561534275926__product_new_RapwTf .cpc__t-badge{display:flex;flex-direction:column;align-items:center;text-align:center;gap:8px;border-radius:12px;padding:16px 10px;}
3136  #cpc-template--31561534275926__product_new_RapwTf .cpc__t-icon{display:flex;align-items:center;justify-content:center;color:var(--ink);}
3137  #cpc-template--31561534275926__product_new_RapwTf .cpc__t-text{font-size:10px;font-weight:600;color:var(--ink);line-height:1.35;letter-spacing:-0.1px;}
3138  #cpc-template--31561534275926__product_new_RapwTf .cpc-icon-grid{margin-bottom:14px;border-top:1px solid var(--border);padding-top:16px;}
3139  #cpc-template--31561534275926__product_new_RapwTf .cpc-icon-grid__label{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:1.5px;color:var(--ink3);margin-bottom:12px;}
3140  #cpc-template--31561534275926__product_new_RapwTf .cpc-icon-grid__items{display:grid;grid-template-columns:1fr 1fr;gap:32px 16px;}
3141  #cpc-template--31561534275926__product_new_RapwTf .cpc-icon-item{display:flex;flex-direction:column;align-items:center;text-align:center;gap:12px;}
3142  #cpc-template--31561534275926__product_new_RapwTf .cpc-icon-circle{width:var(--icon-size,40px);height:var(--icon-size,40px);background:transparent;border-radius:0;display:flex;align-items:center;justify-content:center;font-size:var(--icon-font,28px);flex-shrink:0;color:var(--ink);}
3143  #cpc-template--31561534275926__product_new_RapwTf .cpc-icon-circle img{width:100%;height:100%;object-fit:contain;}
3144  #cpc-template--31561534275926__product_new_RapwTf .cpc-icon-text{font-size:13px;font-weight:700;color:var(--ink);line-height:1.3;}
3145  #cpc-template--31561534275926__product_new_RapwTf .cpc__spacer{display:block;}
3146  .cpc-sticky{position:fixed;bottom:0;left:0;right:0;z-index:999;background:#fff;border-top:1px solid #E4E4E4;box-shadow:0 -4px 24px rgba(0,0,0,0.10);transform:translateY(100%);transition:transform .35s cubic-bezier(.4,0,.2,1);pointer-events:none;}
3147  .cpc-sticky[aria-hidden="false"]{transform:translateY(0);pointer-events:auto;}
3148  .cpc-sticky__inner{max-width:1200px;margin:0 auto;padding:12px 24px;display:flex;align-items:center;justify-content:space-between;gap:16px;}
3149  .cpc-sticky__info{display:flex;align-items:center;gap:12px;flex:1;min-width:0;}
3150  .cpc-sticky__img{width:48px;height:48px;object-fit:contain;border-radius:8px;background:#F6F6F6;flex-shrink:0;}
3151  .cpc-sticky__title{font-size:14px;font-weight:700;color:#0D0D0D;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
3152  .cpc-sticky__price{font-size:13px;color:#888;margin-top:2px;}
3153  .cpc-sticky__compare{color:#bbb;margin-right:6px;}
3154  .cpc-sticky__compare[hidden]{display:none;}
3155  .cpc-sticky__btn{flex-shrink:0;background:var(--grad);color:#fff;border:none;border-radius:100px;padding:14px 32px;font-size:15px;font-weight:900;cursor:pointer;box-shadow:0 4px 20px rgba(255,61,133,0.35);transition:transform .15s,box-shadow .15s,opacity .2s;display:flex;align-items:center;justify-content:center;min-height:50px;min-width:180px;position:relative;white-space:nowrap;}
3156  .cpc-sticky__btn:hover:not([disabled]):not([aria-busy="true"]){transform:translateY(-2px);box-shadow:0 8px 32px rgba(255,61,133,0.5);}
3157  .cpc-sticky__btn[disabled]{background:#e5e5e5;color:#999;box-shadow:none;cursor:not-allowed;letter-spacing:1.5px;text-transform:uppercase;font-size:13px;}
3158  .cpc-sticky__btn[aria-busy="true"]{opacity:.75;cursor:wait;}
3159  .cpc-sticky__btn[aria-busy="true"] .cpc-sticky__btn-txt{opacity:0;}
3160  .cpc-sticky__spinner{display:none;width:18px;height:18px;border:2px solid rgba(255,255,255,0.35);border-top-color:#fff;border-radius:50%;animation:cpc-sticky-spin .7s linear infinite;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);}
3161  .cpc-sticky__btn[aria-busy="true"] .cpc-sticky__spinner{display:block;}
3162  @keyframes cpc-sticky-spin{to{transform:translate(-50%,-50%) rotate(360deg);}}
3163  @media (max-width:600px){.cpc-sticky__info{display:none;}.cpc-sticky__btn{width:100%;min-width:0;}.cpc-sticky__inner{padding:10px 16px;}}
3164  @media (max-width:960px){
3165    #cpc-template--31561534275926__product_new_RapwTf{grid-template-columns:1fr;}
3166    #cpc-template--31561534275926__product_new_RapwTf .cpc__visual{padding:16px 16px 0 16px;position:static;}
3167    #cpc-template--31561534275926__product_new_RapwTf .cpc__product-wrap{max-width:100%;margin:0 auto;}
3168    #cpc-template--31561534275926__product_new_RapwTf .cpc__offer{padding:20px 16px 40px 16px;border-left:none;border-top:1px solid var(--border);margin-top:0;}
3169  }
3170  @media (max-width:480px){
3171    #cpc-template--31561534275926__product_new_RapwTf .cpc__thumb{width:56px;height:56px;}
3172    #cpc-template--31561534275926__product_new_RapwTf .cpc__carousel-arrow{width:28px;height:28px;}
3173    #cpc-template--31561534275926__product_new_RapwTf .cpc__h1{font-size:28px;letter-spacing:-1px;}
3174    .bundle-img{width:min(var(--bimg,120px),120px);height:min(var(--bimg,120px),120px);}
3175    .bundle-title{font-size:14px;}
3176    #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-pills{grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:7px;}
3177    #cpc-template--31561534275926__product_new_RapwTf .cpc__opt-pill{min-height:44px;font-size:13px;padding:8px 10px;}
3178    .bundle-item{gap:12px;}
3179  }
3180  @media (prefers-reduced-motion:reduce){
3181    #cpc-template--31561534275926__product_new_RapwTf *,#cpc-template--31561534275926__product_new_RapwTf *::before,#cpc-template--31561534275926__product_new_RapwTf *::after,.cpc-sticky,.cpc-sticky *{transition:none!important;animation:none!important;}
3182  }
3183</style>
3184
3185<script>
3186(function () {
3187  'use strict';
3188  var SID = "template--31561534275926__product_new_RapwTf";
3189  var DISCOUNT = "";
3190  var selectedGiftId = null;
3191  var MONEY_FMT = "{{amount_with_comma_separator}} €";
3192  function formatCents(cents) {
3193    cents = Math.round(Number(cents) || 0);
3194    function fmt(n, dec, thou, decSep) {
3195      var s = (n / 100).toFixed(dec).split('.');
3196      s[0] = s[0].replace(/\B(?=(\d{3})+(?!\d))/g, thou);
3197      return s.join(decSep);
3198    }
3199    return (MONEY_FMT || '[amount] €').replace('[amount]', fmt(cents, 2, ' ', ',')).replace(/\{\{\s*(\w+)\s*\}\}/, function (m, k) {
3200      if (k === 'amount_no_decimals') return fmt(cents, 0, ',', '.');
3201      if (k === 'amount_with_comma_separator') return fmt(cents, 2, '.', ',');
3202      if (k === 'amount_no_decimals_with_comma_separator') return fmt(cents, 0, '.', ',');
3203      if (k === 'amount_with_space_separator') return fmt(cents, 2, ' ', ',');
3204      if (k === 'amount_no_decimals_with_space_separator') return fmt(cents, 0, ' ', ',');
3205      if (k === 'amount_with_apostrophe_separator') return fmt(cents, 2, "'", '.');
3206      return fmt(cents, 2, ',', '.');
3207    }).replace(/<[^>]*>/g, '');
3208  }var PRICES = {"54276348870998": {
3209        price: 15900,
3210        compare: 0,
3211        priceMoney: "159,00 €",
3212        compareMoney:"",
3213        savingMoney:"",
3214        available: true,
3215        inventory: -1
3216      },"54276348936534": {
3217        price: 15900,
3218        compare: 0,
3219        priceMoney: "159,00 €",
3220        compareMoney:"",
3221        savingMoney:"",
3222        available: true,
3223        inventory: -1
3224      },"55061249950038": {
3225        price: 15900,
3226        compare: 0,
3227        priceMoney: "159,00 €",
3228        compareMoney:"",
3229        savingMoney:"",
3230        available: true,
3231        inventory: -1
3232      }};function initDeliveryTimelines(root) {
3233    var boxes = root.querySelectorAll('.cpc__delivery');
3234    if (!boxes.length) return;
3235
3236    function addBusinessDays(date, days) {
3237      var d = new Date(date);
3238      while (days > 0) {
3239        d.setDate(d.getDate() + 1);
3240        if (d.getDay() !== 0 && d.getDay() !== 6) days--;
3241      }
3242      return d;
3243    }
3244    function fmt(d) {
3245      var wd = ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'][d.getDay()];
3246      return wd + ' ' + d.getDate() + '.' + (d.getMonth() + 1) + '.';
3247    }
3248
3249    boxes.forEach(function (box) {
3250      var shipOffset = parseInt(box.dataset.shipOffset, 10) || 0;
3251      var minDays = parseInt(box.dataset.minDays, 10) || 1;
3252      var maxDays = parseInt(box.dataset.maxDays, 10) || 3;
3253      var orderText = box.dataset.orderText || '';
3254
3255      var now = new Date();
3256      var shipDate = addBusinessDays(now, shipOffset);
3257      var shipDate2 = addBusinessDays(shipDate, 1);
3258      var minDate = addBusinessDays(shipDate, minDays - 1 < 0 ? 0 : minDays - 1);
3259      var maxDate = addBusinessDays(shipDate, maxDays - 1 < 0 ? 0 : maxDays - 1);
3260
3261      var shipTxt = fmt(shipDate) + ' – ' + fmt(shipDate2);
3262      var deliveryTxt = (minDays === maxDays) ? fmt(minDate) : fmt(minDate) + ' – ' + fmt(maxDate);
3263      var orderTxt = orderText || ('Tänään ' + fmt(now));
3264
3265      var orderEl = box.querySelector('[data-step="order"]');
3266      var shipEl = box.querySelector('[data-step="ship"]');
3267      var deliveredEl = box.querySelector('[data-step="delivered"]');
3268      if (orderEl) orderEl.textContent = orderTxt;
3269      if (shipEl) shipEl.textContent = shipTxt;
3270      if (deliveredEl) deliveredEl.textContent = deliveryTxt;
3271    });
3272  }
3273
3274  function init() {
3275    var root = document.getElementById('cpc-' + SID);
3276    var btn = document.getElementById('cpc-btn-' + SID);
3277    var errorEl = document.getElementById('cpc-err-' + SID);
3278    var mainVarEl = document.getElementById('cpc-main-' + SID);
3279    if (!root) return;
3280
3281    var SOLDOUT_TEXT = root.dataset.soldoutText || 'SOLD OUT';
3282    var SOLDOUT_CTA  = root.dataset.soldoutCta  || 'Loppuunmyyty';
3283    var LOW_THRESHOLD = parseInt(root.dataset.lowThreshold, 10) || 0;
3284    var LOW_TEXT = root.dataset.lowText || 'Vain [n] jäljellä';
3285    var PRESALE_CTA = root.dataset.presaleCta || 'Ennakkotilaa nyt';
3286    var COMBO_TEXT = root.dataset.comboText || 'Tämä yhdistelmä ei ole saatavilla';
3287
3288    initDeliveryTimelines(root);function readVariants(id) {
3289      var el = document.getElementById(id);
3290      if (!el) return [];
3291      try { return JSON.parse(el.textContent) || []; } catch (e) { return []; }
3292    }function createSelector(variants, optRoot, buttonClass, onApply) {
3293      var buttons = optRoot ? Array.prototype.slice.call(optRoot.querySelectorAll('.' + buttonClass)) : [];
3294      var selected = [null, null, null];
3295
3296      function matches(v, opts) {
3297        for (var i = 0; i < 3; i++) {
3298          if (opts[i] !== null && opts[i] !== undefined && v.o[i] !== opts[i]) return false;
3299        }
3300        return true;
3301      }
3302      function find(opts, onlyAvailable) {
3303        for (var i = 0; i < variants.length; i++) {
3304          var v = variants[i];
3305          if (onlyAvailable && !v.available) continue;
3306          if (matches(v, opts)) return v;
3307        }
3308        return null;
3309      }
3310      function byId(id) {
3311        for (var i = 0; i < variants.length; i++) { if (String(variants[i].id) === String(id)) return variants[i]; }
3312        return null;
3313      }
3314      function probeWith(idx, value) { var p = selected.slice(); p[idx] = value; return p; }
3315
3316      function paint() {
3317        buttons.forEach(function (b) {
3318          var idx = parseInt(b.dataset.opt, 10) - 1;
3319          var val = b.dataset.value;
3320          var isActive = selected[idx] === val;
3321          b.classList.toggle('active', isActive);
3322          b.setAttribute('aria-pressed', String(isActive));
3323          var isSwatch = b.classList.contains('swatch');var probe = isSwatch ? (function () { var q = [null, null, null]; q[idx] = val; return q; })() : probeWith(idx, val);
3324          var ok = !!find(probe, true);
3325          var exists = !!find(probe, false);
3326          b.classList.toggle(isSwatch ? 'swatch--soldout' : 'cpc__opt-pill--soldout', !ok);var hint = ok ? '' : (exists ? SOLDOUT_TEXT : COMBO_TEXT);
3327          var label = b.dataset.baseLabel || (b.dataset.baseLabel = b.getAttribute('aria-label') || val);
3328          b.setAttribute('aria-label', hint ? label + ' – ' + hint : label);
3329        });
3330        if (optRoot) {
3331          optRoot.querySelectorAll('[data-opt-val]').forEach(function (el) {
3332            var idx = parseInt(el.dataset.optVal, 10) - 1;
3333            if (selected[idx]) el.textContent = selected[idx];
3334          });
3335        }
3336      }
3337
3338      function apply(v, animate) {
3339        if (!v) return null;
3340        selected = [v.o[0] || null, v.o[1] || null, v.o[2] || null];
3341        paint();
3342        if (onApply) onApply(v, animate);
3343        return v;
3344      }
3345
3346      function pick(idx, value) {
3347        var trial = probeWith(idx, value);
3348        var v = find(trial, true) || find(trial, false);
3349        if (!v) {var relaxed = [null, null, null];
3350          relaxed[idx] = value;
3351          v = find(relaxed, true) || find(relaxed, false);
3352        }
3353        return apply(v, true);
3354      }
3355
3356      buttons.forEach(function (b) {
3357        b.addEventListener('click', function () {
3358          pick(parseInt(b.dataset.opt, 10) - 1, b.dataset.value);
3359        });
3360      });if (buttons.length) {
3361        var info = optRoot.closest('.bundle-info');
3362        var sel = info ? info.querySelector('.bundle-sel') : null;
3363        if (sel) sel.hidden = true;
3364      }
3365
3366      return {
3367        variants: variants,
3368        byId: byId,
3369        apply: apply,
3370        firstAvailable: function () { return find([null, null, null], true) || find([null, null, null], false); }
3371      };
3372    }
3373
3374    var VARIANTS = readVariants('cpc-variants-' + SID);
3375    var presaleConfigured = VARIANTS.some(function (v) { return v.presale === true; });
3376    var mainImg = document.getElementById('cpc-main-img-' + SID);
3377
3378    function variantById(id) {
3379      for (var i = 0; i < VARIANTS.length;
3379 i++) { if (String(VARIANTS[i].id) === String(id)) return VARIANTS[i]; }
3380      return null;
3381    }
3382
3383    var mainSelector = createSelector(
3384      VARIANTS,
3385      document.getElementById('cpc-opts-' + SID),
3386      'main-opt',
3387      function (v, animate) {
3388        if (mainVarEl) mainVarEl.value = v.id;
3389        var titleEl = document.getElementById('main-selected-' + SID);
3390        if (titleEl) titleEl.textContent = v.title || '';
3391        var bundleImg = document.getElementById('main-bundle-img-' + SID);
3392        if (bundleImg && v.img) { bundleImg.srcset = ''; bundleImg.src = v.img; }
3393        if (animate && mainImg && (v.full || v.img)) {
3394          mainImg.style.opacity = '0';
3395          setTimeout(function () {
3396            mainImg.src = v.full || v.img;
3397            mainImg.srcset = v.srcset || '';
3398            mainImg.style.opacity = '1';
3399          }, 100);
3400        }
3401        updatePrices(v.id);
3402      }
3403    );var GIFT_VARIANTS = readVariants('cpc-gift-variants-' + SID);
3404    var giftSelector = null;
3405    var giftVariant = null;
3406    if (GIFT_VARIANTS.length) {
3407      giftSelector = createSelector(
3408        GIFT_VARIANTS,
3409        document.getElementById('cpc-gift-opts-' + SID),
3410        'gift-opt',
3411        function (v) {
3412          giftVariant = v;
3413          selectedGiftId = v.id;
3414          var gTitle = document.getElementById('gift-selected-' + SID);
3415          if (gTitle) gTitle.textContent = v.title || '';
3416          var gTag = document.getElementById('gift-soldout-tag-' + SID);
3417          if (gTag) gTag.hidden = v.available !== false;
3418          var giftImg = document.getElementById('gift-img');
3419          if (giftImg && v.img) { giftImg.srcset = ''; giftImg.src = v.img; }
3420        }
3421      );
3422    }function applyAvailability(variantId) {
3423      var p = PRICES[String(variantId)];
3424      var isAvailable = p ? p.available !== false : true;
3425      var inv = p ? p.inventory : -1;
3426
3427      var vObj = variantById(variantId);
3428      var isPresale = !!(vObj && vObj.presale);var anyAvailable = VARIANTS.some(function (x) { return x.available !== false; });
3429      var showSoldOut = !isAvailable && !anyAvailable;
3430      var comboCta = SOLDOUT_CTA;
3431      var comboHint = SOLDOUT_TEXT;
3432      if (!isAvailable && anyAvailable && vObj) {
3433        var sameFirst = VARIANTS.some(function (x) { return x.available !== false && x.o[0] === vObj.o[0]; });
3434        var fixIdx = sameFirst ? 2 : 1;
3435        var nameEl = root.querySelector('#cpc-opts-' + SID + ' .cpc__opt-row[data-opt="' + fixIdx + '"] .cpc__opt-name');
3436        var nm = nameEl ? (nameEl.textContent || '').trim().toLowerCase() : '';
3437        if (!nm || nm.length > 12) nm = 'vaihtoehto';
3438        comboCta = 'Valitse toinen ' + nm;
3439        comboHint = sameFirst
3440          ? 'Tämä ' + (nm === 'vaihtoehto' ? 'vaihtoehto' : nm) + ' on loppu valitusta väristä — valitse toinen ' + nm + ' tai väri'
3441          : 'Tämä väri on loppu — valitse toinen väri';
3442      }
3443
3444      var flag = document.getElementById('cpc-soldout-' + SID);
3445      if (flag) flag.hidden = !showSoldOut;
3446
3447      var priceBox = root.querySelector('.cpc__price');
3448      if (priceBox) {
3449        priceBox.classList.toggle('cpc__price--soldout', showSoldOut);
3450        var soEl = priceBox.querySelector('.cpc__price-soldout');
3451        if (soEl) soEl.hidden = !showSoldOut;
3452      }
3453      root.querySelectorAll('.cpc__offer-box').forEach(function (ob) {
3454        ob.classList.toggle('cpc__offer-box--soldout', showSoldOut);
3455        var obSold = ob.querySelector('.cpc__price-soldout');
3456        if (obSold) obSold.hidden = !showSoldOut;
3457      });
3458
3459      var tag = document.getElementById('main-soldout-tag-' + SID);
3460      if (tag) tag.hidden = !showSoldOut;
3461
3462      var pTag = document.getElementById('main-presale-tag-' + SID);
3463      if (pTag) pTag.hidden = !isPresale || !isAvailable;
3464
3465      if (presaleConfigured) {
3466        root.querySelectorAll('.cpc__presale').forEach(function (b) {
3467          b.style.display = (isPresale && isAvailable) ? '' : 'none';
3468        });
3469      }
3470
3471      var lowEl = document.getElementById('main-lowstock-' + SID);
3472      if (lowEl) {
3473        if (!isAvailable) {
3474          lowEl.textContent = showSoldOut ? (SOLDOUT_TEXT + ' — tuote on loppuunmyyty') : comboHint;
3475          lowEl.classList.add('bundle-low-stock--out');
3476          lowEl.hidden = false;
3477        } else if (LOW_THRESHOLD > 0 && inv > 0 && inv <= LOW_THRESHOLD) {
3478          lowEl.textContent = LOW_TEXT.replace('[n]', inv);
3479          lowEl.classList.remove('bundle-low-stock--out');
3480          lowEl.hidden = false;
3481        } else {
3482          lowEl.hidden = true;
3483        }
3484      }
3485
3486      root.querySelectorAll('.cpc__delivery').forEach(function (d) {
3487        d.style.display = isAvailable ? '' : 'none';
3488      });
3489
3490      var rowDelivery = document.getElementById('main-delivery-' + SID);
3491      var rowDeliveryTxt = document.getElementById('main-delivery-text-' + SID);
3492      if (rowDelivery) {
3493        if (vObj && rowDeliveryTxt) {
3494          var delTxt = (isPresale && vObj.presaleDelivery) ? vObj.presaleDelivery : (vObj.delivery || '');
3495          rowDeliveryTxt.textContent = delTxt;
3496          rowDelivery.classList.toggle('bundle-delivery--presale', isPresale && !!vObj.presaleDelivery);
3497        }
3498        var hasTxt = rowDeliveryTxt ? !!(rowDeliveryTxt.textContent || '').trim() : false;
3499        rowDelivery.hidden = !isAvailable || !hasTxt;
3500      }
3501
3502      if (btn) {
3503        btn.disabled = !isAvailable;
3504        btn.setAttribute('aria-disabled', String(!isAvailable));
3505        var t = btn.querySelector('.cpc__cta-txt');
3506        if (t) t.textContent = !isAvailable ? (showSoldOut ? SOLDOUT_CTA : comboCta) : (isPresale ? PRESALE_CTA : (btn.dataset.text || t.textContent));
3507      }
3508      var sBtn = document.getElementById('cpc-sticky-btn-' + SID);
3509      if (sBtn) {
3510        sBtn.disabled = !isAvailable;
3511        sBtn.setAttribute('aria-disabled', String(!isAvailable));
3512        var st = sBtn.querySelector('.cpc-sticky__btn-txt');
3513        if (st) st.textContent = !isAvailable ? (showSoldOut ? SOLDOUT_CTA : comboCta) : (isPresale ? PRESALE_CTA : (sBtn.dataset.text || st.textContent));
3514      }
3515    }function updatePrices(variantId) {
3516      var p = PRICES[String(variantId)];
3517      if (!p) { applyAvailability(variantId); return; }
3518      var onSale = p.compare > p.price;
3519
3520      var priceBox = root.querySelector('.cpc__price');
3521      if (priceBox) {
3522        var nowEl = priceBox.querySelector('.cpc__price-now');
3523        var wasEl = priceBox.querySelector('.cpc__price-was');
3524        var badgeEl = priceBox.querySelector('.cpc__price-badge');
3525        if (nowEl) nowEl.textContent = p.priceMoney;
3526        if (wasEl) { wasEl.textContent = p.compareMoney; wasEl.hidden = !onSale; }
3527        if (badgeEl) {
3528          var pct = onSale ? Math.round((p.compare - p.price) * 100 / p.compare) : 0;
3529          badgeEl.textContent = (priceBox.dataset.badgeTpl || '').replace(/\[pct\]/g, pct).replace(/\[saving\]/g, p.savingMoney);
3530          badgeEl.hidden = !onSale;
3531        }
3532      }
3533
3534      var rowPrice = root.querySelector('.cpc__row-price');
3535      if (rowPrice) rowPrice.textContent = p.priceMoney;
3536      var rowCompare = root.querySelector('.cpc__compare-price');
3537      if (rowCompare) { rowCompare.textContent = p.compareMoney; rowCompare.hidden = !onSale; }
3538      var bigPrice = root.querySelector('.cpc__big-price');
3539      if (bigPrice) bigPrice.textContent = p.priceMoney;
3540      var savingRow = root.querySelector('.cpc__val-saving');
3541      if (savingRow) {
3542        var savingAmt = savingRow.querySelector('.cpc__saving-amt');
3543        if (savingAmt) savingAmt.textContent = p.savingMoney;
3544        savingRow.hidden = !onSale;
3545      }
3546
3547      var stickyEl = document.getElementById('cpc-sticky-' + SID);
3548      if (stickyEl) {
3549        var sCur = stickyEl.querySelector('.cpc-sticky__current');
3550        var sCmp = stickyEl.querySelector('.cpc-sticky__compare');
3551        if (sCur) sCur.textContent = p.priceMoney;
3552        if (sCmp) { sCmp.textContent = p.compareMoney; sCmp.hidden = !onSale; }
3553      }
3554
3555      root.querySelectorAll('.cpc__offer-box').forEach(function (ob) {
3556        var obNow = ob.querySelector('.cpc__ob-now');
3557        var obWas = ob.querySelector('.cpc__ob-was');
3558        var obBadge = ob.querySelector('.cpc__ob-badge');
3559        var obTotal = ob.querySelector('.cpc__ob-total');
3560        var obPct = onSale ? Math.round((p.compare - p.price) * 100 / p.compare) : 0;
3561        if (obNow) obNow.textContent = p.priceMoney;
3562        if (obWas) { obWas.textContent = p.compareMoney; obWas.hidden = !onSale; }
3563        if (obBadge) {
3564          obBadge.textContent = (ob.dataset.badgeTpl || '').replace(/\[pct\]/g, obPct).replace(/\[saving\]/g, p.savingMoney);
3565          obBadge.hidden = !onSale;
3566        }
3567        if (obTotal) {
3568          var totalCents = (onSale ? (p.compare - p.price) : 0) + (parseInt(ob.dataset.giftCents, 10) || 0);
3569          obTotal.textContent = formatCents(totalCents);
3570          var totalRow = obTotal.closest('.cpc__ob-row');
3571          if (totalRow) totalRow.hidden = totalCents <= 0;
3572        }
3573        var obSold = ob.querySelector('.cpc__price-soldout');
3574        ob.classList.toggle('cpc__offer-box--soldout', p.available === false);
3575        if (obSold) obSold.hidden = p.available !== false;
3576      });
3577
3578      applyAvailability(variantId);
3579    }var thumbsEl = document.getElementById('cpc-thumbs-' + SID);
3580    var prevBtn = document.getElementById('cpc-prev-' + SID);
3581    var nextBtn = document.getElementById('cpc-next-' + SID);
3582    var thumbs = root.querySelectorAll('.cpc__thumb');
3583    var currentIdx = 0;
3584
3585    function activateThumb(idx) {
3586      currentIdx = idx;
3587      thumbs.forEach(function (t, i) { t.classList.toggle('cpc__thumb--active', i === idx); });
3588      if (thumbsEl && thumbs[idx]) {
3589        var thumb = thumbs[idx];
3590        thumbsEl.scrollTo({ left: thumb.offsetLeft - thumbsEl.offsetWidth / 2 + thumb.offsetWidth / 2, behavior: 'smooth' });
3591      }
3592      if (prevBtn) prevBtn.disabled = idx === 0;
3593      if (nextBtn) nextBtn.disabled = idx === thumbs.length - 1;
3594    }
3595
3596    if (mainImg && thumbs.length) {
3597      thumbs.forEach(function (thumb, i) {
3598        thumb.addEventListener('click', function () {
3599          mainImg.style.opacity = '0';
3600          setTimeout(function () {
3601            mainImg.src = thumb.dataset.full;
3602            if (thumb.dataset.srcset) mainImg.srcset = thumb.dataset.srcset;
3603            mainImg.style.opacity = '1';
3604          }, 100);
3605          activateThumb(i);
3606        });
3607      });
3608      if (prevBtn) { prevBtn.disabled = true; prevBtn.addEventListener('click', function () { if (currentIdx > 0) thumbs[currentIdx - 1].click(); }); }
3609      if (nextBtn) { nextBtn.addEventListener('click', function () { if (currentIdx < thumbs.length - 1) thumbs[currentIdx + 1].click(); }); }
3610      activateThumb(0);
3611    }var bundleWrap = root.querySelector('.cpc__bundle-wrap');
3612    var initId = (bundleWrap && bundleWrap.dataset.mainVariant) ? bundleWrap.dataset.mainVariant : (mainVarEl ? mainVarEl.value : null);
3613    var initVariant = variantById(initId);
3614    if (initVariant) {
3615      mainSelector.apply(initVariant, false);
3616    } else if (initId) {
3617      if (mainVarEl) mainVarEl.value = initId;
3618      updatePrices(initId);
3619    }
3620
3621    if (giftSelector) {
3622      var giftInit = giftSelector.byId(selectedGiftId) || giftSelector.firstAvailable();
3623      if (giftInit) giftSelector.apply(giftInit, false);
3624    }var qty = 1;
3625    var qtyWrap = root.querySelector('.cpc__qty-wrap');
3626    var qtyInput = document.getElementById('cpc-qty-' + SID);
3627    var qtyMinus = document.getElementById('cpc-qty-minus-' + SID);
3628    var qtyPlus = document.getElementById('cpc-qty-plus-' + SID);
3629    var maxQty = qtyWrap ? (parseInt(qtyWrap.dataset.max, 10) || 10) : 10;
3630    function updateQtyUI() { if (qtyInput) qtyInput.value = qty; if (qtyMinus) qtyMinus.disabled = qty <= 1; if (qtyPlus) qtyPlus.disabled = qty >= maxQty; }
3631    if (qtyMinus) qtyMinus.addEventListener('click', function () { if (qty > 1) { qty--; updateQtyUI(); } });
3632    if (qtyPlus) qtyPlus.addEventListener('click', function () { if (qty < maxQty) { qty++; updateQtyUI(); } });
3633    updateQtyUI();
3634
3635    function setError(msg) { if (!errorEl) return; errorEl.hidden = !msg; if (msg) errorEl.textContent = msg; }
3636    function setBusy(on) { if (!btn) return; btn.setAttribute('aria-busy', on ? 'true' : 'false'); btn.disabled = on; }
3637
3638    function giftPayload() {
3639      if (!selectedGiftId) return null;if (giftVariant && giftVariant.available === false) return null;
3640      return { id: selectedGiftId, quantity: 1, properties: { '_free_gift': 'true', '_free_gift_campaign': 'cpc-bundle' } };
3641    }
3642
3643    if (btn) {
3644      btn.addEventListener('click', function () {
3645        var mainId = mainVarEl ? parseInt(mainVarEl.value, 10) : null;
3646        if (!mainId) { setError('Tuotteen variantti puuttuu.'); return; }
3647        var pInfo = PRICES[String(mainId)];
3648        if (pInfo && pInfo.available === false) { setError(SOLDOUT_TEXT + ' — valitse toinen vaihtoehto.'); return; }
3649        setError(null); setBusy(true);
3650        var items = [{ id: mainId, quantity: qty }];
3651        var gp = giftPayload(); if (gp) items.push(gp);
3652        var cartRoot = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';
3653        fetch(cartRoot + 'cart/add.js', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify({ items: items }) })
3654        .then(function (res) { if (!res.ok) return res.json().then(function (d) { throw new Error(d.description || d.message || 'Virhe'); }); return res.json(); })
3655        .then(function (data) {
3656          setBusy(false);
3657          if (DISCOUNT) { fetch(cartRoot + 'discount/' + encodeURIComponent(DISCOUNT)); }
3658          root.dispatchEvent(new CustomEvent('ajaxProduct:added', { bubbles: true, detail: { product: data, addToCartBtn: btn } }));
3659        })
3660        .catch(function (err) { setError('Virhe: ' + (err.message || 'Yritä uudelleen.')); setBusy(false); });
3661      });
3662    }
3663
3664    var stickyBar = document.getElementById('cpc-sticky-' + SID);
3665    var stickyBtn = document.getElementById('cpc-sticky-btn-' + SID);
3666    if (stickyBar && btn) {
3667      var ctaSeen = false;
3668      var observer = new IntersectionObserver(function (entries) {
3669        entries.forEach(function (entry) {
3670          if (entry.isIntersecting) { ctaSeen = true; stickyBar.setAttribute('aria-hidden', 'true'); }
3671          else if (ctaSeen) { stickyBar.setAttribute('aria-hidden', 'false'); }
3672        });
3673      }, { threshold: 0.1 });
3674      observer.observe(btn);
3675    }
3676    if (stickyBtn) {
3677      stickyBtn.addEventListener('click', function () {
3678        var mainId = mainVarEl ? parseInt(mainVarEl.value, 10) : null;
3679        if (!mainId) return;
3680        var pInfo = PRICES[String(mainId)];
3681        if (pInfo && pInfo.available === false) return;
3682        stickyBtn.setAttribute('aria-busy', 'true'); stickyBtn.disabled = true;
3683        var items = [{ id: mainId, quantity: qty }];
3684        var gp2 = giftPayload(); if (gp2) items.push(gp2);
3685        var cartRoot = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';
3686        fetch(cartRoot + 'cart/add.js', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify({ items: items }) })
3687        .then(function (res) { if (!res.ok) return res.json().then(function (d) { throw new Error(d.description || d.message || 'Virhe'); }); return res.json(); })
3688        .then(function (data) {
3689          stickyBtn.setAttribute('aria-busy', 'false'); stickyBtn.disabled = false;
3690          if (DISCOUNT) { fetch(cartRoot + 'discount/' + encodeURIComponent(DISCOUNT)); }
3691          document.body.dispatchEvent(new CustomEvent('ajaxProduct:added', { bubbles: true, detail: { product: data, addToCartBtn: stickyBtn } }));
3692        })
3693        .catch(function (err) {
3694          stickyBtn.setAttribute('aria-busy', 'false'); stickyBtn.disabled = false;
3695          if (errorEl) { errorEl.hidden = false; errorEl.textContent = 'Virhe: ' + (err.message || 'Yritä uudelleen.'); }
3696        });
3697      });
3698    }
3699
3700    var countdownEl = root.querySelector('.cpc__countdown');
3701    var hEl = document.getElementById('cpc-h-' + SID);
3702    var mEl = document.getElementById('cpc-m-' + SID);
3703    var sEl = document.getElementById('cpc-s-' + SID);
3704    if (hEl && mEl && sEl && countdownEl) {
3705      var pad = function (n) { return String(n).padStart(2, '0'); };
3706      var endTime = null;
3707      var endAttr = countdownEl.dataset.end;
3708      var hoursAttr = parseInt(countdownEl.dataset.hours, 10);
3709      var storageKey = 'cpc_end_' + SID;
3710      if (endAttr) { endTime = new Date(endAttr).getTime(); }
3711      else if (hoursAttr > 0) {
3712        var stored = sessionStorage.getItem(storageKey);
3713        if (stored) { endTime = parseInt(stored, 10); }
3714        else { endTime = Date.now() + hoursAttr * 3600000; try { sessionStorage.setItem(storageKey, endTime); } catch (e) {} }
3715      } else { var eod = new Date(); eod.setHours(23, 59, 59, 999); endTime = eod.getTime(); }
3716      var iv = null;
3717      var tick = function () {
3718        var diff = endTime - Date.now();
3719        if (diff <= 0) { hEl.textContent = '00'; mEl.textContent = '00'; sEl.textContent = '00'; if (iv) clearInterval(iv); return; }
3720        hEl.textContent = pad(Math.floor(diff / 3600000));
3721        mEl.textContent = pad(Math.floor(diff % 3600000 / 60000));
3722        sEl.textContent = pad(Math.floor(diff % 60000 / 1000));
3723      };
3724      tick();
3725      iv = setInterval(tick, 1000);
3726      document.addEventListener('shopify:section:unload', function (e) { if (e.detail && e.detail.sectionId === SID) clearInterval(iv); });
3727    }
3728  }
3729
3730  document.readyState === 'loading' ? document.addEventListener('DOMContentLoaded', init) : init();
3731  document.addEventListener('shopify:section:load', function (e) { if (e.detail && e.detail.sectionId === SID) init(); });
3732})();
3733</script>
3733
3734
3735</div><div id="shopify-section-template--31561534275926__sn_settings_6dTndp" class="shopify-section"><style data-shopify>
3736    .light-theme {
3737    --primary: #ff4caf;
3738    --btn-text: #fff;
3739    --btn-bg: #242833;
3740    --secondary: #000;
3741    --heading: #000;
3742    --text: #444;
3743    --stars: #ff4caf;
3744    --accent: #000000;
3745    --background1: ;
3746    --background2: ;
3747    --gradient-bg: rgb(255,76,175);
3748    --gradient: linear-gradient(90deg, rgba(255,76,175,1) 0%, rgba(255,207,67,1) 100%);
3749  }
3750
3751  .dark-theme {
3752    --primary: #ff4caf;
3753    --btn-bg: #242833;
3754    --btn-text: #fff;
3755    --secondary: #000;
3756    --stars: #ff4caf;
3757    --accent: #000000;
3758    --heading: #fff;
3759    --text: #f9f9f9;
3760    --background1: ;
3761    --background2: ;
3762  }
3763</style>
3764
3765
3766
3767
3768
3769
3770</div><div id="shopify-section-template--31561534275926__sn_more_info_wpmcLR" class="shopify-section"><style data-shopify>
3771  #sn-more {
3772    padding: 0 20px 80px;
3773  }
3774  #sn-more .collapsible{
3775    display: flex;
3776    justify-content: space-between;
3777    align-items: center;
3778    gap: 10px;
3779  }
3780  #sn-more .collapsible .collapse-title{
3781    display: flex;
3782    align-items: center;
3783    gap: 10px;
3784  }
3785  #sn-more .collapsible .collapse-title .collapse-icon{
3786    width: 30px;
3787    display: block;
3788  }
3789  @media screen and (max-width: 767px) {
3790    #sn-more {
3791      padding: 20px 10px;
3792    }
3793    #sn-more .collapsible .collapse-title .collapse-icon{
3794      width: 25px;
3795      display: block;
3796    }
3797  }
3798  
3799</style>
3800
3801<section
3802  id="sn-more"
3803  class="landing light-theme"
3804>
3805  <div class="sn-container">
3806    <div class="sn-more-info-wrap sn-col-1">
3807      
3808        
3809            <div class="collapsible " >
3810              <div class="collapse-title"><span class="collapse-icon"><img src="//joyearbuds.com/cdn/shop/files/document.svg?v=1745998079&width=120" class="sn-img"></span><p>Product details</p></div>
3811            </div>
3812            <div class="content">
3813              <p><strong>Design & Fit</strong><br/> 2.8 grams per earbud<br/> Sleek, minimalistic design tailored for smaller ears<br/> Includes 7 sizes of antibacterial, interchangeable ear tips for a secure and comfortable fit <br/></p><p><strong>Audio & Features</strong><br/> Studio-grade HiFi audio with clear highs and deep bass <br/> Built-in microphone with quick mute functionality for calls<br/>Optimized mode for audiobooks and voice recordings<br/></p><p><strong>Battery & Charging</strong><br/>Up to 6 hours on a single charge<br/>Provides additional charges, extending total usage time<br/>USB-C for fast and convenient charging</p><p><strong>Connectivity</strong><br/> Bluetooth 5.4 for faster, more stable connections and improved battery efficiency <br/>Seamless pairing with a wide range of devices<br/></p><p><strong>Durability & Warranty</strong><br/>3-year product warranty, 1-year loss warranty, and 60-day satisfaction guarantee <br/>Designed to withstand daily use and workouts</p><p>If you lose your product, we offer replacement parts at a discount. You may purchase up to two replacement parts (such as a left or right earbud or charging case) with a 20% discount.<br/></p><p><strong>Sustainability</strong><br/>Developed with ecological sustainability in mind without compromising performance </p>
3814            </div>
3815        
3816      
3817        
3818            <div class="collapsible " >
3819              <div class="collapse-title"><span class="collapse-icon"><img src="//joyearbuds.com/cdn/shop/files/box.svg?v=1745998095&width=120" class="sn-img"></span><p>Shipping & Returns</p></div>
3820            </div>
3821            <div class="content">
3822              <p>We deliver to all countries to which UPS offers delivery service. At the moment, we do not deliver to Russia.</p><p>For Finland, we use Finnish Posti and provide free shipping on all purchases over 40€. Please allow 2-7 business days for delivery.</p><p>On orders to all other EU countries, we charge 9.90€ per order. For EU countries please allow 2-10 business days for delivery.</p><p><strong>For countries outside EU, we charge 15 € per order. Delivery times depend on the country. You will get the tracking code from DHL to follow the estimated delivery time. </strong>Please note, that Joy Planet Finland will not cover any customs or duties on your order.</p><p>If your order does not arrive in time or is held in the possession of the courier, please email us here with your order number - <a href="mailto:[email protected]" title="mailto:[email protected]">[email protected]</a>. If your order is lost or damaged in transit, we will replace the order for free. Simply contact us at <a href="mailto:[email protected]" title="mailto:[email protected]">[email protected]</a></p>
3823            </div>
3824        
3825      
3826    </div>
3827  </div>
3828
3829  
3830</section>
3831
3832
3833
3834
3835
3836
3837</div><div id="shopify-section-template--31561534275926__sn_settings_HW3TiW" class="shopify-section"><style data-shopify>
3838    .light-theme {
3839    --primary: ;
3840    --btn-text: #fff;
3841    --btn-bg: ;
3842    --secondary: #000;
3843    --heading: #000;
3844    --text: #444;
3845    --stars: ;
3846    --accent: ;
3847    --background1: ;
3848    --background2: ;
3849    --gradient-bg: rgb(255,76,175);
3850    --gradient: linear-gradient(90deg, rgba(255,76,175,1) 0%, rgba(255,207,67,1) 100%);
3851  }
3852
3853  .dark-theme {
3854    --primary: ;
3855    --btn-bg: ;
3856    --btn-text: #fff;
3857    --secondary: #000;
3858    --stars: ;
3859    --accent: ;
3860    --heading: #fff;
3861    --text: #f9f9f9;
3862    --background1: ;
3863    --background2: ;
3864  }
3865</style>
3866
3867
3868
3869
3870
3871
3872</div><section id="shopify-section-template--31561534275926__177105543566597311" class="shopify-section"><div class="page-width"></div>
3873</section><div id="shopify-section-template--31561534275926__sn_marquee_4GzL4n" class="shopify-section"><style data-shopify>
3874  #sn-marquee {
3875    padding: 20px 0;
3876    background: #f9f9f9;
3877  }
3878  .marquee-slider{
3879    display: flex;
3880    gap: 50px;
3881    overflow-x: auto;
3882    flex-wrap: nowrap;
3883  }
3884  .marquee-wrap{
3885    margin: 0 50px;
3886    display: flex !important;
3887    flex-shrink: 0;
3888    gap: 20px;
3889  }
3890  .marquee-wrap img{
3891    flex-basis: 40px !important;
3892    width: 40px !important;
3893  }
3894  .marquee-wrap h4, .marquee-wrap h3, .marquee-wrap p{
3895    background: var(--gradient-bg);
3896    background: var(--gradient);
3897    -webkit-background-clip: text;
3898    -webkit-text-fill-color: transparent;
3899  }
3900  @media screen and (max-width: 767px) {
3901    #sn-marquee {
3902      padding: 20px 10px;
3903    }
3904  }
3905  
3906</style>
3907
3908<section
3909  id="sn-marquee"
3910  class="landing light-theme"
3911>
3912  <div class="sn-container text-center full">
3913    <div class="marquee-slider">
3914      
3915        
3916            <div class="marquee-wrap" >
3917              
3918              <span class="marquee-icon">
3919                <img src="//joyearbuds.com/cdn/shop/files/warranty_85019d69-827a-4609-88dd-1c3bb0fc865b_80x.png?v=1745997954" alt="" class="sn-img">
3920              </span>
3921              
3922              
3923              <span class="marquee-text">
3924                <h3><strong>Free Shipping Available on Domestic Orders over 40€</strong></h3>
3925              </span>
3926              
3927            </div>
3928        
3929      
3930        
3931            <div class="marquee-wrap" >
3932              
3933              <span class="marquee-icon">
3934                <img src="//joyearbuds.com/cdn/shop/files/guarantee_80x.png?v=1745997953" alt="" class="sn-img">
3935              </span>
3936              
3937              
3938              <span class="marquee-text">
3939                <h3><strong>Designed in Finland</strong></h3>
3940              </span>
3941              
3942            </div>
3943        
3944      
3945        
3946            <div class="marquee-wrap" >
3947              
3948              <span class="marquee-icon">
3949                <img src="//joyearbuds.com/cdn/shop/files/global-shipping_1_80x.png?v=1745997930" alt="" class="sn-img">
3950              </span>
3951              
3952              
3953              <span class="marquee-text">
3954                <h3><strong>60-Day Returns</strong></h3>
3955              </span>
3956              
3957            </div>
3958        
3959      
3960        
3961            <div class="marquee-wrap" >
3962              
3963              <span class="marquee-icon">
3964                <img src="//joyearbuds.com/cdn/shop/files/finland_80x.png?v=1745997953" alt="" class="sn-img">
3965              </span>
3966              
3967              
3968              <span class="marquee-text">
3969                <h3><strong>3-Year Product Warranty</strong></h3>
3970              </span>
3971              
3972            </div>
3973        
3974      
3975        
3976            <div class="marquee-wrap" >
3977              
3978              <span class="marquee-icon">
3979                <img src="//joyearbuds.com/cdn/shop/files/return-box_80x.png?v=1745997953" alt="" class="sn-img">
3980              </span>
3981              
3982              
3983              <span class="marquee-text">
3984                <h3><strong>Professional Customer Support</strong></h3>
3985              </span>
3986              
3987            </div>
3988        
3989      
3990        
3991            <div class="marquee-wrap" >
3992              
3993              <span class="marquee-icon">
3994                <img src="//joyearbuds.com/cdn/shop/files/duration_80x.png?v=1745997953" alt="" class="sn-img">
3995              </span>
3996              
3997              
3998              <span class="marquee-text">
3999                <h3><strong>100% Secure Payment</strong></h3>
4000              </span>
4001              
4002            </div>
4003        
4004      
4005    </div>
4006  </div>
4007
4008  
4009</section>
4010
4011
4012
4013
4014
4015
4016
4017</div><div id="shopify-section-template--31561534275926__urgency_banner_KeBa9r" class="shopify-section index-section"><style>
4018  #oab-bar-template--31561534275926__urgency_banner_KeBa9r {
4019    position: fixed;
4020    top: 0;
4021    left: 0;
4022    right: 0;
4023    z-index: 99999;
4024    background: #edb35a;
4025    border-bottom: 1px solid #1f1f1f;
4026    transform: translateY(0);
4027  }
4028  .shopify-design-mode #oab-bar-template--31561534275926__urgency_banner_KeBa9r {
4029    position: relative;
4030    top: auto; left: auto; right: auto;
4031    z-index: 1;
4032  }
4033  #oab-bar-template--31561534275926__urgency_banner_KeBa9r .oab-inner {
4034    display: flex;
4035    align-items: center;
4036    justify-content: center;
4037    padding: 0 48px;
4038    min-height: 42px;
4039    position: relative;
4040    gap: 16px;
4041    flex-wrap: nowrap;
4042    overflow: hidden;
4043  }
4044  #oab-bar-template--31561534275926__urgency_banner_KeBa9r .oab-message {
4045    font-size: 13px;
4046    font-weight: 700;
4047    color: #ffffff;
4048    text-transform: uppercase;
4049    letter-spacing: 0.06em;
4050    white-space: nowrap;
4051  }
4052  #oab-bar-template--31561534275926__urgency_banner_KeBa9r .oab-message a {
4053    color: #39ff6a;
4054    text-decoration: underline;
4055    text-underline-offset: 3px;
4056  }
4057  #oab-bar-template--31561534275926__urgency_banner_KeBa9r .oab-sep {
4058    width: 1px;
4059    height: 13px;
4060    background: #ffffff;
4061    opacity: 0.25;
4062    flex-shrink: 0;
4063  }
4064  #oab-bar-template--31561534275926__urgency_banner_KeBa9r .oab-stock {
4065    display: flex;
4066    align-items: center;
4067    gap: 6px;
4068    font-size: 12px;
4069    font-weight: 700;
4070    color: #ffffff;
4071    text-transform: uppercase;
4072    letter-spacing: 0.05em;
4073    white-space: nowrap;
4074  }
4075  #oab-bar-template--31561534275926__urgency_banner_KeBa9r .oab-stock-dot {
4076    width: 7px;
4077    height: 7px;
4078    border-radius: 50%;
4079    flex-shrink: 0;
4080    animation: oab-pulse-template--31561534275926__urgency_banner_KeBa9r 1.5s ease-in-out infinite;
4081  }
4082  @keyframes oab-pulse-template--31561534275926__urgency_banner_KeBa9r {
4083    0%, 100% { opacity: 1; transform: scale(1); }
4084    50%       { opacity: 0.4; transform: scale(0.65); }
4085  }
4086  #oab-bar-template--31561534275926__urgency_banner_KeBa9r .oab-close {
4087    position: absolute;
4088    right: 12px;
4089    top: 50%;
4090    transform: translateY(-50%);
4091    background: none;
4092    border: none;
4093    cursor: pointer;
4094    color: #ffffff;
4095    opacity: 0.5;
4096    font-size: 18px;
4097    line-height: 1;
4098    padding: 4px 6px;
4099    transition: opacity 0.15s;
4100  }
4101  #oab-bar-template--31561534275926__urgency_banner_KeBa9r .oab-close:hover { opacity: 1; }
4102
4103  @media screen and (max-width: 600px) {
4104    #oab-bar-template--31561534275926__urgency_banner_KeBa9r .oab-inner {
4105      flex-direction: column;
4106      gap: 4px;
4107      padding: 8px 48px;
4108      align-items: center;
4109      justify-content: center;
4110    }
4111    #oab-bar-template--31561534275926__urgency_banner_KeBa9r .oab-sep { display: none; }
4112    #oab-bar-template--31561534275926__urgency_banner_KeBa9r .oab-message {
4113      font-size: 11px;
4114      letter-spacing: 0.04em;
4115      white-space: normal;
4116      text-align: center;
4117    }
4118    #oab-bar-template--31561534275926__urgency_banner_KeBa9r .oab-stock { font-size: 10px; }
4119  }
4120</style>
4121
4122<div id="oab-bar-template--31561534275926__urgency_banner_KeBa9r" role="banner" aria-label="Ilmoituspalkki">
4123  <div class="oab-inner"><span class="oab-message">Golden TinyS now in presale!
4124</span></div>
4125</div>
4126
4127<script>
4128(function() {
4129  var bar = document.getElementById('oab-bar-template--31561534275926__urgency_banner_KeBa9r');
4130  if (!bar) return;
4131
4132  var inEditor = window.Shopify && window.Shopify.designMode;
4133
4134  if (!inEditor && sessionStorage.getItem('oab_dismissed_template--31561534275926__urgency_banner_KeBa9r')) {
4135    bar.style.display = 'none';
4136    return;
4137  }
4138
4139  var barHeight = bar.offsetHeight;
4140  document.body.style.paddingTop = barHeight + 'px';
4141
4142  var dismissed = false;
4143
4144  window.addEventListener('scroll', function () {
4145    if (dismissed) return;
4146    var scrollY = window.scrollY || window.pageYOffset;
4147    var offset = Math.min(scrollY, barHeight);
4148    bar.style.transform = 'translateY(-' + offset + 'px)';
4149  }, { passive: true });
4150
4151  var closeBtn = document.getElementById('oab-close-template--31561534275926__urgency_banner_KeBa9r');
4152  if (closeBtn) {
4153    closeBtn.addEventListener('click', function() {
4154      dismissed = true;
4155      bar.style.transition = 'transform 0.2s ease';
4156      bar.style.transform = 'translateY(-' + barHeight + 'px)';
4157      document.body.style.paddingTop = '0';
4158      if (!inEditor) sessionStorage.setItem('oab_dismissed_template--31561534275926__urgency_banner_KeBa9r', '1');
4159    });
4160  }
4161})();
4162</script>
4162
4163
4164</div><div id="shopify-section-template--31561534275926__textimage_pHPVkK" class="shopify-section"><style>
4165  #cc-template--31561534275926__textimage_pHPVkK {
4166    background: #ffffff;
4167    padding: 80px 0 80px;
4168    font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
4169    box-sizing: border-box;
4170  }
4171  #cc-template--31561534275926__textimage_pHPVkK *, #cc-template--31561534275926__textimage_pHPVkK *::before, #cc-template--31561534275926__textimage_pHPVkK *::after {
4172    box-sizing: border-box; margin: 0; padding: 0;
4173  }
4174
4175  /* ── GRID ── */
4176  #cc-template--31561534275926__textimage_pHPVkK .cc-grid {
4177    max-width: 1080px; margin: 0 auto; padding: 0 48px;
4178    display: grid; grid-template-columns: 1fr 1fr;
4179    gap: 80px; align-items: center;
4180  }
4181
4182  /* ── TEXT SIDE ── */
4183  #cc-template--31561534275926__textimage_pHPVkK .cc-text { display: flex; flex-direction: column; gap: 28px; }
4184  #cc-template--31561534275926__textimage_pHPVkK .cc-eyebrow {
4185    font-size: 11px; font-weight: 700;
4186    letter-spacing: 2.5px; text-transform: uppercase;
4187    color: #111111;
4188  }
4189  #cc-template--31561534275926__textimage_pHPVkK .cc-title {
4190    font-size: clamp(32px, 4.5vw, 56px);
4191    font-weight: 900; letter-spacing: -2px; line-height: 1.0;
4192    color: #111111;
4193  }
4194  #cc-template--31561534275926__textimage_pHPVkK .cc-body {
4195    font-size: 16px; line-height: 1.7;
4196    color: #111111;
4197    max-width: 420px;
4198  }
4199
4200  /* ── DEMO BUTTON ── */
4201  #cc-template--31561534275926__textimage_pHPVkK .cc-demo-btn {
4202    display: inline-flex; align-items: center; gap: 10px;
4203    border: 1.5px solid rgba(17, 17, 17, 0.18);
4204    background: transparent;
4205    color: #111111;
4206    border-radius: 100px; padding: 12px 22px;
4207    font-size: 14px; font-weight: 700; font-family: inherit;
4208    cursor: pointer; width: fit-content;
4209    transition: border-color .2s, background .2s;
4210    -webkit-tap-highlight-color: transparent;
4211    touch-action: manipulation;
4212  }
4213  #cc-template--31561534275926__textimage_pHPVkK .cc-demo-btn:hover {
4214    border-color: #111111;
4215    background: rgba(17, 17, 17, 0.06);
4216  }
4217  #cc-template--31561534275926__textimage_pHPVkK .cc-demo-btn-dot {
4218    width: 8px; height: 8px; border-radius: 50%;
4219    background: #111111;
4220    animation: cc-blink-template--31561534275926__textimage_pHPVkK 1.4s ease-in-out infinite;
4221    flex-shrink: 0;
4222  }
4223  @keyframes cc-blink-template--31561534275926__textimage_pHPVkK {
4224    0%,100% { opacity:1; } 50% { opacity:0.3; }
4225  }
4226
4227  /* ── IMAGE SIDE ── */
4228  #cc-template--31561534275926__textimage_pHPVkK .cc-image {
4229    position: relative; border-radius: 24px; overflow: hidden;
4230    aspect-ratio: 4/5; background: #e8e4de;
4231  }
4232  #cc-template--31561534275926__textimage_pHPVkK .cc-image img { width:100%; height:100%; object-fit:cover; display:block; }
4233  #cc-template--31561534275926__textimage_pHPVkK .cc-image img.cc-img-mobile  { display: none; }
4234  #cc-template--31561534275926__textimage_pHPVkK .cc-image img.cc-img-desktop { display: block; }
4235  @media (max-width: 720px) {
4236    #cc-template--31561534275926__textimage_pHPVkK .cc-image img.cc-img-desktop { display: none; }
4237    #cc-template--31561534275926__textimage_pHPVkK .cc-image img.cc-img-mobile  { display: block; }
4238  }
4239  #cc-template--31561534275926__textimage_pHPVkK .cc-badge {
4240    position: absolute; bottom: 24px; left: 50%;
4241    transform: translateX(-50%);
4242    background: rgba(0,0,0,0.72);
4243    backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
4244    border: 1px solid rgba(255,255,255,0.1);
4245    border-radius: 100px; padding: 10px 20px;
4246    display: flex; align-items: center; gap: 10px; white-space: nowrap;
4247  }
4248  #cc-template--31561534275926__textimage_pHPVkK .cc-badge-dot {
4249    width: 8px; height: 8px; border-radius: 50%;
4250    background: #4ade80;
4251    box-shadow: 0 0 8px #4ade80;
4252    animation: cc-pulse-template--31561534275926__textimage_pHPVkK 2s ease-in-out infinite;
4253  }
4254  @keyframes cc-pulse-template--31561534275926__textimage_pHPVkK {
4255    0%,100% { opacity:1; transform:scale(1); } 50% { opacity:0.6; transform:scale(1.4); }
4256  }
4257  #cc-template--31561534275926__textimage_pHPVkK .cc-badge-txt { font-size:12px; font-weight:700; color:#fff; letter-spacing:0.5px; }
4258  #cc-template--31561534275926__textimage_pHPVkK .cc-image-ph {
4259    width:100%; height:100%; display:flex; align-items:center; justify-content:center;
4260    font-size:13px; color:rgba(0,0,0,0.2);
4261  }
4262
4263  /* ── MODAL OVERLAY ── */
4264  #cc-modal-template--31561534275926__textimage_pHPVkK {
4265    display: none;
4266    position: fixed; inset: 0; z-index: 9999;
4267    align-items: flex-end;
4268    justify-content: center;
4269    background: rgba(0,0,0,0.55);
4270    backdrop-filter: blur(4px);
4271    -webkit-backdrop-filter: blur(4px);
4272    -webkit-tap-highlight-color: transparent;
4273  }
4274  #cc-modal-template--31561534275926__textimage_pHPVkK.open { display: flex; }
4275
4276  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-sheet {
4277    background: #fff;
4278    border-radius: 24px 24px 0 0;
4279    padding: 28px 28px 40px;
4280    width: 100%; max-width: 560px;
4281    display: flex; flex-direction: column; gap: 24px;
4282    font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
4283    animation: cc-slideup-template--31561534275926__textimage_pHPVkK 0.32s cubic-bezier(0.16,1,0.3,1) both;
4284  }
4285  @keyframes cc-slideup-template--31561534275926__textimage_pHPVkK {
4286    from { transform: translateY(100%); }
4287    to   { transform: translateY(0); }
4288  }
4289
4290  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-sheet-top {
4291    display: flex; align-items: center; justify-content: space-between;
4292  }
4293  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-sheet-title {
4294    font-size: 17px; font-weight: 800; color: #111; letter-spacing: -0.4px;
4295  }
4296  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-close {
4297    width: 32px; height: 32px; border-radius: 50%;
4298    background: #f2f2f2; border: none; cursor: pointer;
4299    display: flex; align-items: center; justify-content: center;
4300    font-size: 16px; color: #555; font-family: inherit;
4301    touch-action: manipulation; -webkit-tap-highlight-color: transparent;
4302  }
4303
4304  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-btns {
4305    display: grid; grid-template-columns: 1fr 1fr; gap: 10px;
4306  }
4307  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-btn {
4308    border: 2px solid rgba(0,0,0,0.1);
4309    background: transparent; border-radius: 14px;
4310    padding: 14px 12px; cursor: pointer;
4311    font-family: inherit; text-align: left;
4312    touch-action: manipulation; -webkit-tap-highlight-color: transparent;
4313    transition: border-color .2s, background .2s;
4314  }
4315  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-btn .mb-tag {
4316    display: block; font-size: 9px; font-weight: 800;
4317    letter-spacing: 1.5px; text-transform: uppercase; margin-bottom: 4px;
4318  }
4319  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-btn .mb-name {
4320    display: block; font-size: 14px; font-weight: 800; color: #111;
4321  }
4322  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-btn .mb-sub {
4323    display: block; font-size: 11px; color: rgba(0,0,0,0.38);
4324    margin-top: 3px; line-height: 1.4;
4325  }
4326  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-btn.basic .mb-tag { color: #999; }
4327  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-btn.basic.sel {
4328    border-color: rgba(0,0,0,0.3); background: rgba(0,0,0,0.04);
4329  }
4330  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-btn.pro .mb-tag { color: #111111; }
4331  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-btn.pro.sel {
4332    border-color: #111111;
4333    background: rgba(17, 17, 17, 0.07);
4334  }
4335  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-btn.pro.sel .mb-name { color: #111111; }
4336
4337  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-cv-wrap {
4338    height: 120px; border-radius: 14px; overflow: hidden; position: relative;
4339    background: #f8f8f5;
4340  }
4341  #cc-modal-template--31561534275926__textimage_pHPVkK canvas {
4342    position: absolute; inset: 0; width: 100%; height: 100%; display: block;
4343  }
4344
4345  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-status { text-align: center; }
4346  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-lbl {
4347    font-size: 14px; font-weight: 600; color: #111; min-height: 20px;
4348    transition: color .3s;
4349  }
4350  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-lbl.pro { color: #111111; }
4351  #cc-modal-template--31561534275926__textimage_pHPVkK .cc-m-sub {
4352    font-size: 12px; color: rgba(0,0,0,0.32); margin-top: 4px;
4353  }
4354
4355  /* ── MOBILE ── */
4356  @media (max-width: 720px) {
4357    #cc-template--31561534275926__textimage_pHPVkK .cc-grid { grid-template-columns: 1fr; padding: 0 24px; gap: 40px; }
4358    #cc-template--31561534275926__textimage_pHPVkK .cc-image { aspect-ratio: 4/3; order: -1; }
4359    #cc-template--31561534275926__textimage_pHPVkK .cc-title { letter-spacing: -1px; }
4360  }
4361</style>
4362
4363<section id="cc-template--31561534275926__textimage_pHPVkK">
4364  <div class="cc-grid">
4365
4366    <!-- TEXT -->
4367    <div class="cc-text"><div class="cc-eyebrow">The first earbuds designed for small ears</div><h2 class="cc-title">EARBUDS THAT STAY PUT AND DON’T HURT</h2><p class="cc-body">Women’s ears are on average 20% smaller than men’s. Yet most earbuds are designed in the same size for everyone.
4368<br>
4369TinyS was developed to solve this problem with its unique design.</p><!-- Demo trigger button --></div>
4370
4371    <!-- IMAGE -->
4372    <div class="cc-image"><img class="" src="//joyearbuds.com/cdn/shop/files/DSC0624_large_11adc014-db7e-43b4-bf95-84d878cdfd33.jpg?v=1779798547&width=900" alt="EARBUDS THAT STAY PUT AND DON’T HURT" loading="lazy"
4373               width="1920" height="2400"></div>
4374
4375  </div>
4376</section></div><section id="shopify-section-template--31561534275926__1779789053b109bb79" class="shopify-section"><div class="index-section"><div class="page-width"></div></div>
4377</section><section id="shopify-section-template--31561534275926__1779802571ee39fb0c" class="shopify-section"><div class="index-section"><div class="page-width"><div id="shopify-block-AVFh3KytkclQwZnJwK__loox_reviews_loox_testimonial_carousel_section_wL7t6Q" class="shopify-block shopify-app-block">
4378    <div class="loox-v2-carousel-container loox-widget"
4379         id="LOOX-V2_CAROUSEL-AVFh3KytkclQwZnJwK__loox_reviews_loox_testimonial_carousel_section_wL7t6Q"
4380         data-widget="carousel"
4381         data-slide-type="testimonial"
4382          data-max-width="1100" 
4383 data-desktop-font-size="25" 
4384 data-mobile-font-size="20" 
4385 data-max-number-of-characters="100" 
4386 data-quote-mark-icon="style-1" 
4387 data-reviewer-name-color="000000" 
4388 data-text-color="000000" 
4389 data-stars-color="" 
4390 data-quotes-icon-color="eaeaea" 
4391 data-arrows_icon-color="000000" 
4392 data-arrows_hide-on-mobile="yes" 
4393 data-pagination_active="yes" 
4394 data-pagination_selected-dot-color="000000" 
4395 data-pagination_dot-color="000000" 
4396 data-autoplay_active="yes" 
4397 data-autoplay_duration="2" 
4398 data-product-ids="10259673448790" 
4399
4400         data-customer-locale="en"
4401         
4402    >
4403    </div>
4404    
4405    
4406    </div>
4407</div></div>
4408</section><div id="shopify-section-template--31561534275926__video_BBjtzP" class="shopify-section"><style>
4409  #vh-template--31561534275926__video_BBjtzP {
4410    position: relative;
4411    width: 100%;
4412    background: #111111;
4413    overflow: hidden;
4414    font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
4415    /* Osion ulkoreunat — mobiili */
4416    padding: 0px 0px 0px;
4417  }
4418
4419  /* ── VIDEO WRAPPER ── */
4420  #vh-template--31561534275926__video_BBjtzP .vh-video-wrap {
4421    position: relative;
4422    width: 100%;
4423    max-width: 100%;
4424    margin: 0 auto;
4425    aspect-ratio: 9 / 16;
4426    overflow: hidden;
4427    border-radius: 0px;
4428  }
4429
4430  #vh-template--31561534275926__video_BBjtzP .vh-video-wrap video,
4431  #vh-template--31561534275926__video_BBjtzP .vh-video-wrap iframe {
4432    position: absolute;
4433    inset: 0;
4434    width: 100%;
4435    height: 100%;
4436    object-fit: cover;
4437    display: block;
4438  }
4439
4440  /* ── OVERLAY ── */
4441  #vh-template--31561534275926__video_BBjtzP .vh-overlay {
4442    position: absolute;
4443    inset: 0;
4444    background: #000000;
4445    opacity: 0.05;
4446    pointer-events: none;
4447  }
4448
4449  /* ── TEXT CONTENT ── */
4450  #vh-template--31561534275926__video_BBjtzP .vh-content {
4451    position: absolute;
4452    inset: 0;
4453    display: flex;
4454    flex-direction: column;
4455    align-items: center;
4456    justify-content: center;
4457    /* Sisällön välistykset — mobiili */
4458    padding: 32px 24px;
4459    text-align: center;
4460    pointer-events: none;
4461  }
4462  #vh-template--31561534275926__video_BBjtzP .vh-eyebrow {
4463    font-size: 11px;
4464    font-weight: 700;
4465    letter-spacing: 2.5px;
4466    text-transform: uppercase;
4467    color: #ffffff;
4468    opacity: 0.7;
4469    margin-bottom: 10px;
4470  }
4471  #vh-template--31561534275926__video_BBjtzP .vh-heading {
4472    font-size: 30px;
4473    font-weight: 800;
4474    letter-spacing: -1.5px;
4475    line-height: 1.05;
4476    color: #ffffff;
4477    margin: 0 0 16px;
4478  }
4479  #vh-template--31561534275926__video_BBjtzP .vh-heading .vh-highlight,
4480  #vh-template--31561534275926__video_BBjtzP .vh-sub .vh-highlight {
4481    color: #e3557b;
4482    font-style: normal;
4483  }
4484  #vh-template--31561534275926__video_BBjtzP .vh-sub {
4485    font-size: clamp(14px, 1.8vw, 18px);
4486    line-height: 1.55;
4487    color: #ffffff;
4488    opacity: 0.8;
4489    max-width: 540px;
4490    margin: 0 0 28px;
4491  }
4492  #vh-template--31561534275926__video_BBjtzP .vh-btn {
4493    display: inline-block;
4494    padding: 14px 32px;
4495    background: #ffffff;
4496    color: #111111;
4497    font-size: 14px;
4498    font-weight: 700;
4499    letter-spacing: 0.2px;
4500    border-radius: 12px;
4501    text-decoration: none;
4502    pointer-events: auto;
4503    transition: opacity 0.15s, transform 0.15s;
4504    border: none;
4505    cursor: pointer;
4506  }
4507  #vh-template--31561534275926__video_BBjtzP .vh-btn:hover { opacity: 0.88; transform: translateY(-1px); }
4508
4509  /* ── STAT BOXES ── */
4510  #vh-template--31561534275926__video_BBjtzP .vh-stats {
4511    display: flex;
4512    flex-wrap: wrap;
4513    gap: 10px;
4514    margin: 0 0 28px;
4515    justify-content: center;
4516    pointer-events: none;
4517  }
4518  #vh-template--31561534275926__video_BBjtzP .vh-stat {
4519    display: inline-flex;
4520    align-items: center;
4521    gap: 8px;
4522    padding: 9px 15px;
4523    border-radius: 14px;
4524    background: #ffffff1f;
4525    border: 1px solid #ffffff2e;
4526    color: #ffffff;
4527    font-size: 13px;
4528    font-weight: 600;
4529    letter-spacing: 0.1px;
4530    line-height: 1.2;
4531    -webkit-backdrop-filter: blur(6px);
4532    backdrop-filter: blur(6px);
4533  }
4534  #vh-template--31561534275926__video_BBjtzP .vh-stat svg {
4535    width: 16px;
4536    height: 16px;
4537    flex-shrink: 0;
4538    stroke: #ff803a;
4539  }
4540
4541  /* ── DESKTOP ── */
4542  @media (min-width: 768px) {
4543    #vh-template--31561534275926__video_BBjtzP {
4544      /* Osion ulkoreunat — desktop */
4545      padding: 0px 0px 0px;
4546    }
4547    #vh-template--31561534275926__video_BBjtzP .vh-video-wrap {
4548      aspect-ratio: 16 / 9;
4549      border-radius: 0px;
4550    }
4551    #vh-template--31561534275926__video_BBjtzP .vh-content {
4552      /* Sisällön välistykset — desktop */
4553      padding: 56px 64px;
4554    }
4555  }
4556
4557  /* ── MOBILE/DESKTOP VIDEO TOGGLE ── */
4558  #vh-template--31561534275926__video_BBjtzP .vh-desktop-video { display: none; }
4559  #vh-template--31561534275926__video_BBjtzP .vh-mobile-video  { display: block; }
4560
4561  @media (min-width: 768px) {
4562    #vh-template--31561534275926__video_BBjtzP .vh-desktop-video { display: block; }
4563    #vh-template--31561534275926__video_BBjtzP .vh-mobile-video  { display: none; }
4564  }
4565
4566  @media (prefers-reduced-motion: reduce) {
4567    #vh-template--31561534275926__video_BBjtzP .vh-btn { transition: none; }
4568    #vh-template--31561534275926__video_BBjtzP .vh-btn:hover { transform: none; }
4569  }
4570</style>
4571
4572<div id="vh-template--31561534275926__video_BBjtzP">
4573  <div class="vh-video-wrap"><div class="vh-desktop-video"><video
4574            src="https://cdn.shopify.com/videos/c/o/v/970d4b2085224d9fb04733a83fbc7833.mp4"
4575            autoplay muted loop playsinline
4576            poster="Liquid error (sections/video line 210): invalid url input"
4577          ></video></div><div class="vh-mobile-video"><video
4578            src="https://cdn.shopify.com/videos/c/o/v/970d4b2085224d9fb04733a83fbc7833.mp4"
4579            autoplay muted loop playsinline
4580            poster="Liquid error (sections/video line 259): invalid url input"
4581          ></video></div><div class="vh-overlay"></div><div class="vh-content"><h2 class="vh-heading">GUARANTEED TO <span class="vh-highlight">STAY PUT</span></h2><p class="vh-sub">No more earbuds falling out.</p></div></div>
4582</div>
4583
4584</div><div id="shopify-section-template--31561534275926__joybudsfeature_LnVeR9" class="shopify-section"><style>
4585  #jfs-template--31561534275926__joybudsfeature_LnVeR9 {
4586    display: grid;
4587    grid-template-columns: 1fr 1fr;
4588    min-height: 300px;
4589    direction: ltr;
4590    margin-bottom: 0px;
4591  }
4592  #jfs-template--31561534275926__joybudsfeature_LnVeR9 > * { direction: ltr; }
4593  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-img  { overflow: hidden; background: #ffffff; }
4594  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-img img {
4595    width: 100%; height: 100%;
4596    object-fit: cover;
4597    display: block;
4598  }
4599  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-img-placeholder {
4600    width: 100%; height: 100%; min-height: 300px;
4601    background: #fce7f3;
4602    display: flex; align-items: center; justify-content: center; font-size: 100px;
4603  }
4604  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-text {
4605    background: #fffffd;
4606    padding: 64px 72px;
4607    display: flex; flex-direction: column; justify-content: center;
4608    min-width: 0;
4609  }
4610  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-eyebrow {
4611    font-size: 11px; font-weight: 800; text-transform: uppercase;
4612    letter-spacing: .12em; color: #9ca3af;
4613    margin-bottom: 14px;
4614  }
4615  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-title {
4616    font-size: clamp(24px, 7vw, 34px);
4617    font-weight: 900; letter-spacing: -.02em; line-height: 1.05;
4618    
4619    color: #111111; margin-bottom: 28px;
4620    overflow-wrap: break-word;
4621  }
4622  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-title .jfs-highlight {
4623    color: #ff4caf;
4624  }
4625  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-desc {
4626    font-size: 15px; line-height: 1.65;
4627    color: #374151;
4628    max-width: 56ch;
4629    margin: -10px 0 28px;
4630  }
4631  /* ── ISO NUMERO + ÄÄNIAALTO ── */
4632  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-bignum {
4633    margin: -4px 0 28px;
4634  }
4635  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-bignum__num {
4636    font-size: clamp(96px, 14vw, 150px);
4637    font-weight: 900; line-height: .85; letter-spacing: -.03em;
4638    color: #111111;
4639    display: block;
4640  }
4641  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-bignum__label {
4642    display: block; margin-top: 6px;
4643    font-size: clamp(20px, 3vw, 28px); font-weight: 500;
4644    color: #111111;
4645  }
4646  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-wave {
4647    display: flex; align-items: center; gap: 3px;
4648    height: 44px; margin: 16px 0 14px;
4649  }
4650  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-wave i {
4651    width: 4px; border-radius: 2px; display: block;
4652    background: #ff4caf;
4653    animation: jfs-wv-template--31561534275926__joybudsfeature_LnVeR9 1.1s ease-in-out infinite;
4654  }
4655  @keyframes jfs-wv-template--31561534275926__joybudsfeature_LnVeR9 { 0%,100%{transform:scaleY(.35)} 50%{transform:scaleY(1)} }
4656  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-bignum__note {
4657    font-size: 15px; line-height: 1.6;
4658    color: #374151;
4659    max-width: 40ch;
4660  }
4661  @media (prefers-reduced-motion: reduce) {
4662    #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-wave i { animation: none; transform: scaleY(.7); }
4663  }
4664  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-bullets   { display: flex; flex-direction: column; gap: 16px; }
4665  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-bullet    { display: flex; align-items: center; gap: 14px; }
4666  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-b-icon    {
4667    flex-shrink: 0;
4668    display: flex; align-items: center; justify-content: center;
4669    font-size: 16px; color: #374151;
4670    min-width: 20px;
4671  }
4672  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-b-icon--img {
4673    width: 52px;
4674    height: 52px;
4675    border-radius: 50%;
4676    background: #fff3e8;
4677    overflow: hidden;
4678    font-size: 26px;
4679  }
4680  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-b-icon--img img {
4681    width: 55%; height: 55%; object-fit: contain; display: block;
4682  }
4683  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-b-text  { font-size: 14px; color: #374151; line-height: 1.5; min-width: 0; }
4684  #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-b-text strong { color: #111111; font-weight: 800; }
4685
4686  /* ── ATC-NAPPI ── */
4687  #jf-atc-template--31561534275926__joybudsfeature_LnVeR9 {
4688    display: inline-flex; align-items: center; gap: 8px; position: relative;
4689    margin-top: 28px;
4690    background: #111111;
4691    color: #ffffff;
4692    padding: 14px 28px; border-radius: 100px;
4693    font-size: 15px; font-weight: 700; font-family: inherit;
4694    border: none; cursor: pointer;
4695    text-decoration: none; width: fit-content;
4696    transition: opacity .2s, transform .15s;
4697    -webkit-tap-highlight-color: transparent;
4698  }
4699  #jf-atc-template--31561534275926__joybudsfeature_LnVeR9:hover:not([disabled]):not([aria-busy="true"]) { opacity: 0.88; transform: scale(1.02); }
4700  #jf-atc-template--31561534275926__joybudsfeature_LnVeR9[disabled] { opacity: 0.6; cursor: not-allowed; }
4701  #jf-atc-template--31561534275926__joybudsfeature_LnVeR9[aria-busy="true"] { opacity: 0.75; cursor: wait; }
4702  #jf-atc-template--31561534275926__joybudsfeature_LnVeR9[aria-busy="true"] .jf-btn-txt { opacity: 0; }
4703  .jf-btn-spinner-template--31561534275926__joybudsfeature_LnVeR9 {
4704    display: none; width: 18px; height: 18px;
4705    border: 2px solid rgba(255,255,255,0.35); border-top-color: #fff;
4706    border-radius: 50%;
4707    animation: jf-spin-template--31561534275926__joybudsfeature_LnVeR9 .7s linear infinite;
4708    position: absolute; top: 50%; left: 50%;
4709    transform: translate(-50%,-50%);
4710  }
4711  #jf-atc-template--31561534275926__joybudsfeature_LnVeR9[aria-busy="true"] .jf-btn-spinner-template--31561534275926__joybudsfeature_LnVeR9 { display: block; }
4712  @keyframes jf-spin-template--31561534275926__joybudsfeature_LnVeR9 { to { transform: translate(-50%,-50%) rotate(360deg); } }
4713
4714  @media (max-width: 768px) {
4715    #jfs-template--31561534275926__joybudsfeature_LnVeR9 { grid-template-columns: 1fr; direction: ltr; }
4716    #jfs-template--31561534275926__joybudsfeature_LnVeR9 .jfs-text { padding: 40px 32px; }
4717  }
4718</style>
4719
4720<div id="jfs-template--31561534275926__joybudsfeature_LnVeR9">
4721  <div class="jfs-img"><img src="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_26_2026_from_1-1_Version_1.png?v=1779803163&width=1400"
4722           alt="*SMALLER* SIZE. *LIGHTER* DESIGN."
4723           width="1254"
4724           height="1254"
4725           loading="lazy"></div>
4726
4727  <div class="jfs-text"><p class="jfs-eyebrow">Markkinoiden pienin kuuloke</p><h2 class="jfs-title"><span class="jfs-highlight">SMALLER</span> SIZE. <span class="jfs-highlight">LIGHTER</span> DESIGN.</h2><div class="jfs-bullets"><div class="jfs-bullet" ><div class="jfs-b-text">A small, lightweight earbud moves less, feels more comfortable and stays more securely in place. That is why TinyS was designed from the ground up to be the smallest earbud on the market.</div>
4728          </div><div class="jfs-bullet" ><div class="jfs-b-icon">✓</div><div class="jfs-b-text">Fits even small ears</div>
4729          </div><div class="jfs-bullet" ><div class="jfs-b-icon">✓</div><div class="jfs-b-text">Stays more stable during everyday activities and workouts</div>
4730          </div><div class="jfs-bullet" ><div class="jfs-b-icon">✓</div><div class="jfs-b-text">Feels lightweight even after hours of use</div>
4731          </div></div><button id="jf-atc-template--31561534275926__joybudsfeature_LnVeR9" type="button" aria-busy="false"
4732          data-variant="52813102088534"
4733          data-gift="">
4734          <span class="jf-btn-txt">Add To Cart</span>
4735          <span class="jf-btn-spinner-template--31561534275926__joybudsfeature_LnVeR9" aria-hidden="true"></span>
4736        </button></div>
4737</div>
4737<script>
4738(function () {
4739  var btn = document.getElementById('jf-atc-template--31561534275926__joybudsfeature_LnVeR9');
4740  if (!btn) return;
4741
4742  function setBusy(on) {
4743    btn.setAttribute('aria-busy', on ? 'true' : 'false');
4744    btn.disabled = on;
4745  }
4746
4747  btn.addEventListener('click', function () {
4748    setBusy(true);
4749    var variantId = parseInt(btn.dataset.variant, 10);
4750    var giftId    = parseInt(btn.dataset.gift, 10) || null;
4751    var cartRoot  = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';
4752
4753    var items = [{ id: variantId, quantity: 1 }];
4754
4755    if (giftId) {
4756      items.push({
4757        id: giftId,
4758        quantity: 1,
4759        properties: { '_free_gift': 'true', '_free_gift_campaign': 'jfs-bundle' }
4760      });
4761    }
4762
4763    fetch(cartRoot + 'cart/add.js', {
4764      method:  'POST',
4765      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
4766      body:    JSON.stringify({ items: items })
4767    })
4768    .then(function (res) {
4769      if (!res.ok) return res.json().then(function (d) { throw new Error(d.description || d.message || 'Virhe'); });
4770      return res.json();
4771    })
4772    .then(function (data) {
4773      setBusy(false);
4774      btn.dispatchEvent(new CustomEvent('ajaxProduct:added', {
4775        bubbles: true,
4776        detail: { product: data, addToCartBtn: btn }
4777      }));
4778    })
4779    .catch(function (err) {
4780      setBusy(false);
4781      alert('Virhe: ' + (err.message || 'Yritä uudelleen.'));
4782    });
4783  });
4784}());
4785</script>
4785</div><div id="shopify-section-template--31561534275926__cards_3Fm4E6" class="shopify-section"><style>
4786  #lc-template--31561534275926__cards_3Fm4E6 {
4787    padding: 48px 0 64px;
4788    background: #ffffff;
4789    font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
4790    box-sizing: border-box;
4791  }
4792  #lc-template--31561534275926__cards_3Fm4E6 *, #lc-template--31561534275926__cards_3Fm4E6 *::before, #lc-template--31561534275926__cards_3Fm4E6 *::after { box-sizing: border-box; }
4793
4794  /* ── SECTION HEADING ── */
4795  #lc-template--31561534275926__cards_3Fm4E6 .lc-header {
4796    text-align: center;
4797    padding: 0 24px;
4798    margin-bottom: 36px;
4799  }
4800  #lc-template--31561534275926__cards_3Fm4E6 .lc-eyebrow {
4801    font-size: 10px; font-weight: 700;
4802    letter-spacing: 2px; text-transform: uppercase;
4803    color: rgba(0,0,0,0.35);
4804    margin-bottom: 10px;
4805  }
4806  #lc-template--31561534275926__cards_3Fm4E6 .lc-title {
4807    font-size: clamp(26px, 4vw, 44px);
4808    font-weight: 900;
4809    letter-spacing: -1.5px;
4810    color: #111;
4811    line-height: 1.05;
4812    margin: 0;
4813  }
4814  #lc-template--31561534275926__cards_3Fm4E6 .lc-title .lc-highlight {
4815    color: #ff4caf;
4816  }
4817
4818  /* ── TRACK WRAPPER (for edge fade on desktop many) ── */
4819  #lc-template--31561534275926__cards_3Fm4E6 .lc-track-wrap {
4820    position: relative;
4821  }
4822
4823  /* ── TRACK (scroll container) ── */
4824  #lc-template--31561534275926__cards_3Fm4E6 .lc-track {
4825    display: flex;
4826    gap: 16px;
4827    padding: 0 24px 24px;
4828
4829    /* Mobile: horizontal scroll snap */
4830    overflow-x: auto;
4831    scroll-snap-type: x mandatory;
4832    -webkit-overflow-scrolling: touch;
4833    scrollbar-width: none;
4834  }
4835  #lc-template--31561534275926__cards_3Fm4E6 .lc-track::-webkit-scrollbar { display: none; }
4836
4837  /* ── CARD ── */
4838  #lc-template--31561534275926__cards_3Fm4E6 .lc-card {
4839    flex: 0 0 calc(85vw - 32px);   /* mobile: almost full width */
4840    scroll-snap-align: center;
4841    display: flex;
4842    flex-direction: column;
4843    gap: 16px;
4844  }
4845
4846  /* ── IMAGE ── */
4847  #lc-template--31561534275926__cards_3Fm4E6 .lc-img-wrap {
4848    border-radius: 20px;
4849    overflow: hidden;
4850    aspect-ratio: 3 / 4;
4851    background: #e8e8e4;
4852    position: relative;
4853  }
4854  #lc-template--31561534275926__cards_3Fm4E6 .lc-img-wrap img {
4855    width: 100%;
4856    height: 100%;
4857    object-fit: cover;
4858    display: block;
4859    transition: transform .5s ease;
4860  }
4861  #lc-template--31561534275926__cards_3Fm4E6 .lc-img-wrap:hover img { transform: scale(1.04); }
4862
4863  /* ── TEXT ── */
4864  #lc-template--31561534275926__cards_3Fm4E6 .lc-text {
4865    display: flex;
4866    flex-direction: column;
4867    gap: 6px;
4868    padding: 0 4px;
4869  }
4870  #lc-template--31561534275926__cards_3Fm4E6 .lc-icon-row {
4871    display: flex;
4872    align-items: center;
4873    gap: 8px;
4874  }
4875  #lc-template--31561534275926__cards_3Fm4E6 .lc-icon {
4876    font-size: 18px;
4877    line-height: 1;
4878    flex-shrink: 0;
4879  }
4880  #lc-template--31561534275926__cards_3Fm4E6 .lc-card-title {
4881    font-size: 17px;
4882    font-weight: 800;
4883    letter-spacing: -0.4px;
4884    color: #111;
4885    margin: 0;
4886  }
4887  #lc-template--31561534275926__cards_3Fm4E6 .lc-card-body {
4888    font-size: 14px;
4889    line-height: 1.6;
4890    color: rgba(0,0,0,0.5);
4891    margin: 0;
4892  }
4893
4894  /* ── DOTS ── */
4895  #lc-template--31561534275926__cards_3Fm4E6 .lc-dots {
4896    display: flex;
4897    justify-content: center;
4898    gap: 6px;
4899    padding-top: 4px;
4900  }
4901  #lc-template--31561534275926__cards_3Fm4E6 .lc-dot {
4902    width: 6px; height: 6px;
4903    border-radius: 50%;
4904    background: rgba(0,0,0,0.15);
4905    transition: background .3s, width .3s;
4906    cursor: pointer;
4907    border: none;
4908    padding: 0;
4909  }
4910  #lc-template--31561534275926__cards_3Fm4E6 .lc-dot.active {
4911    background: #111;
4912    width: 20px;
4913    border-radius: 100px;
4914  }
4915
4916  /* ── ARROW BUTTONS (desktop many) ── */
4917  #lc-template--31561534275926__cards_3Fm4E6 .lc-arrows {
4918    display: none;
4919  }
4920  #lc-template--31561534275926__cards_3Fm4E6 .lc-arrow-btn {
4921    width: 44px; height: 44px;
4922    border-radius: 50%;
4923    border: 1.5px solid rgba(0,0,0,0.12);
4924    background: #fff;
4925    cursor: pointer;
4926    display: flex;
4927    align-items: center;
4928    justify-content: center;
4929    font-size: 18px;
4930    color: #111;
4931    transition: background 0.15s, border-color 0.15s, opacity 0.15s;
4932    box-shadow: 0 2px 8px rgba(0,0,0,0.06);
4933    flex-shrink: 0;
4934  }
4935  #lc-template--31561534275926__cards_3Fm4E6 .lc-arrow-btn:hover { background: #f5f5f5; border-color: rgba(0,0,0,0.22); }
4936  #lc-template--31561534275926__cards_3Fm4E6 .lc-arrow-btn:disabled { opacity: 0.3; cursor: default; }
4937
4938  /* ── DESKTOP ── */
4939  @media (min-width: 768px) {/* ≤3 cards: static grid */
4940    #lc-template--31561534275926__cards_3Fm4E6 .lc-track {
4941      display: grid;
4942      grid-template-columns: repeat(3, 1fr);
4943      overflow-x: visible;
4944      padding: 0 40px 0;
4945      gap: 20px;
4946    }
4947    #lc-template--31561534275926__cards_3Fm4E6 .lc-card {
4948      flex: unset;
4949      scroll-snap-align: unset;
4950    }
4951    #lc-template--31561534275926__cards_3Fm4E6 .lc-dots { display: none; }}
4952
4953  @media (min-width: 1100px) {#lc-template--31561534275926__cards_3Fm4E6 .lc-track { padding: 0 64px 0; gap: 24px; }}
4954
4955</style>
4956
4957<div id="lc-template--31561534275926__cards_3Fm4E6"><div class="lc-header"><div class="lc-eyebrow">-</div><h2 class="lc-title">DESIGNED TO <span class="lc-highlight">STAY PUT</span></h2>
4958  </div><div class="lc-track-wrap">
4959    <div class="lc-track" id="lcTrack-template--31561534275926__cards_3Fm4E6"><div class="lc-card" >
4960
4961        <div class="lc-img-wrap"><img src="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_26_2026_from_JOY_6.png?v=1779798278&amp;width=800" alt="Designed around the ear" srcset="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_26_2026_from_JOY_6.png?v=1779798278&amp;width=400 400w, //joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_26_2026_from_JOY_6.png?v=1779798278&amp;width=600 600w, //joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_26_2026_from_JOY_6.png?v=1779798278&amp;width=800 800w" width="800" height="800" loading="lazy">
4962</div>
4963
4964        <div class="lc-text">
4965          <div class="lc-icon-row"><p class="lc-card-title">Designed around the ear</p>
4966          </div><p class="lc-card-body">TinyS’s ergonomic design follows the natural shape of the ear, with its centre of gravity positioned closer to the ear canal. This makes the earbud feel more natural, stay securely in place and remain comfortable even during longer listening sessions.</p></div>
4967
4968      </div><div class="lc-card" >
4969
4970        <div class="lc-img-wrap"><img src="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_from_JOY.png?v=1781352365&amp;width=800" alt="Multiple points of support" srcset="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_from_JOY.png?v=1781352365&amp;width=400 400w, //joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_from_JOY.png?v=1781352365&amp;width=600 600w, //joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_from_JOY.png?v=1781352365&amp;width=800 800w" width="800" height="860" loading="lazy">
4971</div>
4972
4973        <div class="lc-text">
4974          <div class="lc-icon-row"><p class="lc-card-title">Multiple points of support</p>
4975          </div><p class="lc-card-body">Despite its small size, TinyS rests against the ear at several points. This distributes pressure more evenly and keeps the earbud securely in place, even when you’re moving.</p></div>
4976
4977      </div><div class="lc-card" >
4978
4979        <div class="lc-img-wrap"><img src="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026.png?v=1779960003&amp;width=800" alt="Find your perfect fit" srcset="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026.png?v=1779960003&amp;width=400 400w, //joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026.png?v=1779960003&amp;width=600 600w, //joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026.png?v=1779960003&amp;width=800 800w" width="800" height="800" loading="lazy">
4980</div>
4981
4982        <div class="lc-text">
4983          <div class="lc-icon-row"><p class="lc-card-title">Find your perfect fit</p>
4984          </div><p class="lc-card-body">Every ear is unique. That is why TinyS comes with seven different ear tip sizes, helping you find the fit that is just right for you.</p></div>
4985
4986      </div></div>
4987  </div>
4988
4989  <!-- Dots -->
4990  <div class="lc-dots" id="lcDots-template--31561534275926__cards_3Fm4E6"><button class="lc-dot active" data-index="0" aria-label="Kortti 1"></button><button class="lc-dot" data-index="1" aria-label="Kortti 2"></button><button class="lc-dot" data-index="2" aria-label="Kortti 3"></button></div></div>
4991
4992<script>
4993(function () {
4994  var track = document.getElementById('lcTrack-template--31561534275926__cards_3Fm4E6');
4995  var dots  = document.querySelectorAll('#lcDots-template--31561534275926__cards_3Fm4E6 .lc-dot');
4996  var lc_many = false;
4997
4998  if (!track) return;
4999
5000  /* ── DOTS UPDATE ── */
5001  function updateDots() {
5002    if (!dots.length) return;
5003    var cards = track.querySelectorAll('.lc-card');
5004    var scrollLeft = track.scrollLeft;
5005    var trackWidth = track.offsetWidth;
5006    var closest = 0, minDist = Infinity;
5007
5008    cards.forEach(function (card, i) {
5009      var cardCenter = card.offsetLeft + card.offsetWidth / 2;
5010      var dist = Math.abs(cardCenter - scrollLeft - trackWidth / 2);
5011      if (dist < minDist) { minDist = dist; closest = i; }
5012    });
5013
5014    dots.forEach(function (d, i) {
5015      d.classList.toggle('active', i === closest);
5016    });
5017  }
5018
5019  /* ── DOTS VISIBILITY (hide on desktop grid) ── */
5020  function checkDotsVisibility() {
5021    var dotsEl = document.getElementById('lcDots-template--31561534275926__cards_3Fm4E6');
5022    if (!dotsEl) return;
5023    var isDesktop = window.innerWidth >= 768;
5024    if (isDesktop && (!lc_many || false)) {
5025      dotsEl.style.display = 'none';
5026    } else {
5027      dotsEl.style.display = '';
5028    }
5029  }
5030
5031  track.addEventListener('scroll', updateDots, { passive: true });
5032
5033  /* Dot click → scroll to card */
5034  dots.forEach(function (dot) {
5035    dot.addEventListener('click', function () {
5036      var idx   = parseInt(dot.getAttribute('data-index'), 10);
5037      var cards = track.querySelectorAll('.lc-card');
5038      if (!cards[idx]) return;
5039      var card   = cards[idx];
5040      var target = card.offsetLeft - (track.offsetWidth - card.offsetWidth) / 2;
5041      track.scrollTo({ left: target, behavior: 'smooth' });
5042    });
5043  });
5044
5045  /* ── ARROW BUTTONS (desktop many) ── */
5046  if (lc_many) {
5047    var prevBtn = document.getElementById('lcPrev-template--31561534275926__cards_3Fm4E6');
5048    var nextBtn = document.getElementById('lcNext-template--31561534275926__cards_3Fm4E6');
5049
5050    function updateArrows() {
5051      if (!prevBtn || !nextBtn) return;
5052      prevBtn.disabled = track.scrollLeft <= 4;
5053      nextBtn.disabled = track.scrollLeft >= track.scrollWidth - track.offsetWidth - 4;
5054    }
5055
5056    if (prevBtn) {
5057      prevBtn.addEventListener('click', function () {
5058        var cards = track.querySelectorAll('.lc-card');
5059        var cardWidth = cards.length ? cards[0].offsetWidth : 300;
5060        var gap = 20;
5061        track.scrollBy({ left: -(cardWidth + gap), behavior: 'smooth' });
5062      });
5063    }
5064
5065    if (nextBtn) {
5066      nextBtn.addEventListener('click', function () {
5067        var cards = track.querySelectorAll('.lc-card');
5068        var cardWidth = cards.length ? cards[0].offsetWidth : 300;
5069        var gap = 20;
5070        track.scrollBy({ left: cardWidth + gap, behavior: 'smooth' });
5071      });
5072    }
5073
5074    track.addEventListener('scroll', updateArrows, { passive: true });
5075    updateArrows();
5076  }
5077
5078  /* Initial state */
5079  checkDotsVisibility();
5080  window.addEventListener('resize', checkDotsVisibility);
5081  updateDots();
5082}());
5083</script>
5083
5084
5085</div><div id="shopify-section-template--31561534275926__joybudsfeature_PPgYtd" class="shopify-section"><style>
5086  #jfs-template--31561534275926__joybudsfeature_PPgYtd {
5087    display: grid;
5088    grid-template-columns: 1fr 1fr;
5089    min-height: 300px;
5090    direction: ltr;
5091    margin-bottom: 0px;
5092  }
5093  #jfs-template--31561534275926__joybudsfeature_PPgYtd > * { direction: ltr; }
5094  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-img  { overflow: hidden; background: #ffffff; }
5095  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-img img {
5096    width: 100%; height: 100%;
5097    object-fit: cover;
5098    display: block;
5099  }
5100  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-img-placeholder {
5101    width: 100%; height: 100%; min-height: 300px;
5102    background: #fce7f3;
5103    display: flex; align-items: center; justify-content: center; font-size: 100px;
5104  }
5105  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-text {
5106    background: #fffffd;
5107    padding: 64px 72px;
5108    display: flex; flex-direction: column; justify-content: center;
5109    min-width: 0;
5110  }
5111  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-eyebrow {
5112    font-size: 11px; font-weight: 800; text-transform: uppercase;
5113    letter-spacing: .12em; color: #9ca3af;
5114    margin-bottom: 14px;
5115  }
5116  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-title {
5117    font-size: clamp(24px, 7vw, 34px);
5118    font-weight: 900; letter-spacing: -.02em; line-height: 1.05;
5119    
5120    color: #111111; margin-bottom: 28px;
5121    overflow-wrap: break-word;
5122  }
5123  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-title .jfs-highlight {
5124    color: #ff4caf;
5125  }
5126  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-desc {
5127    font-size: 15px; line-height: 1.65;
5128    color: #374151;
5129    max-width: 56ch;
5130    margin: -10px 0 28px;
5131  }
5132  /* ── ISO NUMERO + ÄÄNIAALTO ── */
5133  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-bignum {
5134    margin: -4px 0 28px;
5135  }
5136  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-bignum__num {
5137    font-size: clamp(96px, 14vw, 150px);
5138    font-weight: 900; line-height: .85; letter-spacing: -.03em;
5139    color: #111111;
5140    display: block;
5141  }
5142  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-bignum__label {
5143    display: block; margin-top: 6px;
5144    font-size: clamp(20px, 3vw, 28px); font-weight: 500;
5145    color: #111111;
5146  }
5147  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-wave {
5148    display: flex; align-items: center; gap: 3px;
5149    height: 44px; margin: 16px 0 14px;
5150  }
5151  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-wave i {
5152    width: 4px; border-radius: 2px; display: block;
5153    background: #ff4caf;
5154    animation: jfs-wv-template--31561534275926__joybudsfeature_PPgYtd 1.1s ease-in-out infinite;
5155  }
5156  @keyframes jfs-wv-template--31561534275926__joybudsfeature_PPgYtd { 0%,100%{transform:scaleY(.35)} 50%{transform:scaleY(1)} }
5157  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-bignum__note {
5158    font-size: 15px; line-height: 1.6;
5159    color: #374151;
5160    max-width: 40ch;
5161  }
5162  @media (prefers-reduced-motion: reduce) {
5163    #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-wave i { animation: none; transform: scaleY(.7); }
5164  }
5165  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-bullets   { display: flex; flex-direction: column; gap: 16px; }
5166  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-bullet    { display: flex; align-items: center; gap: 14px; }
5167  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-b-icon    {
5168    flex-shrink: 0;
5169    display: flex; align-items: center; justify-content: center;
5170    font-size: 16px; color: #374151;
5171    min-width: 20px;
5172  }
5173  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-b-icon--img {
5174    width: 68px;
5175    height: 68px;
5176    border-radius: 50%;
5177    background: #f9f9f9;
5178    overflow: hidden;
5179    font-size: 34px;
5180  }
5181  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-b-icon--img img {
5182    width: 55%; height: 55%; object-fit: contain; display: block;
5183  }
5184  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-b-text  { font-size: 14px; color: #374151; line-height: 1.5; min-width: 0; }
5185  #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-b-text strong { color: #111111; font-weight: 800; }
5186
5187  /* ── ATC-NAPPI ── */
5188  #jf-atc-template--31561534275926__joybudsfeature_PPgYtd {
5189    display: inline-flex; align-items: center; gap: 8px; position: relative;
5190    margin-top: 28px;
5191    background: #111111;
5192    color: #ffffff;
5193    padding: 14px 28px; border-radius: 100px;
5194    font-size: 15px; font-weight: 700; font-family: inherit;
5195    border: none; cursor: pointer;
5196    text-decoration: none; width: fit-content;
5197    transition: opacity .2s, transform .15s;
5198    -webkit-tap-highlight-color: transparent;
5199  }
5200  #jf-atc-template--31561534275926__joybudsfeature_PPgYtd:hover:not([disabled]):not([aria-busy="true"]) { opacity: 0.88; transform: scale(1.02); }
5201  #jf-atc-template--31561534275926__joybudsfeature_PPgYtd[disabled] { opacity: 0.6;
5201 cursor: not-allowed; }
5202  #jf-atc-template--31561534275926__joybudsfeature_PPgYtd[aria-busy="true"] { opacity: 0.75; cursor: wait; }
5203  #jf-atc-template--31561534275926__joybudsfeature_PPgYtd[aria-busy="true"] .jf-btn-txt { opacity: 0; }
5204  .jf-btn-spinner-template--31561534275926__joybudsfeature_PPgYtd {
5205    display: none; width: 18px; height: 18px;
5206    border: 2px solid rgba(255,255,255,0.35); border-top-color: #fff;
5207    border-radius: 50%;
5208    animation: jf-spin-template--31561534275926__joybudsfeature_PPgYtd .7s linear infinite;
5209    position: absolute; top: 50%; left: 50%;
5210    transform: translate(-50%,-50%);
5211  }
5212  #jf-atc-template--31561534275926__joybudsfeature_PPgYtd[aria-busy="true"] .jf-btn-spinner-template--31561534275926__joybudsfeature_PPgYtd { display: block; }
5213  @keyframes jf-spin-template--31561534275926__joybudsfeature_PPgYtd { to { transform: translate(-50%,-50%) rotate(360deg); } }
5214
5215  @media (max-width: 768px) {
5216    #jfs-template--31561534275926__joybudsfeature_PPgYtd { grid-template-columns: 1fr; direction: ltr; }
5217    #jfs-template--31561534275926__joybudsfeature_PPgYtd .jfs-text { padding: 40px 32px; }
5218  }
5219</style>
5220
5221<div id="jfs-template--31561534275926__joybudsfeature_PPgYtd">
5222  <div class="jfs-img"><img src="//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_27_2026_from_JOY_1.png?v=1779887040&width=1400"
5223           alt="SMALL IN YOUR EAR. *BIG IN EVERY OTHER WAY.*"
5224           width="1254"
5225           height="1254"
5226           loading="lazy"></div>
5227
5228  <div class="jfs-text"><p class="jfs-eyebrow">The smallest earbud on the market</p><h2 class="jfs-title">SMALL IN YOUR EAR. <span class="jfs-highlight">BIG IN EVERY OTHER WAY.</span></h2><div class="jfs-bullets"><div class="jfs-bullet" ><div class="jfs-b-text">TinyS is designed to be small and lightweight without compromising on sound quality. Enjoy rich sound, clear calls and long battery life in an exceptionally compact design.</div>
5229          </div><div class="jfs-bullet" ><div class="jfs-b-icon jfs-b-icon--img">
5230                <img src="//joyearbuds.com/cdn/shop/files/001-musical-note.png?v=1745998847&width=80"
5231                     alt=""
5232                     width="80" height="80" loading="lazy">
5233              </div><div class="jfs-b-text">Premium Hi-Fi sound in a pocket-sized design</div>
5234          </div><div class="jfs-bullet" ><div class="jfs-b-icon jfs-b-icon--img">
5235                <img src="//joyearbuds.com/cdn/shop/files/003-mic.png?v=1745998847&width=80"
5236                     alt=""
5237                     width="80" height="80" loading="lazy">
5238              </div><div class="jfs-b-text">Clear calls, even on the go</div>
5239          </div><div class="jfs-bullet" ><div class="jfs-b-icon jfs-b-icon--img">
5240                <img src="//joyearbuds.com/cdn/shop/files/003-battery-1.png?v=1745998848&width=80"
5241                     alt=""
5242                     width="80" height="80" loading="lazy">
5243              </div><div class="jfs-b-text">6 hours of uninterrupted playback and up to 20 hours with the charging case</div>
5244          </div></div></div>
5245</div></div><section id="shopify-section-template--31561534275926__1779803510f079de07" class="shopify-section"><div class="index-section"><div class="page-width"></div></div>
5246</section><div id="shopify-section-template--31561534275926__bundleloppu_eeWQPn" class="shopify-section"><section id="ccb-template--31561534275926__bundleloppu_eeWQPn" class="ccb"><h2 class="ccb__heading">GET EARBUDS THAT</h2><h2 class="ccb__heading ccb__heading--highlight">FIT AND STAY PUT</h2><p class="ccb__sub">Offer available for a limited time only.</p><input type="hidden" id="ccb-main-template--31561534275926__bundleloppu_eeWQPn" value="52813102088534"><button
5247    class="ccb__btn"
5248    id="ccb-btn-template--31561534275926__bundleloppu_eeWQPn"
5249    type="button"
5250    aria-busy="false"
5251    
5252  >
5253    <span class="ccb__btn-txt">TRY THEM RISK-FREE FOR 60 DAYS</span>
5254    <span class="ccb__spinner" aria-hidden="true"></span>
5255  </button>
5256
5257  <div class="ccb__error" id="ccb-err-template--31561534275926__bundleloppu_eeWQPn" role="alert" hidden></div><div class="ccb__trust"><span class="ccb__badge">
5258      <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#00C896" stroke-width="2.5"><polyline points="20 6 9 17 4 12"/></svg>
5259      Free delivery
5260    </span><span class="ccb__badge">
5261      <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#00C896" stroke-width="2.5"><polyline points="20 6 9 17 4 12"/></svg>
5262      60 days returns
5263    </span><span class="ccb__badge">
5264      <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#00C896" stroke-width="2.5"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
5265      3 year warranty
5266    </span></div></section>
5267
5268<style>
5269  #ccb-template--31561534275926__bundleloppu_eeWQPn {
5270    --pink:   #ff3d85;
5271    --orange: #ff8042;
5272    --grad:   linear-gradient(135deg, #ff3d85 0%, #ff8042 100%);
5273    --ink:    #0D0D0D;
5274    --ink2:   #555555;
5275    --ink3:   #888888;
5276    --green:  #00C896;
5277    --border: #E8E8E8;
5278
5279    background: #ffffff;
5280    text-align: center;
5281    padding: 72px 40px 72px;
5282    font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
5283    position: relative;
5284    overflow: hidden;
5285    border-top: 0px solid var(--border);
5286    border-bottom: 1px solid var(--border);
5287  }
5288
5289  /* ── Label ── */
5290  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__label {
5291    font-size: 11px;
5292    font-weight: 800;
5293    letter-spacing: 3px;
5294    text-transform: uppercase;
5295    color: var(--pink);
5296    margin-bottom: 16px;
5297  }
5298
5299  /* ── Heading ── */
5300  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__heading {
5301    font-size: clamp(28px, 4vw, 56px);
5302    font-weight: 900;
5303    color: #0d0d0d;
5304    letter-spacing: -1px;
5305    line-height: 1.05;
5306    margin-bottom: 4px;
5307  }
5308  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__heading--highlight {
5309    background: var(--grad);
5310    -webkit-background-clip: text;
5311    -webkit-text-fill-color: transparent;
5312    background-clip: text;
5313    margin-bottom: 20px;
5314    padding: 8px 4px 4px;
5315    margin-top: -8px;
5316    display: inline-block;
5317  }
5318
5319  /* ── Subtext ── */
5320  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__sub {
5321    font-size: clamp(14px, 1.4vw, 17px);
5322    color: #555555;
5323    line-height: 1.6;
5324    max-width: 600px;
5325    margin: 0 auto 36px;
5326  }
5327
5328  /* ── Button ── */
5329  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__btn {
5330    display: inline-flex;
5331    align-items: center;
5332    justify-content: center;
5333    background: var(--grad);
5334    color: #fff;
5335    font-size: clamp(15px, 1.6vw, 19px);
5336    font-weight: 900;
5337    letter-spacing: 0.2px;
5338    border: none;
5339    border-radius: 100px;
5340    padding: 20px 52px;
5341    box-shadow: 0 6px 32px rgba(255, 61, 133, 0.35);
5342    transition: transform .2s, box-shadow .2s, opacity .2s;
5343    margin-bottom: 28px;
5344    min-width: 300px;
5345    cursor: pointer;
5346    position: relative;
5347    min-height: 60px;
5348  }
5349  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__btn:hover:not([disabled]):not([aria-busy="true"]) {
5350    transform: translateY(-3px) scale(1.02);
5351    box-shadow: 0 14px 48px rgba(255, 61, 133, 0.5);
5352  }
5353  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__btn:active:not([disabled]) { transform: none; }
5354  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__btn[disabled]         { background: #e5e5e5; color: #999; box-shadow: none;
5354 cursor: not-allowed; }
5355  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__btn[aria-busy="true"] { opacity: 0.75; cursor: wait; }
5356  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__btn[aria-busy="true"] .ccb__btn-txt { opacity: 0; }
5357
5358  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__spinner {
5359    display: none;
5360    width: 22px; height: 22px;
5361    border: 2.5px solid rgba(255,255,255,0.35);
5362    border-top-color: #fff;
5363    border-radius: 50%;
5364    animation: ccb-spin-template--31561534275926__bundleloppu_eeWQPn .7s linear infinite;
5365    position: absolute;
5366    top: 50%; left: 50%;
5367    transform: translate(-50%,-50%);
5368  }
5369  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__btn[aria-busy="true"] .ccb__spinner { display: block; }
5370  @keyframes ccb-spin-template--31561534275926__bundleloppu_eeWQPn { to { transform: translate(-50%,-50%) rotate(360deg); } }
5371
5372  /* ── Error ── */
5373  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__error {
5374    background: #FFF2F2;
5375    border: 1px solid #FFCCCC;
5376    border-radius: 8px;
5377    padding: 10px 16px;
5378    font-size: 13px;
5379    color: #CC2222;
5380    margin-bottom: 16px;
5381    display: inline-block;
5382  }
5383  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__error[hidden] { display: none; }
5384
5385  /* ── Trust ── */
5386  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__trust {
5387    display: flex;
5388    align-items: center;
5389    justify-content: center;
5390    gap: 24px;
5391    flex-wrap: wrap;
5392  }
5393  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__badge {
5394    display: flex;
5395    align-items: center;
5396    gap: 6px;
5397    font-size: 13px;
5398    color: #888888;
5399  }
5400  #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__badge svg { flex-shrink: 0; }
5401
5402  /* ── Responsive ── */
5403  @media (max-width: 600px) {
5404    #ccb-template--31561534275926__bundleloppu_eeWQPn { padding: 48px 20px; }
5405    #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__btn { min-width: 0; width: 100%; padding: 18px 24px; }
5406    #ccb-template--31561534275926__bundleloppu_eeWQPn .ccb__trust { gap: 14px; }
5407  }
5408</style>
5409
5410<script>
5411(function () {
5412  'use strict';
5413
5414  var SID = "template--31561534275926__bundleloppu_eeWQPn";
5415
5416  var btn     = document.getElementById('ccb-btn-' + SID);
5417  var errorEl = document.getElementById('ccb-err-' + SID);
5418
5419  if (!btn) return;
5420
5421  function setError(msg) {
5422    if (!errorEl) return;
5423    errorEl.hidden = !msg;
5424    if (msg) errorEl.textContent = msg;
5425  }
5426
5427  function setBusy(on) {
5428    btn.setAttribute('aria-busy', on ? 'true' : 'false');
5429    btn.disabled = on;
5430  }
5431
5432  btn.addEventListener('click', function () {
5433    setError(null);
5434    setBusy(true);
5435
5436    var mainId = null;
5437
5438    var cpcInput = document.querySelector('[id^="cpc-main-"]');
5439    if (cpcInput && cpcInput.value) {
5440      mainId = parseInt(cpcInput.value, 10) || null;
5441    }
5442
5443    if (!mainId) {
5444      var ccbInput = document.getElementById('ccb-main-' + SID);
5445      if (ccbInput && ccbInput.value) {
5446        mainId = parseInt(ccbInput.value, 10) || null;
5447      }
5448    }
5449
5450    if (!mainId) {
5451      setError('Valitse päätuote Theme Editorissa (Campaign CTA Banner → Päätuote).');
5452      setBusy(false);
5453      return;
5454    }
5455
5456    var items = [{ id: mainId, quantity: 1 }];
5457
5458    var giftId = null;
5459    var defaultGift = document.getElementById('ccb-gift-default-' + SID);
5460    if (defaultGift && defaultGift.value) {
5461      giftId = parseInt(defaultGift.value, 10) || null;
5462    }
5463
5464    if (giftId) {
5465      items.push({
5466        id: giftId,
5467        quantity: 1,
5468        properties: { '_free_gift': 'true', '_free_gift_campaign': 'cpc-bundle' }
5469      });
5470    }
5471
5472    var cartRoot = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';
5473
5474    fetch(cartRoot + 'cart/add.js', {
5475      method: 'POST',
5476      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
5477      body: JSON.stringify({ items: items })
5478    })
5479    .then(function (res) {
5480      if (!res.ok) return res.json().then(function (d) {
5481        throw new Error(d.description || d.message || 'Virhe');
5482      });
5483      return res.json();
5484    })
5485    .then(function (data) {
5486      setBusy(false);
5487      btn.dispatchEvent(new CustomEvent('ajaxProduct:added', {
5488        bubbles: true,
5489        detail: { product: data, addToCartBtn: btn }
5490      }));
5491    })
5492    .catch(function (err) {
5493      setError('Virhe: ' + (err.message || 'Yritä uudelleen.'));
5494      setBusy(false);
5495    });
5496  });
5497
5498})();
5499</script>
5499
5500
5501</div><section id="shopify-section-template--31561534275926__1779803948613b464d" class="shopify-section"><div class="index-section"><div class="page-width"><div id="shopify-block-AdngzZFJxSUdGM1hoM__loox_reviews_loox_dynamic_section_qBKCFL" class="shopify-block shopify-app-block">
5502
5503
5504
5505
5506
5507<div
5508	id="looxReviews"
5509	class="loox-widget"
5510	data-limit="20"
5511	
5512	
5513	
5514	
5515		data-product-id="10882379907414"
5516	�
5517	
5518	 data-reviews-to-display="" 
5519	 data-default-tab="automatic" 
5520	style="margin:0 auto;max-width:1080px;"
5521>
5522	<!-- BEGIN app snippet: loox-ssr-reviews-feed -->
5523	<div id="loox-reviews-feed">
5524		<style class="loox-temp-hiding-style">
5525			#loox-reviews-feed {
5526				display: none;
5527			}
5528		</style>
5529
5530		<section aria-label="Customer reviews">
5531			<h3>Customer Reviews</h3>
5532
5533			
5534				<p class="loox-ssr-review-summary">
5535					Overall rating: 4.7 / 5 from 481 reviews.
5536				</p>
5537			
5538
5539			
5540				
5541				
5542				
5543				
5544
5545				
5546				
5547				
5548
5549				
5550				
5551
5552				<article
5553					class="loox-review"
5554					data-review-id="4mq_9-k8-"
5555					data-product-id="9877107966294"
5556				>
5557					
5558
5559					
5560						<p class="loox-review-body">Olen käyttänyt jo 3vuotta Joy TinyS kuulokkeita ja olen ollut todella tyytyväinen. Pysyvät hyvin korvissa ja ovat mukavat. Kuulikkeet kestävät pitkään! 😊</p>
5561					
5562
5563					<p class="loox-review-metadata">
5564						<span class="loox-reviewer-name">Heidi M.</span>
5565						<span class="loox-review-rating">5/5</span>
5566						
5567							<span class="loox-review-verified">Verified</span>
5568						
5569						
5570							<time datetime="2026-10-04T07:08:10.120Z" class="loox-review-date">
5571								October 4, 2026
5572							</time>
5573						
5574					</p>
5575
5576					
5577						<p class="loox-review-product">
5578							
5579								<a class="loox-review-product-link" href="/products/tinys-moomin™">TinyS Moomin™</a>
5580							
5581						</p>
5582					
5583
5584					
5585				</article>
5586			
5587				
5588				
5589				
5590				
5591
5592				
5593				
5594				
5595
5596				
5597				
5598
5599				<article
5600					class="loox-review"
5601					data-review-id="WGrGMfcel"
5602					data-product-id="10259673448790"
5603				>
5604					
5605
5606					
5607						<p class="loox-review-body">Ainoat kuulokkeet jotka mahtuvat minulle. Nämä ovat jo toiset, ekat hukkuivat valitettavasti välimeren rantahiekkaan 😬</p>
5608					
5609
5610					<p class="loox-review-metadata">
5611						<span class="loox-reviewer-name">Johanna S.</span>
5612						<span class="loox-review-rating">5/5</span>
5613						
5614							<span class="loox-review-verified">Verified</span>
5615						
5616						
5617							<time datetime="2026-09-30T04:25:57.518Z" class="loox-review-date">
5618								September 30, 2026
5619							</time>
5620						
5621					</p>
5622
5623					
5624						<p class="loox-review-product">
5625							
5626								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">JOY TinyS</a>
5627							
5628						</p>
5629					
5630
5631					
5632				</article>
5633			
5634				
5635				
5636				
5637				
5638
5639				
5640				
5641				
5642
5643				
5644				
5645
5646				<article
5647					class="loox-review"
5648					data-review-id="2cPl3t45G"
5649					data-product-id="10259673448790"
5650				>
5651					
5652
5653					
5654						<p class="loox-review-body">Hyvänkokoiset kuulokkeet. Hiukan vaikeat käyttää, eivätkä kuulokkeet mene pois päältä kun ne laitetaan latauskoteloon.</p>
5655					
5656
5657					<p class="loox-review-metadata">
5658						<span class="loox-reviewer-name">Anne H.</span>
5659						<span class="loox-review-rating">4/5</span>
5660						
5661							<span class="loox-review-verified">Verified</span>
5662						
5663						
5664							<time datetime="2026-09-29T20:23:53.675Z" class="loox-review-date">
5665								September 29, 2026
5666							</time>
5667						
5668					</p>
5669
5670					
5671						<p class="loox-review-product">
5672							
5673								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">JOY TinyS</a>
5674							
5675						</p>
5676					
5677
5678					
5679				</article>
5680			
5681				
5682				
5683				
5684				
5685
5686				
5687				
5688				
5689
5690				
5691				
5692
5693				<article
5694					class="loox-review"
5695					data-review-id="DtZloFhAa"
5696					data-product-id="10259673448790"
5697				>
5698					
5699
5700					
5701						<p class="loox-review-body">Minulla on pienet korvat ja kaikki tähänastiset kuulokkeet ovat olleet liian isoja ja saaneet korvani särkemään. TinyS on niin pieni ja kevyt, etten edes huomaa kuulokkeita korvissani. Ja ne pysyy paikallaan urheillessakin erinomaisesti. Loistava ostos!</p>
5702					
5703
5704					<p class="loox-review-metadata">
5705						<span class="loox-reviewer-name">Selina H.</span>
5706						<span class="loox-review-rating">5/5</span>
5707						
5708							<span class="loox-review-verified">Verified</span>
5709						
5710						
5711							<time datetime="2026-09-29T15:13:33.433Z" class="loox-review-date">
5712								September 29, 2026
5713							</time>
5714						
5715					</p>
5716
5717					
5718						<p class="loox-review-product">
5719							
5720								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">JOY TinyS</a>
5721							
5722						</p>
5723					
5724
5725					
5726				</article>
5727			
5728				
5729				
5730				
5731				
5732
5733				
5734				
5735				
5736
5737				
5738				
5739
5740				<article
5741					class="loox-review"
5742					data-review-id="_yxVfgPMm"
5743					data-product-id="10259673448790"
5744				>
5745					
5746
5747					
5748						<p class="loox-review-body">:)</p>
5749					
5750
5751					<p class="loox-review-metadata">
5752						<span class="loox-reviewer-name">Päivi S.</span>
5753						<span class="loox-review-rating">5/5</span>
5754						
5755							<span class="loox-review-verified">Verified</span>
5756						
5757						
5758							<time datetime="2026-09-29T11:01:16.419Z" class="loox-review-date">
5759								September 29, 2026
5760							</time>
5761						
5762					</p>
5763
5764					
5765						<p class="loox-review-product">
5766							
5767								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">JOY TinyS</a>
5768							
5769						</p>
5770					
5771
5772					
5773				</article>
5774			
5775				
5776				
5777				
5778				
5779
5780				
5781				
5782				
5783
5784				
5785				
5786
5787				<article
5788					class="loox-review"
5789					data-review-id="gR-TbOxp5"
5790					data-product-id="10259673448790"
5791				>
5792					
5793
5794					
5795						<p class="loox-review-body">Pysyy hyvin pienissä korvissa. Äänen toisto laadukas!</p>
5796					
5797
5798					<p class="loox-review-metadata">
5799						<span class="loox-reviewer-name">Johanna H.</span>
5800						<span class="loox-review-rating">5/5</span>
5801						
5802							<span class="loox-review-verified">Verified</span>
5803						
5804						
5805							<time datetime="2026-09-26T19:13:48.543Z" class="loox-review-date">
5806								September 26, 2026
5807							</time>
5808						
5809					</p>
5810
5811					
5812						<p class="loox-review-product">
5813							
5814								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">JOY TinyS</a>
5815							
5816						</p>
5817					
5818
5819					
5820				</article>
5821			
5822				
5823				
5824				
5825				
5826
5827				
5828				
5829				
5830
5831				
5832				
5833
5834				<article
5835					class="loox-review"
5836					data-review-id="x-TdOS1u-"
5837					data-product-id="10882379907414"
5838				>
5839					
5840
5841					
5842						<p class="loox-review-body">Todella hyvät äänikirjan kuunteluun, hyvä kokoiset ei paina eikä tunnu pahalta kylkiasennossakaan nukkuessa. Pitkään mietin kuulokkeiden ostoa, mutta ei kaduta ollenkaan ostos, ennemminkin harmittelen miksi en aikaisemminntilannut.</p>
5843					
5844
5845					<p class="loox-review-metadata">
5846						<span class="loox-reviewer-name">Piritta T.</span>
5847						<span class="loox-review-rating">5/5</span>
5848						
5849							<span class="loox-review-verified">Verified</span>
5850						
5851						
5852							<time datetime="2026-09-22T15:21:53.187Z" class="loox-review-date">
5853								September 22, 2026
5854							</time>
5855						
5856					</p>
5857
5858					
5859						<p class="loox-review-product">
5860							
5861								<a class="loox-review-product-link" href="/products/tinys-earbuds-desinged-for-women-joy-friends-club">TinyS</a>
5862							
5863						</p>
5864					
5865
5866					
5867				</article>
5868			
5869				
5870				
5871				
5872				
5873
5874				
5875				
5876				
5877
5878				
5879				
5880
5881				<article
5882					class="loox-review"
5883					data-review-id="JMso4Tj3t"
5884					data-product-id="10259673448790"
5885				>
5886					
5887
5888					
5889						<p class="loox-review-body">Hyvät ja sopivat korvaan👍</p>
5890					
5891
5892					<p class="loox-review-metadata">
5893						<span class="loox-reviewer-name">Eija H.</span>
5894						<span class="loox-review-rating">5/5</span>
5895						
5896							<span class="loox-review-verified">Verified</span>
5897						
5898						
5899							<time datetime="2026-09-16T10:47:02.701Z" class="loox-review-date">
5900								September 16, 2026
5901							</time>
5902						
5903					</p>
5904
5905					
5906						<p class="loox-review-product">
5907							
5908								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">JOY TinyS</a>
5909							
5910						</p>
5911					
5912
5913					
5914				</article>
5915			
5916				
5917				
5918				
5919				
5920
5921				
5922				
5923				
5924
5925				
5926				
5927
5928				<article
5929					class="loox-review"
5930					data-review-id="fRJ_qB9PA"
5931					data-product-id="10259673448790"
5932				>
5933					
5934
5935					
5936						<p class="loox-review-body">Hyvä ääni. Hyvä koko. Bassot ok.</p>
5937					
5938
5939					<p class="loox-review-metadata">
5940						<span class="loox-reviewer-name">Ari T.</span>
5941						<span class="loox-review-rating">3/5</span>
5942						
5943							<span class="loox-review-verified">Verified</span>
5944						
5945						
5946							<time datetime="2026-09-15T07:00:04.292Z" class="loox-review-date">
5947								September 15, 2026
5948							</time>
5949						
5950					</p>
5951
5952					
5953						<p class="loox-review-product">
5954							
5955								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">JOY TinyS</a>
5956							
5957						</p>
5958					
5959
5960					
5961				</article>
5962			
5963				
5964				
5965				
5966				
5967
5968				
5969				
5970				
5971
5972				
5973				
5974
5975				<article
5976					class="loox-review"
5977					data-review-id="AVT1fiFxb"
5978					data-product-id="8033926512874"
5979				>
5980					
5981
5982					
5983						<p class="loox-review-body">Istuvuus ja äänenlaatu hyvät.</p>
5984					
5985
5986					<p class="loox-review-metadata">
5987						<span class="loox-reviewer-name">Kirsi P.</span>
5988						<span class="loox-review-rating">5/5</span>
5989						
5990							<span class="loox-review-verified">Verified</span>
5991						
5992						
5993							<time datetime="2026-09-14T18:10:30.899Z" class="loox-review-date">
5994								September 14, 2026
5995							</time>
5996						
5997					</p>
5998
5999					
6000						<p class="loox-review-product">
6001							
6002								<a class="loox-review-product-link" href="/products/tinys®">TinyS®</a>
6003							
6004						</p>
6005					
6006
6007					
6008				</article>
6009			
6010				
6011				
6012				
6013				
6014
6015				
6016				
6017				
6018
6019				
6020				
6021
6022				<article
6023					class="loox-review"
6024					data-review-id="ZfsN9in_A"
6025					data-product-id="10259673448790"
6026				>
6027					
6028
6029					
6030						<p class="loox-review-body">Jää kuva kuin kuulokkeissa olisi äänenvaimennus, mutta sitä ei ole. Pettymys</p>
6031					
6032
6033					<p class="loox-review-metadata">
6034						<span class="loox-reviewer-name">Anneli R.</span>
6035						<span class="loox-review-rating">2/5</span>
6036						
6037							<span class="loox-review-verified">Verified</span>
6038						
6039						
6040							<time datetime="2026-09-12T12:08:53.113Z" class="loox-review-date">
6041								September 12, 2026
6042							</time>
6043						
6044					</p>
6045
6046					
6047						<p class="loox-review-product">
6048							
6049								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6050							
6051						</p>
6052					
6053
6054					
6055				</article>
6056			
6057				
6058				
6059				
6060				
6061
6062				
6063				
6064				
6065
6066				
6067				
6068
6069				<article
6070					class="loox-review"
6071					data-review-id="WEsGPpYkr"
6072					data-product-id="10259673448790"
6073				>
6074					
6075
6076					
6077						<p class="loox-review-body">Ihan parhaat kuulokkeet. Pysyy hyvin korvissa myös urheillessa. Eikä paina korvia vaikka sattuisi kuulokkeiden kanssa nukahtamaan.</p>
6078					
6079
6080					<p class="loox-review-metadata">
6081						<span class="loox-reviewer-name">Maiju K.</span>
6082						<span class="loox-review-rating">5/5</span>
6083						
6084							<span class="loox-review-verified">Verified</span>
6085						
6086						
6087							<time datetime="2026-09-09T18:47:23.916Z" class="loox-review-date">
6088								September 9, 2026
6089							</time>
6090						
6091					</p>
6092
6093					
6094						<p class="loox-review-product">
6095							
6096								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6097							
6098						</p>
6099					
6100
6101					
6102				</article>
6103			
6104				
6105				
6106				
6107				
6108
6109				
6110				
6111				
6112
6113				
6114				
6115
6116				<article
6117					class="loox-review"
6118					data-review-id="KuFIv4DnD"
6119					data-product-id="10259673448790"
6120				>
6121					
6122
6123					
6124						<p class="loox-review-body">Mulla on jo kahdet Joy tiny’s ja ne ovat ainoat kuulokkeet, mitkä ihan oikeasti pysyy korvissa välittämättä siitä, mitä teen. Äänenlaatu on myös ihan ok. Ratkaisevampi asia mulla on pysyvyys. Ainoa miinus on se, että rasia on vähän liian pieni ja kevyt ja asentaminen korvaan ilman turhia ”painalluksia” ei onnistu, mutta ne on pieniä asioita.</p>
6125					
6126
6127					<p class="loox-review-metadata">
6128						<span class="loox-reviewer-name">
6128Leeni M.</span>
6129						<span class="loox-review-rating">5/5</span>
6130						
6131							<span class="loox-review-verified">Verified</span>
6132						
6133						
6134							<time datetime="2026-09-07T12:35:20.093Z" class="loox-review-date">
6135								September 7, 2026
6136							</time>
6137						
6138					</p>
6139
6140					
6141						<p class="loox-review-product">
6142							
6143								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6144							
6145						</p>
6146					
6147
6148					
6149				</article>
6150			
6151				
6152				
6153				
6154				
6155
6156				
6157				
6158				
6159
6160				
6161				
6162
6163				<article
6164					class="loox-review"
6165					data-review-id="NHMxcgzVl"
6166					data-product-id="8538104267094"
6167				>
6168					
6169
6170					
6171						<p class="loox-review-body">Kaksi kertaa olen yrittänyt tilata varaosana TinyS nappia. Molemmilla kerroilla tuotetta on ollut varastossa kun olen tilausta tehnyt, mutta sitten se onkin ilmeisesti loppunut samantien. Ensimmäisellä kerralla odotin yli kaksi kuukautta. En saanut mitään väliaikatietoja tilauksesta ennen kuin itse kysyin perään. Kerran se luvattiin lähettää seuraavalla viikolla... ei tullut vielä kuukaudenkaan päästä ja lopulta peruutin tilaukseni. Kolme viikkoa sitten laitoin uuden tilauksen vetämään kun näin, että tuotetta oli (eri värisenä) varastossa. Epäilen vaan, että liekö saan sitä ikinä.</p>
6172					
6173
6174					<p class="loox-review-metadata">
6175						<span class="loox-reviewer-name">Outi L.</span>
6176						<span class="loox-review-rating">1/5</span>
6177						
6178						
6179							<time datetime="2026-09-07T06:15:07.072Z" class="loox-review-date">
6180								September 7, 2026
6181							</time>
6182						
6183					</p>
6184
6185					
6186						<p class="loox-review-product">
6187							
6188								<a class="loox-review-product-link" href="/products/tinys®-oikea-kuuloke">TinyS - Right Earbud</a>
6189							
6190						</p>
6191					
6192
6193					
6194				</article>
6195			
6196				
6197				
6198				
6199				
6200
6201				
6202				
6203				
6204
6205				
6206				
6207
6208				<article
6209					class="loox-review"
6210					data-review-id="QHBZqYIur"
6211					data-product-id="10259673448790"
6212				>
6213					
6214
6215					
6216						<p class="loox-review-body">Hyvät on pieniin korviin</p>
6217					
6218
6219					<p class="loox-review-metadata">
6220						<span class="loox-reviewer-name">Sari K.</span>
6221						<span class="loox-review-rating">5/5</span>
6222						
6223							<span class="loox-review-verified">Verified</span>
6224						
6225						
6226							<time datetime="2026-09-03T08:59:22.955Z" class="loox-review-date">
6227								September 3, 2026
6228							</time>
6229						
6230					</p>
6231
6232					
6233						<p class="loox-review-product">
6234							
6235								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6236							
6237						</p>
6238					
6239
6240					
6241				</article>
6242			
6243				
6244				
6245				
6246				
6247
6248				
6249				
6250				
6251
6252				
6253				
6254
6255				<article
6256					class="loox-review"
6257					data-review-id="-Rih4Uvmb"
6258					data-product-id="8033926512874"
6259				>
6260					
6261						
6262
6263						
6264						<a class="loox-review-media-link" href="/products/tinys®?qv=-Rih4Uvmb" rel="nofollow">
6265							
6266							<img
6267								class="loox-review-image"
6268								src="//images.loox.io/uploads/2026/9/2/-Rih4Uvmb_l-pRCThMd_orig_mid.jpg"
6269								alt="Customer video review of TinyS®"
6270								
6271								width="1440"
6272								height="2560"
6273								loading="lazy"
6274								decoding="async"
6275							>
6276						
6277						</a>
6278					
6279
6280					
6281						<p class="loox-review-body">Miulla on ollut haaste löytää hyviä nappikuulokkeita pieniin korviin, mutta nämä ovat loistavat. Pysyy päässä ilman jatkuvaa korjailua ja äänenlaatu todella hyvä! ❤️</p>
6282					
6283
6284					<p class="loox-review-metadata">
6285						<span class="loox-reviewer-name">Jonna W.</span>
6286						<span class="loox-review-rating">5/5</span>
6287						
6288						
6289							<time datetime="2026-09-02T15:46:32.815Z" class="loox-review-date">
6290								September 2, 2026
6291							</time>
6292						
6293					</p>
6294
6295					
6296						<p class="loox-review-product">
6297							
6298								<a class="loox-review-product-link" href="/products/tinys®">TinyS®</a>
6299							
6300						</p>
6301					
6302
6303					
6304				</article>
6305			
6306				
6307				
6308				
6309				
6310
6311				
6312				
6313				
6314
6315				
6316				
6317
6318				<article
6319					class="loox-review"
6320					data-review-id="6K8gRc5nL"
6321					data-product-id="10259673448790"
6322				>
6323					
6324						
6325
6326						
6327						<a class="loox-review-media-link" href="/products/tinys®-earbudsforwomen?qv=6K8gRc5nL" rel="nofollow">
6328							
6329							<img
6330								class="loox-review-image"
6331								src="//images.loox.io/uploads/2026/9/2/nzwQVnbZ6_mid.jpg"
6332								alt="Customer photo review of TinyS - Pienikorvaisille suunnitellut kuulokkeet"
6333								
6334								width="2316"
6335								height="3088"
6336								loading="lazy"
6337								decoding="async"
6338							>
6339						
6340						</a>
6341					
6342
6343					
6344						<p class="loox-review-body">Istuu hyvin ja pysyy urheillessakin. Akun kesto voisi olla parempi mutta muuten ei valittamista.</p>
6345					
6346
6347					<p class="loox-review-metadata">
6348						<span class="loox-reviewer-name">Emilia K.</span>
6349						<span class="loox-review-rating">4/5</span>
6350						
6351							<span class="loox-review-verified">Verified</span>
6352						
6353						
6354							<time datetime="2026-09-02T05:40:28.732Z" class="loox-review-date">
6355								September 2, 2026
6356							</time>
6357						
6358					</p>
6359
6360					
6361						<p class="loox-review-product">
6362							
6363								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6364							
6365						</p>
6366					
6367
6368					
6369				</article>
6370			
6371				
6372				
6373				
6374				
6375
6376				
6377				
6378				
6379
6380				
6381				
6382
6383				<article
6384					class="loox-review"
6385					data-review-id="K2D5Whx7h"
6386					data-product-id="10259673448790"
6387				>
6388					
6389
6390					
6391						<p class="loox-review-body">Kappaleen vaihto hankalaa. Ei onnistu ohjeiden mukaisesti.</p>
6392					
6393
6394					<p class="loox-review-metadata">
6395						<span class="loox-reviewer-name">Mia N.</span>
6396						<span class="loox-review-rating">4/5</span>
6397						
6398							<span class="loox-review-verified">Verified</span>
6399						
6400						
6401							<time datetime="2026-09-01T12:20:43.592Z" class="loox-review-date">
6402								September 1, 2026
6403							</time>
6404						
6405					</p>
6406
6407					
6408						<p class="loox-review-product">
6409							
6410								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6411							
6412						</p>
6413					
6414
6415					
6416				</article>
6417			
6418				
6419				
6420				
6421				
6422
6423				
6424				
6425				
6426
6427				
6428				
6429
6430				<article
6431					class="loox-review"
6432					data-review-id="_WYyfqygS"
6433					data-product-id="10259673448790"
6434				>
6435					
6436
6437					
6438						<p class="loox-review-body">Kaunis väri, pieni kotelo ja hyvät korvassa:)</p>
6439					
6440
6441					<p class="loox-review-metadata">
6442						<span class="loox-reviewer-name">
6442Maaret K.</span>
6443						<span class="loox-review-rating">5/5</span>
6444						
6445							<span class="loox-review-verified">Verified</span>
6446						
6447						
6448							<time datetime="2026-08-30T08:37:38.595Z" class="loox-review-date">
6449								August 30, 2026
6450							</time>
6451						
6452					</p>
6453
6454					
6455						<p class="loox-review-product">
6456							
6457								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6458							
6459						</p>
6460					
6461
6462					
6463				</article>
6464			
6465				
6466				
6467				
6468				
6469
6470				
6471				
6472				
6473
6474				
6475				
6476
6477				<article
6478					class="loox-review"
6479					data-review-id="7EGefARqc"
6480					data-product-id="8033926512874"
6481				>
6482					
6483						
6484
6485						
6486						<a class="loox-review-media-link" href="/products/tinys®?qv=7EGefARqc" rel="nofollow">
6487							
6488							<img
6489								class="loox-review-image"
6490								src="//images.loox.io/uploads/2026/8/26/7EGefARqc_MhlMeAZZF_orig_mid.jpg"
6491								alt="Customer video review of TinyS®"
6492								
6493								width="1440"
6494								height="2560"
6495								loading="lazy"
6496								decoding="async"
6497							>
6498						
6499						</a>
6500					
6501
6502					
6503						<p class="loox-review-body">TinyS-kuulokkeet on ensimmäiset silikonipäiset nappikuulokkeet, jotka on jäänyt mulle käyttöön! Ne sujahtaa korvaan näppärästi ja pysyy paikallaan kovemmassakin liikkeessä. Äänenlaatu on hyvä ja taustamelunvaimennus ominaisuus toimii niin kuin pitääkin 👍 Mulle myös aina iso plussa on se, jos tuote on esteettisesti miellyttävä ja TinyS-kuulokkeet ovat kyllä kokonsa puolesta super söpöt kun ovat niin pienet ja vaalenapunainen värivaihtoehto on aivan ihana 🤩💕</p>
6504					
6505
6506					<p class="loox-review-metadata">
6507						<span class="loox-reviewer-name">Mari H.</span>
6508						<span class="loox-review-rating">5/5</span>
6509						
6510						
6511							<time datetime="2026-08-26T23:10:18.802Z" class="loox-review-date">
6512								August 27, 2026
6513							</time>
6514						
6515					</p>
6516
6517					
6518						<p class="loox-review-product">
6519							
6520								<a class="loox-review-product-link" href="/products/tinys®">TinyS®</a>
6521							
6522						</p>
6523					
6524
6525					
6526				</article>
6527			
6528				
6529				
6530				
6531				
6532
6533				
6534				
6535				
6536
6537				
6538				
6539
6540				<article
6541					class="loox-review"
6542					data-review-id="tu6P-2vgG"
6543					data-product-id="10259673448790"
6544				>
6545					
6546
6547					
6548						<p class="loox-review-body">Hyvät kuulokkeet, pysyvät korvissa hyvin.</p>
6549					
6550
6551					<p class="loox-review-metadata">
6552						<span class="loox-reviewer-name">Satu S.</span>
6553						<span class="loox-review-rating">4/5</span>
6554						
6555							<span class="loox-review-verified">Verified</span>
6556						
6557						
6558							<time datetime="2026-08-26T09:09:43.448Z" class="loox-review-date">
6559								August 26, 2026
6560							</time>
6561						
6562					</p>
6563
6564					
6565						<p class="loox-review-product">
6566							
6567								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6568							
6569						</p>
6570					
6571
6572					
6573				</article>
6574			
6575				
6576				
6577				
6578				
6579
6580				
6581				
6582				
6583
6584				
6585				
6586
6587				<article
6588					class="loox-review"
6589					data-review-id="VXA0t3p8n"
6590					data-product-id="10259673448790"
6591				>
6592					
6593
6594					
6595						<p class="loox-review-body">Edellist tulivat puolet nopeammin.</p>
6596					
6597
6598					<p class="loox-review-metadata">
6599						<span class="loox-reviewer-name">Salla R.</span>
6600						<span class="loox-review-rating">4/5</span>
6601						
6602							<span class="loox-review-verified">Verified</span>
6603						
6604						
6605							<time datetime="2026-08-25T15:47:00.682Z" class="loox-review-date">
6606								August 25, 2026
6607							</time>
6608						
6609					</p>
6610
6611					
6612						<p class="loox-review-product">
6613							
6614								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6615							
6616						</p>
6617					
6618
6619					
6620				</article>
6621			
6622				
6623				
6624				
6625				
6626
6627				
6628				
6629				
6630
6631				
6632				
6633
6634				<article
6635					class="loox-review"
6636					data-review-id="Siey6PSMD"
6637					data-product-id="10259673448790"
6638				>
6639					
6640						
6641
6642						
6643						<a class="loox-review-media-link" href="/products/tinys®-earbudsforwomen?qv=Siey6PSMD" rel="nofollow">
6644							
6645							<img
6646								class="loox-review-image"
6647								src="//images.loox.io/uploads/2026/8/25/P9fTZskre_mid.jpg"
6648								alt="Customer photo review of TinyS - Pienikorvaisille suunnitellut kuulokkeet"
6649								
6650								width="2316"
6651								height="3088"
6652								loading="lazy"
6653								decoding="async"
6654							>
6655						
6656						</a>
6657					
6658
6659					
6660						<p class="loox-review-body">Ihan mun lempparit. Hyvä äänenlaatu, pysyy korvissa kovissakin treeneissä. Just täydellisen kokoiset korviini.</p>
6661					
6662
6663					<p class="loox-review-metadata">
6664						<span class="loox-reviewer-name">Iida H.</span>
6665						<span class="loox-review-rating">5/5</span>
6666						
6667							<span class="loox-review-verified">Verified</span>
6668						
6669						
6670							<time datetime="2026-08-25T06:46:57.946Z" class="loox-review-date">
6671								August 25, 2026
6672							</time>
6673						
6674					</p>
6675
6676					
6677						<p class="loox-review-product">
6678							
6679								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6680							
6681						</p>
6682					
6683
6684					
6685				</article>
6686			
6687				
6688				
6689				
6690				
6691
6692				
6693				
6694				
6695
6696				
6697				
6698
6699				<article
6700					class="loox-review"
6701					data-review-id="3C-CdHiJ4"
6702					data-product-id="10259673448790"
6703				>
6704					
6705
6706					
6707						<p class="loox-review-body">Ensimmäiset nappikuulokkeet, jotka istuvat hyvin korviin ja pysyvät paikallaan treenatessa ja lenkkeillessä. 🤩</p>
6708					
6709
6710					<p class="loox-review-metadata">
6711						<span class="loox-reviewer-name">Mari H.</span>
6712						<span class="loox-review-rating">5/5</span>
6713						
6714							<span class="loox-review-verified">Verified</span>
6715						
6716						
6717							<time datetime="2026-08-24T15:40:54.154Z" class="loox-review-date">
6718								August 24, 2026
6719							</time>
6720						
6721					</p>
6722
6723					
6724						<p class="loox-review-product">
6725							
6726								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6727							
6728						</p>
6729					
6730
6731					
6732				</article>
6733			
6734				
6735				
6736				
6737				
6738
6739				
6740				
6741				
6742
6743				
6744				
6745
6746				<article
6747					class="loox-review"
6748					data-review-id="6Jbhf-HoX"
6749					data-product-id="10259673448790"
6750				>
6751					
6752
6753					
6754						<p class="loox-review-body">Laatu ei vastaa hintaa.</p>
6755					
6756
6757					<p class="loox-review-metadata">
6758						<span class="loox-reviewer-name">Leena T.</span>
6759						<span class="loox-review-rating">3/5</span>
6760						
6761							<span class="loox-review-verified">Verified</span>
6762						
6763						
6764							<time datetime="2026-08-21T15:52:13.389Z" class="loox-review-date">
6765								August 21, 2026
6766							</time>
6767						
6768					</p>
6769
6770					
6771						<p class="loox-review-product">
6772							
6773								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6774							
6775						</p>
6776					
6777
6778					
6779				</article>
6780			
6781				
6782				
6783				
6784				
6785
6786				
6787				
6788				
6789
6790				
6791				
6792
6793				<article
6794					class="loox-review"
6795					data-review-id="227NbYbJd"
6796					data-product-id="8539527774550"
6797				>
6798					
6799
6800					
6801						<p class="loox-review-body">
6801Ensimmäinen kotelo ei toiminut, niin uusi toimitettiin heti postiin👍🏻.</p>
6802					
6803
6804					<p class="loox-review-metadata">
6805						<span class="loox-reviewer-name">Tuula A.</span>
6806						<span class="loox-review-rating">5/5</span>
6807						
6808							<span class="loox-review-verified">Verified</span>
6809						
6810						
6811							<time datetime="2026-08-21T14:16:34.132Z" class="loox-review-date">
6812								August 21, 2026
6813							</time>
6814						
6815					</p>
6816
6817					
6818						<p class="loox-review-product">
6819							
6820								<a class="loox-review-product-link" href="/products/tinys®-lataus-kotelo">TinyS® - Charging Box</a>
6821							
6822						</p>
6823					
6824
6825					
6826				</article>
6827			
6828				
6829				
6830				
6831				
6832
6833				
6834				
6835				
6836
6837				
6838				
6839
6840				<article
6841					class="loox-review"
6842					data-review-id="vkkWXdSw8"
6843					data-product-id="10259673448790"
6844				>
6845					
6846
6847					
6848						<p class="loox-review-body">Ainoat nappikuulokkeet,jotka pysyvät korvissani. Miellyttävä, häiriötön kuuntelukokemus esim. työmatkaa pyöräillessä, siivotessa,tuulessa kävellessä jne.</p>
6849					
6850
6851					<p class="loox-review-metadata">
6852						<span class="loox-reviewer-name">Satu K.</span>
6853						<span class="loox-review-rating">5/5</span>
6854						
6855							<span class="loox-review-verified">Verified</span>
6856						
6857						
6858							<time datetime="2026-08-21T12:33:39.902Z" class="loox-review-date">
6859								August 21, 2026
6860							</time>
6861						
6862					</p>
6863
6864					
6865						<p class="loox-review-product">
6866							
6867								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6868							
6869						</p>
6870					
6871
6872					
6873				</article>
6874			
6875				
6876				
6877				
6878				
6879
6880				
6881				
6882				
6883
6884				
6885				
6886
6887				<article
6888					class="loox-review"
6889					data-review-id="G9xV1LnLm"
6890					data-product-id="10259673448790"
6891				>
6892					
6893
6894					
6895						<p class="loox-review-body">Yhden käyttökerran perusteella kuulokkeet vaikuttaa hyvältä, pysyivät hyvin korvissa kuntosalitreenin ajan. Miinusta siitä, että sähköpostikyselyjä ja mainoksia tulee liian tiuhaan.</p>
6896					
6897
6898					<p class="loox-review-metadata">
6899						<span class="loox-reviewer-name">Marjo-riikka K.</span>
6900						<span class="loox-review-rating">4/5</span>
6901						
6902							<span class="loox-review-verified">Verified</span>
6903						
6904						
6905							<time datetime="2026-08-20T11:15:31.833Z" class="loox-review-date">
6906								August 20, 2026
6907							</time>
6908						
6909					</p>
6910
6911					
6912						<p class="loox-review-product">
6913							
6914								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6915							
6916						</p>
6917					
6918
6919					
6920				</article>
6921			
6922				
6923				
6924				
6925				
6926
6927				
6928				
6929				
6930
6931				
6932				
6933
6934				<article
6935					class="loox-review"
6936					data-review-id="Sd1X4AqVNR"
6937					data-product-id="10259673448790"
6938				>
6939					
6940
6941					
6942						<p class="loox-review-body">Nämä on ollut parhaat, ostin jo toiset kuulokkeet😊</p>
6943					
6944
6945					<p class="loox-review-metadata">
6946						<span class="loox-reviewer-name">Jaana V.</span>
6947						<span class="loox-review-rating">5/5</span>
6948						
6949							<span class="loox-review-verified">Verified</span>
6950						
6951						
6952							<time datetime="2026-08-18T09:29:14.260Z" class="loox-review-date">
6953								August 18, 2026
6954							</time>
6955						
6956					</p>
6957
6958					
6959						<p class="loox-review-product">
6960							
6961								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
6962							
6963						</p>
6964					
6965
6966					
6967				</article>
6968			
6969				
6970				
6971				
6972				
6973
6974				
6975				
6976				
6977
6978				
6979				
6980
6981				<article
6982					class="loox-review"
6983					data-review-id="vt8uOCkTU"
6984					data-product-id="8033926512874"
6985				>
6986					
6987						
6988
6989						
6990						<a class="loox-review-media-link" href="/products/tinys®?qv=vt8uOCkTU" rel="nofollow">
6991							
6992							<img
6993								class="loox-review-image"
6994								src="//images.loox.io/uploads/2026/8/18/vt8uOCkTU_U5-_Afpsm_orig_mid.jpg"
6995								alt="Customer video review of TinyS®"
6996								
6997								width="1440"
6998								height="2560"
6999								loading="lazy"
7000								decoding="async"
7001							>
7002						
7003						</a>
7004					
7005
7006					
7007						<p class="loox-review-body">Kuulokkeet oli tosi positiivinen yllätys äänenlaadultaan ja käyttömukavuudeltaan. Ehdottomasti paras ominaisuus on se, että ne pysyy hyvin korvissa liikkuessa, eikä esim. tuuli vaikuta kuuntelukokemukseen. Tykkään!!</p>
7008					
7009
7010					<p class="loox-review-metadata">
7011						<span class="loox-reviewer-name">Anniina P.</span>
7012						<span class="loox-review-rating">5/5</span>
7013						
7014						
7015							<time datetime="2026-08-18T05:52:03.413Z" class="loox-review-date">
7016								August 18, 2026
7017							</time>
7018						
7019					</p>
7020
7021					
7022						<p class="loox-review-product">
7023							
7024								<a class="loox-review-product-link" href="/products/tinys®">TinyS®</a>
7025							
7026						</p>
7027					
7028
7029					
7030				</article>
7031			
7032				
7033				
7034				
7035				
7036
7037				
7038				
7039				
7040
7041				
7042				
7043
7044				<article
7045					class="loox-review"
7046					data-review-id="O3wlvVXJwq"
7047					data-product-id="8033926512874"
7048				>
7049					
7050						
7051
7052						
7053						<a class="loox-review-media-link" href="/products/tinys®?qv=O3wlvVXJwq" rel="nofollow">
7054							
7055							<img
7056								class="loox-review-image"
7057								src="//images.loox.io/uploads/2026/8/17/O3wlvVXJwq_xbtoJKBxq_orig_mid.jpg"
7058								alt="Customer video review of TinyS®"
7059								
7060								width="1440"
7061								height="2560"
7062								loading="lazy"
7063								decoding="async"
7064							>
7065						
7066						</a>
7067					
7068
7069					
7070						<p class="loox-review-body">Todella hyvät kuulokkeet! Pysyy pienemmissäkin korvissa ja vaikka minkälaisessa menossa. Ei tarvitse pelätä, että tippuu ja menee hukkaan. Mukavat käyttää. Ei paina korvia kipeästi useammankaan käyttötunnin jälkeen. Huippuluokan äänet.</p>
7071					
7072
7073					<p class="loox-review-metadata">
7074						<span class="loox-reviewer-name">Katja U.</span>
7075						<span class="loox-review-rating">5/5</span>
7076						
7077						
7078							<time datetime="2026-08-17T14:15:19.517Z" class="loox-review-date">
7079								August 17, 2026
7080							</time>
7081						
7082					</p>
7083
7084					
7085						<p class="loox-review-product">
7086							
7087								<a class="loox-review-product-link" href="/products/tinys®">TinyS®</a>
7088							
7089						</p>
7090					
7091
7092					
7093				</article>
7094			
7095				
7096				
7097				
7098				
7099
7100				
7101				
7102				
7103
7104				
7105				
7106
7107				<article
7108					class="loox-review"
7109					data-review-id="AN9z6NtVh"
7110					data-product-id="10259673448790"
7111				>
7112					
7113
7114					
7115						<p class="loox-review-body">Vielä ei ole löytynyt sitä optimaalista kumia, mutta vaihtoehtoja on, niin uskon että löytyy kyllä.
7116Äänen laatu on super :)</p>
7117					
7118
7119					<p class="loox-review-metadata">
7120						<span class="loox-reviewer-name">Inka H.</span>
7121						<span class="loox-review-rating">4/5</span>
7122						
7123							<span class="loox-review-verified">Verified</span>
7124						
7125						
7126							<time datetime="2026-08-17T09:43:11.106Z" class="loox-review-date">
7127								August 17, 2026
7128							</time>
7129						
7130					</p>
7131
7132					
7133						<p class="loox-review-product">
7134							
7135								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
7136							
7137						</p>
7138					
7139
7140					
7141				</article>
7142			
7143				
7144				
7145				
7146				
7147
7148				
7149				
7150				
7151
7152				
7153				
7154
7155				<article
7156					class="loox-review"
7157					data-review-id="UH8pgPJb8"
7158					data-product-id="10259673448790"
7159				>
7160					
7161
7162					
7163						<p class="loox-review-body">Kuulokkeiden näppäilytoiminnot eivät toimi. Etenkin oikean kuulokkeen toiminnot kuten äänenvoimakkuus ja kappaleen vaihto ei onnistu.</p>
7164					
7165
7166					<p class="loox-review-metadata">
7167						<span class="loox-reviewer-name">Tuija P.</span>
7168						<span class="loox-review-rating">2/5</span>
7169						
7170							<span class="loox-review-verified">Verified</span>
7171						
7172						
7173							<time datetime="2026-08-17T09:22:28.015Z" class="loox-review-date">
7174								August 17, 2026
7175							</time>
7176						
7177					</p>
7178
7179					
7180						<p class="loox-review-product">
7181							
7182								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Earbuds desinged for women</a>
7183							
7184						</p>
7185					
7186
7187					
7188				</article>
7189			
7190				
7191				
7192				
7193				
7194
7195				
7196				
7197				
7198
7199				
7200				
7201
7202				<article
7203					class="loox-review"
7204					data-review-id="4A9BFMqPq"
7205					data-product-id="10259673448790"
7206				>
7207					
7208
7209					
7210						<p class="loox-review-body">Mahtava tuote pienille korville. Mieletön äänen laatu.</p>
7211					
7212
7213					<p class="loox-review-metadata">
7214						<span class="loox-reviewer-name">Marja R.</span>
7215						<span class="loox-review-rating">5/5</span>
7216						
7217							<span class="loox-review-verified">Verified</span>
7218						
7219						
7220							<time datetime="2026-08-17T07:33:46.118Z" class="loox-review-date">
7221								August 17, 2026
7222							</time>
7223						
7224					</p>
7225
7226					
7227						<p class="loox-review-product">
7228							
7229								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
7230							
7231						</p>
7232					
7233
7234					
7235				</article>
7236			
7237				
7238				
7239				
7240				
7241
7242				
7243				
7244				
7245
7246				
7247				
7248
7249				<article
7250					class="loox-review"
7251					data-review-id="C0U0QRJRg"
7252					data-product-id="10259673448790"
7253				>
7254					
7255
7256					
7257						<p class="loox-review-body">Tiny S -kuulokkeet pysyvät korvissa paremmin kuin muut kokeilemani kuulokkeet. Äänentoisto on melko hyvä. Sen sijaan vastamelua ne eivät estä. Minulla on toiset Tiny S kuulokkeet. Ensimmäisistä toisen korvan kuuloke meni mykäksi alle vuoden käytön jÃ
7257¤lkeen. Asiakaspalvelu on Joy Planetilla ollut nopeaa, joustavaa ja ystävällistä. Esimerkiksi tuotteen vaihto sujui täysin ongelmitta. Kiitos siitä!</p>
7258					
7259
7260					<p class="loox-review-metadata">
7261						<span class="loox-reviewer-name">Laura W.</span>
7262						<span class="loox-review-rating">4/5</span>
7263						
7264							<span class="loox-review-verified">Verified</span>
7265						
7266						
7267							<time datetime="2026-08-16T05:15:29.708Z" class="loox-review-date">
7268								August 16, 2026
7269							</time>
7270						
7271					</p>
7272
7273					
7274						<p class="loox-review-product">
7275							
7276								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
7277							
7278						</p>
7279					
7280
7281					
7282				</article>
7283			
7284				
7285				
7286				
7287				
7288
7289				
7290				
7291				
7292
7293				
7294				
7295
7296				<article
7297					class="loox-review"
7298					data-review-id="CZiJMKJPET"
7299					data-product-id="10259673448790"
7300				>
7301					
7302
7303					
7304						<p class="loox-review-body">Kuulokkeiden kans voi maata sängyssä kyljellään. Ei paina korvia, jos asento on hyvä.</p>
7305					
7306
7307					<p class="loox-review-metadata">
7308						<span class="loox-reviewer-name">Ella V.</span>
7309						<span class="loox-review-rating">5/5</span>
7310						
7311							<span class="loox-review-verified">Verified</span>
7312						
7313						
7314							<time datetime="2026-08-15T08:11:46.180Z" class="loox-review-date">
7315								August 15, 2026
7316							</time>
7317						
7318					</p>
7319
7320					
7321						<p class="loox-review-product">
7322							
7323								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
7324							
7325						</p>
7326					
7327
7328					
7329				</article>
7330			
7331				
7332				
7333				
7334				
7335
7336				
7337				
7338				
7339
7340				
7341				
7342
7343				<article
7344					class="loox-review"
7345					data-review-id="9MUAOIe9V"
7346					data-product-id="10259673448790"
7347				>
7348					
7349
7350					
7351						<p class="loox-review-body">Sanottiin että mahtuu kypärän sisään eikä paina korvia. No, painoi korvia. Tute palautettu, mutta rahoja ei ole tullut takaisin. Teillä on todella hidas ja kankea palautusjärjestelmä. Ehkä tarkoituksella.  Näillä spekseillä en uskalla tilailla mitään muuta.</p>
7352					
7353
7354					<p class="loox-review-metadata">
7355						<span class="loox-reviewer-name">Risto K.</span>
7356						<span class="loox-review-rating">2/5</span>
7357						
7358							<span class="loox-review-verified">Verified</span>
7359						
7360						
7361							<time datetime="2026-08-15T06:59:47.470Z" class="loox-review-date">
7362								August 15, 2026
7363							</time>
7364						
7365					</p>
7366
7367					
7368						<p class="loox-review-product">
7369							
7370								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
7371							
7372						</p>
7373					
7374
7375					
7376				</article>
7377			
7378				
7379				
7380				
7381				
7382
7383				
7384				
7385				
7386
7387				
7388				
7389
7390				<article
7391					class="loox-review"
7392					data-review-id="B0AsnrgD4"
7393					data-product-id="10259673448790"
7394				>
7395					
7396
7397					
7398						<p class="loox-review-body">Äänenlaatu huono ja kaikki äänet ulkoa kuuluu nappien läpi.Sopii lähinnä äänikirjojen kuunteluun eikä ollenkaan musiikkiin.
7399Lisäksi olen jättänyt 2 sähköpostia jotta voin palauttaa tuotteen ja minulle ei vastata.Ei kannata ostaa,hämärää toimintaa.</p>
7400					
7401
7402					<p class="loox-review-metadata">
7403						<span class="loox-reviewer-name">Essi H.</span>
7404						<span class="loox-review-rating">1/5</span>
7405						
7406							<span class="loox-review-verified">Verified</span>
7407						
7408						
7409							<time datetime="2026-08-14T21:14:29.418Z" class="loox-review-date">
7410								August 15, 2026
7411							</time>
7412						
7413					</p>
7414
7415					
7416						<p class="loox-review-product">
7417							
7418								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
7419							
7420						</p>
7421					
7422
7423					
7424				</article>
7425			
7426				
7427				
7428				
7429				
7430
7431				
7432				
7433				
7434
7435				
7436				
7437
7438				<article
7439					class="loox-review"
7440					data-review-id="UzpmwI68E"
7441					data-product-id="10259673448790"
7442				>
7443					
7444
7445					
7446						<p class="loox-review-body">En ollut uskoa, mutta nämä tosiaan pysyvät korvissani, olin jo luovuttanut nappikuulokkeiden suhteen. Olen tosi tyytyväinen myös äänen laatuun.</p>
7447					
7448
7449					<p class="loox-review-metadata">
7450						<span class="loox-reviewer-name">Riitta M.</span>
7451						<span class="loox-review-rating">5/5</span>
7452						
7453							<span class="loox-review-verified">Verified</span>
7454						
7455						
7456							<time datetime="2026-08-14T20:02:52.959Z" class="loox-review-date">
7457								August 14, 2026
7458							</time>
7459						
7460					</p>
7461
7462					
7463						<p class="loox-review-product">
7464							
7465								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
7466							
7467						</p>
7468					
7469
7470					
7471				</article>
7472			
7473				
7474				
7475				
7476				
7477
7478				
7479				
7480				
7481
7482				
7483				
7484
7485				<article
7486					class="loox-review"
7487					data-review-id="4vIogpgHm"
7488					data-product-id="10259673448790"
7489				>
7490					
7491						
7492
7493						
7494						<a class="loox-review-media-link" href="/products/tinys®-earbudsforwomen?qv=4vIogpgHm" rel="nofollow">
7495							
7496							<img
7497								class="loox-review-image"
7498								src="//images.loox.io/uploads/2026/8/14/Fj9lO28Ze_mid.jpg"
7499								alt="Customer photo review of TinyS - Pienikorvaisille suunnitellut kuulokkeet"
7500								
7501								width="3000"
7502								height="4000"
7503								loading="lazy"
7504								decoding="async"
7505							>
7506						
7507						</a>
7508					
7509
7510					
7511						<p class="loox-review-body">Pysyy tosi hyvin korvassa hikiselläkin lenkillä ja sekä kuulokkeet että latauskotelo on superkompaktit ja siistin näköiset! Vähän jäin kaipaamaan vastameluominaisuutta ja pidempää akun kestoa mutta ymmärrän että pieni koko tuo näihin haasteensa.</p>
7512					
7513
7514					<p class="loox-review-metadata">
7515						<span class="loox-reviewer-name">Hilja K.</span>
7516						<span class="loox-review-rating">4/5</span>
7517						
7518							<span class="loox-review-verified">Verified</span>
7519						
7520						
7521							<time datetime="2026-08-14T13:24:57.661Z" class="loox-review-date">
7522								August 14, 2026
7523							</time>
7524						
7525					</p>
7526
7527					
7528						<p class="loox-review-product">
7529							
7530								<a class="loox-review-product-link" href="/products/tinys®-earbudsforwomen">TinyS - Pienikorvaisille suunnitellut kuulokkeet</a>
7531							
7532						</p>
7533					
7534
7535					
7536				</article>
7537			
7538		</section>
7539	</div>
7540
7541<!-- END app snippet -->
7542</div>
7543
7544</div>
7545</div></div>
7546</section></div>
7547      </main>
7548
7549  
7550<!-- BEGIN sections: footer-group -->
7551<div id="shopify-section-sections--21527965434198__1773676614ebef9720" class="shopify-section shopify-section-group-footer-group">
7552
7553</div><div id="shopify-section-sections--21527965434198__footer" class="shopify-section shopify-section-group-footer-group"><footer class="site-footer" data-section-id="sections--21527965434198__footer" data-section-type="footer">
7554  <div class="page-width">
7555
7556    <div class="grid"><style data-shopify>@media only screen and (min-width: 769px) {
7557          .footer__item--custom_KKURBa {
7558            width: 20%;
7559          }
7560        }</style><div  class="grid__item footer__item--custom_KKURBa">
7561<div
7562  >
7563  <div class="collapsible-content__inner">
7564    <div class="footer__collapsible footer_collapsible--disabled">
7565      <p><strong>Joy Planet Finland Oy</strong><br/>Valo Hotel & Work<br/>Mannerheimintie 109<br/>00280 Helsinki<br/>Finland</p><p>Email: <a href="mailto:[email protected]" title="mailto:[email protected]">[email protected]</a><br/></p>
7566    </div>
7567  </div>
7568</div>
7569</div><style data-shopify>@media only screen and (min-width: 769px) {
7570          .footer__item--menu_GrHye7 {
7571            width: 20%;
7572          }
7573        }</style><div  class="grid__item footer__item--menu_GrHye7">
7574  
7575  <div
7576    >
7577    <div class="collapsible-content__inner">
7578      <div class="footer__collapsible footer_collapsible--disabled">
7579        <ul class="no-bullets site-footer__linklist"><li><a href="/pages/the-brand">Our Brand</a></li><li><a href="https://fi.joyearbuds.com/pages/help?hcUrl=%2Ffi-FI%2Farticles%2Fkayttoohjeet-159353">User Instructions</a></li><li><a href="/pages/sustainability">Sustainability</a></li><li><a href="/pages/team">Team JOY</a></li></ul>
7580      </div>
7581    </div>
7582  </div>
7583
7584</div><style data-shopify>@media only screen and (min-width: 769px) {
7585          .footer__item--footer-1 {
7586            width: 20%;
7587          }
7588        }</style><div  class="grid__item footer__item--footer-1">
7589  
7590  <div
7591    >
7592    <div class="collapsible-content__inner">
7593      <div class="footer__collapsible footer_collapsible--disabled">
7594        <ul class="no-bullets site-footer__linklist"><li><a href="/policies/shipping-policy">Shipping</a></li><li><a href="/pages/satisfaction-guarantee">Satisfaction guarantee</a></li><li><a href="/policies/refund-policy">Returns</a></li><li><a href="/policies/privacy-policy">Privacy Policy</a></li></ul>
7595      </div>
7596    </div>
7597  </div>
7598
7599</div><style data-shopify>@media only screen and (min-width: 769px) {
7600          .footer__item--menu_PDDwFd {
7601            width: 20%;
7602          }
7603        }</style><div  class="grid__item footer__item--menu_PDDwFd">
7604  
7605  <div
7606    >
7607    <div class="collapsible-content__inner">
7608      <div class="footer__collapsible footer_collapsible--disabled">
7609        <ul class="no-bullets site-footer__linklist"><li><a href="/pages/payment-conditions">Payment Conditions</a></li><li><a href="/policies/terms-of-service">Terms of Service</a></li><li><a href="/pages/cookies-policy">Cookies Policy</a></li><li><a href="/pages/privacy-policy-joyr-1">Privacy Policy JoyR+</a></li></ul>
7610      </div>
7611    </div>
7612  </div>
7613
7614</div><style data-shopify>@media only screen and (min-width: 769px) {
7615          .footer__item--footer-0 {
7616            width: 30%;
7617          }
7618        }</style><div class="footer__clear small--hide"></div><div  class="grid__item footer__item--footer-0"><div class="footer__logo-social"><ul class="no-bullets social-icons footer__social"><li>
7619      <a target="_blank" rel="noopener" href="https://www.instagram.com/joyearbuds/" title="Joy Planet Finland on Instagram">
7620        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-instagram" viewBox="0 0 32 32"><title>instagram</title><path fill="#444" d="M16 3.094c4.206 0 4.7.019 6.363.094 1.538.069 2.369.325 2.925.544.738.287 1.262.625 1.813 1.175s.894 1.075 1.175 1.813c.212.556.475 1.387.544 2.925.075 1.662.094 2.156.094 6.363s-.019 4.7-.094 6.363c-.069 1.538-.325 2.369-.544 2.925-.288.738-.625 1.262-1.175 1.813s-1.075.894-1.813 1.175c-.556.212-1.387.475-2.925.544-1.663.075-2.156.094-6.363.094s-4.7-.019-6.363-.094c-1.537-.069-2.369-.325-2.925-.544-.737-.288-1.263-.625-1.813-1.175s-.894-1.075-1.175-1.813c-.212-.556-.475-1.387-.544-2.925-.075-1.663-.094-2.156-.094-6.363s.019-4.7.094-6.363c.069-1.537.325-2.369.544-2.925.287-.737.625-1.263 1.175-1.813s1.075-.894 1.813-1.175c.556-.212 1.388-.475 2.925-.544 1.662-.081 2.156-.094 6.363-.094zm0-2.838c-4.275 0-4.813.019-6.494.094-1.675.075-2.819.344-3.819.731-1.037.4-1.913.944-2.788 1.819S1.486 4.656 1.08 5.688c-.387 1-.656 2.144-.731 3.825-.075 1.675-.094 2.213-.094 6.488s.019 4.813.094 6.494c.075 1.675.344 2.819.731 3.825.4 1.038.944 1.913 1.819 2.788s1.756 1.413 2.788 1.819c1 .387 2.144.656 3.825.731s2.213.094 6.494.094 4.813-.019 6.494-.094c1.675-.075 2.819-.344 3.825-.731 1.038-.4 1.913-.944 2.788-1.819s1.413-1.756 1.819-2.788c.387-1 .656-2.144.731-3.825s.094-2.212.094-6.494-.019-4.813-.094-6.494c-.075-1.675-.344-2.819-.731-3.825-.4-1.
7620038-.944-1.913-1.819-2.788s-1.756-1.413-2.788-1.819c-1-.387-2.144-.656-3.825-.731C20.812.275 20.275.256 16 .256z"/><path fill="#444" d="M16 7.912a8.088 8.088 0 0 0 0 16.175c4.463 0 8.087-3.625 8.087-8.088s-3.625-8.088-8.088-8.088zm0 13.338a5.25 5.25 0 1 1 0-10.5 5.25 5.25 0 1 1 0 10.5zM26.294 7.594a1.887 1.887 0 1 1-3.774.002 1.887 1.887 0 0 1 3.774-.003z"/></svg>
7621        <span class="icon__fallback-text">Instagram</span>
7622      </a>
7623    </li><li>
7624      <a target="_blank" rel="noopener" href="https://www.facebook.com/JOYearbuds" title="Joy Planet Finland on Facebook">
7625        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-facebook" viewBox="0 0 14222 14222"><path d="M14222 7112c0 3549.352-2600.418 6491.344-6000 7024.72V9168h1657l315-2056H8222V5778c0-562 275-1111 1159-1111h897V2917s-814-139-1592-139c-1624 0-2686 984-2686 2767v1567H4194v2056h1806v4968.72C2600.418 13603.344 0 10661.352 0 7112 0 3184.703 3183.703 1 7111 1s7111 3183.703 7111 7111Zm-8222 7025c362 57 733 86 1111 86-377.945 0-749.003-29.485-1111-86.28Zm2222 0v-.28a7107.458 7107.458 0 0 1-167.717 24.267A7407.158 7407.158 0 0 0 8222 14137Zm-167.717 23.987C7745.664 14201.89 7430.797 14223 7111 14223c319.843 0 634.675-21.479 943.283-62.013Z"/></svg>
7626        <span class="icon__fallback-text">Facebook</span>
7627      </a>
7628    </li></ul>
7629
7630
7631</div>
7632</div></div>
7633
7634    <div class="site-footer__bottom"><form method="post" action="/localization" id="localization_form" accept-charset="UTF-8" class="multi-selectors site-footer__bottom-block" enctype="multipart/form-data" data-disclosure-form=""><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="✓" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/products/tinys-earbuds-desinged-for-women-joy-friends-club" /><div class="multi-selectors__item">
7635              <h2 class="visually-hidden" id="LangHeading">
7636                Language
7637              </h2>
7638
7639              <div id="FooterLocale" class="disclosure">
7640                <button type="button" class="faux-select disclosure__toggle" aria-expanded="false" aria-controls="LangList" aria-describedby="LangHeading" data-disclosure-toggle>
7641                  English
7642                  <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-chevron-down" viewBox="0 0 28 16"><path d="m1.57 1.59 12.76 12.77L27.1 1.59" stroke-width="2" stroke="#000" fill="none"/></svg>
7643                </button>
7644                <ul id="LangList" class="disclosure-list" data-disclosure-list><li class="disclosure-list__item disclosure-list__item--current">
7645                      <a class="disclosure-list__option" href="#" lang="en" aria-current="true" data-value="en" data-disclosure-option>
7646                        English
7647                      </a>
7648                    </li><li class="disclosure-list__item ">
7649                      <a class="disclosure-list__option" href="#" lang="fi"  data-value="fi" data-disclosure-option>
7650                        Suomi
7651                      </a>
7652                    </li><li class="disclosure-list__item ">
7653                      <a class="disclosure-list__option" href="#" lang="de"  data-value="de" data-disclosure-option>
7654                        Deutsch
7655                      </a>
7656                    </li></ul>
7657                <input type="hidden" name="locale_code" id="LocaleSelector" value="en" data-disclosure-input/>
7658              </div>
7659            </div></form><ul class="inline-list payment-icons site-footer__bottom-block payment-icons--greyscale text-center"><li class="icon--payment">
7660                <svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" fill="none" aria-labelledby="pi-american_express"><title id="pi-american_express">American Express</title><rect x=".5" y=".5" width="37" height="23" rx="2.5" stroke="#000" stroke-opacity=".07" fill="none"/><path d="M35 0H3C1.3 0 0 1.3 0 3V21C0 22.7 1.4 24 3 24H35C36.7 24 38 22.7 38 21V3C38 1.3 36.6 0 35 0Z" fill="#0071CE" style="fill:#0071CE;fill:color(display-p3 0.0000 0.4431 0.8078);fill-opacity:1;"/>
7660<path d="M3 0.5H35C36.3348 0.5 37.5 1.58692 37.5 3V21C37.5 22.4239 36.4239 23.5 35 23.5H3C1.66524 23.5 0.5 22.4131 0.5 21V3C0.5 1.57614 1.57614 0.5 3 0.5Z" stroke="black" stroke-opacity="0.07" style="stroke:black;stroke-opacity:0.07;"/><path d="M25.8662 6.33203V3H31L31.8662 5.5332L32.7334 3H37V14.2002H36.7998L34.8672 16.2656L36.7998 18.3594H37V21.2666H33.5996L31.9336 19.3994L30.2002 21.2666H19.4668V12.666H16L20.2666 3H24.4004L25.8662 6.33203ZM20.5996 20.2656H27V18.5322H22.666V17.3994H26.8662V15.666H22.666V14.5322H27V12.7988H20.5996V20.2656ZM30.5332 16.5322L27 20.2656H29.5996L31.8662 17.8662L34.0664 20.2656H36.7324L33.1992 16.4658L36.7324 12.7988H34.1328L31.8662 15.1992L29.7324 12.7988H27L30.5332 16.5322ZM17.666 11.7324H19.9326L20.5332 10.1992H23.999L24.666 11.7324H26.999L23.666 4.19922H20.999L17.666 11.7324ZM33.5996 4.19922L31.9326 8.86621L30.1992 4.19922H27V11.666H29.0664V6.39941L31 11.666H32.7998L34.7324 6.39941V11.666H36.7324V4.13281L33.5996 4.19922ZM23.2656 8.46582H21.2656L22.2656 5.99902L23.2656 8.46582Z" fill="white" style="fill:white;fill-opacity:1;"/></svg>
7661
7662              </li><li class="icon--payment">
7663                <svg version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" x="0" y="0" width="38" height="24" viewBox="0 0 165.521 105.965" xml:space="preserve" aria-labelledby="pi-apple_pay"><title id="pi-apple_pay">Apple Pay</title><path fill="#000" d="M150.698 0H14.823c-.566 0-1.133 0-1.698.003-.477.004-.953.009-1.43.022-1.039.028-2.087.09-3.113.274a10.51 10.51 0 0 0-2.958.975 9.932 9.932 0 0 0-4.35 4.35 10.463 10.463 0 0 0-.975 2.96C.113 9.611.052 10.658.024 11.696a70.22 70.22 0 0 0-.022 1.43C0 13.69 0 14.256 0 14.823v76.318c0 .567 0 1.132.002 1.699.003.476.009.953.022 1.43.028 1.036.09 2.084.275 3.11a10.46 10.46 0 0 0 .974 2.96 9.897 9.897 0 0 0 1.83 2.52 9.874 9.874 0 0 0 2.52 1.83c.947.483 1.917.79 2.96.977 1.025.183 2.073.245 3.112.273.477.011.953.017 1.43.02.565.004 1.132.004 1.698.004h135.875c.565 0 1.132 0 1.697-.004.476-.002.952-.009 1.431-.02 1.037-.028 2.085-.09 3.113-.273a10.478 10.478 0 0 0 2.958-.977 9.955 9.955 0 0 0 4.35-4.35c.483-.947.789-1.917.974-2.96.186-1.026.246-2.074.274-3.11.013-.477.02-.954.022-1.43.004-.567.004-1.132.004-1.699V14.824c0-.567 0-1.133-.004-1.699a63.067 63.067 0 0 0-.022-1.429c-.028-1.038-.088-2.085-.274-3.112a10.4 10.4 0 0 0-.974-2.96 9.94 9.94 0 0 0-4.35-4.35A10.52 10.52 0 0 0 156.939.3c-1.028-.185-2.076-.246-3.113-.274a71.417 71.417 0 0 0-1.431-.022C151.83 0 151.263 0 150.698 0z" /><path fill="#FFF" d="M150.698 3.532l1.672.003c.452.003.905.008 1.36.02.793.022 1.719.065 2.583.22.75.135 1.38.34 1.984.648a6.392 6.392 0 0 1 2.804 2.807c.306.6.51 1.226.645 1.983.154.854.197 1.783.218 2.58.013.45.019.9.02 1.36.005.557.005 1.113.005 1.671v76.318c0 .558 0 1.114-.004 1.682-.002.45-.008.9-.02 1.35-.022.796-.065 1.725-.221 2.589a6.855 6.855 0 0 1-.645 1.975 6.397 6.397 0 0 1-2.808 2.807c-.6.306-1.228.511-1.971.645-.881.157-1.847.2-2.574.22-.457.01-.912.017-1.379.019-.555.004-1.113.004-1.669.004H14.801c-.55 0-1.1 0-1.66-.004a74.993 74.993 0 0 1-1.35-.018c-.744-.02-1.71-.064-2.584-.22a6.938 6.938 0 0 1-1.986-.65 6.337 6.337 0 0 1-1.622-1.18 6.355 6.355 0 0 1-1.178-1.623 6.935 6.935 0 0 1-.646-1.985c-.156-.863-.2-1.788-.22-2.578a66.088 66.088 0 0 1-.02-1.355l-.003-1.327V14.474l.002-1.325a66.7 66.7 0 0 1 .02-1.357c.022-.792.065-1.717.222-2.587a6.924 6.924 0 0 1 .646-1.981c.304-.598.7-1.144 1.18-1.623a6.386 6.386 0 0 1 1.624-1.18 6.96 6.96 0 0 1 1.98-.646c.865-.155 1.792-.198 2.586-.22.452-.012.905-.017 1.354-.02l1.677-.003h135.875" /><g><g><path fill="#000" d="M43.508 35.77c1.404-1.755 2.356-4.112 2.105-6.52-2.054.102-4.56 1.355-6.012 3.112-1.303 1.504-2.456 3.959-2.156 6.266 2.306.2 4.61-1.152 6.063-2.858" /><path fill="#000" d="M45.587 39.079c-3.35-.2-6.196 1.9-7.795 1.9-1.6 0-4.049-1.8-6.698-1.751-3.447.05-6.645 2-8.395 5.1-3.598 6.2-.95 15.4 2.55 20.45 1.699 2.5 3.747 5.25 6.445 5.151 2.55-.1 3.549-1.65 6.647-1.65 3.097 0 3.997 1.65 6.696 1.6 2.798-.05 4.548-2.5 6.247-5 1.95-2.85 2.747-5.6 2.797-5.75-.05-.05-5.396-2.101-5.446-8.251-.05-5.15 4.198-7.6 4.398-7.751-2.399-3.548-6.147-3.948-7.447-4.048" /></g><g><path fill="#000" d="M78.973 32.11c7.278 0 12.347 5.017 12.347 12.321 0 7.33-5.173 12.373-12.529 12.373h-8.058V69.62h-5.822V32.11h14.062zm-8.24 19.807h6.68c5.07 0 7.954-2.729 7.954-7.46 0-4.73-2.885-7.434-7.928-7.434h-6.706v14.894z" />
7663<path fill="#000" d="M92.764 61.847c0-4.809 3.665-7.564 10.423-7.98l7.252-.442v-2.08c0-3.04-2.001-4.704-5.562-4.704-2.938 0-5.07 1.507-5.51 3.82h-5.252c.157-4.86 4.731-8.395 10.918-8.395 6.654 0 10.995 3.483 10.995 8.89v18.663h-5.38v-4.497h-.13c-1.534 2.937-4.914 4.782-8.579 4.782-5.406 0-9.175-3.222-9.175-8.057zm17.675-2.417v-2.106l-6.472.416c-3.64.234-5.536 1.585-5.536 3.95 0 2.288 1.975 3.77 5.068 3.77 3.95 0 6.94-2.522 6.94-6.03z" /><path fill="#000" d="M120.975 79.652v-4.496c.364.051 1.247.103 1.715.103 2.573 0 4.029-1.09 4.913-3.899l.52-1.663-9.852-27.293h6.082l6.863 22.146h.13l6.862-22.146h5.927l-10.216 28.67c-2.34 6.577-5.017 8.735-10.683 8.735-.442 0-1.872-.052-2.261-.157z" /></g></g></svg>
7664
7665              </li><li class="icon--payment">
7666                <svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" aria-labelledby="pi-google_pay"><title id="pi-google_pay">Google Pay</title><path d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z" fill="#000" opacity=".07"/><path d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32" fill="#FFF"/><path d="M18.093 11.976v3.2h-1.018v-7.9h2.691a2.447 2.447 0 0 1 1.747.692 2.28 2.28 0 0 1 .11 3.224l-.11.116c-.47.447-1.098.69-1.747.674l-1.673-.006zm0-3.732v2.788h1.698c.377.012.741-.135 1.005-.404a1.391 1.391 0 0 0-1.005-2.354l-1.698-.03zm6.484 1.348c.65-.03 1.286.188 1.778.613.445.43.682 1.03.65 1.649v3.334h-.969v-.766h-.049a1.93 1.93 0 0 1-1.673.931 2.17 2.17 0 0 1-1.496-.533 1.667 1.667 0 0 1-.613-1.324 1.606 1.606 0 0 1 .613-1.336 2.746 2.746 0 0 1 1.698-.515c.517-.02 1.03.093 1.49.331v-.208a1.134 1.134 0 0 0-.417-.901 1.416 1.416 0 0 0-.98-.368 1.545 1.545 0 0 0-1.319.717l-.895-.564a2.488 2.488 0 0 1 2.182-1.
766606zM23.29 13.52a.79.79 0 0 0 .337.662c.223.176.5.269.785.263.429-.001.84-.17 1.146-.472.305-.286.478-.685.478-1.103a2.047 2.047 0 0 0-1.324-.374 1.716 1.716 0 0 0-1.03.294.883.883 0 0 0-.392.73zm9.286-3.75l-3.39 7.79h-1.048l1.281-2.728-2.224-5.062h1.103l1.612 3.885 1.569-3.885h1.097z" fill="#5F6368"/><path d="M13.986 11.284c0-.308-.024-.616-.073-.92h-4.29v1.747h2.451a2.096 2.096 0 0 1-.9 1.373v1.134h1.464a4.433 4.433 0 0 0 1.348-3.334z" fill="#4285F4"/><path d="M9.629 15.721a4.352 4.352 0 0 0 3.01-1.097l-1.466-1.14a2.752 2.752 0 0 1-4.094-1.44H5.577v1.17a4.53 4.53 0 0 0 4.052 2.507z" fill="#34A853"/><path d="M7.079 12.05a2.709 2.709 0 0 1 0-1.735v-1.17H5.577a4.505 4.505 0 0 0 0 4.075l1.502-1.17z" fill="#FBBC04"/><path d="M9.629 8.44a2.452 2.452 0 0 1 1.74.68l1.3-1.293a4.37 4.37 0 0 0-3.065-1.183 4.53 4.53 0 0 0-4.027 2.5l1.502 1.171a2.715 2.715 0 0 1 2.55-1.875z" fill="#EA4335"/></svg>
7667
7668              </li><li class="icon--payment">
7669                <svg viewBox="0 0 38 24" xmlns="http://www.w3.org/2000/svg" width="38" height="24" role="img" aria-labelledby="pi-maestro"><title id="pi-maestro">Maestro</title><path opacity=".07" d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z"/><path fill="#fff" d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32"/><circle fill="#EB001B" cx="15" cy="12" r="7"/><circle fill="#00A2E5" cx="23" cy="12" r="7"/><path fill="#7375CF" d="M22 12c0-2.4-1.2-4.5-3-5.7-1.8 1.3-3 3.4-3 5.7s1.2 4.5 3 5.7c1.8-1.2 3-3.3 3-5.7z"/></svg>
7670              </li><li class="icon--payment">
7671                <svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" fill="none" aria-labelledby="pi-master"><title id="pi-master">Mastercard</title><rect x=".5" y=".5" width="37" height="23" rx="2.5" stroke="#000" stroke-opacity=".07" fill="none"/><path d="M35 0H3C1.3 0 0 1.3 0 3V21C0 22.7 1.4 24 3 24H35C36.7 24 38 22.7 38 21V3C38 1.3 36.6 0 35 0Z" fill="#1C1C1C" style="fill:#1C1C1C;fill:color(display-p3 0.1098 0.1098 0.1098);fill-opacity:1;"/><path d="M35 1C36.1 1 37 1.9 37 3V21C37 22.1 36.1 23 35 23H3C1.9 23 1 22.1 1 21V3C1 1.9 1.9 1 3 1H35Z" fill="#232323" style="fill:#232323;fill:color(display-p3 0.1373 0.1373 0.1373);fill-opacity:1;"/><path d="M14.6364 19.2727C18.8538 19.2727 22.2727 15.8538 22.2727 11.6364C22.2727 7.41892 18.8538 4 14.6364 4C10.4189 4 7 7.41892 7 11.6364C7 15.8538 10.4189 19.2727 14.6364 19.2727Z" fill="#EB001B" style="fill:#EB001B;fill:color(display-p3 0.9216 0.0000 0.1059);fill-opacity:1;"/><path d="M23.3637 19.2727C27.5811 19.2727 31 15.8538 31 11.6364C31 7.41892 27.5811 4 23.3637 4C19.1462 4 15.7273 7.41892 15.7273 11.6364C15.7273 15.8538 19.1462 19.2727 23.3637 19.2727Z" fill="#F79E1B" style="fill:#F79E1B;fill:color(display-p3 0.9686 0.6196 0.1059);fill-opacity:1;"/><path d="M22.2727 11.6362C22.2727 9.01797 20.9637 6.72706 19 5.41797C17.0364 6.83615 15.7273 9.12706 15.7273 11.6362C15.7273 14.1452 17.0364 16.5452 19 17.8543C20.9637 16.5452 22.2727 14.2543 22.2727 11.6362Z" fill="#FF5F00" style="fill:#FF5F00;fill:color(display-p3 1.0000 0.3725 0.0000);fill-opacity:1;"/></svg>
7672
7673              </li><li class="icon--payment">
7674                <svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" aria-labelledby="pi-shopify_pay"><title id="pi-shopify_pay">Shop Pay</title><path opacity=".07" d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z" fill="#000"/><path d="M35.889 0C37.05 0 38 .982 38 2.182v19.636c0 1.2-.95 2.182-2.111 2.182H2.11C.95 24 0 23.018 0 21.818V2.182C0 .982.95 0 2.111 0H35.89z" fill="#5A31F4"/><path d="M9.35 11.368c-1.017-.223-1.47-.31-1.47-.705 0-.372.306-.558.92-.558.54 0 .934.238 1.225.704a.079.079 0 00.104.03l1.146-.584a.082.082 0 00.032-.114c-.475-.831-1.353-1.286-2.51-1.286-1.52 0-2.464.755-2.464 1.956 0 1.275 1.15 1.597 2.17 1.82 1.02.222 1.474.31 1.474.705 0 .396-.332.582-.993.582-.612 0-1.065-.282-1.34-.83a.08.08 0 00-.107-.035l-1.143.57a.083.083 0 00-.036.111c.454.92 1.384 1.437 2.627 1.437 1.583 0 2.539-.742 2.539-1.98s-1.155-1.598-2.173-1.82v-.003zM15.49 8.855c-.65 0-1.224.232-1.636.646a.04.04 0 01-.069-.03v-2.64a.08.08 0 00-.08-.081H12.27a.08.08 0 00-.08.082v8.194a.08.08 0 00.08.082h1.433a.08.08 0 00.081-.082v-3.594c0-.695.528-1.227 1.239-1.227.71 0 1.226.521 1.226 1.227v3.594a.08.08 0 00.081.082h1.433a.08.08 0 00.081-.082v-3.594c0-1.51-.981-2.577-2.355-2.577zM20.753 8.62c-.778 0-1.507.24-2.03.588a.082.082 0 00-.027.109l.632 1.088a.08.08 0 00.
767411.03 2.5 2.5 0 011.318-.366c1.25 0 2.17.891 2.17 2.068 0 1.003-.736 1.745-1.669 1.745-.76 0-1.288-.446-1.288-1.077 0-.361.152-.657.548-.866a.08.08 0 00.032-.113l-.596-1.018a.08.08 0 00-.098-.035c-.799.299-1.359 1.018-1.359 1.984 0 1.46 1.152 2.55 2.76 2.55 1.877 0 3.227-1.313 3.227-3.195 0-2.018-1.57-3.492-3.73-3.492zM28.675 8.843c-.724 0-1.373.27-1.845.746-.026.027-.069.007-.069-.029v-.572a.08.08 0 00-.08-.082h-1.397a.08.08 0 00-.08.082v8.182a.08.08 0 00.08.081h1.433a.08.08 0 00.081-.081v-2.683c0-.036.043-.054.069-.03a2.6 2.6 0 001.808.7c1.682 0 2.993-1.373 2.993-3.157s-1.313-3.157-2.993-3.157zm-.271 4.929c-.956 0-1.681-.768-1.681-1.783s.723-1.783 1.681-1.783c.958 0 1.68.755 1.68 1.783 0 1.027-.713 1.783-1.681 1.783h.001z" fill="#fff"/></svg>
7675
7676              </li><li class="icon--payment">
7677                <svg viewBox="-36 25 38 24" xmlns="http://www.w3.org/2000/svg" width="38" height="24" role="img" aria-labelledby="pi-unionpay"><title id="pi-unionpay">Union Pay</title><path fill="#005B9A" d="M-36 46.8v.7-.7zM-18.3 25v24h-7.2c-1.3 0-2.1-1-1.8-2.3l4.4-19.4c.3-1.3 1.9-2.3 3.2-2.3h1.4zm12.6 0c-1.3 0-2.9 1-3.2 2.3l-4.5 19.4c-.3 1.3.5 2.3 1.8 2.3h-4.9V25h10.8z"/><path fill="#E9292D" d="M-19.7 25c-1.3 0-2.9 1.1-3.2 2.3l-4.4 19.4c-.3 1.3.5 2.3 1.8 2.3h-8.9c-.8 0-1.5-.6-1.5-1.4v-21c0-.8.7-1.6 1.5-1.6h14.7z"/><path fill="#0E73B9" d="M-5.7 25c-1.3 0-2.9 1.1-3.2 2.3l-4.4 19.4c-.3 1.3.5 2.3 1.8 2.3H-26h.5c-1.3 0-2.1-1-1.8-2.3l4.4-19.4c.3-1.3 1.9-2.3 3.2-2.3h14z"/><path fill="#059DA4" d="M2 26.6v21c0 .8-.6 1.4-1.5 1.4h-12.1c-1.3 0-2.1-1.1-1.8-2.3l4.5-19.4C-8.6 26-7 25-5.7 25H.5c.9 0 1.5.7 1.5 1.6z"/><path fill="#fff" d="M-21.122 38.645h.14c.14 0 .28-.07.28-.14l.42-.63h1.19l-.21.35h1.4l-.21.63h-1.68c-.21.28-.42.42-.7.42h-.84l.21-.63m-.21.91h3.01l-.21.7h-1.19l-.21.7h1.19l-.21.7h-1.19l-.28 1.05c-.07.14 0 .28.28.21h.98l-.21.7h-1.89c-.35 0-.49-.21-.35-.63l.35-1.33h-.77l.21-.7h.77l.21-.7h-.7l.21-.7zm4.83-1.75v.42s.56-.42 1.12-.42h1.96l-.77 2.66c-.07.28-.35.49-.77.49h-2.24l-.49 1.89c0 .07 0 .14.14.14h.42l-.14.56h-1.12c-.42 0-.56-.14-.49-.35l1.47-5.39h.91zm1.68.77h-1.75l-.21.7s.28-.21.77-.21h1.05l.14-.49zm-.63 1.68c.14 0 .21 0 .21-.14l.14-.35h-1.75l-.14.56 1.54-.07zm-1.19.84h.98v.42h.28c.14 0 .21-.07.21-.14l.07-.28h.84l-.14.49c-.07.35-.35.49-.77.56h-.56v.77c0 .14.07.21.35.21h.49l-.14.56h-1.19c-.35 0-.49-.14-.49-.49l.07-2.1zm4.2-2.45l.21-.84h1.19l-.07.28s.56-.28 1.05-.28h1.47l-.21.84h-.21l-1.12 3.85h.21l-.21.77h-.21l-.07.35h-1.19l.07-.35h-2.17l.21-.77h.21l1.12-3.85h-.28m1.26 0l-.28 1.05s.49-.21.91-.28c.07-.35.21-.77.21-.77h-.84zm-.49 1.54l-.28 1.12s.56-.28.98-.28c.14-.42.21-.77.21-.77l-.91-.07zm.21 2.31l.21-.77h-.84l-.21.77h.84zm2.87-4.69h1.12l.07.42c0 .07.07.14.21.14h.21l-.21.7h-.77c-.28 0-.49-.07-.49-.35l-.14-.91zm-.35 1.47h3.57l-.21.77h-1.19l-.21.7h1.12l-.21.77h-1.26l-.28.42h.63l.14.84c0 .07.07.14.21.14h.21l-.21.7h-.7c-.35 0-.56-.07-.56-.35l-.14-.77-.56.84c-.14.21-.35.35-.63.35h-1.05l.21-.7h.35c.14 0 .21-.07.35-.21l.84-1.26h-1.05l.21-.77h1.19l.21-.7h-1.19l.21-.77zm-19.74-5.04c-.14.7-.42 1.19-.91 1.54-.49.35-1.12.56-1.89.56-.7 0-1.26-.21-1.54-.56-.21-.28-.35-.56-.35-.98 0-.14 0-.35.07-.56l.84-3.92h1.19l-.77 3.92v.28c0 .21.07.35.14.49.14.21.35.28.7.28s.7-.07.91-.28c.21-.21.42-.42.49-.77l.77-3.92h1.19l-.84 3.92m1.12-1.54h.84l-.07.49.14-.14c.28-.28.63-.42 1.05-.42.35 0 .63.14.77.35.14.21.21.49.14.91l-.49 2.38h-.91l.42-2.17c.07-.28.07-.49 0-.56-.07-.14-.21-.14-.35-.14-.21 0-.42.07-.56.21-.14.14-.28.35-.28.63l-.42 2.03h-.91l.63-3.57m9.8 0h.84l-.07.49.14-.14c.28-.28.63-.42 1.05-.42.35 0 .63.14.77.35s.21.49.14.91l-.49 2.38h-.91l.42-2.24c.07-.21 0-.42-.07-.49-.07-.14-.21-.14-.35-.14-.21 0-.42.07-.56.21-.14.14-.28.35-.28.63l-.42 2.03h-.91l.7-3.57m-5.81 0h.98l-.77 3.5h-.98l.77-3.5m.35-1.33h.98l-.21.84h-.98l.21-.84zm1.4 4.55c-.21-.21-.35-.56-.35-.98v-.21c0-.07 0-.21.07-.28.14-.56.35-1.05.7-1.33.35-.35.84-.49 1.33-.49.42 0 .77.14 1.05.35.21.21.35.56.35.98v.21c0 .07 0 .21-.07.28-.14.56-.35.98-.7 1.33-.35.35-.84.49-1.33.49-.35 0-.7-.14-1.05-.35m1.89-.7c.14-.21.28-.49.35-.84v-.35c0-.21-.07-.35-.14-.49a.635.635 0 0 0-.49-.21c-.28 0-.49.07-.63.28-.14.21-.28.49-.35.84v.28
7677c0 .21.07.35.14.49.14.14.28.21.49.21.28.07.42 0 .63-.21m6.51-4.69h2.52c.49 0 .84.14 1.12.35.28.21.35.56.35.91v.28c0 .07 0 .21-.07.28-.07.49-.35.98-.7 1.26-.42.35-.84.49-1.4.49h-1.4l-.42 2.03h-1.19l1.19-5.6m.56 2.59h1.12c.28 0 .49-.07.7-.21.14-.14.28-.35.35-.63v-.28c0-.21-.07-.35-.21-.42-.14-.07-.35-.14-.7-.14h-.91l-.35 1.68zm8.68 3.71c-.35.77-.7 1.26-.91 1.47-.21.21-.63.7-1.61.7l.07-.63c.84-.28 1.26-1.4 1.54-1.96l-.28-3.78h1.19l.07 2.38.91-2.31h1.05l-2.03 4.13m-2.94-3.85l-.42.28c-.42-.35-.84-.56-1.54-.21-.98.49-1.89 4.13.91 2.94l.14.21h1.12l.7-3.29-.91.07m-.56 1.82c-.21.56-.56.84-.91.77-.28-.14-.35-.63-.21-1.19.21-.56.56-.84.91-.77.28.14.35.63.21 1.19"/></svg>
7678              </li><li class="icon--payment">
7679                <svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 38 24" width="38" height="24" fill="none" aria-labelledby="pi-visa"><title id="pi-visa">Visa</title><rect x=".5" y=".5" width="37" height="23" rx="2.5" stroke="#000" stroke-opacity=".07" fill="none"/><path d="M35 0H3C1.3 0 0 1.3 0 3V21C0 22.7 1.4 24 3 24H35C36.7 24 38 22.7 38 21V3C38 1.3 36.6 0 35 0Z" fill="#142FBD" style="fill:#142FBD;fill:color(display-p3 0.0784 0.1843 0.7412);fill-opacity:1;"/><path d="M35 1C36.1 1 37 1.9 37 3V21C37 22.1 36.1 23 35 23H3C1.9 23 1 22.1 1 21V3C1 1.9 1.9 1 3 1H35Z" fill="#1532CB" style="fill:#1532CB;fill:color(display-p3 0.0824 0.1961 0.7961);fill-opacity:1;"/><path d="M29.5944 10.2167H29.2778C28.8556 11.2722 28.5389 11.8 28.2222 13.3833H30.2278C29.9111 11.8 29.9111 11.0611 29.5944 10.2167V10.2167ZM32.6556 16.4444H30.8611C30.7556 16.4444 30.7556 16.4444 30.65 16.3389L30.4389 15.3889L30.3333 15.1778H27.8C27.6944 15.1778 27.5889 15.1778 27.5889 15.3889L27.2722 16.3389C27.2722 16.4444 27.1667 16.4444 27.1667 16.4444H24.95L25.1611 15.9167L28.2222 8.73889C28.2222 8.21111 28.5389 8 29.0667 8H30.65C30.7556 8 30.8611 8 30.8611 8.21111L32.3389 15.0722C32.4444 15.4944 32.55 15.8111 32.55 16.2333C32.6556 16.3389 32.6556 16.3389 32.6556 16.4444V16.4444ZM18.5111 16.1278L18.9333 14.2278C19.0389 14.2278 19.1444 14.3333 19.1444 14.3333C19.8833 14.65 20.6222 14.8611 21.3611 14.7556C21.5722 14.7556 21.8889 14.65 22.1 14.5444C22.6278 14.3333 22.6278 13.8056 22.2056 13.3833C21.9944 13.1722 21.6778 13.0667 21.3611 12.8556C20.9389 12.6444 20.5167 12.4333 20.2 12.1167C18.9333 11.0611 19.3556 9.58333 20.0944 8.84444C20.7278 8.42222 21.0444 8 21.8889 8C23.1556 8 24.5278 8 25.1611 8.21111H25.2667C25.1611 8.84444 25.0556 9.37222 24.8444 10.0056C24.3167 9.79444 23.7889 9.58333 23.2611 9.58333C22.9444 9.58333 22.6278 9.58333 22.3111 9.68889C22.1 9.68889 21.9944 9.79444 21.8889 9.9C21.6778 10.1111 21.6778 10.4278 21.8889 10.6389L22.4167 11.0611C22.8389 11.2722 23.2611 11.4833 23.5778 11.6944C24.1056 12.0111 24.6333 12.5389 24.7389 13.1722C24.95 14.1222 24.6333 14.9667 23.7889 15.6C23.2611 16.0222 23.05 16.2333 22.3111 16.2333C20.8333 16.2333 19.6722 16.3389 18.7222 16.0222C18.6167 16.2333 18.6167 16.2333 18.5111 16.1278V16.1278ZM14.8167 16.4444C14.9222 15.7056 14.9222 15.7056 15.0278 15.3889C15.5556 13.0667 16.0833 10.6389 16.5056 8.31667C16.6111 8.10556 16.6111 8 16.8222 8H18.7222C18.5111 9.26667 18.3 10.2167 17.9833 11.3778C17.6667 12.9611 17.35 14.5444 16.9278 16.1278C16.9278 16.3389 16.8222 16.3389 16.6111 16.3389L14.8167 16.4444ZM5 8.21111C5 8.10556 5.21111 8 5.31667 8H8.90556C9.43333 8 9.85556 8.31667 9.96111 8.84444L10.9111 13.4889C10.9111 13.5944 10.9111 13.5944 11.0167 13.7C11.0167 13.5944 11.1222 13.5944 11.1222 13.5944L13.3389 8.21111C13.2333 8.10556 13.3389 8 13.4444 8H15.6611C15.6611 8.10556 15.6611 8.10556 15.5556 8.21111L12.2833 15.9167C12.1778 16.1278 12.1778 
767916.2333 12.0722 16.3389C11.9667 16.4444 11.7556 16.3389 11.5444 16.3389H9.96111C9.85556 16.3389 9.75 16.3389 9.75 16.1278L8.06111 9.58333C7.85 9.37222 7.53333 9.05556 7.11111 8.95C6.47778 8.63333 5.31667 8.42222 5.10556 8.42222L5 8.21111Z" fill="white" style="fill:white;fill-opacity:1;"/></svg>
7680
7681              </li></ul><div class="footer__copyright site-footer__bottom-block"><span>
7682            &copy; 2026 Joy Planet Finland
7683</span><span class="footer__powered_by"><a href="https://www.saleslion.fi/" target="_blank">Shopify Store by Saleslion</a></span>
7684      </div>
7685    </div>
7686
7687  </div>
7688</footer>
7689
7690
7691</div><div id="shopify-section-sections--21527965434198__footer-promotions" class="shopify-section shopify-section-group-footer-group index-section--footer">
7692</div>
7693<!-- END sections: footer-group --></div>
7694  </div><div id="VideoModal" class="modal modal--solid">
7695  <div class="modal__inner">
7696    <div class="modal__centered page-width text-center">
7697      <div class="modal__centered-content">
7698        <div class="video-wrapper video-wrapper--modal">
7699          <div id="VideoHolder"></div>
7700        </div>
7701      </div>
7702    </div>
7703  </div>
7704
7705  <button type="button" class="modal__close js-modal-close text-link">
7706    <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg>
7707    <span class="icon__fallback-text">"Close (esc)"</span>
7708  </button>
7709</div>
7710<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
7711  <div class="pswp__bg"></div>
7712  <div class="pswp__scroll-wrap">
7713    <div class="pswp__container">
7714      <div class="pswp__item"></div>
7715      <div class="pswp__item"></div>
7716      <div class="pswp__item"></div>
7717    </div>
7718
7719    <div class="pswp__ui pswp__ui--hidden">
7720      <button class="btn btn--no-animate btn--body btn--circle pswp__button pswp__button--arrow--left" title="Previous">
7721        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-left" viewBox="0 0 284.49 498.98"><title>icon-chevron-left</title><path d="M249.49 0a35 35 0 0 1 24.75 59.75L84.49 249.49l189.75 189.74a35.002 35.002 0 1 1-49.5 49.5L10.25 274.24a35 35 0 0 1 0-49.5L224.74 10.25A34.89 34.89 0 0 1 249.49 0Z"/></svg>
7722      </button>
7723
7724      <button class="btn btn--no-animate btn--body btn--circle btn--large pswp__button pswp__button--close" title="Close (esc)">
7725        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg>
7726      </button>
7727
7728      <button class="btn btn--no-animate btn--body btn--circle pswp__button pswp__button--arrow--right" title="Next">
7729        <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-right" viewBox="0 0 284.49 498.98"><title>icon-chevron</title><path d="M35 498.98a35 35 0 0 1-24.75-59.75l189.74-189.74L10.25 59.75a35.002 35.002 0 0 1 49.5-49.5l214.49 214.49a35 35 0 0 1 0 49.5L59.75 488.73A34.89 34.89 0 0 1 35 498.98Z"/></svg>
7730      </button>
7731    </div>
7732  </div>
7733</div>
7734<tool-tip data-tool-tip="">
7735  <div class="tool-tip__inner" data-tool-tip-inner>
7736    <button class="tool-tip__close" data-tool-tip-close=""><svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 64 64"><title>icon-X</title><path d="m19 17.61 27.12 27.13m0-27.12L19 44.74"/></svg></button>
7737    <div data-tool-tip-title>Premium Nappikuulokkeet - Sopii jokaiseen korvaan</div>
7738    <div class="tool-tip__content" data-tool-tip-content>
7739    </div>
7740  </div>
7741</tool-tip>
7742
7743  <template id="predictiveImageMarkup">
7744    <image-element>
7745      <img width height src loading="lazy" sizes="(min-width: 769px) 100px, 60px">
7746    </image-element>
7747  </template>
7748
7749
7750  
7751    <!-- jquery -->
7752<script src="//joyearbuds.com/cdn/shop/t/54/assets/jquery.min.js?v=18371384823053301681745997770"></script>
7752
7753
7754<script src="//joyearbuds.com/cdn/shop/t/54/assets/jquery-migrate.min.js?v=12320733872480360301745997761"></script>
7754
7755<!-- jquery -->
7756
7757<!-- slick slider -->
7758<script src="//joyearbuds.com/cdn/shop/t/54/assets/slick.min.js?v=71779134894361685811745997752"></script>
7758
7759
7760<script>
7761
7762  
7763  $(document).ready(function() {
7764      $('.sn-big-slider').slick({
7765        slidesToShow: 1,
7766        slidesToScroll: 1,
7767        arrows: false,
7768        infinite: false,
7769        autoplay: false,
7770        adaptiveHeight: true,
7771        asNavFor: '.sn-thumb-slider'
7772      });
7773    $('.sn-thumb-slider').slick({
7774        slidesToShow: 5,
7775        slidesToScroll: 1,
7776        arrows: false,
7777        infinite: false,
7778        autoplay: false,
7779        focusOnSelect: true,
7780        asNavFor: '.sn-big-slider',
7781        responsive: [{
7782            breakpoint: 600,
7783            settings: {
7784                slidesToShow: 4,
7785                slidesToScroll: 1
7786            }
7787        }, {
7788            breakpoint: 480,
7789            settings: {
7790                slidesToShow: 4,
7791                slidesToScroll: 1
7792            }
7793        }]
7794      });
7795    $('.marquee-slider').slick({
7796        speed: 5000,
7797        autoplay: true,
7798        autoplaySpeed: 0,
7799        centerMode: true,
7800        cssEase: 'linear',
7801        slidesToShow: 1,
7802        slidesToScroll: 1,
7803        variableWidth: true,
7804        infinite: true,
7805        initialSlide: 1,
7806        arrows: false,
7807        buttons: false,
7808        draggable: false,
7809        pauseOnHover: false,
7810    });
7811    $('.sn-reviews-slider').slick({
7812      slidesToShow: 5,
7813      slidesToScroll: 5,
7814      arrows: true,
7815      autoplay: true,
7816      responsive: [{
7817          breakpoint: 600,
7818          settings: {
7819              slidesToShow: 2,
7820              slidesToScroll: 1
7821          }
7822      }, {
7823          breakpoint: 480,
7824          settings: {
7825              slidesToShow: 1,
7826              slidesToScroll: 1
7827          }
7828      }]
7829  });
7830  });
7831</script>
7831
7832<!-- slick slider -->
7833
7834<!-- collapse js -->
7835<script>
7836  var coll = document.getElementsByClassName("collapsible");
7837  var i;
7838
7839  for (i = 0; i < coll.length; i++) {
7840      coll[i].addEventListener("click", function() {
7841          this.classList.toggle("active");
7842          var content = this.nextElementSibling;
7843          if (content.style.maxHeight) {
7844              content.style.maxHeight = null;
7845              content.style.padding = "0 10px";
7846          } else {
7847              content.style.maxHeight = content.scrollHeight + 20 + "px";
7848              content.style.padding = "10px";
7849          }
7850      });
7851  }
7852</script>
7852
7853<!-- collapse js -->
7854<script>
7855  document.querySelectorAll('a[href^="#"]').forEach(anchor => {
7856      anchor.addEventListener('click', function (e) {
7857          e.preventDefault();
7858
7859          document.querySelector(this.getAttribute('href')).scrollIntoView({
7860              behavior: 'smooth'
7861          });
7862      });
7863  });
7864</script>
7864
7865
7866  
7867    
7868  
7869       <style>  </style>
7870<div id="shopify-block-AYVRjem9WQzYvSFEya__14826766009936288847" class="shopify-block shopify-app-block">
7871<script id="Discounty-config">
7872  function discountyExtractTextFromHtml(htmlString) {
7873    if (!htmlString) return '';
7874    return new DOMParser().parseFromString(htmlString, 'text/html').body.textContent || '';
7875  }
7876
7877  var $Discounty = {shopData: {"shopConfig":{"shopId":108321,"cart":{"isActive":true,"styles":"{}","config":{},"injectionInfo":[],"contents":[{"locale":"","totalText":"Total","savingText":"Saving"}]},"globalConfig":{"appEnabled":true,"considerCurrencyExchangeRate":true,"customVariantListener":{"element":"","isDatasetProperty":false,"property":""},"developerModeVariantListener":false,"globalCss":"","setTemplateCurrencyFormatAsDefault":false},"volumeDiscount":{"config":{"tierDisplayFormat":"RANGE"},"injectionInfo":[],"isActive":true,"styles":"{}","contents":[{"locale":"","title":"Buy more, Save more","buyColumnLabel":"Buy","getColumnLabel":"Get","discountText":"{{Discount}} Off","eachItemText":"on each","newPriceText":"each item {{new-price}}"}]},"miniVolumeDiscount":{"config":{"displayMode":"MAX_DISCOUNT"},"injectionInfo":[],"isActive":false,"styles":"{}","contents":[{"locale":"","maxDiscountText":"Up to {discount}% off","lowestPriceText":"From {price}"}]},"startCountDown":{"config":{"ctaLink":null},"productPageInjectionInfo":[],"homepageInjectionInfo":[],"isActive":true,"styles":"{}","contents":[{"locale":"","title":"Sale starts in","daysLabel":"Day","hoursLabel":"Hr","minutesLabel":"Min","secondsLabel":"Sec","ctaText":"Click here"}]},"endCountDown":{"config":{"ctaLink":null},"productPageInjectionInfo":[],"homepageInjectionInfo":[],"isActive":true,"styles":"{}","contents":[{"locale":"","title":"Sale ends in","daysLabel":"Day","hoursLabel":"Hr","minutesLabel":"Min","secondsLabel":"Sec","ctaText":"Click here"}]}
7877,"bxgyPopup":{"config":{"hideContinueBtn":false,"badgeShowFreeGift":false,"badgeType":"PERCENTAGE","dismissType":"TRIGGER","autoOpenDrawerEnabled":true},"injectionInfo":[],"isActive":true,"styles":"{}","contents":[{"locale":"","title":"Your current cart qualifies for these rewards","subtitle":"Now you are able to choose between them. Add before checking out!","availableRewardsLabel":"You can add {{count}} product(s)","btnSelectLabel":"Select","btnAddLabel":"Add to Cart","btnContinueLabel":"Continue Shopping"}]},"bxgyFab":{"config":{"hideCloseBtn":false,"isFabLeft":true},"injectionInfo":[],"isActive":false,"styles":"{}"},"shipping":{"progressbar":{"config":{"activeOnProductPage":true,"activeOnCartPage":true},"productPageInjectionInfo":[],"cartPageInjectionInfo":[],"cartDrawerInjectionInfo":[],"isActive":true,"styles":"{}","contents":[{"locale":"","thresholdInitialText":"Add {{amount}} more to unlock {{discount}} off shipping","thresholdProgressText":"You're {{amount}} away from {{discount}} off shipping","thresholdReachedText":"You've unlocked {{discount}} off shipping!"}]},"progressBarDiscount":null}},"expiresAt":"2026-10-05T18:43:14.112259+00:00"},shopDomain: "joy-planet-finland.myshopify.com",
7878    customerId: null,
7879    isHomePage: false,
7880    isProductPage: true,
7881    currencyFormat: discountyExtractTextFromHtml(`0,00 €`)
7882                    .replace(
7883                      discountyExtractTextFromHtml(`0,00`),"{{money}}"),
7884    initialSelectedVariant: {"id":54276348870998,"title":"Black","option1":"Black","option2":null,"option3":null,"sku":"H-PRM-N-BL-TinyS","requires_shipping":true,"taxable":true,"featured_image":{"id":72008685551958,"product_id":10882379907414,"position":5,"created_at":"2026-02-24T12:08:42+02:00","updated_at":"2026-04-21T14:10:55+03:00","alt":null,"width":1080,"height":1074,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855","variant_ids":[54276348870998]},"available":true,"name":"TinyS - Black","public_title":"Black","options":["Black"],"price":15900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"featured_media":{"alt":null,"id":57682814402902,"position":5,"preview_image":{"aspect_ratio":1.006,"height":1074,"width":1080,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855"}},"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},
7885    initialCart: [] || [],
7886    preloadedProducts: [
7887      
7888    ],
7889    products: [{
7890          id: 10882379907414,
7891          handle: "tinys-earbuds-desinged-for-women-joy-friends-club",
7892          requires_selling_plan: false,
7893          selling_plan_groups: [],
7894          variants: [{
7895                id: 54276348870998,
7896                price: 15900,
7897                compare_at_price: null,
7898                discounts: [],},{
7899                id: 54276348936534,
7900                price: 15900,
7901                compare_at_price: null,
7902                discounts: [],},{
7903                id: 55061249950038,
7904                price: 15900,
7905                compare_at_price: null,
7906                discounts: [],},],
7907        },
7908    ],
7909  };
7910</script>
7910
7911
7912<div id="discounty-bxgy-discount-widgets-container"></div>
7913
7914
7915</div><div id="shopify-block-ARExFU25Wa0dyOGZGU__6251270934270006384" class="shopify-block shopify-app-block">
7915<script>
7916  console.log("Stape gtm: 1.0.4");
7917  window.lsData = {};
7918  window.dataLayer = window.dataLayer || [];
7919  window.addEventListener("message", (event) => {
7920    if (event.data?.event) {
7921      window.dataLayer.push(event.data);
7922    }
7923  });
7924  window.dataShopStape = {
7925    shop: "joyearbuds.com",
7926    shopId: "65680310506",
7927  }
7928</script>
7928
7929
7930
7931<script type="application/json" id="stape-product-data">{"id":10882379907414,"title":"TinyS","handle":"tinys-earbuds-desinged-for-women-joy-friends-club","vendor":"Joy Planet Finland","type":"","url":"\/products\/tinys-earbuds-desinged-for-women-joy-friends-club","available":true,"price":15900,"compare_at_price":null,"tags":["ads","landing page"],"category":"In-Ear Headphones","collections":[{"id":639365841238,"title":"All products excluding Varaosat","handle":"test"},{"id":660933574998,"title":"Gift-card ENABLED","handle":"gift-card-enabled"},{"id":707928949078,"title":"JOY4v alet","handle":"joy4v-alet"},{"id":702182555990,"title":"Loox alet","handle":"loox-alet"},{"id":707229352278,"title":"Main products","handle":"main-products"},{"id":617235186006,"title":"No-Discounts","handle":"discounts"},{"id":668751593814,"title":"XMAS 2025 META","handle":"xmas-2025-meta"}],"metafields":{"custom":{"short_description":" World best small headphones designed for women.","show_swatch_images":false,"upsell_products":[{"id":9486202765654,"title":"C2C fast fabric cable","handle":"c2c-kangaskaapeli"}]}},"variants":[]}</script>
vendor: 1 bytes, line 7931
7931
7932<script>
7933  (function () {
7934    try {
7935      window.productShopStape = JSON.parse(document.getElementById('stape-product-data').textContent);
7936    } catch (error) {
7937      console.warn('[ShopStape] productShopStape error', error);
7938    }
7939  })();
7940</script>
7940
7941
7942
7943
7944
7945
7946  
7946<script>
7947    console.log("⚠️ User not logged in");
7948    window.localStorage.removeItem('customerShopStape');
7949  </script>
7949
7950
7951
7952
7953
7954<script>
7955  window.currentShopifyMarketStapeId = null;
7956  window.currentShopifyMarketStapeCode = null;
7957  try {
7958    window.currentShopifyMarketStapeId = "10944577770";
7959    window.currentShopifyMarketStapeCode = "US";
7960    // Checkout doesn't render theme app extension blocks, so this is the
7961    // only place the market/country code is ever set. Persisting it here
7962    // lets checkout-side field mapping (country_market_code) fall back to
7963    // the last known value instead of coming up empty.
7964    localStorage.setItem('marketShopStape', JSON.stringify({
7965      id: window.currentShopifyMarketStapeId,
7966      code: window.currentShopifyMarketStapeCode
7967    }));
7968  } catch (error) {
7969    console.error("❌ Stape Error:", error);
7970  }
7971</script>
7971
7972
7973
7974
7975
7976
7977</div><div id="shopify-block-AMmJvYjFrS1RySEVuM__585288358657334602" class="shopify-block shopify-app-block"><!-- BEGIN app snippet: app-occ-snippet -->
7978
7979
7980<script>
7981  if(typeof(Spurit) === 'undefined'){
7982    var Spurit = {};
7983  }
7984  if(!Spurit.OneClickCheckout3){
7985    Spurit.OneClickCheckout3 = {};
7986  }
7987  if(!Spurit.OneClickCheckout3.snippet){
7988    Spurit.OneClickCheckout3.snippet = {};
7989  }
7990  Spurit.OneClickCheckout3.snippet.shopHash = 'b8336f1b3c6ad365bf01af3cd7d724a0';
7991  Spurit.OneClickCheckout3.snippet.pageType = 'product';
7992  Spurit.OneClickCheckout3.snippet.analyticsEnabled = '1';
7993  Spurit.OneClickCheckout3.snippet.settingsVersion = '1790357710018';
7994  Spurit.OneClickCheckout3.snippet.cdnStoreUrl = '';
7995
7996  
7997  Spurit.OneClickCheckout3.snippet.product = {"id":10882379907414,"title":"TinyS","handle":"tinys-earbuds-desinged-for-women-joy-friends-club","description":"\u003cdiv style=\"text-align: center;\"\u003e\n\u003cdiv style=\"text-align: left;\"\u003e\n\u003cstrong style=\"font-size: 0.875rem;\"\u003eIntroducing New TinyS 2026: Unmatched Sound, Unbeatable size!\u003c\/strong\u003e\u003cbr\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"text-align: left;\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003cp style=\"text-align: left;\"\u003eOur new TinyS 2026 offers more than just incredible Hifi sound in the tiniest design. Our commitment extends to your peace of mind with a 3-year product warranty, a 1-year loss warranty, and a 30-day no-questions-asked satisfaction guarantee.\u003c\/p\u003e\n\u003cp style=\"text-align: left;\"\u003eDiscover unparalleled audio quality with TinyS, the smallest earbuds delivering world-class sound. Designed for ecological sustainability without compromising performance, TinyS boasts an extended battery life and effortless usability.\u003c\/p\u003e\n\u003cp style=\"text-align: left;\"\u003eCustomers can't stop raving about TinyS—the most surprisingly exceptional earbuds they've ever experienced. The moment you try them, expect a smile-inducing \"WOW\" effect—we've crafted this reaction throughout our development journey.\u003c\/p\u003e\n\u003cp style=\"text-align: left;\"\u003eDespite their size, TinyS earbuds deliver outstanding performance. Try them out and share your feedback—we'd love to hear your thoughts.\u003cbr\u003e\u003cbr\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0656\/8031\/0506\/files\/5787836b437ad77dfa387f7e224402ee_045839c1-eff7-4d2f-9a84-cfa03acb0de1_600x600.png?v=1696596047\" alt=\"\" data-mce-fragment=\"1\"\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003cdiv style=\"text-align: left;\" data-mce-fragment=\"1\"\u003e\n\u003ch2\u003eKey Features of TinyS Wireless Earbuds:\u003c\/h2\u003e\n\u003cul\u003e\n\u003cli\u003eHiFi Sound \u0026amp; Bass (20-20,000 Hz)\u003c\/li\u003e\n\u003cli\u003eClear Calls in Wind \u0026amp; Noise with Noise-Canceling Chip \u0026amp; Nano Fabric Layers\u003c\/li\u003e\n\u003cli\u003e7 Ear Tips ensures the correct fit for every ear.\u003c\/li\u003e\n\u003cli\u003eCompatible with Helmets, Hats \u0026amp; Designed for Sleep\u003c\/li\u003e\n\u003cli\u003eUltralightweight Design: Earbuds (2.8g) \u0026amp; Charging Case (17g)\u003c\/li\u003e\n\u003cli\u003ePower \u0026amp; Game Modes for Enhanced Performance\u003c\/li\u003e\n\u003cli\u003eFast, Wide, and Strong Bluetooth 5.3 Connection\u003c\/li\u003e\n\u003cli\u003eIdeal for Music, Gaming, Audiobooks, and Podcasts\u003c\/li\u003e\n\u003cli\u003eSimultaneously Connects to Two Devices\u003c\/li\u003e\n\u003cli\u003e5.5 Hours of Playback Time, 16 Hours with Charging Case\u003c\/li\u003e\n\u003cli\u003eRapid 1.5-Hour Charging via USB-C \u003c\/li\u003e\n\u003cli\u003eFully CO2-Compensated Manufacturing \u0026amp; Logistics\u003c\/li\u003e\n\u003cli\u003eMinimal Packaging for Zero Plastic Waste\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003ca href=\"https:\/\/admin.shopify.com\/pages\/tinys-instructions\" target=\"_blank\"\u003eTinyS instructions 💎\u003c\/a\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"text-align: left;\" data-mce-fragment=\"1\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003cdiv data-mce-fragment=\"1\"\u003e\u003cbr\u003e\u003c\/div\u003e","published_at":"2026-06-22T12:58:27+03:00","created_at":"2026-06-22T12:58:27+03:00","vendor":"Joy Planet Finland","type":"","tags":["ads","landing page"],"price":15900,"price_min":15900,"price_max":15900,"available":true,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":54276348870998,"title":"Black","option1":"Black","option2":null,"option3":null,"sku":"H-PRM-N-BL-TinyS","requires_shipping":true,"taxable":true,"featured_image":{"id":72008685551958,"product_id":10882379907414,"position":5,"created_at":"2026-02-24T12:08:42+02:00","updated_at":"2026-04-21T14:10:55+03:00","alt":null,"width":1080,"height":1074,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855","variant_ids":[54276348870998]},"available":true,"name":"TinyS - Black","public_title":"Black","options":["Black"],"price":15900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"featured_media":{"alt":null,"id":57682814402902,"position":5,"preview_image":{"aspect_ratio":1.006,"height":1074,"width":1080,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855"}},"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":54276348936534,"title":"Pink","option1":"Pink","option2":null,"option3":null,"sku":"H-PRM-N-PI-TinyS","requires_shipping":true,"taxable":true,"featured_image":{"id":72008741683542,"product_id":10882379907414,"position":15,"created_at":"2026-02-24T12:11:54+02:00","updated_at":"2026-04-21T14:10:55+03:00","alt":null,"width":995,"height":1080,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?v=1776769855","variant_ids":[54276348936534]},"available":true,"name":"TinyS - Pink","public_title":"Pink","options":["Pink"],"price":15900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"featured_media":{"alt":null,"id":57682870206806,"position":15,"preview_image":{"aspect_ratio":0.921,"height":1080,"width":995,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?v=1776769855"}},"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":55061249950038,"title":"Gold","option1":"Gold","option2":null,"option3":null,"sku":null,"requires_shipping":true,"taxable":true,"featured_image":{"id":72936309490006,"product_id":10882379907414,"position":17,"created_at":"2026-03-17T16:48:47+02:00","updated_at":"2026-03-17T16:48:50+02:00","alt":null,"width":1080,"height":1080,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?v=1773758930","variant_ids":[55061249950038]},"available":true,"name":"TinyS - Gold","public_title":"Gold","options":["Gold"],"price":15900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"featured_media":{"alt":null,"id":58100868972886,"position":17,"preview_image":{"aspect_ratio":1.0,"height":1080,"width":1080,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?v=1773758930"}},"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}}],"images":["\/\/joyearbuds.com\/cdn\/shop\/files\/ChatGPT_Image_May_28_2026_5.png?v=1779964205","\/\/joyearbuds.com\/cdn\/shop\/files\/ChatGPT_Image_May_27_2026_Delete_all_text.png?v=1779962850","\/\/joyearbuds.com\/cdn\/shop\/files\/1_50a6ac3e-56e8-43e3-b4bd-cfe325f8be6f.png?v=1779962834","\/\/joyearbuds.com\/cdn\/shop\/files\/2_5d3c594c-47d4-445e-9b74-80ead40f1514.png?v=1779962942","\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855","\/\/joyearbuds.com\/cdn\/shop\/files\/3_654fec4f-4a97-402e-b
7997c52-b36b89ed0da2.png?v=1779962833","\/\/joyearbuds.com\/cdn\/shop\/products\/PhotoRoom-20220726_171617_fe67b567-4b9e-48b7-b85c-e1b289a252e0.png?v=1776769855","\/\/joyearbuds.com\/cdn\/shop\/files\/PinkkiKotelo.png?v=1776769855","\/\/joyearbuds.com\/cdn\/shop\/files\/pink_3f59b54d-59e0-4972-bef4-45616984d816.png?v=1776769855","\/\/joyearbuds.com\/cdn\/shop\/files\/4_3c6a5910-dfa3-4a19-8d54-61d6db19a4c5.png?v=1779962833","\/\/joyearbuds.com\/cdn\/shop\/files\/black_1_b576a09d-169e-4603-b6ad-98353c1a5fea.png?v=1776769855","\/\/joyearbuds.com\/cdn\/shop\/files\/WhatsApp_Image_2025-05-07_at_12.48.32_1.jpg?v=1776769855","\/\/joyearbuds.com\/cdn\/shop\/files\/white_buds_transparent.png?v=1776769855","\/\/joyearbuds.com\/cdn\/shop\/files\/42_615c91ae-ee7c-453f-b77a-75ecd556c676.png?v=1776769855","\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?v=1776769855","\/\/joyearbuds.com\/cdn\/shop\/files\/43_5766c3bd-ab34-43e3-80d0-690c6aaa3912.png?v=1776769855","\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?v=1773758930","\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_9.png?v=1766923740"],"featured_image":"\/\/joyearbuds.com\/cdn\/shop\/files\/ChatGPT_Image_May_28_2026_5.png?v=1779964205","options":["Color"],"media":[{"alt":null,"id":61026212086102,"position":1,"preview_image":{"aspect_ratio":1.0,"height":1254,"width":1254,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/ChatGPT_Image_May_28_2026_5.png?v=1779964205"},"aspect_ratio":1.0,"height":1254,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/ChatGPT_Image_May_28_2026_5.png?v=1779964205","width":1254},{"alt":null,"id":61026010792278,"position":2,"preview_image":{"aspect_ratio":1.023,"height":1240,"width":1268,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/ChatGPT_Image_May_27_2026_Delete_all_text.png?v=1779962850"},"aspect_ratio":1.023,"height":1240,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/ChatGPT_Image_May_27_2026_Delete_all_text.png?v=1779962850","width":1268},{"alt":null,"id":61026008465750,"position":3,"preview_image":{"aspect_ratio":1.0,"height":1080,"width":1080,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/1_50a6ac3e-56e8-43e3-b4bd-cfe325f8be6f.png?v=1779962834"},"aspect_ratio":1.0,"height":1080,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/1_50a6ac3e-56e8-43e3-b4bd-cfe325f8be6f.png?v=1779962834","width":1080},{"alt":null,"id":61026026717526,"position":4,"preview_image":{"aspect_ratio":1.0,"height":1080,"width":1080,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/2_5d3c594c-47d4-445e-9b74-80ead40f1514.png?v=1779962942"},"aspect_ratio":1.0,"height":1080,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/2_5d3c594c-47d4-445e-9b74-80ead40f1514.png?v=1779962942","width":1080},{"alt":null,"id":57682814402902,"position":5,"preview_image":{"aspect_ratio":1.006,"height":1074,"width":1080,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855"},"aspect_ratio":1.006,"height":1074,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855","width":1080},{"alt":null,"id":61026008432982,"position":6,"preview_image":{"aspect_ratio":1.0,"height":1080,"width":1080,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/3_654fec4f-4a97-402e-bc52-b36b89ed0da2.png?v=1779962833"},"aspect_ratio":1.0,"height":1080,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/3_654fec4f-4a97-402e-bc52-b36b89ed0da2.png?v=1779962833","width":1080},{"alt":null,"id":31695132819690,"position":7,"preview_image":{"aspect_ratio":1.0,"height":786,"width":786,"src":"\/\/joyearbuds.com\/cdn\/shop\/products\/PhotoRoom-20220726_171617_fe67b567-4b9e-48b7-b85c-e1b289a252e0.png?v=1776769855"},"aspect_ratio":1.0,"height":786,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/products\/PhotoRoom-20220726_171617_fe67b567-4b9e-48b7-b85c-e1b289a252e0.png?v=1776769855","width":786},{"alt":null,"id":44669860741462,"position":8,"preview_image":{"aspect_ratio":1.0,"height":2409,"width":2409,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/PinkkiKotelo.png?v=1776769855"},"aspect_ratio":1.0,"height":2409,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/PinkkiKotelo.png?v=1776769855","width":2409},{"alt":null,"id":47748942725462,"position":9,"preview_image":{"aspect_ratio":1.0,"height":800,"width":800,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_3f59b54d-59e0-4972-bef4-45616984d816.png?v=1776769855"},"aspect_ratio":1.0,"height":800,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_3f59b54d-59e0-4972-bef4-45616984d816.png?v=1776769855","width":800},{"alt":null,"id":61026008367446,"position":10,"preview_image":{"aspect_ratio":1.0,"height":1080,"width":1080,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/4_3c6a5910-dfa3-4a19-8d54-61d6db19a4c5.png?v=1779962833"},"aspect_ratio":1.0,"height":1080,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/4_3c6a5910-dfa3-4a19-8d54-61d6db19a4c5.png?v=1779962833","width":1080},{"alt":null,"id":50640482238806,"position":11,"preview_image":{"aspect_ratio":1.0,"height":800,"width":800,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_1_b576a09d-169e-4603-b
79976ad-98353c1a5fea.png?v=1776769855"},"aspect_ratio":1.0,"height":800,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_1_b576a09d-169e-4603-b6ad-98353c1a5fea.png?v=1776769855","width":800},{"alt":null,"id":52539146436950,"position":12,"preview_image":{"aspect_ratio":1.0,"height":1600,"width":1600,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/WhatsApp_Image_2025-05-07_at_12.48.32_1.jpg?v=1776769855"},"aspect_ratio":1.0,"height":1600,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/WhatsApp_Image_2025-05-07_at_12.48.32_1.jpg?v=1776769855","width":1600},{"alt":null,"id":57682785665366,"position":13,"preview_image":{"aspect_ratio":1.04,"height":1080,"width":1123,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/white_buds_transparent.png?v=1776769855"},"aspect_ratio":1.04,"height":1080,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/white_buds_transparent.png?v=1776769855","width":1123},{"alt":null,"id":57111160193366,"position":14,"preview_image":{"aspect_ratio":1.0,"height":2295,"width":2295,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/42_615c91ae-ee7c-453f-b77a-75ecd556c676.png?v=1776769855"},"aspect_ratio":1.0,"height":2295,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/42_615c91ae-ee7c-453f-b77a-75ecd556c676.png?v=1776769855","width":2295},{"alt":null,"id":57682870206806,"position":15,"preview_image":{"aspect_ratio":0.921,"height":1080,"width":995,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?v=1776769855"},"aspect_ratio":0.921,"height":1080,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/pink_buds_transparent_1_1.png?v=1776769855","width":995},{"alt":null,"id":57111174873430,"position":16,"preview_image":{"aspect_ratio":1.0,"height":2295,"width":2295,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/43_5766c3bd-ab34-43e3-80d0-690c6aaa3912.png?v=1776769855"},"aspect_ratio":1.0,"height":2295,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/43_5766c3bd-ab34-43e3-80d0-690c6aaa3912.png?v=1776769855","width":2295},{"alt":null,"id":58100868972886,"position":17,"preview_image":{"aspect_ratio":1.0,"height":1080,"width":1080,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?v=1773758930"},"aspect_ratio":1.0,"height":1080,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_28.png?v=1773758930","width":1080},{"alt":null,"id":56623538241878,"position":18,"preview_image":{"aspect_ratio":1.0,"height":2025,"width":2025,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_9.png?v=1766923740"},"aspect_ratio":1.0,"height":2025,"media_type":"image","src":"\/\/joyearbuds.com\/cdn\/shop\/files\/TINYS_9.png?v=1766923740","width":2025}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cdiv style=\"text-align: center;\"\u003e\n\u003cdiv style=\"text-align: left;\"\u003e\n\u003cstrong style=\"font-size: 0.875rem;\"\u003eIntroducing New TinyS 2026: Unmatched Sound, Unbeatable size!\u003c\/strong\u003e\u003cbr\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"text-align: left;\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003cp style=\"text-align: left;\"\u003eOur new TinyS 2026 offers more than just incredible Hifi sound in the tiniest design. Our commitment extends to your peace of mind with a 3-year product warranty, a 1-year loss warranty, and a 30-day no-questions-asked satisfaction guarantee.\u003c\/p\u003e\n\u003cp style=\"text-align: left;\"\u003eDiscover unparalleled audio quality with TinyS, the smallest earbuds delivering world-class sound. Designed for ecological sustainability without compromising performance, TinyS boasts an extended battery life and effortless usability.\u003c\/p\u003e\n\u003cp style=\"text-align: left;\"\u003eCustomers can't stop raving about TinyS—the most surprisingly exceptional earbuds they've ever experienced. The moment you try them, expect a smile-inducing \"WOW\" effect—we've crafted this reaction throughout our development journey.\u003c\/p\u003e\n\u003cp style=\"text-align: left;\"\u003eDespite their size, TinyS earbuds deliver outstanding performance. Try them out and share your feedback—we'd love to hear your thoughts.\u003cbr\u003e\u003cbr\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0656\/8031\/0506\/files\/5787836b437ad77dfa387f7e224402ee_045839c1-eff7-4d2f-9a84-cfa03acb0de1_600x600.png?v=1696596047\" alt=\"\" data-mce-fragment=\"1\"\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003cdiv style=\"text-align: left;
7997\" data-mce-fragment=\"1\"\u003e\n\u003ch2\u003eKey Features of TinyS Wireless Earbuds:\u003c\/h2\u003e\n\u003cul\u003e\n\u003cli\u003eHiFi Sound \u0026amp; Bass (20-20,000 Hz)\u003c\/li\u003e\n\u003cli\u003eClear Calls in Wind \u0026amp; Noise with Noise-Canceling Chip \u0026amp; Nano Fabric Layers\u003c\/li\u003e\n\u003cli\u003e7 Ear Tips ensures the correct fit for every ear.\u003c\/li\u003e\n\u003cli\u003eCompatible with Helmets, Hats \u0026amp; Designed for Sleep\u003c\/li\u003e\n\u003cli\u003eUltralightweight Design: Earbuds (2.8g) \u0026amp; Charging Case (17g)\u003c\/li\u003e\n\u003cli\u003ePower \u0026amp; Game Modes for Enhanced Performance\u003c\/li\u003e\n\u003cli\u003eFast, Wide, and Strong Bluetooth 5.3 Connection\u003c\/li\u003e\n\u003cli\u003eIdeal for Music, Gaming, Audiobooks, and Podcasts\u003c\/li\u003e\n\u003cli\u003eSimultaneously Connects to Two Devices\u003c\/li\u003e\n\u003cli\u003e5.5 Hours of Playback Time, 16 Hours with Charging Case\u003c\/li\u003e\n\u003cli\u003eRapid 1.5-Hour Charging via USB-C \u003c\/li\u003e\n\u003cli\u003eFully CO2-Compensated Manufacturing \u0026amp; Logistics\u003c\/li\u003e\n\u003cli\u003eMinimal Packaging for Zero Plastic Waste\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003ca href=\"https:\/\/admin.shopify.com\/pages\/tinys-instructions\" target=\"_blank\"\u003eTinyS instructions 💎\u003c\/a\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"text-align: left;\" data-mce-fragment=\"1\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003cdiv data-mce-fragment=\"1\"\u003e\u003cbr\u003e\u003c\/div\u003e"};
7998  Spurit.OneClickCheckout3.snippet.product.selected_or_first_available_variant = {"id":54276348870998,"title":"Black","option1":"Black","option2":null,"option3":null,"sku":"H-PRM-N-BL-TinyS","requires_shipping":true,"taxable":true,"featured_image":{"id":72008685551958,"product_id":10882379907414,"position":5,"created_at":"2026-02-24T12:08:42+02:00","updated_at":"2026-04-21T14:10:55+03:00","alt":null,"width":1080,"height":1074,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855","variant_ids":[54276348870998]},"available":true,"name":"TinyS - Black","public_title":"Black","options":["Black"],"price":15900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"featured_media":{"alt":null,"id":57682814402902,"position":5,"preview_image":{"aspect_ratio":1.006,"height":1074,"width":1080,"src":"\/\/joyearbuds.com\/cdn\/shop\/files\/black_buds_transparent_1.png?v=1776769855"}},"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}};
7999  Spurit.OneClickCheckout3.snippet.product.options = [{"name":"Color","position":1,"values":["Black","Pink","Gold"]}];
8000  
8001  Spurit.OneClickCheckout3.snippet.product.featured_image = '//joyearbuds.com/cdn/shop/files/ChatGPT_Image_May_28_2026_5.png?crop=center&height=100&v=1779964205&width=100';
8002  
8003  Spurit.OneClickCheckout3.snippet.collections = [{"id":639365841238,"handle":"test","title":"All products excluding Varaosat","updated_at":"2026-10-04T14:13:20+03:00","body_html":"","published_at":"2024-12-20T11:47:22+02:00","sort_order":"created-desc","template_suffix":"","disjunctive":false,"rules":[{"column":"type","relation":"not_contains","condition":"Varaosat"},{"column":"title","relation":"not_contains","condition":"Tinys Pro"},{"column":"type","relation":"not_equals","condition":"giftbox_ghost_product"}],"published_scope":"web"},{"id":660933574998,"handle":"gift-card-enabled","title":"Gift-card ENABLED","updated_at":"2026-10-04T14:13:20+03:00","body_html":"","published_at":"2025-10-09T09:11:53+03:00","sort_order":"manual","template_suffix":"","disjunctive":false,"rules":[{"column":"type","relation":"not_equals","condition":"giftbox_ghost_product"},{"column":"type","relation":"not_equals","condition":"GIFT_CARD_DISABLED"}],"published_scope":"web"},{"id":707928949078,"handle":"joy4v-alet","updated_at":"2026-10-04T14:13:20+03:00","published_at":"2026-09-07T18:24:42+03:00","sort_order":"most-relevant","template_suffix":null,"published_scope":"web","title":"JOY4v alet","body_html":null},{"id":702182555990,"handle":"loox-alet","updated_at":"2026-10-04T14:13:20+03:00","published_at":"2026-07-08T15:30:08+03:00","sort_order":"most-relevant","template_suffix":"","published_scope":"web","title":"Loox alet","body_html":""},{"id":707229352278,"handle":"main-products","updated_at":"2026-10-04T14:13:20+03:00","published_at":"2026-08-31T19:09:07+03:00","sort_order":"most-relevant","template_suffix":null,"published_scope":"web","title":"Main products","body_html":null},{"id":617235186006,"handle":"discounts","title":"No-Discounts","updated_at":"2026-10-04T12:04:06+03:00","body_html":"","published_at":"2024-02-06T12:18:32+02:00","sort_order":"best-selling","template_suffix":"","disjunctive":false,"rules":[{"column":"is_price_reduced","relation":"is_not_set","condition":""},{"column":"type","relation":"not_equals","condition":"Varaosat"},{"column":"type","relation":"not_equals","condition":"giftbox_ghost_product"}],"published_scope":"web"},{"id":668751593814,"handle":"xmas-2025-meta","updated_at":"2026-10-04T14:13:20+03:00","published_at":"2025-12-08T17:09:55+02:00","sort_order":"best-selling","template_suffix":"","published_scope":"web","title":"XMAS 2025 META","body_html":""}];
8004  
8005
8006  
8007
8008  if (typeof(Spurit.globalSnippet) === 'undefined') {
8009    Spurit.globalSnippet = {
8010      shop_currency: 'EUR',
8011      money_format: '{{amount_with_comma_separator}} €',
8012      cart: {"note":null,"attributes":{},"original_total_price":0,"total_price":0,"total_discount":0,"total_weight":0.0,"item_count":0,"items":[],"requires_shipping":false,"currency":"EUR","items_subtotal_price":0,"cart_level_discount_applications":[],"checkout_charge_amount":0},
8013      customer_id: '',
8014      routes_root: '/',
8015      timezone: 'Europe/Helsinki',
8016    };
8017  }
8018
8019  Spurit.globalSnippet.shop_timezone = 'Europe/Helsinki';
8020</script>
8020
8021
8022<script src="https://cdn.occ-app.com/all-apps/spurit.global-2.x.min.js" async></script>
8022
8023
8024
8025<script src="https://cdn.occ-app.com/shopify-apps/one-click-checkout/common.js" async></script>
8025
8026<link href="https://cdn.occ-app.com/shopify-apps/one-click-checkout/common.css" rel="stylesheet" type="text/css" media="all">
8027<!-- END app snippet -->
8028
8029</div><div id="shopify-block-AakNoTzR0N0NkN3Z2W__11532412952436166569" class="shopify-block shopify-app-block">
8029<script async src="https://loox.io/widget/V1b_4RDNrT/loox.1667989271762.js?shop=joy-planet-finland.myshopify.com"></script>
8029
8030
8031
8032	<!-- __LXV: 1791097950421;__LXR: https://loox.io;__LXC: V1b_4RDNrT; -->
8032<script>var loox_global_hash = '1791097950421';
8033var loox_bundle_reviews_enabled = false;</script>
8033<style>.loox-reviews-default { max-width: 1200px; margin: 0 auto; }.loox-rating .loox-icon { color:#EBBF20; }
8034:root { --lxs-rating-icon-color: #EBBF20; }</style>
8035
8036
8037
8038
8039
8040	
8040<script>
8041		const productLdJsonSchema = {
8042			"@context": "http://schema.org",
8043			"@type": "Product",
8044			"name": "TinyS",
8045			"aggregateRating": {
8046				"@type": "AggregateRating",
8047				"ratingValue": "4.7",
8048				"reviewCount": 481
8049			}
8050		}
8051
8052		const looxAddProductLdJsonSchema = () => {
8053			const scriptEl = document.createElement('script');
8054			scriptEl.type = 'application/ld+json';
8055
8056			const stringifyProductLdJsonSchema = JSON.stringify(productLdJsonSchema);
8057
8058			try {
8059				scriptEl.appendChild(document.createTextNode(stringifyProductLdJsonSchema));
8060				document.body.appendChild(scriptEl);
8061			} catch (e) {
8062				scriptEl.textContent = stringifyProductLdJsonSchema;
8063				document.body.appendChild(scriptEl);
8064			}
8065		};
8066
8067		let productSchemaHandled = false;
8068
8069		window.addEventListener('DOMContentLoaded', () => {
8070			try {
8071				const ldJsonScripts = document.querySelectorAll("[type='application/ld+json']");
8072				const microdataElements = document.querySelectorAll("[itemtype='https://schema.org/Product'], [itemprop='aggregateRating']");
8073
8074				if (microdataElements.length) return;
8075				if ([...ldJsonScripts].some(({ textContent }) => JSON.parse(textContent).hasOwnProperty('aggregateRating'))) return;
8076
8077				ldJsonScripts.forEach(script => {
8078					const json = JSON.parse(script.textContent);
8079
8080					if (productSchemaHandled) return;
8081					if (json['@type'] !== 'Product' && json['@type'] !== 'ProductGroup') return;
8082
8083					json.aggregateRating = productLdJsonSchema.aggregateRating;
8084					script.textContent = JSON.stringify(json);
8085					productSchemaHandled = true;
8086				});
8087
8088				if (!productSchemaHandled) looxAddProductLdJsonSchema();
8089			} catch (error) {
8090				// swallow error
8091			}
8092		});
8093	</script>
8093
8094
8095
8096
8097</div>
8097<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
8097
8098</body>
8099</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.