{"id":33,"date":"2026-04-23T07:37:35","date_gmt":"2026-04-23T07:37:35","guid":{"rendered":"https:\/\/twainstudio.dev\/?page_id=33"},"modified":"2026-04-23T07:37:35","modified_gmt":"2026-04-23T07:37:35","slug":"twain-scipts","status":"publish","type":"page","link":"https:\/\/twainstudio.dev\/?page_id=33","title":{"rendered":"Twain Scipts"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>T.W.A.I.N. Manuscript Creator \u2014 KDP 6&#8243;x9&#8243; Formatting<\/title>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Cinzel:wght@400;600;700;900&#038;family=Oswald:wght@300;400;500;600;700&#038;family=Crimson+Text:ital,wght@0,400;0,600;1,400&#038;display=swap\" rel=\"stylesheet\">\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jszip\/3.10.1\/jszip.min.js\"><\/script>\n<style>\n*{box-sizing:border-box;margin:0;padding:0;}\n:root{\n  --navy:#060d18;--navy2:#0a1628;--navy3:#0d1e35;--navy4:#080f1e;\n  --gold:#c9a84c;--gold2:#e8c97a;--gold-dim:rgba(201,168,76,0.1);\n  --orange:#FF4500;--orange-dim:rgba(255,69,0,0.1);--orange-glow:rgba(255,69,0,0.22);\n  --cream:#f0e6c8;--slate:#4a5d7a;--slate2:#8a9ab5;\n  --green:#1D9E75;--green-dark:#0F6E56;--green-dim:rgba(29,158,117,0.1);\n  --purple:#7c3aed;--purple-dim:rgba(124,58,237,0.12);\n  --paper:#f5f0e8;--paper2:#ede8da;--ink:#18120a;\n}\nhtml,body{height:100%;margin:0;padding:0;}\nbody{background:var(--navy);color:var(--cream);font-family:'Crimson Text',serif;display:flex;flex-direction:column;overflow:hidden;}\n::-webkit-scrollbar{width:4px;height:4px;}\n::-webkit-scrollbar-thumb{background:rgba(201,168,76,0.25);border-radius:2px;}\n\n\/* TOP BAR *\/\n.topbar{flex-shrink:0;height:50px;background:var(--navy4);border-bottom:1px solid rgba(201,168,76,0.3);display:flex;align-items:center;justify-content:space-between;padding:0 16px;position:relative;z-index:100;}\n.topbar::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--orange) 30%,var(--gold) 50%,var(--orange) 70%,transparent);}\n.tb-brand{font-family:'Cinzel',serif;font-weight:900;font-size:13px;letter-spacing:.12em;color:var(--cream);}\n.tb-brand span{color:var(--gold);}\n.tb-brand em{color:var(--orange);font-style:normal;}\n.tb-phase{font-family:'Oswald',sans-serif;font-size:9px;letter-spacing:.25em;text-transform:uppercase;color:var(--orange);background:var(--orange-dim);border:1px solid rgba(255,69,0,0.3);padding:3px 10px;border-radius:20px;}\n.tb-center{display:flex;align-items:center;gap:14px;}\n.tb-stat{font-family:'Oswald',sans-serif;font-size:10px;letter-spacing:.08em;color:var(--slate2);}\n.tb-stat span{color:var(--gold);font-weight:600;}\n.tb-right{display:flex;align-items:center;gap:6px;}\n.tb-btn{font-family:'Oswald',sans-serif;font-size:9px;letter-spacing:.1em;text-transform:uppercase;background:transparent;border:1px solid rgba(201,168,76,0.2);color:var(--slate2);padding:5px 11px;border-radius:2px;cursor:pointer;transition:all .15s;white-space:nowrap;}\n.tb-btn:hover{color:var(--cream);border-color:rgba(201,168,76,0.5);}\n.tb-btn.gold{color:var(--gold);background:var(--gold-dim);border-color:rgba(201,168,76,0.35);}\n.tb-btn.orange{color:var(--orange);border-color:rgba(255,69,0,0.3);}\n.tb-btn.green{color:var(--green);border-color:rgba(29,158,117,0.3);background:var(--green-dim);}\n.tb-btn.purple{color:#a78bfa;border-color:rgba(124,58,237,0.35);background:var(--purple-dim);}\n\n\/* MODULE NAV *\/\n.module-nav{flex-shrink:0;height:32px;background:var(--navy4);border-bottom:1px solid rgba(201,168,76,0.1);display:flex;align-items:center;padding:0 14px;gap:2px;}\n.mod-link{font-family:'Oswald',sans-serif;font-size:9px;letter-spacing:.1em;text-transform:uppercase;padding:4px 10px;border-radius:2px;color:var(--slate);border:1px solid transparent;transition:all .15s;text-decoration:none;display:flex;align-items:center;gap:4px;cursor:pointer;}\n.mod-link:hover{color:var(--cream);}\n.mod-link.active{color:var(--gold);border-color:rgba(201,168,76,0.2);background:var(--gold-dim);}\n.mod-num{color:var(--orange);font-size:8px;font-weight:700;}\n.mod-arrow{color:rgba(201,168,76,0.2);margin:0 2px;}\n.mod-spacer{flex:1;}\n\n\/* MAIN LAYOUT *\/\n.forge-layout{flex:1;display:flex;min-height:0;overflow:hidden;}\n\n\/* LEFT PANEL *\/\n.ctrl-panel{width:260px;min-width:260px;background:var(--navy3);display:flex;flex-direction:column;border-right:1px solid rgba(201,168,76,0.08);overflow:hidden;}\n.ctrl-body{flex:1;overflow-y:auto;padding:12px;}\n.ctrl-section{margin-bottom:18px;}\n.ctrl-sec-title{font-family:'Oswald',sans-serif;font-size:8px;letter-spacing:.2em;text-transform:uppercase;color:var(--orange);margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid rgba(255,69,0,0.12);}\n.ctrl-field{margin-bottom:8px;}\n.ctrl-lbl{font-family:'Oswald',sans-serif;font-size:8px;letter-spacing:.12em;text-transform:uppercase;color:var(--slate2);margin-bottom:3px;display:block;}\n.ctrl-inp{width:100%;background:rgba(255,255,255,0.03);border:1px solid rgba(201,168,76,0.15);border-radius:2px;color:var(--cream);font-family:'Oswald',sans-serif;font-size:11px;padding:6px 8px;outline:none;}\n.ctrl-inp:focus{border-color:rgba(201,168,76,0.4);}\n.ctrl-inp::placeholder{color:rgba(74,93,122,0.4);font-style:italic;}\n.ctrl-select{width:100%;background:rgba(255,255,255,0.03);border:1px solid rgba(201,168,76,0.15);border-radius:2px;color:var(--cream);font-family:'Oswald',sans-serif;font-size:11px;padding:6px 8px;outline:none;cursor:pointer;}\n.ctrl-textarea{width:100%;background:rgba(255,255,255,0.03);border:1px solid rgba(201,168,76,0.15);border-radius:2px;color:var(--cream);font-family:'Crimson Text',serif;font-size:12px;padding:6px 8px;outline:none;resize:none;min-height:52px;line-height:1.6;}\n.ctrl-textarea::placeholder{color:rgba(74,93,122,0.4);font-style:italic;}\n.ctrl-btn{width:100%;padding:8px;border-radius:2px;font-family:'Oswald',sans-serif;font-size:10px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;cursor:pointer;border:none;transition:all .15s;margin-bottom:5px;}\n.ctrl-btn.primary{background:var(--orange);color:#fff;box-shadow:0 3px 12px var(--orange-glow);}\n.ctrl-btn.primary:hover{background:#ff5a1a;}\n.ctrl-btn.ai-build{background:linear-gradient(135deg,var(--purple),#5b21b6);color:#fff;box-shadow:0 3px 14px rgba(124,58,237,0.35);}\n.ctrl-btn.ai-build:hover{background:linear-gradient(135deg,#8b5cf6,var(--purple));}\n.ctrl-btn.secondary{background:transparent;color:var(--gold);border:1px solid rgba(201,168,76,0.3);}\n.ctrl-btn.secondary:hover{background:var(--gold-dim);}\n.ctrl-btn.ghost{background:transparent;color:var(--slate2);border:1px solid rgba(74,93,122,0.25);}\n.ctrl-btn.ghost:hover{color:var(--cream);}\n.ctrl-btn.green{background:var(--green-dark);color:#b5e8d8;}\n.ctrl-btn.green:hover{background:var(--green);}\n.ctrl-btn:disabled{opacity:.4;cursor:not-allowed;}\n.status-bar{flex-shrink:0;padding:8px 12px;border-top:1px solid rgba(201,168,76,0.08);}\n.status-msg{font-family:'Oswald',sans-serif;font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--slate);line-height:1.5;}\n.status-msg.ok{color:var(--green);}\n.status-msg.err{color:var(--orange);}\n.status-msg.info{color:var(--gold);}\n\n\/* Chapter list *\/\n.ch-list{display:flex;flex-direction:column;gap:3px;max-height:160px;overflow-y:auto;}\n.ch-item{font-family:'Oswald',sans-serif;font-size:9px;letter-spacing:.04em;color:var(--slate2);padding:4px 8px;border-radius:2px;cursor:pointer;border:1px solid transparent;display:flex;justify-content:space-between;align-items:center;}\n.ch-item:hover{background:rgba(201,168,76,0.06);border-color:rgba(201,168,76,0.15);color:var(--cream);}\n.ch-item .ch-wc{font-size:7px;color:var(--slate);opacity:.7;}\n\n\/* KEY STRIP *\/\n.key-strip{padding:10px 12px;border-bottom:1px solid rgba(201,168,76,0.08);background:rgba(6,13,24,0.5);flex-shrink:0;}\n.key-lbl{font-family:'Oswald',sans-serif;font-size:8px;letter-spacing:.12em;text-transform:uppercase;color:rgba(201,168,76,0.4);margin-bottom:3px;}\n.key-inp{width:100%;background:rgba(255,255,255,0.03);border:1px solid rgba(201,168,76,0.15);border-radius:2px;color:var(--cream);font-family:'Oswald',sans-serif;font-size:10px;padding:5px 8px;outline:none;}\n.key-inp:focus{border-color:rgba(201,168,76,0.4);}\n.key-inp::placeholder{color:rgba(74,93,122,0.4);}\n\n\/* CENTER PREVIEW *\/\n.preview-pane{flex:1;background:var(--navy);display:flex;flex-direction:column;min-width:0;overflow:hidden;}\n.preview-tabs{flex-shrink:0;height:34px;background:var(--navy2);border-bottom:1px solid var(--gold-dim);display:flex;align-items:center;padding:0 12px;gap:2px;}\n.ptab{font-family:'Oswald',sans-serif;font-size:9px;letter-spacing:.1em;text-transform:uppercase;padding:4px 10px;border-radius:2px;color:var(--slate);border:1px solid transparent;cursor:pointer;background:transparent;transition:all .15s;}\n.ptab:hover{color:var(--cream);}\n.ptab.active{color:var(--gold);border-color:rgba(201,168,76,0.2);background:var(--gold-dim);}\n.preview-content{flex:1;min-height:0;overflow:hidden;position:relative;}\n#manuscript-preview{width:100%;height:100%;background:var(--paper);color:var(--ink);font-family:'Crimson Text',serif;font-size:11pt;line-height:1.5;padding:40px 56px;overflow-y:auto;margin:0 auto;box-shadow:0 0 20px rgba(0,0,0,0.1);}\n#manuscript-preview::-webkit-scrollbar{width:6px;}\n#manuscript-preview::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.2);border-radius:3px;}\n\n\/* KDP Preview Styling *\/\n#manuscript-preview .title-page{text-align:center;margin:80px 0 60px;page-break-after:always;}\n#manuscript-preview .title-page h1{font-family:'Cinzel',serif;font-size:24pt;margin-bottom:20px;font-weight:700;}\n#manuscript-preview .title-page .byline{font-size:14pt;font-style:italic;margin-top:40px;}\n#manuscript-preview .copyright-page{font-size:9pt;margin:60px 0;page-break-after:always;color:#555;line-height:1.6;}\n#manuscript-preview .copyright-page .rebellion-brand{background:#f0ece4;border-left:3px solid #c9a84c;padding:10px 14px;margin:14px 0;font-size:9pt;}\n#manuscript-preview .dedication{text-align:center;margin:120px 0 60px;font-style:italic;font-size:12pt;page-break-after:always;}\n#manuscript-preview .toc-section{margin:40px 0;page-break-after:always;}\n#manuscript-preview .toc-section h2{font-family:'Cinzel',serif;font-size:16pt;text-align:center;margin-bottom:30px;}\n#manuscript-preview .toc-entry{display:flex;justify-content:space-between;border-bottom:1px dotted #ccc;padding:6px 0;font-size:11pt;}\n#manuscript-preview .foreword{margin:40px 0;page-break-after:always;}\n#manuscript-preview .foreword h2{font-family:'Cinzel',serif;font-size:16pt;text-align:center;margin-bottom:30px;}\n#manuscript-preview .foreword p{margin-bottom:1em;text-indent:0;}\n#manuscript-preview .chapter{margin:40px 0;page-break-before:always;}\n#manuscript-preview .chapter h1{font-family:'Cinzel',serif;font-size:18pt;text-align:center;margin-bottom:30px;font-weight:700;}\n#manuscript-preview .chapter p{margin-bottom:0.6em;text-indent:0.3in;}\n#manuscript-preview .chapter p:first-of-type{text-indent:0;}\n\n\/* RIGHT PANEL \u2014 AA BRAIN *\/\n.aa-panel{width:280px;min-width:280px;background:var(--navy3);border-left:1px solid rgba(201,168,76,0.08);display:flex;flex-direction:column;overflow:hidden;}\n.aa-header{flex-shrink:0;padding:10px 12px;border-bottom:1px solid rgba(201,168,76,0.08);display:flex;align-items:center;gap:8px;}\n.eng-light{width:7px;height:7px;border-radius:50%;background:#1a2a1a;transition:all .3s;flex-shrink:0;}\n.eng-light.on{background:var(--green);box-shadow:0 0 8px var(--green);}\n.eng-light.busy{background:#a78bfa;box-shadow:0 0 8px #a78bfa;animation:epulse .7s ease-in-out infinite;}\n.eng-light.error{background:#ff3333;}\n@keyframes epulse{0%,100%{opacity:.5;}50%{opacity:1;}}\n.eng-name{font-family:'Oswald',sans-serif;font-size:9px;letter-spacing:.1em;color:var(--slate2);text-transform:uppercase;}\n.eng-status{font-family:'Oswald',sans-serif;font-size:8px;color:var(--slate);flex:1;text-align:right;}\n.brain-model-row{flex-shrink:0;padding:6px 12px;border-bottom:1px solid rgba(201,168,76,0.08);display:flex;align-items:center;gap:6px;}\n.brain-model-lbl{font-family:'Oswald',sans-serif;font-size:8px;letter-spacing:.12em;text-transform:uppercase;color:var(--slate);}\n.brain-model-sel{flex:1;background:rgba(255,255,255,0.03);border:1px solid rgba(201,168,76,0.15);border-radius:2px;color:var(--cream);font-family:'Oswald',sans-serif;font-size:10px;padding:4px 7px;outline:none;cursor:pointer;}\n.chat{flex:1;min-height:0;overflow-y:auto;padding:10px;display:flex;flex-direction:column;gap:7px;}\n.msg-aa{background:rgba(255,255,255,0.03);border-left:3px solid var(--gold);padding:9px 11px;font-family:'Oswald',sans-serif;font-size:10px;line-height:1.65;color:var(--cream);}\n.msg-user{background:var(--orange-dim);border-right:3px solid var(--orange);padding:8px 11px;font-family:'Oswald',sans-serif;font-size:10px;color:var(--cream);text-align:right;font-style:italic;}\n.msg-think{display:flex;gap:3px;padding:8px 11px;border-left:3px solid rgba(201,168,76,0.2);}\n.msg-think span{width:5px;height:5px;border-radius:50%;background:var(--green);opacity:.3;animation:tp .9s ease-in-out infinite;}\n.msg-think span:nth-child(2){animation-delay:.2s;}\n.msg-think span:nth-child(3){animation-delay:.4s;}\n@keyframes tp{0%,100%{opacity:.2;transform:scale(.8);}50%{opacity:1;transform:scale(1.1);}}\n.chat-input-row{flex-shrink:0;padding:8px 10px;border-top:1px solid rgba(201,168,76,0.1);display:flex;gap:5px;background:rgba(6,13,24,0.5);}\n.chat-inp{flex:1;background:rgba(255,255,255,0.03);border:1px solid rgba(201,168,76,0.15);border-radius:2px;color:var(--cream);font-family:'Crimson Text',serif;font-size:12px;padding:7px 9px;outline:none;resize:none;min-height:36px;max-height:80px;line-height:1.5;}\n.chat-inp:focus{border-color:rgba(201,168,76,0.4);}\n.chat-inp::placeholder{color:rgba(74,93,122,0.4);font-style:italic;}\n.chat-send{background:var(--orange);border:none;border-radius:2px;padding:7px 12px;font-family:'Oswald',sans-serif;font-size:11px;font-weight:700;color:#fff;cursor:pointer;align-self:flex-end;}\n.chat-send:hover{background:#ff5a1a;}\n\n\/* Progress bar *\/\n#progress-wrap{display:none;padding:6px 12px;background:var(--navy4);border-bottom:1px solid rgba(201,168,76,0.08);}\n#progress-fill{height:3px;background:linear-gradient(90deg,var(--orange),var(--gold));border-radius:2px;width:0%;transition:width .4s ease;}\n#progress-lbl{font-family:'Oswald',sans-serif;font-size:8px;letter-spacing:.08em;text-transform:uppercase;color:var(--gold);margin-top:3px;}\n\n\/* Dropzone *\/\n#forge-dropzone.drag-over{border-color:rgba(201,168,76,0.6)!important;background:rgba(201,168,76,0.05)!important;}\n<\/style>\n<\/head>\n<body>\n\n<!-- TOP BAR -->\n<div class=\"topbar\">\n  <div class=\"tb-brand\"><span>T.W.A.I.N.<\/span> <em>MANUSCRIPT CREATOR<\/em><\/div>\n  <div class=\"tb-phase\">KDP 6&#8243;x9&#8243; Formatting<\/div>\n  <div class=\"tb-center\">\n    <div class=\"tb-stat\">Words <span id=\"stat-words\">0<\/span><\/div>\n    <div class=\"tb-stat\">Chapters <span id=\"stat-chapters\">0<\/span><\/div>\n    <div class=\"tb-stat\">Project <span id=\"stat-project\">None<\/span><\/div>\n  <\/div>\n  <div class=\"tb-right\">\n    <button class=\"tb-btn\" onclick=\"loadFromGenesis()\">Load from Genesis<\/button>\n    <button class=\"tb-btn gold\" onclick=\"exportHTML()\">Export HTML \u2192 PDF<\/button>\n    <button class=\"tb-btn green\" onclick=\"saveManuscript()\">Save<\/button>\n  <\/div>\n<\/div>\n\n<!-- MODULE NAV -->\n<div class=\"module-nav\">\n  <a class=\"mod-link\" href=\"twain-genesis.html\"><span class=\"mod-num\">01<\/span> Genesis<\/a>\n  <span class=\"mod-arrow\">\u203a<\/span>\n  <a class=\"mod-link active\"><span class=\"mod-num\">02<\/span> Manuscript Creator<\/a>\n  <span class=\"mod-arrow\">\u203a<\/span>\n  <a class=\"mod-link\" href=\"twain-pulse.html\"><span class=\"mod-num\">03<\/span> Pulse<\/a>\n  <span class=\"mod-arrow\">\u203a<\/span>\n  <a class=\"mod-link\" href=\"twain-cover-studio.html\"><span class=\"mod-num\">04<\/span> Cover Studio<\/a>\n  <div class=\"mod-spacer\"><\/div>\n  <span style=\"font-family:'Oswald',sans-serif;font-size:8px;letter-spacing:.12em;text-transform:uppercase;color:var(--slate);\">Rebellion Command Ecosystem<\/span>\n<\/div>\n\n<!-- GLOBAL PROGRESS -->\n<div id=\"progress-wrap\">\n  <div id=\"progress-fill\"><\/div>\n  <div id=\"progress-lbl\"><\/div>\n<\/div>\n\n<!-- FORGE LAYOUT -->\n<div class=\"forge-layout\">\n\n  <!-- LEFT CONTROLS -->\n  <div class=\"ctrl-panel\">\n    <div class=\"key-strip\">\n      <div class=\"key-lbl\">Groq API Key<\/div>\n      <input type=\"password\" class=\"key-inp\" id=\"groq-key\" placeholder=\"gsk_...\" oninput=\"saveKeys()\">\n      <div style=\"font-family:'Oswald',sans-serif;font-size:7px;color:rgba(201,168,76,0.4);margin-top:3px;letter-spacing:.06em;\">\n        Powers: Foreword Generation \u00b7 Chapter Review\n      <\/div>\n      <button onclick=\"testGroqConnection()\" style=\"margin-top:5px;width:100%;padding:4px;background:transparent;border:1px solid rgba(29,158,117,0.3);color:var(--green);font-family:'Oswald',sans-serif;font-size:8px;letter-spacing:.1em;text-transform:uppercase;cursor:pointer;border-radius:2px;\">Test Connection<\/button>\n    <\/div>\n\n    <div class=\"ctrl-body\">\n\n      <div class=\"ctrl-section\">\n        <div class=\"ctrl-sec-title\">Book Metadata<\/div>\n        <div class=\"ctrl-field\"><label class=\"ctrl-lbl\">Title<\/label>\n          <input class=\"ctrl-inp\" id=\"book-title\" placeholder=\"Book Title\" oninput=\"updateStats()\"><\/div>\n        <div class=\"ctrl-field\"><label class=\"ctrl-lbl\">Author<\/label>\n          <input class=\"ctrl-inp\" id=\"book-author\" placeholder=\"Author Name\"><\/div>\n        <div class=\"ctrl-field\"><label class=\"ctrl-lbl\">ISBN (optional)<\/label>\n          <input class=\"ctrl-inp\" id=\"book-isbn\" placeholder=\"Pending\"><\/div>\n        <div class=\"ctrl-field\"><label class=\"ctrl-lbl\">Dedication (optional)<\/label>\n          <textarea class=\"ctrl-textarea\" id=\"book-dedication\" placeholder=\"To... (leave blank to omit)\"><\/textarea><\/div>\n        <div class=\"ctrl-field\"><label class=\"ctrl-lbl\">Genre<\/label>\n          <select class=\"ctrl-select\" id=\"book-genre\">\n            <option value=\"\">Select genre&#8230;<\/option>\n            <option value=\"Non-Fiction \/ Self-Help\">Non-Fiction \/ Self-Help<\/option>\n            <option value=\"Business \/ Entrepreneurship\">Business \/ Entrepreneurship<\/option>\n            <option value=\"Memoir \/ Biography\">Memoir \/ Biography<\/option>\n            <option value=\"Thriller \/ Suspense\">Thriller \/ Suspense<\/option>\n            <option value=\"Romance\">Romance<\/option>\n            <option value=\"Fantasy \/ Sci-Fi\">Fantasy \/ Sci-Fi<\/option>\n            <option value=\"Horror\">Horror<\/option>\n            <option value=\"Literary Fiction\">Literary Fiction<\/option>\n          <\/select><\/div>\n      <\/div>\n\n      <div class=\"ctrl-section\">\n        <div class=\"ctrl-sec-title\">Upload Manuscript<\/div>\n        <div id=\"forge-dropzone\" onclick=\"document.getElementById('ms-upload').click()\" style=\"border:2px dashed rgba(201,168,76,0.25);border-radius:3px;padding:14px 10px;text-align:center;cursor:pointer;transition:all .2s;margin-bottom:6px;background:rgba(255,255,255,0.02);\">\n          <div style=\"font-size:22px;margin-bottom:5px;opacity:.5;\">\ud83d\udcc4<\/div>\n          <div style=\"font-family:'Oswald',sans-serif;font-size:9px;letter-spacing:.12em;text-transform:uppercase;color:var(--slate2);margin-bottom:3px;\">Drop or click to browse<\/div>\n          <div style=\"font-family:'Oswald',sans-serif;font-size:7px;letter-spacing:.08em;text-transform:uppercase;color:var(--slate);\">.txt \u00b7 .md \u00b7 .docx<\/div>\n        <\/div>\n        <input type=\"file\" id=\"ms-upload\" accept=\".txt,.md,.doc,.docx\" style=\"display:none\" onchange=\"ingestFile(this)\">\n        <div id=\"upload-progress\" style=\"display:none;margin-bottom:6px;\">\n          <div style=\"height:3px;background:rgba(255,255,255,0.05);border-radius:2px;overflow:hidden;\">\n            <div id=\"upload-bar\" style=\"height:100%;background:var(--orange);width:0%;transition:width .3s;\"><\/div>\n          <\/div>\n          <div id=\"upload-label\" style=\"font-family:'Oswald',sans-serif;font-size:8px;letter-spacing:.08em;color:var(--orange);margin-top:3px;\">Reading&#8230;<\/div>\n        <\/div>\n        <button class=\"ctrl-btn ghost\" onclick=\"loadFromGenesis()\">Pull from Genesis<\/button>\n      <\/div>\n\n      <div class=\"ctrl-section\">\n        <div class=\"ctrl-sec-title\">Manuscript Actions<\/div>\n        <button class=\"ctrl-btn primary\" onclick=\"runForge()\">\u2460 Create Manuscript<\/button>\n        <button class=\"ctrl-btn ai-build\" id=\"btn-foreword\" onclick=\"generateForeword()\" disabled>\u270e \u2461 Generate Foreword (AI)<\/button>\n        <button class=\"ctrl-btn green\" id=\"btn-review\" onclick=\"startFullReview()\" disabled>\u2726 \u2462 Full Chapter Review<\/button>\n        <button class=\"ctrl-btn ghost\" onclick=\"clearAll()\">Clear All<\/button>\n      <\/div>\n\n      <div class=\"ctrl-section\">\n        <div class=\"ctrl-sec-title\">Chapter Map<\/div>\n        <div class=\"ch-list\" id=\"ch-list\">\n          <div style=\"font-family:'Oswald',sans-serif;font-size:9px;color:var(--slate);letter-spacing:.06em;\">Create manuscript to see chapters<\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"ctrl-section\">\n        <div class=\"ctrl-sec-title\">Export<\/div>\n        <button class=\"ctrl-btn secondary\" onclick=\"exportHTML()\">Export HTML \u2192 PDF<\/button>\n        <button class=\"ctrl-btn ghost\" onclick=\"exportEpubBundle()\">Export ePub Bundle<\/button>\n      <\/div>\n\n    <\/div>\n    <div class=\"status-bar\">\n      <div class=\"status-msg\" id=\"status-msg\">Upload a manuscript to begin.<\/div>\n    <\/div>\n  <\/div>\n\n  <!-- CENTER: MANUSCRIPT PREVIEW -->\n  <div class=\"preview-pane\">\n    <div class=\"preview-tabs\">\n      <button class=\"ptab active\" id=\"tab-preview\" onclick=\"showTab('preview')\">Manuscript Preview<\/button>\n      <button class=\"ptab\" id=\"tab-raw\" onclick=\"showTab('raw')\">Raw Text<\/button>\n    <\/div>\n    <div class=\"preview-content\">\n      <div id=\"panel-preview\" style=\"height:100%;\">\n        <div id=\"manuscript-preview\"><\/div>\n      <\/div>\n      <div id=\"panel-raw\" style=\"display:none;height:100%;\">\n        <textarea id=\"ms-raw\" placeholder=\"Paste raw manuscript here, or upload a file.&#10;&#10;The Manuscript Creator will detect chapters, generate title and copyright pages, and produce a KDP-ready document.\" style=\"width:100%;height:100%;background:rgba(255,255,255,0.02);border:none;color:var(--cream);font-family:'Crimson Text',serif;font-size:13px;padding:20px;resize:none;outline:none;line-height:1.7;\"><\/textarea>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- RIGHT PANEL: A.A. BRAIN -->\n  <div class=\"aa-panel\">\n    <div class=\"aa-header\">\n      <div class=\"eng-light on\" id=\"eng-light\"><\/div>\n      <div class=\"eng-name\" id=\"eng-name\">A.A. Brain<\/div>\n      <div class=\"eng-status\" id=\"eng-status\">Ready<\/div>\n    <\/div>\n    <div class=\"brain-model-row\">\n      <div class=\"brain-model-lbl\">Model<\/div>\n      <select class=\"brain-model-sel\" id=\"brain-model\" onchange=\"updateModel()\">\n        <option value=\"openai\/gpt-oss-20b\" selected>GPT-OSS 20B (Default)<\/option>\n        <option value=\"llama-3.1-8b-instant\">Llama 3.1 8B (Fast)<\/option>\n        <option value=\"meta-llama\/llama-4-scout-17b-16e-instruct\">Llama 4 Scout 17B<\/option>\n        <option value=\"qwen\/qwen3-32b\">Qwen 3 32B<\/option>\n      <\/select>\n    <\/div>\n    <div class=\"chat\" id=\"chat\">\n      <div class=\"msg-aa\">T.W.A.I.N. Manuscript Creator is ready.<br><br>Upload your manuscript, hit <strong>Create Manuscript<\/strong>, then <strong>Generate Foreword<\/strong> for a professional foreword written by Groq.<br><br>When you&#8217;re ready, run <strong>Full Chapter Review<\/strong> for a complete analysis.<\/div>\n    <\/div>\n    <div class=\"chat-input-row\">\n      <textarea class=\"chat-inp\" id=\"chat-inp\" placeholder=\"Ask the A.A. Brain about your manuscript...\" rows=\"2\"\n        onkeydown=\"if(event.key==='Enter'&#038;&#038;!event.shiftKey){event.preventDefault();sendMsg();}\"><\/textarea>\n      <button class=\"chat-send\" onclick=\"sendMsg()\">\u25b6<\/button>\n    <\/div>\n  <\/div>\n\n<\/div>\n\n<script>\n\/\/ ================================================================\n\/\/ T.W.A.I.N. MANUSCRIPT CREATOR \u2014 KDP 6\"x9\" Formatting\n\/\/ ================================================================\n\nvar M = {\n  rawText: '',\n  formattedHTML: '',\n  chapters: [],\n  title: '',\n  author: '',\n  isbn: '',\n  genre: '',\n  dedication: '',\n  forewordHTML: '',\n  activeModel: 'openai\/gpt-oss-20b',\n  conversation: [],\n  buildRunning: false,\n  reviewRunning: false\n};\n\n\/\/ ================================================================\n\/\/ INIT\n\/\/ ================================================================\nwindow.addEventListener('load', function() {\n  var gk = localStorage.getItem('twain_groq_key');\n  if (gk) document.getElementById('groq-key').value = gk;\n  loadFromGenesis();\n  setLight('on', 'A.A. Brain');\n  setupDropZone();\n  updateEngineStatus();\n});\n\nfunction saveKeys() {\n  var key = document.getElementById('groq-key').value.trim();\n  if (key) localStorage.setItem('twain_groq_key', key);\n  else localStorage.removeItem('twain_groq_key');\n  updateEngineStatus();\n}\n\nfunction getGroqKey() {\n  return document.getElementById('groq-key').value.trim();\n}\n\nfunction updateEngineStatus() {\n  var key = getGroqKey();\n  if (key) {\n    setLight('on', 'Groq Ready');\n    document.getElementById('eng-status').textContent = 'Full power';\n  } else {\n    setLight('error', 'No Key');\n    document.getElementById('eng-status').textContent = 'Add Groq key';\n  }\n}\n\nfunction updateModel() {\n  M.activeModel = document.getElementById('brain-model').value;\n  M.conversation = [];\n}\n\n\/\/ ================================================================\n\/\/ GROQ API\n\/\/ ================================================================\nasync function callGroq(messages, maxTokens) {\n  var key = getGroqKey();\n  if (!key) throw new Error('No Groq key \u2014 paste your gsk_ key in the key panel.');\n  var res;\n  try {\n    res = await fetch('https:\/\/api.groq.com\/openai\/v1\/chat\/completions', {\n      method: 'POST',\n      headers: { 'Authorization': 'Bearer ' + key, 'Content-Type': 'application\/json' },\n      body: JSON.stringify({\n        model: M.activeModel,\n        max_tokens: maxTokens || 800,\n        temperature: 0.7,\n        messages: messages\n      })\n    });\n  } catch(netErr) {\n    throw new Error('Network error reaching Groq: ' + netErr.message);\n  }\n  var data;\n  try { data = await res.json(); } catch(e) { throw new Error('Groq returned non-JSON response'); }\n  if (!res.ok) {\n    var msg = (data.error && data.error.message) ? data.error.message : JSON.stringify(data);\n    throw new Error('Groq API error ' + res.status + ': ' + msg);\n  }\n  if (!data.choices || !data.choices[0]) throw new Error('Groq returned empty choices array.');\n  return data.choices[0].message.content;\n}\n\nasync function callAI(systemPrompt, userPrompt, maxTokens) {\n  return callGroq([\n    { role: 'system', content: systemPrompt },\n    { role: 'user', content: userPrompt }\n  ], maxTokens || 800);\n}\n\nasync function testGroqConnection() {\n  setStatus('Testing Groq connection...', 'info');\n  setLight('busy', 'Testing...');\n  try {\n    var result = await callAI('You are a test assistant.', 'Reply with exactly: CONNECTED', 20);\n    if (result && result.indexOf('CONNECTED') !== -1) {\n      setStatus('Groq connected. Model: ' + M.activeModel, 'ok');\n      setLight('on', 'Groq Ready');\n      addMsg('\u2713 Groq connection confirmed. Model: <strong>' + M.activeModel + '<\/strong>.', false);\n    } else {\n      setStatus('Groq responded but result unexpected.', 'info');\n      setLight('on', 'Groq Ready');\n    }\n  } catch(e) {\n    setStatus('Connection failed: ' + e.message, 'err');\n    setLight('error', 'Error');\n    addMsg('\u2717 Groq connection failed: ' + e.message, false);\n  }\n}\n\n\/\/ ================================================================\n\/\/ DROP ZONE & FILE INGESTION\n\/\/ ================================================================\nfunction setupDropZone() {\n  var dz = document.getElementById('forge-dropzone');\n  if (!dz) return;\n  dz.addEventListener('dragover', function(e) { e.preventDefault(); e.stopPropagation(); dz.classList.add('drag-over'); });\n  dz.addEventListener('dragleave', function(e) { e.stopPropagation(); dz.classList.remove('drag-over'); });\n  dz.addEventListener('drop', function(e) {\n    e.preventDefault(); e.stopPropagation(); dz.classList.remove('drag-over');\n    var f = e.dataTransfer.files[0]; if (f) processUploadedFile(f);\n  });\n}\n\nfunction loadFromGenesis() {\n  try {\n    var raw = localStorage.getItem('twain_active_manuscript');\n    if (!raw) return;\n    var data = JSON.parse(raw);\n    M.title   = data.title   || '';\n    M.rawText = data.rawText || '';\n    if (M.title)   document.getElementById('book-title').value  = M.title;\n    if (data.author) document.getElementById('book-author').value = data.author;\n    if (M.rawText) {\n      document.getElementById('ms-raw').value = M.rawText;\n      updateStats();\n      setStatus('Loaded from Genesis \u2014 ' + M.rawText.split(\/\\s+\/).length.toLocaleString() + ' words. Hit Create Manuscript.', 'info');\n    }\n    document.getElementById('stat-project').textContent = (M.title || 'Untitled').substring(0, 14);\n  } catch(e) {}\n}\n\nfunction ingestFile(inp) { var f = inp.files[0]; if (f) processUploadedFile(f); }\n\nfunction processUploadedFile(file) {\n  var ext = file.name.split('.').pop().toLowerCase();\n  if (['txt','md','docx','doc'].indexOf(ext) === -1) { setStatus('Use .txt, .md, or .docx', 'err'); return; }\n  var prog = document.getElementById('upload-progress');\n  var bar  = document.getElementById('upload-bar');\n  var lbl  = document.getElementById('upload-label');\n  prog.style.display = 'block'; bar.style.width = '20%'; lbl.textContent = 'Reading ' + file.name + '...';\n  var reader = new FileReader();\n  if (ext === 'docx' || ext === 'doc') {\n    reader.onload = function(e) {\n      bar.style.width = '60%'; lbl.textContent = 'Extracting DOCX...';\n      try {\n        extractDocxText(e.target.result, file.name, function(text) {\n          bar.style.width = '100%'; lbl.textContent = 'Done.';\n          setTimeout(function() { prog.style.display = 'none'; bar.style.width = '0%'; }, 1200);\n          finalizeIngest(text, file.name);\n        });\n      } catch(err) { prog.style.display = 'none'; setStatus('DOCX failed: ' + err.message, 'err'); }\n    };\n    reader.readAsArrayBuffer(file);\n  } else {\n    reader.onload = function(e) {\n      bar.style.width = '100%'; lbl.textContent = 'Done.';\n      setTimeout(function() { prog.style.display = 'none'; bar.style.width = '0%'; }, 800);\n      finalizeIngest(e.target.result, file.name);\n    };\n    reader.readAsText(file);\n  }\n}\n\nfunction extractDocxText(buf, filename, callback) {\n  JSZip.loadAsync(buf).then(function(zip) {\n    var docFile = zip.file('word\/document.xml');\n    if (!docFile) { callback('[DOCX extraction failed \u2014 word\/document.xml not found.]'); return Promise.resolve(null); }\n    return docFile.async('string');\n  }).then(function(xmlContent) {\n    if (!xmlContent) { callback('[DOCX extraction failed \u2014 empty document.]'); return; }\n    var text = '';\n    var parser = new DOMParser();\n    var doc = parser.parseFromString(xmlContent, 'text\/xml');\n    var paragraphs = doc.getElementsByTagNameNS('http:\/\/schemas.openxmlformats.org\/wordprocessingml\/2006\/main', 'p');\n    for (var i = 0; i < paragraphs.length; i++) {\n      var paraText = '';\n      var runs = paragraphs[i].getElementsByTagNameNS('http:\/\/schemas.openxmlformats.org\/wordprocessingml\/2006\/main', 't');\n      for (var j = 0; j < runs.length; j++) paraText += runs[j].textContent;\n      paraText = paraText.trim();\n      text += paraText.length > 0 ? paraText + '\\n' : '\\n';\n    }\n    text = text.replace(\/\\r\\n\/g, '\\n').replace(\/\\n{4,}\/g, '\\n\\n\\n').trim();\n    callback(text || '[No readable text found in DOCX.]');\n  }).catch(function(err) { callback('[DOCX extraction failed: ' + err.message + ']'); });\n}\n\nfunction finalizeIngest(text, filename) {\n  text = text.replace(\/file:[^\\s)>]*\/g, '').replace(\/https?:[^\\s)>]*\/g, '').replace(\/\\n{4,}\/g, '\\n\\n\\n').trim();\n  M.rawText = text;\n  document.getElementById('ms-raw').value = M.rawText;\n  updateStats();\n  var words = M.rawText.split(\/\\s+\/).filter(function(w) { return w.length > 0; }).length;\n  setStatus('Loaded: ' + filename + ' \u2014 ' + words.toLocaleString() + ' words. Hit Create Manuscript.', 'ok');\n  addMsg('<strong>' + filename + '<\/strong> loaded \u2014 ' + words.toLocaleString() + ' words. Hit <strong>Create Manuscript<\/strong> to format it.', false);\n  showTab('raw');\n  var firstLine = text.split('\\n')[0].replace(\/^#+\\s*\/, '').trim();\n  if (firstLine && firstLine.length < 80 &#038;&#038; !document.getElementById('book-title').value) {\n    document.getElementById('book-title').value = firstLine;\n    M.title = firstLine;\n    document.getElementById('stat-project').textContent = firstLine.substring(0, 14);\n  }\n}\n\n\/\/ ================================================================\n\/\/ FORGE ENGINE \u2014 detectChapters + runForge\n\/\/ ================================================================\nfunction detectChapters(text) {\n  text = (text || '').replace(\/\\r\\n\/g, '\\n').trim();\n\n  var chapterRegex = \/(?:^|\\n)\\s*((?:chapter|ch\\.?)\\s+(?:\\d+|[ivxlcdm]+)(?:\\s*[:\\-\u2014]\\s*.*|[ \\t]+.*)?)\\s*(?=\\n)\/gim;\n  var matches = [];\n  var match;\n\n  while ((match = chapterRegex.exec(text)) !== null) {\n    matches.push({\n      title: match[1].trim(),\n      index: match.index + match[0].indexOf(match[1])\n    });\n  }\n\n  if (matches.length === 0) {\n    var parts = text.split(\/\\n{3,}\/);\n    if (parts.length > 1) {\n      return parts.map(function(part, i) {\n        var trimmed = part.trim();\n        var lines = trimmed.split('\\n').filter(Boolean);\n        var firstLine = lines[0] || ('Section ' + (i + 1));\n        var body = lines.slice(1).join('\\n').trim();\n        return { title: firstLine, body: body || trimmed };\n      }).filter(function(c) { return c.body && c.body.length > 100; });\n    }\n    return [{ title: document.getElementById('book-title').value || 'Manuscript', body: text }];\n  }\n\n  var chapters = [];\n  for (var i = 0; i < matches.length; i++) {\n    var title = matches[i].title;\n    var start = matches[i].index + title.length;\n    var end = (i + 1 < matches.length) ? matches[i + 1].index : text.length;\n    var body = text.substring(start, end).trim();\n    chapters.push({ title: title, body: body });\n  }\n  return chapters.filter(function(c) { return c.body &#038;&#038; c.body.length > 0; });\n}\n\nfunction buildTitlePage(title, author) {\n  return '<div class=\"title-page\" style=\"page-break-after:always;\">' +\n    '<h1>' + escHtml(title) + '<\/h1>' +\n    '<div class=\"byline\">by ' + escHtml(author) + '<\/div><\/div>';\n}\n\nfunction buildCopyrightPage(title, author, isbn) {\n  var year = new Date().getFullYear();\n  var month = new Intl.DateTimeFormat('en-US', { month: 'long' }).format(new Date());\n  return '<div class=\"copyright-page\" style=\"page-break-after:always;\">' +\n    '<p><strong>' + escHtml(title.toUpperCase()) + '<\/strong><\/p>' +\n    '<p>Copyright &copy; ' + year + ' by ' + escHtml(author) + '.<\/p>' +\n    '<div class=\"rebellion-brand\"><strong>Published through T.W.A.I.N. Studio<\/strong><br><em>The Writers Artificial Intelligence Nexus \u2014 twainstudio.dev<\/em><\/div>' +\n    '<p>All rights reserved. No part of this publication may be reproduced, distributed, or transmitted in any form or by any means without the prior written permission of the publisher.<\/p>' +\n    '<p>First Edition: ' + month + ' ' + year + '<br>ISBN: ' + escHtml(isbn || 'Pending') + '<br>Printed in the United States of America.<\/p>' +\n    '<\/div>';\n}\n\nfunction buildDedicationHTML(text) {\n  if (!text || !text.trim()) return '';\n  return '<div class=\"dedication\" style=\"page-break-after:always;text-align:center;padding-top:2in;font-style:italic;font-size:13pt;\">' + escHtml(text) + '<\/div>';\n}\n\nfunction buildTOCHTML(chapters) {\n  var items = chapters.map(function(c, i) {\n    return '<div class=\"toc-entry\"><a href=\"#ch' + i + '\">' + escHtml(c.title) + '<\/a><span>' + (i + 1) + '<\/span><\/div>';\n  }).join('');\n  return '<div class=\"toc-section\" style=\"page-break-after:always;\"><h2>Table of Contents<\/h2>' + items + '<\/div>';\n}\n\nfunction chaptersToHTML(chapters) {\n  return chapters.map(function(c, i) {\n    var paras = (c.body || '').split(\/\\n{2,}\/).map(function(p) {\n      var trimmed = p.trim();\n      return trimmed ? '<p>' + escHtml(trimmed) + '<\/p>' : '';\n    }).filter(Boolean).join('\\n');\n    return '<div class=\"chapter\" id=\"ch' + i + '\" style=\"page-break-before:always;\">' +\n      '<h1>' + escHtml(c.title) + '<\/h1>' +\n      paras + '<\/div>';\n  }).join('\\n');\n}\n\nfunction runForge() {\n  var raw = document.getElementById('ms-raw').value || M.rawText;\n  if (!raw.trim()) {\n    setStatus('Upload or paste a manuscript first.', 'err');\n    addMsg('No manuscript found. Upload a .docx or .txt file, or paste raw text in the Raw Text tab.', false);\n    return;\n  }\n  M.rawText = raw;\n  setStatus('Creating manuscript...', 'info');\n  showProgress(true);\n  setProgress(20, 'Detecting chapters...');\n\n  try {\n    M.chapters = detectChapters(M.rawText);\n    setProgress(40, 'Building front matter...');\n\n    var title  = document.getElementById('book-title').value  || M.title || 'Untitled';\n    var author = document.getElementById('book-author').value || 'Author';\n    var isbn   = document.getElementById('book-isbn').value   || '';\n    var dedSeed = document.getElementById('book-dedication').value || '';\n\n    M.title = title;\n    M.author = author;\n    M.isbn = isbn;\n    M.dedication = dedSeed;\n\n    var titlePage   = buildTitlePage(title, author);\n    var copyPage    = buildCopyrightPage(title, author, isbn);\n    var dedPage     = dedSeed ? buildDedicationHTML(dedSeed) : '';\n    var tocHTML     = buildTOCHTML(M.chapters);\n    var chaptersHTML = chaptersToHTML(M.chapters);\n\n    setProgress(60, 'Assembling document...');\n\n    M.formattedHTML = titlePage + copyPage + dedPage + tocHTML + chaptersHTML;\n\n    setProgress(80, 'Rendering preview...');\n    document.getElementById('manuscript-preview').innerHTML = M.formattedHTML;\n\n    \/\/ Build chapter list\n    var chList = document.getElementById('ch-list');\n    chList.innerHTML = '';\n    M.chapters.forEach(function(c, i) {\n      var wc = c.body ? c.body.split(\/\\s+\/).filter(Boolean).length : 0;\n      var item = document.createElement('div');\n      item.className = 'ch-item';\n      item.innerHTML = '<span>' + escHtml(c.title.substring(0, 28)) + '<\/span><span class=\"ch-wc\">' + wc + 'w<\/span>';\n      item.onclick = function() { scrollToChapter(i); };\n      chList.appendChild(item);\n    });\n\n    setProgress(100, 'Manuscript created.');\n    setTimeout(function() { showProgress(false); }, 1500);\n\n    document.getElementById('btn-foreword').disabled = false;\n    document.getElementById('btn-review').disabled = false;\n\n    updateStats();\n    setStatus('Manuscript created \u2014 ' + M.chapters.length + ' chapters detected. Generate a foreword or continue editing.', 'ok');\n    addMsg('Manuscript created \u2014 <strong>' + M.chapters.length + ' chapters<\/strong> detected.<br><br>Click <strong>Generate Foreword<\/strong> to have Groq write a professional foreword for your book.', false);\n    showTab('preview');\n\n  } catch(e) {\n    setStatus('Creation failed: ' + e.message, 'err');\n    showProgress(false);\n  }\n}\n\n\/\/ ================================================================\n\/\/ GENERATE FOREWORD (AI)\n\/\/ ================================================================\nasync function generateForeword() {\n  if (M.chapters.length === 0) {\n    setStatus('Create your manuscript first.', 'err');\n    return;\n  }\n  var key = getGroqKey();\n  if (!key) {\n    setStatus('Groq API key required for foreword generation.', 'err');\n    addMsg('Add your Groq API key to generate a foreword.', false);\n    return;\n  }\n\n  setLight('busy', 'Writing foreword...');\n  setStatus('Generating foreword...', 'info');\n\n  var title = document.getElementById('book-title').value || M.title || 'Untitled';\n  var author = document.getElementById('book-author').value || M.author || 'Author';\n  var genre = document.getElementById('book-genre').value || 'general';\n\n  \/\/ Sample first chapter to give AI context\n  var firstChapterPreview = M.chapters[0] ? M.chapters[0].body.substring(0, 800) : '';\n\n  try {\n    var result = await callAI(\n      'You are a professional literary editor writing a foreword for a book. Write in elegant, compelling prose. No HTML tags, no markdown, just plain paragraphs separated by blank lines. The foreword should praise the author\\'s craft and describe what makes the book significant.',\n      'Write a professional foreword for \"' + title + '\" by ' + author + '.\\n\\nGenre: ' + genre + '\\n\\nFirst chapter preview:\\n' + firstChapterPreview + '\\n\\nWrite 2-3 paragraphs (250-350 words) that:\\n1. Hook the reader with the book\\'s significance\\n2. Praise the author\\'s voice and craft\\n3. Describe what readers will gain\\n\\nOutput ONLY the foreword text, no explanations.',\n      500\n    );\n\n    var forewordHTML = '<div class=\"foreword\" style=\"page-break-after:always;\">' +\n      '<h2>Foreword<\/h2>' +\n      result.trim().split(\/\\n{2,}\/).map(function(p) {\n        return '<p>' + escHtml(p.trim()) + '<\/p>';\n      }).join('') +\n      '<p style=\"margin-top:1.5em;font-style:italic;\">\u2014 T.W.A.I.N. Editorial<\/p>' +\n      '<\/div>';\n\n    M.forewordHTML = forewordHTML;\n\n    \/\/ Insert foreword after TOC, before first chapter\n    var previewEl = document.getElementById('manuscript-preview');\n    var tocSection = previewEl.querySelector('.toc-section');\n    if (tocSection && tocSection.nextSibling) {\n      var tempDiv = document.createElement('div');\n      tempDiv.innerHTML = forewordHTML;\n      var forewordNode = tempDiv.firstChild;\n      tocSection.parentNode.insertBefore(forewordNode, tocSection.nextSibling);\n    } else {\n      previewEl.insertAdjacentHTML('beforeend', forewordHTML);\n    }\n\n    \/\/ Update stored HTML\n    M.formattedHTML = previewEl.innerHTML;\n\n    setLight('on', 'Ready');\n    setStatus('Foreword generated and inserted.', 'ok');\n    addMsg('\u2713 Foreword written by Groq and inserted into your manuscript.<br><br>Review it in the preview. You can edit it manually if needed.', false, 'purple');\n\n  } catch(e) {\n    setLight('error', 'Error');\n    setStatus('Foreword generation failed: ' + e.message, 'err');\n    addMsg('\u2717 Foreword generation failed: ' + e.message, false);\n  }\n}\n\n\/\/ ================================================================\n\/\/ FULL CHAPTER REVIEW\n\/\/ ================================================================\nasync function startFullReview() {\n  if (M.reviewRunning) return;\n  if (M.chapters.length === 0) { setStatus('Create manuscript first.', 'err'); return; }\n  var key = getGroqKey();\n  if (!key) {\n    setStatus('Groq API key required.', 'err');\n    addMsg('Add your Groq API key to run the Full Chapter Review.', false);\n    return;\n  }\n\n  M.reviewRunning = true;\n  setLight('busy', 'Reviewing chapters...');\n  addMsg('\u2726 Full Chapter Review started \u2014 Groq is analyzing each chapter...', false, 'purple');\n\n  var title = document.getElementById('book-title').value || M.title || 'Untitled';\n  var genre = document.getElementById('book-genre').value || 'general';\n\n  for (var i = 0; i < M.chapters.length; i++) {\n    var ch = M.chapters[i];\n    setStatus('Reviewing Chapter ' + (i + 1) + ' of ' + M.chapters.length + ': ' + ch.title.substring(0, 40) + '...', 'info');\n\n    try {\n      var excerpt = ch.body.substring(0, 2000) + (ch.body.length > 2000 ? '\\n[...truncated...]' : '');\n      var reviewResult = await callAI(\n        'You are a master editor. Give direct, specific, actionable feedback. Reference the actual text. Be honest.',\n        'Review this chapter from \"' + title + '\" (Genre: ' + genre + '):\\n\\nCHAPTER ' + (i + 1) + ': ' + ch.title + '\\n\\n' + excerpt +\n        '\\n\\nProvide a brief review (3-5 sentences) covering:\\n- Hook strength (1-10)\\n- Pacing (strong\/good\/weak)\\n- One specific suggestion for improvement\\n\\nKeep it concise and actionable.',\n        300\n      );\n\n      addMsg('<strong>Chapter ' + (i + 1) + ': ' + ch.title + '<\/strong><br>' + reviewResult.replace(\/\\n\/g, '<br>'), false, 'purple');\n\n      if (i < M.chapters.length - 1) await sleep(500);\n    } catch(e) {\n      addMsg('Chapter ' + (i + 1) + ' review failed: ' + e.message, false);\n    }\n  }\n\n  M.reviewRunning = false;\n  setLight('on', 'Ready');\n  setStatus('Chapter review complete \u2014 ' + M.chapters.length + ' chapters analyzed.', 'ok');\n  addMsg('\u2726 Chapter Review complete. ' + M.chapters.length + ' chapters analyzed. Scroll up to see the full review.', false, 'purple');\n}\n\nfunction sleep(ms) { return new Promise(function(r) { setTimeout(r, ms); }); }\n\n\/\/ ================================================================\n\/\/ A.A. BRAIN CHAT\n\/\/ ================================================================\nfunction buildSystemPrompt() {\n  var title = document.getElementById('book-title').value || M.title || 'this book';\n  var author = document.getElementById('book-author').value || M.author || 'the author';\n  var genre = document.getElementById('book-genre').value || 'unknown genre';\n  return 'You are the T.W.A.I.N. Manuscript Creator Brain \u2014 master editor and literary strategist.\\n\\nBook: \"' + title + '\" by ' + author + '\\nGenre: ' + genre + '\\n\\nBe direct, specific, and commercial. Focus on actionable advice.';\n}\n\nasync function callBrain(userMsg) {\n  var key = getGroqKey();\n  if (!key) { addMsg('Enter your Groq API key to activate the A.A. Brain.', false); return null; }\n  M.conversation.push({ role: 'user', content: userMsg });\n  addThinking(); setLight('busy', 'Thinking...');\n  var messages = [{ role: 'system', content: buildSystemPrompt() }].concat(M.conversation.slice(-12));\n  try {\n    var reply = await callGroq(messages, 500);\n    M.conversation.push({ role: 'assistant', content: reply });\n    removeThinking(); setLight('on', 'Ready');\n    return reply;\n  } catch(e) {\n    removeThinking(); setLight('error', 'Error');\n    addMsg('Brain error: ' + e.message, false);\n    return null;\n  }\n}\n\nasync function sendMsg() {\n  var inp = document.getElementById('chat-inp');\n  var text = inp.value.trim(); if (!text) return;\n  addMsg(text, true); inp.value = '';\n  var reply = await callBrain(text);\n  if (reply) addMsg(reply, false);\n}\n\n\/\/ ================================================================\n\/\/ EXPORT &#038; SAVE\n\/\/ ================================================================\nfunction saveManuscript() {\n  var title = document.getElementById('book-title').value || M.title || 'Untitled';\n  var author = document.getElementById('book-author').value || M.author || 'Author';\n  var raw = document.getElementById('ms-raw').value || M.rawText;\n  var words = raw.trim() ? raw.trim().split(\/\\s+\/).length : 0;\n  var saveData = {\n    title: title,\n    author: author,\n    rawText: raw,\n    formattedHTML: M.formattedHTML,\n    chapters: M.chapters.map(function(c) { return { title: c.title, wordCount: c.body ? c.body.split(\/\\s+\/).length : 0 }; }),\n    isbn: document.getElementById('book-isbn').value || '',\n    genre: document.getElementById('book-genre').value || '',\n    dedication: document.getElementById('book-dedication').value || '',\n    words: words,\n    savedAt: new Date().toISOString()\n  };\n  localStorage.setItem('twain_active_manuscript', JSON.stringify(saveData));\n  setStatus('Manuscript saved.', 'ok');\n  addMsg('Manuscript saved. Ready for export or further editing.', false);\n}\n\nfunction exportHTML() {\n  if (!M.formattedHTML || M.formattedHTML.indexOf('title-page') === -1) {\n    setStatus('Create your manuscript first.', 'err');\n    return;\n  }\n  var title = document.getElementById('book-title').value || M.title || 'manuscript';\n  var author = document.getElementById('book-author').value || M.author || 'Author';\n\n  var fullHTML = '<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><title>' + escHtml(title) + '<\/title>' +\n    '<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Crimson+Text:ital,wght@0,400;0,600;1,400&#038;family=Cinzel:wght@700;900&#038;display=swap\" rel=\"stylesheet\">' +\n    '<style>' +\n    '@page{size:6in 9in;margin-top:0.75in;margin-bottom:0.75in;}' +\n    '@page:left{margin-left:0.875in;margin-right:0.5in;}' +\n    '@page:right{margin-left:0.5in;margin-right:0.875in;}' +\n    'body{font-family:\"Crimson Text\",serif;font-size:11pt;line-height:1.5;margin:0;padding:0;}' +\n    'p{margin:0 0 0.6em 0;text-indent:0.3in;}p:first-of-type{text-indent:0;}' +\n    'h1{font-family:\"Cinzel\",serif;font-size:18pt;font-weight:700;text-align:center;margin:0.5in 0 0.4in 0;page-break-after:avoid;}' +\n    'h2{font-family:\"Cinzel\",serif;font-size:14pt;font-weight:700;text-align:center;margin:0.3in 0;}' +\n    'a{color:inherit;text-decoration:none;}' +\n    '.title-page{page-break-after:always;text-align:center;padding-top:2in;}' +\n    '.title-page h1{font-size:24pt;page-break-before:avoid;}' +\n    '.copyright-page{page-break-after:always;font-size:9pt;line-height:1.4;color:#555;}' +\n    '.dedication{page-break-after:always;text-align:center;padding-top:2in;font-style:italic;font-size:12pt;}' +\n    '.toc-section{page-break-after:always;}' +\n    '.foreword{page-break-after:always;}' +\n    '.toc-entry{display:flex;justify-content:space-between;border-bottom:1px dotted #ccc;padding:4px 0;font-size:10pt;}' +\n    '.chapter{page-break-before:always;}' +\n    '.rebellion-brand{background:#f0ece4;border-left:3px solid #c9a84c;padding:10px 14px;margin:14px 0;font-size:9pt;}' +\n    '@media print{.chapter{page-break-before:always;}.title-page,.copyright-page,.dedication,.toc-section,.foreword{page-break-after:always;}}' +\n    '<\/style><\/head><body>' + M.formattedHTML + '<\/body><\/html>';\n\n  var blob = new Blob([fullHTML], { type: 'text\/html' });\n  var a = document.createElement('a');\n  a.href = URL.createObjectURL(blob);\n  a.download = 'TWAIN-' + title.replace(\/\\s+\/g, '-') + '.html';\n  a.click();\n  setStatus('HTML exported. Open in Chrome \u2192 Print \u2192 Save as PDF. Paper: 6\"x9\", Margins: None.', 'ok');\n  addMsg('HTML exported with KDP-correct formatting.<br><br><strong>To create your PDF:<\/strong><br>1. Open the HTML file in Chrome<br>2. File \u2192 Print (Ctrl+P)<br>3. Destination \u2192 Save as PDF<br>4. More settings \u2192 Paper size \u2192 Custom: 6in \u00d7 9in<br>5. Margins \u2192 None<br>6. Save<br><br>That PDF goes directly to KDP.', false);\n}\n\nfunction exportEpubBundle() {\n  var title = document.getElementById('book-title').value || M.title || 'Untitled';\n  var author = document.getElementById('book-author').value || M.author || 'Author';\n  if (!M.formattedHTML) { setStatus('Create your manuscript first.', 'err'); return; }\n\n  var opf = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<package xmlns=\"http:\/\/www.idpf.org\/2007\/opf\" version=\"3.0\">\\n  <metadata xmlns:dc=\"http:\/\/purl.org\/dc\/elements\/1.1\/\"><dc:title>' + title + '<\/dc:title><dc:creator>' + author + '<\/dc:creator><dc:language>en<\/dc:language><dc:publisher>T.W.A.I.N. Studio<\/dc:publisher><\/metadata>\\n  <manifest><item id=\"content\" href=\"content.xhtml\" media-type=\"application\/xhtml+xml\"\/><\/manifest>\\n  <spine><itemref idref=\"content\"\/><\/spine>\\n<\/package>';\n  var xhtml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<!DOCTYPE html>\\n<html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\" xml:lang=\"en\">\\n<head><meta charset=\"UTF-8\"\/><title>' + title + '<\/title><\/head>\\n<body>\\n' + M.formattedHTML + '\\n<\/body>\\n<\/html>';\n  var bundle = '<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><title>ePub Bundle: ' + title + '<\/title><style>body{font-family:monospace;background:#0a1628;color:#f0e6c8;padding:30px;}h1{color:#c9a84c;}h2{color:#8a9ab5;font-size:14px;margin-top:20px;}pre{background:#0d1e35;border:1px solid rgba(201,168,76,0.2);padding:16px;overflow:auto;font-size:11px;}.inst{background:rgba(29,158,117,0.1);border-left:3px solid #1D9E75;padding:14px;margin:16px 0;font-size:13px;line-height:1.7;}<\/style><\/head><body>' +\n    '<h1>T.W.A.I.N. ePub Bundle \u2014 ' + title + '<\/h1><div class=\"inst\"><strong>To build your ePub:<\/strong><br>1. Create a folder, save each file into it<br>2. Linux\/Mac: <code>zip -X book.epub mimetype && zip -rg book.epub META-INF content.opf content.xhtml<\/code><br>3. Windows: Use Calibre \u2014 Add Books \u2192 Convert to ePub<\/div>' +\n    '<h2>content.opf<\/h2><pre>' + opf.replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;') + '<\/pre>' +\n    '<h2>content.xhtml (preview)<\/h2><pre>' + xhtml.substring(0,1500).replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;') + '...<\/pre>' +\n    '<\/body><\/html>';\n  var blob = new Blob([bundle], { type: 'text\/html' });\n  var a = document.createElement('a');\n  a.href = URL.createObjectURL(blob);\n  a.download = 'TWAIN-ePub-Bundle-' + title.replace(\/\\s+\/g, '-') + '.html';\n  a.click();\n  setStatus('ePub bundle exported with instructions.', 'ok');\n}\n\nfunction clearAll() {\n  if (!confirm('Clear all manuscript data?')) return;\n  M.rawText = ''; M.formattedHTML = ''; M.chapters = []; M.forewordHTML = '';\n  document.getElementById('ms-raw').value = '';\n  document.getElementById('manuscript-preview').innerHTML = '';\n  document.getElementById('ch-list').innerHTML = '<div style=\"font-family:Oswald,sans-serif;font-size:9px;color:var(--slate);letter-spacing:.06em;\">Create manuscript to see chapters<\/div>';\n  document.getElementById('btn-foreword').disabled = true;\n  document.getElementById('btn-review').disabled = true;\n  updateStats();\n  setStatus('Cleared.', '');\n}\n\n\/\/ ================================================================\n\/\/ UTILITY FUNCTIONS\n\/\/ ================================================================\nfunction showTab(name) {\n  var panels = ['preview', 'raw'];\n  panels.forEach(function(p) {\n    var panel = document.getElementById('panel-' + p);\n    var tab = document.getElementById('tab-' + p);\n    if (panel) panel.style.display = p === name ? 'block' : 'none';\n    if (tab) tab.className = 'ptab' + (p === name ? ' active' : '');\n  });\n}\n\nfunction scrollToChapter(idx) {\n  showTab('preview');\n  var preview = document.getElementById('manuscript-preview');\n  var chapterEl = preview.querySelector('#ch' + idx);\n  if (chapterEl) {\n    chapterEl.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    chapterEl.style.backgroundColor = 'rgba(201,168,76,0.1)';\n    setTimeout(function() { chapterEl.style.backgroundColor = ''; }, 1500);\n  }\n  setStatus('Chapter ' + (idx + 1) + ' \u2014 ' + (M.chapters[idx] ? M.chapters[idx].title : ''), 'info');\n}\n\nfunction updateStats() {\n  var raw = document.getElementById('ms-raw').value || M.rawText || '';\n  var words = raw.trim() ? raw.trim().split(\/\\s+\/).length : 0;\n  document.getElementById('stat-words').textContent = words.toLocaleString();\n  document.getElementById('stat-chapters').textContent = M.chapters.length;\n  var title = document.getElementById('book-title').value || M.title || 'None';\n  document.getElementById('stat-project').textContent = title.substring(0, 20);\n}\n\nfunction escHtml(str) {\n  if (!str) return '';\n  return str.replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;').replace(\/\"\/g,'&quot;');\n}\n\nfunction setProgress(pct, label) {\n  document.getElementById('progress-fill').style.width = pct + '%';\n  document.getElementById('progress-lbl').textContent = label;\n}\n\nfunction showProgress(show) {\n  document.getElementById('progress-wrap').style.display = show ? 'block' : 'none';\n}\n\nfunction setStatus(msg, type) {\n  var el = document.getElementById('status-msg');\n  el.textContent = msg;\n  el.className = 'status-msg' + (type ? ' ' + type : '');\n}\n\nfunction setLight(state, name) {\n  var el = document.getElementById('eng-light');\n  if (el) el.className = 'eng-light ' + state;\n  var nameEl = document.getElementById('eng-name');\n  if (nameEl) nameEl.textContent = name || '';\n  var statusEl = document.getElementById('eng-status');\n  if (statusEl) statusEl.textContent = state === 'busy' ? 'Processing...' : state === 'error' ? 'Check key' : 'Ready';\n}\n\nfunction addMsg(text, isUser, variant) {\n  var chat = document.getElementById('chat');\n  var div = document.createElement('div');\n  div.className = isUser ? 'msg-user' : (variant === 'purple' ? 'msg-aa purple-msg' : 'msg-aa');\n  div.innerHTML = String(text).replace(\/\\n\/g, '<br>');\n  chat.appendChild(div);\n  chat.scrollTop = chat.scrollHeight;\n}\n\nfunction addThinking() {\n  var chat = document.getElementById('chat');\n  var div = document.createElement('div');\n  div.className = 'msg-think'; div.id = 'think-el';\n  div.innerHTML = '<span><\/span><span><\/span><span><\/span>';\n  chat.appendChild(div); chat.scrollTop = chat.scrollHeight;\n}\n\nfunction removeThinking() {\n  var el = document.getElementById('think-el');\n  if (el) el.remove();\n}\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<div class=\"wp-block-cover alignfull is-light has-contrast-color has-text-color has-link-color wp-elements-06b6d9eb2b71ffc31ed78382d3f05070\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--60);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--50)\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-base-background-color has-background-dim-100 has-background-dim\"><\/span><div class=\"wp-block-cover__inner-container has-global-padding is-layout-constrained wp-container-core-cover-is-layout-873ee6b1 wp-block-cover-is-layout-constrained\">\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-7ee84d44 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:65%\">\n<div class=\"wp-block-group is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-353c4f5a wp-block-group-is-layout-flex\">\n<h2 class=\"wp-block-heading has-text-align-left\" style=\"font-size:clamp(8.042rem, 8.042rem + ((1vw - 0.2rem) * 21.895), 22rem);font-style:normal;font-weight:300;letter-spacing:-0.03em;line-height:1.4\">Hey,<\/h2>\n\n\n\n<p class=\"is-style-text-subtitle is-style-text-subtitle--1\">My name is Nora Winslow Keene, and I\u2019m a committed public interest attorney. Living in Denver, Colorado, I\u2019ve spent years championing the rights of underrepresented workers. A graduate of Stanford University, I played a key role in securing critical protections for agricultural laborers, ensuring better wages and access to healthcare. My work has focused on advocating for environmental justice and improving the quality of life for rural communities. Every case I take on is driven by the belief that everyone deserves dignity and fair treatment in the workplace.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:35%\">\n<div class=\"wp-block-group is-vertical is-content-justification-stretch is-nowrap is-layout-flex wp-container-core-group-is-layout-73b0033c wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/twainstudio.dev\/wp-content\/themes\/twentytwentyfive\/assets\/images\/woman-splashing-water.webp\" alt=\"Woman on beach, splashing water.\" style=\"aspect-ratio:3\/4;object-fit:cover\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-right has-x-large-font-size\" style=\"line-height:1.2\"><a href=\"#\">Instagram<\/a><br><a href=\"#\">LinkedIn<\/a><br><a href=\"#\">Now<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>T.W.A.I.N. Manuscript Creator \u2014 KDP 6&#8243;x9&#8243; Formatting T.W.A.I.N. MANUSCRIPT CREATOR KDP 6&#8243;x9&#8243; Formatting Words 0 Chapters 0 Project None Load from Genesis Export HTML \u2192 PDF Save 01 Genesis \u203a 02 Manuscript Creator \u203a 03 Pulse \u203a 04 Cover Studio Rebellion Command Ecosystem Groq API Key Powers: Foreword Generation \u00b7 Chapter Review Test Connection Book [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_themeisle_gutenberg_block_has_review":false,"footnotes":""},"class_list":["post-33","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/twainstudio.dev\/index.php?rest_route=\/wp\/v2\/pages\/33","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/twainstudio.dev\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/twainstudio.dev\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/twainstudio.dev\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/twainstudio.dev\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=33"}],"version-history":[{"count":1,"href":"https:\/\/twainstudio.dev\/index.php?rest_route=\/wp\/v2\/pages\/33\/revisions"}],"predecessor-version":[{"id":34,"href":"https:\/\/twainstudio.dev\/index.php?rest_route=\/wp\/v2\/pages\/33\/revisions\/34"}],"wp:attachment":[{"href":"https:\/\/twainstudio.dev\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=33"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}