summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/components/popover.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-17 03:47:44 -0600
committerAdam <[email protected]>2025-12-17 03:47:49 -0600
commit494e6fff019bb502fff88a07d6c519c063af9a02 (patch)
treecda9a1f68c013c7a542cbc4f82c7b7b63f9fa0a1 /packages/ui/src/components/popover.tsx
parent0c7a297b1d3d9cdf8a060c4ed75160152da2b981 (diff)
downloadopencode-494e6fff019bb502fff88a07d6c519c063af9a02.tar.gz
opencode-494e6fff019bb502fff88a07d6c519c063af9a02.zip
feat(desktop): share sessions
Diffstat (limited to 'packages/ui/src/components/popover.tsx')
-rw-r--r--packages/ui/src/components/popover.tsx44
1 files changed, 44 insertions, 0 deletions
diff --git a/packages/ui/src/components/popover.tsx b/packages/ui/src/components/popover.tsx
new file mode 100644
index 000000000..3262098e5
--- /dev/null
+++ b/packages/ui/src/components/popover.tsx
@@ -0,0 +1,44 @@
+import { Popover as Kobalte } from "@kobalte/core/popover"
+import { ComponentProps, JSXElement, ParentProps, Show, splitProps } from "solid-js"
+import { IconButton } from "./icon-button"
+
+export interface PopoverProps extends ParentProps, Omit<ComponentProps<typeof Kobalte>, "children"> {
+ trigger: JSXElement
+ title?: JSXElement
+ description?: JSXElement
+ class?: ComponentProps<"div">["class"]
+ classList?: ComponentProps<"div">["classList"]
+}
+
+export function Popover(props: PopoverProps) {
+ const [local, rest] = splitProps(props, ["trigger", "title", "description", "class", "classList", "children"])
+
+ return (
+ <Kobalte gutter={4} {...rest}>
+ <Kobalte.Trigger as="div" data-slot="popover-trigger">
+ {local.trigger}
+ </Kobalte.Trigger>
+ <Kobalte.Portal>
+ <Kobalte.Content
+ data-component="popover-content"
+ classList={{
+ ...(local.classList ?? {}),
+ [local.class ?? ""]: !!local.class,
+ }}
+ >
+ {/* <Kobalte.Arrow data-slot="popover-arrow" /> */}
+ <Show when={local.title}>
+ <div data-slot="popover-header">
+ <Kobalte.Title data-slot="popover-title">{local.title}</Kobalte.Title>
+ <Kobalte.CloseButton data-slot="popover-close-button" as={IconButton} icon="close" variant="ghost" />
+ </div>
+ </Show>
+ <Show when={local.description}>
+ <Kobalte.Description data-slot="popover-description">{local.description}</Kobalte.Description>
+ </Show>
+ <div data-slot="popover-body">{local.children}</div>
+ </Kobalte.Content>
+ </Kobalte.Portal>
+ </Kobalte>
+ )
+}