How LLC Owners Save on Taxes in 2026

Taxpayer Find more write-offs — search your profession or a specific deduction
Try:
Others Also Use These Strategies
Business IRC §274

Business Meals Deduction

Deduct 50% of the cost of business meals where there is a genuine business discussion. The meal must not be lavish, and the business purpose must be documented.

Eligibility Requirements
  • Meal has a bona fide business purpose
  • Business is discussed before, during, or after the meal
  • Document: who, what business discussed, date, amount
Example Savings Scenario

Spending $20,000/year on business meals = $10,000 deduction, saving $3,700 at a 37% rate.

MERNA Strategy Notes

Entertainment expenses (concerts, sporting events) are 0% deductible since 2018. Meals at entertainment events may still qualify if separately stated on the bill.

Common Mistake: No documentation = no deduction. Keep receipts and notes on business purpose.
UNK Client Win Business Owner / Sales Professional

How a Sales Executive Turned $18,000 in Client Dinners Into a $9,000 Tax Deduction

A UNK client ran a B2B sales consulting firm and spent $18,000/year entertaining clients at restaurants. He had stopped deducting meals after the 2017 tax law changes confused him. Uncle Kam clarified: business meals with clients where business is discussed are still 50% deductible. With proper documentation (date, attendees, business purpose on every receipt), the client deducted $9,000 — saving $3,330 at his 37% rate.

Result: $3,330 in annual tax savings recovered. The client now uses a simple receipt app to capture meal documentation in real time, making the deduction bulletproof.

If you're taking clients to dinner and not deducting it, you're leaving money on the table. Book a call to set up a proper documentation system.

Be the Next Win — Book a Call
Common Questions About Business Meals Deduction
Musician IRC §162 Uncle Kam Clients Only

Touring & Travel Expense Deduction

Self-employed musicians can deduct 100% of transportation costs (flights, train, rental cars, mileage) and lodging for business travel to gigs, tours, recording sessions, and music conferences. Meals are 50% deductible while traveling away from home overnight.

Eligibility Requirements
  • Travel is for a bona fide business purpose (gig, recording, conference)
  • Away from home overnight (for lodging and meal deductions)
  • Self-employed musician with Schedule C income
Example Savings Scenario

A musician who spends $15,000 on touring (flights, hotels, van rental) and $4,000 on meals deducts $15,000 + $2,000 (50% meals) = $17,000, saving $5,950 at 35%.

Unlock the Full Strategy Breakdown — Free

Enter your email for instant access to MERNA strategy notes, IRS red flag warnings, action steps, and implementation guide.

No spam · No obligation · Instant access
Business Expenses IRC §162 Uncle Kam Clients Only

Cell Phone & Mobile Device Deduction

If you use your cell phone for business, you can deduct the business-use percentage of your monthly bill, data plan, and the cost of the device itself. For most self-employed professionals, this is 80–100% of the total cost.

Eligibility Requirements
  • Self-employed, freelancer, or business owner
  • Phone used for business calls, emails, or apps
  • Keep records of business vs personal use percentage
Example Savings Scenario

A freelancer paying $120/month for their phone and using it 90% for business deducts $1,296/year, saving $389–$518 depending on tax bracket.

Unlock the Full Strategy Breakdown — Free

Enter your email for instant access to MERNA strategy notes, IRS red flag warnings, action steps, and implementation guide.

No spam · No obligation · Instant access
Business Expenses IRC §162 Uncle Kam Clients Only

DOT Physical, CDL Fees & Trucking Compliance Deduction

Owner-operator truck drivers can deduct all costs required to maintain their CDL and comply with DOT regulations. This includes DOT physical exams, CDL renewal fees, FMCSA registration fees, IFTA fuel tax permits, drug testing fees, and any other compliance costs required to operate legally.

Eligibility Requirements
  • Owner-operator truck driver (self-employed)
  • Costs required to maintain CDL and DOT compliance
  • Fees paid in the tax year
Example Savings Scenario

An owner-operator spending $1,200/year on DOT physicals, CDL renewal, and FMCSA fees deducts the full amount, saving $360–$480 in taxes.

Unlock the Full Strategy Breakdown — Free

Enter your email for instant access to MERNA strategy notes, IRS red flag warnings, action steps, and implementation guide.

No spam · No obligation · Instant access
Business Expenses IRC §162 Uncle Kam Clients Only

Professional Licenses & Certifications Deduction

If you are required to hold a professional license to practice your trade, the cost of obtaining and renewing that license is fully deductible as a business expense. This includes state bar fees for attorneys, medical license renewals, nursing licenses, contractor licenses, real estate licenses, CPA licenses, and any other required professional credentials.

Eligibility Requirements
  • License required to practice your profession
  • Self-employed or business owner (W-2 employees cannot deduct unreimbursed costs)
  • Renewal fees qualify each year they are paid
Example Savings Scenario

A physician paying $2,500/year in state medical license fees, DEA registration, and board certification renewals saves $750–$1,000 in taxes.

Unlock the Full Strategy Breakdown — Free

Enter your email for instant access to MERNA strategy notes, IRS red flag warnings, action steps, and implementation guide.

No spam · No obligation · Instant access
Truck Driver IRC §162 Uncle Kam Clients Only

CDL Fees, DOT Physical & Trucking Compliance Costs

Commercial Driver License (CDL) fees, DOT physical exam costs, drug testing, FMCSA registration, and any trucking compliance costs are fully deductible. These are required to legally operate as a commercial driver.

Eligibility Requirements
  • Hold or are renewing a Commercial Driver License (CDL)
  • DOT physical is required to maintain your medical certificate
  • Drug testing is required by your employer or FMCSA regulations
  • Expenses are not reimbursed by your employer or carrier
Example Savings Scenario

A trucker spending $800/year on CDL renewal, DOT physical, and drug testing saves $296 in taxes at 37%.

Unlock the Full Strategy Breakdown — Free

Enter your email for instant access to MERNA strategy notes, IRS red flag warnings, action steps, and implementation guide.

No spam · No obligation · Instant access
Truck Driver IRC §179, §168(k) Uncle Kam Clients Only

Semi-Truck, Trailer & Equipment -- Section 179

Owner-operator truck drivers can deduct the full cost of a semi-truck, trailer, and equipment in the year of purchase using Section 179 or bonus depreciation. A $150,000 semi-truck can be fully expensed in year one.

Eligibility Requirements
  • Own and operate as an owner-operator (not a company driver)
  • Truck is used more than 50% for business
  • Truck placed in service during the current tax year
  • Sufficient business income to absorb the deduction (Section 179 cannot create a net loss)
Example Savings Scenario

An owner-operator who buys a $150,000 semi-truck deducts the full $150,000 in year one under Section 179, saving $55,500 in taxes at 37%.

Unlock the Full Strategy Breakdown — Free

Enter your email for instant access to MERNA strategy notes, IRS red flag warnings, action steps, and implementation guide.

No spam · No obligation · Instant access
Business Expenses IRC §162 Uncle Kam Clients Only

Work Boots, Safety Gear & Protective Equipment Deduction

Protective clothing and safety equipment required for your trade or job site is fully deductible. This includes steel-toed work boots, hard hats, safety glasses, hearing protection, gloves, high-visibility vests, respirators, and any other OSHA-required or job-required safety gear. The key test: the gear must be required for the job and not suitable for everyday wear.

Eligibility Requirements
  • Safety gear required for your trade or job site
  • Not suitable for everyday personal use
  • Self-employed contractor or business owner
Example Savings Scenario

A contractor spending $600/year on work boots, gloves, safety glasses, and hard hats deducts the full amount, saving $180–$240 in taxes.

Unlock the Full Strategy Breakdown — Free

Enter your email for instant access to MERNA strategy notes, IRS red flag warnings, action steps, and implementation guide.

No spam · No obligation · Instant access
Nurse IRC §162, §119 Uncle Kam Clients Only

Travel Nurse Tax-Free Housing & Meal Stipends

Travel nurses who maintain a tax home can receive tax-free housing stipends and meal allowances from their staffing agency. These stipends are not included in your taxable income as long as you maintain a permanent tax home and are working away from it.

Eligibility Requirements
  • Working as a travel nurse through a staffing agency
  • Maintain a legitimate tax home (primary residence you return to)
  • Assignment is temporary (generally under 1 year at the same facility)
  • Housing stipend is structured separately from taxable wages in your contract
Example Savings Scenario

A travel nurse receiving $2,000/month in tax-free housing stipends saves $8,880/year in taxes at 37%.

Unlock the Full Strategy Breakdown — Free

Enter your email for instant access to MERNA strategy notes, IRS red flag warnings, action steps, and implementation guide.

No spam · No obligation · Instant access
Mortgage IRC §162 Uncle Kam Clients Only

Realtor & Builder Relationship Marketing

Expenses incurred to build and maintain referral relationships with real estate agents, builders, and financial planners are fully deductible. This includes meals with referral partners (50% deductible), co-branded marketing materials, client appreciation events, and educational seminars you host for Realtors.

Eligibility Requirements
    Example Savings Scenario

    A loan officer spending $500/month on Realtor relationship marketing deducts $6,000/year (meals at 50%, materials at 100%).

    Unlock the Full Strategy Breakdown — Free

    Enter your email for instant access to MERNA strategy notes, IRS red flag warnings, action steps, and implementation guide.

    No spam · No obligation · Instant access
    What Most Taxpayers Don't Know

    Most taxpayers leave the QBI deduction unclaimed — it reduces taxable income by up to 23% starting 2026 under the OBBBA.

    HSA contributions offer a triple tax advantage — deductible, tax-free growth, tax-free withdrawals.

    Charitable donations of appreciated stock avoid capital gains AND generate a full fair-market-value deduction.

    Who Uses This Strategy

    This write-off is commonly used by the following taxpayer profiles. Click to see all strategies for your situation.

    0
    0 write-offs saved
    Tap to view your list

    Your Biggest Missed Deduction Is Probably Locked Above

    Uncle Kam clients save an average of $5,000–$40,000/year. The strategies that make that possible are unlocked on a free strategy call.

    Book A Free Strategy Call Free consultation. No obligation.
    ';// ── Open in a new window and print ─────────────────────────────── var win = window.open('', '_blank', 'width=850,height=700,scrollbars=yes,noopener=0'); if (!win) { // Fallback: inject an iframe for printing if popup is blocked var iframe = document.createElement('iframe'); iframe.style.cssText = 'position:fixed;top:-9999px;left:-9999px;width:850px;height:700px;border:0;'; document.body.appendChild(iframe); iframe.contentDocument.open(); iframe.contentDocument.write(html); iframe.contentDocument.close(); setTimeout(function() { iframe.contentWindow.focus(); iframe.contentWindow.print(); setTimeout(function() { document.body.removeChild(iframe); }, 2000); }, 600); return; } win.document.open(); win.document.write(html); win.document.close(); win.focus(); setTimeout(function() { win.print(); }, 600); }// ── Email Unlock: post to GHL silently, expand locked cards ────────────── function ukwfUnlockStrategies(e) { e.preventDefault(); // Support both the main wall form AND per-card gate forms var form = e ? e.target : null; var gateInput = form ? form.querySelector('.ukwf-gate-email-input') : null; var mainInput = document.getElementById('ukwf-unlock-email'); var emailInput = (gateInput && gateInput.value.trim()) ? gateInput : mainInput; var errorEl = document.getElementById('ukwf-unlock-error'); var email = emailInput ? emailInput.value.trim() : ''; // Also check the gate input if main is empty if (!email && gateInput) email = gateInput.value.trim(); // Basic email validation if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { if (errorEl) errorEl.style.display = 'block'; if (gateInput) { gateInput.style.borderColor = '#ff6b6b'; gateInput.focus(); } else if (emailInput) emailInput.focus(); return; } if (errorEl) errorEl.style.display = 'none'; if (gateInput) gateInput.style.borderColor = ''; // Disable all unlock buttons document.querySelectorAll('.ukwf-email-unlock-btn, .ukwf-gate-email-btn').forEach(function(b) { b.disabled = true; b.textContent = 'Unlocking...'; }); // Send lead to GHL via server-side PHP AJAX (bypasses webhook workflow) var professionEl = document.querySelector('.ukwf-profile-name'); var professionName = professionEl ? professionEl.textContent.trim().replace(/\s*Tax Write-Offs\s*&?\s*Deductions\s*$/i, '').trim() : ''; var nameParts = professionName.split('/'); var ghlFirstName = nameParts[0] ? nameParts[0].trim() : professionName; var ghlLastName = nameParts[1] ? nameParts[1].trim() : 'Tax Write-Off Finder'; var ajaxUrl = (typeof ukwfConfig !== 'undefined' && ukwfConfig.ajaxUrl) ? ukwfConfig.ajaxUrl : '/wp-admin/admin-ajax.php'; var nonce = (typeof ukwfConfig !== 'undefined' && ukwfConfig.leadNonce) ? ukwfConfig.leadNonce : ''; var formData = new FormData(); formData.append('action', 'ukwf_ghl_lead'); formData.append('nonce', nonce); formData.append('email', email); formData.append('firstName', ghlFirstName); formData.append('lastName', ghlLastName); formData.append('profession', professionName); formData.append('source', 'ukwf-unlock'); formData.append('page', window.location.pathname); fetch(ajaxUrl, { method: 'POST', body: formData }).catch(function() {}); // fire-and-forget // Expand all locked cards immediately ukwfDoUnlock(); } function ukwfDoUnlock() { // Hide the email wall var wall = document.getElementById('ukwf-email-unlock-wall'); if (wall) { wall.style.transition = 'opacity 0.3s ease'; wall.style.opacity = '0'; setTimeout(function() { wall.style.display = 'none'; }, 300); } // Unlock all locked cards instantly — no stagger (stagger caused 4+ second delay for 70+ cards) var lockedCards = document.querySelectorAll('.ukwf-result-card--locked'); lockedCards.forEach(function(card) { // Remove locked state — keep collapsed so user can open each card individually card.classList.remove('ukwf-result-card--locked'); card.classList.add('ukwf-result-card--open'); // Clear any inline styles that might block the toggle var body = card.querySelector('.ukwf-result-body'); if (body) { body.style.display = ''; body.style.maxHeight = ''; } // Remove lock badge var badge = card.querySelector('.ukwf-result-lock-badge'); if (badge) badge.style.display = 'none'; // Replace the locked gate with an unlocked badge var gate = card.querySelector('.ukwf-locked-strategy-gate'); if (gate) { gate.innerHTML = '
    Unlocked — tap to expand
    '; } }); // Show success banner var banner = document.getElementById('ukwf-unlock-banner'); if (banner) { banner.style.display = 'flex'; } // Persist unlock in localStorage so it survives refresh, tab close, and navigation // Uses the same ukwfSetUnlocked() that the book-call path uses, which sets // localStorage key 'ukwf_unlocked' = '1'. The main script block already checks // ukwfIsUnlocked() on page load and calls ukwfUnlockAll() automatically. if (typeof ukwfSetUnlocked === 'function') { ukwfSetUnlocked(); } else { try { localStorage.setItem('ukwf_unlocked', '1'); } catch(err) {} } // Also run the main unlock function to handle any card variants we might miss if (typeof ukwfUnlockAll === 'function') { ukwfUnlockAll(); } } // NOTE: Auto-unlock on page load is handled by the main script block which // checks ukwfIsUnlocked() and calls ukwfUnlockAll(). No DOMContentLoaded // listener needed here (it was broken anyway because LiteSpeed defers scripts // past DOMContentLoaded)./* ── Sticky Save Bar ───────────────────────────────────────────────── */ (function() { var SAVED_KEY = 'ukwf_saved_v2'; var bar = document.getElementById('ukwf-sticky-save-bar'); var countEl = document.getElementById('ukwf-sticky-save-count'); var badgeEl = document.getElementById('ukwf-sticky-cart-badge'); var savingsWrap = document.getElementById('ukwf-sticky-save-savings'); var savingsRange = document.getElementById('ukwf-sticky-savings-range'); if (!bar || !countEl) return;var _prevCount = 0;/* Parse a savings string like "$1,200–$4,500/year" -> {min, max} */ function parseSavings(str) { if (!str) return null; var nums = str.replace(/[^0-9]/g, ' ').trim().split(/\s+/).filter(Boolean); var vals = nums.map(function(n) { return parseInt(n, 10); }).filter(function(n) { return !isNaN(n) && n > 0; }); if (vals.length === 0) return null; if (vals.length === 1) return { min: vals[0], max: vals[0] }; return { min: Math.min.apply(null, vals), max: Math.max.apply(null, vals) }; }/* Format a number as $XK or $X.XM */ function fmtMoney(n) { if (n >= 1000000) return '$' + (n / 1000000).toFixed(1).replace(/\.0$/, '') + 'M'; if (n >= 1000) return '$' + Math.round(n / 1000) + 'K'; return '$' + n.toLocaleString(); }/* Animated count-up for a single element */ function animateCount(el, from, to, duration) { if (from === to) { el.textContent = to; return; } var start = null; function step(ts) { if (!start) start = ts; var progress = Math.min((ts - start) / duration, 1); var ease = 1 - Math.pow(1 - progress, 3); el.textContent = Math.round(from + (to - from) * ease); if (progress < 1) requestAnimationFrame(step); else el.textContent = to; } requestAnimationFrame(step); }function getSaved() { try { return JSON.parse(localStorage.getItem(SAVED_KEY) || '[]'); } catch(e) { return []; } }function updateBar() { var saved = getSaved(); var n = saved.length;/* Count-up animation when count changes */ if (n !== _prevCount) { animateCount(countEl, _prevCount, n, 600); if (badgeEl) animateCount(badgeEl, _prevCount, n, 600); /* Pop animation on bar when count increases */ if (n > _prevCount) { bar.classList.remove('ukwf-sticky-bar-pop'); void bar.offsetWidth; bar.classList.add('ukwf-sticky-bar-pop'); } _prevCount = n; }if (n > 0) { bar.classList.add('ukwf-sticky-save-bar--visible');/* Calculate total savings range */ var totalMin = 0, totalMax = 0, hasSavings = false; saved.forEach(function(item) { var p = parseSavings(item.savings || ''); if (p) { totalMin += p.min; totalMax += p.max; hasSavings = true; } });if (hasSavings && savingsWrap && savingsRange) { var rangeStr = totalMin === totalMax ? fmtMoney(totalMin) : fmtMoney(totalMin) + '–' + fmtMoney(totalMax); savingsRange.textContent = rangeStr; savingsWrap.style.display = ''; } else if (savingsWrap) { savingsWrap.style.display = 'none'; } } else { bar.classList.remove('ukwf-sticky-save-bar--visible'); if (savingsWrap) savingsWrap.style.display = 'none'; } }/* Update whenever a save/unsave happens */ window.addEventListener('ukwfSavedChanged', updateBar); /* Cross-tab sync */ window.addEventListener('storage', function(e) { if (e.key === SAVED_KEY) updateBar(); }); /* Expose globally */ window.ukwfStickyBarRefresh = updateBar; updateBar(); })();/* ── CART DRAWER ────────────────────────────────────────────────────── */ (function() { var SAVED_KEY = 'ukwf_saved_v2'; var drawer = document.getElementById('ukwf-cart-drawer'); var overlay = document.getElementById('ukwf-cart-overlay'); var itemsList = document.getElementById('ukwf-cart-items'); var emptyEl = document.getElementById('ukwf-cart-empty'); var footerEl = document.getElementById('ukwf-cart-footer'); var savingsStrip = document.getElementById('ukwf-cart-savings-strip'); var savingsAmount = document.getElementById('ukwf-cart-savings-amount'); var headerSub = document.getElementById('ukwf-cart-header-sub'); var footerCount = document.getElementById('ukwf-cart-footer-count'); if (!drawer) return;function getSaved() { try { return JSON.parse(localStorage.getItem(SAVED_KEY) || '[]'); } catch(e) { return []; } } function setSaved(arr) { localStorage.setItem(SAVED_KEY, JSON.stringify(arr)); window.dispatchEvent(new CustomEvent('ukwfSavedChanged')); if (typeof window.ukwfStickyBarRefresh === 'function') window.ukwfStickyBarRefresh(); if (typeof window.ukwfSavedBadgeRefresh === 'function') window.ukwfSavedBadgeRefresh(); } function parseSavings(str) { if (!str) return null; var nums = str.replace(/[^0-9]/g, ' ').trim().split(/\s+/).filter(Boolean); var vals = nums.map(function(n){ return parseInt(n,10); }).filter(function(n){ return !isNaN(n) && n > 0; }); if (!vals.length) return null; if (vals.length === 1) return { min: vals[0], max: vals[0] }; return { min: Math.min.apply(null,vals), max: Math.max.apply(null,vals) }; } function fmtMoney(n) { if (n >= 1000000) return '$' + (n/1000000).toFixed(1).replace(/\.0$/,'') + 'M'; if (n >= 1000) return '$' + Math.round(n/1000) + 'K'; return '$' + n.toLocaleString(); } function getCatIcon(cat) { var icons = { 'vehicle':'', 'home':'', 'travel':'', 'equipment':'', 'health':'', 'retirement':'', 'education':'', 'real estate':'' }; var k = (cat || '').toLowerCase(); for (var key in icons) { if (k.indexOf(key) !== -1) return icons[key]; } return ''; } function renderItems() { var saved = getSaved(); var n = saved.length; /* Update header sub */ if (headerSub) headerSub.textContent = n + ' deduction' + (n !== 1 ? 's' : '') + ' saved'; /* Show/hide empty state */ if (emptyEl) emptyEl.style.display = n === 0 ? '' : 'none'; if (footerEl) footerEl.style.display = n === 0 ? 'none' : ''; /* Savings strip */ var totalMin = 0, totalMax = 0, hasSavings = false; saved.forEach(function(item) { var p = parseSavings(item.savings || ''); if (p) { totalMin += p.min; totalMax += p.max; hasSavings = true; } }); if (hasSavings && savingsStrip) { savingsStrip.style.display = ''; var rangeStr = totalMin === totalMax ? fmtMoney(totalMin) : fmtMoney(totalMin) + ' – ' + fmtMoney(totalMax); if (savingsAmount) savingsAmount.textContent = rangeStr; } else if (savingsStrip) { savingsStrip.style.display = 'none'; } /* Footer count */ if (footerCount) footerCount.textContent = n > 0 ? n + ' write-off' + (n !== 1 ? 's' : '') + ' in your list' : ''; /* Remove existing items (keep empty state) */ var existing = itemsList ? itemsList.querySelectorAll('.ukwf-cart-item') : []; existing.forEach(function(el) { el.parentNode.removeChild(el); }); /* Render each item */ saved.forEach(function(item, idx) { var div = document.createElement('div'); div.className = 'ukwf-cart-item'; div.style.animationDelay = (idx * 0.04) + 's'; div.innerHTML = '
    ' + getCatIcon(item.category) + '
    ' + '
    ' + '
    ' + escHtml(item.name || item.slug) + '
    ' + (item.category ? '
    ' + escHtml(item.category) + '
    ' : '') + (item.savings ? '
    ' + escHtml(item.savings) + '/yr
    ' : '') + '
    ' + ''; /* Remove button handler */ div.querySelector('.ukwf-cart-item-remove').addEventListener('click', function() { var slug = this.getAttribute('data-slug'); var arr = getSaved().filter(function(i){ return i.slug !== slug; }); setSaved(arr); /* Animate out */ div.style.transition = 'opacity 0.18s, transform 0.18s'; div.style.opacity = '0'; div.style.transform = 'translateX(20px)'; setTimeout(function() { renderItems(); }, 180); /* Also update save buttons on page */ document.querySelectorAll('.ukwf-card-save-btn[data-slug="' + slug + '"]').forEach(function(btn) { btn.classList.remove('ukwf-card-save-btn--saved'); btn.setAttribute('aria-pressed','false'); var lbl = btn.querySelector('.ukwf-card-save-label'); if (lbl) lbl.textContent = 'Save'; }); }); if (itemsList) itemsList.appendChild(div); }); } function escHtml(s) { return String(s).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); } function escAttr(s) { return String(s).replace(/"/g,'"').replace(/'/g,'''); } /* Open / close */ window.ukwfCartDrawerOpen = function() { renderItems(); if (drawer) drawer.classList.add('ukwf-cart-drawer--open'); if (overlay) overlay.classList.add('ukwf-cart-overlay--open'); document.body.style.overflow = 'hidden'; }; window.ukwfCartDrawerClose = function() { if (drawer) drawer.classList.remove('ukwf-cart-drawer--open'); if (overlay) overlay.classList.remove('ukwf-cart-overlay--open'); document.body.style.overflow = ''; }; window.ukwfCartClearAll = function() { if (!confirm('Remove all saved write-offs?')) return; setSaved([]); renderItems(); }; /* Keyboard close */ document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && drawer && drawer.classList.contains('ukwf-cart-drawer--open')) { window.ukwfCartDrawerClose(); } }); /* Re-render when saves change */ window.addEventListener('ukwfSavedChanged', function() { if (drawer && drawer.classList.contains('ukwf-cart-drawer--open')) { renderItems(); } }); window.addEventListener('storage', function(e) { if (e.key === SAVED_KEY && drawer && drawer.classList.contains('ukwf-cart-drawer--open')) { renderItems(); } }); })();/* ── CARD SAVE BUTTONS ──────────────────────────────────────────────── */ (function() { var SAVED_KEY = 'ukwf_saved_v2';function getSaved() { try { return JSON.parse(localStorage.getItem(SAVED_KEY) || '[]'); } catch(e) { return []; } } function setSaved(arr) { localStorage.setItem(SAVED_KEY, JSON.stringify(arr)); } function isSaved(slug) { return getSaved().some(function(i) { return i.slug === slug; }); } function updateBtn(btn) { var slug = btn.getAttribute('data-slug'); var saved = isSaved(slug); btn.classList.toggle('ukwf-card-save-btn--saved', saved); btn.setAttribute('aria-pressed', saved ? 'true' : 'false'); var label = btn.querySelector('.ukwf-card-save-label'); if (label) label.textContent = saved ? 'Saved' : 'Save'; } function initAllBtns() { document.querySelectorAll('.ukwf-card-save-btn').forEach(function(btn) { updateBtn(btn); btn.addEventListener('click', function(e) { e.stopPropagation(); var slug = btn.getAttribute('data-slug'); var name = btn.getAttribute('data-name'); var cat = btn.getAttribute('data-category') || ''; var savings = btn.getAttribute('data-savings') || ''; var saved = getSaved(); var idx = saved.findIndex(function(i) { return i.slug === slug; }); if (idx === -1) { saved.push({ slug: slug, name: name, category: cat, savings: savings, savedAt: Date.now() }); } else { saved.splice(idx, 1); } setSaved(saved); updateBtn(btn); /* Sync badge and sticky bar */ window.dispatchEvent(new CustomEvent('ukwfSavedChanged')); if (typeof window.ukwfSavedBadgeRefresh === 'function') window.ukwfSavedBadgeRefresh(); if (typeof window.ukwfStickyBarRefresh === 'function') window.ukwfStickyBarRefresh(); }); }); } /* Init on load and re-sync on saved changes from autocomplete */ if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initAllBtns); } else { initAllBtns(); } window.addEventListener('ukwfSavedChanged', function() { document.querySelectorAll('.ukwf-card-save-btn').forEach(updateBtn); }); })();