// Page Code for /checkout-link import { cart } from 'wix-stores'; import wixLocation from 'wix-location'; /** * Accepts `products` query parameter in Meta format: * - Encoded: products=112233%3A1%2C445566%3A2 * - Unencoded: products=112233:1,445566:2 (still works) * * Each entry is ID:QTY. Colons/commas may be RFC 3986-escaped. * Example final URL for Meta: * https://mysticalcrow.com/checkout-link?products=112233%3A1%2C445566%3A2 */ function parseProductsParam(rawParam) { if (!rawParam || typeof rawParam !== 'string') return []; // Try to decode once; if it throws or changes nothing, we still continue safely let decoded = rawParam; try { // decodeURIComponent will convert %3A -> ":", %2C -> "," decoded = decodeURIComponent(rawParam); } catch (_e) { // If decoding fails, we’ll proceed with the original string } // Split by commas (now that we normalized to ":" and ",") // Trim spaces just in case. return decoded .split(',') .map(s => s.trim()) .filter(Boolean) .map(pair => { const [id, qty] = pair.split(':').map(x => (x || '').trim()); const quantity = Number(qty); return (id && !Number.isNaN(quantity) && quantity > 0) ? { productId: id, quantity } : null; }) .filter(Boolean); } async function addAllToCart(items) { // Wix Stores cart.addProducts accepts an array of product objects. // We’ll add one by one to ensure each promise resolves, but you can batch if desired. for (const item of items) { // If a product has variants/options, you’ll need to pass the relevant // selection data here (e.g., options: [{ optionName, selection }]). // For simple products, productId + quantity is sufficient. await cart.addProducts([{ productId: item.productId, quantity: item.quantity }]); } } $w.onReady(async function () { const { products } = wixLocation.query; if (!products) { // No parameter present; go to cart so the user isn't stuck. wixLocation.to('/cart'); return; } const items = parseProductsParam(products); if (!items.length) { // Parameter present but invalid/empty after parsing wixLocation.to('/cart'); return; } try { await addAllToCart(items); // Success: go straight to checkout wixLocation.to('/checkout'); } catch (_err) { // If anything fails (bad ID, etc.), fall back to cart wixLocation.to('/cart'); } });
top of page

Memento Mori – Dark Academia Candle

A reminder that even beauty fades and all things return to shadow, Memento Mori embodies the poetry of mortality. This candle carries the richness of a dark orchard at twilight—ripe plums, cherries, and oranges mingle with soft violet and a whisper of cinnamon. At its base, cedarwood and vanilla linger like sweet smoke clinging to aged stone, grounding the fragrance in something both comforting and inevitable. It is enchanting, enigmatic, and tinged with the reminder to cherish the fleeting.

Infused with Dark Orchard fragrance oil, this blend is mysterious yet inviting, conjuring the balance between life’s sweetness and its shadows. Perfect for moments of reflection, ritual, or quiet study, it turns any room into a meditation on beauty, time, and impermanence.

Hand-poured with 100% soy wax and a clean cotton wick, this candle burns pure and toxin-free. Each fragrance oil is clean and phthalate-free, ensuring a safe yet immersive experience.

Available in three sizes to suit your rituals:
– 16 oz glass jar for long nights of contemplation
– 12 oz glass jar for daily brushes with mystery
– 6 oz travel tin to carry reflection wherever you go

Light the flame, breathe deeply, and let Memento Mori remind you: even shadows bloom, and every ending is only another beginning.

MEMENTO MORI Dark Academia Candle Collection

$13.00Price
Quantity
    bottom of page