{"product_id":"personalised-cross-necklace-o6","title":"Personalised Cross Necklace — O6","description":"\u003cdiv class=\"o6n-root\" id=\"o6n-root\"\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=Great+Vibes\u0026amp;family=Cormorant+Garamond:ital,wght@0,500;0,600;1,500\u0026amp;family=Inter:wght@400;500;600;700\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003cstyle\u003e\n.o6n-root{--o6n-red:#a42325;--o6n-red-dark:#821c1e;--o6n-cream:#faf6f1;--o6n-sand:#f0eae2;--o6n-ink:#2b2622;--o6n-muted:#6b5d4a;--o6n-hair:#e2d7c6;--o6n-gold:#c9a94f;--o6n-gold-deep:#a9832f;container-type:inline-size;font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;color:var(--o6n-ink);line-height:1.4;margin:0 0 20px}\n.o6n-root *{box-sizing:border-box}\n.o6n-root img,.o6n-root svg{max-width:100%;display:block}\n.o6n-root button{font-family:inherit}\n.o6n-vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n.o6n-head{text-align:center;padding:0 4px clamp(8px,2cqi,14px)}\n.o6n-h1{font-family:'Cormorant Garamond',Georgia,serif;font-weight:600;font-size:clamp(1.15rem,4.6cqi,1.55rem);color:var(--o6n-ink);margin:0 0 3px}\n.o6n-sub{font-size:.8rem;color:var(--o6n-muted);margin:0}\n.o6n-card{background:radial-gradient(60cqw 40cqh at 90% -10%,rgba(164,35,37,.10),transparent 60%),radial-gradient(50cqw 40cqh at -10% 110%,rgba(201,169,79,.18),transparent 60%),linear-gradient(160deg,#faf6f1,#f3ece0 60%,#efe2d0);border:1px solid var(--o6n-hair);border-radius:20px;padding:clamp(14px,4cqi,22px);margin-top:clamp(12px,3cqi,18px)}\n.o6n-layout{display:flex;flex-direction:column;gap:clamp(12px,3cqi,20px)}\n.o6n-hero-pane{display:flex;flex-direction:column;gap:8px}\n.o6n-mini{display:none;align-items:center;gap:10px;padding:8px 10px;border-radius:12px;background:rgba(255,255,255,.72);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.6)}\n.o6n-kb .o6n-mini{display:flex}\n.o6n-kb .o6n-hero,.o6n-kb .o6n-cap{display:none}\n.o6n-mini-thumb{width:40px;height:40px;border-radius:9px;background:var(--o6n-sand) url('https:\/\/ae01.alicdn.com\/kf\/S8440239dad4949ba924290eb1e4c9014U.jpg') center\/cover;flex:0 0 auto;box-shadow:0 2px 6px rgba(0,0,0,.18)}\n.o6n-mini-text{font-family:'Cormorant Garamond',Georgia,serif;font-weight:600;font-size:.92rem;color:var(--o6n-ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.o6n-hero{position:relative;width:100%;aspect-ratio:1\/1;border-radius:16px;overflow:hidden;box-shadow:0 10px 26px rgba(107,74,47,.22);background:var(--o6n-sand)}\n.o6n-scene{position:absolute;inset:0;background:url('https:\/\/ae01.alicdn.com\/kf\/S8440239dad4949ba924290eb1e4c9014U.jpg') center\/cover;transform-origin:51% 66%}\n.o6n-scene.o6n-zoomed{transform:scale(1.8)}\n.o6n-wpatch{position:absolute;left:44.5%;top:48.4%;width:15.5%;height:34.5%;background:linear-gradient(160deg,#f9f8f6 0%,#f1f0ed 55%,#eae8e4 100%);box-shadow:0 0 20px 16px rgba(241,240,237,.95);border-radius:12px}\n.o6n-stem{position:absolute;left:49.8%;top:48.4%;width:3.2%;height:31.8%;background:linear-gradient(90deg,#a3780f,#edc95c 45%,#d9ad33 70%,#8f680b);border-radius:2px 2px 3px 3px;box-shadow:-2px 3px 4px rgba(120,110,90,.28)}\n.o6n-empty-outline{position:absolute;left:44.5%;top:48.4%;width:15.5%;height:34.5%;border:1.5px dashed rgba(120,85,20,.55);border-radius:12px;display:none}\n.o6n-blank .o6n-empty-outline{display:block}\n.o6n-nk-name{position:absolute;left:51.4%;top:49%;transform:translateX(-50%);writing-mode:vertical-rl;font-family:'Great Vibes',cursive;color:#241804;white-space:nowrap;line-height:1;font-size:26px;text-shadow:-.5px -.5px .4px rgba(10,6,0,.7),.6px .6px .8px #f7e6a6,0 1px 2px rgba(10,6,0,.35)}\n.o6n-blank .o6n-nk-name{opacity:0}\n.o6n-zoom-btn{position:absolute;inset:0;width:100%;height:100%;padding:0;margin:0;border:0;background:transparent;cursor:zoom-in;-webkit-tap-highlight-color:transparent}\n.o6n-zoom-btn[aria-pressed=\"true\"]{cursor:zoom-out}\n.o6n-zoom-btn:focus-visible{outline:3px solid var(--o6n-gold);outline-offset:-3px}\n.o6n-zoom-badge{position:absolute;right:4%;bottom:4%;width:42px;height:42px;border-radius:50%;background:rgba(43,38,34,.72);color:#fff;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 10px rgba(0,0,0,.25)}\n.o6n-zoom-badge svg{width:20px;height:20px}\n.o6n-zoom-btn[aria-pressed=\"true\"] .o6n-plus-v{display:none}\n.o6n-cap{font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;color:#8b6a45;margin:6px 0 0;text-align:center}\n.o6n-form-pane{display:flex;flex-direction:column;justify-content:center}\n.o6n-form-card{background:rgba(255,255,255,.66);backdrop-filter:blur(16px) saturate(160%);-webkit-backdrop-filter:blur(16px) saturate(160%);border:1px solid rgba(255,255,255,.75);border-radius:18px;padding:clamp(14px,4cqi,20px);box-shadow:0 8px 24px rgba(107,74,47,.14)}\n.o6n-fieldset{border:0;padding:0;margin:0;min-width:0}\n.o6n-price-row{display:flex;align-items:baseline;flex-wrap:wrap;gap:8px;margin:0 0 12px}\n.o6n-price-now{font-family:'Cormorant Garamond',Georgia,serif;font-weight:600;font-size:clamp(1.4rem,5.2cqi,1.8rem);color:var(--o6n-red)}\n.o6n-field-label{display:flex;justify-content:space-between;align-items:baseline;margin:0 0 6px}\n.o6n-field-label label{font-size:.7rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--o6n-muted)}\n.o6n-counter{font-size:.68rem;color:#8b7a5f;font-variant-numeric:tabular-nums}\n.o6n-counter.o6n-max{color:var(--o6n-red);font-weight:700}\n.o6n-root input[type=text],.o6n-root textarea{width:100%;min-height:48px;font-size:16px;padding:12px 14px;border:1px solid #d8cbb8;border-radius:10px;background:#fff;color:var(--o6n-ink);font-family:'Inter',sans-serif;margin:0 0 14px}\n.o6n-root textarea{min-height:56px;resize:none;line-height:1.35;padding-top:10px}\n.o6n-root input[type=text]:focus-visible,.o6n-root textarea:focus-visible{outline:2px solid var(--o6n-red);outline-offset:1px;border-color:var(--o6n-red)}\n.o6n-root input[type=text].o6n-err{border-color:var(--o6n-red);background:#fdf0ef}\n.o6n-style-fieldset{border:0;padding:0;margin:0 0 14px}\n.o6n-style-legend{font-size:.7rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--o6n-muted);padding:0;margin:0 0 8px}\n.o6n-chips{display:flex;gap:8px;flex-wrap:wrap}\n.o6n-chip{position:relative;display:flex}\n.o6n-chip input{position:absolute;opacity:0;width:100%;height:100%;margin:0;cursor:pointer}\n.o6n-chip-face{min-height:48px;display:flex;align-items:center;padding:0 16px;border-radius:999px;border:1.5px solid #d8cbb8;background:#fff;font-size:.86rem;color:var(--o6n-ink)}\n.o6n-chip input:checked+.o6n-chip-face{border-color:var(--o6n-red);background:var(--o6n-red);color:#fff}\n.o6n-chip input:focus-visible+.o6n-chip-face{outline:2px solid var(--o6n-gold-deep);outline-offset:2px}\n.o6n-date-chips{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 14px}\n.o6n-date-chip{min-height:48px;padding:0 14px;border-radius:999px;border:1.5px solid #d8cbb8;background:#fff;font:600 .8rem\/1 'Inter',sans-serif;color:var(--o6n-ink);cursor:pointer}\n.o6n-date-chip:hover{border-color:var(--o6n-gold-deep)}\n.o6n-date-chip:focus-visible{outline:2px solid var(--o6n-red);outline-offset:2px}\n.o6n-gift-wrap{margin:0 0 14px}\n.o6n-gift-toggle{min-height:44px;padding:2px 4px;border:0;background:transparent;color:var(--o6n-gold-deep);font:700 .78rem\/1 'Inter',sans-serif;letter-spacing:.03em;cursor:pointer;display:inline-flex;align-items:center;gap:6px}\n.o6n-gift-toggle:focus-visible{outline:2px solid var(--o6n-red);outline-offset:2px;border-radius:4px}\n.o6n-gift-panel{margin-top:8px}\n.o6n-gift-panel[hidden]{display:none}\n.o6n-trust{font-size:.78rem;color:var(--o6n-muted);margin:2px 0 12px}\n.o6n-ready{font-size:.84rem;font-weight:600;color:var(--o6n-ink);margin:0;padding:10px 12px;border-radius:10px;background:rgba(240,234,226,.7);border:1px solid var(--o6n-hair)}\n.o6n-ready.o6n-ready-on{background:rgba(201,169,79,.16);border-color:var(--o6n-gold);color:#5c4a1e}\n.o6n-error{margin:8px 0 0;padding:8px 12px;border-radius:10px;background:#fdf0ef;border:1px solid var(--o6n-red);color:var(--o6n-red-dark);font-size:.8rem;font-weight:600}\n.o6n-error[hidden]{display:none}\n.o6n-cta-bar{position:sticky;bottom:0;z-index:5;margin-top:14px;background:rgba(43,38,34,.97);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-radius:14px;box-shadow:0 8px 22px rgba(0,0,0,.22);padding:10px 14px max(10px,env(safe-area-inset-bottom))}\n.o6n-cta-inner{display:flex;align-items:center;justify-content:space-between;gap:12px}\n.o6n-cta-price{font-family:'Cormorant Garamond',Georgia,serif;color:#f0e6d6;font-size:.8rem;line-height:1.15}\n.o6n-cta-price strong{display:block;font-size:1.3rem;color:#fff}\n.o6n-cta-btn{flex:0 0 auto;min-height:48px;padding:0 20px;border:none;border-radius:12px;background:var(--o6n-red);color:#fff;font:700 .9rem\/1 'Inter',sans-serif;letter-spacing:.01em;cursor:pointer}\n.o6n-cta-btn:hover{background:var(--o6n-red-dark)}\n.o6n-cta-btn:focus-visible{outline:2px solid #fff;outline-offset:2px}\n@media (prefers-reduced-motion:no-preference){\n  .o6n-scene{transition:transform .3s ease}\n  .o6n-root input[type=text],.o6n-root textarea{transition:border-color .12s ease}\n  .o6n-chip-face{transition:background .12s ease,border-color .12s ease}\n  .o6n-date-chip{transition:border-color .12s ease}\n  .o6n-ready{transition:background .2s ease,border-color .2s ease}\n  .o6n-cta-btn{transition:transform .08s ease,background .12s ease}\n  .o6n-cta-btn:active{transform:scale(.97)}\n}\n@container (min-width:520px){\n  .o6n-layout{flex-direction:row;align-items:center}\n  .o6n-hero-pane,.o6n-form-pane{flex:1 1 0;min-width:0}\n  .o6n-form-card{padding:clamp(18px,3cqi,26px)}\n}\n@container (max-width:519.98px){\n  .o6n-kb .o6n-mini{display:flex}\n}\n\u003c\/style\u003e\n\u003cheader class=\"o6n-head\"\u003e\n  \u003ch1 class=\"o6n-h1\"\u003ePersonalise the Cross Necklace\u003c\/h1\u003e\n  \u003cp class=\"o6n-sub\"\u003eType the name — it flows down the cross as you write.\u003c\/p\u003e\n\u003c\/header\u003e\n\u003cdiv class=\"o6n-card\"\u003e\n  \u003cdiv class=\"o6n-layout\"\u003e\n    \u003csection class=\"o6n-hero-pane\" aria-label=\"Live engraving preview\"\u003e\n      \u003cdiv class=\"o6n-mini\" id=\"o6n-mini\" aria-hidden=\"true\"\u003e\n        \u003cspan class=\"o6n-mini-thumb\"\u003e\u003c\/span\u003e\n        \u003cspan class=\"o6n-mini-text\" id=\"o6n-miniText\"\u003eStart typing to preview your engraving\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"o6n-hero\" id=\"o6n-hero\"\u003e\n        \u003cdiv class=\"o6n-scene\" id=\"o6n-scene\" aria-hidden=\"true\"\u003e\n          \u003cdiv class=\"o6n-wpatch\"\u003e\u003c\/div\u003e\n          \u003cdiv class=\"o6n-stem\"\u003e\u003c\/div\u003e\n          \u003cdiv class=\"o6n-empty-outline\"\u003e\u003c\/div\u003e\n          \u003cdiv class=\"o6n-nk-name\" id=\"o6n-ovName\"\u003e\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cbutton type=\"button\" class=\"o6n-zoom-btn\" id=\"o6n-zoomBtn\" aria-pressed=\"false\" aria-label=\"Zoom into the engraving\"\u003e\n          \u003cspan class=\"o6n-zoom-badge\"\u003e\n            \u003csvg viewbox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"\u003e\n              \u003ccircle cx=\"11\" cy=\"11\" r=\"6.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\u003e\u003c\/circle\u003e\n              \u003cline x1=\"16\" y1=\"16\" x2=\"21\" y2=\"21\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\n              \u003cline class=\"o6n-plus-v\" x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\n              \u003cline x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"\u003e\u003c\/line\u003e\n            \u003c\/svg\u003e\n          \u003c\/span\u003e\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n      \u003cp class=\"o6n-cap\" id=\"o6n-heroCap\"\u003eType a name to see it engraved · tap photo to zoom\u003c\/p\u003e\n    \u003c\/section\u003e\n    \u003csection class=\"o6n-form-pane\" aria-label=\"Personalise your necklace\"\u003e\n      \u003cdiv class=\"o6n-form-card\"\u003e\n        \u003cfieldset class=\"o6n-fieldset\"\u003e\n          \u003clegend class=\"o6n-vh\"\u003ePersonalise this necklace\u003c\/legend\u003e\n          \u003cdiv class=\"o6n-price-row\"\u003e\u003cspan class=\"o6n-price-now\"\u003e£17\u003c\/span\u003e\u003c\/div\u003e\n\n          \u003cdiv class=\"o6n-field-label\"\u003e\n            \u003clabel for=\"o6n-nameInput\"\u003eName\u003c\/label\u003e\n            \u003cspan class=\"o6n-counter\" id=\"o6n-nameCounter\"\u003e0\/12\u003c\/span\u003e\n          \u003c\/div\u003e\n          \u003cinput id=\"o6n-nameInput\" type=\"text\" maxlength=\"12\" placeholder=\"e.g. Olivia\" autocomplete=\"off\" inputmode=\"text\" aria-describedby=\"o6n-nameCounter o6n-trust\"\u003e\n\n          \u003cfieldset class=\"o6n-style-fieldset\"\u003e\n            \u003clegend class=\"o6n-style-legend\"\u003eEngraving style\u003c\/legend\u003e\n            \u003cdiv class=\"o6n-chips\"\u003e\n              \u003clabel class=\"o6n-chip\"\u003e\n                \u003cinput type=\"radio\" name=\"o6n-style\" value=\"script\" checked\u003e\n                \u003cspan class=\"o6n-chip-face\" style=\"font-family:'Great Vibes',cursive;font-size:1.05rem\"\u003eScript\u003c\/span\u003e\n              \u003c\/label\u003e\n              \u003clabel class=\"o6n-chip\"\u003e\n                \u003cinput type=\"radio\" name=\"o6n-style\" value=\"classic\"\u003e\n                \u003cspan class=\"o6n-chip-face\" style=\"font-family:'Cormorant Garamond',Georgia,serif;font-weight:600\"\u003eClassic\u003c\/span\u003e\n              \u003c\/label\u003e\n              \u003clabel class=\"o6n-chip\"\u003e\n                \u003cinput type=\"radio\" name=\"o6n-style\" value=\"modern\"\u003e\n                \u003cspan class=\"o6n-chip-face\" style=\"font-family:'Inter',sans-serif;letter-spacing:.04em;font-weight:600\"\u003eModern\u003c\/span\u003e\n              \u003c\/label\u003e\n            \u003c\/div\u003e\n          \u003c\/fieldset\u003e\n\n          \u003cdiv class=\"o6n-field-label\"\u003e\n            \u003clabel for=\"o6n-dateInput\"\u003eBaptism date\u003c\/label\u003e\n            \u003cspan class=\"o6n-counter\" id=\"o6n-dateCounter\"\u003e0\/16\u003c\/span\u003e\n          \u003c\/div\u003e\n          \u003cinput id=\"o6n-dateInput\" type=\"text\" maxlength=\"16\" placeholder=\"e.g. 14 Sept 2026\" autocomplete=\"off\" inputmode=\"text\" aria-describedby=\"o6n-dateCounter o6n-trust\"\u003e\n          \u003cdiv class=\"o6n-date-chips\" role=\"group\" aria-label=\"Quick date formats\"\u003e\n            \u003cbutton type=\"button\" class=\"o6n-date-chip\" data-date=\"14 Sept 2026\"\u003e14 Sept 2026\u003c\/button\u003e\n            \u003cbutton type=\"button\" class=\"o6n-date-chip\" data-date=\"14 · 09 · 2026\"\u003e14 · 09 · 2026\u003c\/button\u003e\n            \u003cbutton type=\"button\" class=\"o6n-date-chip\" data-date=\"14.09.2026\"\u003e14.09.2026\u003c\/button\u003e\n          \u003c\/div\u003e\n\n          \u003cdiv class=\"o6n-gift-wrap\"\u003e\n            \u003cbutton type=\"button\" class=\"o6n-gift-toggle\" id=\"o6n-giftToggle\" aria-expanded=\"false\" aria-controls=\"o6n-giftPanel\"\u003e+ Add a gift note (optional)\u003c\/button\u003e\n            \u003cdiv class=\"o6n-gift-panel\" id=\"o6n-giftPanel\" hidden\u003e\n              \u003cdiv class=\"o6n-field-label\"\u003e\n                \u003clabel for=\"o6n-gift\"\u003eGift note\u003c\/label\u003e\n                \u003cspan class=\"o6n-counter\" id=\"o6n-giftCounter\"\u003e0\/120\u003c\/span\u003e\n              \u003c\/div\u003e\n              \u003ctextarea id=\"o6n-gift\" maxlength=\"120\" rows=\"2\" placeholder=\"A short note for the gift card (optional)\" aria-describedby=\"o6n-giftCounter\"\u003e\u003c\/textarea\u003e\n            \u003c\/div\u003e\n          \u003c\/div\u003e\n\n          \u003cp class=\"o6n-trust\" id=\"o6n-trust\"\u003eWe email you a proof before anything is engraved. · EU dispatch — typically 4–8 working days.\u003c\/p\u003e\n\n          \u003cp class=\"o6n-ready\" id=\"o6n-ready\" aria-live=\"polite\" aria-atomic=\"true\"\u003eAdd a name and date to personalise the necklace.\u003c\/p\u003e\n          \u003cp class=\"o6n-error\" id=\"o6n-error\" role=\"alert\" hidden\u003e\u003c\/p\u003e\n        \u003c\/fieldset\u003e\n      \u003c\/div\u003e\n    \u003c\/section\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"o6n-cta-bar\"\u003e\n    \u003cdiv class=\"o6n-cta-inner\"\u003e\n      \u003cspan class=\"o6n-cta-price\"\u003ePersonalised for you\u003cstrong\u003e£17\u003c\/strong\u003e\u003c\/span\u003e\n      \u003cbutton type=\"button\" class=\"o6n-cta-btn\" id=\"o6n-addBtn\"\u003e£17 · Add to cart\u003c\/button\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  function init(){\n    var root=document.getElementById('o6n-root');\n    if(!root) return;\n    var hero=document.getElementById('o6n-hero'),\n        scene=document.getElementById('o6n-scene'),\n        zoomBtn=document.getElementById('o6n-zoomBtn'),\n        heroCap=document.getElementById('o6n-heroCap'),\n        miniText=document.getElementById('o6n-miniText'),\n        nameInput=document.getElementById('o6n-nameInput'),\n        dateInput=document.getElementById('o6n-dateInput'),\n        nameCounter=document.getElementById('o6n-nameCounter'),\n        dateCounter=document.getElementById('o6n-dateCounter'),\n        styleRadios=root.querySelectorAll('input[name=\"o6n-style\"]'),\n        dateChips=root.querySelectorAll('.o6n-date-chip'),\n        giftToggle=document.getElementById('o6n-giftToggle'),\n        giftPanel=document.getElementById('o6n-giftPanel'),\n        giftInput=document.getElementById('o6n-gift'),\n        giftCounter=document.getElementById('o6n-giftCounter'),\n        ovName=document.getElementById('o6n-ovName'),\n        readyRow=document.getElementById('o6n-ready'),\n        errorEl=document.getElementById('o6n-error'),\n        addBtn=document.getElementById('o6n-addBtn');\n    if(!hero||!scene||!nameInput||!dateInput||!ovName||!readyRow) return;\n\n    var STYLES={\n      script:{family:\"'Great Vibes',cursive\",weight:400,spacing:'0',lenFactor:.38,widthCap:.105,label:'Script'},\n      classic:{family:\"'Cormorant Garamond',Georgia,serif\",weight:600,spacing:'.01em',lenFactor:.60,widthCap:.095,label:'Classic'},\n      modern:{family:\"'Inter',-apple-system,sans-serif\",weight:700,spacing:'.05em',lenFactor:.80,widthCap:.086,label:'Modern'}\n    };\n\n    function currentStyleKey(){\n      for(var i=0;i\u003cstyleRadios.length;i++){ if(styleRadios[i].checked) return styleRadios[i].value; }\n      return 'script';\n    }\n\n    function reduceMotion(){ return window.matchMedia \u0026\u0026 window.matchMedia('(prefers-reduced-motion: reduce)').matches; }\n\n    function fit(){\n      var w=scene.clientWidth||hero.clientWidth||340, h=scene.clientHeight||hero.clientHeight||340;\n      var st=STYLES[currentStyleKey()]||STYLES.script;\n      var n=nameInput.value.trim();\n      var len=Math.max(5, n.length||5);\n      var fs=Math.min(w*st.widthCap, (h*.27)\/(len*st.lenFactor));\n      ovName.style.fontSize=fs+'px';\n      ovName.style.fontFamily=st.family;\n      ovName.style.fontWeight=String(st.weight);\n      ovName.style.letterSpacing=st.spacing;\n    }\n\n    function setP(f,k,v){\n      var el=f.querySelector('input[data-af=\"'+k+'\"]');\n      if(!v){ if(el) el.remove(); return; }\n      if(!el){ el=document.createElement('input'); el.type='hidden'; el.name='properties['+k+']'; el.setAttribute('data-af',k); f.appendChild(el); }\n      el.value=v;\n    }\n    function inject(){\n      var forms=document.querySelectorAll('form[action*=\"\/cart\/add\"]');\n      var st=STYLES[currentStyleKey()]||STYLES.script;\n      for(var i=0;i\u003cforms.length;i++){\n        setP(forms[i],'Engraved name',nameInput.value.trim());\n        setP(forms[i],'Baptism date',dateInput.value.trim());\n        setP(forms[i],'Engraving style',st.label);\n        setP(forms[i],'Gift note',giftInput?giftInput.value.trim():'');\n      }\n    }\n\n    function render(){\n      var nameVal=nameInput.value.trim(), dateVal=dateInput.value.trim();\n      var blank=nameVal.length===0;\n      root.classList.toggle('o6n-blank', blank);\n\n      ovName.textContent=nameVal;\n      fit();\n\n      var len=nameInput.value.length, dlen=dateInput.value.length;\n      nameCounter.textContent=len+'\/12'; nameCounter.classList.toggle('o6n-max', len\u003e=12);\n      dateCounter.textContent=dlen+'\/16'; dateCounter.classList.toggle('o6n-max', dlen\u003e=16);\n\n      if(heroCap) heroCap.textContent = blank ? 'Type a name to see it engraved · tap photo to zoom' : 'Live preview on the actual necklace · tap photo to zoom';\n\n      var readyText;\n      if(nameVal \u0026\u0026 dateVal){ readyText=\"✓ Ready — we'll email your proof before engraving\"; readyRow.classList.add('o6n-ready-on'); }\n      else if(nameVal){ readyText='Add a baptism date to finish personalising.'; readyRow.classList.remove('o6n-ready-on'); }\n      else if(dateVal){ readyText='Add a name to finish personalising.'; readyRow.classList.remove('o6n-ready-on'); }\n      else { readyText='Add a name and date to personalise the necklace.'; readyRow.classList.remove('o6n-ready-on'); }\n      readyRow.textContent=readyText;\n\n      if(miniText) miniText.textContent=(nameVal||dateVal)?(nameVal+(nameVal\u0026\u0026dateVal?' · ':'')+dateVal):'Start typing to preview your engraving';\n\n      if(giftCounter \u0026\u0026 giftInput){ giftCounter.textContent=giftInput.value.length+'\/120'; giftCounter.classList.toggle('o6n-max', giftInput.value.length\u003e=120); }\n\n      if(errorEl \u0026\u0026 !errorEl.hidden) errorEl.hidden=true;\n\n      inject();\n    }\n\n    function setCompact(on){ root.classList.toggle('o6n-kb', on); }\n    [nameInput,dateInput].forEach(function(f){\n      f.addEventListener('focus', function(){ setCompact(true); });\n      f.addEventListener('blur', function(){ setTimeout(function(){ if(document.activeElement!==nameInput \u0026\u0026 document.activeElement!==dateInput) setCompact(false); }, 60); });\n    });\n\n    nameInput.addEventListener('input', render);\n    dateInput.addEventListener('input', render);\n    for(var i=0;i\u003cstyleRadios.length;i++){ styleRadios[i].addEventListener('change', render); }\n    for(var j=0;j\u003cdateChips.length;j++){\n      dateChips[j].addEventListener('click', function(e){\n        var val=e.currentTarget.getAttribute('data-date')||'';\n        dateInput.value=val;\n        render();\n        dateInput.focus();\n      });\n    }\n    if(giftToggle \u0026\u0026 giftPanel){\n      giftToggle.addEventListener('click', function(){\n        var expanded=giftToggle.getAttribute('aria-expanded')==='true';\n        giftToggle.setAttribute('aria-expanded', String(!expanded));\n        if(expanded){ giftPanel.setAttribute('hidden',''); } else { giftPanel.removeAttribute('hidden'); if(giftInput) giftInput.focus(); }\n      });\n    }\n    if(giftInput){ giftInput.addEventListener('input', render); }\n    if(zoomBtn \u0026\u0026 scene){\n      zoomBtn.addEventListener('click', function(){\n        var on=zoomBtn.getAttribute('aria-pressed')!=='true';\n        zoomBtn.setAttribute('aria-pressed', String(on));\n        scene.classList.toggle('o6n-zoomed', on);\n      });\n    }\n    window.addEventListener('resize', fit);\n    document.addEventListener('submit', inject, true);\n    document.addEventListener('click', inject, true);\n    setInterval(inject, 1500);\n\n    if(addBtn){\n      addBtn.addEventListener('click', function(){\n        var nameOk=nameInput.value.trim().length\u003e0, dateOk=dateInput.value.trim().length\u003e0;\n        if(!nameOk||!dateOk){\n          var target=!nameOk?nameInput:dateInput;\n          target.classList.add('o6n-err');\n          target.focus();\n          setTimeout(function(){ target.classList.remove('o6n-err'); }, 1200);\n          if(errorEl){ errorEl.textContent=!nameOk?'Please add a name to continue.':'Please add a baptism date to continue.'; errorEl.hidden=false; }\n          return;\n        }\n        if(errorEl) errorEl.hidden=true;\n        inject();\n        var form=document.querySelector('form[action*=\"\/cart\/add\"]');\n        if(form){ if(typeof form.requestSubmit==='function') form.requestSubmit(); else form.submit(); }\n        else { window.scrollTo({top:0,left:0,behavior:reduceMotion()?'auto':'smooth'}); }\n      });\n    }\n\n    render();\n  }\n  if(document.readyState==='loading') document.addEventListener('DOMContentLoaded', init); else init();\n})();\n\u003c\/script\u003e\n\u003c\/div\u003e\n","brand":"Aurea Faith","offers":[{"title":"Default Title","offer_id":58514890785103,"sku":null,"price":17.0,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1000\/9175\/6879\/files\/S8440239dad4949ba924290eb1e4c9014U_1172c4ff-cbc1-457d-bb37-3ab6a2c4f137.webp?v=1787136513","url":"https:\/\/www.aureafaith.com\/products\/personalised-cross-necklace-o6","provider":"Aurea Faith","version":"1.0","type":"link"}