From e7ffdf19d96dec9bd80e94bb7e5ede011b649184 Mon Sep 17 00:00:00 2001 From: Wlad Meixner Date: Mon, 7 Sep 2026 11:27:33 +0200 Subject: [PATCH] refactor(base-ui)!: migrate accordion, collapsible, tabs, aspect-ratio BREAKING: AspectRatio has no Base UI primitive and is now a div using CSS aspect-ratio; `ratio` is required rather than defaulting to 1. - Content -> Panel (accordion, collapsible, tabs); tabs Trigger -> Tab - accordion height var -> --accordion-panel-height, with data-starting-style/data-ending-style for the collapse transition - accordion/tabs triggers gain aria-disabled variants - dashboard story: CollapsibleTrigger asChild -> render, and data-[state=open] -> data-open --- src/components/accordion.tsx | 25 +++++++++---------------- src/components/aspect-ratio.tsx | 22 +++++++++++++++++----- src/components/collapsible.tsx | 24 ++++++------------------ src/components/tabs.tsx | 24 ++++++++---------------- src/stories/Dashboard.stories.tsx | 16 +++++++++------- 5 files changed, 49 insertions(+), 62 deletions(-) diff --git a/src/components/accordion.tsx b/src/components/accordion.tsx index 856843f..b3e6725 100644 --- a/src/components/accordion.tsx +++ b/src/components/accordion.tsx @@ -1,12 +1,8 @@ +import { Accordion as AccordionPrimitive } from "@base-ui/react/accordion"; import { cn } from "cn"; import { ChevronDownIcon, ChevronUpIcon } from "lucide-react"; -import { Accordion as AccordionPrimitive } from "radix-ui"; -import type * as React from "react"; -function Accordion({ - className, - ...props -}: React.ComponentProps) { +function Accordion({ className, ...props }: AccordionPrimitive.Root.Props) { return ( ) { +function AccordionItem({ className, ...props }: AccordionPrimitive.Item.Props) { return ( ) { +}: AccordionPrimitive.Trigger.Props) { return ( ) { +}: AccordionPrimitive.Panel.Props) { return ( -
{children}
-
+ ); } diff --git a/src/components/aspect-ratio.tsx b/src/components/aspect-ratio.tsx index 956e8bb..41f57cc 100644 --- a/src/components/aspect-ratio.tsx +++ b/src/components/aspect-ratio.tsx @@ -1,11 +1,23 @@ -"use client"; - -import { AspectRatio as AspectRatioPrimitive } from "radix-ui"; +import { cn } from "cn"; +import type * as React from "react"; function AspectRatio({ + ratio, + className, ...props -}: React.ComponentProps) { - return ; +}: React.ComponentProps<"div"> & { ratio: number }) { + return ( +
+ ); } export { AspectRatio }; diff --git a/src/components/collapsible.tsx b/src/components/collapsible.tsx index 439b44d..6763269 100644 --- a/src/components/collapsible.tsx +++ b/src/components/collapsible.tsx @@ -1,30 +1,18 @@ -import { Collapsible as CollapsiblePrimitive } from "radix-ui"; +import { Collapsible as CollapsiblePrimitive } from "@base-ui/react/collapsible"; -function Collapsible({ - ...props -}: React.ComponentProps) { +function Collapsible({ ...props }: CollapsiblePrimitive.Root.Props) { return ; } -function CollapsibleTrigger({ - ...props -}: React.ComponentProps) { +function CollapsibleTrigger({ ...props }: CollapsiblePrimitive.Trigger.Props) { return ( - + ); } -function CollapsibleContent({ - ...props -}: React.ComponentProps) { +function CollapsibleContent({ ...props }: CollapsiblePrimitive.Panel.Props) { return ( - + ); } diff --git a/src/components/tabs.tsx b/src/components/tabs.tsx index 739fdac..8264f02 100644 --- a/src/components/tabs.tsx +++ b/src/components/tabs.tsx @@ -1,13 +1,12 @@ +import { Tabs as TabsPrimitive } from "@base-ui/react/tabs"; import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "cn"; -import { Tabs as TabsPrimitive } from "radix-ui"; -import type * as React from "react"; function Tabs({ className, orientation = "horizontal", ...props -}: React.ComponentProps) { +}: TabsPrimitive.Root.Props) { return ( & - VariantProps) { +}: TabsPrimitive.List.Props & VariantProps) { return ( ) { +function TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) { return ( - ) { +function TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) { return ( - - - - - Projects - - - + + + Projects + + + } + />