…
.wrap{padding-top:0}.fo-head{margin:0 0 6px}.fo-head h1{line-height:1.15}
.wrap{margin-top:-8px} /* closer to the top bar (razie, 2026-10-12) */
+.fo-archn{font-size:calc(12px*var(--fz,1));color:var(--soft);border:1px dashed var(--line);border-radius:999px;padding:1px 8px;background:none;cursor:pointer;margin-left:6px}.fo-archn:hover{color:var(--ink)}
</style></head>
<body>
…
let V=null,ed={k:"notes"},view={k:"notes"},stamp="",dirty=false,timer=0,openCard=null,busy=false;
const say=(t,ok)=>{const m=$("fo-msg");if(m){m.textContent=t;m.className="small"+(ok?"":" bad")}};
+const isArch=m=>(m.tags||[]).includes("archive"),archived=()=>V.members.filter(m=>m.kind==="thought"&&!m.missing&&isArch(m)),thoughts=()=>V.members.filter(m=>m.kind==="thought"&&!m.missing&&!isArch(m)),topics=()=>V.members.filter(m=>m.kind==="topic");
-const thoughts=()=>V.members.filter(m=>m.kind==="thought"&&!m.missing),topics=()=>V.members.filter(m=>m.kind==="topic");
const label=m=>m.title||(m.section?m.name+" › "+m.section:m.name.replace(/^Thought:/,""));
const firstLine=t=>(String(t||"").split("\n").find(l=>l.trim())||"").replace(/^#+\s*/,"");
…
const prevOf=t=>String(t||"").split("\n").slice(1).join("\n").replace(/^## In this focus[\s\S]*$/m,"").trim();
function cards(){const ts=thoughts();const nb=String(V.notes||"").trim();
-return `<section id="fo-cards"><h2>Thoughts <span class="n">${ts.length+1}</span></h2><div class="th-list fo-list"><article class="th-card foc fo-fcard${ed.k==="notes"?" fo-open":""}" data-focus="1"><span class="th-fmark">FOCUS · ${V.members.length} · defines this focus</span><h3 class="th-title">${esc(cut(V.title,140))}</h3>${nb?`<p class="th-prev">${esc(cut(nb,600))}</p>`:""}<div class="th-meta">${(V.selfTags||[]).filter(g=>g!=="archive"&&g!=="focus").map(g=>`<a class="th-tl" href="#" data-go="/thoughts?tag=${encodeURIComponent(g)}">#${esc(g)}</a>`).join("")}<span class="small">can't be archived or deleted: Dissolve focus ends it</span>${V.created?`<span class="th-date">${TH.day(V.created)}</span>`:""}</div></article>${ts.map(m=>{const body=String(m.text||"").split("\n").slice(1).join("\n").trim();
+return `<section id="fo-cards"><h2>Thoughts <span class="n">${ts.length+1}</span></h2><div class="th-list fo-list"><article class="th-card foc fo-fcard${ed.k==="notes"?" fo-open":""}" data-focus="1"><span class="th-fmark">FOCUS · ${V.members.length-archived().length} · defines this focus</span><h3 class="th-title">${esc(cut(V.title,140))}</h3>${nb?`<p class="th-prev">${esc(cut(nb,600))}</p>`:""}<div class="th-meta">${(V.selfTags||[]).filter(g=>g!=="archive"&&g!=="focus").map(g=>`<a class="th-tl" href="#" data-go="/thoughts?tag=${encodeURIComponent(g)}">#${esc(g)}</a>`).join("")}<span class="small">can't be archived or deleted: Dissolve focus ends it</span>${V.created?`<span class="th-date">${TH.day(V.created)}</span>`:""}</div></article>${ts.map(m=>{const body=String(m.text||"").split("\n").slice(1).join("\n").trim();
const tg=m.tags||[],has=g=>tg.includes(g),sp=TH.split(m.text||""),pp=TH.parts(sp.orig),ansT=sp.ans?TH.ansText(sp.ans):"",working=has("working"),sent=has("sent"),ans=["waiting","ai-question","done"].some(has);
const tgl=tg.filter(g=>g!=="archive"&&g!=="focus").map(g=>`<a class="th-tl${FLOWT.has(g)?" th-st t-"+g:""}" href="#" data-go="/thoughts?tag=${encodeURIComponent(g)}">#${esc(g)}</a>`).join("");
…
<div class="th-meta">${tgl}${(m.also||[]).map(a=>`<span class="th-infocus">${esc(a.title)}</span>`).join("")}${m.project!==V.project?`<span class="th-chip th-proj">${esc(m.project)}</span>`:""}${m.created?`<span class="th-date" title="${esc(m.created)}">${TH.day(m.created)}</span>`:""}</div></article>`}).join("")}</div></section>`}
+function head(){const n=V.members.length-archived().length,one=thoughts().length===1&&!topics().length;
+return `<div class="fo-head"><h1>${esc(V.title)}</h1><span class="fo-mark">FOCUS · ${n}</span>${archived().length?`<button type="button" class="ibtn fo-archn" id="fo-takearch" title="Archived elsewhere, still in this Focus: hidden here">${archived().length} archived · take out</button>`:""}<span class="fo-views" role="group" aria-label="Focus views"><b aria-current="page" title="The old view: the map over the editor">F1</b><a href="#" data-go="/thoughts/focus/${encodeURIComponent(NAME.replace(/^Thought:/,""))}?project=${encodeURIComponent(PROJ)}" title="Editor and map side by side, the thoughts under them">F2</a><a href="#" data-go="/page/Focus3?project=${encodeURIComponent(PROJ)}&name=${encodeURIComponent(NAME.replace(/^Thought:/,""))}" title="The map beside the editor and the thoughts">F3</a></span><span class="fo-ab" role="group" aria-label="Map view"><button type="button" data-ab="A" class="${MODE==="A"?"on":""}" aria-pressed="${MODE==="A"}" title="Option A: the map as it was">A</button><button type="button" data-ab="B" class="${MODE==="B"?"on":""}" aria-pressed="${MODE==="B"}" title="Option B: the brain">B</button></span><span class="th-info"><button type="button" class="th-ib" id="fo-ib" aria-label="More info" aria-expanded="false">?</button><span class="th-ip" id="fo-ip" role="note" hidden>A Focus gathers the thoughts and topics on one subject. The map shows its topics on the right and the model they name on the left; tap one to read it below. Tap a card to edit it in the box; open the focus card to send the Focus to your designer, as one task or split by feature, or to dissolve it.<span class="th-ih">More in <a href="#" data-go="/topics/Help:Focus">Help: Focus</a></span></span></span>${V.sent?`<span class="fo-sentb">✓ Sent</span>`:""}</div>`}
-function head(){const n=V.members.length,one=thoughts().length===1&&!topics().length;
-return `<div class="fo-head"><h1>${esc(V.title)}</h1><span class="fo-mark">FOCUS · ${n}</span><span class="fo-views" role="group" aria-label="Focus views"><b aria-current="page" title="The old view: the map over the editor">F1</b><a href="#" data-go="/thoughts/focus/${encodeURIComponent(NAME.replace(/^Thought:/,""))}?project=${encodeURIComponent(PROJ)}" title="Editor and map side by side, the thoughts under them">F2</a><a href="#" data-go="/page/Focus3?project=${encodeURIComponent(PROJ)}&name=${encodeURIComponent(NAME.replace(/^Thought:/,""))}" title="The map beside the editor and the thoughts">F3</a></span><span class="fo-ab" role="group" aria-label="Map view"><button type="button" data-ab="A" class="${MODE==="A"?"on":""}" aria-pressed="${MODE==="A"}" title="Option A: the map as it was">A</button><button type="button" data-ab="B" class="${MODE==="B"?"on":""}" aria-pressed="${MODE==="B"}" title="Option B: the brain">B</button></span><span class="th-info"><button type="button" class="th-ib" id="fo-ib" aria-label="More info" aria-expanded="false">?</button><span class="th-ip" id="fo-ip" role="note" hidden>A Focus gathers the thoughts and topics on one subject. The map shows its topics on the right and the model they name on the left; tap one to read it below. Tap a card to edit it in the box; open the focus card to send the Focus to your designer, as one task or split by feature, or to dissolve it.<span class="th-ih">More in <a href="#" data-go="/topics/Help:Focus">Help: Focus</a></span></span></span>${V.sent?`<span class="fo-sentb">✓ Sent</span>`:""}</div>`}
function render(){
…
if(t.closest("#fo-edsave")){saveEd(false);return}const rp=t.closest("[data-sendto]");if(rp){const r=rp.dataset.sendto,tx=$("fo-text"),pk=$("fo-sendpick");if(pk)pk.remove();if(r&&tx){if(atOf(tx.value)!==r)tx.value="@"+r+" "+tx.value;saveEd(true)}return}
if(t.closest("#fo-edsend")){const tx=$("fo-text");if(!tx||!tx.value.trim())return;if(atOf(tx.value)){saveEd(true);return}if($("fo-sendpick"))return;const b=t.closest("#fo-edsend");b.insertAdjacentHTML("afterend",`<span id="fo-sendpick" class="fo-sendpick" role="menu" aria-label="Send to">${RL.map(r=>`<button type="button" class="btn sm" role="menuitem" data-sendto="${r}"><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:${RC[r]};margin-right:5px"></span>@${r}</button>`).join("")}<button type="button" class="btn sm" data-sendto="" aria-label="Don't send">✕</button></span>`);return}if(t.closest("#fo-edback")){ed={k:"notes"};render();return}
+ if(t.closest("#fo-takearch")){try{for(const m of archived())await api("POST",fpath("remove"),{member:{project:m.project,name:m.name}});say("Taken out of this Focus.",true);await load()}catch(er){say("Not taken out: "+why(er))}return}
if(t.closest("#fo-edarch")){const m=memberOf(ed.n);if(m){try{await api("POST",tpath(m,"archive"),{on:true});await api("POST",fpath("remove"),{member:{project:m.project,name:m.name}});say("Archived, and out of this Focus.",true);ed={k:"notes"};await load()}catch(er){say("Not archived: "+why(er))}}return}
if(t.closest("#fo-eddel")){const m=memberOf(ed.n);if(m)ask("Delete this thought? It goes to your Trash, from where you can bring it back.","Delete",true,false,async()=>{try{await api("POST",fpath("remove"),{member:{project:m.project,name:m.name}});await api("DELETE",tpath(m));say("Deleted (in your Trash).",true);ed={k:"notes"};await load()}catch(er){say("Not deleted: "+why(er))}});return}
…