An error occurred during deployment. Please fix:
The sensitive environment variable NEXT_PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKEN is in the following files and exposed in the client:
- app/api/shopify/debug-env/route.ts
- lib/shopify.ts
- app/api/shopify/simple-test/route.ts
- app/api/shopify/basic-test/route.ts
- app/api/shopify/minimal-graphql/route.ts
- app/api/debug-test/route.ts
- lib/env.ts
- app/api/shopify/products/route.ts
Please remove the sensitive environment variable from the client code – either completely or by using a server component/action to fetch the value.
🌙 Security issue detected! Let me fix this by moving all Shopify API calls to server-side only.
The deployment system is correctly flagging that the Storefront token shouldn't be exposed to the client. Let me fix this:
🌙 Security issue fixed! I've moved all Shopify API calls to server-side only.
✅ SECURITY FIXES:
NEXT_PUBLIC_ prefixes from Shopify tokens🌸 ENVIRONMENT VARIABLES TO UPDATE: In your Vercel dashboard, change:
NEXT_PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKENSHOPIFY_STOREFRONT_ACCESS_TOKEN = 7d01fd6b53d40fa958e39a5f49fa0ea8🌿 HOW IT WORKS NOW:
/api/shopify/productsYour deployment should now succeed! The sensitive token is no longer exposed to the client. ✨
🛍️ WORKING SHOP IMPLEMENTATION PROMPT: Create a fully functional shop page with working navigation for Midnight Magnolia. Make ALL buttons clickable and operational. Include real product images from Unsplash and proper functionality for both Shopify products and digital downloads. **CRITICAL: Make this a complete, working React component with:** 1. **WORKING NAVIGATION SYSTEM** 2. **FUNCTIONAL SHOP WITH REAL IMAGES** 3. **ACTUAL CLICKABLE BUTTONS** 4. **SHOPIFY + DIGITAL PRODUCT INTEGRATION** ```jsx import React, { useState, useEffect } from 'react'; import { ShoppingCart, Heart, Eye, Plus, Minus, X, Menu } from 'lucide-react'; const MidnightMagnoliaShop = () => { const [currentSection, setCurrentSection] = useState('hero'); const [cart, setCart] = useState([]); const [isCartOpen, setIsCartOpen] = useState(false); const [selectedCategory, setSelectedCategory] = useState('all'); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [quickViewProduct, setQuickViewProduct] = useState(null); // REAL PRODUCT DATA WITH UNSPLASH IMAGES const products = [ // DIGITAL PRODUCTS { id: 'magnolia-reset-digital', name: 'The Magnolia Reset 90-Day Journal', description: 'A sacred journey of transformation through ancestral wisdom and daily reflection', price: 29, originalPrice: 39, image: 'https://images.unsplash.com/photo-1544716278-ca5e3f4abd8c?w=400&h=500&fit=crop', category: 'digital', type: 'digital-download', tags: ['healing', 'transformation', 'journal'], featured: true, formats: ['PDF Download', 'Printable Pages'], deliveryTime: 'Instant download' }, { id: 'midnight-tarot-digital', name: 'Midnight Messages Tarot Deck', description: 'Divination cards rooted in Southern Gothic wisdom and healing energy', price: 19, image: 'https://images.unsplash.com/photo-1578662996442-48f60103fc96?w=400&h=500&fit=crop', category: 'digital', type: 'digital-download', tags: ['tarot', 'divination', 'spiritual'], featured: true, formats: ['Digital Cards', 'Printable Guide'], deliveryTime: 'Instant download' }, { id: 'adhd-planner-digital', name: 'Sacred Productivity ADHD Planner', description: 'Gentle planning system designed for neurodivergent entrepreneurs and healers', price: 19, image: 'https://images.unsplash.com/photo-1484480974693-6ca0a78fb36b?w=400&h=500&fit=crop', category: 'digital', type: 'digital-download', tags: ['adhd', 'planning', 'productivity'], featured: true, formats: ['PDF Planner', 'Digital Templates'], deliveryTime: 'Instant download' }, { id: 'entrepreneur-kit', name: 'Digital Entrepreneur\'s Starter Kit', description: 'Complete foundation for building sacred business with authentic marketing', price: 37, image: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=400&h=500&fit=crop', category: 'digital', type: 'digital-download', tags: ['business', 'entrepreneur', 'marketing'], formats: ['Business Templates', 'Marketing Guide', 'Brand Kit'], deliveryTime: 'Instant download' }, { id: 'notion-templates', name: 'Sacred Business Notion Templates', description: 'Complete business management system with healing-centered workflows', price: 49, image: 'https://images.unsplash.com/photo-1611224923853-80b023f02d71?w=400&h=500&fit=crop', category: 'digital', type: 'digital-download', tags: ['notion', 'templates', 'business'], formats: ['Notion Templates', 'Setup Guide'], deliveryTime: 'Instant download' }, // SHOPIFY PHYSICAL PRODUCTS { id: 'vegan-leather-journal', name: 'Vegan Leather Journal Set with Pen & Pouch', description: 'Handcrafted journal with matching pouch and premium pen for sacred writing', price: 25, image: 'https://images.unsplash.com/photo-1455791875203-27095cc5129b?w=400&h=500&fit=crop', category: 'physical', type: 'shopify-product', tags: ['journal', 'writing', 'luxury'], featured: true, inStock: true, shipping: '3-5 business days', shopifyId: 'journal-set-001' }, { id: 'essential-oil-diffuser', name: 'Sacred Space Essential Oil Diffuser', description: 'Premium ultrasonic diffuser for creating healing atmospheres', price: 63, originalPrice: 75, image: 'https://images.unsplash.com/photo-1615891113000-53d3ce9b2aee?w=400&h=500&fit=crop', category: 'physical', type: 'shopify-product', tags: ['aromatherapy', 'wellness', 'diffuser'], inStock: true, shipping: '2-4 business days', shopifyId: 'diffuser-001' }, { id: 'rosemary-oil', name: 'Natural Rosemary Essential Oil', description: 'Pure rosemary oil for clarity, focus, and spiritual cleansing', price: 23, image: 'https://images.unsplash.com/photo-1608571945994-8bb2e0ceebeb?w=400&h=500&fit=crop', category: 'physical', type: 'shopify-product', tags: ['essential-oil', 'rosemary', 'natural'], inStock: true, shipping: '2-3 business days', shopifyId: 'oil-rosemary' }, { id: 'huntsman-oil', name: 'Huntsman Blend Essential Oil', description: 'Masculine energy blend for grounding and protection', price: 108, image: 'https://images.unsplash.com/photo-1580626002419-0eb2cf5de614?w=400&h=500&fit=crop', category: 'physical', type: 'shopify-product', tags: ['essential-oil', 'blend', 'masculine'], inStock: true, shipping: '2-3 business days', shopifyId: 'oil-huntsman' }, { id: 'sacred-candles', name: 'Midnight Ritual Candles Set', description: 'Hand-poured candles for sacred ceremonies and meditation', price: 45, image: 'https://images.unsplash.com/photo-1546878819-a4ce9d29e200?w=400&h=500&fit=crop', category: 'physical', type: 'shopify-product', tags: ['candles', 'ritual', 'meditation'], inStock: true, shipping: '3-5 business days', shopifyId: 'candles-ritual' } ]; // Navigation sections const navigationSections = [ { id: 'hero', label: 'Home', href: '#hero' }, { id: 'shop', label: 'Sacred Collection', href: '#shop' }, { id: 'digital', label: 'Digital Downloads', href: '#digital' }, { id: 'physical', label: 'Physical Products', href: '#physical' }, { id: 'about', label: 'About', href: '#about' }, { id: 'contact', label: 'Contact', href: '#contact' } ]; // Filter products by category const filteredProducts = selectedCategory === 'all' ? products : products.filter(product => product.category === selectedCategory); // Add to cart function const addToCart = (product) => { const existingItem = cart.find(item => item.id === product.id); if (existingItem) { setCart(cart.map(item => item.id === product.id ? { ...item, quantity: item.quantity + 1 } : item )); } else { setCart([...cart, { ...product, quantity: 1 }]); } // Show success notification const notification = document.createElement('div'); notification.className = 'fixed top-4 right-4 bg-green-600 text-white px-4 py-2 rounded-lg z-50 transition-all duration-300'; notification.textContent = `${product.name} added to your sacred collection!`; document.body.appendChild(notification); setTimeout(() => notification.remove(), 3000); }; // Remove from cart const removeFromCart = (productId) => { setCart(cart.filter(item => item.id !== productId)); }; // Update quantity const updateQuantity = (productId, newQuantity) => { if (newQuantity === 0) { removeFromCart(productId); } else { setCart(cart.map(item => item.id === productId ? { ...item, quantity: newQuantity } : item )); } }; // Calculate cart total const cartTotal = cart.reduce((total, item) => total + (item.price * item.quantity), 0); const cartItemCount = cart.reduce((total, item) => total + item.quantity, 0); // Handle navigation const handleNavigation = (sectionId) => { setCurrentSection(sectionId); setIsMobileMenuOpen(false); // Smooth scroll to section const element = document.getElementById(sectionId); if (element) { element.scrollIntoView({ behavior: 'smooth' }); } }; // Handle purchase const handlePurchase = (product) => { if (product.type === 'digital-download') { // Handle digital product purchase alert(`Starting checkout for digital product: ${product.name}\\n\\nYou'll receive instant download links after payment!`); } else if (product.type === 'shopify-product') { // Handle Shopify product purchase alert(`Adding ${product.name} to cart and redirecting to Shopify checkout...`); } }; // Handle checkout const handleCheckout = () => { if (cart.length === 0) { alert('Your sacred collection is empty'); return; } const digitalItems = cart.filter(item => item.type === 'digital-download'); const physicalItems = cart.filter(item => item.type === 'shopify-product'); if (digitalItems.length > 0 && physicalItems.length > 0) { alert('Mixed cart detected!\\n\\nDigital items: Instant download\\nPhysical items: Shopify checkout\\n\\nProceeding to combined checkout...'); } else if (digitalItems.length > 0) { alert('Digital products checkout!\\nInstant download after payment.'); } else { alert('Physical products checkout!\\nRedirecting to Shopify...'); } }; return ( <div className="min-h-screen bg-gradient-to-b from-slate-900 to-slate-800 text-white"> {/* Navigation Header */} <nav className="fixed top-0 w-full bg-slate-900/95 backdrop-blur-sm border-b border-yellow-500/20 z-40"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="flex justify-between items-center h-16"> {/* Logo */} <div className="flex items-center"> <h1 className="text-2xl font-serif text-yellow-400">Midnight Magnolia</h1> </div> {/* Desktop Navigation */} <div className="hidden md:block"> <div className="ml-10 flex items-baseline space-x-4"> {navigationSections.map((section) => ( <button key={section.id} onClick={() => handleNavigation(section.id)} className={`px-3 py-2 rounded-md text-sm font-medium transition-colors duration-200 hover:text-yellow-400 hover:bg-slate-700/50 ${ currentSection === section.id ? 'text-yellow-400 bg-slate-700/50' : 'text-gray-300' }`} > {section.label} </button> ))} </div> </div> {/* Cart and Mobile Menu */} <div className="flex items-center space-x-4"> {/* Cart Button */} <button onClick={() => setIsCartOpen(true)} className="relative p-2 text-gray-300 hover:text-yellow-400 transition-colors duration-200" > <ShoppingCart className="h-6 w-6" /> {cartItemCount > 0 && ( <span className="absolute -top-1 -right-1 bg-yellow-500 text-slate-900 text-xs rounded-full h-5 w-5 flex items-center justify-center font-bold"> {cartItemCount} </span> )} </button> {/* Mobile menu button */} <div className="md:hidden"> <button onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)} className="text-gray-300 hover:text-yellow-400 transition-colors duration-200" > <Menu className="h-6 w-6" /> </button> </div> </div> </div> </div> {/* Mobile Navigation Menu */} {isMobileMenuOpen && ( <div className="md:hidden bg-slate-800/95 backdrop-blur-sm border-t border-yellow-500/20"> <div className="px-2 pt-2 pb-3 space-y-1 sm:px-3"> {navigationSections.map((section) => ( <button key={section.id} onClick={() => handleNavigation(section.id)} className={`block w-full text-left px-3 py-2 rounded-md text-base font-medium transition-colors duration-200 hover:text-yellow-400 hover:bg-slate-700/50 ${ currentSection === section.id ? 'text-yellow-400 bg-slate-700/50' : 'text-gray-300' }`} > {section.label} </button> ))} </div> </div> )} </nav> {/* Hero Section */} <section id="hero" className="pt-16 min-h-screen flex items-center justify-center bg-gradient-to-br from-slate-900 via-slate-800 to-emerald-900"> <div className="max-w-4xl mx-auto text-center px-4 sm:px-6 lg:px-8"> <h1 className="text-5xl md:text-7xl font-serif text-yellow-400 mb-6"> Midnight Magnolia </h1> <p className="text-xl md:text-2xl text-gray-300 mb-8 leading-relaxed"> Transform Your Creativity Into Sustainable Income </p> <p className="text-lg text-emerald-300 mb-12 max-w-2xl mx-auto"> Southern Gothic Digital products for healers, creators, and digital entrepreneurs seeking authentic transformation </p> <div className="space-y-4 sm:space-y-0 sm:space-x-4 sm:flex sm:justify-center"> <button onClick={() => handleNavigation('shop')} className="w-full sm:w-auto bg-yellow-500 hover:bg-yellow-400 text-slate-900 font-bold py-4 px-8 rounded-lg transition-all duration-300 transform hover:scale-105" > Shop Sacred Collection </button> <button onClick={() => handleNavigation('digital')} className="w-full sm:w-auto border-2 border-yellow-500 text-yellow-400 hover:bg-yellow-500 hover:text-slate-900 font-bold py-4 px-8 rounded-lg transition-all duration-300" > Explore Digital Products </button> </div> </div> </section> {/* Shop Section */} <section id="shop" className="py-20 bg-slate-800"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="text-center mb-16"> <h2 className="text-4xl md:text-5xl font-serif text-yellow-400 mb-6">Sacred Collection</h2> <p className="text-xl text-gray-300 max-w-3xl mx-auto"> Discover our curated selection of healing-centered digital downloads and sacred physical products </p> </div> {/* Category Filter */} <div className="flex flex-wrap justify-center gap-4 mb-12"> {['all', 'digital', 'physical'].map((category) => ( <button key={category} onClick={() => setSelectedCategory(category)} className={`px-6 py-3 rounded-full font-medium transition-all duration-300 ${ selectedCategory === category ? 'bg-yellow-500 text-slate-900' : 'bg-slate-700 text-gray-300 hover:bg-slate-600 hover:text-yellow-400' }`} > {category === 'all' ? 'All Products' : category === 'digital' ? 'Digital Downloads' : 'Physical Products'} </button> ))} </div> {/* Products Grid */} <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-8"> {filteredProducts.map((product) => ( <div key={product.id} className="bg-slate-700/50 rounded-xl overflow-hidden hover:transform hover:scale-105 transition-all duration-300 border border-slate-600 hover:border-yellow-500/50"> {/* Product Image */} <div className="relative aspect-[4/5] overflow-hidden"> <img src={product.image} alt={product.name} className="w-full h-full object-cover" /> {product.featured && ( <span className="absolute top-3 right-3 bg-yellow-500 text-slate-900 px-2 py-1 rounded-full text-xs font-bold"> Featured </span> )} {product.originalPrice && ( <span className="absolute top-3 left-3 bg-red-500 text-white px-2 py-1 rounded-full text-xs font-bold"> SALE </span> )} {/* Overlay Actions */} <div className="absolute inset-0 bg-black/70 opacity-0 hover:opacity-100 transition-opacity duration-300 flex items-center justify-center space-x-4"> <button onClick={() => setQuickViewProduct(product)} className="bg-white/20 backdrop-blur-sm text-white p-2 rounded-full hover:bg-white/30 transition-colors duration-200" > <Eye className="h-5 w-5" /> </button> <button onClick={() => addToCart(product)} className="bg-yellow-500 text-slate-900 p-2 rounded-full hover:bg-yellow-400 transition-colors duration-200" > <ShoppingCart className="h-5 w-5" /> </button> </div> </div> {/* Product Info */} <div className="p-6"> <h3 className="text-lg font-semibold text-white mb-2 line-clamp-2">{product.name}</h3> <p className="text-gray-400 text-sm mb-4 line-clamp-3">{product.description}</p> {/* Price */} <div className="flex items-center justify-between mb-4"> <div className="flex items-center space-x-2"> <span className="text-2xl font-bold text-yellow-400">${product.price}</span> {product.originalPrice && ( <span className="text-lg text-gray-500 line-through">${product.originalPrice}</span> )} </div> <span className={`px-2 py-1 rounded-full text-xs font-medium ${ product.type === 'digital-download' ? 'bg-blue-500/20 text-blue-300' : 'bg-green-500/20 text-green-300' }`}> {product.type === 'digital-download' ? 'Digital' : 'Physical'} </span> </div> {/* Product Tags */} <div className="flex flex-wrap gap-1 mb-4"> {product.tags.slice(0, 3).map((tag) => ( <span key={tag} className="px-2 py-1 bg-slate-600/50 text-gray-300 text-xs rounded"> {tag} </span> ))} </div> {/* Action Buttons */} <div className="space-y-2"> <button onClick={() => addToCart(product)} className="w-full bg-yellow-500 hover:bg-yellow-400 text-slate-900 font-bold py-3 px-4 rounded-lg transition-all duration-300" > Add to Sacred Collection </button> <button onClick={() => handlePurchase(product)} className="w-full border border-yellow-500 text-yellow-400 hover:bg-yellow-500 hover:text-slate-900 font-medium py-2 px-4 rounded-lg transition-all duration-300" > {product.type === 'digital-download' ? 'Buy Now - Instant Download' : 'Buy Now - Ships Soon'} </button> </div> {/* Delivery Info */} <div className="mt-3 text-xs text-gray-400"> {product.type === 'digital-download' ? `✓ ${product.deliveryTime}` : `🚚 ${product.shipping}` } </div> </div> </div> ))} </div> </div> </section> {/* Digital Products Section */} <section id="digital" className="py-20 bg-slate-900"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="text-center mb-16"> <h2 className="text-4xl md:text-5xl font-serif text-yellow-400 mb-6">Digital Downloads</h2> <p className="text-xl text-gray-300 max-w-3xl mx-auto"> Instant access to transformative digital resources for your healing and business journey </p> </div> <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8"> {products.filter(p => p.type === 'digital-download').map((product) => ( <div key={product.id} className="bg-gradient-to-br from-slate-800 to-slate-700 rounded-xl p-6 border border-blue-500/20 hover:border-blue-400/50 transition-all duration-300"> <img src={product.image} alt={product.name} className="w-full h-48 object-cover rounded-lg mb-4" /> <h3 className="text-xl font-semibold text-white mb-3">{product.name}</h3> <p className="text-gray-400 mb-4">{product.description}</p> {/* Formats */} <div className="mb-4"> <p className="text-sm text-blue-300 font-medium mb-2">Includes:</p> <ul className="text-sm text-gray-400 space-y-1"> {product.formats.map((format, index) => ( <li key={index} className="flex items-center"> <span className="w-1.5 h-1.5 bg-blue-400 rounded-full mr-2"></span> {format} </li> ))} </ul> </div> <div className="flex items-center justify-between mb-4"> <span className="text-2xl font-bold text-yellow-400">${product.price}</span> <span className="text-sm text-green-300">✓ Instant Download</span> </div> <button onClick={() => handlePurchase(product)} className="w-full bg-blue-600 hover:bg-blue-500 text-white font-bold py-3 px-4 rounded-lg transition-all duration-300" > Get Instant Access </button> </div> ))} </div> </div> </section> {/* Physical Products Section */} <section id="physical" className="py-20 bg-slate-800"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="text-center mb-16"> <h2 className="text-4xl md:text-5xl font-serif text-yellow-400 mb-6">Physical Products</h2> <p className="text-xl text-gray-300 max-w-3xl mx-auto"> Beautiful, handcrafted items to enhance your sacred space and daily practice </p> </div> <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8"> {products.filter(p => p.type === 'shopify-product').map((product) => ( <div key={product.id} className="bg-gradient-to-br from-slate-700 to-slate-600 rounded-xl p-6 border border-green-500/20 hover:border-green-400/50 transition-all duration-300"> <img src={product.image} alt={product.name} className="w-full h-48 object-cover rounded-lg mb-4" /> <h3 className="text-xl font-semibold text-white mb-3">{product.name}</h3> <p className="text-gray-400 mb-4">{product.description}</p> <div className="flex items-center justify-between mb-4"> <div className="flex items-center space-x-2"> <span className="text-2xl font-bold text-yellow-400">${product.price}</span> {product.originalPrice && ( <span className="text-lg text-gray-500 line-through">${product.originalPrice}</span> )} </div> <span className={`px-2 py-1 rounded-full text-xs font-medium ${ product.inStock ? 'bg-green-500/20 text-green-300' : 'bg-red-500/20 text-red-300' }`}> {product.inStock ? 'In Stock' : 'Out of Stock'} </span> </div> <div className="text-sm text-gray-400 mb-4"> 🚚 {product.shipping} </div> <button onClick={() => handlePurchase(product)} disabled={!product.inStock} className={`w-full font-bold py-3 px-4 rounded-lg transition-all duration-300 ${ product.inStock ? 'bg-green-600 hover:bg-green-500 text-white' : 'bg-gray-600 text-gray-400 cursor-not-allowed' }`} > {product.inStock ? 'Add to Cart' : 'Out of Stock'} </button> </div> ))} </div> </div> </section> {/* About Section */} <section id="about" className="py-20 bg-slate-900"> <div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center"> <h2 className="text-4xl md:text-5xl font-serif text-yellow-400 mb-8">About Midnight Magnolia</h2> <p className="text-xl text-gray-300 leading-relaxed mb-8"> Midnight Magnolia transforms creativity into sustainable income through Southern Gothic Digital products. Founded by a healer, coder, and creative entrepreneur, we bridge the gap between spiritual practice and digital strategy. </p> <p className="text-lg text-emerald-300"> Our mission is to provide authentic, healing-centered resources for entrepreneurs, creators, and anyone seeking transformation through ancestral wisdom and modern innovation. </p> </div> </section> {/* Contact Section */} <section id="contact" className="py-20 bg-slate-800"> <div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center"> <h2 className="text-4xl md:text-5xl font-serif text-yellow-400 mb-8">Connect With Us</h2> <div className="grid grid-cols-1 md:grid-cols-2 gap-8"> <div className="bg-slate-700/50 rounded-xl p-6"> <h3 className="text-xl font-semibold text-white mb-4">Get In Touch</h3> <p className="text-gray-300 mb-4">latisha@midnightmagnolia.com</p> <p className="text-gray-300 mb-4">803-387-2552</p> <p className="text-gray-300">Summerville, SC</p> </div> <div className="bg-slate-700/50 rounded-xl p-6"> <h3 className="text-xl font-semibold text-white mb-4">Follow Our Journey</h3> <div className="space-y-2"> <p className="text-gray-300">Instagram: @rumi_nationz</p> <p className="text-gray-300">Facebook: @ruminationsshop</p> <p className="text-gray-300">LinkedIn: @latishavwaters</p> </div> </div> </div> </div> </section> {/* Shopping Cart Sidebar */} {isCartOpen && ( <div className="fixed inset-0 z-50 overflow-hidden"> <div className="absolute inset-0 bg-black/50" onClick={() => setIsCartOpen(false)}></div> <div className="absolute right-0 top-0 h-full w-full max-w-md bg-slate-800 shadow-xl"> <div className="flex h-full flex-col"> {/* Cart Header */} <div className="flex items-center justify-between border-b border-slate-600 px-6 py-4"> <h2 className="text-lg font-semibold text-white">Your Sacred Collection</h2> <button onClick={() => setIsCartOpen(false)} className="text-gray-400 hover:text-white transition-colors duration-200" > <X className="h-6 w-6" /> </button> </div> {/* Cart Items */} <div className="flex-1 overflow-y-auto px-6 py-4"> {cart.length === 0 ? ( <p className="text-center text-gray-400 mt-8">Your sacred collection is empty</p> ) : ( <div className="space-y-4"> {cart.map((item) => ( <div key={item.id} className="flex items-center space-x-4 bg-slate-700/50 rounded-lg p-4"> <img src={item.image} alt={item.name} className="w-16 h-16 object-cover rounded" /> <div className="flex-1 min-w-0"> <h3 className="text-sm font-medium text-white truncate">{item.name}</h3> <p className="text-sm text-gray-400">${item.price}</p> </div> <div className="flex items-center space-x-2"> <button onClick={() => updateQuantity(item.id, item.quantity - 1)} className="text-gray-400 hover:text-white transition-colors duration-200" > <Minus className="h-4 w-4" /> </button> <span className="text-white font-medium w-8 text-center">{item.quantity}</span> <button onClick={() => updateQuantity(item.id, item.quantity + 1)} className="text-gray-400 hover:text-white transition-colors duration-200" > <Plus className="h-4 w-4" /> </button> </div> <button onClick={() => removeFromCart(item.id)} className="text-red-400 hover:text-red-300 transition-colors duration-200" > <X className="h-4 w-4" /> </button> </div> ))} </div> )} </div> {/* Cart Footer */} {cart.length > 0 && ( <div className="border-t border-slate-600 px-6 py-4"> <div className="flex items-center justify-between mb-4"> <span className="text-lg font-semibold text-white">Total:</span> <span className="text-2xl font-bold text-yellow-400">${cartTotal.toFixed(2)}</span> </div> <button onClick={handleCheckout} className="w-full bg-yellow-500 hover:bg-yellow-400 text-slate-900 font-bold py-3 px-4 rounded-lg transition-all duration-300" > Begin Sacred Checkout </button> <div className="mt-3 text-center"> <p className="text-xs text-gray-400"> ✓ Secure checkout • ✓ Instant digital delivery • ✓ Lifetime access </p> </div> </div> )} </div> </div> </div> )} {/* Quick View Modal */} {quickViewProduct && ( <div className="fixed inset-0 z-50 overflow-y-auto"> <div className="flex items-center justify-center min-h-screen px-4"> <div className="absolute inset-0 bg-black/70" onClick={() => setQuickViewProduct(null)}></div> <div className="relative bg-slate-800 rounded-xl max-w-2xl w-full p-6 border border-yellow-500/20"> <button onClick={() => setQuickViewProduct(null)} className="absolute top-4 right-4 text-gray-400 hover:text-white transition-colors duration-200" > <X className="h-6 w-6" /> </button> <div className="grid grid-cols-1 md:grid-cols-2 gap-6"> <img src={quickViewProduct.image} alt={quickViewProduct.name} className="w-full h-64 object-cover rounded-lg" /> <div> <h2 className="text-2xl font-semibold text-white mb-3">{quickViewProduct.name}</h2> <p className="text-gray-400 mb-4">{quickViewProduct.description}</p> {quickViewProduct.formats && ( <div className="mb-4"> <p className="text-sm text-blue-300 font-medium mb-2">Includes:</p> <ul className="text-sm text-gray-400 space-y-1"> {quickViewProduct.formats.map((format, index) => ( <li key={index} className="flex items-center"> <span className="w-1.5 h-1.5 bg-blue-400 rounded-full mr-2"></span> {format} </li> ))} </ul> </div> )} <div className="flex items-center justify-between mb-6"> <span className="text-3xl font-bold text-yellow-400">${quickViewProduct.price}</span> <span className={`px-3 py-1 rounded-full text-sm font-medium ${ quickViewProduct.type === 'digital-download' ? 'bg-blue-500/20 text-blue-300' : 'bg-green-500/20 text-green-300' }`}> {quickViewProduct.type === 'digital-download' ? 'Digital Download' : 'Physical Product'} </span> </div> <div className="space-y-3"> <button onClick={() => { addToCart(quickViewProduct); setQuickViewProduct(null); }} className="w-full bg-yellow-500 hover:bg-yellow-400 text-slate-900 font-bold py-3 px-4 rounded-lg transition-all duration-300" > Add to Sacred Collection </button> <button onClick={() => { handlePurchase(quickViewProduct); setQuickViewProduct(null); }} className="w-full border border-yellow-500 text-yellow-400 hover:bg-yellow-500 hover:text-slate-900 font-medium py-3 px-4 rounded-lg transition-all duration-300" > Buy Now </button> </div> </div> </div> </div> </div> </div> )} </div> ); }; export default MidnightMagnoliaShop; KEY FEATURES IMPLEMENTED: WORKING NAVIGATION - All buttons scroll to sections smoothly REAL PRODUCT IMAGES - High-quality Unsplash images for each product SHOPIFY + DIGITAL INTEGRATION - Separate handling for both product types FUNCTIONAL SHOPPING CART - Add, remove, update quantities CATEGORY FILTERING - Filter by all, digital, physical products MOBILE RESPONSIVE - Perfect mobile experience QUICK VIEW MODALS - Product preview functionality PURCHASE WORKFLOWS - Different flows for digital vs physical REAL PRICING - Your actual product prices SACRED BRANDING - Healing-centered language throughout PRODUCT DATA INCLUDES: The Magnolia Reset 90-Day Journal ($29 digital) Midnight Messages Tarot Deck ($19 digital) Sacred Productivity ADHD Planner ($19 digital) Digital Entrepreneur's Starter Kit ($37) Sacred Business Notion Templates ($49) Vegan Leather Journal Set ($25 physical) Essential Oil Diffuser ($63 physical) Natural Rosemary Oil ($23 physical) And more! This creates a complete, working shop with beautiful real images and full functionality for both your Shopify products and digital downloads! # MIDNIGHT MAGNOLIA COMPLETE E-COMMERCE ACTIVATION - V0.DEV PROMPT **CRITICAL:** This prompt builds on your existing beautiful Midnight Magnolia foundation. Preserve all current design, branding, and functionality while adding robust e-commerce capabilities. --- ## 🌙 COMPLETE ACTIVATION PROMPT FOR V0.DEV: ``` Transform the existing Midnight Magnolia website into a fully functional, multi-platform e-commerce ecosystem. Replace all "Coming Soon" buttons with complete purchase workflows while maintaining the sacred, healing-centered Southern Gothic Digital aesthetic. **PRESERVE EXISTING FOUNDATION:** - Keep all current design elements, colors, and typography - Maintain existing navigation and layout structure - Preserve current brand voice and spiritual messaging - Keep all existing animations and interactive elements **CORE E-COMMERCE ACTIVATION:** **1. PRODUCT CATALOG SYSTEM** Create a comprehensive product management system with these exact products: ```javascript const midnightMagnoliaProducts = { healingJournals: [ { id: 'magnolia-reset-90', name: 'The Magnolia Reset 90-Day Journal', description: 'A sacred journey of transformation through ancestral wisdom and daily reflection', prices: { digital: 29, print: 47 }, formats: ['digital-pdf', 'print-softcover', 'print-hardcover'], category: 'healing-journals', tags: ['healing', 'transformation', 'ancestral-wisdom'], inStock: true, featured: true }, { id: 'midnight-tarot-deck', name: 'Midnight Messages Tarot Deck', description: 'Divination cards rooted in Southern Gothic wisdom and healing energy', prices: { digital: 19, print: 33 }, formats: ['digital-printable', 'print-cards'], category: 'spiritual-tools', tags: ['tarot', 'divination', 'spiritual-guidance'], inStock: true, featured: true }, { id: 'sacred-productivity-adhd', name: 'Sacred Productivity ADHD Planner', description: 'Gentle planning system designed for neurodivergent entrepreneurs and healers', prices: { digital: 19, print: 29 }, formats: ['digital-pdf', 'print-spiral'], category: 'productivity', tags: ['adhd', 'planning', 'neurodivergent'], inStock: true, featured: true } ], businessSuite: [ { id: 'digital-entrepreneur-kit', name: 'Digital Entrepreneur\'s Starter Kit', description: 'Complete foundation for building sacred business with authentic marketing', prices: { digital: 37 }, formats: ['digital-bundle'], category: 'business-tools', tags: ['entrepreneurship', 'marketing', 'business-strategy'], inStock: true }, { id: 'brand-identity-workbook', name: 'Brand Identity Workbook', description: 'Discover your authentic brand voice and visual identity with soul-centered exercises', prices: { digital: 29 }, formats: ['digital-pdf'], category: 'branding', tags: ['branding', 'identity', 'authenticity'], inStock: true }, { id: 'notion-dashboard-templates', name: 'Sacred Business Notion Templates', description: 'Complete business management system with healing-centered workflows', prices: { digital: 49 }, formats: ['notion-templates'], category: 'productivity', tags: ['notion', 'templates', 'business-management'], inStock: true } ], kdpBooks: [ { id: 'magnolia-reset-book', name: 'The Magnolia Reset - Paperback', description: 'Physical book available through Amazon KDP', prices: { kdp: 24.99 }, formats: ['kdp-paperback'], category: 'books', externalLink: 'https://amazon.com/dp/your-book-id', inStock: true }, { id: 'southern-gothic-poetry', name: 'Southern Gothic Healing Poetry', description: 'Collection of healing verses rooted in ancestral wisdom', prices: { kdp: 18.99 }, formats: ['kdp-paperback'], category: 'books', externalLink: 'https://amazon.com/dp/your-book-id', inStock: true } ] }; ``` **2. ENHANCED PRODUCT CARD COMPONENT** ```html <article class="mm-product-card" data-product-id="{product.id}"> <div class="mm-product-image-container"> <img src="{product.image}" alt="{product.name}" loading="lazy" class="mm-product-image"> <div class="mm-product-overlay"> <button class="mm-btn mm-btn-secondary mm-quick-view" data-product-id="{product.id}"> Quick Sacred View </button> </div> {product.featured && <span class="mm-badge mm-badge-featured">Sacred Featured</span>} </div> <div class="mm-product-info"> <h3 class="mm-product-name">{product.name}</h3> <p class="mm-product-description">{product.description}</p> <!-- Format Selection --> <div class="mm-format-selection" data-product-id="{product.id}"> {product.formats.map(format => ` <label class="mm-format-option"> <input type="radio" name="format-{product.id}" value="${format}" data-price="${product.prices[format]}"> <span class="mm-format-label"> ${formatLabels[format]} - $${product.prices[format]} </span> </label> `).join('')} </div> <!-- Sacred Action Buttons --> <div class="mm-product-actions"> <button class="mm-btn mm-btn-primary mm-add-to-sacred-collection" data-product-id="{product.id}"> Add to Sacred Collection </button> <button class="mm-btn mm-btn-ghost mm-add-to-wishlist" data-product-id="{product.id}"> ♡ Save for Later </button> </div> <!-- Product Tags --> <div class="mm-product-tags"> {product.tags.map(tag => `<span class="mm-tag">${tag}</span>`).join('')} </div> </div> </article> ``` **3. SACRED SHOPPING CART SYSTEM** ```html <div class="mm-sacred-cart" id="sacredCart"> <div class="mm-cart-header"> <h3>Your Sacred Collection</h3> <button class="mm-cart-close" aria-label="Close cart">×</button> </div> <div class="mm-cart-items" id="cartItems"> <!-- Dynamic cart items --> </div> <div class="mm-cart-summary"> <div class="mm-cart-subtotal"> <span>Sacred Subtotal:</span> <span class="mm-price" id="cartSubtotal">$0.00</span> </div> <div class="mm-cart-actions"> <button class="mm-btn mm-btn-secondary mm-continue-shopping"> Continue Sacred Journey </button> <button class="mm-btn mm-btn-primary mm-proceed-checkout" id="proceedCheckout"> Begin Sacred Checkout </button> </div> </div> <!-- Sacred Trust Signals --> <div class="mm-trust-signals"> <div class="mm-trust-item"> <span class="mm-trust-icon">🔒</span> <span>Sacred Secure Checkout</span> </div> <div class="mm-trust-item"> <span class="mm-trust-icon">⚡</span> <span>Instant Digital Delivery</span> </div> <div class="mm-trust-item"> <span class="mm-trust-icon">💝</span> <span>Lifetime Access</span> </div> </div> </div> ``` **4. CHECKOUT FLOW INTEGRATION** ```html <div class="mm-checkout-modal" id="checkoutModal"> <div class="mm-checkout-container"> <div class="mm-checkout-header"> <h2>Complete Your Sacred Purchase</h2> <p>You're one step away from beginning your transformation journey</p> </div> <div class="mm-checkout-content"> <!-- Order Summary --> <div class="mm-order-summary"> <h3>Order Summary</h3> <div id="checkoutItems"></div> <div class="mm-order-total"> <span>Total: </span> <span class="mm-price" id="orderTotal">$0.00</span> </div> </div> <!-- Customer Information --> <form class="mm-checkout-form" id="checkoutForm"> <fieldset class="mm-form-section"> <legend>Sacred Contact Information</legend> <div class="mm-form-group"> <label for="customerEmail">Email Address</label> <input type="email" id="customerEmail" name="email" required placeholder="your.sacred.email@example.com"> </div> <div class="mm-form-row"> <div class="mm-form-group"> <label for="firstName">First Name</label> <input type="text" id="firstName" name="firstName" required> </div> <div class="mm-form-group"> <label for="lastName">Last Name</label> <input type="text" id="lastName" name="lastName" required> </div> </div> </fieldset> <!-- Payment Section --> <fieldset class="mm-form-section"> <legend>Sacred Payment</legend> <div id="stripePaymentElement"> <!-- Stripe Payment Element will be mounted here --> </div> </fieldset> <!-- Sacred Completion --> <div class="mm-checkout-actions"> <button type="submit" class="mm-btn mm-btn-primary mm-complete-purchase"> Complete Sacred Purchase </button> <p class="mm-checkout-note"> By completing this purchase, you're investing in your sacred transformation journey. All digital products include lifetime access and loving support. </p> </div> </form> </div> </div> </div> ``` **5. ADVANCED JAVASCRIPT FUNCTIONALITY** ```javascript class SacredCommerceSystem { constructor() { this.cart = this.loadCart(); this.products = midnightMagnoliaProducts; this.stripe = Stripe('pk_live_your_stripe_key'); // Replace with actual key this.currentUser = null; this.init(); } init() { this.renderProducts(); this.bindEvents(); this.initializePaymentSystem(); this.updateCartUI(); } renderProducts() { const categories = ['healingJournals', 'businessSuite', 'kdpBooks']; categories.forEach(category => { const container = document.getElementById(`${category}Grid`); if (container) { container.innerHTML = this.products[category] .map(product => this.createProductCard(product)) .join(''); } }); } createProductCard(product) { const formatOptions = product.formats.map(format => { const price = product.prices[format] || product.prices.digital || product.prices.kdp; return ` <label class="mm-format-option"> <input type="radio" name="format-${product.id}" value="${format}" data-price="${price}"> <span class="mm-format-label"> ${this.getFormatLabel(format)} - $${price} </span> </label> `; }).join(''); return ` <article class="mm-product-card" data-product-id="${product.id}"> <div class="mm-product-image-container"> <img src="/api/placeholder/400/300" alt="${product.name}" loading="lazy" class="mm-product-image"> <div class="mm-product-overlay"> <button class="mm-btn mm-btn-secondary mm-quick-view" data-product-id="${product.id}"> Quick Sacred View </button> </div> ${product.featured ? '<span class="mm-badge mm-badge-featured">Sacred Featured</span>' : ''} </div> <div class="mm-product-info"> <h3 class="mm-product-name">${product.name}</h3> <p class="mm-product-description">${product.description}</p> <div class="mm-format-selection" data-product-id="${product.id}"> ${formatOptions} </div> <div class="mm-product-actions"> ${product.externalLink ? `<a href="${product.externalLink}" target="_blank" class="mm-btn mm-btn-primary"> View on Amazon </a>` : `<button class="mm-btn mm-btn-primary mm-add-to-sacred-collection" data-product-id="${product.id}"> Add to Sacred Collection </button>` } <button class="mm-btn mm-btn-ghost mm-add-to-wishlist" data-product-id="${product.id}"> ♡ Save for Later </button> </div> <div class="mm-product-tags"> ${product.tags.map(tag => `<span class="mm-tag">${tag}</span>`).join('')} </div> </div> </article> `; } bindEvents() { // Add to cart functionality document.addEventListener('click', (e) => { if (e.target.classList.contains('mm-add-to-sacred-collection')) { const productId = e.target.dataset.productId; this.addToSacredCollection(productId); } if (e.target.classList.contains('mm-proceed-checkout')) { this.initiateCheckout(); } if (e.target.classList.contains('mm-complete-purchase')) { e.preventDefault(); this.completePurchase(); } }); // Format selection document.addEventListener('change', (e) => { if (e.target.name && e.target.name.startsWith('format-')) { this.updateProductPrice(e.target); } }); // Cart toggle document.getElementById('cartToggle')?.addEventListener('click', () => { this.toggleCart(); }); } addToSacredCollection(productId) { const product = this.findProduct(productId); const selectedFormat = document.querySelector(`input[name="format-${productId}"]:checked`); if (!selectedFormat) { this.showNotification('Please select a format before adding to your sacred collection', 'info'); return; } const cartItem = { id: `${productId}-${selectedFormat.value}`, productId: productId, format: selectedFormat.value, price: parseFloat(selectedFormat.dataset.price), name: product.name, description: product.description, quantity: 1 }; // Check if item already exists const existingIndex = this.cart.findIndex(item => item.id === cartItem.id); if (existingIndex > -1) { this.cart[existingIndex].quantity += 1; } else { this.cart.push(cartItem); } this.saveCart(); this.updateCartUI(); this.showNotification(`${product.name} added to your sacred collection!`, 'success'); } async initiateCheckout() { if (this.cart.length === 0) { this.showNotification('Your sacred collection is empty', 'info'); return; } // Show checkout modal document.getElementById('checkoutModal').classList.add('active'); this.renderCheckoutItems(); this.calculateTotal(); } async completePurchase() { const form = document.getElementById('checkoutForm'); const formData = new FormData(form); try { // Create payment intent const response = await fetch('/api/create-payment-intent', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ items: this.cart, customer: { email: formData.get('email'), firstName: formData.get('firstName'), lastName: formData.get('lastName') } }) }); const { clientSecret } = await response.json(); // Confirm payment with Stripe const result = await this.stripe.confirmPayment({ elements: this.elements, clientSecret, confirmParams: { return_url: `${window.location.origin}/thank-you` } }); if (result.error) { this.showNotification(result.error.message, 'error'); } else { // Success - redirect handled by confirmParams this.clearCart(); this.showNotification('Your sacred purchase is complete! Check your email for access details.', 'success'); } } catch (error) { console.error('Payment error:', error); this.showNotification('There was an issue processing your payment. Please try again.', 'error'); } } // Utility methods findProduct(productId) { const allProducts = [ ...this.products.healingJournals, ...this.products.businessSuite, ...this.products.kdpBooks ]; return allProducts.find(p => p.id === productId); } getFormatLabel(format) { const labels = { 'digital-pdf': 'Digital PDF', 'digital-printable': 'Digital Printable', 'digital-bundle': 'Digital Bundle', 'notion-templates': 'Notion Templates', 'print-softcover': 'Print Softcover', 'print-hardcover': 'Print Hardcover', 'print-spiral': 'Print Spiral', 'print-cards': 'Print Cards', 'kdp-paperback': 'Amazon Paperback' }; return labels[format] || format; } saveCart() { localStorage.setItem('mm-sacred-cart', JSON.stringify(this.cart)); } loadCart() { const saved = localStorage.getItem('mm-sacred-cart'); return saved ? JSON.parse(saved) : []; } clearCart() { this.cart = []; this.saveCart(); this.updateCartUI(); } updateCartUI() { const cartCount = document.getElementById('cartCount'); const cartItems = document.getElementById('cartItems'); if (cartCount) { cartCount.textContent = this.cart.reduce((sum, item) => sum + item.quantity, 0); } if (cartItems) { cartItems.innerHTML = this.cart.map(item => this.createCartItem(item)).join(''); } this.calculateTotal(); } createCartItem(item) { return ` <div class="mm-cart-item" data-item-id="${item.id}"> <div class="mm-cart-item-info"> <h4>${item.name}</h4> <p>${this.getFormatLabel(item.format)}</p> </div> <div class="mm-cart-item-actions"> <div class="mm-quantity-controls"> <button class="mm-qty-btn" onclick="sacredCommerce.updateQuantity('${item.id}', ${item.quantity - 1})">-</button> <span class="mm-quantity">${item.quantity}</span> <button class="mm-qty-btn" onclick="sacredCommerce.updateQuantity('${item.id}', ${item.quantity + 1})">+</button> </div> <span class="mm-item-price">$${(item.price * item.quantity).toFixed(2)}</span> <button class="mm-remove-item" onclick="sacredCommerce.removeFromCart('${item.id}')">×</button> </div> </div> `; } calculateTotal() { const total = this.cart.reduce((sum, item) => sum + (item.price * item.quantity), 0); const subtotalElement = document.getElementById('cartSubtotal'); const orderTotalElement = document.getElementById('orderTotal'); if (subtotalElement) subtotalElement.textContent = `$${total.toFixed(2)}`; if (orderTotalElement) orderTotalElement.textContent = `$${total.toFixed(2)}`; return total; } showNotification(message, type = 'info') { // Create and show notification const notification = document.createElement('div'); notification.className = `mm-notification mm-notification-${type}`; notification.textContent = message; document.body.appendChild(notification); setTimeout(() => { notification.classList.add('mm-notification-show'); }, 100); setTimeout(() => { notification.classList.remove('mm-notification-show'); setTimeout(() => notification.remove(), 300); }, 3000); } } // Initialize the sacred commerce system let sacredCommerce; document.addEventListener('DOMContentLoaded', () => { sacredCommerce = new SacredCommerceSystem(); }); ``` **6. SACRED STYLING SYSTEM** ```css /* Sacred Commerce Styling */ .mm-product-card { background: var(--mm-midnight-teal); border-radius: var(--mm-border-radius); overflow: hidden; transition: var(--mm-transition); border: 1px solid rgba(212, 175, 55, 0.2); } .mm-product-card:hover { transform: translateY(-4px); box-shadow: 0 8px 32px rgba(212, 175, 55, 0.3); border-color: var(--mm-gold); } .mm-product-image-container { position: relative; overflow: hidden; } .mm-product-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(10, 25, 47, 0.8); display: flex; align-items: center; justify-content: center; opacity: 0; transition: var(--mm-transition); } .mm-product-card:hover .mm-product-overlay { opacity: 1; } .mm-format-selection { margin: var(--mm-spacing-md) 0; padding: var(--mm-spacing-md); background: rgba(10, 25, 47, 0.3); border-radius: var(--mm-border-radius); } .mm-format-option { display: block; margin-bottom: var(--mm-spacing-sm); cursor: pointer; color: var(--mm-magnolia-white); } .mm-format-option input[type="radio"] { margin-right: var(--mm-spacing-sm); accent-color: var(--mm-gold); } .mm-btn { padding: var(--mm-spacing-md) var(--mm-spacing-lg); border: none; border-radius: var(--mm-border-radius); font-family: 'Montserrat', sans-serif; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; cursor: pointer; transition: var(--mm-transition); text-decoration: none; display: inline-block; text-align: center; } .mm-btn-primary { background: var(--mm-gold); color: var(--mm-midnight-blue); } .mm-btn-primary:hover { background: #f4d03f; transform: translateY(-2px); box-shadow: 0 4px 16px rgba(212, 175, 55, 0.4); } .mm-btn-secondary { background: transparent; color: var(--mm-magnolia-white); border: 2px solid var(--mm-gold); } .mm-btn-secondary:hover { background: var(--mm-gold); color: var(--mm-midnight-blue); } .mm-btn-ghost { background: transparent; color: var(--mm-sage-green); border: 1px solid var(--mm-sage-green); } .mm-btn-ghost:hover { background: var(--mm-sage-green); color: var(--mm-midnight-blue); } .mm-sacred-cart { position: fixed; top: 0; right: -400px; width: 400px; height: 100vh; background: var(--mm-midnight-blue); border-left: 2px solid var(--mm-gold); z-index: 1000; transition: right 0.3s ease; overflow-y: auto; padding: var(--mm-spacing-lg); } .mm-sacred-cart.active { right: 0; } .mm-checkout-modal { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(10, 25, 47, 0.95); z-index: 2000; display: flex; align-items: center; justify-content: center; opacity: 0; visibility: hidden; transition: var(--mm-transition); } .mm-checkout-modal.active { opacity: 1; visibility: visible; } .mm-checkout-container { background: var(--mm-midnight-teal); padding: var(--mm-spacing-lg); border-radius: var(--mm-border-radius); max-width: 600px; width: 90vw; max-height: 90vh; overflow-y: auto; border: 2px solid var(--mm-gold); } .mm-form-group { margin-bottom: var(--mm-spacing-md); } .mm-form-group label { display: block; margin-bottom: var(--mm-spacing-sm); color: var(--mm-magnolia-white); font-weight: 600; } .mm-form-group input { width: 100%; padding: var(--mm-spacing-md); border: 1px solid var(--mm-gold); border-radius: var(--mm-border-radius); background: var(--mm-midnight-blue); color: var(--mm-magnolia-white); font-family: 'Lora', serif; } .mm-form-group input:focus { outline: none; border-color: #f4d03f; box-shadow: 0 0 0 2px rgba(212, 175, 55, 0.3); } .mm-trust-signals { margin-top: var(--mm-spacing-lg); padding-top: var(--mm-spacing-lg); border-top: 1px solid var(--mm-gold); } .mm-trust-item { display: flex; align-items: center; margin-bottom: var(--mm-spacing-sm); color: var(--mm-magnolia-white); font-size: 0.9rem; } .mm-trust-icon { margin-right: var(--mm-spacing-sm); font-size: 1.2rem; } .mm-notification { position: fixed; top: 20px; right: -300px; background: var(--mm-midnight-teal); color: var(--mm-magnolia-white); padding: var(--mm-spacing-md) var(--mm-spacing-lg); border-radius: var(--mm-border-radius); border-left: 4px solid var(--mm-gold); z-index: 3000; transition: right 0.3s ease; max-width: 300px; } .mm-notification-show { right: 20px; } .mm-notification-success { border-left-color: var(--mm-sage-green); } .mm-notification-error { border-left-color: #e74c3c; } /* Mobile Responsive */ @media (max-width: 768px) { .mm-sacred-cart { width: 100vw; right: -100vw; } .mm-checkout-container { width: 95vw; padding: var(--mm-spacing-md); } .mm-product-card { margin-bottom: var(--mm-spacing-md); } .mm-btn { width: 100%; margin-bottom: var(--mm-spacing-sm); } } ``` **INTEGRATION REQUIREMENTS:** 1. **Stripe Integration:** Add Stripe public key and implement payment processing 2. **Shopify Storefront API:** Connect for inventory management and order processing 3. **Email Delivery:** Set up automated email delivery for digital products 4. **Analytics:** Implement tracking for conversions and customer behavior 5. **Customer Accounts:** Create user registration and login system 6. **Mobile Optimization:** Ensure perfect mobile experience for all features **PRESERVE BRAND VOICE:** - Use "Sacred" instead of "Shopping" language throughout - Maintain healing-centered, trauma-informed messaging - Include affirmations and spiritual elements in purchase flow - Ensure accessibility and inclusive design principles Create this complete e-commerce system while maintaining the exact Southern Gothic Digital aesthetic and expanding the functionality to support multi-platform integration with Patreon, Etsy, and KDP. ``` --- ## 🚀 IMPLEMENTATION STRATEGY: ### **Phase 1: Core E-Commerce (This Week)** 1. **Copy the prompt into v0.dev** 2. **Replace placeholder Stripe key with your actual key** 3. **Add your actual product images** 4. **Test all purchase flows** ### **Phase 2: Payment Integration (Next Week)** 1. **Set up Stripe webhook endpoints** 2. **Configure automated email delivery** 3. **Test digital product delivery** 4. **Implement customer accounts** ### **Phase 3: Multi-Platform Integration (Week 3)** 1. **Connect Patreon API for membership verification** 2. **Set up Etsy integration for complementary products** 3. **Add Amazon affiliate tracking for KDP books** 4. **Implement cross-platform analytics** ### **Expected Revenue Impact:** - **Week 1:** $500-1,000 (initial sales) - **Month 1:** $2,000-4,000 (full system active) - **Month 3:** $4,800-8,300 (your target achieved) This transforms your beautiful foundation into a complete sacred commerce ecosystem that honors your healing-centered brand while generating sustainable income! 🌙✨
I'll transform your existing Midnight Magnolia foundation into a complete, functional e-commerce ecosystem while preserving all your beautiful Southern Gothic branding and healing-centered messaging.
You can send messages while the preview loads