From 494e6fff019bb502fff88a07d6c519c063af9a02 Mon Sep 17 00:00:00 2001
From: Adam <2363879+adamdotdevin@users.noreply.github.com>
Date: Wed, 17 Dec 2025 03:47:44 -0600
Subject: feat(desktop): share sessions
---
packages/ui/src/components/icon.tsx | 1 +
packages/ui/src/components/popover.css | 95 +++++++++++++++++++++++++++++++
packages/ui/src/components/popover.tsx | 44 ++++++++++++++
packages/ui/src/components/text-field.tsx | 10 ++--
packages/ui/src/styles/index.css | 1 +
5 files changed, 146 insertions(+), 5 deletions(-)
create mode 100644 packages/ui/src/components/popover.css
create mode 100644 packages/ui/src/components/popover.tsx
(limited to 'packages/ui')
diff --git a/packages/ui/src/components/icon.tsx b/packages/ui/src/components/icon.tsx
index b8e8106e8..94d9544d6 100644
--- a/packages/ui/src/components/icon.tsx
+++ b/packages/ui/src/components/icon.tsx
@@ -52,6 +52,7 @@ const icons = {
copy: ``,
check: ``,
photo: ``,
+ share: ``,
}
export interface IconProps extends ComponentProps<"svg"> {
diff --git a/packages/ui/src/components/popover.css b/packages/ui/src/components/popover.css
new file mode 100644
index 000000000..74d7f5a39
--- /dev/null
+++ b/packages/ui/src/components/popover.css
@@ -0,0 +1,95 @@
+[data-slot="popover-trigger"] {
+ display: inline-flex;
+}
+
+[data-component="popover-content"] {
+ z-index: 50;
+ min-width: 200px;
+ max-width: 320px;
+ border-radius: var(--radius-md);
+ border: 1px solid var(--border-weak-base);
+ background-color: var(--surface-raised-stronger-non-alpha);
+ box-shadow: var(--shadow-md);
+ transform-origin: var(--kb-popover-content-transform-origin);
+
+ &:focus-within {
+ outline: none;
+ }
+
+ &[data-closed] {
+ animation: popover-close 0.15s ease-out;
+ }
+
+ &[data-expanded] {
+ animation: popover-open 0.15s ease-out;
+ }
+
+ [data-slot="popover-header"] {
+ display: flex;
+ padding: 12px;
+ padding-bottom: 0;
+ justify-content: space-between;
+ align-items: center;
+ gap: 8px;
+
+ [data-slot="popover-title"] {
+ flex: 1;
+ color: var(--text-strong);
+ margin: 0;
+
+ font-family: var(--font-family-sans);
+ font-size: var(--font-size-base);
+ font-style: normal;
+ font-weight: var(--font-weight-medium);
+ line-height: var(--line-height-large);
+ letter-spacing: var(--letter-spacing-normal);
+ }
+
+ [data-slot="popover-close-button"] {
+ flex-shrink: 0;
+ }
+ }
+
+ [data-slot="popover-description"] {
+ padding: 0 12px;
+ margin: 0;
+ color: var(--text-base);
+
+ font-family: var(--font-family-sans);
+ font-size: var(--font-size-small);
+ font-style: normal;
+ font-weight: var(--font-weight-regular);
+ line-height: var(--line-height-large);
+ letter-spacing: var(--letter-spacing-normal);
+ }
+
+ [data-slot="popover-body"] {
+ padding: 12px;
+ }
+
+ [data-slot="popover-arrow"] {
+ fill: var(--surface-raised-stronger-non-alpha);
+ }
+}
+
+@keyframes popover-open {
+ from {
+ opacity: 0;
+ transform: scale(0.96);
+ }
+ to {
+ opacity: 1;
+ transform: scale(1);
+ }
+}
+
+@keyframes popover-close {
+ from {
+ opacity: 1;
+ transform: scale(1);
+ }
+ to {
+ opacity: 0;
+ transform: scale(0.96);
+ }
+}
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, "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 (
+
+
+ {local.trigger}
+
+
+
+ {/* */}
+
+
+ {local.title}
+
+
+
+
+ {local.description}
+
+ {local.children}
+
+
+
+ )
+}
diff --git a/packages/ui/src/components/text-field.tsx b/packages/ui/src/components/text-field.tsx
index 63ffb2594..77f014b6b 100644
--- a/packages/ui/src/components/text-field.tsx
+++ b/packages/ui/src/components/text-field.tsx
@@ -56,6 +56,10 @@ export function TextField(props: TextFieldProps) {
setTimeout(() => setCopied(false), 2000)
}
+ function handleClick() {
+ if (local.copyable) handleCopy()
+ }
+
return (
)
}
-
-/** @deprecated Use TextField instead */
-export const Input = TextField
-/** @deprecated Use TextFieldProps instead */
-export type InputProps = TextFieldProps
diff --git a/packages/ui/src/styles/index.css b/packages/ui/src/styles/index.css
index 3f8838a7a..c4302a4d3 100644
--- a/packages/ui/src/styles/index.css
+++ b/packages/ui/src/styles/index.css
@@ -27,6 +27,7 @@
@import "../components/markdown.css" layer(components);
@import "../components/message-part.css" layer(components);
@import "../components/message-nav.css" layer(components);
+@import "../components/popover.css" layer(components);
@import "../components/progress-circle.css" layer(components);
@import "../components/resize-handle.css" layer(components);
@import "../components/select.css" layer(components);
--
cgit v1.2.3