Skip to content

Commit d540ad6

Browse files
Fix Pagefind search: pass base URL to client script via define:vars
Co-authored-by: Ona <no-reply@ona.com>
1 parent 4777f06 commit d540ad6

1 file changed

Lines changed: 29 additions & 30 deletions

File tree

src/components/Header.astro

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -102,38 +102,37 @@ const base = import.meta.env.BASE_URL.replace(/\/$/, "");
102102
</div>
103103
</div>
104104

105-
<script>
105+
<script is:inline define:vars={{ base }}>
106106
// Theme toggle
107-
document.getElementById('theme-toggle')?.addEventListener('click', () => {
108-
const html = document.documentElement;
109-
const isDark = html.classList.contains('dark');
107+
document.getElementById('theme-toggle')?.addEventListener('click', function() {
108+
var html = document.documentElement;
109+
var isDark = html.classList.contains('dark');
110110
html.classList.toggle('dark');
111111
localStorage.setItem('theme', isDark ? 'light' : 'dark');
112112
});
113113

114114
// Mobile sidebar toggle
115-
document.getElementById('sidebar-toggle')?.addEventListener('click', () => {
116-
const sidebar = document.getElementById('sidebar');
117-
const overlay = document.getElementById('sidebar-overlay');
115+
document.getElementById('sidebar-toggle')?.addEventListener('click', function() {
116+
var sidebar = document.getElementById('sidebar');
117+
var overlay = document.getElementById('sidebar-overlay');
118118
sidebar?.classList.toggle('-translate-x-full');
119119
overlay?.classList.toggle('hidden');
120120
});
121121

122122
// Search
123-
const searchTrigger = document.getElementById('search-trigger');
124-
const searchDialog = document.getElementById('search-dialog');
125-
const searchBackdrop = document.getElementById('search-backdrop');
126-
const searchInput = document.getElementById('search-input') as HTMLInputElement;
127-
const searchResults = document.getElementById('search-results');
128-
const searchPlaceholder = document.getElementById('search-placeholder');
123+
var searchTrigger = document.getElementById('search-trigger');
124+
var searchDialog = document.getElementById('search-dialog');
125+
var searchBackdrop = document.getElementById('search-backdrop');
126+
var searchInput = document.getElementById('search-input');
127+
var searchResults = document.getElementById('search-results');
128+
var searchPlaceholder = document.getElementById('search-placeholder');
129129

130-
let pagefind: any = null;
130+
var pagefind = null;
131131

132132
async function loadPagefind() {
133133
if (pagefind) return;
134134
try {
135-
const base = import.meta.env.BASE_URL.replace(/\/$/, '');
136-
pagefind = await import(/* @vite-ignore */ `${base}/pagefind/pagefind.js`);
135+
pagefind = await import(base + '/pagefind/pagefind.js');
137136
await pagefind.init();
138137
} catch (e) {
139138
console.warn('Pagefind not available:', e);
@@ -159,19 +158,19 @@ const base = import.meta.env.BASE_URL.replace(/\/$/, "");
159158
searchTrigger?.addEventListener('click', openSearch);
160159
searchBackdrop?.addEventListener('click', closeSearch);
161160

162-
document.addEventListener('keydown', (e) => {
161+
document.addEventListener('keydown', function(e) {
163162
if ((e.metaKey || e.ctrlKey) && e.key === 'k') {
164163
e.preventDefault();
165164
searchDialog?.classList.contains('hidden') ? openSearch() : closeSearch();
166165
}
167166
if (e.key === 'Escape') closeSearch();
168167
});
169168

170-
let debounceTimer: ReturnType<typeof setTimeout>;
171-
searchInput?.addEventListener('input', () => {
169+
var debounceTimer;
170+
searchInput?.addEventListener('input', function() {
172171
clearTimeout(debounceTimer);
173-
debounceTimer = setTimeout(async () => {
174-
const query = searchInput.value.trim();
172+
debounceTimer = setTimeout(async function() {
173+
var query = searchInput.value.trim();
175174
if (!searchResults) return;
176175

177176
if (!query) {
@@ -184,24 +183,24 @@ const base = import.meta.env.BASE_URL.replace(/\/$/, "");
184183
}
185184

186185
if (!pagefind) {
187-
searchResults.innerHTML = '<p class="text-sm text-[var(--text-tertiary)] px-2 py-4 text-center">Search index not available. Try again after the site is built.</p>';
186+
searchResults.innerHTML = '<p class="text-sm text-[var(--text-tertiary)] px-2 py-4 text-center">Search index not available.</p>';
188187
return;
189188
}
190189

191-
const search = await pagefind.search(query);
192-
const results = await Promise.all(search.results.slice(0, 10).map((r: any) => r.data()));
190+
var search = await pagefind.search(query);
191+
var results = await Promise.all(search.results.slice(0, 10).map(function(r) { return r.data(); }));
193192

194193
if (results.length === 0) {
195194
searchResults.innerHTML = '<p class="text-sm text-[var(--text-tertiary)] px-2 py-4 text-center">No results found</p>';
196195
return;
197196
}
198197

199-
searchResults.innerHTML = results.map((r: any) => `
200-
<a href="${r.url}" class="block px-3 py-2.5 rounded-md hover:bg-[var(--bg-hover)] transition-colors">
201-
<span class="block text-sm font-medium text-[var(--text-primary)] leading-snug">${r.meta?.title || 'Untitled'}</span>
202-
<span class="block text-xs text-[var(--text-tertiary)] mt-1 leading-relaxed line-clamp-2">${r.excerpt}</span>
203-
</a>
204-
`).join('');
198+
searchResults.innerHTML = results.map(function(r) {
199+
return '<a href="' + r.url + '" class="block px-3 py-2.5 rounded-md hover:bg-[var(--bg-hover)] transition-colors">' +
200+
'<span class="block text-sm font-medium text-[var(--text-primary)] leading-snug">' + (r.meta?.title || 'Untitled') + '</span>' +
201+
'<span class="block text-xs text-[var(--text-tertiary)] mt-1 leading-relaxed line-clamp-2">' + (r.excerpt || '') + '</span>' +
202+
'</a>';
203+
}).join('');
205204
}, 200);
206205
});
207206
</script>

0 commit comments

Comments
 (0)