From fe8f6d7a3eef34e932bd43d244460d417865de88 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 24 Oct 2025 08:26:17 -0500 Subject: wip: desktop work --- packages/ui/src/components/collapsible.css | 46 ++++++++++++++++++++++++++++++ packages/ui/src/components/collapsible.tsx | 35 +++++++++++++++++++++++ packages/ui/src/components/index.ts | 1 + packages/ui/src/demo.tsx | 36 ++++++++++++++++++++++- 4 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 packages/ui/src/components/collapsible.css create mode 100644 packages/ui/src/components/collapsible.tsx (limited to 'packages/ui/src') 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 { + class?: string + classList?: ComponentProps<"div">["classList"] +} + +function CollapsibleRoot(props: CollapsibleProps) { + const [local, others] = splitProps(props, ["class", "classList"]) + + return ( + + ) +} + +function CollapsibleTrigger(props: ComponentProps) { + return +} + +function CollapsibleContent(props: ComponentProps) { + return +} + +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" diff --git a/packages/ui/src/demo.tsx b/packages/ui/src/demo.tsx index 85fd20c0e..7c507d7d9 100644 --- a/packages/ui/src/demo.tsx +++ b/packages/ui/src/demo.tsx @@ -1,6 +1,19 @@ import type { Component } from "solid-js" import { createSignal } from "solid-js" -import { Button, Select, Tabs, Tooltip, Fonts, List, Dialog, Icon, IconButton, Input, SelectDialog } from "./components" +import { + Button, + Select, + Tabs, + Tooltip, + Fonts, + List, + Dialog, + Icon, + IconButton, + Input, + SelectDialog, + Collapsible, +} from "./components" import "./index.css" const Demo: Component = () => { @@ -180,6 +193,27 @@ const Demo: Component = () => { {(item) =>
{item}
} +

Collapsible

+
+ + + + + +
+

This is collapsible content that can be toggled open and closed.

+

It animates smoothly using CSS animations.

+
+
+
+
) -- cgit v1.2.3