PageSourceSearch

https://wego.jp/cdn/shop/t/302/assets/vfa-search-favorite-button.j…119738511207861209581772071597?v=1790273827

js wego.jp collected 2026-09-24 18:17:33 UTC 27,110 bytes, 303 lines download raw bytes

1(function(){"use strict";console.log("[WEGO Search Favorites] Script loaded - Version 2024-12-05-v3");const API_BASE="/apps/wego-favorite/api/favorites",MAX_RETRIES=3,BUTTON_SELECTOR=".vfa-favorite-btn--collection",LOGIN_REQUIRED_CLASS="vfa-favorite-btn--login-required";let favoriteProductIds=new Set,favoriteVariantIds=new Set,favoritesLoaded=!1,isInitializing=!1;function getCustomerId(){let customerId=null;const button=document.querySelector(`${BUTTON_SELECTOR}[data-customer-id]`);return button&&button.dataset.customerId&&(customerId=button.dataset.customerId),!customerId&&window.ShopifyCustomer&&window.ShopifyCustomer.id&&(customerId=String(window.ShopifyCustomer.id)),!customerId&&window.__st&&window.__st.cid&&(customerId=String(window.__st.cid)),customerId&&/^\d+$/.test(customerId)?customerId:customerId&&customerId.includes("gid://")?customerId.split("/").pop():customerId}function normalizeVariantId(variantId){if(!variantId)return"";const idStr=String(variantId);return/^\d+$/.test(idStr)?idStr:idStr.includes("gid://")?idStr.replace(/^gid:\/\/shopify\/\w+\//,""):idStr}function normalizeProductId(productId){if(!productId)return"";const idStr=String(productId);return/^\d+$/.test(idStr)?idStr:idStr.includes("gid://")?idStr.replace(/^gid:\/\/shopify\/\w+\//,""):idStr}function init(){if(isInitializing)return;isInitializing=!0,console.log("[WEGO Search Favorites] \u521D\u671F\u5316\u958B\u59CB"),addFavoriteModal(),addLoginModal();const buttons=document.querySelectorAll(BUTTON_SELECTOR);if(buttons.length===0){console.log("[WEGO Search Favorites] \u30DC\u30BF\u30F3\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u52D5\u7684\u8AAD\u307F\u8FBC\u307F\u3092\u5F85\u6A5F"),isInitializing=!1;return}console.log("[WEGO Search Favorites] \u521D\u671F\u5316:",buttons.length,"\u4EF6\u306E\u30DC\u30BF\u30F3"),getCustomerId()&&!favoritesLoaded&&loadFavoriteStatuses(),setupEventListeners(),isInitializing=!1}async function loadFavoriteStatuses(){const customerId=getCustomerId();if(customerId)try{const params=new URLSearchParams({customerId,limit:"500"}),url=`${API_BASE}/list?${params}`,response=await fetch(url);if(!response.ok)return;const result=await response.json();result.success&&result.items&&(favoriteProductIds.clear(),favoriteVariantIds.clear(),result.items.forEach(item=>{if(item.productId){const normalizedProductId=normalizeProductId(item.productId);normalizedProductId&&favoriteProductIds.add(normalizedProductId)}if(item.variantId){const normalizedVariantId=normalizeVariantId(item.variantId);normalizedVariantId&&favoriteVariantIds.add(normalizedVariantId)}}),favoritesLoaded=!0,updateAllButtonStates())}catch(error){console.error("[WEGO Search Favorites] \u304A\u6C17\u306B\u5165\u308A\u72B6\u614B\u53D6\u5F97\u30A8\u30E9\u30FC:",error)}}function injectVariantIdsFromCardLinks(){new URLSearchParams(window.location.search).get("color")==="all"&&document.querySelectorAll(`${BUTTON_SELECTOR}[data-product-id]`).forEach(button=>{if(button.dataset.variantId)return;const card=button.closest(".c-item");if(!card)return;const link=card.querySelector("a.c-item__thumbnail");if(link)try{const variantFromUrl=new URL(link.href,location.origin).searchParams.get("variant");variantFromUrl&&(button.dataset.variantId=variantFromUrl)}catch{}})}function updateAllButtonStates(){injectVariantIdsFromCardLinks(),document.querySelectorAll(`${BUTTON_SELECTOR}[data-product-id]`).forEach(button=>{const variantId=button.dataset.variantId,productId=button.dataset.productId;let isFavorited=!1;if(variantId){const normalizedVariantId=normalizeVariantId(variantId);isFavorited=!!(normalizedVariantId&&favoriteVariantIds.has(normalizedVariantId))}else{const normalizedProductId=normalizeProductId(productId);if(isFavorited=!!(normalizedProductId&&favoriteProductIds.has(normalizedProductId)),!isFavorited)try{const variantsJson=button.dataset.productVariants;variantsJson&&(isFavorited=JSON.parse(variantsJson).some(v=>{const nv=normalizeVariantId(String(v.id));return nv&&favoriteVariantIds.has(nv)}))}catch{}}isFavorited?(button.classList.add("vfa-is-favorited"),updateHeartIcon(button,!0)):(button.classList.remove("vfa-is-favorited"),updateHeartIcon(button,!1))}),document.querySelectorAll(".vfa-js-search-modal-fav-btn").forEach(btn=>{const variantId=btn.dataset.variantId,normalizedVariantId=normalizeVariantId(variantId);normalizedVariantId&&favoriteVariantIds.has(normalizedVariantId)?(btn.classList.add("vfa-is-favorited"),updateHeartIcon(btn,!0)):(btn.classList.remove("vfa-is-favorited"),updateHeartIcon(btn,!1))})}function updateHeartIcon(btn,isFavorited){const defaultIcon=btn.querySelector(".vfa-favorite-icon--default"),activeIcon=btn.querySelector(".vfa-favorite-icon--active");defaultIcon&&activeIcon&&(defaultIcon.style.display=isFavorited?"none":"block",activeIcon.style.display=isFavorited?"block":"none")}function setupEventListeners(){document.querySelectorAll(BUTTON_SELECTOR).forEac
1h(button=>{button.dataset.vfaSearchInitialized!=="true"&&(button.dataset.vfaSearchInitialized="true",button.addEventListener("click",handleFavoriteClick))})}function handleFavoriteClick(e){e.preventDefault(),e.stopPropagation();const button=e.currentTarget;if(button.classList.contains(LOGIN_REQUIRED_CLASS)){window.location.href="/account/login?return_url="+encodeURIComponent(window.location.pathname+window.location.search);return}button.dataset.productId?showFavoriteModal(button):showNotification("\u5546\u54C1\u60C5\u5831\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","error")}function addFavoriteModal(){if(document.querySelector(".vfa-search-fav-modal"))return;const overlay=document.createElement("div");overlay.className="vfa-search-fav-modal-overlay",overlay.addEventListener("click",closeFavoriteModal),document.body.appendChild(overlay);const modal=document.createElement("div");modal.className="vfa-search-fav-modal",modal.innerHTML=`
2      <div class="vfa-fav-modal-header">
3        <h3>\u304A\u6C17\u306B\u5165\u308A\u306B\u8FFD\u52A0\u3059\u308B</h3>
4        <button class="vfa-fav-modal-close" aria-label="\u9589\u3058\u308B">\u2715</button>
5      </div>
6      <div class="vfa-fav-modal-body">
7        <div class="vfa-fav-modal-loading">\u8AAD\u307F\u8FBC\u307F\u4E2D...</div>
8      </div>
9    `,document.body.appendChild(modal),modal.querySelector(".vfa-fav-modal-close").addEventListener("click",closeFavoriteModal),addModalStyles()}function addModalStyles(){if(document.querySelector("#vfa-search-fav-modal-styles"))return;const style=document.createElement("style");style.id="vfa-search-fav-modal-styles",style.textContent=`
10      .vfa-search-fav-modal-overlay {
11        position: fixed;
12        top: 0;
13        left: 0;
14        width: 100%;
15        height: 100%;
16        background: rgba(0, 0, 0, 0.5);
17        z-index: 9998;
18        opacity: 0;
19        visibility: hidden;
20        transition: opacity 0.3s ease, visibility 0.3s ease;
21      }
22      .vfa-search-fav-modal-overlay.vfa-is-open {
23        opacity: 1;
24        visibility: visible;
25      }
26      .vfa-search-fav-modal {
27        position: fixed;
28        top: 50%;
29        left: 50%;
30        transform: translate(-50%, -50%) scale(0.9);
31        background: #fff;
32        border-radius: 8px;
33        width: 90%;
34        max-width: 400px;
35        max-height: 80vh;
36        overflow: hidden;
37        z-index: 9999;
38        opacity: 0;
39        visibility: hidden;
40        transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s ease;
41      }
42      .vfa-search-fav-modal.vfa-is-open {
43        opacity: 1;
44        visibility: visible;
45        transform: translate(-50%, -50%) scale(1);
46      }
47      .vfa-fav-modal-header {
48        display: flex;
49        justify-content: space-between;
50        align-items: center;
51        padding: 16px;
52        border-bottom: 1px solid #eee;
53      }
54      .vfa-fav-modal-header h3 {
55        margin: 0;
56        font-size: 16px;
57        font-weight: bold;
58      }
59      .vfa-fav-modal-close {
60        background: none;
61        border: none;
62        font-size: 20px;
63        cursor: pointer;
64        padding: 4px 8px;
65      }
66      .vfa-fav-modal-body {
67        padding: 16px;
68        max-height: 60vh;
69        overflow-y: auto;
70      }
71      .vfa-fav-modal-loading {
72        text-align: center;
73        padding: 20px;
74        color: #666;
75      }
76      .vfa-fav-color-group {
77        margin-bottom: 16px;
78      }
79      .vfa-fav-color-header {
80        display: flex;
81        align-items: center;
82        gap: 10px;
83        margin-bottom: 10px;
84        padding-bottom: 8px;
85        border-bottom: 1px solid #eee;
86      }
87      .vfa-fav-color-image {
88        width: 50px;
89        height: 60px;
90        object-fit: cover;
91        border-radius: 4px;
92      }
93      .vfa-fav-color-name {
94        font-weight: bold;
95        font-size: 14px;
96      }
97      .vfa-fav-size-list {
98        list-style: none;
99        padding: 0;
100        margin: 0;
101      }
102      .vfa-fav-size-item {
103        display: flex;
104        justify-content: space-between;
105        align-items: center;
106        padding: 10px 0;
107        border-bottom: 1px solid #f0f0f0;
108      }
109      .vfa-fav-size-item:last-child {
110        border-bottom: none;
111      }
112      .vfa-fav-size-info {
113        flex: 1;
114      }
115      .vfa-fav-size-name {
116        font-size: 14px;
117        margin-bottom: 4px;
118      }
119      .vfa-fav-size-name.vfa-is-unavailable {
120        color: #999;
121      }
122      .vfa-fav-size-note {
123        font-size: 12px;
124        color: #666;
125      }
126      .vfa-fav-size-note--ship {
127        color: #4caf50;
128      }
129      .vfa-fav-btn-modal {
130        width: 28px;
131        height: 28px;
132        border: none;
133        background: transparent;
134        cursor: pointer;
135        display: flex;
136        align-items: center;
137        justify-content: center;
138        transition: all 0.2s ease;
139        flex-shrink: 0;
140        padding: 0;
141        -webkit-tap-highlight-color: transparent;
142      }
143      .vfa-fav-btn-modal:hover {
144        opacity: 0.7;
145      }
146      .vfa-fav-btn-modal .vfa-favorite-icon--default {
147        display: block;
148      }
149      .vfa-fav-btn-modal .vfa-favorite-icon--active {
150        display: none;
151      }
152      .vfa-fav-btn-modal.vfa-is-favorited .vfa-favorite-icon--default {
153        display: none;
154      }
155      .vfa-fav-btn-modal.vfa-is-favorited .vfa-favorite-icon--active {
156        display: block;
157      }
158      .vfa-fav-btn-modal.vfa-is-loading {
159        opacity: 0.5;
160        cursor: wait;
161      }
162    `,document.head.appendChild(style)}function showFavoriteModal(button){const productId=button.dataset.productId,productName=button.dataset.productName||"",productImage=button.dataset.productImage||"",productHandle=button.dataset.productHandle||"";let variants=[];try{const variantsJson=button.dataset.productVariants;variantsJson&&(variants=JSON.parse(variantsJson),variants.length>0&&("requires_shipping"in variants[0]||"taxable"in variants[0])&&(variants=variants.map(function(v){return Object.assign({},v,{price:typeof v.price=="number"?v.price/100:v.price})})))}catch(e){console.error("[WEGO Search Favorites] \u30D0\u30EA\u30A2\u30F3\u30C8\u60C5\u5831\u306E\u30D1\u30FC\u30B9\u30A8\u30E9\u30FC:",e)}const overlay=document.querySelector(".vfa-search-fav-modal-overlay"),modal=document.querySelector(".vfa-search-fav-modal");if(!modal)return;const body=modal.querySelector(".vfa-fav-modal-body");if(variants.length===0)body.innerHTML='<div class="vfa-fav-modal-loading">\u30D0\u30EA\u30A2\u30F3\u30C8\u60C5\u5831\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F</div>';else{const colorGroups=groupVariantsByColor(variants);body.innerHTML=generateModalContent(colorGroups,productId,productHandle,productImage,productName)}overlay.classList.add("vfa-is-open"),modal.classList.add("vfa-is-open"),updateModalButtonStates(),setupModalButtonHandlers()}function groupVariantsByColor(variants){const groups={};
162return variants.forEach(variant=>{const color=variant.option1||"\u30C7\u30D5\u30A9\u30EB\u30C8",size=variant.option2||variant.title;groups[color]||(groups[color]={color,image:variant.featured_image?variant.featured_image.src:null,variants:[]}),groups[color].variants.push({id:variant.id,title:variant.title,size,available:variant.available,price:variant.price,option1:variant.option1,option2:variant.option2,option3:variant.option3})}),Object.values(groups)}function generateModalContent(colorGroups,productId,productHandle,productImage,productName){let html="";return colorGroups.forEach(group=>{if(html+=`<div class="vfa-fav-color-group" data-color-name="${escapeHtml(group.color)}">`,html+='<div class="vfa-fav-color-header">',group.image||productImage){const imgSrc=group.image||productImage;html+=`<img src="${escapeHtml(imgSrc)}" class="vfa-fav-color-image" alt="${escapeHtml(group.color)}" loading="lazy">`}html+=`<span class="vfa-fav-color-name">${escapeHtml(group.color)}</span>`,html+="</div>",html+='<ul class="vfa-fav-size-list">
162',group.variants.forEach(variant=>{const sizeDisplay=variant.option2||variant.title,availabilityText=variant.available?"\u5728\u5EAB\u3042\u308A":"\u5728\u5EAB\u306A\u3057",unavailableClass=variant.available?"":" vfa-is-unavailable";html+='<li class="vfa-fav-size-item">',html+='<div class="vfa-fav-size-info">',html+=`<div class="vfa-fav-size-name${unavailableClass}">${escapeHtml(sizeDisplay)} / ${availabilityText}</div>`,variant.available&&(html+='<div class="vfa-fav-size-note vfa-fav-size-note--ship">1~3\u55B6\u696D\u65E5\u4EE5\u5185\u306B\u767A\u9001\u4E88\u5B9A</div>'),html+="</div>";const normalizedVariantId=normalizeVariantId(variant.id),cardButton=document.querySelector(`${BUTTON_SELECTOR}[data-product-id="${productId}"]`);let defaultIconSrc="",activeIconSrc="";if(window.VFA_ASSETS&&(defaultIconSrc=window.VFA_ASSETS.heartGy||"",activeIconSrc=window.VFA_ASSETS.heartSolid||""),cardButton){const defaultIcon=cardButton.querySelector(".vfa-favorite-icon--default"),activeIcon=cardButton.querySelector(".vfa-favorite-icon--active");defaultIcon&&defaultIcon.src&&(defaultIconSrc=defaultIcon.src),activeIcon&&activeIcon.src&&(activeIconSrc=activeIcon.src)}if(!defaultIconSrc||!activeIconSrc){const firstButton=document.querySelector(BUTTON_SELECTOR);if(firstButton){const defaultIcon=firstButton.querySelector(".vfa-favorite-icon--default"),activeIcon=firstButton.querySelector(".vfa-favorite-icon--active");defaultIcon&&defaultIcon.src&&!defaultIconSrc&&(defaultIconSrc=defaultIcon.src),activeIcon&&activeIcon.src&&!activeIconSrc&&(activeIconSrc=activeIcon.src)}}(!defaultIconSrc||!activeIconSrc)&&console.warn("[WEGO Search Favorites] \u30A2\u30A4\u30B3\u30F3URL\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002theme.liquid\u306BVFA_ASSETS\u306E\u5B9A\u7FA9\u3092\u8FFD\u52A0\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),html+=`
163          <button
164            class="vfa-fav-btn-modal vfa-js-search-modal-fav-btn"
165            data-product-id="${productId}"
166            data-variant-id="${normalizedVariantId}"
167            data-handle="${escapeHtml(productHandle)}"
168            data-price="${variant.price||0}"
169            data-product-name="${escapeHtml(productName||"")}"
170            aria-label="\u304A\u6C17\u306B\u5165\u308A">
171            <img class="vfa-favorite-icon vfa-favorite-icon--default" src="${escapeHtml(defaultIconSrc)}" alt="\u304A\u6C17\u306B\u5165\u308A" width="22" height="22">
172            <img class="vfa-favorite-icon vfa-favorite-icon--active" src="${escapeHtml(activeIconSrc)}" alt="\u304A\u6C17\u306B\u5165\u308A\u6E08\u307F" width="22" height="22" style="display:none;">
173          </button>
174        `,html+="</li>"}),html+="</ul>",html+="</div>"}),html}function escapeHtml(str){return str?String(str).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}function updateModalButtonStates(){document.querySelectorAll(".vfa-fav-modal-body .vfa-js-search-modal-fav-btn").forEach(btn=>{const variantId=btn.dataset.variantId,normalizedVariantId=normalizeVariantId(variantId);normalizedVariantId&&favoriteVariantIds.has(normalizedVariantId)?(btn.classList.add("vfa-is-favorited"),updateHeartIcon(btn,!0)):(btn.classList.remove("vfa-is-favorited"),updateHeartIcon(btn,!1))})}function setupModalButtonHandlers(){document.querySelectorAll(".vfa-fav-modal-body .vfa-js-search-modal-fav-btn").forEach(btn=>{btn.dataset.vfaModalInitialized!=="true"&&(btn.dataset.vfaModalInitialized="true",btn.addEventListener("click",handleModalFavoriteClick))})}async function handleModalFavoriteClick(e){e.preventDefault(),e.stopPropagation();const btn=e.currentTarget;if(btn.classList.contains("vfa-is-loading")||btn.disabled)return;const productId=btn.dataset.productId,variantId=btn.dataset.variantId,normalizedVariantId=normalizeVariantId(variantId),customerId=getCustomerId();if(!customerId){closeFavoriteModal(),window.location.href="/account/login?return_url="+encodeURIComponent(window.location.pathname+window.location.search);return}const isFavorited=btn.classList.contains("vfa-is-favorited");if(isFavorited){alert("\u3059\u3067\u306B\u304A\u6C17\u306B\u5165\u308A\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u3059");return}btn.classList.add("vfa-is-loading"),btn.classList.toggle("vfa-is-favorited"),updateHeartIcon(btn,!isFavorited),isFavorited?favoriteVariantIds.delete(normalizedVariantId):favoriteVariantIds.add(normalizedVariantId);let success=!1,retryCount2=0;for(;retryCount2<=MAX_RETRIES&&!success;)try{let response,endpoint,body;if(isFavorited)endpoint=`${API_BASE}/remove`,body={customerId,variantId};else{const variantPrice=parseFloat(btn.dataset.price)||0,pName=btn.dataset.productName||"";endpoint=`${API_BASE}/add`,body={customerId,productId,variantId,productName:pName,price:variantPrice,imageUrl:""}}
174response=await fetch(endpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(body)});const data=await response.json();if(response.ok&&data.success)success=!0,updateProductCardState(productId),showNotification(isFavorited?"\u304A\u6C17\u306B\u5165\u308A\u304B\u3089\u524A\u9664\u3057\u307E\u3057\u305F":"\u304A\u6C17\u306B\u5165\u308A\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F","success");else if(response.status>=500&&retryCount2<MAX_RETRIES){retryCount2++,await new Promise(resolve=>setTimeout(resolve,1e3*retryCount2));continue}else throw new Error(data.error||data.message||"API Error")}catch{if(retryCount2<MAX_RETRIES){retryCount2++,await new Promise(resolve=>setTimeout(resolve,1e3*retryCount2));continue}btn.classList.toggle("vfa-is-favorited"),updateHeartIcon(btn,isFavorited),isFavorited?favoriteVariantIds.add(normalizedVariantId):favoriteVariantIds.delete(normalizedVariantId),showNotification("\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F","error")}btn.classList.remove("vfa-is-loading")}function updateProductCardState(productId){const modalButtons=document.querySelectorAll(`.vfa-fav-modal-body .vfa-js-search-modal-fav-btn[data-product-id="${productId}"]`);let hasAnyFavorite=!1;modalButtons.forEach(btn=>{const normalizedVariantId=normalizeVariantId(btn.dataset.variantId);normalizedVariantId&&favoriteVariantIds.has(normalizedVariantId)&&(hasAnyFavorite=!0)});const normalizedProductId=normalizeProductId(productId);document.querySelectorAll(`${BUTTON_SELECTOR}[data-product-id="${productId}"]`).forEach(cardButton=>{const variantId=cardButton.dataset.variantId;let isFavorited;if(variantId){const normalizedVariantId=normalizeVariantId(variantId);isFavorited=!!(normalizedVariantId&&favoriteVariantIds.has(normalizedVariantId))}else isFavorited=hasAnyFavorite,normalizedProductId&&(isFavorited?favoriteProductIds.add(normalizedProductId):favoriteProductIds.delete(normalizedProductId));isFavorited?(cardButton.classList.add("vfa-is-favorited"),updateHeartIcon(cardButton,!0)):(cardButton.classList.remove("vfa-is-favorited"),updateHeartIcon(cardButton,!1))})}function closeFavoriteModal(){const overlay=document.querySelector(".vfa-search-fav-modal-overlay"),modal=document.querySelector(".vfa-search-fav-modal");overlay&&overlay.classList.remove("vfa-is-open"),modal&&modal.classList.remove("vfa-is-open")}function addLoginModal(){if(document.querySelector(".vfa-search-login-modal"))return;const modal=document.createElement("div");modal.className="vfa-search-login-modal",modal.innerHTML=`
175      <div class="vfa-login-modal-overlay"></div>
176      <div class="vfa-login-modal-wrapper">
177        <div class="vfa-login-modal-header">
178          <button class="vfa-login-modal-close vfa-js-search-login-close">\u2715</button>
179        </div>
180        <div class="vfa-login-modal-content">
181          <h3>\u304A\u6C17\u306B\u5165\u308A\u767B\u9332\u3059\u308B\u306B\u306F<br>\u4F1A\u54E1\u767B\u9332\u30FB\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059</h3>
182          <button class="c-btn c-btn--primary vfa-js-search-login-btn">\u65B0\u898F\u4F1A\u54E1\u767B\u9332\u30FB\u30ED\u30B0\u30A4\u30F3</button>
183          <button class="c-btn c-btn--border vfa-js-search-login-close">\u30AD\u30E3\u30F3\u30BB\u30EB</button>
184        </div>
185      </div>
186    `;const style=document.createElement("style");style.id="vfa-search-login-modal-styles",style.textContent=`
187      .vfa-search-login-modal {
188        position: fixed;
189        top: 0;
190        left: 0;
191        width: 100%;
192        height: 100%;
193        z-index: 10000;
194        opacity: 0;
195        visibility: hidden;
196        transition: opacity 0.3s ease, visibility 0.3s ease;
197      }
198      .vfa-search-login-modal.vfa-is-visible {
199        opacity: 1;
200        visibility: visible;
201      }
202      .vfa-search-login-modal .vfa-login-modal-overlay {
203        position: absolute;
204        top: 0;
205        left: 0;
206        width: 100%;
207        height: 100%;
208        background: rgba(0, 0, 0, 0.5);
209      }
210      .vfa-search-login-modal .vfa-login-modal-wrapper {
211        position: absolute;
212        top: 50%;
213        left: 50%;
214        transform: translate(-50%, -50%);
215        background: #fff;
216        border-radius: 8px;
217        width: 90%;
218        max-width: 350px;
219        padding: 20px;
220      }
221      .vfa-search-login-modal .vfa-login-modal-header {
222        text-align: right;
223        margin-bottom: 10px;
224      }
225      .vfa-search-login-modal .vfa-login-modal-close {
226        background: none;
227        border: none;
228        font-size: 20px;
229        cursor: pointer;
230      }
231      .vfa-search-login-modal .vfa-login-modal-content {
232        text-align: center;
233      }
234      .vfa-search-login-modal .vfa-login-modal-content h3 {
235        font-size: 16px;
236        margin-bottom: 20px;
237        line-height: 1.5;
238      }
239      .vfa-search-login-modal .vfa-login-modal-content .c-btn {
240        display: block;
241        width: 100%;
242        padding: 12px;
243        margin-bottom: 10px;
244        border-radius: 4px;
245        font-size: 14px;
246        cursor: pointer;
247      }
248      .vfa-search-login-modal .vfa-login-modal-content .c-btn--primary {
249        background: #000;
250        color: #fff;
251        border: none;
252      }
253      .vfa-search-login-modal .vfa-login-modal-content .c-btn--border {
254        background: #fff;
255        color: #000;
256        border: 1px solid #000;
257      }
258    `,document.head.appendChild(style),document.body.appendChild(modal),modal.querySelector(".vfa-js-search-login-btn").addEventListener("click",()=>{const returnUrl=encodeURIComponent(window.location.pathname+window.location.search);window.location.href=`/account/login?return_url=${returnUrl}`}),modal.querySelectorAll(".vfa-js-search-login-close").forEach(btn=>
258{btn.addEventListener("click",hideLoginModal)}),modal.querySelector(".vfa-login-modal-overlay").addEventListener("click",hideLoginModal)}function showLoginModal(){const modal=document.querySelector(".vfa-search-login-modal");modal&&modal.classList.add("vfa-is-visible")}function hideLoginModal(){const modal=document.querySelector(".vfa-search-login-modal");modal&&modal.classList.remove("vfa-is-visible")}function showNotification(message,type="success"){const existing=document.querySelector(".vfa-search-favorite-notification");existing&&existing.remove();const notification=document.createElement("div");if(notification.className=`vfa-search-favorite-notification vfa-search-favorite-notification--${type}`,notification.textContent=message,!document.querySelector("#vfa-search-notification-styles")){const style=document.createElement("style");style.id="vfa-search-notification-styles",style.textContent=`
259        .vfa-search-favorite-notification {
260          position: fixed;
261          top: 20px;
262          left: 50%;
263          transform: translateX(-50%);
264          padding: 12px 24px;
265          border-radius: 4px;
266          font-size: 14px;
267          z-index: 99999;
268          animation: vfa-search-toast-in 0.3s ease;
269        }
270        .vfa-search-favorite-notification--success {
271          background: #4caf50;
272          color: #fff;
273        }
274        .vfa-search-favorite-notification--error {
275          background: #f44336;
276          color: #fff;
277        }
278        .vfa-search-favorite-notification--info {
279          background: #333;
280          color: #fff;
281        }
282        @keyframes vfa-search-toast-in {
283          from {
284            opacity: 0;
285            transform: translateX(-50%) translateY(-20px);
286          }
287          to {
288            opacity: 1;
289            transform: translateX(-50%) translateY(0);
290          }
291        }
292        @keyframes vfa-search-toast-out {
293          from {
294            opacity: 1;
295            transform: translateX(-50%) translateY(0);
296          }
297          to {
298            opacity: 0;
299            transform: translateX(-50%) translateY(-20px);
300          }
301        }
302      `,document.head.appendChild(style)}document.body.appendChild(notification),setTimeout(()=>{notification.style.animation="vfa-search-toast-out 0.3s ease",setTimeout(()=>notification.remove(),300)},2e3)}function initializeNewButtons(){document.querySelectorAll(`${BUTTON_SELECTOR}:not([data-vfa-search-initialized="true"])`).length!==0&&(addFavoriteModal(),addLoginModal(),setupEventListeners(),favoritesLoaded?updateAllButtonStates():getCustomerId()&&loadFavoriteStatuses())}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",init):init();let debounceTimer;const observer=new MutationObserver(mutations=>{let hasNewButtons=!1;mutations.forEach(mutation=>{mutation.addedNodes.forEach(node=>{node.nodeType===1&&(node.matches&&node.matches(BUTTON_SELECTOR)||node.querySelector&&node.querySelector(BUTTON_SELECTOR))&&(hasNewButtons=!0)})}),hasNewButtons&&(clearTimeout(debounceTimer),debounceTimer=setTimeout(()=>{initializeNewButtons()},300))}),observeTarget=document.getElementById("CollectionProductGrid")||document.body;observer.observe(observeTarget,{childList:!0,subtree:!0});let retryCount=0;const maxRetries=20,checkInterval=setInterval(()=>{retryCount++,document.querySelectorAll(`${BUTTON_SELECTOR}:not([data-vfa-search-initialized="true"])`).length>0?(initializeNewButtons(),clearInterval(checkInterval)):retryCount>=maxRetries&&clearInterval(checkInterval)},500)})();
303//# sourceMappingURL=/cdn/shop/t/302/assets/vfa-search-favorite-button.js.map?v=119738511207861209581772071597%3Fv%3D1790273827

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.