{"id":75203,"date":"2026-03-13T00:27:22","date_gmt":"2026-03-13T00:27:22","guid":{"rendered":"https:\/\/aceworldpgs.com\/?page_id=75203"},"modified":"2026-05-12T03:15:06","modified_gmt":"2026-05-12T03:15:06","slug":"publishing-calculator","status":"publish","type":"post","link":"https:\/\/aceworldpgs.com\/tools\/publishing-calculator\/","title":{"rendered":"Publishing Calculator"},"content":{"rendered":"\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"WebApplication\",\n  \"name\": \"ACEworld Book Publishing Cost Calculator\",\n  \"url\": \"https:\/\/aceworldpgs.com\/tools\/publishing-calculator\/\",\n  \"description\": \"A free online publishing calculator that helps authors estimate the total cost of self-publishing a book. Calculate expenses for editing, cover design, formatting, ISBN registration, printing, and marketing to plan your publishing budget effectively.\",\n  \"applicationCategory\": \"FinanceApplication\",\n  \"operatingSystem\": \"All\",\n  \"browserRequirements\": \"Requires JavaScript\",\n  \"creator\": {\n    \"@type\": \"Organization\",\n    \"name\": \"ACEworld Publishing Services\",\n    \"url\": \"https:\/\/aceworldpgs.com\"\n  },\n  \"offers\": {\n    \"@type\": \"Offer\",\n    \"price\": \"0\",\n    \"priceCurrency\": \"USD\"\n  },\n  \"featureList\": [\n    \"Estimate total self-publishing costs\",\n    \"Calculate editing and proofreading expenses\",\n    \"Estimate cover design and formatting costs\",\n    \"Budget for ISBN registration and distribution\",\n    \"Plan book marketing and promotion expenses\"\n  ],\n  \"keywords\": [\n    \"book publishing calculator\",\n    \"self publishing cost calculator\",\n    \"book production cost estimator\",\n    \"publishing budget calculator\",\n    \"cost of publishing a book\"\n  ],\n  \"aggregateRating\": {\n    \"@type\": \"AggregateRating\",\n    \"ratingValue\": \"5.0\",\n    \"reviewCount\": \"87\"\n  }\n}\n<\/script>\n\n\n<!\u2013 ============================================================\n     ACEWORLD PUBLISHING CALCULATOR \u2014 REDESIGNED\n     Modern multi-step stepper \u2022 card-based selections\n     Mobile-first \u2022 ACF price injection intact\n============================================================ \u2013>\n<style>\n\/* \u2500\u2500 Design tokens \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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:root {\n  --sap-navy:      #0f1c3f;\n  --sap-blue:      #1d4ed8;\n  --sap-blue-lt:   #3b82f6;\n  --sap-blue-pale: #eff6ff;\n  --sap-green:     #166534;\n  --sap-green-lt:  #22c55e;\n  --sap-accent:    #f59e0b;\n  --sap-white:     #ffffff;\n  --sap-gray-50:   #f8fafc;\n  --sap-gray-100:  #f1f5f9;\n  --sap-gray-200:  #e2e8f0;\n  --sap-gray-400:  #94a3b8;\n  --sap-gray-600:  #475569;\n  --sap-gray-800:  #1e293b;\n  --sap-error:     #ef4444;\n  --sap-radius:    12px;\n  --sap-radius-sm: 8px;\n  --sap-shadow:    0 4px 24px rgba(15,28,63,0.08);\n  --sap-shadow-lg: 0 12px 48px rgba(15,28,63,0.14);\n  --sap-trans:     all 0.2s cubic-bezier(0.4,0,0.2,1);\n  --font-display:  'DM Sans', 'Segoe UI', system-ui, sans-serif;\n  --font-mono:     'DM Mono', 'Fira Code', monospace;\n}\n\n\/* \u2500\u2500 Google Font import \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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@import url('https:\/\/fonts.googleapis.com\/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&family=DM+Mono:wght@400;500&display=swap');\n\n\/* \u2500\u2500 Reset & base \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-calc * { box-sizing: border-box; margin: 0; padding: 0; }\n.sap-calc {\n  font-family: var(--font-display);\n  color: var(--sap-gray-800);\n  background: var(--sap-white);\n  max-width: 1000px;\n  margin: 0 auto;\n  border-radius: 20px;\n  box-shadow: var(--sap-shadow-lg);\n  overflow: hidden;\n  position: relative;\n}\n\n\/* \u2500\u2500 Header band \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-header {\n  background: linear-gradient(135deg, var(--sap-navy) 0%, #1e3a7a 100%);\n  padding: 28px 32px 24px;\n  position: relative;\n  overflow: hidden;\n}\n.sap-header::after {\n  content: '';\n  position: absolute;\n  right: -60px; top: -60px;\n  width: 240px; height: 240px;\n  border-radius: 50%;\n  background: rgba(59,130,246,0.12);\n  pointer-events: none;\n}\n.sap-header-top {\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  gap: 16px;\n  flex-wrap: wrap;\n}\n.sap-header h2 {\n  color: #fff;\n  font-size: clamp(18px, 3vw, 24px);\n  font-weight: 700;\n  letter-spacing: -0.02em;\n  line-height: 1.2;\n}\n.sap-header p {\n  color: rgba(255,255,255,0.7);\n  font-size: 13px;\n  margin-top: 4px;\n  font-weight: 400;\n}\n.sap-checklist-link {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  background: rgba(255,255,255,0.12);\n  color: #fff;\n  font-size: 11px;\n  font-weight: 600;\n  padding: 6px 12px;\n  border-radius: 20px;\n  text-decoration: none;\n  border: 1px solid rgba(255,255,255,0.2);\n  white-space: nowrap;\n  transition: var(--sap-trans);\n  flex-shrink: 0;\n}\n.sap-checklist-link:hover { background: rgba(255,255,255,0.22); }\n.sap-checklist-link .badge {\n  background: var(--sap-accent);\n  color: #000;\n  font-size: 9px;\n  font-weight: 700;\n  padding: 1px 5px;\n  border-radius: 4px;\n}\n\n\/* Optional service-type pill above the title (e.g. \"SAP\" or \"MDS\") *\/\n.ace-header-badge {\n  display: inline-flex;\n  align-items: center;\n  gap: 5px;\n  padding: 3px 10px;\n  border-radius: 20px;\n  font-size: 10px;\n  font-weight: 800;\n  text-transform: uppercase;\n  letter-spacing: 0.08em;\n  border: 1px solid rgba(255, 255, 255, 0.25);\n  width: fit-content;\n  color: #fff;\n}\n\n\/* SAP badge colour override *\/\n.ace-header-badge.badge-sap {\n  background: rgba(29, 78, 216, 0.55);\n  border-color: rgba(59, 130, 246, 0.5);\n}\n\n\/* \u2500\u2500 Stepper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-stepper {\n  display: flex;\n  align-items: center;\n  gap: 0;\n  padding: 0 32px;\n  background: var(--sap-gray-50);\n  border-bottom: 1px solid var(--sap-gray-200);\n  overflow-x: auto;\n  scrollbar-width: none;\n}\n.sap-stepper::-webkit-scrollbar { display: none; }\n.sap-step-item {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 14px 16px 14px 0;\n  cursor: pointer;\n  flex-shrink: 0;\n  position: relative;\n  border-bottom: 2px solid transparent;\n  transition: var(--sap-trans);\n  margin-bottom: -1px;\n}\n.sap-step-item:not(:last-child)::after {\n  content: '\u203a';\n  position: absolute;\n  right: -2px;\n  color: var(--sap-gray-400);\n  font-size: 16px;\n  top: 50%; transform: translateY(-50%);\n}\n.sap-step-num {\n  width: 24px; height: 24px;\n  border-radius: 50%;\n  display: flex; align-items: center; justify-content: center;\n  font-size: 11px;\n  font-weight: 700;\n  background: var(--sap-gray-200);\n  color: var(--sap-gray-600);\n  transition: var(--sap-trans);\n  flex-shrink: 0;\n}\n.sap-step-label {\n  font-size: 12px;\n  font-weight: 500;\n  color: var(--sap-gray-400);\n  transition: var(--sap-trans);\n  white-space: nowrap;\n}\n.sap-step-item.active {\n  border-bottom-color: var(--sap-blue);\n}\n.sap-step-item.active .sap-step-num {\n  background: var(--sap-blue);\n  color: #fff;\n}\n.sap-step-item.active .sap-step-label { color: var(--sap-blue); font-weight: 600; }\n.sap-step-item.done .sap-step-num {\n  background: var(--sap-green-lt);\n  color: #fff;\n}\n.sap-step-item.done .sap-step-num::before { content: '\u2713'; }\n.sap-step-item.done .sap-step-label { color: var(--sap-green); }\n\n\/* \u2500\u2500 Step panels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-body { padding: 28px 32px 0; }\n.sap-step-panel { display: none; }\n.sap-step-panel.active { display: block; animation: sapFadeIn 0.25s ease; }\n@keyframes sapFadeIn { from { opacity:0; transform:translateY(6px); } to { opacity:1; transform:translateY(0); } }\n\n.sap-step-heading {\n  font-size: 16px;\n  font-weight: 700;\n  color: var(--sap-navy);\n  margin-bottom: 4px;\n  letter-spacing: -0.01em;\n}\n.sap-step-sub {\n  font-size: 13px;\n  color: var(--sap-gray-600);\n  margin-bottom: 20px;\n  line-height: 1.5;\n}\n\n\/* \u2500\u2500 Section label \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-section-label {\n  font-size: 10px;\n  font-weight: 700;\n  text-transform: uppercase;\n  letter-spacing: 0.1em;\n  color: var(--sap-blue);\n  margin: 22px 0 10px;\n  display: flex;\n  align-items: center;\n  gap: 6px;\n}\n.sap-section-label::after {\n  content: '';\n  flex: 1;\n  height: 1px;\n  background: var(--sap-gray-200);\n}\n\n\/* \u2500\u2500 Project info row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-project-row {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 14px;\n  margin-bottom: 20px;\n}\n@media (max-width: 560px) { .sap-project-row { grid-template-columns: 1fr; } }\n\n.sap-field label {\n  display: block;\n  font-size: 11px;\n  font-weight: 700;\n  color: var(--sap-gray-600);\n  text-transform: uppercase;\n  letter-spacing: 0.05em;\n  margin-bottom: 6px;\n}\n.sap-field input[type=\"text\"],\n.sap-field input[type=\"number\"],\n.sap-field input[type=\"email\"],\n.sap-field input[type=\"tel\"],\n.sap-field select {\n  width: 100%;\n  padding: 10px 13px;\n  border: 1.5px solid var(--sap-gray-200);\n  border-radius: var(--sap-radius-sm);\n  font-size: 14px;\n  font-family: var(--font-display);\n  color: var(--sap-gray-800);\n  background: var(--sap-white);\n  transition: var(--sap-trans);\n  appearance: none;\n  -webkit-appearance: none;\n}\n.sap-field select {\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%2394a3b8' stroke-width='1.5' fill='none' stroke-linecap='round'\/%3E%3C\/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: right 12px center;\n  padding-right: 34px;\n}\n.sap-field input:focus,\n.sap-field select:focus {\n  outline: none;\n  border-color: var(--sap-blue-lt);\n  box-shadow: 0 0 0 3px rgba(59,130,246,0.12);\n}\n.sap-field small {\n  display: block;\n  font-size: 11px;\n  color: var(--sap-gray-400);\n  margin-top: 4px;\n}\n\n\/* \u2500\u2500 Toggle 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.sap-toggle-row {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n  padding: 13px 16px;\n  border: 1.5px solid var(--sap-gray-200);\n  border-radius: var(--sap-radius-sm);\n  margin-bottom: 8px;\n  cursor: pointer;\n  transition: var(--sap-trans);\n  background: var(--sap-white);\n}\n.sap-toggle-row:hover { border-color: var(--sap-blue-lt); background: var(--sap-blue-pale); }\n.sap-toggle-row.toggled { border-color: var(--sap-blue); background: var(--sap-blue-pale); }\n.sap-toggle-label { font-size: 14px; font-weight: 500; color: var(--sap-gray-800); display: flex; align-items: center; gap: 8px; }\n.sap-toggle-label .tip {\n  font-size: 11px;\n  background: var(--sap-gray-100);\n  color: var(--sap-gray-600);\n  padding: 2px 7px;\n  border-radius: 10px;\n  font-weight: 500;\n}\n\n\/* iOS-style toggle switch *\/\n.sap-switch { position:relative; width:44px; height:24px; flex-shrink:0; }\n.sap-switch input { opacity:0; width:0; height:0; position:absolute; }\n.sap-switch-track {\n  position:absolute; inset:0;\n  background: var(--sap-gray-200);\n  border-radius: 12px;\n  transition: var(--sap-trans);\n  cursor: pointer;\n}\n.sap-switch-track::after {\n  content:'';\n  position:absolute;\n  width:18px; height:18px;\n  left:3px; top:3px;\n  background:#fff;\n  border-radius:50%;\n  transition: var(--sap-trans);\n  box-shadow: 0 1px 4px rgba(0,0,0,0.18);\n}\n.sap-switch input:checked + .sap-switch-track { background: var(--sap-blue); }\n.sap-switch input:checked + .sap-switch-track::after { transform: translateX(20px); }\n\n\/* \u2500\u2500 Subsections \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-subsection {\n  background: var(--sap-gray-50);\n  border: 1.5px solid var(--sap-gray-200);\n  border-top: none;\n  border-radius: 0 0 var(--sap-radius-sm) var(--sap-radius-sm);\n  padding: 14px 16px;\n  margin-top: -8px;\n  margin-bottom: 8px;\n  display: none;\n}\n.sap-subsection.open { display: block; }\n.sap-subsection label { font-size: 12px; font-weight: 600; color: var(--sap-gray-600); margin-bottom: 6px; display: block; }\n.sap-subsection select,\n.sap-subsection input[type=\"number\"] {\n  width: 100%;\n  padding: 8px 12px;\n  border: 1.5px solid var(--sap-gray-200);\n  border-radius: 6px;\n  font-size: 13px;\n  font-family: var(--font-display);\n  background: #fff;\n  color: var(--sap-gray-800);\n  appearance: none;\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%2394a3b8' stroke-width='1.5' fill='none' stroke-linecap='round'\/%3E%3C\/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: right 10px center;\n  padding-right: 30px;\n}\n.sap-subsection select:focus,\n.sap-subsection input:focus { outline: none; border-color: var(--sap-blue-lt); box-shadow: 0 0 0 3px rgba(59,130,246,0.1); }\n\n\/* \u2500\u2500 Radio card grids \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-radio-grid {\n  display: grid;\n  gap: 10px;\n  margin-bottom: 14px;\n}\n.sap-radio-grid-2 { grid-template-columns: repeat(2, 1fr); }\n.sap-radio-grid-3 { grid-template-columns: repeat(3, 1fr); }\n.sap-radio-grid-4 { grid-template-columns: repeat(4, 1fr); }\n.sap-radio-grid-5 { grid-template-columns: repeat(5, 1fr); }\n@media (max-width: 560px) {\n  .sap-radio-grid-3 { grid-template-columns: repeat(2, 1fr); }\n  .sap-radio-grid-4 { grid-template-columns: repeat(2, 1fr); }\n  .sap-radio-grid-5 { grid-template-columns: repeat(3, 1fr); }\n}\n@media (max-width: 400px) {\n  .sap-radio-grid-2 { grid-template-columns: 1fr 1fr; }\n  .sap-radio-grid-5 { grid-template-columns: repeat(2, 1fr); }\n}\n\n.sap-radio-card {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  gap: 5px;\n  padding: 12px 8px;\n  border: 1.5px solid var(--sap-gray-200);\n  border-radius: var(--sap-radius-sm);\n  cursor: pointer;\n  text-align: center;\n  transition: var(--sap-trans);\n  background: var(--sap-white);\n  position: relative;\n  min-height: 64px;\n}\n.sap-radio-card:hover { border-color: var(--sap-blue-lt); background: var(--sap-blue-pale); }\n.sap-radio-card.selected {\n  border-color: var(--sap-blue);\n  background: var(--sap-blue-pale);\n  box-shadow: 0 0 0 2px rgba(29,78,216,0.15);\n}\n.sap-radio-card.selected::after {\n  content: '\u2713';\n  position: absolute;\n  top: 6px; right: 8px;\n  font-size: 10px;\n  font-weight: 700;\n  color: var(--sap-blue);\n}\n.sap-radio-card input { position: absolute; opacity: 0; width:0; height:0; }\n.sap-radio-card .rc-icon { font-size: 20px; line-height: 1; }\n.sap-radio-card .rc-label { font-size: 11px; font-weight: 600; color: var(--sap-gray-800); line-height: 1.2; }\n.sap-radio-card .rc-sub { font-size: 10px; color: var(--sap-gray-400); font-weight: 400; }\n.sap-radio-card.selected .rc-label { color: var(--sap-blue); }\n\n\/* Copies: special \"0\" card (no print) *\/\n.sap-radio-card.no-print.selected { border-color: var(--sap-gray-400); background: var(--sap-gray-100); box-shadow: none; }\n.sap-radio-card.no-print.selected::after { display: none; }\n.sap-radio-card.no-print.selected .rc-label { color: var(--sap-gray-600); }\n\n\/* \u2500\u2500 Print spec panel (collapsible) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sap-print-specs {\n  border: 1.5px solid var(--sap-gray-200);\n  border-radius: var(--sap-radius);\n  overflow: hidden;\n  margin-top: 4px;\n}\n.sap-print-specs-header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 13px 16px;\n  background: var(--sap-navy);\n  color: #fff;\n  font-size: 13px;\n  font-weight: 600;\n  cursor: pointer;\n  user-select: none;\n}\n.sap-print-specs-header .chevron {\n  transition: var(--sap-trans);\n  font-size: 16px;\n}\n.sap-print-specs-header.open .chevron { transform: rotate(180deg); }\n.sap-print-specs-body { padding: 20px 20px 4px; background: var(--sap-gray-50); }\n\n\/* \u2500\u2500 Interior 3-col grid (responsive) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sap-interior-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr 1fr;\n  gap: 10px;\n  margin-bottom: 14px;\n}\n\/* On mobile: stack each field vertically, full width *\/\n@media (max-width: 600px) {\n  .sap-interior-grid {\n    grid-template-columns: 1fr;\n    gap: 14px;\n  }\n}\n\n\/* \u2500\u2500 Spec 2-col grids (Cover, Finishing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.sap-spec-grid-2col {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 14px;\n  margin-bottom: 14px;\n}\n@media (max-width: 500px) {\n  .sap-spec-grid-2col {\n    grid-template-columns: 1fr;\n    gap: 14px;\n  }\n}\n\n\/* \u2500\u2500 Custom copies input \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-custom-copies { display: none; margin-top: 10px; }\n.sap-custom-copies.show { display: block; }\n.sap-custom-copies input {\n  width: 100%; padding: 10px 13px;\n  border: 1.5px solid var(--sap-blue-lt);\n  border-radius: var(--sap-radius-sm);\n  font-size: 14px; font-family: var(--font-display);\n}\n.sap-custom-copies input:focus { outline: none; box-shadow: 0 0 0 3px rgba(59,130,246,0.12); }\n\n\/* \u2500\u2500 Client info \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-client-grid {\n  display: grid;\n  grid-template-columns: 1fr 1.5fr 1fr;\n  gap: 14px;\n  margin-bottom: 20px;\n}\n@media (max-width: 640px) { .sap-client-grid { grid-template-columns: 1fr; } }\n\n\/* \u2500\u2500 Error messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-error {\n  font-size: 11px;\n  font-weight: 600;\n  color: var(--sap-error);\n  margin-top: 5px;\n  display: none;\n}\n.sap-error.show { display: block; }\n\n\/* \u2500\u2500 Nav buttons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-nav {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 20px 32px;\n  border-top: 1px solid var(--sap-gray-200);\n  margin-top: 24px;\n  gap: 12px;\n  background: var(--sap-gray-50);\n}\n.sap-btn {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  padding: 11px 22px;\n  border-radius: var(--sap-radius-sm);\n  font-size: 14px;\n  font-weight: 600;\n  font-family: var(--font-display);\n  cursor: pointer;\n  border: none;\n  transition: var(--sap-trans);\n  text-decoration: none;\n}\n.sap-btn-ghost {\n  background: var(--sap-gray-100);\n  color: var(--sap-gray-600);\n}\n.sap-btn-ghost:hover { background: var(--sap-gray-200); }\n.sap-btn-primary {\n  background: var(--sap-blue);\n  color: #fff;\n  box-shadow: 0 2px 8px rgba(29,78,216,0.25);\n}\n.sap-btn-primary:hover { background: #1a45c0; box-shadow: 0 4px 16px rgba(29,78,216,0.35); }\n.sap-btn-primary:disabled { background: var(--sap-gray-400); box-shadow: none; cursor: not-allowed; }\n.sap-btn-submit {\n  background: linear-gradient(135deg, #166534 0%, #15803d 100%);\n  color: #fff;\n  box-shadow: 0 2px 8px rgba(22,101,52,0.3);\n  font-size: 14px;\n}\n.sap-btn-submit:hover { box-shadow: 0 4px 16px rgba(22,101,52,0.4); filter: brightness(1.06); }\n.sap-btn-submit:disabled { background: var(--sap-gray-400); box-shadow:none; cursor:not-allowed; }\n\n\/* \u2500\u2500 Floating live total \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-floating-total {\n  position: fixed;\n  bottom: 24px;\n  right: 24px;\n  z-index: 9999;\n  background: var(--sap-navy);\n  color: #fff;\n  border-radius: 50px;\n  padding: 12px 20px;\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  box-shadow: 0 8px 32px rgba(15,28,63,0.35);\n  transition: var(--sap-trans);\n  opacity: 0;\n  pointer-events: none;\n  transform: translateY(10px);\n}\n.sap-floating-total.show {\n  opacity: 1;\n  pointer-events: auto;\n  transform: translateY(0);\n}\n.sap-float-label { font-size: 11px; color: rgba(255,255,255,0.6); font-weight: 500; }\n.sap-float-value { font-size: 16px; font-weight: 700; font-family: var(--font-mono); color: var(--sap-accent); }\n.sap-float-details {\n  font-size: 11px;\n  font-weight: 600;\n  padding: 5px 12px;\n  background: rgba(255,255,255,0.12);\n  border-radius: 20px;\n  cursor: pointer;\n  border: none;\n  color: #fff;\n  transition: var(--sap-trans);\n}\n.sap-float-details:hover { background: rgba(255,255,255,0.22); }\n\n\/* \u2500\u2500 Quotation summary panel \u2500\u2500\u2500\u2500\u2500\u2500\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.sap-quote-panel {\n  background: var(--sap-gray-50);\n  border: 1.5px solid var(--sap-gray-200);\n  border-radius: var(--sap-radius);\n  overflow: hidden;\n  margin-bottom: 20px;\n}\n.sap-quote-header {\n  background: linear-gradient(135deg, var(--sap-navy) 0%, #1e3a7a 100%);\n  padding: 16px 20px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: wrap;\n  gap: 10px;\n}\n.sap-quote-header-left { color: #fff; }\n.sap-quote-header-left .qh-title { font-size: 13px; font-weight: 400; opacity: 0.7; }\n.sap-quote-header-left .qh-book { font-size: 16px; font-weight: 700; }\n.sap-quote-header-left .qh-words { font-size: 12px; opacity: 0.6; margin-top: 2px; }\n.sap-quote-total-badge {\n  background: var(--sap-accent);\n  color: var(--sap-navy);\n  font-size: 22px;\n  font-weight: 800;\n  padding: 8px 18px;\n  border-radius: 10px;\n  letter-spacing: -0.02em;\n}\n.sap-quote-date { font-size: 11px; color: rgba(255,255,255,0.5); margin-top: 4px; }\n\n.sap-quote-body { padding: 16px 20px; }\n.sap-quote-section-title {\n  font-size: 10px;\n  font-weight: 700;\n  text-transform: uppercase;\n  letter-spacing: 0.1em;\n  color: var(--sap-blue);\n  margin: 16px 0 8px;\n  display: flex;\n  align-items: center;\n  gap: 6px;\n}\n.sap-quote-section-title::after { content:''; flex:1; height:1px; background:var(--sap-gray-200); }\n.sap-quote-row {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 7px 0;\n  border-bottom: 1px solid var(--sap-gray-100);\n  font-size: 13px;\n}\n.sap-quote-row:last-child { border-bottom: none; }\n.sap-quote-row .qr-label { color: var(--sap-gray-600); }\n.sap-quote-row .qr-value { font-weight: 600; color: var(--sap-gray-800); font-family: var(--font-mono); }\n.sap-quote-row.dimmed { opacity: 0.35; }\n.sap-quote-row.total { font-weight: 700; font-size: 14px; padding-top: 10px; border-top: 2px solid var(--sap-gray-200); border-bottom: none; }\n.sap-quote-row.total .qr-value { color: var(--sap-navy); }\n\n\/* print card (copies) *\/\n.sap-print-card {\n  background: linear-gradient(135deg, var(--sap-blue-pale) 0%, #dbeafe 100%);\n  border: 1.5px solid #bfdbfe;\n  border-radius: var(--sap-radius-sm);\n  padding: 14px 16px;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 12px;\n  flex-wrap: wrap;   \/* allows wrapping on narrow screens *\/\n  margin: 8px 0;\n}\n\/* On mobile: stack copies label above price-per-copy *\/\n@media (max-width: 480px) {\n  .sap-print-card {\n    flex-direction: column;\n    align-items: flex-start;\n  }\n  .sap-print-card > div:last-child {\n    text-align: left;\n  }\n}\n.sap-print-card .pc-copies { font-size: 16px; font-weight: 700; color: var(--sap-navy); }\n.sap-print-card .pc-specs { font-size: 10px; text-transform: uppercase; color: var(--sap-gray-400); letter-spacing: 0.07em; margin-top: 2px; }\n.sap-print-card .pc-price { font-size: 15px; font-weight: 700; color: var(--sap-navy); font-family: var(--font-mono); }\n.sap-print-card .pc-each { font-size: 10px; color: var(--sap-gray-400); }\n\n\/* specs grid \u2014 stack to single column on all mobile sizes *\/\n.sap-specs-grid {\n  display: grid;\n  grid-template-columns: repeat(2, 1fr);\n  gap: 6px;\n  margin: 8px 0;\n}\n@media (max-width: 560px) {\n  .sap-specs-grid {\n    grid-template-columns: 1fr;\n    gap: 5px;\n  }\n}\n.sap-spec-pill {\n  background: var(--sap-white);\n  border: 1px solid var(--sap-gray-200);\n  border-radius: 6px;\n  padding: 6px 10px;\n  font-size: 11px;\n  color: var(--sap-gray-600);\n}\n\n\/* note block *\/\n.sap-note {\n  background: #fef9ee;\n  border: 1px solid #fde68a;\n  border-radius: 8px;\n  padding: 10px 14px;\n  font-size: 12px;\n  color: #78350f;\n  margin: 10px 0;\n  line-height: 1.5;\n}\n.sap-contact-note {\n  text-align: center;\n  font-size: 12px;\n  color: var(--sap-gray-400);\n  margin: 14px 0 4px;\n  line-height: 1.6;\n}\n\n\/* \u2500\u2500 Clear link \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-clear-link {\n  font-size: 12px;\n  color: var(--sap-gray-400);\n  cursor: pointer;\n  text-decoration: underline;\n  background: none;\n  border: none;\n  padding: 0;\n  font-family: var(--font-display);\n}\n.sap-clear-link:hover { color: var(--sap-error); }\n\n\/* \u2500\u2500 Tooltip \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-tip {\n  position: relative;\n  display: inline-block;\n  cursor: help;\n  color: var(--sap-gray-400);\n  font-size: 11px;\n  font-weight: 700;\n  background: var(--sap-gray-100);\n  border-radius: 50%;\n  width: 16px; height: 16px;\n  text-align: center;\n  line-height: 16px;\n  vertical-align: middle;\n  margin-left: 4px;\n}\n.sap-tip:hover .sap-tip-text { visibility: visible; opacity: 1; }\n.sap-tip-text {\n  visibility: hidden;\n  opacity: 0;\n  width: 220px;\n  background: var(--sap-navy);\n  color: #fff;\n  font-size: 11px;\n  font-weight: 400;\n  padding: 8px 12px;\n  border-radius: 8px;\n  position: absolute;\n  bottom: 130%;\n  left: 50%;\n  transform: translateX(-50%);\n  line-height: 1.5;\n  z-index: 100;\n  pointer-events: none;\n  transition: opacity 0.15s;\n}\n\n\/* \u2500\u2500 Print media \u2014 isolate the quotation panel only \u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n@media print {\n  \/*\n   * Step 1: Hide EVERYTHING on the page \u2014 WordPress header, nav,\n   * footer, sidebar, mobile menu, and all other content.\n   *\/\n  body * {\n    visibility: hidden !important;\n  }\n\n  \/*\n   * Step 2: Make ONLY the quote panel and its children visible.\n   *\/\n  #sap-quote-print-target,\n  #sap-quote-print-target * {\n    visibility: visible !important;\n  }\n\n  \/*\n   * Step 3: Position the quote panel to fill the printed page.\n   *\/\n  #sap-quote-print-target {\n    position: fixed !important;\n    top: 0 !important;\n    left: 0 !important;\n    width: 100% !important;\n    background: #fff !important;\n    padding: 24px !important;\n    box-shadow: none !important;\n    border: none !important;\n    z-index: 999999 !important;\n  }\n\n  \/* Ensure colour printing for badges *\/\n  * {\n    -webkit-print-color-adjust: exact !important;\n    print-color-adjust: exact !important;\n  }\n\n  \/* Explicitly hide calculator UI chrome *\/\n  .sap-stepper,\n  .sap-header,\n  .sap-nav,\n  .sap-floating-total,\n  .sap-progress-bar,\n  .sap-btn-submit,\n  .sap-note,\n  .sap-clear-link,\n  #clearFormBtn {\n    display: none !important;\n    visibility: hidden !important;\n  }\n}\n\n\/* \u2500\u2500 Jump link \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-jump { font-size: 12px; color: var(--sap-blue-lt); text-decoration: none; }\n.sap-jump:hover { text-decoration: underline; }\n\n\/* \u2500\u2500 Progress bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.sap-progress-bar {\n  height: 3px;\n  background: var(--sap-gray-200);\n  position: relative;\n  overflow: hidden;\n}\n.sap-progress-fill {\n  height: 100%;\n  background: linear-gradient(90deg, var(--sap-red) 0%, var(--sap-blue-lt) 100%);\n  border-radius: 2px;\n  transition: width 0.4s cubic-bezier(0.4,0,0.2,1);\n}\n\n\/* tooltip images *\/\n.sap-tip-img { width:220px; height:100px; object-fit:cover; border-radius:4px; margin-top:6px; display:block; }\n<\/style>\n\n<!-- ============================================================\n     MARKUP\n============================================================ -->\n<div class=\"sap-calc\" id=\"sap-calc-root\">\n\n  <!-- Header -->\n  <div class=\"sap-header\">\n    <div class=\"sap-header-top\">\n      <div>\n        <h2>Publishing Calculator<\/h2>\n        <p>Know how much it costs to publish and print your book. Get instant quotation.<\/p>\n      <\/div>\n      <a href=\"https:\/\/aceworldpgs.com\/acepublishingchecklist\" class=\"sap-checklist-link\">\n        Download Publishing Checklist <span class=\"badge\">\u2b07<\/span>\n      <\/a>\n    <\/div>\n  <\/div>\n\n  <!-- Progress bar -->\n  <div class=\"sap-progress-bar\"><div class=\"sap-progress-fill\" id=\"sapProgressFill\" style=\"width:20%\"><\/div><\/div>\n\n  <!-- Stepper -->\n  <div class=\"sap-stepper\" id=\"sapStepper\">\n    <div class=\"sap-step-item active\" data-step=\"1\" onclick=\"sapGoStep(1)\">\n      <div class=\"sap-step-num\">1<\/div>\n      <div class=\"sap-step-label\">Project<\/div>\n    <\/div>\n    <div class=\"sap-step-item\" data-step=\"2\" onclick=\"sapGoStep(2)\">\n      <div class=\"sap-step-num\">2<\/div>\n      <div class=\"sap-step-label\">Publishing<\/div>\n    <\/div>\n    <div class=\"sap-step-item\" data-step=\"3\" onclick=\"sapGoStep(3)\">\n      <div class=\"sap-step-num\">3<\/div>\n      <div class=\"sap-step-label\">Print<\/div>\n    <\/div>\n    <div class=\"sap-step-item\" data-step=\"4\" onclick=\"sapGoStep(4)\">\n      <div class=\"sap-step-num\">4<\/div>\n      <div class=\"sap-step-label\">Quotation<\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"sap-body\" id=\"calculator-form\">\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       STEP 1 \u2014 PROJECT DETAILS\n  \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <div class=\"sap-step-panel active\" id=\"sap-step-1\">\n\n    <p class=\"sap-step-heading\">Project Details<\/p>\n    <p class=\"sap-step-sub\">Start with your project basics. Word count drives all editorial cost estimates.<\/p>\n\n    <div class=\"sap-project-row\">\n      <div class=\"sap-field\">\n        <label for=\"bookTitle\">Project Title<\/label>\n        <input type=\"text\" id=\"bookTitle\" name=\"bookTitle\" placeholder=\"My Book Project\" value=\"My Book Project\">\n      <\/div>\n      <div class=\"sap-field\">\n        <label for=\"wordCount\">Word Count <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Total words in your manuscript. Required for editing, typesetting and transcription estimates.<\/span><\/span><\/label>\n        <input type=\"number\" id=\"wordCount\" name=\"wordCount\" min=\"500\" value=\"20000\">\n      <\/div>\n    <\/div>\n\n    <div class=\"sap-section-label\">Your Details<\/div>\n\n    <div class=\"sap-client-grid\">\n      <div class=\"sap-field\">\n        <label for=\"clientName\">Your Name<\/label>\n        <input type=\"text\" id=\"clientName\" name=\"clientName\" placeholder=\"Full name\">\n      <\/div>\n      <div class=\"sap-field\">\n        <label for=\"clientEmail\">Email Address <span style=\"color:var(--sap-error)\">*<\/span><\/label>\n        <input type=\"email\" id=\"clientEmail\" name=\"clientEmail\" placeholder=\"email@example.com\">\n        <div class=\"sap-error\" id=\"emailError\">A valid email address is required.<\/div>\n      <\/div>\n      <div class=\"sap-field\">\n        <label for=\"clientPhone\">Phone \/ WhatsApp<\/label>\n        <input type=\"tel\" id=\"clientPhone\" name=\"clientPhone\" placeholder=\"Optional\">\n      <\/div>\n    <\/div>\n\n  <\/div><!-- \/step 1 -->\n\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       STEP 2 \u2014 PUBLISHING SERVICES\n  \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <div class=\"sap-step-panel\" id=\"sap-step-2\">\n\n    <p class=\"sap-step-heading\">Publishing Services<\/p>\n    <p class=\"sap-step-sub\">Toggle any services you need. Prices update live on the next step.<\/p>\n\n    <!-- Editorial -->\n    <div class=\"sap-section-label\">Editorial<\/div>\n\n    <!-- Transcription -->\n    <label class=\"sap-toggle-row\" id=\"tr-row\" for=\"transcriptionService\">\n      <span class=\"sap-toggle-label\">Manuscript Transcription\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Converting handwritten manuscripts into digital text format.<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"transcriptionService\" name=\"transcriptionService\"><label class=\"sap-switch-track\" for=\"transcriptionService\"><\/label><\/div>\n    <\/label>\n    <div class=\"sap-subsection\" id=\"transcriptionDetails\">\n      <div class=\"sap-error\" id=\"transcriptionError\">Please enter a word count of 100 or more.<\/div>\n      <label for=\"transcriptionType\">Select Manuscript Language<\/label>\n      <select id=\"transcriptionType\" name=\"transcriptionType\">\n        <option value=\"English\">English<\/option>\n        <option value=\"Yoruba\">Yoruba<\/option>\n        <option value=\"Other Languages\">Other Languages<\/option>\n      <\/select>\n    <\/div>\n\n    <!-- Editing -->\n    <label class=\"sap-toggle-row\" id=\"ed-row\" for=\"editingService\">\n      <span class=\"sap-toggle-label\">Editing\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\"><strong>Dev. Editing<\/strong> \u2014 structure & ideas. <strong>Line Editing<\/strong> \u2014 style & clarity. <strong>Copy Editing<\/strong> \u2014 grammar & consistency.<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"editingService\" name=\"editingService\"><label class=\"sap-switch-track\" for=\"editingService\"><\/label><\/div>\n    <\/label>\n    <div class=\"sap-subsection\" id=\"editingDetails\">\n      <div class=\"sap-error\" id=\"editingError\">Please enter a word count of 30 or more.<\/div>\n      <label for=\"editingLevel\">Select Level of Editing<\/label>\n      <select id=\"editingLevel\" name=\"editingLevel\">\n        <option value=\"Developmental Editing\">Developmental Editing (\u20a610\/word)<\/option>\n        <option value=\"Line Editing\">Line Editing (\u20a66\/word)<\/option>\n        <option value=\"Copy Editing\">Copy Editing (\u20a63.2\/word)<\/option>\n      <\/select>\n    <\/div>\n\n    <!-- Proofreading -->\n    <label class=\"sap-toggle-row\" for=\"proofreadingService\">\n      <span class=\"sap-toggle-label\">Proofreading\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Final quality check \u2014 typos, punctuation, and formatting inconsistencies.<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"proofreadingService\" name=\"proofreadingService\"><label class=\"sap-switch-track\" for=\"proofreadingService\"><\/label><\/div>\n    <\/label>\n\n    <!-- Design -->\n    <div class=\"sap-section-label\">Design<\/div>\n\n    <!-- Formatting -->\n    <label class=\"sap-toggle-row\" for=\"formattingService\">\n      <span class=\"sap-toggle-label\">Typesetting &amp; Formatting\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Arranging text for print or digital. Select both Ebook &amp; Print and enjoy a 25% discount.<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"formattingService\" name=\"formattingService\"><label class=\"sap-switch-track\" for=\"formattingService\"><\/label><\/div>\n    <\/label>\n    <div class=\"sap-subsection\" id=\"formattingDetails\">\n      <div class=\"sap-error\" id=\"formattingError\">Please enter a word count of 30 or more.<\/div>\n      <label for=\"formattingType\">Select Formatting Type<\/label>\n      <select id=\"formattingType\" name=\"formattingType\">\n        <option value=\"Ebook & Print\">Ebook and Print Formatting<\/option>\n        <option value=\"Ebook Formatting\">Ebook Formatting<\/option>\n        <option value=\"Print Layout\">Print Layout<\/option>\n      <\/select>\n    <\/div>\n\n    <!-- Book Cover -->\n    <label class=\"sap-toggle-row\" for=\"coverDesignService\">\n      <span class=\"sap-toggle-label\">Book Cover\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Full cover (front, back &amp; spine) required for print. Front only for digital distribution.<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"coverDesignService\" name=\"coverDesignService\"><label class=\"sap-switch-track\" for=\"coverDesignService\"><\/label><\/div>\n    <\/label>\n    <div class=\"sap-subsection\" id=\"coverDesignDetails\">\n      <label for=\"coverDesignType\">Select Design Type<\/label>\n      <select id=\"coverDesignType\" name=\"coverDesignType\">\n        <option value=\"Full Cover\">Full Cover (\u20a628000)<\/option>\n        <option value=\"Front Cover Only\">Front Cover Only (\u20a616000)<\/option>\n      <\/select>\n    <\/div>\n\n    <!-- Brochure -->\n    <label class=\"sap-toggle-row\" for=\"brochureDesignService\">\n      <span class=\"sap-toggle-label\">Brochure &amp; Magazine\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Promotional brochure design. Enter the number of pages needed.<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"brochureDesignService\" name=\"brochureDesignService\"><label class=\"sap-switch-track\" for=\"brochureDesignService\"><\/label><\/div>\n    <\/label>\n    <div class=\"sap-subsection\" id=\"brochureDetails\">\n      <div class=\"sap-error\" id=\"brochureError\">Please enter at least 1 page.<\/div>\n      <label for=\"brochurePages\">Number of Brochure Pages<\/label>\n      <input type=\"number\" id=\"brochurePages\" name=\"brochurePages\" min=\"1\" placeholder=\"e.g. 8\">\n    <\/div>\n\n    <!-- Legal -->\n    <div class=\"sap-section-label\">Legal<\/div>\n\n    <!-- ISBN -->\n    <label class=\"sap-toggle-row\" for=\"isbnService\">\n      <span class=\"sap-toggle-label\">ISBN\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Each book title &amp; version requires its own ISBN.<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"isbnService\" name=\"isbnService\"><label class=\"sap-switch-track\" for=\"isbnService\"><\/label><\/div>\n    <\/label>\n    <div class=\"sap-subsection\" id=\"isbnDetails\">\n      <label for=\"isbnUnits\">How many ISBNs do you need?<\/label>\n      <select id=\"isbnUnits\" name=\"isbnUnits\">\n        <option value=\"1\">1 ISBN (Available)<\/option>\n        <option value=\"2\">2 ISBNs (Available)<\/option>\n        <option value=\"3\">3 ISBNs (Unavailable)<\/option>\n        <option value=\"5\">5 ISBNs (Unavailable)<\/option>\n        <option value=\"10\">10 ISBNs (Unavailable)<\/option>\n        <option value=\"15\">15 ISBNs (Unavailable)<\/option>\n        <option value=\"20\">20 ISBNs (Unavailable)<\/option>\n      <\/select>\n    <\/div>\n\n    <!-- Copyright -->\n    <label class=\"sap-toggle-row\" for=\"copyrightRegistration\">\n      <span class=\"sap-toggle-label\">Copyright\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Formal legal claim over your content. Recommended for protection.<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"copyrightRegistration\" name=\"copyrightRegistration\" value=\"Yes\"><label class=\"sap-switch-track\" for=\"copyrightRegistration\"><\/label><\/div>\n    <\/label>\n\n    <!-- ISSN -->\n    <label class=\"sap-toggle-row\" for=\"issnService\">\n      <span class=\"sap-toggle-label\">ISSN\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">For serial publications like magazines, journals, and newsletters.<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"issnService\" name=\"issnService\"><label class=\"sap-switch-track\" for=\"issnService\"><\/label><\/div>\n    <\/label>\n    <div class=\"sap-subsection\" id=\"issnDetails\">\n      <label for=\"issnType\">Select ISSN Type<\/label>\n      <select id=\"issnType\" name=\"issnType\">\n        <option value=\"Electronic ISSN\">Electronic ISSN (\u20a629,100)<\/option>\n        <option value=\"Print ISSN\">Print ISSN (\u20a632,100)<\/option>\n        <option value=\"Both\">Both (\u20a661,200)<\/option>\n      <\/select>\n    <\/div>\n\n    <!-- Publishing & Distribution -->\n    <div class=\"sap-section-label\">Publishing &amp; Distribution <a href=\"https:\/\/aceworldpgs.com\/sap\/\" target=\"_blank\" class=\"sap-jump\" style=\"margin-left:4px;\">\u2197<\/a><\/div>\n\n    <label class=\"sap-toggle-row\" for=\"amazonKindle\">\n      <span class=\"sap-toggle-label\">Amazon Kindle &amp; Selar <!--<span class=\"tip\">\u20a615,000<\/span>-->\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Your book on Amazon marketplaces in Kindle ebook and print format.<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"amazonKindle\" name=\"amazonKindle\" value=\"Yes\"><label class=\"sap-switch-track\" for=\"amazonKindle\"><\/label><\/div>\n    <\/label>\n\n    <label class=\"sap-toggle-row\" for=\"ebookDistribution\">\n      <span class=\"sap-toggle-label\">Ebook Distribution <!--<span class=\"tip\">\u20a626,000<\/span>-->\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Kobo, Apple Books, Barnes &amp; Noble, Everand, Indigo, and more.<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"ebookDistribution\" name=\"ebookDistribution\" value=\"Yes\"><label class=\"sap-switch-track\" for=\"ebookDistribution\"><\/label><\/div>\n    <\/label>\n\n    <!-- Marketing -->\n    <div class=\"sap-section-label\">Marketing <a href=\"https:\/\/aceworldpgs.com\/marketing\/\" target=\"_blank\" class=\"sap-jump\" style=\"margin-left:4px;\">\u2197<\/a><\/div>\n\n    <label class=\"sap-toggle-row\" for=\"newsDistributionToggle\">\n      <span class=\"sap-toggle-label\">News Distribution\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Share the news where the world reads. <a href=\"https:\/\/aceworldpgs.com\/marketing\/cds\/\" target=\"_blank\">View service \u2197<\/a><\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"newsDistributionToggle\" name=\"newsDistributionService\"><label class=\"sap-switch-track\" for=\"newsDistributionToggle\"><\/label><\/div>\n    <\/label>\n    <div class=\"sap-subsection\" id=\"newsDistributionDetails\">\n      <p style=\"font-size:12px; color:var(--sap-gray-600);\">News Distribution has a fully integrated service page. <a href=\"https:\/\/aceworldpgs.com\/marketing\/cds\/\" target=\"_blank\">Click here to learn more<\/a>.<\/p>\n    <\/div>\n\n    <label class=\"sap-toggle-row\" for=\"authorWebsiteToggle\">\n      <span class=\"sap-toggle-label\">Author's Website\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Engage your audience with a powerful author website.<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"authorWebsiteToggle\" name=\"authorWebsiteService\"><label class=\"sap-switch-track\" for=\"authorWebsiteToggle\"><\/label><\/div>\n    <\/label>\n    <div class=\"sap-subsection\" id=\"authorWebsiteDetails\">\n      <p style=\"font-size:12px; color:var(--sap-gray-600);\">Website Development has a fully integrated service page. <a href=\"https:\/\/aceworldpgs.com\/wds\/\" target=\"_blank\">Click here to learn more<\/a>.<\/p>\n    <\/div>\n\n    <label class=\"sap-toggle-row\" for=\"socialMediaToggle\">\n      <span class=\"sap-toggle-label\">Social Media Management\n        <span class=\"sap-tip\">?<span class=\"sap-tip-text\">We know how social media algorithms work. Book us now!<\/span><\/span>\n      <\/span>\n      <div class=\"sap-switch\"><input type=\"checkbox\" id=\"socialMediaToggle\" name=\"socialMediaService\"><label class=\"sap-switch-track\" for=\"socialMediaToggle\"><\/label><\/div>\n    <\/label>\n    <div class=\"sap-subsection\" id=\"socialMediaDetails\">\n      <p style=\"font-size:12px; color:var(--sap-gray-600);\">Social Media Management has a fully integrated service page. <a href=\"https:\/\/aceworldpgs.com\/sms\/\" target=\"_blank\">Click here to learn more<\/a>.<\/p>\n    <\/div>\n\n  <\/div><!-- \/step 2 -->\n\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       STEP 3 \u2014 PRINT SERVICES\n  \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <div class=\"sap-step-panel\" id=\"sap-step-3\">\n    <span id=\"printcalc\"><\/span>\n\n    <p class=\"sap-step-heading\">Print Services<\/p>\n    <p class=\"sap-step-sub\">Configure your print run. Select 0 copies if you are not printing.<\/p>\n\n    <!-- Copies -->\n    <div class=\"sap-section-label\">Number of Copies<\/div>\n    <div class=\"sap-radio-grid sap-radio-grid-5\" id=\"copiesGrid\">\n      <label class=\"sap-radio-card no-print selected\" data-group=\"copiesOption\" data-copies=\"0\">\n        <input type=\"radio\" name=\"copiesOption\" value=\"0\" checked>\n        <span class=\"rc-label\">No Print<\/span>\n        <span class=\"rc-sub\">0 copies<\/span>\n      <\/label>\n      <label class=\"sap-radio-card\" data-group=\"copiesOption\" data-copies=\"100\">\n        <input type=\"radio\" name=\"copiesOption\" value=\"100\">\n        <span class=\"rc-icon\">\ud83d\udcda<\/span>\n        <span class=\"rc-label\">100<\/span>\n      <\/label>\n      <label class=\"sap-radio-card\" data-group=\"copiesOption\" data-copies=\"300\">\n        <input type=\"radio\" name=\"copiesOption\" value=\"300\">\n        <span class=\"rc-icon\">\ud83d\udcda<\/span>\n        <span class=\"rc-label\">300<\/span>\n      <\/label>\n      <label class=\"sap-radio-card\" data-group=\"copiesOption\" data-copies=\"500\">\n        <input type=\"radio\" name=\"copiesOption\" value=\"500\">\n        <span class=\"rc-icon\">\ud83d\udcda<\/span>\n        <span class=\"rc-label\">500<\/span>\n      <\/label>\n      <label class=\"sap-radio-card\" data-group=\"copiesOption\" data-copies=\"1000\">\n        <input type=\"radio\" name=\"copiesOption\" value=\"1000\">\n        <span class=\"rc-icon\">\ud83d\udcda<\/span>\n        <span class=\"rc-label\">1000<\/span>\n      <\/label>\n    <\/div>\n    <label class=\"sap-radio-card\" id=\"customCopiesCard\" data-group=\"copiesOption\" style=\"display:flex; flex-direction:row; gap:10px; padding:10px 16px; justify-content:flex-start; margin-bottom:8px;\">\n      <input type=\"radio\" name=\"copiesOption\" value=\"custom\">\n      <span class=\"rc-label\">Custom quantity (20\u20131,000)<\/span>\n    <\/label>\n    <div class=\"sap-custom-copies\" id=\"customCopiesInput\">\n      <input type=\"number\" id=\"copies-custom-input\" placeholder=\"Enter copies (20\u20131,000)\" min=\"20\" max=\"1000\" value=\"20\">\n    <\/div>\n\n    <!-- Page count (shown only when copies > 0) -->\n    <div id=\"pageCountSection\" style=\"display:none;\">\n      <div class=\"sap-section-label\">Number of Pages<\/div>\n      <div class=\"sap-field\">\n        <input type=\"number\" id=\"pageCount\" name=\"pageCount\" min=\"50\" value=\"100\">\n        <small>Supports 30\u20131,000 pages. This tool quotes digital printing for under 50 copies; offset for 50+.<\/small>\n      <\/div>\n    <\/div>\n\n    <!-- Print specs (shown only when copies > 0) -->\n    <div id=\"printSpecsSection\" style=\"display:none; margin-top:16px;\">\n\n      <div class=\"sap-print-specs\">\n        <div class=\"sap-print-specs-header\" id=\"printSpecsToggler\">\n          <span>\u2699\ufe0f Print Specifications<\/span>\n          <span class=\"chevron\">\u2304<\/span>\n        <\/div>\n        <div class=\"sap-print-specs-body\" id=\"printSpecsBody\" style=\"display:none;\">\n\n          <!-- Trim Size -->\n          <div class=\"sap-section-label\">Trim Size\n            <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Physical dimensions of your printed book.<\/span><\/span>\n          <\/div>\n          <div class=\"sap-field\" style=\"margin-bottom:14px;\">\n            <select id=\"desiredPrintSize\" name=\"desiredPrintSize\">\n              <option value=\"A5\">5.83\u2033 \u00d7 8.27\u2033 \u2192 A5 (International Standard)<\/option>\n              <option value=\"US Trade\">5.5\u2033 \u00d7 8.5\u2033 \u2192 Digest (Compact \/ Novel)<\/option>\n              <option value=\"B5\">6.9\u2033 \u00d7 9.8\u2033 \u2192 B5 (Large \/ Academic)<\/option>\n              <option value=\"Pocket\">4.5\u2033 \u00d7 7.5\u2033 \u2192 Pocket \/ Small Trade<\/option>\n              <option value=\"A6\">4.13\u2033 \u00d7 5.83\u2033 \u2192 A6 (Pocketbook)<\/option>\n              <option value=\"A4\">8.27\u2033 \u00d7 11.69\u2033 \u2192 A4 (Workbooks \/ Reports)<\/option>\n              <option value=\"6x9\">6\u2033 \u00d7 9\u2033 \u2192 US Trade (Amazon KDP)<\/option>\n            <\/select>\n          <\/div>\n\n          <!-- Interior -->\n          <div class=\"sap-section-label\">Interior<\/div>\n          <div class=\"sap-interior-grid\">\n\n            <div>\n              <div style=\"font-size:11px; font-weight:700; color:var(--sap-gray-600); margin-bottom:6px;\">Text Color<\/div>\n              <div class=\"sap-radio-grid sap-radio-grid-2\">\n                <label class=\"sap-radio-card selected\" data-group=\"interiorColor\" data-val=\"Black and White\">\n                  <input type=\"radio\" name=\"interiorColor\" value=\"Black and White\" checked>\n                  <span class=\"rc-icon\">\u2b1b<\/span><span class=\"rc-label\">Black<\/span>\n                <\/label>\n                <label class=\"sap-radio-card\" data-group=\"interiorColor\" data-val=\"Colored\">\n                  <input type=\"radio\" name=\"interiorColor\" value=\"Colored\">\n                  <span class=\"rc-icon\">\ud83c\udfa8<\/span><span class=\"rc-label\">Color<\/span>\n                <\/label>\n              <\/div>\n            <\/div>\n\n            <div>\n              <div style=\"font-size:11px; font-weight:700; color:var(--sap-gray-600); margin-bottom:6px;\">Paper Finish\n                <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Coated = glossy\/matte surface. Uncoated = natural, non-glare.<\/span><\/span>\n              <\/div>\n              <div class=\"sap-radio-grid sap-radio-grid-2\">\n                <label class=\"sap-radio-card selected\" data-group=\"interiorPaperType\" data-val=\"Uncoated\">\n                  <input type=\"radio\" name=\"interiorPaperType\" value=\"Uncoated\" checked>\n                  <span class=\"rc-label\">Uncoated<\/span>\n                <\/label>\n                <label class=\"sap-radio-card\" data-group=\"interiorPaperType\" data-val=\"Coated\">\n                  <input type=\"radio\" name=\"interiorPaperType\" value=\"Coated\">\n                  <span class=\"rc-label\">Coated<\/span>\n                <\/label>\n              <\/div>\n            <\/div>\n\n            <div>\n              <div style=\"font-size:11px; font-weight:700; color:var(--sap-gray-600); margin-bottom:6px;\">Paper Color\n                <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Cream paper is warmer and slightly more expensive than white.<\/span><\/span>\n              <\/div>\n              <div class=\"sap-radio-grid sap-radio-grid-2\">\n                <label class=\"sap-radio-card selected\" data-group=\"interiorPaperColor\" data-val=\"White\">\n                  <input type=\"radio\" name=\"interiorPaperColor\" value=\"White\" checked>\n                  <span class=\"rc-label\">White<\/span>\n                <\/label>\n                <label class=\"sap-radio-card\" data-group=\"interiorPaperColor\" data-val=\"Cream\">\n                  <input type=\"radio\" name=\"interiorPaperColor\" value=\"Cream\">\n                  <span class=\"rc-label\">Cream<\/span>\n                <\/label>\n              <\/div>\n            <\/div>\n\n          <\/div>\n\n          <!-- Cover -->\n          <div class=\"sap-section-label\">Cover<\/div>\n          <div class=\"sap-spec-grid-2col\">\n\n            <div>\n              <div style=\"font-size:11px; font-weight:700; color:var(--sap-gray-600); margin-bottom:6px;\">Lamination\n                <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Matte = non-reflective, readable. Gloss = shiny, vibrant.<\/span><\/span>\n              <\/div>\n              <div class=\"sap-radio-grid sap-radio-grid-2\">\n                <label class=\"sap-radio-card selected\" data-group=\"coverFinish\" data-val=\"Matte\">\n                  <input type=\"radio\" name=\"coverFinish\" value=\"Matte\" checked>\n                  <span class=\"rc-label\">Matte<\/span>\n                <\/label>\n                <label class=\"sap-radio-card\" data-group=\"coverFinish\" data-val=\"Glossy\">\n                  <input type=\"radio\" name=\"coverFinish\" value=\"Glossy\">\n                  <span class=\"rc-label\">Gloss<\/span>\n                <\/label>\n              <\/div>\n            <\/div>\n\n            <div>\n              <div style=\"font-size:11px; font-weight:700; color:var(--sap-gray-600); margin-bottom:6px;\">Cover Title Style\n                <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Embossing = raised text. Debossing = sunken text. Foil = metallic raised text.<\/span><\/span>\n              <\/div>\n              <div class=\"sap-field\">\n                <select id=\"coverText\" name=\"coverText\">\n                  <option value=\"Normal\">Normal<\/option>\n                  <option value=\"Embossing\">Embossing (Raised Text)<\/option>\n                  <option value=\"Debossing\">Debossing (Sunken Text)<\/option>\n                  <option value=\"Foil Stamping Embossing\">Foil Stamping Embossing<\/option>\n                <\/select>\n              <\/div>\n            <\/div>\n\n          <\/div>\n\n          <!-- Finishing & QC -->\n          <div class=\"sap-section-label\">Finishing<\/div>\n          <div class=\"sap-spec-grid-2col\">\n\n            <div>\n              <div style=\"font-size:11px; font-weight:700; color:var(--sap-gray-600); margin-bottom:6px;\">Binding &amp; Cover Type<\/div>\n              <div class=\"sap-radio-grid sap-radio-grid-2\">\n                <label class=\"sap-radio-card selected\" data-group=\"bindingType\" data-val=\"Perfect Binding (Paperback)\">\n                  <input type=\"radio\" name=\"bindingType\" value=\"Perfect Binding (Paperback)\" checked>\n                  <span class=\"rc-icon\">\ud83d\udcd7<\/span><span class=\"rc-label\">Paperback<\/span>\n                <\/label>\n                <label class=\"sap-radio-card\" data-group=\"bindingType\" data-val=\"Case Binding (Hardback)\">\n                  <input type=\"radio\" name=\"bindingType\" value=\"Case Binding (Hardback)\">\n                  <span class=\"rc-icon\">\ud83d\udcd8<\/span><span class=\"rc-label\">Hardback<\/span>\n                <\/label>\n              <\/div>\n            <\/div>\n\n            <div>\n              <div style=\"font-size:11px; font-weight:700; color:var(--sap-gray-600); margin-bottom:6px;\">Packaging\n                <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Nylon wrapping at \u20a650\/copy \u2014 ideal for gift or retail copies.<\/span><\/span>\n              <\/div>\n              <div class=\"sap-radio-grid sap-radio-grid-2\">\n                <label class=\"sap-radio-card selected\" data-group=\"nylonWrapping\" data-val=\"Wrapped\">\n                  <input type=\"radio\" name=\"nylonWrapping\" value=\"Wrapped\" checked>\n                  <span class=\"rc-icon\"><\/span><span class=\"rc-label\">Wrapped<\/span>\n                <\/label>\n                <label class=\"sap-radio-card\" data-group=\"nylonWrapping\" data-val=\"Unwrapped\">\n                  <input type=\"radio\" name=\"nylonWrapping\" value=\"Unwrapped\">\n                  <span class=\"rc-icon\"><\/span><span class=\"rc-label\">Unwrapped<\/span>\n                <\/label>\n              <\/div>\n            <\/div>\n\n          <\/div>\n\n          <div class=\"sap-section-label\">Quality Control<\/div>\n          <div>\n            <div style=\"font-size:11px; font-weight:700; color:var(--sap-gray-600); margin-bottom:6px;\">Pre-Print Proof Copy\n              <span class=\"sap-tip\">?<span class=\"sap-tip-text\">Review before mass print. Digital (PDF) = layout checks. Physical = print &amp; finish checks.<\/span><\/span>\n            <\/div>\n            <div class=\"sap-radio-grid sap-radio-grid-2\" style=\"max-width:300px;\">\n              <label class=\"sap-radio-card selected\" data-group=\"sampleProofing\" data-val=\"Digital (PDF)\">\n                <input type=\"radio\" name=\"sampleProofing\" value=\"Digital (PDF)\" checked>\n                <span class=\"rc-icon\">\ud83d\udcbb<\/span><span class=\"rc-label\">Digital (PDF)<\/span>\n              <\/label>\n              <label class=\"sap-radio-card\" data-group=\"sampleProofing\" data-val=\"Physical (Printed)\">\n                <input type=\"radio\" name=\"sampleProofing\" value=\"Physical (Printed)\">\n                <span class=\"rc-icon\">\ud83d\udda8\ufe0f<\/span><span class=\"rc-label\">Physical Copy<\/span>\n              <\/label>\n            <\/div>\n          <\/div>\n\n        <\/div><!-- \/sap-print-specs-body -->\n      <\/div><!-- \/sap-print-specs -->\n\n    <\/div><!-- \/printSpecsSection -->\n\n  <\/div><!-- \/step 3 -->\n\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       STEP 4 \u2014 QUOTATION\n  \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <div class=\"sap-step-panel\" id=\"sap-step-4\">\n\n    <p class=\"sap-step-heading\">Your Quotation<\/p>\n    <p class=\"sap-step-sub\">Review your itemised estimate below.<\/p>\n\n    <div id=\"sap-quote-print-target\">\n\n    <div class=\"sap-quote-panel\">\n      <div class=\"sap-quote-header\">\n        <div class=\"sap-quote-header-left\">\n          <div class=\"qh-title\">ACEworld Publishers Limited<\/div>\n          <div class=\"qh-title\">Publishing Quotation<\/div>\n          <div class=\"qh-book\" id=\"qhBookTitle\">My Book Project<\/div>\n          <div class=\"qh-words\" id=\"qhWords\">20,000 words<\/div>\n          <div class=\"sap-quote-date\" id=\"qhDate\"><\/div>\n        <\/div>\n        <div>\n          <div class=\"sap-quote-total-badge\" id=\"qhTotal\">\u20a60<\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"sap-quote-body\">\n\n        <!-- Publishing services -->\n        <div class=\"sap-quote-section-title\">Publishing Services<\/div>\n        <div id=\"qServicesBlock\">\n          <div class=\"sap-quote-row dimmed\" id=\"qr-transcription\"><span class=\"qr-label\" id=\"ql-transcription\">Transcription<\/span><span class=\"qr-value\" id=\"qv-transcription\">\u20a60<\/span><\/div>\n          <div class=\"sap-quote-row dimmed\" id=\"qr-editing\"><span class=\"qr-label\" id=\"ql-editing\">Editing<\/span><span class=\"qr-value\" id=\"qv-editing\">\u20a60<\/span><\/div>\n          <div class=\"sap-quote-row dimmed\" id=\"qr-proofreading\"><span class=\"qr-label\">Proofreading<\/span><span class=\"qr-value\" id=\"qv-proofreading\">\u20a60<\/span><\/div>\n          <div class=\"sap-quote-row dimmed\" id=\"qr-formatting\"><span class=\"qr-label\" id=\"ql-formatting\">Formatting<\/span><span class=\"qr-value\" id=\"qv-formatting\">\u20a60<\/span><\/div>\n          <div class=\"sap-quote-row dimmed\" id=\"qr-cover\"><span class=\"qr-label\" id=\"ql-cover\">Book Cover<\/span><span class=\"qr-value\" id=\"qv-cover\">\u20a60<\/span><\/div>\n          <div class=\"sap-quote-row dimmed\" id=\"qr-brochure\"><span class=\"qr-label\" id=\"ql-brochure\">Brochure Design<\/span><span class=\"qr-value\" id=\"qv-brochure\">\u20a60<\/span><\/div>\n          <div class=\"sap-quote-row dimmed\" id=\"qr-isbn\"><span class=\"qr-label\" id=\"ql-isbn\">ISBN<\/span><span class=\"qr-value\" id=\"qv-isbn\">\u20a60<\/span><\/div>\n          <div class=\"sap-quote-row dimmed\" id=\"qr-issn\"><span class=\"qr-label\" id=\"ql-issn\">ISSN<\/span><span class=\"qr-value\" id=\"qv-issn\">\u20a60<\/span><\/div>\n          <div class=\"sap-quote-row dimmed\" id=\"qr-copyright\"><span class=\"qr-label\">Copyright Registration<\/span><span class=\"qr-value\" id=\"qv-copyright\">\u20a60<\/span><\/div>\n          <div class=\"sap-quote-row dimmed\" id=\"qr-amazon\"><span class=\"qr-label\">Amazon Kindle &amp; Selar<\/span><span class=\"qr-value\" id=\"qv-amazon\">\u20a60<\/span><\/div>\n          <div class=\"sap-quote-row dimmed\" id=\"qr-ebook\"><span class=\"qr-label\">Ebook Distribution<\/span><span class=\"qr-value\" id=\"qv-ebook\">\u20a60<\/span><\/div>\n        <\/div>\n\n        <!-- Print section (conditional) -->\n        <div id=\"qPrintBlock\" style=\"display:none;\">\n          <div class=\"sap-quote-section-title\">Print Production<\/div>\n          <div class=\"sap-print-card\" id=\"qPrintCard\">\n            <div>\n              <div class=\"pc-copies\" id=\"qPrintCopies\">0 Copies<\/div>\n              <div class=\"pc-specs\" id=\"qPrintSpecs\">\u2014<\/div>\n            <\/div>\n            <div style=\"text-align:right;\">\n              <div class=\"pc-price\" id=\"qPrintPricePerCopy\">\u20a60<\/div>\/each\n              <div class=\"pc-each\"><\/div>\n            <\/div>\n          <\/div>\n          <div class=\"sap-specs-grid\" id=\"qSpecsGrid\"><\/div>\n        <\/div>\n\n        <!-- Total row -->\n        <div class=\"sap-quote-row total\">\n          <span class=\"qr-label\">Estimated Total<\/span>\n          <span class=\"qr-value\" id=\"qGrandTotal\">\u20a60<\/span>\n        <\/div>\n\n      <\/div>\n\n          <div class=\"sap-note\">\n      \u2139\ufe0f This is an estimate generated by our calculator. Reach us via call or WhatsApp at <strong>+2348166110313, +2348072349777<\/strong>.\n      Email: <strong>info.myaceworld@gmail.com<\/strong>\n    <\/div>\n\n    <\/div><!-- \/.sap-quote-panel -->\n\n\n\n    <\/div><!-- \/#sap-quote-print-target -->\n\n    <div style=\"text-align:center; margin: 4px 0 12px;\">\n      <button class=\"sap-clear-link\" id=\"clearFormBtn\">Clear all inputs<\/button>\n    <\/div>\n\n  <\/div><!-- \/step 4 -->\n\n  <\/div><!-- \/.sap-body -->\n\n  <!-- Nav buttons -->\n  <div class=\"sap-nav\" id=\"sapNav\">\n    <button class=\"sap-btn sap-btn-ghost\" id=\"sapBtnBack\" style=\"display:none;\" onclick=\"sapNavBack()\">\u2190 Back<\/button>\n    <div style=\"flex:1\"><\/div>\n    <button class=\"sap-btn sap-btn-primary\" id=\"sapBtnNext\" onclick=\"sapNavNext()\">Publishing Services \u2192<\/button>\n    <button class=\"sap-btn sap-btn-submit\" id=\"sapBtnSubmit\" style=\"display:none;\" onclick=\"trackTool('publishing_calculator')\" type=\"button\">\n      \ud83d\udda8\ufe0f Print Quote\n    <\/button>\n  <\/div>\n\n<\/div><!-- \/.sap-calc -->\n\n<!-- Floating live total -->\n<div class=\"sap-floating-total\" id=\"sapFloatingTotal\">\n  <div>\n    <div class=\"sap-float-label\">Running Total<\/div>\n    <div class=\"sap-float-value\" id=\"sapFloatValue\">\u20a60<\/div>\n  <\/div>\n  <button class=\"sap-float-details\" onclick=\"sapGoStep(4)\">View \u2192<\/button>\n<\/div>\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\n<style>\n\n\/* SIMILAR TOOLS *\/\n\n.similar-tools{\nmargin-top:40px;\npadding-top:20px;\nborder-top:1px solid #e5e7eb;\n}\n\n.similar-tools h3{\nfont-size:18px;\nfont-weight:700;\nmargin-bottom:16px;\n}\n\n.similar-grid{\ndisplay:grid;\ngrid-template-columns:repeat(3,1fr);\ngap:12px;\nmargin-top: 15px;\nmargin-bottom: 15px;\nmargin-left: 20px;\nmargin-right: 20px;\n}\n\n.similar-card{\ndisplay:flex;\nalign-items:center;\ngap:10px;\npadding:12px;\nborder:1px solid #e5e7eb;\nborder-radius:8px;\ntext-decoration:none;\ncolor:inherit;\nbackground:#fff;\ntransition:all .15s ease;\n}\n\n.similar-card:hover{\nborder-color:#cbd5e1;\nbackground:#f8fafc;\ntransform:translateY(-2px);\n}\n\n\/* icon *\/\n\n.similar-icon{\nwidth:32px;\nheight:32px;\nborder-radius:6px;\nbackground:#eff6ff;\ndisplay:flex;\nalign-items:center;\njustify-content:center;\nfont-size:16px;\nflex-shrink:0;\n}\n\n\/* text *\/\n\n.similar-title{\nfont-size:14px;\nfont-weight:600;\nline-height:1.2;\n}\n\n@media(max-width:700px){\n.similar-grid{\ngrid-template-columns:1fr;\n}\n}\n\n.browse-tools-btn{\n    display:inline-block;\n    padding:10px 18px;\n    border-radius:8px;\n    border:1px solid #e5e7eb;\n    background:#fff;\n    text-decoration:none;\n    font-size:16px;\n    font-weight:600;\n    color:inherit;\n    transition:all .15s ease;\n}\n\n.browse-tools-btn:hover{\n    background:#f8fafc;\n    border-color:#d1d5db;\n    transform:translateY(-1px);\n}\n\n<\/style>\n\n\n<div class=\"similar-tools\">\n\n<h2 style=\"text-align: center;\">Other tools<\/h2>\n\n<div class=\"similar-grid\">\n\n<a href=\"\/tools\/manuscript-development-calculator\/\" class=\"similar-card\">\n<div class=\"similar-icon\">#<\/div>\n<div class=\"similar-title\">Manusript Development Calculator<\/div>\n<\/a>\n\n<a href=\"\/tools\/publishing-calculator\/\" class=\"similar-card\">\n<div class=\"similar-icon\">#<\/div>\n<div class=\"similar-title\">Publishing Calculator<\/div>\n<\/a>\n\n<a href=\"\/tools\/isbn-validator\/\" class=\"similar-card\">\n<div class=\"similar-icon\">#<\/div>\n<div class=\"similar-title\">ISBN Validator<\/div>\n<\/a>\n\n<a href=\"\/tools\/bulk-isbn-validator\/\" class=\"similar-card\">\n<div class=\"similar-icon\">#<\/div>\n<div class=\"similar-title\">Bulk ISBN Validator<\/div>\n<\/a>\n\n<a href=\"\/tools\/book-cover-calculator\/\" class=\"similar-card\">\n<div class=\"similar-icon\">#<\/div>\n<div class=\"similar-title\">Book Cover Calculator<\/div>\n<\/a>\n\n<a href=\"\/tools\/book-metadata-generator\/\" class=\"similar-card\">\n<div class=\"similar-icon\">#<\/div>\n<div class=\"similar-title\">Book Metadata Generator<\/div>\n<\/a>\n\n<a href=\"\/tools\/advert-policy-checks\/\" class=\"similar-card\">\n<div class=\"similar-icon\">#<\/div>\n<div class=\"similar-title\">Meta Ad Policy Checker<\/div>\n<\/a>\n\n<a href=\"\/tools\/barcode-qr-code-generator\/\" class=\"similar-card\">\n<div class=\"similar-icon\">#<\/div>\n<div class=\"similar-title\">Barcode & QR Code Generator<\/div>\n<\/a>\n\n<a href=\"\/tools\/book-royalty-calculator\/\" class=\"similar-card\">\n<div class=\"similar-icon\">#<\/div>\n<div class=\"similar-title\">Book Royalty Calculator<\/div>\n<\/a>\n\n<a href=\"\/tools\/book-price-calculator\/\" class=\"similar-card\">\n<div class=\"similar-icon\">#<\/div>\n<div class=\"similar-title\">Book Price Calculator<\/div>\n<\/a>\n\n<\/div>\n\n<p style=\"text-align:center;\"><a href=\"https:\/\/aceworldpgs.com\/tools\/all\/\" class=\"browse-tools-btn\">Browse All Tools \u2192<\/a>\n<\/p>\n\n<\/div>\n\n\n\n\n<!-- ============================================================\n     JAVASCRIPT \u2014 FULL CALCULATION ENGINE (unchanged logic)\n============================================================ -->\n<script>\n\/\/ \u2500\u2500 1. Price data from ACF \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 sapData = {\n  plans: {\n    editingLevels: {\n      'Developmental Editing': { pricePerWord: 10 },\n      'Line Editing':           { pricePerWord: 6 },\n      'Copy Editing':           { pricePerWord: 3.2 },\n    },\n    proofreadingRate: 1.7,\n    formattingBaseRate: 280,\n    formattingPageDivider: 200,\n    formattingDiscount: 0.75,\n    brochurePricePerPage: 4500,\n    copyrightPrice: 18500,\n    ebookDistPrice: 26000,\n    amazonKindlePrice: 15000,\n    transcription: {\n      English: 500,\n      Yoruba: 1000,\n      'Other Languages': 2000,\n    },\n    isbnPricing: {\n      1: 15500, 2: 20500,\n      3: 30500, 5: 35500,\n      10: 35500, 15: 0,\n      20: 0    },\n    issnPricing: {\n      'Electronic ISSN': 29100,\n      'Print ISSN':      32100,\n      'Both':            61200    },\n  },\n  printSizeMultipliers: {\n    'A5': 1.00,\n    'US Trade': 1,\n    'B5':       1.23,\n    'Pocket':   0.9,\n    'A6':       0.8,\n    'A4':       1.8,\n    '6x9':      1.75,\n  },\n  modifiers: {\n    coatedInterior: 500,\n    glossyFinish:   400,\n    caseBinding:    600,\n    creamPaper:     600,\n    coloredInterior:600,\n    nylonWrappingpc:50,\n    sampleProofingpc:7000,\n    embossingDebossing:   600,\n    foilStampingEmbossing:800,\n  },\n  basePricing: {\n    A5: {\n      '30-79':   {20:3500,50:2800,100:2000,300:1600,500:1300,1000:1000},\n      '80-150':  {20:4300,50:3500,100:2800,300:2000,500:1600,1000:1300},\n      '151-200': {20:4700,50:4000,100:3200,300:2500,500:2000,1000:1600},\n      '201-250': {20:5400,50:4700,100:4000,300:3300,500:2800,1000:2400},\n      '251-300': {20:6400,50:5700,100:5000,300:4300,500:3800,1000:3400},\n      '301-350': {20:7500,50:6700,100:6000,300:5300,500:4800,1000:4400},\n      '351-400': {20:8400,50:7700,100:7000,300:6300,500:5800,1000:5400},\n      '401-450': {20:9400,50:8700,100:8000,300:7300,500:6800,1000:6400},\n      '451-500': {20:10400,50:9700,100:9000,300:8300,500:7800,1000:7400},\n      '501-550': {20:11400,50:10700,100:10000,300:9300,500:8800,1000:8400},\n      '551-600': {20:12400,50:11700,100:11000,300:10300,500:9800,1000:9400},\n      '601-650': {20:13400,50:12700,100:12000,300:11300,500:10800,1000:10400},\n      '651-700': {20:14400,50:13700,100:13000,300:12300,500:11800,1000:11400},\n      '701-750': {20:15400,50:14700,100:14000,300:13300,500:12800,1000:12400},\n      '751-800': {20:16400,50:15700,100:15000,300:14300,500:13800,1000:13400},\n      '801-850': {20:17400,50:16700,100:16000,300:15300,500:14800,1000:14400},\n      '851-900': {20:18400,50:17700,100:17000,300:16300,500:15800,1000:15400},\n      '901-950': {20:19400,50:18700,100:18000,300:17300,500:16800,1000:16400},\n      '951-1000':{20:20400,50:19700,100:19000,300:18300,500:17800,1000:17400},\n      '1001+':   {20:21400,50:20700,100:20000,300:19300,500:18800,1000:18400},\n    }\n  }\n};\n\n\/\/ \u2500\u2500 2. Formatter \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 sapFmt = new Intl.NumberFormat('en-NG', { style:'currency', currency:'NGN', minimumFractionDigits:0, maximumFractionDigits:0 });\n\n\/\/ \u2500\u2500 3. Current step 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\nlet sapCurrentStep = 1;\nconst SAP_TOTAL_STEPS = 4;\n\n\/\/ \u2500\u2500 4. Step navigation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 sapGoStep(n) {\n  if (n < 1 || n > SAP_TOTAL_STEPS) return;\n  document.querySelectorAll('.sap-step-panel').forEach(p => p.classList.remove('active'));\n  document.getElementById('sap-step-' + n).classList.add('active');\n\n  document.querySelectorAll('.sap-step-item').forEach(item => {\n    const s = parseInt(item.dataset.step);\n    item.classList.remove('active', 'done');\n    if (s === n) item.classList.add('active');\n    else if (s < n) item.classList.add('done');\n  });\n\n  \/\/ Nav buttons\n  const btnBack   = document.getElementById('sapBtnBack');\n  const btnNext   = document.getElementById('sapBtnNext');\n  const btnSubmit = document.getElementById('sapBtnSubmit');\n\n  btnBack.style.display   = n > 1 ? 'inline-flex' : 'none';\n  btnNext.style.display   = n < SAP_TOTAL_STEPS ? 'inline-flex' : 'none';\n  btnSubmit.style.display = n === SAP_TOTAL_STEPS ? 'inline-flex' : 'none';\n\n  \/\/ Next button label\n  const labels = ['', 'Publishing Services \u2192', 'Print Services \u2192', 'View Quotation \u2192'];\n  if (n < SAP_TOTAL_STEPS) btnNext.textContent = labels[n];\n\n  \/\/ Progress fill\n  document.getElementById('sapProgressFill').style.width = (n \/ SAP_TOTAL_STEPS * 100) + '%';\n\n  sapCurrentStep = n;\n  if (n === SAP_TOTAL_STEPS) sapUpdateQuote();\n  window.scrollTo({ top: document.getElementById('sap-calc-root').offsetTop - 20, behavior: 'smooth' });\n}\n\nfunction sapNavNext() { sapGoStep(sapCurrentStep + 1); }\nfunction sapNavBack() { sapGoStep(sapCurrentStep - 1); }\n\n\/\/ \u2500\u2500 5. Toggle subsections \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 sapBindToggle(checkboxId, subsectionId) {\n  const cb  = document.getElementById(checkboxId);\n  const sub = document.getElementById(subsectionId);\n  if (!cb || !sub) return;\n  const row = cb.closest('.sap-toggle-row');\n\n  function update() {\n    if (cb.checked) { sub.classList.add('open'); row && row.classList.add('toggled'); }\n    else            { sub.classList.remove('open'); row && row.classList.remove('toggled'); }\n  }\n  cb.addEventListener('change', update);\n  update();\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  sapBindToggle('transcriptionService', 'transcriptionDetails');\n  sapBindToggle('editingService',       'editingDetails');\n  sapBindToggle('formattingService',    'formattingDetails');\n  sapBindToggle('coverDesignService',   'coverDesignDetails');\n  sapBindToggle('brochureDesignService','brochureDetails');\n  sapBindToggle('isbnService',          'isbnDetails');\n  sapBindToggle('issnService',          'issnDetails');\n  sapBindToggle('newsDistributionToggle','newsDistributionDetails');\n  sapBindToggle('authorWebsiteToggle',  'authorWebsiteDetails');\n  sapBindToggle('socialMediaToggle',    'socialMediaDetails');\n\n  \/\/ Toggle row visual state for all toggles (not just those with subsections)\n  document.querySelectorAll('.sap-toggle-row input[type=\"checkbox\"]').forEach(cb => {\n    cb.addEventListener('change', () => {\n      const row = cb.closest('.sap-toggle-row');\n      if (row) row.classList.toggle('toggled', cb.checked);\n      sapUpdateFloating();\n    });\n  });\n\n  \/\/ Radio cards \u2014 unified handler for ALL radio card groups including copies\n  document.querySelectorAll('.sap-radio-card').forEach(card => {\n    card.addEventListener('click', () => {\n      const radio = card.querySelector('input[type=\"radio\"]');\n      if (!radio) return;\n      radio.checked = true;\n      \/\/ Determine the group: use data-group attribute first, fall back to radio name\n      const group = card.dataset.group || radio.name;\n      \/\/ Deselect all cards in the same group\n      document.querySelectorAll('[data-group=\"' + group + '\"]').forEach(c => c.classList.remove('selected'));\n      card.classList.add('selected');\n      sapHandleCopiesChange();\n      sapUpdateFloating();\n    });\n  });\n\n  \/\/ Custom copies input\n  document.getElementById('copies-custom-input').addEventListener('input', () => {\n    sapHandleCopiesChange();\n    sapUpdateFloating();\n  });\n\n  \/\/ Print specs toggle\n  document.getElementById('printSpecsToggler').addEventListener('click', () => {\n    const body = document.getElementById('printSpecsBody');\n    const hdr  = document.getElementById('printSpecsToggler');\n    const open = body.style.display !== 'none';\n    body.style.display = open ? 'none' : 'block';\n    hdr.classList.toggle('open', !open);\n  });\n\n  \/\/ All form inputs \u2192 update floating\n  document.getElementById('calculator-form').addEventListener('change', sapUpdateFloating);\n  document.getElementById('calculator-form').addEventListener('input',  sapUpdateFloating);\n\n  \/\/ Set date\n  document.getElementById('qhDate').textContent = new Date().toLocaleDateString('en-US', {year:'numeric',month:'long',day:'numeric'});\n\n  \/\/ Clear form\n  document.getElementById('clearFormBtn').addEventListener('click', () => {\n    if (confirm('Clear all inputs? This will not save your progress.')) {\n      sapResetForm();\n    }\n  });\n\n  \/\/ Submit button\n  document.getElementById('sapBtnSubmit').addEventListener('click', async function() {\n    const ok = await sapSaveQuotation(this);\n    if (ok) { window.print(); alert('Quote saved! You can now print or save as PDF.'); }\n  });\n\n  sapUpdateFloating();\n});\n\n\/\/ \u2500\u2500 6. Copies visibility \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 sapHandleCopiesChange() {\n  const selected = document.querySelector('input[name=\"copiesOption\"]:checked');\n  const isCustom = selected && selected.value === 'custom';\n  const copies   = sapGetCopies();\n  const hasPrint = copies > 0;\n\n  document.getElementById('customCopiesInput').classList.toggle('show', isCustom);\n  document.getElementById('pageCountSection').style.display   = hasPrint ? 'block' : 'none';\n  document.getElementById('printSpecsSection').style.display  = hasPrint ? 'block' : 'none';\n}\n\nfunction sapGetCopies() {\n  const r = document.querySelector('input[name=\"copiesOption\"]:checked');\n  if (!r) return 0;\n  if (r.value === 'custom') return Number(document.getElementById('copies-custom-input').value) || 0;\n  return Number(r.value) || 0;\n}\n\n\/\/ \u2500\u2500 7. Get all selections \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 sapGetSelections() {\n  const g = (id) => { const el = document.getElementById(id); return el ? el.value : ''; };\n  const chk = (id) => { const el = document.getElementById(id); return el && el.checked; };\n  const radio = (name) => { const el = document.querySelector('input[name=\"'+name+'\"]:checked'); return el ? el.value.trim() : ''; };\n\n  return {\n    bookTitle:             g('bookTitle') || 'My Book Project',\n    wordCount:             Number(g('wordCount')) || 0,\n    copies:                sapGetCopies(),\n    pageCount:             Number(g('pageCount')) || 0,\n    desiredPrintSize:      g('desiredPrintSize') || 'A5',\n    interiorColor:         radio('interiorColor') || 'Black and White',\n    interiorPaperType:     radio('interiorPaperType') || 'Uncoated',\n    interiorPaperColor:    radio('interiorPaperColor') || 'White',\n    coverFinish:           radio('coverFinish') || 'Matte',\n    coverText:             g('coverText') || 'Normal',\n    bindingType:           radio('bindingType') || 'Perfect Binding (Paperback)',\n    nylonWrapping:         radio('nylonWrapping') || 'Wrapped',\n    sampleProofing:        radio('sampleProofing') || 'Digital (PDF)',\n    transcriptionService:  chk('transcriptionService') ? 'Yes' : 'No',\n    transcriptionType:     g('transcriptionType'),\n    editingService:        chk('editingService') ? 'Yes' : 'No',\n    editingLevel:          g('editingLevel'),\n    proofreadingService:   chk('proofreadingService') ? 'Yes' : 'No',\n    formattingService:     chk('formattingService') ? 'Yes' : 'No',\n    formattingType:        g('formattingType'),\n    coverDesignService:    chk('coverDesignService') ? 'Yes' : 'No',\n    coverDesignType:       g('coverDesignType'),\n    brochureDesignService: chk('brochureDesignService') ? 'Yes' : 'No',\n    brochurePages:         Number(g('brochurePages')) || 0,\n    isbnService:           chk('isbnService') ? 'Yes' : 'No',\n    isbnUnits:             Number(g('isbnUnits')) || 1,\n    copyrightRegistration: chk('copyrightRegistration') ? 'Yes' : 'No',\n    issnService:           chk('issnService') ? 'Yes' : 'No',\n    issnType:              g('issnType'),\n    amazonKindle:          chk('amazonKindle') ? 'Yes' : 'No',\n    ebookDistribution:     chk('ebookDistribution') ? 'Yes' : 'No',\n    priceDeduction:        0,\n    deductionReason:       '',\n  };\n}\n\n\/\/ \u2500\u2500 8. Core calculation (identical logic to original) \u2500\u2500\u2500\u2500\nfunction sapCalculate(sel) {\n  const d = sapData; let total = 0;\n  const bd = {\n    printingCost:0, meta_pricePerCopy:0, meta_copiesCount:0, sampleProofingCost:0,\n    formattingCost:0, transcriptionCost:0, proofreadingCost:0,\n    isbnCost:0, issnCost:0, editingCost:0, coverDesignCost:0,\n    brochureDesignCost:0, copyrightRegistrationCost:0, ebookDistributionCost:0, amazonKindleCost:0,\n    deductionAmount:0, deductionReason:'N\/A'\n  };\n  const copies = sel.copies;\n  const pages  = sel.pageCount;\n  const wc     = sel.wordCount;\n  const wcOk   = wc >= 30;\n\n  bd.meta_copiesCount = copies;\n\n  \/\/ Print\n  if (copies > 0 && pages >= 30) {\n    const ppc  = sapCalcBasePrice(sel.desiredPrintSize, pages, copies);\n    const ppcM = sapApplyModifiers(ppc, sel);\n    bd.printingCost     = ppcM * copies;\n    bd.meta_pricePerCopy = ppcM;\n    total += bd.printingCost;\n    if (sel.sampleProofing === 'Physical (Printed)') {\n      const fee = d.modifiers.sampleProofingpc;\n      bd.sampleProofingCost = ppcM + fee;\n      total += bd.sampleProofingCost;\n    }\n  }\n\n  \/\/ Transcription\n  if (sel.transcriptionService === 'Yes' && wcOk) {\n    const pages2 = Math.ceil(wc \/ d.plans.formattingPageDivider);\n    const rate   = d.plans.transcription[sel.transcriptionType] || 0;\n    bd.transcriptionCost = pages2 * rate;\n    total += bd.transcriptionCost;\n  }\n\n  \/\/ Editing\n  if (sel.editingService === 'Yes' && wcOk && sel.editingLevel) {\n    const ppw = (d.plans.editingLevels[sel.editingLevel] || {}).pricePerWord || 0;\n    bd.editingCost = wc * ppw;\n    total += bd.editingCost;\n  }\n\n  \/\/ Proofreading\n  if (sel.proofreadingService === 'Yes' && wcOk) {\n    bd.proofreadingCost = wc * d.plans.proofreadingRate;\n    total += bd.proofreadingCost;\n  }\n\n  \/\/ Formatting\n  if (sel.formattingService === 'Yes' && wcOk) {\n    const base = Math.ceil(wc \/ d.plans.formattingPageDivider) * d.plans.formattingBaseRate;\n    if (sel.formattingType === 'Ebook & Print') {\n      bd.formattingCost = base * 2 * d.plans.formattingDiscount;\n    } else {\n      bd.formattingCost = base;\n    }\n    total += bd.formattingCost;\n  }\n\n  \/\/ Cover design\n  if (sel.coverDesignService === 'Yes' && sel.coverDesignType) {\n    bd.coverDesignCost = {\n      'Full Cover': 28000,\n      'Front Cover Only': 16000    }[sel.coverDesignType] || 0;\n    total += bd.coverDesignCost;\n  }\n\n  \/\/ Brochure\n  if (sel.brochureDesignService === 'Yes' && sel.brochurePages > 0) {\n    bd.brochureDesignCost = sel.brochurePages * d.plans.brochurePricePerPage;\n    total += bd.brochureDesignCost;\n  }\n\n  \/\/ ISBN\n  if (sel.isbnService === 'Yes') {\n    bd.isbnCost = d.plans.isbnPricing[sel.isbnUnits] || 0;\n    total += bd.isbnCost;\n  }\n\n  \/\/ ISSN\n  if (sel.issnService === 'Yes' && sel.issnType) {\n    bd.issnCost = d.plans.issnPricing[sel.issnType] || 0;\n    total += bd.issnCost;\n  }\n\n  \/\/ Copyright\n  if (sel.copyrightRegistration === 'Yes') {\n    bd.copyrightRegistrationCost = d.plans.copyrightPrice;\n    total += bd.copyrightRegistrationCost;\n  }\n\n  \/\/ Amazon \/ Ebook\n  if (sel.amazonKindle === 'Yes')   { bd.amazonKindleCost = d.plans.amazonKindlePrice; total += bd.amazonKindleCost; }\n  if (sel.ebookDistribution === 'Yes') { bd.ebookDistributionCost = d.plans.ebookDistPrice; total += bd.ebookDistributionCost; }\n\n  return { total, bd };\n}\n\nfunction sapCalcBasePrice(size, pages, copies) {\n  let range;\n  if (pages < 30) return 0;\n  if (pages <= 79)   range = '30-79';\n  else if (pages <= 150)  range = '80-150';\n  else if (pages <= 200)  range = '151-200';\n  else if (pages <= 250)  range = '201-250';\n  else if (pages <= 300)  range = '251-300';\n  else if (pages <= 350)  range = '301-350';\n  else if (pages <= 400)  range = '351-400';\n  else if (pages <= 450)  range = '401-450';\n  else if (pages <= 500)  range = '451-500';\n  else if (pages <= 550)  range = '501-550';\n  else if (pages <= 600)  range = '551-600';\n  else if (pages <= 650)  range = '601-650';\n  else if (pages <= 700)  range = '651-700';\n  else if (pages <= 750)  range = '701-750';\n  else if (pages <= 800)  range = '751-800';\n  else if (pages <= 850)  range = '801-850';\n  else if (pages <= 900)  range = '851-900';\n  else if (pages <= 950)  range = '901-950';\n  else if (pages <= 1000) range = '951-1000';\n  else range = '1001+';\n\n  const tier = sapData.basePricing.A5[range];\n  if (!tier) return 0;\n  if (copies < 20) copies = 20;\n  let t;\n  if (copies <= 49)       t = 20;\n  else if (copies <= 99)  t = 50;\n  else if (copies <= 199) t = 100;\n  else if (copies <= 399) t = 300;\n  else if (copies <= 699) t = 500;\n  else                    t = 1000;\n  const base = tier[t] || 0;\n  return base * (sapData.printSizeMultipliers[size] || 1.0);\n}\n\nfunction sapApplyModifiers(base, sel) {\n  const m = sapData.modifiers;\n  let p = base;\n  if (sel.interiorPaperType === 'Coated')              p += m.coatedInterior;\n  if (sel.coverFinish === 'Glossy')                    p += m.glossyFinish;\n  if (sel.bindingType === 'Case Binding (Hardback)')   p += m.caseBinding;\n  if (sel.interiorPaperColor === 'Cream')              p += m.creamPaper;\n  if (sel.nylonWrapping === 'Wrapped')                 p += m.nylonWrappingpc;\n  if (sel.interiorColor === 'Colored')                 p += m.coloredInterior;\n  if (sel.coverText === 'Embossing' || sel.coverText === 'Debossing') p += m.embossingDebossing;\n  if (sel.coverText === 'Foil Stamping Embossing')     p += m.foilStampingEmbossing;\n  return p;\n}\n\n\/\/ \u2500\u2500 9. Floating total \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 sapUpdateFloating() {\n  const sel   = sapGetSelections();\n  const { total } = sapCalculate(sel);\n  const ft    = document.getElementById('sapFloatingTotal');\n  document.getElementById('sapFloatValue').textContent = sapFmt.format(total);\n  ft.classList.toggle('show', total > 0);\n}\n\n\/\/ \u2500\u2500 10. Quotation panel update \u2500\u2500\u2500\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 sapUpdateQuote() {\n  const sel = sapGetSelections();\n  const { total, bd } = sapCalculate(sel);\n  const fmt = sapFmt.format.bind(sapFmt);\n\n  \/\/ Header\n  document.getElementById('qhBookTitle').textContent = sel.bookTitle;\n  document.getElementById('qhWords').textContent     = sel.wordCount.toLocaleString() + ' words';\n  document.getElementById('qhTotal').textContent     = fmt(total);\n  document.getElementById('qGrandTotal').textContent = fmt(total);\n\n  \/\/ Service rows\n  const rows = [\n    ['transcription', sel.transcriptionType ? 'Transcription ('+sel.transcriptionType+')' : 'Transcription', bd.transcriptionCost],\n    ['editing',       sel.editingLevel ? 'Editing ('+sel.editingLevel+')' : 'Editing', bd.editingCost],\n    ['proofreading',  null, bd.proofreadingCost],\n    ['formatting',    sel.formattingType ? 'Formatting ('+sel.formattingType+')' : 'Formatting', bd.formattingCost],\n    ['cover',         sel.coverDesignType ? 'Book Cover ('+sel.coverDesignType+')' : 'Book Cover', bd.coverDesignCost],\n    ['brochure',      sel.brochurePages ? 'Brochure ('+sel.brochurePages+' pages)' : 'Brochure Design', bd.brochureDesignCost],\n    ['isbn',          sel.isbnUnits ? 'ISBN ('+sel.isbnUnits+' units)' : 'ISBN', bd.isbnCost],\n    ['issn',          sel.issnType ? 'ISSN ('+sel.issnType+')' : 'ISSN', bd.issnCost],\n    ['copyright',     null, bd.copyrightRegistrationCost],\n    ['amazon',        null, bd.amazonKindleCost],\n    ['ebook',         null, bd.ebookDistributionCost],\n  ];\n\n  rows.forEach(([key, label, val]) => {\n    const row = document.getElementById('qr-'+key);\n    const lEl = document.getElementById('ql-'+key);\n    const vEl = document.getElementById('qv-'+key);\n    if (!row || !vEl) return;\n    if (label && lEl) lEl.textContent = label;\n    vEl.textContent = fmt(val || 0);\n    row.classList.toggle('dimmed', !val || val === 0);\n  });\n\n  \/\/ Print block\n  const hasPrint = bd.printingCost > 0;\n  document.getElementById('qPrintBlock').style.display = hasPrint ? 'block' : 'none';\n  if (hasPrint) {\n    document.getElementById('qPrintCopies').textContent = sel.copies.toLocaleString() + ' Copies';\n    document.getElementById('qPrintPricePerCopy').textContent = fmt(bd.meta_pricePerCopy);\n\n    \/\/ Spec pills\n    const specMap = [\n      ['Trim Size', sel.desiredPrintSize],\n      ['Ink', sel.interiorColor],\n      ['Paper Finish', sel.interiorPaperType],\n      ['Paper Color', sel.interiorPaperColor],\n      ['Lamination', sel.coverFinish],\n      ['Cover Title', sel.coverText !== 'Normal' ? sel.coverText : 'Normal'],\n      ['Binding', sel.bindingType.includes('Paperback') ? 'Paperback' : 'Hardback'],\n      ['Packaging', sel.nylonWrapping],\n      ['Proof Copy', sel.sampleProofing],\n    ];\n\n    \/\/ Spec line on print card\n    const specLine = specMap.map(s => s[1]).filter(Boolean).join(' \u00b7 ');\n    document.getElementById('qPrintSpecs').textContent = specLine;\n\n    \/\/ Spec grid\n    const grid = document.getElementById('qSpecsGrid');\n    grid.innerHTML = specMap.map(([k,v]) => `<div class=\"sap-spec-pill\"><strong>${k}<\/strong>: ${v}<\/div>`).join('');\n  }\n}\n\n\/\/ \u2500\u2500 11. Save quotation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nasync function sapSaveQuotation(btn) {\n  if (typeof jQuery === 'undefined' || typeof calculator_ajax_object === 'undefined') {\n    alert('WordPress dependencies missing.'); return false;\n  }\n  \/\/ Email validation\n  const emailEl = document.getElementById('clientEmail');\n  const emailOk = emailEl && \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(emailEl.value);\n  document.getElementById('emailError').classList.toggle('show', !emailOk);\n  if (!emailOk) { sapGoStep(1); return false; }\n\n  const sel    = sapGetSelections();\n  const { total, bd } = sapCalculate(sel);\n  const totalStr = sapFmt.format(total);\n\n  const data = {\n    action:       'save_quote',\n    client_name:  document.getElementById('clientName').value || 'Anonymous',\n    client_email: emailEl.value,\n    client_phone: document.getElementById('clientPhone').value || '',\n    total_cost:   totalStr,\n    book_title:   sel.bookTitle || 'Untitled Project',\n    security:     calculator_ajax_object.security,\n    quote_details: JSON.stringify({ selections: sel, breakdown: bd }),\n  };\n\n  const orig = btn.textContent;\n  btn.textContent = 'Saving\u2026'; btn.disabled = true;\n\n  try {\n    const res = await jQuery.post(calculator_ajax_object.ajax_url, data);\n    btn.textContent = orig; btn.disabled = false;\n    if (res.success) return true;\n    alert('Error: ' + (res.data || 'Unknown error.')); return false;\n  } catch(e) {\n    alert('Connection error.'); btn.textContent = orig; btn.disabled = false; return false;\n  }\n}\n\n\/\/ \u2500\u2500 12. Reset form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 sapResetForm() {\n  document.getElementById('bookTitle').value    = 'My Book Project';\n  document.getElementById('wordCount').value    = '20000';\n  document.getElementById('clientName').value   = '';\n  document.getElementById('clientEmail').value  = '';\n  document.getElementById('clientPhone').value  = '';\n  document.getElementById('pageCount').value    = '100';\n  document.getElementById('brochurePages').value = '';\n  document.getElementById('copies-custom-input').value = '20';\n\n  document.querySelectorAll('#calculator-form input[type=\"checkbox\"]').forEach(cb => {\n    cb.checked = false;\n    const row = cb.closest('.sap-toggle-row');\n    if (row) row.classList.remove('toggled');\n  });\n  document.querySelectorAll('.sap-subsection').forEach(s => s.classList.remove('open'));\n  document.querySelectorAll('#calculator-form select').forEach(s => s.selectedIndex = 0);\n\n  \/\/ Reset radio cards to defaults\n  document.querySelectorAll('input[name=\"copiesOption\"]').forEach(r => { r.checked = r.value === '0'; });\n  \/\/ Deselect all copies cards via data-group, then select the \"No Print\" card\n  document.querySelectorAll('[data-group=\"copiesOption\"]').forEach(c => c.classList.remove('selected'));\n  const noPrintCard = document.querySelector('[data-group=\"copiesOption\"][data-copies=\"0\"]');\n  if (noPrintCard) noPrintCard.classList.add('selected');\n\n  const defaults = {\n    interiorColor: 'Black and White', interiorPaperType: 'Uncoated',\n    interiorPaperColor: 'White', coverFinish: 'Matte',\n    bindingType: 'Perfect Binding (Paperback)', nylonWrapping: 'Wrapped',\n    sampleProofing: 'Digital (PDF)',\n  };\n  Object.entries(defaults).forEach(([name, val]) => {\n    const radio = document.querySelector(`input[name=\"${name}\"][value=\"${val}\"]`);\n    if (radio) radio.checked = true;\n    document.querySelectorAll(`[data-group=\"${name}\"]`).forEach(c => {\n      c.classList.toggle('selected', c.dataset.val === val);\n    });\n  });\n\n  sapHandleCopiesChange();\n  sapUpdateFloating();\n  sapGoStep(1);\n}\n<\/script>\n\n\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<style>.kt-accordion-id75203_f57254-2e .kt-accordion-inner-wrap{column-gap:var(--global-kb-gap-md, 2rem);row-gap:10px;}.kt-accordion-id75203_f57254-2e .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-id75203_f57254-2e > .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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e > .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-id75203_f57254-2e .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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e .kt-accordion-header-wrap .kt-blocks-accordion-header:focus-visible,\n\t\t\t\t.kt-accordion-id75203_f57254-2e > .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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e: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-id75203_f57254-2e .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-id75203_f57254-2e > .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-id75203_f57254-2e > .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-id75203_f57254-2e .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-id75203_f57254-2e .kt-accordion-header-wrap .kt-blocks-accordion-header:focus-visible,\n\t\t\t\t.kt-accordion-id75203_f57254-2e > .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-id75203_f57254-2e .kt-accordion-inner-wrap{display:block;}.kt-accordion-id75203_f57254-2e .kt-accordion-inner-wrap .kt-accordion-pane:not(:first-child){margin-top:10px;}.kt-accordion-id75203_f57254-2e .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-id75203_f57254-2e > .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-id75203_f57254-2e > .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-id75203_f57254-2e .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-id75203_f57254-2e .kt-accordion-header-wrap .kt-blocks-accordion-header:focus-visible,\n\t\t\t\t.kt-accordion-id75203_f57254-2e > .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-id75203_f57254-2e 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-pane75203_8c9ce8-a0\"><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 Publishing Calculator<\/h2>\n\n\n\n<p>The&nbsp;<strong>Publishing Calculator<\/strong>&nbsp;helps authors and publishers to quickly estimate the cost of publishing a book. By selecting the services you need\u2014such as editing, typesetting, cover design, ISBN registration, copyright protection, distribution, or printing\u2014the tool automatically calculates an estimated quote for your project.<\/p>\n\n\n\n<p>This makes it easier to understand how different publishing services affect your overall budget and helps you plan your publishing journey more confidently.<\/p>\n\n\n\n<p>Whether you are a&nbsp;<strong>first-time author, self-publisher, or organization preparing a book<\/strong>, the calculator provides a fast and convenient way to preview potential publishing costs and generate a formal quotation.<\/p>\n\n\n\n<p><em><strong>Note<\/strong>: Estimates generated by this tool are indicative and may vary depending on manuscript specifications and project requirements.<\/em><\/p>\n<\/div><\/div><\/div>\n<\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Know how much it costs to publish and print your book. Choose publishing services according to your preferences and select print specifications to get instant quotation.<\/p>\n","protected":false},"author":1,"featured_media":76781,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_kb_optimizer_status":2,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"normal","_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":[16],"tags":[17,13,12],"class_list":["post-75203","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-pricing-tools","tag-calculator","tag-fast","tag-free"],"acf":[],"_links":{"self":[{"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/posts\/75203","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=75203"}],"version-history":[{"count":27,"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/posts\/75203\/revisions"}],"predecessor-version":[{"id":77199,"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/posts\/75203\/revisions\/77199"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/media\/76781"}],"wp:attachment":[{"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/media?parent=75203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/categories?post=75203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aceworldpgs.com\/tools\/wp-json\/wp\/v2\/tags?post=75203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}