diff --git a/app/config.yml b/app/config.yml index e450932..392fa25 100644 --- a/app/config.yml +++ b/app/config.yml @@ -131,12 +131,6 @@ charge-to: vat-id: "GB123456789" reg-no: "01234567" currency: GBP - pay-account-holder: Example Non-Profit Organisation - pay-account-no: "GB29 NWBK 6016 1331 9268 19" - pay-bic: "NWBKGB2L" - pay-bank-address1: "NatWest, 1 Princes Street" - pay-bank-address2: "London EC2R 8PB" - pay-ref: "" # ── Project codes ────────────────────────────────────────────────────────────── project-codes: diff --git a/app/index.html b/app/index.html index 7d9a10e..0ce5ce6 100644 --- a/app/index.html +++ b/app/index.html @@ -226,33 +226,43 @@ font-size: 11.5px; color: #111827; } - .d-hdr { - display: flex; justify-content: space-between; align-items: flex-start; - padding-bottom: 20px; margin-bottom: 24px; + /* 2×2 invoice header grid */ + .d-4hdr { + display: grid; grid-template-columns: 1fr 1fr; border-bottom: 3px solid var(--navy); + margin-bottom: 22px; } + .d-4hdr > div { padding: 0; } + .d-4hdr > .d-tl { padding: 0 20px 16px 0; border-bottom: 1px solid #e5e7eb; border-right: 1px solid #e5e7eb; } + .d-4hdr > .d-tr { padding: 0 0 16px 20px; border-bottom: 1px solid #e5e7eb; } + .d-4hdr > .d-bl { padding: 16px 20px 16px 0; border-right: 1px solid #e5e7eb; } + .d-4hdr > .d-br { padding: 16px 0 16px 20px; } + .d-sender .name { font-size: 17px; font-weight: 700; color: var(--navy); margin-bottom: 6px; } .d-sender p { font-size: 10.5px; color: #4b5563; margin-bottom: 2px; } - .d-title { text-align: right; } - .d-title h1 { font-size: 30px; font-weight: 800; letter-spacing: 5px; color: var(--navy); margin-bottom: 14px; } + + .d-pay-hdr .ph-lbl { font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 1.2px; color: #6b7280; margin-bottom: 6px; } + .d-pay-hdr .ph-terms { font-size: 10.5px; color: #4b5563; margin-bottom: 6px; } + .d-pay-hdr .ph-grid { display: grid; grid-template-columns: 130px 1fr; gap: 3px 8px; font-size: 10.5px; margin-top: 6px; } + .d-pay-hdr .ph-grid .pl { color: #6b7280; } + .d-pay-hdr .ph-grid .pv { font-weight: 500; word-break: break-all; } + .d-pay-hdr .ph-ref { margin-top: 6px; font-size: 10.5px; color: #4b5563; } + .d-pay-hdr .ph-ref strong { color: #111827; } + + .d-bill .bt-lbl { font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 1.2px; color: #6b7280; margin-bottom: 5px; } + .d-bill .bt-name { font-size: 13px; font-weight: 700; color: var(--navy); margin-bottom: 3px; } + .d-bill p { font-size: 10.5px; color: #4b5563; margin-bottom: 2px; } + .d-bill .bt-meta { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 6px; } + .d-bill .bt-meta span { font-size: 10px; color: #4b5563; } + .d-bill .bt-meta strong { color: #111827; } + + .d-inv-meta { text-align: right; } + .d-inv-meta h1 { font-size: 28px; font-weight: 800; letter-spacing: 5px; color: var(--navy); margin-bottom: 14px; } .d-meta { border-collapse: collapse; margin-left: auto; } .d-meta td { font-size: 10.5px; padding: 2px 0 2px 12px; } .d-meta .ml { color: #6b7280; text-align: right; } .d-meta .mv { font-weight: 600; text-align: right; } - .d-bill { - padding: 12px 16px; margin-bottom: 22px; - background: #f8f9fa; - border-left: 4px solid var(--navy); - border-radius: 0 var(--radius) var(--radius) 0; - } - .d-bill .bt-lbl { font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 1.2px; color: #6b7280; margin-bottom: 5px; } - .d-bill .bt-name { font-size: 13px; font-weight: 700; color: var(--navy); margin-bottom: 3px; } - .d-bill p { font-size: 10.5px; color: #4b5563; margin-bottom: 2px; } - .d-bill .bt-meta { display: flex; flex-wrap: wrap; gap: 16px; margin-top: 6px; } - .d-bill .bt-meta span { font-size: 10px; color: #4b5563; } - .d-bill .bt-meta strong { color: #111827; } - .d-lines { width: 100%; border-collapse: collapse; margin-bottom: 20px; } .d-lines thead tr { background: var(--navy); color: white; } .d-lines thead th { padding: 7px 10px; font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; text-align: left; } @@ -264,15 +274,6 @@ .d-lines tbody td.b { font-weight: 600; } .d-fx-note { font-size: 9.5px; color: #6b7280; margin-top: 3px; } - .d-payment { border-top: 1px solid #e5e7eb; margin-top: 20px; padding-top: 14px; } - .d-payment .pay-title { font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 1.2px; color: #6b7280; margin-bottom: 8px; } - .d-payment .pay-terms { font-size: 10.5px; color: #4b5563; margin-bottom: 8px; } - .d-payment .pay-grid { display: grid; grid-template-columns: 140px 1fr; gap: 3px 10px; font-size: 10.5px; margin-bottom: 4px; } - .d-payment .pay-grid .pl { color: #6b7280; } - .d-payment .pay-grid .pv { color: #111827; font-weight: 500; } - .d-payment .pay-ref { margin-top: 8px; font-size: 10.5px; color: #4b5563; } - .d-payment .pay-ref strong { color: #111827; } - .d-tots { width: 100%; border-collapse: collapse; } .d-tots td { padding: 5px 10px; font-size: 11.5px; } .d-tots .sp { width: 55%; } @@ -282,24 +283,19 @@ .d-tots .fin td { background: var(--navy); color: white; font-size: 14px; font-weight: 700; border-top: 2px solid var(--navy); } .d-tots .fin .tl { color: rgba(255,255,255,.75); } - /* ── Charge-to / Payment two-column layout ──────────────────────────────── */ - .ct-two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; align-items: start; } - @media (max-width: 720px) { .ct-two-col { grid-template-columns: 1fr; } } - #payment-panel { border-left: 2px solid var(--border-light); padding-left: 20px; } - @media (max-width: 720px) { #payment-panel { border-left: none; padding-left: 0; border-top: 2px solid var(--border-light); padding-top: 16px; } } + /* ── Payment card form fields ────────────────────────────────────────────── */ .pay-section-title { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; color: var(--navy); margin-bottom: 10px; } .pay-terms-row { display: flex; align-items: center; gap: 6px; margin-bottom: 8px; flex-wrap: wrap; } .pay-terms-row label { font-size: 12px; color: var(--text-muted); white-space: nowrap; } .pay-terms-row input { width: 64px; } .pay-terms-row span { font-size: 12px; color: var(--text-muted); } - .pay-by-row { display: flex; align-items: center; gap: 6px; margin-bottom: 10px; } + .pay-by-row { display: flex; align-items: center; gap: 6px; margin-bottom: 12px; } .pay-by-row label { font-size: 12px; color: var(--text-muted); white-space: nowrap; } #paybydisp { font-size: 13px; font-weight: 600; color: var(--text); } - /* ── Locked charge-to / bank fields ─────────────────────────────────────── */ + /* ── Locked charge-to fields ─────────────────────────────────────────────── */ #ct-fields.locked input, - #ct-fields.locked select, - #bank-section.locked input { + #ct-fields.locked select { background: #f8f9fa; color: var(--text-muted); border-color: var(--border-light); @@ -511,36 +507,37 @@ function buildForm() {
${h(a)}
`).join("")} ${sCntry ? `${h(sCntry)}
` : ""} ${sPh ? `${h(td("sender-phone"))}: ${h(sPh)}
` : ""} ${sEm ? `${h(td("sender-email"))}: ${h(sEm)}
` : ""}${h(a)}
`).join("")} + ${ctCntry ? `${h(ctCntry)}
` : ""} + +${h(a)}
`).join("")} - ${ctCntry ? `${h(ctCntry)}
` : ""} - -| ${h(td("qty"))} | @@ -1233,18 +1199,7 @@ function buildPreviewHTML() {${fmt(toPay)} |
|---|