@luanthnh/cntt-ui 0.1.8 → 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.
Files changed (238) hide show
  1. package/package.json +5 -1
  2. package/.storybook/globals.d.ts +0 -1
  3. package/.storybook/main.ts +0 -29
  4. package/.storybook/preview.ts +0 -32
  5. package/assets/fonts/Montserrat-Black.eot +0 -0
  6. package/assets/fonts/Montserrat-Black.ttf +0 -0
  7. package/assets/fonts/Montserrat-Black.woff +0 -0
  8. package/assets/fonts/Montserrat-Black.woff2 +0 -0
  9. package/assets/fonts/Montserrat-BlackItalic.eot +0 -0
  10. package/assets/fonts/Montserrat-BlackItalic.ttf +0 -0
  11. package/assets/fonts/Montserrat-BlackItalic.woff +0 -0
  12. package/assets/fonts/Montserrat-BlackItalic.woff2 +0 -0
  13. package/assets/fonts/Montserrat-Bold.eot +0 -0
  14. package/assets/fonts/Montserrat-Bold.ttf +0 -0
  15. package/assets/fonts/Montserrat-Bold.woff +0 -0
  16. package/assets/fonts/Montserrat-Bold.woff2 +0 -0
  17. package/assets/fonts/Montserrat-BoldItalic.eot +0 -0
  18. package/assets/fonts/Montserrat-BoldItalic.ttf +0 -0
  19. package/assets/fonts/Montserrat-BoldItalic.woff +0 -0
  20. package/assets/fonts/Montserrat-BoldItalic.woff2 +0 -0
  21. package/assets/fonts/Montserrat-ExtraBold.eot +0 -0
  22. package/assets/fonts/Montserrat-ExtraBold.ttf +0 -0
  23. package/assets/fonts/Montserrat-ExtraBold.woff +0 -0
  24. package/assets/fonts/Montserrat-ExtraBold.woff2 +0 -0
  25. package/assets/fonts/Montserrat-ExtraBoldItalic.eot +0 -0
  26. package/assets/fonts/Montserrat-ExtraBoldItalic.ttf +0 -0
  27. package/assets/fonts/Montserrat-ExtraBoldItalic.woff +0 -0
  28. package/assets/fonts/Montserrat-ExtraBoldItalic.woff2 +0 -0
  29. package/assets/fonts/Montserrat-ExtraLight.eot +0 -0
  30. package/assets/fonts/Montserrat-ExtraLight.ttf +0 -0
  31. package/assets/fonts/Montserrat-ExtraLight.woff +0 -0
  32. package/assets/fonts/Montserrat-ExtraLight.woff2 +0 -0
  33. package/assets/fonts/Montserrat-ExtraLightItalic.eot +0 -0
  34. package/assets/fonts/Montserrat-ExtraLightItalic.ttf +0 -0
  35. package/assets/fonts/Montserrat-ExtraLightItalic.woff +0 -0
  36. package/assets/fonts/Montserrat-ExtraLightItalic.woff2 +0 -0
  37. package/assets/fonts/Montserrat-Italic.eot +0 -0
  38. package/assets/fonts/Montserrat-Italic.ttf +0 -0
  39. package/assets/fonts/Montserrat-Italic.woff +0 -0
  40. package/assets/fonts/Montserrat-Italic.woff2 +0 -0
  41. package/assets/fonts/Montserrat-Light.eot +0 -0
  42. package/assets/fonts/Montserrat-Light.ttf +0 -0
  43. package/assets/fonts/Montserrat-Light.woff +0 -0
  44. package/assets/fonts/Montserrat-Light.woff2 +0 -0
  45. package/assets/fonts/Montserrat-LightItalic.eot +0 -0
  46. package/assets/fonts/Montserrat-LightItalic.ttf +0 -0
  47. package/assets/fonts/Montserrat-LightItalic.woff +0 -0
  48. package/assets/fonts/Montserrat-LightItalic.woff2 +0 -0
  49. package/assets/fonts/Montserrat-Medium.eot +0 -0
  50. package/assets/fonts/Montserrat-Medium.ttf +0 -0
  51. package/assets/fonts/Montserrat-Medium.woff +0 -0
  52. package/assets/fonts/Montserrat-Medium.woff2 +0 -0
  53. package/assets/fonts/Montserrat-MediumItalic.eot +0 -0
  54. package/assets/fonts/Montserrat-MediumItalic.ttf +0 -0
  55. package/assets/fonts/Montserrat-MediumItalic.woff +0 -0
  56. package/assets/fonts/Montserrat-MediumItalic.woff2 +0 -0
  57. package/assets/fonts/Montserrat-Regular.eot +0 -0
  58. package/assets/fonts/Montserrat-Regular.ttf +0 -0
  59. package/assets/fonts/Montserrat-Regular.woff +0 -0
  60. package/assets/fonts/Montserrat-Regular.woff2 +0 -0
  61. package/assets/fonts/Montserrat-SemiBold.eot +0 -0
  62. package/assets/fonts/Montserrat-SemiBold.ttf +0 -0
  63. package/assets/fonts/Montserrat-SemiBold.woff +0 -0
  64. package/assets/fonts/Montserrat-SemiBold.woff2 +0 -0
  65. package/assets/fonts/Montserrat-SemiBoldItalic.eot +0 -0
  66. package/assets/fonts/Montserrat-SemiBoldItalic.ttf +0 -0
  67. package/assets/fonts/Montserrat-SemiBoldItalic.woff +0 -0
  68. package/assets/fonts/Montserrat-SemiBoldItalic.woff2 +0 -0
  69. package/assets/fonts/Montserrat-Thin.eot +0 -0
  70. package/assets/fonts/Montserrat-Thin.ttf +0 -0
  71. package/assets/fonts/Montserrat-Thin.woff +0 -0
  72. package/assets/fonts/Montserrat-Thin.woff2 +0 -0
  73. package/assets/fonts/Montserrat-ThinItalic.eot +0 -0
  74. package/assets/fonts/Montserrat-ThinItalic.ttf +0 -0
  75. package/assets/fonts/Montserrat-ThinItalic.woff +0 -0
  76. package/assets/fonts/Montserrat-ThinItalic.woff2 +0 -0
  77. package/assets/fonts/Montserrat-Variable.eot +0 -0
  78. package/assets/fonts/Montserrat-Variable.ttf +0 -0
  79. package/assets/fonts/Montserrat-Variable.woff +0 -0
  80. package/assets/fonts/Montserrat-Variable.woff2 +0 -0
  81. package/assets/fonts/Montserrat-VariableItalic.eot +0 -0
  82. package/assets/fonts/Montserrat-VariableItalic.ttf +0 -0
  83. package/assets/fonts/Montserrat-VariableItalic.woff +0 -0
  84. package/assets/fonts/Montserrat-VariableItalic.woff2 +0 -0
  85. package/assets/icons/arrow-left.svg +0 -1
  86. package/assets/icons/file.svg +0 -1
  87. package/assets/icons/globe.svg +0 -1
  88. package/assets/icons/logo-line.svg +0 -1
  89. package/assets/icons/next.svg +0 -1
  90. package/assets/icons/panel-left-expand.svg +0 -1
  91. package/assets/icons/placeholder.svg +0 -57
  92. package/assets/icons/vercel.svg +0 -1
  93. package/assets/icons/window.svg +0 -1
  94. package/assets/lotties/error-404.json +0 -19642
  95. package/assets/lotties/error.json +0 -2414
  96. package/assets/lotties/loader.json +0 -305
  97. package/components/Welcome.mdx +0 -74
  98. package/components/lenis/index.tsx +0 -48
  99. package/components/motion/auto-height.tsx +0 -56
  100. package/components/motion/cursor.tsx +0 -108
  101. package/components/motion/highlight.tsx +0 -605
  102. package/components/motion/number-ticker.tsx +0 -55
  103. package/components/motion/slot.tsx +0 -106
  104. package/components/motion/waves.tsx +0 -417
  105. package/components/primitives/tabs.tsx +0 -174
  106. package/components/ui/Accordion/index.stories.tsx +0 -39
  107. package/components/ui/Accordion/index.tsx +0 -170
  108. package/components/ui/Alert/index.stories.tsx +0 -39
  109. package/components/ui/Alert/index.tsx +0 -60
  110. package/components/ui/AlertDialog/index.stories.tsx +0 -47
  111. package/components/ui/AlertDialog/index.tsx +0 -172
  112. package/components/ui/AspectRatio/index.stories.tsx +0 -40
  113. package/components/ui/AspectRatio/index.tsx +0 -9
  114. package/components/ui/Avatar/index.stories.tsx +0 -39
  115. package/components/ui/Avatar/index.tsx +0 -44
  116. package/components/ui/Badge/index.stories.tsx +0 -64
  117. package/components/ui/Badge/index.tsx +0 -46
  118. package/components/ui/Breadcrumb/index.stories.tsx +0 -64
  119. package/components/ui/Breadcrumb/index.tsx +0 -102
  120. package/components/ui/Button/index.stories.tsx +0 -232
  121. package/components/ui/Button/index.tsx +0 -114
  122. package/components/ui/Calendar/index.stories.tsx +0 -20
  123. package/components/ui/Calendar/index.tsx +0 -149
  124. package/components/ui/Card/index.stories.tsx +0 -39
  125. package/components/ui/Card/index.tsx +0 -65
  126. package/components/ui/Carousel/index.stories.tsx +0 -37
  127. package/components/ui/Carousel/index.tsx +0 -242
  128. package/components/ui/Chart/index.stories.tsx +0 -53
  129. package/components/ui/Chart/index.tsx +0 -322
  130. package/components/ui/Checkbox/index.stories.tsx +0 -56
  131. package/components/ui/Checkbox/index.tsx +0 -167
  132. package/components/ui/CircleProcess/index.stories.tsx +0 -29
  133. package/components/ui/CircleProcess/index.tsx +0 -50
  134. package/components/ui/Collapsible/index.stories.tsx +0 -33
  135. package/components/ui/Collapsible/index.tsx +0 -124
  136. package/components/ui/Command/index.stories.tsx +0 -65
  137. package/components/ui/Command/index.tsx +0 -161
  138. package/components/ui/Container/index.stories.tsx +0 -22
  139. package/components/ui/Container/index.tsx +0 -30
  140. package/components/ui/ContextMenu/index.stories.tsx +0 -51
  141. package/components/ui/ContextMenu/index.tsx +0 -224
  142. package/components/ui/Dialog/index.stories.tsx +0 -44
  143. package/components/ui/Dialog/index.tsx +0 -156
  144. package/components/ui/Drawer/index.stories.tsx +0 -54
  145. package/components/ui/Drawer/index.tsx +0 -124
  146. package/components/ui/DropdownMenu/index.stories.tsx +0 -83
  147. package/components/ui/DropdownMenu/index.tsx +0 -231
  148. package/components/ui/Dropzone/index.stories.tsx +0 -18
  149. package/components/ui/Dropzone/index.tsx +0 -47
  150. package/components/ui/Form/date-field.tsx +0 -77
  151. package/components/ui/Form/index.stories.tsx +0 -67
  152. package/components/ui/Form/index.tsx +0 -193
  153. package/components/ui/Form/select-field.tsx +0 -55
  154. package/components/ui/Form/text-area-field.tsx +0 -37
  155. package/components/ui/Form/text-field.tsx +0 -72
  156. package/components/ui/HStack/index.stories.tsx +0 -48
  157. package/components/ui/HStack/index.tsx +0 -73
  158. package/components/ui/HoverCard/index.stories.tsx +0 -38
  159. package/components/ui/HoverCard/index.tsx +0 -38
  160. package/components/ui/Icons/index.stories.tsx +0 -27
  161. package/components/ui/Icons/index.tsx +0 -33
  162. package/components/ui/ImageWithFallback/index.stories.tsx +0 -32
  163. package/components/ui/ImageWithFallback/index.tsx +0 -34
  164. package/components/ui/Input/index.stories.tsx +0 -47
  165. package/components/ui/Input/index.tsx +0 -21
  166. package/components/ui/InputOtp/index.stories.tsx +0 -35
  167. package/components/ui/InputOtp/index.tsx +0 -70
  168. package/components/ui/Label/index.stories.tsx +0 -18
  169. package/components/ui/Label/index.tsx +0 -21
  170. package/components/ui/Marquee/index.stories.tsx +0 -71
  171. package/components/ui/Marquee/index.tsx +0 -65
  172. package/components/ui/Menubar/index.stories.tsx +0 -116
  173. package/components/ui/Menubar/index.tsx +0 -252
  174. package/components/ui/NavigationMenu/index.stories.tsx +0 -112
  175. package/components/ui/NavigationMenu/index.tsx +0 -185
  176. package/components/ui/NoData/index.stories.tsx +0 -24
  177. package/components/ui/NoData/index.tsx +0 -19
  178. package/components/ui/Pagination/index.stories.tsx +0 -53
  179. package/components/ui/Pagination/index.tsx +0 -114
  180. package/components/ui/Popover/index.stories.tsx +0 -31
  181. package/components/ui/Popover/index.tsx +0 -42
  182. package/components/ui/Progress/index.stories.tsx +0 -35
  183. package/components/ui/Progress/index.tsx +0 -28
  184. package/components/ui/RadioGroup/index.stories.tsx +0 -28
  185. package/components/ui/RadioGroup/index.tsx +0 -45
  186. package/components/ui/Resizable/index.stories.tsx +0 -44
  187. package/components/ui/Resizable/index.tsx +0 -54
  188. package/components/ui/ScrollArea/index.stories.tsx +0 -31
  189. package/components/ui/ScrollArea/index.tsx +0 -56
  190. package/components/ui/Select/index.stories.tsx +0 -64
  191. package/components/ui/Select/index.tsx +0 -170
  192. package/components/ui/Separator/index.stories.tsx +0 -31
  193. package/components/ui/Separator/index.tsx +0 -28
  194. package/components/ui/Sheet/index.stories.tsx +0 -45
  195. package/components/ui/Sheet/index.tsx +0 -130
  196. package/components/ui/Sidebar/index.stories.tsx +0 -82
  197. package/components/ui/Sidebar/index.tsx +0 -676
  198. package/components/ui/Skeleton/index.stories.tsx +0 -36
  199. package/components/ui/Skeleton/index.tsx +0 -13
  200. package/components/ui/Slider/index.stories.tsx +0 -48
  201. package/components/ui/Slider/index.tsx +0 -82
  202. package/components/ui/Slot/index.stories.tsx +0 -29
  203. package/components/ui/Slot/index.tsx +0 -106
  204. package/components/ui/Sonner/index.stories.tsx +0 -36
  205. package/components/ui/Sonner/index.tsx +0 -31
  206. package/components/ui/Switch/index.stories.tsx +0 -33
  207. package/components/ui/Switch/index.tsx +0 -28
  208. package/components/ui/Table/index.stories.tsx +0 -74
  209. package/components/ui/Table/index.tsx +0 -95
  210. package/components/ui/Tabs/index.stories.tsx +0 -38
  211. package/components/ui/Tabs/index.tsx +0 -78
  212. package/components/ui/Text/index.stories.tsx +0 -53
  213. package/components/ui/Text/index.tsx +0 -138
  214. package/components/ui/Textarea/index.stories.tsx +0 -25
  215. package/components/ui/Textarea/index.tsx +0 -18
  216. package/components/ui/Toggle/index.stories.tsx +0 -52
  217. package/components/ui/Toggle/index.tsx +0 -46
  218. package/components/ui/ToggleGroup/index.stories.tsx +0 -52
  219. package/components/ui/ToggleGroup/index.tsx +0 -69
  220. package/components/ui/Tooltip/index.stories.tsx +0 -29
  221. package/components/ui/Tooltip/index.tsx +0 -35
  222. package/components/ui/VStack/index.stories.tsx +0 -45
  223. package/components/ui/VStack/index.tsx +0 -69
  224. package/components/ui/colors.stories.tsx +0 -148
  225. package/eslint.config.js +0 -10
  226. package/hooks/index.ts +0 -3
  227. package/hooks/use-auto-height.tsx +0 -99
  228. package/hooks/use-controlled-state.tsx +0 -32
  229. package/hooks/use-mobile.ts +0 -19
  230. package/index.ts +0 -58
  231. package/lib/get-strict-context.ts +0 -15
  232. package/lib/utils.ts +0 -10
  233. package/scripts/generate-exports.ts +0 -32
  234. package/tsconfig.json +0 -12
  235. package/tsconfig.tsbuildinfo +0 -1
  236. package/tsup.config.ts +0 -11
  237. package/types/svg.d.ts +0 -10
  238. 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&apos; aesthetic.
29
- </AccordionContent>
30
- </AccordionItem>
31
- <AccordionItem value="item-3">
32
- <AccordionTrigger>Is it animated?</AccordionTrigger>
33
- <AccordionContent>
34
- Yes. It&apos;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 };