How LLC Owners Save on Taxes in 2026

Freelancer / 1099 Find more write-offs — search your profession or a specific deduction
Try:
Others Also Use These Strategies
Employment OBBBA 2025 — New IRC Provision Uncle Kam Clients Only 2026 Law Update

Overtime Pay Tax Deduction (OBBBA 2026)

The One Big Beautiful Bill Act (OBBBA) creates a new deduction allowing qualifying workers to exclude overtime pay from federal taxable income. This directly benefits hourly workers, tradespeople, nurses, and anyone earning overtime wages under the Fair Labor Standards Act.

Eligibility Requirements
  • Receive overtime pay under FLSA (time-and-a-half for hours over 40/week)
  • Employed as a W-2 employee
  • Overtime must be properly reported on W-2
  • Applies to tax years beginning after December 31, 2025
Example Savings Scenario

A worker earning $15,000/year in overtime pay at a 22% federal rate saves $3,300/year in federal income taxes under the new overtime deduction.

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

Office Supplies & Materials Deduction

Any supplies you purchase and use in your business are fully deductible in the year purchased. This includes paper, pens, printer ink and toner, folders, binders, postage, envelopes, labels, staples, tape, and any other consumable materials used in your work.

Eligibility Requirements
  • Self-employed, freelancer, or business owner
  • Supplies used for business purposes
  • Consumed or used up within the tax year
Example Savings Scenario

A small business owner spending $1,200/year on office supplies saves $360–$480 in taxes depending on their 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

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
Business Expenses IRC §162 Uncle Kam Clients Only

Continuing Education & CE Credits Deduction

Continuing education required to maintain your professional license or improve skills in your current trade is fully deductible. This includes CME credits for physicians, CLE credits for attorneys, CPE credits for CPAs, CE credits for nurses, real estate CE, and any other mandatory or voluntary professional development directly related to your current work.

Eligibility Requirements
  • Education maintains or improves skills in your current profession
  • Does not qualify you for a new career or profession
  • Self-employed or business owner
Example Savings Scenario

A CPA spending $3,000/year on CPE courses, webinars, and AICPA membership saves $900–$1,200 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

Scrubs, Uniforms & Protective Clothing Deduction

Work clothing that is required as a condition of employment and not suitable for everyday wear is fully deductible. For healthcare professionals, this includes scrubs, lab coats, surgical gowns, nursing shoes, compression socks worn for work, and any other required clinical attire. The clothing must be required by your employer or profession and not adaptable to everyday use.

Eligibility Requirements
  • Clothing required as condition of employment
  • Not suitable for everyday personal wear
  • Self-employed healthcare professionals can deduct fully; W-2 employees need employer reimbursement
Example Savings Scenario

A travel nurse spending $800/year on scrubs, compression socks, and nursing shoes deducts the full amount, saving $240–$320 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

Medical Supplies & Clinical Equipment Deduction

Healthcare professionals can deduct the cost of medical supplies and clinical equipment used in their practice. This includes stethoscopes, blood pressure cuffs, otoscopes, diagnostic tools, syringes, gloves, masks, bandages, and any other consumable or durable medical supplies used in patient care. Larger equipment qualifies for Section 179 immediate expensing.

Eligibility Requirements
  • Used in clinical practice or patient care
  • Self-employed healthcare professional or practice owner
  • Consumable supplies deducted in year purchased; equipment may be Section 179 expensed
Example Savings Scenario

A self-employed nurse practitioner spending $2,000/year on clinical supplies, a new stethoscope, and diagnostic tools deducts the full amount, saving $600–$800.

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

Malpractice & Professional Liability Insurance Deduction

Professional liability insurance (malpractice insurance) premiums are fully deductible as a business expense. This applies to all licensed professionals including physicians, dentists, nurses, attorneys, financial advisors, CPAs, architects, and any other professional who carries liability coverage for their practice.

Eligibility Requirements
  • Professional liability or malpractice insurance policy
  • Coverage related to your professional practice
  • Self-employed or business owner
Example Savings Scenario

A physician paying $8,000/year in malpractice insurance premiums deducts the full amount, saving $2,400–$3,200 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
Home Health Care Business IRC §162, §3111 Uncle Kam Clients Only

Caregiver & Home Health Aide Wages

All wages, salaries, and compensation paid to home health aides (HHAs), certified nursing assistants (CNAs), personal care aides (PCAs), and other direct care workers are fully deductible under IRC §162. This includes regular wages, overtime pay, shift differentials, and holiday pay. The employer's share of FICA taxes (Social Security and Medicare) is also deductible, as are unemployment insurance premiums (FUTA/SUTA) and workers' compensation insurance premiums.

Eligibility Requirements
  • Licensed home health care agency or private duty agency
  • Wages paid to W-2 employees (HHAs, CNAs, PCAs, RNs, LPNs)
  • 1099 payments to independent contractor caregivers
  • Employer payroll taxes (FICA, FUTA, SUTA)
  • Workers' compensation insurance premiums
Example Savings Scenario

A home health care agency with $500,000 in annual caregiver wages saves $185,000 in federal taxes at 37% effective rate — wages are the largest single deduction for most agencies.

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
Home Health Care Business IRC §162, §179 Uncle Kam Clients Only

Medical Supplies, PPE & Clinical Equipment

All medical supplies and personal protective equipment (PPE) used in providing home health care services are fully deductible: disposable gloves, masks, gowns, face shields, hand sanitizer, wound care supplies, blood pressure cuffs, pulse oximeters, glucometers, thermometers, stethoscopes, and other clinical equipment. Larger equipment (hospital beds, wheelchairs, Hoyer lifts, CPAP machines) qualifies for Section 179 immediate expensing if owned by the agency. Uniforms, scrubs, and non-adaptable work clothing are also deductible.

Eligibility Requirements
  • Disposable PPE (gloves, masks, gowns)
  • Clinical equipment (BP cuffs, pulse oximeters, glucometers)
  • Wound care and medical supplies
  • Uniforms, scrubs, and work clothing
  • Durable medical equipment owned by the agency
Example Savings Scenario

A home health care agency spending $18,000/year on PPE, supplies, and clinical equipment saves $6,660 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
Home Health Care Business IRC §162, §127 Uncle Kam Clients Only

Caregiver Training, Licensing & Certification Costs

All training, certification, and licensing costs for caregivers and agency staff are fully deductible: CNA certification programs, HHA training courses, CPR and first aid certification, medication management training, dementia and Alzheimer's care training, OSHA compliance training, HIPAA training, background check fees, and continuing education requirements. Agencies can also establish an Educational Assistance Program (IRC §127) to provide up to $5,250/year in tax-free education benefits to each employee.

Eligibility Requirements
  • CNA, HHA, and PCA certification and training programs
  • CPR, first aid, and safety certifications
  • Dementia, Alzheimer's, and specialty care training
  • Background check and licensing fees
  • Educational Assistance Program (up to $5,250/employee tax-free)
Example Savings Scenario

A home health care agency spending $15,000/year on caregiver training, certifications, and background checks saves $5,550 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
Nurse IRC §162 Uncle Kam Clients Only

NCLEX, Nursing License Renewal & State Board Fees

Registered nurses, LPNs, and CNAs can deduct state nursing license renewal fees, NCLEX exam fees, and state board of nursing fees. These are required to maintain your professional license and are fully deductible as ordinary and necessary business expenses.

Eligibility Requirements
  • Licensed as an RN, LPN, or CNA
  • License is required to perform your nursing work
  • Fees paid in the current tax year
  • Self-employed nurses or employees with unreimbursed expenses
Example Savings Scenario

A travel nurse paying $200/year in license renewal fees across 3 states deducts $600, saving $222 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
Nurse IRC §162 Uncle Kam Clients Only

ACLS, BLS, PALS, CCRN & Nursing Certifications

Advanced Cardiac Life Support (ACLS), Basic Life Support (BLS), Pediatric Advanced Life Support (PALS), and specialty certifications like CCRN, CEN, CNOR are all fully deductible. These certifications are required by most hospitals and travel nursing agencies.

Eligibility Requirements
  • Currently employed as a nurse or nursing contractor
  • Certification is required or expected by your employer or agency
  • Certification maintains or improves skills required in your current role
  • Expenses not reimbursed by your employer
Example Savings Scenario

A critical care nurse spending $800/year on ACLS, CCRN, and BLS certifications 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
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
What Most Freelancer / 1099s Don't Know

The QBI deduction gives freelancers a 23% discount on all net business income starting 2026 — most miss it.

A Solo 401(k) can shelter up to ~$70,000/year from taxes in 2026 — far more than a traditional IRA.

Vehicle deductions require a mileage log — without it, the IRS will disallow the entire deduction.

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 Freelancer / 1099s

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

What tax deductions can a freelancer claim?
Freelancers can deduct home office, computer and equipment, software subscriptions, internet, phone (business %), health insurance premiums, retirement contributions, professional development, and business travel. Most freelancers miss $8,000\u2013$25,000 in deductions.
How much should a freelancer set aside for taxes?
Freelancers should set aside 25\u201330% of net income for taxes (federal + state + self-employment). Self-employment tax alone is 15.3% on the first $168,600 of net income in 2026. Quarterly estimated payments are required.
Should a freelancer form an LLC or S-Corp?
An LLC provides liability protection with no tax benefit by itself. An S-Corp election saves freelancers earning $60,000+ approximately $5,000\u2013$15,000/year in self-employment taxes by splitting income between salary and distributions.
Can a freelancer deduct health insurance premiums?
Yes \u2014 self-employed freelancers can deduct 100% of health insurance premiums (for themselves, spouse, and dependents) as an above-the-line deduction, reducing adjusted gross income even without itemizing.
What retirement account should a freelancer use?
A Solo 401(k) allows freelancers to contribute up to $70,000/year ($77,500 if 50+). A SEP-IRA allows contributions of up to 20% of net self-employment income (max $70,000). Both reduce taxable income dollar-for-dollar.
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 $8,000–$45,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); }); })();