@luanthnh/cntt-ui 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -1
- package/.storybook/globals.d.ts +0 -1
- package/.storybook/main.ts +0 -29
- package/.storybook/preview.ts +0 -32
- package/assets/fonts/Montserrat-Black.eot +0 -0
- package/assets/fonts/Montserrat-Black.ttf +0 -0
- package/assets/fonts/Montserrat-Black.woff +0 -0
- package/assets/fonts/Montserrat-Black.woff2 +0 -0
- package/assets/fonts/Montserrat-BlackItalic.eot +0 -0
- package/assets/fonts/Montserrat-BlackItalic.ttf +0 -0
- package/assets/fonts/Montserrat-BlackItalic.woff +0 -0
- package/assets/fonts/Montserrat-BlackItalic.woff2 +0 -0
- package/assets/fonts/Montserrat-Bold.eot +0 -0
- package/assets/fonts/Montserrat-Bold.ttf +0 -0
- package/assets/fonts/Montserrat-Bold.woff +0 -0
- package/assets/fonts/Montserrat-Bold.woff2 +0 -0
- package/assets/fonts/Montserrat-BoldItalic.eot +0 -0
- package/assets/fonts/Montserrat-BoldItalic.ttf +0 -0
- package/assets/fonts/Montserrat-BoldItalic.woff +0 -0
- package/assets/fonts/Montserrat-BoldItalic.woff2 +0 -0
- package/assets/fonts/Montserrat-ExtraBold.eot +0 -0
- package/assets/fonts/Montserrat-ExtraBold.ttf +0 -0
- package/assets/fonts/Montserrat-ExtraBold.woff +0 -0
- package/assets/fonts/Montserrat-ExtraBold.woff2 +0 -0
- package/assets/fonts/Montserrat-ExtraBoldItalic.eot +0 -0
- package/assets/fonts/Montserrat-ExtraBoldItalic.ttf +0 -0
- package/assets/fonts/Montserrat-ExtraBoldItalic.woff +0 -0
- package/assets/fonts/Montserrat-ExtraBoldItalic.woff2 +0 -0
- package/assets/fonts/Montserrat-ExtraLight.eot +0 -0
- package/assets/fonts/Montserrat-ExtraLight.ttf +0 -0
- package/assets/fonts/Montserrat-ExtraLight.woff +0 -0
- package/assets/fonts/Montserrat-ExtraLight.woff2 +0 -0
- package/assets/fonts/Montserrat-ExtraLightItalic.eot +0 -0
- package/assets/fonts/Montserrat-ExtraLightItalic.ttf +0 -0
- package/assets/fonts/Montserrat-ExtraLightItalic.woff +0 -0
- package/assets/fonts/Montserrat-ExtraLightItalic.woff2 +0 -0
- package/assets/fonts/Montserrat-Italic.eot +0 -0
- package/assets/fonts/Montserrat-Italic.ttf +0 -0
- package/assets/fonts/Montserrat-Italic.woff +0 -0
- package/assets/fonts/Montserrat-Italic.woff2 +0 -0
- package/assets/fonts/Montserrat-Light.eot +0 -0
- package/assets/fonts/Montserrat-Light.ttf +0 -0
- package/assets/fonts/Montserrat-Light.woff +0 -0
- package/assets/fonts/Montserrat-Light.woff2 +0 -0
- package/assets/fonts/Montserrat-LightItalic.eot +0 -0
- package/assets/fonts/Montserrat-LightItalic.ttf +0 -0
- package/assets/fonts/Montserrat-LightItalic.woff +0 -0
- package/assets/fonts/Montserrat-LightItalic.woff2 +0 -0
- package/assets/fonts/Montserrat-Medium.eot +0 -0
- package/assets/fonts/Montserrat-Medium.ttf +0 -0
- package/assets/fonts/Montserrat-Medium.woff +0 -0
- package/assets/fonts/Montserrat-Medium.woff2 +0 -0
- package/assets/fonts/Montserrat-MediumItalic.eot +0 -0
- package/assets/fonts/Montserrat-MediumItalic.ttf +0 -0
- package/assets/fonts/Montserrat-MediumItalic.woff +0 -0
- package/assets/fonts/Montserrat-MediumItalic.woff2 +0 -0
- package/assets/fonts/Montserrat-Regular.eot +0 -0
- package/assets/fonts/Montserrat-Regular.ttf +0 -0
- package/assets/fonts/Montserrat-Regular.woff +0 -0
- package/assets/fonts/Montserrat-Regular.woff2 +0 -0
- package/assets/fonts/Montserrat-SemiBold.eot +0 -0
- package/assets/fonts/Montserrat-SemiBold.ttf +0 -0
- package/assets/fonts/Montserrat-SemiBold.woff +0 -0
- package/assets/fonts/Montserrat-SemiBold.woff2 +0 -0
- package/assets/fonts/Montserrat-SemiBoldItalic.eot +0 -0
- package/assets/fonts/Montserrat-SemiBoldItalic.ttf +0 -0
- package/assets/fonts/Montserrat-SemiBoldItalic.woff +0 -0
- package/assets/fonts/Montserrat-SemiBoldItalic.woff2 +0 -0
- package/assets/fonts/Montserrat-Thin.eot +0 -0
- package/assets/fonts/Montserrat-Thin.ttf +0 -0
- package/assets/fonts/Montserrat-Thin.woff +0 -0
- package/assets/fonts/Montserrat-Thin.woff2 +0 -0
- package/assets/fonts/Montserrat-ThinItalic.eot +0 -0
- package/assets/fonts/Montserrat-ThinItalic.ttf +0 -0
- package/assets/fonts/Montserrat-ThinItalic.woff +0 -0
- package/assets/fonts/Montserrat-ThinItalic.woff2 +0 -0
- package/assets/fonts/Montserrat-Variable.eot +0 -0
- package/assets/fonts/Montserrat-Variable.ttf +0 -0
- package/assets/fonts/Montserrat-Variable.woff +0 -0
- package/assets/fonts/Montserrat-Variable.woff2 +0 -0
- package/assets/fonts/Montserrat-VariableItalic.eot +0 -0
- package/assets/fonts/Montserrat-VariableItalic.ttf +0 -0
- package/assets/fonts/Montserrat-VariableItalic.woff +0 -0
- package/assets/fonts/Montserrat-VariableItalic.woff2 +0 -0
- package/assets/icons/arrow-left.svg +0 -1
- package/assets/icons/file.svg +0 -1
- package/assets/icons/globe.svg +0 -1
- package/assets/icons/logo-line.svg +0 -1
- package/assets/icons/next.svg +0 -1
- package/assets/icons/panel-left-expand.svg +0 -1
- package/assets/icons/placeholder.svg +0 -57
- package/assets/icons/vercel.svg +0 -1
- package/assets/icons/window.svg +0 -1
- package/assets/lotties/error-404.json +0 -19642
- package/assets/lotties/error.json +0 -2414
- package/assets/lotties/loader.json +0 -305
- package/components/Welcome.mdx +0 -74
- package/components/lenis/index.tsx +0 -48
- package/components/motion/auto-height.tsx +0 -56
- package/components/motion/cursor.tsx +0 -108
- package/components/motion/highlight.tsx +0 -605
- package/components/motion/number-ticker.tsx +0 -55
- package/components/motion/slot.tsx +0 -106
- package/components/motion/waves.tsx +0 -417
- package/components/primitives/tabs.tsx +0 -174
- package/components/ui/Accordion/index.stories.tsx +0 -39
- package/components/ui/Accordion/index.tsx +0 -170
- package/components/ui/Alert/index.stories.tsx +0 -39
- package/components/ui/Alert/index.tsx +0 -60
- package/components/ui/AlertDialog/index.stories.tsx +0 -47
- package/components/ui/AlertDialog/index.tsx +0 -172
- package/components/ui/AspectRatio/index.stories.tsx +0 -40
- package/components/ui/AspectRatio/index.tsx +0 -9
- package/components/ui/Avatar/index.stories.tsx +0 -39
- package/components/ui/Avatar/index.tsx +0 -44
- package/components/ui/Badge/index.stories.tsx +0 -64
- package/components/ui/Badge/index.tsx +0 -46
- package/components/ui/Breadcrumb/index.stories.tsx +0 -64
- package/components/ui/Breadcrumb/index.tsx +0 -102
- package/components/ui/Button/index.stories.tsx +0 -232
- package/components/ui/Button/index.tsx +0 -114
- package/components/ui/Calendar/index.stories.tsx +0 -20
- package/components/ui/Calendar/index.tsx +0 -149
- package/components/ui/Card/index.stories.tsx +0 -39
- package/components/ui/Card/index.tsx +0 -65
- package/components/ui/Carousel/index.stories.tsx +0 -37
- package/components/ui/Carousel/index.tsx +0 -242
- package/components/ui/Chart/index.stories.tsx +0 -53
- package/components/ui/Chart/index.tsx +0 -322
- package/components/ui/Checkbox/index.stories.tsx +0 -56
- package/components/ui/Checkbox/index.tsx +0 -167
- package/components/ui/CircleProcess/index.stories.tsx +0 -29
- package/components/ui/CircleProcess/index.tsx +0 -50
- package/components/ui/Collapsible/index.stories.tsx +0 -33
- package/components/ui/Collapsible/index.tsx +0 -124
- package/components/ui/Command/index.stories.tsx +0 -65
- package/components/ui/Command/index.tsx +0 -161
- package/components/ui/Container/index.stories.tsx +0 -22
- package/components/ui/Container/index.tsx +0 -30
- package/components/ui/ContextMenu/index.stories.tsx +0 -51
- package/components/ui/ContextMenu/index.tsx +0 -224
- package/components/ui/Dialog/index.stories.tsx +0 -44
- package/components/ui/Dialog/index.tsx +0 -156
- package/components/ui/Drawer/index.stories.tsx +0 -54
- package/components/ui/Drawer/index.tsx +0 -124
- package/components/ui/DropdownMenu/index.stories.tsx +0 -83
- package/components/ui/DropdownMenu/index.tsx +0 -231
- package/components/ui/Dropzone/index.stories.tsx +0 -18
- package/components/ui/Dropzone/index.tsx +0 -47
- package/components/ui/Form/date-field.tsx +0 -77
- package/components/ui/Form/index.stories.tsx +0 -67
- package/components/ui/Form/index.tsx +0 -188
- package/components/ui/Form/select-field.tsx +0 -55
- package/components/ui/Form/text-area-field.tsx +0 -37
- package/components/ui/Form/text-field.tsx +0 -72
- package/components/ui/HStack/index.stories.tsx +0 -48
- package/components/ui/HStack/index.tsx +0 -73
- package/components/ui/HoverCard/index.stories.tsx +0 -38
- package/components/ui/HoverCard/index.tsx +0 -38
- package/components/ui/Icons/index.stories.tsx +0 -27
- package/components/ui/Icons/index.tsx +0 -33
- package/components/ui/ImageWithFallback/index.stories.tsx +0 -32
- package/components/ui/ImageWithFallback/index.tsx +0 -34
- package/components/ui/Input/index.stories.tsx +0 -47
- package/components/ui/Input/index.tsx +0 -21
- package/components/ui/InputOtp/index.stories.tsx +0 -35
- package/components/ui/InputOtp/index.tsx +0 -70
- package/components/ui/Label/index.stories.tsx +0 -18
- package/components/ui/Label/index.tsx +0 -21
- package/components/ui/Marquee/index.stories.tsx +0 -71
- package/components/ui/Marquee/index.tsx +0 -65
- package/components/ui/Menubar/index.stories.tsx +0 -116
- package/components/ui/Menubar/index.tsx +0 -252
- package/components/ui/NavigationMenu/index.stories.tsx +0 -112
- package/components/ui/NavigationMenu/index.tsx +0 -185
- package/components/ui/NoData/index.stories.tsx +0 -24
- package/components/ui/NoData/index.tsx +0 -19
- package/components/ui/Pagination/index.stories.tsx +0 -53
- package/components/ui/Pagination/index.tsx +0 -114
- package/components/ui/Popover/index.stories.tsx +0 -31
- package/components/ui/Popover/index.tsx +0 -42
- package/components/ui/Progress/index.stories.tsx +0 -35
- package/components/ui/Progress/index.tsx +0 -28
- package/components/ui/RadioGroup/index.stories.tsx +0 -28
- package/components/ui/RadioGroup/index.tsx +0 -45
- package/components/ui/Resizable/index.stories.tsx +0 -44
- package/components/ui/Resizable/index.tsx +0 -54
- package/components/ui/ScrollArea/index.stories.tsx +0 -31
- package/components/ui/ScrollArea/index.tsx +0 -56
- package/components/ui/Select/index.stories.tsx +0 -64
- package/components/ui/Select/index.tsx +0 -170
- package/components/ui/Separator/index.stories.tsx +0 -31
- package/components/ui/Separator/index.tsx +0 -28
- package/components/ui/Sheet/index.stories.tsx +0 -45
- package/components/ui/Sheet/index.tsx +0 -130
- package/components/ui/Sidebar/index.stories.tsx +0 -82
- package/components/ui/Sidebar/index.tsx +0 -676
- package/components/ui/Skeleton/index.stories.tsx +0 -36
- package/components/ui/Skeleton/index.tsx +0 -13
- package/components/ui/Slider/index.stories.tsx +0 -48
- package/components/ui/Slider/index.tsx +0 -82
- package/components/ui/Slot/index.stories.tsx +0 -29
- package/components/ui/Slot/index.tsx +0 -106
- package/components/ui/Sonner/index.stories.tsx +0 -36
- package/components/ui/Sonner/index.tsx +0 -31
- package/components/ui/Switch/index.stories.tsx +0 -33
- package/components/ui/Switch/index.tsx +0 -28
- package/components/ui/Table/index.stories.tsx +0 -74
- package/components/ui/Table/index.tsx +0 -95
- package/components/ui/Tabs/index.stories.tsx +0 -38
- package/components/ui/Tabs/index.tsx +0 -78
- package/components/ui/Text/index.stories.tsx +0 -53
- package/components/ui/Text/index.tsx +0 -138
- package/components/ui/Textarea/index.stories.tsx +0 -25
- package/components/ui/Textarea/index.tsx +0 -18
- package/components/ui/Toggle/index.stories.tsx +0 -52
- package/components/ui/Toggle/index.tsx +0 -46
- package/components/ui/ToggleGroup/index.stories.tsx +0 -52
- package/components/ui/ToggleGroup/index.tsx +0 -69
- package/components/ui/Tooltip/index.stories.tsx +0 -29
- package/components/ui/Tooltip/index.tsx +0 -35
- package/components/ui/VStack/index.stories.tsx +0 -45
- package/components/ui/VStack/index.tsx +0 -69
- package/components/ui/colors.stories.tsx +0 -148
- package/eslint.config.js +0 -10
- package/hooks/index.ts +0 -3
- package/hooks/use-auto-height.tsx +0 -99
- package/hooks/use-controlled-state.tsx +0 -32
- package/hooks/use-mobile.ts +0 -19
- package/index.ts +0 -58
- package/lib/get-strict-context.ts +0 -15
- package/lib/utils.ts +0 -10
- package/scripts/generate-exports.ts +0 -32
- package/tsconfig.json +0 -12
- package/tsconfig.tsbuildinfo +0 -1
- package/tsup.config.ts +0 -11
- package/types/svg.d.ts +0 -10
- package/vercel.json +0 -5
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
|
|
3
|
-
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from './index';
|
|
4
|
-
|
|
5
|
-
const meta: Meta<typeof Accordion> = {
|
|
6
|
-
title: 'UI/Accordion',
|
|
7
|
-
component: Accordion,
|
|
8
|
-
tags: ['autodocs'],
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export default meta;
|
|
12
|
-
type Story = StoryObj<typeof Accordion>;
|
|
13
|
-
|
|
14
|
-
export const Default: Story = {
|
|
15
|
-
args: {
|
|
16
|
-
type: 'single',
|
|
17
|
-
collapsible: true,
|
|
18
|
-
},
|
|
19
|
-
render: (args) => (
|
|
20
|
-
<Accordion {...args} className="w-full">
|
|
21
|
-
<AccordionItem value="item-1">
|
|
22
|
-
<AccordionTrigger>Is it accessible?</AccordionTrigger>
|
|
23
|
-
<AccordionContent>Yes. It adheres to the WAI-ARIA design pattern.</AccordionContent>
|
|
24
|
-
</AccordionItem>
|
|
25
|
-
<AccordionItem value="item-2">
|
|
26
|
-
<AccordionTrigger>Is it styled?</AccordionTrigger>
|
|
27
|
-
<AccordionContent>
|
|
28
|
-
Yes. It comes with default styles that matches the other components' aesthetic.
|
|
29
|
-
</AccordionContent>
|
|
30
|
-
</AccordionItem>
|
|
31
|
-
<AccordionItem value="item-3">
|
|
32
|
-
<AccordionTrigger>Is it animated?</AccordionTrigger>
|
|
33
|
-
<AccordionContent>
|
|
34
|
-
Yes. It's animated by default, but you can disable it if you prefer.
|
|
35
|
-
</AccordionContent>
|
|
36
|
-
</AccordionItem>
|
|
37
|
-
</Accordion>
|
|
38
|
-
),
|
|
39
|
-
};
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import * as React from 'react';
|
|
4
|
-
import { ChevronDownIcon } from 'lucide-react';
|
|
5
|
-
import { AnimatePresence, motion, type HTMLMotionProps } from 'motion/react';
|
|
6
|
-
import { Accordion as AccordionPrimitive } from 'radix-ui';
|
|
7
|
-
|
|
8
|
-
import { getStrictContext } from '@/lib/get-strict-context';
|
|
9
|
-
import { cn } from '@/lib/utils';
|
|
10
|
-
import { useControlledState } from '@/hooks/use-controlled-state';
|
|
11
|
-
|
|
12
|
-
type AccordionContextType = {
|
|
13
|
-
value: string | string[] | undefined;
|
|
14
|
-
setValue: (value: string | string[] | undefined) => void;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
type AccordionItemContextType = {
|
|
18
|
-
value: string;
|
|
19
|
-
isOpen: boolean;
|
|
20
|
-
setIsOpen: (open: boolean) => void;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const [AccordionProvider, useAccordion] =
|
|
24
|
-
getStrictContext<AccordionContextType>('AccordionContext');
|
|
25
|
-
|
|
26
|
-
const [AccordionItemProvider, useAccordionItem] =
|
|
27
|
-
getStrictContext<AccordionItemContextType>('AccordionItemContext');
|
|
28
|
-
|
|
29
|
-
type AccordionProps = React.ComponentProps<typeof AccordionPrimitive.Root>;
|
|
30
|
-
|
|
31
|
-
function Accordion(props: AccordionProps) {
|
|
32
|
-
const [value, setValue] = useControlledState<string | string[] | undefined>({
|
|
33
|
-
value: props?.value,
|
|
34
|
-
defaultValue: props?.defaultValue,
|
|
35
|
-
onChange: props?.onValueChange as (value: string | string[] | undefined) => void,
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
return (
|
|
39
|
-
<AccordionProvider value={{ value, setValue }}>
|
|
40
|
-
<AccordionPrimitive.Root data-slot="accordion" {...props} onValueChange={setValue} />
|
|
41
|
-
</AccordionProvider>
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
type AccordionItemProps = React.ComponentProps<typeof AccordionPrimitive.Item>;
|
|
46
|
-
|
|
47
|
-
function AccordionItem(props: AccordionItemProps) {
|
|
48
|
-
const { value } = useAccordion();
|
|
49
|
-
const [isOpen, setIsOpen] = React.useState(value?.includes(props?.value) ?? false);
|
|
50
|
-
|
|
51
|
-
React.useEffect(() => {
|
|
52
|
-
setIsOpen(value?.includes(props?.value) ?? false);
|
|
53
|
-
}, [value, props?.value]);
|
|
54
|
-
|
|
55
|
-
return (
|
|
56
|
-
<AccordionItemProvider value={{ isOpen, setIsOpen, value: props.value }}>
|
|
57
|
-
<AccordionPrimitive.Item data-slot="accordion-item" {...props} />
|
|
58
|
-
</AccordionItemProvider>
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
type AccordionHeaderProps = React.ComponentProps<typeof AccordionPrimitive.Header>;
|
|
63
|
-
|
|
64
|
-
function AccordionHeader(props: AccordionHeaderProps) {
|
|
65
|
-
return <AccordionPrimitive.Header data-slot="accordion-header" {...props} />;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
type AccordionTriggerProps = React.ComponentProps<typeof AccordionPrimitive.Trigger>;
|
|
69
|
-
|
|
70
|
-
function AccordionTrigger({ children, className, ...props }: AccordionTriggerProps) {
|
|
71
|
-
return (
|
|
72
|
-
<AccordionHeader className="flex">
|
|
73
|
-
<AccordionPrimitive.Trigger
|
|
74
|
-
data-slot="accordion-trigger"
|
|
75
|
-
className={cn(
|
|
76
|
-
'focus-visible:border-ring focus-visible:ring-ring/50 hover:text-primary dark:bg-card flex w-full flex-1 cursor-pointer items-center justify-between gap-4 rounded-md rounded-b-none border-b border-gray-200 bg-gray-50 p-4 text-left text-base font-medium transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 dark:border-gray-700 [&[data-state=open]>svg]:rotate-180',
|
|
77
|
-
className,
|
|
78
|
-
)}
|
|
79
|
-
{...props}
|
|
80
|
-
>
|
|
81
|
-
{children}
|
|
82
|
-
<ChevronDownIcon className="text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" />
|
|
83
|
-
</AccordionPrimitive.Trigger>
|
|
84
|
-
</AccordionHeader>
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
type AccordionContentProps = Omit<
|
|
89
|
-
React.ComponentProps<typeof AccordionPrimitive.Content>,
|
|
90
|
-
'asChild' | 'forceMount'
|
|
91
|
-
> &
|
|
92
|
-
HTMLMotionProps<'div'> & {
|
|
93
|
-
keepRendered?: boolean;
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
function AccordionContent({
|
|
97
|
-
keepRendered = false,
|
|
98
|
-
transition = { type: 'spring', stiffness: 150, damping: 22 },
|
|
99
|
-
...props
|
|
100
|
-
}: AccordionContentProps) {
|
|
101
|
-
const { isOpen } = useAccordionItem();
|
|
102
|
-
|
|
103
|
-
return (
|
|
104
|
-
<AnimatePresence>
|
|
105
|
-
{keepRendered ? (
|
|
106
|
-
<AccordionPrimitive.Content asChild forceMount>
|
|
107
|
-
<motion.div
|
|
108
|
-
key="accordion-content"
|
|
109
|
-
data-slot="accordion-content"
|
|
110
|
-
initial={{ height: 0, opacity: 0, '--mask-stop': '0%' }}
|
|
111
|
-
animate={
|
|
112
|
-
isOpen
|
|
113
|
-
? { height: 'auto', opacity: 1, '--mask-stop': '100%' }
|
|
114
|
-
: { height: 0, opacity: 0, '--mask-stop': '0%' }
|
|
115
|
-
}
|
|
116
|
-
transition={transition}
|
|
117
|
-
style={{
|
|
118
|
-
maskImage: 'linear-gradient(black var(--mask-stop), transparent var(--mask-stop))',
|
|
119
|
-
WebkitMaskImage:
|
|
120
|
-
'linear-gradient(black var(--mask-stop), transparent var(--mask-stop))',
|
|
121
|
-
overflow: 'hidden',
|
|
122
|
-
}}
|
|
123
|
-
className={cn('bg-white py-3 dark:bg-gray-900', props.className)}
|
|
124
|
-
{...props}
|
|
125
|
-
/>
|
|
126
|
-
</AccordionPrimitive.Content>
|
|
127
|
-
) : (
|
|
128
|
-
isOpen && (
|
|
129
|
-
<AccordionPrimitive.Content asChild forceMount>
|
|
130
|
-
<motion.div
|
|
131
|
-
key="accordion-content"
|
|
132
|
-
data-slot="accordion-content"
|
|
133
|
-
initial={{ height: 0, opacity: 0, '--mask-stop': '0%' }}
|
|
134
|
-
animate={{ height: 'auto', opacity: 1, '--mask-stop': '100%' }}
|
|
135
|
-
exit={{ height: 0, opacity: 0, '--mask-stop': '0%' }}
|
|
136
|
-
transition={transition}
|
|
137
|
-
style={{
|
|
138
|
-
maskImage: 'linear-gradient(black var(--mask-stop), transparent var(--mask-stop))',
|
|
139
|
-
WebkitMaskImage:
|
|
140
|
-
'linear-gradient(black var(--mask-stop), transparent var(--mask-stop))',
|
|
141
|
-
overflow: 'hidden',
|
|
142
|
-
}}
|
|
143
|
-
className={cn('bg-white dark:bg-gray-900', props.className)}
|
|
144
|
-
{...props}
|
|
145
|
-
>
|
|
146
|
-
<div className="p-3">{props.children}</div>
|
|
147
|
-
</motion.div>
|
|
148
|
-
</AccordionPrimitive.Content>
|
|
149
|
-
)
|
|
150
|
-
)}
|
|
151
|
-
</AnimatePresence>
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export {
|
|
156
|
-
Accordion,
|
|
157
|
-
AccordionItem,
|
|
158
|
-
AccordionHeader,
|
|
159
|
-
AccordionTrigger,
|
|
160
|
-
AccordionContent,
|
|
161
|
-
useAccordion,
|
|
162
|
-
useAccordionItem,
|
|
163
|
-
type AccordionProps,
|
|
164
|
-
type AccordionItemProps,
|
|
165
|
-
type AccordionHeaderProps,
|
|
166
|
-
type AccordionTriggerProps,
|
|
167
|
-
type AccordionContentProps,
|
|
168
|
-
type AccordionContextType,
|
|
169
|
-
type AccordionItemContextType,
|
|
170
|
-
};
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
import { AlertCircle, Terminal } from 'lucide-react';
|
|
3
|
-
|
|
4
|
-
import { Alert, AlertDescription, AlertTitle } from './index';
|
|
5
|
-
|
|
6
|
-
const meta: Meta<typeof Alert> = {
|
|
7
|
-
title: 'UI/Alert',
|
|
8
|
-
component: Alert,
|
|
9
|
-
tags: ['autodocs'],
|
|
10
|
-
argTypes: {
|
|
11
|
-
variant: {
|
|
12
|
-
control: 'select',
|
|
13
|
-
options: ['default', 'destructive'],
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export default meta;
|
|
19
|
-
type Story = StoryObj<typeof Alert>;
|
|
20
|
-
|
|
21
|
-
export const Default: Story = {
|
|
22
|
-
render: (args) => (
|
|
23
|
-
<Alert {...args}>
|
|
24
|
-
<Terminal className="h-4 w-4" />
|
|
25
|
-
<AlertTitle>Heads up!</AlertTitle>
|
|
26
|
-
<AlertDescription>You can add components to your app using the cli.</AlertDescription>
|
|
27
|
-
</Alert>
|
|
28
|
-
),
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export const Destructive: Story = {
|
|
32
|
-
render: (args) => (
|
|
33
|
-
<Alert {...args} variant="destructive">
|
|
34
|
-
<AlertCircle className="h-4 w-4" />
|
|
35
|
-
<AlertTitle>Error</AlertTitle>
|
|
36
|
-
<AlertDescription>Your session has expired. Please log in again.</AlertDescription>
|
|
37
|
-
</Alert>
|
|
38
|
-
),
|
|
39
|
-
};
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import { cva, type VariantProps } from 'class-variance-authority';
|
|
3
|
-
|
|
4
|
-
import { cn } from '@/lib/utils';
|
|
5
|
-
|
|
6
|
-
const alertVariants = cva(
|
|
7
|
-
'relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current',
|
|
8
|
-
{
|
|
9
|
-
variants: {
|
|
10
|
-
variant: {
|
|
11
|
-
default: 'bg-card text-card-foreground',
|
|
12
|
-
destructive:
|
|
13
|
-
'text-destructive bg-card *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current',
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
defaultVariants: {
|
|
17
|
-
variant: 'default',
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
function Alert({
|
|
23
|
-
className,
|
|
24
|
-
variant,
|
|
25
|
-
...props
|
|
26
|
-
}: React.ComponentProps<'div'> & VariantProps<typeof alertVariants>) {
|
|
27
|
-
return (
|
|
28
|
-
<div
|
|
29
|
-
data-slot="alert"
|
|
30
|
-
role="alert"
|
|
31
|
-
className={cn(alertVariants({ variant }), className)}
|
|
32
|
-
{...props}
|
|
33
|
-
/>
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function AlertTitle({ className, ...props }: React.ComponentProps<'div'>) {
|
|
38
|
-
return (
|
|
39
|
-
<div
|
|
40
|
-
data-slot="alert-title"
|
|
41
|
-
className={cn('col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight', className)}
|
|
42
|
-
{...props}
|
|
43
|
-
/>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function AlertDescription({ className, ...props }: React.ComponentProps<'div'>) {
|
|
48
|
-
return (
|
|
49
|
-
<div
|
|
50
|
-
data-slot="alert-description"
|
|
51
|
-
className={cn(
|
|
52
|
-
'text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed',
|
|
53
|
-
className,
|
|
54
|
-
)}
|
|
55
|
-
{...props}
|
|
56
|
-
/>
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export { Alert, AlertTitle, AlertDescription };
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
|
|
3
|
-
import { Button } from '@/components/ui/Button';
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
AlertDialog,
|
|
7
|
-
AlertDialogAction,
|
|
8
|
-
AlertDialogCancel,
|
|
9
|
-
AlertDialogContent,
|
|
10
|
-
AlertDialogDescription,
|
|
11
|
-
AlertDialogFooter,
|
|
12
|
-
AlertDialogHeader,
|
|
13
|
-
AlertDialogTitle,
|
|
14
|
-
AlertDialogTrigger,
|
|
15
|
-
} from './index';
|
|
16
|
-
|
|
17
|
-
const meta: Meta<typeof AlertDialog> = {
|
|
18
|
-
title: 'UI/AlertDialog',
|
|
19
|
-
component: AlertDialog,
|
|
20
|
-
tags: ['autodocs'],
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export default meta;
|
|
24
|
-
type Story = StoryObj<typeof AlertDialog>;
|
|
25
|
-
|
|
26
|
-
export const Default: Story = {
|
|
27
|
-
render: (args) => (
|
|
28
|
-
<AlertDialog {...args}>
|
|
29
|
-
<AlertDialogTrigger asChild>
|
|
30
|
-
<Button variant="outline">Show Alert Dialog</Button>
|
|
31
|
-
</AlertDialogTrigger>
|
|
32
|
-
<AlertDialogContent>
|
|
33
|
-
<AlertDialogHeader>
|
|
34
|
-
<AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle>
|
|
35
|
-
<AlertDialogDescription>
|
|
36
|
-
This action cannot be undone. This will permanently delete your account and remove your
|
|
37
|
-
data from our servers.
|
|
38
|
-
</AlertDialogDescription>
|
|
39
|
-
</AlertDialogHeader>
|
|
40
|
-
<AlertDialogFooter>
|
|
41
|
-
<AlertDialogCancel>Cancel</AlertDialogCancel>
|
|
42
|
-
<AlertDialogAction>Continue</AlertDialogAction>
|
|
43
|
-
</AlertDialogFooter>
|
|
44
|
-
</AlertDialogContent>
|
|
45
|
-
</AlertDialog>
|
|
46
|
-
),
|
|
47
|
-
};
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import * as React from 'react';
|
|
4
|
-
import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
|
|
5
|
-
import { useLenis } from 'lenis/react';
|
|
6
|
-
|
|
7
|
-
import { cn } from '@/lib/utils';
|
|
8
|
-
import { useControlledState } from '@/hooks/use-controlled-state';
|
|
9
|
-
import { buttonVariants } from '@/components/ui/Button';
|
|
10
|
-
|
|
11
|
-
function AlertDialog({
|
|
12
|
-
open: openProp,
|
|
13
|
-
defaultOpen = false,
|
|
14
|
-
onOpenChange,
|
|
15
|
-
...props
|
|
16
|
-
}: React.ComponentProps<typeof AlertDialogPrimitive.Root> & {
|
|
17
|
-
open?: boolean;
|
|
18
|
-
defaultOpen?: boolean;
|
|
19
|
-
onOpenChange?: (open: boolean) => void;
|
|
20
|
-
}) {
|
|
21
|
-
const [open, setOpen] = useControlledState<boolean>({
|
|
22
|
-
value: openProp,
|
|
23
|
-
defaultValue: defaultOpen,
|
|
24
|
-
onChange: onOpenChange,
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
const lenis = useLenis();
|
|
28
|
-
|
|
29
|
-
React.useEffect(() => {
|
|
30
|
-
if (open) {
|
|
31
|
-
lenis?.stop();
|
|
32
|
-
} else {
|
|
33
|
-
lenis?.start();
|
|
34
|
-
}
|
|
35
|
-
}, [open, lenis]);
|
|
36
|
-
|
|
37
|
-
return (
|
|
38
|
-
<AlertDialogPrimitive.Root
|
|
39
|
-
data-slot="alert-dialog"
|
|
40
|
-
{...props}
|
|
41
|
-
open={open}
|
|
42
|
-
onOpenChange={setOpen}
|
|
43
|
-
/>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function AlertDialogTrigger({
|
|
48
|
-
...props
|
|
49
|
-
}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {
|
|
50
|
-
return <AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} />;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function AlertDialogPortal({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {
|
|
54
|
-
return <AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} />;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function AlertDialogOverlay({
|
|
58
|
-
className,
|
|
59
|
-
...props
|
|
60
|
-
}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {
|
|
61
|
-
return (
|
|
62
|
-
<AlertDialogPrimitive.Overlay
|
|
63
|
-
data-slot="alert-dialog-overlay"
|
|
64
|
-
className={cn(
|
|
65
|
-
'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',
|
|
66
|
-
className,
|
|
67
|
-
)}
|
|
68
|
-
{...props}
|
|
69
|
-
/>
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
interface AlertDialogContentProps extends React.ComponentProps<
|
|
74
|
-
typeof AlertDialogPrimitive.Content
|
|
75
|
-
> {
|
|
76
|
-
overlayClassname?: string;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function AlertDialogContent({ className, overlayClassname, ...props }: AlertDialogContentProps) {
|
|
80
|
-
return (
|
|
81
|
-
<AlertDialogPortal>
|
|
82
|
-
<AlertDialogOverlay className={overlayClassname} />
|
|
83
|
-
<AlertDialogPrimitive.Content
|
|
84
|
-
data-slot="alert-dialog-content"
|
|
85
|
-
className={cn(
|
|
86
|
-
'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',
|
|
87
|
-
className,
|
|
88
|
-
)}
|
|
89
|
-
{...props}
|
|
90
|
-
/>
|
|
91
|
-
</AlertDialogPortal>
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function AlertDialogHeader({ className, ...props }: React.ComponentProps<'div'>) {
|
|
96
|
-
return (
|
|
97
|
-
<div
|
|
98
|
-
data-slot="alert-dialog-header"
|
|
99
|
-
className={cn('flex flex-col gap-2 text-center sm:text-left', className)}
|
|
100
|
-
{...props}
|
|
101
|
-
/>
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function AlertDialogFooter({ className, ...props }: React.ComponentProps<'div'>) {
|
|
106
|
-
return (
|
|
107
|
-
<div
|
|
108
|
-
data-slot="alert-dialog-footer"
|
|
109
|
-
className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}
|
|
110
|
-
{...props}
|
|
111
|
-
/>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function AlertDialogTitle({
|
|
116
|
-
className,
|
|
117
|
-
...props
|
|
118
|
-
}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {
|
|
119
|
-
return (
|
|
120
|
-
<AlertDialogPrimitive.Title
|
|
121
|
-
data-slot="alert-dialog-title"
|
|
122
|
-
className={cn('text-lg font-semibold', className)}
|
|
123
|
-
{...props}
|
|
124
|
-
/>
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
function AlertDialogDescription({
|
|
129
|
-
className,
|
|
130
|
-
...props
|
|
131
|
-
}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {
|
|
132
|
-
return (
|
|
133
|
-
<AlertDialogPrimitive.Description
|
|
134
|
-
data-slot="alert-dialog-description"
|
|
135
|
-
className={cn('text-muted-foreground text-sm', className)}
|
|
136
|
-
{...props}
|
|
137
|
-
/>
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
function AlertDialogAction({
|
|
142
|
-
className,
|
|
143
|
-
...props
|
|
144
|
-
}: React.ComponentProps<typeof AlertDialogPrimitive.Action>) {
|
|
145
|
-
return <AlertDialogPrimitive.Action className={cn(buttonVariants(), className)} {...props} />;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
function AlertDialogCancel({
|
|
149
|
-
className,
|
|
150
|
-
...props
|
|
151
|
-
}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) {
|
|
152
|
-
return (
|
|
153
|
-
<AlertDialogPrimitive.Cancel
|
|
154
|
-
className={cn(buttonVariants({ variant: 'outline' }), className)}
|
|
155
|
-
{...props}
|
|
156
|
-
/>
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
export {
|
|
161
|
-
AlertDialog,
|
|
162
|
-
AlertDialogPortal,
|
|
163
|
-
AlertDialogOverlay,
|
|
164
|
-
AlertDialogTrigger,
|
|
165
|
-
AlertDialogContent,
|
|
166
|
-
AlertDialogHeader,
|
|
167
|
-
AlertDialogFooter,
|
|
168
|
-
AlertDialogTitle,
|
|
169
|
-
AlertDialogDescription,
|
|
170
|
-
AlertDialogAction,
|
|
171
|
-
AlertDialogCancel,
|
|
172
|
-
};
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
|
|
3
|
-
import { AspectRatio } from './index';
|
|
4
|
-
|
|
5
|
-
const meta: Meta<typeof AspectRatio> = {
|
|
6
|
-
title: 'UI/AspectRatio',
|
|
7
|
-
component: AspectRatio,
|
|
8
|
-
tags: ['autodocs'],
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export default meta;
|
|
12
|
-
type Story = StoryObj<typeof AspectRatio>;
|
|
13
|
-
|
|
14
|
-
export const Default: Story = {
|
|
15
|
-
render: (args) => (
|
|
16
|
-
<div className="w-112.5">
|
|
17
|
-
<AspectRatio ratio={16 / 9} {...args}>
|
|
18
|
-
<img
|
|
19
|
-
src="https://images.unsplash.com/photo-1588345921523-c2dcd57f7dcb?w=800&dpr=2&q=80"
|
|
20
|
-
alt="Photo by Drew Beamer"
|
|
21
|
-
className="h-full w-full rounded-md object-cover"
|
|
22
|
-
/>
|
|
23
|
-
</AspectRatio>
|
|
24
|
-
</div>
|
|
25
|
-
),
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export const Square: Story = {
|
|
29
|
-
render: (args) => (
|
|
30
|
-
<div className="w-75">
|
|
31
|
-
<AspectRatio ratio={1 / 1} {...args}>
|
|
32
|
-
<img
|
|
33
|
-
src="https://images.unsplash.com/photo-1588345921523-c2dcd57f7dcb?w=800&dpr=2&q=80"
|
|
34
|
-
alt="Photo by Drew Beamer"
|
|
35
|
-
className="h-full w-full rounded-md object-cover"
|
|
36
|
-
/>
|
|
37
|
-
</AspectRatio>
|
|
38
|
-
</div>
|
|
39
|
-
),
|
|
40
|
-
};
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio';
|
|
4
|
-
|
|
5
|
-
function AspectRatio({ ...props }: React.ComponentProps<typeof AspectRatioPrimitive.Root>) {
|
|
6
|
-
return <AspectRatioPrimitive.Root data-slot="aspect-ratio" {...props} />;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export { AspectRatio };
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
|
|
3
|
-
import { Avatar, AvatarFallback, AvatarImage } from './index';
|
|
4
|
-
|
|
5
|
-
const meta: Meta<typeof Avatar> = {
|
|
6
|
-
title: 'UI/Avatar',
|
|
7
|
-
component: Avatar,
|
|
8
|
-
tags: ['autodocs'],
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export default meta;
|
|
12
|
-
type Story = StoryObj<typeof Avatar>;
|
|
13
|
-
|
|
14
|
-
export const Default: Story = {
|
|
15
|
-
render: (args) => (
|
|
16
|
-
<Avatar {...args}>
|
|
17
|
-
<AvatarImage src="https://github.com/shadcn.png" alt="@shadcn" />
|
|
18
|
-
<AvatarFallback>CN</AvatarFallback>
|
|
19
|
-
</Avatar>
|
|
20
|
-
),
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export const Fallback: Story = {
|
|
24
|
-
render: (args) => (
|
|
25
|
-
<Avatar {...args}>
|
|
26
|
-
<AvatarImage src="" />
|
|
27
|
-
<AvatarFallback>JD</AvatarFallback>
|
|
28
|
-
</Avatar>
|
|
29
|
-
),
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
export const Large: Story = {
|
|
33
|
-
render: (args) => (
|
|
34
|
-
<Avatar {...args} className="size-16">
|
|
35
|
-
<AvatarImage src="https://github.com/shadcn.png" />
|
|
36
|
-
<AvatarFallback>CN</AvatarFallback>
|
|
37
|
-
</Avatar>
|
|
38
|
-
),
|
|
39
|
-
};
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import * as React from 'react';
|
|
4
|
-
import * as AvatarPrimitive from '@radix-ui/react-avatar';
|
|
5
|
-
|
|
6
|
-
import { cn } from '@/lib/utils';
|
|
7
|
-
|
|
8
|
-
function Avatar({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Root>) {
|
|
9
|
-
return (
|
|
10
|
-
<AvatarPrimitive.Root
|
|
11
|
-
data-slot="avatar"
|
|
12
|
-
className={cn('relative flex size-8 shrink-0 overflow-hidden rounded-full', className)}
|
|
13
|
-
{...props}
|
|
14
|
-
/>
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>) {
|
|
19
|
-
return (
|
|
20
|
-
<AvatarPrimitive.Image
|
|
21
|
-
data-slot="avatar-image"
|
|
22
|
-
className={cn('aspect-square size-full', className)}
|
|
23
|
-
{...props}
|
|
24
|
-
/>
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function AvatarFallback({
|
|
29
|
-
className,
|
|
30
|
-
...props
|
|
31
|
-
}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {
|
|
32
|
-
return (
|
|
33
|
-
<AvatarPrimitive.Fallback
|
|
34
|
-
data-slot="avatar-fallback"
|
|
35
|
-
className={cn(
|
|
36
|
-
'bg-primary-50 dark:bg-primary-900/20 text-primary flex size-full items-center justify-center rounded-full',
|
|
37
|
-
className,
|
|
38
|
-
)}
|
|
39
|
-
{...props}
|
|
40
|
-
/>
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export { Avatar, AvatarImage, AvatarFallback };
|