From a8836c5615f620321cc7aa2670767e0c9586d27b Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 13 Nov 2025 14:47:25 -0600 Subject: wip(desktop): layout improvements --- packages/ui/src/components/accordion.css | 29 +- packages/ui/src/components/accordion.tsx | 11 +- packages/ui/src/components/button.css | 2 +- packages/ui/src/components/card.css | 2 +- packages/ui/src/components/checkbox.css | 2 +- packages/ui/src/components/collapsible.css | 2 +- packages/ui/src/components/dialog.css | 2 +- packages/ui/src/components/icon-button.css | 2 +- packages/ui/src/components/icon.tsx | 1 + packages/ui/src/components/list.css | 2 +- packages/ui/src/components/select-dialog.css | 4 +- packages/ui/src/components/select.css | 4 +- packages/ui/src/components/tabs.css | 48 ++- packages/ui/src/components/tabs.tsx | 31 +- packages/ui/src/components/tooltip.css | 2 +- packages/ui/src/styles/colors.css | 48 +++ packages/ui/src/styles/tailwind/colors.css | 16 +- packages/ui/src/styles/theme.css | 539 +++++++++++++++++++++++++-- packages/ui/src/styles/utilities.css | 2 +- 19 files changed, 654 insertions(+), 95 deletions(-) (limited to 'packages/ui/src') diff --git a/packages/ui/src/components/accordion.css b/packages/ui/src/components/accordion.css index f949dc948..8cfac06b0 100644 --- a/packages/ui/src/components/accordion.css +++ b/packages/ui/src/components/accordion.css @@ -24,7 +24,7 @@ [data-slot="accordion-trigger"] { width: 100%; display: flex; - height: 40px; + height: 32px; padding: 8px 12px; justify-content: space-between; align-items: center; @@ -63,23 +63,24 @@ margin-bottom: 8px; [data-slot="accordion-trigger"] { - border-radius: 8px 8px 0 0; + border-top-left-radius: var(--radius-md); + border-top-right-radius: var(--radius-md); } [data-slot="accordion-content"] { border: 1px solid var(--border-weak-base); border-top: none; - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; + border-bottom-left-radius: var(--radius-md); + border-bottom-right-radius: var(--radius-md); } [data-slot="accordion-item"]:has(+ &) { &[data-closed] { - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; + border-bottom-left-radius: var(--radius-md); + border-bottom-right-radius: var(--radius-md); [data-slot="accordion-trigger"] { - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; + border-bottom-left-radius: var(--radius-md); + border-bottom-right-radius: var(--radius-md); } } margin-bottom: 8px; @@ -89,8 +90,8 @@ margin-top: 8px; [data-slot="accordion-trigger"] { - border-top-left-radius: 8px; - border-top-right-radius: 8px; + border-top-left-radius: var(--radius-md); + border-top-right-radius: var(--radius-md); } } } @@ -106,8 +107,8 @@ &[data-closed] { [data-slot="accordion-trigger"] { - border-top-left-radius: 8px; - border-top-right-radius: 8px; + border-top-left-radius: var(--radius-md); + border-top-right-radius: var(--radius-md); } } } @@ -117,8 +118,8 @@ &[data-closed] { [data-slot="accordion-trigger"] { - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; + border-bottom-left-radius: var(--radius-md); + border-bottom-right-radius: var(--radius-md); } } } diff --git a/packages/ui/src/components/accordion.tsx b/packages/ui/src/components/accordion.tsx index 02f00b7be..535d38e3d 100644 --- a/packages/ui/src/components/accordion.tsx +++ b/packages/ui/src/components/accordion.tsx @@ -1,11 +1,9 @@ import { Accordion as Kobalte } from "@kobalte/core/accordion" -import { createSignal, splitProps } from "solid-js" +import { splitProps } from "solid-js" import type { ComponentProps, ParentProps } from "solid-js" export interface AccordionProps extends ComponentProps {} -export interface AccordionItemProps extends ComponentProps { - defaultOpen?: boolean -} +export interface AccordionItemProps extends ComponentProps {} export interface AccordionHeaderProps extends ComponentProps {} export interface AccordionTriggerProps extends ComponentProps {} export interface AccordionContentProps extends ComponentProps {} @@ -25,14 +23,11 @@ function AccordionRoot(props: AccordionProps) { } function AccordionItem(props: AccordionItemProps) { - const [split, rest] = splitProps(props, ["class", "classList", "defaultOpen"]) - const [open, setOpen] = createSignal(split.defaultOpen ?? false) + const [split, rest] = splitProps(props, ["class", "classList"]) return ( `, "align-right": ``, expand: ``, + collapse: ``, } export interface IconProps extends ComponentProps<"svg"> { diff --git a/packages/ui/src/components/list.css b/packages/ui/src/components/list.css index 67db2c619..2136c4f92 100644 --- a/packages/ui/src/components/list.css +++ b/packages/ui/src/components/list.css @@ -14,7 +14,7 @@ padding: 4px 12px; text-align: left; - border-radius: 6px; + border-radius: var(--radius-md); transition: background-color 0.2s ease-in-out; &[data-active="true"] { diff --git a/packages/ui/src/components/select-dialog.css b/packages/ui/src/components/select-dialog.css index 41d8f3921..6ca8fa0f3 100644 --- a/packages/ui/src/components/select-dialog.css +++ b/packages/ui/src/components/select-dialog.css @@ -7,7 +7,7 @@ gap: 12px; align-self: stretch; - border-radius: 8px; + border-radius: var(--radius-md); background: var(--surface-base); [data-slot="input-container"] { @@ -100,7 +100,7 @@ align-items: center; &[data-active="true"] { - border-radius: 8px; + border-radius: var(--radius-md); background: var(--surface-raised-base-hover); } } diff --git a/packages/ui/src/components/select.css b/packages/ui/src/components/select.css index 79445420a..7bafa39f7 100644 --- a/packages/ui/src/components/select.css +++ b/packages/ui/src/components/select.css @@ -21,7 +21,7 @@ [data-component="select-content"] { min-width: 4rem; overflow: hidden; - border-radius: 8px; + border-radius: var(--radius-md); border-width: 1px; border-style: solid; border-color: var(--border-weak-base); @@ -60,7 +60,7 @@ display: flex; align-items: center; padding: 0 6px 0 6px; - border-radius: 6px; + border-radius: var(--radius-sm); /* text-12-medium */ font-family: var(--font-family-sans); diff --git a/packages/ui/src/components/tabs.css b/packages/ui/src/components/tabs.css index 67f289283..91efbe50d 100644 --- a/packages/ui/src/components/tabs.css +++ b/packages/ui/src/components/tabs.css @@ -6,7 +6,7 @@ background-color: var(--background-stronger); overflow: clip; - [data-slot="list"] { + [data-slot="tabs-list"] { height: 48px; width: 100%; position: relative; @@ -36,12 +36,12 @@ } } - [data-slot="trigger"] { + [data-slot="tabs-trigger-wrapper"] { position: relative; height: 100%; - padding: 14px 24px; display: flex; align-items: center; + gap: 12px; color: var(--text-base); /* text-14-medium */ @@ -58,6 +58,23 @@ border-right: 1px solid var(--border-weak-base); background-color: var(--background-base); + [data-slot="tabs-trigger"] { + display: flex; + align-items: center; + justify-content: center; + padding: 14px 24px; + } + + [data-slot="tabs-trigger-close-button"] { + display: flex; + align-items: center; + justify-content: center; + } + + [data-component="icon-button"] { + margin: -0.25rem; + } + &:disabled { pointer-events: none; color: var(--text-weaker); @@ -66,17 +83,38 @@ outline: none; box-shadow: 0 0 0 2px var(--border-focus); } - &[data-selected] { + &:has([data-hidden]) { + [data-slot="tabs-trigger-close-button"] { + opacity: 0; + } + + &:hover { + [data-slot="tabs-trigger-close-button"] { + opacity: 1; + } + } + } + &:has([data-selected]) { color: var(--text-strong); background-color: transparent; border-bottom-color: transparent; + [data-slot="tabs-trigger-close-button"] { + opacity: 1; + } } &:hover:not(:disabled):not([data-selected]) { color: var(--text-strong); } + &:has([data-slot="tabs-trigger-close-button"]) { + padding-right: 12px; + + [data-slot="tabs-trigger"] { + padding-right: 0; + } + } } - [data-slot="content"] { + [data-slot="tabs-content"] { overflow-y: auto; flex: 1; diff --git a/packages/ui/src/components/tabs.tsx b/packages/ui/src/components/tabs.tsx index 5e047a7ca..e2f72f158 100644 --- a/packages/ui/src/components/tabs.tsx +++ b/packages/ui/src/components/tabs.tsx @@ -1,10 +1,13 @@ import { Tabs as Kobalte } from "@kobalte/core/tabs" -import { splitProps } from "solid-js" +import { Show, splitProps, type JSX } from "solid-js" import type { ComponentProps, ParentProps } from "solid-js" export interface TabsProps extends ComponentProps {} export interface TabsListProps extends ComponentProps {} -export interface TabsTriggerProps extends ComponentProps {} +export interface TabsTriggerProps extends ComponentProps { + hideCloseButton?: boolean + closeButton?: JSX.Element +} export interface TabsContentProps extends ComponentProps {} function TabsRoot(props: TabsProps) { @@ -26,7 +29,7 @@ function TabsList(props: TabsListProps) { return ( ) { - const [split, rest] = splitProps(props, ["class", "classList", "children"]) + const [split, rest] = splitProps(props, ["class", "classList", "children", "closeButton", "hideCloseButton"]) return ( - - {split.children} - + + {split.children} + + + {(closeButton) => ( +
+ {closeButton()} +
+ )} +
+ ) } @@ -56,7 +67,7 @@ function TabsContent(props: ParentProps) { return (