-
Notifications
You must be signed in to change notification settings - Fork 59.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add search box and title above model list #5987
base: main
Are you sure you want to change the base?
Changes from all commits
055ac64
8cfa534
8fab48b
96ede7d
d893470
6582376
dee9c94
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -78,10 +78,10 @@ | |||||||||||||||||||||||||
|
||||||||||||||||||||||||||
.list { | ||||||||||||||||||||||||||
border: var(--border-in-light); | ||||||||||||||||||||||||||
border-radius: 10px; | ||||||||||||||||||||||||||
border-radius: 0 0 10px 10px; | ||||||||||||||||||||||||||
box-shadow: var(--card-shadow); | ||||||||||||||||||||||||||
margin-bottom: 20px; | ||||||||||||||||||||||||||
animation: slide-in ease 0.3s; | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
background: var(--white); | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
|
@@ -313,11 +313,38 @@ | |||||||||||||||||||||||||
.selector-item-disabled { | ||||||||||||||||||||||||||
opacity: 0.6; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
.selector-bar { | ||||||||||||||||||||||||||
background-color: var(--white); | ||||||||||||||||||||||||||
border: solid var(--border-in-light); | ||||||||||||||||||||||||||
border-top-left-radius: 10px; | ||||||||||||||||||||||||||
border-top-right-radius: 10px; | ||||||||||||||||||||||||||
min-height: 40px; | ||||||||||||||||||||||||||
width: 100%; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
.selector-title { | ||||||||||||||||||||||||||
font-size: large; | ||||||||||||||||||||||||||
font-weight: bold; | ||||||||||||||||||||||||||
padding: 10px; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
.selector-search-container { | ||||||||||||||||||||||||||
display: flex; | ||||||||||||||||||||||||||
align-items: center; | ||||||||||||||||||||||||||
justify-content: space-between; | ||||||||||||||||||||||||||
padding: 10px; | ||||||||||||||||||||||||||
border-bottom: solid var(--border-in-light); | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
.selector-search-input { | ||||||||||||||||||||||||||
padding: 5px; | ||||||||||||||||||||||||||
margin-right: 5px; | ||||||||||||||||||||||||||
flex-grow: 1; | ||||||||||||||||||||||||||
max-width: none; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
&-content { | ||||||||||||||||||||||||||
min-width: 300px; | ||||||||||||||||||||||||||
animation: slide-in ease 0.3s; | ||||||||||||||||||||||||||
width: 30rem; | ||||||||||||||||||||||||||
height: 60vh; | ||||||||||||||||||||||||||
Comment on lines
+344
to
+346
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Improve responsive handling of selector dimensions The fixed dimensions might cause layout issues on different screen sizes and during interactions. Consider: &-content {
animation: slide-in ease 0.3s;
- width: 30rem;
- height: 60vh;
+ width: min(30rem, 90vw); /* Responsive width */
+ max-height: 60vh; /* Use max-height instead of fixed height */
+ min-height: 300px; /* Prevent too small height */
+
+ @media screen and (max-width: 480px) {
+ width: 95vw; /* Fuller width on mobile */
+ max-height: 70vh; /* More vertical space on mobile */
+ } This change will:
📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||
.list { | ||||||||||||||||||||||||||
max-height: 90vh; | ||||||||||||||||||||||||||
overflow-x: hidden; | ||||||||||||||||||||||||||
overflow-y: auto; | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
|
@@ -336,4 +363,3 @@ | |||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -507,44 +507,83 @@ export function Selector<T>(props: { | |||||||||||||||||||||||||||||||||
props.onClose?.(); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
const [searchText, setSearchText] = useState(""); | ||||||||||||||||||||||||||||||||||
const [filteredItems, setFilteredItems] = useState([...props.items]); | ||||||||||||||||||||||||||||||||||
function onSearch(text: string) { | ||||||||||||||||||||||||||||||||||
setSearchText(text); | ||||||||||||||||||||||||||||||||||
if (text === "") { | ||||||||||||||||||||||||||||||||||
setFilteredItems([...props.items]); | ||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
// filter by items title | ||||||||||||||||||||||||||||||||||
const newItems = props.items.filter((item) => | ||||||||||||||||||||||||||||||||||
item.title.toLowerCase().includes(text.toLowerCase()), | ||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||
setFilteredItems([...newItems]); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||
<div className={styles["selector"]} onClick={() => props.onClose?.()}> | ||||||||||||||||||||||||||||||||||
<div className={styles["selector-content"]}> | ||||||||||||||||||||||||||||||||||
<div | ||||||||||||||||||||||||||||||||||
className={styles["selector-content"]} | ||||||||||||||||||||||||||||||||||
onClick={(e) => e.stopPropagation()} | ||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||
{/* title and search box */} | ||||||||||||||||||||||||||||||||||
<div className={styles["selector-bar"]}> | ||||||||||||||||||||||||||||||||||
<div className={styles["selector-title"]}> | ||||||||||||||||||||||||||||||||||
{Locale.UI.SelectorTitle} | ||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||
<div className={styles["selector-search-container"]}> | ||||||||||||||||||||||||||||||||||
<input | ||||||||||||||||||||||||||||||||||
type="text" | ||||||||||||||||||||||||||||||||||
className={styles["selector-search-input"]} | ||||||||||||||||||||||||||||||||||
placeholder={Locale.UI.Search} | ||||||||||||||||||||||||||||||||||
autoFocus | ||||||||||||||||||||||||||||||||||
onInput={(e) => onSearch(e.currentTarget.value)} | ||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||
Comment on lines
+536
to
+542
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Improve accessibility and event handling of search input Add accessibility attributes and use onChange for better cross-browser compatibility. <input
type="text"
className={styles["selector-search-input"]}
placeholder={Locale.UI.Search}
autoFocus
- onInput={(e) => onSearch(e.currentTarget.value)}
+ onChange={(e) => onSearch(e.target.value)}
+ aria-label={Locale.UI.Search}
+ role="searchbox"
/> 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||
{/* list content */} | ||||||||||||||||||||||||||||||||||
<List> | ||||||||||||||||||||||||||||||||||
{props.items.map((item, i) => { | ||||||||||||||||||||||||||||||||||
const selected = selectedValues.includes(item.value); | ||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||
<ListItem | ||||||||||||||||||||||||||||||||||
className={clsx(styles["selector-item"], { | ||||||||||||||||||||||||||||||||||
[styles["selector-item-disabled"]]: item.disable, | ||||||||||||||||||||||||||||||||||
})} | ||||||||||||||||||||||||||||||||||
key={i} | ||||||||||||||||||||||||||||||||||
title={item.title} | ||||||||||||||||||||||||||||||||||
subTitle={item.subTitle} | ||||||||||||||||||||||||||||||||||
onClick={(e) => { | ||||||||||||||||||||||||||||||||||
if (item.disable) { | ||||||||||||||||||||||||||||||||||
e.stopPropagation(); | ||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||
handleSelection(e, item.value); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||
{selected ? ( | ||||||||||||||||||||||||||||||||||
<div | ||||||||||||||||||||||||||||||||||
style={{ | ||||||||||||||||||||||||||||||||||
height: 10, | ||||||||||||||||||||||||||||||||||
width: 10, | ||||||||||||||||||||||||||||||||||
backgroundColor: "var(--primary)", | ||||||||||||||||||||||||||||||||||
borderRadius: 10, | ||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||
></div> | ||||||||||||||||||||||||||||||||||
) : ( | ||||||||||||||||||||||||||||||||||
<></> | ||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||
</ListItem> | ||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||
})} | ||||||||||||||||||||||||||||||||||
{filteredItems.length ? ( | ||||||||||||||||||||||||||||||||||
filteredItems.map((item, i) => { | ||||||||||||||||||||||||||||||||||
const selected = selectedValues.includes(item.value); | ||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||
<ListItem | ||||||||||||||||||||||||||||||||||
className={clsx(styles["selector-item"], { | ||||||||||||||||||||||||||||||||||
[styles["selector-item-disabled"]]: item.disable, | ||||||||||||||||||||||||||||||||||
})} | ||||||||||||||||||||||||||||||||||
key={i} | ||||||||||||||||||||||||||||||||||
title={item.title} | ||||||||||||||||||||||||||||||||||
subTitle={item.subTitle} | ||||||||||||||||||||||||||||||||||
onClick={(e) => { | ||||||||||||||||||||||||||||||||||
if (item.disable) { | ||||||||||||||||||||||||||||||||||
e.stopPropagation(); | ||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||
handleSelection(e, item.value); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||
{selected ? ( | ||||||||||||||||||||||||||||||||||
<div | ||||||||||||||||||||||||||||||||||
style={{ | ||||||||||||||||||||||||||||||||||
height: 10, | ||||||||||||||||||||||||||||||||||
width: 10, | ||||||||||||||||||||||||||||||||||
backgroundColor: "var(--primary)", | ||||||||||||||||||||||||||||||||||
borderRadius: 10, | ||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||
></div> | ||||||||||||||||||||||||||||||||||
) : ( | ||||||||||||||||||||||||||||||||||
<></> | ||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||
</ListItem> | ||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||
) : ( | ||||||||||||||||||||||||||||||||||
<ListItem | ||||||||||||||||||||||||||||||||||
title={Locale.UI.NoResults} | ||||||||||||||||||||||||||||||||||
className={styles["selector-item"]} | ||||||||||||||||||||||||||||||||||
></ListItem> | ||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||
</List> | ||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Enhance selector bar styling for better visual consistency
The selector bar implementation needs improvements for better visual consistency and user experience:
📝 Committable suggestion