1 2 3<!DOCTYPE html> 4<html lang="en-US"> 5<head> 6 <meta charset="utf-8"> 7 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 8 <meta name="generator" content="frappe"> 9 10 11 <meta name="title" content="All Products - Wizfort"><meta name="description" content="Browse all Wizfort products. Premium leather footwear with exceptional style and comfort. Free standard shipping for retail orders."><meta name="image" content="https://wizfort.com/files/wizfort-og.png"><meta property="og:type" content="website"><meta property="og:url" content="https://wizfort.com/all-products"><meta name="language" content="en-US"><meta property="og:title" content="All Products - Wizfort"><meta property="og:description" content="Browse all Wizfort products. Premium leather footwear with exceptional style and comfort. Free standard shipping for retail orders."><meta property="og:image" content="https://wizfort.com/files/wizfort-og.png"><meta name="twitter:title" content="All Products - Wizfort"><meta name="twitter:description" content="Browse all Wizfort products. Premium leather footwear with exceptional style and comfort. Free standard shipping for retail orders."><meta name="twitter:image" content="https://wizfort.com/files/wizfort-og.png"><meta name="twitter:card" content="summary_large_image"><meta property="og:site_name" content="Wizfort"><meta property="og:locale" content="en_US"><meta property="og:image:alt" content="All Products - Wizfort"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"> 12 13 14 <title>All Products - Wizfort</title> 15 16 17 <link rel="icon" type="image/png" href="/files/cslshoes89cb70.png"> 18 <link rel="apple-touch-icon" href="/files/cslshoes89cb70.png"> 19<link type="text/css" rel="stylesheet" href="/assets/frappe/dist/css/website.bundle.GD6PKXQI.css"> 20<link type="text/css" rel="stylesheet" href="/assets/erpnext/dist/css/erpnext-web.bundle.XAPV6OJR.css"> 21<link type="text/css" rel="stylesheet" href="/assets/webshop/dist/css/webshop-web.bundle.GQDT63VG.css"> 22<link type="text/css" rel="stylesheet" href="/assets/cslshoes_erp/css/csl_design_tokens.css?v=20260613a"> 23<link type="text/css" rel="stylesheet" href="/assets/cslshoes_erp/css/webshop_filters.css?v=4b435436"> 24<link type="text/css" rel="stylesheet" href="/assets/cslshoes_erp/css/csl_custom.css?v=20260517a"> 25<link type="text/css" rel="stylesheet" href="/assets/blog/css/blog.scss"> 26 27 28 29 30 <!-- CSL web analytics (GA4) â deferred loader (A3 2026-06-03) -->
31<script> 32 window.dataLayer = window.dataLayer || []; 33 function gtag(){dataLayer.push(arguments);} 34 gtag('consent', 'default', {'ad_storage':'granted','ad_user_data':'granted','ad_personalization':'granted','analytics_storage':'granted'}); 35 gtag('consent', 'default', {'ad_storage':'denied','ad_user_data':'denied','ad_personalization':'denied','analytics_storage':'denied','region':["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", "IS", "LI", "NO", "GB"]}); 36 gtag('js', new Date()); 37 gtag('config', 'G-WJ5VB6BGCD'); 38 // A3 2026-06-03: defer the gtag.js loader off the critical render path. 39 // dataLayer calls above queue; gtag.js drains them on load (interaction, 40 // or idle-after-load, or an 8s safety net) so pageview/consent/config still fire. 41 (function(){ 42 var loaded=false; 43 function loadGA(){ if(loaded){return;} loaded=true; 44 var s=document.createElement("script"); s.async=true; 45 s.src="https://www.googletagmanager.com/gtag/js?id=G-WJ5VB6BGCD"; 46 (document.head||document.documentElement).appendChild(s); 47 } 48 ["pointerdown","keydown","scroll","touchstart"].forEach(function(e){ window.addEventListener(e, loadGA, {once:true, passive:true}); }); 49 function schedule(){ if("requestIdleCallback" in window){ requestIdleCallback(loadGA,{timeout:3500}); } else { setTimeout(loadGA,2500); } } 50 if(document.readyState==="complete"){ schedule(); } else { window.addEventListener("load", schedule); } 51 setTimeout(loadGA, 8000); 52 })(); 53</script>
53 54 55 <style>a,button,[role="button"],input,select,textarea{touch-action:manipulation}</style> 56 <link rel="preload" as="font" type="font/woff2" href="/assets/cslshoes_erp/fonts/InterVariable-Latin.woff2" crossorigin> 57 58 59 <meta property="fb:app_id" content="806042942283128"> 60 <link rel="alternate" type="application/rss+xml" title="Wizfort Blog" href="/rss"> 61
61<script type="application/ld+json">{"@context": "https://schema.org", "@type": "Organization", "name": "Wizfort", "url": "https://wizfort.com", "logo": "https://wizfort.com/files/wizfort-og.png", "image": "https://wizfort.com/files/wizfort-og.png", "address": {"@type": "PostalAddress", "streetAddress": "3 Alpine Court, Unit W156", "addressLocality": "Chestnut Ridge", "addressRegion": "NY", "postalCode": "10977", "addressCountry": "US"}, "contactPoint": {"@type": "ContactPoint", "telephone": "+1-845-694-6700", "contactType": "customer service", "availableLanguage": ["English"]}, "openingHoursSpecification": [{"@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], "opens": "09:00", "closes": "18:00"}, {"@type": "OpeningHoursSpecification", "dayOfWeek": "Saturday", "opens": "10:00", "closes": "16:00"}]}</script>
61 62
62<script type="application/ld+json">{"@context": "https://schema.org", "@type": "WebSite", "name": "Wizfort", "url": "https://wizfort.com", "potentialAction": {"@type": "SearchAction", "target": {"@type": "EntryPoint", "urlTemplate": "https://wizfort.com/all-products?search={search_term_string}"}, "query-input": "required name=search_term_string"}}</script>
62 63 64<style> 65:root { 66 --primary: #1a1a1a; 67 --accent: #c9a227; 68 --success: #22c55e; 69 --danger: #ef4444; 70 --gray-50: #f9fafb; 71 --gray-100: #f3f4f6; 72 --gray-200: #e5e7eb; 73 --gray-300: #d1d5db; 74 --gray-400: #9ca3af; 75 --gray-500: #6b7280; 76 --gray-600: #4b5563; 77 --gray-700: #374151; 78 --gray-800: #1f2937; 79 --gray-900: #111827; 80 --white: #ffffff; 81} 82 83 84</style> 85 86 87 88<link rel="canonical" href="https://wizfort.com/all-products"> 89 90
91<script type="application/ld+json">{"@context": "https://schema.org", "@type": "ItemList", "name": "All Products - Wizfort", "numberOfItems": 23, "itemListElement": [{"@type": "ListItem", "position": 1, "url": "https://wizfort.com/products/wizfort-classics-mens-leather-sole-bicycle-toe-lace-up-s8svh", "name": "Wizfort Men's Leather Sole Bicycle Toe Oxford - Black"}, {"@type": "ListItem", "position": 2, "url": "https://wizfort.com/products/wizfort-classics-mens-leather-sole-bicycle-toe-lace-up-jlpbi", "name": "Wizfort Men's Leather Sole Bicycle Toe Loafer - Black"}, {"@type": "ListItem", "position": 3, "url": "https://wizfort.com/products/wizfort-classics-mens-leather-sole-moc-toe-lace-up-ggqjf", "name": "Wizfort Men's Leather Sole Moc Toe Oxford - Black"}, {"@type": "ListItem", "position": 4, "url": "https://wizfort.com/products/wizfort-classics-mens-leather-sole-moc-toe-slip-on-3oiaf", "name": "Wizfort Men's Leather Sole Moc Toe Loafer - Black"}, {"@type": "ListItem", "position": 5, "url": "https://wizfort.com/products/wizfort-mens-bicycle-toe-lace-up-q6rsr", "name": "Wizfort Men's Leather Bicycle Toe Oxford - Black"}, {"@type": "ListItem", "position": 6, "url": "https://wizfort.com/products/wizfort-mens-bicycle-toe-loafer-r8vij", "name": "Wizfort Men's Leather Bicycle Toe Loafer - Black"}, {"@type": "ListItem", "position": 7, "url": "https://wizfort.com/products/wizfort-mens-cap-toe-oxford-shoe-3dhdj", "name": "Wizfort Men's Leather Cap Toe Oxford - Black"}, {"@type": "ListItem", "position": 8, "url": "https://wizfort.com/products/wizfort-mens-lightweight-bicycle-toe-lace-up-ul7ri", "name": "Wizfort Men's Leather Lightweight Bicycle Toe Oxford - Black"}, {"@type": "ListItem", "position": 9, "url": "https://wizfort.com/products/wizfort-mens-lightweight-bicycle-toe-loafer-njyyt", "name": "Wizfort Men's Leather Lightweight Bicycle Toe Loafer - Black"}, {"@type": "ListItem", "position": 10, "url": "https://wizfort.com/products/wizfort-mens-lightweight-moc-toe-lace-up-shoes-tlofo", "name": "Wizfort Men's Leather Lightweight Moc Toe Oxford - Black"}, {"@type": "ListItem", "position": 11, "url": "https://wizfort.com/products/wizfort-mens-lightweight-moc-toe-lace-up-shoes-gpvip", "name": "Wizfort Men's Leather Lightweight Moc Toe Loafer - Black"}, {"@type": "ListItem", "position": 12, "url": "https://wizfort.com/products/wizfort-mens-lightweight-plain-toe-chassidic-loafer-r6fuh", "name": "Wizfort Men's Leather Lightweight Chassidic Loafer - Black"}, {"@type": "ListItem", "position": 13, "url": "https://wizfort.com/products/wizfort-mens-moc-toe-lace-up-shoe-3pouw", "name": "Wizfort Men's Leather Moc Toe Oxford - Black"}, {"@type": "ListItem", "position": 14, "url": "https://wizfort.com/products/wizfort-mens-moc-toe-loafer-daoss", "name": "Wizfort Men's Leather Moc Toe Loafer - Black"}, {"@type": "ListItem", "position": 15, "url": "https://wizfort.com/products/wizfort-mens-plain-toe-chassidic-loafer-loha7", "name": "Wizfort Men's Leather Plain Toe Chassidic Loafer - Black"}, {"@type": "ListItem", "position": 16, "url": "https://wizfort.com/products/wizfort-mens-plain-toe-lace-up-shoe-miqkc", "name": "Wizfort Men's Leather Plain Toe Oxford - Black"}, {"@type": "ListItem", "position": 17, "url": "https://wizfort.com/products/wizfort-mens-plain-toe-loafer-pezi6", "name": "Wizfort Men's Leather Plain Toe Loafer - Black"}, {"@type": "ListItem", "position": 18, "url": "https://wizfort.com/products/wizfort-mens-plain-toe-traditional-loafer-656", "name": "Wizfort Men's Leather Plain Toe Traditional Loafer - Black"}, {"@type": "ListItem", "position": 19, "url": "https://wizfort.com/products/wizfort-prestige-comfortable-leather-sole-chassidic-loafer-ib58c", "name": "Wizfort Men's Premium Leather Sole Chassidic Loafer - Black"}, {"@type": "ListItem", "position": 20, "url": "https://wizfort.com/products/wizfort-prestige-leather-sole-bicycle-toe-lace-up-shoe-for-men-bgki4", "name": "Wizfort Men's Premium Leather Sole Bicycle Toe Oxford - Black"}, {"@type": "ListItem", "position": 21, "url": "https://wizfort.com/products/wizfort-prestige-leather-sole-bicycle-toe-loafer-for-men-f9xq5", "name": "Wizfort Men's Premium Leather Sole Bicycle Toe Loafer - Black"}, {"@type": "ListItem", "position": 22, "url": "https://wizfort.com/products/wizfort-prestige-leather-sole-moc-toe-loafer-for-men-jivbk", "name": "Wizfort Men's Premium Leather Sole Moc Toe Loafer - Black"}, {"@type": "ListItem", "position": 23, "url": "https://wizfort.com/products/wizfort-prestige-mens-moc-toe-lace-up-8svvp", "name": "Wizfort Men's Premium Leather Sole Moc Toe Oxford - Black"}]}</script>
91 92 93
94<script type="application/ld+json">{"@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://wizfort.com/"}, {"@type": "ListItem", "position": 2, "name": "All Products"}]}</script>
94 95 96<style> 97/* A2 (2026-06-02): reserve vertical space for the JS-injected product grid so the 98 footer does not reflow when webshop product_ui fills the server-empty 99 #product-listing. Fixes /all-products mobile CLS (consistently 0.326 â 11/12 100 runs). The full catalog grid always exceeds 100vh, so this only holds space 101 during JS hydration; it is a no-op once the (taller) grid renders. */ 102#product-listing { min-height: 100vh; } 103</style> 104 105 106 107
107<script> 108 window.frappe = {}; 109 frappe.ready_events = []; 110 frappe.ready = function(fn) { 111 frappe.ready_events.push(fn); 112 } 113 window.dev_server = 0; 114 window.socketio_port = 9000; 115 window.show_language_picker = false; 116 </script>
116 117</head> 118<body frappe-session-status="logged-out" data-path="all-products" class="product-page"> 119 120 <svg id="csl-icons" aria-hidden="true" style="position:absolute;width:0;height:0;overflow:hidden" xmlns="http://www.w3.org/2000/svg"> 121 <symbol viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" id="icon-assets"> 122 <path d="M3 6h17" stroke="var(--icon-stroke)" stroke-miterlimit="10"></path> 123 <path d="M20 19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6l3.4-3h10.2L20 6v13z" stroke="var(--icon-stroke)" stroke-miterlimit="10" stroke-linecap="square" stroke-linejoin="round"></path> 124 <path d="M15.582 10c0 2.29-1.8 4.09-4.091 4.09A4.051 4.051 0 0 1 7.4 10" stroke="var(--icon-stroke)" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> 125 <circle cx="15.6" cy="10" r=".5" stroke="var(--icon-stroke)"></circle> 126 <circle cx="7.3" cy="10" r=".5" stroke="var(--icon-stroke)"></circle> 127 </symbol> 128 <symbol id="icon-delete" viewBox="0 0 32 32" fill="none"> 129 <path stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M7 7v18.118c0 2.145 1.492 3.882 3.333 3.882h11.333c1.842 0 3.333-1.737 3.333-3.882v-18.118"></path> 130 <path stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M5 7h22"></path> 131 <path stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M10 7v-1c0-1.657 1.343-3 3-3h6c1.657 0 3 1.343 3 3v1"></path> 132 <path stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M18.8 14.4v8.571"></path> 133 <path stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M13.2 14.4v8.571"></path> 134 </symbol> 135 <symbol viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" id="icon-down"> 136 <path d="M3 5.5l5 5 5-5" stroke="var(--icon-stroke)" stroke-linecap="round" stroke-linejoin="round"></path> 137 </symbol> 138 <symbol viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" id="icon-edit"> 139 <path fill-rule="evenodd" clip-rule="evenodd" d="M10.6262 2.70711C11.0168 2.31658 11.6499 2.31658 12.0404 2.70711L13.2929 3.95956C13.6834 4.35008 13.6834 4.98325 13.2929 5.37377L6 12.6667L2 14L3.33333 10L10.6262 2.70711Z" stroke="var(--icon-stroke)" stroke-linecap="round" stroke-linejoin="round"/> 140 <line x1="9.79157" y1="3.92744" x2="12.0738" y2="6.2097" stroke="var(--icon-stroke)"/> 141 </symbol> 142 <symbol viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" id="icon-heart"> 143 <path d="M7.606 3.799L8 4.302l.394-.503.106-.14c.048-.065.08-.108.129-.159a3.284 3.284 0 0 1 4.72 0c.424.434.655 1.245.65 2.278-.006 1.578-.685 2.931-1.728 4.159-1.05 1.234-2.439 2.308-3.814 3.328a.763.763 0 0 1-.914 0c-1.375-1.02-2.764-2.094-3.814-3.328C2.686 8.709 2.007 7.357 2 5.778c-.004-1.033.227-1.844.651-2.278a3.284 3.284 0 0 1 4.72 0c.05.05.081.094.129.158.028.038.061.083.106.14z" 144 stroke="var(--icon-stroke)"></path> 145 </symbol> 146 <symbol viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" id="icon-star"> 147 <path d="M11.5516 2.90849C11.735 2.53687 12.265 2.53687 12.4484 2.90849L14.8226 7.71919C14.8954 7.86677 15.0362 7.96905 15.1991 7.99271L20.508 8.76415C20.9181 8.82374 21.0818 9.32772 20.7851 9.61699L16.9435 13.3616C16.8257 13.4765 16.7719 13.642 16.7997 13.8042L17.7066 19.0916C17.7766 19.5001 17.3479 19.8116 16.9811 19.6187L12.2327 17.1223C12.087 17.0457 11.913 17.0457 11.7673 17.1223L7.01888 19.6187C6.65207 19.8116 6.22335 19.5001 6.29341 19.0916L7.20028 13.8042C7.2281 13.642 7.17433 13.4765 7.05648 13.3616L3.21491 9.61699C2.91815 9.32772 3.08191 8.82374 3.49202 8.76415L8.80094 7.99271C8.9638 7.96905 9.10458 7.86677 9.17741 7.71919L11.5516 2.90849Z" fill="var(--star-fill)" stroke="var(--star-fill)"/> 148 </symbol> 149 <symbol viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" id="icon-tag"> 150 <path d="M12.6401 10.2571L10.107 12.7901C9.52125 13.3759 8.5718 13.3756 7.98601 12.7898L2.49654 7.30037C2.40278 7.2066 2.3501 7.07942 2.3501 6.94682L2.3501 3C2.3501 2.72386 2.57396 2.5 2.8501 2.5L6.79691 2.5C6.92952 2.5 7.0567 2.55268 7.15047 2.64645L12.6399 8.13591C13.2257 8.7217 13.2259 9.67131 12.6401 10.2571Z" stroke="var(--icon-stroke)" stroke-linecap="round" stroke-linejoin="round"/> 151 <path d="M6.08001 5.46157C6.08001 5.88642 5.7356 6.23082 5.31076 6.23082C4.88591 6.23082 4.5415 5.88642 4.5415 5.46157C4.5415 5.03673 4.88591 4.69232 5.31076 4.69232C5.7356 4.69232 6.08001 5.03673 6.08001 5.46157Z" stroke="var(--icon-stroke)" stroke-linecap="round" stroke-linejoin="round"/> 152 </symbol> 153 <!-- icon-list and icon-image-view: copied from apps/frappe/frappe/public/icons/timeless/icons.svg 154 for the /all-products toolbar view-toggle. Keep in sync on Frappe upgrades (ERP-025). --> 155 <symbol viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" id="icon-list"> 156 <path fill-rule="evenodd" clip-rule="evenodd" d="M2.667 3.25a.75.75 0 0 0 0 1.5h.007a.75.75 0 0 0 0-1.5h-.007zm2.666.25a.5.5 0 0 0 0 1H14a.5.5 0 0 0 0-1H5.333zm0 4a.5.5 0 0 0 0 1H14a.5.5 0 0 0 0-1H5.333zm-.5 4.5a.5.5 0 0 1 .5-.5H14a.5.5 0 0 1 0 1H5.333a.5.5 0 0 1-.5-.5zM1.917 8a.75.75 0 0 1 .75-.75h.007a.75.75 0 0 1 0 1.5h-.007a.75.75 0 0 1-.75-.75zm.75 3.25a.75.75 0 0 0 0 1.5h.007a.75.75 0 0 0 0-1.5h-.007z" 157 fill="var(--icon-stroke)" stroke-width="0"></path> 158 </symbol> 159 <symbol viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" id="icon-image-view"> 160 <path d="M2.5 3.5a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v3h-3a1 1 0 0 1-1-1v-2zm0 7a1 1 0 0 1 1-1h3v3a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2zm7-7a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-3v-3zm0 6h3a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-3z"></path> 161 </symbol> 162</svg>
163 <a href="#main-content" class="skip-to-content" style="position:absolute;top:-40px;left:0;background:#1a1a1a;color:#fff;padding:8px 16px;z-index:10001;font-size:14px;text-decoration:none;transition:top 0.2s;" onfocus="this.style.top='0'" onblur="this.style.top='-40px'">Skip to main content</a> 164 165 166 167 168<style> 169/* CSL Header Styles - Inline to avoid CSS conflicts with Frappe */ 170:root { 171 --csl-white: #ffffff; 172 --csl-gray-50: #f9fafb; 173 --csl-gray-100: #f3f4f6; 174 --csl-gray-200: #e5e7eb; 175 --csl-gray-300: #d1d5db; 176 --csl-gray-400: #9ca3af; 177 --csl-gray-500: #6b7280; 178 --csl-gray-600: #4b5563; 179 --csl-gray-700: #374151; 180 --csl-gray-800: #1f2937; 181 --csl-gray-900: #111827; 182 --csl-black: #000000; 183 --csl-danger: #ef4444; 184} 185 186/* Hide default Frappe navbar */ 187.navbar.navbar-expand-lg, .web-footer { display: none !important; } 188 189/* Top Bar */ 190.csl-top-bar { 191 background: var(--csl-gray-900); 192 color: var(--csl-white); 193 padding: 8px 0; 194 font-size: 12px; 195} 196.csl-top-bar-content { 197 max-width: 1400px; 198 margin: 0 auto; 199 padding: 0 20px; 200 display: flex; 201 justify-content: space-between; 202 align-items: center; 203} 204.csl-top-bar-message { font-weight: 500; } 205.csl-top-bar-links { display: flex; gap: 20px; align-items: center; } 206.csl-top-bar-links a { color: var(--csl-white); text-decoration: none; } 207.csl-top-bar-links a:hover { text-decoration: underline; } 208.csl-top-bar-phone { display: flex; align-items: center; gap: 5px; font-weight: 600; } 209.csl-top-bar-phone svg { flex-shrink: 0; } 210 211/* Header */ 212.csl-header { 213 background: var(--csl-white); 214 border-bottom: 1px solid var(--csl-gray-200); 215 padding: 16px 0; 216 position: sticky; 217 top: 0; 218 z-index: 1000; 219} 220.csl-header-inner { 221 max-width: 1400px; 222 margin: 0 auto; 223 padding: 0 20px; 224 display: flex; 225 align-items: center; 226 justify-content: space-between; 227 gap: 40px; 228 position: relative; 229 z-index: 100; 230} 231.csl-header-inner * { 232 pointer-events: auto; 233} 234.csl-logo { 235 font-size: 24px; 236 font-weight: 700; 237 color: var(--csl-black); 238 text-decoration: none; 239} 240.csl-nav { 241 display: flex; 242 align-items: center; 243 gap: 32px; 244} 245.csl-nav a { 246 font-size: 14px; 247 font-weight: 500; 248 color: var(--csl-gray-700); 249 text-decoration: none; 250 transition: color 0.2s; 251} 252.csl-nav a:hover { color: var(--csl-black); } 253.csl-nav-dropdown { position: relative; } 254.csl-nav-dropdown > a { 255 display: flex; 256 align-items: center; 257 gap: 4px; 258} 259.csl-nav-dropdown > a svg { 260 width: 12px; 261 height: 12px; 262 stroke: currentColor; 263 stroke-width: 2; 264 fill: none; 265 transition: transform 0.2s; 266} 267.csl-nav-dropdown:hover > a svg { transform: rotate(180deg); } 268.csl-dropdown-menu { 269 position: absolute; 270 top: 100%; 271 left: 50%; 272 transform: translateX(-50%); 273 background: var(--csl-white); 274 border: 1px solid var(--csl-gray-200); 275 border-radius: 8px; 276 box-shadow: 0 8px 24px rgba(0,0,0,0.12); 277 min-width: 180px; 278 padding: 8px 0; 279 opacity: 0; 280 visibility: hidden; 281 transition: all 0.2s ease; 282 z-index: 1001; 283 margin-top: 8px; 284} 285.csl-nav-dropdown:hover .csl-dropdown-menu { 286 opacity: 1; 287 visibility: visible; 288} 289.csl-dropdown-menu a { 290 display: block; 291 padding: 10px 16px; 292 font-size: 14px; 293 color: var(--csl-gray-700); 294 transition: all 0.15s; 295} 296.csl-dropdown-menu a:hover { 297 background: var(--csl-gray-50); 298 color: var(--csl-black); 299} 300/* ERP-101: account icon dropdown (My Account + Sign Out). Right-aligned so it 301 doesn't overflow the viewport edge; reuses .csl-dropdown-menu base styling. */ 302.csl-account-dropdown { position: relative; display: inline-flex; align-items: center; } 303.csl-account-menu { left: auto; right: 0; transform: none; min-width: 160px; } 304.csl-account-dropdown:hover .csl-account-menu { opacity: 1; visibility: visible; } 305 306/* Header Actions */ 307.csl-header-actions { 308 display: flex; 309 align-items: center; 310 gap: 20px; 311 pointer-events: auto; 312 position: relative; 313 z-index: 50; 314} 315.csl-search-box { 316 display: flex !important; 317 align-items: center; 318 background: var(--csl-gray-100); 319 border: 1px solid var(--csl-gray-200); 320 border-radius: 6px; 321 padding: 8px 12px; 322 width: 280px; 323 position: relative; 324 cursor: text; 325 z-index: 100; 326 pointer-events: auto !important; 327} 328.csl-search-box input { 329 border: none !important; 330 background: transparent !important; 331 outline: none !important; 332 font-size: 14px; 333 width: 100%; 334 margin-left: 8px; 335 cursor: text !important; 336 color: var(--csl-gray-900); 337 pointer-events: auto !important; 338 position: relative; 339 z-index: 10; 340 display: block !important; 341 visibility: visible !important; 342 opacity: 1 !important; 343} 344.csl-search-box input::placeholder { color: var(--csl-gray-500); } 345#csl-search-input { 346 display: block !important; 347 visibility: visible !important; 348 opacity: 1 !important; 349 pointer-events: auto !important; 350 position: relative !important; 351 z-index: 10 !important; 352 -webkit-user-select: text !important; 353 user-select: text !important; 354 cursor: text !important; 355} 356.csl-search-box:focus-within { 357 border-color: var(--csl-gray-400); 358 box-shadow: 0 0 0 2px rgba(0,0,0,0.05); 359} 360.csl-search-box svg {
361 width: 20px; 362 height: 20px; 363 stroke: var(--csl-gray-500); 364 stroke-width: 1.5; 365 fill: none; 366 pointer-events: none; 367 flex-shrink: 0; 368} 369.csl-search-results { 370 position: absolute; 371 top: 100%; 372 left: 0; 373 right: 0; 374 background: var(--csl-white); 375 border: 1px solid var(--csl-gray-200); 376 border-radius: 8px; 377 box-shadow: 0 8px 24px rgba(0,0,0,0.12); 378 margin-top: 4px; 379 max-height: 400px; 380 overflow-y: auto; 381 display: none; 382 z-index: 1002; 383} 384.csl-search-results.active { display: block; } 385.csl-search-result-item { 386 display: flex; 387 align-items: center; 388 gap: 12px; 389 padding: 10px 12px; 390 text-decoration: none; 391 color: var(--csl-gray-800); 392 transition: background 0.15s; 393} 394.csl-search-result-item:hover { background: var(--csl-gray-50); } 395.csl-search-result-item img { 396 width: 50px; 397 height: 50px; 398 object-fit: contain; 399 background: var(--csl-gray-100); 400 border-radius: 4px; 401} 402.csl-search-result-name { 403 font-size: 14px; 404 font-weight: 500; 405 margin: 0; 406 display: block; 407} 408.csl-search-result-info p { 409 font-size: 12px; 410 color: var(--csl-gray-500); 411 margin: 2px 0 0 0; 412} 413.csl-search-no-results { 414 padding: 20px; 415 text-align: center; 416 color: var(--csl-gray-500); 417} 418 419/* Header Icons */ 420.csl-header-icon { 421 width: 20px; 422 height: 20px; 423 stroke: var(--csl-gray-500); 424 stroke-width: 1.5; 425 fill: none; 426 cursor: pointer; 427 transition: stroke 0.2s; 428} 429.csl-header-icon:hover { stroke: var(--csl-black); } 430.csl-header-icon-link { 431 display: flex; 432 align-items: center; 433 justify-content: center; 434 text-decoration: none; 435} 436.csl-cart-icon, .csl-wishlist-icon { position: relative; } 437.csl-cart-count, .csl-wishlist-count { 438 position: absolute; 439 top: -6px; 440 right: -6px; 441 background: var(--csl-black); 442 color: var(--csl-white); 443 font-size: 10px; 444 font-weight: 600; 445 min-width: 18px; 446 height: 18px; 447 border-radius: 50%; 448 display: flex; 449 align-items: center; 450 justify-content: center; 451} 452.csl-wishlist-count { background: var(--csl-danger); display: none; } 453 454/* Mobile Menu Toggle */ 455.csl-mobile-menu-toggle { 456 display: none; 457 width: 40px; 458 height: 40px; 459 background: none; 460 border: 1px solid var(--csl-gray-300); 461 border-radius: 8px; 462 cursor: pointer; 463 align-items: center; 464 justify-content: center; 465} 466.csl-mobile-menu-toggle svg { 467 width: 24px; 468 height: 24px; 469 stroke: var(--csl-gray-700); 470 stroke-width: 2; 471 fill: none; 472} 473 474/* Mobile Navigation - Hidden by default */ 475.csl-mobile-nav { 476 display: none !important; 477 position: fixed; 478 top: 0; 479 left: 0; 480 right: 0; 481 bottom: 0; 482 background: var(--csl-white); 483 z-index: 9999; 484 padding: 20px; 485 flex-direction: column; 486 overflow-y: auto; 487} 488.csl-mobile-nav.active { display: flex !important; } 489.csl-mobile-nav-header { 490 display: flex; 491 justify-content: space-between; 492 align-items: center; 493 margin-bottom: 24px; 494 padding-bottom: 16px; 495 border-bottom: 1px solid var(--csl-gray-200); 496} 497.csl-mobile-nav-close { 498 width: 40px; 499 height: 40px; 500 background: none; 501 border: none; 502 cursor: pointer; 503 display: flex; 504 align-items: center; 505 justify-content: center; 506} 507.csl-mobile-nav-close svg { 508 width: 24px; 509 height: 24px; 510 stroke: var(--csl-gray-700); 511 stroke-width: 2; 512 fill: none; 513} 514.csl-mobile-nav-links { 515 display: flex; 516 flex-direction: column; 517} 518.csl-mobile-nav-links a { 519 padding: 16px 0; 520 font-size: 18px; 521 font-weight: 500; 522 color: var(--csl-gray-800); 523 text-decoration: none; 524 border-bottom: 1px solid var(--csl-gray-100); 525} 526.csl-mobile-search { 527 margin-bottom: 16px; 528 padding: 12px 16px; 529 background: var(--csl-gray-100); 530 border: 1px solid var(--csl-gray-200); 531 border-radius: 8px; 532 font-size: 16px; 533 width: 100%; 534} 535 536/* Size Guide Link */ 537.csl-size-guide-link { 538 display: flex; 539 align-items: center; 540 gap: 4px; 541 font-size: 13px; 542 color: var(--csl-gray-600); 543 text-decoration: none; 544} 545.csl-size-guide-link:hover { color: var(--csl-black); } 546.csl-size-guide-link svg { 547 width: 16px; 548 height: 16px; 549 stroke: currentColor; 550 stroke-width: 1.5; 551 fill: none; 552} 553 554/* Responsive */ 555@media (max-width: 1024px) { 556 .csl-search-box { width: 200px; } 557} 558@media (max-width: 768px) { 559 .csl-top-bar { padding: 6px 0; } 560 .csl-top-bar-links { display: none; } 561 .csl-top-bar-message { font-size: 11px; text-align: center; width: 100%; } 562 .csl-header { padding: 12px 0; } 563 .csl-header-inner { gap: 12px; } 564 .csl-logo { font-size: 20px; flex-shrink: 0; max-width: 45vw; } 565 .csl-logo img { height: 24px; width: auto; } 566 .csl-nav, .csl-search-box, .csl-size-guide-link { display: none; } 567 .csl-mobile-menu-toggle { display: flex; } 568 .csl-mobile-search-toggle { display: flex; } 569 .csl-header-actions { gap: 12px; } 570 .csl-header-icon { width: 18px; height: 18px; } 571 .csl-cart-count, .csl-wishlist-count { width: 16px; height: 16px; font-size: 9px; top: -4px; right: -4px; } 572} 573/* Mobile Search Overlay */
574.csl-mobile-search-toggle { 575 display: none; 576 width: 44px; 577 height: 44px; 578 background: none; 579 border: none; 580 cursor: pointer; 581 align-items: center; 582 justify-content: center; 583 padding: 0; 584} 585.csl-mobile-search-toggle svg { 586 width: 20px; 587 height: 20px; 588 stroke: var(--csl-gray-700); 589 stroke-width: 2; 590 fill: none; 591} 592.csl-mobile-search-overlay { 593 display: none; 594 position: fixed; 595 top: 0; 596 left: 0; 597 right: 0; 598 z-index: 10000; 599 background: var(--csl-white); 600 padding: 12px 16px; 601 box-shadow: 0 4px 12px rgba(0,0,0,0.1); 602} 603.csl-mobile-search-overlay.active { display: flex; gap: 8px; align-items: center; } 604.csl-mobile-search-overlay input { 605 flex: 1; 606 padding: 12px 16px; 607 font-size: 16px; 608 border: 1px solid var(--csl-gray-300); 609 border-radius: 8px; 610 outline: none; 611} 612.csl-mobile-search-overlay input:focus { border-color: var(--csl-black); } 613.csl-mobile-search-overlay .csl-mobile-search-close { 614 width: 44px; 615 height: 44px; 616 background: none; 617 border: none; 618 cursor: pointer; 619 display: flex; 620 align-items: center; 621 justify-content: center; 622} 623.csl-mobile-search-overlay .csl-mobile-search-close svg { 624 width: 24px; 625 height: 24px; 626 stroke: var(--csl-gray-600); 627 stroke-width: 2; 628 fill: none; 629} 630.csl-mobile-search-overlay .csl-search-results { 631 position: absolute; 632 top: 100%; 633 left: 0; 634 right: 0; 635 background: var(--csl-white); 636 max-height: 60vh; 637 overflow-y: auto; 638 box-shadow: 0 4px 12px rgba(0,0,0,0.1); 639} 640</style> 641 642<!-- Mobile Navigation (hidden by default, shown on mobile menu click) --> 643<div class="csl-mobile-nav" id="csl-mobile-nav" data-nosnippet> 644 <div class="csl-mobile-nav-header"> 645 <span class="csl-logo">CSL Shoes</span> 646 <button class="csl-mobile-nav-close" onclick="cslCloseMobileNav()" aria-label="Close menu"> 647 <svg viewBox="0 0 24 24" aria-hidden="true"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg> 648 </button> 649 </div> 650 <input type="text" class="csl-mobile-search" placeholder="Search shoes..." id="csl-mobile-search-input" aria-label="Search products"> 651 <div class="csl-mobile-nav-links"> 652 653 654 655 656 657 <a href="/shoes/oxfords" onclick="cslCloseMobileNav()">Oxfords</a> 658 659 660 661 <a href="/shoes/loafers" onclick="cslCloseMobileNav()">Loafers</a> 662 663 664 665 <a href="/shoes/slip-ons" onclick="cslCloseMobileNav()">Slip-Ons</a> 666 667 668 669 <a href="/shoes/wide-width" onclick="cslCloseMobileNav()">Wide Width</a> 670 671 672 673 <a href="/shoes/boys-dress-shoes" onclick="cslCloseMobileNav()">Boys' Shoes</a> 674 675 676 677 <a href="/all-products" onclick="cslCloseMobileNav()">All Products</a> 678 679 680 681 682 683 <a href="/brands/wizfort" onclick="cslCloseMobileNav()">Wizfort</a> 684 685 686 687 <a href="/brands/esse-comfort" onclick="cslCloseMobileNav()">Esse Comfort</a> 688 689 690 691 <a href="/brands/benelaccio" onclick="cslCloseMobileNav()">Benelaccio</a> 692 693 694 695 <a href="/blog" onclick="cslCloseMobileNav()">Blog</a> 696 697 698 699 <a href="/about" onclick="cslCloseMobileNav()">About</a> 700 701 702 703 704 705 <a href="/shoes/wedding-shoes" onclick="cslCloseMobileNav()">Wedding</a> 706 707 708 709 <a href="/shoes/school-shoes" onclick="cslCloseMobileNav()">School</a> 710 711 712 713 <a href="/shoes/office-shoes" onclick="cslCloseMobileNav()">Office</a> 714 715 716 717 718 719 <a href="/help" onclick="cslCloseMobileNav()">Help</a> 720 721 <a href="/track-order" onclick="cslCloseMobileNav()">Track Order</a> 722 723 <a href="/contact" onclick="cslCloseMobileNav()">Contact Us</a> 724 725 726 727 728 <a href="/login" onclick="cslCloseMobileNav()">Sign In</a> 729 730 </div> 731</div> 732 733<!-- Top Bar --> 734 735<div class="csl-top-bar" data-nosnippet> 736 <div class="csl-top-bar-content"> 737 738 739 740 <span class="csl-top-bar-message">Free standard shipping for retail orders | Family-Owned Since 2008 | 60-Day Easy Returns</span> 741 742 <div class="csl-top-bar-links"> 743 <a href="tel:+18456946700" class="csl-top-bar-phone"> 744 <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg> 745 (845) 694-6700 746 </a> 747 748 749 <a href="/help">Help</a> 750 751 <a href="/track-order">Track Order</a> 752 753 <a href="/contact">Contact Us</a> 754 755 756 </div> 757 </div> 758</div> 759 760 761<!-- Header --> 762<header class="csl-header" data-nosnippet> 763 <div class="csl-header-inner"> 764 <button class="csl-mobile-menu-toggle" onclick="cslOpenMobileNav()" aria-label="Open menu"> 765 <svg viewBox="0 0 24 24" aria-hidden="true"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg> 766 </button> 767 <a href="/" class="csl-logo"> 768 769 <img src="/files/cslshoes.webp" alt="CSL Shoes logo" width="213" height="32"> 770 771 </a> 772 <nav class="csl-nav"> 773 774 775 776 <div class="csl-nav-dropdown"> 777 <a href="/shoes">Styles <svg viewBox="0 0 24 24"><polyline points="6 9 12 15 18 9"/></svg></a> 778 <div class="csl-dropdown-menu"> 779 780 781 782 783 <a href="/shoes/oxfords">Oxfords</a> 784 785 786 787 <a href="/shoes/loafers">Loafers</a> 788 789 790 791 <a href="/shoes/slip-ons">Slip-Ons</a> 792 793 794 795 <a href="/shoes/wide-width">Wide Width</a> 796 797 798 799 <a href="/shoes/boys-dress-shoes">Boys' Shoes</a> 800 801 802 803 <a href="/all-products">All Products</a> 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 </div> 827 </div> 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 <div class="csl-nav-dropdown"> 844 <a href="/brands">Brands <svg viewBox="0 0 24 24"><polyline points="6 9 12 15 18 9"/></svg></a> 845 <div class="csl-dropdown-menu"> 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 <a href="/brands/wizfort">Wizfort</a> 865 866 867 868 <a href="/brands/esse-comfort">Esse Comfort</a> 869 870 871 872 <a href="/brands/benelaccio">Benelaccio</a> 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 </div> 888 </div> 889 890 891 892 893 894 895 896 897 898 <a href="/blog">Blog</a> 899 900 901 902 <a href="/about">About</a> 903 904 905 906 <div class="csl-nav-dropdown"> 907 <a href="/shoes">Occasions <svg viewBox="0 0 24 24"><polyline points="6 9 12 15 18 9"/></svg></a> 908 <div class="csl-dropdown-menu"> 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 <a href="/shoes/wedding-shoes">Wedding</a> 940 941 942 943 <a href="/shoes/school-shoes">School</a> 944 945 946 947 <a href="/shoes/office-shoes">Office</a> 948 949 950 </div> 951 </div> 952 953 954 955 956 957 958 959 960 961 </nav> 962 <div class="csl-header-actions"> 963 <button class="csl-mobile-search-toggle" onclick="cslOpenMobileSearch()" aria-label="Search"> 964 <svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/></svg> 965 </button> 966 <a href="/size-guide" class="csl-size-guide-link"> 967 <svg viewBox="0 0 24 24"><rect x="2" y="7" width="20" height="14" rx="2" ry="2"/><path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"/></svg> 968 Size Guide 969 </a> 970 971 <div class="csl-search-box"> 972 <svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/></svg> 973 <input type="text" id="csl-search-input" placeholder="Search shoes..." autocomplete="off" aria-label="Search products"> 974 <div class="csl-search-results" id="csl-search-results"></div> 975 </div> 976 977 978 979 <a href="/login" class="csl-header-icon-link" title="Sign In">
980 <svg class="csl-header-icon" viewBox="0 0 24 24"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg> 981 </a> 982 983 984 985 <a href="/wishlist" class="csl-wishlist-icon csl-header-icon-link" title="Wishlist"> 986 <svg class="csl-header-icon" viewBox="0 0 24 24"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg> 987 <span class="csl-wishlist-count" id="csl-wishlist-count">0</span> 988 </a> 989 990 991 <a href="/cart" class="csl-cart-icon csl-header-icon-link" title="Cart"> 992 <svg class="csl-header-icon" viewBox="0 0 24 24"><path d="M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"/><line x1="3" y1="6" x2="21" y2="6"/><path d="M16 10a4 4 0 0 1-8 0"/></svg> 993 <span class="csl-cart-count" id="csl-cart-count">0</span> 994 </a> 995 996 </div> 997 </div> 998</header> 999 1000<!-- Mobile Search Overlay --> 1001<div class="csl-mobile-search-overlay" id="csl-mobile-search-overlay"> 1002 <input type="text" id="csl-mobile-search-input" placeholder="Search shoes..." autocomplete="off" aria-label="Search products"> 1003 <button class="csl-mobile-search-close" onclick="cslCloseMobileSearch()" aria-label="Close search"> 1004 <svg viewBox="0 0 24 24" aria-hidden="true"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg> 1005 </button> 1006 <div class="csl-search-results" id="csl-mobile-search-results"></div> 1007</div> 1008
1009<script> 1010// CSL Header JavaScript - Inline for reliability 1011(function() { 1012 var cslSearchTimeout; 1013 1014 // Mobile search 1015 window.cslOpenMobileSearch = function() { 1016 var overlay = document.getElementById('csl-mobile-search-overlay'); 1017 overlay.classList.add('active'); 1018 var input = document.getElementById('csl-mobile-search-input'); 1019 input.value = ''; 1020 input.focus(); 1021 }; 1022 1023 window.cslCloseMobileSearch = function() { 1024 document.getElementById('csl-mobile-search-overlay').classList.remove('active'); 1025 document.getElementById('csl-mobile-search-results').innerHTML = ''; 1026 }; 1027 1028 // Mobile navigation 1029 window.cslOpenMobileNav = function() { 1030 document.getElementById('csl-mobile-nav').classList.add('active'); 1031 document.body.style.overflow = 'hidden'; 1032 }; 1033 1034 window.cslCloseMobileNav = function() { 1035 document.getElementById('csl-mobile-nav').classList.remove('active'); 1036 document.body.style.overflow = ''; 1037 }; 1038 1039 // Search functionality 1040 function initCslSearch() { 1041 var searchInput = document.getElementById('csl-search-input'); 1042 var searchResults = document.getElementById('csl-search-results'); 1043 1044 if (!searchInput) return; 1045 1046 searchInput.addEventListener('input', function() { 1047 clearTimeout(cslSearchTimeout); 1048 var query = this.value.trim(); 1049 1050 if (query.length < 2) { 1051 searchResults.classList.remove('active'); 1052 return; 1053 } 1054 1055 cslSearchTimeout = setTimeout(function() { cslSearchProducts(query); }, 300); 1056 }); 1057 1058 searchInput.addEventListener('focus', function() { 1059 if (this.value.trim().length >= 2) { 1060 searchResults.classList.add('active'); 1061 } 1062 }); 1063 1064 searchInput.addEventListener('keypress', function(e) { 1065 if (e.key === 'Enter') { 1066 var query = this.value.trim(); 1067 if (query) { 1068 window.location.href = '/all-products?search=' + encodeURIComponent(query); 1069 } 1070 } 1071 }); 1072 1073 document.addEventListener('click', function(e) { 1074 if (!e.target.closest('.csl-search-box')) { 1075 searchResults.classList.remove('active'); 1076 } 1077 }); 1078 } 1079 1080 // Mobile search - reuse same search logic 1081 function initCslMobileSearch() { 1082 var mobileInput = document.getElementById('csl-mobile-search-input'); 1083 var mobileResults = document.getElementById('csl-mobile-search-results'); 1084 if (!mobileInput) return; 1085 1086 mobileInput.addEventListener('input', function() { 1087 clearTimeout(cslSearchTimeout); 1088 var query = this.value.trim(); 1089 if (query.length < 2) { mobileResults.innerHTML = ''; return; } 1090 cslSearchTimeout = setTimeout(function() { cslSearchProductsMobile(query); }, 300); 1091 }); 1092 1093 mobileInput.addEventListener('keypress', function(e) { 1094 if (e.key === 'Enter') { 1095 var query = this.value.trim(); 1096 if (query) { 1097 window.location.href = '/all-products?search=' + encodeURIComponent(query); 1098 cslCloseMobileSearch(); 1099 } 1100 } 1101 }); 1102 } 1103 1104 function cslSearchProductsMobile(query) { 1105 var mobileResults = document.getElementById('csl-mobile-search-results'); 1106 fetch('/api/method/cslshoes_erp.api.search.search_products?query=' + encodeURIComponent(query)) 1107 .then(function(response) { return response.json(); }) 1108 .then(function(data) { 1109 if (data.message && data.message.length > 0) { 1110 mobileResults.innerHTML = data.message.map(function(product) { 1111 var safeName = cslEscapeHtml(product.web_item_name); 1112 var safeRoute = encodeURI(product.route || ''); 1113 var safeImage = cslEscapeHtml(product.website_image || '/assets/webshop/images/cart-empty-state.png'); 1114 return '<a href="/' + safeRoute + '" style="display:flex;align-items:center;gap:12px;padding:12px 16px;text-decoration:none;color:#1a1a1a;border-bottom:1px solid #f3f4f6;">' + 1115 '<img src="' + safeImage + '" alt="' + safeName + '" width="50" height="50" style="border-radius:6px;object-fit:cover;">' + 1116 '<span style="font-size:14px;">' + safeName + '</span>' + 1117 '</a>'; 1118 }).join(''); 1119 } else { 1120 mobileResults.innerHTML = '<div style="padding:16px;text-align:center;color:#6b7280;">No products found</div>'; 1121 } 1122 }) 1123 .catch(function() { 1124 mobileResults.innerHTML = '<div style="padding:16px;text-align:center;color:#6b7280;">Search unavailable</div>'; 1125 }); 1126 } 1127 1128 function cslSearchProducts(query) { 1129 var searchResults = document.getElementById('csl-search-results'); 1130 1131 fetch('/api/method/cslshoes_erp.api.search.search_products?query=' + encodeURIComponent(query)) 1132 .then(function(response) { return response.json(); }) 1133 .then(function(data) { 1134 if (data.message && data.message.length > 0) {
1135 cslRenderSearchResults(data.message); 1136 } else { 1137 searchResults.innerHTML = '<div class="csl-search-no-results">No products found</div>'; 1138 } 1139 searchResults.classList.add('active'); 1140 }) 1141 .catch(function() { 1142 searchResults.innerHTML = '<div class="csl-search-no-results">Search unavailable</div>'; 1143 searchResults.classList.add('active'); 1144 }); 1145 } 1146 1147 function cslEscapeHtml(str) { 1148 if (!str) return ''; 1149 var div = document.createElement('div'); 1150 div.appendChild(document.createTextNode(String(str))); 1151 return div.innerHTML; 1152 } 1153 1154 function cslRenderSearchResults(products) { 1155 var searchResults = document.getElementById('csl-search-results'); 1156 searchResults.innerHTML = products.map(function(product) { 1157 var safeName = cslEscapeHtml(product.web_item_name); 1158 var safeRoute = encodeURI(product.route || ''); 1159 var safeBrand = cslEscapeHtml(product.brand || 'CSL Shoes'); 1160 var safeImage = cslEscapeHtml(product.website_image || '/assets/webshop/images/cart-empty-state.png'); 1161 return '<a href="/' + safeRoute + '" class="csl-search-result-item">' + 1162 '<img src="' + safeImage + '" alt="' + safeName + '">' + 1163 '<div class="csl-search-result-info">' + 1164 '<span class="csl-search-result-name">' + safeName + '</span>' + 1165 '<p>' + safeBrand + '</p>' + 1166 '</div>' + 1167 '</a>'; 1168 }).join(''); 1169 } 1170 1171 // Cart count update - supports both guests and logged-in users 1172 function updateCslCartCount() { 1173 var isGuest = document.body.getAttribute('frappe-session-status') === 'logged-out'; 1174 1175 if (isGuest) { 1176 // Guest: use guest cart API 1177 var cartIdMatch = document.cookie.match(/guest_cart_id=([^;]+)/); 1178 var cartId = cartIdMatch ? cartIdMatch[1] : null; 1179 1180 fetch('/api/method/cslshoes_erp.api.guest_cart.get_cart_count', { 1181 method: 'POST', 1182 headers: { 'Content-Type': 'application/json' }, 1183 credentials: 'same-origin', 1184 body: JSON.stringify({ cart_id: cartId }) 1185 }) 1186 .then(function(r) { return r.json(); }) 1187 .then(function(data) { 1188 if (data.message) { 1189 var count = data.message.count || 0; 1190 updateCartCountDisplay(count); 1191 } 1192 }) 1193 .catch(function() {}); 1194 } else { 1195 // Logged-in user: use quotation API 1196 fetch('/api/method/webshop.webshop.shopping_cart.cart.get_cart_quotation', { 1197 method: 'GET', 1198 headers: { 'Content-Type': 'application/json' }, 1199 credentials: 'same-origin' 1200 }) 1201 .then(function(r) { return r.json(); }) 1202 .then(function(data) { 1203 if (data.message && data.message.doc) { 1204 var totalQty = data.message.doc.total_qty || 0; 1205 updateCartCountDisplay(totalQty); 1206 } 1207 }) 1208 .catch(function() {}); 1209 } 1210 } 1211 1212 // Helper to update cart count display in header 1213 function updateCartCountDisplay(count) { 1214 count = Math.floor(count); 1215 var countEl = document.getElementById('csl-cart-count'); 1216 if (countEl) { 1217 countEl.textContent = count; 1218 countEl.style.display = count > 0 ? 'flex' : 'none'; 1219 } 1220 } 1221 1222 // Wishlist count update 1223 function updateCslWishlistCount() { 1224 fetch('/api/method/cslshoes_erp.api.wishlist.get_wishlist_count', { 1225 method: 'GET', 1226 credentials: 'same-origin' 1227 }) 1228 .then(function(r) { return r.json(); }) 1229 .then(function(data) { 1230 var count = data.message || 0; 1231 var countEl = document.getElementById('csl-wishlist-count'); 1232 if (countEl) { 1233 if (count > 0) { 1234 countEl.textContent = count; 1235 countEl.style.display = 'flex'; 1236 } else { 1237 countEl.style.display = 'none'; 1238 } 1239 } 1240 }) 1241 .catch(function() {}); 1242 } 1243 1244 // Initialize on DOM ready 1245 if (document.readyState === 'loading') { 1246 document.addEventListener('DOMContentLoaded', function() { 1247 initCslSearch(); 1248 initCslMobileSearch(); 1249 updateCslCartCount(); 1250 updateCslWishlistCount(); 1251 }); 1252 } else {
1253 initCslSearch(); 1254 initCslMobileSearch(); 1255 updateCslCartCount(); 1256 updateCslWishlistCount(); 1257 } 1258 1259 // BUG-W3 cart sub: expose count refreshers globally so add-to-cart handlers 1260 // in homepage / PDP / /all-products can trigger header re-sync after mutation. 1261 // Idempotency guard (auditor C1) â if a future include order re-exposes, keep 1262 // the first definition. 1263 window.updateCslCartCount = window.updateCslCartCount || updateCslCartCount; 1264 window.updateCslWishlistCount = window.updateCslWishlistCount || updateCslWishlistCount; 1265})(); 1266</script>
1266<main id="main-content"> 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278<div id="page-index" data-path="all-products"> 1279 1280<div class="page-content-wrapper"> 1281 <!-- breadcrumbs --> 1282 <div class="page-breadcrumbs"> 1283 1284 </div> 1285 1286 1287 <main class="container"> 1288 <div class="page-header-wrapper"> 1289 <div class="page-header"> 1290 1291 </div> 1292 1293 1294 </div> 1295 1296 <div class="page_content"> 1297 1298 1299<div class="container" style="padding: 40px 20px;"> 1300<h1 style="font-size: 1.75rem; font-weight: 700; color: #111827; margin-bottom: 24px;">All Products</h1> 1301<div class="row"> 1302 <!-- Items section --> 1303 <div id="product-listing" class="col-12 order-2 col-md-9 order-md-2 item-card-group-section"> 1304 <!-- Interactive product grid rendered via JS (ProductListing) --> 1305 <!-- SSR product links below provide crawl paths for search engines --> 1306 1307 <noscript> 1308 <div class="ssr-product-links"> 1309 <h2>All Products</h2> 1310 <ul> 1311 1312 <li><a href="/products/wizfort-classics-mens-leather-sole-bicycle-toe-lace-up-s8svh">Wizfort Classics Mens Leather Sole Bicycle Toe Lace Up</a></li> 1313 1314 <li><a href="/products/wizfort-classics-mens-leather-sole-bicycle-toe-lace-up-jlpbi">Wizfort Classics Mens Leather Sole Bicycle Toe Slip On (715)</a></li> 1315 1316 <li><a href="/products/wizfort-classics-mens-leather-sole-moc-toe-lace-up-ggqjf">Wizfort Classics Mens Leather Sole Moc Toe Lace Up</a></li> 1317 1318 <li><a href="/products/wizfort-classics-mens-leather-sole-moc-toe-slip-on-3oiaf">Wizfort Classics Mens Leather Sole Moc Toe Slip On</a></li> 1319 1320 <li><a href="/products/wizfort-mens-bicycle-toe-lace-up-q6rsr">Wizfort Mens Bicycle Toe Lace Up</a></li> 1321 1322 <li><a href="/products/wizfort-mens-bicycle-toe-loafer-r8vij">Wizfort Mens Bicycle Toe Loafer</a></li> 1323 1324 <li><a href="/products/wizfort-mens-cap-toe-oxford-shoe-3dhdj">Wizfort Mens Cap Toe Oxford Shoe</a></li> 1325 1326 <li><a href="/products/wizfort-mens-lightweight-bicycle-toe-lace-up-ul7ri">Wizfort Mens Lightweight Bicycle Toe Lace Up</a></li> 1327 1328 <li><a href="/products/wizfort-mens-lightweight-bicycle-toe-loafer-njyyt">Wizfort Mens Lightweight Bicycle Toe Loafer</a></li> 1329 1330 <li><a href="/products/wizfort-mens-lightweight-moc-toe-lace-up-shoes-tlofo">Wizfort Mens Lightweight Moc Toe Lace Up Shoes</a></li> 1331 1332 <li><a href="/products/wizfort-mens-lightweight-moc-toe-lace-up-shoes-gpvip">Wizfort Mens Lightweight Moc Toe Slip On (815)</a></li> 1333 1334 <li><a href="/products/wizfort-mens-lightweight-plain-toe-chassidic-loafer-r6fuh">Wizfort Mens Lightweight Plain Toe Chassidic Loafer</a></li> 1335 1336 <li><a href="/products/wizfort-mens-moc-toe-lace-up-shoe-3pouw">Wizfort Mens Moc Toe Lace Up Shoe</a></li> 1337 1338 <li><a href="/products/wizfort-mens-moc-toe-loafer-daoss">Wizfort Mens Moc Toe Loafer</a></li> 1339 1340 <li><a href="/products/wizfort-mens-plain-toe-chassidic-loafer-loha7">Wizfort Mens Plain Toe Chassidic Loafer</a></li> 1341 1342 <li><a href="/products/wizfort-mens-plain-toe-lace-up-shoe-miqkc">Wizfort Mens Plain Toe Lace Up Shoe</a></li> 1343 1344 <li><a href="/products/wizfort-mens-plain-toe-loafer-pezi6">Wizfort Mens Plain Toe Loafer</a></li> 1345 1346 <li><a href="/products/wizfort-mens-plain-toe-traditional-loafer-656">Wizfort Mens Plain Toe Traditional Loafer (656)</a></li> 1347 1348 <li><a href="/products/wizfort-prestige-comfortable-leather-sole-chassidic-loafer-ib58c">Wizfort Prestige Comfortable Leather Sole Chassidic Loafer</a></li> 1349 1350 <li><a href="/products/wizfort-prestige-leather-sole-bicycle-toe-lace-up-shoe-for-men-bgki4">Wizfort Prestige Leather Sole Bicycle Toe Lace Up Shoe for Men</a></li> 1351 1352 <li><a href="/products/wizfort-prestige-leather-sole-bicycle-toe-loafer-for-men-f9xq5">Wizfort Prestige Leather Sole Bicycle Toe Loafer for Men</a></li> 1353 1354 <li><a href="/products/wizfort-prestige-leather-sole-moc-toe-loafer-for-men-jivbk">Wizfort Prestige Leather Sole Moc Toe Loafer for Men</a></li> 1355 1356 <li><a href="/products/wizfort-prestige-mens-moc-toe-lace-up-8svvp">Wizfort Prestige Mens Moc Toe Lace Up</a></li> 1357 1358 </ul> 1359 </div> 1360 </noscript> 1361 <div class="ssr-crawl-links" aria-hidden="true" style="height:0;overflow:hidden;position:absolute"> 1362 1363 <a href="/products/wizfort-classics-mens-leather-sole-bicycle-toe-lace-up-s8svh">Wizfort Classics Mens Leather Sole Bicycle Toe Lace Up</a> 1364 1365 <a href="/products/wizfort-classics-mens-leather-sole-bicycle-toe-lace-up-jlpbi">Wizfort Classics Mens Leather Sole Bicycle Toe Slip On (715)</a> 1366 1367 <a href="/products/wizfort-classics-mens-leather-sole-moc-toe-lace-up-ggqjf">Wizfort Classics Mens Leather Sole Moc Toe Lace Up</a> 1368 1369 <a href="/products/wizfort-classics-mens-leather-sole-moc-toe-slip-on-3oiaf">Wizfort Classics Mens Leather Sole Moc Toe Slip On</a> 1370 1371 <a href="/products/wizfort-mens-bicycle-toe-lace-up-q6rsr">Wizfort Mens Bicycle Toe Lace Up</a> 1372 1373 <a href="/products/wizfort-mens-bicycle-toe-loafer-r8vij">Wizfort Mens Bicycle Toe Loafer</a> 1374 1375 <a href="/products/wizfort-mens-cap-toe-oxford-shoe-3dhdj">Wizfort Mens Cap Toe Oxford Shoe</a> 1376 1377 <a href="/products/wizfort-mens-lightweight-bicycle-toe-lace-up-ul7ri">Wizfort Mens Lightweight Bicycle Toe Lace Up</a> 1378 1379 <a href="/products/wizfort-mens-lightweight-bicycle-toe-loafer-njyyt">Wizfort Mens Lightweight Bicycle Toe Loafer</a> 1380 1381 <a href="/products/wizfort-mens-lightweight-moc-toe-lace-up-shoes-tlofo">Wizfort Mens Lightweight Moc Toe Lace Up Shoes</a> 1382 1383 <a href="/products/wizfort-mens-lightweight-moc-toe-lace-up-shoes-gpvip">Wizfort Mens Lightweight Moc Toe Slip On (815)</a> 1384 1385 <a href="/products/wizfort-mens-lightweight-plain-toe-chassidic-loafer-r6fuh">Wizfort Mens Lightweight Plain Toe Chassidic Loafer</a> 1386 1387 <a href="/products/wizfort-mens-moc-toe-lace-up-shoe-3pouw">Wizfort Mens Moc Toe Lace Up Shoe</a> 1388 1389 <a href="/products/wizfort-mens-moc-toe-loafer-daoss">Wizfort Mens Moc Toe Loafer</a> 1390 1391 <a href="/products/wizfort-mens-plain-toe-chassidic-loafer-loha7">Wizfort Mens Plain Toe Chassidic Loafer</a> 1392 1393 <a href="/products/wizfort-mens-plain-toe-lace-up-shoe-miqkc">Wizfort Mens Plain Toe Lace Up Shoe</a> 1394 1395 <a href="/products/wizfort-mens-plain-toe-loafer-pezi6">Wizfort Mens Plain Toe Loafer</a> 1396 1397 <a href="/products/wizfort-mens-plain-toe-traditional-loafer-656">Wizfort Mens Plain Toe Traditional Loafer (656)</a> 1398 1399 <a href="/products/wizfort-prestige-comfortable-leather-sole-chassidic-loafer-ib58c">Wizfort Prestige Comfortable Leather Sole Chassidic Loafer</a> 1400 1401 <a href="/products/wizfort-prestige-leather-sole-bicycle-toe-lace-up-shoe-for-men-bgki4">Wizfort Prestige Leather Sole Bicycle Toe Lace Up Shoe for Men</a> 1402 1403 <a href="/products/wizfort-prestige-leather-sole-bicycle-toe-loafer-for-men-f9xq5">Wizfort Prestige Leather Sole Bicycle Toe Loafer for Men</a> 1404 1405 <a href="/products/wizfort-prestige-leather-sole-moc-toe-loafer-for-men-jivbk">Wizfort Prestige Leather Sole Moc Toe Loafer for Men</a> 1406 1407 <a href="/products/wizfort-prestige-mens-moc-toe-lace-up-8svvp">Wizfort Prestige Mens Moc Toe Lace Up</a> 1408 1409 </div> 1410 1411 </div> 1412 1413 <!-- Filters Section --> 1414 <div class="col-12 order-1 col-md-3 order-md-1"> 1415 <div class="collapse d-md-block mr-4 filters-section" id="product-filters"> 1416 <div class="d-flex justify-content-between align-items-center mb-5 title-section"> 1417 <div class="mb-4 filters-title" > Filters </div> 1418 <a class="mb-4 clear-filters" href="/all-products">Clear All</a> 1419 </div> 1420 <!-- field filters --> 1421 1422 1423 <div class="mb-4 filter-block pb-5"> 1424 <div class="filter-label mb-3">Brand</div> 1425 1426 1427 1428 1429 <div class="filter-options"> 1430 1431 <div class="filter-lookup-wrapper checkbox" data-value="Benelaccio"> 1432 <label for="Benelaccio"> 1433 <input type="checkbox" 1434 class="product-filter field-filter" 1435 id="Benelaccio" 1436 data-filter-name="brand" 1437 data-filter-value="Benelaccio" 1438 style="width: 14px !important"> 1439 <span class="label-area">Benelaccio</span> 1440 </label> 1441 </div> 1442 1443 <div class="filter-lookup-wrapper checkbox" data-value="Esse Comfort"> 1444 <label for="Esse Comfort"> 1445 <input type="checkbox" 1446 class="product-filter field-filter" 1447 id="Esse Comfort" 1448 data-filter-name="brand" 1449 data-filter-value="Esse Comfort" 1450 style="width: 14px !important"> 1451 <span class="label-area">Esse Comfort</span> 1452 </label> 1453 </div> 1454 1455 <div class="filter-lookup-wrapper checkbox" data-value="Wizfort Shoes"> 1456 <label for="Wizfort Shoes"> 1457 <input type="checkbox" 1458 class="product-filter field-filter" 1459 id="Wizfort Shoes" 1460 data-filter-name="brand" 1461 data-filter-value="Wizfort Shoes" 1462 style="width: 14px !important"> 1463 <span class="label-area">Wizfort Shoes</span> 1464 </label> 1465 </div> 1466 1467 </div> 1468 1469 </div> 1470 1471 <div class="mb-4 filter-block pb-5"> 1472 <div class="filter-label mb-3">Collection</div> 1473 1474 1475 1476 1477 <div class="filter-options"> 1478 1479 <div class="filter-lookup-wrapper checkbox" data-value="Casual"> 1480 <label for="Casual"> 1481 <input type="checkbox" 1482 class="product-filter field-filter" 1483 id="Casual" 1484 data-filter-name="collection" 1485 data-filter-value="Casual" 1486 style="width: 14px !important"> 1487 <span class="label-area">Casual</span> 1488 </label> 1489 </div> 1490 1491 <div class="filter-lookup-wrapper checkbox" data-value="Chasidic"> 1492 <label for="Chasidic"> 1493 <input type="checkbox" 1494 class="product-filter field-filter" 1495 id="Chasidic" 1496 data-filter-name="collection" 1497 data-filter-value="Chasidic" 1498 style="width: 14px !important"> 1499 <span class="label-area">Chasidic</span> 1500 </label> 1501 </div> 1502 1503 <div class="filter-lookup-wrapper checkbox" data-value="Comfort"> 1504 <label for="Comfort"> 1505 <input type="checkbox" 1506 class="product-filter field-filter" 1507 id="Comfort" 1508 data-filter-name="collection" 1509 data-filter-value="Comfort" 1510 style="width: 14px !important"> 1511 <span class="label-area">Comfort</span> 1512 </label> 1513 </div> 1514 1515 <div class="filter-lookup-wrapper checkbox" data-value="Dress"> 1516 <label for="Dress"> 1517 <input type="checkbox" 1518 class="product-filter field-filter" 1519 id="Dress" 1520 data-filter-name="collection" 1521 data-filter-value="Dress" 1522 style="width: 14px !important"> 1523 <span class="label-area">Dress</span> 1524 </label> 1525 </div> 1526 1527 <div class="filter-lookup-wrapper checkbox" data-value="Formal"> 1528 <label for="Formal"> 1529 <input type="checkbox" 1530 class="product-filter field-filter" 1531 id="Formal" 1532 data-filter-name="collection" 1533 data-filter-value="Formal" 1534 style="width: 14px !important"> 1535 <span class="label-area">Formal</span> 1536 </label> 1537 </div> 1538 1539 </div> 1540 1541 </div> 1542 1543 <div class="mb-4 filter-block pb-5"> 1544 <div class="filter-label mb-3">Market</div> 1545 1546 1547 1548 1549 <div class="filter-options"> 1550 1551 <div class="filter-lookup-wrapper checkbox" data-value="Boys"> 1552 <label for="Boys"> 1553 <input type="checkbox" 1554 class="product-filter field-filter" 1555 id="Boys" 1556 data-filter-name="market" 1557 data-filter-value="Boys" 1558 style="width: 14px !important"> 1559 <span class="label-area">Boys</span> 1560 </label> 1561 </div> 1562 1563 <div class="filter-lookup-wrapper checkbox" data-value="Kids"> 1564 <label for="Kids"> 1565 <input type="checkbox" 1566 class="product-filter field-filter" 1567 id="Kids" 1568 data-filter-name="market" 1569 data-filter-value="Kids" 1570 style="width: 14px !important"> 1571 <span class="label-area">Kids</span> 1572 </label> 1573 </div> 1574 1575 <div class="filter-lookup-wrapper checkbox" data-value="Men's"> 1576 <label for="Men's"> 1577 <input type="checkbox" 1578 class="product-filter field-filter" 1579 id="Men's" 1580 data-filter-name="market" 1581 data-filter-value="Men's" 1582 style="width: 14px !important"> 1583 <span class="label-area">Men's</span> 1584 </label> 1585 </div> 1586 1587 </div> 1588 1589 </div> 1590 1591 <div class="mb-4 filter-block pb-5"> 1592 <div class="filter-label mb-3">Closure Type</div> 1593 1594 1595 1596 1597 <div class="filter-options"> 1598 1599 <div class="filter-lookup-wrapper checkbox" data-value="Lace Up"> 1600 <label for="Lace Up"> 1601 <input type="checkbox" 1602 class="product-filter field-filter" 1603 id="Lace Up" 1604 data-filter-name="closure_type" 1605 data-filter-value="Lace Up" 1606 style="width: 14px !important"> 1607 <span class="label-area">Lace Up</span> 1608 </label> 1609 </div> 1610 1611 <div class="filter-lookup-wrapper checkbox" data-value="Slip On"> 1612 <label for="Slip On"> 1613 <input type="checkbox" 1614 class="product-filter field-filter" 1615 id="Slip On" 1616 data-filter-name="closure_type" 1617 data-filter-value="Slip On" 1618 style="width: 14px !important"> 1619 <span class="label-area">Slip On</span> 1620 </label> 1621 </div> 1622 1623 <div class="filter-lookup-wrapper checkbox" data-value="Velcro"> 1624 <label for="Velcro"> 1625 <input type="checkbox" 1626 class="product-filter field-filter" 1627 id="Velcro" 1628 data-filter-name="closure_type" 1629 data-filter-value="Velcro" 1630 style="width: 14px !important"> 1631 <span class="label-area">Velcro</span> 1632 </label> 1633 </div> 1634 1635 </div> 1636 1637 </div> 1638 1639 <div class="mb-4 filter-block pb-5"> 1640 <div class="filter-label mb-3">Shoe Description</div> 1641 1642 1643 1644 1645 <div class="filter-options"> 1646 1647 <div class="filter-lookup-wrapper checkbox" data-value="Bicycle Toe"> 1648 <label for="Bicycle Toe"> 1649 <input type="checkbox" 1650 class="product-filter field-filter" 1651 id="Bicycle Toe" 1652 data-filter-name="shoe_description" 1653 data-filter-value="Bicycle Toe" 1654 style="width: 14px !important"> 1655 <span class="label-area">Bicycle Toe</span> 1656 </label> 1657 </div> 1658 1659 <div class="filter-lookup-wrapper checkbox" data-value="Cap Toe"> 1660 <label for="Cap Toe"> 1661 <input type="checkbox" 1662 class="product-filter field-filter" 1663 id="Cap Toe" 1664 data-filter-name="shoe_description" 1665 data-filter-value="Cap Toe" 1666 style="width: 14px !important"> 1667 <span class="label-area">Cap Toe</span> 1668 </label> 1669 </div> 1670 1671 <div class="filter-lookup-wrapper checkbox" data-value="Moccasin"> 1672 <label for="Moccasin"> 1673 <input type="checkbox" 1674 class="product-filter field-filter" 1675 id="Moccasin" 1676 data-filter-name="shoe_description" 1677 data-filter-value="Moccasin" 1678 style="width: 14px !important"> 1679 <span class="label-area">Moccasin</span> 1680 </label> 1681 </div> 1682 1683 <div class="filter-lookup-wrapper checkbox" data-value="Plain Toe"> 1684 <label for="Plain Toe"> 1685 <input type="checkbox" 1686 class="product-filter field-filter" 1687 id="Plain Toe" 1688 data-filter-name="shoe_description" 1689 data-filter-value="Plain Toe" 1690 style="width: 14px !important"> 1691 <span class="label-area">Plain Toe</span> 1692 </label> 1693 </div> 1694 1695 </div> 1696 1697 </div> 1698 1699 <div class="mb-4 filter-block pb-5"> 1700 <div class="filter-label mb-3">Shoe Construction</div> 1701 1702 1703 1704 1705 <div class="filter-options"> 1706 1707 <div class="filter-lookup-wrapper checkbox" data-value="Cemented"> 1708 <label for="Cemented"> 1709 <input type="checkbox" 1710 class="product-filter field-filter" 1711 id="Cemented" 1712 data-filter-name="shoe_construction" 1713 data-filter-value="Cemented" 1714 style="width: 14px !important"> 1715 <
1715span class="label-area">Cemented</span> 1716 </label> 1717 </div> 1718 1719 <div class="filter-lookup-wrapper checkbox" data-value="Injected"> 1720 <label for="Injected"> 1721 <input type="checkbox" 1722 class="product-filter field-filter" 1723 id="Injected" 1724 data-filter-name="shoe_construction" 1725 data-filter-value="Injected" 1726 style="width: 14px !important"> 1727 <span class="label-area">Injected</span> 1728 </label> 1729 </div> 1730 1731 </div> 1732 1733 </div> 1734 1735 1736 1737 <!-- attribute filters --> 1738 1739 1740 <div class="mb-4 filter-block pb-5"> 1741 <div class="filter-label mb-3">Color</div> 1742 1743 1744 1745 <div class="filter-options"> 1746 1747 <div class="filter-lookup-wrapper checkbox" data-value="Black"> 1748 <label data-value="Black"> 1749 <input type="checkbox" 1750 class="product-filter attribute-filter" 1751 id="Black" 1752 data-attribute-name="Color" 1753 data-attribute-value="Black" 1754 style="width: 14px !important" 1755 > 1756 <span class="label-area">Black</span> 1757 </label> 1758 </div> 1759 1760 <div class="filter-lookup-wrapper checkbox" data-value="Dark Grey"> 1761 <label data-value="Dark Grey"> 1762 <input type="checkbox" 1763 class="product-filter attribute-filter" 1764 id="Dark Grey" 1765 data-attribute-name="Color" 1766 data-attribute-value="Dark Grey" 1767 style="width: 14px !important" 1768 > 1769 <span class="label-area">Dark Grey</span> 1770 </label> 1771 </div> 1772 1773 <div class="filter-lookup-wrapper checkbox" data-value="Dark Navy"> 1774 <label data-value="Dark Navy"> 1775 <input type="checkbox" 1776 class="product-filter attribute-filter" 1777 id="Dark Navy" 1778 data-attribute-name="Color" 1779 data-attribute-value="Dark Navy" 1780 style="width: 14px !important" 1781 > 1782 <span class="label-area">Dark Navy</span> 1783 </label> 1784 </div> 1785 1786 </div> 1787 1788 </div> 1789 1790 <div class="mb-4 filter-block pb-5"> 1791 <div class="filter-label mb-3">Size</div> 1792 1793 <!-- show inline filter if values more than 20 --> 1794 <input type="text" class="form-control form-control-sm mb-2 filter-lookup-input" placeholder="_('Search') Sizes"/> 1795 1796 1797 1798 <div class="filter-options"> 1799 1800 <div class="filter-lookup-wrapper checkbox" data-value="22"> 1801 <label data-value="22"> 1802 <input type="checkbox" 1803 class="product-filter attribute-filter" 1804 id="22" 1805 data-attribute-name="Size" 1806 data-attribute-value="22" 1807 style="width: 14px !important" 1808 > 1809 <span class="label-area">22</span> 1810 </label> 1811 </div> 1812 1813 <div class="filter-lookup-wrapper checkbox" data-value="23"> 1814 <label data-value="23"> 1815 <input type="checkbox" 1816 class="product-filter attribute-filter" 1817 id="23" 1818 data-attribute-name="Size" 1819 data-attribute-value="23" 1820 style="width: 14px !important" 1821 > 1822 <span class="label-area">23</span> 1823 </label> 1824 </div> 1825 1826 <div class="filter-lookup-wrapper checkbox" data-value="24"> 1827 <label data-value="24"> 1828 <input type="checkbox" 1829 class="product-filter attribute-filter" 1830 id="24" 1831 data-attribute-name="Size" 1832 data-attribute-value="24" 1833 style="width: 14px !important" 1834 > 1835 <span class="label-area">24</span> 1836 </label> 1837 </div> 1838 1839 <div class="filter-lookup-wrapper checkbox" data-value="25"> 1840 <label data-value="25"> 1841 <input type="checkbox" 1842 class="product-filter attribute-filter" 1843 id="25" 1844 data-attribute-name="Size" 1845 data-attribute-value="25" 1846 style="width: 14px !important" 1847 > 1848 <span class="label-area">25</span> 1849 </label> 1850 </div> 1851 1852 <div class="filter-lookup-wrapper checkbox" data-value="26"> 1853 <label data-value="26"> 1854 <input type="checkbox" 1855 class="product-filter attribute-filter" 1856 id="26" 1857 data-attribute-name="Size" 1858 data-attribute-value="26" 1859 style="width: 14px !important" 1860 > 1861 <span class="label-area">26</span> 1862 </label> 1863 </div> 1864 1865 <div class="filter-lookup-wrapper checkbox" data-value="27"> 1866 <label data-value="27"> 1867 <input type="checkbox" 1868 class="product-filter attribute-filter" 1869 id="27" 1870 data-attribute-name="Size" 1871 data-attribute-value="27" 1872 style="width: 14px !important" 1873 > 1874 <span class="label-area">27</span> 1875 </label> 1876 </div> 1877 1878 <div class="filter-lookup-wrapper checkbox" data-value="28"> 1879 <label data-value="28"> 1880 <input type="checkbox" 1881 class="product-filter attribute-filter" 1882 id="28" 1883 data-attribute-name="Size" 1884 data-attribute-value="28" 1885 style="width: 14px !important" 1886 > 1887 <span class="label-area">28</span> 1888 </label> 1889 </div> 1890 1891 <div class="filter-lookup-wrapper checkbox" data-value="29"> 1892 <label data-value="29"> 1893 <input type="checkbox" 1894 class="product-filter attribute-filter" 1895 id="29" 1896 data-attribute-name="Size" 1897 data-attribute-value="29" 1898 style="width: 14px !important" 1899 > 1900 <span class="label-area">29</span> 1901 </label> 1902 </div> 1903 1904 <div class="filter-lookup-wrapper checkbox" data-value="30"> 1905 <label data-value="30"> 1906 <input type="checkbox" 1907 class="product-filter attribute-filter" 1908 id="30" 1909 data-attribute-name="Size" 1910 data-attribute-value="30" 1911 style="width: 14px !important" 1912 > 1913 <span class="label-area">30</span> 1914 </label> 1915 </div> 1916 1917 <div class="filter-lookup-wrapper checkbox" data-value="31"> 1918 <label data-value="31"> 1919 <input type="checkbox" 1920 class="product-filter attribute-filter" 1921 id="31" 1922 data-attribute-name="Size" 1923 data-attribute-value="31" 1924 style="width: 14px !important" 1925 > 1926 <span class="label-area">31</span> 1927 </label> 1928 </div> 1929 1930 <div class="filter-lookup-wrapper checkbox" data-value="32"> 1931 <label data-value="32"> 1932 <input type="checkbox" 1933 class="product-filter attribute-filter" 1934 id="32" 1935 data-attribute-name="Size" 1936 data-attribute-value="32" 1937 style="width: 14px !important" 1938 > 1939 <span class="label-area">32</span> 1940 </label> 1941 </div> 1942 1943 <div class="filter-lookup-wrapper checkbox" data-value="33"> 1944 <label data-value="33"> 1945 <input type="checkbox" 1946 class="product-filter attribute-filter" 1947 id="33" 1948 data-attribute-name="Size" 1949 data-attribute-value="33" 1950 style="width: 14px !important" 1951 > 1952 <span class="label-area">33</span> 1953 </label> 1954 </div> 1955 1956 <div class="filter-lookup-wrapper checkbox" data-value="34"> 1957 <label data-value="34"> 1958 <input type="checkbox" 1959 class="product-filter attribute-filter" 1960 id="34" 1961 data-attribute-name="Size" 1962 data-attribute-value="34" 1963 style="width: 14px !important" 1964 > 1965 <span class="label-area">34</span> 1966 </label> 1967 </div> 1968 1969 <div class="filter-lookup-wrapper checkbox" data-value="35"> 1970 <label data-value="35"> 1971 <input type="checkbox" 1972 class="product-filter attribute-filter" 1973 id="35" 1974 data-attribute-name="Size" 1975 data-attribute-value="35" 1976 style="width: 14px !important" 1977 > 1978 <span class="label-area">35</span> 1979 </label> 1980 </div> 1981 1982 <div class="filter-lookup-wrapper checkbox" data-value="36"> 1983 <label data-value="36"> 1984 <input type="checkbox" 1985 class="product-filter attribute-filter" 1986 id="36" 1987 data-attribute-name="Size" 1988 data-attribute-value="36" 1989 style="width: 14px !important" 1990 > 1991 <span class="label-area">36</span> 1992 </label> 1993 </div> 1994 1995 <div class="filter-lookup-wrapper checkbox" data-value="37"> 1996 <label data-value="37"> 1997 <input type="checkbox" 1998 class="product-filter attribute-filter" 1999 id="37" 2000 data-attribute-name="Size" 2001 data-attribute-value="37" 2002 style="width: 14px !important" 2003 > 2004 <span class="label-area">37</span> 2005 </label> 2006 </div> 2007 2008 <div class="filter-lookup-wrapper checkbox" data-value="38"> 2009 <label data-value="38"> 2010 <input type="checkbox" 2011 class="product-filter attribute-filter" 2012 id="38" 2013 data-attribute-name="Size" 2014 data-attribute-value="38" 2015 style="width: 14px !important" 2016 > 2017 <span class="label-area">38</span> 2018 </label> 2019 </div> 2020 2021 <div class="filter-lookup-wrapper checkbox" data-value="39"> 2022 <label data-value="39"> 2023 <input type="checkbox" 2024 class="product-filter attribute-filter" 2025 id="39" 2026 data-attribute-name="Size" 2027 data-attribute-value="39" 2028 style="width: 14px !important" 2029 > 2030 <span class="label-area">39</span> 2031 </label> 2032 </div> 2033 2034 <div class="filter-lookup-wrapper checkbox" data-value="40"> 2035 <label data-value="40"> 2036 <input type="checkbox" 2037 class="product-filter attribute-filter" 2038 id="40" 2039 data-attribute-name="Size" 2040 data-attribute-value="40" 2041 style="width: 14px !important" 2042 > 2043 <span class="label-area">40</span> 2044 </label> 2045 </div> 2046 2047 <div class="filter-lookup-wrapper checkbox" data-value="41"> 2048 <label data-value="41"> 2049 <input type="checkbox" 2050 class="product-filter attribute-filter" 2051 id="41" 2052 data-attribute-name="Size" 2053 data-attribute-value="41" 2054 style="width: 14px !important" 2055 > 2056 <span class="label-area">41</span> 2057 </label> 2058 </div> 2059 2060 <div class="filter-lookup-wrapper checkbox" data-value="42"> 2061 <label data-value="42"> 2062 <input type="checkbox" 2063 class="product-filter attribute-filter" 2064 id="42" 2065 data-attribute-name="Size" 2066 data-attribute-value="42" 2067 style="width: 14px !important" 2068 > 2069 <span class="label-area">42</span> 2070 </label> 2071 </div> 2072 2073 <div class="filter-lookup-wrapper checkbox" data-value="43"> 2074 <label data-value="43"> 2075 <input type="checkbox" 2076 class="product-filter attribute-filter" 2077 id="43" 2078 data-attribute-name="Size" 2079 data-attribute-value="43" 2080 style="width: 14px !important" 2081 > 2082 <span class="label-area">43</span> 2083 </label> 2084 </div> 2085 2086 <div class="filter-lookup-wrapper checkbox" data-value="44"> 2087 <label data-value="44"> 2088 <input type="checkbox" 2089 class="product-filter attribute-filter" 2090 id="44" 2091 data-attribute-name="Size" 2092 data-attribute-value="44" 2093 style="width: 14px !important" 2094 > 2095 <span class="label-area">44</span> 2096 </label> 2097 </div> 2098 2099 <div class="filter-lookup-wrapper checkbox" data-value="45"> 2100 <label data-value="45"> 2101 <input type="checkbox" 2102 class="product-filter attribute-filter" 2103 id="45" 2104 data-attribute-name="Size" 2105 data-attribute-value="45" 2106 style="width: 14px !important" 2107 > 2108 <span class="label-area">45</span> 2109 </label> 2110 </div> 2111 2112 <div class="filter-lookup-wrapper checkbox" data-value="46"> 2113 <label data-value="46"> 2114 <input type="checkbox" 2115 class="product-filter attribute-filter" 2116 id="46" 2117 data-attribute-name="Size" 2118 data-attribute-value="46" 2119 style="width: 14px !important" 2120 > 2121 <span class="label-area">46</span> 2122 </label> 2123 </div> 2124 2125 <div class="filter-lookup-wrapper checkbox" data-value="47"> 2126 <label data-value="47"> 2127 <input type="checkbox" 2128 class="product-filter attribute-filter" 2129 id="47" 2130 data-attribute-name="Size" 2131 data-attribute-value="47" 2132 style="width: 14px !important" 2133 > 2134 <span class="label-area">47</span> 2135 </label> 2136 </div> 2137 2138 </div> 2139 2140 </div> 2141 2142 2143 </div> 2144 </div> 2145</div> 2146</div> 2147 2148
2149<script> 2150frappe.ready(() => { 2151 $('.btn-prev, .btn-next').click((e) => { 2152 const $btn = $(e.target); 2153 $btn.prop('disabled', true); 2154 const start = $btn.data('start'); 2155 let query_params = frappe.utils.get_query_params(); 2156 query_params.start = start; 2157 let path = window.location.pathname + '?' + frappe.utils.get_url_from_dict(query_params); 2158 window.location.href = path; 2159 }); 2160 2161 // Install guest cart handler after a delay (to run after ProductListing binds) 2162 setTimeout(function() { 2163 // Guest cart helpers 2164 function getGuestCartId() { 2165 const match = document.cookie.match(/guest_cart_id=([^;]+)/); 2166 return match ? match[1] : null; 2167 } 2168 2169 function setGuestCartId(cartId) { 2170 if (cartId) { 2171 const expires = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toUTCString(); 2172 document.cookie = 'guest_cart_id=' + cartId + '; expires=' + expires + '; path=/; SameSite=Lax'; 2173 } 2174 } 2175 2176 function isGuest() { 2177 return document.body.getAttribute('frappe-session-status') === 'logged-out'; 2178 } 2179 2180 // Unbind existing handlers 2181 $('.page_content').off('click', '.btn-add-to-cart-list'); 2182 2183 // Rebind with guest support 2184 $('.page_content').on('click', '.btn-add-to-cart-list', function(e) { 2185 const $btn = $(this); 2186 2187 if ($btn.hasClass('go-to-cart-grid') || $btn.hasClass('go-to-cart')) { 2188 return; 2189 } 2190 2191 e.preventDefault(); 2192 e.stopPropagation(); 2193 $btn.prop('disabled', true); 2194 2195 const item_code = $btn.data('item-code'); 2196 2197 if (isGuest()) { 2198 frappe.call({ 2199 method: 'cslshoes_erp.api.guest_cart.update_guest_cart', 2200 args: { item_code: item_code, qty: 1, cart_id: getGuestCartId() }, 2201 callback: function(r) { 2202 $btn.prop('disabled', false); 2203 if (r.message && r.message.success !== false) { 2204 if (r.message.cart_token) setGuestCartId(r.message.cart_token); 2205 else if (r.message.cart_id) setGuestCartId(r.message.cart_id); 2206 2207 $btn.addClass('hidden'); 2208 $btn.parent().find('.go-to-cart-grid').removeClass('hidden'); 2209 2210 // BUG-W3 cart sub: route through canonical reader for 2211 // server-truth (auditor C3 â drop inline math for 2212 // consistency with logged-in path + wishlist pattern). 2213 if (window.updateCslCartCount) window.updateCslCartCount(); 2214 2215 frappe.show_alert({ message: __('Added to cart'), indicator: 'green' }, 3); 2216 } else if (r.message && r.message.error) { 2217 frappe.show_alert({ message: r.message.error, indicator: 'red' }, 5); 2218 } 2219 }, 2220 error: function() { $btn.prop('disabled', false); } 2221 }); 2222 } else { 2223 $btn.addClass('hidden'); 2224 $btn.parent().find('.go-to-cart-grid').removeClass('hidden'); 2225 // BUG-W3 cart sub: pass callback so we can re-fetch header count 2226 // after webshop's update_cart commits. Webshop's update_cart returns 2227 // the full quotation doc (no top-level cart_count), so re-fetch is 2228 // the only reliable path. Also re-enables $btn (defensive cleanup 2229 // â button is hidden via .hidden swap but re-enable covers the 2230 // failure path where the swap might not have happened). 2231 webshop.webshop.shopping_cart.update_cart({ 2232 item_code: item_code, qty: 1, 2233 callback: function() { 2234 $btn.prop('disabled', false); 2235 if (window.updateCslCartCount) window.updateCslCartCount(); 2236 } 2237 }); 2238 } 2239 }); 2240 2241 }, 200); 2242}); 2243</script>
2243 2244 2245</div> 2246 2247 <div class="page-footer"></div> 2248 </main> 2249 2250</div> 2251 2252</div> 2253 2254 2255 2256 </main><style> 2257/* CSL Shoes Shared Footer */ 2258.csl-footer { 2259 background: #111; 2260 color: #9ca3af; 2261 padding: 60px 0 30px; 2262 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; 2263} 2264.csl-footer .container { 2265 max-width: 1400px; 2266 margin: 0 auto; 2267 padding: 0 20px; 2268} 2269.csl-footer-grid { 2270 display: grid; 2271 grid-template-columns: 2fr 1fr 1fr 1fr 1.5fr; 2272 gap: 40px; 2273 margin-bottom: 40px; 2274} 2275.csl-footer-brand p { 2276 font-size: 13px; 2277 line-height: 1.6; 2278 margin-bottom: 20px; 2279 max-width: 280px; 2280} 2281.csl-footer-logo { 2282 font-size: 20px; 2283 font-weight: 700; 2284 color: #fff; 2285 margin-bottom: 12px; 2286} 2287.csl-footer-heading { 2288 font-size: 13px; 2289 font-weight: 600; 2290 color: #fff; 2291 text-transform: uppercase; 2292 letter-spacing: 0.5px; 2293 margin-bottom: 16px; 2294} 2295.csl-footer-links { list-style: none; padding: 0; margin: 0; } 2296.csl-footer-links li { margin-bottom: 10px; } 2297.csl-footer-links a { 2298 font-size: 13px; 2299 color: #9ca3af; 2300 text-decoration: none; 2301 transition: color 0.2s; 2302} 2303.csl-footer-links a:hover { color: #fff; } 2304.csl-footer-contact p { 2305 font-size: 13px; 2306 margin-bottom: 6px; 2307} 2308.csl-footer-contact a { color: #fff; text-decoration: none; } 2309.csl-footer-bottom { 2310 padding-top: 30px; 2311 border-top: 1px solid #374151; 2312 display: flex; 2313 align-items: center; 2314 justify-content: space-between; 2315} 2316.csl-footer-copyright { 2317 font-size: 12px; 2318 color: #6b7280; 2319} 2320.csl-footer-payments { display: flex; gap: 10px; align-items: center; } 2321.csl-footer-payments img { 2322 height: 24px; 2323 width: auto; 2324 opacity: 0.6; 2325 transition: opacity 0.2s; 2326} 2327.csl-footer-payments img:hover { opacity: 0.9; } 2328 2329/* Footer Responsive - Tablet */ 2330@media (max-width: 1024px) { 2331 .csl-footer-grid { grid-template-columns: repeat(2, 1fr); } 2332} 2333 2334/* Footer Responsive - Mobile */ 2335@media (max-width: 768px) { 2336 .csl-footer { padding: 40px 0 20px; } 2337 .csl-footer-grid { grid-template-columns: 1fr; gap: 24px; } 2338 .csl-footer-brand p { font-size: 12px; } 2339 .csl-footer-heading { font-size: 12px; margin-bottom: 12px; } 2340 .csl-footer-links a { font-size: 12px; } 2341 .csl-footer-bottom { flex-direction: column; gap: 12px; text-align: center; } 2342 .csl-footer-payments { flex-wrap: wrap; justify-content: center; } 2343} 2344</style> 2345 2346<footer class="csl-footer" data-nosnippet> 2347 <div class="container"> 2348 <div class="csl-footer-grid"> 2349 <div class="csl-footer-brand"> 2350 <p class="csl-footer-logo">CSL Shoes</p> 2351 <p>Premium leather footwear for the whole family since 2008. Genuine leather uppers, handcrafted quality, and exceptional customer service.</p> 2352 <p class="csl-footer-entity" style="font-size:12px;line-height:1.6;color:#9ca3af;margin-bottom:16px;max-width:280px;">Retail purchases on this website are sold by CSL Retail LLC. Wholesale purchases are sold by The CSL Group, Inc â both operate from 3 Alpine Court, Unit W156, Chestnut Ridge, NY 10977.</p> 2353 </div> 2354 <div> 2355 <div class="csl-footer-heading">Shop</div> 2356 <ul class="csl-footer-links"> 2357 <li><a href="/all-products">All Products</a></li> 2358 <li><a href="/closure-type/Lace-Up/items">Oxfords</a></li> 2359 <li><a href="/closure-type/Velcro/items">Boys' Shoes</a></li> 2360 <li><a href="/closure-type/Slip-On/items">Loafers</a></li> 2361 <li><a href="/all-products">New Arrivals</a></li> 2362 </ul> 2363 </div> 2364 <div> 2365 <div class="csl-footer-heading">Support</div> 2366 <ul class="csl-footer-links"> 2367 <li><a href="/size-guide">Size Guide</a></li> 2368 <li><a href="/shipping">Shipping Info</a></li> 2369 <li><a href="/returns">Returns</a></li> 2370 <li><a href="/guides/leather-shoe-care">Shoe Care</a></li> 2371 <li><a href="/help">FAQ</a></li> 2372 <li><a href="/blog">Blog</a></li> 2373 </ul> 2374 </div> 2375 <div> 2376 <div class="csl-footer-heading">Company</div> 2377 <ul class="csl-footer-links"> 2378 <li><a href="/about">About Us</a></li> 2379 <li><a href="/contact">Contact</a></li> 2380 <li><a href="/privacy-policy">Privacy Policy</a></li> 2381 <li><a href="/terms-of-service">Terms of Service</a></li> 2382 </ul> 2383 </div> 2384 <div class="csl-footer-contact"> 2385 <div class="csl-footer-heading">Contact Us</div> 2386 <p><a href="/cdn-cgi/l/email-protection#0960676f66496a7a657a61666c7a276a6664"><span class="__cf_email__" data-cfemail="30595e565f7053435c43585f55431e535f5d">[email protected]</span></a></p> 2387 <p>Mon - Fri: 9am - 6pm EST</p> 2388 </div> 2389 </div> 2390 <div class="csl-footer-bottom"> 2391 <p class="csl-footer-copyright">© 2026 CSL Shoes. All rights reserved.</p> 2392 <div class="csl-footer-payments"> 2393 <img src="/assets/cslshoes_erp/images/visa.svg" alt="Visa" width="40" height="24"> 2394 <img src="/assets/cslshoes_erp/images/mastercard.svg" alt="Mastercard" width="40" height="24"> 2395 <img src="/assets/cslshoes_erp/images/amex.svg" alt="American Express" width="40" height="24"> 2396 </div> 2397 </div> 2398 </div> 2399</footer> 2400 2401 <a href="https://wa.me/18456946700?text=Hi%2C%20I%20have%20a%20question%20about%20your%20shoes" 2402 target="_blank" rel="noopener" 2403 class="csl-whatsapp-widget" 2404 aria-label="Chat with us on WhatsApp" 2405 style="position:fixed;bottom:24px;right:24px;z-index:9998;width:56px;height:56px;background:#25D366;border-radius:50%;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 12px rgba(0,0,0,0.15);transition:transform 0.2s;" 2406 onmouseover="this.style.transform='scale(1.1)'" 2407 onmouseout="this.style.transform='scale(1)'"> 2408 <svg viewBox="0 0 24 24" width="28" height="28" fill="white"> 2409 <path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.
2409198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/> 2410 </svg> 2411 </a>
vendor: 110 bytes, lines 2411-2412
2411 2412 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
2412<script> 2413 frappe.boot = { 2414 "apps_data": { 2415 "apps": [], 2416 "default_path": "", 2417 "is_desk_apps": 1 2418 }, 2419 "assets_json": { 2420 "bank-reconciliation-tool.bundle.js": "/assets/erpnext/dist/js/bank-reconciliation-tool.bundle.3OD5XE4B.js", 2421 "billing.bundle.js": "/assets/frappe/dist/js/billing.bundle.XJXMQXLI.js", 2422 "bom_configurator.bundle.js": "/assets/erpnext/dist/js/bom_configurator.bundle.KVVOL5AV.js", 2423 "bootstrap-4-web.bundle.js": "/assets/frappe/dist/js/bootstrap-4-web.bundle.OGQ7JEDG.js", 2424 "build_events.bundle.js": "/assets/frappe/dist/js/build_events.bundle.BCX32TWL.js", 2425 "calendar.bundle.js": "/assets/frappe/dist/js/calendar.bundle.4A4YITIU.js", 2426 "controls.bundle.js": "/assets/frappe/dist/js/controls.bundle.GHTVO2AR.js", 2427 "csl-web.bundle.js": "/assets/cslshoes_erp/dist/js/csl-web.bundle.SBA57Y6F.js", 2428 "cslshoes_erp-web.bundle.js": "/assets/cslshoes_erp/dist/js/cslshoes_erp-web.bundle.VKBRYFDI.js", 2429 "data_import_tools.bundle.js": "/assets/frappe/dist/js/data_import_tools.bundle.AIMRIHAY.js", 2430 "desk.bundle.css": "/assets/frappe/dist/css/desk.bundle.E3JNXVFK.css", 2431 "desk.bundle.js": "/assets/frappe/dist/js/desk.bundle.LRVAENER.js", 2432 "dialog.bundle.js": "/assets/frappe/dist/js/dialog.bundle.4Y7AGZYX.js", 2433 "email.bundle.css": "/assets/frappe/dist/css/email.bundle.FRP6ZWO5.css", 2434 "erpnext-web.bundle.css": "/assets/erpnext/dist/css/erpnext-web.bundle.XAPV6OJR.css", 2435 "erpnext.bundle.css": "/assets/erpnext/dist/css/erpnext.bundle.U3ZULTHY.css", 2436 "erpnext.bundle.js": "/assets/erpnext/dist/js/erpnext.bundle.W4BKB7EY.js", 2437 "erpnext_email.bundle.css": "/assets/erpnext/dist/css/erpnext_email.bundle.QDPP6JFP.css", 2438 "file_uploader.bundle.js": "/assets/frappe/dist/js/file_uploader.bundle.NFWQ74RI.js", 2439 "form.bundle.js": "/assets/frappe/dist/js/form.bundle.V6TJPRRA.js", 2440 "form_builder.bundle.js": "/assets/frappe/dist/js/form_builder.bundle.TJDI53IC.js", 2441 "frappe-web.bundle.js": "/assets/frappe/dist/js/frappe-web.bundle.6AGRRLFL.js", 2442 "hierarchy-chart.bundle.js": "/assets/hrms/dist/js/hierarchy-chart.bundle.5E224PCR.js", 2443 "hrms.bundle.css": "/assets/hrms/dist/css/hrms.bundle.2Y752HAB.css", 2444 "hrms.bundle.js": "/assets/hrms/dist/js/hrms.bundle.QS2GRVNQ.js", 2445 "interview.bundle.js": "/assets/hrms/dist/js/interview.bundle.C7CDEMYA.js",
2446 "item-dashboard.bundle.js": "/assets/erpnext/dist/js/item-dashboard.bundle.7LUKZCYJ.js", 2447 "kanban_board.bundle.js": "/assets/frappe/dist/js/kanban_board.bundle.WBHS2NSO.js", 2448 "libs.bundle.js": "/assets/frappe/dist/js/libs.bundle.JEM3HUCP.js", 2449 "list.bundle.js": "/assets/frappe/dist/js/list.bundle.C5NWOGPL.js", 2450 "login.bundle.css": "/assets/frappe/dist/css/login.bundle.PUSGKFZL.css", 2451 "logtypes.bundle.js": "/assets/frappe/dist/js/logtypes.bundle.WKQH7KBM.js", 2452 "onboarding_tours.bundle.js": "/assets/frappe/dist/js/onboarding_tours.bundle.3QPQU5AO.js", 2453 "performance.bundle.js": "/assets/hrms/dist/js/performance.bundle.63UL5NS7.js", 2454 "photoswipe.bundle.js": "/assets/frappe/dist/js/photoswipe.bundle.YSXZQA64.js", 2455 "point-of-sale.bundle.js": "/assets/erpnext/dist/js/point-of-sale.bundle.QTZY4HXK.js", 2456 "print.bundle.css": "/assets/frappe/dist/css/print.bundle.TFESFRRQ.css", 2457 "print_format.bundle.css": "/assets/frappe/dist/css/print_format.bundle.G3JSEXTM.css", 2458 "print_format_builder.bundle.js": "/assets/frappe/dist/js/print_format_builder.bundle.EY2DZ4XK.js", 2459 "report.bundle.css": "/assets/frappe/dist/css/report.bundle.YRLG53MK.css", 2460 "report.bundle.js": "/assets/frappe/dist/js/report.bundle.YZUQRDTQ.js", 2461 "rtl_desk.bundle.css": "/assets/frappe/dist/css-rtl/desk.bundle.GTUX6NUS.css", 2462 "rtl_email.bundle.css": "/assets/frappe/dist/css-rtl/email.bundle.S6OLPJLO.css", 2463 "rtl_erpnext-web.bundle.css": "/assets/erpnext/dist/css-rtl/erpnext-web.bundle.MY3OHIQG.css", 2464 "rtl_erpnext.bundle.css": "/assets/erpnext/dist/css-rtl/erpnext.bundle.NFI4TDNU.css", 2465 "rtl_erpnext_email.bundle.css": "/assets/erpnext/dist/css-rtl/erpnext_email.bundle.4SUQQPOC.css", 2466 "rtl_hrms.bundle.css": "/assets/hrms/dist/css-rtl/hrms.bundle.2VFWZIH4.css", 2467 "rtl_login.bundle.css": "/assets/frappe/dist/css-rtl/login.bundle.LAUNAKDN.css", 2468 "rtl_print.bundle.css": "/assets/frappe/dist/css-rtl/print.bundle.46KW2M23.css", 2469 "rtl_print_format.bundle.css": "/assets/frappe/dist/css-rtl/print_format.bundle.WRCRSWVB.css", 2470 "rtl_report.bundle.css": "/assets/frappe/dist/css-rtl/report.bundle.J47TQ5QB.css", 2471 "rtl_web_form.bundle.css": "/assets/frappe/dist/css-rtl/web_form.bundle.V6TATNAO.css", 2472 "rtl_webshop-web.bundle.css": "/assets/webshop/dist/css-rtl/webshop-web.bundle.MXY3MF47.css", 2473 "rtl_website.bundle.css": "/assets/frappe/dist/css-rtl/website.bundle.UYAJRC2H.css", 2474 "sentry.bundle.js": "/assets/frappe/dist/js/sentry.bundle.AX44GVWW.js", 2475 "syntax_highlighting.bundle.js": "/assets/frappe/dist/js/syntax_highlighting.bundle.YHGNRCUE.js", 2476 "telemetry.bundle.js": "/assets/frappe/dist/js/telemetry.bundle.RXBBNH3H.js", 2477 "user_onboarding.bundle.js": "/assets/frappe/dist/js/user_onboarding.bundle.RGMWXG2C.js", 2478 "video_player.bundle.js": "/assets/frappe/dist/js/video_player.bundle.DUYYLSFO.js", 2479 "web.bundle.js": "/assets/webshop/dist/js/web.bundle.WLOGYSZO.js", 2480 "web_form.bundle.css": "/assets/frappe/dist/css/web_form.bundle.6KU4CLFY.css", 2481 "web_form.bundle.js": "/assets/frappe/dist/js/web_form.bundle.ALVCCXE4.js", 2482 "webshop-web.bundle.css": "/assets/webshop/dist/css/webshop-web.bundle.GQDT63VG.css", 2483 "website.bundle.css": "/assets/frappe/dist/css/website.bundle.GD6PKXQI.css", 2484 "workflow_builder.bundle.js": "/assets/frappe/dist/js/workflow_builder.bundle.O2QPXUEI.js" 2485 }, 2486 "is_fc_site": 0, 2487 "lang": "en-US", 2488 "sitename": "csl.local", 2489 "sysdefaults": { 2490 "currency": "USD", 2491 "date_format": "mm/dd/yyyy", 2492 "first_day_of_the_week": "Sunday", 2493 "float_precision": 3, 2494 "number_format": "#,###.##", 2495 "time_format": "HH:mm:ss" 2496 }, 2497 "time_zone": { 2498 "system": "America/New_York", 2499 "user": "America/New_York" 2500 } 2501} 2502 frappe.sys_defaults = frappe.boot.sysdefaults; 2503 </script>
2503 2504 2505
2505<script type="text/javascript" src="/assets/cslshoes_erp/dist/js/csl-web.bundle.SBA57Y6F.js"></script>
2505 2506 2507
2507<script type="text/javascript" src="/website_script.js" defer></script>
2507 2508
2508<script type="text/javascript" src="/assets/webshop/dist/js/web.bundle.WLOGYSZO.js" defer></script>
2508 2509
2509<script type="text/javascript" src="/assets/cslshoes_erp/dist/js/cslshoes_erp-web.bundle.VKBRYFDI.js" defer></script>
2509 2510
2510<script type="text/javascript" src="/assets/cslshoes_erp/js/csl-analytics.js?v=20260528a" defer></script>
2510 2511
2511<script type="text/javascript" src="/assets/cslshoes_erp/js/product_image_autoplay.js?v=20260613a" defer></script>
2511 2512
2512<script type="text/javascript" src="/assets/cslshoes_erp/js/compare.js" defer></script>
2512 2513
2513<script type="text/javascript" src="/assets/cslshoes_erp/js/tile_wishlist.js?v=20260517e" defer></script>
2513 2514
2514<script type="text/javascript" src="/assets/cslshoes_erp/js/all_products_patches.js?v=20260613a" defer></script>
2514 2515
2515<script type="text/javascript" src="/assets/cslshoes_erp/js/wishlist_page.js?v=20260517c" defer></script>
2515 2516
2516<script type="text/javascript" src="/assets/cslshoes_erp/js/wholesale_order_banner.js?v=20260520c" defer></script>
2516 2517
2517<script type="text/javascript" src="/assets/cslshoes_erp/js/sso_login_order.js?v=20260531b" defer></script>
2517 2518
2518<script>frappe.ready(() => { 2519 // Bounded polling guard: webshop bundle is defer-loaded, may not be ready 2520 // when frappe.ready fires on DOMContentLoaded. Without this, "webshop is 2521 // not defined" ReferenceError kills the whole init block intermittently. 2522 let retries = 0; 2523 const maxRetries = 100; // 100 * 50ms = 5s max wait (covers slow mobile cold cache) 2524 const initWhenReady = () => { 2525 if (typeof webshop !== 'undefined' && webshop.ProductView && webshop.webshop && webshop.webshop.wishlist) { 2526 // Patch webshop.ProductView to support search parameter from URL 2527 const originalGetQueryFilters = webshop.ProductView.prototype.get_query_filters; 2528 webshop.ProductView.prototype.get_query_filters = function() { 2529 const filters = originalGetQueryFilters.call(this); 2530 const params = frappe.utils.get_query_params(); 2531 if (params.search) { 2532 filters.search = params.search; 2533 } 2534 return filters; 2535 }; 2536 2537 class ProductListing { 2538 constructor() { 2539 let me = this; 2540 let is_item_group_page = $(".item-group-content").data("item-group"); 2541 this.item_group = is_item_group_page || null; 2542 2543 let view_type = localStorage.getItem("product_view") || "List View"; 2544 2545 // Render Product Views, Filters & Search 2546 new webshop.ProductView({ 2547 view_type: view_type, 2548 products_section: $('#product-listing'), 2549 item_group: me.item_group 2550 }); 2551 2552 this.bind_card_actions(); 2553 this.hideClassicoes(); 2554 } 2555 2556 bind_card_actions() { 2557 // Bind wishlist for all users 2558 webshop.webshop.wishlist.bind_wishlist_action(); 2559 // Cart handler is bound in index.html script block (supports both guests and logged-in) 2560 } 2561 2562 hideClassicoes() { 2563 // Hide Classicoes brand from filters 2564 function hide() { 2565 const checkboxes = document.querySelectorAll('.filter-block .form-check, .filter-block .checkbox'); 2566 checkboxes.forEach(function(div) { 2567 const text = div.textContent.trim(); 2568 if (text === 'Classicoes') { 2569 div.style.display = 'none'; 2570 } 2571 }); 2572 } 2573 2574 setTimeout(hide, 100); 2575 setTimeout(hide, 500); 2576 setTimeout(hide, 1000); 2577 setTimeout(hide, 2000); 2578 } 2579 } 2580 2581 new ProductListing(); 2582 } else if (retries++ < maxRetries) { 2583 setTimeout(initWhenReady, 50); 2584 } else { 2585 console.error('[all-products] webshop bundle did not load within 5s; ProductView could not initialize. Check that /assets/webshop/dist/js/web.bundle.*.js loaded successfully.'); 2586 } 2587 }; 2588 initWhenReady(); 2589}); 2590</script>
2590<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"02110bd8a9eb40e98c9fc92b32ecf849","r":1,"spa":2}' crossorigin="anonymous"></script>
2590 2591</body> 2592</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.