Rich solo composer: WYSIWYG editor, sanitized HTML bodies, media uploads, CTA labels

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
martbost
2026-09-05 15:38:46 -05:00
parent f6a3befe09
commit 2cc2855488
8 changed files with 150 additions and 16 deletions
+31 -7
View File
@@ -4,7 +4,7 @@
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Member area | InstantAdPay</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sora:wght@600;700;800&display=swap">
<link rel="stylesheet" href="/assets/site.css?v=20260905n">
<link rel="stylesheet" href="/assets/site.css?v=20260905o">
</head>
<body class="bo-body">
@@ -222,7 +222,30 @@
<p id="cImageRow"><input id="cImage" placeholder="Image URL (banner/login ads)" style="width:100%"></p>
<p id="cTitleRow" hidden><input id="cTitle" placeholder="Headline (max 60)" style="width:100%"></p>
<p id="cBodyRow" hidden><input id="cBody" placeholder="Ad text (max 140)" style="width:100%"></p>
<p id="cSoloRow" hidden><textarea id="cSoloBody" placeholder="Your message (40–1000 characters). Write it like an email worth reading." rows="7" style="width:100%"></textarea></p>
<div id="cSoloRow" hidden>
<div class="ed-bar" aria-label="Formatting">
<button type="button" data-cmd="bold" title="Bold"><b>B</b></button>
<button type="button" data-cmd="italic" title="Italic"><i>I</i></button>
<button type="button" data-cmd="underline" title="Underline"><u>U</u></button>
<button type="button" data-block="h3" title="Heading">Heading</button>
<button type="button" data-block="p" title="Normal text">Normal</button>
<button type="button" data-cmd="insertUnorderedList" title="Bullet list">• List</button>
<button type="button" data-cmd="insertOrderedList" title="Numbered list">1. List</button>
<button type="button" id="edLinkBtn" title="Insert link">Link</button>
<button type="button" data-cmd="removeFormat" title="Clear formatting">Clear</button>
</div>
<div id="cSoloEd" class="ed-body" contenteditable="true"
data-ph="Write it like an email worth reading. Bold the promise, list the proof, link the receipts."></div>
<p style="margin:10px 0 0"><input id="cCtaLabel" maxlength="30" style="width:100%"
placeholder="Call-to-action button label (default: Learn more) — the button opens your target URL"></p>
<p class="ed-media">
<input type="file" id="cSoloFile" accept="image/png,image/jpeg,image/webp,image/gif,video/mp4,video/webm" hidden>
<button type="button" class="btn small sec" id="edAttachBtn">Attach image or video</button>
<span id="edMediaInfo" class="small muted"></span>
<button type="button" class="btn small sec" id="edMediaRemove" hidden>Remove</button>
</p>
<div id="edMediaPrev" hidden style="margin-top:8px"></div>
</div>
<p class="small muted" id="cSoloHint" hidden></p>
<button class="btn" id="createCampBtn">Launch campaign</button>
</div>
@@ -239,7 +262,8 @@
<p><a href="#" id="ibBack">← Back to inbox</a></p>
<h3 id="ibSubject"></h3>
<p class="small muted" id="ibMeta"></p>
<div id="ibBody" class="promo-block" style="white-space:pre-wrap"></div>
<div id="ibMedia" hidden style="margin:12px 0"></div>
<div id="ibBody" class="promo-block ib-rich"></div>
<p style="margin-top:14px">
<a class="btn" id="ibVisit" target="_blank" rel="noopener nofollow">Visit the advertiser</a>
<button class="btn sec" id="ibClaimBtn" type="button" hidden>…</button></p>
@@ -355,9 +379,9 @@
</div>
</div>
<script src="/assets/common.js?v=20260905n"></script>
<script src="/assets/wallet.js?v=20260905n"></script>
<script src="/assets/my.js?v=20260905n"></script>
<script src="/assets/chat.js?v=20260905n"></script>
<script src="/assets/common.js?v=20260905o"></script>
<script src="/assets/wallet.js?v=20260905o"></script>
<script src="/assets/my.js?v=20260905o"></script>
<script src="/assets/chat.js?v=20260905o"></script>
</body>
</html>