{"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":32.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0665\/7677\/7297\/files\/ChatGPTImage3ago2026_02_16_08p.m..png?v=1785784728","url":"https:\/\/capripets.myshopify.com\/products\/correa-llavero","provider":"Capri","version":"1.0","type":"link"}