summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/components
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-10-24 08:26:17 -0500
committerAdam <[email protected]>2025-10-24 12:16:33 -0500
commitfe8f6d7a3eef34e932bd43d244460d417865de88 (patch)
tree3129fd2072fd3fd0dd842e33c59e0f1f256c1df3 /packages/ui/src/components
parent59b5f5350950e9cac81676f45eaca8611514c4d1 (diff)
downloadopencode-fe8f6d7a3eef34e932bd43d244460d417865de88.tar.gz
opencode-fe8f6d7a3eef34e932bd43d244460d417865de88.zip
wip: desktop work
Diffstat (limited to 'packages/ui/src/components')
-rw-r--r--packages/ui/src/components/collapsible.css46
-rw-r--r--packages/ui/src/components/collapsible.tsx35
-rw-r--r--packages/ui/src/components/index.ts1
3 files changed, 82 insertions, 0 deletions
diff --git a/packages/ui/src/components/collapsible.css b/packages/ui/src/components/collapsible.css
new file mode 100644
index 000000000..441d0083f
--- /dev/null
+++ b/packages/ui/src/components/collapsible.css
@@ -0,0 +1,46 @@
+[data-component="collapsible"] {
+ display: flex;
+ flex-direction: column;
+
+ [data-slot="trigger"] {
+ cursor: pointer;
+ user-select: none;
+
+ &:focus-visible {
+ outline: 2px solid var(--border-focus);
+ outline-offset: 2px;
+ }
+
+ &[data-disabled] {
+ cursor: not-allowed;
+ opacity: 0.5;
+ }
+ }
+
+ [data-slot="content"] {
+ overflow: hidden;
+ /* animation: slideUp 250ms ease-out; */
+
+ /* &[data-expanded] { */
+ /* animation: slideDown 250ms ease-out; */
+ /* } */
+ }
+}
+
+@keyframes slideDown {
+ from {
+ height: 0;
+ }
+ to {
+ height: var(--kb-collapsible-content-height);
+ }
+}
+
+@keyframes slideUp {
+ from {
+ height: var(--kb-collapsible-content-height);
+ }
+ to {
+ height: 0;
+ }
+}
diff --git a/packages/ui/src/components/collapsible.tsx b/packages/ui/src/components/collapsible.tsx
new file mode 100644
index 000000000..011d103c1
--- /dev/null
+++ b/packages/ui/src/components/collapsible.tsx
@@ -0,0 +1,35 @@
+import { Collapsible as Kobalte, CollapsibleRootProps } from "@kobalte/core/collapsible"
+import { ComponentProps, ParentProps, splitProps } from "solid-js"
+
+export interface CollapsibleProps extends ParentProps<CollapsibleRootProps> {
+ class?: string
+ classList?: ComponentProps<"div">["classList"]
+}
+
+function CollapsibleRoot(props: CollapsibleProps) {
+ const [local, others] = splitProps(props, ["class", "classList"])
+
+ return (
+ <Kobalte
+ data-component="collapsible"
+ classList={{
+ ...(local.classList ?? {}),
+ [local.class ?? ""]: !!local.class,
+ }}
+ {...others}
+ />
+ )
+}
+
+function CollapsibleTrigger(props: ComponentProps<typeof Kobalte.Trigger>) {
+ return <Kobalte.Trigger data-slot="trigger" {...props} />
+}
+
+function CollapsibleContent(props: ComponentProps<typeof Kobalte.Content>) {
+ return <Kobalte.Content data-slot="content" {...props} />
+}
+
+export const Collapsible = Object.assign(CollapsibleRoot, {
+ Trigger: CollapsibleTrigger,
+ Content: CollapsibleContent,
+})
diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts
index 71cfd3a89..3691363cd 100644
--- a/packages/ui/src/components/index.ts
+++ b/packages/ui/src/components/index.ts
@@ -1,4 +1,5 @@
export * from "./button"
+export * from "./collapsible"
export * from "./dialog"
export * from "./icon"
export * from "./icon-button"