fix(search): separate starred filter from sort controls

This commit is contained in:
yun-zhi-ztl 2026-03-14 20:38:22 +08:00
parent bf62b340ab
commit d8ec0c4088
3 changed files with 50 additions and 38 deletions

View file

@ -85,6 +85,9 @@
"search": {
"title": "Search Skills",
"placeholder": "Search skills...",
"filters": {
"label": "Filter:"
},
"sort": {
"label": "Sort:",
"relevance": "Relevance",

View file

@ -85,6 +85,9 @@
"search": {
"title": "搜索技能",
"placeholder": "搜索技能...",
"filters": {
"label": "筛选:"
},
"sort": {
"label": "排序:",
"relevance": "相关性",

View file

@ -140,47 +140,53 @@ export function SearchPage() {
<SearchBar value={queryInput} onChange={setQueryInput} onSearch={handleSearch} />
</div>
{/* Sort Selector */}
<div className="flex items-center justify-between flex-wrap gap-4">
<div className="flex items-center gap-3">
<span className="text-sm font-medium text-muted-foreground">{t('search.sort.label')}</span>
<div className="flex gap-2">
<Button
variant={sort === 'relevance' ? 'default' : 'outline'}
size="sm"
onClick={() => handleSortChange('relevance')}
>
{t('search.sort.relevance')}
</Button>
<Button
variant={sort === 'downloads' ? 'default' : 'outline'}
size="sm"
onClick={() => handleSortChange('downloads')}
>
{t('search.sort.downloads')}
</Button>
<Button
variant={sort === 'newest' ? 'default' : 'outline'}
size="sm"
onClick={() => handleSortChange('newest')}
>
{t('search.sort.newest')}
</Button>
<Button
variant={starredOnly ? 'default' : 'outline'}
size="sm"
onClick={handleStarredToggle}
>
{t('search.filterStarred')}
</Button>
{/* Sort And Filters */}
<div className="space-y-4">
<div className="flex items-center justify-between flex-wrap gap-4">
<div className="flex items-center gap-3">
<span className="text-sm font-medium text-muted-foreground">{t('search.sort.label')}</span>
<div className="flex gap-2">
<Button
variant={sort === 'relevance' ? 'default' : 'outline'}
size="sm"
onClick={() => handleSortChange('relevance')}
>
{t('search.sort.relevance')}
</Button>
<Button
variant={sort === 'downloads' ? 'default' : 'outline'}
size="sm"
onClick={() => handleSortChange('downloads')}
>
{t('search.sort.downloads')}
</Button>
<Button
variant={sort === 'newest' ? 'default' : 'outline'}
size="sm"
onClick={() => handleSortChange('newest')}
>
{t('search.sort.newest')}
</Button>
</div>
</div>
{resultCount > 0 && (
<div className="text-sm text-muted-foreground">
{t('search.results', { count: resultCount })}
</div>
)}
</div>
{resultCount > 0 && (
<div className="text-sm text-muted-foreground">
{t('search.results', { count: resultCount })}
</div>
)}
<div className="flex items-center gap-3">
<span className="text-sm font-medium text-muted-foreground">{t('search.filters.label')}</span>
<Button
variant={starredOnly ? 'default' : 'outline'}
size="sm"
onClick={handleStarredToggle}
>
{t('search.filterStarred')}
</Button>
</div>
</div>
{/* Results */}