{"product_id":"fairyliora-heartbeat-eau-de-parfum","title":"FairyLiora™ — Heartbeat Eau de Parfum","description":"\u003c!-- FairyLiora™ Heartbeat Eau de Parfum — product description. Scoped to .fld. --\u003e\n\u003cdiv class=\"fld\"\u003e\n\u003cstyle\u003e\n.fld{--gold:#C9952A;--goldD:#8A6418;--ink:#1A1612;--char:#2D2926;--gray:#8C857C;--ivd:#E2D8CA;--ivm:#F0EAE0;--pad:clamp(16px,3vw,28px);font-family:'DM Sans',-apple-system,BlinkMacSystemFont,sans-serif;color:var(--char);max-width:1200px;margin:0 auto;}\n.fld *{box-sizing:border-box}\n.fld img{display:block;max-width:100%;height:auto}\n.fld .fld-serif{font-family:'DM Serif Display',Georgia,serif;font-weight:400}\n.fld .fld-eye{font-size:10px;letter-spacing:.22em;text-transform:uppercase;color:var(--gray);margin:0}\n.fld .fld-h2{font-family:'DM Serif Display',Georgia,serif;font-weight:400;font-size:clamp(26px,3.4vw,38px);line-height:1.12;color:var(--ink);margin:8px 0 14px;text-wrap:pretty}\n.fld .fld-lead{font-size:15px;line-height:1.65;color:var(--char);margin:0;text-wrap:pretty}\n.fld .fld-sec{padding:44px 0 0}\n.fld .fld-details{display:grid;grid-template-columns:minmax(0,1fr);margin-top:8px;border-top:.5px solid var(--ivd)}\n.fld .fld-row{display:grid;grid-template-columns:96px minmax(0,1fr);gap:14px;padding:14px 0;border-bottom:.5px solid var(--ivd);font-size:14px;line-height:1.5;margin:0}\n.fld .fld-row dt{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--gray);padding-top:3px;margin:0}\n.fld .fld-row dd{margin:0}\n.fld .fld-story{display:grid;grid-template-columns:minmax(0,1fr);gap:18px;align-items:center}\n.fld .fld-fig{margin:0;border-radius:14px;overflow:hidden;background:var(--ivm)}\n.fld .fld-fig img{width:100%;height:100%;object-fit:cover;aspect-ratio:4\/5}\n.fld .fld-pair{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}\n.fld .fld-pair .fld-fig{border-radius:12px}\n.fld .fld-pair .fld-fig img{aspect-ratio:1}\n.fld .fld-cap{font-size:13px;line-height:1.5;color:var(--char);margin:10px 0 0;text-wrap:pretty}\n.fld .fld-cap b{font-family:'DM Serif Display',Georgia,serif;font-weight:400;font-size:16px;display:block;color:var(--ink);margin-bottom:2px}\n.fld .fld-gift{background:var(--ivm);border-radius:14px;padding:16px;display:grid;grid-template-columns:minmax(0,1fr);gap:16px;align-items:center}\n.fld .fld-gift .fld-fig{border-radius:10px}\n.fld .fld-gift .fld-fig img{aspect-ratio:1}\n.fld .fld-faq{border-top:.5px solid var(--ivd);margin-top:14px}\n.fld .fld-faq details{border-bottom:.5px solid var(--ivd)}\n.fld .fld-faq summary{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:16px 0;font-size:15px;color:var(--ink);cursor:pointer;list-style:none}\n.fld .fld-faq summary::-webkit-details-marker{display:none}\n.fld .fld-faq summary::after{content:\"+\";color:var(--gray);font-size:18px;line-height:1}\n.fld .fld-faq details[open] summary::after{content:\"–\"}\n.fld .fld-faq p{font-size:14px;line-height:1.6;color:var(--char);margin:-6px 0 0;padding:0 0 16px}\n.fld .fld-end{padding:40px 0 8px;display:flex;flex-direction:column;align-items:flex-start;gap:14px}\n.fld .fld-end-t{font-family:'DM Serif Display',Georgia,serif;font-weight:400;font-size:22px;color:var(--ink)}\n.fld .fld-end-price{white-space:nowrap}\n.fld .fld-end-was{color:var(--gray);font-size:.78em;margin-right:.15em}\n.fld [hidden]{display:none!important}\n.fld .fld-btn{display:inline-flex;align-items:center;justify-content:center;min-height:52px;padding:0 34px;border-radius:2px;background:var(--gold);color:var(--ink);font-size:12px;letter-spacing:.22em;text-transform:uppercase;text-decoration:none;font-weight:600;cursor:pointer;border:0;font-family:inherit}\n.fld .fld-btn[disabled]{opacity:.5;cursor:default}\n.fld .fld-end-finish{white-space:nowrap}\n.fld .fld-end-note{display:flex;align-items:center;gap:8px;margin:0;font-size:13px;line-height:1.5;color:var(--char)}\n.fld .fld-end-note a{color:var(--goldD);text-decoration:underline;text-underline-offset:2px}\n.fld .fld-end-tick{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background:var(--gold);color:#fff;font-size:11px;line-height:1;flex:0 0 auto}\n@media (min-width:900px){\n .fld .fld-sec{padding-top:72px}\n .fld .fld-details{grid-template-columns:repeat(2,minmax(0,1fr));column-gap:48px}\n .fld .fld-row{grid-template-columns:120px minmax(0,1fr)}\n .fld .fld-story{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:56px}\n .fld .fld-pair{gap:24px}\n .fld .fld-gift{grid-template-columns:minmax(0,5fr) minmax(0,7fr);padding:28px;gap:36px}\n .fld .fld-faq{max-width:760px}\n}\n\u003c\/style\u003e\n\n\u003csection class=\"fld-sec\"\u003e\n  \u003cp class=\"fld-eye\"\u003eThe details\u003c\/p\u003e\n  \u003ch2 class=\"fld-h2\"\u003eSpray on your pulse points — where it beats, it blooms.\u003c\/h2\u003e\n  \u003cdl class=\"fld-details\"\u003e\n    \u003cdiv class=\"fld-row\"\u003e\n\u003cdt\u003eType\u003c\/dt\u003e\n\u003cdd\u003eEau de Parfum (EDP) — the stronger, longer-lasting concentration.\u003c\/dd\u003e\n\u003c\/div\u003e\n    \u003cdiv class=\"fld-row\"\u003e\n\u003cdt\u003eSize\u003c\/dt\u003e\n\u003cdd\u003e50 ml \/ 1.7 fl.oz spray.\u003c\/dd\u003e\n\u003c\/div\u003e\n    \u003cdiv class=\"fld-row\"\u003e\n\u003cdt\u003eBottle\u003c\/dt\u003e\n\u003cdd\u003eClear faceted glass with a white ribbed cap and gold trim. The label is printed straight onto the glass in rose gold.\u003c\/dd\u003e\n\u003c\/div\u003e\n    \u003cdiv class=\"fld-row\"\u003e\n\u003cdt\u003eBox\u003c\/dt\u003e\n\u003cdd\u003eBlush gift box with a rose-gold foil heartbeat line.\u003c\/dd\u003e\n\u003c\/div\u003e\n    \u003cdiv class=\"fld-row\"\u003e\n\u003cdt\u003eHow to wear\u003c\/dt\u003e\n\u003cdd\u003eSpray from about 15 cm onto wrists, neck and behind the ears. Don’t rub — let it settle.\u003c\/dd\u003e\n\u003c\/div\u003e\n    \u003cdiv class=\"fld-row\"\u003e\n\u003cdt\u003eCare\u003c\/dt\u003e\n\u003cdd\u003eKeep the cap on and store away from sunlight and heat.\u003c\/dd\u003e\n\u003c\/div\u003e\n  \u003c\/dl\u003e\n\u003c\/section\u003e\n\n\u003csection class=\"fld-sec\"\u003e\n  \u003cp class=\"fld-eye\"\u003eQuestions\u003c\/p\u003e\n  \u003ch2 class=\"fld-h2\"\u003eBefore you order\u003c\/h2\u003e\n  \u003cdiv class=\"fld-faq\"\u003e\n    \u003cdetails open\u003e\u003csummary\u003eWhat does Eau de Parfum mean?\u003c\/summary\u003e\u003cp\u003eIt is the strength of the perfume. An Eau de Parfum has more fragrance oil than an Eau de Toilette or a body mist, so a few sprays go further and stay with you longer.\u003c\/p\u003e\u003c\/details\u003e\n    \u003cdetails\u003e\u003csummary\u003eHow do I pay?\u003c\/summary\u003e\u003cp\u003eCash on delivery anywhere in Pakistan (Rs 200 delivery). Pay in advance by bank transfer, JazzCash or EasyPaisa and delivery is free.\u003c\/p\u003e\u003c\/details\u003e\n    \u003cdetails\u003e\u003csummary\u003eHow long does delivery take?\u003c\/summary\u003e\u003cp\u003e3–5 working days nationwide, Sundays excluded. We send your tracking on WhatsApp as soon as it ships.\u003c\/p\u003e\u003c\/details\u003e\n    \u003cdetails\u003e\u003csummary\u003eCan I return it?\u003c\/summary\u003e\u003cp\u003eFor hygiene reasons an opened perfume can’t be returned unless it arrives damaged, faulty or not what you ordered. Message us on WhatsApp within 7 days of delivery with a photo and we will sort it out.\u003c\/p\u003e\u003c\/details\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003cdiv class=\"fld-end\"\u003e\n  \u003cdiv class=\"fld-end-t\"\u003eHeartbeat\u003cspan class=\"fld-end-finish\" id=\"fld-end-finish\" hidden\u003e · \u003cspan\u003e\u003c\/span\u003e\u003c\/span\u003e\u003cspan class=\"fld-end-price\" id=\"fld-end-price\" hidden\u003e · \u003cs class=\"fld-end-was\"\u003e\u003c\/s\u003e \u003cspan class=\"fld-end-now\"\u003e\u003c\/span\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n  \u003cbutton type=\"button\" class=\"fld-btn\" id=\"fld-end-add\"\u003eAdd to cart\u003c\/button\u003e\n  \u003cp class=\"fld-end-note\" id=\"fld-end-note\" role=\"status\" aria-live=\"polite\" hidden\u003e\u003cspan class=\"fld-end-tick\" aria-hidden=\"true\"\u003e✓\u003c\/span\u003e \u003cspan\u003eAdded to your cart. \u003ca href=\"\/cart\"\u003eView cart\u003c\/a\u003e\u003c\/span\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n\/* Price is never hardcoded here. It mirrors the theme's live price block\n   (#fl-price-now \/ #fl-price-was) and follows variant:changed, so it can\n   never go stale when the price changes in admin. If those nodes are\n   missing, the price stays hidden rather than showing a wrong number. *\/\n(function () {\n  var wrap = document.getElementById('fld-end-price'); if (!wrap) return;\n  var nowOut = wrap.querySelector('.fld-end-now'), wasOut = wrap.querySelector('.fld-end-was');\n  function sync() {\n    var nowEl = document.getElementById('fl-price-now'), wasEl = document.getElementById('fl-price-was');\n    var now = nowEl ? nowEl.textContent.trim() : '';\n    if (!now) { wrap.hidden = true; return; }\n    nowOut.textContent = now;\n    var was = wasEl ? wasEl.textContent.trim() : '';\n    wasOut.textContent = was; wasOut.hidden = !was;\n    wrap.hidden = false;\n  }\n  sync();\n  document.addEventListener('variant:changed', sync);\n  document.addEventListener('DOMContentLoaded', sync);\n  window.addEventListener('load', sync);\n})();\n\n\/* The closing CTA drives the theme's own add-to-cart button, so the selected\n   variant, the quantity and every other theme behaviour keep living in one\n   place. Two things this must not do: jump the reader somewhere else (the old\n   href=\"#MainContent\" threw them back to the top, which reads as a dead\n   button and gets tapped again), or claim success it cannot see. The cart\n   notification renders up at the header, far off-screen from down here, so\n   the confirmation is echoed inline and only after \/cart.js agrees the item\n   landed. *\/\n(function () {\n  var btn = document.getElementById('fld-end-add'); if (!btn) return;\n  var note = document.getElementById('fld-end-note');\n  var label = btn.textContent;\n  var busy = false;\n\n  function realBtn() { return document.querySelector('.product-form__submit'); }\n  function reveal(el) {\n    if (!el) return;\n    try { el.scrollIntoView({ behavior: 'smooth', block: 'center' }); }\n    catch (e) { el.scrollIntoView(); }\n  }\n  function itemCount(cb) {\n    var root = (window.Shopify \u0026\u0026 Shopify.routes \u0026\u0026 Shopify.routes.root) || '\/';\n    if (!window.fetch) { cb(null); return; }\n    fetch(root + 'cart.js', { headers: { Accept: 'application\/json' }, credentials: 'same-origin' })\n      .then(function (r) { return r.ok ? r.json() : null; })\n      .then(function (c) { cb(c ? c.item_count : null); })\n      .catch(function () { cb(null); });\n  }\n  function finish(added) {\n    busy = false; btn.disabled = false; btn.textContent = label;\n    if (note) note.hidden = !added;\n  }\n\n  btn.addEventListener('click', function () {\n    if (busy) return;\n    var real = realBtn();\n    \/* No theme button to drive, or it is disabled (sold out): show them the\n       real control rather than pretending the click did something. *\/\n    if (!real) return;\n    if (real.disabled) { reveal(real); return; }\n\n    busy = true; btn.disabled = true; btn.textContent = 'Adding…';\n    if (note) note.hidden = true;\n\n    itemCount(function (before) {\n      real.click();\n      var tries = 0;\n      (function poll() {\n        setTimeout(function () {\n          itemCount(function (after) {\n            \/* Cart unreadable: trust the theme rather than cry wolf. *\/\n            if (before === null || after === null) { finish(true); return; }\n            if (after \u003e before) { finish(true); return; }\n            if (++tries \u003e= 10) { finish(false); reveal(real); return; }\n            poll();\n          });\n        }, 350);\n      })();\n    });\n  });\n})();\n\n\/* Multi-finish products only: name the finish being added, right at the\n   button. Adding the wrong finish is not a refund here, it is a refused\n   cash-on-delivery parcel. Single-variant pages have no #fl-chosen-val and\n   the line stays hidden. *\/\n(function () {\n  var wrap = document.getElementById('fld-end-finish'); if (!wrap) return;\n  var out = wrap.querySelector('span');\n  function sync() {\n    var src = document.getElementById('fl-chosen-val');\n    var val = src ? src.textContent.trim() : '';\n    if (!val) { wrap.hidden = true; return; }\n    out.textContent = val; wrap.hidden = false;\n  }\n  sync();\n  document.addEventListener('variant:changed', sync);\n  document.addEventListener('DOMContentLoaded', sync);\n  window.addEventListener('load', sync);\n})();\n\u003c\/script\u003e\n\u003c\/div\u003e\n","brand":"FairyLiora","offers":[{"title":"Default Title","offer_id":67636355236090,"sku":null,"price":2990.0,"currency_code":"PKR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0813\/6769\/5610\/files\/fl-heartbeat-1-hero.jpg?v=1791133468","url":"https:\/\/fairyliora.shop\/products\/fairyliora-heartbeat-eau-de-parfum","provider":"FairyLiora","version":"1.0","type":"link"}