jessicasimpson.com
Dixia High Heel in Gold (() => { /* The snippet may render many times; this runs once. */ if (window.__rivoWishlistInitialized) return; window.__rivoWishlistInitialized = true; const DEBUG = false; const log = (...a) => { if (DEBUG) console.log('[Wishlist]', ...a); }; /* ── the only theme-specific strings in this file ── */ const THEME_SELECTORS = { grid: '[data-infinite-scroll-results]', card: '.product-block' }; const reInitWishlistBtns = (source = 'manual') => { try { const widget = document.getElementById('rivo-account-slideout'); if (window.RivoProfileAlpine && widget) { log('reinit', source); window.RivoProfileAlpine.$data(widget).initializeFavoriteButtons(); } } catch (err) { log('reinit failed', err); } }; /* Card mode is absolutely positioned, so its parent has to be a positioning context. Rather than requiring every caller to remember that, give the parent position:relative here — but only if it is currently static, so we never clobber a parent the theme already positioned. */ const anchorParents = () => { document.querySelectorAll('.favorite-button-wrapper--card').forEach(w => { const p = w.parentElement; if (p && getComputedStyle(p).position === 'static') { p.style.position = 'relative'; } }); }; /* Infinite-scroll and filtered grids swap cards out from under Rivo. */ const setupGridWatcher = () => { const grid = document.querySelector(THEME_SELECTORS.grid); if (!grid) return log('no infinite-scroll grid'); let last = grid.querySelectorAll(THEME_SELECTORS.card).length; new MutationObserver(() => { const now = grid.querySelectorAll(THEME_SELECTORS.card).length; if (now !== last) { log('cards', last, '->', now); last = now; anchorParents(); reInitWishlistBtns('grid-change'); } }).observe(grid, { childList: true, subtree: true }); log('watching grid'); }; const boot = () => { anchorParents(); reInitWishlistBtns('initial'); setupGridWatcher(); document.addEventListener('shopify:section:load', () => { anchorParents(); reInitWishlistBtns('section-load'); }); }; if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', boot); } else { boot(); } })(); :root { --rivo-aw-favorite-button-active-color: #BD9F4A !important; } /* ── shared: the circle ── */ .favorite-button-wrapper { --fav-size: 36px; display: flex; align-items: center; justify-content: center; width: 36px; height: 36px; max-width: 36px; max-height: 36px; padding: 0; background: #FFFFFF; border: 1px solid rgba(23, 23, 23, 0.08); border-radius: 50%; box-sizing: border-box; z-index: 10; transition: background-color 0.25s ease, border-color 0.25s ease, transform 0.25s ease; } .favorite-button-wrapper:hover { background: #F6F2EF; border-color: #BD9F4A; } .favorite-button-wrapper rivo-favorite-button { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; cursor: pointer; } /* heart scales with the circle */ .favorite-button-wrapper rivo-favorite-button svg { position: static !important; stroke: #171717 !important; height: calc(var(--fav-size) * 0.5); width: calc(var(--fav-size) * 0.5); margin: 0; z-index: 10 !important; transition: stroke 0.25s ease, fill 0.25s ease; } .favorite-button-wrapper rivo-favorite-button.rivo-favorite-active svg { stroke: #BD9F4A !important; fill: #BD9F4A !important; } /* icon only, in every mode */ .favorite-button-wrapper > rivo-favorite-button::after { content: none !important; } /* ── card mode: pinned to a corner of the parent ── */ .favorite-button-wrapper--card { position: absolute; box-shadow: 0 2px 10px -4px rgba(23, 23, 23, 0.30); } .favorite-button-wrapper--card:hover { transform: translateY(-1px); } .favorite-button-wrapper--bottom-right { bottom: 12px; right: 12px; } .favorite-button-wrapper--bottom-left { bottom: 12px; left: 12px; } .favorite-button-wrapper--top-right { top: 12px; right: 12px; } .favorite-button-wrapper--top-left { top: 12px; left: 12px; } /* ── inline mode: flows with the text, wraps with it ────────── Sized in em so it scales with whatever type it sits in, and set `display: inline-flex` so it behaves as a word: it sits on the baseline run and moves to the next line with the text rather than overlapping it. */ .favorite-button-wrapper--inline { --fav-size: 1.15em; position: relative; display: inline-flex; vertical-align: middle; flex: 0 0 auto; top: -0.06em; right: auto; bottom: auto; left: auto; border-color: #BD9F4A; box-shadow: none; /* never let the heart wrap away from the last word on its own */ white-space: nowrap; } /* an explicit `size` overrides the em default */ .favorite-button-wrapper--inline[style*="--fav-size"] { top: 0; } /* Some themes stack two wrappers per card — keep the first only. */ .product-block__inner .favorite-button-wrapper:not(:first-child) { display: none !important; }
$89.00(USD)