{"title":"Correas","description":"","products":[{"product_id":"tira-de-correa","title":"Tira de correa","description":"\u003cp\u003ePuedes armar tu correa!\u003c\/p\u003e\n\u003cp\u003eNuestra Correa Capri está compuesta de una manija redonda y una tira. Puedes elegir ambas partes de diferentes colores o combinarla. Es hecha en cuero colombiano premium y elaborada a mano por artesanos. Combina resistencia, diseño y comodidad para tus paseos diarios. Haz que cada salida sea especial con Capri.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eElige la misma talla que el collar de tu perro, el largo de la correa es el mismo, solo varia el ancho de la misma.\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eTira XXS-XS de 2 cm de ancho\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eTira S-L de 2,5 cm de ancho\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eEl largo de la tira es de 90 cm pero con la manija queda un total de 1.10 cm aproximadamente.\u003c\/strong\u003e\u003c\/p\u003e","brand":"Capri","offers":[{"title":"Marfil \/ XS","offer_id":59261514776657,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Marfil \/ S-L","offer_id":59261514809425,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Rosa \/ XS","offer_id":59261514940497,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Rosa \/ S-L","offer_id":59261514973265,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Fucsia \/ XS","offer_id":59261515104337,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Fucsia \/ S-L","offer_id":59261515137105,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Rojo \/ XS","offer_id":59261515268177,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Rojo \/ S-L","offer_id":59261515300945,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Naranja \/ XS","offer_id":59261515432017,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Naranja \/ S-L","offer_id":59261515464785,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Amarillo \/ XS","offer_id":59261515595857,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Amarillo \/ S-L","offer_id":59261515628625,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Verde Néon \/ XS","offer_id":59261515759697,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Verde Néon \/ S-L","offer_id":59261515792465,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Verde Limón \/ XS","offer_id":59261515923537,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Verde Limón \/ S-L","offer_id":59261515956305,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Verde Oscuro \/ XS","offer_id":59261516087377,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Verde Oscuro \/ S-L","offer_id":59261516120145,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Aguamarina \/ XS","offer_id":59261516251217,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Aguamarina \/ S-L","offer_id":59261516283985,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Azul Bebé \/ XS","offer_id":59261516415057,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Azul Bebé \/ S-L","offer_id":59261516447825,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Azul Océano \/ XS","offer_id":59261516578897,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Azul Océano \/ S-L","offer_id":59261516611665,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Azul Oscuro \/ XS","offer_id":59261516742737,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Azul Oscuro \/ S-L","offer_id":59261516775505,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Lila \/ XS","offer_id":59261516906577,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Lila \/ S-L","offer_id":59261516939345,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Uva \/ XS","offer_id":59261517070417,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Uva \/ S-L","offer_id":59261517103185,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Miel \/ XS","offer_id":59261517234257,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Miel \/ S-L","offer_id":59261517267025,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Café \/ XS","offer_id":59261517398097,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Café \/ S-L","offer_id":59261517430865,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Negro \/ XS","offer_id":59261517561937,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Negro \/ S-L","offer_id":59261517594705,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/7677\/7297\/files\/1T2.png?v=1776815515"},{"product_id":"manija-de-correa","title":"Manija de correa","description":"\u003cp\u003ePuedes armar tu correa!\u003c\/p\u003e\n\u003cp\u003eNuestra Correa Capri está compuesta de una manija redonda y una tira. Puedes elegir ambas partes de diferentes colores o combinarla. Es hecha en cuero colombiano premium y elaborada a mano por artesanos. Combina resistencia, diseño y comodidad para tus paseos diarios. Haz que cada salida sea especial con Capri.\u003c\/p\u003e","brand":"Capri","offers":[{"title":"Marfil","offer_id":59261518315601,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Rosa","offer_id":59261518381137,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Fucsia","offer_id":59261518446673,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Rojo","offer_id":59261518512209,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Naranja","offer_id":59261518577745,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Amarillo","offer_id":59261518643281,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Verde Néon","offer_id":59261518708817,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Verde Limón","offer_id":59261518774353,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Verde Oscuro","offer_id":59261518839889,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Aguamarina","offer_id":59261518905425,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Azul Bebé","offer_id":59261518970961,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Azul Océano","offer_id":59261519036497,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Azul Oscuro","offer_id":59261519102033,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Lila","offer_id":59261519167569,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Uva","offer_id":59261519233105,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Miel","offer_id":59261519298641,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Café","offer_id":59261519364177,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true},{"title":"Negro","offer_id":59261519429713,"sku":null,"price":49000.0,"currency_code":"COP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/7677\/7297\/files\/4M.png?v=1776815651"},{"product_id":"arma-tu-correa","title":"Arma tu correa","description":"\u003cp\u003eArma tu correa a tu gusto!\u003c\/p\u003e\n\u003cp\u003eElige la manija y la tira del color que quieras! Puedes elegir todo del mismo color o combinarlo a tu gusto.\u003c\/p\u003e\n\u003cp\u003eElige la misma talla del collar:\u003c\/p\u003e\n\u003cp\u003eMide la circunferencia del cuello de tu perro para encontrar su talla:\u003c\/p\u003e\n\u003cp\u003eXXS: 14-22 cm (\u003cmeta charset=\"utf-8\"\u003ePinscher, Chihuahua, Yorkie)\u003c\/p\u003e\n\u003cp\u003eXS: 22-30 cm (Shih Tzu)\u003c\/p\u003e\n\u003cp\u003eS: 30-38 cm (Bulldog Francés)\u003c\/p\u003e\n\u003cp\u003eM: 38-46 cm (Border Collie)\u003c\/p\u003e\n\u003cp\u003eL: 46-54 cm (Labrador, Golden)\u003c\/p\u003e","brand":"Fast Bundle","offers":[{"title":"Default Title","offer_id":59661908770897,"sku":"97f01011-aeb9-449f-954c-47ac59b7c650","price":5.0,"currency_code":"COP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/7677\/7297\/files\/Correa-lila-2.png?v=1775057445"},{"product_id":"correa-llavero","title":"CORREA + LLAVERO","description":"\u003cbody\u003e\n\n\n\u003cmeta charset=\"UTF-8\"\u003e\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n\u003ctitle\u003eArma tu Set — Capri Pets\u003c\/title\u003e\n\u003cstyle\u003e\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\n:root{\n  --navy:#1b2d4f;\n  --navy-mid:#2c4370;\n  --gold:#f5c842;\n  --gold-dark:#d4a820;\n  --cream:#faf8f4;\n  --cream2:#f2ede4;\n  --ink:#1a1a1a;\n  --muted:#6b6b6b;\n  --border:#e0dbd2;\n  --white:#fff;\n  --green:#2d7a4f;\n  --radius:10px;\n}\nbody{font-family:-apple-system,BlinkMacSystemFont,'Inter',sans-serif;background:transparent;color:var(--ink);-webkit-font-smoothing:antialiased;line-height:1.4;font-size:13px}\n\n\/* ── LAYOUT ── *\/\n.configurador{width:100%;padding:0}\n\n\/* ── PRODUCT ROW ── *\/\n.product-row{padding:10px 12px;background:var(--white);border:1.5px solid var(--border);border-radius:var(--radius);margin-bottom:8px;transition:border-color .2s}\n.product-row.done-row{border-color:#a3d9b8;background:#f8fdf9}\n\n\/* top: label + status *\/\n.row-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}\n.row-label{display:flex;align-items:center;gap:6px}\n.step-badge{width:20px;height:20px;border-radius:50%;background:var(--navy);color:var(--white);font-size:10px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}\n.row-title{font-size:12px;font-weight:700;color:var(--navy);line-height:1.2}\n.row-subtitle{font-size:10px;color:var(--muted)}\n.status-pill{display:inline-flex;align-items:center;gap:4px;border-radius:20px;padding:2px 8px;font-size:10px;font-weight:600;background:var(--cream2);border:1px solid var(--border);color:var(--muted);white-space:nowrap}\n.status-pill.done{background:#e8f5ee;border-color:#a3d9b8;color:var(--green)}\n.status-pill .dot{width:5px;height:5px;border-radius:50%;background:currentColor;flex-shrink:0}\n\n\/* bottom: swatches + sizes *\/\n.row-bottom{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.color-name{font-size:10px;color:var(--navy);font-weight:600;white-space:nowrap;flex-shrink:0}\n.row-divider{width:1px;height:20px;background:var(--border);flex-shrink:0}\n.size-guide-link{font-size:10px;color:var(--muted);text-decoration:underline;cursor:pointer;white-space:nowrap;flex-shrink:0}\n\n\/* ── COLOR SWATCHES ── *\/\n.swatches{display:flex;flex-wrap:wrap;gap:4px;max-width:260px}\n.swatch{width:18px;height:18px;border-radius:50%;cursor:pointer;border:2px solid transparent;transition:transform .1s;position:relative;flex-shrink:0}\n.swatch:hover{transform:scale(1.2)}\n.swatch.active{box-shadow:0 0 0 2px var(--white),0 0 0 3.5px var(--navy)}\n.swatch-tooltip{position:absolute;bottom:calc(100% + 4px);left:50%;transform:translateX(-50%);background:var(--ink);color:var(--white);font-size:10px;white-space:nowrap;padding:2px 6px;border-radius:4px;pointer-events:none;opacity:0;transition:opacity .1s;z-index:30}\n.swatch:hover .swatch-tooltip{opacity:1}\n\n\/* sizes *\/\n.sizes{display:flex;gap:4px;flex-wrap:wrap}\n.size-btn{padding:3px 8px;border:1.5px solid var(--border);border-radius:5px;background:var(--white);font-size:11px;font-weight:600;cursor:pointer;color:var(--ink);transition:all .1s;white-space:nowrap}\n.size-btn:hover{border-color:var(--navy);color:var(--navy)}\n.size-btn.active{background:var(--navy);color:var(--white);border-color:var(--navy)}\n\n\/* ── KIT CTA ── *\/\n.kit-cta{background:var(--gold);border-radius:var(--radius);padding:12px 14px;margin-top:4px}\n.kit-summary{display:flex;align-items:center;gap:6px;margin-bottom:10px;flex-wrap:wrap}\n.kit-summary-item{background:rgba(0,0,0,.09);border-radius:6px;padding:5px 10px;text-align:center;flex:1;min-width:60px}\n.ks-label{display:block;font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:rgba(0,0,0,.4);margin-bottom:1px}\n.ks-val{display:block;font-size:11px;font-weight:700;color:var(--navy)}\n.ks-val.pending{color:rgba(0,0,0,.25);font-weight:400;font-style:italic}\n.ks-sep{font-size:16px;color:rgba(0,0,0,.2);flex-shrink:0}\n.kit-buttons{display:grid;grid-template-columns:1fr 1fr;gap:8px}\n.btn-kit{width:100%;padding:13px 14px;border:none;border-radius:7px;font-weight:800;font-size:15px;cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center;gap:6px}\n.btn-cart{background:var(--white);color:var(--ink)}\n.btn-cart:hover:not(:disabled){background:#f0f0f0}\n.btn-buynow{background:var(--navy);color:var(--white);font-size:17px}\n.btn-buynow:hover:not(:disabled){background:var(--navy-mid)}\n.btn-kit:disabled{cursor:not-allowed}\n.btn-kit.success{background:#2d7a4f !important;color:var(--white) !important}\n.kit-note{text-align:center;font-size:10px;color:rgba(0,0,0,.45);margin-top:8px;font-weight:500}\n\n\/* ── MODAL ── *\/\n.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:100;display:flex;align-items:center;justify-content:center;padding:20px;opacity:0;pointer-events:none;transition:opacity .2s}\n.modal-overlay.open{opacity:1;pointer-events:all}\n.modal{background:var(--white);border-radius:var(--radius);padding:22px;max-width:380px;width:100%;position:relative}\n.modal h3{font-size:1rem;font-weight:700;color:var(--navy);margin-bottom:12px}\n.modal table{width:100%;border-collapse:collapse;font-size:12px}\n.modal table th{background:var(--navy);color:var(--white);padding:6px 10px;text-align:left;font-weight:600}\n.modal table td{padding:5px 10px;border-bottom:1px solid var(--border)}\n.modal table tr:last-child td{border-bottom:none}\n.modal-close{position:absolute;top:10px;right:12px;background:none;border:none;font-size:18px;cursor:pointer;color:var(--muted)}\n\n.stock-note{font-size:11px;margin-top:5px;min-height:14px}\n\n\/* ── LLAVERO SEARCH ── *\/\n.llavero-selectors{flex-direction:column;align-items:flex-start;gap:6px}\n.llavero-search-wrap{position:relative;width:100%}\n.llavero-input{width:100%;padding:7px 30px 7px 10px;border:1.5px solid var(--border);border-radius:6px;font-size:12px;color:var(--ink);background:var(--white);outline:none}\n.llavero-input:focus{border-color:var(--navy)}\n.llavero-input-clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:none;border:none;cursor:pointer;color:var(--muted);font-size:14px;display:none;line-height:1}\n.llavero-dropdown{position:absolute;top:calc(100% + 3px);left:0;right:0;background:var(--white);border:1.5px solid var(--navy);border-radius:6px;max-height:180px;overflow-y:auto;z-index:50;display:none;box-shadow:0 4px 12px rgba(0,0,0,.12)}\n.llavero-dropdown.open{display:block}\n.llavero-option{padding:7px 10px;font-size:12px;cursor:pointer;color:var(--ink);display:flex;justify-content:space-between;align-items:center}\n.llavero-option:hover,.llavero-option.highlighted{background:var(--cream2)}\n.llavero-option.no-stock{color:#bbb}\n.llavero-option .opt-stock{font-size:10px;color:#e67e22;font-weight:600}\n.llavero-option.no-stock .opt-stock{color:#ccc}\n.llavero-selected-raza{font-size:11px;font-weight:700;color:var(--navy);margin-bottom:4px}\n.llavero-variant-wrap{width:100%}\n.llavero-variant-btns{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px}\n.llavero-variant-btn{padding:4px 10px;border:1.5px solid var(--border);border-radius:5px;background:var(--white);font-size:11px;font-weight:600;cursor:pointer;color:var(--ink);transition:all .1s}\n.llavero-variant-btn:hover{border-color:var(--navy);color:var(--navy)}\n.llavero-variant-btn.active{background:var(--navy);color:var(--white);border-color:var(--navy)}\n.llavero-variant-btn.no-stock{opacity:.4;cursor:not-allowed;text-decoration:line-through}\n\n@media(max-width:500px){\n  .kit-buttons{grid-template-columns:1fr}\n  .swatches{max-width:100%}\n}\n\u003c\/style\u003e\n\n\n\n\u003cdiv class=\"configurador\"\u003e\n\n  \u003c!-- TIRA ROW --\u003e\n  \u003cdiv class=\"product-row\" id=\"card-tira\"\u003e\n    \u003cdiv class=\"row-top\"\u003e\n      \u003cdiv class=\"row-label\"\u003e\n        \u003cdiv class=\"step-badge\"\u003e1\u003c\/div\u003e\n        \u003cdiv class=\"row-title\"\u003eTira\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"row-bottom\"\u003e\n      \u003cdiv class=\"swatches\" id=\"swatches-tira\"\u003e\u003c\/div\u003e\n      \u003cspan class=\"color-name\" id=\"color-label-tira\"\u003e\u003c\/span\u003e\n      \u003cdiv class=\"row-divider\"\u003e\u003c\/div\u003e\n      \u003cdiv class=\"sizes\" id=\"sizes-tira\"\u003e\n        \u003cbutton class=\"size-btn\" data-size=\"XS\" onclick=\"selectSize('tira','XS',this)\"\u003eXS\u003c\/button\u003e\n        \u003cbutton class=\"size-btn\" data-size=\"S-L\" onclick=\"selectSize('tira','S-L',this)\"\u003eS-L\u003c\/button\u003e\n      \u003c\/div\u003e\n      \u003cspan class=\"size-guide-link\" onclick=\"openModal('tira')\"\u003eGuía →\u003c\/span\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"stock-note\" id=\"stock-note-tira\"\u003e\u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- MANIJA ROW --\u003e\n  \u003cdiv class=\"product-row\" id=\"card-manija\"\u003e\n    \u003cdiv class=\"row-top\"\u003e\n      \u003cdiv class=\"row-label\"\u003e\n        \u003cdiv class=\"step-badge\"\u003e2\u003c\/div\u003e\n        \u003cdiv class=\"row-title\"\u003eManija\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"row-bottom\"\u003e\n      \u003cdiv class=\"swatches\" id=\"swatches-manija\"\u003e\u003c\/div\u003e\n      \u003cspan class=\"color-name\" id=\"color-label-manija\"\u003e\u003c\/span\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"stock-note\" id=\"stock-note-manija\"\u003e\u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- LLAVERO ROW --\u003e\n  \u003cdiv class=\"product-row\" id=\"card-llavero\"\u003e\n    \u003cdiv class=\"row-top\"\u003e\n      \u003cdiv class=\"row-label\"\u003e\n        \u003cdiv class=\"step-badge\"\u003e3\u003c\/div\u003e\n        \u003cdiv class=\"row-title\"\u003eLlavero\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"row-bottom llavero-selectors\"\u003e\n      \u003cdiv class=\"llavero-search-wrap\"\u003e\n        \u003cinput class=\"llavero-input\" id=\"llavero-input\" type=\"text\" placeholder=\"Escribe la raza...\" autocomplete=\"off\" oninput=\"onLlaveroInput()\" onfocus=\"onLlaveroFocus()\" onkeydown=\"onLlaveroKey(event)\"\u003e\n        \u003cbutton class=\"llavero-input-clear\" id=\"llavero-clear\" onclick=\"clearLlavero()\"\u003e✕\u003c\/button\u003e\n        \u003cdiv class=\"llavero-dropdown\" id=\"llavero-dropdown\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"llavero-variant-wrap\" id=\"llavero-variant-wrap\" style=\"display:none\"\u003e\n        \u003cdiv class=\"llavero-selected-raza\" id=\"llavero-selected-label\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"llavero-variant-btns\" id=\"llavero-variant-btns\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"stock-note\" id=\"stock-note-llavero\"\u003e\u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- KIT CTA --\u003e\n  \u003cdiv class=\"kit-cta\"\u003e\n    \u003cdiv class=\"kit-summary\"\u003e\n      \u003cdiv class=\"kit-summary-item\"\u003e\n        \u003cspan class=\"ks-label\"\u003eTira\u003c\/span\u003e\n        \u003cspan class=\"ks-val pending\" id=\"ksv-tira\"\u003e—\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"ks-sep\"\u003e+\u003c\/div\u003e\n      \u003cdiv class=\"kit-summary-item\"\u003e\n        \u003cspan class=\"ks-label\"\u003eManija\u003c\/span\u003e\n        \u003cspan class=\"ks-val pending\" id=\"ksv-manija\"\u003e—\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"ks-sep\"\u003e+\u003c\/div\u003e\n      \u003cdiv class=\"kit-summary-item\"\u003e\n        \u003cspan class=\"ks-label\"\u003eLlavero\u003c\/span\u003e\n        \u003cspan class=\"ks-val pending\" id=\"ksv-llavero\"\u003e—\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"kit-buttons\"\u003e\n      \u003cbutton class=\"btn-kit btn-cart\" id=\"btn-kit-cart\" onclick=\"kitAction('cart')\" disabled\u003e\n        \u003csvg width=\"15\" height=\"15\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\u003e\u003ccircle cx=\"9\" cy=\"21\" r=\"1\"\u003e\u003c\/circle\u003e\u003ccircle cx=\"20\" cy=\"21\" r=\"1\"\u003e\u003c\/circle\u003e\u003cpath d=\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n        Añadir al carrito\n      \u003c\/button\u003e\n      \u003cbutton class=\"btn-kit btn-buynow\" id=\"btn-kit-buy\" onclick=\"kitAction('buy')\" disabled\u003e\n        \u003csvg width=\"15\" height=\"15\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\u003e\u003cpath d=\"M5 12h14M12 5l7 7-7 7\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n        Comprar ahora\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n    \u003cp class=\"kit-note\" id=\"kit-note\"\u003eSelecciona color y talla en los 3 productos para continuar\u003c\/p\u003e\n  \u003c\/div\u003e\n\n\u003c\/div\u003e\n\u003c!-- \/configurador --\u003e\n\n\u003cscript\u003e\n\/\/ ─── DATA ───────────────────────────────────────────────────────────\nconst COLORS = [\n  {name:'Marfil',       hex:'#F0EAD6'},\n  {name:'Rosa',         hex:'#F2A7C3'},\n  {name:'Fucsia',       hex:'#E5097F'},\n  {name:'Rojo',         hex:'#C0111F'},\n  {name:'Naranja',      hex:'#F37021'},\n  {name:'Amarillo',     hex:'#F5C800'},\n  {name:'Verde Néon',   hex:'#57C84D'},\n  {name:'Verde Limón',  hex:'#A8C737'},\n  {name:'Verde Oscuro', hex:'#2E5E2E'},\n  {name:'Aguamarina',   hex:'#00B5AD'},\n  {name:'Azul Bebé',    hex:'#7EC8E3'},\n  {name:'Azul Océano',  hex:'#1B75BB'},\n  {name:'Azul Oscuro',  hex:'#1B2D4F'},\n  {name:'Lila',         hex:'#B39DDB'},\n  {name:'Uva',          hex:'#6A1B9A'},\n  {name:'Miel',         hex:'#C07000'},\n  {name:'Café',         hex:'#5D3A1A'},\n  {name:'Negro',        hex:'#1A1A1A'},\n];\n\n\/\/ Collar variants: [color][talla] → variantId (numeric)\nconst COLLAR_VARIANTS = {\n  'Marfil':       {XXS:'59261505929297',XS:'59261509599313',S:'59261509632081',M:'59261509664849',L:'59261509697617'},\n  'Rosa':         {XXS:'59261505962065',XS:'59261509730385',S:'59261509763153',M:'59261509795921',L:'59261509828689'},\n  'Fucsia':       {XXS:'59261505994833',XS:'59261509861457',S:'59261509894225',M:'59261509926993',L:'59261509959761'},\n  'Rojo':         {XXS:'59261506027601',XS:'59261509992529',S:'59261510025297',M:'59261510058065',L:'59261510090833'},\n  'Naranja':      {XXS:'59261506060369',XS:'59261510123601',S:'59261510156369',M:'59261510189137',L:'59261510221905'},\n  'Amarillo':     {XXS:'59261506093137',XS:'59261510254673',S:'59261510287441',M:'59261510320209',L:'59261510352977'},\n  'Verde Néon':   {XXS:'59261506125905',XS:'59261510385745',S:'59261510418513',M:'59261510451281',L:'59261510484049'},\n  'Verde Limón':  {XXS:'59261506158673',XS:'59261510516817',S:'59261510549585',M:'59261510582353',L:'59261510615121'},\n  'Verde Oscuro': {XXS:'59261506191441',XS:'59261510647889',S:'59261510680657',M:'59261510713425',L:'59261510746193'},\n  'Aguamarina':   {XXS:'59261506224209',XS:'59261510778961',S:'59261510811729',M:'59261510844497',L:'59261510877265'},\n  'Azul Bebé':    {XXS:'59261506256977',XS:'59261510910033',S:'59261510942801',M:'59261510975569',L:'59261511008337'},\n  'Azul Océano':  {XXS:'59261506289745',XS:'59261511041105',S:'59261511073873',M:'59261511106641',L:'59261511139409'},\n  'Azul Oscuro':  {XXS:'59261506322513',XS:'59261511172177',S:'59261511204945',M:'59261511237713',L:'59261511270481'},\n  'Lila':         {XXS:'59261506355281',XS:'59261511303249',S:'59261511336017',M:'59261511368785',L:'59261511401553'},\n  'Uva':          {XXS:'59261506388049',XS:'59261511434321',S:'59261511467089',M:'59261511499857',L:'59261511532625'},\n  'Miel':         {XXS:'59261506420817',XS:'59261511565393',S:'59261511598161',M:'59261511630929',L:'59261511663697'},\n  'Café':         {XXS:'59261506453585',XS:'59261511696465',S:'59261511729233',M:'59261511762001',L:'59261511794769'},\n  'Negro':        {XXS:'59261506486353',XS:'59261511827537',S:'59261511860305',M:'59261511893073',L:'59261511925841'},\n};\n\n\/\/ Tira variants: [color][talla] → variantId\nconst TIRA_VARIANTS = {\n  'Marfil':       {XS:'59261514776657','S-L':'59261514809425'},\n  'Rosa':         {XS:'59261514940497','S-L':'59261514973265'},\n  'Fucsia':       {XS:'59261515104337','S-L':'59261515137105'},\n  'Rojo':         {XS:'59261515268177','S-L':'59261515300945'},\n  'Naranja':      {XS:'59261515432017','S-L':'59261515464785'},\n  'Amarillo':     {XS:'59261515595857','S-L':'59261515628625'},\n  'Verde Néon':   {XS:'59261515759697','S-L':'59261515792465'},\n  'Verde Limón':  {XS:'59261515923537','S-L':'59261515956305'},\n  'Verde Oscuro': {XS:'59261516087377','S-L':'59261516120145'},\n  'Aguamarina':   {XS:'59261516251217','S-L':'59261516283985'},\n  'Azul Bebé':    {XS:'59261516415057','S-L':'59261516447825'},\n  'Azul Océano':  {XS:'59261516578897','S-L':'59261516611665'},\n  'Azul Oscuro':  {XS:'59261516742737','S-L':'59261516775505'},\n  'Lila':         {XS:'59261516906577','S-L':'59261516939345'},\n  'Uva':          {XS:'59261517070417','S-L':'59261517103185'},\n  'Miel':         {XS:'59261517234257','S-L':'59261517267025'},\n  'Café':         {XS:'59261517398097','S-L':'59261517430865'},\n  'Negro':        {XS:'59261517561937','S-L':'59261517594705'},\n};\n\n\/\/ Manija variants: [color] → variantId (sin talla)\nconst MANIJA_VARIANTS = {\n  'Marfil':       '59261518315601',\n  'Rosa':         '59261518381137',\n  'Fucsia':       '59261518446673',\n  'Rojo':         '59261518512209',\n  'Naranja':      '59261518577745',\n  'Amarillo':     '59261518643281',\n  'Verde Néon':   '59261518708817',\n  'Verde Limón':  '59261518774353',\n  'Verde Oscuro': '59261518839889',\n  'Aguamarina':   '59261518905425',\n  'Azul Bebé':    '59261518970961',\n  'Azul Océano':  '59261519036497',\n  'Azul Oscuro':  '59261519102033',\n  'Lila':         '59261519167569',\n  'Uva':          '59261519233105',\n  'Miel':         '59261519298641',\n  'Café':         '59261519364177',\n  'Negro':        '59261519429713',\n};\n\n\/\/ Inventory: 0 = sin stock\nconst COLLAR_INV = {\n  'Marfil':       {XXS:5,XS:5,S:5,M:5,L:5},\n  'Rosa':         {XXS:5,XS:5,S:5,M:5,L:5},\n  'Fucsia':       {XXS:5,XS:5,S:5,M:5,L:5},\n  'Rojo':         {XXS:5,XS:5,S:5,M:5,L:5},\n  'Naranja':      {XXS:5,XS:5,S:5,M:5,L:5},\n  'Amarillo':     {XXS:5,XS:5,S:5,M:5,L:5},\n  'Verde Néon':   {XXS:5,XS:5,S:5,M:5,L:5},\n  'Verde Limón':  {XXS:5,XS:5,S:5,M:5,L:5},\n  'Verde Oscuro': {XXS:5,XS:5,S:5,M:5,L:5},\n  'Aguamarina':   {XXS:5,XS:5,S:5,M:5,L:5},\n  'Azul Bebé':    {XXS:1,XS:2,S:3,M:2,L:2},\n  'Azul Océano':  {XXS:2,XS:4,S:8,M:11,L:5},\n  'Azul Oscuro':  {XXS:1,XS:2,S:4,M:3,L:3},\n  'Lila':         {XXS:2,XS:5,S:1,M:1,L:1},\n  'Uva':          {XXS:1,XS:2,S:1,M:1,L:2},\n  'Miel':         {XXS:0,XS:3,S:3,M:4,L:3},\n  'Café':         {XXS:2,XS:3,S:2,M:4,L:3},\n  'Negro':        {XXS:1,XS:3,S:9,M:9,L:2},\n};\nconst TIRA_INV = {\n  'Marfil':{XS:2,'S-L':5},'Rosa':{XS:3,'S-L':10},'Fucsia':{XS:4,'S-L':11},\n  'Rojo':{XS:2,'S-L':5},'Naranja':{XS:2,'S-L':4},'Amarillo':{XS:1,'S-L':5},\n  'Verde Néon':{XS:1,'S-L':4},'Verde Limón':{XS:2,'S-L':5},'Verde Oscuro':{XS:2,'S-L':4},\n  'Aguamarina':{XS:3,'S-L':10},'Azul Bebé':{XS:1,'S-L':5},'Azul Océano':{XS:3,'S-L':5},\n  'Azul Oscuro':{XS:2,'S-L':5},'Lila':{XS:2,'S-L':5},'Uva':{XS:2,'S-L':5},\n  'Miel':{XS:2,'S-L':4},'Café':{XS:2,'S-L':5},'Negro':{XS:3,'S-L':11},\n};\nconst MANIJA_INV = {\n  'Marfil':5,'Rosa':8,'Fucsia':8,'Rojo':5,'Naranja':3,'Amarillo':2,\n  'Verde Néon':4,'Verde Limón':5,'Verde Oscuro':2,'Aguamarina':9,\n  'Azul Bebé':2,'Azul Océano':1,'Azul Oscuro':2,'Lila':4,'Uva':5,\n  'Miel':2,'Café':5,'Negro':9,\n};\n\n\/\/ ─── LLAVERO DATA ────────────────────────────────────────────────────\nconst LLAVEROS = [\n  {raza:'Airdale Terrier',      variants:[{title:'Default',id:'42566575816785',inv:3}]},\n  {raza:'Akita Americano',      variants:[{title:'Default',id:'42566575849553',inv:2}]},\n  {raza:'American Bully',       variants:[{title:'Gris',id:'58170622869585',inv:1},{title:'Beige',id:'58291086098513',inv:5}]},\n  {raza:'Basset Hound',         variants:[{title:'Default',id:'42566575915089',inv:2}]},\n  {raza:'Beagle',               variants:[{title:'Default',id:'42568245280849',inv:3}]},\n  {raza:'Bernés',               variants:[{title:'Default',id:'42566575947857',inv:10}]},\n  {raza:'Border Collie',        variants:[{title:'Negro',id:'42568452210769',inv:3},{title:'Café',id:'42568452243537',inv:5},{title:'Merle',id:'42568452276305',inv:3}]},\n  {raza:'Boston Terrier',       variants:[{title:'Negro',id:'59832601149521',inv:2},{title:'Café',id:'59832601182289',inv:3}]},\n  {raza:'Boxer',                variants:[{title:'Default',id:'42566576046161',inv:0}]},\n  {raza:'Bull Terrier',         variants:[{title:'Default',id:'42877351493713',inv:2}]},\n  {raza:'Bulldog Inglés',       variants:[{title:'Blanco',id:'58170570506321',inv:0},{title:'Café',id:'58170570539089',inv:3}]},\n  {raza:'Bulldog Francés',      variants:[{title:'Beige',id:'58291077087313',inv:15},{title:'Gris',id:'58291077120081',inv:3},{title:'Negro',id:'42568450441297',inv:9}]},\n  {raza:'Cavalier King Charles', variants:[{title:'Default',id:'42566576668753',inv:0}]},\n  {raza:'Chihuahua',            variants:[{title:'Beige',id:'58291092881489',inv:9}]},\n  {raza:'Chihuahua Pelo Largo', variants:[{title:'Default',id:'42566576242769',inv:0}]},\n  {raza:'Chow Chow',            variants:[{title:'Default',id:'42877369352273',inv:2}]},\n  {raza:'Cocker',               variants:[{title:'Dorado',id:'59261621993553',inv:4},{title:'Negro',id:'59261622026321',inv:6}]},\n  {raza:'Collie \/ Shetland',    variants:[{title:'Default',id:'42566577225809',inv:3}]},\n  {raza:'Corgi',                variants:[{title:'Default',id:'42566576275537',inv:2}]},\n  {raza:'Dachshund \/ Salchicha',variants:[{title:'Bronce Pelo Corto',id:'42568438841425',inv:3},{title:'Negro Pelo Corto',id:'42568438874193',inv:6},{title:'Gris Pelo Corto',id:'59394533326929',inv:2}]},\n  {raza:'Dalmata',              variants:[{title:'Default',id:'42566576308305',inv:4}]},\n  {raza:'Doberman',             variants:[{title:'Orejas levantadas Negro',id:'59394537586769',inv:2},{title:'Orejas levantadas Café',id:'59394537619537',inv:5}]},\n  {raza:'Doodle',               variants:[{title:'Sable',id:'58170626277457',inv:2}]},\n  {raza:'Fox Terrier \/ Jack Russell',variants:[{title:'Default',id:'42566576472145',inv:1}]},\n  {raza:'French Poodle \/ Caniche',variants:[{title:'Blanco',id:'42568430288977',inv:24},{title:'Gris',id:'42568430387281',inv:6},{title:'Negro',id:'42568430420049',inv:9}]},\n  {raza:'Ganadero Australiano', variants:[{title:'Default',id:'42566576504913',inv:4}]},\n  {raza:'Gato Birmano',         variants:[{title:'Default',id:'42843405647953',inv:8}]},\n  {raza:'Gato atigrado',        variants:[{title:'Gris',id:'59261616554065',inv:3}]},\n  {raza:'Gato pelo corto',      variants:[{title:'Blanco',id:'42877286875217',inv:9},{title:'Gris',id:'42877286842449',inv:2},{title:'Negro',id:'42877286776913',inv:5}]},\n  {raza:'Gato pelo largo',      variants:[{title:'Blanco',id:'42877291790417',inv:2},{title:'Beige',id:'58291089473617',inv:2},{title:'Gris',id:'42877291757649',inv:2}]},\n  {raza:'Golden Retriever',     variants:[{title:'Dorado',id:'59394580447313',inv:4},{title:'Beige',id:'59394580480081',inv:6},{title:'Blanco',id:'42568435400785',inv:1}]},\n  {raza:'Gran Danés',           variants:[{title:'Sable',id:'58291089571921',inv:2}]},\n  {raza:'Husky Siberiano',      variants:[{title:'Gris',id:'42877293232209',inv:14},{title:'Café',id:'42877293297745',inv:6},{title:'Negro',id:'42877293330513',inv:9}]},\n  {raza:'Labrador',             variants:[{title:'Beige',id:'58291089702993',inv:20},{title:'Café',id:'42568433500241',inv:5},{title:'Negro',id:'42568433533009',inv:2}]},\n  {raza:'Maltés',               variants:[{title:'Default',id:'42566576734289',inv:3}]},\n  {raza:'Mastiff \/ Bullmastiff',variants:[{title:'Default',id:'42877354836049',inv:2}]},\n  {raza:'Ovejero Bobtail',      variants:[{title:'Default',id:'42566576767057',inv:1}]},\n  {raza:'Pastor Alemán',        variants:[{title:'Default',id:'42566576799825',inv:1}]},\n  {raza:'Pastor Belga',         variants:[{title:'Negro',id:'59832598364241',inv:2}]},\n  {raza:'Pinscher',             variants:[{title:'Negro',id:'58291085279313',inv:9},{title:'Bronce',id:'59261632905297',inv:2}]},\n  {raza:'Pointer Inglés',       variants:[{title:'Café',id:'59261632938065',inv:9},{title:'Negro',id:'59261632970833',inv:1}]},\n  {raza:'Pomerania',            variants:[{title:'Dorado',id:'59394591555665',inv:5},{title:'Beige',id:'58291090194513',inv:4},{title:'Blanco',id:'59261607346257',inv:2},{title:'Negro',id:'42568432123985',inv:8}]},\n  {raza:'Pug',                  variants:[{title:'Default',id:'42566577061969',inv:29}]},\n  {raza:'Rottweiler',           variants:[{title:'Default',id:'42566577127505',inv:1}]},\n  {raza:'Samoyedo',             variants:[{title:'Default',id:'42566577193041',inv:23}]},\n  {raza:'San Bernardo',         variants:[{title:'Default',id:'42566577160273',inv:2}]},\n  {raza:'Schnauzer',            variants:[{title:'Default',id:'42877303521361',inv:6}]},\n  {raza:'Setter Irlandés',      variants:[{title:'Default',id:'42566576635985',inv:6}]},\n  {raza:'Shih Tzu',             variants:[{title:'Beige',id:'58291077251153',inv:4},{title:'Café',id:'42568427798609',inv:3},{title:'Negro',id:'42568427831377',inv:9}]},\n  {raza:'Springer Spaniel',     variants:[{title:'Default',id:'42566577324113',inv:3}]},\n  {raza:'Weimaraner',           variants:[{title:'Default',id:'42566577356881',inv:7}]},\n  {raza:'Westie',               variants:[{title:'Default',id:'42566577389649',inv:5}]},\n  {raza:'Yorkie',               variants:[{title:'Beige',id:'59037199794257',inv:17},{title:'Gris',id:'59261599154257',inv:7}]},\n];\n\nconst stateLlavero = {variantId:null, raza:null, variant:null, inv:0};\nlet llaveroHighlight = -1;\n\nfunction initLlaveroSelect() {\n  \/\/ No dropdown to init — search is dynamic\n  document.addEventListener('click', e =\u003e {\n    if (!e.target.closest('.llavero-search-wrap')) closeLlaveroDropdown();\n  });\n}\n\n\/\/ ─── FUZZY SEARCH ────────────────────────────────────────────────────\nfunction normalize(str) {\n  return str.toLowerCase()\n    .normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '') \/\/ quitar tildes\n    .replace(\/[^a-z0-9\\s]\/g, ''); \/\/ solo alfanumérico\n}\n\nfunction levenshtein(a, b) {\n  const m = a.length, n = b.length;\n  const dp = Array.from({length:m+1}, (_,i) =\u003e Array.from({length:n+1}, (_,j) =\u003e j===0?i:0));\n  for (let j=1;j\u003c=n;j++) dp[0][j]=j;\n  for (let i=1;i\u003c=m;i++) for (let j=1;j\u003c=n;j++)\n    dp[i][j] = a[i-1]===b[j-1] ? dp[i-1][j-1] : 1+Math.min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]);\n  return dp[m][n];\n}\n\nfunction fuzzyMatch(query, target) {\n  const q = normalize(query);\n  const t = normalize(target);\n  \/\/ Coincidencia exacta parcial primero\n  if (t.includes(q)) return {score: 0, match: true};\n  \/\/ Buscar por palabras individuales\n  const words = q.split(\/\\s+\/).filter(w=\u003ew.length\u003e1);\n  for (const word of words) {\n    if (t.includes(word)) return {score: 1, match: true};\n  }\n  \/\/ Distancia de Levenshtein por fragmento\n  const tWords = t.split(\/\\s+\/);\n  let minDist = Infinity;\n  for (const qw of words.length ? words : [q]) {\n    for (const tw of tWords) {\n      if (qw.length \u003c 2) continue;\n      const maxAllowed = Math.floor(Math.max(qw.length, tw.length) * 0.4);\n      const dist = levenshtein(qw, tw);\n      if (dist \u003c= maxAllowed) minDist = Math.min(minDist, dist);\n    }\n  }\n  if (minDist \u003c Infinity) return {score: minDist + 2, match: true};\n  return {score: Infinity, match: false};\n}\n\nfunction onLlaveroInput() {\n  const val = document.getElementById('llavero-input').value.trim();\n  document.getElementById('llavero-clear').style.display = val ? 'block' : 'none';\n  resetLlaveroVariants();\n  if (val.length \u003c 1) { closeLlaveroDropdown(); return; }\n  const results = LLAVEROS\n    .map(l =\u003e ({...l, fuzzy: fuzzyMatch(val, l.raza)}))\n    .filter(l =\u003e l.fuzzy.match)\n    .sort((a,b) =\u003e a.fuzzy.score - b.fuzzy.score)\n    .slice(0, 10);\n  renderLlaveroDropdown(results);\n}\n\nfunction onLlaveroFocus() {\n  const val = document.getElementById('llavero-input').value.trim();\n  if (val.length \u003e= 1) onLlaveroInput();\n}\n\nfunction renderLlaveroDropdown(matches) {\n  const dd = document.getElementById('llavero-dropdown');\n  llaveroHighlight = -1;\n  if (!matches.length) {\n    dd.innerHTML = '\u003cdiv class=\"llavero-option\" style=\"color:var(--muted)\"\u003eSin resultados\u003c\/div\u003e';\n    dd.classList.add('open'); return;\n  }\n  dd.innerHTML = matches.map((l,i) =\u003e {\n    const totalInv = l.variants.reduce((s,v)=\u003es+v.inv,0);\n    const noStock = totalInv === 0;\n    const stockTag = noStock ? '\u003cspan class=\"opt-stock\"\u003esin stock\u003c\/span\u003e' : (totalInv\u003c=3 ? `\u003cspan class=\"opt-stock\"\u003e⚡${totalInv} uds\u003c\/span\u003e` : '');\n    return `\u003cdiv class=\"llavero-option${noStock?' no-stock':''}\" data-raza=\"${l.raza}\" onclick=\"selectRaza('${l.raza.replace(\/'\/g,\"\\\\'\")}')\"\u003e\n      \u003cspan\u003e${l.raza}\u003c\/span\u003e${stockTag}\n    \u003c\/div\u003e`;\n  }).join('');\n  dd.classList.add('open');\n}\n\nfunction onLlaveroKey(e) {\n  const dd = document.getElementById('llavero-dropdown');\n  const opts = dd.querySelectorAll('.llavero-option[data-raza]');\n  if (!dd.classList.contains('open') || !opts.length) return;\n  if (e.key==='ArrowDown') { llaveroHighlight=Math.min(llaveroHighlight+1,opts.length-1); highlightOption(opts); e.preventDefault(); }\n  else if (e.key==='ArrowUp') { llaveroHighlight=Math.max(llaveroHighlight-1,0); highlightOption(opts); e.preventDefault(); }\n  else if (e.key==='Enter' \u0026\u0026 llaveroHighlight\u003e=0) { opts[llaveroHighlight].click(); e.preventDefault(); }\n  else if (e.key==='Escape') { closeLlaveroDropdown(); }\n}\n\nfunction highlightOption(opts) {\n  opts.forEach((o,i)=\u003eo.classList.toggle('highlighted',i===llaveroHighlight));\n  if (opts[llaveroHighlight]) opts[llaveroHighlight].scrollIntoView({block:'nearest'});\n}\n\nfunction closeLlaveroDropdown() {\n  document.getElementById('llavero-dropdown').classList.remove('open');\n}\n\nfunction selectRaza(raza) {\n  document.getElementById('llavero-input').value = raza;\n  document.getElementById('llavero-clear').style.display = 'block';\n  closeLlaveroDropdown();\n  resetLlaveroVariants();\n  const llavero = LLAVEROS.find(l=\u003el.raza===raza);\n  if (!llavero) return;\n  if (llavero.variants.length===1) {\n    const v=llavero.variants[0];\n    setLlaveroVariant(raza, v);\n    document.getElementById('llavero-variant-wrap').style.display='none';\n    return;\n  }\n  \/\/ Múltiples variantes → mostrar botones\n  document.getElementById('llavero-selected-label').textContent = raza;\n  const btns = document.getElementById('llavero-variant-btns');\n  btns.innerHTML = llavero.variants.map(v =\u003e {\n    const noStock = v.inv===0;\n    return `\u003cbutton class=\"llavero-variant-btn${noStock?' no-stock':''}\" ${noStock?'disabled':''} onclick=\"selectVariant('${raza.replace(\/'\/g,\"\\\\'\")}','${v.id}','${v.title.replace(\/'\/g,\"\\\\'\")}',${v.inv},this)\"\u003e${v.title}${noStock?' 🚫':v.inv\u003c=2?` ⚡${v.inv}`:''}\u003c\/button\u003e`;\n  }).join('');\n  document.getElementById('llavero-variant-wrap').style.display='block';\n}\n\nfunction selectVariant(raza, id, title, inv, el) {\n  document.querySelectorAll('.llavero-variant-btn').forEach(b=\u003eb.classList.remove('active'));\n  el.classList.add('active');\n  setLlaveroVariant(raza, {id, title, inv});\n}\n\nfunction setLlaveroVariant(raza, v) {\n  stateLlavero.variantId=v.id; stateLlavero.raza=raza; stateLlavero.variant=v.title; stateLlavero.inv=v.inv;\n  showLlaveroStock(v.inv);\n  const label = (v.title==='Default'||v.title==='Default Title') ? raza : `${raza} \/ ${v.title}`;\n  document.getElementById('ksv-llavero').textContent=label;\n  document.getElementById('ksv-llavero').className='ks-val'+(v.inv\u003e0?' ready':' pending');\n  document.getElementById('card-llavero').classList.toggle('done-row',v.inv\u003e0);\n  updateKitUI();\n}\n\nfunction resetLlaveroVariants() {\n  stateLlavero.variantId=null; stateLlavero.raza=null; stateLlavero.variant=null; stateLlavero.inv=0;\n  document.getElementById('ksv-llavero').textContent='—';\n  document.getElementById('ksv-llavero').className='ks-val pending';\n  document.getElementById('card-llavero').classList.remove('done-row');\n  document.getElementById('llavero-variant-wrap').style.display='none';\n  document.getElementById('stock-note-llavero').textContent='';\n  updateKitUI();\n}\n\nfunction clearLlavero() {\n  document.getElementById('llavero-input').value='';\n  document.getElementById('llavero-clear').style.display='none';\n  closeLlaveroDropdown();\n  resetLlaveroVariants();\n}\n\nfunction onRazaChange(){}\nfunction onVariantChange(){}\n\nfunction showLlaveroStock(inv) {\n  const note=document.getElementById('stock-note-llavero');\n  if(inv===0){note.textContent='⚠️ Sin stock en esta opción';note.style.color='#c0392b';note.style.fontWeight='600';}\n  else if(inv\u003c=2){note.textContent=`⚡ Solo ${inv} disponible${inv\u003e1?'s':''}`;note.style.color='#e67e22';note.style.fontWeight='600';}\n  else{note.textContent='';}\n}\n\nconst state = {\n  tira:   {color: null, size: null},\n  manija: {color: null, size: null},\n};\n\n\/\/ ─── RENDER SWATCHES ────────────────────────────────────────────────\nfunction renderSwatches(productKey, containerId) {\n  const container = document.getElementById(containerId);\n  COLORS.forEach(c =\u003e {\n    const div = document.createElement('div');\n    div.className = 'swatch';\n    div.style.background = c.hex;\n    \/\/ White border for light colors\n    if (['Marfil','Amarillo'].includes(c.name)) div.style.border = '2px solid #ccc';\n    div.title = c.name;\n    div.onclick = () =\u003e selectColor(productKey, c.name, div);\n    const tooltip = document.createElement('span');\n    tooltip.className = 'swatch-tooltip';\n    tooltip.textContent = c.name;\n    div.appendChild(tooltip);\n    container.appendChild(div);\n  });\n}\n\n\/\/ ─── RENDER COLLAR SIZES ────────────────────────────────────────────\nfunction renderCollarSizes() {\n  const container = document.getElementById('sizes-collar');\n  ['XXS','XS','S','M','L'].forEach(s =\u003e {\n    const btn = document.createElement('button');\n    btn.className = 'size-btn';\n    btn.dataset.size = s;\n    btn.textContent = s;\n    btn.onclick = () =\u003e selectSize('collar', s, btn);\n    container.appendChild(btn);\n  });\n}\n\n\/\/ ─── SELECT COLOR ───────────────────────────────────────────────────\nfunction selectColor(product, colorName, el) {\n  state[product].color = colorName;\n  const container = el.parentElement;\n  container.querySelectorAll('.swatch').forEach(s =\u003e s.classList.remove('active'));\n  el.classList.add('active');\n  document.getElementById('color-label-' + product).textContent = colorName;\n  checkStock(product);\n  updateStatus(product);\n}\n\n\/\/ ─── SELECT SIZE ────────────────────────────────────────────────────\nfunction selectSize(product, size, el) {\n  state[product].size = size;\n  const container = el.parentElement;\n  container.querySelectorAll('.size-btn').forEach(b =\u003e b.classList.remove('active'));\n  el.classList.add('active');\n  checkStock(product);\n  updateStatus(product);\n}\n\n\/\/ ─── CHECK STOCK ────────────────────────────────────────────────────\nfunction checkStock(product) {\n  const s = state[product];\n  const noteEl = document.getElementById('stock-note-' + product);\n  if (!noteEl) return;\n  let qty = null;\n  if (product === 'collar' \u0026\u0026 s.color \u0026\u0026 s.size) {\n    qty = COLLAR_INV[s.color]?.[s.size] ?? null;\n  } else if (product === 'tira' \u0026\u0026 s.color) {\n    const COLLAR_TO_TIRA = {XXS:'XS',XS:'XS',S:'S-L',M:'S-L',L:'S-L'};\n    const tiraTalla = s.size || 'S-L';\n    qty = TIRA_INV[s.color]?.[tiraTalla] ?? null;\n  } else if (product === 'manija' \u0026\u0026 s.color) {\n    qty = MANIJA_INV[s.color] ?? null;\n  }\n  if (qty === null) { noteEl.textContent = ''; return; }\n  if (qty === 0) {\n    noteEl.textContent = '⚠️ Sin stock en esta combinación';\n    noteEl.style.color = '#c0392b';\n    noteEl.style.fontWeight = '600';\n  } else if (qty \u003c= 2) {\n    noteEl.textContent = `⚡ Solo ${qty} disponible${qty \u003e 1 ? 's' : ''}`;\n    noteEl.style.color = '#e67e22';\n    noteEl.style.fontWeight = '600';\n  } else {\n    noteEl.textContent = '';\n  }\n}\n\n\/\/ ─── UPDATE STATUS BADGE ─────────────────────────────────────────────\nfunction updateStatus(product) {\n  const s = state[product];\n  if (!s) return;\n  const row = document.getElementById('card-' + product);\n  if (!row) return;\n  const needsSize = product === 'tira';\n  const ready = s.color \u0026\u0026 (!needsSize || s.size);\n  if (ready) row.classList.add('done-row');\n  else row.classList.remove('done-row');\n  updateKitUI();\n}\n\/\/ ─── KIT UI (resumen + botones) ──────────────────────────────────────\nfunction updateKitUI() {\n  const btnCart = document.getElementById('btn-kit-cart');\n  const btnBuy  = document.getElementById('btn-kit-buy');\n  const note    = document.getElementById('kit-note');\n  const st = state.tira, sm = state.manija;\n\n  const ksvt = document.getElementById('ksv-tira');\n  const tiraReady = !!st.color \u0026\u0026 !!st.size;\n  ksvt.textContent = tiraReady ? `${st.color} \/ ${st.size}` : '—';\n  ksvt.className = 'ks-val ' + (tiraReady ? 'ready' : 'pending');\n\n  const ksvm = document.getElementById('ksv-manija');\n  const manijaReady = !!sm.color;\n  ksvm.textContent = manijaReady ? sm.color : '—';\n  ksvm.className = 'ks-val ' + (manijaReady ? 'ready' : 'pending');\n\n  const llaveroReady = !!stateLlavero.variantId \u0026\u0026 stateLlavero.inv \u003e 0;\n\n  const allReady = tiraReady \u0026\u0026 manijaReady \u0026\u0026 llaveroReady;\n  btnCart.disabled = !allReady;\n  btnBuy.disabled  = !allReady;\n  note.textContent = allReady\n    ? '✓ Kit completo — elige cómo continuar'\n    : 'Selecciona color en los 3 productos para continuar';\n  note.style.color = allReady ? 'rgba(0,0,0,.7)' : 'rgba(0,0,0,.4)';\n}\n\n\/\/ ─── KIT ACTION ──────────────────────────────────────────────────────\nasync function kitAction(mode) {\n  const st = state.tira, sm = state.manija;\n  const tiraId    = TIRA_VARIANTS[st.color]?.['S-L'];\n  const manijaId  = MANIJA_VARIANTS[sm.color];\n  const llaveroId = stateLlavero.variantId;\n\n  if (!tiraId || !manijaId || !llaveroId) {\n    alert('Error encontrando variantes. Verifica tu selección.');\n    return;\n  }\n  if (stateLlavero.inv === 0) {\n    alert('⚠️ El llavero seleccionado no tiene stock.');\n    return;\n  }\n\n  if (mode === 'buy') {\n    window.location.href = `\/cart\/${tiraId}:1,${manijaId}:1,${llaveroId}:1?discount=KITPASEO\u0026checkout`;\n    return;\n  }\n\n  const btnCart = document.getElementById('btn-kit-cart');\n  const note    = document.getElementById('kit-note');\n  btnCart.disabled = true;\n  btnCart.innerHTML = `\u003csvg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"10\"\/\u003e\u003c\/svg\u003e Agregando...`;\n\n  try {\n    const res = await fetch('\/cart\/add.js', {\n      method: 'POST',\n      headers: {'Content-Type': 'application\/json'},\n      body: JSON.stringify({\n        items: [\n          {id: Number(tiraId),    quantity: 1},\n          {id: Number(manijaId),  quantity: 1},\n          {id: Number(llaveroId), quantity: 1},\n        ]\n      })\n    });\n\n    if (!res.ok) {\n      const err = await res.json().catch(() =\u003e ({}));\n      throw new Error(err.description || 'Error al agregar');\n    }\n\n    btnCart.classList.add('success');\n    btnCart.innerHTML = `\u003csvg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\u003e\u003cpath d=\"M20 6L9 17l-5-5\"\/\u003e\u003c\/svg\u003e ✓ ¡Kit añadido!`;\n    note.textContent = 'Kit en el carrito. Puedes agregar otro o ir a comprar.';\n    note.style.color = 'rgba(0,0,0,.7)';\n    note.textContent  = 'Kit en el carrito. Puedes agregar otro o ir a comprar.';\n    note.style.color  = 'rgba(0,0,0,.7)';\n\n    \/\/ Actualizar carrito Phenomenon con selectores exactos del tema\n    fetch('\/cart.js')\n      .then(r =\u003e r.json())\n      .then(cart =\u003e {\n        \/\/ Actualizar el indicador\/contador del carrito\n        document.querySelectorAll('.cart-indicator, .cart__indicator, [class*=\"cart-indicator\"]')\n          .forEach(el =\u003e { el.textContent = cart.item_count; });\n\n        \/\/ Recargar el contenido del cart-drawer via fetch\n        fetch('\/cart?view=drawer', {headers:{'X-Requested-With':'XMLHttpRequest'}})\n          .catch(() =\u003e {});\n\n        \/\/ Abrir el drawer haciendo click en el toggle del header\n        const toggle = document.querySelector('.cart__toggle, [class*=\"cart__toggle\"], .cart-drawer-toggle, [class*=\"cart-drawer-toggle\"]');\n        if (toggle) toggle.click();\n      })\n      .catch(() =\u003e {});\n\n    \/\/ Reset botón después de 4s para agregar otro kit\n    setTimeout(() =\u003e {\n      btnCart.classList.remove('success');\n      btnCart.disabled = false;\n      btnCart.innerHTML = `\u003csvg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\u003e\u003ccircle cx=\"9\" cy=\"21\" r=\"1\"\/\u003e\u003ccircle cx=\"20\" cy=\"21\" r=\"1\"\/\u003e\u003cpath d=\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\"\/\u003e\u003c\/svg\u003e Añadir al carrito`;\n      note.textContent = '✓ Kit completo — elige cómo continuar';\n      note.style.color = 'rgba(0,0,0,.7)';\n    }, 4000);\n\n  } catch (err) {\n    console.error('Cart error:', err);\n    btnCart.disabled = false;\n    btnCart.innerHTML = `\u003csvg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\u003e\u003ccircle cx=\"9\" cy=\"21\" r=\"1\"\/\u003e\u003ccircle cx=\"20\" cy=\"21\" r=\"1\"\/\u003e\u003cpath d=\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\"\/\u003e\u003c\/svg\u003e Añadir al carrito`;\n    \/\/ Fallback: redirigir al carrito\n    if (confirm('No se pudo agregar silenciosamente. ¿Ir al carrito?')) {\n      window.location.href = `\/cart\/${tiraId}:1,${manijaId}:1,${llaveroId}:1?discount=KITPASEO`;\n    }\n  }\n}\n\n\/\/ ─── SIZE GUIDE MODAL ────────────────────────────────────────────────\nconst SIZE_GUIDES = {\n  tira: {\n    title: 'Guía de tallas — Tira',\n    rows: [\n      ['XXS', '14 – 22 cm', '1,5 cm'],\n      ['XS',  '22 – 30 cm', '2 cm'],\n      ['S',   '30 – 38 cm', '2,5 cm'],\n      ['M',   '38 – 46 cm', '2,5 cm'],\n      ['L',   '46 – 54 cm', '2,5 cm'],\n      ['XL',  '54 – 62 cm', '2,5 cm'],\n    ],\n    head: ['Talla', 'Medida cuello', 'Ancho del collar'],\n  },\n  collar: {\n    title: 'Guía de tallas — Collar',\n    rows: [\n      ['XXS', '14 – 22 cm', '1,5 cm'],\n      ['XS',  '22 – 30 cm', '2 cm'],\n      ['S',   '30 – 38 cm', '2,5 cm'],\n      ['M',   '38 – 46 cm', '2,5 cm'],\n      ['L',   '46 – 54 cm', '2,5 cm'],\n    ],\n    head: ['Talla', 'Medida cuello', 'Ancho del collar'],\n  },\n};\n\nfunction openModal(product) {\n  const guide = SIZE_GUIDES[product];\n  if (!guide) return;\n\n  \/\/ Remover modal previo si existe\n  const existing = document.getElementById('capri-modal-overlay');\n  if (existing) existing.remove();\n\n  \/\/ Construir tabla\n  let html = '\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e' + guide.head.map(h=\u003e`\u003cth\u003e${h}\u003c\/th\u003e`).join('') + '\u003c\/tr\u003e\u003c\/thead\u003e\u003ctbody\u003e';\n  guide.rows.forEach(r =\u003e {\n    html += '\u003ctr\u003e' + r.map(c=\u003e`\u003ctd\u003e${c}\u003c\/td\u003e`).join('') + '\u003c\/tr\u003e';\n  });\n  html += '\u003c\/tbody\u003e\u003c\/table\u003e';\n\n  \/\/ Crear modal desde cero y appendear al body del documento\n  const overlay = document.createElement('div');\n  overlay.id = 'capri-modal-overlay';\n  overlay.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:99999;display:flex;align-items:center;justify-content:center;padding:20px;';\n  overlay.innerHTML = `\n    \u003cdiv style=\"background:#fff;border-radius:10px;padding:24px;max-width:400px;width:100%;position:relative;font-family:-apple-system,sans-serif;\"\u003e\n      \u003cbutton onclick=\"document.getElementById('capri-modal-overlay').remove()\" style=\"position:absolute;top:10px;right:14px;background:none;border:none;font-size:20px;cursor:pointer;color:#666;\"\u003e✕\u003c\/button\u003e\n      \u003ch3 style=\"font-size:15px;font-weight:700;color:#1b2d4f;margin-bottom:14px;\"\u003e${guide.title}\u003c\/h3\u003e\n      \u003ctable style=\"width:100%;border-collapse:collapse;font-size:12px;\"\u003e${html.replace(\/\u003ctable[^\u003e]*\u003e\/,'').replace('\u003c\/table\u003e','')}\u003c\/table\u003e\n    \u003c\/div\u003e`;\n\n  \/\/ Estilos de tabla inline\n  overlay.querySelectorAll('th').forEach(th =\u003e {\n    th.style.cssText = 'background:#1b2d4f;color:#fff;padding:7px 10px;text-align:left;font-weight:600;';\n  });\n  overlay.querySelectorAll('td').forEach(td =\u003e {\n    td.style.cssText = 'padding:6px 10px;border-bottom:1px solid #e0dbd2;';\n  });\n\n  \/\/ Cerrar al hacer click fuera\n  overlay.addEventListener('click', e =\u003e { if (e.target === overlay) overlay.remove(); });\n\n  \/\/ Appendear al body real (escapa sección de Shopify)\n  const targetBody = (window.top || window).document.body;\n  targetBody.appendChild(overlay);\n}\n\nfunction closeModal() {\n  const el = document.getElementById('capri-modal-overlay');\n  if (el) el.remove();\n}\n\n\/\/ ─── INIT ────────────────────────────────────────────────────────────\ntry {\n  renderSwatches('tira', 'swatches-tira');\n  renderSwatches('manija', 'swatches-manija');\n  initLlaveroSelect();\n  console.log('Capri configurador iniciado OK');\n} catch(err) {\n  console.error('Capri configurador error:', err);\n}\n\u003c\/script\u003e\n\n\u003c\/body\u003e","brand":"Fast Bundle","offers":[{"title":"Default Title","offer_id":59976055029841,"sku":"97f01011-aeb9-449f-954c-47ac59b7c650","price":99000.0,"currency_code":"COP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/7677\/7297\/files\/ChatGPTImage3ago2026_02_16_08p.m..png?v=1785784728"},{"product_id":"llaveros-mundo","title":"LLAVEROS MUNDO","description":"\u003cbody\u003e\n\n\n\u003cmeta charset=\"UTF-8\"\u003e\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n\u003ctitle\u003eCapri Pets – Llaveros de Cuero Artesanales\u003c\/title\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin\u003e\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,700;0,9..144,900;1,9..144,300\u0026amp;family=Inter:wght@400;500;600\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003cstyle\u003e\n  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n  :root {\n    --orange: #FF6B35;\n    --navy: #1B2A4A;\n    --white: #FFFFFF;\n    --cream: #F7F5F2;\n    --navy-light: #2E4270;\n    --text-muted: #8090AA;\n    --card-w: 220px;\n    --card-h: 290px;\n  }\n\n  html { scroll-behavior: smooth; }\n\n  body {\n    font-family: 'Inter', sans-serif;\n    background: var(--white);\n    color: var(--navy);\n    overflow-x: hidden;\n  }\n\n  \/* ── NAV ── *\/\n  nav {\n    position: fixed; top: 0; left: 0; right: 0; z-index: 100;\n    display: flex; align-items: center; justify-content: space-between;\n    padding: 0 20px; height: 56px;\n    background: rgba(27,42,74,0.96);\n    backdrop-filter: blur(8px);\n  }\n  .nav-logo {\n    font-family: 'Fraunces', serif;\n    font-weight: 900; font-size: 1.25rem; color: var(--white);\n    letter-spacing: -0.02em;\n  }\n  .nav-logo span { color: var(--orange); }\n  .nav-cta {\n    background: var(--orange); color: var(--white);\n    border: none; border-radius: 20px;\n    padding: 8px 18px; font-family: 'Inter', sans-serif;\n    font-size: 0.8rem; font-weight: 600; cursor: pointer;\n    text-decoration: none; transition: opacity .2s;\n  }\n  .nav-cta:hover { opacity: .85; }\n\n  \/* ── HERO ── *\/\n  .hero {\n    min-height: 100svh;\n    background: var(--navy);\n    display: flex; flex-direction: column;\n    align-items: center; justify-content: center;\n    text-align: center;\n    padding: 80px 24px 48px;\n    position: relative; overflow: hidden;\n  }\n  .hero::before {\n    content: '';\n    position: absolute; inset: 0;\n    background:\n      radial-gradient(ellipse 70% 50% at 20% 80%, rgba(255,107,53,.18) 0%, transparent 60%),\n      radial-gradient(ellipse 60% 40% at 80% 20%, rgba(255,107,53,.10) 0%, transparent 60%);\n    pointer-events: none;\n  }\n  .hero-eyebrow {\n    font-size: 0.72rem; font-weight: 600; letter-spacing: .18em;\n    text-transform: uppercase; color: var(--orange);\n    margin-bottom: 16px;\n  }\n  .hero h1 {\n    font-family: 'Fraunces', serif;\n    font-weight: 900; font-size: clamp(2.4rem, 8vw, 5rem);\n    line-height: 1.0; color: var(--white);\n    letter-spacing: -0.03em; margin-bottom: 20px;\n  }\n  .hero h1 em {\n    font-style: italic; font-weight: 300; color: var(--orange);\n  }\n  .hero-sub {\n    font-size: clamp(0.9rem, 2.5vw, 1.05rem);\n    color: rgba(255,255,255,.65); max-width: 480px;\n    line-height: 1.6; margin-bottom: 36px;\n  }\n  .hero-actions { display: flex; gap: 12px; flex-wrap: wrap; justify-content: center; }\n  .btn-primary {\n    background: var(--orange); color: var(--white);\n    border: none; border-radius: 28px;\n    padding: 14px 28px; font-family: 'Inter', sans-serif;\n    font-size: 0.9rem; font-weight: 600; cursor: pointer;\n    text-decoration: none; transition: transform .2s, box-shadow .2s;\n    box-shadow: 0 4px 20px rgba(255,107,53,.4);\n  }\n  .btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 28px rgba(255,107,53,.5); }\n  .btn-ghost {\n    background: transparent; color: var(--white);\n    border: 1.5px solid rgba(255,255,255,.3); border-radius: 28px;\n    padding: 14px 28px; font-family: 'Inter', sans-serif;\n    font-size: 0.9rem; font-weight: 500; cursor: pointer;\n    text-decoration: none; transition: border-color .2s, background .2s;\n  }\n  .btn-ghost:hover { border-color: var(--white); background: rgba(255,255,255,.06); }\n  .hero-scroll {\n    margin-top: 48px; color: rgba(255,255,255,.35);\n    font-size: 0.72rem; letter-spacing: .12em; text-transform: uppercase;\n    display: flex; flex-direction: column; align-items: center; gap: 6px;\n    animation: bounce 2s infinite;\n  }\n  .hero-scroll svg { width: 16px; opacity: .5; }\n  @keyframes bounce { 0%,100%{transform:translateY(0)} 50%{transform:translateY(6px)} }\n\n  \/* ── TRUST STRIP ── *\/\n  .trust {\n    background: var(--cream);\n    padding: 20px 24px;\n    display: flex; justify-content: center; gap: 32px;\n    flex-wrap: wrap;\n  }\n  .trust-item {\n    display: flex; align-items: center; gap: 8px;\n    font-size: 0.8rem; font-weight: 500; color: var(--navy);\n  }\n  .trust-item svg { color: var(--orange); flex-shrink: 0; }\n\n  \/* ── SECTION HEADER ── *\/\n  .section-header {\n    text-align: center; padding: 64px 24px 32px;\n  }\n  .section-header .eyebrow {\n    font-size: 0.72rem; font-weight: 600; letter-spacing: .18em;\n    text-transform: uppercase; color: var(--orange); margin-bottom: 10px;\n  }\n  .section-header h2 {\n    font-family: 'Fraunces', serif; font-weight: 900;\n    font-size: clamp(1.8rem, 5vw, 2.8rem); line-height: 1.1;\n    letter-spacing: -0.03em; color: var(--navy);\n  }\n  .section-header p {\n    margin-top: 12px; font-size: 0.95rem; color: var(--text-muted);\n    max-width: 440px; margin-left: auto; margin-right: auto; line-height: 1.6;\n  }\n\n  \/* ── SEARCH ── *\/\n  .search-wrap {\n    padding: 0 24px 12px;\n    display: flex; justify-content: center;\n  }\n  .search-box {\n    position: relative; width: 100%; max-width: 420px;\n  }\n  .search-box input {\n    width: 100%;\n    padding: 13px 48px 13px 18px;\n    border: 2px solid #E2E8F0; border-radius: 28px;\n    font-family: 'Inter', sans-serif; font-size: 0.9rem; color: var(--navy);\n    background: var(--white); outline: none;\n    transition: border-color .2s, box-shadow .2s;\n  }\n  .search-box input:focus {\n    border-color: var(--orange);\n    box-shadow: 0 0 0 3px rgba(255,107,53,.15);\n  }\n  .search-box input::placeholder { color: var(--text-muted); }\n  .search-icon {\n    position: absolute; right: 16px; top: 50%; transform: translateY(-50%);\n    color: var(--text-muted); pointer-events: none;\n  }\n\n  \/* ── FILTER TABS ── *\/\n  .filter-tabs {\n    display: flex; justify-content: center; gap: 8px;\n    padding: 0 24px 28px; flex-wrap: wrap;\n  }\n  .tab {\n    padding: 7px 18px; border-radius: 20px; font-size: 0.8rem; font-weight: 600;\n    border: 1.5px solid #E2E8F0; background: var(--white); color: var(--navy);\n    cursor: pointer; transition: all .18s;\n  }\n  .tab.active, .tab:hover {\n    background: var(--navy); color: var(--white); border-color: var(--navy);\n  }\n  .tab.active { background: var(--orange); border-color: var(--orange); }\n\n  \/* ── COVERFLOW ── *\/\n  .coverflow-section {\n    background: var(--cream);\n    padding: 48px 0 64px;\n    overflow: hidden;\n  }\n  .coverflow-container {\n    position: relative; width: 100%;\n    height: calc(var(--card-h) + 80px);\n    perspective: 1000px;\n    cursor: grab;\n    user-select: none;\n  }\n  .coverflow-container:active { cursor: grabbing; }\n  .coverflow-track {\n    position: absolute; top: 0; left: 50%;\n    height: 100%;\n    transform-style: preserve-3d;\n    will-change: transform;\n    transition: none;\n  }\n  .cf-card {\n    position: absolute;\n    width: var(--card-w); height: var(--card-h);\n    top: 24px;\n    transform-origin: center center;\n    transition: transform .45s cubic-bezier(.25,.46,.45,.94),\n                opacity .45s ease,\n                filter .45s ease;\n    will-change: transform;\n    cursor: pointer;\n  }\n  .cf-card-inner {\n    width: 100%; height: 100%;\n    background: var(--white);\n    border-radius: 18px;\n    overflow: hidden;\n    box-shadow: 0 8px 32px rgba(27,42,74,.14);\n    display: flex; flex-direction: column;\n    transition: box-shadow .3s;\n  }\n  .cf-card.is-center .cf-card-inner {\n    box-shadow: 0 20px 60px rgba(27,42,74,.22), 0 0 0 2.5px var(--orange);\n  }\n  .cf-card-img {\n    width: 100%; flex: 1;\n    object-fit: cover; display: block;\n    background: #E8EEF6;\n  }\n  .cf-card-label {\n    padding: 12px 14px 14px;\n    text-align: center;\n  }\n  .cf-card-label .breed-name {\n    font-family: 'Fraunces', serif; font-weight: 700;\n    font-size: 0.95rem; color: var(--navy); letter-spacing: -0.01em;\n  }\n  .cf-card-label .breed-type {\n    font-size: 0.72rem; font-weight: 500; color: var(--text-muted);\n    text-transform: uppercase; letter-spacing: .1em; margin-top: 2px;\n  }\n  .cf-card-label .price-tag {\n    display: inline-block; margin-top: 8px;\n    background: var(--orange); color: var(--white);\n    padding: 3px 12px; border-radius: 12px;\n    font-size: 0.78rem; font-weight: 700;\n  }\n\n  \/* Dots nav *\/\n  .cf-dots {\n    display: flex; justify-content: center; gap: 6px; margin-top: 28px; padding: 0 24px;\n  }\n  .cf-dot {\n    width: 7px; height: 7px; border-radius: 50%;\n    background: #C8D2E0; cursor: pointer; transition: all .2s;\n    border: none;\n  }\n  .cf-dot.active { background: var(--orange); width: 20px; border-radius: 4px; }\n\n  \/* Arrows *\/\n  .cf-arrows {\n    display: flex; justify-content: center; gap: 12px; margin-top: 20px;\n  }\n  .cf-arrow {\n    width: 44px; height: 44px; border-radius: 50%;\n    border: 1.5px solid #D0D8E8; background: var(--white);\n    display: flex; align-items: center; justify-content: center;\n    cursor: pointer; transition: all .2s; color: var(--navy);\n  }\n  .cf-arrow:hover { border-color: var(--orange); color: var(--orange); background: #FFF4F0; }\n\n  \/* no-results *\/\n  .no-results {\n    text-align: center; padding: 48px 24px; display: none;\n  }\n  .no-results p { font-size: 1rem; color: var(--text-muted); }\n\n  \/* ── HOW IT WORKS ── *\/\n  .how {\n    padding: 64px 24px;\n    max-width: 900px; margin: 0 auto;\n  }\n  .how-grid {\n    display: grid; grid-template-columns: 1fr;\n    gap: 24px; margin-top: 40px;\n  }\n  .how-card {\n    display: flex; gap: 20px; align-items: flex-start;\n    background: var(--cream); border-radius: 16px; padding: 24px;\n  }\n  .how-num {\n    font-family: 'Fraunces', serif; font-weight: 900;\n    font-size: 2.5rem; color: var(--orange); line-height: 1;\n    flex-shrink: 0; min-width: 48px;\n  }\n  .how-card h3 {\n    font-family: 'Fraunces', serif; font-weight: 700; font-size: 1.1rem;\n    color: var(--navy); margin-bottom: 6px;\n  }\n  .how-card p { font-size: 0.88rem; color: var(--text-muted); line-height: 1.6; }\n\n  \/* ── CTA BANNER ── *\/\n  .cta-banner {\n    background: var(--navy);\n    margin: 0 16px 64px; border-radius: 24px;\n    padding: 48px 24px; text-align: center;\n    position: relative; overflow: hidden;\n  }\n  .cta-banner::before {\n    content: '';\n    position: absolute; bottom: -40px; right: -40px;\n    width: 220px; height: 220px; border-radius: 50%;\n    background: rgba(255,107,53,.12);\n    pointer-events: none;\n  }\n  .cta-banner h2 {\n    font-family: 'Fraunces', serif; font-weight: 900;\n    font-size: clamp(1.6rem, 5vw, 2.4rem); color: var(--white);\n    letter-spacing: -0.03em; margin-bottom: 12px;\n  }\n  .cta-banner p { color: rgba(255,255,255,.6); font-size: 0.9rem; margin-bottom: 28px; line-height: 1.6; }\n\n  \/* ── FOOTER ── *\/\n  footer {\n    background: var(--navy);\n    padding: 32px 24px;\n    text-align: center;\n    color: rgba(255,255,255,.4);\n    font-size: 0.8rem;\n  }\n  footer .footer-logo {\n    font-family: 'Fraunces', serif; font-weight: 900;\n    font-size: 1.4rem; color: var(--white); margin-bottom: 8px;\n  }\n  footer .footer-logo span { color: var(--orange); }\n\n  \/* ── RESPONSIVE ── *\/\n  @media (min-width: 640px) {\n    .how-grid { grid-template-columns: 1fr 1fr; }\n    :root { --card-w: 240px; --card-h: 310px; }\n  }\n  @media (min-width: 900px) {\n    .how-grid { grid-template-columns: 1fr 1fr 1fr; }\n    :root { --card-w: 260px; --card-h: 330px; }\n  }\n\n  @media (prefers-reduced-motion: reduce) {\n    .cf-card { transition: none; }\n    .hero-scroll { animation: none; }\n  }\n\n  \/* ── PLACEHOLDER BREED IMAGES (SVG data URIs) ── *\/\n  \/* Generated inline in JS *\/\n\u003c\/style\u003e\n\n\n\n\u003c!-- NAV --\u003e\n\u003cnav\u003e\n  \u003cdiv class=\"nav-logo\"\u003eCapri\u003cspan\u003ePets\u003c\/span\u003e\n\u003c\/div\u003e\n  \u003ca href=\"#razas\" class=\"nav-cta\"\u003eVer llaveros\u003c\/a\u003e\n\u003c\/nav\u003e\n\n\u003c!-- HERO --\u003e\n\u003csection class=\"hero\"\u003e\n  \u003cp class=\"hero-eyebrow\"\u003eCuero artesanal colombiano\u003c\/p\u003e\n  \u003ch1\u003eTu raza,\u003cbr\u003e\u003cem\u003etu llave.\u003c\/em\u003e\n\u003c\/h1\u003e\n  \u003cp class=\"hero-sub\"\u003eLlaveros de cuero curtido a mano con la silueta de tu raza favorita. Más de 60 razas de perros y gatos disponibles.\u003c\/p\u003e\n  \u003cdiv class=\"hero-actions\"\u003e\n    \u003ca href=\"#razas\" class=\"btn-primary\"\u003eExplorar razas\u003c\/a\u003e\n    \u003ca href=\"#como\" class=\"btn-ghost\"\u003e¿Cómo funciona?\u003c\/a\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"hero-scroll\"\u003e\n    \u003cspan\u003eDescubre\u003c\/span\u003e\n    \u003csvg viewbox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\u003e\n      \u003cpath d=\"M8 3v10M4 9l4 4 4-4\"\u003e\u003c\/path\u003e\n    \u003c\/svg\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- TRUST --\u003e\n\u003cdiv class=\"trust\"\u003e\n  \u003cdiv class=\"trust-item\"\u003e\n    \u003csvg width=\"16\" height=\"16\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"\u003e\u003cpath d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n    \u003cspan\u003eCuero 100% genuino\u003c\/span\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"trust-item\"\u003e\n    \u003csvg width=\"16\" height=\"16\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"10\"\u003e\u003c\/circle\u003e\u003cpath d=\"M12 6v6l4 2\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n    \u003cspan\u003eEnvío en 3–5 días\u003c\/span\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"trust-item\"\u003e\n    \u003csvg width=\"16\" height=\"16\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"\u003e\u003cpath 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\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n    \u003cspan\u003eHecho en Bogotá\u003c\/span\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"trust-item\"\u003e\n    \u003csvg width=\"16\" height=\"16\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"\u003e\u003cpolyline points=\"20 6 9 17 4 12\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\n    \u003cspan\u003e+500 clientes felices\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- COVERFLOW SECTION --\u003e\n\u003cdiv id=\"razas\"\u003e\n  \u003cdiv class=\"section-header\"\u003e\n    \u003cp class=\"eyebrow\"\u003eNuestras razas\u003c\/p\u003e\n    \u003ch2\u003eEncuentra la tuya\u003c\/h2\u003e\n    \u003cp\u003eCada llavero es tallado y cosido a mano. Elige tu raza y llévala contigo.\u003c\/p\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- Search --\u003e\n  \u003cdiv class=\"search-wrap\"\u003e\n    \u003cdiv class=\"search-box\"\u003e\n      \u003cinput type=\"text\" id=\"searchInput\" placeholder=\"Buscar raza… ej: Golden Retriever\" autocomplete=\"off\"\u003e\n      \u003cspan class=\"search-icon\"\u003e\n        \u003csvg width=\"18\" height=\"18\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"\u003e\n          \u003ccircle cx=\"11\" cy=\"11\" r=\"8\"\u003e\u003c\/circle\u003e\u003cpath d=\"m21 21-4.35-4.35\"\u003e\u003c\/path\u003e\n        \u003c\/svg\u003e\n      \u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- Filter tabs --\u003e\n  \u003cdiv class=\"filter-tabs\"\u003e\n    \u003cbutton class=\"tab active\" data-filter=\"all\"\u003eTodos\u003c\/button\u003e\n    \u003cbutton class=\"tab\" data-filter=\"perro\"\u003ePerros 🐶\u003c\/button\u003e\n    \u003cbutton class=\"tab\" data-filter=\"gato\"\u003eGatos 🐱\u003c\/button\u003e\n  \u003c\/div\u003e\n\n  \u003c!-- Coverflow --\u003e\n  \u003cdiv class=\"coverflow-section\"\u003e\n    \u003cdiv class=\"coverflow-container\" id=\"cfContainer\"\u003e\n      \u003cdiv class=\"coverflow-track\" id=\"cfTrack\"\u003e\u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"no-results\" id=\"noResults\"\u003e\n      \u003cp\u003eNo encontramos esa raza. ¡Pronto añadimos más!\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"cf-dots\" id=\"cfDots\"\u003e\u003c\/div\u003e\n    \u003cdiv class=\"cf-arrows\"\u003e\n      \u003cbutton class=\"cf-arrow\" id=\"cfPrev\" aria-label=\"Anterior\"\u003e\n        \u003csvg width=\"18\" height=\"18\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"\u003e\u003cpath d=\"M15 18l-6-6 6-6\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n      \u003c\/button\u003e\n      \u003cbutton class=\"cf-arrow\" id=\"cfNext\" aria-label=\"Siguiente\"\u003e\n        \u003csvg width=\"18\" height=\"18\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"\u003e\u003cpath d=\"M9 18l6-6-6-6\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- HOW IT WORKS --\u003e\n\u003csection class=\"how\" id=\"como\"\u003e\n  \u003cdiv class=\"section-header\" style=\"padding-top:0\"\u003e\n    \u003cp class=\"eyebrow\"\u003eEl proceso\u003c\/p\u003e\n    \u003ch2\u003eDel cuero a tus llaves\u003c\/h2\u003e\n    \u003cp\u003eCada llavero pasa por tres manos artesanas antes de llegar a ti.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"how-grid\"\u003e\n    \u003cdiv class=\"how-card\"\u003e\n      \u003cdiv class=\"how-num\"\u003e01\u003c\/div\u003e\n      \u003cdiv\u003e\n        \u003ch3\u003eElige tu raza\u003c\/h3\u003e\n        \u003cp\u003eMás de 60 razas en el catálogo. Si no está la tuya, escríbenos y la añadimos.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"how-card\"\u003e\n      \u003cdiv class=\"how-num\"\u003e02\u003c\/div\u003e\n      \u003cdiv\u003e\n        \u003ch3\u003eCortamos y tallamos\u003c\/h3\u003e\n        \u003cp\u003eCuero vegetal curtido, cortado a mano y tallado con la silueta exacta de la raza.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"how-card\"\u003e\n      \u003cdiv class=\"how-num\"\u003e03\u003c\/div\u003e\n      \u003cdiv\u003e\n        \u003ch3\u003eLlega a tu puerta\u003c\/h3\u003e\n        \u003cp\u003eEmpacado en caja kraft con tu nombre. Envío a toda Colombia en 3–5 días hábiles.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- CTA BANNER --\u003e\n\u003cdiv class=\"cta-banner\"\u003e\n  \u003ch2\u003e¿No encuentras tu raza?\u003c\/h2\u003e\n  \u003cp\u003eTenemos más de 60 razas y seguimos creciendo. Escríbenos por WhatsApp y te respondemos en minutos.\u003c\/p\u003e\n  \u003ca href=\"https:\/\/wa.me\/573000000000?text=Hola!+Quiero+un+llavero+de+mi+raza\" class=\"btn-primary\" target=\"_blank\" rel=\"noopener\"\u003e\n    Escribir por WhatsApp\n  \u003c\/a\u003e\n\u003c\/div\u003e\n\n\u003c!-- FOOTER --\u003e\n\u003cfooter\u003e\n  \u003cdiv class=\"footer-logo\"\u003eCapri\u003cspan\u003ePets\u003c\/span\u003e\n\u003c\/div\u003e\n  \u003cp\u003e© 2025 Capri Pets · Bogotá, Colombia · capripets.com\u003c\/p\u003e\n  \u003cp style=\"margin-top:6px\"\u003eLlaveros de cuero artesanales para amantes de perros y gatos\u003c\/p\u003e\n\u003c\/footer\u003e\n\n\u003cscript\u003e\n\/\/ ── BREED DATA ──────────────────────────────────────────────────────────────\n\/\/ Placeholder breed images generated as colored SVG canvases with silhouettes\n\/\/ In production replace imgUrl with real Shopify CDN URLs\n\nconst BREEDS = [\n  \/\/ PERROS\n  { name: \"Golden Retriever\",   type: \"perro\", emoji: \"🐕\", color: \"#D4A017\" },\n  { name: \"Labrador\",           type: \"perro\", emoji: \"🐕\", color: \"#C8A97A\" },\n  { name: \"Bulldog Francés\",    type: \"perro\", emoji: \"🐕\", color: \"#8C7B6E\" },\n  { name: \"Beagle\",             type: \"perro\", emoji: \"🐕\", color: \"#A0855A\" },\n  { name: \"Poodle\",             type: \"perro\", emoji: \"🐕\", color: \"#E8D5C4\" },\n  { name: \"Shih Tzu\",          type: \"perro\", emoji: \"🐕\", color: \"#D4B483\" },\n  { name: \"Yorkshire Terrier\",  type: \"perro\", emoji: \"🐕\", color: \"#6B4F32\" },\n  { name: \"Chihuahua\",          type: \"perro\", emoji: \"🐕\", color: \"#C49A6C\" },\n  { name: \"Border Collie\",      type: \"perro\", emoji: \"🐕\", color: \"#2C2C2C\" },\n  { name: \"Husky Siberiano\",    type: \"perro\", emoji: \"🐕\", color: \"#607D8B\" },\n  { name: \"Dálmata\",            type: \"perro\", emoji: \"🐕\", color: \"#F5F5F5\" },\n  { name: \"Pastor Alemán\",      type: \"perro\", emoji: \"🐕\", color: \"#7B5B3A\" },\n  { name: \"Rottweiler\",         type: \"perro\", emoji: \"🐕\", color: \"#1A1A1A\" },\n  { name: \"Boxer\",              type: \"perro\", emoji: \"🐕\", color: \"#C4874A\" },\n  { name: \"Dachshund\",          type: \"perro\", emoji: \"🐕\", color: \"#8B4513\" },\n  { name: \"Pomerania\",          type: \"perro\", emoji: \"🐕\", color: \"#E8A87C\" },\n  { name: \"Maltés\",             type: \"perro\", emoji: \"🐕\", color: \"#F0EDE8\" },\n  { name: \"Schnauzer\",          type: \"perro\", emoji: \"🐕\", color: \"#9E9E9E\" },\n  { name: \"Bulldog Inglés\",     type: \"perro\", emoji: \"🐕\", color: \"#B8A090\" },\n  { name: \"Cocker Spaniel\",     type: \"perro\", emoji: \"🐕\", color: \"#D4924A\" },\n  \/\/ GATOS\n  { name: \"Persa\",              type: \"gato\",  emoji: \"🐈\", color: \"#F0E0D0\" },\n  { name: \"Siamés\",             type: \"gato\",  emoji: \"🐈\", color: \"#E8D5B0\" },\n  { name: \"Maine Coon\",         type: \"gato\",  emoji: \"🐈\", color: \"#9E7E5A\" },\n  { name: \"Ragdoll\",            type: \"gato\",  emoji: \"🐈\", color: \"#D4C4B8\" },\n  { name: \"British Shorthair\",  type: \"gato\",  emoji: \"🐈\", color: \"#7890A8\" },\n  { name: \"Bengalí\",            type: \"gato\",  emoji: \"🐈\", color: \"#C8A050\" },\n  { name: \"Abisinio\",           type: \"gato\",  emoji: \"🐈\", color: \"#C07840\" },\n  { name: \"Scottish Fold\",      type: \"gato\",  emoji: \"🐈\", color: \"#B0A090\" },\n  { name: \"Sphynx\",             type: \"gato\",  emoji: \"🐈\", color: \"#D4A87A\" },\n  { name: \"Russian Blue\",       type: \"gato\",  emoji: \"🐈\", color: \"#708090\" },\n  { name: \"Angora Turco\",       type: \"gato\",  emoji: \"🐈\", color: \"#F0EDE8\" },\n  { name: \"Burmés\",             type: \"gato\",  emoji: \"🐈\", color: \"#704030\" },\n];\n\n\/\/ Generate a placeholder SVG image for a breed card\nfunction breedSVG(breed) {\n  const bg = breed.color;\n  const em = breed.emoji;\n  return `data:image\/svg+xml;charset=utf-8,${encodeURIComponent(`\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"260\" height=\"210\" viewBox=\"0 0 260 210\"\u003e\u003crect width=\"260\" height=\"210\" fill=\"${bg}\"\/\u003e\u003crect width=\"260\" height=\"210\" fill=\"rgba(0,0,0,0.08)\"\/\u003e\u003ctext x=\"130\" y=\"115\" font-size=\"72\" text-anchor=\"middle\" dominant-baseline=\"middle\"\u003e${em}\u003c\/text\u003e\u003ctext x=\"130\" y=\"172\" font-size=\"11\" text-anchor=\"middle\" fill=\"rgba(255,255,255,0.6)\" font-family=\"sans-serif\" letter-spacing=\"2\"\u003eCUERO ARTESANAL\u003c\/text\u003e\u003c\/svg\u003e`)}`;\n}\n\n\/\/ ── COVERFLOW ENGINE ────────────────────────────────────────────────────────\nconst GAP = 180; \/\/ px between card centers\nlet currentIndex = 0;\nlet filtered = [...BREEDS];\nlet isDragging = false;\nlet startX = 0;\nlet dragDelta = 0;\nlet animating = false;\n\nconst track = document.getElementById('cfTrack');\nconst dotsEl = document.getElementById('cfDots');\nconst container = document.getElementById('cfContainer');\nconst noResults = document.getElementById('noResults');\n\nfunction buildCards() {\n  track.innerHTML = '';\n  dotsEl.innerHTML = '';\n\n  if (filtered.length === 0) {\n    container.style.display = 'none';\n    noResults.style.display = 'block';\n    dotsEl.style.display = 'none';\n    document.querySelector('.cf-arrows').style.display = 'none';\n    return;\n  }\n  container.style.display = 'block';\n  noResults.style.display = 'none';\n  dotsEl.style.display = 'flex';\n  document.querySelector('.cf-arrows').style.display = 'flex';\n\n  filtered.forEach((breed, i) =\u003e {\n    const card = document.createElement('div');\n    card.className = 'cf-card';\n    card.dataset.index = i;\n    card.innerHTML = `\n      \u003cdiv class=\"cf-card-inner\"\u003e\n        \u003cimg class=\"cf-card-img\" src=\"${breedSVG(breed)}\" alt=\"${breed.name}\" draggable=\"false\"\u003e\n        \u003cdiv class=\"cf-card-label\"\u003e\n          \u003cdiv class=\"breed-name\"\u003e${breed.name}\u003c\/div\u003e\n          \u003cdiv class=\"breed-type\"\u003e${breed.type === 'perro' ? 'Perro' : 'Gato'}\u003c\/div\u003e\n          \u003cspan class=\"price-tag\"\u003e$35.000\u003c\/span\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e`;\n    card.addEventListener('click', () =\u003e { if (!isDragging) goTo(i); });\n    track.appendChild(card);\n\n    if (i \u003c Math.min(filtered.length, 20)) {\n      const dot = document.createElement('button');\n      dot.className = 'cf-dot' + (i === currentIndex ? ' active' : '');\n      dot.setAttribute('aria-label', `Ir a ${breed.name}`);\n      dot.addEventListener('click', () =\u003e goTo(i));\n      dotsEl.appendChild(dot);\n    }\n  });\n\n  if (currentIndex \u003e= filtered.length) currentIndex = 0;\n  updatePositions(currentIndex, true);\n}\n\nfunction getCardW() {\n  return parseInt(getComputedStyle(document.documentElement).getPropertyValue('--card-w'));\n}\n\nfunction updatePositions(centerIdx, instant = false) {\n  const cards = track.querySelectorAll('.cf-card');\n  const cardW = getCardW();\n\n  cards.forEach((card, i) =\u003e {\n    const offset = i - centerIdx;\n    const absOff = Math.abs(offset);\n    const tx = offset * GAP;\n    const rotY = offset \u003c 0 ? 45 : offset \u003e 0 ? -45 : 0;\n    const scale = absOff === 0 ? 1 : absOff === 1 ? 0.82 : Math.max(0.65, 0.82 - (absOff - 1) * 0.1);\n    const tz = absOff === 0 ? 0 : -80 - absOff * 30;\n    const opacity = absOff \u003e 3 ? 0 : absOff === 0 ? 1 : Math.max(0.35, 1 - absOff * 0.2);\n\n    const t = instant ? 'none' : '';\n    card.style.transition = t ? 'none' : undefined;\n    card.style.transform = `translateX(${tx - cardW \/ 2}px) translateZ(${tz}px) rotateY(${rotY}deg) scale(${scale})`;\n    card.style.opacity = opacity;\n    card.style.zIndex = 100 - absOff;\n    card.classList.toggle('is-center', offset === 0);\n    if (offset \u003c -3 || offset \u003e 3) card.style.visibility = 'hidden';\n    else card.style.visibility = 'visible';\n  });\n\n  \/\/ Update dots\n  const dots = dotsEl.querySelectorAll('.cf-dot');\n  dots.forEach((d, i) =\u003e d.classList.toggle('active', i === centerIdx));\n}\n\nfunction goTo(idx, instant = false) {\n  if (idx \u003c 0) idx = filtered.length - 1;\n  if (idx \u003e= filtered.length) idx = 0;\n  currentIndex = idx;\n  updatePositions(currentIndex, instant);\n}\n\n\/\/ ── Drag \/ Swipe ────────────────────────────────────────────────────────────\nlet pointerDown = false;\nlet pointerStartX = 0;\nlet moved = false;\n\ncontainer.addEventListener('pointerdown', e =\u003e {\n  pointerDown = true;\n  pointerStartX = e.clientX;\n  moved = false;\n  container.setPointerCapture(e.pointerId);\n});\n\ncontainer.addEventListener('pointermove', e =\u003e {\n  if (!pointerDown) return;\n  const dx = e.clientX - pointerStartX;\n  if (Math.abs(dx) \u003e 6) moved = true;\n  if (moved) {\n    \/\/ Live drag preview\n    const cards = track.querySelectorAll('.cf-card');\n    const drag = dx \/ GAP;\n    const fakeIdx = currentIndex - drag;\n    const cardW = getCardW();\n    cards.forEach((card, i) =\u003e {\n      const offset = i - fakeIdx;\n      const absOff = Math.abs(offset);\n      const tx = offset * GAP;\n      const rotY = offset \u003c 0 ? 45 : offset \u003e 0 ? -45 : 0;\n      const scale = Math.max(0.55, 1 - absOff * 0.18);\n      const tz = -Math.min(absOff * 60, 200);\n      card.style.transition = 'none';\n      card.style.transform = `translateX(${tx - cardW \/ 2}px) translateZ(${tz}px) rotateY(${rotY}deg) scale(${scale})`;\n      card.style.opacity = absOff \u003e 3 ? 0 : Math.max(0.3, 1 - absOff * 0.2);\n      card.style.zIndex = 100 - Math.round(absOff);\n    });\n  }\n});\n\ncontainer.addEventListener('pointerup', e =\u003e {\n  if (!pointerDown) return;\n  pointerDown = false;\n  const dx = e.clientX - pointerStartX;\n  if (Math.abs(dx) \u003e 40) {\n    goTo(currentIndex + (dx \u003c 0 ? 1 : -1));\n  } else {\n    goTo(currentIndex);\n  }\n});\n\ncontainer.addEventListener('pointercancel', () =\u003e {\n  pointerDown = false;\n  goTo(currentIndex);\n});\n\n\/\/ Touch swipe (fallback for non-pointer browsers)\ncontainer.addEventListener('touchstart', e =\u003e {\n  startX = e.touches[0].clientX;\n}, { passive: true });\ncontainer.addEventListener('touchend', e =\u003e {\n  const dx = e.changedTouches[0].clientX - startX;\n  if (Math.abs(dx) \u003e 40) goTo(currentIndex + (dx \u003c 0 ? 1 : -1));\n}, { passive: true });\n\n\/\/ Keyboard\ncontainer.setAttribute('tabindex', '0');\ncontainer.addEventListener('keydown', e =\u003e {\n  if (e.key === 'ArrowLeft') goTo(currentIndex - 1);\n  if (e.key === 'ArrowRight') goTo(currentIndex + 1);\n});\n\n\/\/ Arrow buttons\ndocument.getElementById('cfPrev').addEventListener('click', () =\u003e goTo(currentIndex - 1));\ndocument.getElementById('cfNext').addEventListener('click', () =\u003e goTo(currentIndex + 1));\n\n\/\/ Mouse wheel\ncontainer.addEventListener('wheel', e =\u003e {\n  e.preventDefault();\n  if (e.deltaX \u003e 30 || e.deltaY \u003e 30) goTo(currentIndex + 1);\n  else if (e.deltaX \u003c -30 || e.deltaY \u003c -30) goTo(currentIndex - 1);\n}, { passive: false });\n\n\/\/ ── SEARCH + FILTER ─────────────────────────────────────────────────────────\nlet activeFilter = 'all';\n\nfunction applyFilters() {\n  const q = document.getElementById('searchInput').value.toLowerCase().trim();\n  filtered = BREEDS.filter(b =\u003e {\n    const matchType = activeFilter === 'all' || b.type === activeFilter;\n    const matchQ = !q || b.name.toLowerCase().includes(q);\n    return matchType \u0026\u0026 matchQ;\n  });\n  currentIndex = 0;\n  buildCards();\n}\n\ndocument.getElementById('searchInput').addEventListener('input', applyFilters);\n\ndocument.querySelectorAll('.tab').forEach(tab =\u003e {\n  tab.addEventListener('click', () =\u003e {\n    document.querySelectorAll('.tab').forEach(t =\u003e t.classList.remove('active'));\n    tab.classList.add('active');\n    activeFilter = tab.dataset.filter;\n    applyFilters();\n  });\n});\n\n\/\/ ── INIT ────────────────────────────────────────────────────────────────────\nbuildCards();\n\n\/\/ Auto-advance (pauses on interaction)\nlet autoTimer = setInterval(() =\u003e {\n  if (!pointerDown) goTo(currentIndex + 1);\n}, 4000);\n\ncontainer.addEventListener('pointerdown', () =\u003e clearInterval(autoTimer));\n\u003c\/script\u003e\n\n\u003c\/body\u003e","brand":"Fast Bundle","offers":[{"title":"Default Title","offer_id":59977983950929,"sku":"97f01011-aeb9-449f-954c-47ac59b7c650","price":200000.0,"currency_code":"COP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/7677\/7297\/files\/ChatGPTImage3ago2026_02_18_32p.m._894bf6c5-ad22-4ad4-ae66-42639dead598.png?v=1785960611"}],"url":"https:\/\/capripets.myshopify.com\/collections\/correas.oembed","provider":"Capri","version":"1.0","type":"link"}