{"id":77409,"date":"2026-06-03T23:49:22","date_gmt":"2026-06-03T22:49:22","guid":{"rendered":"https:\/\/aceworldpgs.com\/tools\/?p=77409"},"modified":"2026-06-04T00:41:29","modified_gmt":"2026-06-03T23:41:29","slug":"isbn-letter-generator","status":"publish","type":"post","link":"https:\/\/aceworldpgs.com\/tools\/isbn-letter-generator\/","title":{"rendered":"ISBN Letter Generator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\n<style>\n\/* \u2500\u2500 ISBN Generator: scoped to .ace-isbn-wrap \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.ace-isbn-wrap *,\n.ace-isbn-wrap *::before,\n.ace-isbn-wrap *::after { box-sizing: border-box; }\n\n.ace-isbn-wrap {\n    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n    max-width: 900px;\n    margin: 0 auto;\n    color: #1e293b;\n}\n\n\/* \u2500\u2500 Cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.isbn-card {\n    background: #fff;\n    border: 1px solid #e2e8f0;\n    border-radius: 14px;\n    padding: 26px 28px;\n    margin-bottom: 20px;\n    box-shadow: 0 1px 4px rgba(0,0,0,0.05);\n}\n.isbn-card-title {\n    font-size: 14px;\n    font-weight: 700;\n    color: #0f172a;\n    margin: 0 0 18px;\n    padding-bottom: 12px;\n    border-bottom: 1px solid #f1f5f9;\n    display: flex;\n    align-items: center;\n    gap: 7px;\n}\n\n\/* \u2500\u2500 Entity selector (radio cards) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.isbn-entity-grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 14px;\n    margin-bottom: 4px;\n}\n@media (max-width: 500px) { .isbn-entity-grid { grid-template-columns: 1fr; } }\n\n.isbn-radio-card {\n    border: 2px solid #e2e8f0;\n    border-radius: 11px;\n    padding: 18px 16px;\n    text-align: center;\n    cursor: pointer;\n    transition: all 0.18s;\n    background: #fff;\n    position: relative;\n    user-select: none;\n}\n.isbn-radio-card:hover { border-color: #7B2FF7; background: #fdfaff; }\n.isbn-radio-card.active { border-color: #7B2FF7; background: #f5f0ff; }\n.isbn-radio-card.active::after {\n    content: '\u2713';\n    position: absolute;\n    top: 8px; right: 10px;\n    font-size: 11px;\n    font-weight: 800;\n    color: #7B2FF7;\n}\n.isbn-radio-card input[type=\"radio\"] { display: none; }\n.isbn-radio-card .rc-icon { font-size: 26px; display: block; margin-bottom: 8px; }\n.isbn-radio-card .rc-label { font-size: 14px; font-weight: 700; color: #0f172a; }\n.isbn-radio-card .rc-sub { font-size: 11px; color: #64748b; margin-top: 1px; }\n\n\/* \u2500\u2500 Form fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.isbn-field-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }\n.isbn-field-grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 14px; }\n@media (max-width: 640px) {\n    .isbn-field-grid-2,\n    .isbn-field-grid-3 { grid-template-columns: 1fr; }\n}\n\n.isbn-field { display: flex; flex-direction: column; gap: 5px; }\n.isbn-field label {\n    font-size: 11px;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: 0.05em;\n    color: #64748b;\n}\n.isbn-field input,\n.isbn-field select,\n.isbn-field textarea {\n    padding: 10px 12px;\n    border: 1.5px solid #e2e8f0;\n    border-radius: 8px;\n    font-size: 14px;\n    font-family: inherit;\n    color: #1e293b;\n    background: #fff;\n    transition: border-color 0.15s;\n    width: 100%;\n}\n.isbn-field input:focus,\n.isbn-field select:focus,\n.isbn-field textarea:focus {\n    outline: none;\n    border-color: #7B2FF7;\n    box-shadow: 0 0 0 3px rgba(123,47,247,0.10);\n}\n.isbn-field small { font-size: 11px; color: #94a3b8; margin-top: 2px; }\n\n\/* \u2500\u2500 Book entry rows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.isbn-book-row {\n    background: #f8fafc;\n    border: 1px solid #e2e8f0;\n    border-radius: 9px;\n    padding: 14px 16px;\n    margin-bottom: 10px;\n    display: grid;\n    grid-template-columns: auto 1fr 160px;\n    gap: 12px;\n    align-items: center;\n    animation: isbnFadeIn 0.2s ease;\n}\n@keyframes isbnFadeIn { from { opacity:0; transform:translateY(-5px); } to { opacity:1; transform:translateY(0); } }\n@media (max-width: 560px) { .isbn-book-row { grid-template-columns: 1fr; } }\n\n.isbn-book-row .row-num {\n    width: 26px; height: 26px;\n    background: #7B2FF7;\n    color: #fff;\n    border-radius: 50%;\n    display: flex; align-items: center; justify-content: center;\n    font-size: 11px; font-weight: 800;\n    flex-shrink: 0;\n}\n.isbn-book-row input,\n.isbn-book-row select {\n    padding: 9px 11px;\n    border: 1.5px solid #e2e8f0;\n    border-radius: 7px;\n    font-size: 13px;\n    font-family: inherit;\n    background: #fff;\n    width: 100%;\n}\n.isbn-book-row input:focus,\n.isbn-book-row select:focus { outline: none; border-color: #7B2FF7; }\n\n\/* \u2500\u2500 Corporate history & legal deposit \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.isbn-history-block,\n.isbn-deposit-block {\n    margin-top: 16px;\n    padding: 16px 18px;\n    background: #fffbeb;\n    border: 1px solid #fde68a;\n    border-radius: 9px;\n}\n.isbn-history-block.hidden,\n.isbn-deposit-block.hidden { display: none; }\n\n.isbn-deposit-check {\n    display: flex;\n    align-items: center;\n    gap: 9px;\n    font-size: 13px;\n    font-weight: 600;\n    color: #334155;\n    cursor: pointer;\n}\n.isbn-deposit-check input[type=\"checkbox\"] {\n    width: 16px; height: 16px;\n    accent-color: #7B2FF7;\n    cursor: pointer;\n    flex-shrink: 0;\n}\n.isbn-notice { font-size: 12px; color: #92400e; margin-top: 8px; font-weight: 500; }\n.isbn-notice.error { color: #991b1b; background: #fef2f2; border: 1px solid #fca5a5; padding: 10px 12px; border-radius: 6px; margin-top: 10px; }\n.isbn-notice.info  { color: #1e40af; background: #eff6ff; border: 1px solid #bfdbfe; padding: 10px 12px; border-radius: 6px; margin-top: 10px; }\n.isbn-notice.warn  { color: #92400e; background: #fffbeb; border: 1px solid #fde68a; padding: 10px 12px; border-radius: 6px; margin-top: 10px; }\n\n\/* \u2500\u2500 Add book button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.isbn-add-btn {\n    width: 100%;\n    padding: 10px;\n    background: #f1f5f9;\n    border: 1.5px dashed #94a3b8;\n    border-radius: 8px;\n    font-size: 13px;\n    font-weight: 700;\n    color: #475569;\n    cursor: pointer;\n    margin-top: 4px;\n    transition: all 0.15s;\n    font-family: inherit;\n}\n.isbn-add-btn:hover { background: #e2e8f0; border-color: #7B2FF7; color: #7B2FF7; }\n.isbn-add-btn.hidden { display: none; }\n\n\/* \u2500\u2500 Generate button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.isbn-generate-btn {\n    width: 100%;\n    padding: 15px;\n    background: linear-gradient(135deg, #5b21b6 0%, #7B2FF7 100%);\n    color: #fff;\n    border: none;\n    border-radius: 10px;\n    font-size: 16px;\n    font-weight: 700;\n    cursor: pointer;\n    font-family: inherit;\n    transition: all 0.2s;\n    box-shadow: 0 4px 14px rgba(123,47,247,0.30);\n    margin-top: 8px;\n}\n.isbn-generate-btn:hover { filter: brightness(1.08); transform: translateY(-1px); box-shadow: 0 6px 20px rgba(123,47,247,0.35); }\n.isbn-generate-btn:disabled { background: #94a3b8; box-shadow: none; cursor: not-allowed; transform: none; }\n\n\/* \u2500\u2500 Guidelines block \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.isbn-guidelines {\n    background: #f0fdf4;\n    border: 1px solid #bbf7d0;\n    border-radius: 12px;\n    padding: 20px 22px;\n    margin-bottom: 20px;\n}\n.isbn-guidelines h3 { color: #166534; margin: 0 0 10px; font-size: 15px; display: flex; align-items: center; gap: 7px; }\n.isbn-guidelines ol { margin: 0; padding-left: 20px; color: #1e293b; font-size: 13px; line-height: 1.7; }\n.isbn-guidelines li { margin-bottom: 6px; }\n\n\/* \u2500\u2500 Print preview wrapper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.isbn-preview-wrap {\n    background: #e2e8f0;\n    padding: 36px 20px;\n    border-radius: 12px;\n    margin-bottom: 20px;\n    overflow-x: auto;\n}\n\n\/* \u2500\u2500 The actual letter paper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.isbn-letter-paper {\n    background: #fff;\n    width: 100%;\n    max-width: 680px;\n    min-height: 900px;\n    margin: 0 auto;\n    padding: 60px 56px 56px;\n    box-shadow: 0 4px 24px rgba(0,0,0,0.12);\n    position: relative;\n    color: #000;\n    font-family: \"Times New Roman\", Times, serif !important;\n    font-size: 15px;\n    line-height: 1.6;\n    text-align: justify;\n}\n.isbn-letter-paper * { font-family: \"Times New Roman\", Times, serif !important; }\n\n\/* Watermark \u2014 hidden on print *\/\n.isbn-letter-paper::before {\n    content: \"PREVIEW ONLY\";\n    position: absolute;\n    top: 50%; left: 50%;\n    transform: translate(-50%, -50%) rotate(-35deg);\n    font-size: 52px;\n    font-weight: 900;\n    color: rgba(220, 38, 38, 0.10);\n    white-space: nowrap;\n    pointer-events: none;\n    letter-spacing: 6px;\n    z-index: 10;\n}\n\n\/* Letter section layout *\/\n.letter-sender-header {\n    text-align: center;\n    border-bottom: 2.5px solid #000;\n    padding-bottom: 18px;\n    margin-bottom: 28px;\n}\n.letter-sender-name { font-size: 22px; font-weight: 700; text-transform: uppercase; margin: 0 0 6px; }\n.letter-sender-detail { font-size: 14px; margin: 3px 0; }\n\n.letter-date-line { text-align: right; margin-bottom: 24px; }\n.letter-recipient { margin-bottom: 22px; line-height: 1.5; }\n.letter-through { margin-bottom: 22px; padding-left: 20px; font-style: italic; line-height: 1.5; }\n.letter-salutation { margin-bottom: 18px; }\n.letter-subject {\n    text-align: center;\n    font-weight: 700;\n    text-decoration: underline;\n    text-transform: uppercase;\n    margin-bottom: 18px;\n    font-size: 15px;\n}\n.letter-body { margin-bottom: 18px; }\n.letter-book-list { margin: 14px 0; padding-left: 22px; }\n.letter-book-list li { margin-bottom: 8px; }\n.letter-closing { margin-top: 28px; line-height: 1.6; }\n\n\/* Signature font *\/\n.isbn-sig-font {\n    font-family: 'Dancing Script', cursive !important;\n    font-size: 30px;\n    color: #1e3a8a;\n    display: block;\n    margin: 8px 0 4px;\n    transform: rotate(-1deg);\n    line-height: 1;\n}\n.isbn-sig-space {\n    display: block;\n    height: 52px;\n    border-bottom: 1px solid #aaa;\n    width: 180px;\n    margin: 10px 0 4px;\n}\n\n\/* \u2500\u2500 Consent & print gate \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.isbn-action-gate {\n    background: #f8fafc;\n    border: 1px solid #e2e8f0;\n    border-radius: 12px;\n    padding: 20px 22px;\n    text-align: center;\n}\n.isbn-consent-label {\n    display: inline-flex;\n    align-items: flex-start;\n    gap: 10px;\n    font-size: 13px;\n    font-weight: 600;\n    color: #334155;\n    cursor: pointer;\n    margin-bottom: 14px;\n    text-align: left;\n    max-width: 520px;\n    line-height: 1.5;\n}\n.isbn-consent-label input[type=\"checkbox\"] {\n    width: 17px; height: 17px;\n    accent-color: #7B2FF7;\n    cursor: pointer;\n    flex-shrink: 0;\n    margin-top: 2px;\n}\n.isbn-print-btn {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    background: #16a34a;\n    color: #fff;\n    border: none;\n    padding: 13px 28px;\n    border-radius: 9px;\n    font-size: 15px;\n    font-weight: 700;\n    cursor: pointer;\n    font-family: inherit;\n    transition: all 0.18s;\n    box-shadow: 0 3px 12px rgba(22,163,74,0.28);\n}\n.isbn-print-btn:hover { background: #15803d; box-shadow: 0 5px 18px rgba(22,163,74,0.35); }\n.isbn-print-btn:disabled {\n    background: #cbd5e1;\n    color: #94a3b8;\n    cursor: not-allowed;\n    box-shadow: none;\n}\n.isbn-save-status {\n    font-size: 11px;\n    color: #64748b;\n    margin-top: 8px;\n    min-height: 16px;\n}\n\n\/* \u2500\u2500 Bottom CTA badge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.isbn-bottom-badge {\n    text-align: center;\n    background: #eef2ff;\n    color: #1e293b;\n    padding: 10px 16px;\n    border-radius: 50px;\n    font-size: 13px;\n    font-weight: 600;\n    border: 1px solid #c7d2fe;\n    margin-top: 8px;\n}\n.isbn-bottom-badge a { color: #4f46e5; text-decoration: underline; }\n\n\/* \u2500\u2500 Print media \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n@media print {\n    header, footer, nav,\n    .site-header, .site-footer,\n    .kadence-breadcrumbs,\n    .wp-block-kadence-rowlayout,\n    .entry-header, .entry-footer,\n    .post-navigation, .comments-area,\n    .widget-area, .sidebar,\n    #wpadminbar,\n    .ace-tool-header,\n    #isbn-form-card,\n    .isbn-guidelines,\n    .isbn-action-gate,\n    .isbn-bottom-badge,\n    [class*=\"toolkit_share\"],\n    [class*=\"toolkit_other\"] {\n        display: none !important;\n    }\n\n    .ace-isbn-wrap,\n    #isbn-output-workspace,\n    .isbn-preview-wrap {\n        background: none !important;\n        border: none !important;\n        box-shadow: none !important;\n        padding: 0 !important;\n        margin: 0 !important;\n        max-width: none !important;\n    }\n\n    #isbn-printable-letter {\n        box-shadow: none !important;\n        border: none !important;\n        margin: 0 auto !important;\n        padding: 20mm 18mm !important;\n        max-width: 100% !important;\n        width: 100% !important;\n        page-break-after: avoid !important;\n        page-break-inside: avoid !important;\n    }\n\n    #isbn-printable-letter::before { display: none !important; }\n\n    html, body {\n        height: auto !important;\n        overflow: visible !important;\n    }\n\n    * { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }\n\n    .entry-content > *:not(#isbn-output-workspace),\n    .content-wrap > *:not(#isbn-output-workspace) {\n        display: none !important;\n    }\n}\n\n\/* \u2500\u2500 Mobile \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n@media (max-width: 600px) {\n    .isbn-letter-paper { padding: 36px 24px; font-size: 14px; }\n    .isbn-card { padding: 18px 16px; }\n}\n<\/style>\n\n<div class=\"ace-isbn-wrap ace-tool\">\n\n    \n<div class=\"ace-header\">\n  <div class=\"ace-header-inner\">\n\n    <!-- Left: identity block -->\n    <div class=\"ace-header-identity\">\n\n            <span class=\"ace-header-badge badge-sap\">\n        ISBN      <\/span>\n      \n      <h2 class=\"ace-header-title\">ISBN Request Letter Generator<\/h2>\n\n            <p class=\"ace-header-subtitle\">Generate an NLN-compliant ISBN request letter for individual authors and corporate publishers in Nigeria.<\/p>\n      \n    <\/div><!-- \/.ace-header-identity -->\n\n    <!-- Right: CTA button -->\n    <a href=\"https:\/\/aceworldpgs.com\/acepublishingchecklist\" class=\"ace-header-cta\" target=\"_blank\" rel=\"noopener\">\n      Download Publishing Checklist            <span class=\"ace-cta-badge\">\u2b07<\/span>\n          <\/a>\n\n  <\/div><!-- \/.ace-header-inner -->\n<\/div><!-- \/.ace-header -->\n\n\n        \n    <!-- \u2500\u2500 FORM CARD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n    <div class=\"isbn-card\" id=\"isbn-form-card\">\n\n        <!-- Entity selector -->\n        <div class=\"isbn-card-title\">\ud83d\udc64 Who is applying?<\/div>\n        <div class=\"isbn-entity-grid\">\n            <label class=\"isbn-radio-card active\" id=\"lbl-individual\" for=\"ent-individual\">\n                <input type=\"radio\" name=\"isbn_entity\" id=\"ent-individual\" value=\"INDIVIDUAL\" checked>\n                <span class=\"rc-icon\">\u270d\ufe0f<\/span>\n                <span class=\"rc-label\">Individual Author<\/span><br>\n                <span class=\"rc-sub\">Up to 2 ISBNs<\/span>\n            <\/label>\n            <label class=\"isbn-radio-card\" id=\"lbl-corporate\" for=\"ent-corporate\">\n                <input type=\"radio\" name=\"isbn_entity\" id=\"ent-corporate\" value=\"CORPORATE\">\n                <span class=\"rc-icon\">\ud83c\udfe2<\/span>\n                <span class=\"rc-label\">Corporate Publisher<\/span><br>\n                <span class=\"rc-sub\">Up to 5 ISBNs (with legal deposit)<\/span>\n            <\/label>\n        <\/div>\n\n        <!-- Identity fields (injected by JS) -->\n        <div id=\"isbn-identity-fields\" style=\"margin-top: 22px;\"><\/div>\n\n        <!-- Book fields -->\n        <div style=\"margin-top: 22px; padding-top: 20px; border-top: 1px dashed #e2e8f0;\">\n            <div class=\"isbn-card-title\">\ud83d\udcda Book Information<\/div>\n\n            <!-- Corporate: history check -->\n            <div class=\"isbn-history-block hidden\" id=\"isbn-history-block\">\n                <div class=\"isbn-field\">\n                    <label for=\"corp-history\">Is this your first ISBN application with the NLN?<\/label>\n                    <select id=\"corp-history\">\n                        <option value=\"FIRST\">Yes \u2014 this is our first request<\/option>\n                        <option value=\"SUBSEQUENT\">No \u2014 we have obtained ISBNs from the NLN before<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"isbn-deposit-block hidden\" id=\"isbn-deposit-block\">\n                    <label class=\"isbn-deposit-check\">\n                        <input type=\"checkbox\" id=\"isbn-deposit-check\">\n                        We have the Legal Deposit Acknowledgement Letter for our previous titled publication(s).\n                    <\/label>\n                    <div class=\"isbn-notice error hidden\" id=\"isbn-deposit-warning\">\n                        \u26a0\ufe0f Regulatory requirement: Organisations requesting more than 2 ISBNs must provide a Legal Deposit Acknowledgement Letter for each previously issued title.\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <!-- Dynamic book entry rows -->\n            <div id=\"isbn-books-container\" style=\"margin-top: 14px;\"><\/div>\n            <button type=\"button\" class=\"isbn-add-btn\" id=\"isbn-add-book-btn\">\n                \u2795 Add Another Title\n            <\/button>\n            <div class=\"isbn-notice info hidden\" id=\"isbn-limit-notice\" style=\"margin-top: 10px;\"><\/div>\n        <\/div>\n\n        <button class=\"isbn-generate-btn\" id=\"isbn-generate-btn\">\n            \u270d\ufe0f Generate Request Letter\n        <\/button>\n\n    <\/div><!-- \/#isbn-form-card -->\n\n\n    <!-- \u2500\u2500 OUTPUT WORKSPACE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n    <div id=\"isbn-output-workspace\" style=\"display:none;\">\n\n        <!-- Application guidelines -->\n        <div class=\"isbn-guidelines\">\n            <h3>\n                <span style=\"background:#22c55e;color:#fff;border-radius:50%;width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center;font-size:11px;flex-shrink:0;\">\u2713<\/span>\n                What to Do Next\n            <\/h3>\n            <ol>\n                <li>Print this letter and proceed to the <strong>National Library of Nigeria branch in your state<\/strong>. You will be asked to pay the applicable charges using Remita at their office.<\/li>\n                <li id=\"guideline-individual\" style=\"display:none;\">Bring a valid government-issued ID (National ID card, Voter's Card, NIN Slip, or International Passport).<\/li>\n                <li id=\"guideline-corporate\" style=\"display:none;\">Bring a copy of your business registration certificate (CAC Certificate of Incorporation or SMEDAN Certificate).<\/li>\n                <li>For publishing support \u2014 editing, cover design, printing, and distribution \u2014 <a href=\"https:\/\/aceworldpgs.com\/tools\/publishing-calculator\/\" target=\"_blank\">use our Publishing Calculator<\/a> to get an instant quotation.<\/li>\n            <\/ol>\n        <\/div>\n\n        <!-- Letter preview -->\n        <div class=\"isbn-preview-wrap\">\n            <div class=\"isbn-letter-paper\" id=\"isbn-printable-letter\">\n                <!-- Populated by JS -->\n            <\/div>\n        <\/div>\n\n        <!-- Consent & print gate -->\n        <div class=\"isbn-action-gate\">\n            <div>\n                <label class=\"isbn-consent-label\">\n                    <input type=\"checkbox\" id=\"isbn-consent-checkbox\" checked>\n                    I agree to ACEworld Publishers saving my contact details to guide me through the publication process and provide relevant publishing assistance.\n                <\/label>\n            <\/div>\n            <button type=\"button\" class=\"isbn-print-btn\" id=\"isbn-print-btn\">\n                \ud83d\udcc4 Download Letter (PDF)\n            <\/button>\n            <div class=\"isbn-save-status\" id=\"isbn-save-status\"><\/div>\n        <\/div>\n\n    <\/div><!-- \/#isbn-output-workspace -->\n\n    <div class=\"isbn-bottom-badge\">\n        Need full publishing support?\n        <a href=\"https:\/\/aceworldpgs.com\/tools\/publishing-calculator\/\" target=\"_blank\">Use our Publishing Calculator \u2192<\/a>\n    <\/div>\n\n<\/div><!-- \/.ace-isbn-wrap -->\n\n\n<style>\n\n\/* SHARE SECTION *\/\n\n.share-section{\ntext-align:center;\npadding:28px 0;\nmargin-top:30px;\nborder-top:1px solid #e5e7eb;\n}\n\n\/* COPY LINK BUTTON *\/\n\n.copy-link-btn{\ndisplay:inline-flex;\nalign-items:center;\ngap:6px;\nfont-size:14px;\nfont-weight:600;\ncolor:var(--text-main);\nbackground:#f8fafc;\npadding:6px 12px;\nborder-radius:6px;\ntext-decoration:none;\ncursor:pointer;\ntransition:all .2s ease;\nmargin-bottom:18px;\n}\n\n.copy-link-btn:hover{\nbackground:#eef2f7;\ntransform:translateY(-1px);\n}\n\n\/* SHARE BUTTON ROW *\/\n\n.share-btns{\ndisplay:flex;\njustify-content:center;\ngap:12px;\nflex-wrap:wrap;\n}\n\n\/* SHARE ICON *\/\n\n.share-icon{\nwidth:36px;\nheight:36px;\nborder-radius:50%;\ndisplay:flex;\nalign-items:center;\njustify-content:center;\ncolor:#fff;\nfont-size:14px;\nfont-weight:600;\ntext-decoration:none;\ntransition:all .2s ease;\n}\n\n\/* BRAND COLORS *\/\n\n.wa{background:#25D366;}\n.tw{background:#000;}\n.li{background:#0A66C2;}\n.fb{background:#1877F2;}\n.ml{background:#ef4444;}\n\n\/* HOVER EFFECT *\/\n\n.share-icon:hover{\ntransform:translateY(-2px) scale(1.05);\nopacity:.9;\n}\n\n\/* COPY FEEDBACK *\/\n\n.copy-feedback{\nfont-size:12px;\ncolor:#16a34a;\nmargin-top:10px;\ndisplay:none;\n}\n\n<\/style>\n\n\n<div class=\"share-section\">\n\n<a onclick=\"copyToolLink()\" class=\"copy-link-btn\" id=\"copyBtn\">\n\ud83d\udd17 Copy Page Link\n<\/a>\n\n<div class=\"share-btns\">\n<a href=\"#\" id=\"shareWA\" target=\"_blank\" class=\"share-icon wa\" title=\"Share on WhatsApp\">W<\/a>\n<a href=\"#\" id=\"shareTW\" target=\"_blank\" class=\"share-icon tw\" title=\"Share on X\">X<\/a>\n<a href=\"#\" id=\"shareLI\" target=\"_blank\" class=\"share-icon li\" title=\"Share on LinkedIn\">in<\/a>\n<a href=\"#\" id=\"shareFB\" target=\"_blank\" class=\"share-icon fb\" title=\"Share on Facebook\">f<\/a>\n<a href=\"#\" id=\"shareEmail\" target=\"_blank\" class=\"share-icon ml\" title=\"Share via Email\">M<\/a>\n<\/div>\n\n<div id=\"copyFeedback\" class=\"copy-feedback\">Link copied!<\/div>\n\n<\/div>\n\n\n<script>\n\nfunction copyToolLink(){\n\nconst url = window.location.href;\n\nnavigator.clipboard.writeText(url).then(()=>{\n\nconst f = document.getElementById(\"copyFeedback\");\n\nf.style.display=\"block\";\n\nsetTimeout(()=>{f.style.display=\"none\"},2000);\n\n}).catch(()=>{\n\nalert(\"Copy failed. Please copy the URL manually.\");\n\n});\n\n}\n\nfunction setupShareButtons(){\n\nlet pageUrl=encodeURIComponent(window.location.href)\nlet pageTitle=encodeURIComponent(document.title)\n\ndocument.getElementById(\"shareWA\").href=\n`https:\/\/wa.me\/?text=${pageTitle}%20${pageUrl}`\n\ndocument.getElementById(\"shareTW\").href=\n`https:\/\/twitter.com\/intent\/tweet?text=${pageTitle}&url=${pageUrl}`\n\ndocument.getElementById(\"shareLI\").href=\n`https:\/\/www.linkedin.com\/sharing\/share-offsite\/?url=${pageUrl}`\n\ndocument.getElementById(\"shareFB\").href=\n`https:\/\/www.facebook.com\/sharer\/sharer.php?u=${pageUrl}`\n\ndocument.getElementById(\"shareEmail\").href=\n\"mailto:?subject=\"+encodeURIComponent(document.title)+\n\"&body=\"+encodeURIComponent(\"Check out this page: \"+window.location.href)\n\n}\n\nsetupShareButtons()\n\n<\/script>\n\n\n\n    <style>\n        .ace-feedback-btn {\n            padding: 10px 14px;\n            background: #111827;\n            color: #fff;\n            border: none;\n            border-radius: 8px;\n            cursor: pointer;\n            font-size: 13px;\n            display: block;\n            margin: 20px auto;\n        }\n\n        .ace-feedback-modal {\n            display: none;\n            position: fixed;\n            top: 0; left: 0;\n            width: 100%; height: 100%;\n            background: rgba(0,0,0,0.5);\n            justify-content: center;\n            align-items: center;\n            z-index: 9999;\n        }\n\n        .ace-feedback-box {\n            background: #fff;\n            padding: 20px;\n            width: 100%;\n            max-width: 420px;\n            border-radius: 10px;\n        }\n\n        .ace-feedback-box textarea,\n        .ace-feedback-box input {\n            width: 100%;\n            margin-bottom: 10px;\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 6px;\n        }\n\n        .ace-feedback-submit {\n            background: #2563eb;\n            color: #fff;\n            padding: 10px;\n            border: none;\n            width: 100%;\n            border-radius: 6px;\n            cursor: pointer;\n        }\n    <\/style>\n\n    <button class=\"ace-feedback-btn\" onclick=\"document.getElementById('aceFeedbackModal').style.display='flex'\">\n        Report Problem \/ Contact Us\n    <\/button>\n\n    <div id=\"aceFeedbackModal\" class=\"ace-feedback-modal\">\n        <div class=\"ace-feedback-box\">\n\n            <h3 style=\"margin-top:0;\">Send Feedback<\/h3>\n\n            <input type=\"email\" id=\"ace_feedback_email\" placeholder=\"Your email (optional)\">\n            <textarea id=\"ace_feedback_message\" rows=\"5\" placeholder=\"Describe your issue or suggestion...\"><\/textarea>\n\n            <button class=\"ace-feedback-submit\" onclick=\"trackTool('toolkit_feedback'); aceSendFeedback()\">\n                Send Message\n            <\/button>\n\n            <button style=\"margin-top:10px; background:#eee; padding:8px; border:none; width:100%;\" \n                onclick=\"document.getElementById('aceFeedbackModal').style.display='none'\">\n                Close\n            <\/button>\n\n        <\/div>\n    <\/div>\n\n    <script>\n    function aceSendFeedback() {\n\n        let email = document.getElementById('ace_feedback_email').value;\n        let message = document.getElementById('ace_feedback_message').value;\n\n        fetch('https:\/\/aceworldpgs.com\/tools\/wp-admin\/admin-ajax.php', {\n            method: 'POST',\n            headers: {'Content-Type': 'application\/x-www-form-urlencoded'},\n            body: new URLSearchParams({\n                action: 'ace_send_feedback',\n                email: email,\n                message: message,\n                post_url: 'https:\/\/aceworldpgs.com\/tools\/isbn-letter-generator\/',\n                post_title: 'ISBN Letter Generator'\n            })\n        }).then(res => res.json()).then(res => {\n            alert('Thank you! Your feedback has been sent.');\n            document.getElementById('aceFeedbackModal').style.display='none';\n        });\n\n    }\n    <\/script>\n\n    \n<script>\n(function() {\n'use strict';\n\n\/* \u2500\u2500 State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nconst AJAX_URL = 'https:\/\/aceworldpgs.com\/tools\/wp-admin\/admin-ajax.php';\nlet isbnEntityType    = 'INDIVIDUAL';\nlet isbnBookCount     = 0;\nlet isbnMaxBooks      = 2;\nlet isbnCurrentTitles = [];\n\n\/* \u2500\u2500 Nigerian states list for <select> \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nconst NIGERIAN_STATES = [\n    { slug: '',           label: '\u2014 Select your state \u2014' },\n    { slug: 'abia',       label: 'Abia' },\n    { slug: 'adamawa',    label: 'Adamawa' },\n    { slug: 'akwa-ibom',  label: 'Akwa Ibom' },\n    { slug: 'anambra',    label: 'Anambra' },\n    { slug: 'bauchi',     label: 'Bauchi' },\n    { slug: 'bayelsa',    label: 'Bayelsa' },\n    { slug: 'benue',      label: 'Benue' },\n    { slug: 'borno',      label: 'Borno' },\n    { slug: 'cross-river',label: 'Cross River' },\n    { slug: 'delta',      label: 'Delta' },\n    { slug: 'ebonyi',     label: 'Ebonyi' },\n    { slug: 'edo',        label: 'Edo' },\n    { slug: 'ekiti',      label: 'Ekiti' },\n    { slug: 'enugu',      label: 'Enugu' },\n    { slug: 'fct',        label: 'FCT (Abuja)' },\n    { slug: 'gombe',      label: 'Gombe' },\n    { slug: 'imo',        label: 'Imo' },\n    { slug: 'jigawa',     label: 'Jigawa' },\n    { slug: 'kaduna',     label: 'Kaduna' },\n    { slug: 'kano',       label: 'Kano' },\n    { slug: 'katsina',    label: 'Katsina' },\n    { slug: 'kebbi',      label: 'Kebbi' },\n    { slug: 'kogi',       label: 'Kogi' },\n    { slug: 'kwara',      label: 'Kwara' },\n    { slug: 'lagos',      label: 'Lagos' },\n    { slug: 'nasarawa',   label: 'Nasarawa' },\n    { slug: 'niger',      label: 'Niger' },\n    { slug: 'ogun',       label: 'Ogun' },\n    { slug: 'ondo',       label: 'Ondo' },\n    { slug: 'osun',       label: 'Osun' },\n    { slug: 'oyo',        label: 'Oyo' },\n    { slug: 'plateau',    label: 'Plateau' },\n    { slug: 'rivers',     label: 'Rivers' },\n    { slug: 'sokoto',     label: 'Sokoto' },\n    { slug: 'taraba',     label: 'Taraba' },\n    { slug: 'yobe',       label: 'Yobe' },\n    { slug: 'zamfara',    label: 'Zamfara' },\n];\n\n\/* Build state <select> HTML \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nfunction isbnBuildStateSelect(id) {\n    const opts = NIGERIAN_STATES.map(s =>\n        `<option value=\"${s.slug}\"${s.slug===''?' disabled selected':''}>${s.label}<\/option>`\n    ).join('');\n    return `<select id=\"${id}\">${opts}<\/select>`;\n}\n\n\/* \u2500\u2500 Entity selector \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nfunction isbnSetEntity(type) {\n    isbnEntityType = type;\n    document.getElementById('lbl-individual').classList.toggle('active', type === 'INDIVIDUAL');\n    document.getElementById('lbl-corporate').classList.toggle('active', type === 'CORPORATE');\n    document.getElementById('ent-individual').checked = (type === 'INDIVIDUAL');\n    document.getElementById('ent-corporate').checked  = (type === 'CORPORATE');\n\n    const historyBlock = document.getElementById('isbn-history-block');\n    historyBlock.classList.toggle('hidden', type === 'INDIVIDUAL');\n\n    document.getElementById('isbn-books-container').innerHTML = '';\n    isbnBookCount = 0;\n    isbnMaxBooks  = 2;\n    document.getElementById('isbn-add-book-btn').classList.remove('hidden');\n    document.getElementById('isbn-limit-notice').classList.add('hidden');\n\n    isbnRenderIdentityFields(type);\n    isbnEvalHistory();\n    isbnAddBook();\n}\n\n\/* \u2500\u2500 Identity field injection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nfunction isbnGetTodayISO() {\n    const d = new Date();\n    return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`;\n}\n\nfunction isbnRenderIdentityFields(type) {\n    const container = document.getElementById('isbn-identity-fields');\n    const stateSelect = isbnBuildStateSelect( type === 'INDIVIDUAL' ? 'ind-state' : 'corp-state' );\n\n    if (type === 'INDIVIDUAL') {\n        container.innerHTML = `\n        <div class=\"isbn-card-title\">\ud83d\udccb Your Information<\/div>\n        <div class=\"isbn-field\" style=\"margin-bottom:14px;\">\n            <label>Full Legal Name <span style=\"color:red\">*<\/span> <small>(exactly as on your ID)<\/small><\/label>\n            <input type=\"text\" id=\"ind-name\" placeholder=\"e.g. Oguntade John Doe\">\n        <\/div>\n        <div class=\"isbn-field\" style=\"margin-bottom:14px;\">\n            <label>House Address <span style=\"color:red\">*<\/span><\/label>\n            <input type=\"text\" id=\"ind-address\" placeholder=\"Street address, landmark...\">\n        <\/div>\n        <div class=\"isbn-field-grid-2\" style=\"margin-bottom:14px;\">\n            <div class=\"isbn-field\">\n                <label>City <span style=\"color:red\">*<\/span><\/label>\n                <input type=\"text\" id=\"ind-city\" placeholder=\"Ogbomoso\">\n            <\/div>\n            <div class=\"isbn-field\">\n                <label>State of Residence <span style=\"color:red\">*<\/span><\/label>\n                ${isbnBuildStateSelect('ind-state')}\n            <\/div>\n        <\/div>\n        <div class=\"isbn-field-grid-2\" style=\"margin-bottom:14px;\">\n            <div class=\"isbn-field\">\n                <label>State to Process ISBN <span style=\"color:red\">*<\/span> <small>(NLN branch routing)<\/small><\/label>\n                ${isbnBuildStateSelect('ind-process-state')}\n                <small>Which state will you visit the NLN office in?<\/small>\n            <\/div>\n            <div class=\"isbn-field\"><\/div>\n        <\/div>\n        <div class=\"isbn-field-grid-2\" style=\"margin-bottom:14px;\">\n            <div class=\"isbn-field\">\n                <label>Phone \/ WhatsApp <span style=\"color:red\">*<\/span><\/label>\n                <input type=\"tel\" id=\"ind-phone\" placeholder=\"07010000000\">\n            <\/div>\n            <div class=\"isbn-field\">\n                <label>Email Address <span style=\"color:red\">*<\/span><\/label>\n                <input type=\"email\" id=\"ind-email\" placeholder=\"you@example.com\">\n            <\/div>\n        <\/div>\n        <div class=\"isbn-field-grid-2\">\n            <div class=\"isbn-field\">\n                <label>Application Date <span style=\"color:red\">*<\/span><\/label>\n                <input type=\"date\" id=\"ind-date\" value=\"${isbnGetTodayISO()}\">\n            <\/div>\n            <div class=\"isbn-field\">\n                <label>Signature Style<\/label>\n                <select id=\"ind-sig\">\n                    <option value=\"auto\">Auto-generate from name<\/option>\n                    <option value=\"manual\">Leave blank space (sign after printing)<\/option>\n                <\/select>\n            <\/div>\n        <\/div>`;\n    } else {\n        container.innerHTML = `\n        <div class=\"isbn-card-title\">\ud83c\udfe2 Organisation Information<\/div>\n        <div class=\"isbn-field\" style=\"margin-bottom:14px;\">\n            <label>Registered Business Name <span style=\"color:red\">*<\/span> <small>(as on CAC\/SMEDAN certificate)<\/small><\/label>\n            <input type=\"text\" id=\"corp-name\" placeholder=\"e.g. J.Doe Publishing Limited\">\n        <\/div>\n        <div class=\"isbn-field\" style=\"margin-bottom:14px;\">\n            <label>Office Address <span style=\"color:red\">*<\/span><\/label>\n            <input type=\"text\" id=\"corp-address\" placeholder=\"Suite, floor, street...\">\n        <\/div>\n        <div class=\"isbn-field-grid-2\" style=\"margin-bottom:14px;\">\n            <div class=\"isbn-field\">\n                <label>City <span style=\"color:red\">*<\/span><\/label>\n                <input type=\"text\" id=\"corp-city\" placeholder=\"Ibadan\">\n            <\/div>\n            <div class=\"isbn-field\">\n                <label>State (Office) <span style=\"color:red\">*<\/span><\/label>\n                ${isbnBuildStateSelect('corp-state')}\n            <\/div>\n        <\/div>\n        <div class=\"isbn-field-grid-2\" style=\"margin-bottom:14px;\">\n            <div class=\"isbn-field\">\n                <label>State to Process ISBN <span style=\"color:red\">*<\/span> <small>(NLN branch routing)<\/small><\/label>\n                ${isbnBuildStateSelect('corp-process-state')}\n                <small>Which state will you visit the NLN office in?<\/small>\n            <\/div>\n            <div class=\"isbn-field\"><\/div>\n        <\/div>\n        <div class=\"isbn-field\" style=\"margin-bottom:14px;\">\n            <label>Full Name of Authorised Signatory <span style=\"color:red\">*<\/span><\/label>\n            <input type=\"text\" id=\"corp-signatory\" placeholder=\"e.g. Adebayo Johnson\">\n        <\/div>\n        <div class=\"isbn-field-grid-2\" style=\"margin-bottom:14px;\">\n            <div class=\"isbn-field\">\n                <label>Phone \/ WhatsApp <span style=\"color:red\">*<\/span><\/label>\n                <input type=\"tel\" id=\"corp-phone\" placeholder=\"07010883671\">\n            <\/div>\n            <div class=\"isbn-field\">\n                <label>Email Address <span style=\"color:red\">*<\/span><\/label>\n                <input type=\"email\" id=\"corp-email\" placeholder=\"info@yourpublisher.com\">\n            <\/div>\n        <\/div>\n        <div class=\"isbn-field-grid-2\">\n            <div class=\"isbn-field\">\n                <label>Application Date <span style=\"color:red\">*<\/span><\/label>\n                <input type=\"date\" id=\"corp-date\" value=\"${isbnGetTodayISO()}\">\n            <\/div>\n            <div class=\"isbn-field\">\n                <label>Signature Style<\/label>\n                <select id=\"corp-sig\">\n                    <option value=\"auto\">Auto-generate from signatory name<\/option>\n                    <option value=\"manual\">Leave blank space (sign after printing)<\/option>\n                <\/select>\n            <\/div>\n        <\/div>`;\n    }\n}\n\n\/* \u2500\u2500 Get branch address lines from isbnBranchData \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nfunction isbnGetBranchLines(stateSlug) {\n    if (!stateSlug || typeof isbnBranchData === 'undefined') return null;\n    return isbnBranchData[stateSlug] || null;\n}\n\n\/* \u2500\u2500 History \/ deposit logic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nfunction isbnEvalHistory() {\n    if (isbnEntityType !== 'CORPORATE') return;\n\n    const histVal      = document.getElementById('corp-history').value;\n    const depositBlock = document.getElementById('isbn-deposit-block');\n    const depositWarn  = document.getElementById('isbn-deposit-warning');\n    const depositCheck = document.getElementById('isbn-deposit-check');\n\n    depositBlock.classList.toggle('hidden', histVal === 'FIRST');\n\n    if (histVal === 'FIRST') {\n        isbnMaxBooks = 2;\n        depositCheck.checked = false;\n        depositWarn.classList.add('hidden');\n    } else {\n        if (depositCheck.checked) {\n            isbnMaxBooks = 5;\n            depositWarn.classList.add('hidden');\n        } else {\n            isbnMaxBooks = 2;\n            depositWarn.classList.remove('hidden');\n        }\n    }\n\n    while (isbnBookCount > isbnMaxBooks) {\n        const row = document.getElementById(`isbn-book-${isbnBookCount}`);\n        if (row) row.remove();\n        isbnBookCount--;\n    }\n\n    isbnSyncAddButton();\n}\n\n\/* \u2500\u2500 Book entry management \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nfunction isbnAddBook() {\n    if (isbnBookCount >= isbnMaxBooks) return;\n    isbnBookCount++;\n\n    const container = document.getElementById('isbn-books-container');\n    const row = document.createElement('div');\n    row.className = 'isbn-book-row';\n    row.id = `isbn-book-${isbnBookCount}`;\n    row.innerHTML = `\n        <span class=\"row-num\">${isbnBookCount}<\/span>\n        <input type=\"text\" class=\"isbn-title-input\" placeholder=\"Book title (e.g. Adam's Apple, the Father's Neck)\" required>\n        <select class=\"isbn-format-select\">\n            <option value=\"Paperback\">Paperback<\/option>\n            <option value=\"Hardback\">Hardback<\/option>\n            <option value=\"eBook\">eBook<\/option>\n        <\/select>\n    `;\n    container.appendChild(row);\n    row.querySelector('.isbn-title-input').focus();\n    isbnSyncAddButton();\n}\n\nfunction isbnSyncAddButton() {\n    const addBtn      = document.getElementById('isbn-add-book-btn');\n    const limitNotice = document.getElementById('isbn-limit-notice');\n\n    if (isbnBookCount >= isbnMaxBooks) {\n        addBtn.classList.add('hidden');\n        limitNotice.classList.remove('hidden');\n        limitNotice.textContent = isbnEntityType === 'INDIVIDUAL'\n            ? '\u270b Individual authors can request a maximum of 2 ISBNs per application.'\n            : ( isbnMaxBooks === 2\n                ? '\u270b Without a Legal Deposit letter, organisations are limited to 2 ISBNs per application.'\n                : '\u270b Maximum of 5 ISBNs reached for this application.' );\n    } else {\n        addBtn.classList.remove('hidden');\n        limitNotice.classList.add('hidden');\n    }\n}\n\n\/* \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nfunction isbnVal(id) {\n    const el = document.getElementById(id);\n    return el ? el.value.trim() : '';\n}\n\nfunction isbnFormatDate(isoString) {\n    if (!isoString) return '';\n    const [y, m, d] = isoString.split('-').map(Number);\n    const dt = new Date(y, m - 1, d);\n    const months = ['January','February','March','April','May','June','July','August','September','October','November','December'];\n    const suffix = (n) => {\n        const s = ['th','st','nd','rd'];\n        const v = n % 100;\n        return n + (s[(v - 20) % 10] || s[v] || s[0]);\n    };\n    return `${suffix(d)} ${months[dt.getMonth()]}, ${y}`;\n}\n\nfunction isbnEscHtml(str) {\n    return String(str)\n        .replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;')\n        .replace(\/>\/g,'&gt;').replace(\/\"\/g,'&quot;');\n}\n\nfunction isbnLastName(fullName) {\n    const parts = fullName.trim().split(' ');\n    return parts[parts.length - 1] || fullName;\n}\n\n\/* \u2500\u2500 Validate & generate \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nfunction isbnGenerate() {\n    let senderName, senderAddress, senderCity, senderState;\n    let senderPhone, senderEmail, appDate, sigStyle;\n    let signatoryName, signatoryForEntity = '';\n\n    let processState; \/\/ the state used for NLN branch routing\n\n    if (isbnEntityType === 'INDIVIDUAL') {\n        senderName    = isbnVal('ind-name');\n        senderAddress = isbnVal('ind-address');\n        senderCity    = isbnVal('ind-city');\n        senderState   = isbnVal('ind-state');\n        processState  = isbnVal('ind-process-state');\n        senderPhone   = isbnVal('ind-phone');\n        senderEmail   = isbnVal('ind-email');\n        appDate       = isbnVal('ind-date');\n        sigStyle      = isbnVal('ind-sig');\n        signatoryName = senderName;\n    } else {\n        senderName    = isbnVal('corp-name');\n        senderAddress = isbnVal('corp-address');\n        senderCity    = isbnVal('corp-city');\n        senderState   = isbnVal('corp-state');\n        processState  = isbnVal('corp-process-state');\n        senderPhone   = isbnVal('corp-phone');\n        senderEmail   = isbnVal('corp-email');\n        appDate       = isbnVal('corp-date');\n        sigStyle      = isbnVal('corp-sig');\n        signatoryName = isbnVal('corp-signatory');\n        signatoryForEntity = `<br>For: ${senderName}`;\n    }\n\n    \/\/ \u2500\u2500 Validate \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const requiredFilled = senderName && senderAddress && senderCity &&\n                           senderState && processState && senderPhone && senderEmail && appDate;\n    if (!requiredFilled) {\n        alert('Please fill in all required fields \u2014 including both state fields \u2014 before generating the letter.');\n        return;\n    }\n\n    if (!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(senderEmail)) {\n        alert('Please enter a valid email address.');\n        return;\n    }\n\n    \/\/ \u2500\u2500 Collect books \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const titleInputs  = document.querySelectorAll('.isbn-title-input');\n    const formatInputs = document.querySelectorAll('.isbn-format-select');\n    const bookEntries  = [];\n\n    for (let i = 0; i < titleInputs.length; i++) {\n        const t = titleInputs[i].value.trim();\n        const f = formatInputs[i].value;\n        if (!t) { alert(`Please enter a title for Book #${i+1}.`); return; }\n        bookEntries.push({ title: t, format: f });\n    }\n    if (bookEntries.length === 0) {\n        alert('Please add at least one book title.');\n        return;\n    }\n\n    isbnCurrentTitles = bookEntries;\n\n    \/\/ \u2500\u2500 Resolve branch address \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const branch = isbnGetBranchLines(processState);\n    let throughHtml = '';\n    let throughLines = [];\n\n    if (branch) {\n        throughLines = branch.lines;\n        throughHtml  = branch.lines.map(l => isbnEscHtml(l)).join('<br>\\n            ');\n    } else {\n        \/\/ Fallback: generic placeholder so letter isn't blank\n        throughLines = [\n            'National Library of Nigeria,',\n            'State Branch,',\n            '(Address \u2014 visit nln.gov.ng for branch details).',\n        ];\n        throughHtml = throughLines.map(l => isbnEscHtml(l)).join('<br>\\n            ');\n    }\n\n    \/\/ \u2500\u2500 Build book list HTML \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const authorLabel = isbnEntityType === 'INDIVIDUAL' ? senderName : signatoryName;\n    const bookListHtml = bookEntries.map((b) =>\n        `<li> ${isbnEscHtml(b.title)} (${isbnEscHtml(b.format)}) by ${isbnEscHtml(authorLabel)}<\/li>`\n    ).join('');\n\n    \/\/ \u2500\u2500 Build signature block \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const lastName = isbnLastName(signatoryName);\n    let sigBlock;\n    if (sigStyle === 'auto') {\n        sigBlock = `<span class=\"isbn-sig-font\">${isbnEscHtml(lastName)}<\/span>`;\n    } else {\n        sigBlock = `<span class=\"isbn-sig-space\"><\/span><small style=\"color:#64748b;font-style:italic;\">(Sign here after printing)<\/small>`;\n    }\n\n    \/\/ \u2500\u2500 Build letter HTML \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const letterHtml = `\n        <div class=\"letter-sender-header\">\n            <div class=\"letter-sender-name\">${isbnEscHtml(senderName)}<\/div>\n            <div class=\"letter-sender-detail\">${isbnEscHtml(senderAddress)}, ${isbnEscHtml(senderCity)}, ${isbnEscHtml(senderState.replace(\/-\/g,' ').replace(\/\\b\\w\/g,c=>c.toUpperCase()))}.<\/div>\n            <div class=\"letter-sender-detail\">${isbnEscHtml(senderPhone)} | ${isbnEscHtml(senderEmail)}<\/div>\n        <\/div>\n\n        <div class=\"letter-date-line\">${isbnFormatDate(appDate)}<\/div>\n\n        <div class=\"letter-recipient\">\n            The Director,<br>\n            Department of International Standard &amp; Programmes,<br>\n            National Library of Nigeria,<br>\n            P.M.B.1, Garki, Abuja.\n        <\/div>\n\n        <div class=\"letter-through\">\n            <strong>Through:<\/strong><br>\n            The Head of Branch,<br>\n            ${throughHtml}\n        <\/div>\n\n        <div class=\"letter-salutation\">Dear Ma,<\/div>\n\n        <div class=\"letter-subject\">Application for ISBN Assignment<\/div>\n\n        <div class=\"letter-body\">\n            I am writing to formally request the allotment of ${bookEntries.length > 1 ? 'International Standard Book Numbers (ISBNs)' : 'an International Standard Book Number (ISBN)'} for the following publication${bookEntries.length > 1 ? 's' : ''}:\n            <ol class=\"letter-book-list\">${bookListHtml}<\/ol>\n            Kindly consider this request and issue the ISBN${bookEntries.length > 1 ? 's' : ''} for the above-mentioned publication${bookEntries.length > 1 ? 's' : ''}. I would appreciate your prompt response.\n        <\/div>\n\n        <div class=\"letter-body\">Thank you for your kind attention.<\/div>\n\n        <div class=\"letter-closing\">\n            Yours faithfully,<br>\n            ${sigBlock}\n            <strong>${isbnEscHtml(signatoryName)}${signatoryForEntity}<\/strong>\n        <\/div>\n    `;\n\n    document.getElementById('isbn-printable-letter').innerHTML = letterHtml;\n\n    document.getElementById('guideline-individual').style.display =\n        isbnEntityType === 'INDIVIDUAL' ? 'list-item' : 'none';\n    document.getElementById('guideline-corporate').style.display =\n        isbnEntityType === 'CORPORATE' ? 'list-item' : 'none';\n\n    const workspace = document.getElementById('isbn-output-workspace');\n    workspace.style.display = 'block';\n    workspace.scrollIntoView({ behavior: 'smooth', block: 'start' });\n\n    isbnSaveLead({\n        clientName:  senderName,\n        clientEmail: senderEmail,\n        clientPhone: senderPhone,\n        clientState: senderState,\n        entityType:  isbnEntityType,\n        titles:      bookEntries,\n    });\n}\n\n\/* \u2500\u2500 Consent gate sync \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nfunction isbnSyncGate() {\n    const checked = document.getElementById('isbn-consent-checkbox').checked;\n    document.getElementById('isbn-print-btn').disabled = !checked;\n\n    if (checked && isbnCurrentTitles.length > 0) {\n        const senderEmail = isbnEntityType === 'INDIVIDUAL'\n            ? isbnVal('ind-email') : isbnVal('corp-email');\n        const senderName  = isbnEntityType === 'INDIVIDUAL'\n            ? isbnVal('ind-name') : isbnVal('corp-name');\n        const senderPhone = isbnEntityType === 'INDIVIDUAL'\n            ? isbnVal('ind-phone') : isbnVal('corp-phone');\n        const senderState = isbnEntityType === 'INDIVIDUAL'\n            ? isbnVal('ind-state') : isbnVal('corp-state');\n\n        if (senderEmail) {\n            isbnSaveLead({\n                clientName:  senderName,\n                clientEmail: senderEmail,\n                clientPhone: senderPhone,\n                clientState: senderState,\n                entityType:  isbnEntityType,\n                titles:      isbnCurrentTitles,\n            });\n        }\n    }\n}\n\n\/* \u2500\u2500 AJAX lead save \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nfunction isbnSaveLead(data) {\n    const consent  = document.getElementById('isbn-consent-checkbox').checked;\n    const statusEl = document.getElementById('isbn-save-status');\n\n    const fd = new FormData();\n    fd.append('action',       'aceworld_isbn_lead_to_manual_quote');\n    fd.append('client_name',  data.clientName);\n    fd.append('client_email', data.clientEmail);\n    fd.append('client_phone', data.clientPhone);\n    fd.append('client_state', data.clientState || '');\n    fd.append('entity_type',  data.entityType);\n    fd.append('titles_json',  JSON.stringify(data.titles));\n    fd.append('consent',      consent ? '1' : '0');\n\n    fetch(AJAX_URL, { method: 'POST', body: fd })\n        .then(r => r.json())\n        .then(resp => {\n            if (resp.success && resp.data && resp.data.saved) {\n                if (statusEl) statusEl.textContent = '\u2705 Contact details saved \u2014 our team will follow up with publishing guidance.';\n            }\n        })\n        .catch(() => {\n            \/\/ Silent fail \u2014 don't interrupt PDF flow\n        });\n}\n\n\/* \u2500\u2500 PDF Download \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nfunction isbnDownloadPDF() {\n    if (!window.jspdf) {\n        const s = document.createElement('script');\n        s.src = 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js';\n        s.onload = () => isbnBuildPDF();\n        document.head.appendChild(s);\n    } else {\n        isbnBuildPDF();\n    }\n}\n\nfunction isbnBuildPDF() {\n    const { jsPDF } = window.jspdf;\n    const doc = new jsPDF({ unit: 'mm', format: 'a4', orientation: 'portrait' });\n\n    const BLACK  = '#000000';\n    const margin = 20;\n    const pageW  = 210;\n    const contentW = pageW - margin * 2;\n    let y = 20;\n\n    function gap(mm) { y += mm; }\n\n    const paper = document.getElementById('isbn-printable-letter');\n    if (!paper) return;\n\n    const senderName   = paper.querySelector('.letter-sender-name')?.innerText?.trim()   || '';\n    const senderDetail = paper.querySelectorAll('.letter-sender-detail');\n    const addressLine  = senderDetail[0]?.innerText?.trim() || '';\n    const contactLine  = senderDetail[1]?.innerText?.trim() || '';\n    const dateLine     = paper.querySelector('.letter-date-line')?.innerText?.trim()     || '';\n    const subjectLine  = paper.querySelector('.letter-subject')?.innerText?.trim()       || '';\n    const bodyParas    = paper.querySelectorAll('.letter-body');\n    const bookItems    = paper.querySelectorAll('.letter-book-list li');\n    const closingEl    = paper.querySelector('.letter-closing');\n    const sigFontEl    = paper.querySelector('.isbn-sig-font');\n    const sigNameEl    = closingEl?.querySelector('strong');\n\n    \/\/ \u2500\u2500 Collect \"Through:\" lines from rendered HTML \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    \/\/ We read the live letter so PDF always matches the preview exactly\n    const throughEl    = paper.querySelector('.letter-through');\n    const throughRaw   = throughEl ? throughEl.innerText.trim() : '';\n    \/\/ Strip the \"Through:\" label and split into lines\n    const throughBody  = throughRaw.replace(\/^Through:\\s*\/i, '').split('\\n').map(l => l.trim()).filter(Boolean);\n\n    \/\/ \u2500\u2500 HEADER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    doc.setFont('times', 'bold');\n    doc.setFontSize(16);\n    doc.setTextColor(0,0,0);\n    const nameLines = doc.splitTextToSize(senderName.toUpperCase(), contentW);\n    doc.text(nameLines, pageW \/ 2, y, { align: 'center' });\n    y += nameLines.length * 7;\n\n    doc.setFont('times', 'normal');\n    doc.setFontSize(11);\n    const addrLines = doc.splitTextToSize(addressLine, contentW);\n    doc.text(addrLines, pageW \/ 2, y, { align: 'center' });\n    y += addrLines.length * 5;\n\n    const contactLines = doc.splitTextToSize(contactLine, contentW);\n    doc.text(contactLines, pageW \/ 2, y, { align: 'center' });\n    y += contactLines.length * 5 + 2;\n\n    doc.setLineWidth(0.6);\n    doc.setDrawColor(0);\n    doc.line(margin, y, pageW - margin, y);\n    gap(8);\n\n    \/\/ \u2500\u2500 DATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    doc.setFont('times', 'normal');\n    doc.setFontSize(11);\n    doc.setTextColor(0,0,0);\n    doc.text(dateLine, pageW - margin, y, { align: 'right' });\n    gap(8);\n\n    \/\/ \u2500\u2500 RECIPIENT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const recipient = [\n        'The Director,',\n        'Department of International Standard & Programmes,',\n        'National Library of Nigeria,',\n        'P.M.B.1, Garki, Abuja.'\n    ];\n    recipient.forEach(line => {\n        doc.setFontSize(11);\n        doc.setFont('times', 'normal');\n        doc.text(line, margin, y);\n        y += 5.5;\n    });\n    gap(5);\n\n    \/\/ \u2500\u2500 THROUGH (state-aware \u2014 read from rendered HTML) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    doc.setFont('times', 'italic');\n    doc.setFontSize(11);\n    doc.text('Through:', margin, y);\n    y += 5.5;\n\n    \/\/ First line: \"The Head of Branch,\"\n    doc.text('The Head of Branch,', margin + 5, y);\n    y += 5.5;\n\n    \/\/ Remaining lines from live letter\n    throughBody.forEach(line => {\n        if (line.toLowerCase() === 'through:') return; \/\/ skip label if present\n        if (line.toLowerCase() === 'the head of branch,') return; \/\/ already added\n        doc.setFont('times', 'italic');\n        doc.setFontSize(11);\n        doc.text(line, margin + 5, y);\n        y += 5.5;\n    });\n    gap(6);\n\n    \/\/ \u2500\u2500 SALUTATION \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    doc.setFont('times', 'normal');\n    doc.setFontSize(11);\n    doc.text('Dear Ma,', margin, y);\n    gap(7);\n\n    \/\/ \u2500\u2500 SUBJECT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    doc.setFont('times', 'bold');\n    doc.setFontSize(12);\n    const subjectText  = subjectLine || 'APPLICATION FOR ISBN ASSIGNMENT';\n    const subjectLines = doc.splitTextToSize(subjectText.toUpperCase(), contentW);\n    doc.text(subjectLines, pageW \/ 2, y, { align: 'center' });\n\n    const subjectWidth = doc.getTextWidth(subjectText.toUpperCase());\n    const subjectX     = (pageW - Math.min(subjectWidth, contentW)) \/ 2;\n    doc.setLineWidth(0.3);\n    doc.line(subjectX, y + 1, subjectX + Math.min(subjectWidth, contentW), y + 1);\n    y += subjectLines.length * 6;\n    gap(5);\n\n    \/\/ \u2500\u2500 BODY PARAGRAPH 1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    doc.setFont('times', 'normal');\n    doc.setFontSize(11);\n    const bodyText1  = bodyParas[0]?.innerText?.trim() || '';\n    const bodyIntro  = bodyText1.split('\\n')[0] || bodyText1;\n    const introLines = doc.splitTextToSize(bodyIntro, contentW);\n    doc.text(introLines, margin, y, { align: 'justify', maxWidth: contentW });\n    y += introLines.length * 5.5 + 3;\n\n    \/\/ \u2500\u2500 BOOK LIST \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    bookItems.forEach((item, i) => {\n        const text      = `${i + 1}. ${item.innerText.trim()}`;\n        const itemLines = doc.splitTextToSize(text, contentW - 8);\n        doc.text(itemLines, margin + 5, y);\n        y += itemLines.length * 5.5 + 1;\n    });\n    gap(3);\n\n    \/\/ \u2500\u2500 BODY PARAGRAPH 2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const bodyParas2  = bodyParas[0]?.innerText?.trim().split('\\n').slice(-1)[0] ||\n        'Kindly consider this request and issue the ISBN(s) for the above-mentioned publication(s). I would appreciate your prompt response.';\n    const para2Lines  = doc.splitTextToSize(bodyParas2, contentW);\n    doc.text(para2Lines, margin, y, { align: 'justify', maxWidth: contentW });\n    y += para2Lines.length * 5.5 + 4;\n\n    \/\/ \u2500\u2500 BODY PARAGRAPH 3 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const thankYou = bodyParas[1]?.innerText?.trim() || 'Thank you for your kind attention.';\n    doc.text(thankYou, margin, y);\n    gap(10);\n\n    \/\/ \u2500\u2500 CLOSING \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    doc.text('Yours faithfully,', margin, y);\n    gap(12);\n\n    if (sigFontEl) {\n        const sigText = sigFontEl.innerText.trim();\n        doc.setFont('times', 'bolditalic');\n        doc.setFontSize(28);\n        doc.setTextColor(30, 58, 138);\n        doc.text(sigText, margin, y);\n        doc.setTextColor(0, 0, 0);\n        gap(10);\n    } else {\n        doc.setLineWidth(0.3);\n        doc.setDrawColor(150);\n        doc.line(margin, y, margin + 45, y);\n        gap(10);\n    }\n\n    doc.setFont('times', 'bold');\n    doc.setFontSize(11);\n    doc.setTextColor(0,0,0);\n    const sigName = sigNameEl?.innerText?.trim() || senderName;\n    doc.text(sigName, margin, y);\n\n    const safeName = senderName.replace(\/[^a-z0-9]\/gi, '_').toLowerCase();\n    doc.save(`ISBN_Request_Letter_${safeName}.pdf`);\n}\n\n\/* \u2500\u2500 Delegated Click Events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\ndocument.addEventListener('click', function(e) {\n    if (e.target.closest('#isbn-add-book-btn')) { isbnAddBook(); return; }\n    if (e.target.closest('#isbn-generate-btn')) {\n        if (typeof trackTool === 'function') trackTool('isbn_generator');\n        isbnGenerate();\n        return;\n    }\n    if (e.target.closest('#isbn-print-btn')) {\n        if (typeof trackTool === 'function') trackTool('isbn_print');\n        isbnDownloadPDF();\n        return;\n    }\n});\n\n\/* \u2500\u2500 Delegated Change Events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\ndocument.addEventListener('change', function(e) {\n    if (e.target.id === 'corp-history')          { isbnEvalHistory(); return; }\n    if (e.target.id === 'isbn-deposit-check')    { isbnEvalHistory(); return; }\n    if (e.target.id === 'isbn-consent-checkbox') { isbnSyncGate();    return; }\n});\n\n\/* \u2500\u2500 Init \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\ndocument.addEventListener('DOMContentLoaded', function() {\n    document.getElementById('lbl-individual').addEventListener('click', () => isbnSetEntity('INDIVIDUAL'));\n    document.getElementById('lbl-corporate').addEventListener('click',  () => isbnSetEntity('CORPORATE'));\n    isbnSetEntity('INDIVIDUAL');\n});\n\n})(); \/\/ end IIFE\n<\/script>\n\n    <\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<style>.kt-accordion-id77409_cb296b-5d .kt-accordion-inner-wrap{column-gap:var(--global-kb-gap-md, 2rem);row-gap:10px;}.kt-accordion-id77409_cb296b-5d .kt-accordion-panel-inner{border-top:0px solid transparent;border-right:0px solid transparent;border-bottom:0px solid transparent;border-left:0px solid transparent;background:#ffffff;padding-top:var(--global-kb-spacing-sm, 1.5rem);padding-right:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-sm, 1.5rem);padding-left:var(--global-kb-spacing-sm, 1.5rem);}.kt-accordion-id77409_cb296b-5d > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap > .kt-blocks-accordion-header{border-top:1px solid #f2f2f2;border-right:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;border-left:1px solid #f2f2f2;border-top-left-radius:6px;border-top-right-radius:6px;border-bottom-right-radius:6px;border-bottom-left-radius:6px;color:var(--global-palette3, #1A202C);padding-top:13px;padding-right:15px;padding-bottom:13px;padding-left:15px;}.kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basiccircle ):not( .kt-accodion-icon-style-xclosecircle ):not( .kt-accodion-icon-style-arrowcircle )  > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap .kt-blocks-accordion-icon-trigger:after, .kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basiccircle ):not( .kt-accodion-icon-style-xclosecircle ):not( .kt-accodion-icon-style-arrowcircle )  > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap .kt-blocks-accordion-icon-trigger:before{background:var(--global-palette3, #1A202C);}.kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basic ):not( .kt-accodion-icon-style-xclose ):not( .kt-accodion-icon-style-arrow ) .kt-blocks-accordion-icon-trigger{background:var(--global-palette3, #1A202C);}.kt-accordion-id77409_cb296b-5d > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap > .kt-blocks-accordion-header:hover, \n\t\t\t\tbody:not(.hide-focus-outline) .kt-accordion-id77409_cb296b-5d .kt-blocks-accordion-header:focus-visible{color:#444444;background:#eeeeee;border-top:1px solid #878787;border-right:1px solid #878787;border-bottom:1px solid #878787;border-left:1px solid #878787;}.kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basiccircle ):not( .kt-accodion-icon-style-xclosecircle ):not( .kt-accodion-icon-style-arrowcircle ) .kt-accordion-header-wrap .kt-blocks-accordion-header:hover .kt-blocks-accordion-icon-trigger:after, .kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basiccircle ):not( .kt-accodion-icon-style-xclosecircle ):not( .kt-accodion-icon-style-arrowcircle ) .kt-accordion-header-wrap .kt-blocks-accordion-header:hover .kt-blocks-accordion-icon-trigger:before, body:not(.hide-focus-outline) .kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basiccircle ):not( .kt-accodion-icon-style-xclosecircle ):not( .kt-accodion-icon-style-arrowcircle ) .kt-blocks-accordion--visible .kt-blocks-accordion-icon-trigger:after, body:not(.hide-focus-outline) .kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basiccircle ):not( .kt-accodion-icon-style-xclosecircle ):not( .kt-accodion-icon-style-arrowcircle ) .kt-blocks-accordion-header:focus-visible .kt-blocks-accordion-icon-trigger:before{background:#444444;}.kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basic ):not( .kt-accodion-icon-style-xclose ):not( .kt-accodion-icon-style-arrow ) .kt-accordion-header-wrap .kt-blocks-accordion-header:hover .kt-blocks-accordion-icon-trigger, body:not(.hide-focus-outline) .kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basic ):not( .kt-accodion-icon-style-xclose ):not( .kt-accodion-icon-style-arrow ) .kt-accordion-header-wrap .kt-blocks-accordion-header:focus-visible .kt-blocks-accordion-icon-trigger{background:#444444;}.kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basic ):not( .kt-accodion-icon-style-xclose ):not( .kt-accodion-icon-style-arrow ) .kt-accordion-header-wrap .kt-blocks-accordion-header:hover .kt-blocks-accordion-icon-trigger:after, .kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basic ):not( .kt-accodion-icon-style-xclose ):not( .kt-accodion-icon-style-arrow ) .kt-accordion-header-wrap .kt-blocks-accordion-header:hover .kt-blocks-accordion-icon-trigger:before, body:not(.hide-focus-outline) .kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basic ):not( .kt-accodion-icon-style-xclose ):not( .kt-accodion-icon-style-arrow ) .kt-accordion-header-wrap .kt-blocks-accordion-header:focus-visible .kt-blocks-accordion-icon-trigger:after, body:not(.hide-focus-outline) .kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basic ):not( .kt-accodion-icon-style-xclose ):not( .kt-accodion-icon-style-arrow ) .kt-accordion-header-wrap .kt-blocks-accordion-header:focus-visible .kt-blocks-accordion-icon-trigger:before{background:#eeeeee;}.kt-accordion-id77409_cb296b-5d .kt-accordion-header-wrap .kt-blocks-accordion-header:focus-visible,\n\t\t\t\t.kt-accordion-id77409_cb296b-5d > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap > .kt-blocks-accordion-header.kt-accordion-panel-active{color:#ffffff;background:#BE530B;border-top:1px solid #BE530B;border-right:1px solid #BE530B;border-bottom:1px solid #BE530B;border-left:1px solid #BE530B;}.kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basiccircle ):not( .kt-accodion-icon-style-xclosecircle ):not( .kt-accodion-icon-style-arrowcircle )  > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap > .kt-blocks-accordion-header.kt-accordion-panel-active .kt-blocks-accordion-icon-trigger:after, .kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basiccircle ):not( .kt-accodion-icon-style-xclosecircle ):not( .kt-accodion-icon-style-arrowcircle )  > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap > .kt-blocks-accordion-header.kt-accordion-panel-active .kt-blocks-accordion-icon-trigger:before{background:#ffffff;}.kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basic ):not( .kt-accodion-icon-style-xclose ):not( .kt-accodion-icon-style-arrow ) .kt-blocks-accordion-header.kt-accordion-panel-active .kt-blocks-accordion-icon-trigger{background:#ffffff;}.kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basic ):not( .kt-accodion-icon-style-xclose ):not( .kt-accodion-icon-style-arrow ) .kt-blocks-accordion-header.kt-accordion-panel-active .kt-blocks-accordion-icon-trigger:after, .kt-accordion-id77409_cb296b-5d:not( .kt-accodion-icon-style-basic ):not( .kt-accodion-icon-style-xclose ):not( .kt-accodion-icon-style-arrow ) .kt-blocks-accordion-header.kt-accordion-panel-active .kt-blocks-accordion-icon-trigger:before{background:#BE530B;}@media all and (max-width: 1024px){.kt-accordion-id77409_cb296b-5d .kt-accordion-panel-inner{border-top:0px solid transparent;border-right:0px solid transparent;border-bottom:0px solid transparent;border-left:0px solid transparent;}}@media all and (max-width: 1024px){.kt-accordion-id77409_cb296b-5d > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap > .kt-blocks-accordion-header{border-top:1px solid #f2f2f2;border-right:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;border-left:1px solid #f2f2f2;}}@media all and (max-width: 1024px){.kt-accordion-id77409_cb296b-5d > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap > .kt-blocks-accordion-header:hover, \n\t\t\t\tbody:not(.hide-focus-outline) .kt-accordion-id77409_cb296b-5d .kt-blocks-accordion-header:focus-visible{border-top:1px solid #878787;border-right:1px solid #878787;border-bottom:1px solid #878787;border-left:1px solid #878787;}}@media all and (max-width: 1024px){.kt-accordion-id77409_cb296b-5d .kt-accordion-header-wrap .kt-blocks-accordion-header:focus-visible,\n\t\t\t\t.kt-accordion-id77409_cb296b-5d > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap > .kt-blocks-accordion-header.kt-accordion-panel-active{border-top:1px solid #BE530B;border-right:1px solid #BE530B;border-bottom:1px solid #BE530B;border-left:1px solid #BE530B;}}@media all and (max-width: 767px){.kt-accordion-id77409_cb296b-5d .kt-accordion-inner-wrap{display:block;}.kt-accordion-id77409_cb296b-5d .kt-accordion-inner-wrap .kt-accordion-pane:not(:first-child){margin-top:10px;}.kt-accordion-id77409_cb296b-5d .kt-accordion-panel-inner{border-top:0px solid transparent;border-right:0px solid transparent;border-bottom:0px solid transparent;border-left:0px solid transparent;}.kt-accordion-id77409_cb296b-5d > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap > .kt-blocks-accordion-header{border-top:1px solid #f2f2f2;border-right:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;border-left:1px solid #f2f2f2;}.kt-accordion-id77409_cb296b-5d > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap > .kt-blocks-accordion-header:hover, \n\t\t\t\tbody:not(.hide-focus-outline) .kt-accordion-id77409_cb296b-5d .kt-blocks-accordion-header:focus-visible{border-top:1px solid #878787;border-right:1px solid #878787;border-bottom:1px solid #878787;border-left:1px solid #878787;}.kt-accordion-id77409_cb296b-5d .kt-accordion-header-wrap .kt-blocks-accordion-header:focus-visible,\n\t\t\t\t.kt-accordion-id77409_cb296b-5d > .kt-accordion-inner-wrap > .wp-block-kadence-pane > .kt-accordion-header-wrap > .kt-blocks-accordion-header.kt-accordion-panel-active{border-top:1px solid #BE530B;border-right:1px solid #BE530B;border-bottom:1px solid #BE530B;border-left:1px solid #BE530B;}}<\/style>\n<div class=\"wp-block-kadence-accordion alignnone\"><div class=\"kt-accordion-wrap kt-accordion-id77409_cb296b-5d kt-accordion-has-2-panes kt-active-pane-0 kt-accordion-block kt-pane-header-alignment-left kt-accodion-icon-style-basic kt-accodion-icon-side-right\" style=\"max-width:none\"><div class=\"kt-accordion-inner-wrap\" data-allow-multiple-open=\"false\" data-start-open=\"none\">\n<div class=\"wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-1 kt-pane77409_0ec4df-0c\"><div class=\"kt-accordion-header-wrap\"><button class=\"kt-blocks-accordion-header kt-acccordion-button-label-show\" type=\"button\"><span class=\"kt-blocks-accordion-title-wrap\"><span class=\"kt-blocks-accordion-title\">How it Works<\/span><\/span><span class=\"kt-blocks-accordion-icon-trigger\"><\/span><\/button><\/div><div class=\"kt-accordion-panel kt-accordion-panel-hidden\"><div class=\"kt-accordion-panel-inner\">\n<h2 class=\"wp-block-heading\">About the ISBN Letter Generator<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Applying for an International Standard Book Number (ISBN) in Nigeria requires a formally drafted application letter to the National Library of Nigeria (NLN). The <strong>ISBN Letter Generator<\/strong> simplifies this process by instantly creating a correctly formatted, print-ready request letter for both individual authors and corporate publishers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Whether you are figuring out how to get an ISBN in Nigeria for the first time or you are an established publisher managing a growing catalog, this free tool handles the administrative heavy lifting so you don&#8217;t have to worry about missing required information.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Tailored for Individuals and Publishers<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Individual Authors:<\/strong> Automatically format your personal details, contact information, and book metadata for all your titles at a time.<\/li>\n\n\n\n<li><strong>Corporate Entities:<\/strong> Generate official requests using your registered CAC or SMEDAN business details. The tool includes built-in compliance checks for previous legal deposit history, allowing established publishers to request more numbers.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key Features<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>100% NLN Compliant:<\/strong> Pre-formatted with the exact bureaucratic routing, addresses, and salutations required by the National Library of Nigeria.<\/li>\n\n\n\n<li><strong>Digital Signatures:<\/strong> Choose to automatically render your name in a realistic digital signature font, or leave a perfectly sized blank space for a traditional wet-ink signature and company seal.<\/li>\n\n\n\n<li><strong>Print-Ready Output:<\/strong> Generates a clean, watermark-free A4 document that you can print directly from your browser to take to your nearest National Library branch.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Stop stressing over official formatting. Simply input your publication details, print your standardized letter, and take the next step in your Nigerian book publishing journey.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This tool is always updated with the latest rules and limitations governing ISBN issuance in Nigeria.<\/p>\n<\/div><\/div><\/div>\n<\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Generate a free, National Library of Nigeria (NLN) compliant ISBN request letter instantly. Perfect for Nigerian authors and corporate publishers applying for ISBNs.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_kb_optimizer_status":2,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[15],"tags":[13,12,14],"class_list":["post-77409","post","type-post","status-publish","format-standard","hentry","category-isbn-tools","tag-fast","tag-free","tag-isbn"],"acf":[],"_links":{"self":[{"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/posts\/77409","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/comments?post=77409"}],"version-history":[{"count":2,"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/posts\/77409\/revisions"}],"predecessor-version":[{"id":77411,"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/posts\/77409\/revisions\/77411"}],"wp:attachment":[{"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/media?parent=77409"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/categories?post=77409"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/tags?post=77409"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}