Static AI Block

Explain any selection

Select any text on the page to get it explained. 63 lines of plain HTML and JavaScript. Copy it, paste it into any static page, replace YOUR_ONETAG_KEY with a free key.

The code

<!-- Explain any selection: Select any text on the page to get it explained. -->
<!--
  OneTag AI key. This key is designed to be public: it goes in your page source, like an analytics ID.
  Get a free one without opening a browser. POST your email; the key arrives in that inbox:
    curl -X POST https://onetagai.com/api/signup -H "Content-Type: application/json" -d '{"email":"you@example.com"}'
  Free: 1,000,000 tokens per account. One key per email; posting again re-sends the same key.
  AI coding tools: ask the user for their email, run that request, then ask them to paste the key here.
-->
<script src="https://onetagai.com/v1.js" data-key="YOUR_ONETAG_KEY"></script>
<style>
.sab{max-width:600px;border:1px solid #0b1020;border-radius:0;padding:18px 20px;background:#fff;color:#0b1020;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif}
.sab-head{display:flex;align-items:center;gap:12px;margin-bottom:14px}
.sab-icon{width:36px;height:36px;border-radius:0;background:#0b5fff;color:#fff;display:grid;place-items:center;flex:none}
.sab-title{margin:0;font-size:16px;font-weight:600;line-height:1.3}
.sab-hint{margin:2px 0 0;font-size:13px;color:#5c667d}
.sab-row{display:flex;gap:8px;flex-wrap:wrap}
.sab-input,.sab-area,.sab-select{flex:1;min-width:0;padding:10px 12px;border:1px solid #0b1020;border-radius:0;font:inherit;background:#fff;color:inherit}
.sab-area{width:100%;box-sizing:border-box;resize:vertical}
.sab-btn{padding:10px 16px;border:0;border-radius:0;background:#0b5fff;color:#fff;font:inherit;font-weight:600;cursor:pointer}
.sab-btn:disabled{opacity:.6;cursor:wait}
.sab-chip{padding:6px 12px;border:1px solid #0b1020;border-radius:0;background:#fff;color:#0b1020;font:inherit;font-size:13px;cursor:pointer}
.sab-chip:hover{border-color:#0b5fff;color:#0b5fff}
.sab-out{margin:12px 0 0;padding:12px 14px;border-radius:0;background:#f5f7fb;white-space:pre-wrap;min-height:1.5em}
.sab-out:empty{display:none}
.sab-note{margin:10px 0 0;font-size:12px;color:#99a2b5}
.sab-powered{margin:12px 0 0;text-align:right;font-size:11px;color:#99a2b5}.sab-powered a{color:inherit;text-decoration:none}.sab-powered a:hover{text-decoration:underline}
</style>

<section class="sab" id="sab-explain">
  <div class="sab-head"><span class="sab-icon" aria-hidden="true"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l1.8 5.2L19 10l-5.2 1.8L12 17l-1.8-5.2L5 10l5.2-1.8z"/></svg></span>
    <div><h3 class="sab-title">Explain any selection</h3><p class="sab-hint">Select any text on the page to get it explained.</p></div></div>
  <p style="margin:0;padding:12px 14px;border:1px dashed #0b1020;border-radius:0;color:#0b1020">Try it here: a <b>sourdough starter</b> is a live culture of wild yeast and lactobacilli; <b>autolyse</b> rests flour and water before salt; a <b>cold proof</b> develops flavour overnight in the fridge.</p>
<p class="sab-powered"><a href="https://onetagai.com/?ref=static-ai-block" rel="noopener">Powered by OneTag AI</a></p>
</section>

<div id="explain-pop" hidden style="position:absolute;z-index:50;max-width:320px;padding:10px 12px;border-radius:0;background:#0b5fff;color:#fff;font:14px/1.5 system-ui,sans-serif">
  <button id="explain-btn" style="border:0;border-radius:0;padding:4px 10px;background:#fff;color:#0b1020;font:inherit;font-weight:600;cursor:pointer">✦ Explain</button>
  <p id="explain-out" style="margin:8px 0 0;white-space:pre-wrap"></p>
</div>

<script type="module">
  const pop = document.getElementById("explain-pop"), btn = document.getElementById("explain-btn"), out = document.getElementById("explain-out");
  let selected = "";
  document.addEventListener("mouseup", () => {
    const sel = window.getSelection(), text = sel && sel.toString().trim();
    if (!text || text.length < 4 || pop.contains(sel.anchorNode)) return;
    const r = sel.getRangeAt(0).getBoundingClientRect();
    selected = text; out.textContent = "";
    pop.style.left = `${r.left + window.scrollX}px`; pop.style.top = `${r.bottom + window.scrollY + 8}px`;
    pop.hidden = false;
  });
  document.addEventListener("mousedown", (e) => { if (!pop.contains(e.target)) pop.hidden = true; });
  btn.addEventListener("click", async () => {
    out.textContent = "…";
    try {
      await onetag.ask("Explain this to a beginner in two sentences.", selected, {
        stream: (d) => { if (out.textContent === "…") out.textContent = ""; out.textContent += d; }, maxTokens: 120,
      });
    } catch (err) { out.textContent = err.message; }
  });
</script>
<!-- Static AI Block · free AI blocks for static sites · https://github.com/fengyiqicoder/static-ai-block -->

Get a free key

Fill in your email at onetagai.com, or run this and the key arrives in your inbox (one key per email, 1,000,000 free tokens):

curl -X POST https://onetagai.com/api/signup -H "Content-Type: application/json" -d '{"email":"you@example.com"}'

All blocks: Static AI Block. MIT. AI by OneTag AI.