<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>MigrateIndex Search</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: sans-serif; background: transparent; padding: 1rem; }
#search-box { display: flex; gap: 10px; align-items: center; margin-bottom: 1rem; }
#search-input { flex: 1; height: 44px; border-radius: 12px; border: 1px solid #ddd; font-size: 15px; padding: 0 16px; outline: none; color: #111; background: #fff; }
#search-input:focus { border-color: #aaa; }
#search-btn { height: 44px; padding: 0 20px; border-radius: 12px; border: 1px solid #ddd; background: #fff; font-size: 14px; cursor: pointer; white-space: nowrap; color: #111; }
#search-btn:hover { background: #f5f5f5; }
#search-btn:disabled { opacity: 0.5; cursor: not-allowed; }
#status { font-size: 13px; color: #888; margin-bottom: 1rem; min-height: 20px; }
#results { display: flex; flex-direction: column; gap: 10px; }
.agency-card { background: #fff; border: 1px solid #eee; border-radius: 12px; padding: 1rem 1.25rem; display: flex; align-items: flex-start; gap: 14px; cursor: pointer; transition: border-color 0.15s; }
.agency-card:hover { border-color: #ccc; }
.agency-card.basic { opacity: 0.75; }
.logo-wrap { width: 40px; height: 40px; border-radius: 8px; background: #f5f5f5; border: 1px solid #eee; display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: 18px; color: #ccc; }
.card-body { flex: 1; min-width: 0; }
.card-top { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; flex-wrap: wrap; }
.agency-name { font-size: 15px; font-weight: 500; color: #111; }
.blurred-text { filter: blur(4px); user-select: none; }
.tier-badge { font-size: 11px; padding: 2px 8px; border-radius: 99px; font-weight: 500; }
.tier-premium { background: #FAEEDA; color: #633806; }
.tier-verified { background: #E6F1FB; color: #0C447C; }
.tier-basic { background: #f0f0f0; color: #666; }
.agency-url { font-size: 13px; color: #888; margin-bottom: 4px; }
.agency-cap { font-size: 13px; color: #666; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.agency-countries { font-size: 12px; color: #aaa; margin-top: 4px; }
.match-reason { font-size: 12px; color: #aaa; margin-top: 6px; font-style: italic; }
.suggestions { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 1.25rem; }
.suggestion-chip { font-size: 13px; padding: 6px 14px; border-radius: 99px; border: 1px solid #eee; background: #f9f9f9; color: #666; cursor: pointer; }
.suggestion-chip:hover { border-color: #ccc; color: #111; }
.loading-dots { display: inline-flex; gap: 4px; align-items: center; }
.dot { width: 6px; height: 6px; border-radius: 50%; background: #aaa; animation: bounce 1.2s infinite; }
.dot:nth-child(2) { animation-delay: 0.2s; }
.dot:nth-child(3) { animation-delay: 0.4s; }
@keyframes bounce { 0%,80%,100%{transform:scale(1)} 40%{transform:scale(1.4)} }
.empty-state { text-align: center; padding: 2rem; color: #888; font-size: 14px; }
</style>
</head>
<body>
<div id="search-box">
<input id="search-input" type="text" placeholder="Search agencies by capability, country, specialization…" />
<button id="search-btn">Search</button>
</div>
<div class="suggestions" id="suggestions">
<span class="suggestion-chip" onclick="fillAndSearch('paid media agencies in UAE')">Paid media UAE</span>
<span class="suggestion-chip" onclick="fillAndSearch('branding and creative agencies')">Branding & creative</span>
<span class="suggestion-chip" onclick="fillAndSearch('AI marketing agencies')">AI marketing</span>
<span class="suggestion-chip" onclick="fillAndSearch('PR and communications agencies')">PR & comms</span>
</div>
<div id="status"></div>
<div id="results"></div>
<script>
const WORKER_URL = 'https://migrateindex-search.iqramujtaba7.workers.dev';
const AIRTABLE_API_KEY = 'patFE5N9Q3ka1prOz.bbd92a3130927b91049c48bb236313689013a01e993e4b0d6801ad85c75e0f94';
const AIRTABLE_BASE_ID = 'app8YV8iAJsQv2Xng';
async function fetchAgencies() {
const url = `https://api.airtable.com/v0/${AIRTABLE_BASE_ID}/Agencies?pageSize=100`;
const res = await fetch(url, { headers: { Authorization: `Bearer ${AIRTABLE_API_KEY}` } });
if (!res.ok) { console.error('Airtable error:', res.status); return []; }
const data = await res.json();
return (data.records || []).map(r => ({
id: r.id,
name: r.fields['Agency Name'] || '',
tier: r.fields['Listing Tier'] || 'Basic',
url: r.fields['Web URL'] || '',
countries: r.fields['Countries Of Operation'] || '',
capabilities: r.fields['Capabilities'] || '',
short_capability: r.fields['Short Capability'] || ''
}));
}
function getTierInfo(tier) {
if (tier === 'Verified') return { label: 'Verified', cls: 'tier-verified' };
if (tier === 'Premium') return { label: 'Premium', cls: 'tier-premium' };
return { label: 'Basic', cls: 'tier-basic' };
}
function renderCard(agency) {
const tier = agency.tier || 'Basic';
const isBasic = tier === 'Basic';
const { label, cls } = getTierInfo(tier);
return `<div class="agency-card${isBasic ? ' basic' : ''}" onclick="handleCardClick('${agency.id}','${tier}')">
<div class="logo-wrap">🏢</div>
<div class="card-body">
<div class="card-top">
<span class="agency-name${isBasic ? ' blurred-text' : ''}">${agency.name}</span>
<span class="tier-badge ${cls}">${label}</span>
</div>
${!isBasic && agency.url ? `<div class="agency-url">${agency.url}</div>` : ''}
<div class="agency-cap${isBasic ? ' blurred-text' : ''}">${agency.short_capability}</div>
${agency.countries ? `<div class="agency-countries">📍 ${agency.countries}</div>` : ''}
${agency.reason ? `<div class="match-reason">${agency.reason}</div>` : ''}
</div>
</div>`;
}
function handleCardClick(recordId, tier) {
const url = tier === 'Basic'
? `https://mira9616.softr.app/agency-detail?recordId=${recordId}&blurred=true`
: `https://mira9616.softr.app/agency-detail?recordId=${recordId}`;
window.parent.location.href = url;
}
async function runSearch() {
const query = document.getElementById('search-input').value.trim();
if (!query) return;
const btn = document.getElementById('search-btn');
const status = document.getElementById('status');
const results = document.getElementById('results');
const suggestions = document.getElementById('suggestions');
btn.disabled = true;
suggestions.style.display = 'none';
results.innerHTML = '';
status.innerHTML = `<span class="loading-dots"><span class="dot"></span><span class="dot"></span><span class="dot"></span></span> Fetching agencies…`;
try {
const agencies = await fetchAgencies();
if (!agencies.length) { status.textContent = 'Could not load agencies.'; btn.disabled = false; return; }
status.innerHTML = `<span class="loading-dots"><span class="dot"></span><span class="dot"></span><span class="dot"></span></span> Finding best matches…`;
const res = await fetch(WORKER_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ query, agencies })
});
const text = await res.text();
let ranked = [];
try { ranked = JSON.parse(text.replace(/```json|```/g, '').trim()); }
catch(e) { status.textContent = 'Could not parse results.'; btn.disabled = false; return; }
if (!ranked.length) {
results.innerHTML = `<div class="empty-state">No matching agencies found.</div>`;
status.textContent = '';
} else {
status.textContent = `${ranked.length} agenc${ranked.length === 1 ? 'y' : 'ies'} found for "${query}"`;
results.innerHTML = ranked.map(a => {
const full = agencies.find(ag => ag.name === a.name) || {};
return renderCard({ ...full, ...a });
}).join('');
}
} catch(err) { status.textContent = 'Something went wrong.'; console.error(err); }
btn.disabled = false;
}
function fillAndSearch(text) {
document.getElementById('search-input').value = text;
runSearch();
}
document.getElementById('search-btn').addEventListener('click', runSearch);
document.getElementById('search-input').addEventListener('keydown', e => { if (e.key === 'Enter') runSearch(); });
</script>
</body>
</html>