Search ====== Search the garden with semantic intent powered by Searchcraft Core. Enter a query and get relevance-scored hits that highlight matched text, tags, and... Search the garden with semantic intent powered by Searchcraft Core. Enter a query and get relevance-scored hits that highlight matched text, tags, and publication dates. Search the site Search #search-results .feed { margin-top: 0; } #search-results .card { background: var(--color-surface); } #search-results .card .card-header, #search-results .card .card-body, #search-results .card .card-content, #search-results .card .card-excerpt, #search-results .card .card-meta, #search-results .card footer, #search-results .card h1, #search-results .card h2, #search-results .card h3, #search-results .card h4, #search-results .card p, #search-results .card span, #search-results .card a { background: transparent !important; background-color: transparent !important; background-image: none !important; } #search-results .card .anchor, #search-results .card .heading-anchor { display: none !important; } (() => { const form = document.getElementById('search-form'); const input = document.getElementById('search-input'); const results = document.getElementById('search-results'); const endpoint = ('' || 'http://localhost:18000').replace(/\/$/, ''); const indexName = '' || 'waylonwalker_waylon-walker'; const readKey = '' || 'local-read'; if (!endpoint || !indexName) { results.innerHTML = 'Searchcraft is not configured for this build. '; return; } let pending; const state = { lastQuery: '', loading: false, }; function renderStatus(message, tone = 'text-gray-500') { results.innerHTML = `${message} `; } function renderFallbackCard(doc = {}) { const excerpt = (doc.summary || doc.body || '').replace(/\s+/g, ' ').trim(); const tagList = (doc.tags || []).map(tag => `${tag}`).join(' '); const url = doc.url || doc.path; const time = doc.published_at ? new Date(doc.published_at).toLocaleDateString() : ''; return ` ${time} ${doc.title || 'Untitled'} [1] ${excerpt} ${tagList} `; } function renderHits(hits) { if (!hits || hits.length === 0) { renderStatus('No matches yet. Try another query.'); return; } const fragments = hits.map(hit => { const doc = hit.doc || {}; if (doc.card_html) { return doc.card_html; } return renderFallbackCard(doc); }); results.innerHTML = `${fragments.join('')} `; } async function search(query) { if (!query) { renderStatus('Start typing to search the garden.'); return; } state.loading = true; renderStatus('Searching…'); try { const response = await fetch(`${endpoint}/index/${encodeURIComponent(indexName)}/search`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: readKey, }, body: JSON.stringify({ query: { fuzzy: { ctx: query } }, limit: 12, }), }); if (!response.ok) { renderStatus('Searchcraft is unreachable. Check the backend.', 'text-red-500'); return; } const payload = await response.json(); renderHits(payload.data?.hits ?? []); } catch (err) { console.error(err); renderStatus('Search failed. Check the console for details.', 'text-red-500'); } finally { state.loading = false; } } form.addEventListener('submit', e => { e.preventDefault(); search(input.value.trim()); }); input.addEventListener('input', () => { clearTimeout(pending); pending = setTimeout(() => search(input.value.trim()), 250); }); renderStatus('Start typing to search the garden.'); })(); References: [1]: ${url}