← back to Slack Idea Board
auto-save: 2026-07-23T12:20:57 (1 files) — public/index.html
906b38a8d27797fc5b417a310a03787403c2632d · 2026-07-23 12:21:09 -0700 · Steve Abrams
Files touched
Diff
commit 906b38a8d27797fc5b417a310a03787403c2632d
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Jul 23 12:21:09 2026 -0700
auto-save: 2026-07-23T12:20:57 (1 files) — public/index.html
---
public/index.html | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/public/index.html b/public/index.html
index 57dfb2a..529ace9 100644
--- a/public/index.html
+++ b/public/index.html
@@ -41,6 +41,10 @@
.detail{margin-top:6px;color:var(--dim)}
.pending{color:var(--dim);font-style:italic}
.empty{padding:40px;text-align:center;color:var(--dim)}
+ .search{background:var(--chip);border:1px solid var(--line);border-radius:999px;color:var(--text);
+ padding:5px 13px;font:13px inherit;min-width:210px;outline:none}
+ .search:focus{border-color:var(--gold)}
+ .search::placeholder{color:var(--dim)}
.filters{display:inline-flex;gap:6px}
.filters button{background:var(--chip);color:var(--dim);border:1px solid var(--line);border-radius:999px;
padding:3px 11px;font-size:12px;cursor:pointer}
@@ -71,6 +75,7 @@
<header>
<h1><b>Idea Board</b> — Slack feed triage</h1>
<span class="meta" id="stat">loading…</span>
+ <input type="search" id="q" class="search" placeholder="Search ideas, links, reasons, targets…" autocomplete="off" spellcheck="false">
<span class="filters" id="filters">
<button data-f="actionable" class="on">Actionable</button>
<button data-f="yes">Yes only</button>
@@ -143,8 +148,16 @@ document.addEventListener('click', e=>{
// Header button — launch the web-dev accelerator directly (no idea seed).
async function launchAccelerator(btn){ return launchAction('', 'Build new project', 'Web-Dev Accelerator', btn); }
function fmt(iso){try{return new Date(iso).toLocaleString(undefined,{month:'short',day:'numeric',hour:'numeric',minute:'2-digit'})}catch{return iso}}
-let LAST = { ideas:[], model:'' }, FILTER = 'actionable';
+let LAST = { ideas:[], model:'' }, FILTER = 'actionable', SEARCH = '';
+// Free-text search over every caption field the model produced for an idea.
+function matchesSearch(i){
+ if(!SEARCH) return true;
+ const hay = [i.title,i.about,i.text,i.note,i.url,i.channel,i.fit,i.fit_reason,
+ i.aa_fit,i.aa_target,i.aa_reason,i.next_step,i.next_detail].filter(Boolean).join(' ').toLowerCase();
+ return hay.includes(SEARCH);
+}
function passes(i){
+ if(!matchesSearch(i)) return false; // search gates first, independent of filter/pending
if(FILTER==='all') return true;
if(i.pending) return true; // whole record not judged yet
if(FILTER==='aayes' || FILTER==='aafit'){
@@ -160,6 +173,7 @@ document.getElementById('filters').addEventListener('click', e=>{
[...document.querySelectorAll('#filters button')].forEach(b=>b.classList.toggle('on', b.dataset.f===FILTER));
render();
});
+document.getElementById('q').addEventListener('input', e=>{ SEARCH=(e.target.value||'').trim().toLowerCase(); render(); });
async function load(){
try{
const r = await fetch('/api/ideas'); LAST = await r.json(); render();
← 0a99aaa idea-board: filter chips can slice by the Agent Abrams verdi
·
back to Slack Idea Board
·
5x sweep 1: render non-actionable Skip as a span, not a disa b8cc845 →