<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Best Free AI Tools &#8211; AI Everyday Tools</title>
	<atom:link href="https://aieverydaytools.com/category/best-free-ai-tools/feed/" rel="self" type="application/rss+xml" />
	<link>https://aieverydaytools.com</link>
	<description>AI Everyday Tools</description>
	<lastBuildDate>Thu, 07 May 2026 09:26:06 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://aieverydaytools.com/wp-content/uploads/2025/06/cropped-Favicon-Logo-04-32x32.png</url>
	<title>Best Free AI Tools &#8211; AI Everyday Tools</title>
	<link>https://aieverydaytools.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Content Optimization Score Tool</title>
		<link>https://aieverydaytools.com/content-optimization-score-tool/</link>
		
		<dc:creator><![CDATA[Daniel]]></dc:creator>
		<pubDate>Fri, 13 Feb 2026 14:30:18 +0000</pubDate>
				<category><![CDATA[Best Free AI Tools]]></category>
		<guid isPermaLink="false">https://aieverydaytools.com/?p=2629</guid>

					<description><![CDATA[<p>The Content Optimization Score Tool helps you quickly evaluate and improve your article before publishing. Paste your draft, run the analysis, and get a clear...</p>
<p>The post <a rel="nofollow" href="https://aieverydaytools.com/content-optimization-score-tool/">Content Optimization Score Tool</a> appeared first on <a rel="nofollow" href="https://aieverydaytools.com">AI Everyday Tools</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The Content Optimization Score Tool helps you quickly evaluate and improve your article before publishing. </p>



<p class="wp-block-paragraph">Paste your draft, run the analysis, and get a clear SEO score with prioritized, actionable fixes.<br>It focuses on structure, coverage, and readability — without overwhelming you with unnecessary metrics.</p>


<div class="aet-cos-v50" data-aet-tool="cos-v50">
  <style>
    .aet-cos-v50{
      --bg:#ffffff;
      --panel:#ffffff;
      --muted:#6b7280;
      --text:#111827;
      --line:rgba(17,24,39,.10);
      --shadow:0 10px 30px rgba(17,24,39,.08);
      --radius:16px;
      --radius2:12px;
      --btn:#111827;
      --btnText:#ffffff;
      --btn2:#ffffff;
      --btn2Text:#111827;
      font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial;
      color:var(--text);
      max-width:1120px;
      margin:28px auto;
    }
    .aet-cos-v50 *{ box-sizing:border-box; }
    .aet-cos-v50 button,
    .aet-cos-v50 input,
    .aet-cos-v50 textarea{ font: inherit; }
    .aet-cos-v50 [hidden]{ display:none !important; }

    .aet-wrap{
      display:grid;
      grid-template-columns: 1.25fr .75fr;
      gap:16px;
      align-items:start;
    }
    @media (max-width: 920px){ .aet-wrap{ grid-template-columns:1fr; } }

    .aet-card{
      background:var(--panel);
      border:1px solid var(--line);
      border-radius:var(--radius);
      box-shadow:var(--shadow);
      padding:18px;
    }
    .aet-title{
      display:flex;
      align-items:flex-start;
      justify-content:space-between;
      gap:12px;
      margin-bottom:10px;
    }
    .aet-title h2{
      margin:0;
      font-size:22px;
      line-height:1.2;
      letter-spacing:-.02em;
    }
    .aet-sub{
      margin:6px 0 0 0;
      color:var(--muted);
      font-size:13px;
      line-height:1.35;
    }
    .aet-pill{
      display:inline-flex;
      align-items:center;
      justify-content:center;
      padding:6px 10px;
      border-radius:999px;
      border:1px solid var(--line);
      background:rgba(17,24,39,.03);
      font-size:12px;
      font-weight:800;
      white-space:nowrap;
    }

    .aet-grid2{
      display:grid;
      grid-template-columns:1fr 1fr;
      gap:12px;
      margin-top:14px;
    }
    @media (max-width: 640px){ .aet-grid2{ grid-template-columns:1fr; } }

    .aet-field label{
      display:block;
      font-size:12px;
      font-weight:800;
      margin-bottom:6px;
    }
    .aet-field .aet-help{
      margin-top:6px;
      font-size:12px;
      color:var(--muted);
      line-height:1.3;
    }

    .aet-textarea{
      width:100%;
      border-radius:var(--radius2);
      border:1px solid var(--line);
      padding:10px 12px;
      font-size:14px;
      outline:none;
      background:#fff;
      box-shadow:0 1px 0 rgba(17,24,39,.03) inset;
      resize:vertical;
      line-height:1.4;
    }
    .aet-textarea.aet-key{ min-height:70px; }
    .aet-textarea.aet-ttl{ min-height:86px; }
    .aet-textarea.aet-meta{ min-height:140px; }

    .aet-editorWrap{
      margin-top:8px;
      border:1px solid var(--line);
      border-radius:var(--radius);
      overflow:hidden;
      background:#fff;
    }
    .aet-editorTop{
      display:flex;
      gap:10px;
      align-items:center;
      justify-content:space-between;
      padding:10px 12px;
      background:rgba(17,24,39,.02);
      border-bottom:1px solid var(--line);
      flex-wrap:wrap;
    }
    .aet-editorTop .aet-tip{
      font-size:12px;
      color:var(--muted);
      line-height:1.3;
    }

    .aet-btn{
      -webkit-appearance:none;
      appearance:none;
      display:inline-flex;
      align-items:center;
      justify-content:center;
      gap:8px;
      padding:10px 14px;
      min-height:40px;
      min-width:110px;
      border-radius:12px;
      border:1px solid var(--line);
      background:var(--btn2);
      color:var(--btn2Text);
      font-weight:900;
      font-size:13px;
      line-height:1;
      cursor:pointer;
      user-select:none;
      box-shadow:none;
      opacity:1;
      text-decoration:none;
    }
    .aet-btn:focus{ outline:2px solid rgba(17,24,39,.25); outline-offset:2px; }
    .aet-btn:active{ transform:translateY(1px); }
    .aet-btn.primary{
      background:var(--btn);
      border-color:var(--btn);
      color:var(--btnText);
    }
    .aet-btn.small{
      padding:8px 10px;
      min-height:34px;
      min-width:78px;
      font-size:12px;
      border-radius:10px;
    }
    .aet-btn.ghost{ background:transparent; min-width:72px; }

    /* Kadence/WP overrides */
    .aet-cos-v50 .aet-btn:hover,
    .aet-cos-v50 .aet-btn:focus,
    .aet-cos-v50 .aet-btn:focus-visible{
      background: var(--btn2) !important;
      border-color: var(--line) !important;
      color: var(--btn2Text) !important;
      box-shadow: none !important;
    }
    .aet-cos-v50 .aet-btn.primary:hover,
    .aet-cos-v50 .aet-btn.primary:focus,
    .aet-cos-v50 .aet-btn.primary:focus-visible{
      background: var(--btn) !important;
      border-color: var(--btn) !important;
      color: var(--btnText) !important;
    }
    .aet-cos-v50 .aet-btn.ghost:hover,
    .aet-cos-v50 .aet-btn.ghost:focus,
    .aet-cos-v50 .aet-btn.ghost:focus-visible{
      background: transparent !important;
    }

    .aet-btnRow{
      display:flex;
      gap:10px;
      flex-wrap:wrap;
      margin-top:12px;
    }

    .aet-editor{
      padding:14px;
      min-height:340px;
      max-height:560px;
      overflow:auto;
      outline:none;
    }
    .aet-editor:empty:before{
      content:"Paste from Word here… headings, lists, and tables are kept.";
      color:#9ca3af;
      font-size:14px;
    }
    .aet-editor h1, .aet-editor h2, .aet-editor h3{ margin:14px 0 8px; line-height:1.2; }
    .aet-editor p{ margin:10px 0; line-height:1.55; }
    .aet-editor ul, .aet-editor ol{ margin:10px 0 10px 22px; }
    .aet-editor table{
      border-collapse:collapse;
      width:100%;
      margin:12px 0;
      font-size:14px;
    }
    .aet-editor th, .aet-editor td{
      border:1px solid rgba(17,24,39,.18);
      padding:8px 10px;
      vertical-align:top;
    }
    .aet-editor th{
      background:rgba(17,24,39,.03);
      font-weight:800;
    }

    .aet-scoreCard{ position:sticky; top:16px; }
    @media (max-width: 920px){ .aet-scoreCard{ position:relative; top:0; } }

    .aet-scoreTop{
      display:flex;
      align-items:flex-start;
      justify-content:space-between;
      gap:10px;
      margin-bottom:10px;
    }
    .aet-scoreTop .aet-label{
      font-size:12px;
      font-weight:900;
      color:var(--muted);
      letter-spacing:.02em;
      text-transform:uppercase;
    }
    .aet-score{
      font-size:54px;
      font-weight:950;
      letter-spacing:-.04em;
      margin:2px 0 0;
      line-height:1;
    }
    .aet-status{ margin-top:8px; }
    .aet-status .aet-badge{
      display:inline-flex;
      padding:6px 10px;
      border-radius:999px;
      border:1px solid var(--line);
      font-size:12px;
      font-weight:900;
      background:rgba(17,24,39,.03);
      white-space:nowrap;
    }

    .aet-miniGrid{
      display:grid;
      grid-template-columns:repeat(3, minmax(0,1fr));
      gap:10px;
      margin-top:12px;
    }
    .aet-mini{
      border:1px solid var(--line);
      border-radius:14px;
      padding:10px;
      background:#fff;
      min-width:0;
    }
    .aet-mini .k{
      font-size:12px;
      color:var(--muted);
      font-weight:800;
      line-height:1.2;
      white-space:normal;
      word-break:break-word;
      hyphens:auto;
      margin-bottom:6px;
    }
    .aet-mini .v{
      font-size:18px;
      font-weight:950;
      line-height:1.1;
    }

    .aet-divider{ height:1px; background:var(--line); margin:14px 0; }

    .aet-fixes h3, .aet-qs h3{
      margin:0 0 8px 0;
      font-size:14px;
      letter-spacing:-.01em;
    }
    .aet-fix{
      border:1px solid var(--line);
      border-radius:14px;
      padding:12px;
      margin-top:10px;
      background:#fff;
    }
    .aet-fixHead{
      display:flex;
      justify-content:space-between;
      gap:10px;
      align-items:flex-start;
    }
    .aet-fixTitle{
      font-weight:950;
      font-size:13px;
      line-height:1.25;
      margin:0;
    }
    .aet-sev{
      border:1px solid var(--line);
      border-radius:999px;
      padding:4px 9px;
      font-size:11px;
      font-weight:950;
      white-space:nowrap;
      background:rgba(17,24,39,.03);
    }
    .aet-fixBody{
      margin-top:6px;
      font-size:13px;
      color:#374151;
      line-height:1.35;
    }
    .aet-fixWhy{
      margin-top:6px;
      font-size:12px;
      color:var(--muted);
      line-height:1.35;
    }
    .aet-fixActions{
      margin-top:10px;
      display:flex;
      gap:8px;
      flex-wrap:wrap;
    }

    .aet-allToggle{
      display:flex;
      align-items:center;
      justify-content:space-between;
      gap:10px;
      margin-top:10px;
      flex-wrap:wrap;
    }
    .aet-allPanel{ margin-top:10px; }

    .aet-qsGrid{ display:grid; grid-template-columns:1fr; gap:10px; }
    .aet-qsBox{
      border:1px solid var(--line);
      border-radius:14px;
      padding:12px;
      background:#fff;
    }
    .aet-qsBox .t{ font-weight:950; font-size:13px; margin:0 0 6px 0; }
    .aet-qsBox .d{ font-size:12px; color:var(--muted); line-height:1.35; margin:0 0 10px 0; }

    .aet-foot{ margin-top:10px; font-size:12px; color:var(--muted); line-height:1.35; }
    .aet-disclaimer{
      margin-top:12px;
      padding-top:10px;
      border-top:1px solid var(--line);
      font-size:12px;
      color:var(--muted);
      line-height:1.35;
    }
    .aet-disclaimer b{ color:#374151; }

    .aet-toast{
      position:fixed;
      left:50%;
      bottom:24px;
      transform:translateX(-50%);
      background:#111827;
      color:#fff;
      padding:10px 12px;
      border-radius:999px;
      font-size:12px;
      font-weight:900;
      box-shadow:0 10px 30px rgba(0,0,0,.25);
      opacity:0;
      pointer-events:none;
      transition:opacity .18s ease;
      z-index:99999;
    }
    .aet-toast.show{ opacity:1; }
  </style>

  <div class="aet-wrap">
    <!-- LEFT -->
    <div class="aet-card">
      <div class="aet-title">
        <div>
          <h2>Content Optimization Score Tool</h2>
          <p class="aet-sub">Paste your draft (Word supported) → get a practical score + <b>Top 3 fixes</b>. “Show all issues” appears only if more exist.</p>
        </div>
        <span class="aet-pill">Lean Pro</span>
      </div>

      <div class="aet-grid2">
        <div class="aet-field">
          <label>Focus Keyword (optional)</label>
          <textarea class="aet-textarea aet-key" data-aet="keyword" placeholder='e.g., "Is Janitor AI Safe"'></textarea>
          <div class="aet-help">If empty, keyword checks are skipped.</div>
        </div>
        <div class="aet-field">
          <label>Title (optional)</label>
          <textarea class="aet-textarea aet-ttl" data-aet="title" placeholder="Paste your post title…"></textarea>
          <div class="aet-help">We check length + keyword placement (if provided).</div>
        </div>
      </div>

      <div class="aet-field" style="margin-top:12px;">
        <label>Meta Description (optional)</label>
        <textarea class="aet-textarea aet-meta" data-aet="meta" placeholder="Paste your meta description…"></textarea>
        <div class="aet-help">We check length + keyword placement (if provided).</div>
      </div>

      <!-- NEW: Content label like other fields -->
      <div class="aet-field" style="margin-top:12px;">
        <label>Content (paste from Word — formatting kept)</label>
        <div class="aet-help">Paste directly from Word. We keep headings, lists, and tables.</div>

        <div class="aet-editorWrap">
          <div class="aet-editorTop">
            <button class="aet-btn small" type="button" data-aet="clean">Clean Formatting</button>
            <div class="aet-tip">Tip: Paste directly from Word. We keep headings, lists, and tables.</div>
          </div>
          <div class="aet-editor" contenteditable="true" data-aet="editor"></div>
        </div>
      </div>

      <div class="aet-btnRow">
        <button class="aet-btn primary" type="button" data-aet="analyze">Analyze</button>
        <button class="aet-btn" type="button" data-aet="demo">Load Demo</button>
        <button class="aet-btn" type="button" data-aet="reset">Reset</button>
      </div>

      <div class="aet-divider"></div>

      <div class="aet-btnRow">
        <button class="aet-btn" type="button" data-aet="copySummary">Copy Summary</button>
        <button class="aet-btn" type="button" data-aet="exportMd">Export Markdown</button>
      </div>

      <!-- Disclaimer block (recommended) -->
      <div class="aet-disclaimer">
        <div><b>Disclaimer:</b> This tool provides heuristic SEO/content suggestions only and may be incomplete.</div>
        <div><b>Privacy:</b> No API calls. Your text stays in your browser.</div>
      </div>
    </div>

    <!-- RIGHT -->
    <div class="aet-card aet-scoreCard">
      <div class="aet-scoreTop">
        <div>
          <div class="aet-label">Overall Score</div>
          <div class="aet-score" data-aet="score">—</div>
          <div class="aet-status"><span class="aet-badge" data-aet="badge">Run analysis</span></div>
        </div>
        <button class="aet-btn small ghost" type="button" data-aet="analyze2">Run</button>
      </div>

      <div class="aet-miniGrid">
        <div class="aet-mini"><div class="k">Words</div><div class="v" data-aet="words">—</div></div>
        <div class="aet-mini"><div class="k">Headings</div><div class="v" data-aet="headings">—</div></div>
        <div class="aet-mini"><div class="k">Tables</div><div class="v" data-aet="tables">—</div></div>
      </div>

      <div class="aet-divider"></div>

      <div class="aet-fixes">
        <h3>Top 3 Next Fixes</h3>
        <div data-aet="fixesTop">
          <div class="aet-foot">Paste content and hit Analyze to get actionable fixes.</div>
        </div>
      </div>

      <div data-aet="allWrap" hidden>
        <div class="aet-allToggle">
          <button class="aet-btn small" type="button" data-aet="toggleAll">Show all issues</button>
          <span class="aet-foot" style="margin:0;">Only additional issues (no duplicates)</span>
        </div>
        <div class="aet-allPanel" data-aet="allPanel" hidden>
          <div data-aet="fixesAll"></div>
        </div>
      </div>

      <div class="aet-divider"></div>

      <div class="aet-qs">
        <h3>Quick Suggestions (Copy-Friendly)</h3>
        <div class="aet-qsGrid">
          <div class="aet-qsBox">
            <p class="t">Pros/Cons + Verdict Box</p>
            <p class="d">Reduces decision fatigue and keeps people scrolling.</p>
            <button class="aet-btn small" type="button" data-aet="copyProsCons">Copy</button>
          </div>
          <div class="aet-qsBox">
            <p class="t">FAQ Answer Helper</p>
            <p class="d">Adds topical coverage and increases time-on-page.</p>
            <button class="aet-btn small" type="button" data-aet="copyFAQ">Copy</button>
          </div>
          <div class="aet-qsBox">
            <p class="t">Internal Link Checklist</p>
            <p class="d">Simple plan to reduce bounce and improve navigation.</p>
            <button class="aet-btn small" type="button" data-aet="copyLinks">Copy</button>
          </div>
        </div>
      </div>
    </div>
  </div>

  <div class="aet-toast" data-aet="toast">Copied</div>

  <script>
  (function(){
    document.querySelectorAll('.aet-cos-v50[data-aet-tool="cos-v50"]').forEach((root) => {
      const $ = (sel) => root.querySelector(sel);

      const els = {
        keyword: $('[data-aet="keyword"]'),
        title: $('[data-aet="title"]'),
        meta: $('[data-aet="meta"]'),
        editor: $('[data-aet="editor"]'),
        clean: $('[data-aet="clean"]'),
        analyze: $('[data-aet="analyze"]'),
        analyze2: $('[data-aet="analyze2"]'),
        demo: $('[data-aet="demo"]'),
        reset: $('[data-aet="reset"]'),
        copySummary: $('[data-aet="copySummary"]'),
        exportMd: $('[data-aet="exportMd"]'),

        score: $('[data-aet="score"]'),
        badge: $('[data-aet="badge"]'),
        words: $('[data-aet="words"]'),
        headings: $('[data-aet="headings"]'),
        tables: $('[data-aet="tables"]'),

        fixesTop: $('[data-aet="fixesTop"]'),

        allWrap: $('[data-aet="allWrap"]'),
        toggleAll: $('[data-aet="toggleAll"]'),
        allPanel: $('[data-aet="allPanel"]'),
        fixesAll: $('[data-aet="fixesAll"]'),

        copyProsCons: $('[data-aet="copyProsCons"]'),
        copyFAQ: $('[data-aet="copyFAQ"]'),
        copyLinks: $('[data-aet="copyLinks"]'),
        toast: $('[data-aet="toast"]'),
      };

      let issues = [];
      let extraIssues = [];

      const sevRank = (sev) => (sev === "High" ? 0 : sev === "Medium" ? 1 : 2);

      function toast(msg){
        els.toast.textContent = msg || "Copied";
        els.toast.classList.add("show");
        setTimeout(()=>els.toast.classList.remove("show"), 900);
      }

      async function copyText(text, btn){
        try{
          await navigator.clipboard.writeText(text);
          toast("Copied");
          if(btn){
            const old = btn.textContent;
            btn.textContent = "Copied!";
            setTimeout(()=>btn.textContent = old, 900);
          }
        }catch(e){
          const ta = document.createElement("textarea");
          ta.value = text;
          ta.style.position="fixed";
          ta.style.left="-9999px";
          document.body.appendChild(ta);
          ta.select();
          document.execCommand("copy");
          ta.remove();
          toast("Copied");
        }
      }

      function normalizeNodeWhitespace(node){
        const walker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null);
        const nodes = [];
        while(walker.nextNode()) nodes.push(walker.currentNode);
        for(const t of nodes){
          t.nodeValue = (t.nodeValue || "")
            .replace(/\u00A0/g, " ")
            .replace(/[ \t]{2,}/g, " ");
        }
      }

      function sanitizePastedHtml(html){
        if(!html) return "";
        html = html
          .replace(/<!--[\s\S]*?-->/g, "")
          .replace(/<o:p[^>]*>[\s\S]*?<\/o:p>/gi, "")
          .replace(/<\/?o:[^>]*>/gi, "")
          .replace(/<\/?w:[^>]*>/gi, "")
          .replace(/<\/?v:[^>]*>/gi, "")
          .replace(/<\/?xml[^>]*>/gi, "")
          .replace(/<\?xml[\s\S]*?\?>/gi, "");

        html = html.replace(/<b(\s[^>]*)?>/gi, "<strong>").replace(/<\/b>/gi, "</strong>");
        html = html.replace(/<i(\s[^>]*)?>/gi, "<em>").replace(/<\/i>/gi, "</em>");

        const tpl = document.createElement("template");
        tpl.innerHTML = html;

        const allowed = new Set([
          "P","BR","H1","H2","H3","H4","H5","H6",
          "UL","OL","LI",
          "TABLE","THEAD","TBODY","TR","TH","TD",
          "A","STRONG","EM","BLOCKQUOTE"
        ]);
        const allowedAttrs = { A: new Set(["href"]) };

        (function walk(node){
          const children = Array.from(node.childNodes);
          for(const child of children){
            if(child.nodeType === 1){
              const tag = child.tagName.toUpperCase();

              for(const attr of Array.from(child.attributes)){
                const name = attr.name.toLowerCase();
                if(!(allowedAttrs[tag] && allowedAttrs[tag].has(name))){
                  child.removeAttribute(attr.name);
                }
              }
              if(tag === "A"){
                child.setAttribute("rel","noopener noreferrer");
                child.setAttribute("target","_blank");
              }
              if(!allowed.has(tag)){
                const frag = document.createDocumentFragment();
                while(child.firstChild) frag.appendChild(child.firstChild);
                child.replaceWith(frag);
                continue;
              }
              walk(child);
            }
          }
        })(tpl.content);

        normalizeNodeWhitespace(tpl.content);

        tpl.content.querySelectorAll("p").forEach(p => {
          const txt = (p.textContent || "").replace(/\u00A0/g," ").trim();
          if(!txt && p.querySelectorAll("table,ul,ol").length === 0) p.remove();
        });

        return tpl.innerHTML.trim();
      }

      function insertHtmlAtCaret(html){
        const sel = window.getSelection();
        if(!sel || sel.rangeCount === 0){
          els.editor.innerHTML += html;
          return;
        }
        const range = sel.getRangeAt(0);
        range.deleteContents();
        const tpl = document.createElement("template");
        tpl.innerHTML = html;
        const frag = tpl.content;
        const last = frag.lastChild;
        range.insertNode(frag);

        if(last){
          const r = document.createRange();
          r.setStartAfter(last);
          r.collapse(true);
          sel.removeAllRanges();
          sel.addRange(r);
        }
      }

      function escapePlain(text){
        const div = document.createElement("div");
        div.textContent = text || "";
        return div.innerHTML.replace(/\n/g, "<br>");
      }

      els.editor.addEventListener("paste", (e) => {
        e.preventDefault();
        const cd = e.clipboardData;
        const html = cd.getData("text/html");
        const text = cd.getData("text/plain");
        const clean = html ? sanitizePastedHtml(html) : escapePlain(text);
        insertHtmlAtCaret(clean);
      });

      function cleanFormatting(){
        els.editor.innerHTML = sanitizePastedHtml(els.editor.innerHTML || "");
        toast("Cleaned");
      }

      function getPlainText(){
        return (els.editor.innerText || "")
          .replace(/\u00A0/g," ")
          .replace(/\r\n/g,"\n")
          .trim();
      }

      function wordCountFromText(t){
        const words = (t || "")
          .replace(/https?:\/\/\S+/g," ")
          .replace(/[^\p{L}\p{N}’'\- ]+/gu, " ")
          .replace(/\s+/g," ")
          .trim()
          .split(" ")
          .filter(Boolean);
        return words.length;
      }

      function keywordCount(text, kw){
        if(!kw) return 0;
        const escaped = kw.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
        const re = new RegExp(`\\b${escaped}\\b`, "gi");
        const m = (text || "").match(re);
        return m ? m.length : 0;
      }

      function setBadge(score){
        if(score >= 85) els.badge.textContent = "SEO Ready";
        else if(score >= 70) els.badge.textContent = "Solid Draft";
        else els.badge.textContent = "Needs Work";
      }

      function buildFix(sev, title, why, fix, copy){
        return {sev, title, why, fix, copy};
      }

      function escapeHtml(s){
        const d = document.createElement("div");
        d.textContent = s || "";
        return d.innerHTML;
      }

      function renderFixList(targetEl, fixes){
        targetEl.innerHTML = "";
        if(!fixes.length){
          targetEl.innerHTML = `<div class="aet-foot">No additional issues beyond the Top 3.</div>`;
          return;
        }
        fixes.forEach((f) => {
          const div = document.createElement("div");
          div.className = "aet-fix";
          div.innerHTML = `
            <div class="aet-fixHead">
              <p class="aet-fixTitle"></p>
              <span class="aet-sev">${f.sev}</span>
            </div>
            <div class="aet-fixBody"><b>Fix:</b> ${escapeHtml(f.fix)}</div>
            <div class="aet-fixWhy"><b>Why:</b> ${escapeHtml(f.why)}</div>
            <div class="aet-fixActions">
              ${f.copy ? `<button class="aet-btn small" type="button" data-copy="1">Copy Fix Text</button>` : ``}
            </div>
          `;
          div.querySelector(".aet-fixTitle").textContent = f.title;
          const btn = div.querySelector('[data-copy="1"]');
          if(btn){
            btn.addEventListener("click", ()=>copyText(f.copy, btn));
          }
          targetEl.appendChild(div);
        });
      }

      function getProsConsTemplate(){
        return [
          "## Pros & Cons",
          "**Pros:**",
          "- ",
          "- ",
          "- ",
          "",
          "**Cons:**",
          "- ",
          "- ",
          "- ",
          "",
          "## Verdict",
          "If you want __, it’s worth trying. If you need __, skip it and use __ instead."
        ].join("\n");
      }

      function getFAQTemplate(keyword){
        const base = keyword && keyword.trim() ? keyword.trim() : "this tool";
        return [
          "## FAQ",
          `**Is ${base} safe to use?**`,
          "Short answer: __. Longer answer: __.",
          "",
          "**Does it store conversations?**",
          "__",
          "",
          "**Can you delete your data?**",
          "__",
          "",
          "**What are the biggest risks?**",
          "__",
          "",
          "**What are safer alternatives?**",
          "- __",
          "- __",
          "",
          "**Who should (and shouldn’t) use it?**",
          "__"
        ].join("\n");
      }

      function getInternalLinkChecklist(){
        return [
          "## Internal Link Checklist",
          "- 1 link in the intro (related guide)",
          "- 1 link in the middle (comparison/alternatives)",
          "- 1 link near the end (best related post/tool)",
          "",
          "Optional: Link to your own tools page (brief generator / prompt generator / optimization score)."
        ].join("\n");
      }

      function getHandsOnTemplate(){
        return [
          "## What I Noticed (Hands-On)",
          "- **Setup & first impression:** __",
          "- **Where it helped:** __",
          "- **Where it fell short:** __",
          "- **Who it’s best for:** __"
        ].join("\n");
      }

      function getComparisonTableTemplate(){
        return [
          "| Area | This Tool | Alternative |",
          "| --- | --- | --- |",
          "| Privacy | __ | __ |",
          "| Pricing | __ | __ |",
          "| Best for | __ | __ |",
          "| Downsides | __ | __ |"
        ].join("\n");
      }

      function detectFAQ(){
        const headings = Array.from(els.editor.querySelectorAll("h2,h3,h4"));
        const hasFaqHeading = headings.some(h => /\bfaq\b/i.test((h.textContent||"").trim()));
        const qHeadings = headings.filter(h => /\?\s*$/.test((h.textContent||"").trim()));
        if(hasFaqHeading) return true;
        if(qHeadings.length >= 3) return true;

        const strongs = Array.from(els.editor.querySelectorAll("p strong, p b")).map(s => (s.textContent||"").trim());
        const strongQs = strongs.filter(t => t.endsWith("?") && t.length >= 8);
        if(strongQs.length >= 3) return true;

        return false;
      }

      function detectProsConsVerdict(plainLower){
        const hasPros = /\bpros\b/.test(plainLower);
        const hasCons = /\bcons\b/.test(plainLower);
        const hasVerdict = /\bverdict\b/.test(plainLower) || /\bbottom line\b/.test(plainLower) || /\bconclusion\b/.test(plainLower) || /\bfinal answer\b/.test(plainLower);
        return { hasProsCons: (hasPros && hasCons), hasVerdict };
      }

      function detectPricing(plainLower){
        const headings = Array.from(els.editor.querySelectorAll("h2,h3,h4")).map(h => (h.textContent||"").toLowerCase());
        const hasPricingHeading = headings.some(t => t.includes("pricing") || t.includes("price") || t.includes("cost") || t.includes("plans"));
        const hasPricingLine = plainLower.includes("\npricing:") || plainLower.includes("pricing:") || plainLower.includes("price:") || plainLower.includes("cost:");
        return hasPricingHeading || hasPricingLine;
      }

      function detectAlternatives(plainLower){
        const headings = Array.from(els.editor.querySelectorAll("h2,h3,h4")).map(h => (h.textContent||"").toLowerCase());
        const hasAltHeading = headings.some(t => t.includes("alternatives") || t.includes("alternative") || t.includes("competitors") || t.includes("similar tools") || t.includes("other options"));
        const hasAltLabel = plainLower.includes("\nalternatives") || plainLower.includes("alternatives:");
        return hasAltHeading || hasAltLabel;
      }

      function detectInternalLinks(){
        const links = Array.from(els.editor.querySelectorAll('a[href]'))
          .map(a => (a.getAttribute('href')||"").trim())
          .filter(h => h && !h.startsWith("#"));
        return links.length;
      }

      function detectDuplicateParagraphs(){
        const ps = Array.from(els.editor.querySelectorAll("p"))
          .map(p => (p.textContent||"").replace(/\s+/g," ").trim())
          .filter(t => t.length >= 80);
        const map = new Map();
        for(const t of ps){
          map.set(t, (map.get(t)||0)+1);
        }
        let worst = 0;
        for(const v of map.values()) worst = Math.max(worst, v);
        return worst;
      }

      function detectLongParagraphs(){
        const ps = Array.from(els.editor.querySelectorAll("p"))
          .map(p => (p.textContent||"").replace(/\s+/g," ").trim())
          .filter(Boolean);
        return ps.filter(t => t.split(" ").length >= 120).length;
      }

      function detectLongSentences(plain){
        const sentences = (plain.replace(/\n+/g," ").match(/[^.!?]+[.!?]+/g) || []);
        return sentences.filter(s => s.trim().split(/\s+/).length > 30).length;
      }

      function detectTrustSignals(plainLower){
        const signals = [
          "i tested", "i tried", "my experience", "hands-on", "what i noticed",
          "i noticed", "in my test", "i used", "after testing", "screenshots", "i found"
        ];
        return signals.some(s => plainLower.includes(s));
      }

      function analyze(){
        const plain = getPlainText();
        if(plain.length < 120){
          alert("Please paste a bit more content (a few paragraphs) and try again.");
          return;
        }

        const kw = (els.keyword.value || "").trim();
        const title = (els.title.value || "").trim();
        const meta = (els.meta.value || "").trim();

        const wc = wordCountFromText(plain);
        const hCount = els.editor.querySelectorAll("h1,h2,h3,h4,h5,h6").length;
        const tCount = els.editor.querySelectorAll("table").length;

        els.words.textContent = wc.toString();
        els.headings.textContent = hCount.toString();
        els.tables.textContent = tCount.toString();

        let score = 0;

        if(wc >= 1200) score += 30;
        else if(wc >= 800) score += 24;
        else if(wc >= 500) score += 18;
        else score += 10;

        const h2Count = els.editor.querySelectorAll("h2").length;
        const hasH1 = els.editor.querySelectorAll("h1").length > 0;
        score += hasH1 ? 6 : 2;
        score += h2Count >= 4 ? 14 : (h2Count >= 2 ? 10 : (h2Count >= 1 ? 6 : 2));

        const hasList = els.editor.querySelectorAll("ul,ol").length > 0;
        score += hasList ? 5 : 0;
        score += (tCount >= 1) ? 4 : 0;

        if(title){
          const len = title.length;
          score += (len >= 45 && len <= 70) ? 8 : 4;
        } else score += 2;

        if(meta){
          const len = meta.length;
          score += (len >= 140 && len <= 165) ? 8 : 4;
        } else score += 2;

        const plainLower = plain.toLowerCase();

        if(kw){
          const kwLower = kw.toLowerCase();
          const kCount = keywordCount(plainLower, kwLower);
          const density = wc ? (kCount / wc) * 100 : 0;

          if(title.toLowerCase().includes(kwLower)) score += 4;
          const intro = plainLower.split(/\n+/).slice(0,4).join(" ");
          if(intro.includes(kwLower)) score += 4;
          if(density >= 0.4 && density <= 1.6) score += 7;
          else score += 3;
        } else {
          score += 10;
        }

        score = Math.max(0, Math.min(100, Math.round(score)));
        els.score.textContent = score.toString();
        setBadge(score);

        const newIssues = [];
        const { hasProsCons, hasVerdict } = detectProsConsVerdict(plainLower);
        const hasFAQ = detectFAQ();
        const hasPricing = detectPricing(plainLower);
        const hasAlternatives = detectAlternatives(plainLower);
        const linkCount = detectInternalLinks();
        const dupWorst = detectDuplicateParagraphs();
        const longParas = detectLongParagraphs();
        const longSents = detectLongSentences(plain);
        const trustSignals = detectTrustSignals(plainLower);

        if(!hasProsCons || !hasVerdict){
          newIssues.push(buildFix(
            "High",
            "Add a Pros/Cons + Verdict box",
            "It reduces decision fatigue and keeps readers scrolling.",
            "Add a short Pros/Cons list + a 2–3 sentence verdict near the top or before the end.",
            getProsConsTemplate()
          ));
        }

        if(!hasFAQ){
          newIssues.push(buildFix(
            "High",
            "Add an FAQ section (4–7 Q&As)",
            "FAQs expand topical coverage and increase time-on-page.",
            "Add 4–7 FAQs near the end with short, direct answers.",
            getFAQTemplate(kw)
          ));
        }

        if(tCount === 0){
          newIssues.push(buildFix(
            "Medium",
            "Add one comparison table",
            "Tables increase scannability and keep users engaged longer.",
            "Add a simple 3–5 row table comparing key areas.",
            getComparisonTableTemplate()
          ));
        }

        if(!hasPricing){
          newIssues.push(buildFix(
            "Medium",
            "Add a short Pricing section",
            "Most visitors scan price early. Adding it reduces bounce.",
            "Add a short Pricing block (even “varies / not public”).",
            "## Pricing\n- Pricing: (varies / not public / starts at $…)\n- Free plan/trial: __\n- Best for: __\n"
          ));
        }

        if(!hasAlternatives){
          newIssues.push(buildFix(
            "Medium",
            "Add an Alternatives section (3–5 options)",
            "Alternatives keep users on-site longer and support search intent.",
            "Add 3–5 alternatives with one-liners (best for + why).",
            "## Alternatives\n- Alternative 1 — best for __\n- Alternative 2 — best for __\n- Alternative 3 — best for __\n"
          ));
        }

        if(linkCount < 2){
          newIssues.push(buildFix(
            linkCount === 0 ? "Medium" : "Low",
            "Add internal links (2–5)",
            "Internal links reduce bounce and increase pageviews per session.",
            "Add 2–5 internal links at intro/middle/end.",
            getInternalLinkChecklist()
          ));
        }

        if(h2Count < 3){
          newIssues.push(buildFix(
            "Low",
            "Add more H2 sections (structure)",
            "More sections improve scannability and topical coverage.",
            "Aim for 4–7 H2 sections in long-form content.",
            "Add 2–3 more H2 headings:\n- H2: __\n- H2: __\n- H2: __\n"
          ));
        }

        if(longSents >= 3){
          newIssues.push(buildFix(
            "Low",
            "Too many very long sentences",
            "Long sentences cause skim-reading and drop-off.",
            "Split the longest 3–5 sentences into two sentences each.",
            "Rewrite rule:\n- One idea per sentence\n- 12–22 words often reads best\n- Use bullets for multi-part points\n"
          ));
        }

        if(longParas >= 2){
          newIssues.push(buildFix(
            "Low",
            "Paragraphs are too long (mobile readability)",
            "Shorter paragraphs increase engagement on mobile.",
            "Split long paragraphs into 2–3 smaller chunks.",
            "Format rule:\n- Keep paragraphs ~2–4 lines on mobile\n- Add a short lead sentence, then bullets\n"
          ));
        }

        if(!trustSignals){
          newIssues.push(buildFix(
            "Medium",
            "Add hands-on proof (trust signals)",
            "Readers trust content more when you include real usage notes.",
            "Add a “What I noticed” section with 3–5 bullet insights.",
            getHandsOnTemplate()
          ));
        }

        if(dupWorst >= 2){
          newIssues.push(buildFix(
            "High",
            "Duplicate paragraphs detected",
            "Repeated paragraphs look broken and can hurt trust + SEO quality signals.",
            "Remove repeated blocks and keep only one clean version.",
            "Fix checklist:\n- Delete duplicate paragraphs\n- Keep the best-written version\n- Re-run Analyze to confirm\n"
          ));
        }

        newIssues.sort((a,b)=> sevRank(a.sev) - sevRank(b.sev));

        issues = newIssues;
        const top3 = issues.slice(0,3);
        extraIssues = issues.length > 3 ? issues.slice(3) : [];

        renderFixList(els.fixesTop, top3);

        if(extraIssues.length > 0){
          els.allWrap.hidden = false;
          els.toggleAll.textContent = `Show all issues (+${extraIssues.length})`;
        } else {
          els.allWrap.hidden = true;
          els.allPanel.hidden = true;
          els.fixesAll.innerHTML = "";
        }

        if(!els.allPanel.hidden){
          renderFixList(els.fixesAll, extraIssues);
        }

        toast("Analyzed");
      }

      function loadDemo(){
        els.keyword.value = "Is Janitor AI Safe";
        els.title.value = "Is Janitor AI Safe to Use in 2026? Full Breakdown And Tips";
        els.meta.value = "Find out whether Janitor AI is safe in 2026, what data it stores, key privacy risks, and simple tips to use it more safely.";

        els.editor.innerHTML = `
          <h1>Is Janitor AI Safe to Use in 2026? Full Breakdown And Tips</h1>
          <p>Janitor AI is a chatbot that lets you talk to characters instead of one standard assistant.</p>
          <p>Is Janitor AI Safe in 2026? This guide breaks down privacy risks, data storage, third-party AI services, and more to help you decide if Janitor AI is safe.</p>
          <p>Is Janitor AI Safe in 2026? This guide breaks down privacy risks, data storage, third-party AI services, and more to help you decide if Janitor AI is safe.</p>
          <h2>What it does</h2>
          <p>It’s built around character chats and roleplay.</p>
          <h2>Key risks</h2>
          <ul>
            <li>Chats may be stored.</li>
            <li>2FA may not be available.</li>
          </ul>
        `;
        toast("Demo loaded");
      }

      function reset(){
        els.keyword.value = "";
        els.title.value = "";
        els.meta.value = "";
        els.editor.innerHTML = "";
        els.score.textContent = "—";
        els.badge.textContent = "Run analysis";
        els.words.textContent = "—";
        els.headings.textContent = "—";
        els.tables.textContent = "—";
        els.fixesTop.innerHTML = `<div class="aet-foot">Paste content and hit Analyze to get actionable fixes.</div>`;
        els.allWrap.hidden = true;
        els.allPanel.hidden = true;
        els.fixesAll.innerHTML = "";
        issues = [];
        extraIssues = [];
        toast("Reset");
      }

      function htmlToMarkdown(container){
        const clone = container.cloneNode(true);

        clone.querySelectorAll('a[href]').forEach(a=>{
          const href = a.getAttribute('href') || '';
          const text = (a.textContent || '').trim() || href;
          a.replaceWith(document.createTextNode(`[${text}](${href})`));
        });

        clone.querySelectorAll('table').forEach(tbl=>{
          const rows = Array.from(tbl.querySelectorAll('tr'));
          if(rows.length === 0) { tbl.remove(); return; }
          const grid = rows.map(r => Array.from(r.children).map(c => (c.textContent||'').trim().replace(/\s+/g,' ')));
          const header = grid[0];
          const body = grid.slice(1);
          const md = [];
          md.push(`| ${header.join(' | ')} |`);
          md.push(`| ${header.map(()=> '---').join(' | ')} |`);
          body.forEach(r => md.push(`| ${r.join(' | ')} |`));
          tbl.replaceWith(document.createTextNode("\n" + md.join("\n") + "\n"));
        });

        ['h1','h2','h3','h4','h5','h6'].forEach(tag=>{
          clone.querySelectorAll(tag).forEach(h=>{
            const level = parseInt(tag.substring(1),10);
            const text = (h.textContent||'').trim();
            h.replaceWith(document.createTextNode(`\n${"#".repeat(level)} ${text}\n`));
          });
        });

        clone.querySelectorAll('ul').forEach(ul=>{
          const items = Array.from(ul.querySelectorAll(':scope > li')).map(li => `- ${(li.textContent||'').trim()}`);
          ul.replaceWith(document.createTextNode("\n" + items.join("\n") + "\n"));
        });
        clone.querySelectorAll('ol').forEach(ol=>{
          const items = Array.from(ol.querySelectorAll(':scope > li')).map((li,i) => `${i+1}. ${(li.textContent||'').trim()}`);
          ol.replaceWith(document.createTextNode("\n" + items.join("\n") + "\n"));
        });

        clone.querySelectorAll('p').forEach(p=>{
          const t = (p.textContent||'').trim();
          p.replaceWith(document.createTextNode(t ? `\n${t}\n` : "\n"));
        });

        clone.querySelectorAll('strong').forEach(s=>{
          const t = (s.textContent||'').trim();
          s.replaceWith(document.createTextNode(t ? `**${t}**` : ""));
        });
        clone.querySelectorAll('em').forEach(e=>{
          const t = (e.textContent||'').trim();
          e.replaceWith(document.createTextNode(t ? `*${t}*` : ""));
        });

        clone.querySelectorAll('br').forEach(br=> br.replaceWith(document.createTextNode("\n")));

        return (clone.textContent || "").replace(/\n{3,}/g,"\n\n").trim();
      }

      function copySummary(){
        const plain = getPlainText();
        if(plain.length < 80){ alert("Paste content first."); return; }

        const score = els.score.textContent || "—";
        const words = els.words.textContent || "—";
        const headings = els.headings.textContent || "—";
        const tables = els.tables.textContent || "—";

        const list = (issues || []).map(x=>`- [${x.sev}] ${x.title}`).join("\n") || "- (run Analyze)";
        const txt = [
          `Content Optimization Summary`,
          `Score: ${score}`,
          `Words: ${words} | Headings: ${headings} | Tables: ${tables}`,
          ``,
          `Issues (prioritized):`,
          list
        ].join("\n");

        copyText(txt, els.copySummary);
      }

      function exportMarkdown(){
        const plain = getPlainText();
        if(plain.length < 80){ alert("Paste content first."); return; }
        const md = htmlToMarkdown(els.editor);
        copyText(md, els.exportMd);
      }

      function toggleAll(){
        const opening = els.allPanel.hidden === true;
        if(opening){
          els.allPanel.hidden = false;
          renderFixList(els.fixesAll, extraIssues);
          els.toggleAll.textContent = `Hide all issues (+${extraIssues.length})`;
        } else {
          els.allPanel.hidden = true;
          els.fixesAll.innerHTML = "";
          els.toggleAll.textContent = `Show all issues (+${extraIssues.length})`;
        }
      }

      // Bind
      els.clean.addEventListener("click", cleanFormatting);
      els.analyze.addEventListener("click", analyze);
      els.analyze2.addEventListener("click", analyze);
      els.demo.addEventListener("click", loadDemo);
      els.reset.addEventListener("click", reset);
      els.copySummary.addEventListener("click", copySummary);
      els.exportMd.addEventListener("click", exportMarkdown);
      els.toggleAll.addEventListener("click", toggleAll);

      els.copyProsCons.addEventListener("click", (e)=>copyText(getProsConsTemplate(), e.currentTarget));
      els.copyFAQ.addEventListener("click", (e)=>copyText(getFAQTemplate((els.keyword.value||"").trim()), e.currentTarget));
      els.copyLinks.addEventListener("click", (e)=>copyText(getInternalLinkChecklist(), e.currentTarget));

      root.addEventListener("keydown", (e)=>{
        if((e.ctrlKey || e.metaKey) && e.key === "Enter"){
          analyze();
        }
      });

      els.allWrap.hidden = true;
      els.allPanel.hidden = true;
    });
  })();
  </script>
</div>




<h2 class="wp-block-heading">What Is the Content Optimization Score Tool?</h2>



<p class="wp-block-paragraph">The Content Optimization Score Tool analyzes your draft and gives you a practical SEO score based on structure, coverage, and usability signals.</p>



<p class="wp-block-paragraph">Instead of overwhelming you with dozens of technical metrics, it focuses on what actually improves rankings and user engagement:</p>



<ul class="wp-block-list">
<li>Content length &amp; structure</li>



<li>Headings and scannability</li>



<li>FAQ coverage</li>



<li>Pros/Cons &amp; verdict sections</li>



<li>Tables &amp; comparison elements</li>



<li>Internal links</li>



<li>Readability signals</li>
</ul>



<p class="wp-block-paragraph">It then shows the <strong>Top 3 Next Fixes</strong> and, if needed, additional prioritized issues.</p>



<h2 class="wp-block-heading">How It Works</h2>



<ol class="wp-block-list">
<li>Paste your article (Word formatting is kept)</li>



<li>Click <strong>Analyze</strong></li>



<li>Review your SEO score</li>



<li>Apply the Top 3 suggested fixes</li>



<li>Optionally expand “Show all issues”</li>
</ol>



<p class="wp-block-paragraph">Everything runs directly in your browser — no data is sent anywhere.</p>



<h2 class="wp-block-heading">What Makes This Tool Different?</h2>



<p class="wp-block-paragraph">Most SEO tools overwhelm you with dozens of metrics.</p>



<p class="wp-block-paragraph">This tool focuses on:</p>



<ul class="wp-block-list">
<li>Actionable improvements</li>



<li>Copy-ready fix templates</li>



<li>Clear prioritization (High / Medium / Low)</li>



<li>Real structural issues that affect rankings</li>
</ul>



<p class="wp-block-paragraph">It’s designed for bloggers, niche site builders, and review writers who want clarity — not noise.</p>



<h2 class="wp-block-heading">What the Score Is Based On</h2>



<p class="wp-block-paragraph">Your overall score considers:</p>



<ul class="wp-block-list">
<li>Word count depth</li>



<li>Heading structure (H1, H2 usage)</li>



<li>Presence of FAQ</li>



<li>Pros/Cons + Verdict</li>



<li>Tables for scannability</li>



<li>Internal links</li>



<li>Pricing &amp; alternatives coverage</li>



<li>Readability signals</li>



<li>Duplicate paragraph detection</li>
</ul>



<p class="wp-block-paragraph">The score is heuristic-based and meant to guide optimization — not replace human judgment.</p>



<h2 class="wp-block-heading">Privacy &amp; Data</h2>



<ul class="wp-block-list">
<li>No API calls</li>



<li>No server processing</li>



<li>No tracking</li>



<li>No storage</li>
</ul>



<p class="wp-block-paragraph">Your content stays in your browser.</p>



<h2 class="wp-block-heading">Who Should Use It?</h2>



<p class="wp-block-paragraph">This tool is ideal for:</p>



<ul class="wp-block-list">
<li>AI tool reviewers</li>



<li>Affiliate bloggers</li>



<li>SEO beginners</li>



<li>Niche site builders</li>



<li>Anyone improving blog structure</li>
</ul>



<p class="wp-block-paragraph">It’s not meant to replace advanced SEO software, but it helps you optimize faster before publishing.</p>



<h2 class="wp-block-heading">Related Resources</h2>



<p class="wp-block-paragraph">If you’re optimizing your content, these tools and guides can help you go further:</p>



<ul class="wp-block-list">
<li><a href="https://aieverydaytools.com/seo-content-brief-generator-pro/" data-type="post" data-id="2564">SEO Content Brief Generator</a></li>



<li><a href="https://aieverydaytools.com/image-prompt-generator/" data-type="post" data-id="2476">Image Prompt Generator</a></li>
</ul>
<p>The post <a rel="nofollow" href="https://aieverydaytools.com/content-optimization-score-tool/">Content Optimization Score Tool</a> appeared first on <a rel="nofollow" href="https://aieverydaytools.com">AI Everyday Tools</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SEO Content Brief Generator (Pro)</title>
		<link>https://aieverydaytools.com/seo-content-brief-generator-pro/</link>
		
		<dc:creator><![CDATA[Daniel]]></dc:creator>
		<pubDate>Thu, 12 Feb 2026 13:50:30 +0000</pubDate>
				<category><![CDATA[Best Free AI Tools]]></category>
		<guid isPermaLink="false">https://aieverydaytools.com/?p=2564</guid>

					<description><![CDATA[<p>Generate SEO-ready content briefs and writing prompts instantly. No API, no tracking, no login. Just enter your keyword and start building better articles today.</p>
<p>The post <a rel="nofollow" href="https://aieverydaytools.com/seo-content-brief-generator-pro/">SEO Content Brief Generator (Pro)</a> appeared first on <a rel="nofollow" href="https://aieverydaytools.com">AI Everyday Tools</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">This free SEO content brief generator helps bloggers, affiliate marketers, and content creators structure high-ranking articles in minutes.<br><br>No API. No tracking. Just enter your keyword and generate a complete brief and writing prompt.</p>


<!-- SEO Content Brief Tool v3.4 (No-API, Visitor-Friendly) — ONE Shortcoder Block
     v3.4 adds:
     - Smart "Recommended preset" based on keyword (+ Apply button)
     - Preset-specific Ultimate extras (no random deep-dives on How-To)
     - Meta + title ideas better aligned with keyword type + preset
     - Update button only enabled when something changed since last Generate
     - Keyword input never auto-changes (we preserve user’s casing; we only normalize spaces internally)
     - Footer disclaimers: general advice + privacy/local storage + sponsorship note
-->

<div id="seoBriefToolV34" class="sbf-wrap">
  <div class="sbf-card">
    <div class="sbf-head">
      <div>
        <h2 class="sbf-title">SEO Content Brief Generator (Pro)</h2>
        <p class="sbf-sub">Enter any keyword → get a copy-ready brief + writing prompt. No login, no API.</p>
      </div>

      <div class="sbf-head-actions">
        <details class="sbf-saved">
          <summary class="sbf-btn-ghost">Saved</summary>
          <div class="sbf-saved-menu">
            <button id="sbf_restore" class="sbf-btn-ghost" type="button">Restore last session</button>
            <button id="sbf_forget" class="sbf-btn-ghost" type="button">Clear saved data</button>
          </div>
        </details>
      </div>
    </div>

    <!-- INPUT -->
    <div class="sbf-panel">
      <label class="sbf-label" for="sbf_kw">Primary keyword</label>
      <input id="sbf_kw" class="sbf-input" type="text" placeholder='e.g., "Is Janitor AI Safe"' autocomplete="off" />

      <div class="sbf-row sbf-row-top">
        <div class="sbf-left">
          <div class="sbf-presets">
            <span class="sbf-label sbf-inlineLabel">Presets</span>

            <button class="sbf-btn-preset sbf-btn-ghost" type="button" data-preset="toolreview">Tool Review</button>
            <button class="sbf-btn-preset sbf-btn-ghost" type="button" data-preset="safety">Safety/Privacy</button>
            <button class="sbf-btn-preset sbf-btn-ghost" type="button" data-preset="comparison">Comparison</button>
            <button class="sbf-btn-preset sbf-btn-ghost" type="button" data-preset="howto">How-To</button>
            <button class="sbf-btn-preset sbf-btn-ghost" type="button" data-preset="alternatives">Alternatives List</button>
          </div>

          <div class="sbf-reco" id="sbf_recoWrap" style="display:none;">
            <span class="sbf-reco-pill" id="sbf_recoText">Recommended: Safety/Privacy</span>
            <button id="sbf_applyReco" class="sbf-btn-ghost sbf-reco-apply" type="button">Apply</button>
          </div>

          <div class="sbf-depth">
            <label class="sbf-label sbf-inlineLabel" for="sbf_depth">Depth</label>
            <select id="sbf_depth" class="sbf-input sbf-depthSelect">
              <option value="quick">Quick</option>
              <option value="standard" selected>Standard</option>
              <option value="ultimate">Ultimate</option>
            </select>
          </div>
        </div>

        <div class="sbf-actions">
          <button id="sbf_generate" class="sbf-btn-primary" type="button">Generate</button>
          <button id="sbf_update" class="sbf-btn-ghost" type="button" disabled>Update</button>
          <button id="sbf_clear" class="sbf-btn-ghost" type="button">Clear</button>
        </div>
      </div>

      <div class="sbf-minihelp">
        <strong>Tip:</strong> Pick a preset + depth, then hit <strong>Generate</strong>. (We’ll suggest a preset based on your keyword.)
      </div>
    </div>

    <!-- OUTPUT -->
    <div id="sbf_outputWrap" class="sbf-output" style="display:none;">
      <div class="sbf-output-top">
        <div class="sbf-output-tabs">
          <button id="sbf_tabBrief" class="sbf-tab sbf-tab-active" type="button">Brief (Markdown)</button>
          <button id="sbf_tabPrompt" class="sbf-tab" type="button">Write Prompt</button>
        </div>
        <div class="sbf-output-actions">
          <button id="sbf_copy" class="sbf-btn-ghost" type="button">Copy</button>
          <button id="sbf_dlmd" class="sbf-btn-ghost" type="button">Download .md</button>
          <button id="sbf_dltxt" class="sbf-btn-ghost" type="button">Download .txt</button>
        </div>
      </div>

      <textarea id="sbf_out" class="sbf-textarea" rows="18" readonly></textarea>

      <details id="sbf_advanced" class="sbf-adv">
        <summary>Advanced blocks (optional)</summary>

        <div class="sbf-adv-grid">
          <div class="sbf-adv-box">
            <h3 class="sbf-h3">Pros / Cons + Verdict Box</h3>

            <label class="sbf-label">Pros (one per line)</label>
            <textarea id="sbf_pros" class="sbf-textarea sbf-smallta" rows="4"></textarea>

            <label class="sbf-label">Cons (one per line)</label>
            <textarea id="sbf_cons" class="sbf-textarea sbf-smallta" rows="4"></textarea>

            <div class="sbf-row2">
              <div>
                <label class="sbf-label">Verdict tone</label>
                <select id="sbf_verdictTone" class="sbf-input">
                  <option value="balanced" selected>Balanced</option>
                  <option value="cautious">Cautious</option>
                  <option value="positive">Positive</option>
                  <option value="critical">Critical</option>
                </select>
              </div>
              <div>
                <label class="sbf-label">Include “who it’s for”</label>
                <select id="sbf_verdictWho" class="sbf-input">
                  <option value="yes" selected>Yes</option>
                  <option value="no">No</option>
                </select>
              </div>
            </div>

            <div class="sbf-row" style="margin-top:10px;">
              <button id="sbf_buildVerdict" class="sbf-btn-ghost" type="button">Build Verdict Box</button>
              <button id="sbf_copyVerdict" class="sbf-btn-ghost" type="button" disabled>Copy</button>
            </div>

            <label class="sbf-label">Output (Markdown)</label>
            <textarea id="sbf_verdictOut" class="sbf-textarea sbf-smallta" rows="8" readonly></textarea>
          </div>

          <div class="sbf-adv-box">
            <h3 class="sbf-h3">FAQ Answer Helper</h3>

            <label class="sbf-label">FAQ question</label>
            <input id="sbf_faqQ" class="sbf-input" type="text" />

            <label class="sbf-label">Bullet points (one per line)</label>
            <textarea id="sbf_faqBullets" class="sbf-textarea sbf-smallta" rows="5"></textarea>

            <div class="sbf-row2">
              <div>
                <label class="sbf-label">Length</label>
                <select id="sbf_faqLen" class="sbf-input">
                  <option value="short">Short (2 sentences)</option>
                  <option value="medium" selected>Medium (3 sentences)</option>
                  <option value="long">Long (4 sentences)</option>
                </select>
              </div>
              <div>
                <label class="sbf-label">Style</label>
                <select id="sbf_faqStyle" class="sbf-input">
                  <option value="neutral" selected>Neutral</option>
                  <option value="helpful">Helpful</option>
                  <option value="cautious">Cautious</option>
                </select>
              </div>
            </div>

            <div class="sbf-row" style="margin-top:10px;">
              <button id="sbf_buildFaqA" class="sbf-btn-ghost" type="button">Build Answer</button>
              <button id="sbf_copyFaqA" class="sbf-btn-ghost" type="button" disabled>Copy</button>
            </div>

            <label class="sbf-label">Answer</label>
            <textarea id="sbf_faqAOut" class="sbf-textarea sbf-smallta" rows="6" readonly></textarea>
          </div>

          <div class="sbf-adv-box">
            <h3 class="sbf-h3">FAQ Schema (JSON-LD)</h3>
            <p class="sbf-muted">Builds generic FAQs from the keyword. Replace answers in WordPress.</p>

            <div class="sbf-row" style="margin-top:10px;">
              <button id="sbf_buildSchema" class="sbf-btn-ghost" type="button">Build FAQ Schema</button>
              <button id="sbf_copySchema" class="sbf-btn-ghost" type="button" disabled>Copy</button>
            </div>

            <textarea id="sbf_schemaOut" class="sbf-textarea sbf-smallta" rows="10" readonly></textarea>
          </div>

          <div class="sbf-adv-box">
            <h3 class="sbf-h3">Manual SERP Helper</h3>
            <p class="sbf-muted">Paste 3 ranking titles from Google → get differentiation notes.</p>

            <label class="sbf-label">Competitor title #1</label>
            <input id="sbf_serp1" class="sbf-input" type="text" />

            <label class="sbf-label">Competitor title #2</label>
            <input id="sbf_serp2" class="sbf-input" type="text" />

            <label class="sbf-label">Competitor title #3</label>
            <input id="sbf_serp3" class="sbf-input" type="text" />

            <div class="sbf-row" style="margin-top:10px;">
              <button id="sbf_analyzeSerp" class="sbf-btn-ghost" type="button">Analyze</button>
              <button id="sbf_copySerp" class="sbf-btn-ghost" type="button" disabled>Copy</button>
            </div>

            <textarea id="sbf_serpOut" class="sbf-textarea sbf-smallta" rows="10" readonly></textarea>
          </div>
        </div>
      </details>
    </div>

    <div class="sbf-footer">
      <div class="sbf-footer-left">
        <button id="sbf_bookmark" class="sbf-btn-ghost" type="button">Bookmark</button>
        <button id="sbf_share" class="sbf-btn-ghost" type="button">Share</button>
        <button id="sbf_copyLink" class="sbf-btn-ghost" type="button">Copy page link</button>
      </div>

      <div class="sbf-footer-right">
        <div class="sbf-disclaimer">
          <div><strong>Disclaimer:</strong> General writing/SEO suggestions only. Verify facts and follow policies/laws.</div>
          <div><strong>Privacy:</strong> No API calls. Input stays in your browser (Saved uses local storage).</div>
          <div class="sbf-muted">Suggestions are non-sponsored unless explicitly stated.</div>
        </div>
      </div>
    </div>
  </div>
</div>

<style>
  #seoBriefToolV34.sbf-wrap{max-width:980px;margin:18px auto;font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif}
  #seoBriefToolV34 .sbf-card{background:#fff;border:1px solid rgba(0,0,0,.10);border-radius:14px;padding:16px;box-shadow:0 10px 30px rgba(0,0,0,.06)}
  #seoBriefToolV34 .sbf-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap}
  #seoBriefToolV34 .sbf-title{margin:0 0 6px;font-size:22px}
  #seoBriefToolV34 .sbf-sub{margin:0;color:rgba(0,0,0,.65)}
  #seoBriefToolV34 .sbf-head-actions{display:flex;gap:10px;flex-wrap:wrap}

  #seoBriefToolV34 .sbf-saved{position:relative}
  #seoBriefToolV34 .sbf-saved-menu{
    position:absolute;right:0;top:44px;z-index:5;background:#fff;border:1px solid rgba(0,0,0,.12);
    border-radius:12px;padding:10px;box-shadow:0 10px 30px rgba(0,0,0,.10);display:grid;gap:10px;min-width:230px
  }
  #seoBriefToolV34 .sbf-saved summary{list-style:none}
  #seoBriefToolV34 .sbf-saved summary::-webkit-details-marker{display:none}

  #seoBriefToolV34 .sbf-panel{margin-top:14px;border:1px solid rgba(0,0,0,.08);border-radius:12px;padding:12px;background:#fff}
  #seoBriefToolV34 .sbf-label{display:block;font-size:12px;margin:10px 0 6px;color:rgba(0,0,0,.75);font-weight:900}
  #seoBriefToolV34 .sbf-inlineLabel{margin:0;color:rgba(0,0,0,.65)}
  #seoBriefToolV34 .sbf-input,#seoBriefToolV34 .sbf-textarea,#seoBriefToolV34 select{
    width:100%;box-sizing:border-box;padding:10px;border-radius:10px;border:1px solid rgba(0,0,0,.16);
    outline:none;background:#fff;color:#111
  }
  #seoBriefToolV34 .sbf-textarea{resize:vertical}
  #seoBriefToolV34 .sbf-smallta{padding:9px}
  #seoBriefToolV34 .sbf-input:focus,#seoBriefToolV34 .sbf-textarea:focus,#seoBriefToolV34 select:focus{
    border-color:#111;box-shadow:0 0 0 3px rgba(0,0,0,.08)
  }

  #seoBriefToolV34 .sbf-row{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-top:10px}
  #seoBriefToolV34 .sbf-row-top{align-items:flex-end}
  #seoBriefToolV34 .sbf-left{display:flex;align-items:flex-end;gap:12px;flex-wrap:wrap}
  #seoBriefToolV34 .sbf-presets{display:flex;align-items:center;gap:10px;flex-wrap:wrap}

  #seoBriefToolV34 .sbf-reco{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  #seoBriefToolV34 .sbf-reco-pill{
    display:inline-flex;align-items:center;gap:8px;
    padding:7px 10px;border-radius:999px;border:1px solid rgba(0,0,0,.14);
    background:rgba(0,0,0,.03);font-weight:900;font-size:12px;color:#111
  }
  #seoBriefToolV34 .sbf-reco-apply{padding:8px 10px !important;border-radius:999px !important;font-size:12px}

  #seoBriefToolV34 .sbf-depth{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  #seoBriefToolV34 .sbf-depthSelect{min-width:160px}
  #seoBriefToolV34 .sbf-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}

  #seoBriefToolV34 .sbf-row2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:10px}
  @media (max-width:700px){ #seoBriefToolV34 .sbf-row2{grid-template-columns:1fr} }

  #seoBriefToolV34 .sbf-btn-primary{
    background:#111 !important;color:#fff !important;border:1px solid #111 !important;
    padding:10px 14px;border-radius:10px;cursor:pointer;font-weight:950;line-height:1
  }
  #seoBriefToolV34 .sbf-btn-primary:hover{background:#000 !important}

  #seoBriefToolV34 .sbf-btn-ghost{
    background:#f4f4f4 !important;color:#111 !important;border:1px solid #cfcfcf !important;
    padding:10px 14px;border-radius:10px;cursor:pointer;font-weight:900;line-height:1
  }
  #seoBriefToolV34 .sbf-btn-ghost:hover{background:#eaeaea !important}
  #seoBriefToolV34 .sbf-btn-ghost:disabled{opacity:.55;cursor:not-allowed}

  #seoBriefToolV34 .sbf-btn-preset.sbf-active{background:#111 !important;color:#fff !important;border-color:#111 !important}

  #seoBriefToolV34 .sbf-minihelp{margin-top:10px;padding:10px;border-radius:12px;background:rgba(0,0,0,.04);border:1px solid rgba(0,0,0,.07);font-size:12px;color:rgba(0,0,0,.75)}
  #seoBriefToolV34 .sbf-muted{color:rgba(0,0,0,.62);font-size:12px;line-height:1.35}

  #seoBriefToolV34 .sbf-output{margin-top:14px;border:1px solid rgba(0,0,0,.08);border-radius:12px;padding:12px}
  #seoBriefToolV34 .sbf-output-top{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:10px}
  #seoBriefToolV34 .sbf-output-tabs{display:flex;gap:8px;flex-wrap:wrap}

  #seoBriefToolV34 .sbf-tab{
    padding:8px 10px;border-radius:999px;border:1px solid #cfcfcf;
    background:#fff !important;color:#111 !important;cursor:pointer;font-weight:900;
  }
  #seoBriefToolV34 .sbf-tab:hover{background:#f2f2f2 !important}
  #seoBriefToolV34 .sbf-tab-active{background:#111 !important;color:#fff !important;border-color:#111 !important}

  #seoBriefToolV34 .sbf-adv{margin-top:12px;border:1px dashed rgba(0,0,0,.20);border-radius:12px;padding:10px}
  #seoBriefToolV34 .sbf-adv summary{cursor:pointer;font-weight:950}
  #seoBriefToolV34 .sbf-adv-grid{display:grid;grid-template-columns:1fr;gap:12px;margin-top:12px}
  @media (min-width:1100px){#seoBriefToolV34 .sbf-adv-grid{grid-template-columns:1fr 1fr}}
  #seoBriefToolV34 .sbf-adv-box{border:1px solid rgba(0,0,0,.08);border-radius:12px;padding:12px}
  #seoBriefToolV34 .sbf-h3{margin:0 0 8px;font-size:14px}

  #seoBriefToolV34 .sbf-footer{margin-top:14px;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap}
  #seoBriefToolV34 .sbf-footer-left{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
  #seoBriefToolV34 .sbf-disclaimer{max-width:520px;font-size:12px;color:rgba(0,0,0,.75);line-height:1.35}
  #seoBriefToolV34 .sbf-disclaimer strong{font-weight:950}
</style>

<script>
(function(){
  const KEY = "sbf_v34_state";
  const MAX = { kw: 140, lineLen: 160, lines: 12, serpTitle: 140, faqQ: 180, faqBullets: 12 };

  const $ = (id)=>document.getElementById(id);

  function clampRaw(s, maxLen){ return (s||"").slice(0, maxLen); }
  function normalizeSpacesKeepCase(s){ return (s||"").replace(/\s+/g," ").trim(); }
  function cleanLine(s){ return (s||"").replace(/\s+/g," ").trim(); }
  function lines(text, maxLines){ return (text||"").split("\n").map(cleanLine).filter(Boolean).slice(0, maxLines); }
  function clampLines(text, maxLines, maxLen){
    return (text||"").split("\n").map(cleanLine).filter(Boolean).slice(0,maxLines).map(l=>l.slice(0,maxLen)).join("\n");
  }

  function toSlug(keyword){
    return (keyword||"").toLowerCase()
      .replace(/['"]/g,"")
      .replace(/[^a-z0-9\s-]/g,"")
      .replace(/\s+/g,"-")
      .replace(/-+/g,"-")
      .replace(/^-|-$/g,"")
      .slice(0,70);
  }

  // -------- Keyword parsing (ANY keyword) --------
  function norm(s){ return (s||"").replace(/\s+/g," ").trim(); }

  function isVsKeyword(k){
    return /\s(vs\.?|versus)\s/i.test(norm(k));
  }
  function isHowToKeyword(k){
    const x = norm(k).toLowerCase();
    return x.startsWith("how to ") || x.startsWith("how do i ") || x.startsWith("how can i ") || x.startsWith("how does ");
  }
  function isAlternativesKeyword(k){
    const x = norm(k).toLowerCase();
    return x.includes(" alternatives") || x.includes("best alternatives") || x.includes("alternatives to ");
  }
  function isSafetyKeyword(k){
    const x = norm(k).toLowerCase();
    return /^is\s+.+\s+safe\b/.test(x) || x.includes("privacy") || x.includes("security") || x.includes("data ") || x.includes("risk") || x.includes("safe ");
  }

  function extractEntity(keyword){
    const k = norm(keyword).replace(/\?$/,"");
    const vs = k.match(/^(.+?)\s+(vs\.?|versus)\s+(.+)$/i);
    if(vs && vs[1] && vs[3]) return `${vs[1].trim()} vs ${vs[3].trim()}`;

    const safeQ = k.match(/^is\s+(.+?)\s+safe(?:\s+to\s+use|\s+for|\s+in|\s*$)/i);
    if(safeQ && safeQ[1]) return safeQ[1].trim();

    const stripped = k.replace(/^(is|are|can|does|do|what|how|why|when|where|who)\s+/i,"").trim();
    return stripped || k;
  }

  // -------- Presets + Depth --------
  const presets = {
    toolreview:   { angle:"Tool Review",        intent:"Commercial Investigation", tone:"Authoritative" },
    safety:       { angle:"Safety/Privacy",     intent:"Informational",            tone:"Clear & Helpful" },
    comparison:   { angle:"Comparison",         intent:"Commercial Investigation", tone:"Authoritative" },
    howto:        { angle:"How-To",             intent:"Informational",            tone:"Helpful" },
    alternatives: { angle:"Alternatives List",  intent:"Commercial Investigation", tone:"Helpful + Direct" }
  };

  const depthProfiles = {
    quick:    { label:"Quick",    wordsByAngle: { default:1400, comparison:1800, alternatives:1800 }, faqCount: 6 },
    standard: { label:"Standard", wordsByAngle: { default:2200, comparison:2600, alternatives:2400 }, faqCount: 6 },
    ultimate: { label:"Ultimate", wordsByAngle: { default:3800, comparison:4200, alternatives:4200 }, faqCount: 10 }
  };

  let currentPresetKey = "safety";
  let currentDepthKey = "standard";
  let recommendedPresetKey = "safety";

  const out = { brief:"", prompt:"", allTxt:"", filename:"seo-brief" };
  let activeTab = "brief";

  // last generated snapshot for Update logic
  let lastGen = { kw:"", preset:"", depth:"" };

  function getTargetWords(){
    const d = depthProfiles[currentDepthKey] || depthProfiles.standard;
    if(currentPresetKey === "comparison") return d.wordsByAngle.comparison;
    if(currentPresetKey === "alternatives") return d.wordsByAngle.alternatives;
    return d.wordsByAngle.default;
  }

  // -------- Recommendation logic --------
  function recommendPreset(keyword){
    const k = norm(keyword);
    if(!k) return "safety";
    if(isAlternativesKeyword(k)) return "alternatives";
    if(isVsKeyword(k)) return "comparison";
    if(isHowToKeyword(k)) return "howto";
    if(isSafetyKeyword(k)) return "safety";
    return "toolreview";
  }

  function showReco(keyword){
    recommendedPresetKey = recommendPreset(keyword);
    const k = norm(keyword);
    const wrap = $("sbf_recoWrap");
    if(!k){
      wrap.style.display="none";
      return;
    }
    wrap.style.display="flex";
    $("sbf_recoText").textContent = `Recommended: ${presets[recommendedPresetKey].angle}`;

    // If user already matches recommendation -> hide apply button (cleaner)
    $("sbf_applyReco").style.display = (recommendedPresetKey === currentPresetKey) ? "none" : "inline-flex";
  }

  function setActivePresetButton(){
    document.querySelectorAll("#seoBriefToolV34 [data-preset]").forEach(btn=>{
      const key = btn.getAttribute("data-preset");
      btn.classList.toggle("sbf-active", key === currentPresetKey);
    });
    // also refresh apply button visibility
    const kwNow = norm($("sbf_kw").value);
    showReco(kwNow);
  }

  function updateUpdateButtonState(){
    const kwNow = normalizeSpacesKeepCase($("sbf_kw").value);
    const hasOutput = !!out.brief;

    const changed =
      normalizeSpacesKeepCase(lastGen.kw) !== kwNow ||
      lastGen.preset !== currentPresetKey ||
      lastGen.depth !== currentDepthKey;

    $("sbf_update").disabled = !(hasOutput && changed && !!norm(kwNow));
  }

  function setPreset(key){
    currentPresetKey = presets[key] ? key : "safety";
    setActivePresetButton();
    save();
    updateUpdateButtonState();
  }

  function setDepth(key){
    currentDepthKey = depthProfiles[key] ? key : "standard";
    save();
    updateUpdateButtonState();
  }

  // -------- Output builders --------
  function metaByPreset(keyword){
    const kw = norm(keyword);
    const entity = extractEntity(kw);
    const a = presets[currentPresetKey].angle;

    if(a === "Tool Review"){
      return `${kw}: what it does, best use cases, key limitations, pros/cons, and a clear verdict on who it’s for.`;
    }
    if(a === "Comparison"){
      return `${kw}: key differences, pricing/features, and which option to choose based on real scenarios.`;
    }
    if(a === "How-To"){
      // If keyword is a safety-question, avoid "setup" language
      if(isSafetyKeyword(kw)) return `${kw}: practical steps to reduce risk, what to avoid sharing, and safer usage best practices.`;
      return `${kw}: step-by-step instructions, common mistakes to avoid, and best practices for better results.`;
    }
    if(a === "Alternatives List"){
      return `${kw}: the best alternatives, a quick comparison table, top picks, and which one fits your needs.`;
    }
    return `${kw}: key privacy risks, what to avoid sharing, and practical steps to reduce exposure before you use it.`;
  }

  function snippetByPreset(keyword){
    const kw = norm(keyword);
    const entity = extractEntity(kw);
    const a = presets[currentPresetKey].angle;

    if(a === "Tool Review"){
      return `${entity} can be a strong option if you know its limits. Focus on the features you’ll actually use, watch for common drawbacks, and compare a few alternatives before committing. A quick checklist + clear verdict will help you decide fast.`;
    }
    if(a === "Comparison"){
      return `The best choice depends on your goal, budget, and must-have features. Compare the core differences first, then match each option to real scenarios (beginner, power user, privacy-focused). A simple table + final verdict makes the decision easy.`;
    }
    if(a === "How-To"){
      if(isSafetyKeyword(kw)) return `${entity} can be safer if you treat it as a public channel. Use strong account security, avoid sensitive details, and follow a short checklist to reduce exposure. This guide walks you through practical steps in a simple order.`;
      return `You can get solid results if you follow a clean process and avoid common mistakes. Start with the basics, apply best practices, and use a short checklist to confirm you did it right. This guide walks you through the steps in a practical order.`;
    }
    if(a === "Alternatives List"){
      return `If the default option isn’t a fit, a shortlist of alternatives can save you time. Compare pricing and features, then pick based on real scenarios (best value, easiest to use, most powerful). A quick table + top picks make the choice straightforward.`;
    }
    return `${entity} can be safe for casual use, but it depends on what you share and how the service handles data. The biggest risks are oversharing personal details, unclear retention policies, and third-party processing. Avoid sensitive information, use strong account security, and treat chats as helpful—but not private.`;
  }

  function titleIdeas(keyword){
    const kw = norm(keyword).replace(/\?$/,"");
    const a = presets[currentPresetKey].angle;
    const d = depthProfiles[currentDepthKey].label;
    const entity = extractEntity(kw);

    // Safety-aware title variants
    const safetyFlavor = isSafetyKeyword(kw)
      ? ["Risks", "What to Avoid", "Privacy Tips", "Red Flags"]
      : ["Key Points", "Tips", "Takeaways", "Decision Guide"];

    // Comparison-aware
    if(isVsKeyword(kw)){
      return [
        `${kw} in 2026: The ${d} ${a} + What to Know`,
        `${kw} — ${d} ${a} (Differences, Pros/Cons, Best For)`,
        `Which Is Better in 2026? ${kw} — ${d} ${a} Breakdown`,
        `${kw}: ${d} ${a} Checklist + Winner Scenarios`
      ];
    }

    // General
    return [
      `${kw} in 2026: The ${d} ${a} + ${safetyFlavor[1]}`,
      `${kw} — ${d} ${a} (${safetyFlavor[0]}, ${safetyFlavor[2]}, ${safetyFlavor[3]})`,
      `Should You Use ${entity} in 2026? ${d} ${a} Breakdown`,
      `${kw}: ${d} ${a} Checklist + ${safetyFlavor[3]}`
    ];
  }

  function baseOutline(){
    const a = presets[currentPresetKey].angle;

    if(a === "Comparison"){
      return [
        "Quick answer (TL;DR)",
        "What it is (and who it’s for)",
        "Key differences (table)",
        "Feature-by-feature breakdown",
        "Pros and cons (for each option)",
        "Which one to choose (scenarios)",
        "FAQ",
        "Final verdict"
      ];
    }

    if(a === "How-To"){
      // If the keyword is safety-oriented, keep the “how-to” framed as steps/best practices (not setup)
      if(isSafetyKeyword($("sbf_kw").value)){
        return [
          "Quick answer (TL;DR)",
          "What the risk is (in plain English)",
          "What to avoid sharing",
          "Safer usage checklist",
          "Step-by-step risk reduction (practical steps)",
          "Common mistakes",
          "FAQ",
          "Final checklist"
        ];
      }
      return [
        "Quick answer (TL;DR)",
        "What you need before you start",
        "Step-by-step setup",
        "Common mistakes",
        "Best practices",
        "FAQ",
        "Final checklist"
      ];
    }

    if(a === "Tool Review"){
      return [
        "Quick answer (TL;DR)",
        "What it is (and what it’s not)",
        "Best use cases",
        "Main limitations",
        "Pros/cons + verdict box",
        "Alternatives",
        "FAQ"
      ];
    }

    if(a === "Alternatives List"){
      return [
        "Quick answer (TL;DR)",
        "How we picked these alternatives (criteria)",
        "Top alternatives (quick list)",
        "Comparison table (price/features/best for)",
        "Deep dives (top 3–5 picks)",
        "Which alternative to choose (scenarios)",
        "FAQ",
        "Final recommendation"
      ];
    }

    // Safety/Privacy default
    return [
      "Quick answer (TL;DR)",
      "What it is (and how it works)",
      "Main privacy risks",
      "Security risks and red flags",
      "Safer usage checklist",
      "How to reduce risk (steps)",
      "FAQ",
      "Final verdict"
    ];
  }

  function expandOutlineForUltimate(outline){
    if(currentDepthKey !== "ultimate") return outline;

    const a = presets[currentPresetKey].angle;
    const lower = outline.map(x=>x.toLowerCase());
    const hasFAQ = lower.some(x=>x.includes("faq"));
    const idx = lower.findIndex(x=>x.includes("faq"));
    const insertAt = (idx === -1) ? outline.length : idx;

    // Preset-specific Ultimate extras (no random blocks)
    let extras = [];

    if(a === "Safety/Privacy"){
      extras = [
        "Deep dive: how data may be processed (simple explanation)",
        "Real-world scenarios (what to do / what to avoid)",
        "Troubleshooting + common edge cases"
      ];
    } else if(a === "Tool Review"){
      extras = [
        "Hands-on notes (what surprised us)",
        "Use-case scenarios (best for / avoid if)",
        "Troubleshooting + common edge cases",
        "Mini comparison table (top alternatives)"
      ];
    } else if(a === "Comparison"){
      extras = [
        "Decision matrix (choose based on scenarios)",
        "Hidden costs / limitations (what people miss)",
        "Troubleshooting + common edge cases"
      ];
    } else if(a === "How-To"){
      extras = [
        "Troubleshooting + common edge cases",
        "Verification checklist (did it work?)",
        "Advanced tips (optional, short)"
      ];
    } else if(a === "Alternatives List"){
      extras = [
        "Decision matrix (pick based on scenarios)",
        "Common mistakes when choosing alternatives",
        "Troubleshooting + edge cases (migrations/compatibility)"
      ];
    }

    // Insert before FAQ if present, else append
    const before = outline.slice(0, insertAt);
    const after = outline.slice(insertAt);
    return before.concat(extras).concat(after);
  }

  function buildOutline(){
    return expandOutlineForUltimate(baseOutline());
  }

  function outlineHasAlternatives(outline){
    return outline.some(x=>/alternatives/i.test(x));
  }

  function buildFaq(keyword){
    const kw = norm(keyword);
    const entity = extractEntity(kw);
    const d = depthProfiles[currentDepthKey] || depthProfiles.standard;
    const count = d.faqCount;

    if(isVsKeyword(kw)){
      const base = [
        `Which is better: ${kw}?`,
        `What are the biggest differences between the two options?`,
        `Which one is safer for privacy?`,
        `Which one is easier for beginners?`,
        `Which one is better value in 2026?`,
        `What are the best alternatives to both options?`
      ];
      const extra = [
        `Which one has better pricing or free plans?`,
        `Which one performs better for my use case?`,
        `Which one is better long-term?`,
        `What are common mistakes when choosing between them?`
      ];
      return (count > base.length ? base.concat(extra) : base).slice(0,count);
    }

    const base = [
      isSafetyKeyword(kw) ? `Is ${entity} safe for personal data?` : `Is ${kw} worth using in 2026?`,
      `What should I avoid sharing when using ${entity}?`,
      `Can chats be stored or reviewed later?`,
      `How do I reduce privacy risks in practice?`,
      `What are the best alternatives to ${entity} in 2026?`,
      `Is ${entity} safe for work or school use?`
    ];

    const extra = [
      `Does ${entity} have data retention or deletion options?`,
      `How can I use ${entity} more anonymously?`,
      `What settings should I check first before using ${entity}?`,
      `What are common red flags that ${entity} isn’t safe for my use case?`
    ];

    return (count > base.length ? base.concat(extra) : base).slice(0,count);
  }

  function buildBrief(keyword){
    const kw = norm(keyword);
    const slug = toSlug(kw) || "seo-brief";
    const outline = buildOutline();
    const faqs = buildFaq(kw);
    const titles = titleIdeas(kw);
    const words = getTargetWords();
    const preset = presets[currentPresetKey];
    const depth = depthProfiles[currentDepthKey];

    out.filename = slug;

    return [
`# SEO Content Brief`,
`**Primary keyword:** ${kw}`,
`**Suggested slug:** ${slug}`,
`**Preset:** ${preset.angle}`,
`**Depth:** ${depth.label}`,
`**Intent:** ${preset.intent}`,
`**Tone:** ${preset.tone}`,
`**Target length:** ~${words} words`,
``,
`---`,
`## Title ideas`,
...titles.map(t=>`- ${t}`),
``,
`## Meta description`,
metaByPreset(kw),
``,
`---`,
`## Outline`,
...outline.map(h=>`- ${h}`),
``,
`---`,
`## FAQs`,
...faqs.map(q=>`- ${q}`),
``,
`---`,
`## Internal link plan (universal)`,
`- Link to your AI tools hub/category from the intro.`,
`- Link to a related how-to/checklist post near the middle.`,
`- Link to an alternatives/comparison post near the end (if relevant).`,
``,
`---`,
`## Suggested featured snippet (40–55 words)`,
snippetByPreset(kw),
    ].join("\n");
  }

  function buildPrompt(keyword){
    const kw = norm(keyword);
    const outline = buildOutline();
    const faqs = buildFaq(kw);
    const words = getTargetWords();
    const preset = presets[currentPresetKey];
    const depth = depthProfiles[currentDepthKey];

    const hasAlt = outlineHasAlternatives(outline);

    const reqDepth = currentDepthKey === "ultimate"
      ? [
          "- Include at least 2 tables (e.g., comparison table + checklist table).",
          "- Add a troubleshooting section with 3–5 common edge cases.",
          "- Expand the FAQ section with short, direct answers."
        ].concat(hasAlt ? [] : ["- Add a short 'Alternatives' section."])
      : currentDepthKey === "quick"
      ? [
          "- Keep sections concise and avoid long tangents.",
          "- Use one short checklist.",
          "- Aim for clarity over completeness."
        ]
      : [
          "- Add at least one short checklist.",
          "- Keep paragraphs short and scannable.",
          "- Include one small table if it helps."
        ].concat(hasAlt ? [] : ["- Add a short 'Alternatives' section."]);

    return [
`You are an SEO writer. Write a ${words}-word English article.`,
`Target keyword: "${kw}" (use it naturally in the intro, one mid-section heading, and the conclusion).`,
`Intent: ${preset.intent}. Tone: ${preset.tone}.`,
`Preset angle: ${preset.angle}. Depth: ${depth.label}.`,
``,
`Use this outline exactly:`,
...outline.map(h=>`- ${h}`),
``,
`Requirements:`,
`- Include a 40–55 word TL;DR near the top (featured snippet ready).`,
...reqDepth,
`- Answer these FAQs near the end:`,
...faqs.map(q=>`  - ${q}`),
``,
`Finish with a clear verdict + next steps.`,
    ].join("\n");
  }

  function buildAllTxt(){
    return [`=== BRIEF (Markdown) ===`, out.brief, "", `=== WRITE PROMPT ===`, out.prompt].join("\n");
  }

  function renderTab(tab){
    activeTab = tab;
    $("sbf_tabBrief").classList.toggle("sbf-tab-active", tab === "brief");
    $("sbf_tabPrompt").classList.toggle("sbf-tab-active", tab === "prompt");
    $("sbf_out").value = (tab === "brief") ? out.brief : out.prompt;
  }

  async function copyText(text){
    try{ await navigator.clipboard.writeText(text); alert("Copied!"); }
    catch(e){
      const ta=document.createElement("textarea"); ta.value=text; document.body.appendChild(ta);
      ta.select(); document.execCommand("copy"); ta.remove(); alert("Copied!");
    }
  }

  function downloadFile(filename, content){
    const blob=new Blob([content],{type:"text/plain;charset=utf-8"});
    const url=URL.createObjectURL(blob);
    const a=document.createElement("a"); a.href=url; a.download=filename;
    document.body.appendChild(a); a.click(); a.remove(); URL.revokeObjectURL(url);
  }

  function generate(){
    const raw = $("sbf_kw").value;
    const kw = normalizeSpacesKeepCase(raw);
    if(!kw){ alert("Please enter a keyword."); return; }

    // NOTE: we do NOT change the input value (preserve user's exact casing)
    out.brief = buildBrief(kw);
    out.prompt = buildPrompt(kw);
    out.allTxt = buildAllTxt();

    $("sbf_outputWrap").style.display = "block";

    lastGen = { kw, preset: currentPresetKey, depth: currentDepthKey };
    renderTab(activeTab || "brief");
    updateUpdateButtonState();
    save();
  }

  function clearAll(){
    $("sbf_kw").value = "";
    $("sbf_outputWrap").style.display = "none";
    $("sbf_update").disabled = true;

    $("sbf_pros").value = "";
    $("sbf_cons").value = "";
    $("sbf_verdictOut").value = "";
    $("sbf_copyVerdict").disabled = true;

    $("sbf_faqQ").value = "";
    $("sbf_faqBullets").value = "";
    $("sbf_faqAOut").value = "";
    $("sbf_copyFaqA").disabled = true;

    $("sbf_schemaOut").value = "";
    $("sbf_copySchema").disabled = true;

    $("sbf_serp1").value = "";
    $("sbf_serp2").value = "";
    $("sbf_serp3").value = "";
    $("sbf_serpOut").value = "";
    $("sbf_copySerp").disabled = true;

    out.brief=""; out.prompt=""; out.allTxt=""; out.filename="seo-brief";
    activeTab="brief";
    lastGen={kw:"",preset:"",depth:""};
    showReco("");
    save();
  }

  // -------- Advanced builders --------
  function buildVerdictBox(){
    const kw = norm($("sbf_kw").value);
    if(!kw){ alert("Enter a keyword first."); return; }

    $("sbf_pros").value = clampLines($("sbf_pros").value, MAX.lines, MAX.lineLen);
    $("sbf_cons").value = clampLines($("sbf_cons").value, MAX.lines, MAX.lineLen);

    const pros = lines($("sbf_pros").value, MAX.lines).slice(0,8);
    const cons = lines($("sbf_cons").value, MAX.lines).slice(0,8);

    const tone = $("sbf_verdictTone").value;
    const includeWho = $("sbf_verdictWho").value === "yes";
    const entity = extractEntity(kw);

    let verdict = "";
    if(tone === "balanced") verdict = `**Verdict:** ${entity} is useful for low-risk tasks, but you shouldn’t treat it as private. Keep chats generic and follow basic habits.`;
    if(tone === "cautious") verdict = `**Verdict:** ${entity} can be helpful, but only if you minimize what you share. Avoid sensitive data and assume chats may be stored or processed.`;
    if(tone === "positive") verdict = `**Verdict:** ${entity} is a solid option for everyday use if you apply simple rules. Keep it low-risk and secure your account.`;
    if(tone === "critical") verdict = `**Verdict:** ${entity} is convenient, but the trade-offs may not be worth it if you need strict control. Consider alternatives if retention isn’t clear.`;

    const who = [
      `- **Best for:** casual use, brainstorming, non-sensitive questions.`,
      `- **Avoid if:** you handle confidential work, legal, medical, or financial data.`
    ];

    const md = [
`> ### Quick Pros / Cons`,
`>`,
`> **Pros**`,
...(pros.length ? pros.map(p=>`> - ${p}`) : ["> - (Add 3–6 pros)"]),
`>`,
`> **Cons**`,
...(cons.length ? cons.map(c=>`> - ${c}`) : ["> - (Add 3–6 cons)"]),
`>`,
`> ${verdict}`,
...(includeWho ? [">", ...who.map(x=>"> " + x)] : [])
    ].join("\n");

    $("sbf_verdictOut").value = md;
    $("sbf_copyVerdict").disabled = false;
    save();
  }

  function buildFaqAnswer(){
    $("sbf_faqQ").value = clampRaw($("sbf_faqQ").value, MAX.faqQ);
    $("sbf_faqBullets").value = clampLines($("sbf_faqBullets").value, MAX.faqBullets, MAX.lineLen);

    const q = cleanLine($("sbf_faqQ").value);
    const b = lines($("sbf_faqBullets").value, MAX.faqBullets);
    if(!q || b.length === 0){ alert("Please add a question and at least 1 bullet point."); return; }

    const len = $("sbf_faqLen").value;
    const style = $("sbf_faqStyle").value;

    const b2=b.slice(0,2), b3=b.slice(0,3), b4=b.slice(0,4);
    let s1="",s2="",s3="",s4="";

    if(style === "neutral"){
      s1 = `${q} depends on your situation and what you share.`;
      s2 = `In general, ${b2[0].toLowerCase()} and ${(b2[1]||"follow basic best practices").toLowerCase()}.`;
      s3 = b3[2] ? `Also consider that ${b3[2].toLowerCase()}.` : `If you’re unsure, keep your usage simple and non-sensitive.`;
      s4 = b4[3] ? `A simple rule: ${b4[3]}.` : `When in doubt, avoid sensitive information.`;
    }
    if(style === "helpful"){
      s1 = `Here’s the practical way to handle it: ${q}`;
      s2 = `Start with: ${b2[0]}; then ${b2[1] || "double-check your settings"}.`;
      s3 = b3[2] ? `Next, ${b3[2].toLowerCase()}.` : `Next, look for retention/privacy options if available.`;
      s4 = b4[3] ? `Finally, ${b4[3].toLowerCase()}.` : `Finally, keep details minimal and use a separate account if needed.`;
    }
    if(style === "cautious"){
      s1 = `${q} can be risky if you treat it like a private channel.`;
      s2 = `To reduce exposure, ${b2[0].toLowerCase()} and ${(b2[1]||"use strong account security").toLowerCase()}.`;
      s3 = b3[2] ? `Be extra careful because ${b3[2].toLowerCase()}.` : `Be extra careful with work, legal, medical, or financial topics.`;
      s4 = b4[3] ? `If you must use it, ${b4[3].toLowerCase()}.` : `If you must use it, keep everything non-identifying.`;
    }

    let ans = "";
    if(len === "short") ans = [s1,s2].join(" ");
    if(len === "medium") ans = [s1,s2,s3].join(" ");
    if(len === "long") ans = [s1,s2,s3,s4].join(" ");

    $("sbf_faqAOut").value = ans;
    $("sbf_copyFaqA").disabled = false;
    save();
  }

  function escapeJson(s){ return (s||"").replaceAll("\\","\\\\").replaceAll('"','\\"'); }
  function buildFaqSchema(){
    const kw = norm($("sbf_kw").value);
    if(!kw){ alert("Enter a keyword first."); return; }

    const faqs = buildFaq(kw);
    const items = faqs.map(q=>{
      const a = "Write a concise 2–4 sentence answer here (unique, helpful, non-promotional).";
      return `{
        "@type": "Question",
        "name": "${escapeJson(q)}",
        "acceptedAnswer": { "@type": "Answer", "text": "${escapeJson(a)}" }
      }`;
    }).join(",\n");

    const jsonld = `{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
${items}
  ]
}`.trim();

    $("sbf_schemaOut").value = jsonld;
    $("sbf_copySchema").disabled = false;
    save();
  }

  function analyzeSerp(){
    $("sbf_serp1").value = clampRaw($("sbf_serp1").value, MAX.serpTitle);
    $("sbf_serp2").value = clampRaw($("sbf_serp2").value, MAX.serpTitle);
    $("sbf_serp3").value = clampRaw($("sbf_serp3").value, MAX.serpTitle);

    const t=[cleanLine($("sbf_serp1").value),cleanLine($("sbf_serp2").value),cleanLine($("sbf_serp3").value)].filter(Boolean);
    if(t.length===0){ alert("Paste at least 1 competitor title."); return; }

    const stop=new Set(["the","a","an","and","or","to","in","of","for","with","on","at","by","from","is","are","be","your","you","how","what","why","when","vs","2026","2025","2024"]);
    const words=[];
    t.forEach(x=>{
      x.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter(w=>w&&w.length>2&&!stop.has(w)).forEach(w=>words.push(w));
    });
    const freq=new Map(); words.forEach(w=>freq.set(w,(freq.get(w)||0)+1));
    const top=Array.from(freq.entries()).sort((a,b)=>b[1]-a[1]).slice(0,10).map(([w,c])=>`${w} (${c})`);

    const joined=t.join(" ").toLowerCase();
    const flags={
      updated: /(2026|2025|updated|latest|new)/.test(joined),
      guide: /(guide|how to|steps|tutorial|checklist)/.test(joined),
      safety: /(safe|safety|privacy|security|risk)/.test(joined),
      alternatives: /(alternatives|vs|compare|comparison)/.test(joined),
      review: /(review|tested|hands-on)/.test(joined)
    };

    const missing=[];
    if(!flags.safety) missing.push("Add a risk/checklist section (if relevant)");
    if(!flags.alternatives) missing.push("Add an alternatives section + small comparison table (if relevant)");
    if(!flags.updated) missing.push("Add freshness signals: Updated in 2026 + last-updated date");
    if(!flags.review) missing.push("Add testing notes + screenshots with dates");
    if(!flags.guide) missing.push("Add a step-by-step section (if applicable)");

    const notes=[
      "SERP Notes (manual, no API)",
      "--------------------------",
      "Top repeated terms:",
      "- "+(top.length?top.join("\n- "):"N/A"),
      "",
      "Detected angles:",
      `- Updated/latest: ${flags.updated?"YES":"NO"}`,
      `- Guide/how-to: ${flags.guide?"YES":"NO"}`,
      `- Safety/privacy: ${flags.safety?"YES":"NO"}`,
      `- Alternatives/VS: ${flags.alternatives?"YES":"NO"}`,
      `- Review/tested: ${flags.review?"YES":"NO"}`,
      "",
      "Easy ways to stand out:",
      "- "+(missing.length?missing.join("\n- "):"Focus on clarity + unique examples + screenshots."),
    ].join("\n");

    $("sbf_serpOut").value=notes;
    $("sbf_copySerp").disabled=false;
    save();
  }

  // -------- Storage --------
  function collect(){
    return {
      v:"3.4",
      t:Date.now(),
      preset: currentPresetKey,
      depth: currentDepthKey,
      kw: clampRaw($("sbf_kw").value, MAX.kw),
      lastGen,
      adv:{
        pros: clampLines($("sbf_pros").value, MAX.lines, MAX.lineLen),
        cons: clampLines($("sbf_cons").value, MAX.lines, MAX.lineLen),
        verdictTone: $("sbf_verdictTone").value,
        verdictWho: $("sbf_verdictWho").value,
        faqQ: clampRaw($("sbf_faqQ").value, MAX.faqQ),
        faqBullets: clampLines($("sbf_faqBullets").value, MAX.faqBullets, MAX.lineLen),
        faqLen: $("sbf_faqLen").value,
        faqStyle: $("sbf_faqStyle").value,
        schemaOut: $("sbf_schemaOut").value,
        serp1: clampRaw($("sbf_serp1").value, MAX.serpTitle),
        serp2: clampRaw($("sbf_serp2").value, MAX.serpTitle),
        serp3: clampRaw($("sbf_serp3").value, MAX.serpTitle),
        serpOut: $("sbf_serpOut").value,
        verdictOut: $("sbf_verdictOut").value,
        faqAOut: $("sbf_faqAOut").value
      },
      out:{ brief: out.brief, prompt: out.prompt, filename: out.filename },
      tab: activeTab
    };
  }
  function save(){ try{ localStorage.setItem(KEY, JSON.stringify(collect())); }catch(e){} }

  function apply(data){
    if(!data) return;

    currentPresetKey = presets[data.preset] ? data.preset : "safety";
    currentDepthKey = depthProfiles[data.depth] ? data.depth : "standard";
    lastGen = data.lastGen || {kw:"",preset:"",depth:""};

    $("sbf_depth").value = currentDepthKey;
    setActivePresetButton();

    $("sbf_kw").value = clampRaw(data.kw || "", MAX.kw);

    const a=data.adv||{};
    $("sbf_pros").value=a.pros||"";
    $("sbf_cons").value=a.cons||"";
    $("sbf_verdictTone").value=a.verdictTone||"balanced";
    $("sbf_verdictWho").value=a.verdictWho||"yes";
    $("sbf_faqQ").value=a.faqQ||"";
    $("sbf_faqBullets").value=a.faqBullets||"";
    $("sbf_faqLen").value=a.faqLen||"medium";
    $("sbf_faqStyle").value=a.faqStyle||"neutral";
    $("sbf_schemaOut").value=a.schemaOut||"";
    $("sbf_serp1").value=a.serp1||"";
    $("sbf_serp2").value=a.serp2||"";
    $("sbf_serp3").value=a.serp3||"";
    $("sbf_serpOut").value=a.serpOut||"";
    $("sbf_verdictOut").value=a.verdictOut||"";
    $("sbf_faqAOut").value=a.faqAOut||"";

    $("sbf_copyVerdict").disabled = !$("sbf_verdictOut").value;
    $("sbf_copyFaqA").disabled = !$("sbf_faqAOut").value;
    $("sbf_copySchema").disabled = !$("sbf_schemaOut").value;
    $("sbf_copySerp").disabled = !$("sbf_serpOut").value;

    if(data.out && (data.out.brief || data.out.prompt)){
      out.brief=data.out.brief||"";
      out.prompt=data.out.prompt||"";
      out.filename=data.out.filename||"seo-brief";
      out.allTxt=buildAllTxt();

      $("sbf_outputWrap").style.display="block";

      activeTab = (data.tab==="prompt") ? "prompt" : "brief";
      renderTab(activeTab);
    }else{
      $("sbf_outputWrap").style.display="none";
      activeTab="brief";
    }

    showReco($("sbf_kw").value);
    updateUpdateButtonState();
  }

  function restore(){
    try{
      const raw=localStorage.getItem(KEY);
      if(!raw){ alert("No saved data found."); return; }
      apply(JSON.parse(raw));
      alert("Restored.");
    }catch(e){ alert("Could not restore."); }
  }
  function forget(){ localStorage.removeItem(KEY); alert("Saved data cleared."); }

  // -------- Wire main --------
  $("sbf_generate").addEventListener("click", generate);
  $("sbf_update").addEventListener("click", generate);
  $("sbf_clear").addEventListener("click", clearAll);

  $("sbf_kw").addEventListener("input", ()=>{
    $("sbf_kw").value = clampRaw($("sbf_kw").value, MAX.kw);
    showReco($("sbf_kw").value);
    save();
    updateUpdateButtonState();
  });
  $("sbf_kw").addEventListener("keydown", (e)=>{
    if(e.key==="Enter"){ e.preventDefault(); generate(); }
  });

  document.querySelectorAll("#seoBriefToolV34 [data-preset]").forEach(btn=>{
    btn.addEventListener("click", ()=> setPreset(btn.getAttribute("data-preset")));
  });

  $("sbf_applyReco").addEventListener("click", ()=>{
    setPreset(recommendedPresetKey);
  });

  $("sbf_depth").addEventListener("change", ()=> setDepth($("sbf_depth").value));

  $("sbf_tabBrief").addEventListener("click", ()=> renderTab("brief"));
  $("sbf_tabPrompt").addEventListener("click", ()=> renderTab("prompt"));

  $("sbf_copy").addEventListener("click", ()=> copyText($("sbf_out").value));
  $("sbf_dlmd").addEventListener("click", ()=> downloadFile(`${out.filename}.md`, out.brief));
  $("sbf_dltxt").addEventListener("click", ()=> downloadFile(`${out.filename}.txt`, out.allTxt));

  $("sbf_buildVerdict").addEventListener("click", buildVerdictBox);
  $("sbf_copyVerdict").addEventListener("click", ()=> copyText($("sbf_verdictOut").value));

  $("sbf_buildFaqA").addEventListener("click", buildFaqAnswer);
  $("sbf_copyFaqA").addEventListener("click", ()=> copyText($("sbf_faqAOut").value));

  $("sbf_buildSchema").addEventListener("click", buildFaqSchema);
  $("sbf_copySchema").addEventListener("click", ()=> copyText($("sbf_schemaOut").value));

  $("sbf_analyzeSerp").addEventListener("click", analyzeSerp);
  $("sbf_copySerp").addEventListener("click", ()=> copyText($("sbf_serpOut").value));

  $("sbf_restore").addEventListener("click", restore);
  $("sbf_forget").addEventListener("click", forget);

  ["sbf_pros","sbf_cons","sbf_faqQ","sbf_faqBullets","sbf_serp1","sbf_serp2","sbf_serp3"].forEach(id=>{
    $(id).addEventListener("input", ()=>{
      if(id==="sbf_pros"||id==="sbf_cons") $(id).value = clampLines($(id).value, MAX.lines, MAX.lineLen);
      if(id==="sbf_faqQ") $(id).value = clampRaw($(id).value, MAX.faqQ);
      if(id==="sbf_faqBullets") $(id).value = clampLines($(id).value, MAX.faqBullets, MAX.lineLen);
      if(id==="sbf_serp1"||id==="sbf_serp2"||id==="sbf_serp3") $(id).value = clampRaw($(id).value, MAX.serpTitle);
      save();
    });
  });

  $("sbf_copyLink").addEventListener("click", async ()=>{
    try{ await navigator.clipboard.writeText(location.href); alert("Link copied!"); }
    catch(e){ alert("Could not copy automatically. Please copy the URL from your address bar."); }
  });
  $("sbf_share").addEventListener("click", async ()=>{
    const data={title:document.title,text:"Free SEO Content Brief Tool (No API)",url:location.href};
    try{
      if(navigator.share) await navigator.share(data);
      else{ await navigator.clipboard.writeText(location.href); alert("Share not supported here. Link copied instead!"); }
    }catch(e){}
  });
  $("sbf_bookmark").addEventListener("click", ()=>{
    alert("Tip: Press Ctrl+D (Windows) or Cmd+D (Mac) to bookmark this page.");
  });

  // Init
  setActivePresetButton();
  try{ const raw=localStorage.getItem(KEY); if(raw) apply(JSON.parse(raw)); }catch(e){}
  showReco($("sbf_kw").value);
  updateUpdateButtonState();
})();
</script>




<h3 class="wp-block-heading">How This Tool Improves Your SEO</h3>



<ul class="wp-block-list">
<li>Matches search intent automatically</li>



<li>Creates structured outlines Google prefers</li>



<li>Generates snippet-ready answers</li>



<li>Builds FAQ sections for schema markup</li>



<li>Reduces over-optimization mistakes</li>
</ul>



<h3 class="wp-block-heading">Who Should Use This Tool?</h3>



<ul class="wp-block-list">
<li>Bloggers</li>



<li>Niche site builders</li>



<li>AI content creators</li>



<li>Affiliate marketers</li>



<li>SaaS review writers</li>
</ul>



<h3 class="wp-block-heading">How It Works</h3>



<p class="wp-block-paragraph">3 Steps:</p>



<ol class="wp-block-list">
<li>Enter your keyword</li>



<li>Choose preset &amp; depth</li>



<li>Generate &amp; copy</li>
</ol>



<h3 class="wp-block-heading">Related resources:</h3>



<ul class="wp-block-list">
<li><a href="https://aieverydaytools.com/college-essay-flagged-as-ai/" data-type="post" data-id="2503">How to Pass AI Detection</a></li>
</ul>
<p>The post <a rel="nofollow" href="https://aieverydaytools.com/seo-content-brief-generator-pro/">SEO Content Brief Generator (Pro)</a> appeared first on <a rel="nofollow" href="https://aieverydaytools.com">AI Everyday Tools</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Image Prompt Generator (Pro)</title>
		<link>https://aieverydaytools.com/image-prompt-generator/</link>
		
		<dc:creator><![CDATA[Daniel]]></dc:creator>
		<pubDate>Fri, 06 Feb 2026 20:14:30 +0000</pubDate>
				<category><![CDATA[Best Free AI Tools]]></category>
		<guid isPermaLink="false">https://aieverydaytools.com/?p=2476</guid>

					<description><![CDATA[<p>Create better image prompts in seconds. Choose a style, lock what you like, randomize the rest, and generate polished prompts for ChatGPT, Midjourney, or SDXL—plus one-click templates, presets, prompt packs, and export/import for fast reuse.</p>
<p>The post <a rel="nofollow" href="https://aieverydaytools.com/image-prompt-generator/">Image Prompt Generator (Pro)</a> appeared first on <a rel="nofollow" href="https://aieverydaytools.com">AI Everyday Tools</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">This free AI Image Prompt Generator helps you create structured, high-quality prompts for Midjourney, DALL·E, and Stable Diffusion.<br><br>No login. No API. Just select your settings and generate powerful prompts instantly.</p>


<div class="aet-ipg3" data-aet3-widget="ipg3">
  <style>
    .aet-ipg3{
      font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;
      max-width:1080px;margin:18px auto;padding:16px;
      border:1px solid rgba(0,0,0,.10);border-radius:14px;background:#fff;
      box-shadow:0 6px 20px rgba(0,0,0,.06);
      position:relative;color:#111;
      --b: rgba(0,0,0,.16);
      --m: rgba(0,0,0,.65);
      --soft: rgba(0,0,0,.05);
      --soft2: rgba(0,0,0,.03);
      --focus: rgba(0,0,0,.10);
      --dark: #111;
      --light:#fff;
      -webkit-tap-highlight-color: transparent;
    }
    @media (prefers-color-scheme: dark){
      .aet-ipg3{
        background:#0f0f10;color:#f2f2f2;border-color:rgba(255,255,255,.14);
        --b: rgba(255,255,255,.18);
        --m: rgba(255,255,255,.70);
        --soft: rgba(255,255,255,.08);
        --soft2: rgba(255,255,255,.06);
        --focus: rgba(255,255,255,.12);
        --dark:#f2f2f2;
        --light:#111;
      }
    }
    .aet-ipg3 *{box-sizing:border-box}
    .aet-head{display:flex;gap:12px;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;margin-bottom:12px}
    .aet-title{font-size:18px;font-weight:900;line-height:1.2;margin:0}
    .aet-sub{margin:4px 0 0 0;color:var(--m);font-size:13px;line-height:1.35}
    .aet-pill{display:inline-flex;gap:8px;align-items:center;padding:6px 10px;border-radius:999px;font-size:12px;background:var(--soft);color:var(--m);white-space:nowrap;border:1px solid var(--b)}

    .aet-row{display:flex;gap:12px;flex-wrap:wrap;align-items:center;margin-top:10px}
    .aet-actions{display:flex;gap:10px;flex-wrap:wrap}

    .aet-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:10px}
    @media (max-width:900px){ .aet-grid{grid-template-columns:1fr} }

    .aet-field{display:flex;flex-direction:column;gap:6px}
    .aet-labelrow{display:flex;align-items:center;justify-content:space-between;gap:10px}
    .aet-label{font-size:12px;color:var(--m);font-weight:900}
    .aet-icons{display:inline-flex;gap:6px;align-items:center}

    .aet-inp,.aet-sel,.aet-ta{
      width:100%;padding:10px 11px;border-radius:10px;border:1px solid var(--b);
      background:transparent;font-size:14px;outline:none;color:inherit;
    }
    .aet-ta{min-height:92px;resize:vertical}
    .aet-inp:focus,.aet-sel:focus,.aet-ta:focus{box-shadow:0 0 0 3px var(--focus)}
    .aet-mini{font-size:12px;color:var(--m)}

    .aet-btn{
      appearance:none;border:0;border-radius:10px;padding:10px 12px;
      font-weight:900;font-size:14px;cursor:pointer;background:var(--dark);color:var(--light);
      box-shadow:0 6px 16px rgba(0,0,0,.12);line-height:1.1;user-select:none;
    }
    .aet-btn.secondary{background:var(--soft)!important;color:inherit!important;box-shadow:none!important;border:1px solid var(--b)!important}
    .aet-btn.ghost{background:transparent!important;color:inherit!important;box-shadow:none!important;border:1px solid var(--b)!important}
    .aet-btn:active{transform:translateY(1px)}

    .aet-lock,.aet-dice{
      display:inline-flex;align-items:center;justify-content:center;
      width:34px;height:28px;border-radius:10px;border:1px solid var(--b);
      background:transparent;color:inherit;cursor:pointer;user-select:none;font-size:14px;line-height:1;padding:0;
    }
    .aet-lock.active{background:var(--dark);color:var(--light);border-color:var(--dark)}

    .aet-tabs{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
    .aet-tab{
      padding:8px 10px;border-radius:999px;border:1px solid var(--b);
      background:var(--soft2);font-size:12px;font-weight:950;cursor:pointer;color:inherit;line-height:1.1;user-select:none;
    }
    .aet-tab:hover{background:var(--soft)}
    .aet-tab.active{background:var(--dark);color:var(--light);border-color:var(--dark)}

    .aet-panel{margin-top:10px;border:1px solid var(--b);border-radius:12px;padding:12px;background:var(--soft2)}
    .aet-note{margin-top:10px;padding:10px 12px;border-radius:12px;border:1px dashed var(--b);background:var(--soft2);font-size:12px;color:var(--m);line-height:1.35}

    .aet-chips{display:flex;gap:8px;flex-wrap:wrap}
    .aet-chip{
      font-size:12px;font-weight:950;border:1px solid var(--b);
      background:transparent;border-radius:999px;padding:7px 10px;cursor:pointer;color:inherit;
    }
    .aet-chip.active{background:var(--dark);color:var(--light);border-color:var(--dark)}

    .aet-templates{display:flex;gap:8px;flex-wrap:wrap}
    .aet-template{
      padding:8px 10px;border-radius:999px;border:1px solid var(--b);
      background:transparent;font-size:12px;font-weight:950;cursor:pointer;color:inherit;
    }
    .aet-template:hover{background:var(--soft)}

    .aet-out{margin-top:12px;border-radius:12px;border:1px solid var(--b);background:var(--soft2);padding:12px;display:none}
    .aet-out-head{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
    .aet-out-title{font-size:13px;font-weight:950;color:var(--m);margin:0}
    .aet-out pre{
      margin:0;white-space:pre-wrap;word-wrap:break-word;
      font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:13px;line-height:1.35;
    }

    .aet-split{display:grid;grid-template-columns:1fr 1fr;gap:12px}
    @media (max-width:900px){ .aet-split{grid-template-columns:1fr} }

    .aet-history{display:flex;flex-direction:column;gap:8px;max-height:360px;overflow:auto;padding-right:4px}
    .aet-card{border:1px solid var(--b);border-radius:12px;background:transparent;padding:10px}
    .aet-card-top{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:6px}
    .aet-card-title{font-size:12px;font-weight:950;color:var(--m);margin:0}
    .aet-card-actions{display:flex;gap:8px;flex-wrap:wrap}
    .aet-smallbtn{
      padding:7px 9px;border-radius:10px;border:1px solid var(--b);
      background:var(--soft2);font-size:12px;font-weight:950;cursor:pointer;color:inherit;
    }
    .aet-card pre{
      margin:0;white-space:pre-wrap;word-wrap:break-word;
      font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.35;
    }

    .aet-jsonbox{min-height:140px}
  </style>

  <div class="aet-head">
    <div>
      <p class="aet-title">Image Prompt Generator (Pro)</p>
      <p class="aet-sub">Reliable selects + no mobile scroll-jump + presets + export/import + history.</p>
    </div>
    <div class="aet-pill" data-aet3="status">Style: <strong>Photoreal / Cinematic</strong></div>
  </div>

  <!-- Core inputs -->
  <div class="aet-grid">
    <div class="aet-field">
      <div class="aet-labelrow">
        <div class="aet-label">Engine</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="engine">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="engine">🔓</button>
        </div>
      </div>
      <select class="aet-sel" data-aet3="engine">
        <option value="generic">Generic (works everywhere)</option>
        <option value="midjourney">Midjourney</option>
        <option value="sdxl">SDXL / Stable Diffusion</option>
      </select>
    </div>

    <div class="aet-field">
      <div class="aet-labelrow">
        <div class="aet-label">Style preset</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="style">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="style">🔓</button>
        </div>
      </div>
      <select class="aet-sel" data-aet3="style"></select>
    </div>

    <div class="aet-field">
      <div class="aet-labelrow">
        <div class="aet-label">Subject</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="subject">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="subject">🔓</button>
        </div>
      </div>
      <input class="aet-inp" data-aet3="subject" placeholder="e.g., a vintage motorcycle parked in rain" />
    </div>

    <div class="aet-field">
      <div class="aet-labelrow">
        <div class="aet-label">Scene / Setting</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="scene">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="scene">🔓</button>
        </div>
      </div>
      <input class="aet-inp" data-aet3="scene" placeholder="e.g., neon street, wet asphalt reflections" />
    </div>

    <div class="aet-field">
      <div class="aet-labelrow">
        <div class="aet-label">Mood</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="mood">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="mood">🔓</button>
        </div>
      </div>
      <input class="aet-inp" data-aet3="mood" placeholder="e.g., calm, dramatic, playful" />
    </div>

    <div class="aet-field">
      <div class="aet-labelrow">
        <div class="aet-label">Lighting</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="light">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="light">🔓</button>
        </div>
      </div>
      <input class="aet-inp" data-aet3="light" placeholder="e.g., soft golden hour, rim light" />
    </div>

    <div class="aet-field">
      <div class="aet-labelrow">
        <div class="aet-label">Camera / Lens</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="camera">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="camera">🔓</button>
        </div>
      </div>
      <input class="aet-inp" data-aet3="camera" placeholder="e.g., slight overhead shot, 35mm, shallow DOF" />
    </div>

    <div class="aet-field">
      <div class="aet-labelrow">
        <div class="aet-label">Composition</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="comp">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="comp">🔓</button>
        </div>
      </div>
      <input class="aet-inp" data-aet3="comp" placeholder="e.g., rule of thirds, leading lines" />
    </div>

    <div class="aet-field">
      <div class="aet-labelrow">
        <div class="aet-label">Color palette</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="color">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="color">🔓</button>
        </div>
      </div>
      <input class="aet-inp" data-aet3="color" placeholder="e.g., teal & orange, pastel, monochrome" />
    </div>

    <div class="aet-field">
      <div class="aet-labelrow">
        <div class="aet-label">Detail boosts</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="detail">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="detail">🔓</button>
        </div>
      </div>
      <input class="aet-inp" data-aet3="detail" placeholder="e.g., high detail, crisp textures, film grain" />
    </div>

    <div class="aet-field">
      <div class="aet-labelrow">
        <div class="aet-label">Aspect ratio</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="ar">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="ar">🔓</button>
        </div>
      </div>
      <select class="aet-sel" data-aet3="ar">
        <option value="1:1">1:1</option>
        <option value="16:9" selected>16:9</option>
        <option value="9:16">9:16</option>
        <option value="4:3">4:3</option>
        <option value="3:2">3:2</option>
        <option value="2:3">2:3</option>
      </select>
    </div>

    <div class="aet-field" style="grid-column:1/-1">
      <div class="aet-labelrow">
        <div class="aet-label">Negative prompt</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="neg">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="neg">🔓</button>
        </div>
      </div>
      <textarea class="aet-ta" data-aet3="neg" placeholder="e.g., text, watermark, logo, blurry, low-res"></textarea>
    </div>

    <div class="aet-field" style="grid-column:1/-1">
      <div class="aet-labelrow">
        <div class="aet-label">Extra constraints (optional)</div>
        <div class="aet-icons">
          <button class="aet-dice" type="button" data-aet3-dice="extra">🎲</button>
          <button class="aet-lock" type="button" data-aet3-lock="extra">🔓</button>
        </div>
      </div>
      <textarea class="aet-ta" data-aet3="extra" placeholder="e.g., no logos, no copyrighted characters"></textarea>
    </div>
  </div>

  <div class="aet-row">
    <label style="display:flex;gap:8px;align-items:center;padding:10px 12px;border-radius:10px;border:1px solid var(--b);background:var(--soft2);flex:1;min-width:260px">
      <input type="checkbox" data-aet3="chatgptMode" checked style="width:18px;height:18px" />
      <span style="font-size:13px;color:var(--m);line-height:1.25"><strong>ChatGPT mode:</strong> outputs a request to paste into ChatGPT (3 optimized prompts).</span>
    </label>

    <div class="aet-actions">
      <button class="aet-btn" type="button" data-aet3-action="gen">Generate</button>
      <button class="aet-btn secondary" type="button" data-aet3-action="pack">Prompt Pack (10)</button>
      <button class="aet-btn ghost" type="button" data-aet3-action="randAll">Randomize All</button>
      <button class="aet-btn ghost" type="button" data-aet3-action="randUnlocked">Randomize Unlocked</button>
      <button class="aet-btn ghost" type="button" data-aet3-action="lockAll">Lock All</button>
      <button class="aet-btn ghost" type="button" data-aet3-action="unlockAll">Unlock All</button>
      <button class="aet-btn secondary" type="button" data-aet3-action="clear">Clear</button>
    </div>
  </div>

  <!-- Tabs -->
  <div class="aet-tabs">
    <button class="aet-tab active" type="button" data-aet3-tab="templates">Templates</button>
    <button class="aet-tab" type="button" data-aet3-tab="random">Randomizer</button>
    <button class="aet-tab" type="button" data-aet3-tab="mj">Midjourney V7</button>
    <button class="aet-tab" type="button" data-aet3-tab="presets">Saved Presets</button>
    <button class="aet-tab" type="button" data-aet3-tab="export">Export / Import</button>
    <button class="aet-tab" type="button" data-aet3-tab="history">History</button>
    <button class="aet-tab" type="button" data-aet3-tab="help">Help</button>
  </div>

  <!-- Panels -->
  <div class="aet-panel" data-aet3-panel="templates">
    <div class="aet-label" style="margin-bottom:8px">One-click templates</div>
    <div class="aet-templates" data-aet3="templates"></div>
    <div class="aet-note">Templates set sane defaults. Users can lock + randomize freely afterwards.</div>
  </div>

  <div class="aet-panel" data-aet3-panel="random" style="display:none">
    <div class="aet-split">
      <div class="aet-field">
        <div class="aet-label">Random mode</div>
        <select class="aet-sel" data-aet3="randMode">
          <option value="any" selected>Any</option>
          <option value="realistic">Realistic photo</option>
          <option value="fantasy">Fantasy / Sci-Fi</option>
          <option value="product">Product (brand-free)</option>
          <option value="architecture">Architecture / Interior</option>
          <option value="abstract">Abstract / Pattern</option>
          <option value="food">Food / Culinary</option>
          <option value="character">Character / Creature</option>
        </select>
        <div class="aet-mini">Constrains subject+scene pool.</div>
      </div>

      <div class="aet-field">
        <div class="aet-label">Random intensity</div>
        <select class="aet-sel" data-aet3="randIntensity">
          <option value="subtle">Subtle</option>
          <option value="medium" selected>Medium</option>
          <option value="wild">Wild</option>
        </select>
        <div class="aet-mini">Controls how unusual details become.</div>
      </div>
    </div>
    <div class="aet-note"><strong>Tip:</strong> Lock Subject + Style → randomize Scene/Lighting/Camera for fast variations.</div>
  </div>

  <div class="aet-panel" data-aet3-panel="mj" style="display:none">
    <div class="aet-label">Quick flags</div>
    <div class="aet-chips" data-aet3="mjQuick" style="margin-top:8px">
      <span class="aet-chip active" data-flag="--style raw">--style raw</span>
      <span class="aet-chip" data-flag="--stylize 0">--stylize 0</span>
      <span class="aet-chip" data-flag="--stylize 100">--stylize 100</span>
      <span class="aet-chip" data-flag="--chaos 10">--chaos 10</span>
      <span class="aet-chip" data-flag="--chaos 30">--chaos 30</span>
      <span class="aet-chip" data-flag="--quality 1">--quality 1</span>
      <span class="aet-chip" data-flag="--quality 2">--quality 2</span>
    </div>

    <div class="aet-grid" style="margin-top:12px">
      <div class="aet-field"><div class="aet-label">Stylize</div><input class="aet-inp" data-aet3="mjStylize" placeholder="0 / 50 / 200" /></div>
      <div class="aet-field"><div class="aet-label">Chaos</div><input class="aet-inp" data-aet3="mjChaos" placeholder="0–100" /></div>
      <div class="aet-field"><div class="aet-label">Quality</div><input class="aet-inp" data-aet3="mjQuality" placeholder="1 or 2" /></div>
      <div class="aet-field"><div class="aet-label">Seed</div><input class="aet-inp" data-aet3="mjSeed" placeholder="12345" /></div>
    </div>

    <div class="aet-note">MJ flags are appended only when Engine=Midjourney and ChatGPT mode is OFF.</div>
  </div>

  <div class="aet-panel" data-aet3-panel="presets" style="display:none">
    <div class="aet-split">
      <div class="aet-field">
        <div class="aet-label">Preset name</div>
        <input class="aet-inp" data-aet3="presetName" placeholder="e.g., My Cinematic Covers" />
        <div class="aet-row" style="margin-top:8px">
          <button class="aet-btn" type="button" data-aet3-action="presetSave">Save current as preset</button>
          <button class="aet-btn ghost" type="button" data-aet3-action="presetRefresh">Refresh list</button>
        </div>
        <div class="aet-mini">Saved in LocalStorage. Per device.</div>
      </div>

      <div class="aet-field">
        <div class="aet-label">Your presets</div>
        <select class="aet-sel" data-aet3="presetList"></select>
        <div class="aet-row" style="margin-top:8px">
          <button class="aet-btn secondary" type="button" data-aet3-action="presetLoad">Load</button>
          <button class="aet-btn ghost" type="button" data-aet3-action="presetDelete">Delete</button>
        </div>
      </div>
    </div>
  </div>

  <div class="aet-panel" data-aet3-panel="export" style="display:none">
    <div class="aet-split">
      <div class="aet-field">
        <div class="aet-label">Export</div>
        <div class="aet-row" style="margin-top:0">
          <button class="aet-btn" type="button" data-aet3-action="exportState">Export current state (JSON)</button>
          <button class="aet-btn secondary" type="button" data-aet3-action="exportPresets">Export presets (JSON)</button>
        </div>
        <textarea class="aet-ta aet-jsonbox" data-aet3="jsonBox" placeholder="JSON will appear here..."></textarea>
        <div class="aet-row">
          <button class="aet-btn ghost" type="button" data-aet3-action="copyJson">Copy JSON</button>
          <button class="aet-btn ghost" type="button" data-aet3-action="clearJson">Clear</button>
        </div>
      </div>

      <div class="aet-field">
        <div class="aet-label">Import</div>
        <div class="aet-mini">Paste JSON into the box and import.</div>
        <div class="aet-row" style="margin-top:8px">
          <button class="aet-btn secondary" type="button" data-aet3-action="importState">Import state</button>
          <button class="aet-btn secondary" type="button" data-aet3-action="importPresets">Import presets</button>
        </div>
        <div class="aet-note">Importing presets merges by name (overwrites duplicates).</div>
      </div>
    </div>
  </div>

  <div class="aet-panel" data-aet3-panel="history" style="display:none">
    <div class="aet-row" style="margin-top:0">
      <div class="aet-label">History (last 20)</div>
      <div class="aet-actions">
        <button class="aet-btn ghost" type="button" data-aet3-action="historyClear">Clear history</button>
      </div>
    </div>
    <div class="aet-history" data-aet3="historyList"></div>
    <div class="aet-mini" style="margin-top:8px">Saved in your browser (LocalStorage) per device.</div>
  </div>

  <div class="aet-panel" data-aet3-panel="help" style="display:none">
    <div class="aet-note" style="margin-top:0">
      <strong>Scroll behavior:</strong> The page scrolls to the prompt ONLY after generating (Generate / Pack / Randomize / Template).<br/>
      <strong>Mobile fixes:</strong> 🎲/buttons do not trigger scroll jumps. Textareas scroll into view on focus (keyboard-safe).<br/>
      <strong>Copy modes:</strong> “Copy as …” formats output for your target tool.<br/>
      <strong>Presets:</strong> Save your favorite setups and reuse them quickly.<br/>
      <strong>Export/Import:</strong> Use JSON to backup/share your setups.
    </div>
  </div>

  <div class="aet-out" data-aet3="outBox">
    <div class="aet-out-head">
      <p class="aet-out-title" data-aet3="outTitle">Generated prompt</p>
      <div class="aet-actions">
        <button class="aet-btn secondary" type="button" data-aet3-action="copyGeneric">Copy as Generic</button>
        <button class="aet-btn secondary" type="button" data-aet3-action="copyMJ">Copy as Midjourney</button>
        <button class="aet-btn secondary" type="button" data-aet3-action="copySDXL">Copy as SDXL</button>
      </div>
    </div>
    <pre data-aet3="out"></pre>
  </div>

  <script>
  (function(){
    const widgets = Array.from(document.querySelectorAll('.aet-ipg3[data-aet3-widget="ipg3"]'))
      .filter(w => !w.dataset.aet3Inited);
    if (!widgets.length) return;

    widgets.forEach(root=>{
      root.dataset.aet3Inited="1";
      const $ = (sel)=>root.querySelector(sel);
      const $$ = (sel)=>Array.from(root.querySelectorAll(sel));

      const el = {
        status: $('[data-aet3="status"]'),
        engine: $('[data-aet3="engine"]'),
        style: $('[data-aet3="style"]'),
        subject: $('[data-aet3="subject"]'),
        scene: $('[data-aet3="scene"]'),
        mood: $('[data-aet3="mood"]'),
        light: $('[data-aet3="light"]'),
        camera: $('[data-aet3="camera"]'),
        comp: $('[data-aet3="comp"]'),
        color: $('[data-aet3="color"]'),
        detail: $('[data-aet3="detail"]'),
        ar: $('[data-aet3="ar"]'),
        neg: $('[data-aet3="neg"]'),
        extra: $('[data-aet3="extra"]'),
        chatgptMode: $('[data-aet3="chatgptMode"]'),

        randMode: $('[data-aet3="randMode"]'),
        randIntensity: $('[data-aet3="randIntensity"]'),

        mjQuick: $('[data-aet3="mjQuick"]'),
        mjStylize: $('[data-aet3="mjStylize"]'),
        mjChaos: $('[data-aet3="mjChaos"]'),
        mjQuality: $('[data-aet3="mjQuality"]'),
        mjSeed: $('[data-aet3="mjSeed"]'),

        templates: $('[data-aet3="templates"]'),

        presetName: $('[data-aet3="presetName"]'),
        presetList: $('[data-aet3="presetList"]'),

        jsonBox: $('[data-aet3="jsonBox"]'),

        historyList: $('[data-aet3="historyList"]'),

        outBox: $('[data-aet3="outBox"]'),
        outTitle: $('[data-aet3="outTitle"]'),
        out: $('[data-aet3="out"]'),
      };

      // ---- Data ----
      const stylePresets = [
        { name: "Photoreal / Cinematic", base: "photorealistic, cinematic, natural textures, realistic lighting, high detail" },
        { name: "Product Shot", base: "clean product photography, studio lighting, sharp focus, minimal background, premium look" },
        { name: "Illustration", base: "high-quality illustration, crisp lines, rich shading, stylized but coherent" },
        { name: "3D Render", base: "high-end 3d render, global illumination, ray traced reflections, clean composition" },
        { name: "Anime", base: "anime style, clean linework, vibrant colors, expressive composition" },
        { name: "Vintage Film", base: "35mm film look, subtle grain, soft contrast, vintage color grading" },
        { name: "Moody Noir", base: "film noir, high contrast, dramatic shadows, low-key lighting" },
        { name: "Abstract Art", base: "abstract art, strong shapes, interesting textures, intentional composition" }
      ];

      const packVariants = [
        { name: "Cinematic", add: "cinematic framing, dramatic lighting, film still, high production value" },
        { name: "Minimal", add: "minimal composition, simple background, clean silhouette, strong subject readability" },
        { name: "Macro", add: "macro close-up, extreme detail, shallow depth of field, creamy bokeh" },
        { name: "Wide", add: "wide shot, environmental storytelling, strong depth, layered foreground/background" },
        { name: "High-Key", add: "high-key lighting, bright airy feel, soft shadows, clean look" },
        { name: "Low-Key", add: "low-key lighting, moody shadows, dramatic contrast, noir atmosphere" },
        { name: "Editorial", add: "editorial photography, magazine look, crisp focus, intentional styling" },
        { name: "Dreamy", add: "dreamy haze, soft glow, pastel diffusion, ethereal atmosphere" },
        { name: "Hyperreal", add: "hyperreal textures, ultra sharp micro-details, realistic materials, lifelike" },
        { name: "Experimental", add: "unexpected angle, surreal twist, bold composition, artistic risk, high creativity" }
      ];

      const RAND = {
        common: {
          moods: ["calm","dramatic","playful","mysterious","cozy","tense","uplifting","melancholic","energetic","serene","luxurious","minimal"],
          lights: ["soft golden hour","overcast diffused light","dramatic rim light","studio softbox lighting","candlelit warm glow","neon cyan & magenta","moonlit blue ambience","hard sunlight with sharp shadows","volumetric light rays and haze","practical indoor lighting, warm tungsten"],
          cameras: ["eye-level, 50mm, shallow depth of field","slight overhead shot, 35mm, natural perspective","low angle, 24mm wide","telephoto 85mm portrait, compressed background","macro 100mm, extreme detail","top-down flat lay, even lighting","handheld documentary look, subtle motion"],
          comps: ["centered subject, clean background","rule of thirds, leading lines","symmetry, strong silhouette","foreground bokeh frame","layered depth with foreground props","negative space composition","dynamic diagonal composition"],
          colors: ["teal & orange cinematic grade","monochrome with one accent color","pastel palette","earth tones","high-contrast black and white","neon palette","muted film color grading","warm highlights with cool shadows"],
          detailsSafe: ["high detail, crisp textures","sharp focus on subject, clean edges","natural skin/material texture","subtle dust/particles in the air","realistic reflections and micro-scratches","filmic contrast, gentle grain"],
          detailsWild: ["subtle surreal elements","unexpected scale contrast","glowing particles, light trails","liquid metal accents","iridescent shimmer","dreamlike distortion"],
          negatives: ["blurry, low-res, pixelated","text, watermark, logo","bad anatomy, extra limbs, deformed","overexposed, underexposed, noisy","cropped subject, out of frame, duplicates","artifacts, banding, posterization"]
        },
        pools: {
          realistic: {
            subjects:["a portrait of a person wearing a tailored coat","a vintage car parked on a rainy street","a cyclist in motion","a modern living room interior","a minimal product on a pedestal","a mountain landscape at dawn","a chef plating a dish","hands crafting pottery"],
            scenes:["a rainy city street with wet asphalt reflections","a sunlit apartment with soft curtains","a quiet café interior","a foggy forest trail","a clean studio backdrop","a coastal cliff overlooking the sea","an industrial warehouse with window light"]
          },
          fantasy: {
            subjects:["a lone knight with a glowing sword","a floating island with waterfalls","a bioluminescent creature","a sorcerer casting light spells","a futuristic android with delicate engravings","a starship cockpit view"],
            scenes:["an ancient ruin covered in moss and runes","a neon cyberpunk alley","a crystal cave with glowing walls","a sky full of aurora and strange constellations","a desert with massive alien monoliths"]
          },
          product: {
            subjects:["a premium wristwatch","a sleek wireless earbud case","a glass perfume bottle","a minimalist desk lamp","a matte-black camera","a stainless steel kitchen knife","a luxury sneaker","a leather wallet"],
            scenes:["a seamless studio gradient background","a clean marble surface","a dark moody tabletop setup","a bright white studio with soft shadows","a reflective black surface with subtle fog"]
          },
          architecture: {
            subjects:["a modern brutalist building façade","a cozy Scandinavian living room","a Japanese zen courtyard","a futuristic museum interior","a glass skyscraper lobby","a rustic cabin kitchen"],
            scenes:["a sunlit atrium with plants","a narrow alley with textured walls","a minimalist gallery space","a rooftop terrace at sunset","a warm-lit interior with wood and stone materials"]
          },
          abstract: {
            subjects:["a geometric composition of shapes","an ink-in-water diffusion","a fluid marble pattern","a fractal-like organic texture","a gradient light sculpture","a paper-cut layered artwork"],
            scenes:["a clean neutral backdrop","a dark void with floating shapes","a textured canvas surface","a reflective surface with soft fog"]
          },
          food: {
            subjects:["a gourmet burger","a bowl of ramen with steam","a croissant with flaky layers","a colorful sushi platter","a chocolate cake slice","a fresh salad bowl","a latte with art foam","a stack of pancakes with syrup"],
            scenes:["a rustic wooden table","a bright kitchen counter","a moody restaurant tabletop","a street food stall setup"]
          },
          character: {
            subjects:["a tiny detective raccoon","a fluffy dragon-puppy hybrid","a porcelain robot kitten","a grumpy panda chef","a frog in a tuxedo","a cyberpunk corgi","a whimsical owl librarian"],
            scenes:["a cozy kitchen with flour particles","a stage with spotlights and fog","a neon street at night","a warm library interior","a whimsical workshop filled with gadgets"]
          }
        }
      };

      // ---- Helpers ----
      function clean(s){ return (s||"").trim().replace(/\s+/g," "); }
      function pick(arr){ return arr[Math.floor(Math.random()*arr.length)]; }
      function num(min,max){ return Math.floor(Math.random()*(max-min+1))+min; }

      async function copyText(text){
        try { await navigator.clipboard.writeText(text); }
        catch(e){
          const ta = document.createElement("textarea");
          ta.value = text; ta.style.position="fixed"; ta.style.left="-9999px";
          document.body.appendChild(ta); ta.select(); document.execCommand("copy");
          document.body.removeChild(ta);
        }
      }

      // ✅ Show + optional scroll to output (ONLY when requested)
      function show(text, title, doScroll=false){
        el.outTitle.textContent = title || "Generated prompt";
        el.out.textContent = text || "";
        el.outBox.style.display = "block";

        if (doScroll){
          setTimeout(()=>{
            try{
              el.outBox.scrollIntoView({ behavior:"smooth", block:"start" });
            }catch(err){}
          }, 80);
        }
      }

      function nowStamp(){
        const d = new Date();
        const pad = (n)=> String(n).padStart(2,"0");
        return `${d.getFullYear()}-${pad(d.getMonth()+1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;
      }

      // ---- Keyboard-safe focus (only on focus) ----
      function focusScrollIntoView(target){
        setTimeout(()=>{
          try{
            const vv = window.visualViewport;
            const viewportH = vv ? vv.height : window.innerHeight;
            const rect = target.getBoundingClientRect();
            const margin = 16;
            const tooLow = rect.bottom > (viewportH - margin);
            const tooHigh = rect.top < margin;
            if (tooLow || tooHigh){
              target.scrollIntoView({behavior:"smooth", block:"center", inline:"nearest"});
            }
          }catch(err){}
        }, 250);
      }
      root.addEventListener("focusin",(e)=>{
        const t = e.target;
        if (!t) return;
        if (t.matches("input, textarea, select")) focusScrollIntoView(t);
      });

      // ---- Prevent scroll jump on taps/clicks of controls ----
      root.addEventListener("pointerdown",(e)=>{
        const isControl = e.target.closest("[data-aet3-dice],[data-aet3-lock],[data-aet3-action],[data-aet3-tab],.aet-chip,.aet-template,.aet-smallbtn");
        if (isControl) e.preventDefault();
      }, {passive:false});

      // ---- Fill style select ----
      function fillStyles(){
        el.style.innerHTML = "";
        stylePresets.forEach(s=>{
          const opt = document.createElement("option");
          opt.value = s.name; opt.textContent = s.name;
          el.style.appendChild(opt);
        });
        el.style.value = "Photoreal / Cinematic";
      }

      function styleBase(){
        const s = stylePresets.find(x=>x.name===el.style.value);
        return s ? s.base : stylePresets[0].base;
      }

      function updateStatus(){
        el.status.innerHTML = 'Style: <strong>' + (el.style.value || "Photoreal / Cinematic") + '</strong>';
      }

      // ---- Locks ----
      const lockState = {
        engine:false, style:false, subject:false, scene:false, mood:false, light:false,
        camera:false, comp:false, color:false, detail:false, ar:false, neg:false, extra:false
      };
      function renderLocks(){
        $$('[data-aet3-lock]').forEach(btn=>{
          const key = btn.getAttribute('data-aet3-lock');
          const on = !!lockState[key];
          btn.classList.toggle('active', on);
          btn.textContent = on ? "🔒" : "🔓";
        });
      }

      // ---- Tabs ----
      function showTab(key){
        $$('[data-aet3-tab]').forEach(btn=>{
          btn.classList.toggle('active', btn.getAttribute('data-aet3-tab')===key);
        });
        $$('[data-aet3-panel]').forEach(p=>{
          p.style.display = (p.getAttribute('data-aet3-panel')===key) ? "block" : "none";
        });
      }

      // ---- MJ Flags ----
      function activeQuickFlags(){
        return $$('.aet-chip.active').map(n=>n.getAttribute('data-flag'));
      }
      function buildMjFlags(){
        let flags = activeQuickFlags();
        const ms = clean(el.mjStylize.value);
        const mc = clean(el.mjChaos.value);
        const mq = clean(el.mjQuality.value);
        const md = clean(el.mjSeed.value);
        const rm = (p)=> flags = flags.filter(f=>!f.startsWith(p));
        if (ms){ rm("--stylize"); flags.push(`--stylize ${ms}`); }
        if (mc){ rm("--chaos"); flags.push(`--chaos ${mc}`); }
        if (mq){ rm("--quality"); flags.push(`--quality ${mq}`); }
        if (md){ rm("--seed"); flags.push(`--seed ${md}`); }
        return flags.join(" ");
      }

      // ---- Build output modes ----
      function buildCore(extraAdd=""){
        const parts = [];
        const s = clean(el.subject.value);
        const sc = clean(el.scene.value);
        const m = clean(el.mood.value);
        const l = clean(el.light.value);
        const c = clean(el.camera.value);
        const cp = clean(el.comp.value);
        const col = clean(el.color.value);
        const d = clean(el.detail.value);
        const base = styleBase();

        if (s) parts.push(s);
        if (sc) parts.push("in " + sc);
        if (m) parts.push("mood: " + m);
        if (l) parts.push("lighting: " + l);
        if (c) parts.push("camera: " + c);
        if (cp) parts.push("composition: " + cp);
        if (col) parts.push("colors: " + col);
        if (base) parts.push(base);
        if (d) parts.push(d);
        if (extraAdd) parts.push(extraAdd);

        return parts.filter(Boolean).join(", ");
      }

      function buildGeneric(extraAdd=""){
        const arVal = el.ar.value;
        const negVal = clean(el.neg.value).replace(/\n+/g,", ");
        const extraVal = (el.extra.value||"").trim().replace(/\n+/g,", ").trim();
        const core = buildCore(extraAdd);
        const extraPart = extraVal ? ("\nConstraints: " + extraVal) : "";
        const negPart = negVal ? ("\nAvoid: " + negVal) : "";
        return (core || "[Add at least a Subject]") + `\nAspect ratio: ${arVal}` + extraPart + negPart;
      }

      function buildMJ(extraAdd=""){
        const arVal = el.ar.value;
        const negVal = clean(el.neg.value).replace(/\n+/g,", ");
        const extraVal = (el.extra.value||"").trim().replace(/\n+/g,", ").trim();
        const core = buildCore(extraAdd);
        const mjFlags = buildMjFlags();
        const noPart = negVal ? (" --no " + negVal) : "";
        const extraPart = extraVal ? (", " + extraVal) : "";
        const arFlag = ` --ar ${arVal}`;
        const flags = mjFlags ? (" " + mjFlags) : "";
        return (core || "[Add at least a Subject]") + extraPart + arFlag + flags + noPart;
      }

      function buildSDXL(extraAdd=""){
        const arVal = el.ar.value;
        const extraVal = (el.extra.value||"").trim();
        const core = buildCore(extraAdd);
        return [
          "Prompt:",
          core || "[Add at least a Subject]",
          "",
          "Negative prompt:",
          (el.neg.value||"").trim() || "(none)",
          "",
          "Settings hint:",
          `- Aspect ratio: ${arVal}`,
          "- Use hi-res fix if available; keep CFG moderate; tune steps as needed.",
          extraVal ? "" : "",
          extraVal ? ("Constraints:\n" + extraVal) : ""
        ].filter(Boolean).join("\n");
      }

      function buildChatGPT(extraAdd=""){
        const eng = el.engine.value;
        const arVal = el.ar.value;
        const negVal = clean(el.neg.value).replace(/\n+/g,", ");
        const extraVal = (el.extra.value||"").trim().replace(/\n+/g,", ").trim();
        const core = buildCore(extraAdd);
        return [
          "You are an expert image prompt engineer.",
          "Create 3 optimized prompts based on my inputs: (1) detailed, (2) concise, (3) experimental.",
          "Return them in a clean list and include a matching negative prompt.",
          "",
          "Inputs:",
          `- Engine target: ${eng}`,
          `- Aspect ratio: ${arVal}`,
          `- Prompt ingredients: ${core || "[missing subject/scene — ask me to fill them]"}`,
          `- Negative prompt: ${negVal || "(none)"}`,
          extraVal ? `- Constraints: ${extraVal}` : "",
          eng === "midjourney" ? "- If Midjourney: include useful v7 flags (style raw, stylize, chaos, quality) where appropriate." : "",
          "",
          "Rules:",
          "- Do not include copyrighted characters or logos.",
          "- Avoid text/watermarks unless explicitly requested.",
          "- Keep the subject clear and unambiguous."
        ].filter(Boolean).join("\n");
      }

      function generate(extraAdd=""){
        if (el.chatgptMode.checked) return buildChatGPT(extraAdd);
        if (el.engine.value === "midjourney") return buildMJ(extraAdd);
        if (el.engine.value === "sdxl") return buildSDXL(extraAdd);
        return buildGeneric(extraAdd);
      }

      // ---- Randomize ----
      function getPool(mode){
        if (mode === "any") return pick(Object.values(RAND.pools));
        return RAND.pools[mode] || RAND.pools.realistic;
      }
      function randomizeField(key){
        if (lockState[key]) return;

        const mode = el.randMode.value;
        const intensity = el.randIntensity.value;
        const pool = getPool(mode);

        if (key === "engine") return (el.engine.value = pick(["generic","midjourney","sdxl"]));
        if (key === "style")  return (el.style.value = pick(stylePresets).name);
        if (key === "ar")     return (el.ar.value = pick(["1:1","16:9","9:16","4:3","3:2","2:3"]));

        if (key === "subject") return (el.subject.value = pick(pool.subjects));
        if (key === "scene")   return (el.scene.value   = pick(pool.scenes));
        if (key === "mood")    return (el.mood.value    = pick(RAND.common.moods));
        if (key === "light")   return (el.light.value   = pick(RAND.common.lights));
        if (key === "camera")  return (el.camera.value  = pick(RAND.common.cameras));
        if (key === "comp")    return (el.comp.value    = pick(RAND.common.comps));
        if (key === "color")   return (el.color.value   = pick(RAND.common.colors));
        if (key === "neg")     return (el.neg.value     = pick(RAND.common.negatives));

        if (key === "extra"){
          const opts = [
            "no logos, no copyrighted characters, no watermarks",
            "no text, keep background simple",
            "brand-free, generic objects only, no trademarks",
            "avoid gore, avoid explicit content, keep it safe"
          ];
          return (el.extra.value = pick(opts));
        }

        if (key === "detail"){
          if (intensity === "subtle") el.detail.value = pick(RAND.common.detailsSafe);
          else if (intensity === "medium") el.detail.value = pick(RAND.common.detailsSafe) + ", " + pick(RAND.common.detailsWild);
          else el.detail.value = pick(RAND.common.detailsWild) + ", " + pick(RAND.common.detailsWild) + ", high detail";
          return;
        }
      }
      function randomizeAll(){
        ["engine","style","subject","scene","mood","light","camera","comp","color","detail","ar","neg","extra"].forEach(randomizeField);
        if (el.engine.value === "midjourney"){
          el.mjStylize.value = el.mjStylize.value || pick(["0","50","100","200"]);
          el.mjChaos.value   = el.mjChaos.value   || String(num(0,35));
          el.mjQuality.value = el.mjQuality.value || pick(["1","2",""]);
          el.mjSeed.value    = el.mjSeed.value    || String(num(1,999999));
        }
      }
      function randomizeUnlocked(){
        Object.keys(lockState).forEach(k=>{ if (!lockState[k]) randomizeField(k); });
      }

      // ---- History ----
      const WID = root.dataset.aet3Id || (root.dataset.aet3Id = ("aet3_" + Math.random().toString(36).slice(2,9)));
      const HISTORY_KEY = "aet_ipg3_history_" + WID;

      function loadHistory(){ try{ return JSON.parse(localStorage.getItem(HISTORY_KEY) || "[]"); }catch(e){ return []; } }
      function saveHistory(arr){ localStorage.setItem(HISTORY_KEY, JSON.stringify(arr.slice(0,20))); }

      function getState(){
        return {
          engine: el.engine.value, style: el.style.value, ar: el.ar.value,
          subject: el.subject.value, scene: el.scene.value, mood: el.mood.value, light: el.light.value,
          camera: el.camera.value, comp: el.comp.value, color: el.color.value, detail: el.detail.value,
          neg: el.neg.value, extra: el.extra.value, chatgptMode: !!el.chatgptMode.checked,
          randMode: el.randMode.value, randIntensity: el.randIntensity.value,
          mj: { quick: activeQuickFlags(), stylize: el.mjStylize.value, chaos: el.mjChaos.value, quality: el.mjQuality.value, seed: el.mjSeed.value },
          locks: {...lockState}
        };
      }

      function applyState(st){
        if (!st) return;
        el.engine.value = st.engine || "generic";
        el.style.value = st.style || "Photoreal / Cinematic";
        el.ar.value = st.ar || "16:9";
        el.subject.value = st.subject || "";
        el.scene.value = st.scene || "";
        el.mood.value = st.mood || "";
        el.light.value = st.light || "";
        el.camera.value = st.camera || "";
        el.comp.value = st.comp || "";
        el.color.value = st.color || "";
        el.detail.value = st.detail || "";
        el.neg.value = st.neg || "";
        el.extra.value = st.extra || "";
        el.chatgptMode.checked = !!st.chatgptMode;

        el.randMode.value = st.randMode || "any";
        el.randIntensity.value = st.randIntensity || "medium";

        $$('.aet-chip').forEach(ch=>ch.classList.remove('active'));
        const quick = st.mj?.quick || ["--style raw"];
        $$('.aet-chip').forEach(ch=>{
          const flag = ch.getAttribute('data-flag');
          if (quick.includes(flag)) ch.classList.add('active');
        });
        el.mjStylize.value = st.mj?.stylize || "";
        el.mjChaos.value = st.mj?.chaos || "";
        el.mjQuality.value = st.mj?.quality || "";
        el.mjSeed.value = st.mj?.seed || "";

        if (st.locks){
          Object.keys(lockState).forEach(k=> lockState[k] = !!st.locks[k]);
          renderLocks();
        }
        updateStatus();
      }

      function addHistory(title, text){
        const arr = loadHistory();
        arr.unshift({ title, ts: nowStamp(), text, state: getState() });
        saveHistory(arr);
        renderHistory();
      }

      function renderHistory(){
        const list = el.historyList;
        const arr = loadHistory();
        list.innerHTML = "";
        if (!arr.length){
          list.innerHTML = '<div class="aet-mini">No history yet. Generate something first.</div>';
          return;
        }
        arr.forEach((h, idx)=>{
          const card = document.createElement("div");
          card.className = "aet-card";

          const top = document.createElement("div");
          top.className = "aet-card-top";

          const t = document.createElement("p");
          t.className = "aet-card-title";
          t.textContent = `${idx+1}) ${h.title} · ${h.ts}`;

          const acts = document.createElement("div");
          acts.className = "aet-card-actions";

          const bLoad = document.createElement("button");
          bLoad.className = "aet-smallbtn";
          bLoad.type = "button";
          bLoad.textContent = "Load";
          bLoad.onclick = () => { applyState(h.state); show(h.text, "Loaded from history", false); };

          const bCopy = document.createElement("button");
          bCopy.className = "aet-smallbtn";
          bCopy.type = "button";
          bCopy.textContent = "Copy";
          bCopy.onclick = () => copyText(h.text);

          acts.appendChild(bLoad);
          acts.appendChild(bCopy);

          top.appendChild(t);
          top.appendChild(acts);

          const pre = document.createElement("pre");
          pre.textContent = h.text;

          card.appendChild(top);
          card.appendChild(pre);
          list.appendChild(card);
        });
      }

      // ---- Presets ----
      const PRESET_KEY = "aet_ipg3_presets_" + WID;
      function loadPresets(){ try{ return JSON.parse(localStorage.getItem(PRESET_KEY) || "[]"); }catch(e){ return []; } }
      function savePresets(arr){ localStorage.setItem(PRESET_KEY, JSON.stringify(arr)); }

      function renderPresetList(){
        const arr = loadPresets();
        el.presetList.innerHTML = "";
        if (!arr.length){
          const opt = document.createElement("option");
          opt.value = "";
          opt.textContent = "(no presets yet)";
          el.presetList.appendChild(opt);
          return;
        }
        arr.slice().sort((a,b)=> (a.name||"").localeCompare(b.name||"")).forEach(p=>{
          const opt = document.createElement("option");
          opt.value = p.name;
          opt.textContent = p.name;
          el.presetList.appendChild(opt);
        });
      }

      function savePresetByName(name){
        name = clean(name);
        if (!name) return false;
        const arr = loadPresets();
        const st = getState();
        const idx = arr.findIndex(x=>x.name===name);
        const item = { name, savedAt: nowStamp(), state: st };
        if (idx >= 0) arr[idx] = item; else arr.push(item);
        savePresets(arr);
        renderPresetList();
        return true;
      }
      function loadPresetByName(name){
        const arr = loadPresets();
        const p = arr.find(x=>x.name===name);
        if (p) applyState(p.state);
        return !!p;
      }
      function deletePresetByName(name){
        const arr = loadPresets().filter(x=>x.name!==name);
        savePresets(arr);
        renderPresetList();
      }

      // ---- Export / Import ----
      function exportStateJSON(){
        const obj = { type:"aet_ipg3_state", version:1, exportedAt: nowStamp(), state:getState() };
        return JSON.stringify(obj, null, 2);
      }
      function exportPresetsJSON(){
        const obj = { type:"aet_ipg3_presets", version:1, exportedAt: nowStamp(), presets:loadPresets() };
        return JSON.stringify(obj, null, 2);
      }
      function safeParseJSON(txt){ try{ return JSON.parse(txt); }catch(e){ return null; } }
      function importStateJSON(txt){
        const obj = safeParseJSON(txt);
        if (!obj || obj.type!=="aet_ipg3_state" || !obj.state) return false;
        applyState(obj.state); return true;
      }
      function importPresetsJSON(txt){
        const obj = safeParseJSON(txt);
        if (!obj || obj.type!=="aet_ipg3_presets" || !Array.isArray(obj.presets)) return false;
        const incoming = obj.presets;
        const current = loadPresets();
        const map = new Map(current.map(p=>[p.name,p]));
        incoming.forEach(p=>{ if (p && p.name && p.state) map.set(p.name, p); });
        savePresets(Array.from(map.values()));
        renderPresetList();
        return true;
      }

      // ---- Templates ----
      const templates = [
        { label:"Blog cover 16:9", apply:()=>{
          if (!lockState.ar) el.ar.value="16:9";
          if (!lockState.engine) el.engine.value="generic";
          if (!lockState.style) el.style.value="Photoreal / Cinematic";
          if (!lockState.neg) el.neg.value="text, watermark, logo, blurry, low-res";
          if (!lockState.detail) el.detail.value="high detail, crisp textures, cinematic lighting";
        }},
        { label:"YouTube thumbnail 16:9 (punchy)", apply:()=>{
          if (!lockState.ar) el.ar.value="16:9";
          if (!lockState.engine) el.engine.value="midjourney";
          if (!lockState.style) el.style.value="Photoreal / Cinematic";
          if (!lockState.comp) el.comp.value="centered subject, strong silhouette, high contrast";
          if (!lockState.color) el.color.value="high contrast with one accent color";
          if (!lockState.neg) el.neg.value="tiny text, watermark, cluttered background, blurry";
        }},
        { label:"Instagram Reel cover 9:16", apply:()=>{
          if (!lockState.ar) el.ar.value="9:16";
          if (!lockState.engine) el.engine.value="midjourney";
          if (!lockState.style) el.style.value="Photoreal / Cinematic";
          if (!lockState.comp) el.comp.value="centered subject, clean background, strong readability";
          if (!lockState.neg) el.neg.value="text, watermark, logo, blurry, low-res";
        }},
        { label:"Product hero shot", apply:()=>{
          if (!lockState.engine) el.engine.value="sdxl";
          if (!lockState.style) el.style.value="Product Shot";
          if (!lockState.ar) el.ar.value="16:9";
          if (!lockState.scene) el.scene.value="a clean studio setup with subtle gradient background";
          if (!lockState.light) el.light.value="studio softbox lighting, soft shadows";
          if (!lockState.neg) el.neg.value="logo, watermark, text, fingerprints, dust, blurry";
        }},
        { label:"Wallpaper (clean, wide)", apply:()=>{
          if (!lockState.ar) el.ar.value="16:9";
          if (!lockState.engine) el.engine.value="generic";
          if (!lockState.style) el.style.value="Vintage Film";
          if (!lockState.comp) el.comp.value="wide shot, negative space composition";
          if (!lockState.detail) el.detail.value="gentle grain, soft contrast, pleasing color grading";
        }},
      ];

      function renderTemplates(){
        el.templates.innerHTML = "";
        templates.forEach(t=>{
          const b = document.createElement("button");
          b.type="button"; b.className="aet-template"; b.textContent=t.label;
          b.onclick = ()=>{
            t.apply();
            updateStatus();
            const txt = generate();
            show(txt, "Template applied", true); // ✅ scroll on template apply
            addHistory("Template: " + t.label, txt);
          };
          el.templates.appendChild(b);
        });
      }

      // ---- Click handling ----
      root.addEventListener("click",(e)=>{
        const lockBtn = e.target.closest("[data-aet3-lock]");
        if (lockBtn){
          const k = lockBtn.getAttribute("data-aet3-lock");
          lockState[k] = !lockState[k];
          renderLocks();
          return;
        }

        const diceBtn = e.target.closest("[data-aet3-dice]");
        if (diceBtn){
          const k = diceBtn.getAttribute("data-aet3-dice");
          randomizeField(k);
          updateStatus();
          const txt = generate();
          show(txt, "Updated (field randomized)", false); // ❌ no scroll for dice
          addHistory("Field dice: " + k, txt);
          return;
        }

        const tabBtn = e.target.closest("[data-aet3-tab]");
        if (tabBtn){
          showTab(tabBtn.getAttribute("data-aet3-tab"));
          return;
        }

        const chip = e.target.closest(".aet-chip");
        if (chip){
          chip.classList.toggle("active");
          return;
        }

        const act = e.target.closest("[data-aet3-action]");
        if (!act) return;
        const a = act.getAttribute("data-aet3-action");

        if (a==="gen"){
          updateStatus();
          const txt = generate();
          show(txt, "Generated prompt", true); // ✅ scroll on generate
          addHistory("Generate", txt);
          return;
        }

        if (a==="pack"){
          updateStatus();
          const lines = [];
          lines.push("Prompt Pack (10)\n");
          packVariants.forEach((v, idx)=>{
            lines.push(`${idx+1}) ${v.name}`);
            lines.push(generate(v.add));
            lines.push("\n---\n");
          });
          const txt = lines.join("\n");
          show(txt, "Prompt Pack (10)", true); // ✅ scroll on pack
          addHistory("Prompt Pack", txt);
          return;
        }

        if (a==="randAll"){
          randomizeAll();
          updateStatus();
          const txt = generate();
          show(txt, "Randomized prompt", true); // ✅ scroll on randomize all
          addHistory("Randomize All", txt);
          return;
        }

        if (a==="randUnlocked"){
          randomizeUnlocked();
          updateStatus();
          const txt = generate();
          show(txt, "Randomized (unlocked only)", true); // ✅ scroll on randomize unlocked
          addHistory("Randomize Unlocked", txt);
          return;
        }

        if (a==="lockAll"){
          Object.keys(lockState).forEach(k=>lockState[k]=true);
          renderLocks();
          return;
        }
        if (a==="unlockAll"){
          Object.keys(lockState).forEach(k=>lockState[k]=false);
          renderLocks();
          return;
        }

        if (a==="clear"){
          el.subject.value=""; el.scene.value=""; el.mood.value=""; el.light.value="";
          el.camera.value=""; el.comp.value=""; el.color.value=""; el.detail.value="";
          el.neg.value=""; el.extra.value="";
          el.chatgptMode.checked=true;
          el.mjStylize.value=""; el.mjChaos.value=""; el.mjQuality.value=""; el.mjSeed.value="";
          el.outBox.style.display="none"; el.out.textContent="";
          return;
        }

        if (a==="copyGeneric") return copyText(buildGeneric());
        if (a==="copyMJ") return copyText(buildMJ());
        if (a==="copySDXL") return copyText(buildSDXL());

        if (a==="historyClear"){
          localStorage.removeItem(HISTORY_KEY);
          renderHistory();
          return;
        }

        if (a==="presetSave"){
          const ok = savePresetByName(el.presetName.value);
          if (ok){
            el.presetName.value="";
            show(generate(), "Preset saved", false);
          }else{
            show("Please enter a preset name first.", "Preset save failed", false);
          }
          return;
        }
        if (a==="presetRefresh"){ renderPresetList(); return; }
        if (a==="presetLoad"){
          const name = el.presetList.value;
          const ok = loadPresetByName(name);
          if (ok){
            updateStatus();
            show(generate(), "Preset loaded", false);
          }else{
            show("No preset selected.", "Load failed", false);
          }
          return;
        }
        if (a==="presetDelete"){
          const name = el.presetList.value;
          if (name){
            deletePresetByName(name);
            show("Preset deleted: " + name, "Deleted", false);
          }else{
            show("No preset selected.", "Delete failed", false);
          }
          return;
        }

        if (a==="exportState"){ el.jsonBox.value = exportStateJSON(); return; }
        if (a==="exportPresets"){ el.jsonBox.value = exportPresetsJSON(); return; }
        if (a==="copyJson"){ return copyText(el.jsonBox.value || ""); }
        if (a==="clearJson"){ el.jsonBox.value = ""; return; }
        if (a==="importState"){
          const ok = importStateJSON(el.jsonBox.value || "");
          show(ok ? "State imported." : "Import failed. JSON must be a state export from this tool.", ok ? "Imported" : "Import failed", false);
          return;
        }
        if (a==="importPresets"){
          const ok = importPresetsJSON(el.jsonBox.value || "");
          show(ok ? "Presets imported/merged." : "Import failed. JSON must be a presets export from this tool.", ok ? "Imported" : "Import failed", false);
          return;
        }
      });

      // ---- Init ----
      (function init(){
        el.style.innerHTML = "";
        stylePresets.forEach(s=>{
          const opt = document.createElement("option");
          opt.value = s.name; opt.textContent = s.name;
          el.style.appendChild(opt);
        });
        el.style.value = "Photoreal / Cinematic";
        updateStatus();
        renderLocks();
        renderTemplates();
        renderHistory();
        renderPresetList();
        showTab("templates");
      })();

    });
  })();
  </script>
</div>




<h3 class="wp-block-heading">How This Prompt Generator Helps You</h3>



<ul class="wp-block-list">
<li>Creates structured prompts AI models understand</li>



<li>Reduces randomness and prompt confusion</li>



<li>Improves consistency across generations</li>



<li>Helps beginners avoid common mistakes</li>



<li>Works with Midjourney, DALL·E &amp; SD</li>
</ul>



<h3 class="wp-block-heading">Who Should Use This Tool?</h3>



<ul class="wp-block-list">
<li>AI artists</li>



<li>Content creators</li>



<li>Instagram / Reels creators</li>



<li>YouTube thumbnail designers</li>



<li>Blog owners needing custom images</li>



<li>Prompt engineers</li>
</ul>



<h3 class="wp-block-heading">How to Write Better Image Prompts</h3>



<p class="wp-block-paragraph">5 Prompt Rules:</p>



<ol class="wp-block-list">
<li>Start with subject clarity</li>



<li>Add environment context</li>



<li>Define lighting &amp; mood</li>



<li>Specify camera &amp; perspective</li>



<li>Control style &amp; rendering</li>
</ol>



<h3 class="wp-block-heading">Related Resources</h3>



<p class="wp-block-paragraph">Learn more about AI prompts and creative workflows:</p>



<ul class="wp-block-list">
<li><a href="https://aieverydaytools.com/seo-content-brief-generator-pro/" data-type="post" data-id="2564">Generate A Complete Brief And Writing Prompt</a></li>
</ul>



<h3 class="wp-block-heading">Example Prompts Created With This Tool</h3>



<p class="wp-block-paragraph"><strong>Example #1:</strong></p>



<p class="wp-block-paragraph">a bioluminescent creature, in a reflective surface with soft fog, mood: luxurious, lighting: moonlit blue ambience, camera: macro 100mm, extreme detail, composition: symmetry, strong silhouette, colors: monochrome with one accent color, photorealistic, cinematic, natural textures, realistic lighting, high detail, filmic contrast, gentle grain, dreamlike distortion<br>Aspect ratio: 9:16<br>Constraints: no logos, no copyrighted characters, no watermarks<br>Avoid: text, watermark, logo</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="683" height="1024" src="https://aieverydaytools.com/wp-content/uploads/2026/02/bioluminescent-creature-683x1024.webp" alt="bioluminescent creature" class="wp-image-2578" srcset="https://aieverydaytools.com/wp-content/uploads/2026/02/bioluminescent-creature-683x1024.webp 683w, https://aieverydaytools.com/wp-content/uploads/2026/02/bioluminescent-creature-200x300.webp 200w, https://aieverydaytools.com/wp-content/uploads/2026/02/bioluminescent-creature-768x1152.webp 768w, https://aieverydaytools.com/wp-content/uploads/2026/02/bioluminescent-creature.webp 800w" sizes="(max-width: 683px) 100vw, 683px" /></figure>



<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph"><strong>Example #2:</strong></p>



<p class="wp-block-paragraph">a glass skyscraper lobby, in a rustic wooden table, mood: uplifting, lighting: overcast diffused light, camera: macro 100mm, extreme detail, composition: centered subject, clean background, colors: earth tones, clean product photography, studio lighting, sharp focus, minimal background, premium look, subtle dust/particles in the air, subtle surreal elements<br>Aspect ratio: 9:16<br>Constraints: brand-free, generic objects only, no trademarks<br>Avoid: text, watermark, logo</p>



<figure class="wp-block-image size-large"><img decoding="async" width="683" height="1024" src="https://aieverydaytools.com/wp-content/uploads/2026/02/glass-skyscraper-lobby-683x1024.webp" alt="glass skyscraper lobby" class="wp-image-2579" srcset="https://aieverydaytools.com/wp-content/uploads/2026/02/glass-skyscraper-lobby-683x1024.webp 683w, https://aieverydaytools.com/wp-content/uploads/2026/02/glass-skyscraper-lobby-200x300.webp 200w, https://aieverydaytools.com/wp-content/uploads/2026/02/glass-skyscraper-lobby-768x1152.webp 768w, https://aieverydaytools.com/wp-content/uploads/2026/02/glass-skyscraper-lobby.webp 800w" sizes="(max-width: 683px) 100vw, 683px" /></figure>



<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph"><strong>Example #3:</strong></p>



<p class="wp-block-paragraph">a gradient light sculpture, in a minimalist gallery space, mood: mysterious, lighting: neon cyan &amp; magenta, camera: handheld documentary look, subtle motion, composition: layered depth with foreground props, colors: pastel palette, film noir, high contrast, dramatic shadows, low-key lighting, natural skin/material texture, subtle surreal elements<br>Aspect ratio: 4:3<br>Constraints: no logos, no copyrighted characters, no watermarks<br>Avoid: cropped subject, out of frame, duplicates</p>



<figure class="wp-block-image size-large"><img decoding="async" width="683" height="1024" src="https://aieverydaytools.com/wp-content/uploads/2026/02/gradient-light-sculpture-683x1024.webp" alt="gradient light sculpture" class="wp-image-2580" srcset="https://aieverydaytools.com/wp-content/uploads/2026/02/gradient-light-sculpture-683x1024.webp 683w, https://aieverydaytools.com/wp-content/uploads/2026/02/gradient-light-sculpture-200x300.webp 200w, https://aieverydaytools.com/wp-content/uploads/2026/02/gradient-light-sculpture-768x1152.webp 768w, https://aieverydaytools.com/wp-content/uploads/2026/02/gradient-light-sculpture.webp 800w" sizes="(max-width: 683px) 100vw, 683px" /></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>Example #4:</strong></p>



<p class="wp-block-paragraph">a sorcerer casting light spells, in a coastal cliff overlooking the sea, mood: tense, lighting: hard sunlight with sharp shadows, camera: top-down flat lay, even lighting, composition: symmetry, strong silhouette, colors: high-contrast black and white, anime style, clean linework, vibrant colors, expressive composition, high detail, crisp textures, iridescent shimmer Aspect ratio: 4:3 Constraints: no logos, no copyrighted characters, no watermarks Avoid: bad anatomy, extra limbs, deformed</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="683" src="https://aieverydaytools.com/wp-content/uploads/2026/02/sorcerer-casting-light-spells-1024x683.webp" alt="sorcerer casting light spells" class="wp-image-2581" srcset="https://aieverydaytools.com/wp-content/uploads/2026/02/sorcerer-casting-light-spells-1024x683.webp 1024w, https://aieverydaytools.com/wp-content/uploads/2026/02/sorcerer-casting-light-spells-300x200.webp 300w, https://aieverydaytools.com/wp-content/uploads/2026/02/sorcerer-casting-light-spells-768x512.webp 768w, https://aieverydaytools.com/wp-content/uploads/2026/02/sorcerer-casting-light-spells.webp 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>Example #5:</strong></p>



<p class="wp-block-paragraph">a fresh salad bowl, in a textured canvas surface, mood: luxurious, lighting: neon cyan &amp; magenta, camera: eye-level, 50mm, shallow depth of field, composition: symmetry, strong silhouette, colors: monochrome with one accent color, high-quality illustration, crisp lines, rich shading, stylized but coherent, natural skin/material texture, unexpected scale contrast Aspect ratio: 1:1 Constraints: brand-free, generic objects only, no trademarks Avoid: bad anatomy, extra limbs, deformed</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1024" height="1024" src="https://aieverydaytools.com/wp-content/uploads/2026/02/fresh-salad-bowl.webp" alt="fresh salad bowl" class="wp-image-2582" srcset="https://aieverydaytools.com/wp-content/uploads/2026/02/fresh-salad-bowl.webp 1024w, https://aieverydaytools.com/wp-content/uploads/2026/02/fresh-salad-bowl-300x300.webp 300w, https://aieverydaytools.com/wp-content/uploads/2026/02/fresh-salad-bowl-150x150.webp 150w, https://aieverydaytools.com/wp-content/uploads/2026/02/fresh-salad-bowl-768x768.webp 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>Example #6:</strong></p>



<p class="wp-block-paragraph">a futuristic museum interior, in a street food stall setup, mood: luxurious, lighting: practical indoor lighting, warm tungsten, camera: eye-level, 50mm, shallow depth of field, composition: foreground bokeh frame, colors: warm highlights with cool shadows, anime style, clean linework, vibrant colors, expressive composition, subtle dust/particles in the air, glowing particles, light trails Aspect ratio: 3:2 Constraints: avoid gore, avoid explicit content, keep it safe Avoid: artifacts, banding, posterization</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="683" src="https://aieverydaytools.com/wp-content/uploads/2026/02/futuristic-museum-interior-1024x683.webp" alt="futuristic museum interior" class="wp-image-2583" srcset="https://aieverydaytools.com/wp-content/uploads/2026/02/futuristic-museum-interior-1024x683.webp 1024w, https://aieverydaytools.com/wp-content/uploads/2026/02/futuristic-museum-interior-300x200.webp 300w, https://aieverydaytools.com/wp-content/uploads/2026/02/futuristic-museum-interior-768x512.webp 768w, https://aieverydaytools.com/wp-content/uploads/2026/02/futuristic-museum-interior.webp 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>
<p>The post <a rel="nofollow" href="https://aieverydaytools.com/image-prompt-generator/">Image Prompt Generator (Pro)</a> appeared first on <a rel="nofollow" href="https://aieverydaytools.com">AI Everyday Tools</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
