MCPcopy
hub / github.com/anomalyco/opencode / Dropdown

Function Dropdown

packages/console/app/src/component/dropdown.tsx:15–59  ·  view source on GitHub ↗
(props: DropdownProps)

Source from the content-addressed store, hash-verified

13}
14
15export function Dropdown(props: DropdownProps) {
16 const [store, setStore] = createStore({
17 isOpen: props.open ?? false,
18 })
19 let dropdownRef: HTMLDivElement | undefined
20
21 createEffect(() => {
22 if (props.open !== undefined) {
23 setStore("isOpen", props.open)
24 }
25 })
26
27 createEffect(() => {
28 const handleClickOutside = (event: MouseEvent) => {
29 if (dropdownRef && !dropdownRef.contains(event.target as Node)) {
30 setStore("isOpen", false)
31 props.onOpenChange?.(false)
32 }
33 }
34
35 document.addEventListener("click", handleClickOutside)
36 onCleanup(() => document.removeEventListener("click", handleClickOutside))
37 })
38
39 const toggle = () => {
40 const newValue = !store.isOpen
41 setStore("isOpen", newValue)
42 props.onOpenChange?.(newValue)
43 }
44
45 return (
46 <div data-component="dropdown" class={props.class} ref={dropdownRef}>
47 <button data-slot="trigger" type="button" onClick={toggle}>
48 {typeof props.trigger === "string" ? <span>{props.trigger}</span> : props.trigger}
49 <IconChevron data-slot="chevron" />
50 </button>
51
52 <Show when={store.isOpen}>
53 <div data-slot="dropdown" data-align={props.align ?? "left"}>
54 {props.children}
55 </div>
56 </Show>
57 </div>
58 )
59}
60
61interface DropdownItemProps {
62 children: JSX.Element

Callers

nothing calls this directly

Calls 2

setStoreFunction · 0.85
addEventListenerMethod · 0.80

Tested by

no test coverage detected