How LLC Owners Save on Taxes in 2026

Real Estate Investor Find more write-offs — search your profession or a specific deduction
Try:
Why TurboTax/CPA May Be Blocking Your Rental Losses

The IRS classifies rental income as passive activity under IRC 469. Passive losses can only offset passive income - not your W-2 salary or business income. This is why TurboTax/CPA shows your rental losses as "suspended."

Three ways to unlock your rental losses:

  1. Real Estate Professional Status (REPS) - Spend 750+ hours/year and 50%+ of your working time in real estate. Losses become fully deductible against all income.
  2. Short-Term Rental (STR) Loophole - Average guest stay of 7 days or less classifies the rental as a business activity, making losses fully deductible without REPS.
  3. $25,000 Passive Loss Allowance - AGI below $100,000 allows up to $25,000 in rental losses against ordinary income. Phases out at $150,000 AGI.
Book A Free Strategy Call - We Will Show You Which Strategy Applies
Others Also Use These Strategies
Real Estate IRC §162 / IRC §212

Property Management Fees & Maintenance Deduction

All ordinary and necessary expenses for managing, conserving, and maintaining rental property are deductible. This includes property management fees (typically 8–12% of rent), repairs and maintenance, landscaping, snow removal, pest control, cleaning between tenants, locksmith fees, and any other costs directly related to keeping the property in rentable condition.

Eligibility Requirements
  • Rental property owner or real estate investor
  • Expenses directly related to managing rental property
  • Property must be held for rental income
Example Savings Scenario

A landlord paying $4,800/year in property management fees on a $4,000/month rental deducts the full amount, saving $1,440–$1,920 in taxes.

MERNA Strategy Notes

Repairs are immediately deductible; improvements must be depreciated. The line between repair and improvement matters — a new roof is an improvement, patching a roof is a repair.

Common Mistake: Capital improvements (new roof, new HVAC, additions) cannot be fully deducted in the year paid — they must be depreciated over their useful life unless you use Section 179 or bonus depreciation.
Business IRC §280A

Bookkeeper Home Office & Vehicle Deduction

Bookkeepers working from home can deduct the home office space used exclusively for client work — typically worth $1,500–$4,000 per year using the actual expense method. Vehicle mileage to client offices, bank runs, and networking events is deductible at 70 cents per mile. A bookkeeper driving 5,000 business miles deducts $3,500.

Eligibility Requirements
  • Must use a dedicated space in your home exclusively and regularly for bookkeeping
  • Vehicle must be used for business purposes (client meetings, bank runs)
  • Must report income on Schedule C
  • Must have documentation of business use
Example Savings Scenario

A freelance bookkeeper using 12% of their home for bookkeeping deducts $2,400/year in home office expenses, plus $2,010 in vehicle mileage (3,000 miles x $0.67), saving $1,633 at 37%.

MERNA Strategy Notes

Freelance bookkeepers working from home can deduct both home office and vehicle expenses. Home office: calculate the percentage of your home used for bookkeeping and apply to rent/mortgage interest, utilities, and insurance. Vehicle: deduct mileage for client meetings, bank runs, and business errands at 67 cents/mile. A dedicated home office also makes all miles from home to client locations deductible. Internet and phone (business-use percentage) are also deductible.

Common Mistake: The home office must be used EXCLUSIVELY for business. A kitchen table where you occasionally do bookkeeping does not qualify. A dedicated desk or room is required.
Home Health Care Business IRC §162, §132(d)

Caregiver Mileage & Vehicle Reimbursement

Home health care businesses incur significant vehicle costs — caregivers drive to client homes, supervisors conduct home visits, and owners travel to meetings and training. The 2026 IRS standard mileage rate is 70 cents per mile for business use. Agencies can reimburse caregivers for mileage through an accountable plan, making the reimbursement tax-free to the employee and fully deductible to the business. Alternatively, actual vehicle expenses (fuel, insurance, maintenance, depreciation) can be deducted based on business-use percentage.

Eligibility Requirements
  • Business miles driven to client homes
  • Supervisor home visit mileage
  • Training, licensing, and continuing education travel
  • Caregiver mileage reimbursements through accountable plan
  • Owner/operator vehicle used for business
Example Savings Scenario

A home health care agency owner driving 20,000 business miles per year deducts $14,000 at the 2026 rate of 70 cents per mile, saving $5,180 in taxes at 37%.

MERNA Strategy Notes

Use a mileage tracking app (MileIQ, Everlance, TripLog) for every caregiver and supervisor. Reimburse through an accountable plan — this keeps the reimbursement off the caregiver's W-2 and gives the agency a full deduction.

Common Mistake: Commuting miles (home to first client) are not deductible. Only miles driven between client homes and for business purposes qualify.
Vehicle IRC §162 Uncle Kam Clients Only

Real Estate Agent Vehicle Mileage & Showing Deduction

Real estate agents can deduct every mile driven for business: showing properties, meeting clients, attending closings, visiting inspections, and driving to the office. At 70 cents per mile in 2026, an agent driving 20,000 business miles deducts $14,000. Use MileIQ or Everlance to track mileage automatically. The standard mileage rate beats actual expenses for most agents.

Eligibility Requirements
  • Must drive for real estate business purposes (showings, listings, client meetings)
  • Must keep a mileage log with date, destination, business purpose, and miles
  • Standard mileage rate: 67 cents/mile in 2024
  • Home office establishes all miles from home as business miles
Example Savings Scenario

A real estate agent driving 25,000 business miles/year for showings, listings, and client meetings deducts $16,750 (25,000 x $0.67), saving $6,198 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
Technology IRC §162 Uncle Kam Clients Only

Property Manager Software & Management Tools Deduction

Property management software like AppFolio, Buildium, Rent Manager, and TenantCloud is fully deductible as a business expense. These platforms typically cost $1,200–$6,000 per year and are 100% deductible under IRC §162. Also deduct QuickBooks, DocuSign, and any tenant screening service subscriptions.

Eligibility Requirements
  • Must use software for property management operations
  • Software must be used for business purposes
  • Subscriptions are deducted as current-year expenses
  • Must report income on Schedule C
Example Savings Scenario

A property manager paying $3,600/year for AppFolio, $1,200 for DocuSign, $600 for QuickBooks, and $480 for tenant screening tools deducts $5,880, saving $2,176 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
Professional IRC §162 Uncle Kam Clients Only

Property Manager Professional Fees & License Deduction

Property managers can deduct state real estate license renewal fees, property management license fees, continuing education credits, and professional association dues (NARPM). These fees typically run $500–$2,000 per year and are fully deductible under IRC §162 as ordinary and necessary business expenses.

Eligibility Requirements
  • Must be a licensed property manager or real estate professional
  • License renewal and CE must be required for your property management practice
  • NARPM membership must be for professional development
  • Must report income on Schedule C
Example Savings Scenario

A property manager paying $800/year in NARPM dues, $400 in license renewal, $300 in CE courses, and $500 in E&O insurance deducts $2,000, saving $740 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
What Most Real Estate Investors Don't Know

Cost Segregation generates more first-year deductions than any other strategy in the tax code.

REPS status can turn passive losses into unlimited active deductions — but requires 750+ hours documented.

The 1031 exchange can be chained indefinitely — some investors have deferred gains for 30+ years.

Who Uses This Strategy

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

Common Questions for Real Estate Investors

Get answers to the most frequently asked tax questions for your profession.

What tax write-offs can a real estate investor claim?
Real estate investors can deduct mortgage interest, property taxes, depreciation (27.5 years for residential), repairs, property management fees, insurance, and travel to properties. Depreciation alone can shelter $10,000\u2013$30,000+ of rental income annually.
How does real estate depreciation work for taxes?
Residential rental properties depreciate over 27.5 years. A $300,000 property (excluding land) generates ~$10,909/year in depreciation deductions \u2014 a non-cash write-off that reduces taxable income without spending money.
What is the real estate professional tax status?
Real estate professional status (REPS) allows you to deduct unlimited rental losses against ordinary income. You must spend 750+ hours/year in real estate activities and more time in real estate than any other profession.
Can I use a cost segregation study to accelerate depreciation?
Yes. A cost segregation study reclassifies building components (flooring, fixtures, landscaping) from 27.5-year to 5\u201315 year depreciation. On a $500K property, this can front-load $50,000\u2013$100,000 in Year 1 deductions.
What is the QBI deduction for rental income?
Rental income may qualify for the 20% Qualified Business Income (QBI) deduction if it rises to the level of a trade or business. A safe harbor requires 250+ hours of rental services per year. This can save $5,000\u2013$20,000 annually.
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 $40,000–$250,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); }); })();