{"product_id":"⏰⏰𝑪𝒐𝒏𝒈𝒓𝒂𝒕𝒖𝒍𝒂𝒕𝒊𝒐𝒏𝒔-𝒀𝒐𝒖-𝒓𝒆-𝒐𝒖𝒓-500𝒕𝒉-𝒄𝒖𝒔𝒕𝒐𝒎𝒆𝒓-𝒕𝒐𝒅𝒂𝒚-𝒂𝒏𝒅-𝒚𝒐𝒖-𝒈𝒆𝒕-𝒕𝒐-𝒆𝒏𝒋𝒐𝒚-𝒂-𝒔𝒑𝒆𝒄𝒊𝒂𝒍-𝒐𝒇𝒇𝒆𝒓-𝒂-𝒔𝒆𝒄𝒐𝒏𝒅-𝒑𝒓𝒐𝒅𝒖𝒄𝒕-𝒇𝒐𝒓-30-𝒐𝒇𝒇-3","title":"⏰⏰𝑪𝒐𝒏𝒈𝒓𝒂𝒕𝒖𝒍𝒂𝒕𝒊𝒐𝒏𝒔! 𝒀𝒐𝒖’𝒓𝒆 𝒐𝒖𝒓 500𝒕𝒉 𝒄𝒖𝒔𝒕𝒐𝒎𝒆𝒓 𝒕𝒐𝒅𝒂𝒚, 𝒂𝒏𝒅 𝒚𝒐𝒖 𝒈𝒆𝒕 𝒕𝒐 𝒆𝒏𝒋𝒐𝒚 𝒂 𝒔𝒑𝒆𝒄𝒊𝒂𝒍 𝒐𝒇𝒇𝒆𝒓: 𝒂 𝒔𝒆𝒄𝒐𝒏𝒅 𝒑𝒓𝒐𝒅𝒖𝒄𝒕 𝒇𝒐𝒓 30%𝒐𝒇𝒇!","description":"\u003csection id=\"jh-cleaner-final\" class=\"jh-cleaner-final\"\u003e\n\u003cdiv class=\"jh-page\"\u003e\n\u003c!-- ======================================================\n         01 \/ INTRO\n    ======================================================= --\u003e\n\u003csection class=\"jh-intro\"\u003e\u003cspan class=\"jh-overline\"\u003eTARGETED HOUSEHOLD STAIN CLEANING\u003c\/span\u003e\n\u003ch2\u003eA Thick Gel Made for the Stains Hiding in Tight Spaces\u003c\/h2\u003e\n\u003cp\u003eApply the gel directly along stained seams, corners, grout lines and gasket folds. Its thicker texture helps keep the formula concentrated where you place it instead of immediately running away.\u003c\/p\u003e\n\u003cdiv class=\"jh-pill-row\"\u003e\n\u003cspan\u003e✓ Thick Clinging Gel\u003c\/span\u003e \u003cspan\u003e✓ Precision Nozzle\u003c\/span\u003e \u003cspan\u003e✓ Cleaning Brush Included\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c!-- ======================================================\n         02 \/ REAL DEMO INTRO\n    ======================================================= --\u003e\n\u003csection class=\"jh-heading-block\"\u003e\u003cspan class=\"jh-overline\"\u003eREAL PRODUCT DEMOS\u003c\/span\u003e\n\u003ch2\u003eSee How It Applies to the Problem Area\u003c\/h2\u003e\n\u003cp\u003eEach demonstration is shown separately so you can clearly see how the gel is placed and used without multiple videos competing for your attention.\u003c\/p\u003e\n\u003c\/section\u003e\n\u003c!-- ======================================================\n         03 \/ GIF DEMO 1\n    ======================================================= --\u003e\n\u003carticle class=\"jh-demo\"\u003e\n\u003cdiv class=\"jh-demo-media\"\u003e\n\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1039\/4219\/3492\/files\/real-demo-caulk-fallback.gif?v=1788008671\" alt=\"Real application demonstration on a stained sink and caulk edge\" width=\"540\" height=\"960\" loading=\"eager\" decoding=\"async\"\u003e \u003cspan class=\"jh-demo-badge\"\u003e REAL PRODUCT DEMO \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jh-demo-text\"\u003e\n\u003cspan class=\"jh-overline\"\u003eSINK \u0026amp; CAULK EDGE\u003c\/span\u003e\n\u003ch3\u003eApply Directly Along the Stained Seam\u003c\/h3\u003e\n\u003cp\u003eThe precision tip lets you place the gel directly along narrow sink edges and caulk lines instead of spraying a wide surrounding area.\u003c\/p\u003e\n\u003cdiv class=\"jh-flow\"\u003e\n\u003cspan\u003eApply\u003c\/span\u003e \u003cb\u003e→\u003c\/b\u003e \u003cspan\u003eLet Gel Cling\u003c\/span\u003e \u003cb\u003e→\u003c\/b\u003e \u003cspan\u003eBrush\u003c\/span\u003e \u003cb\u003e→\u003c\/b\u003e \u003cspan\u003eWipe\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/article\u003e\n\u003c!-- ======================================================\n         04 \/ GIF DEMO 2\n    ======================================================= --\u003e\n\u003carticle class=\"jh-demo\"\u003e\n\u003cdiv class=\"jh-demo-media\"\u003e\n\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1039\/4219\/3492\/files\/real-demo-shower-fallback.gif?v=1788008670\" alt=\"Real application demonstration on a stained shower corner\" width=\"540\" height=\"960\" loading=\"lazy\" decoding=\"async\"\u003e \u003cspan class=\"jh-demo-badge\"\u003e REAL PRODUCT DEMO \u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jh-demo-text\"\u003e\n\u003cspan class=\"jh-overline\"\u003eSHOWER CORNER\u003c\/span\u003e\n\u003ch3\u003eTarget Narrow Corners Without Broad Spraying\u003c\/h3\u003e\n\u003cp\u003eApply the gel precisely along the stained shower seam, allow it to remain on the target area as directed, then brush and wipe thoroughly.\u003c\/p\u003e\n\u003cdiv class=\"jh-flow\"\u003e\n\u003cspan\u003eTarget Seam\u003c\/span\u003e \u003cb\u003e→\u003c\/b\u003e \u003cspan\u003eLet Gel Cling\u003c\/span\u003e \u003cb\u003e→\u003c\/b\u003e \u003cspan\u003eWipe\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/article\u003e\n\u003cp class=\"jh-disclaimer\"\u003eReal application footage. Results may vary according to surface, stain age, severity and correct use.\u003c\/p\u003e\n\u003c!-- ======================================================\n         05 \/ TRUST STRIP\n    ======================================================= --\u003e\n\u003csection class=\"jh-trust\"\u003e\n\u003cdiv\u003e\n\u003cspan\u003e✓\u003c\/span\u003e \u003cstrong\u003e100 mL\u003c\/strong\u003e \u003csmall\u003eper bottle\u003c\/small\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e✓\u003c\/span\u003e \u003cstrong\u003ePrecision Application\u003c\/strong\u003e \u003csmall\u003efor narrow areas\u003c\/small\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e✓\u003c\/span\u003e \u003cstrong\u003eBrush Included\u003c\/strong\u003e \u003csmall\u003ewith every bottle\u003c\/small\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c!-- ======================================================\n         06 \/ KEY BENEFIT IMAGE\n    ======================================================= --\u003e\n\u003carticle class=\"jh-content-card\"\u003e\n\u003cdiv class=\"jh-static-media\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1039\/4219\/3492\/files\/yf-generated-node-q7xqsq4i9u_1.jpg?v=1788430958\" alt=\"Targeted thick gel cleaner with precision nozzle\" width=\"1200\" height=\"1200\" loading=\"lazy\" decoding=\"async\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"jh-content-text\"\u003e\n\u003cspan class=\"jh-overline\"\u003eTARGETED APPLICATION\u003c\/span\u003e\n\u003ch2\u003ePut the Gel Exactly Where You Need It\u003c\/h2\u003e\n\u003cp\u003eNarrow caulk lines, grout gaps and gasket folds can be difficult to cover evenly with thin liquids. The thicker gel format makes controlled placement easier.\u003c\/p\u003e\n\u003cul class=\"jh-benefits\"\u003e\n\u003cli\u003eClings to targeted seams and edges\u003c\/li\u003e\n\u003cli\u003ePrecision nozzle reaches narrow spaces\u003c\/li\u003e\n\u003cli\u003eHelps reduce unnecessary run-off\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/article\u003e\n\u003c!-- ======================================================\n         07 \/ GEL VS SPRAY\n    ======================================================= --\u003e\n\u003carticle class=\"jh-content-card\"\u003e\n\u003cdiv class=\"jh-static-media\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1039\/4219\/3492\/files\/ChatGPT_Image_2026_9_3_18_15_25.png?v=1788430959\" alt=\"Thick gel cleaner compared with common spray cleaner\" width=\"1200\" height=\"1200\" loading=\"lazy\" decoding=\"async\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"jh-content-text\"\u003e\n\u003cspan class=\"jh-overline\"\u003eWHY THE GEL FORMAT MATTERS\u003c\/span\u003e\n\u003ch2\u003eLess Run-Off. More Controlled Placement.\u003c\/h2\u003e\n\u003cp\u003eThin sprays can spread beyond the area you want to treat. A thicker gel helps keep the formula concentrated along the visible stain.\u003c\/p\u003e\n\u003cdiv class=\"jh-feature-list\"\u003e\n\u003cdiv\u003e\n\u003cspan\u003e✓\u003c\/span\u003e\n\u003cdiv\u003e\n\u003cstrong\u003eClings to Seams\u003c\/strong\u003e \u003csmall\u003eUseful on narrow and vertical areas.\u003c\/small\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e✓\u003c\/span\u003e\n\u003cdiv\u003e\n\u003cstrong\u003eControlled Placement\u003c\/strong\u003e \u003csmall\u003eApply only where the visible stain is located.\u003c\/small\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e✓\u003c\/span\u003e\n\u003cdiv\u003e\n\u003cstrong\u003eReduced Run-Off\u003c\/strong\u003e \u003csmall\u003eHelps keep the cleaner on the intended area.\u003c\/small\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/article\u003e\n\u003c!-- ======================================================\n         08 \/ LIFESTYLE USE AREAS\n    ======================================================= --\u003e\n\u003carticle class=\"jh-content-card jh-lifestyle-card\"\u003e\n\u003cdiv class=\"jh-static-media\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1039\/4219\/3492\/files\/yf-generated-node-k9dglo6l1p_1.jpg?v=1788431590\" alt=\"Lifestyle view showing common household stain-prone areas including shower caulk, tile grout, sink edges and washer gaskets\" width=\"1200\" height=\"1200\" loading=\"lazy\" decoding=\"async\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"jh-content-text\"\u003e\n\u003cspan class=\"jh-overline\"\u003eWHERE STAINS HIDE\u003c\/span\u003e\n\u003ch2\u003eBuilt for the Places Ordinary Wiping Can Miss\u003c\/h2\u003e\n\u003cp\u003eUse the precision gel format on common household problem areas such as shower caulk, tile grout, sink edges and washer-gasket folds.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/article\u003e\n\u003c!-- ======================================================\n         09 \/ RESULTS INTRO\n    ======================================================= --\u003e\n\u003csection class=\"jh-heading-block jh-heading-block--results\"\u003e\u003cspan class=\"jh-overline\"\u003eVISIBLE CLEANING RESULTS\u003c\/span\u003e\n\u003ch2\u003eTwo Common Areas. Shown One at a Time.\u003c\/h2\u003e\n\u003cp\u003eEach result is displayed at full width so the comparison stays clear on both desktop and mobile.\u003c\/p\u003e\n\u003c\/section\u003e\n\u003c!-- ======================================================\n         10 \/ RESULT 1\n    ======================================================= --\u003e\n\u003carticle class=\"jh-result-card\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1039\/4219\/3492\/files\/yf-generated-node-k9dglo6l1p_2.jpg?v=1788431763\" alt=\"Tile grout before and after cleaning example\" width=\"1200\" height=\"1200\" loading=\"lazy\" decoding=\"async\"\u003e\n\u003cdiv class=\"jh-result-text\"\u003e\n\u003cspan class=\"jh-overline\"\u003eTILE GROUT\u003c\/span\u003e\n\u003ch3\u003eApply Directly Into Narrow Grout Lines\u003c\/h3\u003e\n\u003cp\u003eFocus the gel on the stained grout instead of covering the entire surrounding tile.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/article\u003e\n\u003c!-- ======================================================\n         11 \/ RESULT 2\n    ======================================================= --\u003e\n\u003carticle class=\"jh-result-card\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1039\/4219\/3492\/files\/yf-generated-node-q7xqsq4i9u.jpg?v=1788430958\" alt=\"Washer gasket before and after cleaning example\" width=\"1200\" height=\"1200\" loading=\"lazy\" decoding=\"async\"\u003e\n\u003cdiv class=\"jh-result-text\"\u003e\n\u003cspan class=\"jh-overline\"\u003eWASHER GASKET\u003c\/span\u003e\n\u003ch3\u003eReach Into Gasket Folds More Precisely\u003c\/h3\u003e\n\u003cp\u003eThe nozzle helps place gel along folds and narrow edges that can be difficult to clean evenly.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/article\u003e\n\u003cp class=\"jh-disclaimer\"\u003eResults vary by surface condition, stain age, severity and correct use.\u003c\/p\u003e\n\u003c!-- ======================================================\n         12 \/ HOW TO USE\n    ======================================================= --\u003e\n\u003carticle class=\"jh-content-card\"\u003e\n\u003cdiv class=\"jh-static-media\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1039\/4219\/3492\/files\/yf-generated-node-q7xqsq4i9u_2.jpg?v=1788430958\" alt=\"Four simple steps for using the household stain cleaner\" width=\"1200\" height=\"1200\" loading=\"lazy\" decoding=\"async\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"jh-content-text\"\u003e\n\u003cspan class=\"jh-overline\"\u003eHOW TO USE\u003c\/span\u003e\n\u003ch2\u003eFour Simple Steps\u003c\/h2\u003e\n\u003col class=\"jh-steps\"\u003e\n\u003cli\u003e\n\u003cspan\u003e1\u003c\/span\u003e\n\u003cdiv\u003e\n\u003cstrong\u003ePrepare the Area\u003c\/strong\u003e \u003csmall\u003eClean and dry the target surface.\u003c\/small\u003e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cspan\u003e2\u003c\/span\u003e\n\u003cdiv\u003e\n\u003cstrong\u003eApply the Gel\u003c\/strong\u003e \u003csmall\u003ePlace it directly along the stained area.\u003c\/small\u003e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cspan\u003e3\u003c\/span\u003e\n\u003cdiv\u003e\n\u003cstrong\u003eAllow Contact Time\u003c\/strong\u003e \u003csmall\u003eFollow the waiting time stated on the product label.\u003c\/small\u003e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cspan\u003e4\u003c\/span\u003e\n\u003cdiv\u003e\n\u003cstrong\u003eBrush \u0026amp; Wipe\u003c\/strong\u003e \u003csmall\u003eRemove residue thoroughly and rinse if directed.\u003c\/small\u003e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003c\/ol\u003e\n\u003c\/div\u003e\n\u003c\/article\u003e\n\u003c!-- ======================================================\n         13 \/ FAQ\n    ======================================================= --\u003e\n\u003csection class=\"jh-faq\"\u003e\u003cspan class=\"jh-overline\"\u003eGOOD TO KNOW\u003c\/span\u003e\n\u003ch2\u003eFrequently Asked Questions\u003c\/h2\u003e\n\u003cdetails\u003e\n\u003csummary\u003eWhat is included with each bottle?\u003c\/summary\u003e\n\u003cp\u003eEach unit includes one 100 mL bottle of cleaning gel and one cleaning brush.\u003c\/p\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eWhere can I use it?\u003c\/summary\u003e\n\u003cp\u003eIt is intended for targeted household stain cleaning on areas such as caulk, sealed grout, bathroom seams and washer-gasket folds. Always follow the product label and test a hidden area first.\u003c\/p\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eHow long should I leave the gel on?\u003c\/summary\u003e\n\u003cp\u003eFollow the contact time stated on the product label. Surface type and stain severity can affect the result.\u003c\/p\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eWill every stain disappear completely?\u003c\/summary\u003e\n\u003cp\u003eResults vary according to surface, stain age, severity and correct application.\u003c\/p\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eWhat safety precautions should I follow?\u003c\/summary\u003e\n\u003cp\u003eWear protective gloves, ventilate the area, keep the product away from children and pets, and never mix it with other cleaners.\u003c\/p\u003e\n\u003c\/details\u003e\n\u003c\/section\u003e\n\u003c!-- ======================================================\n         14 \/ SAFETY\n    ======================================================= --\u003e\n\u003csection class=\"jh-safety\"\u003e\u003cspan class=\"jh-overline\"\u003eUSE WITH CARE\u003c\/span\u003e\n\u003ch2\u003eSimple Precautions for Responsible Cleaning\u003c\/h2\u003e\n\u003cdiv class=\"jh-safety-list\"\u003e\n\u003cdiv\u003e\n\u003cspan\u003e✓\u003c\/span\u003e \u003cstrong\u003eWear protective gloves\u003c\/strong\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e✓\u003c\/span\u003e \u003cstrong\u003eVentilate the area\u003c\/strong\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e✓\u003c\/span\u003e \u003cstrong\u003eNever mix with other cleaners\u003c\/strong\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cspan\u003e✓\u003c\/span\u003e \u003cstrong\u003eKeep away from children and pets\u003c\/strong\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp\u003eFollow the product label and test a small inconspicuous area before full use.\u003c\/p\u003e\n\u003c\/section\u003e\n\u003c!-- ======================================================\n         15 \/ FINAL CTA\n    ======================================================= --\u003e\n\u003csection class=\"jh-final-cta\"\u003e\u003cspan\u003eREADY TO GET STARTED?\u003c\/span\u003e\n\u003ch2\u003eTarget Those Hard-to-Reach Stains\u003c\/h2\u003e\n\u003cbutton type=\"button\" id=\"jh-view-product-options\" aria-label=\"View product options\"\u003eVIEW PRODUCT OPTIONS\u003c\/button\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003cstyle\u003e\n\n\/* =========================================================\n   ROOT\n========================================================= *\/\n\n#jh-cleaner-final {\n  --navy: #082f67;\n  --navy-dark: #052653;\n  --teal: #07979a;\n  --orange: #ff9f1c;\n  --text: #172235;\n  --muted: #657286;\n  --line: #dce7ee;\n  --soft: #f6fafc;\n  --soft-blue: #eef8fc;\n\n  width: 100%;\n  max-width: 100%;\n\n  margin: 0;\n  padding: 0;\n\n  overflow: hidden;\n\n  background: #ffffff;\n  color: var(--text);\n\n  font-family: inherit;\n}\n\n\n\/* =========================================================\n   RESET\n========================================================= *\/\n\n#jh-cleaner-final *,\n#jh-cleaner-final *::before,\n#jh-cleaner-final *::after {\n  box-sizing: border-box;\n}\n\n#jh-cleaner-final img {\n  display: block;\n\n  width: 100%;\n  max-width: 100%;\n  height: auto;\n\n  margin: 0;\n}\n\n#jh-cleaner-final h2,\n#jh-cleaner-final h3,\n#jh-cleaner-final p {\n  margin-top: 0;\n}\n\n#jh-cleaner-final button {\n  font-family: inherit;\n}\n\n#jh-cleaner-final .jh-page {\n  width: 100%;\n  max-width: 980px;\n\n  margin: 0 auto;\n\n  padding: 24px 20px 56px;\n}\n\n\n\/* =========================================================\n   COMMON TYPOGRAPHY\n========================================================= *\/\n\n#jh-cleaner-final .jh-overline {\n  display: inline-block;\n\n  margin-bottom: 9px;\n\n  color: var(--teal);\n\n  font-size: 12px;\n  line-height: 1.25;\n\n  font-weight: 900;\n  letter-spacing: .12em;\n\n  text-transform: uppercase;\n}\n\n#jh-cleaner-final h2 {\n  max-width: 780px;\n\n  margin-bottom: 14px;\n\n  color: var(--navy-dark);\n\n  font-size: clamp(28px, 4vw, 42px);\n  line-height: 1.08;\n\n  letter-spacing: -.025em;\n\n  font-weight: 850;\n\n  overflow-wrap: normal;\n  word-break: normal;\n}\n\n#jh-cleaner-final h3 {\n  margin-bottom: 10px;\n\n  color: var(--navy-dark);\n\n  font-size: clamp(22px, 3vw, 30px);\n  line-height: 1.15;\n\n  letter-spacing: -.02em;\n\n  font-weight: 850;\n\n  overflow-wrap: normal;\n  word-break: normal;\n}\n\n\n\/* =========================================================\n   INTRO\n========================================================= *\/\n\n#jh-cleaner-final .jh-intro {\n  padding: 38px 34px;\n\n  text-align: center;\n\n  background:\n    linear-gradient(\n      145deg,\n      #ffffff,\n      #eef8fc\n    );\n\n  border: 1px solid var(--line);\n  border-radius: 24px;\n}\n\n#jh-cleaner-final .jh-intro h2 {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n#jh-cleaner-final .jh-intro \u003e p {\n  max-width: 720px;\n\n  margin: 0 auto 19px;\n\n  color: var(--muted);\n\n  font-size: 16px;\n  line-height: 1.6;\n}\n\n#jh-cleaner-final .jh-pill-row {\n  display: flex;\n  flex-wrap: wrap;\n\n  justify-content: center;\n\n  gap: 8px;\n}\n\n#jh-cleaner-final .jh-pill-row span {\n  padding: 8px 12px;\n\n  color: var(--navy);\n\n  background: #ffffff;\n\n  border: 1px solid #d3e2eb;\n  border-radius: 999px;\n\n  font-size: 12px;\n  line-height: 1.2;\n\n  font-weight: 800;\n}\n\n\n\/* =========================================================\n   HEADING BLOCK\n========================================================= *\/\n\n#jh-cleaner-final .jh-heading-block {\n  max-width: 760px;\n\n  margin: 38px auto 22px;\n\n  text-align: center;\n}\n\n#jh-cleaner-final .jh-heading-block h2 {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n#jh-cleaner-final .jh-heading-block \u003e p {\n  margin-bottom: 0;\n\n  color: var(--muted);\n\n  font-size: 16px;\n  line-height: 1.6;\n}\n\n\n\/* =========================================================\n   GIF DEMO\n   NEVER SIDE BY SIDE\n========================================================= *\/\n\n#jh-cleaner-final .jh-demo {\n  width: 100%;\n  max-width: 620px;\n\n  margin: 0 auto 24px;\n\n  overflow: hidden;\n\n  background: #ffffff;\n\n  border: 1px solid var(--line);\n  border-radius: 22px;\n\n  box-shadow:\n    0 12px 28px\n    rgba(8,47,103,.07);\n}\n\n#jh-cleaner-final .jh-demo-media {\n  position: relative;\n\n  width: 100%;\n  max-width: 430px;\n\n  margin: 0 auto;\n\n  overflow: hidden;\n\n  background: #eef3f6;\n}\n\n#jh-cleaner-final .jh-demo-media img {\n  width: 100%;\n  height: auto;\n\n  object-fit: contain;\n}\n\n#jh-cleaner-final .jh-demo-badge {\n  position: absolute;\n\n  left: 13px;\n  bottom: 13px;\n\n  padding: 7px 10px;\n\n  color: #ffffff;\n\n  background: rgba(5,38,83,.93);\n\n  border: 1px solid rgba(255,255,255,.55);\n  border-radius: 999px;\n\n  font-size: 10px;\n  line-height: 1;\n\n  font-weight: 900;\n  letter-spacing: .06em;\n}\n\n#jh-cleaner-final .jh-demo-text {\n  padding: 22px 24px 25px;\n}\n\n#jh-cleaner-final .jh-demo-text \u003e p {\n  margin-bottom: 16px;\n\n  color: var(--muted);\n\n  font-size: 15px;\n  line-height: 1.6;\n}\n\n#jh-cleaner-final .jh-flow {\n  display: flex;\n  flex-wrap: wrap;\n\n  align-items: center;\n\n  gap: 7px;\n}\n\n#jh-cleaner-final .jh-flow span {\n  padding: 7px 10px;\n\n  color: var(--navy);\n\n  background: var(--soft-blue);\n\n  border-radius: 999px;\n\n  font-size: 11px;\n  line-height: 1.1;\n\n  font-weight: 800;\n}\n\n#jh-cleaner-final .jh-flow b {\n  color: var(--teal);\n\n  font-size: 12px;\n}\n\n#jh-cleaner-final .jh-disclaimer {\n  max-width: 700px;\n\n  margin: 10px auto 25px;\n\n  color: #788493;\n\n  text-align: center;\n\n  font-size: 11px;\n  line-height: 1.5;\n}\n\n\n\/* =========================================================\n   TRUST\n========================================================= *\/\n\n#jh-cleaner-final .jh-trust {\n  display: grid;\n\n  grid-template-columns:\n    repeat(3, minmax(0,1fr));\n\n  gap: 1px;\n\n  overflow: hidden;\n\n  margin: 26px 0;\n\n  background: #dbe7ed;\n\n  border: 1px solid #dbe7ed;\n  border-radius: 18px;\n}\n\n#jh-cleaner-final .jh-trust \u003e div {\n  display: grid;\n\n  grid-template-columns:\n    28px 1fr;\n\n  align-items: center;\n\n  padding: 14px;\n\n  background: #f8fbfd;\n}\n\n#jh-cleaner-final .jh-trust \u003e div \u003e span {\n  grid-row: 1 \/ 3;\n\n  display: grid;\n\n  place-items: center;\n\n  width: 22px;\n  height: 22px;\n\n  color: #ffffff;\n\n  background: var(--teal);\n\n  border-radius: 50%;\n\n  font-size: 11px;\n  font-weight: 900;\n}\n\n#jh-cleaner-final .jh-trust strong,\n#jh-cleaner-final .jh-trust small {\n  display: block;\n}\n\n#jh-cleaner-final .jh-trust strong {\n  color: var(--navy-dark);\n\n  font-size: 13px;\n}\n\n#jh-cleaner-final .jh-trust small {\n  color: var(--muted);\n\n  font-size: 10px;\n}\n\n\n\/* =========================================================\n   STANDARD CONTENT CARD\n   ALWAYS STACKED\n========================================================= *\/\n\n#jh-cleaner-final .jh-content-card {\n  width: 100%;\n  max-width: 820px;\n\n  margin: 24px auto;\n\n  overflow: hidden;\n\n  background: #ffffff;\n\n  border: 1px solid var(--line);\n  border-radius: 22px;\n}\n\n#jh-cleaner-final .jh-static-media {\n  width: 100%;\n\n  margin: 0 auto;\n\n  background: #ffffff;\n}\n\n#jh-cleaner-final .jh-static-media img {\n  width: 100%;\n  height: auto;\n\n  object-fit: contain;\n}\n\n#jh-cleaner-final .jh-content-text {\n  padding: 26px 28px 30px;\n}\n\n#jh-cleaner-final .jh-content-text h2 {\n  max-width: 680px;\n}\n\n#jh-cleaner-final .jh-content-text \u003e p {\n  max-width: 700px;\n\n  margin-bottom: 17px;\n\n  color: var(--muted);\n\n  font-size: 15px;\n  line-height: 1.62;\n}\n\n\n\/* =========================================================\n   BENEFITS\n========================================================= *\/\n\n#jh-cleaner-final .jh-benefits {\n  display: grid;\n\n  gap: 9px;\n\n  margin: 0;\n  padding: 0;\n\n  list-style: none;\n}\n\n#jh-cleaner-final .jh-benefits li {\n  position: relative;\n\n  min-width: 0;\n\n  padding-left: 29px;\n\n  color: var(--navy-dark);\n\n  font-size: 14px;\n  line-height: 1.45;\n\n  font-weight: 750;\n}\n\n#jh-cleaner-final .jh-benefits li::before {\n  content: \"✓\";\n\n  position: absolute;\n\n  left: 0;\n  top: 0;\n\n  display: grid;\n\n  place-items: center;\n\n  width: 20px;\n  height: 20px;\n\n  color: #ffffff;\n\n  background: var(--teal);\n\n  border-radius: 50%;\n\n  font-size: 10px;\n  font-weight: 900;\n}\n\n\n\/* =========================================================\n   FEATURE LIST\n========================================================= *\/\n\n#jh-cleaner-final .jh-feature-list {\n  display: grid;\n\n  gap: 9px;\n}\n\n#jh-cleaner-final .jh-feature-list \u003e div {\n  display: grid;\n\n  grid-template-columns:\n    24px 1fr;\n\n  gap: 10px;\n\n  align-items: start;\n\n  min-width: 0;\n\n  padding: 12px 13px;\n\n  background: var(--soft);\n\n  border: 1px solid #dfebf0;\n  border-radius: 13px;\n}\n\n#jh-cleaner-final .jh-feature-list \u003e div \u003e span {\n  display: grid;\n\n  place-items: center;\n\n  width: 21px;\n  height: 21px;\n\n  color: #ffffff;\n\n  background: var(--teal);\n\n  border-radius: 50%;\n\n  font-size: 10px;\n  font-weight: 900;\n}\n\n#jh-cleaner-final .jh-feature-list strong,\n#jh-cleaner-final .jh-feature-list small {\n  display: block;\n}\n\n#jh-cleaner-final .jh-feature-list strong {\n  margin-bottom: 2px;\n\n  color: var(--navy-dark);\n\n  font-size: 13px;\n}\n\n#jh-cleaner-final .jh-feature-list small {\n  color: var(--muted);\n\n  font-size: 11px;\n  line-height: 1.4;\n}\n\n\n\/* =========================================================\n   TAGS\n========================================================= *\/\n\n#jh-cleaner-final .jh-tags {\n  display: flex;\n  flex-wrap: wrap;\n\n  gap: 7px;\n}\n\n#jh-cleaner-final .jh-tags span {\n  padding: 8px 11px;\n\n  color: var(--navy);\n\n  background: var(--soft-blue);\n\n  border: 1px solid #d6e7ef;\n  border-radius: 999px;\n\n  font-size: 11px;\n  font-weight: 800;\n}\n\n\n\n\/* =========================================================\n   LIFESTYLE CARD\n========================================================= *\/\n\n#jh-cleaner-final .jh-lifestyle-card .jh-static-media {\n  background: #f7fafc;\n}\n\n#jh-cleaner-final .jh-lifestyle-card .jh-content-text {\n  text-align: center;\n}\n\n#jh-cleaner-final .jh-lifestyle-card .jh-content-text h2,\n#jh-cleaner-final .jh-lifestyle-card .jh-content-text \u003e p {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n\/* =========================================================\n   RESULTS\n   ALWAYS ONE CARD PER ROW\n========================================================= *\/\n\n#jh-cleaner-final .jh-heading-block--results {\n  margin-top: 38px;\n}\n\n#jh-cleaner-final .jh-result-card {\n  width: 100%;\n  max-width: 760px;\n\n  margin: 0 auto 19px;\n\n  overflow: hidden;\n\n  background: #ffffff;\n\n  border: 1px solid var(--line);\n  border-radius: 20px;\n}\n\n#jh-cleaner-final .jh-result-card \u003e img {\n  width: 100%;\n  height: auto;\n\n  object-fit: contain;\n}\n\n#jh-cleaner-final .jh-result-text {\n  padding: 20px 22px 23px;\n}\n\n#jh-cleaner-final .jh-result-text h3 {\n  max-width: 650px;\n}\n\n#jh-cleaner-final .jh-result-text \u003e p {\n  margin-bottom: 0;\n\n  color: var(--muted);\n\n  font-size: 14px;\n  line-height: 1.55;\n}\n\n\n\/* =========================================================\n   STEPS\n========================================================= *\/\n\n#jh-cleaner-final .jh-steps {\n  display: grid;\n\n  gap: 8px;\n\n  margin: 0;\n  padding: 0;\n\n  list-style: none;\n}\n\n#jh-cleaner-final .jh-steps li {\n  display: grid;\n\n  grid-template-columns:\n    38px 1fr;\n\n  gap: 10px;\n\n  align-items: center;\n\n  min-width: 0;\n\n  padding: 10px 11px;\n\n  background: var(--soft);\n\n  border: 1px solid #e0eaef;\n  border-radius: 13px;\n}\n\n#jh-cleaner-final .jh-steps li \u003e span {\n  display: grid;\n\n  place-items: center;\n\n  width: 33px;\n  height: 33px;\n\n  color: #ffffff;\n\n  background: var(--navy);\n\n  border-radius: 50%;\n\n  font-size: 13px;\n  font-weight: 900;\n}\n\n#jh-cleaner-final .jh-steps strong,\n#jh-cleaner-final .jh-steps small {\n  display: block;\n}\n\n#jh-cleaner-final .jh-steps strong {\n  color: var(--navy-dark);\n\n  font-size: 13px;\n}\n\n#jh-cleaner-final .jh-steps small {\n  margin-top: 2px;\n\n  color: var(--muted);\n\n  font-size: 11px;\n  line-height: 1.4;\n}\n\n\n\/* =========================================================\n   SAFETY\n========================================================= *\/\n\n#jh-cleaner-final .jh-safety {\n  max-width: 820px;\n\n  margin: 25px auto;\n\n  padding: 28px;\n\n  text-align: center;\n\n  background:\n    linear-gradient(\n      145deg,\n      #f8fcfd,\n      #edf8fc\n    );\n\n  border: 1px solid var(--line);\n  border-radius: 22px;\n}\n\n#jh-cleaner-final .jh-safety h2 {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n#jh-cleaner-final .jh-safety-list {\n  display: grid;\n\n  grid-template-columns:\n    repeat(2, minmax(0,1fr));\n\n  gap: 9px;\n\n  margin-top: 20px;\n}\n\n#jh-cleaner-final .jh-safety-list \u003e div {\n  display: flex;\n\n  align-items: center;\n\n  gap: 8px;\n\n  min-width: 0;\n\n  padding: 12px;\n\n  text-align: left;\n\n  background: #ffffff;\n\n  border: 1px solid #dce8ee;\n  border-radius: 13px;\n}\n\n#jh-cleaner-final .jh-safety-list span {\n  flex: 0 0 auto;\n\n  display: grid;\n\n  place-items: center;\n\n  width: 20px;\n  height: 20px;\n\n  color: #ffffff;\n\n  background: var(--teal);\n\n  border-radius: 50%;\n\n  font-size: 10px;\n  font-weight: 900;\n}\n\n#jh-cleaner-final .jh-safety-list strong {\n  color: var(--navy-dark);\n\n  font-size: 12px;\n  line-height: 1.35;\n}\n\n#jh-cleaner-final .jh-safety \u003e p {\n  max-width: 650px;\n\n  margin: 16px auto 0;\n\n  color: var(--muted);\n\n  font-size: 11px;\n  line-height: 1.5;\n}\n\n\n\/* =========================================================\n   FAQ\n========================================================= *\/\n\n#jh-cleaner-final .jh-faq {\n  max-width: 820px;\n\n  margin: 25px auto;\n\n  padding: 28px;\n\n  background: #ffffff;\n\n  border: 1px solid var(--line);\n  border-radius: 22px;\n}\n\n#jh-cleaner-final .jh-faq details {\n  border-top: 1px solid var(--line);\n}\n\n#jh-cleaner-final .jh-faq details:last-of-type {\n  border-bottom: 1px solid var(--line);\n}\n\n#jh-cleaner-final .jh-faq summary {\n  position: relative;\n\n  padding: 16px 36px 16px 0;\n\n  color: var(--navy-dark);\n\n  font-size: 14px;\n  line-height: 1.4;\n\n  font-weight: 800;\n\n  cursor: pointer;\n  list-style: none;\n}\n\n#jh-cleaner-final .jh-faq summary::-webkit-details-marker {\n  display: none;\n}\n\n#jh-cleaner-final .jh-faq summary::after {\n  content: \"+\";\n\n  position: absolute;\n\n  right: 2px;\n  top: 50%;\n\n  transform: translateY(-50%);\n\n  color: var(--teal);\n\n  font-size: 23px;\n  font-weight: 500;\n}\n\n#jh-cleaner-final .jh-faq details[open] summary::after {\n  content: \"−\";\n}\n\n#jh-cleaner-final .jh-faq details p {\n  margin: -2px 0 16px;\n\n  padding-right: 18px;\n\n  color: var(--muted);\n\n  font-size: 13px;\n  line-height: 1.55;\n}\n\n\n\/* =========================================================\n   FINAL CTA\n========================================================= *\/\n\n#jh-cleaner-final .jh-final-cta {\n  max-width: 820px;\n\n  margin: 25px auto 0;\n\n  padding: 30px 26px;\n\n  text-align: center;\n\n  color: #ffffff;\n\n  background:\n    linear-gradient(\n      135deg,\n      var(--navy-dark),\n      var(--navy)\n    );\n\n  border-radius: 22px;\n}\n\n#jh-cleaner-final .jh-final-cta \u003e span {\n  display: block;\n\n  margin-bottom: 8px;\n\n  color: #76dadc;\n\n  font-size: 10px;\n\n  letter-spacing: .12em;\n\n  font-weight: 900;\n}\n\n#jh-cleaner-final .jh-final-cta h2 {\n  margin-left: auto;\n  margin-right: auto;\n\n  color: #ffffff;\n\n  font-size: clamp(26px, 4vw, 38px);\n}\n\n#jh-cleaner-final .jh-final-cta button {\n  position: relative;\n  z-index: 2;\n\n  width: min(100%, 390px);\n\n  min-height: 52px;\n\n  margin-top: 5px;\n\n  padding: 13px 20px;\n\n  color: var(--navy-dark);\n\n  background: var(--orange);\n\n  border: 0;\n  border-radius: 13px;\n\n  font-size: 13px;\n  font-weight: 900;\n\n  letter-spacing: .035em;\n\n  cursor: pointer;\n  pointer-events: auto;\n  touch-action: manipulation;\n\n  box-shadow:\n    0 9px 22px\n    rgba(0,0,0,.16);\n}\n\n\n\/* =========================================================\n   TABLET\n========================================================= *\/\n\n@media (max-width: 800px) {\n\n  #jh-cleaner-final .jh-page {\n    padding-left: 16px;\n    padding-right: 16px;\n  }\n\n}\n\n\n\/* =========================================================\n   MOBILE\n========================================================= *\/\n\n@media (max-width: 720px) {\n\n  #jh-cleaner-final .jh-page {\n    width: 100%;\n\n    padding:\n      12px\n      11px\n      34px;\n  }\n\n\n  #jh-cleaner-final h2 {\n    font-size: 27px;\n    line-height: 1.1;\n  }\n\n\n  #jh-cleaner-final h3 {\n    font-size: 21px;\n    line-height: 1.18;\n  }\n\n\n  \/* INTRO *\/\n\n  #jh-cleaner-final .jh-intro {\n    padding:\n      24px\n      15px\n      22px;\n\n    border-radius: 19px;\n  }\n\n  #jh-cleaner-final .jh-intro \u003e p {\n    font-size: 14px;\n    line-height: 1.55;\n  }\n\n  #jh-cleaner-final .jh-pill-row {\n    gap: 6px;\n  }\n\n  #jh-cleaner-final .jh-pill-row span {\n    padding: 7px 9px;\n\n    font-size: 10px;\n  }\n\n\n  \/* HEADING *\/\n\n  #jh-cleaner-final .jh-heading-block {\n    margin:\n      30px\n      auto\n      18px;\n\n    padding: 0 5px;\n  }\n\n  #jh-cleaner-final .jh-heading-block \u003e p {\n    font-size: 14px;\n    line-height: 1.55;\n  }\n\n\n  \/* GIF *\/\n\n  #jh-cleaner-final .jh-demo {\n    width: 100%;\n    max-width: 100%;\n\n    margin-bottom: 18px;\n\n    border-radius: 18px;\n  }\n\n  #jh-cleaner-final .jh-demo-media {\n    width: 100%;\n    max-width: 100%;\n  }\n\n  #jh-cleaner-final .jh-demo-text {\n    padding:\n      17px\n      15px\n      19px;\n  }\n\n  #jh-cleaner-final .jh-demo-text \u003e p {\n    margin-bottom: 13px;\n\n    font-size: 13px;\n    line-height: 1.52;\n  }\n\n  #jh-cleaner-final .jh-flow {\n    gap: 5px;\n  }\n\n  #jh-cleaner-final .jh-flow span {\n    padding: 7px 9px;\n\n    font-size: 10px;\n  }\n\n\n  \/* TRUST *\/\n\n  #jh-cleaner-final .jh-trust {\n    grid-template-columns: 1fr;\n\n    border-radius: 16px;\n  }\n\n  #jh-cleaner-final .jh-trust \u003e div {\n    padding: 11px 13px;\n  }\n\n\n  \/* CONTENT *\/\n\n  #jh-cleaner-final .jh-content-card {\n    width: 100%;\n\n    margin: 18px auto;\n\n    border-radius: 18px;\n  }\n\n  #jh-cleaner-final .jh-content-text {\n    padding:\n      18px\n      15px\n      20px;\n  }\n\n  #jh-cleaner-final .jh-content-text \u003e p {\n    font-size: 13px;\n    line-height: 1.55;\n  }\n\n\n  \/* RESULTS *\/\n\n  #jh-cleaner-final .jh-result-card {\n    width: 100%;\n\n    margin-bottom: 15px;\n\n    border-radius: 17px;\n  }\n\n  #jh-cleaner-final .jh-result-text {\n    padding:\n      16px\n      15px\n      18px;\n  }\n\n  #jh-cleaner-final .jh-result-text \u003e p {\n    font-size: 13px;\n    line-height: 1.5;\n  }\n\n\n  \/* SAFETY *\/\n\n  #jh-cleaner-final .jh-safety {\n    padding:\n      22px\n      14px;\n\n    border-radius: 18px;\n  }\n\n  #jh-cleaner-final .jh-safety-list {\n    grid-template-columns: 1fr;\n  }\n\/* FAQ *\/\n\n  #jh-cleaner-final .jh-faq {\n    padding:\n      22px\n      15px;\n\n    border-radius: 18px;\n  }\n\n\n  \/* CTA *\/\n\n  #jh-cleaner-final .jh-final-cta {\n    padding:\n      25px\n      16px;\n\n    border-radius: 18px;\n  }\n\n  #jh-cleaner-final .jh-final-cta h2 {\n    font-size: 26px;\n  }\n\n  #jh-cleaner-final .jh-final-cta button {\n    width: 100%;\n  }\n\n}\n\n\n\/* =========================================================\n   VERY SMALL MOBILE\n========================================================= *\/\n\n@media (max-width: 390px) {\n\n  #jh-cleaner-final h2 {\n    font-size: 25px;\n  }\n\n  #jh-cleaner-final h3 {\n    font-size: 20px;\n  }\n\n}\n\n\n\/* =========================================================\n   MOTION ACCESSIBILITY\n========================================================= *\/\n\n@media (prefers-reduced-motion: reduce) {\n\n  #jh-cleaner-final * {\n    scroll-behavior: auto !important;\n  }\n\n}\n\n\u003c\/style\u003e\n\n\u003cscript\u003e\n(function () {\n  \"use strict\";\n\n  \/*\n   * Vivlumin CTA scroll fix\n   * - Works even when bundle\/variant blocks are rendered by Shopify or an app after page load.\n   * - Avoids relying on one fragile hard-coded ID.\n   * - Scrolls slightly ABOVE the options area so the price remains visible.\n   *\/\n\n  var ROOT_ID = \"jh-cleaner-final\";\n  var BUTTON_ID = \"jh-view-product-options\";\n\n  function isVisible(el) {\n    if (!el || !(el instanceof Element)) return false;\n\n    var style = window.getComputedStyle(el);\n    if (\n      style.display === \"none\" ||\n      style.visibility === \"hidden\" ||\n      parseFloat(style.opacity || \"1\") === 0\n    ) {\n      return false;\n    }\n\n    var rect = el.getBoundingClientRect();\n    return rect.width \u003e 0 \u0026\u0026 rect.height \u003e 0;\n  }\n\n  function textOf(el) {\n    return (el \u0026\u0026 (el.innerText || el.textContent) || \"\")\n      .replace(\/\\s+\/g, \" \")\n      .trim()\n      .toLowerCase();\n  }\n\n  function outsideCustomLiquid(el) {\n    var root = document.getElementById(ROOT_ID);\n    return !!el \u0026\u0026 (!root || !root.contains(el));\n  }\n\n  function firstVisible(selectors) {\n    for (var i = 0; i \u003c selectors.length; i++) {\n      var nodes;\n      try {\n        nodes = document.querySelectorAll(selectors[i]);\n      } catch (e) {\n        continue;\n      }\n\n      for (var j = 0; j \u003c nodes.length; j++) {\n        var el = nodes[j];\n        if (outsideCustomLiquid(el) \u0026\u0026 isVisible(el)) {\n          return el;\n        }\n      }\n    }\n    return null;\n  }\n\n  function findByBundleText() {\n    var candidates = document.querySelectorAll(\n      \"fieldset, form, section, div, label, button\"\n    );\n\n    var phrases = [\n      \"single bottle\",\n      \"buy 1\",\n      \"buy 2\",\n      \"buy 3\",\n      \"buy 4\",\n      \"buy 5\",\n      \"get 1 free\",\n      \"get 2 free\",\n      \"get 3 free\",\n      \"get 4 free\",\n      \"best value\",\n      \"most popular\",\n      \"bundle\",\n      \"package\",\n      \"product options\",\n      \"choose option\",\n      \"choose your\",\n      \"select option\"\n    ];\n\n    var best = null;\n    var bestScore = -1;\n\n    for (var i = 0; i \u003c candidates.length; i++) {\n      var el = candidates[i];\n\n      if (!outsideCustomLiquid(el) || !isVisible(el)) continue;\n\n      var txt = textOf(el);\n      if (!txt || txt.length \u003e 1800) continue;\n\n      var score = 0;\n\n      for (var p = 0; p \u003c phrases.length; p++) {\n        if (txt.indexOf(phrases[p]) !== -1) score += 2;\n      }\n\n      if (\/\\$\\s*\\d\/.test(txt)) score += 1;\n      if (\/save\\s*\\d+%\/.test(txt)) score += 1;\n      if (\/free shipping\/.test(txt)) score += 1;\n\n      var tag = el.tagName.toLowerCase();\n      if (tag === \"fieldset\" || tag === \"form\" || tag === \"section\") score += 2;\n\n      var cls = String(el.className || \"\").toLowerCase();\n      var id = String(el.id || \"\").toLowerCase();\n\n      if (\n        cls.indexOf(\"bundle\") !== -1 ||\n        id.indexOf(\"bundle\") !== -1 ||\n        cls.indexOf(\"quantity-break\") !== -1 ||\n        id.indexOf(\"quantity-break\") !== -1 ||\n        cls.indexOf(\"product-form\") !== -1 ||\n        id.indexOf(\"product-form\") !== -1\n      ) {\n        score += 3;\n      }\n\n      if (score \u003e bestScore) {\n        bestScore = score;\n        best = el;\n      }\n    }\n\n    return bestScore \u003e= 3 ? best : null;\n  }\n\n  function findOptionsTarget() {\n    \/*\n     * Priority 1: bundle \/ quantity-break \/ variant selectors.\n     * The selector list intentionally covers Dawn + common bundle apps.\n     *\/\n    var target = firstVisible([\n      \"[data-bundle-options]\",\n      \"[data-bundle]\",\n      \"[data-bundles]\",\n      \"[id*='bundle-options' i]\",\n      \"[id*='bundle' i]\",\n      \"[class*='bundle-options' i]\",\n      \"[class*='bundle' i]\",\n      \"[id*='quantity-break' i]\",\n      \"[class*='quantity-break' i]\",\n      \"[id*='volume-discount' i]\",\n      \"[class*='volume-discount' i]\",\n      \"variant-radios\",\n      \"variant-selects\",\n      \"fieldset.product-form__input\",\n      \".product-form__input\"\n    ]);\n\n    if (!target) {\n      target = findByBundleText();\n    }\n\n    \/*\n     * Final fallback: the main product purchase form.\n     *\/\n    if (!target) {\n      target = firstVisible([\n        \"product-form form\",\n        \".product-form form\",\n        \"form[action*='\/cart\/add']\",\n        \".product__info-container\"\n      ]);\n    }\n\n    return target;\n  }\n\n  function findPriceAbove(target) {\n    if (!target) return null;\n\n    var info =\n      target.closest(\".product__info-container\") ||\n      target.closest(\"[class*='product-info']\") ||\n      target.closest(\"[class*='product__info']\");\n\n    if (!info) return null;\n\n    var priceCandidates = info.querySelectorAll(\n      \".price, [class*='price' i], [data-product-price]\"\n    );\n\n    var targetTop = target.getBoundingClientRect().top + window.pageYOffset;\n    var best = null;\n    var bestTop = -Infinity;\n\n    for (var i = 0; i \u003c priceCandidates.length; i++) {\n      var price = priceCandidates[i];\n      if (!isVisible(price)) continue;\n\n      var top = price.getBoundingClientRect().top + window.pageYOffset;\n\n      \/*\n       * Only use a visible price block immediately above the option area.\n       *\/\n      if (top \u003c= targetTop \u0026\u0026 targetTop - top \u003c= 650 \u0026\u0026 top \u003e bestTop) {\n        best = price;\n        bestTop = top;\n      }\n    }\n\n    return best;\n  }\n\n  function stickyHeaderHeight() {\n    var selectors = [\n      \".shopify-section-header-sticky\",\n      \".shopify-section-header-hidden\",\n      \"sticky-header\",\n      \"header.header\",\n      \"#shopify-section-header\"\n    ];\n\n    var maxHeight = 0;\n\n    for (var i = 0; i \u003c selectors.length; i++) {\n      var nodes = document.querySelectorAll(selectors[i]);\n\n      for (var j = 0; j \u003c nodes.length; j++) {\n        var el = nodes[j];\n        if (!isVisible(el)) continue;\n\n        var style = window.getComputedStyle(el);\n        var pos = style.position;\n\n        if (pos === \"fixed\" || pos === \"sticky\") {\n          maxHeight = Math.max(maxHeight, el.getBoundingClientRect().height || 0);\n        }\n      }\n    }\n\n    return maxHeight;\n  }\n\n  function scrollToOptions() {\n    var target = findOptionsTarget();\n\n    if (!target) {\n      \/*\n       * Absolute fallback: move to the upper product-information area\n       * rather than allowing the CTA to appear dead.\n       *\/\n      target =\n        document.querySelector(\".product__info-container\") ||\n        document.querySelector(\"product-info\") ||\n        document.querySelector(\"main\");\n    }\n\n    if (!target) return;\n\n    \/*\n     * Prefer the nearby price above the bundle\/options block when available.\n     * This keeps the full price visible after the jump.\n     *\/\n    var price = findPriceAbove(target);\n    var anchor = price || target;\n\n    var anchorTop =\n      anchor.getBoundingClientRect().top + window.pageYOffset;\n\n    var headerOffset = stickyHeaderHeight();\n\n    \/*\n     * Extra upward offset so the price + discount\/promo area\n     * remains visible above the bundle\/options section.\n     * mobile: 110px\n     * desktop: 90px\n     *\/\n    var extra = window.innerWidth \u003c= 749 ? 110 : 90;\n\n    var destination = Math.max(\n      0,\n      anchorTop - headerOffset - extra\n    );\n\n    var reduceMotion =\n      window.matchMedia \u0026\u0026\n      window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n    window.scrollTo({\n      top: destination,\n      behavior: reduceMotion ? \"auto\" : \"smooth\"\n    });\n\n    \/*\n     * Recalculate shortly after the first movement.\n     * This helps when sticky headers or app widgets change height during scroll.\n     *\/\n    window.setTimeout(function () {\n      var refreshedTarget = findOptionsTarget() || target;\n      var refreshedPrice = findPriceAbove(refreshedTarget);\n      var refreshedAnchor = refreshedPrice || refreshedTarget;\n\n      if (!refreshedAnchor || !isVisible(refreshedAnchor)) return;\n\n      var refreshedTop =\n        refreshedAnchor.getBoundingClientRect().top + window.pageYOffset;\n\n      var refreshedDestination = Math.max(\n        0,\n        refreshedTop - stickyHeaderHeight() - extra\n      );\n\n      if (Math.abs(window.pageYOffset - refreshedDestination) \u003e 18) {\n        window.scrollTo({\n          top: refreshedDestination,\n          behavior: reduceMotion ? \"auto\" : \"smooth\"\n        });\n      }\n    }, 450);\n  }\n\n  \/*\n   * Event delegation is used so the button continues to work if Shopify's\n   * theme editor re-renders the Custom Liquid section.\n   *\/\n  if (!window.__jhCleanerCtaScrollBound) {\n    document.addEventListener(\"click\", function (event) {\n      var button = event.target.closest(\"#\" + BUTTON_ID);\n      if (!button) return;\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      scrollToOptions();\n    });\n\n    window.__jhCleanerCtaScrollBound = true;\n  }\n\n  \/*\n   * Also expose the function for easy testing from the browser console.\n   *\/\n  window.jhScrollToProductOptions = scrollToOptions;\n})();\n\u003c\/script\u003e\n\n\u003cp\u003e \u003c\/p\u003e","brand":"Vivlumin™","offers":[{"title":"🔥BUY 1 GET 2 FREE","offer_id":57001567650132,"sku":"TTB-LRX-QMNJ*3","price":44.99,"currency_code":"USD","in_stock":true},{"title":"💎BUY 1 GET 1 FREE","offer_id":57001567682900,"sku":"TTB-LRX-QMNJ*2","price":34.99,"currency_code":"USD","in_stock":true},{"title":"JUST 1 BOTTLE","offer_id":57001567715668,"sku":"TTB-LRX-QMNJ*1","price":19.99,"currency_code":"USD","in_stock":true},{"title":"🎁BUY 1 GET 4 FREE","offer_id":57001567748436,"sku":"TTB-LRX-QMNJ*5","price":59.99,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1039\/4219\/3492\/files\/yf-generated-node-k9dglo6l1p.jpg?v=1788430958","url":"https:\/\/vivlumin.com\/products\/%e2%8f%b0%e2%8f%b0%f0%9d%91%aa%f0%9d%92%90%f0%9d%92%8f%f0%9d%92%88%f0%9d%92%93%f0%9d%92%82%f0%9d%92%95%f0%9d%92%96%f0%9d%92%8d%f0%9d%92%82%f0%9d%92%95%f0%9d%92%8a%f0%9d%92%90%f0%9d%92%8f%f0%9d%92%94-%f0%9d%92%80%f0%9d%92%90%f0%9d%92%96-%f0%9d%92%93%f0%9d%92%86-%f0%9d%92%90%f0%9d%92%96%f0%9d%92%93-500%f0%9d%92%95%f0%9d%92%89-%f0%9d%92%84%f0%9d%92%96%f0%9d%92%94%f0%9d%92%95%f0%9d%92%90%f0%9d%92%8e%f0%9d%92%86%f0%9d%92%93-%f0%9d%92%95%f0%9d%92%90%f0%9d%92%85%f0%9d%92%82%f0%9d%92%9a-%f0%9d%92%82%f0%9d%92%8f%f0%9d%92%85-%f0%9d%92%9a%f0%9d%92%90%f0%9d%92%96-%f0%9d%92%88%f0%9d%92%86%f0%9d%92%95-%f0%9d%92%95%f0%9d%92%90-%f0%9d%92%86%f0%9d%92%8f%f0%9d%92%8b%f0%9d%92%90%f0%9d%92%9a-%f0%9d%92%82-%f0%9d%92%94%f0%9d%92%91%f0%9d%92%86%f0%9d%92%84%f0%9d%92%8a%f0%9d%92%82%f0%9d%92%8d-%f0%9d%92%90%f0%9d%92%87%f0%9d%92%87%f0%9d%92%86%f0%9d%92%93-%f0%9d%92%82-%f0%9d%92%94%f0%9d%92%86%f0%9d%92%84%f0%9d%92%90%f0%9d%92%8f%f0%9d%92%85-%f0%9d%92%91%f0%9d%92%93%f0%9d%92%90%f0%9d%92%85%f0%9d%92%96%f0%9d%92%84%f0%9d%92%95-%f0%9d%92%87%f0%9d%92%90%f0%9d%92%93-30-%f0%9d%92%90%f0%9d%92%87%f0%9d%92%87-3","provider":"Vivlumin™","version":"1.0","type":"link"}