{"product_id":"pet-supplies-gravity-rolling-cat-teasing-ball","title":"Pet Supplies Gravity Rolling Cat Teasing Ball","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\u003eGravity Rolling Cat Teasing Ball — VIORA Premium Pet Store\u003c\/title\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin\u003e\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Playfair+Display:wght@400;500;600;700\u0026amp;family=Inter:wght@300;400;500;600\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003cstyle\u003e\n\/* ============================================================\n   VIORA — Design Tokens\n   ============================================================ *\/\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\nhtml {\n  margin: 0 !important; padding: 0 !important;\n  overflow-y: scroll; overflow-x: hidden;\n  width: 100% !important; scrollbar-gutter: stable;\n}\nbody {\n  margin: 0 !important; padding: 0 !important;\n  width: 100% !important; max-width: 100% !important;\n  overflow-x: hidden; left: 0 !important; right: 0 !important;\n}\n.shopify-section, .shopify-section-group,\nmain, #main, #MainContent, .main-content, .page-width,\n.container, .wrapper,\n[class*=\"page-container\"], [class*=\"site-width\"],\n[class*=\"layout\"], [id*=\"shopify-section\"] {\n  margin: 0 !important; padding: 0 !important;\n  max-width: 100% !important; width: 100% !important;\n}\n#MainContent, .main-content, main { padding-top: 0 !important; margin-top: 0 !important; }\nbody.announcement-bar--visible, body[class*=\"announcement\"] { margin-top: 0 !important; padding-top: 0 !important; }\n\n#MainContent \u003e h1, .main-content \u003e h1, main \u003e h1,\n#MainContent \u003e .page-width \u003e h1, .main-content \u003e .page-width \u003e h1, main \u003e .page-width \u003e h1,\n.shopify-section \u003e .page-width \u003e h1,\n.page-width \u003e h1.page-title, h1.page-title, h1.title, .title-wrapper \u003e h1 {\n  display: none !important;\n}\n#MainContent \u003e .page-width:has(\u003e h1):not(:has(#announcement-bar)),\n.main-content \u003e .page-width:has(\u003e h1):not(:has(#announcement-bar)),\n.shopify-section:has(\u003e .page-width \u003e h1):not(:has(#announcement-bar)) {\n  display: none !important;\n}\n\n:root {\n  --navy: #0F1B2D; --navy-light: #1a2e47;\n  --cream: #FBF8F3; --gold: #C8A96E; --gold-light: #DFC08E;\n  --blush: #F5E6D3; --slate: #4A5568; --ash: #E8E4DE;\n  --text: #1A1A1A; --text-muted: #6B7280;\n  --white: #FFFFFF; --red-sale: #C0392B;\n  --radius: 12px; --radius-sm: 8px;\n  --shadow: 0 4px 24px rgba(15,27,45,0.10);\n  --shadow-lg: 0 12px 48px rgba(15,27,45,0.16);\n  --transition: 0.3s cubic-bezier(0.4,0,0.2,1);\n}\nhtml { scroll-behavior: smooth; }\nbody { font-family: 'Inter', sans-serif; background: var(--cream); color: var(--text); -webkit-font-smoothing: antialiased; }\n\n\/* ============================================================\n   ANNOUNCEMENT BAR\n   ============================================================ *\/\n#announcement-bar {\n  background: var(--navy); color: var(--cream);\n  padding: 9px 16px; text-align: center;\n  position: relative; z-index: 200; overflow: hidden;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n  transition: height 0.35s ease, padding 0.35s ease, opacity 0.35s ease;\n}\n#announcement-bar.hidden { height: 0 !important; padding: 0; opacity: 0; pointer-events: none; }\n.ann-track { display: flex; gap: 60px; animation: marquee 28s linear infinite; white-space: nowrap; width: max-content; }\n.ann-item { font-size: 12.5px; font-weight: 500; letter-spacing: 0.06em; display: flex; align-items: center; gap: 8px; }\n.ann-item span.dot { color: var(--gold); font-size: 14px; }\n@keyframes marquee { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } }\n\n\/* ============================================================\n   HEADER\n   ============================================================ *\/\n#site-header {\n  position: sticky; top: 0; left: 0 !important; right: 0 !important; z-index: 100;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n  background: rgba(251,248,243,0.96);\n  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);\n  border-bottom: 1px solid rgba(200,169,110,0.18);\n  transition: transform 0.38s cubic-bezier(0.4,0,0.2,1), box-shadow 0.3s ease;\n  box-shadow: 0 2px 20px rgba(15,27,45,0.07);\n}\n#site-header.hide { transform: translateY(-100%); }\n.header-inner { max-width: 1280px; margin: 0 auto; padding: 0 24px; height: 68px; display: flex; align-items: center; justify-content: space-between; gap: 16px; }\n.header-logo img { height: 48px; width: auto; display: block; }\n.header-logo-text { font-family: 'Playfair Display', serif; font-size: 24px; font-weight: 700; color: var(--navy); text-decoration: none; letter-spacing: 0.04em; }\n.header-nav { display: flex; align-items: center; gap: 28px; }\n.header-nav a { font-size: 13.5px; font-weight: 500; color: var(--navy); text-decoration: none; letter-spacing: 0.04em; position: relative; padding-bottom: 3px; transition: color var(--transition); }\n.header-nav a::after { content: ''; position: absolute; bottom: 0; left: 0; width: 0; height: 1.5px; background: var(--gold); transition: width var(--transition); }\n.header-nav a:hover { color: var(--gold); }\n.header-nav a:hover::after { width: 100%; }\n.header-actions { display: flex; align-items: center; gap: 8px; }\n.btn-icon { background: none; border: none; cursor: pointer; padding: 8px; border-radius: 50%; display: flex; align-items: center; justify-content: center; transition: background var(--transition); color: var(--navy); }\n.btn-icon:hover { background: var(--blush); }\n.cart-btn-wrap { position: relative; }\n.cart-count { position: absolute; top: 2px; right: 2px; background: var(--gold); color: var(--navy); font-size: 9px; font-weight: 700; width: 16px; height: 16px; border-radius: 50%; display: flex; align-items: center; justify-content: center; pointer-events: none; }\n.nav-hamburger { display: none; background: none; border: none; cursor: pointer; padding: 6px; color: var(--navy); }\n\n\/* Mobile nav *\/\n.mobile-nav { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 300; }\n.mobile-nav.open { display: block; }\n.mobile-nav-backdrop { position: absolute; inset: 0; background: rgba(15,27,45,0.5); }\n.mobile-nav-drawer { position: absolute; top: 0; right: 0; width: 280px; height: 100%; background: var(--cream); padding: 24px; display: flex; flex-direction: column; animation: slideInRight 0.3s ease; }\n@keyframes slideInRight { from { transform: translateX(100%); } to { transform: translateX(0); } }\n.mobile-nav-close { align-self: flex-end; background: none; border: none; cursor: pointer; font-size: 22px; color: var(--navy); margin-bottom: 24px; }\n.mobile-nav-drawer a { display: block; font-size: 16px; font-weight: 500; color: var(--navy); text-decoration: none; padding: 14px 0; border-bottom: 1px solid var(--ash); }\n\n\/* ============================================================\n   CART DRAWER\n   ============================================================ *\/\n.cart-drawer-overlay { position: fixed; inset: 0; background: rgba(15,27,45,0.45); z-index: 400; display: none; opacity: 0; transition: opacity 0.3s ease; }\n.cart-drawer-overlay.open { display: block; opacity: 1; }\n.cart-drawer { position: fixed; top: 0; right: -420px; width: 400px; max-width: 100vw; height: 100%; background: var(--white); z-index: 401; display: flex; flex-direction: column; transition: right 0.38s cubic-bezier(0.4,0,0.2,1); box-shadow: -8px 0 32px rgba(15,27,45,0.15); }\n.cart-drawer.open { right: 0; }\n.cart-drawer-head { padding: 20px 24px; border-bottom: 1px solid var(--ash); display: flex; align-items: center; justify-content: space-between; }\n.cart-drawer-head h3 { font-family: 'Playfair Display', serif; font-size: 18px; font-weight: 600; color: var(--navy); }\n.cart-close-btn { background: none; border: none; cursor: pointer; font-size: 20px; color: var(--slate); padding: 4px; }\n.free-shipping-bar { padding: 16px 24px; border-bottom: 1px solid var(--ash); }\n.free-shipping-bar p { font-size: 12.5px; color: var(--slate); margin-bottom: 8px; }\n.free-shipping-bar p strong { color: var(--navy); }\n.progress-track { height: 5px; background: var(--ash); border-radius: 99px; overflow: hidden; }\n.progress-fill { height: 100%; background: linear-gradient(90deg, var(--gold), var(--gold-light)); border-radius: 99px; transition: width 0.5s ease; }\n.cart-items-wrap { flex: 1; overflow-y: auto; padding: 16px 24px; }\n.cart-empty-msg { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 200px; gap: 12px; color: var(--text-muted); font-size: 14px; }\n.cart-item { display: flex; gap: 14px; padding: 14px 0; border-bottom: 1px solid var(--ash); }\n.cart-item img { width: 70px; height: 70px; object-fit: cover; border-radius: var(--radius-sm); flex-shrink: 0; }\n.cart-item-info { flex: 1; }\n.cart-item-title { font-size: 13px; font-weight: 500; color: var(--navy); margin-bottom: 4px; }\n.cart-item-price { font-size: 14px; font-weight: 600; color: var(--gold); }\n.cart-item-qty { display: flex; align-items: center; gap: 8px; margin-top: 8px; }\n.qty-btn { width: 26px; height: 26px; background: var(--ash); border: none; border-radius: 6px; cursor: pointer; font-size: 14px; display: flex; align-items: center; justify-content: center; }\n.qty-num { font-size: 13px; font-weight: 500; min-width: 20px; text-align: center; }\n.cart-footer { padding: 20px 24px; border-top: 1px solid var(--ash); }\n.cart-subtotal { display: flex; justify-content: space-between; align-items: center; margin-bottom: 14px; font-size: 15px; }\n.cart-subtotal strong { font-family: 'Playfair Display', serif; font-size: 17px; }\n.btn-checkout { display: block; width: 100%; background: var(--navy); color: var(--cream); padding: 15px; border: none; border-radius: var(--radius); font-size: 14px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; cursor: pointer; transition: background var(--transition), transform 0.15s ease; }\n.btn-checkout:hover { background: var(--navy-light); }\n.btn-checkout:active { transform: scale(0.98); }\n.cart-policy-note { text-align: center; font-size: 11px; color: var(--text-muted); margin-top: 10px; }\n\n\/* ============================================================\n   REVEAL ANIMATIONS\n   ============================================================ *\/\n.reveal { opacity: 0; transform: translateY(28px); transition: opacity 0.65s ease, transform 0.65s ease; }\n.reveal.visible { opacity: 1; transform: none; }\n.reveal-delay-1 { transition-delay: 0.12s; }\n.reveal-delay-2 { transition-delay: 0.24s; }\n.reveal-delay-3 { transition-delay: 0.36s; }\n\n\/* ============================================================\n   SECTION SHARED\n   ============================================================ *\/\n.section {\n  padding: 88px 24px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important;\n  margin-right: calc(-50vw + 50%) !important;\n}\n.section-inner { max-width: 1280px; margin: 0 auto; }\n.section-head { text-align: center; margin-bottom: 56px; }\n.section-eyebrow { display: inline-block; font-size: 11.5px; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gold); margin-bottom: 12px; }\n.section-title { font-family: 'Playfair Display', serif; font-size: clamp(28px, 3.5vw, 42px); font-weight: 700; color: var(--navy); line-height: 1.2; margin-bottom: 14px; }\n.section-sub { font-size: 16px; color: var(--text-muted); max-width: 540px; margin: 0 auto; line-height: 1.7; }\n\n\/* ============================================================\n   PRODUCT HERO\n   ============================================================ *\/\n#product-hero {\n  padding: 40px 24px 64px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n  background: var(--cream);\n}\n.product-hero-inner {\n  max-width: 1200px; margin: 0 auto;\n  display: grid; grid-template-columns: 1fr 1fr; gap: 56px; align-items: start;\n}\n\n\/* Gallery *\/\n.product-gallery { position: sticky; top: 84px; }\n.gallery-main {\n  position: relative; border-radius: 16px; overflow: hidden;\n  background: var(--white); margin-bottom: 12px;\n  box-shadow: var(--shadow);\n  aspect-ratio: 1;\n}\n.gallery-main img {\n  width: 100%; height: 100%; object-fit: cover;\n  display: none; transition: opacity 0.3s ease;\n}\n.gallery-main img.active { display: block; }\n.gallery-badge-row {\n  position: absolute; top: 14px; left: 14px;\n  display: flex; flex-direction: column; gap: 6px;\n}\n.gallery-badge {\n  display: inline-block; padding: 4px 10px;\n  border-radius: 99px; font-size: 11px; font-weight: 700;\n  letter-spacing: 0.05em; text-transform: uppercase;\n}\n.badge-sale { background: var(--red-sale); color: var(--white); }\n.badge-hot { background: var(--gold); color: var(--navy); }\n.gallery-thumbs {\n  display: flex; gap: 8px; overflow-x: auto;\n  scrollbar-width: none; padding-bottom: 4px;\n}\n.gallery-thumbs::-webkit-scrollbar { display: none; }\n.gallery-thumb {\n  width: 72px; height: 72px; flex-shrink: 0;\n  border-radius: 10px; overflow: hidden;\n  cursor: pointer; border: 2px solid transparent;\n  transition: border-color var(--transition), opacity var(--transition);\n  background: var(--white);\n}\n.gallery-thumb img { width: 100%; height: 100%; object-fit: cover; }\n.gallery-thumb.active { border-color: var(--gold); }\n.gallery-thumb:hover { opacity: 0.85; }\n\n\/* Product info panel *\/\n.product-info-panel { padding-top: 4px; }\n.product-rating-row {\n  display: flex; align-items: center; gap: 10px;\n  margin-bottom: 14px;\n}\n.product-stars { color: var(--gold); font-size: 15px; letter-spacing: 1px; }\n.product-rating-count { font-size: 13px; color: var(--text-muted); }\n.product-rating-count a { color: var(--gold); text-decoration: none; }\n.product-title {\n  font-family: 'Playfair Display', serif;\n  font-size: clamp(24px, 3vw, 34px); font-weight: 700;\n  color: var(--navy); line-height: 1.2; margin-bottom: 12px;\n}\n.product-price-row { display: flex; align-items: center; gap: 12px; margin-top: 4px; margin-bottom: 10px; padding-top: 2px; }\n.pp-current { font-family: 'Playfair Display', serif; font-size: 32px; font-weight: 700; color: var(--gold); letter-spacing: 0.01em; }\n.pp-original { font-size: 17px; color: var(--text-muted); text-decoration: line-through; }\n.pp-save { background: rgba(192,57,43,0.1); color: var(--red-sale); font-size: 12.5px; font-weight: 700; padding: 3px 9px; border-radius: 99px; }\n.product-short-desc { font-size: 14.5px; color: var(--text-muted); line-height: 1.65; margin-bottom: 22px; max-width: 460px; }\n.product-trust-mini {\n  display: flex; align-items: center; gap: 18px;\n  margin-bottom: 24px; padding: 12px 0;\n  border-top: 1px solid var(--ash); border-bottom: 1px solid var(--ash);\n}\n.ptm-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--slate); font-weight: 500; }\n.ptm-item span.icon { font-size: 14px; }\n\n\/* Color swatches *\/\n.variant-label-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }\n.variant-label { font-size: 13px; font-weight: 600; color: var(--navy); text-transform: uppercase; letter-spacing: 0.06em; }\n.variant-selected-name { font-size: 13px; color: var(--text-muted); }\n.color-swatches { display: flex; gap: 10px; margin-bottom: 24px; }\n.color-swatch {\n  width: 36px; height: 36px; border-radius: 50%;\n  border: 2.5px solid transparent; cursor: pointer;\n  transition: border-color var(--transition), transform 0.2s ease;\n  position: relative;\n}\n.color-swatch:hover { transform: scale(1.1); }\n.color-swatch.active { border-color: var(--gold); }\n.color-swatch.active::after {\n  content: '✓'; position: absolute; inset: 0;\n  display: flex; align-items: center; justify-content: center;\n  font-size: 13px; color: var(--white); font-weight: 700;\n  text-shadow: 0 1px 3px rgba(0,0,0,0.4);\n}\n.swatch-blue { background: #4A90D9; }\n.swatch-pink { background: #E8A0A0; }\n\n\/* Quantity + ATC *\/\n.qty-section { margin-bottom: 18px; }\n.qty-section label { display: block; font-size: 13px; font-weight: 600; color: var(--navy); text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 10px; }\n.qty-control { display: inline-flex; align-items: center; border: 1.5px solid var(--ash); border-radius: 99px; overflow: hidden; }\n.qty-control button { width: 42px; height: 42px; background: none; border: none; cursor: pointer; font-size: 18px; color: var(--navy); transition: background var(--transition); display: flex; align-items: center; justify-content: center; }\n.qty-control button:hover { background: var(--blush); }\n.qty-control input { width: 48px; text-align: center; border: none; outline: none; font-size: 15px; font-weight: 600; color: var(--navy); font-family: 'Inter', sans-serif; background: none; }\n\n.btn-atc {\n  display: flex; align-items: center; justify-content: center; gap: 10px;\n  width: 100%; padding: 17px;\n  background: var(--navy); color: var(--cream);\n  border: none; border-radius: var(--radius); cursor: pointer;\n  font-size: 14.5px; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase;\n  transition: background var(--transition), transform 0.15s ease, box-shadow 0.2s ease;\n  margin-bottom: 12px;\n  box-shadow: 0 4px 20px rgba(15,27,45,0.18);\n}\n.btn-atc:hover { background: var(--navy-light); transform: translateY(-2px); box-shadow: 0 8px 28px rgba(15,27,45,0.24); }\n.btn-atc:active { transform: scale(0.98); }\n.btn-atc.loading { pointer-events: none; opacity: 0.8; }\n.btn-atc.added { background: #2d7a4f; }\n\n.btn-buy-now {\n  display: flex; align-items: center; justify-content: center; gap: 10px;\n  width: 100%; padding: 16px;\n  background: var(--gold); color: var(--navy);\n  border: none; border-radius: var(--radius); cursor: pointer;\n  font-size: 14.5px; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase;\n  transition: background var(--transition), transform 0.15s ease;\n  margin-bottom: 20px;\n  box-shadow: 0 4px 20px rgba(200,169,110,0.35);\n}\n.btn-buy-now:hover { background: var(--gold-light); transform: translateY(-2px); }\n\n.product-guarantee-strip {\n  display: flex; flex-wrap: wrap; gap: 10px;\n  padding: 16px; background: var(--blush);\n  border-radius: var(--radius); margin-bottom: 20px;\n}\n.pgs-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--slate); font-weight: 500; flex: 1; min-width: 130px; }\n.pgs-icon { font-size: 15px; }\n\n.product-specs-mini { margin-bottom: 8px; }\n.psm-row { display: flex; justify-content: space-between; padding: 9px 0; border-bottom: 1px solid var(--ash); font-size: 13px; }\n.psm-row:last-child { border-bottom: none; }\n.psm-label { color: var(--text-muted); font-weight: 500; }\n.psm-value { color: var(--navy); font-weight: 600; }\n\n\/* Stock urgency *\/\n.stock-urgency { display: flex; align-items: center; gap: 8px; padding: 10px 14px; background: rgba(200,169,110,0.08); border: 1px solid rgba(200,169,110,0.25); border-radius: var(--radius-sm); margin-bottom: 16px; font-size: 12.5px; color: var(--navy); font-weight: 500; }\n.stock-dot { width: 8px; height: 8px; background: #2ecc71; border-radius: 50%; flex-shrink: 0; animation: pulse-dot 1.5s ease infinite; }\n@keyframes pulse-dot { 0%,100% { opacity: 1; } 50% { opacity: 0.4; } }\n\n\/* ============================================================\n   STICKY ATC BAR\n   ============================================================ *\/\n#sticky-atc {\n  position: fixed; bottom: 0; left: 0; right: 0;\n  z-index: 90;\n  background: var(--navy);\n  padding: 12px 20px;\n  display: flex; align-items: center; gap: 14px;\n  transform: translateY(100%);\n  transition: transform 0.4s cubic-bezier(0.4,0,0.2,1);\n  box-shadow: 0 -4px 24px rgba(15,27,45,0.2);\n}\n#sticky-atc.visible { transform: translateY(0); }\n.sticky-product-info { flex: 1; min-width: 0; }\n.sticky-product-name { font-size: 13px; font-weight: 600; color: var(--cream); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.sticky-product-price { font-size: 14px; font-weight: 700; color: var(--gold); }\n.sticky-btn-atc {\n  flex-shrink: 0; padding: 11px 24px;\n  background: var(--gold); color: var(--navy);\n  border: none; border-radius: 99px; cursor: pointer;\n  font-size: 13px; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase;\n  transition: background var(--transition);\n  white-space: nowrap;\n}\n.sticky-btn-atc:hover { background: var(--gold-light); }\n\n\/* ============================================================\n   SOCIAL PROOF TICKER  (cat toy addition — replaces static banner)\n   ============================================================ *\/\n#social-proof-ticker {\n  background: var(--blush);\n  padding: 14px 0;\n  overflow: hidden;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n  border-top: 1px solid var(--ash); border-bottom: 1px solid var(--ash);\n}\n.ticker-track { display: flex; gap: 48px; animation: marquee 22s linear infinite; white-space: nowrap; width: max-content; }\n.ticker-item { font-size: 13px; font-weight: 500; color: var(--navy); display: flex; align-items: center; gap: 8px; }\n.ticker-item .t-icon { font-size: 15px; }\n\n\/* ============================================================\n   WHY CATS NEED THIS  (problem section — navy bg)\n   ============================================================ *\/\n#problem-section {\n  background: var(--navy);\n  padding: 88px 24px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n}\n.problem-inner { max-width: 1100px; margin: 0 auto; }\n.problem-eyebrow { font-size: 11.5px; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gold); margin-bottom: 16px; display: block; text-align: center; }\n.problem-title {\n  font-family: 'Playfair Display', serif;\n  font-size: clamp(26px, 3.5vw, 44px); font-weight: 700;\n  color: var(--white); text-align: center; margin-bottom: 16px; line-height: 1.2;\n}\n.problem-sub { font-size: 16px; color: rgba(251,248,243,0.65); text-align: center; max-width: 580px; margin: 0 auto 56px; line-height: 1.7; }\n.problem-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; }\n.problem-card {\n  background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08);\n  border-radius: 16px; padding: 28px 24px;\n  transition: background var(--transition), transform var(--transition);\n}\n.problem-card:hover { background: rgba(255,255,255,0.08); transform: translateY(-4px); }\n.problem-card-icon { font-size: 32px; margin-bottom: 14px; display: block; }\n.problem-card-title { font-family: 'Playfair Display', serif; font-size: 17px; font-weight: 600; color: var(--white); margin-bottom: 10px; }\n.problem-card-text { font-size: 14px; color: rgba(251,248,243,0.6); line-height: 1.65; }\n\n\/* ============================================================\n   HOW IT WORKS\n   ============================================================ *\/\n#how-it-works {\n  background: var(--cream);\n  padding: 88px 24px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n}\n.hiw-inner { max-width: 1100px; margin: 0 auto; }\n.hiw-steps { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; }\n.hiw-step { text-align: center; padding: 32px 20px; background: var(--white); border-radius: 16px; box-shadow: var(--shadow); transition: box-shadow var(--transition), transform var(--transition); }\n.hiw-step:hover { box-shadow: var(--shadow-lg); transform: translateY(-4px); }\n.hiw-num {\n  width: 52px; height: 52px; border-radius: 50%;\n  background: var(--navy); color: var(--gold);\n  font-family: 'Playfair Display', serif; font-size: 20px; font-weight: 700;\n  display: flex; align-items: center; justify-content: center;\n  margin: 0 auto 16px;\n}\n.hiw-icon { font-size: 28px; margin-bottom: 14px; }\n.hiw-step-title { font-family: 'Playfair Display', serif; font-size: 16px; font-weight: 600; color: var(--navy); margin-bottom: 8px; }\n.hiw-step-text { font-size: 13.5px; color: var(--text-muted); line-height: 1.6; }\n\n\/* ============================================================\n   FEATURES DEEP DIVE\n   ============================================================ *\/\n#features-section {\n  background: var(--white);\n  padding: 88px 24px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n}\n.features-inner { max-width: 1200px; margin: 0 auto; }\n.features-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; }\n.feature-card {\n  border: 1.5px solid var(--ash); border-radius: 16px; padding: 32px 24px;\n  transition: border-color var(--transition), box-shadow var(--transition), transform var(--transition);\n}\n.feature-card:hover { border-color: var(--gold); box-shadow: 0 8px 32px rgba(200,169,110,0.12); transform: translateY(-4px); }\n.feature-icon-wrap { width: 56px; height: 56px; background: var(--blush); border-radius: 14px; display: flex; align-items: center; justify-content: center; font-size: 26px; margin-bottom: 18px; transition: background var(--transition); }\n.feature-card:hover .feature-icon-wrap { background: var(--gold); }\n.feature-title { font-family: 'Playfair Display', serif; font-size: 17px; font-weight: 600; color: var(--navy); margin-bottom: 10px; }\n.feature-text { font-size: 14px; color: var(--text-muted); line-height: 1.65; }\n\n\/* ============================================================\n   PLAY SCIENCE STRIP  (new — replaces comparison table for toys)\n   ============================================================ *\/\n#play-science {\n  background: var(--blush);\n  padding: 88px 24px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n}\n.play-science-inner { max-width: 1100px; margin: 0 auto; }\n.play-science-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 56px; align-items: center; }\n.play-science-text {}\n.ps-eyebrow { font-size: 11.5px; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gold); margin-bottom: 16px; display: block; }\n.ps-title { font-family: 'Playfair Display', serif; font-size: clamp(24px, 3vw, 38px); font-weight: 700; color: var(--navy); margin-bottom: 20px; line-height: 1.25; }\n.ps-body { font-size: 15px; color: var(--slate); line-height: 1.75; margin-bottom: 32px; }\n.ps-stats { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }\n.ps-stat { background: var(--white); border-radius: 12px; padding: 20px; text-align: center; box-shadow: var(--shadow); }\n.ps-stat-num { font-family: 'Playfair Display', serif; font-size: 36px; font-weight: 700; color: var(--navy); line-height: 1; }\n.ps-stat-label { font-size: 12.5px; color: var(--text-muted); margin-top: 6px; line-height: 1.4; }\n.play-science-cards {}\n.ps-card { background: var(--white); border-radius: 14px; padding: 22px 24px; margin-bottom: 16px; display: flex; gap: 16px; align-items: flex-start; box-shadow: var(--shadow); transition: box-shadow var(--transition), transform var(--transition); }\n.ps-card:last-child { margin-bottom: 0; }\n.ps-card:hover { box-shadow: var(--shadow-lg); transform: translateX(4px); }\n.ps-card-icon { font-size: 28px; flex-shrink: 0; margin-top: 2px; }\n.ps-card-title { font-family: 'Playfair Display', serif; font-size: 15px; font-weight: 600; color: var(--navy); margin-bottom: 6px; }\n.ps-card-text { font-size: 13.5px; color: var(--text-muted); line-height: 1.6; }\n\n\/* ============================================================\n   REVIEWS\n   ============================================================ *\/\n#reviews-section {\n  background: var(--cream);\n  padding: 88px 24px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n}\n.reviews-inner { max-width: 1200px; margin: 0 auto; }\n.reviews-summary {\n  display: flex; align-items: center; gap: 48px;\n  background: var(--white); border-radius: 16px; padding: 32px 36px;\n  margin-bottom: 48px; box-shadow: var(--shadow);\n}\n.rev-big-score { text-align: center; flex-shrink: 0; }\n.rev-big-num { font-family: 'Playfair Display', serif; font-size: 56px; font-weight: 700; color: var(--navy); line-height: 1; }\n.rev-big-stars { color: var(--gold); font-size: 20px; letter-spacing: 2px; margin: 6px 0; display: block; }\n.rev-big-count { font-size: 13px; color: var(--text-muted); }\n.rev-bars { flex: 1; }\n.rev-bar-row { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }\n.rev-bar-label { font-size: 12.5px; color: var(--slate); min-width: 36px; }\n.rev-bar-track { flex: 1; height: 7px; background: var(--ash); border-radius: 99px; overflow: hidden; }\n.rev-bar-fill { height: 100%; background: var(--gold); border-radius: 99px; }\n.rev-bar-pct { font-size: 12px; color: var(--text-muted); min-width: 30px; text-align: right; }\n.rev-trust-badges { display: flex; flex-direction: column; gap: 10px; flex-shrink: 0; }\n.rev-trust-badge { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--slate); font-weight: 500; }\n.reviews-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }\n.review-card { background: var(--white); border-radius: 16px; padding: 24px; box-shadow: var(--shadow); }\n.review-top { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 12px; }\n.review-stars { color: var(--gold); font-size: 14px; letter-spacing: 1px; }\n.review-verified { font-size: 11px; color: #2ecc71; font-weight: 600; background: rgba(46,204,113,0.08); padding: 3px 8px; border-radius: 99px; }\n.review-title { font-size: 14.5px; font-weight: 600; color: var(--navy); margin-bottom: 8px; }\n.review-text { font-size: 13.5px; color: var(--slate); line-height: 1.65; margin-bottom: 14px; }\n.review-author { display: flex; align-items: center; gap: 10px; padding-top: 12px; border-top: 1px solid var(--ash); }\n.review-avatar { width: 36px; height: 36px; border-radius: 50%; background: var(--blush); display: flex; align-items: center; justify-content: center; font-size: 16px; flex-shrink: 0; }\n.review-name { font-size: 13px; font-weight: 600; color: var(--navy); }\n.review-meta { font-size: 11.5px; color: var(--text-muted); }\n\n\/* ============================================================\n   MATERIAL SAFETY\n   ============================================================ *\/\n#safety-section {\n  background: var(--navy);\n  padding: 88px 24px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n}\n.safety-inner { max-width: 1100px; margin: 0 auto; display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; }\n.safety-eyebrow { font-size: 11.5px; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gold); margin-bottom: 16px; display: block; }\n.safety-title { font-family: 'Playfair Display', serif; font-size: clamp(26px, 3vw, 38px); font-weight: 700; color: var(--white); margin-bottom: 20px; line-height: 1.25; }\n.safety-body { font-size: 15px; color: rgba(251,248,243,0.65); line-height: 1.75; margin-bottom: 32px; }\n.safety-badges { display: flex; flex-wrap: wrap; gap: 10px; }\n.safety-badge { display: flex; align-items: center; gap: 8px; background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12); border-radius: 99px; padding: 8px 16px; font-size: 12.5px; color: var(--cream); font-weight: 500; }\n.safety-badge span.icon { font-size: 15px; }\n.safety-specs-card { background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.1); border-radius: 16px; padding: 28px; }\n.safety-specs-title { font-family: 'Playfair Display', serif; font-size: 17px; font-weight: 600; color: var(--white); margin-bottom: 20px; }\n.spec-row { display: flex; justify-content: space-between; padding: 11px 0; border-bottom: 1px solid rgba(255,255,255,0.08); font-size: 13.5px; }\n.spec-row:last-child { border-bottom: none; }\n.spec-key { color: rgba(251,248,243,0.55); font-weight: 400; }\n.spec-val { color: var(--cream); font-weight: 600; }\n\n\/* ============================================================\n   FAQ\n   ============================================================ *\/\n#product-faq {\n  background: var(--white);\n  padding: 88px 24px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n}\n.faq-inner { max-width: 760px; margin: 0 auto; }\n.faq-item { border-bottom: 1px solid var(--ash); }\n.faq-q {\n  width: 100%; background: none; border: none; cursor: pointer;\n  display: flex; align-items: center; justify-content: space-between;\n  padding: 20px 0; text-align: left;\n  font-size: 15.5px; font-weight: 600; color: var(--navy);\n  font-family: 'Inter', sans-serif;\n  transition: color var(--transition);\n}\n.faq-q:hover { color: var(--gold); }\n.faq-icon { font-size: 20px; color: var(--gold); font-weight: 300; transition: transform 0.3s ease; flex-shrink: 0; margin-left: 16px; }\n.faq-item.open .faq-icon { transform: rotate(45deg); }\n.faq-a { max-height: 0; overflow: hidden; transition: max-height 0.4s ease; }\n.faq-item.open .faq-a { max-height: 400px; }\n.faq-a-inner { padding: 0 0 20px; font-size: 14.5px; color: var(--slate); line-height: 1.7; }\n\n\/* ============================================================\n   GUARANTEE\n   ============================================================ *\/\n#guarantee-section {\n  background: var(--blush);\n  padding: 72px 24px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n}\n.guarantee-inner { max-width: 900px; margin: 0 auto; text-align: center; }\n.guarantee-icon { font-size: 48px; margin-bottom: 20px; display: block; }\n.guarantee-title { font-family: 'Playfair Display', serif; font-size: clamp(24px, 3vw, 36px); font-weight: 700; color: var(--navy); margin-bottom: 16px; }\n.guarantee-text { font-size: 16px; color: var(--slate); line-height: 1.75; max-width: 580px; margin: 0 auto 32px; }\n.guarantee-pillars { display: flex; gap: 24px; justify-content: center; flex-wrap: wrap; }\n.guarantee-pillar { display: flex; align-items: center; gap: 8px; font-size: 14px; color: var(--navy); font-weight: 600; }\n.guarantee-pillar span.icon { font-size: 18px; }\n\n\/* ============================================================\n   CROSS-SELL\n   ============================================================ *\/\n#cross-sell {\n  background: var(--cream);\n  padding: 88px 24px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n}\n.cross-sell-inner { max-width: 1100px; margin: 0 auto; }\n.cross-sell-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }\n.cross-card { background: var(--white); border-radius: 16px; overflow: hidden; box-shadow: var(--shadow); transition: box-shadow var(--transition), transform var(--transition); }\n.cross-card:hover { box-shadow: var(--shadow-lg); transform: translateY(-4px); }\n.cross-card-img { width: 100%; aspect-ratio: 1; object-fit: cover; display: block; }\n.cross-card-body { padding: 18px 20px; }\n.cross-card-rating { color: var(--gold); font-size: 12px; margin-bottom: 6px; }\n.cross-card-title { font-family: 'Playfair Display', serif; font-size: 15px; font-weight: 600; color: var(--navy); margin-bottom: 10px; line-height: 1.3; }\n.cross-card-price-row { display: flex; align-items: center; gap: 8px; margin-bottom: 14px; }\n.cross-price-current { font-size: 16px; font-weight: 700; color: var(--navy); }\n.cross-price-original { font-size: 13px; color: var(--text-muted); text-decoration: line-through; }\n.btn-cross-add {\n  width: 100%; padding: 11px; background: var(--navy); color: var(--cream);\n  border: none; border-radius: var(--radius-sm); cursor: pointer;\n  font-size: 13px; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase;\n  transition: background var(--transition);\n}\n.btn-cross-add:hover { background: var(--navy-light); }\n.btn-cross-add.added { background: #2d7a4f; }\n\n\/* ============================================================\n   FINAL CTA\n   ============================================================ *\/\n#final-cta {\n  background: var(--navy);\n  padding: 96px 24px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n  text-align: center;\n}\n.final-cta-inner { max-width: 680px; margin: 0 auto; }\n.final-cta-eyebrow { font-size: 12px; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gold); margin-bottom: 20px; display: block; }\n.final-cta-title { font-family: 'Playfair Display', serif; font-size: clamp(28px, 4vw, 48px); font-weight: 700; color: var(--white); margin-bottom: 18px; line-height: 1.2; }\n.final-cta-sub { font-size: 16px; color: rgba(251,248,243,0.65); line-height: 1.7; margin-bottom: 40px; }\n.final-cta-actions { display: flex; flex-direction: column; align-items: center; gap: 12px; }\n.btn-final-atc {\n  display: inline-flex; align-items: center; gap: 10px;\n  background: var(--gold); color: var(--navy);\n  padding: 17px 40px; border: none; border-radius: 99px;\n  font-size: 15px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;\n  cursor: pointer; transition: background var(--transition), transform 0.2s ease, box-shadow 0.2s ease;\n  box-shadow: 0 4px 24px rgba(200,169,110,0.4);\n}\n.btn-final-atc:hover { background: var(--gold-light); transform: translateY(-2px); box-shadow: 0 8px 32px rgba(200,169,110,0.5); }\n.final-cta-note { font-size: 12.5px; color: rgba(251,248,243,0.45); }\n\n\/* ============================================================\n   NEWSLETTER\n   ============================================================ *\/\n#newsletter {\n  background: var(--cream);\n  padding: 72px 24px;\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n  text-align: center;\n}\n.newsletter-inner { max-width: 540px; margin: 0 auto; }\n#newsletter h2 { font-family: 'Playfair Display', serif; font-size: 28px; font-weight: 700; color: var(--navy); margin-bottom: 10px; }\n#newsletter p { font-size: 15px; color: var(--text-muted); margin-bottom: 24px; line-height: 1.65; }\n.newsletter-form { display: flex; gap: 8px; }\n.newsletter-input { flex: 1; padding: 13px 16px; border: 1.5px solid var(--ash); border-radius: var(--radius-sm); font-size: 14px; font-family: 'Inter', sans-serif; outline: none; background: var(--white); transition: border-color var(--transition); }\n.newsletter-input:focus { border-color: var(--gold); }\n.newsletter-submit { padding: 13px 22px; background: var(--navy); color: var(--cream); border: none; border-radius: var(--radius-sm); cursor: pointer; font-size: 14px; font-weight: 600; transition: background var(--transition); white-space: nowrap; }\n.newsletter-submit:hover { background: var(--navy-light); }\n.newsletter-privacy { font-size: 12px; color: var(--text-muted); margin-top: 12px; }\n\n\/* ============================================================\n   FOOTER\n   ============================================================ *\/\nfooter {\n  background: var(--navy);\n  width: 100vw !important; max-width: 100vw !important;\n  margin-left: calc(-50vw + 50%) !important; margin-right: calc(-50vw + 50%) !important;\n  padding: 64px 24px 32px;\n}\n.footer-inner { max-width: 1200px; margin: 0 auto; }\n.footer-top { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 40px; margin-bottom: 48px; }\n.footer-brand p { font-size: 14px; color: rgba(251,248,243,0.55); line-height: 1.7; margin-top: 14px; margin-bottom: 20px; }\n.footer-brand img { height: 40px; width: auto; }\n.footer-socials { display: flex; gap: 10px; }\n.social-link { width: 36px; height: 36px; background: rgba(255,255,255,0.07); border-radius: 50%; display: flex; align-items: center; justify-content: center; text-decoration: none; font-size: 15px; transition: background var(--transition); }\n.social-link:hover { background: var(--gold); }\n.footer-col h4 { font-size: 12px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--gold); margin-bottom: 18px; }\n.footer-col a { display: block; font-size: 13.5px; color: rgba(251,248,243,0.55); text-decoration: none; margin-bottom: 10px; transition: color var(--transition); }\n.footer-col a:hover { color: var(--cream); }\n.footer-bottom { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 14px; padding-top: 24px; border-top: 1px solid rgba(255,255,255,0.08); }\n.footer-copy { font-size: 12.5px; color: rgba(251,248,243,0.35); }\n.payment-icons { display: flex; gap: 8px; flex-wrap: wrap; }\n.payment-icon { background: rgba(255,255,255,0.06); border-radius: 5px; padding: 4px 8px; font-size: 11px; font-weight: 600; color: rgba(251,248,243,0.5); letter-spacing: 0.04em; }\n\n\/* ============================================================\n   TOAST\n   ============================================================ *\/\n.toast {\n  position: fixed; bottom: 80px; right: 20px; z-index: 1000;\n  display: flex; align-items: center; gap: 10px;\n  background: var(--navy); color: var(--cream);\n  padding: 12px 18px; border-radius: 10px;\n  font-size: 13.5px; font-weight: 500;\n  box-shadow: 0 6px 28px rgba(15,27,45,0.25);\n  transform: translateY(20px); opacity: 0; pointer-events: none;\n  transition: transform 0.35s ease, opacity 0.35s ease;\n  max-width: 300px;\n}\n.toast.show { transform: translateY(0); opacity: 1; pointer-events: auto; }\n.toast-icon { font-size: 17px; flex-shrink: 0; }\n\n\/* Modal *\/\n.modal-overlay { display: none; position: fixed; inset: 0; background: rgba(15,27,45,0.6); z-index: 500; align-items: center; justify-content: center; }\n.modal-overlay.open { display: flex; }\n.modal-box { background: var(--white); border-radius: 16px; padding: 36px; max-width: 400px; width: 90%; position: relative; }\n.modal-close { position: absolute; top: 16px; right: 16px; background: none; border: none; cursor: pointer; font-size: 20px; color: var(--slate); }\n.modal-box h2 { font-family: 'Playfair Display', serif; font-size: 22px; font-weight: 700; color: var(--navy); margin-bottom: 8px; }\n.modal-box p { font-size: 14px; color: var(--text-muted); margin-bottom: 24px; line-height: 1.6; }\n.modal-input { display: block; width: 100%; padding: 12px 14px; border: 1.5px solid var(--ash); border-radius: var(--radius-sm); font-size: 14px; font-family: 'Inter', sans-serif; margin-bottom: 12px; outline: none; transition: border-color var(--transition); }\n.modal-input:focus { border-color: var(--gold); }\n.btn-modal-submit { display: block; width: 100%; padding: 13px; background: var(--navy); color: var(--cream); border: none; border-radius: var(--radius-sm); font-size: 14px; font-weight: 600; cursor: pointer; transition: background var(--transition); margin-bottom: 8px; }\n.btn-modal-submit:hover { background: var(--navy-light); }\n.modal-divider { text-align: center; font-size: 12px; color: var(--text-muted); margin: 8px 0; }\n\n\/* ============================================================\n   RESPONSIVE\n   ============================================================ *\/\n@media (max-width: 1024px) {\n  .product-hero-inner { grid-template-columns: 1fr; gap: 36px; }\n  .product-gallery { position: static; }\n  .safety-inner { grid-template-columns: 1fr; gap: 40px; }\n  .problem-grid { grid-template-columns: 1fr 1fr; }\n  .hiw-steps { grid-template-columns: repeat(2, 1fr); }\n  .features-grid { grid-template-columns: 1fr 1fr; }\n  .reviews-grid { grid-template-columns: 1fr 1fr; }\n  .cross-sell-grid { grid-template-columns: 1fr 1fr; }\n  .footer-top { grid-template-columns: 1fr 1fr; }\n  .reviews-summary { flex-direction: column; gap: 28px; align-items: flex-start; }\n  .play-science-grid { grid-template-columns: 1fr; gap: 40px; }\n  .ps-stats { grid-template-columns: repeat(4, 1fr); }\n}\n@media (max-width: 768px) {\n  .nav-hamburger { display: flex; }\n  .header-nav { display: none; }\n  .section { padding: 64px 16px; }\n  #product-hero { padding: 24px 16px 48px; }\n  .problem-grid { grid-template-columns: 1fr; }\n  .hiw-steps { grid-template-columns: 1fr 1fr; gap: 14px; }\n  .features-grid { grid-template-columns: 1fr; }\n  .reviews-grid { grid-template-columns: 1fr; }\n  .cross-sell-grid { grid-template-columns: 1fr; }\n  .footer-top { grid-template-columns: 1fr 1fr; gap: 28px; }\n  .guarantee-pillars { flex-direction: column; align-items: flex-start; gap: 14px; }\n  .newsletter-form { flex-direction: column; }\n  #sticky-atc { padding: 10px 16px; gap: 10px; }\n  .product-trust-mini { flex-wrap: wrap; gap: 10px; }\n  .ps-stats { grid-template-columns: 1fr 1fr; }\n}\n@media (max-width: 480px) {\n  .hiw-steps { grid-template-columns: 1fr; }\n  .header-inner { padding: 0 16px; }\n  .gallery-main { aspect-ratio: 4\/3; }\n  .rev-trust-badges { display: none; }\n}\n@media (prefers-reduced-motion: reduce) {\n  *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }\n}\n\u003c\/style\u003e\n\n\n\n\u003cscript\u003e\n(function () {\n  var banner = document.getElementById('announcement-bar');\n  if (!banner) return;\n  var node = banner;\n  while (node \u0026\u0026 node !== document.body) {\n    var sib = node.previousElementSibling;\n    while (sib) { sib.style.display = 'none'; sib = sib.previousElementSibling; }\n    node = node.parentElement;\n  }\n})();\n\u003c\/script\u003e\n\n\u003c!-- ============================================================\n     ANNOUNCEMENT BAR\n     ============================================================ --\u003e\n\u003cdiv id=\"announcement-bar\" role=\"marquee\" aria-label=\"Store announcements\"\u003e\n  \u003cdiv class=\"ann-track\"\u003e\n    \u003cspan class=\"ann-item\"\u003e\u003cspan class=\"dot\"\u003e✦\u003c\/span\u003e Free shipping on orders over $100\u003c\/span\u003e\n    \u003cspan class=\"ann-item\"\u003e\u003cspan class=\"dot\"\u003e✦\u003c\/span\u003e 30-Day Hassle-Free Returns\u003c\/span\u003e\n    \u003cspan class=\"ann-item\"\u003e\u003cspan class=\"dot\"\u003e✦\u003c\/span\u003e 12,000+ Happy Pet Parents\u003c\/span\u003e\n    \u003cspan class=\"ann-item\"\u003e\u003cspan class=\"dot\"\u003e✦\u003c\/span\u003e 100% Pet-Safe Silicone\u003c\/span\u003e\n    \u003cspan class=\"ann-item\"\u003e\u003cspan class=\"dot\"\u003e✦\u003c\/span\u003e Free shipping on orders over $100\u003c\/span\u003e\n    \u003cspan class=\"ann-item\"\u003e\u003cspan class=\"dot\"\u003e✦\u003c\/span\u003e 30-Day Hassle-Free Returns\u003c\/span\u003e\n    \u003cspan class=\"ann-item\"\u003e\u003cspan class=\"dot\"\u003e✦\u003c\/span\u003e 12,000+ Happy Pet Parents\u003c\/span\u003e\n    \u003cspan class=\"ann-item\"\u003e\u003cspan class=\"dot\"\u003e✦\u003c\/span\u003e 100% Pet-Safe Silicone\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ============================================================\n     HEADER\n     ============================================================ --\u003e\n\u003cheader id=\"site-header\" role=\"banner\"\u003e\n  \u003cdiv class=\"header-inner\"\u003e\n    \u003ca href=\"\/\" class=\"header-logo\" aria-label=\"VIORA home\"\u003e\n      \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/WhatsApp_Image_2026-06-25_at_1.14.05_PM.jpg?v=1782382466\" alt=\"VIORA\" onerror=\"this.style.display='none'; this.nextElementSibling.style.display='block'\"\u003e\n      \u003cspan class=\"header-logo-text\" style=\"display:none;\"\u003eVIORA\u003c\/span\u003e\n    \u003c\/a\u003e\n    \u003cnav class=\"header-nav\" aria-label=\"Main navigation\"\u003e\n      \u003ca href=\"\/\"\u003eHome\u003c\/a\u003e\n      \u003ca href=\"\/collections\/all\" class=\"nav-current\"\u003eShop\u003c\/a\u003e\n      \u003ca href=\"\/pages\/about\"\u003eAbout\u003c\/a\u003e\n      \u003ca href=\"\/pages\/contact\"\u003eContact\u003c\/a\u003e\n    \u003c\/nav\u003e\n    \u003cdiv class=\"header-actions\"\u003e\n      \u003cbutton class=\"btn-icon\" onclick=\"openModal()\" aria-label=\"Sign in\"\u003e\n        \u003csvg width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" viewbox=\"0 0 24 24\"\u003e\u003cpath d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"\u003e\u003c\/path\u003e\u003ccircle cx=\"12\" cy=\"7\" r=\"4\"\u003e\u003c\/circle\u003e\u003c\/svg\u003e\n      \u003c\/button\u003e\n      \u003cdiv class=\"cart-btn-wrap\"\u003e\n        \u003cbutton class=\"btn-icon\" onclick=\"openCart()\" aria-label=\"Open cart\"\u003e\n          \u003csvg width=\"21\" height=\"21\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" viewbox=\"0 0 24 24\"\u003e\u003cpath d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"\u003e\u003c\/path\u003e\u003cline x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"\u003e\u003c\/line\u003e\u003cpath d=\"M16 10a4 4 0 0 1-8 0\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n        \u003c\/button\u003e\n        \u003cspan class=\"cart-count\" id=\"cartCount\" aria-live=\"polite\"\u003e0\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cbutton class=\"nav-hamburger btn-icon\" onclick=\"openMobileNav()\" aria-label=\"Open menu\" aria-expanded=\"false\"\u003e\n        \u003csvg width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewbox=\"0 0 24 24\"\u003e\u003cline x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"\u003e\u003c\/line\u003e\u003cline x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"\u003e\u003c\/line\u003e\u003cline x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"\u003e\u003c\/line\u003e\u003c\/svg\u003e\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/header\u003e\n\n\u003c!-- Mobile nav --\u003e\n\u003cdiv class=\"mobile-nav\" id=\"mobileNav\" aria-hidden=\"true\" role=\"dialog\" aria-label=\"Mobile navigation\"\u003e\n  \u003cdiv class=\"mobile-nav-backdrop\" onclick=\"closeMobileNav()\"\u003e\u003c\/div\u003e\n  \u003cdiv class=\"mobile-nav-drawer\"\u003e\n    \u003cbutton class=\"mobile-nav-close\" onclick=\"closeMobileNav()\" aria-label=\"Close menu\"\u003e✕\u003c\/button\u003e\n    \u003ca href=\"\/\"\u003eHome\u003c\/a\u003e\n    \u003ca href=\"\/collections\/all\"\u003eShop All\u003c\/a\u003e\n    \u003ca href=\"\/pages\/about\"\u003eAbout\u003c\/a\u003e\n    \u003ca href=\"\/pages\/contact\"\u003eContact\u003c\/a\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ============================================================\n     CART DRAWER\n     ============================================================ --\u003e\n\u003cdiv class=\"cart-drawer-overlay\" id=\"cartOverlay\" onclick=\"closeCart()\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"cart-drawer\" id=\"cartDrawer\" role=\"dialog\" aria-label=\"Shopping cart\" aria-modal=\"true\"\u003e\n  \u003cdiv class=\"cart-drawer-head\"\u003e\n    \u003ch3\u003eYour Cart\u003c\/h3\u003e\n    \u003cbutton class=\"cart-close-btn\" onclick=\"closeCart()\" aria-label=\"Close cart\"\u003e✕\u003c\/button\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"free-shipping-bar\"\u003e\n    \u003cp id=\"shippingMsg\"\u003eAdd \u003cstrong\u003e$100.00\u003c\/strong\u003e more for free shipping 🚚\u003c\/p\u003e\n    \u003cdiv class=\"progress-track\"\u003e\u003cdiv class=\"progress-fill\" id=\"shippingProgress\" style=\"width:0%\"\u003e\u003c\/div\u003e\u003c\/div\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"cart-items-wrap\" id=\"cartItemsWrap\"\u003e\n    \u003cdiv class=\"cart-empty-msg\" id=\"cartEmpty\"\u003e\n      \u003cspan style=\"font-size:32px;\"\u003e🛒\u003c\/span\u003e\n      \u003cspan\u003eYour cart is empty\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"cart-footer\" id=\"cartFooter\" style=\"display:none;\"\u003e\n    \u003cdiv class=\"cart-subtotal\"\u003e\n      \u003cspan\u003eSubtotal\u003c\/span\u003e\n      \u003cstrong id=\"cartSubtotal\"\u003e$0.00\u003c\/strong\u003e\n    \u003c\/div\u003e\n    \u003cbutton class=\"btn-checkout\" id=\"checkoutBtn\"\u003eProceed to Checkout\u003c\/button\u003e\n    \u003cp class=\"cart-policy-note\"\u003eShipping \u0026amp; taxes calculated at checkout\u003c\/p\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ============================================================\n     PRODUCT HERO\n     ============================================================ --\u003e\n\u003csection id=\"product-hero\" aria-label=\"Product details\"\u003e\n  \u003cdiv class=\"product-hero-inner\"\u003e\n\n    \u003c!-- Gallery --\u003e\n    \u003cdiv class=\"product-gallery\"\u003e\n      \u003cdiv class=\"gallery-main\" id=\"galleryMain\"\u003e\n        \u003cdiv class=\"gallery-badge-row\"\u003e\n          \u003cspan class=\"gallery-badge badge-sale\"\u003e35% Off\u003c\/span\u003e\n          \u003cspan class=\"gallery-badge badge-hot\"\u003eCat Fave\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/0bc5b09e-beff-4645-b25b-e1297c47b6fb.jpg?v=1782303967\" alt=\"Gravity Rolling Cat Teasing Ball - main view\" class=\"active\" id=\"mainImg0\"\u003e\n        \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/2402061225230329200.jpg?v=1782303967\" alt=\"Gravity Rolling Cat Teasing Ball - in use\" id=\"mainImg1\"\u003e\n        \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/2402061225230329400.jpg?v=1782303967\" alt=\"Gravity Rolling Cat Teasing Ball - cat playing\" id=\"mainImg2\"\u003e\n        \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/2402061225230328600.jpg?v=1782303967\" alt=\"Gravity Rolling Cat Teasing Ball - detail view\" id=\"mainImg3\"\u003e\n        \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/f58e9681-4575-46f0-aaec-e8a6e63e0e11.jpg?v=1782303967\" alt=\"Gravity Rolling Cat Teasing Ball - size reference\" id=\"mainImg4\"\u003e\n        \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/314130ce-4d96-40ff-aa11-8735b4d17585.jpg?v=1782303967\" alt=\"Gravity Rolling Cat Teasing Ball - color options\" id=\"mainImg5\"\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"gallery-thumbs\" role=\"tablist\" aria-label=\"Product images\"\u003e\n        \u003cdiv class=\"gallery-thumb active\" onclick=\"selectThumb(0)\" role=\"tab\" aria-selected=\"true\" aria-label=\"Image 1\" tabindex=\"0\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/0bc5b09e-beff-4645-b25b-e1297c47b6fb.jpg?v=1782303967\" alt=\"Thumb 1\"\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"gallery-thumb\" onclick=\"selectThumb(1)\" role=\"tab\" aria-selected=\"false\" aria-label=\"Image 2\" tabindex=\"0\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/2402061225230329200.jpg?v=1782303967\" alt=\"Thumb 2\"\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"gallery-thumb\" onclick=\"selectThumb(2)\" role=\"tab\" aria-selected=\"false\" aria-label=\"Image 3\" tabindex=\"0\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/2402061225230329400.jpg?v=1782303967\" alt=\"Thumb 3\"\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"gallery-thumb\" onclick=\"selectThumb(3)\" role=\"tab\" aria-selected=\"false\" aria-label=\"Image 4\" tabindex=\"0\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/2402061225230328600.jpg?v=1782303967\" alt=\"Thumb 4\"\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"gallery-thumb\" onclick=\"selectThumb(4)\" role=\"tab\" aria-selected=\"false\" aria-label=\"Image 5\" tabindex=\"0\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/f58e9681-4575-46f0-aaec-e8a6e63e0e11.jpg?v=1782303967\" alt=\"Thumb 5\"\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"gallery-thumb\" onclick=\"selectThumb(5)\" role=\"tab\" aria-selected=\"false\" aria-label=\"Image 6\" tabindex=\"0\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/314130ce-4d96-40ff-aa11-8735b4d17585.jpg?v=1782303967\" alt=\"Thumb 6\"\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Info panel --\u003e\n    \u003cdiv class=\"product-info-panel\"\u003e\n      \u003cdiv class=\"product-rating-row\" aria-label=\"Product rating\"\u003e\n        \u003cspan class=\"product-stars\" aria-hidden=\"true\"\u003e★★★★½\u003c\/span\u003e\n        \u003cspan class=\"product-rating-count\"\u003e4.5 · \u003ca href=\"#reviews-section\"\u003e89 reviews\u003c\/a\u003e\u003c\/span\u003e\n        \u003cspan style=\"font-size:12px; color:var(--text-muted);\"\u003e· 12,000+ sold\u003c\/span\u003e\n      \u003c\/div\u003e\n\n      \u003ch1 class=\"product-title\"\u003eGravity Rolling Cat Teasing Ball\u003c\/h1\u003e\n\n      \u003cdiv class=\"product-price-row\"\u003e\n        \u003cspan class=\"pp-current\" data-usd=\"12.99\" id=\"priceDisplay\"\u003e$12.99\u003c\/span\u003e\n        \u003cspan class=\"pp-original\" data-usd=\"19.89\" id=\"priceOrigDisplay\"\u003e$19.89\u003c\/span\u003e\n        \u003cspan class=\"pp-save\"\u003eSave 35%\u003c\/span\u003e\n      \u003c\/div\u003e\n\n      \u003cp class=\"product-short-desc\"\u003eA gravity-defying silicone ball that rolls, wobbles, and spins on its own — keeping your cat engaged, hunting, and happy for hours without you lifting a finger.\u003c\/p\u003e\n\n      \u003cdiv class=\"product-trust-mini\" aria-label=\"Trust signals\"\u003e\n        \u003cdiv class=\"ptm-item\"\u003e\n\u003cspan class=\"icon\"\u003e🔒\u003c\/span\u003e Secure Checkout\u003c\/div\u003e\n        \u003cdiv class=\"ptm-item\"\u003e\n\u003cspan class=\"icon\"\u003e🚚\u003c\/span\u003e Free over $100\u003c\/div\u003e\n        \u003cdiv class=\"ptm-item\"\u003e\n\u003cspan class=\"icon\"\u003e↩️\u003c\/span\u003e 30-Day Returns\u003c\/div\u003e\n        \u003cdiv class=\"ptm-item\"\u003e\n\u003cspan class=\"icon\"\u003e⭐\u003c\/span\u003e 98% Buy Again\u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Color selection --\u003e\n      \u003cdiv class=\"variant-label-row\"\u003e\n        \u003cspan class=\"variant-label\"\u003eColor\u003c\/span\u003e\n        \u003cspan class=\"variant-selected-name\" id=\"selectedColorName\"\u003eBlue\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"color-swatches\" role=\"radiogroup\" aria-label=\"Select color\"\u003e\n        \u003cdiv class=\"color-swatch swatch-blue active\" onclick=\"selectColor(this, 'Blue', 0)\" role=\"radio\" aria-checked=\"true\" aria-label=\"Blue\" tabindex=\"0\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"color-swatch swatch-pink\" onclick=\"selectColor(this, 'Pink', 1)\" role=\"radio\" aria-checked=\"false\" aria-label=\"Pink\" tabindex=\"0\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Stock urgency --\u003e\n      \u003cdiv class=\"stock-urgency\" role=\"status\" aria-live=\"polite\"\u003e\n        \u003cdiv class=\"stock-dot\"\u003e\u003c\/div\u003e\n        \u003cspan\u003eIn stock — \u003cstrong\u003eonly 14 left.\u003c\/strong\u003e 41 people viewing this right now.\u003c\/span\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Quantity --\u003e\n      \u003cdiv class=\"qty-section\"\u003e\n        \u003clabel for=\"qtyInput\"\u003eQuantity\u003c\/label\u003e\n        \u003cdiv class=\"qty-control\" role=\"group\" aria-label=\"Quantity\"\u003e\n          \u003cbutton onclick=\"changeQty(-1)\" aria-label=\"Decrease quantity\"\u003e−\u003c\/button\u003e\n          \u003cinput type=\"number\" id=\"qtyInput\" value=\"1\" min=\"1\" max=\"10\" aria-label=\"Quantity\"\u003e\n          \u003cbutton onclick=\"changeQty(1)\" aria-label=\"Increase quantity\"\u003e+\u003c\/button\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- CTA buttons --\u003e\n      \u003cbutton class=\"btn-atc\" id=\"atcBtn\" onclick=\"addToCartMain()\" aria-label=\"Add to cart\"\u003e\n        \u003csvg width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewbox=\"0 0 24 24\"\u003e\u003cpath d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"\u003e\u003c\/path\u003e\u003cline x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"\u003e\u003c\/line\u003e\u003cpath d=\"M16 10a4 4 0 0 1-8 0\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n        Add to Cart — \u003cspan id=\"atcPriceDisplay\" data-usd=\"12.99\"\u003e$12.99\u003c\/span\u003e\n      \u003c\/button\u003e\n      \u003cbutton class=\"btn-buy-now\" onclick=\"buyNow()\" aria-label=\"Buy now\"\u003e\n        Buy Now\n        \u003csvg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" viewbox=\"0 0 24 24\"\u003e\u003cpath d=\"M5 12h14M12 5l7 7-7 7\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n      \u003c\/button\u003e\n\n      \u003c!-- Guarantees --\u003e\n      \u003cdiv class=\"product-guarantee-strip\" role=\"list\" aria-label=\"Guarantees\"\u003e\n        \u003cdiv class=\"pgs-item\" role=\"listitem\"\u003e\n\u003cspan class=\"pgs-icon\"\u003e🛡️\u003c\/span\u003e 30-Day Free Returns\u003c\/div\u003e\n        \u003cdiv class=\"pgs-item\" role=\"listitem\"\u003e\n\u003cspan class=\"pgs-icon\"\u003e🐱\u003c\/span\u003e Cat-Safe Silicone\u003c\/div\u003e\n        \u003cdiv class=\"pgs-item\" role=\"listitem\"\u003e\n\u003cspan class=\"pgs-icon\"\u003e✈️\u003c\/span\u003e Ships Worldwide\u003c\/div\u003e\n        \u003cdiv class=\"pgs-item\" role=\"listitem\"\u003e\n\u003cspan class=\"pgs-icon\"\u003e🔒\u003c\/span\u003e Secure Payment\u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Quick specs --\u003e\n      \u003cdiv class=\"product-specs-mini\" aria-label=\"Product specifications\"\u003e\n        \u003cdiv class=\"psm-row\"\u003e\n\u003cspan class=\"psm-label\"\u003eMaterial\u003c\/span\u003e\u003cspan class=\"psm-value\"\u003eFood-Grade Silicone\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"psm-row\"\u003e\n\u003cspan class=\"psm-label\"\u003eColors\u003c\/span\u003e\u003cspan class=\"psm-value\"\u003eBlue · Pink\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"psm-row\"\u003e\n\u003cspan class=\"psm-label\"\u003eSuitable For\u003c\/span\u003e\u003cspan class=\"psm-value\"\u003eAll Cats \u0026amp; Small Pets\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"psm-row\"\u003e\n\u003cspan class=\"psm-label\"\u003eCategory\u003c\/span\u003e\u003cspan class=\"psm-value\"\u003eInteractive Toy\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"psm-row\"\u003e\n\u003cspan class=\"psm-label\"\u003eMechanism\u003c\/span\u003e\u003cspan class=\"psm-value\"\u003eSelf-Righting Gravity Ball\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- ============================================================\n     SOCIAL PROOF TICKER\n     ============================================================ --\u003e\n\u003cdiv id=\"social-proof-ticker\" aria-label=\"Social proof highlights\" role=\"marquee\"\u003e\n  \u003cdiv class=\"ticker-track\"\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e🛒\u003c\/span\u003e 12,000+ sold worldwide\u003c\/span\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e⭐\u003c\/span\u003e 4.5 stars · 89 verified reviews\u003c\/span\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e🔁\u003c\/span\u003e 98% of buyers purchase again\u003c\/span\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e🐈\u003c\/span\u003e Works for bored, anxious \u0026amp; senior cats\u003c\/span\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e🌿\u003c\/span\u003e 100% BPA-free food-grade silicone\u003c\/span\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e📦\u003c\/span\u003e Free shipping on orders $100+\u003c\/span\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e↩️\u003c\/span\u003e 30-day hassle-free returns\u003c\/span\u003e\n    \u003c!-- duplicate for seamless loop --\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e🛒\u003c\/span\u003e 12,000+ sold worldwide\u003c\/span\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e⭐\u003c\/span\u003e 4.5 stars · 89 verified reviews\u003c\/span\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e🔁\u003c\/span\u003e 98% of buyers purchase again\u003c\/span\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e🐈\u003c\/span\u003e Works for bored, anxious \u0026amp; senior cats\u003c\/span\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e🌿\u003c\/span\u003e 100% BPA-free food-grade silicone\u003c\/span\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e📦\u003c\/span\u003e Free shipping on orders $100+\u003c\/span\u003e\n    \u003cspan class=\"ticker-item\"\u003e\u003cspan class=\"t-icon\"\u003e↩️\u003c\/span\u003e 30-day hassle-free returns\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ============================================================\n     PROBLEM SECTION\n     ============================================================ --\u003e\n\u003csection id=\"problem-section\" aria-label=\"The problem this solves\"\u003e\n  \u003cdiv class=\"problem-inner\"\u003e\n    \u003cspan class=\"problem-eyebrow reveal\"\u003eSound Like Your Cat?\u003c\/span\u003e\n    \u003ch2 class=\"problem-title reveal\"\u003eBored Cat. Shredded Sofa.\u003cbr\u003eThe Cycle Every Cat Owner Knows Too Well.\u003c\/h2\u003e\n    \u003cp class=\"problem-sub reveal\"\u003eIndoor cats are hunters by nature. When nothing hunts back, they find their own targets.\u003c\/p\u003e\n    \u003cdiv class=\"problem-grid\"\u003e\n      \u003cdiv class=\"problem-card reveal\"\u003e\n        \u003cspan class=\"problem-card-icon\"\u003e😴\u003c\/span\u003e\n        \u003ch3 class=\"problem-card-title\"\u003eToy Lasts 90 Seconds\u003c\/h3\u003e\n        \u003cp class=\"problem-card-text\"\u003eYou buy a toy, they go crazy for it for one minute, then it becomes furniture. Feathers on sticks work great — as long as you're the one holding them, every single time.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"problem-card reveal reveal-delay-1\"\u003e\n        \u003cspan class=\"problem-card-icon\"\u003e🪑\u003c\/span\u003e\n        \u003ch3 class=\"problem-card-title\"\u003eYour Home Pays the Price\u003c\/h3\u003e\n        \u003cp class=\"problem-card-text\"\u003eAn understimulated cat doesn't just lie there politely. They scratch, knock, yowl, and find exactly the thing in your home you don't want destroyed. Boredom is expensive.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"problem-card reveal reveal-delay-2\"\u003e\n        \u003cspan class=\"problem-card-icon\"\u003e😥\u003c\/span\u003e\n        \u003ch3 class=\"problem-card-title\"\u003eGuilt Every Time You Leave\u003c\/h3\u003e\n        \u003cp class=\"problem-card-text\"\u003eYou're at work, they're home alone with nothing to do. Indoor cats need 30–60 minutes of active play daily to stay mentally and physically healthy — most get far less.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- ============================================================\n     HOW IT WORKS\n     ============================================================ --\u003e\n\u003csection id=\"how-it-works\" aria-label=\"How the cat ball works\"\u003e\n  \u003cdiv class=\"hiw-inner\"\u003e\n    \u003cdiv class=\"section-head reveal\"\u003e\n      \u003cp class=\"section-eyebrow\"\u003eSet It. Forget It.\u003c\/p\u003e\n      \u003ch2 class=\"section-title\"\u003eYour Cat Plays. You Do Nothing.\u003c\/h2\u003e\n      \u003cp class=\"section-sub\"\u003eNo strings. No effort from you. The motorized gravity mechanism does the work — your cat does the rest.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"hiw-steps\"\u003e\n      \u003cdiv class=\"hiw-step reveal\"\u003e\n        \u003cdiv class=\"hiw-num\"\u003e1\u003c\/div\u003e\n        \u003cdiv class=\"hiw-icon\"\u003e📍\u003c\/div\u003e\n        \u003ch3 class=\"hiw-step-title\"\u003ePlace It Anywhere\u003c\/h3\u003e\n        \u003cp class=\"hiw-step-text\"\u003eSet the ball on any flat surface — floor, tile, hardwood, carpet. The weighted base keeps it perfectly still until your cat notices it.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"hiw-step reveal reveal-delay-1\"\u003e\n        \u003cdiv class=\"hiw-num\"\u003e2\u003c\/div\u003e\n        \u003cdiv class=\"hiw-icon\"\u003e👀\u003c\/div\u003e\n        \u003ch3 class=\"hiw-step-title\"\u003eCat Investigates\u003c\/h3\u003e\n        \u003cp class=\"hiw-step-text\"\u003eThe silicone texture and shape trigger your cat's natural curiosity. One sniff, one paw swat — and the hunt is on.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"hiw-step reveal reveal-delay-2\"\u003e\n        \u003cdiv class=\"hiw-num\"\u003e3\u003c\/div\u003e\n        \u003cdiv class=\"hiw-icon\"\u003e🌀\u003c\/div\u003e\n        \u003ch3 class=\"hiw-step-title\"\u003eBall Fights Back\u003c\/h3\u003e\n        \u003cp class=\"hiw-step-text\"\u003eEvery bat sends it rolling and wobbling — and the gravity base rights it again on its own. It never stays down. Your cat can't \"win.\" The game never ends.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"hiw-step reveal reveal-delay-3\"\u003e\n        \u003cdiv class=\"hiw-num\"\u003e4\u003c\/div\u003e\n        \u003cdiv class=\"hiw-icon\"\u003e😸\u003c\/div\u003e\n        \u003ch3 class=\"hiw-step-title\"\u003eHours of Real Play\u003c\/h3\u003e\n        \u003cp class=\"hiw-step-text\"\u003eUnlike a laser or feather wand, this doesn't need you. Leave it out and your cat entertains themselves. A tired, happy cat by the time you get home.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- ============================================================\n     FEATURES\n     ============================================================ --\u003e\n\u003csection id=\"features-section\" aria-label=\"Product features\"\u003e\n  \u003cdiv class=\"features-inner\"\u003e\n    \u003cdiv class=\"section-head reveal\"\u003e\n      \u003cp class=\"section-eyebrow\"\u003eWhy Cats Can't Ignore It\u003c\/p\u003e\n      \u003ch2 class=\"section-title\"\u003eDesigned to Trigger the Hunt Instinct\u003c\/h2\u003e\n      \u003cp class=\"section-sub\"\u003eEvery detail — texture, movement, weight — is tuned to what cats are wired to chase. This isn't a toy. It's prey.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"features-grid\"\u003e\n      \u003cdiv class=\"feature-card reveal\"\u003e\n        \u003cdiv class=\"feature-icon-wrap\"\u003e⚖️\u003c\/div\u003e\n        \u003ch3 class=\"feature-title\"\u003eSelf-Righting Gravity Base\u003c\/h3\u003e\n        \u003cp class=\"feature-text\"\u003eA weighted bottom keeps the ball perpetually upright. Bat it left, it rolls back. Knock it over, it recovers. The unpredictable, never-ending movement is exactly what triggers a cat's prey-tracking instinct — and keeps them hooked.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"feature-card reveal reveal-delay-1\"\u003e\n        \u003cdiv class=\"feature-icon-wrap\"\u003e🌿\u003c\/div\u003e\n        \u003ch3 class=\"feature-title\"\u003eFood-Grade Silicone All Over\u003c\/h3\u003e\n        \u003cp class=\"feature-text\"\u003e100% soft, flexible silicone — no hard plastic edges, no sharp points. Completely safe if chewed, licked, or batted. The same standard used in baby teethers, so you'll never worry about what your cat puts in their mouth.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"feature-card reveal reveal-delay-2\"\u003e\n        \u003cdiv class=\"feature-icon-wrap\"\u003e🎯\u003c\/div\u003e\n        \u003ch3 class=\"feature-title\"\u003eTexture That Cats Crave\u003c\/h3\u003e\n        \u003cp class=\"feature-text\"\u003eThe ridged silicone surface catches claws just enough to feel satisfying — mimicking the resistance of real prey. Smooth toys slide away too easily. This one fights back just enough to keep them coming back for more.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"feature-card reveal\"\u003e\n        \u003cdiv class=\"feature-icon-wrap\"\u003e🔇\u003c\/div\u003e\n        \u003ch3 class=\"feature-title\"\u003eSilent. Night-Use Approved.\u003c\/h3\u003e\n        \u003cp class=\"feature-text\"\u003eCats play at 3am. Silicone on hardwood is nearly silent — no clacking plastic, no spinning rattles. Leave it out at night without losing sleep. You rest. Your cat hunts. Everyone wins.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"feature-card reveal reveal-delay-1\"\u003e\n        \u003cdiv class=\"feature-icon-wrap\"\u003e🧹\u003c\/div\u003e\n        \u003ch3 class=\"feature-title\"\u003eWipe Clean in Seconds\u003c\/h3\u003e\n        \u003cp class=\"feature-text\"\u003eNon-porous silicone means saliva, fur, and dust don't stick. Rinse under the tap or wipe with a damp cloth — done in 10 seconds. Dishwasher safe for a deeper clean. No fabric to trap bacteria, no feathers to shed.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"feature-card reveal reveal-delay-2\"\u003e\n        \u003cdiv class=\"feature-icon-wrap\"\u003e🔋\u003c\/div\u003e\n        \u003ch3 class=\"feature-title\"\u003eUSB Rechargeable\u003c\/h3\u003e\n        \u003cp class=\"feature-text\"\u003eNo disposable batteries to buy or replace. A quick USB charge powers hours of play, so it's always ready to go — just plug it in, top it up, and let your cat get back to hunting.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- ============================================================\n     PLAY SCIENCE  (replaces comparison — more relevant for toys)\n     ============================================================ --\u003e\n\u003csection id=\"play-science\" aria-label=\"The science of cat play\"\u003e\n  \u003cdiv class=\"play-science-inner\"\u003e\n    \u003cdiv class=\"section-head reveal\"\u003e\n      \u003cp class=\"section-eyebrow\"\u003eWhy This Works\u003c\/p\u003e\n      \u003ch2 class=\"section-title\"\u003eThe Science Behind Why Cats Can't Resist\u003c\/h2\u003e\n      \u003cp class=\"section-sub\"\u003eThis isn't random. Every design decision is rooted in how cats actually hunt — and what keeps them mentally healthy.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"play-science-grid reveal\"\u003e\n      \u003cdiv class=\"play-science-text\"\u003e\n        \u003cspan class=\"ps-eyebrow\"\u003eBy the Numbers\u003c\/span\u003e\n        \u003ch3 class=\"ps-title\"\u003eA Bored Cat Isn't Just Sad — It's a Health Risk\u003c\/h3\u003e\n        \u003cp class=\"ps-body\"\u003eVets increasingly link understimulation in indoor cats to anxiety, aggression, over-grooming, and obesity. Regular active play is one of the most effective interventions — and independent toys that work without a human are the most consistent way to hit that daily target.\u003c\/p\u003e\n        \u003cdiv class=\"ps-stats\"\u003e\n          \u003cdiv class=\"ps-stat\"\u003e\n            \u003cdiv class=\"ps-stat-num\"\u003e30–60\u003c\/div\u003e\n            \u003cdiv class=\"ps-stat-label\"\u003eMinutes of active play vets recommend daily for indoor cats\u003c\/div\u003e\n          \u003c\/div\u003e\n          \u003cdiv class=\"ps-stat\"\u003e\n            \u003cdiv class=\"ps-stat-num\"\u003e63%\u003c\/div\u003e\n            \u003cdiv class=\"ps-stat-label\"\u003eOf indoor cats are considered overweight or obese\u003c\/div\u003e\n          \u003c\/div\u003e\n          \u003cdiv class=\"ps-stat\"\u003e\n            \u003cdiv class=\"ps-stat-num\"\u003e4×\u003c\/div\u003e\n            \u003cdiv class=\"ps-stat-label\"\u003eMore likely to develop anxiety without adequate stimulation\u003c\/div\u003e\n          \u003c\/div\u003e\n          \u003cdiv class=\"ps-stat\"\u003e\n            \u003cdiv class=\"ps-stat-num\"\u003e12k+\u003c\/div\u003e\n            \u003cdiv class=\"ps-stat-label\"\u003eHappy cats already playing with this ball\u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"play-science-cards\"\u003e\n        \u003cdiv class=\"ps-card\"\u003e\n          \u003cspan class=\"ps-card-icon\"\u003e🧠\u003c\/span\u003e\n          \u003cdiv\u003e\n            \u003ch4 class=\"ps-card-title\"\u003eTriggers the Prey-Tracking Loop\u003c\/h4\u003e\n            \u003cp class=\"ps-card-text\"\u003eCats are hard-wired to hunt through a stalk-pounce-catch sequence. The rolling, self-righting motion keeps them locked in the \"stalk\" phase indefinitely — the most engaging part of the sequence.\u003c\/p\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"ps-card\"\u003e\n          \u003cspan class=\"ps-card-icon\"\u003e⚡\u003c\/span\u003e\n          \u003cdiv\u003e\n            \u003ch4 class=\"ps-card-title\"\u003eUnpredictable = Irresistible\u003c\/h4\u003e\n            \u003cp class=\"ps-card-text\"\u003eCats lose interest when movement is too predictable. The wobble pattern of a weighted gravity ball is inherently random — making each play session feel new. It's the same principle behind why cats ignore static toys but chase bugs.\u003c\/p\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"ps-card\"\u003e\n          \u003cspan class=\"ps-card-icon\"\u003e💪\u003c\/span\u003e\n          \u003cdiv\u003e\n            \u003ch4 class=\"ps-card-title\"\u003eFull-Body Workout, No Effort from You\u003c\/h4\u003e\n            \u003cp class=\"ps-card-text\"\u003eBatting, pouncing, and chasing engages your cat's shoulders, core, and hindquarters. 20 minutes of this burns more calories than most structured play sessions — and your cat chose to do it themselves.\u003c\/p\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- ============================================================\n     REVIEWS\n     ============================================================ --\u003e\n\u003csection id=\"reviews-section\" aria-label=\"Customer reviews\"\u003e\n  \u003cdiv class=\"reviews-inner\"\u003e\n    \u003cdiv class=\"section-head reveal\"\u003e\n      \u003cp class=\"section-eyebrow\"\u003e89 Verified Reviews\u003c\/p\u003e\n      \u003ch2 class=\"section-title\"\u003eWhat Cat Parents Are Saying\u003c\/h2\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"reviews-summary reveal\"\u003e\n      \u003cdiv class=\"rev-big-score\"\u003e\n        \u003cdiv class=\"rev-big-num\"\u003e4.5\u003c\/div\u003e\n        \u003cspan class=\"rev-big-stars\"\u003e★★★★½\u003c\/span\u003e\n        \u003cdiv class=\"rev-big-count\"\u003eBased on 89 reviews\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"rev-bars\"\u003e\n        \u003cdiv class=\"rev-bar-row\"\u003e\n\u003cspan class=\"rev-bar-label\"\u003e5 ★\u003c\/span\u003e\u003cdiv class=\"rev-bar-track\"\u003e\u003cdiv class=\"rev-bar-fill\" style=\"width:71%\"\u003e\u003c\/div\u003e\u003c\/div\u003e\n\u003cspan class=\"rev-bar-pct\"\u003e71%\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"rev-bar-row\"\u003e\n\u003cspan class=\"rev-bar-label\"\u003e4 ★\u003c\/span\u003e\u003cdiv class=\"rev-bar-track\"\u003e\u003cdiv class=\"rev-bar-fill\" style=\"width:16%\"\u003e\u003c\/div\u003e\u003c\/div\u003e\n\u003cspan class=\"rev-bar-pct\"\u003e16%\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"rev-bar-row\"\u003e\n\u003cspan class=\"rev-bar-label\"\u003e3 ★\u003c\/span\u003e\u003cdiv class=\"rev-bar-track\"\u003e\u003cdiv class=\"rev-bar-fill\" style=\"width:7%\"\u003e\u003c\/div\u003e\u003c\/div\u003e\n\u003cspan class=\"rev-bar-pct\"\u003e7%\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"rev-bar-row\"\u003e\n\u003cspan class=\"rev-bar-label\"\u003e2 ★\u003c\/span\u003e\u003cdiv class=\"rev-bar-track\"\u003e\u003cdiv class=\"rev-bar-fill\" style=\"width:4%\"\u003e\u003c\/div\u003e\u003c\/div\u003e\n\u003cspan class=\"rev-bar-pct\"\u003e4%\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"rev-bar-row\"\u003e\n\u003cspan class=\"rev-bar-label\"\u003e1 ★\u003c\/span\u003e\u003cdiv class=\"rev-bar-track\"\u003e\u003cdiv class=\"rev-bar-fill\" style=\"width:2%\"\u003e\u003c\/div\u003e\u003c\/div\u003e\n\u003cspan class=\"rev-bar-pct\"\u003e2%\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"rev-trust-badges\"\u003e\n        \u003cdiv class=\"rev-trust-badge\"\u003e✅ 98% would buy again\u003c\/div\u003e\n        \u003cdiv class=\"rev-trust-badge\"\u003e🐱 12,000+ cats entertained\u003c\/div\u003e\n        \u003cdiv class=\"rev-trust-badge\"\u003e⭐ 89 verified reviews\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"reviews-grid\"\u003e\n\n      \u003cdiv class=\"review-card reveal\"\u003e\n        \u003cdiv class=\"review-top\"\u003e\n          \u003cspan class=\"review-stars\"\u003e★★★★★\u003c\/span\u003e\n          \u003cspan class=\"review-verified\"\u003e✓ Verified Purchase\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003ch4 class=\"review-title\"\u003e\"My lazy cat actually plays now\"\u003c\/h4\u003e\n        \u003cp class=\"review-text\"\u003eMochi is 6 and had basically given up on toys. I put this on the floor and she batted it, it wobbled back, and she went into full predator mode for 25 minutes straight. I filmed it. I've watched it 40 times. Worth every penny just for that video.\u003c\/p\u003e\n        \u003cdiv class=\"review-author\"\u003e\n          \u003cdiv class=\"review-avatar\"\u003e🐈\u003c\/div\u003e\n          \u003cdiv\u003e\n            \u003cdiv class=\"review-name\"\u003eTaryn S.\u003c\/div\u003e\n            \u003cdiv class=\"review-meta\"\u003e6-year-old tabby mom · Portland, OR\u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"review-card reveal reveal-delay-1\"\u003e\n        \u003cdiv class=\"review-top\"\u003e\n          \u003cspan class=\"review-stars\"\u003e★★★★★\u003c\/span\u003e\n          \u003cspan class=\"review-verified\"\u003e✓ Verified Purchase\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003ch4 class=\"review-title\"\u003e\"Bought 4. One for each room.\"\u003c\/h4\u003e\n        \u003cp class=\"review-text\"\u003eI have two cats who were destroying my couch out of boredom. Three weeks in with these balls and the scratching has dropped significantly. I put one in the living room, bedroom, kitchen, and hallway. They find a new one every few days. Rotation is the secret.\u003c\/p\u003e\n        \u003cdiv class=\"review-author\"\u003e\n          \u003cdiv class=\"review-avatar\"\u003e🐱\u003c\/div\u003e\n          \u003cdiv\u003e\n            \u003cdiv class=\"review-name\"\u003eJames W.\u003c\/div\u003e\n            \u003cdiv class=\"review-meta\"\u003eTwo rescue cats · Brooklyn, NY\u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"review-card reveal reveal-delay-2\"\u003e\n        \u003cdiv class=\"review-top\"\u003e\n          \u003cspan class=\"review-stars\"\u003e★★★★★\u003c\/span\u003e\n          \u003cspan class=\"review-verified\"\u003e✓ Verified Purchase\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003ch4 class=\"review-title\"\u003e\"Silent at 2am. Gamechanging.\"\u003c\/h4\u003e\n        \u003cp class=\"review-text\"\u003eOur previous cat toy was a motorised feather thing that sounded like a drone. This is completely silent on hardwood floors. Cats play at night. Now I'm actually able to sleep while they're out there hunting. The silicone is such a smart material choice.\u003c\/p\u003e\n        \u003cdiv class=\"review-author\"\u003e\n          \u003cdiv class=\"review-avatar\"\u003e🌙\u003c\/div\u003e\n          \u003cdiv\u003e\n            \u003cdiv class=\"review-name\"\u003eKeiko M.\u003c\/div\u003e\n            \u003cdiv class=\"review-meta\"\u003eTwo Bengal cats · San Francisco, CA\u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"review-card reveal\"\u003e\n        \u003cdiv class=\"review-top\"\u003e\n          \u003cspan class=\"review-stars\"\u003e★★★★☆\u003c\/span\u003e\n          \u003cspan class=\"review-verified\"\u003e✓ Verified Purchase\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003ch4 class=\"review-title\"\u003e\"Great — but some cats need convincing\"\u003c\/h4\u003e\n        \u003cp class=\"review-text\"\u003eMy younger cat was obsessed immediately. My older one ignored it for a week before suddenly deciding it was the best thing in the house. If your cat doesn't respond right away, leave it out for a few days — they'll come around. Quality is excellent.\u003c\/p\u003e\n        \u003cdiv class=\"review-author\"\u003e\n          \u003cdiv class=\"review-avatar\"\u003e😸\u003c\/div\u003e\n          \u003cdiv\u003e\n            \u003cdiv class=\"review-name\"\u003ePriya N.\u003c\/div\u003e\n            \u003cdiv class=\"review-meta\"\u003eTwo cats, different ages · Austin, TX\u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"review-card reveal reveal-delay-1\"\u003e\n        \u003cdiv class=\"review-top\"\u003e\n          \u003cspan class=\"review-stars\"\u003e★★★★★\u003c\/span\u003e\n          \u003cspan class=\"review-verified\"\u003e✓ Verified Purchase\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003ch4 class=\"review-title\"\u003e\"My anxious cat is so much calmer\"\u003c\/h4\u003e\n        \u003cp class=\"review-text\"\u003eMy vet suggested more active playtime to help with her anxiety and overgrooming. We've been using this for about a month and I've noticed a real difference. She seems more settled in the evenings. Small thing, but the physical outlet really does help.\u003c\/p\u003e\n        \u003cdiv class=\"review-author\"\u003e\n          \u003cdiv class=\"review-avatar\"\u003e💙\u003c\/div\u003e\n          \u003cdiv\u003e\n            \u003cdiv class=\"review-name\"\u003eRachel O.\u003c\/div\u003e\n            \u003cdiv class=\"review-meta\"\u003eAnxious rescue cat · London, UK\u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"review-card reveal reveal-delay-2\"\u003e\n        \u003cdiv class=\"review-top\"\u003e\n          \u003cspan class=\"review-stars\"\u003e★★★★★\u003c\/span\u003e\n          \u003cspan class=\"review-verified\"\u003e✓ Verified Purchase\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003ch4 class=\"review-title\"\u003e\"The pink one lives on my coffee table\"\u003c\/h4\u003e\n        \u003cp class=\"review-text\"\u003eI bought the pink one because I didn't want a hideous toy sitting in my living room. It actually looks nice. Clean silicone, good colours, doesn't look like it belongs in a pet shop. My cat plays with it, my guests ask about it. Win-win.\u003c\/p\u003e\n        \u003cdiv class=\"review-author\"\u003e\n          \u003cdiv class=\"review-avatar\"\u003e🎀\u003c\/div\u003e\n          \u003cdiv\u003e\n            \u003cdiv class=\"review-name\"\u003eCamille B.\u003c\/div\u003e\n            \u003cdiv class=\"review-meta\"\u003eInterior design enthusiast · Montreal, CA\u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- ============================================================\n     MATERIAL SAFETY\n     ============================================================ --\u003e\n\u003csection id=\"safety-section\" aria-label=\"Material safety and specifications\"\u003e\n  \u003cdiv class=\"safety-inner\"\u003e\n    \u003cdiv class=\"safety-text-side\"\u003e\n      \u003cspan class=\"safety-eyebrow reveal\"\u003eSafe by Design\u003c\/span\u003e\n      \u003ch2 class=\"safety-title reveal\"\u003eFood-Grade Silicone.\u003cbr\u003eBecause Cats Put Everything in Their Mouths.\u003c\/h2\u003e\n      \u003cp class=\"safety-body reveal\"\u003eWe chose food-grade silicone for a single, non-negotiable reason: cats chew their toys. Whatever material is in the toy ends up in your cat. Ours is the same silicone standard used in baby teethers — BPA-free, non-toxic, and certified safe for oral contact.\u003c\/p\u003e\n      \u003cdiv class=\"safety-badges reveal\"\u003e\n        \u003cdiv class=\"safety-badge\"\u003e\n\u003cspan class=\"icon\"\u003e✅\u003c\/span\u003e BPA-Free\u003c\/div\u003e\n        \u003cdiv class=\"safety-badge\"\u003e\n\u003cspan class=\"icon\"\u003e✅\u003c\/span\u003e Non-Toxic\u003c\/div\u003e\n        \u003cdiv class=\"safety-badge\"\u003e\n\u003cspan class=\"icon\"\u003e✅\u003c\/span\u003e Food-Grade Silicone\u003c\/div\u003e\n        \u003cdiv class=\"safety-badge\"\u003e\n\u003cspan class=\"icon\"\u003e✅\u003c\/span\u003e No Sharp Edges\u003c\/div\u003e\n        \u003cdiv class=\"safety-badge\"\u003e\n\u003cspan class=\"icon\"\u003e✅\u003c\/span\u003e Chew-Safe\u003c\/div\u003e\n        \u003cdiv class=\"safety-badge\"\u003e\n\u003cspan class=\"icon\"\u003e✅\u003c\/span\u003e Odor-Free\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"safety-specs-side reveal reveal-delay-2\"\u003e\n      \u003cdiv class=\"safety-specs-card\"\u003e\n        \u003ch3 class=\"safety-specs-title\"\u003eFull Specifications\u003c\/h3\u003e\n        \u003cdiv class=\"spec-row\"\u003e\n\u003cspan class=\"spec-key\"\u003eProduct Name\u003c\/span\u003e\u003cspan class=\"spec-val\"\u003eGravity Rolling Cat Teasing Ball\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"spec-row\"\u003e\n\u003cspan class=\"spec-key\"\u003eMaterial\u003c\/span\u003e\u003cspan class=\"spec-val\"\u003e100% Food-Grade Silicone\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"spec-row\"\u003e\n\u003cspan class=\"spec-key\"\u003eAvailable Colors\u003c\/span\u003e\u003cspan class=\"spec-val\"\u003eBlue · Pink\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"spec-row\"\u003e\n\u003cspan class=\"spec-key\"\u003eMechanism\u003c\/span\u003e\u003cspan class=\"spec-val\"\u003eWeighted self-righting gravity base\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"spec-row\"\u003e\n\u003cspan class=\"spec-key\"\u003ePower\u003c\/span\u003e\u003cspan class=\"spec-val\"\u003eUSB rechargeable (cable included)\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"spec-row\"\u003e\n\u003cspan class=\"spec-key\"\u003eSuitable For\u003c\/span\u003e\u003cspan class=\"spec-val\"\u003eAll cats \u0026amp; small pets\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"spec-row\"\u003e\n\u003cspan class=\"spec-key\"\u003eWhat's Included\u003c\/span\u003e\u003cspan class=\"spec-val\"\u003e1 × Teasing Ball\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"spec-row\"\u003e\n\u003cspan class=\"spec-key\"\u003eBPA \/ Toxins\u003c\/span\u003e\u003cspan class=\"spec-val\"\u003eNone — fully safe\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- ============================================================\n     FAQ\n     ============================================================ --\u003e\n\u003csection id=\"product-faq\" aria-label=\"Frequently asked questions about the cat ball\"\u003e\n  \u003cdiv class=\"faq-inner\"\u003e\n    \u003cdiv class=\"section-head reveal\"\u003e\n      \u003cp class=\"section-eyebrow\"\u003eCommon Questions\u003c\/p\u003e\n      \u003ch2 class=\"section-title\"\u003eBefore You Ask\u003c\/h2\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"faq-list reveal\"\u003e\n\n      \u003cdiv class=\"faq-item\"\u003e\n        \u003cbutton class=\"faq-q\" onclick=\"toggleFaq(this)\" aria-expanded=\"false\"\u003e\n          My cat ignores every toy I buy. Will this be different?\n          \u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\n        \u003c\/button\u003e\n        \u003cdiv class=\"faq-a\" role=\"region\"\u003e\n          \u003cdiv class=\"faq-a-inner\"\u003eThe key difference is the self-righting movement. Static toys stay still once a cat bats them away — the hunt ends. This one fights back, which is what triggers sustained engagement. That said, some cats need a few days of exposure before they decide it's worth their time. Leave it out in a visible spot for 3–5 days. Don't push it toward them. Let them discover it on their terms. That's when you'll get the real reaction.\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"faq-item\"\u003e\n        \u003cbutton class=\"faq-q\" onclick=\"toggleFaq(this)\" aria-expanded=\"false\"\u003e\n          Is it safe if my cat chews on it?\n          \u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\n        \u003c\/button\u003e\n        \u003cdiv class=\"faq-a\" role=\"region\"\u003e\n          \u003cdiv class=\"faq-a-inner\"\u003eYes — that's exactly why we chose food-grade silicone. It's the same material used in baby teethers and kitchen utensils. BPA-free, non-toxic, and safe for oral contact. The material is flexible enough to be satisfying to chew but durable enough not to break apart. As with any toy, we recommend checking it periodically for wear, especially if your cat is a heavy chewer.\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"faq-item\"\u003e\n        \u003cbutton class=\"faq-q\" onclick=\"toggleFaq(this)\" aria-expanded=\"false\"\u003e\n          Does it work on carpet as well as hard floors?\n          \u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\n        \u003c\/button\u003e\n        \u003cdiv class=\"faq-a\" role=\"region\"\u003e\n          \u003cdiv class=\"faq-a-inner\"\u003eIt works on both, though the rolling action is more dramatic on hard floors (tile, hardwood, laminate). On carpet, it still wobbles and rights itself — just with a slightly shorter roll. Most cats engage equally well on both surfaces. If you want maximum movement, a smooth floor is ideal. If your home is mostly carpeted, it still works — just expect more wobble than roll.\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"faq-item\"\u003e\n        \u003cbutton class=\"faq-q\" onclick=\"toggleFaq(this)\" aria-expanded=\"false\"\u003e\n          Will it wake me up at night?\n          \u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\n        \u003c\/button\u003e\n        \u003cdiv class=\"faq-a\" role=\"region\"\u003e\n          \u003cdiv class=\"faq-a-inner\"\u003eThis is one of the things we're most proud of. Silicone on hard floors is nearly silent — there's no plastic clatter, no motorised whirring, no bells. You'll hear the occasional soft thud when your cat pounces, but nothing that will pull you out of sleep. Reviewers specifically call this out as a reason they leave it out overnight. If your cat is a night hunter, this is built for that.\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"faq-item\"\u003e\n        \u003cbutton class=\"faq-q\" onclick=\"toggleFaq(this)\" aria-expanded=\"false\"\u003e\n          How do I keep it interesting long-term?\n          \u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\n        \u003c\/button\u003e\n        \u003cdiv class=\"faq-a\" role=\"region\"\u003e\n          \u003cdiv class=\"faq-a-inner\"\u003eRotation is the secret. Put it away for a few days, then bring it back out — to your cat, it'll feel new again. Moving it to a different room helps too. Some owners buy two or three and swap them out weekly. The novelty of \"where did this come from?\" is half the engagement. A cat that's played with the same toy for 6 months will often rediscover it after a week away.\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"faq-item\"\u003e\n        \u003cbutton class=\"faq-q\" onclick=\"toggleFaq(this)\" aria-expanded=\"false\"\u003e\n          How long does shipping take?\n          \u003cspan class=\"faq-icon\"\u003e+\u003c\/span\u003e\n        \u003c\/button\u003e\n        \u003cdiv class=\"faq-a\" role=\"region\"\u003e\n          \u003cdiv class=\"faq-a-inner\"\u003eStandard shipping takes 7–14 business days to most countries. You'll receive a tracking number by email as soon as your order ships. Orders over $100 qualify for free standard shipping worldwide. Expedited options may be available at checkout depending on your location.\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- ============================================================\n     GUARANTEE\n     ============================================================ --\u003e\n\u003csection id=\"guarantee-section\" aria-label=\"Our guarantee\"\u003e\n  \u003cdiv class=\"guarantee-inner\"\u003e\n    \u003cspan class=\"guarantee-icon reveal\"\u003e🛡️\u003c\/span\u003e\n    \u003ch2 class=\"guarantee-title reveal\"\u003eOur 30-Day Happy Cat Guarantee\u003c\/h2\u003e\n    \u003cp class=\"guarantee-text reveal\"\u003eWe know cats can be picky. If this doesn't engage your cat — for any reason — we'll make it right. Full refund, no questions asked, no lengthy return forms. We back this product completely.\u003c\/p\u003e\n    \u003cdiv class=\"guarantee-pillars reveal\"\u003e\n      \u003cdiv class=\"guarantee-pillar\"\u003e\n\u003cspan class=\"icon\"\u003e↩️\u003c\/span\u003e 30 days to return it\u003c\/div\u003e\n      \u003cdiv class=\"guarantee-pillar\"\u003e\n\u003cspan class=\"icon\"\u003e💳\u003c\/span\u003e Full refund guaranteed\u003c\/div\u003e\n      \u003cdiv class=\"guarantee-pillar\"\u003e\n\u003cspan class=\"icon\"\u003e📞\u003c\/span\u003e Real human support\u003c\/div\u003e\n      \u003cdiv class=\"guarantee-pillar\"\u003e\n\u003cspan class=\"icon\"\u003e🚀\u003c\/span\u003e No questions asked\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- ============================================================\n     CROSS-SELL\n     ============================================================ --\u003e\n\u003csection id=\"cross-sell\" aria-label=\"Frequently bought together\"\u003e\n  \u003cdiv class=\"cross-sell-inner\"\u003e\n    \u003cdiv class=\"section-head reveal\"\u003e\n      \u003cp class=\"section-eyebrow\"\u003eComplete the Setup\u003c\/p\u003e\n      \u003ch2 class=\"section-title\"\u003eCustomers Also Got\u003c\/h2\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"cross-sell-grid\"\u003e\n\n      \u003cdiv class=\"cross-card reveal\"\u003e\n        \u003cimg class=\"cross-card-img\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/3078354e-955c-4241-93ac-bf0e26cb4455.jpg?v=1782320430\" alt=\"Gravity Cat Feeder 2-Pack\" loading=\"lazy\"\u003e\n        \u003cdiv class=\"cross-card-body\"\u003e\n          \u003cdiv class=\"cross-card-rating\"\u003e★★★★★ \u003cspan style=\"color:var(--text-muted);font-size:11px;\"\u003e4.7 (241)\u003c\/span\u003e\n\u003c\/div\u003e\n          \u003ch3 class=\"cross-card-title\"\u003eGravity Cat Feeder 2-Pack — Automatic Food \u0026amp; Water Dispenser\u003c\/h3\u003e\n          \u003cdiv class=\"cross-card-price-row\"\u003e\n            \u003cspan class=\"cross-price-current\" data-usd=\"24.99\"\u003e$24.99\u003c\/span\u003e\n            \u003cspan class=\"cross-price-original\" data-usd=\"39.99\"\u003e$39.99\u003c\/span\u003e\n          \u003c\/div\u003e\n          \u003cbutton class=\"btn-cross-add\" onclick=\"crossAdd(this, 'Gravity Cat Feeder 2-Pack', 24.99, 'https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/3078354e-955c-4241-93ac-bf0e26cb4455.jpg?v=1782320430', 49222957039868)\" aria-label=\"Add Gravity Cat Feeder to cart\"\u003eAdd to Cart\u003c\/button\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"cross-card reveal reveal-delay-1\"\u003e\n        \u003cimg class=\"cross-card-img\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/759031d4-5c1e-42b8-8a82-cd9b41879c9c.jpg?v=1782320431\" alt=\"Warm Cozy Round Pet Bed\" loading=\"lazy\"\u003e\n        \u003cdiv class=\"cross-card-body\"\u003e\n          \u003cdiv class=\"cross-card-rating\"\u003e★★★★★ \u003cspan style=\"color:var(--text-muted);font-size:11px;\"\u003e4.9 (198)\u003c\/span\u003e\n\u003c\/div\u003e\n          \u003ch3 class=\"cross-card-title\"\u003eWarm Cozy Round Pet Bed — Self-Warming Plush Nest\u003c\/h3\u003e\n          \u003cdiv class=\"cross-card-price-row\"\u003e\n            \u003cspan class=\"cross-price-current\" data-usd=\"28.99\"\u003e$28.99\u003c\/span\u003e\n            \u003cspan class=\"cross-price-original\" data-usd=\"45.00\"\u003e$45.00\u003c\/span\u003e\n          \u003c\/div\u003e\n          \u003cbutton class=\"btn-cross-add\" onclick=\"crossAdd(this, 'Warm Cozy Round Pet Bed', 28.99, 'https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/759031d4-5c1e-42b8-8a82-cd9b41879c9c.jpg?v=1782320431', 49222899859708)\" aria-label=\"Add Pet Bed to cart\"\u003eAdd to Cart\u003c\/button\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"cross-card reveal reveal-delay-2\"\u003e\n        \u003cimg class=\"cross-card-img\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/2401280700350325100.jpg?v=1782303635\" alt=\"Pet Paw Cleaning Cup\" loading=\"lazy\"\u003e\n        \u003cdiv class=\"cross-card-body\"\u003e\n          \u003cdiv class=\"cross-card-rating\"\u003e★★★★★ \u003cspan style=\"color:var(--text-muted);font-size:11px;\"\u003e4.8 (312)\u003c\/span\u003e\n\u003c\/div\u003e\n          \u003ch3 class=\"cross-card-title\"\u003ePet Paw Cleaning Cup — For Dogs \u0026amp; Cats\u003c\/h3\u003e\n          \u003cdiv class=\"cross-card-price-row\"\u003e\n            \u003cspan class=\"cross-price-current\" data-usd=\"23.99\"\u003e$23.99\u003c\/span\u003e\n            \u003cspan class=\"cross-price-original\" data-usd=\"33.00\"\u003e$33.00\u003c\/span\u003e\n          \u003c\/div\u003e\n          \u003cbutton class=\"btn-cross-add\" onclick=\"crossAdd(this, 'Pet Paw Cleaning Cup', 23.99, 'https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/2401280700350325100.jpg?v=1782303635', 49222645481724)\" aria-label=\"Add Paw Cleaning Cup to cart\"\u003eAdd to Cart\u003c\/button\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- ============================================================\n     FINAL CTA\n     ============================================================ --\u003e\n\u003csection id=\"final-cta\" aria-label=\"Final call to action\"\u003e\n  \u003cdiv class=\"final-cta-inner\"\u003e\n    \u003cspan class=\"final-cta-eyebrow reveal\"\u003eReady to End the Boredom?\u003c\/span\u003e\n    \u003ch2 class=\"final-cta-title reveal\"\u003eA Happy Cat Starts With the Right Toy.\u003c\/h2\u003e\n    \u003cp class=\"final-cta-sub reveal\"\u003eJoin 12,000+ cat parents who've stopped watching their cats stare at walls. One ball. Hours of play. A calmer, happier cat every single day.\u003c\/p\u003e\n    \u003cdiv class=\"final-cta-actions reveal\"\u003e\n      \u003cbutton class=\"btn-final-atc\" onclick=\"addToCartMain()\" aria-label=\"Add to cart now\"\u003e\n        Add to Cart — \u003cspan data-usd=\"12.99\"\u003e$12.99\u003c\/span\u003e\n        \u003csvg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" viewbox=\"0 0 24 24\"\u003e\u003cpath d=\"M5 12h14M12 5l7 7-7 7\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n      \u003c\/button\u003e\n      \u003cp class=\"final-cta-note\"\u003eFree shipping over $100 · 30-Day Returns · Secure Checkout\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- ============================================================\n     NEWSLETTER\n     ============================================================ --\u003e\n\u003csection id=\"newsletter\" aria-label=\"Newsletter signup\"\u003e\n  \u003cdiv class=\"newsletter-inner\"\u003e\n    \u003ch2\u003eJoin the VIORA Family\u003c\/h2\u003e\n    \u003cp\u003eGet first access to new arrivals, member-only deals, and tips for happier, healthier pets.\u003c\/p\u003e\n    \u003cdiv class=\"newsletter-form\" role=\"form\" aria-label=\"Newsletter signup\"\u003e\n      \u003cinput type=\"email\" class=\"newsletter-input\" placeholder=\"Enter your email\" aria-label=\"Email address\" id=\"newsletterEmail\"\u003e\n      \u003cbutton class=\"newsletter-submit\" onclick=\"subscribeNewsletter()\"\u003eJoin Now\u003c\/button\u003e\n    \u003c\/div\u003e\n    \u003cp class=\"newsletter-privacy\"\u003eNo spam, ever. Unsubscribe anytime.\u003c\/p\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003c!-- ============================================================\n     FOOTER\n     ============================================================ --\u003e\n\u003cfooter role=\"contentinfo\"\u003e\n  \u003cdiv class=\"footer-inner\"\u003e\n    \u003cdiv class=\"footer-top\"\u003e\n      \u003cdiv class=\"footer-brand\"\u003e\n        \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/WhatsApp_Image_2026-06-25_at_1.14.05_PM.jpg?v=1782382466\" alt=\"VIORA\" onerror=\"this.style.display='none'\"\u003e\n        \u003cp\u003ePremium pet products thoughtfully curated for dogs and cats. Trusted by over 12,000 pet parents worldwide.\u003c\/p\u003e\n        \u003cdiv class=\"footer-socials\"\u003e\n          \u003ca href=\"#\" class=\"social-link\" aria-label=\"Instagram\"\u003e📷\u003c\/a\u003e\n          \u003ca href=\"#\" class=\"social-link\" aria-label=\"TikTok\"\u003e🎵\u003c\/a\u003e\n          \u003ca href=\"#\" class=\"social-link\" aria-label=\"Facebook\"\u003e👍\u003c\/a\u003e\n          \u003ca href=\"#\" class=\"social-link\" aria-label=\"Pinterest\"\u003e📌\u003c\/a\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"footer-col\"\u003e\n        \u003ch4\u003eShop\u003c\/h4\u003e\n        \u003ca href=\"\/collections\/all\"\u003eAll Products\u003c\/a\u003e\n        \u003ca href=\"\/collections\/dogs\"\u003eFor Dogs\u003c\/a\u003e\n        \u003ca href=\"\/collections\/cats\"\u003eFor Cats\u003c\/a\u003e\n        \u003ca href=\"\/collections\/best-sellers\"\u003eBest Sellers\u003c\/a\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"footer-col\"\u003e\n        \u003ch4\u003eHelp\u003c\/h4\u003e\n        \u003ca href=\"#product-faq\"\u003eFAQ\u003c\/a\u003e\n        \u003ca href=\"\/pages\/shipping\"\u003eShipping Info\u003c\/a\u003e\n        \u003ca href=\"\/pages\/returns\"\u003eReturns\u003c\/a\u003e\n        \u003ca href=\"\/pages\/contact\"\u003eContact Us\u003c\/a\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"footer-col\"\u003e\n        \u003ch4\u003eCompany\u003c\/h4\u003e\n        \u003ca href=\"\/pages\/about\"\u003eAbout VIORA\u003c\/a\u003e\n        \u003ca href=\"\/pages\/privacy-policy\"\u003ePrivacy Policy\u003c\/a\u003e\n        \u003ca href=\"\/pages\/terms-of-service\"\u003eTerms of Service\u003c\/a\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"footer-bottom\"\u003e\n      \u003cp class=\"footer-copy\"\u003e© 2026 VIORA. All rights reserved.\u003c\/p\u003e\n      \u003cdiv class=\"payment-icons\" aria-label=\"Accepted payment methods\"\u003e\n        \u003cspan class=\"payment-icon\"\u003eVISA\u003c\/span\u003e\n        \u003cspan class=\"payment-icon\"\u003eMC\u003c\/span\u003e\n        \u003cspan class=\"payment-icon\"\u003eAMEX\u003c\/span\u003e\n        \u003cspan class=\"payment-icon\"\u003ePayPal\u003c\/span\u003e\n        \u003cspan class=\"payment-icon\"\u003eApple Pay\u003c\/span\u003e\n        \u003cspan class=\"payment-icon\"\u003eShop Pay\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/footer\u003e\n\n\u003c!-- Toast --\u003e\n\u003cdiv class=\"toast\" id=\"toast\" role=\"alert\" aria-live=\"assertive\"\u003e\n  \u003cspan class=\"toast-icon\" id=\"toastIcon\"\u003e✅\u003c\/span\u003e\n  \u003cspan id=\"toastMsg\"\u003eAdded to cart!\u003c\/span\u003e\n\u003c\/div\u003e\n\n\u003c!-- Sticky ATC Bar --\u003e\n\u003cdiv id=\"sticky-atc\" aria-label=\"Sticky add to cart\"\u003e\n  \u003cdiv class=\"sticky-product-info\"\u003e\n    \u003cdiv class=\"sticky-product-name\"\u003eGravity Rolling Cat Teasing Ball\u003c\/div\u003e\n    \u003cdiv class=\"sticky-product-price\" id=\"stickyPrice\" data-usd=\"12.99\"\u003e$12.99\u003c\/div\u003e\n  \u003c\/div\u003e\n  \u003cbutton class=\"sticky-btn-atc\" onclick=\"addToCartMain()\" aria-label=\"Add to cart\"\u003eAdd to Cart\u003c\/button\u003e\n\u003c\/div\u003e\n\n\u003c!-- Sign-In Modal --\u003e\n\u003cdiv class=\"modal-overlay\" id=\"signInModal\" role=\"dialog\" aria-label=\"Sign in\" aria-modal=\"true\"\u003e\n  \u003cdiv class=\"modal-box\"\u003e\n    \u003cbutton class=\"modal-close\" onclick=\"closeModal()\" aria-label=\"Close sign in\"\u003e✕\u003c\/button\u003e\n    \u003ch2\u003eWelcome Back\u003c\/h2\u003e\n    \u003cp\u003eSign in to your VIORA account for faster checkout and order tracking.\u003c\/p\u003e\n    \u003cinput class=\"modal-input\" type=\"email\" placeholder=\"Email address\" aria-label=\"Email address\"\u003e\n    \u003cinput class=\"modal-input\" type=\"password\" placeholder=\"Password\" aria-label=\"Password\"\u003e\n    \u003cbutton class=\"btn-modal-submit\"\u003eSign In\u003c\/button\u003e\n    \u003cdiv class=\"modal-divider\"\u003eor\u003c\/div\u003e\n    \u003cbutton class=\"btn-modal-submit\" style=\"background:var(--blush); color:var(--navy);\"\u003eCreate Account\u003c\/button\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ============================================================\n     JAVASCRIPT\n     ============================================================ --\u003e\n\u003cscript\u003e\n\/* ================================================================\n   VIORA — Cat Teasing Ball Product Page JS\n   Shopify AJAX Cart API (\/cart\/add.js, \/cart.js, \/cart\/change.js)\n   ================================================================ *\/\n\nconst FREE_SHIPPING_THRESHOLD = 100;\n\n\/\/ ── Product State ─────────────────────────────────────────────────\n\/\/ IMPORTANT: Replace these placeholder variant IDs with your actual Shopify variant IDs\nconst COLOR_VARIANTS = {\n  'Blue': 0,   \/\/ ← REPLACE with actual Blue variant ID, e.g. 49222645514492\n  'Pink': 1    \/\/ ← REPLACE with actual Pink variant ID, e.g. 49222645547260\n};\n\nlet selectedVariantId = COLOR_VARIANTS['Blue'];\nlet selectedColor = 'Blue';\nlet currentQty = 1;\n\nconst PRODUCT_PRICE_USD = 12.99;\nconst PRODUCT_TITLE = 'Gravity Rolling Cat Teasing Ball';\nconst PRODUCT_IMG = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/0bc5b09e-beff-4645-b25b-e1297c47b6fb.jpg?v=1782303967';\n\n\/\/ ── Currency ──────────────────────────────────────────────────────\nconst CURRENCY_MAP = {\n  US:{code:'USD',symbol:'$',locale:'en-US'},GB:{code:'GBP',symbol:'£',locale:'en-GB'},\n  DE:{code:'EUR',symbol:'€',locale:'de-DE'},FR:{code:'EUR',symbol:'€',locale:'fr-FR'},\n  IT:{code:'EUR',symbol:'€',locale:'it-IT'},ES:{code:'EUR',symbol:'€',locale:'es-ES'},\n  NL:{code:'EUR',symbol:'€',locale:'nl-NL'},AT:{code:'EUR',symbol:'€',locale:'de-AT'},\n  PT:{code:'EUR',symbol:'€',locale:'pt-PT'},GR:{code:'EUR',symbol:'€',locale:'el-GR'},\n  FI:{code:'EUR',symbol:'€',locale:'fi-FI'},IE:{code:'EUR',symbol:'€',locale:'en-IE'},\n  BE:{code:'EUR',symbol:'€',locale:'nl-BE'},\n  EG:{code:'EGP',symbol:'EGP ',locale:'en-US'},SA:{code:'SAR',symbol:'SAR ',locale:'en-US'},\n  AE:{code:'AED',symbol:'AED ',locale:'en-US'},MA:{code:'MAD',symbol:'MAD ',locale:'en-US'},\n  CA:{code:'CAD',symbol:'CA$',locale:'en-CA'},AU:{code:'AUD',symbol:'A$',locale:'en-AU'},\n  NZ:{code:'NZD',symbol:'NZ$',locale:'en-NZ'},SG:{code:'SGD',symbol:'S$',locale:'en-SG'},\n  JP:{code:'JPY',symbol:'¥',locale:'ja-JP'},CN:{code:'CNY',symbol:'¥',locale:'zh-CN'},\n  IN:{code:'INR',symbol:'₹',locale:'en-IN'},BR:{code:'BRL',symbol:'R$',locale:'pt-BR'},\n  MX:{code:'MXN',symbol:'MX$',locale:'es-MX'},ZA:{code:'ZAR',symbol:'R',locale:'en-ZA'},\n  NG:{code:'NGN',symbol:'₦',locale:'en-NG'},TR:{code:'TRY',symbol:'₺',locale:'tr-TR'},\n  PK:{code:'PKR',symbol:'₨',locale:'ur-PK'},PH:{code:'PHP',symbol:'₱',locale:'en-PH'},\n  ID:{code:'IDR',symbol:'Rp',locale:'id-ID'},MY:{code:'MYR',symbol:'RM',locale:'ms-MY'},\n  TH:{code:'THB',symbol:'฿',locale:'th-TH'},KR:{code:'KRW',symbol:'₩',locale:'ko-KR'},\n  CH:{code:'CHF',symbol:'CHF ',locale:'de-CH'},SE:{code:'SEK',symbol:'kr',locale:'sv-SE'},\n  NO:{code:'NOK',symbol:'kr',locale:'nb-NO'},DK:{code:'DKK',symbol:'kr',locale:'da-DK'},\n  PL:{code:'PLN',symbol:'zł',locale:'pl-PL'},CZ:{code:'CZK',symbol:'Kč',locale:'cs-CZ'},\n  HU:{code:'HUF',symbol:'Ft',locale:'hu-HU'},RO:{code:'RON',symbol:'lei',locale:'ro-RO'},\n  IL:{code:'ILS',symbol:'₪',locale:'he-IL'},AR:{code:'ARS',symbol:'AR$',locale:'es-AR'},\n  CL:{code:'CLP',symbol:'CL$',locale:'es-CL'},CO:{code:'COP',symbol:'CO$',locale:'es-CO'},\n  KE:{code:'KES',symbol:'KSh',locale:'sw-KE'},\n};\nlet fxRate=1, fxSymbol='$', fxCode='USD', fxLocale='en-US', fxReady=false;\n\nfunction fxFormat(usdAmt) {\n  const local = usdAmt * fxRate;\n  const noCents = ['JPY','KRW','IDR','HUF','CLP','COP'];\n  try {\n    const opts = { minimumFractionDigits: noCents.includes(fxCode) ? 0 : 2, maximumFractionDigits: noCents.includes(fxCode) ? 0 : 2 };\n    return fxSymbol + new Intl.NumberFormat(fxLocale, opts).format(local);\n  } catch(e) {\n    return fxSymbol + local.toFixed(2);\n  }\n}\n\nfunction applyPricesToPage() {\n  document.querySelectorAll('[data-usd]').forEach(el =\u003e {\n    el.textContent = fxFormat(parseFloat(el.dataset.usd));\n  });\n}\n\nasync function initCurrency() {\n  try {\n    const geo = await fetch('https:\/\/ipapi.co\/json\/').then(r=\u003er.json());\n    const country = (geo.country_code||'US').toUpperCase();\n    const info = CURRENCY_MAP[country] || CURRENCY_MAP['US'];\n    fxCode=info.code; fxSymbol=info.symbol; fxLocale=info.locale;\n    if (fxCode !== 'USD') {\n      const rates = await fetch('https:\/\/open.er-api.com\/v6\/latest\/USD').then(r=\u003er.json());\n      fxRate = rates.rates[fxCode] || 1;\n    }\n    fxReady = true;\n    applyPricesToPage();\n    refreshCart();\n  } catch(e) { fxReady = true; }\n}\n\n\/\/ ── Gallery ───────────────────────────────────────────────────────\nlet galleryAutoIndex = 0;\nlet galleryAutoTimer = null;\n\nfunction selectThumb(index) {\n  document.querySelectorAll('#galleryMain img').forEach((img, i) =\u003e {\n    img.classList.toggle('active', i === index);\n  });\n  document.querySelectorAll('.gallery-thumb').forEach((t, i) =\u003e {\n    t.classList.toggle('active', i === index);\n    t.setAttribute('aria-selected', i === index ? 'true' : 'false');\n  });\n  galleryAutoIndex = index;\n}\n\nfunction startGalleryAutoplay() {\n  clearInterval(galleryAutoTimer);\n  galleryAutoTimer = setInterval(() =\u003e {\n    const imgs = document.querySelectorAll('#galleryMain img');\n    if (!imgs.length) return;\n    galleryAutoIndex = (galleryAutoIndex + 1) % imgs.length;\n    selectThumb(galleryAutoIndex);\n  }, 4500);\n}\nfunction stopGalleryAutoplay() { clearInterval(galleryAutoTimer); }\n\nconst galleryMainEl = document.getElementById('galleryMain');\nif (galleryMainEl) {\n  galleryMainEl.addEventListener('mouseenter', stopGalleryAutoplay);\n  galleryMainEl.addEventListener('mouseleave', startGalleryAutoplay);\n}\ndocument.querySelectorAll('.gallery-thumb').forEach(thumb =\u003e {\n  thumb.addEventListener('click', startGalleryAutoplay);\n});\nstartGalleryAutoplay();\n\ndocument.querySelectorAll('.gallery-thumb').forEach((thumb, i) =\u003e {\n  thumb.addEventListener('keydown', e =\u003e {\n    if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); selectThumb(i); }\n  });\n});\n\n\/\/ ── Color Selection ───────────────────────────────────────────────\nfunction selectColor(el, colorName, variantKey) {\n  document.querySelectorAll('.color-swatch').forEach(s =\u003e {\n    s.classList.remove('active');\n    s.setAttribute('aria-checked', 'false');\n  });\n  el.classList.add('active');\n  el.setAttribute('aria-checked', 'true');\n  selectedColor = colorName;\n  selectedVariantId = COLOR_VARIANTS[colorName];\n  document.getElementById('selectedColorName').textContent = colorName;\n}\n\ndocument.querySelectorAll('.color-swatch').forEach(swatch =\u003e {\n  swatch.addEventListener('keydown', e =\u003e {\n    if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); swatch.click(); }\n  });\n});\n\n\/\/ ── Quantity ──────────────────────────────────────────────────────\nfunction changeQty(delta) {\n  const input = document.getElementById('qtyInput');\n  let val = parseInt(input.value) + delta;\n  val = Math.max(1, Math.min(10, val));\n  input.value = val;\n  currentQty = val;\n}\n\ndocument.getElementById('qtyInput').addEventListener('change', function() {\n  let val = parseInt(this.value) || 1;\n  val = Math.max(1, Math.min(10, val));\n  this.value = val;\n  currentQty = val;\n});\n\n\/\/ ── Shopify AJAX Cart ─────────────────────────────────────────────\nasync function addLineToShopifyCart(variantId, quantity) {\n  const res = await fetch('\/cart\/add.js', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application\/json' },\n    body: JSON.stringify({ items: [{ id: variantId, quantity }] })\n  });\n  if (!res.ok) {\n    const err = await res.json().catch(() =\u003e ({}));\n    throw new Error(err.description || 'Could not add to cart');\n  }\n  return res.json();\n}\n\nasync function fetchShopifyCart() {\n  const res = await fetch('\/cart.js');\n  if (!res.ok) throw new Error('Could not fetch cart');\n  return res.json();\n}\n\nasync function changeShopifyCartLine(key, quantity) {\n  const res = await fetch('\/cart\/change.js', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application\/json' },\n    body: JSON.stringify({ id: key, quantity })\n  });\n  if (!res.ok) throw new Error('Could not update cart');\n  return res.json();\n}\n\nasync function refreshCart() {\n  try {\n    const cart = await fetchShopifyCart();\n    renderCartFromShopify(cart);\n  } catch(e) {\n    console.warn('Cart refresh failed — Shopify API unavailable in preview:', e.message);\n  }\n}\n\nfunction renderCartFromShopify(cart) {\n  const count = cart.item_count || 0;\n  document.getElementById('cartCount').textContent = count;\n\n  const total = cart.total_price \/ 100;\n  const remaining = Math.max(0, FREE_SHIPPING_THRESHOLD - total);\n  const pct = Math.min(100, (total \/ FREE_SHIPPING_THRESHOLD) * 100);\n  document.getElementById('shippingProgress').style.width = pct + '%';\n  document.getElementById('shippingMsg').innerHTML = remaining \u003e 0\n    ? `Add \u003cstrong\u003e${fxFormat(remaining)}\u003c\/strong\u003e more for free shipping 🚚`\n    : `🎉 You've unlocked \u003cstrong\u003efree shipping!\u003c\/strong\u003e`;\n\n  const wrap = document.getElementById('cartItemsWrap');\n  const emptyEl = document.getElementById('cartEmpty');\n  const footerEl = document.getElementById('cartFooter');\n\n  wrap.querySelectorAll('.cart-item').forEach(el =\u003e el.remove());\n\n  if (!cart.items || cart.items.length === 0) {\n    emptyEl.style.display = 'flex';\n    footerEl.style.display = 'none';\n    return;\n  }\n\n  emptyEl.style.display = 'none';\n  footerEl.style.display = '';\n\n  cart.items.forEach(item =\u003e {\n    const div = document.createElement('div');\n    div.className = 'cart-item';\n    const linePrice = (item.final_line_price \/ 100);\n    div.innerHTML = `\n      \u003cimg src=\"${item.image}\" alt=\"${item.title}\" loading=\"lazy\"\u003e\n      \u003cdiv class=\"cart-item-info\"\u003e\n        \u003cdiv class=\"cart-item-title\"\u003e${item.title}${item.variant_title \u0026\u0026 item.variant_title !== 'Default Title' ? ' — '+item.variant_title : ''}\u003c\/div\u003e\n        \u003cdiv class=\"cart-item-price\"\u003e${fxFormat(linePrice)}\u003c\/div\u003e\n        \u003cdiv class=\"cart-item-qty\"\u003e\n          \u003cbutton class=\"qty-btn\" onclick=\"updateCartLine('${item.key}', ${item.quantity - 1})\" aria-label=\"Decrease quantity\"\u003e−\u003c\/button\u003e\n          \u003cspan class=\"qty-num\"\u003e${item.quantity}\u003c\/span\u003e\n          \u003cbutton class=\"qty-btn\" onclick=\"updateCartLine('${item.key}', ${item.quantity + 1})\" aria-label=\"Increase quantity\"\u003e+\u003c\/button\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e`;\n    wrap.appendChild(div);\n  });\n\n  document.getElementById('cartSubtotal').textContent = fxFormat(total);\n  document.getElementById('checkoutBtn').onclick = () =\u003e { window.location.href = '\/checkout'; };\n}\n\nasync function updateCartLine(key, newQty) {\n  try {\n    const cart = await changeShopifyCartLine(key, newQty);\n    renderCartFromShopify(cart);\n  } catch(e) {\n    showToast('⚠️', 'Could not update cart');\n    console.error(e);\n  }\n}\n\n\/\/ ── Add to Cart ───────────────────────────────────────────────────\nasync function addToCartMain() {\n  const btn = document.getElementById('atcBtn');\n  const qty = parseInt(document.getElementById('qtyInput').value) || 1;\n  const originalHTML = btn.innerHTML;\n  btn.classList.add('loading');\n  btn.textContent = 'Adding…';\n  try {\n    await addLineToShopifyCart(selectedVariantId, qty);\n    await refreshCart();\n    btn.classList.remove('loading');\n    btn.classList.add('added');\n    btn.textContent = '✓ Added to Cart!';\n    showToast('✅', `${PRODUCT_TITLE} (${selectedColor}) added to cart`);\n    openCart();\n    setTimeout(() =\u003e {\n      btn.classList.remove('added');\n      btn.innerHTML = originalHTML;\n    }, 2500);\n  } catch(e) {\n    btn.classList.remove('loading');\n    btn.innerHTML = originalHTML;\n    showToast('⚠️', 'Could not add to cart — please try again');\n    console.error('ATC error:', e);\n  }\n}\n\nasync function buyNow() {\n  const qty = parseInt(document.getElementById('qtyInput').value) || 1;\n  try {\n    await addLineToShopifyCart(selectedVariantId, qty);\n    window.location.href = '\/checkout';\n  } catch(e) {\n    window.location.href = `\/cart\/${selectedVariantId}:${qty}`;\n  }\n}\n\nasync function crossAdd(btn, title, priceUsd, img, variantId) {\n  const origHTML = btn.innerHTML;\n  btn.textContent = 'Adding…';\n  btn.disabled = true;\n  try {\n    await addLineToShopifyCart(variantId, 1);\n    await refreshCart();\n    btn.classList.add('added');\n    btn.textContent = '✓ Added!';\n    showToast('✅', `${title} added to cart`);\n    openCart();\n    setTimeout(() =\u003e { btn.classList.remove('added'); btn.innerHTML = origHTML; btn.disabled = false; }, 2500);\n  } catch(e) {\n    btn.innerHTML = origHTML;\n    btn.disabled = false;\n    showToast('⚠️', 'Could not add to cart');\n  }\n}\n\n\/\/ ── Cart Drawer ───────────────────────────────────────────────────\nfunction openCart() {\n  document.getElementById('cartDrawer').classList.add('open');\n  document.getElementById('cartOverlay').classList.add('open');\n  document.body.style.overflow = 'hidden';\n  refreshCart();\n}\n\nfunction closeCart() {\n  document.getElementById('cartDrawer').classList.remove('open');\n  document.getElementById('cartOverlay').classList.remove('open');\n  document.body.style.overflow = '';\n}\n\n\/\/ ── Sticky ATC Bar ────────────────────────────────────────────────\nconst stickyBar = document.getElementById('sticky-atc');\nconst productHero = document.getElementById('product-hero');\nlet stickyVisible = false;\nlet scrollTicking = false;\n\nwindow.addEventListener('scroll', () =\u003e {\n  if (!scrollTicking) {\n    requestAnimationFrame(() =\u003e {\n      const heroBottom = productHero.getBoundingClientRect().bottom;\n      const shouldShow = heroBottom \u003c 0;\n      if (shouldShow !== stickyVisible) {\n        stickyVisible = shouldShow;\n        stickyBar.classList.toggle('visible', shouldShow);\n      }\n      const currentScroll = window.scrollY;\n      const annBar = document.getElementById('announcement-bar');\n      if (currentScroll \u003e 60) annBar.classList.add('hidden');\n      else annBar.classList.remove('hidden');\n\n      const header = document.getElementById('site-header');\n      if (currentScroll \u003e 120) {\n        if (currentScroll \u003e (scrollTicking._last||0) + 4) header.classList.add('hide');\n        else if (currentScroll \u003c (scrollTicking._last||0) - 4) header.classList.remove('hide');\n      } else {\n        header.classList.remove('hide');\n      }\n      scrollTicking._last = Math.max(0, currentScroll);\n      checkReveal();\n      scrollTicking = false;\n    });\n    scrollTicking = true;\n  }\n}, { passive: true });\n\n\/\/ ── Reveal Animations ─────────────────────────────────────────────\nconst revealObserver = new IntersectionObserver((entries) =\u003e {\n  entries.forEach(entry =\u003e {\n    if (entry.isIntersecting) {\n      entry.target.classList.add('visible');\n      revealObserver.unobserve(entry.target);\n    }\n  });\n}, { rootMargin: '0px 0px -60px 0px' });\n\nfunction checkReveal() {\n  document.querySelectorAll('.reveal:not(.visible)').forEach(el =\u003e revealObserver.observe(el));\n}\n\n\/\/ ── Toast ─────────────────────────────────────────────────────────\nlet toastTimer;\nfunction showToast(icon, msg) {\n  const toast = document.getElementById('toast');\n  document.getElementById('toastIcon').textContent = icon;\n  document.getElementById('toastMsg').textContent = msg;\n  toast.classList.add('show');\n  clearTimeout(toastTimer);\n  toastTimer = setTimeout(() =\u003e toast.classList.remove('show'), 3000);\n}\n\n\/\/ ── FAQ ───────────────────────────────────────────────────────────\nfunction toggleFaq(btn) {\n  const item = btn.closest('.faq-item');\n  const isOpen = item.classList.contains('open');\n  document.querySelectorAll('.faq-item.open').forEach(el =\u003e {\n    el.classList.remove('open');\n    el.querySelector('.faq-q').setAttribute('aria-expanded', 'false');\n  });\n  if (!isOpen) { item.classList.add('open'); btn.setAttribute('aria-expanded', 'true'); }\n}\n\n\/\/ ── Modal ─────────────────────────────────────────────────────────\nfunction openModal() {\n  const m = document.getElementById('signInModal');\n  m.classList.add('open'); document.body.style.overflow = 'hidden';\n  m.addEventListener('click', function handler(e) {\n    if (e.target === m) { closeModal(); m.removeEventListener('click', handler); }\n  });\n}\nfunction closeModal() { document.getElementById('signInModal').classList.remove('open'); document.body.style.overflow = ''; }\n\n\/\/ ── Mobile Nav ────────────────────────────────────────────────────\nfunction openMobileNav() {\n  const nav = document.getElementById('mobileNav');\n  nav.classList.add('open'); nav.setAttribute('aria-hidden', 'false'); document.body.style.overflow = 'hidden';\n}\nfunction closeMobileNav() {\n  const nav = document.getElementById('mobileNav');\n  nav.classList.remove('open'); nav.setAttribute('aria-hidden', 'true'); document.body.style.overflow = '';\n}\n\n\/\/ ── Newsletter ────────────────────────────────────────────────────\nfunction subscribeNewsletter() {\n  const email = document.getElementById('newsletterEmail').value.trim();\n  if (!email || !email.includes('@')) { showToast('⚠️', 'Please enter a valid email address'); return; }\n  showToast('🎉', 'Welcome to the VIORA family!');\n  document.getElementById('newsletterEmail').value = '';\n}\n\n\/\/ ── Keyboard Accessibility ────────────────────────────────────────\ndocument.addEventListener('keydown', e =\u003e {\n  if (e.key === 'Escape') { closeCart(); closeModal(); closeMobileNav(); }\n});\n\n\/\/ ── Init ──────────────────────────────────────────────────────────\ndocument.addEventListener('DOMContentLoaded', () =\u003e {\n  checkReveal();\n  refreshCart();\n  initCurrency();\n});\nwindow.addEventListener('load', () =\u003e { checkReveal(); });\n\u003c\/script\u003e\n\n\n\n\n{% schema %}\n{\n  \"name\": \"Product — Cat Teasing Ball\",\n  \"tag\": \"section\",\n  \"class\": \"section\",\n  \"presets\": [\n    {\n      \"name\": \"Product — Cat Teasing Ball\"\n    }\n  ]\n}\n{% endschema %}\u003c\/body\u003e","brand":"Viora","offers":[{"title":"Blue \/ 1pc","offer_id":49222652264700,"sku":"CJMY196547501AZ","price":12.99,"currency_code":"USD","in_stock":true},{"title":"Blue \/ 2pcs","offer_id":49222652297468,"sku":"CJMY196547504DW","price":17.99,"currency_code":"USD","in_stock":true},{"title":"Pink \/ 1pc","offer_id":49222652330236,"sku":"CJMY196547502BY","price":12.99,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0810\/5092\/7356\/files\/0bc5b09e-beff-4645-b25b-e1297c47b6fb.jpg?v=1782303967","url":"https:\/\/vioraa.store\/products\/pet-supplies-gravity-rolling-cat-teasing-ball","provider":"Viora","version":"1.0","type":"link"}