{"id":3412,"date":"2026-03-11T16:06:17","date_gmt":"2026-03-11T16:06:17","guid":{"rendered":"https:\/\/dcappliancerepairservice.com\/?page_id=3412"},"modified":"2026-03-11T16:06:17","modified_gmt":"2026-03-11T16:06:17","slug":"invoice-generator","status":"publish","type":"page","link":"https:\/\/dcappliancerepairservice.com\/index.php\/invoice-generator\/","title":{"rendered":"invoice generator"},"content":{"rendered":"\n<div id=\"wp-block-themeisle-blocks-advanced-columns-fa2a26dc\" class=\"wp-block-themeisle-blocks-advanced-columns has-1-columns has-desktop-equal-layout has-tablet-equal-layout has-mobile-equal-layout has-vertical-unset\"><div class=\"wp-block-themeisle-blocks-advanced-columns-overlay\"><\/div><div class=\"innerblocks-wrap\">\n<div id=\"wp-block-themeisle-blocks-advanced-column-9503212b\" class=\"wp-block-themeisle-blocks-advanced-column\">\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Invoice Generator \u2013 DC Appliance Repair Service<\/title>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Instrument+Serif:ital@0;1&#038;family=Outfit:wght@300;400;500;600&#038;display=swap\" rel=\"stylesheet\">\n<style>\n  *{box-sizing:border-box;margin:0;padding:0}\n  body{font-family:\"Outfit\",sans-serif;background:#f5f4f0;color:#1a1a1a;height:100vh;overflow:hidden;display:flex}\n  ::-webkit-scrollbar{width:5px}\n  ::-webkit-scrollbar-thumb{background:#ddd;border-radius:3px}\n  input[type=number]::-webkit-inner-spin-button{opacity:.4}\n  input,textarea,button{font-family:\"Outfit\",sans-serif}\n  \/* Sidebar *\/\n  .sidebar{width:400px;min-width:380px;background:#fff;border-right:1px solid #e8e6e1;overflow-y:auto;display:flex;flex-direction:column;flex-shrink:0;box-shadow:2px 0 12px #00000008}\n  .sidebar-header{padding:20px 22px 16px;border-bottom:1px solid #f0eee9;display:flex;align-items:center;gap:10px}\n  .sidebar-icon{width:32px;height:32px;border-radius:9px;background:#cc785c18;display:flex;align-items:center;justify-content:center;flex-shrink:0}\n  .section{padding:18px 22px;border-bottom:1px solid #f0eee9}\n  .sec-label{font-size:10px;font-weight:600;letter-spacing:.13em;text-transform:uppercase;color:#cc785c;margin-bottom:14px}\n  .row{display:flex;gap:10px;margin-bottom:10px}\n  .row.last{margin-bottom:0}\n  .field{display:flex;flex-direction:column;gap:5px;flex:1}\n  .field label{font-size:10px;color:#999;letter-spacing:.09em;text-transform:uppercase;font-weight:500}\n  .input{background:#f9f8f6;border:1.5px solid #dddad4;border-radius:7px;padding:8px 11px;color:#1a1a1a;font-size:13px;outline:none;width:100%;transition:border-color .15s,background .15s}\n  .input:focus{border-color:#cc785c;background:#fff}\n  textarea.input{resize:none}\n  \/* Item cards *\/\n  .item-card{background:#f9f8f6;border:1.5px solid #f0eee9;border-radius:9px;padding:12px 13px;position:relative;margin-bottom:8px}\n  .item-card:last-child{margin-bottom:0}\n  .item-grid{display:grid;grid-template-columns:1fr 1.6fr 1.4fr;gap:8px}\n  .sub-label{font-size:10px;color:#999;letter-spacing:.09em;text-transform:uppercase;font-weight:500;margin-bottom:5px}\n  .amt-badge{padding:8px 11px;font-size:13px;font-weight:600;color:#cc785c;background:#cc785c18;border-radius:7px;border:1.5px solid #cc785c22;text-align:center}\n  .rm-btn{position:absolute;top:9px;right:9px;background:none;border:none;color:#bbb;cursor:pointer;font-size:16px;line-height:1;padding:2px 5px;border-radius:5px;transition:all .15s}\n  .rm-btn:hover{color:#d04040;background:#fee2e2}\n  .add-btn{margin-top:10px;background:none;border:1.5px dashed #dddad4;border-radius:7px;color:#999;padding:9px;width:100%;cursor:pointer;font-size:12px;font-weight:500;transition:all .15s}\n  .add-btn:hover{border-color:#cc785c88;color:#cc785c;background:#cc785c0a}\n  \/* Logo *\/\n  .logo-upload-btn{width:100%;padding:16px;border-radius:8px;border:1.5px dashed #dddad4;background:#f9f8f6;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:6px;transition:all .15s}\n  .logo-upload-btn:hover{border-color:#cc785c;background:#cc785c0a}\n  .logo-preview{display:flex;align-items:center;gap:12px}\n  .logo-preview img{height:56px;max-width:140px;object-fit:contain;border-radius:6px;border:1.5px solid #f0eee9}\n  .logo-actions{display:flex;flex-direction:column;gap:6px}\n  .btn-sm{padding:6px 12px;border-radius:6px;font-size:12px;cursor:pointer;font-family:\"Outfit\",sans-serif;transition:all .15s}\n  .btn-sm-out{background:#f9f8f6;border:1.5px solid #dddad4;color:#555}\n  .btn-sm-out:hover{border-color:#cc785c;color:#cc785c}\n  .btn-sm-clear{background:transparent;border:1.5px solid #f0eee9;color:#bbb}\n  .btn-sm-clear:hover{color:#d04040;border-color:#fca5a5}\n  \/* Save row *\/\n  .save-row{display:flex;gap:8px}\n  .btn-save{flex:1;padding:7px 12px;border-radius:7px;font-size:12px;font-weight:500;cursor:pointer;border:1.5px solid #dddad4;background:#f9f8f6;color:#555;transition:all .15s;display:flex;align-items:center;justify-content:center;gap:6px;font-family:\"Outfit\",sans-serif}\n  .btn-save:hover{background:#cc785c;color:#fff;border-color:#cc785c}\n  .btn-reset{padding:7px 12px;border-radius:7px;font-size:12px;cursor:pointer;border:1.5px solid #f0eee9;background:transparent;color:#bbb;transition:all .15s;font-family:\"Outfit\",sans-serif}\n  .btn-reset:hover{color:#d04040;border-color:#fca5a5}\n  \/* Actions *\/\n  .actions{padding:16px 22px 24px;display:flex;flex-direction:column;gap:8px}\n  .btn{padding:10px 16px;border-radius:8px;font-size:13px;font-weight:500;cursor:pointer;border:none;display:flex;align-items:center;justify-content:center;gap:8px;transition:all .15s;font-family:\"Outfit\",sans-serif}\n  .btn-primary{background:#cc785c;color:#fff;font-weight:600;box-shadow:0 2px 8px #cc785c22}\n  .btn-primary:hover{background:#b8664a;transform:translateY(-1px)}\n  .btn-sec{background:#f9f8f6;color:#555;border:1.5px solid #dddad4}\n  .btn-sec:hover{background:#f0ede8;border-color:#bbb;color:#333}\n  .btn-ghost{background:transparent;color:#999;border:1.5px solid #f0eee9}\n  .btn-ghost:hover{border-color:#ccc;color:#555}\n  \/* Preview *\/\n  .preview{flex:1;background:#f5f4f0;overflow-y:auto;padding:28px 32px;display:flex;flex-direction:column;align-items:center}\n  .preview-label{font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:#bbb;margin-bottom:18px;align-self:flex-start;font-weight:500}\n  \/* Invoice card *\/\n  .card{width:100%;max-width:700px;background:#fff;border-radius:10px;overflow:hidden;box-shadow:0 8px 40px #00000014,0 1px 4px #0000000a;border:1px solid #ebebeb}\n  .card-header{background:#1a1a1a;padding:28px 40px;display:flex;align-items:flex-start;gap:24px}\n  .card-header-left{display:flex;flex-direction:column;align-items:flex-start;gap:10px;flex:1;min-width:0}\n  .card-header-right{text-align:right;flex-shrink:0}\n  .inv-title{font-family:\"Instrument Serif\",Georgia,serif;font-size:36px;color:#cc785c;line-height:1;letter-spacing:-.5px}\n  .inv-number{font-size:15px;font-weight:700;color:#e8e8e8;margin-top:6px}\n  .inv-dates{margin-top:10px;display:flex;flex-direction:column;gap:3px;align-items:flex-end}\n  .inv-date-row{font-size:11px}\n  .parties{display:grid;grid-template-columns:1fr 1fr;border-bottom:1px solid #ebebeb}\n  .party{padding:22px 40px}\n  .party-border{padding:22px 40px;border-right:1px solid #ebebeb}\n  .party-lbl{font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:#cc785c;font-weight:600;margin-bottom:9px}\n  .party-name{font-family:\"Instrument Serif\",Georgia,serif;font-size:16px;color:#1a1a1a;margin-bottom:5px}\n  .party-detail{font-size:11px;color:#999;line-height:1.8}\n  .items-wrap{padding:0 40px 8px}\n  .items-head{display:grid;grid-template-columns:1fr 80px 90px 90px;padding:11px 0;border-bottom:2px solid #1a1a1a;gap:4px}\n  .items-col-h{font-size:9px;letter-spacing:.14em;text-transform:uppercase;color:#cc785c;font-weight:600}\n  .item-row{border-bottom:1px solid #ebebeb;padding:13px 0}\n  .item-row.stripe{background:#fafaf8;margin:0 -40px;padding:13px 40px}\n  .item-desc{font-size:13px;color:#1a1a1a;font-weight:500;margin-bottom:5px}\n  .item-nums{display:grid;grid-template-columns:1fr 80px 90px 90px;gap:4px;align-items:center}\n  .totals-wrap{padding:16px 40px 0;display:flex;flex-direction:column;align-items:flex-end;gap:8px}\n  .total-row{display:flex;justify-content:space-between;width:280px;font-size:13px}\n  .divider{width:280px;height:1px;background:#ebebeb;margin:4px 0}\n  .total-bar{background:#1a1a1a;padding:14px 40px;display:flex;justify-content:flex-end;align-items:center;gap:52px}\n  .total-bar-lbl{font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:#cc785c;font-weight:600}\n  .total-bar-val{font-family:\"Instrument Serif\",Georgia,serif;font-size:26px;color:#cc785c}\n  .notes-bar{padding:16px 40px;border-top:1px solid #ebebeb;background:#fafaf8}\n  .notes-text{font-size:12px;color:#bbb;font-style:italic;line-height:1.7}\n  @media print{\n    body{overflow:visible!important;height:auto!important}\n    .sidebar{display:none!important}\n    .preview{padding:0!important;background:#fff!important}\n    .preview-label{display:none!important}\n    .card{max-width:100%!important;border-radius:0!important;box-shadow:none!important;border:none!important}\n    -webkit-print-color-adjust:exact;\n    print-color-adjust:exact;\n  }\n<\/style>\n<\/head>\n<body>\n\n<div class=\"sidebar\">\n  <div class=\"sidebar-header\">\n    <div class=\"sidebar-icon\">\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M2 3h12M2 6h8M2 9h10M2 12h6\" stroke=\"#cc785c\" stroke-width=\"1.5\" stroke-linecap=\"round\"\/><\/svg>\n    <\/div>\n    <div>\n      <div style=\"font-size:15px;font-weight:600;color:#1a1a1a\">Invoice Generator<\/div>\n      <div style=\"font-size:11px;color:#999;margin-top:1px\">DC Appliance Repair Service<\/div>\n    <\/div>\n  <\/div>\n\n  <!-- LOGO -->\n  <div class=\"section\">\n    <div class=\"sec-label\">Logo<\/div>\n    <input type=\"file\" id=\"logo-input\" accept=\"image\/*\" style=\"display:none\" onchange=\"handleLogoUpload(event)\">\n    <div id=\"logo-empty\" style=\"display:none\">\n      <button class=\"logo-upload-btn\" onclick=\"document.getElementById('logo-input').click()\">\n        <svg width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"none\"><rect x=\"2\" y=\"2\" width=\"18\" height=\"18\" rx=\"4\" stroke=\"#ccc\" stroke-width=\"1.5\"\/><path d=\"M7 15l3-4 2.5 3L15 9l3 6\" stroke=\"#ccc\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"#ccc\"\/><\/svg>\n        <span style=\"font-size:12px;color:#aaa\">Click to upload logo<\/span>\n        <span style=\"font-size:10px;color:#ccc\">PNG, JPG, SVG<\/span>\n      <\/button>\n    <\/div>\n    <div id=\"logo-filled\" class=\"logo-preview\">\n      <img decoding=\"async\" id=\"logo-thumb\" src=\"data:image\/png;base64,\/9j\/4AAQSkZJRgABAQAAAQABAAD\/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb\/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7\/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7\/wAARCAB+AQwDASIAAhEBAxEB\/8QAHQABAAEFAQEBAAAAAAAAAAAAAAcBBAUGCAIDCf\/EAEIQAAEDBAECAwYCBggEBwAAAAECAwQABQYRBxIhCBMxIkFRYXGBFDMjMkKhscEVFjdSYnKR0Rg0NrIkJ0SCwuHw\/8QAGwEBAAIDAQEAAAAAAAAAAAAAAAMFAQQGAgf\/xAAxEQACAgIBAwIDBwMFAAAAAAAAAQIDBBEFITFBElEGE2EUInGBscHwkaHhFiQyQnL\/2gAMAwEAAhEDEQA\/AOvqUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQF43+Wn6Cq1Rv8tP0FVoCypSlAKUJA99W1wnRYEVcmXIbYZR3UtagAKyk29Iw2orbLmlRbknLkOOpTVljmSodvNcBCfsK2fAL\/NvmIG7TOjziXOyRoDROv4VuW8ffVUrZx0uxXUcvi5Fzpqltpb6dun1NrpURcaZlfLrmTsGdJ8yO4lZCCkezo+6slyNnlzxnJWYkZpl6MthKylY772R6\/apJcXer\/kLTlrZBDncaWN9pe1HeuxJdK0fFOSLLenEx31\/gZJOgh06Sr6H0rd0qSQCCCDWpdRZRL02R0yxxsunKh66ZJorSlKhNgUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgLxv8tP0FVqjf5afoKrQFlSleXFJQ2pajpKRs0Bi8ovcKxWpyfNX0pQPZQPVZ9wFQXcbnkOfXz8O0hakE\/o2kn2G0\/E1cZ9eZeY5em3wNqYQ4GWED0J3oqP8A+9KkqDHtHHeJea8EqkqA6lftOr+A+VdDXGHGUqyS3ZLt9Dj7ZW85kyqg9Uw7v3ZjbBxzj9jiiZfnm5DoG1eYdNpPyHvrcLZJtkmwvrtBQYqULSnoTobGwagjJ8kul\/lKflOrSzvSGkkhCf8Ac1KnE39navq7\/E1T3ZNt8vVZLZ0ePg4+JW40xS\/Uj3h3+0JP+Rz+NS5kRxibNFrvIjl5bYUlLo12JI7H7VEfDv8AaGn\/ACOfxrJ84kjK4+t7EZP\/AHKq05yTjlRcXp6X7lH8LwjPBlGS2vU\/2PvmvFy47Sp+OuqdQkdRYUfa1\/hPvq144z6VaZSbPfFLVG30JcX+s0fgflTAM7lWmSiDd3FuwlkJC1\/rN\/PfwrL8uYixOgf1jtCElSU9TyUei0\/3vrXrEzo5S+zZfVPs\/KZ45Dip4MnmYHRrvHw1\/P8ABKzLiHW0uNqCkKAKSPQivVRZwjlLkuMuxTXOp1kdTClHuU\/D7fzqTLg87Ht8iQwwqQ620paGk+qyBsJH1qoy8aWLa65eDoeOzIZ9Mba\/P9mfelQBC8QN6nXaTa4XH8uTLihSnmW5O1ISk6JI6fmK33jDlnH84RIYbQ5brhFSVPxXlbIA9SD23rXwqury6bHpM6XK+HuRxa3ZZX0XfTT1vtvTfT6khUqCLt4iIy8idgY1jcm8RI5PmvoXorSPVSRo9vnW1cP8sNch3i4wmLOuC3DQFha3eoq761rQ1SGXTOXpi+oyPh7kceh3216ilt9V0322t7JNpWIzS8PWDFrheWIaprkRkuhhKtFevduoPsfiYZnXmDDlYyqKxJfQ2t4ydhCSoAq1099V6tya6pKM3rZFgcJm8hXK3Hh6lHv1X4+WdD0rx5zQaS6pxKUKAIKjre6p+IY2B57W1entjvU5V6Z9KV4W80hXSt1CVfAqANEPNLUUodQpQ9QFAmg0z3SoSwXk7L7lzPcMJvMW2IjxQ8pJYQrrIToo7lRHoRvtWz8bZdmN8zK+W2\/2BuBbYqlfhH0g+0ArQ2SSDsd+wFa8MmE9a330W+TweTjKTm10ipd11T7a9yRqVbf0hB83yfxkfzN66fMG6+y3Wm9dbiE79NqA3U+ypcWu6PdK+X4mP5wZ89rzCNhHWNn7V6ddaa15riEb9OpQFZMaZ7pXlLraiQlxB166V6V5akR3VFLT7S1D1CVgmg0z6UpShgvG\/wAtP0FVqjf5afoKrQFlWq8oXZdpw+Y8hRQ44PKQR8TW1VGHiAfKLJBjb7OPKUfsB\/vW5x9StyoRfbZW8ve6MKya76\/XoYfgSyofmyry6gKLH6JrY9CR3P8ApWK5Gu8jJc0TbYqitppzyGUj0J96q3nicJhcaOSx2Vp5w69+ia0PhyOifn4edAV5SFvDfx2Bv99Tcpa7cubfjp\/Qh4HHjRgVpeVt\/mZnkuwRscwi2xWEDzS8VOr96laFbPxESrjlRPxd\/iasfED\/ANPwT7vxB\/gKu+G1BzjtSEHqUFOggfHZqvRbS7M0Lh3+0NP+Rz+NX\/OiynMI43\/6VP8A3Kqz4eZdHIZ22seWhzq2PTuPWvvzw4P64xwO5EZOwP8AMqrnnH\/uV+COb+FU1hP\/ANP9jL8hYuh\/EYN\/htpS+zFb88Aa609I7\/UVkeFr3\/SllkWKYpK1MI0gK77bPYj7VuVqjCbhcaM+jSXoKUKT9UaqGOJnlQ+Rm46T2cDjSh9O\/wDKqU6Vo+ElD2H8kextDbT4UnXvQr3fT\/auh2lpW2lxJ2lQ2DUH88sBnKoskdiuOP3KNStYUJvGDRGX1LSmVAShaknR9pGiR\/rV3yr+bj03+WtM5jgUqM3Ixf8AqntfTf8AEc78FPNM+IjJnnXUNtJjyFKUpWgB5iK020Ifu\/LWVSMUQoILEpSFNdhrts\/cgn51OX\/DrhAeW6Jd3Ste+oiTondb3gmAYxhcNyPZIAQp0adecPU44PgTXFwwrZJRlpJNs+25HxNgVSsuo9UpShGGmtLp5fV7IC8HF3sMCbeo0+TGjTnkJLanlBPW2NbSCfXv31Uy8Ww+N27xd5GEOx1ywvy5haeKgTvewN61v3jtWFyjgHC7zd3LnHVLtrrqytxEdWkEn10PdW4cd8f45gsNxixxlJcd15z7iupa\/qa2MWi2vUJJaXnyVfOcngZrsyKbJqdijuPjp7vfVe31NY8T1\/Nl4ulRmVkSbksRUAHRIP6xH7q5qz2w3SDgdhVJxWZbW4aFJXMcHsveYoq\/ie1dT8j8TY5nd4aul4fnpdaZDKUsu9KdAk718e9Y++cI4reLXbLdMl3Ms25kstAP+oKur2vie9RZWLbdOT+mkbnA89gcZj1Qbe\/U5S6P20tdevt199mncg3Y5X4Y4d\/bmvsS4XlOKLS9EuD2Ck692l\/uqJ5Vpmx+HYGeN5XcVz0zvw6GBIJDY+XfYPv+4qVuVOP7ZgPE11tuNxbtcHLxIZZ6Bt3yyna+rQ9B7JH3FYDhPiGxZbjCX7\/FvcCVFfKH2XCW0O+hBSD8jr7Vr3VWWWqDX3vT7+fcuOOzsPEwZZEZtVK1tfdTbi11jrfRb6bNQ5WvV6uFhxDIXbrLYmTYXQ8pLpSCUK6Qvt7zrdX+QtXXjXlTH02jKJ1wVMSw4+l14qK+sgEKG9EHfbfwrO+KGzu\/01YLFZMfnOQbZFSj\/wAOwpSOnfoCPfqpB4x4cxBldsy1Ue5rkFpLrUacvZZVr3j4isKiyd0orutdf1JJ8tiY3HVXWL7klNehJPe391N+NI0XDEiR4r78he0hyO6Do9xtpurXhKci0Zfn8W5XSeu226FIR1l5RWlCFkbT3\/W0PdUqMcF4izky8gRJuYmLfU8T5\/baiSR9O9VxvgrDbHcHZjK57\/nMOMOtvPdSXErSUq38exNbEcW5ST0u7ff3Ki7nuNsqnByl1rhH\/j5i++9+TmTI2be5jgyexWe8xwmb5abs9IKi4vSiQe\/Y9gdj4VI3MM64zuD8NyVy5SkT1JU0tSHSOsBWtn4ntUiMeHfD0tyI7s65uRXD1NM+bpLR36j4n3VdvcB4c9YmLM5KuhisPrfQC\/3ClBIP29kfvqKOFelJaXVe\/k3bvibi52Uy9Un8uTfWO36WmtdX\/j2RA+V2+fid2wXI42QXGVOucKPKccfdJKCek9APvTrto1smUTJ2c+IFOM3y9SoFsaX5baEPFAOk7BHu2T76lWdwLh0y1QLc9JuZZghQZPn99KUVH+NXOXcI4jkRhvOrmRpcVoMiQ057S0j06vifnXr7Fck9LptPW+\/uQ\/6l46UouTfqUZx9XpW1t7i0voumiH85tmV8cY1kcmJlhnt3CS1FDjckrejoT1HpUd7SSlSfn2rF4xZ8vgIx7IcSteQokuFtyW+8+CzK6tHsAfQ71o+6p\/s\/DmGW\/G51jVHkS252jIdec6lkjeiD7tbNYfHuBMZtN1Ymm6XaQiM4HGGS8QlJB2N\/GsywrPUml0\/Ht1\/A8VfE2EqZxlLct93DpNelJJpSWvz\/AB7ksxytTDanBpZSCofA6717okBKQB6AapVwfOmXjf5afoKrVG\/y0\/QVWhgsqi\/xCM7scCUO4bfKT\/7gNfwqUK1blK0LvGFzozSAp5A81sa9SK3OPtVWVCT7bK7l6HfhWwj31+nUwfEi03DjV2GNFSfNaOvnuo+4cmJt\/IaWHz0l9K2Rv3He\/wCVZPw95Cli6yrHIIR+J\/SND4rA7j\/SsTytaJOMZqm7REKQw+757KgNALHqKm5Wl1Zc0\/PX+prcBkxvwK2vC0\/yJj5JsByDFn4bP\/MI\/SM\/5h7qhvjzMpOGT34FxjLXGUvTrfoptQ9SKmXAcph5PZESWXEiUgBMhrfdKv8AY188qwWwZIsvzI3lyT285r2VH669ari6Nae5Pw+G07Kt8NS5bg9EtBJUfmaj2zsXbkDN\/wAQ6klClhTygPZbQPQVIEbhiytvBTtwluNg76Ow39632wWS2WGGIttitsN+p6R3UfiT76y3s8qKXRH2nvs2y0POqIQzGZJ+gAqBuIG1z+SEyRvpbDjp+\/b+dbTzpmTLURWO298Kec\/5pST+on+7v4mrrg6x\/wBEY\/Iv85AbVJR1IKu3S2O+\/v8AyrCMt6Ne57kh7Ko0ZIJLccDXzKjUv4gwqNi9sYWNKRFbBHz6RXPvnPZpyoegqU27I0Cn3Np7f\/f3rpVpIQ2lCdaSNDVXvLL5OPTQ+6W2ctwMvtOXkZS7N6X5fxEUXfxD8W2q7SLVNvTrcuO4W3G\/J2QoevvrZePOUsHz196PjN8YlyWR1OMejiR8dfCuOuXHWbL4yvxUXHDeUtO+YbawyFGR+jXsBOtE+\/7VsHhEas+QeIHI8uaLFiejod8qxpbKFJSrQV8uxSdgehNUJ1R2zSuLcr58zjJuRL9bbDmFnw61WguBj8a2gmUpCikDZG9nXp6d6+9w8QHJNy4I\/rbarhCg3S13NMOe4IqFpkIUlRSoBQIB9k71QHZdK4hu3MnPthwfGeRblc7e\/ZbktSPw4htJUsJVratDY33A18K27mjlu9SI2N3S2clW\/Ebfd7Y1J\/B\/hFPvocWkE9XQkqSnv6ntQHVkp5EeM7Id30NIK1aG+wGzUe8ScwYzyVdLzbbGzMaetTgS957fSFAkgEH6pPaoV8L\/ADLm2ZTsmw263OPcZkO1vS4Fy8pOgUlKRsa9obWD3+FYrw7ZnnF0sHJqYb9igXi3Nhxh+LaWGEl4KcClrCEDrJ6f2t0B2LWKyzIrNithkXy\/TmoUCONuOuHQG+wH1NcweGfkXmrlO\/wpk6XFcx+1yCm4vobbaU8SNpT0jW9Aj0qTvGBh0nNuKxa4N1jQpjEtMlpp+QlpMkpSoFG1ED0Vv7UB6sfiX4nupmBu9PRvwqFLJkM9HmAevT371ImA5jYs5x9F+x2UZMFa1ISsp1spJB\/eK\/PyDPGF4c9hnJPFwER9wlm7phBuUgnXdt0gBY+5qTbty1bOK+GsbsXEVxMhV3W68JU9CeuMC4oKBB7bCtjZ93egO1qVx\/xpzbnUXkyDhd1y6zZYxeI6ksTIbaQIr3QpSd6HfRGiDWIwrk\/xCZ3mF3wqy3OC+\/BlEPyww0z5KErUk99De9fXtQHa9YzLL5DxrG59+uAcMWEyXXA2naiB8BXKuPcm80WzxANcd5nlVtYYSpZU+qA0ht1PQVJIITvv219a8YZnfNuXYBnOSPZHanrNbWXGIpetjXS+sLHV2KO4CAoEH+8KA6M4e5IsfJ+MOX6xNyWmGpCo60Po0oKAB+40oVulcWYpzlkGJeGYXqJFtTd2l3h2JDTGt7UdllKW2yT5baQkna\/eK2Kz5X4kIcbCbpOkpu1pvsliRLXDtSVrixlkFSXOlPsjpO9+6gOsaVxBdfEHnuWZNe3rJmdmxK2WxK1RI8xpBXJKf2e42VHX0rofwtcmz+UeN1Xe7R0NXGHKVDkKQAEuqSlKusAdhsKHb5UBMjf5afoKrVG\/y0\/QVWgLKqOAKQUqGwRo1WlAc38pWGXh2You9sCm47rnnMrA7IXvZSfvUn2efZeTcNMSZ0JlJSPMRv2mlj9ofKtuyaxwMgtTtuuDIW04Ox96T7iPnXO+RWHJeOb2mZDddSz1foZDY2lY\/uqFdFVOvk6VVN6sj2fuclZVZwuRK+pbql3XsVvFpynjm+fio6lpZ37EhHdDg+CvhUw8U5nIyu0yH5kZth2MoJWpKuyu29691RtlHJsXJcEkWqfFUxcD06Unuhevf8qzPh5\/6av3fftf\/CqXIx7MefosWmdJi5dWVX8yp7RIlgzewXy7PWu3yyuS0CdKToKA9dVHXLPJF5hXmXjtsZRH8vSS+FbWrYB7D3etavwgf\/M9A\/wO\/wAateU30M8rzHnOyEPNqV9OkVAlt6NhvS2bBxnxzPu8xN5yNC24vV5gbc\/XePz+ArLc0ZvHiwVYxZXE9RT0vqb9EJH7IrF55yzJuCDbcbQqOyodKnyPbUP8PwqvFvGku4zGr3kSVpjg+Yhlf6zqvcVfKugxcGOIvtOX012XnZyufyU89vDweu+8vCX8\/wAGw8C4g5bIC79ObCZEkaZSfVLfx+pqWB6V5aQlDaUJQEpSNAAdgK9VTZWTLJtdsvJf4GFDCojTDsv7v3OVbzwDynL5uTyOxkVgDrU4OtBS3eoM70UkdGt9JUPWrOV4YczhctTL9jmUQoVnuLijKX1LEhKHD1OICQNHZ9PaFdbUrXNw5Yv3h9zvGORbpk3GFzsSot1UpTse6oUryupXUQAEkEAnsaxPiTtF5xHw2i05hebfMvU66IcSIjBQjslW0g67gfMCuvaw+T4vj+TsNM3+0xri20rqbS+nYSfiKA4q434lzzlrjHGrexmdpViEF1ZUx+k8+M4VbUgjp0o60R3\/AGqkXOPDjlluz20ZRxzdbSv8DDYiJYuyVFKPLaDfVoA9WwnZ9O5rpXGsesmNwVQbFbY9vjKWXFNsp0kqIAJ\/0ArJ0Bylxx4euTsJz6fktuyWwKE+I\/HkdnEqUHE7Gh06GlhB9fQGvXGXAPKuHRcrDeR4\/wCdfoakEpW6QHiSQo7QND2j8a6rpQEFeFTiPMeJ0XaDfbta5lumdLjTcRSypLo0CSVJHbVZXxScX5BylitstOP3CFCejTg+6uS4tIKOhSdDpSdnahUwUoDj7OvDfzDebbb8aGewbnYIqUFCJrjiVNK0NgAIOwDvXetgybwqJd4qs1jsl9bTkVqcW8mU8gpbdUolRR22UgE9jo+npXUNKA5844465mjX9q4ZRfMXYjxYzjbLUKKVKdWU6SVEpGtHR2N+\/t3qy8P3CXIPHnKFxya63yyybfcw4ZjcdbhcUoqKkkbQB+0r310hSgII8T\/CFy5KmWu+YtPh22+QttrekKUgLb93dKSd7+XpWemcXXK2eHp3jnFJkNi5ORktKkv7DbiyoeYo6BPcA+6pZpQHKOO+F\/JF8U3LCskv9t2mWJlqdi9aw04UgLCupI7HpT6b9Kz3FXFfOdkm2a337kCAzj1ocT0R4pW6p9tPo2oKSkdOhr17V0hSgOUpfh85Dw7N7ndeMrrj67bciSpi6tqJa2d6ACSDrv339qnrhzG8hxfDkW\/J7nDuNyU8p1xyKx5aE717PxVr4kDtoa7VudKAvG\/y0\/QVWqN\/lp+gqtAWVKUoBXwmxI82OuNLZQ8ysaUhadgivvSsp6e0YaTWmRTlvDFpnFT1mkqt7p79B7t7\/lV\/xVht1xW03eHPUy6uSSWlNq7H2dVI9NCpLb7LmnY96IqMeqhNVx0n1IJ4lwzJrPn6bjcrYtiKEuDrKgfU9qyGY8V3jI84mXMy40aE6pJBJ2sgAD0qZtCmhUaentErW1pmkYbxrj2PqTILX42WO\/mvDej8h6Ct1SgJ9O2vTVeqVJdfZdL1WPbIaMarHj6Ko6QpSlRE4pSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAXjf5afoKrVG\/y0\/QVWgLKlKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUBeN\/lp+gqtUb\/LT9BVaA\/\/Z\" alt=\"logo\">\n      <div class=\"logo-actions\">\n        <button class=\"btn-sm btn-sm-out\" onclick=\"document.getElementById('logo-input').click()\">Change<\/button>\n        <button class=\"btn-sm btn-sm-clear\" onclick=\"removeLogo()\">Remove<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- FROM -->\n  <div class=\"section\">\n    <div class=\"sec-label\">From \u2014 Your Business<\/div>\n    <div class=\"row\"><div class=\"field\"><label>Business Name<\/label><input class=\"input\" id=\"from-name\" oninput=\"render()\" placeholder=\"e.g. Acme Co.\"><\/div><\/div>\n    <div class=\"row\">\n      <div class=\"field\"><label>Email<\/label><input class=\"input\" id=\"from-email\" oninput=\"render()\" placeholder=\"hello@yourbiz.com\"><\/div>\n      <div class=\"field\"><label>Phone<\/label><input class=\"input\" id=\"from-phone\" oninput=\"render()\" placeholder=\"(555) 000-0000\"><\/div>\n    <\/div>\n    <div class=\"row\" style=\"margin-bottom:12px\"><div class=\"field\"><label>Address<\/label><input class=\"input\" id=\"from-address\" oninput=\"render()\"><\/div><\/div>\n    <div class=\"save-row\">\n      <button class=\"btn-save\" id=\"save-btn\" onclick=\"saveBiz()\">\n        <svg width=\"11\" height=\"11\" viewBox=\"0 0 11 11\" fill=\"none\"><path d=\"M1.5 5.5l3 3 5-5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n        Save business info\n      <\/button>\n      <button class=\"btn-reset\" onclick=\"resetBiz()\">Reset<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- TO -->\n  <div class=\"section\">\n    <div class=\"sec-label\">Bill To \u2014 Client<\/div>\n    <div class=\"row\"><div class=\"field\"><label>Client Name<\/label><input class=\"input\" id=\"to-name\" oninput=\"render()\" placeholder=\"Client name\"><\/div><\/div>\n    <div class=\"row\">\n      <div class=\"field\"><label>Email<\/label><input class=\"input\" id=\"to-email\" oninput=\"render()\" placeholder=\"client@email.com\"><\/div>\n      <div class=\"field\"><label>Phone<\/label><input class=\"input\" id=\"to-phone\" oninput=\"render()\" placeholder=\"(555) 000-0000\"><\/div>\n    <\/div>\n    <div class=\"row last\"><div class=\"field\"><label>Address<\/label><input class=\"input\" id=\"to-address\" oninput=\"render()\" placeholder=\"123 Street, City\"><\/div><\/div>\n  <\/div>\n\n  <!-- INVOICE DETAILS -->\n  <div class=\"section\">\n    <div class=\"sec-label\">Invoice Details<\/div>\n    <div class=\"row\"><div class=\"field\"><label>Invoice #<\/label><input class=\"input\" id=\"inv-number\" value=\"INV-001\" oninput=\"render()\"><\/div><\/div>\n    <div class=\"row last\">\n      <div class=\"field\"><label>Issue Date<\/label><input class=\"input\" type=\"date\" id=\"inv-date\" oninput=\"render()\"><\/div>\n      <div class=\"field\"><label>Due Date<\/label><input class=\"input\" type=\"date\" id=\"inv-due\" oninput=\"render()\"><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- LINE ITEMS -->\n  <div class=\"section\">\n    <div class=\"sec-label\">Line Items<\/div>\n    <div id=\"items-container\"><\/div>\n    <button class=\"add-btn\" onclick=\"addItem()\">+ Add Line Item<\/button>\n  <\/div>\n\n  <!-- DISCOUNT & TAX -->\n  <div class=\"section\">\n    <div class=\"sec-label\">Discount &amp; Tax<\/div>\n    <div class=\"row last\">\n      <div class=\"field\">\n        <label>Discount %<\/label>\n        <input class=\"input\" type=\"number\" min=\"0\" max=\"100\" id=\"discount\" placeholder=\"0\" oninput=\"render()\">\n      <\/div>\n      <div class=\"field\">\n        <label>Tax %<\/label>\n        <input class=\"input\" type=\"number\" min=\"0\" id=\"tax\" placeholder=\"0\" oninput=\"render()\">\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- NOTES -->\n  <div class=\"section\">\n    <div class=\"sec-label\">Notes<\/div>\n    <textarea class=\"input\" id=\"notes\" rows=\"2\" placeholder=\"e.g. Thank you for your business!\" oninput=\"render()\"><\/textarea>\n  <\/div>\n\n  <!-- ACTIONS -->\n  <div class=\"actions\">\n    <button class=\"btn btn-primary\" onclick=\"window.print()\">\n      <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"><path d=\"M7 1v8M4 6l3 3 3-3M2 11h10\" stroke=\"white\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n      Print \/ Save as PDF\n    <\/button>\n    <button class=\"btn btn-sec\" onclick=\"shareEmail()\">\n      <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"><rect x=\"1\" y=\"3\" width=\"12\" height=\"9\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.4\"\/><path d=\"M1 4l6 4 6-4\" stroke=\"currentColor\" stroke-width=\"1.4\"\/><\/svg>\n      Share via Email\n    <\/button>\n    <button class=\"btn btn-ghost\" onclick=\"shareText()\">\n      <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"><rect x=\"1\" y=\"1\" width=\"12\" height=\"9\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.4\"\/><path d=\"M4 13l2-3h4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\"\/><path d=\"M4 5h6M4 7.5h4\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"\/><\/svg>\n      Share via Text\n    <\/button>\n  <\/div>\n<\/div>\n\n<!-- PREVIEW -->\n<div class=\"preview\">\n  <div class=\"preview-label\">Live Preview<\/div>\n  <div class=\"card\" id=\"invoice-card\"><\/div>\n<\/div>\n\n<script>\nconst STORAGE_KEY = \"invoice_biz\";\nconst DEFAULT_LOGO = \"data:image\/png;base64,\/9j\/4AAQSkZJRgABAQAAAQABAAD\/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb\/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7\/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7\/wAARCAB+AQwDASIAAhEBAxEB\/8QAHQABAAEFAQEBAAAAAAAAAAAAAAcBBAUGCAIDCf\/EAEIQAAEDBAECAwYCBggEBwAAAAECAwQABQYRBxIhCBMxIkFRYXGBFDMjMkKhscEVFjdSYnKR0Rg0NrIkJ0SCwuHw\/8QAGwEBAAIDAQEAAAAAAAAAAAAAAAMFAQQGAgf\/xAAxEQACAgIBAwIDBwMFAAAAAAAAAQIDBBEFITFBElEGE2EUInGBscHwkaHhFiQyQnL\/2gAMAwEAAhEDEQA\/AOvqUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQF43+Wn6Cq1Rv8tP0FVoCypSlAKUJA99W1wnRYEVcmXIbYZR3UtagAKyk29Iw2orbLmlRbknLkOOpTVljmSodvNcBCfsK2fAL\/NvmIG7TOjziXOyRoDROv4VuW8ffVUrZx0uxXUcvi5Fzpqltpb6dun1NrpURcaZlfLrmTsGdJ8yO4lZCCkezo+6slyNnlzxnJWYkZpl6MthKylY772R6\/apJcXer\/kLTlrZBDncaWN9pe1HeuxJdK0fFOSLLenEx31\/gZJOgh06Sr6H0rd0qSQCCCDWpdRZRL02R0yxxsunKh66ZJorSlKhNgUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgLxv8tP0FVqjf5afoKrQFlSleXFJQ2pajpKRs0Bi8ovcKxWpyfNX0pQPZQPVZ9wFQXcbnkOfXz8O0hakE\/o2kn2G0\/E1cZ9eZeY5em3wNqYQ4GWED0J3oqP8A+9KkqDHtHHeJea8EqkqA6lftOr+A+VdDXGHGUqyS3ZLt9Dj7ZW85kyqg9Uw7v3ZjbBxzj9jiiZfnm5DoG1eYdNpPyHvrcLZJtkmwvrtBQYqULSnoTobGwagjJ8kul\/lKflOrSzvSGkkhCf8Ac1KnE39navq7\/E1T3ZNt8vVZLZ0ePg4+JW40xS\/Uj3h3+0JP+Rz+NS5kRxibNFrvIjl5bYUlLo12JI7H7VEfDv8AaGn\/ACOfxrJ84kjK4+t7EZP\/AHKq05yTjlRcXp6X7lH8LwjPBlGS2vU\/2PvmvFy47Sp+OuqdQkdRYUfa1\/hPvq144z6VaZSbPfFLVG30JcX+s0fgflTAM7lWmSiDd3FuwlkJC1\/rN\/PfwrL8uYixOgf1jtCElSU9TyUei0\/3vrXrEzo5S+zZfVPs\/KZ45Dip4MnmYHRrvHw1\/P8ABKzLiHW0uNqCkKAKSPQivVRZwjlLkuMuxTXOp1kdTClHuU\/D7fzqTLg87Ht8iQwwqQ620paGk+qyBsJH1qoy8aWLa65eDoeOzIZ9Mba\/P9mfelQBC8QN6nXaTa4XH8uTLihSnmW5O1ISk6JI6fmK33jDlnH84RIYbQ5brhFSVPxXlbIA9SD23rXwqury6bHpM6XK+HuRxa3ZZX0XfTT1vtvTfT6khUqCLt4iIy8idgY1jcm8RI5PmvoXorSPVSRo9vnW1cP8sNch3i4wmLOuC3DQFha3eoq761rQ1SGXTOXpi+oyPh7kceh3216ilt9V0322t7JNpWIzS8PWDFrheWIaprkRkuhhKtFevduoPsfiYZnXmDDlYyqKxJfQ2t4ydhCSoAq1099V6tya6pKM3rZFgcJm8hXK3Hh6lHv1X4+WdD0rx5zQaS6pxKUKAIKjre6p+IY2B57W1entjvU5V6Z9KV4W80hXSt1CVfAqANEPNLUUodQpQ9QFAmg0z3SoSwXk7L7lzPcMJvMW2IjxQ8pJYQrrIToo7lRHoRvtWz8bZdmN8zK+W2\/2BuBbYqlfhH0g+0ArQ2SSDsd+wFa8MmE9a330W+TweTjKTm10ipd11T7a9yRqVbf0hB83yfxkfzN66fMG6+y3Wm9dbiE79NqA3U+ypcWu6PdK+X4mP5wZ89rzCNhHWNn7V6ddaa15riEb9OpQFZMaZ7pXlLraiQlxB166V6V5akR3VFLT7S1D1CVgmg0z6UpShgvG\/wAtP0FVqjf5afoKrQFlWq8oXZdpw+Y8hRQ44PKQR8TW1VGHiAfKLJBjb7OPKUfsB\/vW5x9StyoRfbZW8ve6MKya76\/XoYfgSyofmyry6gKLH6JrY9CR3P8ApWK5Gu8jJc0TbYqitppzyGUj0J96q3nicJhcaOSx2Vp5w69+ia0PhyOifn4edAV5SFvDfx2Bv99Tcpa7cubfjp\/Qh4HHjRgVpeVt\/mZnkuwRscwi2xWEDzS8VOr96laFbPxESrjlRPxd\/iasfED\/ANPwT7vxB\/gKu+G1BzjtSEHqUFOggfHZqvRbS7M0Lh3+0NP+Rz+NX\/OiynMI43\/6VP8A3Kqz4eZdHIZ22seWhzq2PTuPWvvzw4P64xwO5EZOwP8AMqrnnH\/uV+COb+FU1hP\/ANP9jL8hYuh\/EYN\/htpS+zFb88Aa609I7\/UVkeFr3\/SllkWKYpK1MI0gK77bPYj7VuVqjCbhcaM+jSXoKUKT9UaqGOJnlQ+Rm46T2cDjSh9O\/wDKqU6Vo+ElD2H8kextDbT4UnXvQr3fT\/auh2lpW2lxJ2lQ2DUH88sBnKoskdiuOP3KNStYUJvGDRGX1LSmVAShaknR9pGiR\/rV3yr+bj03+WtM5jgUqM3Ixf8AqntfTf8AEc78FPNM+IjJnnXUNtJjyFKUpWgB5iK020Ifu\/LWVSMUQoILEpSFNdhrts\/cgn51OX\/DrhAeW6Jd3Ste+oiTondb3gmAYxhcNyPZIAQp0adecPU44PgTXFwwrZJRlpJNs+25HxNgVSsuo9UpShGGmtLp5fV7IC8HF3sMCbeo0+TGjTnkJLanlBPW2NbSCfXv31Uy8Ww+N27xd5GEOx1ywvy5haeKgTvewN61v3jtWFyjgHC7zd3LnHVLtrrqytxEdWkEn10PdW4cd8f45gsNxixxlJcd15z7iupa\/qa2MWi2vUJJaXnyVfOcngZrsyKbJqdijuPjp7vfVe31NY8T1\/Nl4ulRmVkSbksRUAHRIP6xH7q5qz2w3SDgdhVJxWZbW4aFJXMcHsveYoq\/ie1dT8j8TY5nd4aul4fnpdaZDKUsu9KdAk718e9Y++cI4reLXbLdMl3Ms25kstAP+oKur2vie9RZWLbdOT+mkbnA89gcZj1Qbe\/U5S6P20tdevt199mncg3Y5X4Y4d\/bmvsS4XlOKLS9EuD2Ck692l\/uqJ5Vpmx+HYGeN5XcVz0zvw6GBIJDY+XfYPv+4qVuVOP7ZgPE11tuNxbtcHLxIZZ6Bt3yyna+rQ9B7JH3FYDhPiGxZbjCX7\/FvcCVFfKH2XCW0O+hBSD8jr7Vr3VWWWqDX3vT7+fcuOOzsPEwZZEZtVK1tfdTbi11jrfRb6bNQ5WvV6uFhxDIXbrLYmTYXQ8pLpSCUK6Qvt7zrdX+QtXXjXlTH02jKJ1wVMSw4+l14qK+sgEKG9EHfbfwrO+KGzu\/01YLFZMfnOQbZFSj\/wAOwpSOnfoCPfqpB4x4cxBldsy1Ue5rkFpLrUacvZZVr3j4isKiyd0orutdf1JJ8tiY3HVXWL7klNehJPe391N+NI0XDEiR4r78he0hyO6Do9xtpurXhKci0Zfn8W5XSeu226FIR1l5RWlCFkbT3\/W0PdUqMcF4izky8gRJuYmLfU8T5\/baiSR9O9VxvgrDbHcHZjK57\/nMOMOtvPdSXErSUq38exNbEcW5ST0u7ff3Ki7nuNsqnByl1rhH\/j5i++9+TmTI2be5jgyexWe8xwmb5abs9IKi4vSiQe\/Y9gdj4VI3MM64zuD8NyVy5SkT1JU0tSHSOsBWtn4ntUiMeHfD0tyI7s65uRXD1NM+bpLR36j4n3VdvcB4c9YmLM5KuhisPrfQC\/3ClBIP29kfvqKOFelJaXVe\/k3bvibi52Uy9Un8uTfWO36WmtdX\/j2RA+V2+fid2wXI42QXGVOucKPKccfdJKCek9APvTrto1smUTJ2c+IFOM3y9SoFsaX5baEPFAOk7BHu2T76lWdwLh0y1QLc9JuZZghQZPn99KUVH+NXOXcI4jkRhvOrmRpcVoMiQ057S0j06vifnXr7Fck9LptPW+\/uQ\/6l46UouTfqUZx9XpW1t7i0voumiH85tmV8cY1kcmJlhnt3CS1FDjckrejoT1HpUd7SSlSfn2rF4xZ8vgIx7IcSteQokuFtyW+8+CzK6tHsAfQ71o+6p\/s\/DmGW\/G51jVHkS252jIdec6lkjeiD7tbNYfHuBMZtN1Ymm6XaQiM4HGGS8QlJB2N\/GsywrPUml0\/Ht1\/A8VfE2EqZxlLct93DpNelJJpSWvz\/AB7ksxytTDanBpZSCofA6717okBKQB6AapVwfOmXjf5afoKrVG\/y0\/QVWhgsqi\/xCM7scCUO4bfKT\/7gNfwqUK1blK0LvGFzozSAp5A81sa9SK3OPtVWVCT7bK7l6HfhWwj31+nUwfEi03DjV2GNFSfNaOvnuo+4cmJt\/IaWHz0l9K2Rv3He\/wCVZPw95Cli6yrHIIR+J\/SND4rA7j\/SsTytaJOMZqm7REKQw+757KgNALHqKm5Wl1Zc0\/PX+prcBkxvwK2vC0\/yJj5JsByDFn4bP\/MI\/SM\/5h7qhvjzMpOGT34FxjLXGUvTrfoptQ9SKmXAcph5PZESWXEiUgBMhrfdKv8AY188qwWwZIsvzI3lyT285r2VH669ari6Nae5Pw+G07Kt8NS5bg9EtBJUfmaj2zsXbkDN\/wAQ6klClhTygPZbQPQVIEbhiytvBTtwluNg76Ow39632wWS2WGGIttitsN+p6R3UfiT76y3s8qKXRH2nvs2y0POqIQzGZJ+gAqBuIG1z+SEyRvpbDjp+\/b+dbTzpmTLURWO298Kec\/5pST+on+7v4mrrg6x\/wBEY\/Iv85AbVJR1IKu3S2O+\/v8AyrCMt6Ne57kh7Ko0ZIJLccDXzKjUv4gwqNi9sYWNKRFbBHz6RXPvnPZpyoegqU27I0Cn3Np7f\/f3rpVpIQ2lCdaSNDVXvLL5OPTQ+6W2ctwMvtOXkZS7N6X5fxEUXfxD8W2q7SLVNvTrcuO4W3G\/J2QoevvrZePOUsHz196PjN8YlyWR1OMejiR8dfCuOuXHWbL4yvxUXHDeUtO+YbawyFGR+jXsBOtE+\/7VsHhEas+QeIHI8uaLFiejod8qxpbKFJSrQV8uxSdgehNUJ1R2zSuLcr58zjJuRL9bbDmFnw61WguBj8a2gmUpCikDZG9nXp6d6+9w8QHJNy4I\/rbarhCg3S13NMOe4IqFpkIUlRSoBQIB9k71QHZdK4hu3MnPthwfGeRblc7e\/ZbktSPw4htJUsJVratDY33A18K27mjlu9SI2N3S2clW\/Ebfd7Y1J\/B\/hFPvocWkE9XQkqSnv6ntQHVkp5EeM7Id30NIK1aG+wGzUe8ScwYzyVdLzbbGzMaetTgS957fSFAkgEH6pPaoV8L\/ADLm2ZTsmw263OPcZkO1vS4Fy8pOgUlKRsa9obWD3+FYrw7ZnnF0sHJqYb9igXi3Nhxh+LaWGEl4KcClrCEDrJ6f2t0B2LWKyzIrNithkXy\/TmoUCONuOuHQG+wH1NcweGfkXmrlO\/wpk6XFcx+1yCm4vobbaU8SNpT0jW9Aj0qTvGBh0nNuKxa4N1jQpjEtMlpp+QlpMkpSoFG1ED0Vv7UB6sfiX4nupmBu9PRvwqFLJkM9HmAevT371ImA5jYs5x9F+x2UZMFa1ISsp1spJB\/eK\/PyDPGF4c9hnJPFwER9wlm7phBuUgnXdt0gBY+5qTbty1bOK+GsbsXEVxMhV3W68JU9CeuMC4oKBB7bCtjZ93egO1qVx\/xpzbnUXkyDhd1y6zZYxeI6ksTIbaQIr3QpSd6HfRGiDWIwrk\/xCZ3mF3wqy3OC+\/BlEPyww0z5KErUk99De9fXtQHa9YzLL5DxrG59+uAcMWEyXXA2naiB8BXKuPcm80WzxANcd5nlVtYYSpZU+qA0ht1PQVJIITvv219a8YZnfNuXYBnOSPZHanrNbWXGIpetjXS+sLHV2KO4CAoEH+8KA6M4e5IsfJ+MOX6xNyWmGpCo60Po0oKAB+40oVulcWYpzlkGJeGYXqJFtTd2l3h2JDTGt7UdllKW2yT5baQkna\/eK2Kz5X4kIcbCbpOkpu1pvsliRLXDtSVrixlkFSXOlPsjpO9+6gOsaVxBdfEHnuWZNe3rJmdmxK2WxK1RI8xpBXJKf2e42VHX0rofwtcmz+UeN1Xe7R0NXGHKVDkKQAEuqSlKusAdhsKHb5UBMjf5afoKrVG\/y0\/QVWgLKqOAKQUqGwRo1WlAc38pWGXh2You9sCm47rnnMrA7IXvZSfvUn2efZeTcNMSZ0JlJSPMRv2mlj9ofKtuyaxwMgtTtuuDIW04Ox96T7iPnXO+RWHJeOb2mZDddSz1foZDY2lY\/uqFdFVOvk6VVN6sj2fuclZVZwuRK+pbql3XsVvFpynjm+fio6lpZ37EhHdDg+CvhUw8U5nIyu0yH5kZth2MoJWpKuyu29691RtlHJsXJcEkWqfFUxcD06Unuhevf8qzPh5\/6av3fftf\/CqXIx7MefosWmdJi5dWVX8yp7RIlgzewXy7PWu3yyuS0CdKToKA9dVHXLPJF5hXmXjtsZRH8vSS+FbWrYB7D3etavwgf\/M9A\/wO\/wAateU30M8rzHnOyEPNqV9OkVAlt6NhvS2bBxnxzPu8xN5yNC24vV5gbc\/XePz+ArLc0ZvHiwVYxZXE9RT0vqb9EJH7IrF55yzJuCDbcbQqOyodKnyPbUP8PwqvFvGku4zGr3kSVpjg+Yhlf6zqvcVfKugxcGOIvtOX012XnZyufyU89vDweu+8vCX8\/wAGw8C4g5bIC79ObCZEkaZSfVLfx+pqWB6V5aQlDaUJQEpSNAAdgK9VTZWTLJtdsvJf4GFDCojTDsv7v3OVbzwDynL5uTyOxkVgDrU4OtBS3eoM70UkdGt9JUPWrOV4YczhctTL9jmUQoVnuLijKX1LEhKHD1OICQNHZ9PaFdbUrXNw5Yv3h9zvGORbpk3GFzsSot1UpTse6oUryupXUQAEkEAnsaxPiTtF5xHw2i05hebfMvU66IcSIjBQjslW0g67gfMCuvaw+T4vj+TsNM3+0xri20rqbS+nYSfiKA4q434lzzlrjHGrexmdpViEF1ZUx+k8+M4VbUgjp0o60R3\/AGqkXOPDjlluz20ZRxzdbSv8DDYiJYuyVFKPLaDfVoA9WwnZ9O5rpXGsesmNwVQbFbY9vjKWXFNsp0kqIAJ\/0ArJ0Bylxx4euTsJz6fktuyWwKE+I\/HkdnEqUHE7Gh06GlhB9fQGvXGXAPKuHRcrDeR4\/wCdfoakEpW6QHiSQo7QND2j8a6rpQEFeFTiPMeJ0XaDfbta5lumdLjTcRSypLo0CSVJHbVZXxScX5BylitstOP3CFCejTg+6uS4tIKOhSdDpSdnahUwUoDj7OvDfzDebbb8aGewbnYIqUFCJrjiVNK0NgAIOwDvXetgybwqJd4qs1jsl9bTkVqcW8mU8gpbdUolRR22UgE9jo+npXUNKA5844465mjX9q4ZRfMXYjxYzjbLUKKVKdWU6SVEpGtHR2N+\/t3qy8P3CXIPHnKFxya63yyybfcw4ZjcdbhcUoqKkkbQB+0r310hSgII8T\/CFy5KmWu+YtPh22+QttrekKUgLb93dKSd7+XpWemcXXK2eHp3jnFJkNi5ORktKkv7DbiyoeYo6BPcA+6pZpQHKOO+F\/JF8U3LCskv9t2mWJlqdi9aw04UgLCupI7HpT6b9Kz3FXFfOdkm2a337kCAzj1ocT0R4pW6p9tPo2oKSkdOhr17V0hSgOUpfh85Dw7N7ndeMrrj67bciSpi6tqJa2d6ACSDrv339qnrhzG8hxfDkW\/J7nDuNyU8p1xyKx5aE717PxVr4kDtoa7VudKAvG\/y0\/QVWqN\/lp+gqtAWVKUoBXwmxI82OuNLZQ8ysaUhadgivvSsp6e0YaTWmRTlvDFpnFT1mkqt7p79B7t7\/lV\/xVht1xW03eHPUy6uSSWlNq7H2dVI9NCpLb7LmnY96IqMeqhNVx0n1IJ4lwzJrPn6bjcrYtiKEuDrKgfU9qyGY8V3jI84mXMy40aE6pJBJ2sgAD0qZtCmhUaentErW1pmkYbxrj2PqTILX42WO\/mvDej8h6Ct1SgJ9O2vTVeqVJdfZdL1WPbIaMarHj6Ko6QpSlRE4pSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAXjf5afoKrVG\/y0\/QVWgLKlKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUBeN\/lp+gqtUb\/LT9BVaA\/\/Z\";\nconst DEFAULT_BIZ = {\n  name:\"DC Appliance Repair Service\",\n  email:\"duramaax@gmail.com\",\n  phone:\"202-480-6270\",\n  address:\"1701 Rhode Island Ave NW, 2nd Floor, Washington, DC\"\n};\n\nlet logoSrc = DEFAULT_LOGO;\nlet items = [];\nlet itemId = 0;\n\nconst fmt = n => new Intl.NumberFormat(\"en-US\",{style:\"currency\",currency:\"USD\"}).format(Number(n)||0);\nconst esc = s => String(s||\"\").replace(\/&\/g,\"&amp;\").replace(\/<\/g,\"&lt;\").replace(\/>\/g,\"&gt;\");\nconst val = id => document.getElementById(id)?.value || \"\";\n\nfunction init() {\n  try {\n    const saved = localStorage.getItem(STORAGE_KEY);\n    if (saved) {\n      const b = JSON.parse(saved);\n      document.getElementById(\"from-name\").value    = b.name    || \"\";\n      document.getElementById(\"from-email\").value   = b.email   || \"\";\n      document.getElementById(\"from-phone\").value   = b.phone   || \"\";\n      document.getElementById(\"from-address\").value = b.address || \"\";\n    } else {\n      document.getElementById(\"from-name\").value    = DEFAULT_BIZ.name;\n      document.getElementById(\"from-email\").value   = DEFAULT_BIZ.email;\n      document.getElementById(\"from-phone\").value   = DEFAULT_BIZ.phone;\n      document.getElementById(\"from-address\").value = DEFAULT_BIZ.address;\n    }\n  } catch(_) {\n    document.getElementById(\"from-name\").value    = DEFAULT_BIZ.name;\n    document.getElementById(\"from-email\").value   = DEFAULT_BIZ.email;\n    document.getElementById(\"from-phone\").value   = DEFAULT_BIZ.phone;\n    document.getElementById(\"from-address\").value = DEFAULT_BIZ.address;\n  }\n  document.getElementById(\"inv-date\").value = new Date().toISOString().slice(0,10);\n  addItem();\n}\n\nfunction saveBiz() {\n  const b = {name:val(\"from-name\"),email:val(\"from-email\"),phone:val(\"from-phone\"),address:val(\"from-address\")};\n  try { localStorage.setItem(STORAGE_KEY, JSON.stringify(b)); } catch(_) {}\n  const btn = document.getElementById(\"save-btn\");\n  btn.innerHTML = \"&#10003; Saved!\";\n  btn.style.cssText += \";background:#cc785c;color:#fff;border-color:#cc785c\";\n  setTimeout(() => {\n    btn.innerHTML = '<svg width=\"11\" height=\"11\" viewBox=\"0 0 11 11\" fill=\"none\"><path d=\"M1.5 5.5l3 3 5-5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg> Save business info';\n    btn.style.background=\"\"; btn.style.color=\"\"; btn.style.borderColor=\"\";\n  }, 2200);\n}\n\nfunction resetBiz() {\n  document.getElementById(\"from-name\").value    = DEFAULT_BIZ.name;\n  document.getElementById(\"from-email\").value   = DEFAULT_BIZ.email;\n  document.getElementById(\"from-phone\").value   = DEFAULT_BIZ.phone;\n  document.getElementById(\"from-address\").value = DEFAULT_BIZ.address;\n  try { localStorage.removeItem(STORAGE_KEY); } catch(_) {}\n  render();\n}\n\nfunction handleLogoUpload(e) {\n  const file = e.target.files[0];\n  if (!file) return;\n  const reader = new FileReader();\n  reader.onload = ev => {\n    logoSrc = ev.target.result;\n    document.getElementById(\"logo-thumb\").src = logoSrc;\n    document.getElementById(\"logo-empty\").style.display = \"none\";\n    document.getElementById(\"logo-filled\").style.display = \"flex\";\n    render();\n  };\n  reader.readAsDataURL(file);\n}\n\nfunction removeLogo() {\n  logoSrc = null;\n  document.getElementById(\"logo-empty\").style.display = \"block\";\n  document.getElementById(\"logo-filled\").style.display = \"none\";\n  render();\n}\n\nfunction addItem() {\n  const id = ++itemId;\n  items.push({id, desc:\"\", qty:1, rate:\"\"});\n  renderItems();\n  render();\n}\n\nfunction removeItem(id) {\n  items = items.filter(i => i.id !== id);\n  renderItems();\n  render();\n}\n\nfunction updItem(id, field, v2) {\n  const item = items.find(i => i.id === id);\n  if (item) { item[field] = v2; render(); }\n}\n\nfunction renderItems() {\n  const c = document.getElementById(\"items-container\");\n  c.innerHTML = \"\";\n  items.forEach(item => {\n    const div = document.createElement(\"div\");\n    div.className = \"item-card\";\n    div.innerHTML = `\n      <button class=\"rm-btn\" onclick=\"removeItem(${item.id})\">&#215;<\/button>\n      <div class=\"sub-label\" style=\"margin-bottom:5px\">Description<\/div>\n      <input class=\"input\" style=\"margin-bottom:10px;padding-right:28px\"\n        placeholder=\"Service or product description&hellip;\"\n        value=\"${esc(item.desc)}\"\n        oninput=\"updItem(${item.id},'desc',this.value)\">\n      <div class=\"item-grid\">\n        <div>\n          <div class=\"sub-label\" style=\"margin-bottom:5px\">Qty<\/div>\n          <input class=\"input\" type=\"number\" min=\"0\" value=\"${esc(item.qty)}\"\n            oninput=\"updItem(${item.id},'qty',this.value)\">\n        <\/div>\n        <div>\n          <div class=\"sub-label\" style=\"margin-bottom:5px\">Rate ($)<\/div>\n          <input class=\"input\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${esc(item.rate)}\"\n            oninput=\"updItem(${item.id},'rate',this.value)\">\n        <\/div>\n        <div>\n          <div class=\"sub-label\" style=\"margin-bottom:5px\">Amount<\/div>\n          <div class=\"amt-badge\" id=\"item-amt-${item.id}\">${fmt((Number(item.qty)||0)*(Number(item.rate)||0))}<\/div>\n        <\/div>\n      <\/div>`;\n    c.appendChild(div);\n  });\n}\n\nfunction calcTotals() {\n  const discountPct = Number(val(\"discount\")) || 0;\n  const taxPct      = Number(val(\"tax\"))      || 0;\n  const subtotal    = items.reduce((s,i) => s + (Number(i.qty)||0)*(Number(i.rate)||0), 0);\n  const discountAmt = subtotal * (discountPct \/ 100);\n  const afterDisc   = subtotal - discountAmt;\n  const taxAmt      = afterDisc * (taxPct \/ 100);\n  const total       = afterDisc + taxAmt;\n  return {discountPct, taxPct, subtotal, discountAmt, afterDisc, taxAmt, total};\n}\n\nfunction render() {\n  const {discountPct, taxPct, subtotal, discountAmt, afterDisc, taxAmt, total} = calcTotals();\n\n  \/\/ Update live item amounts in sidebar\n  items.forEach(item => {\n    const el = document.getElementById(`item-amt-${item.id}`);\n    if (el) el.textContent = fmt((Number(item.qty)||0)*(Number(item.rate)||0));\n  });\n\n  const fromName    = val(\"from-name\");\n  const fromEmail   = val(\"from-email\");\n  const fromPhone   = val(\"from-phone\");\n  const fromAddress = val(\"from-address\");\n  const toName      = val(\"to-name\");\n  const toEmail     = val(\"to-email\");\n  const toPhone     = val(\"to-phone\");\n  const toAddress   = val(\"to-address\");\n  const invNum      = val(\"inv-number\") || \"\u2014\";\n  const invDate     = val(\"inv-date\");\n  const invDue      = val(\"inv-due\");\n  const notes       = val(\"notes\");\n\n  \/\/ Per-item applied amounts (discount + tax applied proportionally)\n  const itemRows = items.map((item, idx) => {\n    const baseAmt   = (Number(item.qty)||0) * (Number(item.rate)||0);\n    \/\/ Apply discount then tax to each item amount\n    const afterD    = baseAmt * (1 - discountPct\/100);\n    const finalAmt  = afterD * (1 + taxPct\/100);\n    const hasAdj    = discountPct > 0 || taxPct > 0;\n    const stripe    = idx % 2 !== 0;\n\n    return `<div class=\"item-row${stripe?\" stripe\":\"\"}\">\n      <div class=\"item-desc\">${esc(item.desc) || '<span style=\"color:#ccc;font-style:italic;font-weight:400\">No description<\/span>'}<\/div>\n      <div class=\"item-nums\">\n        <span><\/span>\n        <span style=\"font-size:12px;color:#aaa;text-align:right\">${Number(item.qty)||0} &times; ${fmt(item.rate)}<\/span>\n        <span style=\"font-size:12px;color:#${hasAdj?\"aaa\":\"1a1a1a\"};text-align:right;${hasAdj?\"text-decoration:line-through\":\"\"}\">${fmt(baseAmt)}<\/span>\n        <span style=\"font-size:13px;font-weight:700;color:#1a1a1a;text-align:right\">${hasAdj ? fmt(finalAmt) : \"\"}<\/span>\n      <\/div>\n    <\/div>`;\n  }).join(\"\");\n\n  const fromDetails = [fromEmail,fromPhone,fromAddress].filter(Boolean).map(x=>`<div class=\"party-detail\">${esc(x)}<\/div>`).join(\"\");\n  const toDetails   = [toEmail,toPhone,toAddress].filter(Boolean).map(x=>`<div class=\"party-detail\">${esc(x)}<\/div>`).join(\"\");\n\n  const logoHTML = logoSrc\n    ? `<img decoding=\"async\" src=\"${logoSrc}\" alt=\"logo\" style=\"height:56px;max-width:160px;object-fit:contain\">`\n    : `<div style=\"height:56px;display:flex;align-items:center;justify-content:center;background:#2a2a2a;border-radius:8px;padding:0 16px;border:1.5px dashed #3a3a3a;cursor:pointer\" onclick=\"document.getElementById('logo-input').click()\"><span style=\"font-size:11px;color:#555\">+ Add Logo<\/span><\/div>`;\n\n  const hasAdj = discountPct > 0 || taxPct > 0;\n\n  document.getElementById(\"invoice-card\").innerHTML = `\n    <div class=\"card-header\">\n      <div class=\"card-header-left\">\n        ${logoHTML}\n        ${fromName ? `<div style=\"font-size:12px;color:#666\">${esc(fromName)}<\/div>` : \"\"}\n      <\/div>\n      <div class=\"card-header-right\">\n        <div class=\"inv-title\">INVOICE<\/div>\n        <div class=\"inv-number\">${esc(invNum)}<\/div>\n        <div class=\"inv-dates\">\n          <div class=\"inv-date-row\"><span style=\"color:#555;margin-right:6px\">Issued<\/span><span style=\"color:#aaa;font-weight:500\">${esc(invDate)}<\/span><\/div>\n          ${invDue ? `<div class=\"inv-date-row\"><span style=\"color:#555;margin-right:6px\">Due<\/span><span style=\"color:#cc785c;font-weight:600\">${esc(invDue)}<\/span><\/div>` : \"\"}\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"parties\">\n      <div class=\"party-border\">\n        <div class=\"party-lbl\">From<\/div>\n        <div class=\"party-name\">${esc(fromName)||'<span style=\"color:#ccc;font-style:italic\">&#8212;<\/span>'}<\/div>\n        ${fromDetails}\n      <\/div>\n      <div class=\"party\">\n        <div class=\"party-lbl\">Bill To<\/div>\n        <div class=\"party-name\">${esc(toName)||'<span style=\"color:#ccc;font-style:italic\">&#8212;<\/span>'}<\/div>\n        ${toDetails}\n      <\/div>\n    <\/div>\n\n    <div class=\"items-wrap\">\n      <div class=\"items-head\">\n        <div class=\"items-col-h\">Description<\/div>\n        <div class=\"items-col-h\" style=\"text-align:right\">Qty &times; Rate<\/div>\n        <div class=\"items-col-h\" style=\"text-align:right\">${hasAdj ? \"Base Amt\" : \"Amount\"}<\/div>\n        <div class=\"items-col-h\" style=\"text-align:right\">${hasAdj ? \"Final Amt\" : \"\"}<\/div>\n      <\/div>\n      ${itemRows}\n    <\/div>\n\n    <div class=\"totals-wrap\">\n      <div class=\"total-row\"><span style=\"color:#999\">Subtotal<\/span><span style=\"color:#555\">${fmt(subtotal)}<\/span><\/div>\n      ${discountPct > 0 ? `<div class=\"total-row\"><span style=\"color:#4a9e6b\">Discount (${discountPct}%)<\/span><span style=\"color:#4a9e6b;font-weight:600\">&#8722;${fmt(discountAmt)}<\/span><\/div>` : \"\"}\n      ${(discountPct > 0 && taxPct > 0) ? `<div class=\"total-row\" style=\"font-size:12px\"><span style=\"color:#bbb\">After Discount<\/span><span style=\"color:#888\">${fmt(afterDisc)}<\/span><\/div>` : \"\"}\n      ${taxPct > 0 ? `<div class=\"total-row\"><span style=\"color:#cc785c\">Tax (${taxPct}%)<\/span><span style=\"color:#cc785c\">${fmt(taxAmt)}<\/span><\/div>` : \"\"}\n      <div class=\"divider\"><\/div>\n    <\/div>\n\n    <div class=\"total-bar\">\n      <span class=\"total-bar-lbl\">Total Due<\/span>\n      <span class=\"total-bar-val\">${fmt(total)}<\/span>\n    <\/div>\n\n    ${notes ? `<div class=\"notes-bar\"><div class=\"notes-text\">${esc(notes)}<\/div><\/div>` : \"\"}\n  `;\n}\n\nfunction shareEmail() {\n  const {total} = calcTotals();\n  const s = encodeURIComponent(`Invoice ${val(\"inv-number\")} from ${val(\"from-name\")}`);\n  const b = encodeURIComponent(`Hi ${val(\"to-name\")||\"there\"},\\n\\nPlease see invoice ${val(\"inv-number\")}.\\n\\nTotal Due: ${fmt(total)}\\nDue Date: ${val(\"inv-due\")||\"Upon receipt\"}\\n\\nBest,\\n${val(\"from-name\")}`);\n  window.open(`mailto:${val(\"to-email\")}?subject=${s}&body=${b}`);\n}\n\nfunction shareText() {\n  const {total} = calcTotals();\n  const b = encodeURIComponent(`Invoice ${val(\"inv-number\")} from ${val(\"from-name\")} \u2014 Total: ${fmt(total)}. Due: ${val(\"inv-due\")||\"upon receipt\"}.`);\n  window.open(`sms:${val(\"to-phone\")}?&body=${b}`);\n}\n\ninit();\n<\/script>\n<\/body>\n<\/html>\n<\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-bd18614\" data-block-id=\"bd18614\"><p class=\"stk-block-text__text\"><\/p><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"class_list":["post-3412","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"service-thumb":false,"hero-image":false},"uagb_author_info":{"display_name":"dcappliancerepairservice.com","author_link":"https:\/\/dcappliancerepairservice.com\/index.php\/author\/dcappliancerepairservice-com\/"},"uagb_comment_info":0,"uagb_excerpt":null,"_links":{"self":[{"href":"https:\/\/dcappliancerepairservice.com\/index.php\/wp-json\/wp\/v2\/pages\/3412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dcappliancerepairservice.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dcappliancerepairservice.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dcappliancerepairservice.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dcappliancerepairservice.com\/index.php\/wp-json\/wp\/v2\/comments?post=3412"}],"version-history":[{"count":2,"href":"https:\/\/dcappliancerepairservice.com\/index.php\/wp-json\/wp\/v2\/pages\/3412\/revisions"}],"predecessor-version":[{"id":3414,"href":"https:\/\/dcappliancerepairservice.com\/index.php\/wp-json\/wp\/v2\/pages\/3412\/revisions\/3414"}],"wp:attachment":[{"href":"https:\/\/dcappliancerepairservice.com\/index.php\/wp-json\/wp\/v2\/media?parent=3412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}