brunner56's picture
implement app
0bfe2e3
'use client';
import * as TabsPrimitive from '@radix-ui/react-tabs';
import { cva } from 'class-variance-authority';
import * as React from 'react';
import { cn, ComponentAnatomy, defineStyleAnatomy } from '../core/styling';
/* -------------------------------------------------------------------------------------------------
* Anatomy
* -----------------------------------------------------------------------------------------------*/
export const TabsAnatomy = defineStyleAnatomy({
root: cva(['UI-Tabs__root']),
list: cva([
'UI-Tabs__list',
'inline-flex h-12 items-center justify-center w-full',
]),
trigger: cva([
'UI-Tabs__trigger appearance-none shadow-none',
'inline-flex h-full items-center justify-center whitespace-nowrap px-3 py-1.5 text-sm text-[--muted] font-medium ring-offset-[--background]',
'transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
'disabled:pointer-events-none disabled:opacity-50',
'border-transparent border-b-2 -mb-px',
'data-[state=active]:border-[--brand] data-[state=active]:text-[--foreground]',
]),
content: cva([
'UI-Tabs__content',
'ring-offset-[--background]',
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[--ring] focus-visible:ring-offset-2',
]),
});
/* -------------------------------------------------------------------------------------------------
* Tabs
* -----------------------------------------------------------------------------------------------*/
const __TabsAnatomyContext = React.createContext<
ComponentAnatomy<typeof TabsAnatomy>
>({});
export type TabsProps = React.ComponentPropsWithoutRef<
typeof TabsPrimitive.Root
> &
ComponentAnatomy<typeof TabsAnatomy>;
export const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(
(props, ref) => {
const { className, listClass, triggerClass, contentClass, ...rest } = props;
return (
<__TabsAnatomyContext.Provider
value={{
listClass,
triggerClass,
contentClass,
}}
>
<TabsPrimitive.Root
ref={ref}
className={cn(TabsAnatomy.root(), className)}
{...rest}
/>
</__TabsAnatomyContext.Provider>
);
}
);
Tabs.displayName = 'Tabs';
/* -------------------------------------------------------------------------------------------------
* TabsList
* -----------------------------------------------------------------------------------------------*/
export type TabsListProps = React.ComponentPropsWithoutRef<
typeof TabsPrimitive.List
>;
export const TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(
(props, ref) => {
const { className, ...rest } = props;
const { listClass } = React.useContext(__TabsAnatomyContext);
return (
<TabsPrimitive.List
ref={ref}
className={cn(TabsAnatomy.list(), listClass, className)}
{...rest}
/>
);
}
);
TabsList.displayName = 'TabsList';
/* -------------------------------------------------------------------------------------------------
* TabsTrigger
* -----------------------------------------------------------------------------------------------*/
export type TabsTriggerProps = React.ComponentPropsWithoutRef<
typeof TabsPrimitive.Trigger
>;
export const TabsTrigger = React.forwardRef<
HTMLButtonElement,
TabsTriggerProps
>((props, ref) => {
const { className, ...rest } = props;
const { triggerClass } = React.useContext(__TabsAnatomyContext);
return (
<TabsPrimitive.Trigger
ref={ref}
className={cn(TabsAnatomy.trigger(), triggerClass, className)}
{...rest}
/>
);
});
TabsTrigger.displayName = 'TabsTrigger';
/* -------------------------------------------------------------------------------------------------
* TabsContent
* -----------------------------------------------------------------------------------------------*/
export type TabsContentProps = React.ComponentPropsWithoutRef<
typeof TabsPrimitive.Content
>;
export const TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(
(props, ref) => {
const { className, ...rest } = props;
const { contentClass } = React.useContext(__TabsAnatomyContext);
return (
<TabsPrimitive.Content
ref={ref}
className={cn(TabsAnatomy.content(), contentClass, className)}
{...rest}
/>
);
}
);
TabsContent.displayName = 'TabsContent';