diff options
| author | Adam <[email protected]> | 2026-01-21 14:21:52 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-01-21 14:21:59 -0600 |
| commit | 6d656e4827a28d154a36fd5bc748c0bf9aacd02e (patch) | |
| tree | cab6161a02a67bbcd04313b1c5ca055827ee5ee4 | |
| parent | ae8cff22e5c21a7e5b428721a5a26a7feab9cf87 (diff) | |
| download | opencode-6d656e4827a28d154a36fd5bc748c0bf9aacd02e.tar.gz opencode-6d656e4827a28d154a36fd5bc748c0bf9aacd02e.zip | |
fix(app): querySelector errors, more defensive scroll-to-item
| -rw-r--r-- | packages/ui/src/components/list.tsx | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/packages/ui/src/components/list.tsx b/packages/ui/src/components/list.tsx index 6d7ad1da6..aeb2769d6 100644 --- a/packages/ui/src/components/list.tsx +++ b/packages/ui/src/components/list.tsx @@ -6,6 +6,13 @@ import { Icon, type IconProps } from "./icon" import { IconButton } from "./icon-button" import { TextField } from "./text-field" +function findByKey(container: HTMLElement, key: string) { + const nodes = container.querySelectorAll<HTMLElement>('[data-slot="list-item"][data-key]') + for (const node of nodes) { + if (node.getAttribute("data-key") === key) return node + } +} + export interface ListSearchProps { placeholder?: string autofocus?: boolean @@ -97,8 +104,8 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void }) if (!props.current) return const key = props.key(props.current) requestAnimationFrame(() => { - const element = scroll.querySelector(`[data-key="${CSS.escape(key)}"]`) - if (!(element instanceof HTMLElement)) return + const element = findByKey(scroll, key) + if (!element) return scrollIntoView(scroll, element, "center") }) }) @@ -114,8 +121,8 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void }) } const key = active() if (!key) return - const element = scroll.querySelector(`[data-key="${CSS.escape(key)}"]`) - if (!(element instanceof HTMLElement)) return + const element = findByKey(scroll, key) + if (!element) return scrollIntoView(scroll, element, "center") }) |
