Online Shopping, Delivered to You
CARLOSHOP
YOUR PROXY BUYER

We buy it. You receive it. No overseas card needed — just send us the link and we handle the rest.

◈ How it works

You want to buy something online but you don't have the Visa card to do so? Buy at Carloshop — fast delivery with a small fee depending on your order price. We purchase it for you, then ship it straight to your door.

◈ Why Carloshop
EVERYTHING YOU NEED
🌐
Any Online Store

We can buy from virtually any website that accepts Visa — just send us the link and product details.

Fast Turnaround

Orders are placed quickly after confirmation. Your package ships within 24 hours of purchase.

💳
No Card Required

No overseas card, no Visa, no problem. We handle the payment — you just pay us the total + a small fee.

📦
Tracked Delivery

Every order is tracked from purchase to delivery. You'll always know where your package is.

🔒
Secure & Trusted

Your order details are private. We only share what's needed to complete your purchase.

📉
Tiered Fees

The bigger your order, the lower the fee rate. Orders over $100 ship with zero handling fee.

How it works
01

Create a free account — sign up in seconds. No payment info needed upfront.

02

Browse or request — pick from our listed products or tell us exactly what you want and where to find it.

03

Place your order — fill in your delivery details and any notes. Your order goes straight to us.

04

We buy & ship it — we purchase the item and send it your way. Fast, simple, done.

◈ Transparent Pricing
FEE SCHEDULE

We charge a small handling fee to cover the cost of buying on your behalf. The fee scales down the more you spend — bigger orders cost proportionally less. Orders over $100 have no fee at all.

Order Subtotal
Handling Fee
You Pay Extra
Under $10
25%
e.g. $8 → +$2.00
$10 – $29.99
20%
e.g. $20 → +$4.00
$30 – $49.99
15%
e.g. $40 → +$6.00
$50 – $74.99
10%
e.g. $60 → +$6.00
$75 – $99.99
7.5%
e.g. $80 → +$6.00
$100 and over
FREE ✦
No handling fee
◈ Fees are calculated on your order subtotal, before shipping. Delivery charges from the original store are passed through at cost.
◈ Example Order — $45 Item
Item price$45.00
Handling fee (15%)$6.75
You pay total$51.75

Ready to place an order? Create a free account and browse what we have available — or tell us exactly what you need.

CARLOSHOP
Next-Gen Commerce Platform
Username
Password
Invalid credentials. Access denied.
◈ CARLOSHOP ONLINE ◈ FREE HANDLING OVER $100 ◈ SECURE CHECKOUT ◈ TIERED PRICING ACTIVE ◈ CARLOSHOP ONLINE ◈ FREE HANDLING OVER $100 ◈ SECURE CHECKOUT ◈ TIERED PRICING ACTIVE
Handling fees: Under $10 → +25% $10–$29 → +20% $30–$49 → +15% $50–$74 → +10% $75–$99 → +7.5% $100+ → no fee
Browse by Category
🛍️
Temu Order
Find the item on Temu, paste the link, enter the price, and choose delivery.
Temu Product Link
Item Price on Temu ($)
Item Description (optional)
Delivery Method
🏠
Home
🏫
School
Your Name
Phone / Contact
🎁
Gift Cards
Select a gift card to order. Prices set by Carloshop.
◈ No gift cards listed yet. Check back soon!
Other Request
Have something special in mind? Tell us what you need, the price you expect, and any details.
What do you want?
Expected Price ($)
Description / Details
Your Name
Phone / Contact
◈ Cart
◈ Your Order Details

Tell us where to deliver and anything else we need to know.

Your Name
Delivery Address
Phone / Contact
Extra Notes (optional)
Order Placed!
Your order has been sent to Carloshop.
We'll be in touch shortly to confirm and arrange payment.
◈ My Orders
/* ─── PAGES ─── */ function showPage(id) { document.querySelectorAll('.page').forEach(p => p.classList.remove('active')); document.getElementById(id).classList.add('active'); window.scrollTo(0, 0); } /* ─── AUTH ─── */ function switchTab(tab) { document.getElementById('tab-login').style.display = tab === 'login' ? 'block' : 'none'; document.getElementById('tab-signup').style.display = tab === 'signup' ? 'block' : 'none'; document.querySelectorAll('.auth-tab').forEach((t, i) => { t.classList.toggle('active', (tab === 'login' && i === 0) || (tab === 'signup' && i === 1)); }); } function doLogin() { const u = document.getElementById('login-user').value.trim(); const p = document.getElementById('login-pass').value; const err = document.getElementById('login-error'); if (!u || !p) { err.textContent = 'Enter username and password.'; err.classList.add('show'); return; } err.classList.remove('show'); const isOwner = (u === OWNER.username && p === OWNER.password); const isUser = users.find(x => x.username === u && x.password === p); if (!isOwner && !isUser) { err.textContent = 'Invalid credentials. Access denied.'; err.classList.add('show'); return; } currentUser = { username: u, isOwner: isOwner }; enterShop(); } function doSignup() { const u = document.getElementById('signup-user').value.trim(); const p = document.getElementById('signup-pass').value; const p2 = document.getElementById('signup-pass2').value; const err = document.getElementById('signup-error'); if (!u || !p) { err.textContent = 'Username and password required.'; err.classList.add('show'); return; } if (u.length < 3) { err.textContent = 'Username must be at least 3 characters.'; err.classList.add('show'); return; } if (p.length < 6) { err.textContent = 'Password must be at least 6 characters.'; err.classList.add('show'); return; } if (p !== p2) { err.textContent = 'Passwords do not match.'; err.classList.add('show'); return; } if (u === OWNER.username) { err.textContent = 'That username is taken.'; err.classList.add('show'); return; } if (users.find(x => x.username === u)) { err.textContent = 'Username already exists.'; err.classList.add('show'); return; } users.push({ username: u, password: p }); saveUsers(); err.classList.remove('show'); currentUser = { username: u, isOwner: false }; enterShop(); } function doLogout() { currentUser = null; cart = {}; showPage('page-home'); document.getElementById('login-user').value = ''; document.getElementById('login-pass').value = ''; document.getElementById('login-error').classList.remove('show'); updateCartBadge(); } /* ─── SHOP ─── */ function fmt(n) { return '$' + n.toFixed(2); } function enterShop() { showPage('page-shop'); document.getElementById('topbar-username').textContent = currentUser.username; document.getElementById('owner-pill').style.display = currentUser.isOwner ? 'inline-flex' : 'none'; document.getElementById('owner-panel').style.display = currentUser.isOwner ? 'block' : 'none'; document.getElementById('orders-panel').style.display = currentUser.isOwner ? 'block' : 'none'; document.getElementById('my-orders-btn').style.display = currentUser.isOwner ? 'none' : 'inline-flex'; document.getElementById('customer-shop-section').style.display = currentUser.isOwner ? 'none' : 'block'; document.getElementById('owner-products-section').style.display = currentUser.isOwner ? 'block' : 'none'; document.getElementById('fee-editor-panel').style.display = currentUser.isOwner ? 'block' : 'none'; if (currentUser.isOwner) { renderOrders(); renderProducts(); renderFeeEditor(); } else renderGiftCards(); } function renderProducts() { const grid = document.getElementById('products-grid'); document.getElementById('item-count').textContent = items.length + ' item' + (items.length !== 1 ? 's' : ''); if (items.length === 0) { grid.innerHTML = `

${currentUser.isOwner ? '◈ No items yet. Add your first product above.' : '◈ No products available yet.'}

`; return; } grid.innerHTML = items.map((item, idx) => `
◈ SKU-${String(idx+1).padStart(4,'0')}
${item.emoji || '📦'}
${item.name}
${item.desc}
${currentUser.isOwner ? `` : ''}
`).join(''); } function addItem() { const emoji = document.getElementById('new-emoji').value.trim() || '📦'; const name = document.getElementById('new-name').value.trim(); const desc = document.getElementById('new-desc').value.trim(); const priceRaw = parseFloat(document.getElementById('new-price').value); const err = document.getElementById('add-error'); if (!name) { err.textContent = 'Item name required.'; err.classList.add('show'); return; } if (isNaN(priceRaw) || priceRaw <= 0) { err.textContent = 'Enter a valid price.'; err.classList.add('show'); return; } err.classList.remove('show'); items.push({ emoji, name, desc: desc || 'No description.', price: priceRaw }); saveItems(); document.getElementById('new-emoji').value = ''; document.getElementById('new-name').value = ''; document.getElementById('new-desc').value = ''; document.getElementById('new-price').value = ''; renderProducts(); showToast('Item added: ' + name); } function removeItem(idx) { const name = items[idx].name; items.splice(idx, 1); delete cart[idx]; const newCart = {}; Object.keys(cart).forEach(k => { const ki = parseInt(k); if (ki < idx) newCart[ki] = cart[ki]; else if (ki > idx) newCart[ki - 1] = cart[ki]; }); cart = newCart; saveItems(); renderProducts(); updateCartBadge(); showToast('Removed: ' + name); } /* ─── CART ─── */ function addToCart(idx) { cart[idx] = (cart[idx] || 0) + 1; updateCartBadge(); showToast('Added: ' + items[idx].name); } function changeQty(idx, delta) { cart[idx] = (cart[idx] || 0) + delta; if (cart[idx] <= 0) delete cart[idx]; updateCartBadge(); renderCartContents(); } function updateCartBadge() { const total = Object.values(cart).reduce((a, b) => a + b, 0); document.getElementById('cart-badge').textContent = total; } function openCart() { document.getElementById('confirm-screen').classList.remove('show'); document.getElementById('order-form-screen').classList.remove('show'); document.getElementById('cart-summary').style.display = 'none'; document.getElementById('cart-overlay').classList.add('open'); renderCartContents(); } function closeCart() { document.getElementById('cart-overlay').classList.remove('open'); } function handleOverlayClick(e) { if (e.target === document.getElementById('cart-overlay')) closeCart(); } function renderCartContents() { const wrap = document.getElementById('cart-items-wrap'); const summary = document.getElementById('cart-summary'); const keys = Object.keys(cart).map(Number).filter(k => cart[k] > 0 && items[k]); if (keys.length === 0) { wrap.innerHTML = '
◈ Cart is empty
'; summary.style.display = 'none'; return; } let subtotal = 0; wrap.innerHTML = keys.map(k => { const it = items[k]; const line = it.price * cart[k]; subtotal += line; return `
${it.emoji || '📦'}
${it.name}
${fmt(it.price)} × ${cart[k]}
${cart[k]}
`; }).join(''); const rate = getSurchargeRate(subtotal); const fee = subtotal * rate; const total = subtotal + fee; const pctStr = rate === 0 ? 'no fee' : ((rate * 100) % 1 === 0 ? (rate * 100) + '%' : (rate * 100).toFixed(1) + '%'); document.getElementById('s-sub').textContent = fmt(subtotal); document.getElementById('s-tag').textContent = pctStr; document.getElementById('s-fee').textContent = fmt(fee); document.getElementById('s-total').textContent = fmt(total); summary.style.display = 'flex'; } /* ─── ORDER FORM ─── */ function showOrderForm() { // Snapshot cart for the message const keys = Object.keys(cart).map(Number).filter(k => cart[k] > 0 && items[k]); let subtotal = 0; const lines = keys.map(k => { const it = items[k]; const line = it.price * cart[k]; subtotal += line; return `${it.emoji || '📦'} ${it.name} x${cart[k]} — ${fmt(line)}`; }); const rate = getSurchargeRate(subtotal); const fee = subtotal * rate; const total = subtotal + fee; const pctStr = rate === 0 ? 'No fee' : ((rate * 100) % 1 === 0 ? (rate * 100) + '%' : (rate * 100).toFixed(1) + '%'); pendingCartSnapshot = { lines, subtotal, fee, total, pctStr }; document.getElementById('cart-summary').style.display = 'none'; document.getElementById('cart-items-wrap').innerHTML = ''; document.getElementById('order-form-screen').classList.add('show'); document.getElementById('order-summary-preview').innerHTML = lines.join('
') + `
─────────────────
Subtotal: ${fmt(subtotal)}
Handling (${pctStr}): ${fmt(fee)}
Total: ${fmt(total)}`; } function cancelOrderForm() { document.getElementById('order-form-screen').classList.remove('show'); document.getElementById('cart-summary').style.display = 'flex'; renderCartContents(); } async function doCheckout() { const name = document.getElementById('order-name').value.trim(); const address = document.getElementById('order-address').value.trim(); const phone = document.getElementById('order-phone').value.trim(); const notes = document.getElementById('order-notes').value.trim(); const err = document.getElementById('order-error'); if (!name) { err.textContent = 'Please enter your name.'; err.classList.add('show'); return; } if (!address) { err.textContent = 'Please enter your delivery address.'; err.classList.add('show'); return; } if (!phone) { err.textContent = 'Please enter a contact number.'; err.classList.add('show'); return; } err.classList.remove('show'); const snap = pendingCartSnapshot; const order = { id: 'ORD-' + Date.now(), time: new Date().toLocaleString(), username: currentUser.username, name, address, phone, notes, lines: snap.lines, subtotal: snap.subtotal, fee: snap.fee, total: snap.total, pctStr: snap.pctStr, status: 'awaiting_payment' }; // Save to localStorage const orders = JSON.parse(localStorage.getItem('cs_orders') || '[]'); orders.unshift(order); localStorage.setItem('cs_orders', JSON.stringify(orders)); cart = {}; updateCartBadge(); document.getElementById('order-form-screen').classList.remove('show'); document.getElementById('confirm-screen').classList.add('show'); // Reset form ['order-name','order-address','order-phone','order-notes'].forEach(id => document.getElementById(id).value = ''); } function resetAfterCheckout() { document.getElementById('confirm-screen').classList.remove('show'); closeCart(); } /* ─── OWNER PANEL TABS ─── */ function switchOwnerTab(tab) { document.querySelectorAll('.owner-cat-tab').forEach((t,i) => { t.classList.toggle('active', (tab==='products'&&i===0)||(tab==='giftcards'&&i===1)); }); document.getElementById('owner-tab-products').classList.toggle('active', tab==='products'); document.getElementById('owner-tab-giftcards').classList.toggle('active', tab==='giftcards'); } /* ─── CUSTOMER CATEGORY TABS ─── */ function switchCat(cat) { ['temu','giftcard','other'].forEach(c => { document.getElementById('cat-'+c).classList.toggle('active', c===cat); document.getElementById('cat-btn-'+c).classList.toggle('active', c===cat); }); } let selectedDelivery = 'home'; function selectDelivery(method) { selectedDelivery = method; document.getElementById('del-home').classList.toggle('selected', method==='home'); document.getElementById('del-school').classList.toggle('selected', method==='school'); } /* ─── GIFT CARDS ─── */ let giftCards = JSON.parse(localStorage.getItem('cs_giftcards') || '[]'); function saveGiftCards() { localStorage.setItem('cs_giftcards', JSON.stringify(giftCards)); } function addGiftCard() { const emoji = document.getElementById('gc-emoji').value.trim() || '🎁'; const name = document.getElementById('gc-name').value.trim(); const desc = document.getElementById('gc-desc').value.trim(); const price = parseFloat(document.getElementById('gc-price').value); const err = document.getElementById('gc-error'); if (!name) { err.textContent = 'Card name required.'; err.classList.add('show'); return; } if (isNaN(price) || price <= 0) { err.textContent = 'Enter a valid price.'; err.classList.add('show'); return; } err.classList.remove('show'); giftCards.push({ emoji, name, desc: desc || '', price }); saveGiftCards(); ['gc-emoji','gc-name','gc-desc','gc-price'].forEach(id => document.getElementById(id).value = ''); showToast('Gift card added: ' + name); } function renderGiftCards() { const grid = document.getElementById('gc-grid'); if (!grid) return; if (giftCards.length === 0) { grid.innerHTML = '
◈ No gift cards listed yet. Check back soon!
'; return; } grid.innerHTML = giftCards.map((gc, idx) => `
${gc.emoji}
${gc.name}
${gc.desc ? `
${gc.desc}
` : ''}
${fmt(gc.price)}
`).join(''); } /* ─── PLACE ORDERS ─── */ function placeTemuOrder() { const link = document.getElementById('temu-link').value.trim(); const price = parseFloat(document.getElementById('temu-price').value); const desc = document.getElementById('temu-desc').value.trim(); const name = document.getElementById('temu-name').value.trim(); const phone = document.getElementById('temu-phone').value.trim(); const err = document.getElementById('temu-error'); if (!link) { err.textContent = 'Please paste the Temu product link.'; err.classList.add('show'); return; } if (isNaN(price) || price <= 0) { err.textContent = 'Enter a valid item price.'; err.classList.add('show'); return; } if (!name) { err.textContent = 'Please enter your name.'; err.classList.add('show'); return; } if (!phone) { err.textContent = 'Please enter a contact number.'; err.classList.add('show'); return; } err.classList.remove('show'); const rate = getSurchargeRate(price); const fee = price * rate; const total = price + fee; const pctStr = rate === 0 ? 'No fee' : ((rate*100)%1===0?(rate*100)+'%':(rate*100).toFixed(1)+'%'); const order = { id: 'ORD-' + Date.now(), time: new Date().toLocaleString(), username: currentUser.username, category: 'temu', name, phone, temuLink: link, lines: [`🛍️ Temu Order — ${desc || 'See link below'}`, `📦 Delivery: ${selectedDelivery === 'home' ? '🏠 Home' : '🏫 School'}`], subtotal: price, fee, total, pctStr, status: 'awaiting_payment' }; saveOrderToStorage(order); ['temu-link','temu-price','temu-desc','temu-name','temu-phone'].forEach(id => document.getElementById(id).value = ''); showOrderConfirmToast(); } function placeGiftCardOrder(gcIdx) { const gc = giftCards[gcIdx]; const username = currentUser.username; const rate = getSurchargeRate(gc.price); const fee = gc.price * rate; const total = gc.price + fee; const pctStr = rate === 0 ? 'No fee' : ((rate*100)%1===0?(rate*100)+'%':(rate*100).toFixed(1)+'%'); const order = { id: 'ORD-' + Date.now(), time: new Date().toLocaleString(), username, category: 'giftcard', name: username, phone: '—', lines: [`${gc.emoji} ${gc.name}${gc.desc ? ' — ' + gc.desc : ''}`], subtotal: gc.price, fee, total, pctStr, status: 'awaiting_payment' }; saveOrderToStorage(order); showOrderConfirmToast(); } function placeOtherOrder() { const item = document.getElementById('other-item').value.trim(); const price = parseFloat(document.getElementById('other-price').value); const desc = document.getElementById('other-desc').value.trim(); const name = document.getElementById('other-name').value.trim(); const phone = document.getElementById('other-phone').value.trim(); const err = document.getElementById('other-error'); if (!item) { err.textContent = 'Please describe what you want.'; err.classList.add('show'); return; } if (isNaN(price) || price <= 0) { err.textContent = 'Enter the expected price.'; err.classList.add('show'); return; } if (!name) { err.textContent = 'Please enter your name.'; err.classList.add('show'); return; } if (!phone) { err.textContent = 'Please enter a contact number.'; err.classList.add('show'); return; } err.classList.remove('show'); const rate = getSurchargeRate(price); const fee = price * rate; const total = price + fee; const pctStr = rate === 0 ? 'No fee' : ((rate*100)%1===0?(rate*100)+'%':(rate*100).toFixed(1)+'%'); const order = { id: 'ORD-' + Date.now(), time: new Date().toLocaleString(), username: currentUser.username, category: 'other', name, phone, lines: [`✨ ${item}`, desc ? `📝 ${desc}` : ''], subtotal: price, fee, total, pctStr, status: 'awaiting_payment' }; saveOrderToStorage(order); ['other-item','other-price','other-desc','other-name','other-phone'].forEach(id => document.getElementById(id).value = ''); showOrderConfirmToast(); } function saveOrderToStorage(order) { const orders = JSON.parse(localStorage.getItem('cs_orders') || '[]'); orders.unshift(order); localStorage.setItem('cs_orders', JSON.stringify(orders)); } function showOrderConfirmToast() { showToast('Order placed! We\'ll be in touch shortly.'); } /* ─── COPY TEMU LINK ─── */ function copyTemuLink(url, btn) { navigator.clipboard.writeText(url).then(() => { btn.textContent = 'Copied!'; btn.classList.add('copied'); setTimeout(() => { btn.textContent = 'Copy'; btn.classList.remove('copied'); }, 2000); }).catch(() => { // fallback const ta = document.createElement('textarea'); ta.value = url; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); document.body.removeChild(ta); btn.textContent = 'Copied!'; btn.classList.add('copied'); setTimeout(() => { btn.textContent = 'Copy'; btn.classList.remove('copied'); }, 2000); }); } /* ─── FEE EDITOR ─── */ const DEFAULT_FEES = [ { label: 'Under $10', max: 10, pct: 25 }, { label: '$10 – $29.99', max: 30, pct: 20 }, { label: '$30 – $49.99', max: 50, pct: 15 }, { label: '$50 – $74.99', max: 75, pct: 10 }, { label: '$75 – $99.99', max: 100, pct: 7.5 }, { label: '$100 and over',max: Infinity, pct: 0 } ]; let feeConfig = JSON.parse(localStorage.getItem('cs_fees') || 'null') || DEFAULT_FEES.map(f => ({...f})); function getSurchargeRate(sub) { for (const tier of feeConfig) { if (sub < tier.max) return tier.pct / 100; } return 0; } function saveFeeConfig() { localStorage.setItem('cs_fees', JSON.stringify(feeConfig)); } function renderFeeEditor() { const wrap = document.getElementById('fee-rows-wrap'); if (!wrap) return; wrap.innerHTML = feeConfig.map((tier, i) => `
${tier.label}
% fee
`).join(''); renderTierBar(); } function saveFees() { let valid = true; feeConfig.forEach((tier, i) => { const val = parseFloat(document.getElementById('fee-pct-' + i).value); if (isNaN(val) || val < 0 || val > 100) { valid = false; return; } tier.pct = val; }); if (!valid) { showToast('Invalid fee value — use 0–100.'); return; } saveFeeConfig(); renderTierBar(); showToast('Fees saved!'); } function renderTierBar() { const bar = document.getElementById('tier-bar-inner'); if (!bar) return; bar.innerHTML = feeConfig.map(t => `${t.label} → ${t.pct === 0 ? 'no fee' : '+' + t.pct + '%'}` ).join(''); } // Render tier bar on load for all users document.addEventListener('DOMContentLoaded', renderTierBar); /* ─── ORDERS (OWNER) ─── */ function loadOrders() { return JSON.parse(localStorage.getItem('cs_orders') || '[]'); } function saveOrders(orders) { localStorage.setItem('cs_orders', JSON.stringify(orders)); } function renderOrders() { const orders = loadOrders(); const badge = document.getElementById('orders-badge'); const list = document.getElementById('orders-list'); badge.textContent = orders.length; if (orders.length === 0) { list.innerHTML = '
◈ No orders yet.
'; return; } const statusLabel = { 'awaiting_payment': 'Awaiting Payment', 'payment_received': 'Payment Received', 'processing': 'Processing Order', 'shipped': 'Shipped' }; const statusClass = { 'awaiting_payment': 'awaiting_payment', 'payment_received': 'payment_received', 'processing': 'processing', 'shipped': 'shipped' }; list.innerHTML = orders.map((o, idx) => `
${o.id}${o.category==='temu'?'🛍️ TEMU':o.category==='giftcard'?'🎁 GIFT CARD':'✨ OTHER'}
${o.time}
👤 ${o.username} — ${o.name}  |  📞 ${o.phone}
📍 ${o.address}
${o.lines.map(l => `
◈ ${l}
`).join('')} ${o.temuLink ? `` : ''}
Subtotal: ${fmt(o.subtotal)}
Fee (${o.pctStr}): ${fmt(o.fee)}
Total: ${fmt(o.total)}
${o.notes ? `
📝 ${o.notes}
` : ''}
${statusLabel[o.status] || 'Awaiting Payment'}
`).join(''); } function cycleOrderStatus(idx) { const orders = loadOrders(); const cycle = { 'awaiting_payment': 'payment_received', 'payment_received': 'processing', 'processing': 'shipped', 'shipped': 'awaiting_payment' }; orders[idx].status = cycle[orders[idx].status] || 'payment_received'; saveOrders(orders); renderOrders(); showToast('Status updated.'); } function deleteOrder(idx) { const orders = loadOrders(); orders.splice(idx, 1); saveOrders(orders); renderOrders(); showToast('Order removed.'); } function clearAllOrders() { if (!confirm('Clear all orders? This cannot be undone.')) return; localStorage.removeItem('cs_orders'); renderOrders(); showToast('All orders cleared.'); } /* ─── MY ORDERS (CUSTOMER) ─── */ function openMyOrders() { document.getElementById('myorders-overlay').classList.add('open'); renderMyOrders(); } function closeMyOrders() { document.getElementById('myorders-overlay').classList.remove('open'); } function closeMyOrdersOverlay(e) { if (e.target === document.getElementById('myorders-overlay')) closeMyOrders(); } function renderMyOrders() { const all = loadOrders(); const mine = all.filter(o => o.username === currentUser.username); const list = document.getElementById('myorders-list'); if (mine.length === 0) { list.innerHTML = '
◈ No orders yet.
Place an order to track it here.
'; return; } const steps = [ { key: 'awaiting_payment', label: 'Awaiting Payment' }, { key: 'payment_received', label: 'Payment Received' }, { key: 'processing', label: 'Processing' }, { key: 'shipped', label: 'Shipped' } ]; const stepOrder = steps.map(s => s.key); list.innerHTML = mine.map(o => { const currentIdx = stepOrder.indexOf(o.status); const trackHTML = steps.map((s, i) => { let cls = ''; if (i < currentIdx) cls = 'done'; else if (i === currentIdx) cls = 'active'; const arrow = i < steps.length - 1 ? '' : ''; return `${s.label}${arrow}`; }).join(''); return `
${o.id}
${o.time}
${o.lines.map(l => '◈ ' + l).join('
')}
Total: ${fmt(o.total)}
Order Status
${trackHTML}
`; }).join(''); } /* ─── TOAST (end) ─── */ let toastTimer; function showToast(msg) { const t = document.getElementById('toast'); t.textContent = '◈ ' + msg; t.classList.add('show'); clearTimeout(toastTimer); toastTimer = setTimeout(() => t.classList.remove('show'), 2200); } /* ─── ENTER KEY ─── */ document.addEventListener('keydown', e => { if (e.key === 'Enter') { const tab = document.querySelector('.auth-tab.active'); if (tab && tab.textContent.toLowerCase().includes('login')) doLogin(); else if (tab) doSignup(); } });