diff --git a/src/app/components/SearchAssembly64.tsx b/src/app/components/SearchAssembly64.tsx index 1d376ab..7b15868 100644 --- a/src/app/components/SearchAssembly64.tsx +++ b/src/app/components/SearchAssembly64.tsx @@ -21,8 +21,9 @@ function leetFetch(path: string, query?: Record) { // allows both headers, so the browser accepts this request. return fetch(url.toString(), { headers: { - 'Client-Id': 'Ultimate', + 'Host': 'hackerswithstyle.se', 'User-Agent': 'Assembly Query', + 'Client-Id': 'Ultimate', }, }); } @@ -316,15 +317,15 @@ export default function SearchAssembly64({ config, setConfig, onClose }: SearchA return ( <>
- {/* Panel header */} -
+ {/* Panel header — X on the left so it's never behind a top-right camera */} +
+
Assembly64
-
{/* Header */}
@@ -339,6 +340,8 @@ export default function SearchAssembly64({ config, setConfig, onClose }: SearchA onChange={e => setQuery(e.target.value)} onKeyDown={e => e.key === 'Enter' && !isSearching && handleSearch()} placeholder="name:manic* group:ultimate year:1983…" + inputMode="search" + enterKeyHint="search" className="w-full pl-9 pr-9 py-2.5 bg-neutral-100 border-0 rounded-xl text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:bg-white transition-colors" disabled={isSearching} /> diff --git a/src/app/components/SearchCommoServe.tsx b/src/app/components/SearchCommoServe.tsx index caae960..e88bec7 100644 --- a/src/app/components/SearchCommoServe.tsx +++ b/src/app/components/SearchCommoServe.tsx @@ -16,8 +16,9 @@ function leetFetch(path: string, query?: Record) { if (query) Object.entries(query).forEach(([k, v]) => url.searchParams.set(k, v)); return fetch(url.toString(), { headers: { - 'Client-Id': 'Ultimate', + 'Host': 'commoserve.files.commodore.net', 'User-Agent': 'Assembly Query', + 'Client-Id': 'Commodore', }, }); } diff --git a/src/app/components/SearchPane.tsx b/src/app/components/SearchPane.tsx index 80a95dd..dc23688 100644 --- a/src/app/components/SearchPane.tsx +++ b/src/app/components/SearchPane.tsx @@ -10,7 +10,6 @@ import { openLocateDb, isLocateDbLoaded, subscribeLoadProgress, - type DbProgress, } from '../locate-db'; interface SearchPaneProps { @@ -46,9 +45,10 @@ export default function SearchPane({ config, setConfig, initialTab, onClose, onO openLocateDb().catch(() => { /* errors are surfaced via loadState */ }); } return subscribeLoadProgress(s => { - if (s.phase === 'idle') setLoadState({ kind: 'idle', received: 0, total: null }); - else if (s.phase === 'ready') setLoadState({ kind: 'ready', received: 0, total: null }); - else setLoadState({ kind: s.phase, received: s.received, total: s.total }); + if (s.phase === 'idle') setLoadState({ kind: 'idle', received: 0, total: null }); + else if (s.phase === 'ready') setLoadState({ kind: 'ready', received: 0, total: null }); + else if (s.phase === 'error') setLoadState({ kind: 'error', received: 0, total: null }); + else setLoadState({ kind: s.phase, received: s.received, total: s.total }); }); }, []); @@ -89,7 +89,14 @@ export default function SearchPane({ config, setConfig, initialTab, onClose, onO animate={{ y: 0 }} exit={{ y: '100%' }} transition={{ type: 'spring', damping: 28, stiffness: 280 }} - className="fixed inset-0 bg-white/80 backdrop-blur-md flex flex-col overflow-hidden" + className="fixed inset-x-0 top-0 bg-white/80 backdrop-blur-md flex flex-col overflow-hidden" + style={{ + // 100dvh (dynamic viewport height) shrinks automatically when the + // software keyboard opens, so content is never hidden behind it. + height: '100dvh', + paddingTop: 'env(safe-area-inset-top)', + paddingBottom: 'env(safe-area-inset-bottom)', + }} > {/* Locate-database load bar. Visible only while a transfer is in flight; collapses to zero height otherwise so it doesn't take