summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/components/list.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-03-13 06:27:58 -0500
committerGitHub <[email protected]>2026-03-13 06:27:58 -0500
commit270cb0b8b4265ac0965ac8b94a58a3bca86fa558 (patch)
tree5a37c81bec1dea75b5c24f6aa8fb6a762d438f64 /packages/ui/src/components/list.tsx
parent46ba9c81703fc6e7db7e623a607eeaab94fcd00f (diff)
downloadopencode-270cb0b8b4265ac0965ac8b94a58a3bca86fa558.tar.gz
opencode-270cb0b8b4265ac0965ac8b94a58a3bca86fa558.zip
chore: cleanup (#17284)
Diffstat (limited to 'packages/ui/src/components/list.tsx')
-rw-r--r--packages/ui/src/components/list.tsx22
1 files changed, 14 insertions, 8 deletions
diff --git a/packages/ui/src/components/list.tsx b/packages/ui/src/components/list.tsx
index aa2347037..8ce45bc5c 100644
--- a/packages/ui/src/components/list.tsx
+++ b/packages/ui/src/components/list.tsx
@@ -1,5 +1,5 @@
import { type FilteredListProps, useFilteredList } from "@opencode-ai/ui/hooks"
-import { createEffect, createSignal, For, onCleanup, type JSX, on, Show } from "solid-js"
+import { createEffect, For, onCleanup, type JSX, on, Show } from "solid-js"
import { createStore } from "solid-js/store"
import { useI18n } from "../context/i18n"
import { Icon, type IconProps } from "./icon"
@@ -56,12 +56,16 @@ export interface ListRef {
export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void }) {
const i18n = useI18n()
- const [scrollRef, setScrollRef] = createSignal<HTMLDivElement | undefined>(undefined)
- const [internalFilter, setInternalFilter] = createSignal("")
let inputRef: HTMLInputElement | HTMLTextAreaElement | undefined
const [store, setStore] = createStore({
mouseActive: false,
+ scrollRef: undefined as HTMLDivElement | undefined,
+ internalFilter: "",
})
+ const scrollRef = () => store.scrollRef
+ const setScrollRef = (el: HTMLDivElement | undefined) => setStore("scrollRef", el)
+ const internalFilter = () => store.internalFilter
+ const setInternalFilter = (value: string) => setStore("internalFilter", value)
const scrollIntoView = (container: HTMLDivElement, node: HTMLElement, block: "center" | "nearest") => {
const containerRect = container.getBoundingClientRect()
@@ -208,18 +212,20 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void })
}
function GroupHeader(groupProps: { group: { category: string; items: T[] } }): JSX.Element {
- const [stuck, setStuck] = createSignal(false)
- const [header, setHeader] = createSignal<HTMLDivElement | undefined>(undefined)
+ const [state, setState] = createStore({
+ stuck: false,
+ header: undefined as HTMLDivElement | undefined,
+ })
createEffect(() => {
const scroll = scrollRef()
- const node = header()
+ const node = state.header
if (!scroll || !node) return
const handler = () => {
const rect = node.getBoundingClientRect()
const scrollRect = scroll.getBoundingClientRect()
- setStuck(rect.top <= scrollRect.top + 1 && scroll.scrollTop > 0)
+ setState("stuck", rect.top <= scrollRect.top + 1 && scroll.scrollTop > 0)
}
scroll.addEventListener("scroll", handler, { passive: true })
@@ -228,7 +234,7 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void })
})
return (
- <div data-slot="list-header" data-stuck={stuck()} ref={setHeader}>
+ <div data-slot="list-header" data-stuck={state.stuck} ref={(el) => setState("header", el)}>
{props.groupHeader?.(groupProps.group) ?? groupProps.group.category}
</div>
)