Skip to content

Commit 877d012

Browse files
kitfunsoclaude
andcommitted
Add mobile header search bar and reduce hero-calculators gap
- Add compact search input in header next to logo (mobile only, homepage) - Hide "Boring Math" text on very small screens to fit search bar - Sync header search with main search functionality - Move currency selector below filters on mobile - Reduce vertical padding between hero and calculators section on mobile Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 94c1296 commit 877d012

2 files changed

Lines changed: 59 additions & 14 deletions

File tree

src/layouts/BaseLayout.astro

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ const ogImageURL = ogImage
148148
<nav class="max-w-7xl mx-auto px-6 py-4">
149149
<div class="flex items-center justify-between">
150150
<!-- Logo -->
151-
<a href="/" class="group flex items-center gap-3" aria-label="Boring Math Home">
151+
<a href="/" class="group flex items-center gap-3 shrink-0" aria-label="Boring Math Home">
152152
<div
153153
class="relative w-10 h-10 rounded-xl bg-[var(--color-accent)] flex items-center justify-center overflow-hidden group-hover:scale-105 transition-transform duration-500"
154154
>
@@ -158,7 +158,7 @@ const ogImageURL = ogImage
158158
>
159159
</div>
160160
</div>
161-
<div class="flex flex-col">
161+
<div class="hidden sm:flex flex-col">
162162
<span
163163
class="font-display text-xl text-[var(--color-cream)] leading-none tracking-tight"
164164
>Boring Math</span
@@ -169,6 +169,38 @@ const ogImageURL = ogImage
169169
</div>
170170
</a>
171171

172+
<!-- Mobile Header Search (homepage only) -->
173+
{
174+
(currentPath === '/' || currentPath === '') && (
175+
<div class="flex-1 mx-3 md:hidden">
176+
<div class="relative">
177+
<svg
178+
class="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--color-muted)]"
179+
fill="none"
180+
stroke="currentColor"
181+
viewBox="0 0 24 24"
182+
>
183+
<path
184+
stroke-linecap="round"
185+
stroke-linejoin="round"
186+
stroke-width="2"
187+
d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
188+
/>
189+
</svg>
190+
<input
191+
type="text"
192+
id="header-search-input"
193+
placeholder="Search..."
194+
class="w-full pl-9 pr-3 py-2 bg-[var(--color-charcoal)] border border-white/10 rounded-xl
195+
text-sm text-[var(--color-cream)] placeholder:text-[var(--color-muted)]
196+
focus:border-[var(--color-accent)] focus:ring-1 focus:ring-[var(--color-accent)]/20
197+
transition-all duration-300"
198+
/>
199+
</div>
200+
</div>
201+
)
202+
}
203+
172204
<!-- Desktop Navigation -->
173205
<div class="hidden md:flex items-center gap-1">
174206
<a

src/pages/index.astro

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,10 +1143,10 @@ const categoryColors: Record<string, string> = {
11431143
</section>
11441144

11451145
<!-- Calculators Section with Category Filter -->
1146-
<section class="relative px-6 py-6" id="calculators">
1146+
<section class="relative px-6 py-3 md:py-6" id="calculators">
11471147
<div class="max-w-7xl mx-auto">
1148-
<!-- Search Bar and Currency Selector -->
1149-
<div class="max-w-2xl mx-auto mb-5">
1148+
<!-- Search Bar and Currency Selector - Hidden on mobile (search is in header) -->
1149+
<div class="max-w-2xl mx-auto mb-5 hidden md:block">
11501150
<div class="flex items-center gap-3">
11511151
<div class="relative flex-1">
11521152
<svg class="absolute left-4 top-1/2 -translate-y-1/2 w-5 h-5 text-[var(--color-muted)]" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -1174,6 +1174,10 @@ const categoryColors: Record<string, string> = {
11741174
<HomepageCurrencySelector client:idle />
11751175
</div>
11761176
</div>
1177+
<!-- Mobile Currency Selector (search is in header) -->
1178+
<div class="flex justify-end mb-3 md:hidden">
1179+
<HomepageCurrencySelector client:idle />
1180+
</div>
11771181

11781182
<!-- Recent Section (hidden by default, shown via JS) -->
11791183
<div id="recently-used-section" class="hidden mb-5">
@@ -1462,6 +1466,7 @@ const categoryColors: Record<string, string> = {
14621466
const calculatorCards = document.querySelectorAll('.calculator-card');
14631467
const emptyState = document.getElementById('empty-state');
14641468
const searchInput = document.getElementById('search-input') as HTMLInputElement;
1469+
const headerSearchInput = document.getElementById('header-search-input') as HTMLInputElement;
14651470
const clearSearch = document.getElementById('clear-search');
14661471
const favoritesFilter = document.getElementById('favorites-filter');
14671472
const recentlyUsedSection = document.getElementById('recently-used-section');
@@ -1506,10 +1511,13 @@ const categoryColors: Record<string, string> = {
15061511
// Reset active filter badge
15071512
activeFilterBadge?.classList.add('hidden');
15081513

1509-
// Clear search input
1514+
// Clear search inputs (desktop and header)
15101515
if (searchInput) {
15111516
searchInput.value = '';
15121517
}
1518+
if (headerSearchInput) {
1519+
headerSearchInput.value = '';
1520+
}
15131521
clearSearch?.classList.add('hidden');
15141522

15151523
// Show all calculator cards
@@ -1893,23 +1901,28 @@ const categoryColors: Record<string, string> = {
18931901
});
18941902
});
18951903

1896-
// Search functionality
1897-
searchInput?.addEventListener('input', () => {
1898-
currentSearch = searchInput.value;
1904+
// Search functionality - sync both desktop and header (mobile) search inputs
1905+
function handleSearch(value: string) {
1906+
currentSearch = value;
18991907
filterCards();
19001908

1909+
// Sync both inputs
1910+
if (searchInput && searchInput.value !== value) searchInput.value = value;
1911+
if (headerSearchInput && headerSearchInput.value !== value) headerSearchInput.value = value;
1912+
19011913
// Show/hide clear button
19021914
if (clearSearch) {
19031915
clearSearch.classList.toggle('hidden', !currentSearch);
19041916
}
1905-
});
1917+
}
1918+
1919+
searchInput?.addEventListener('input', () => handleSearch(searchInput.value));
1920+
headerSearchInput?.addEventListener('input', () => handleSearch(headerSearchInput.value));
19061921

19071922
clearSearch?.addEventListener('click', () => {
1923+
handleSearch('');
19081924
if (searchInput) {
1909-
searchInput.value = '';
1910-
currentSearch = '';
1911-
filterCards();
1912-
clearSearch.classList.add('hidden');
1925+
clearSearch?.classList.add('hidden');
19131926
searchInput.focus();
19141927
}
19151928
});

0 commit comments

Comments
 (0)