@bearmenu/ui 0.1.0
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/dist/chunk-2CUFS5LF.js +80 -0
- package/dist/chunk-3GWWZKX7.js +33 -0
- package/dist/chunk-3VMDCCCX.js +10 -0
- package/dist/chunk-4AVS6CV4.js +89 -0
- package/dist/chunk-4JOV7FXW.js +17 -0
- package/dist/chunk-4KOMHDZD.js +89 -0
- package/dist/chunk-4UO73SKC.js +26 -0
- package/dist/chunk-7H54PTVH.js +116 -0
- package/dist/chunk-CW24PLDW.js +24 -0
- package/dist/chunk-EBAMCZDW.js +112 -0
- package/dist/chunk-ERMIA7NP.js +106 -0
- package/dist/chunk-ESO2EM3L.js +46 -0
- package/dist/chunk-EUHEIWHZ.js +32 -0
- package/dist/chunk-FEK5XGZW.js +8 -0
- package/dist/chunk-NKHH23YK.js +31 -0
- package/dist/chunk-R47NEOSI.js +78 -0
- package/dist/chunk-UXAYXRFN.js +69 -0
- package/dist/chunk-X6GATUI2.js +19 -0
- package/dist/components/accordion.d.ts +9 -0
- package/dist/components/accordion.js +53 -0
- package/dist/components/alert-dialog.d.ts +23 -0
- package/dist/components/alert-dialog.js +98 -0
- package/dist/components/alert.d.ts +11 -0
- package/dist/components/alert.js +52 -0
- package/dist/components/aspect-ratio.d.ts +6 -0
- package/dist/components/aspect-ratio.js +2 -0
- package/dist/components/avatar.d.ts +8 -0
- package/dist/components/avatar.js +47 -0
- package/dist/components/badge.d.ts +13 -0
- package/dist/components/badge.js +3 -0
- package/dist/components/breadcrumb.d.ts +14 -0
- package/dist/components/breadcrumb.js +96 -0
- package/dist/components/button.d.ts +16 -0
- package/dist/components/button.js +4 -0
- package/dist/components/calendar.d.ts +11 -0
- package/dist/components/calendar.js +56 -0
- package/dist/components/card.d.ts +13 -0
- package/dist/components/card.js +4 -0
- package/dist/components/carousel.d.ts +24 -0
- package/dist/components/carousel.js +198 -0
- package/dist/components/checkbox.d.ts +6 -0
- package/dist/components/checkbox.js +25 -0
- package/dist/components/collapsible.d.ts +8 -0
- package/dist/components/collapsible.js +26 -0
- package/dist/components/command.d.ts +84 -0
- package/dist/components/command.js +4 -0
- package/dist/components/currency-input.d.ts +17 -0
- package/dist/components/currency-input.js +121 -0
- package/dist/components/dialog.d.ts +22 -0
- package/dist/components/dialog.js +3 -0
- package/dist/components/drawer.d.ts +27 -0
- package/dist/components/drawer.js +85 -0
- package/dist/components/dropdown-menu.d.ts +28 -0
- package/dist/components/dropdown-menu.js +211 -0
- package/dist/components/empty-state.d.ts +22 -0
- package/dist/components/empty-state.js +81 -0
- package/dist/components/form.d.ts +28 -0
- package/dist/components/form.js +97 -0
- package/dist/components/haptic-button.d.ts +12 -0
- package/dist/components/haptic-button.js +17 -0
- package/dist/components/input-otp.d.ts +14 -0
- package/dist/components/input-otp.js +62 -0
- package/dist/components/input.d.ts +6 -0
- package/dist/components/input.js +3 -0
- package/dist/components/label.d.ts +8 -0
- package/dist/components/label.js +3 -0
- package/dist/components/lazy-markdown.d.ts +11 -0
- package/dist/components/lazy-markdown.js +13 -0
- package/dist/components/link-button.d.ts +30 -0
- package/dist/components/link-button.js +17 -0
- package/dist/components/markdown-renderer.d.ts +11 -0
- package/dist/components/markdown-renderer.js +10 -0
- package/dist/components/multi-select-combobox.d.ts +23 -0
- package/dist/components/multi-select-combobox.js +114 -0
- package/dist/components/pagination.d.ts +18 -0
- package/dist/components/pagination.js +101 -0
- package/dist/components/popover.d.ts +8 -0
- package/dist/components/popover.js +3 -0
- package/dist/components/progress.d.ts +6 -0
- package/dist/components/progress.js +30 -0
- package/dist/components/radio-group.d.ts +7 -0
- package/dist/components/radio-group.js +30 -0
- package/dist/components/rating.d.ts +15 -0
- package/dist/components/rating.js +120 -0
- package/dist/components/scroll-area.d.ts +7 -0
- package/dist/components/scroll-area.js +44 -0
- package/dist/components/search-bar.d.ts +17 -0
- package/dist/components/search-bar.js +92 -0
- package/dist/components/searchable-select.d.ts +22 -0
- package/dist/components/searchable-select.js +104 -0
- package/dist/components/select.d.ts +15 -0
- package/dist/components/select.js +129 -0
- package/dist/components/separator.d.ts +6 -0
- package/dist/components/separator.js +25 -0
- package/dist/components/sheet.d.ts +29 -0
- package/dist/components/sheet.js +96 -0
- package/dist/components/skeleton-card.d.ts +13 -0
- package/dist/components/skeleton-card.js +154 -0
- package/dist/components/skeleton.d.ts +6 -0
- package/dist/components/skeleton.js +3 -0
- package/dist/components/slider.d.ts +6 -0
- package/dist/components/slider.js +24 -0
- package/dist/components/sliding-panels.d.ts +19 -0
- package/dist/components/sliding-panels.js +75 -0
- package/dist/components/sonner.d.ts +6 -0
- package/dist/components/sonner.js +23 -0
- package/dist/components/sticky-container.d.ts +44 -0
- package/dist/components/sticky-container.js +39 -0
- package/dist/components/switch.d.ts +6 -0
- package/dist/components/switch.js +31 -0
- package/dist/components/table.d.ts +12 -0
- package/dist/components/table.js +81 -0
- package/dist/components/tabs.d.ts +12 -0
- package/dist/components/tabs.js +55 -0
- package/dist/components/text.d.ts +31 -0
- package/dist/components/text.js +3 -0
- package/dist/components/textarea.d.ts +6 -0
- package/dist/components/textarea.js +23 -0
- package/dist/components/toast.d.ts +18 -0
- package/dist/components/toast.js +3 -0
- package/dist/components/toaster.d.ts +5 -0
- package/dist/components/toaster.js +25 -0
- package/dist/components/toggle-group.d.ts +12 -0
- package/dist/components/toggle-group.js +72 -0
- package/dist/components/toggle.d.ts +13 -0
- package/dist/components/toggle.js +3 -0
- package/dist/components/tooltip.d.ts +9 -0
- package/dist/components/tooltip.js +26 -0
- package/dist/components/use-mobile.d.ts +3 -0
- package/dist/components/use-mobile.js +19 -0
- package/dist/components/use-toast.d.ts +42 -0
- package/dist/components/use-toast.js +2 -0
- package/dist/hooks/use-haptic.d.ts +22 -0
- package/dist/hooks/use-haptic.js +2 -0
- package/dist/hooks/use-mobile.d.ts +3 -0
- package/dist/hooks/use-mobile.js +19 -0
- package/dist/hooks/use-mounted-theme.d.ts +6 -0
- package/dist/hooks/use-mounted-theme.js +18 -0
- package/dist/hooks/use-sticky.d.ts +18 -0
- package/dist/hooks/use-sticky.js +2 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +2 -0
- package/package.json +203 -0
- package/src/components/accordion.tsx +57 -0
- package/src/components/alert-dialog.tsx +116 -0
- package/src/components/alert.tsx +57 -0
- package/src/components/aspect-ratio.tsx +9 -0
- package/src/components/avatar.tsx +49 -0
- package/src/components/badge.tsx +38 -0
- package/src/components/breadcrumb.tsx +102 -0
- package/src/components/button.tsx +94 -0
- package/src/components/calendar.tsx +60 -0
- package/src/components/card.tsx +67 -0
- package/src/components/carousel.tsx +230 -0
- package/src/components/checkbox.tsx +27 -0
- package/src/components/collapsible.tsx +28 -0
- package/src/components/command.tsx +148 -0
- package/src/components/currency-input.tsx +158 -0
- package/src/components/dialog.tsx +103 -0
- package/src/components/drawer.tsx +99 -0
- package/src/components/dropdown-menu.tsx +228 -0
- package/src/components/empty-state.tsx +118 -0
- package/src/components/form.tsx +152 -0
- package/src/components/haptic-button.tsx +19 -0
- package/src/components/input-otp.tsx +70 -0
- package/src/components/input.tsx +23 -0
- package/src/components/label.tsx +20 -0
- package/src/components/lazy-markdown.tsx +20 -0
- package/src/components/link-button.tsx +40 -0
- package/src/components/markdown-renderer.tsx +20 -0
- package/src/components/multi-select-combobox.tsx +148 -0
- package/src/components/pagination.tsx +106 -0
- package/src/components/popover.tsx +30 -0
- package/src/components/progress.tsx +27 -0
- package/src/components/radio-group.tsx +37 -0
- package/src/components/rating.tsx +136 -0
- package/src/components/scroll-area.tsx +45 -0
- package/src/components/search-bar.tsx +113 -0
- package/src/components/searchable-select.tsx +134 -0
- package/src/components/select.tsx +152 -0
- package/src/components/separator.tsx +25 -0
- package/src/components/sheet.tsx +121 -0
- package/src/components/skeleton-card.tsx +282 -0
- package/src/components/skeleton.tsx +17 -0
- package/src/components/slider.tsx +24 -0
- package/src/components/sliding-panels.tsx +99 -0
- package/src/components/sonner.tsx +25 -0
- package/src/components/sticky-container.tsx +88 -0
- package/src/components/switch.tsx +28 -0
- package/src/components/table.tsx +90 -0
- package/src/components/tabs.tsx +72 -0
- package/src/components/text.test.tsx +192 -0
- package/src/components/text.tsx +114 -0
- package/src/components/textarea.tsx +22 -0
- package/src/components/toast.tsx +129 -0
- package/src/components/toaster.tsx +31 -0
- package/src/components/toggle-group.tsx +69 -0
- package/src/components/toggle.tsx +46 -0
- package/src/components/tooltip.tsx +29 -0
- package/src/components/use-mobile.tsx +19 -0
- package/src/components/use-toast.ts +180 -0
- package/src/globals.css +409 -0
- package/src/hooks/use-haptic.ts +118 -0
- package/src/hooks/use-mobile.ts +19 -0
- package/src/hooks/use-mounted-theme.ts +20 -0
- package/src/hooks/use-sticky.ts +47 -0
- package/src/lib/utils.ts +6 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
type HapticStyle = "light" | "medium" | "heavy" | "success" | "warning" | "error" | "selection";
|
|
2
|
+
interface HapticAPI {
|
|
3
|
+
isSupported: boolean;
|
|
4
|
+
platform: "ios" | "android" | "desktop" | "unknown";
|
|
5
|
+
trigger: (style: HapticStyle) => void;
|
|
6
|
+
}
|
|
7
|
+
declare const useHaptic: () => HapticAPI;
|
|
8
|
+
declare global {
|
|
9
|
+
interface Window {
|
|
10
|
+
Telegram?: {
|
|
11
|
+
WebApp?: {
|
|
12
|
+
HapticFeedback?: {
|
|
13
|
+
impactOccurred: (style: "light" | "medium" | "heavy") => void;
|
|
14
|
+
notificationOccurred: (type: "success" | "warning" | "error") => void;
|
|
15
|
+
selectionChanged: () => void;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { useHaptic };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import '../chunk-3GWWZKX7.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
var MOBILE_BREAKPOINT = 768;
|
|
5
|
+
function useIsMobile() {
|
|
6
|
+
const [isMobile, setIsMobile] = React.useState(void 0);
|
|
7
|
+
React.useEffect(() => {
|
|
8
|
+
const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
|
|
9
|
+
const onChange = () => {
|
|
10
|
+
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
|
|
11
|
+
};
|
|
12
|
+
mql.addEventListener("change", onChange);
|
|
13
|
+
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
|
|
14
|
+
return () => mql.removeEventListener("change", onChange);
|
|
15
|
+
}, []);
|
|
16
|
+
return !!isMobile;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { useIsMobile };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import '../chunk-3GWWZKX7.js';
|
|
2
|
+
import { useSyncExternalStore } from 'react';
|
|
3
|
+
import { useTheme } from 'next-themes';
|
|
4
|
+
|
|
5
|
+
var subscribe = () => () => {
|
|
6
|
+
};
|
|
7
|
+
var getClientSnapshot = () => true;
|
|
8
|
+
var getServerSnapshot = () => false;
|
|
9
|
+
function useMountedTheme() {
|
|
10
|
+
const mounted = useSyncExternalStore(subscribe, getClientSnapshot, getServerSnapshot);
|
|
11
|
+
const { resolvedTheme } = useTheme();
|
|
12
|
+
return {
|
|
13
|
+
mounted,
|
|
14
|
+
isDark: mounted && resolvedTheme === "dark"
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { useMountedTheme };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Hook to detect when a sticky element becomes "stuck"
|
|
5
|
+
* Uses IntersectionObserver with a sentinel element to detect sticky state
|
|
6
|
+
*
|
|
7
|
+
* @returns An object with:
|
|
8
|
+
* - isSticky: boolean indicating if element is currently stuck
|
|
9
|
+
* - ref: ref to attach to the sticky element
|
|
10
|
+
* - sentinelRef: ref for the sentinel element (place 1px above sticky element)
|
|
11
|
+
*/
|
|
12
|
+
declare function useSticky(): {
|
|
13
|
+
isSticky: boolean;
|
|
14
|
+
ref: React.RefObject<HTMLDivElement | null>;
|
|
15
|
+
sentinelRef: React.RefObject<HTMLDivElement | null>;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { useSticky };
|
package/package.json
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bearmenu/ui",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "BearMenu design system — shared UI tokens, primitives, and components",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/bearmenu/bearmenu-ui.git"
|
|
9
|
+
},
|
|
10
|
+
"sideEffects": [
|
|
11
|
+
"*.css"
|
|
12
|
+
],
|
|
13
|
+
"type": "module",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"src"
|
|
17
|
+
],
|
|
18
|
+
"exports": {
|
|
19
|
+
"./globals.css": "./src/globals.css",
|
|
20
|
+
"./components/accordion": "./src/components/accordion.tsx",
|
|
21
|
+
"./components/alert-dialog": "./src/components/alert-dialog.tsx",
|
|
22
|
+
"./components/alert": "./src/components/alert.tsx",
|
|
23
|
+
"./components/aspect-ratio": "./src/components/aspect-ratio.tsx",
|
|
24
|
+
"./components/avatar": "./src/components/avatar.tsx",
|
|
25
|
+
"./components/badge": "./src/components/badge.tsx",
|
|
26
|
+
"./components/breadcrumb": "./src/components/breadcrumb.tsx",
|
|
27
|
+
"./components/button": "./src/components/button.tsx",
|
|
28
|
+
"./components/calendar": "./src/components/calendar.tsx",
|
|
29
|
+
"./components/card": "./src/components/card.tsx",
|
|
30
|
+
"./components/carousel": "./src/components/carousel.tsx",
|
|
31
|
+
"./components/checkbox": "./src/components/checkbox.tsx",
|
|
32
|
+
"./components/collapsible": "./src/components/collapsible.tsx",
|
|
33
|
+
"./components/command": "./src/components/command.tsx",
|
|
34
|
+
"./components/currency-input": "./src/components/currency-input.tsx",
|
|
35
|
+
"./components/dialog": "./src/components/dialog.tsx",
|
|
36
|
+
"./components/drawer": "./src/components/drawer.tsx",
|
|
37
|
+
"./components/dropdown-menu": "./src/components/dropdown-menu.tsx",
|
|
38
|
+
"./components/empty-state": "./src/components/empty-state.tsx",
|
|
39
|
+
"./components/form": "./src/components/form.tsx",
|
|
40
|
+
"./components/haptic-button": "./src/components/haptic-button.tsx",
|
|
41
|
+
"./components/input-otp": "./src/components/input-otp.tsx",
|
|
42
|
+
"./components/input": "./src/components/input.tsx",
|
|
43
|
+
"./components/label": "./src/components/label.tsx",
|
|
44
|
+
"./components/lazy-markdown": "./src/components/lazy-markdown.tsx",
|
|
45
|
+
"./components/link-button": "./src/components/link-button.tsx",
|
|
46
|
+
"./components/markdown-renderer": "./src/components/markdown-renderer.tsx",
|
|
47
|
+
"./components/multi-select-combobox": "./src/components/multi-select-combobox.tsx",
|
|
48
|
+
"./components/pagination": "./src/components/pagination.tsx",
|
|
49
|
+
"./components/popover": "./src/components/popover.tsx",
|
|
50
|
+
"./components/progress": "./src/components/progress.tsx",
|
|
51
|
+
"./components/radio-group": "./src/components/radio-group.tsx",
|
|
52
|
+
"./components/rating": "./src/components/rating.tsx",
|
|
53
|
+
"./components/scroll-area": "./src/components/scroll-area.tsx",
|
|
54
|
+
"./components/search-bar": "./src/components/search-bar.tsx",
|
|
55
|
+
"./components/searchable-select": "./src/components/searchable-select.tsx",
|
|
56
|
+
"./components/select": "./src/components/select.tsx",
|
|
57
|
+
"./components/separator": "./src/components/separator.tsx",
|
|
58
|
+
"./components/sheet": "./src/components/sheet.tsx",
|
|
59
|
+
"./components/skeleton-card": "./src/components/skeleton-card.tsx",
|
|
60
|
+
"./components/skeleton": "./src/components/skeleton.tsx",
|
|
61
|
+
"./components/slider": "./src/components/slider.tsx",
|
|
62
|
+
"./components/sliding-panels": "./src/components/sliding-panels.tsx",
|
|
63
|
+
"./components/sonner": "./src/components/sonner.tsx",
|
|
64
|
+
"./components/sticky-container": "./src/components/sticky-container.tsx",
|
|
65
|
+
"./components/switch": "./src/components/switch.tsx",
|
|
66
|
+
"./components/table": "./src/components/table.tsx",
|
|
67
|
+
"./components/tabs": "./src/components/tabs.tsx",
|
|
68
|
+
"./components/text": "./src/components/text.tsx",
|
|
69
|
+
"./components/textarea": "./src/components/textarea.tsx",
|
|
70
|
+
"./components/toast": "./src/components/toast.tsx",
|
|
71
|
+
"./components/toaster": "./src/components/toaster.tsx",
|
|
72
|
+
"./components/toggle-group": "./src/components/toggle-group.tsx",
|
|
73
|
+
"./components/toggle": "./src/components/toggle.tsx",
|
|
74
|
+
"./components/tooltip": "./src/components/tooltip.tsx",
|
|
75
|
+
"./components/use-mobile": "./src/components/use-mobile.tsx",
|
|
76
|
+
"./components/use-toast": "./src/components/use-toast.ts",
|
|
77
|
+
"./hooks/use-haptic": "./src/hooks/use-haptic.ts",
|
|
78
|
+
"./hooks/use-mobile": "./src/hooks/use-mobile.ts",
|
|
79
|
+
"./hooks/use-mounted-theme": "./src/hooks/use-mounted-theme.ts",
|
|
80
|
+
"./hooks/use-sticky": "./src/hooks/use-sticky.ts",
|
|
81
|
+
"./lib/utils": "./src/lib/utils.ts"
|
|
82
|
+
},
|
|
83
|
+
"publishConfig": {
|
|
84
|
+
"exports": {
|
|
85
|
+
"./globals.css": "./src/globals.css",
|
|
86
|
+
"./components/*": {
|
|
87
|
+
"types": "./dist/components/*.d.ts",
|
|
88
|
+
"import": "./dist/components/*.js"
|
|
89
|
+
},
|
|
90
|
+
"./hooks/*": {
|
|
91
|
+
"types": "./dist/hooks/*.d.ts",
|
|
92
|
+
"import": "./dist/hooks/*.js"
|
|
93
|
+
},
|
|
94
|
+
"./lib/*": {
|
|
95
|
+
"types": "./dist/lib/*.d.ts",
|
|
96
|
+
"import": "./dist/lib/*.js"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"scripts": {
|
|
101
|
+
"build": "tsup",
|
|
102
|
+
"dev": "tsup --watch",
|
|
103
|
+
"typecheck": "tsc --noEmit",
|
|
104
|
+
"clean": "rm -rf dist",
|
|
105
|
+
"prepublishOnly": "pnpm run build"
|
|
106
|
+
},
|
|
107
|
+
"peerDependencies": {
|
|
108
|
+
"@hookform/resolvers": "^3.0.0",
|
|
109
|
+
"@radix-ui/react-accordion": "*",
|
|
110
|
+
"@radix-ui/react-alert-dialog": "*",
|
|
111
|
+
"@radix-ui/react-aspect-ratio": "*",
|
|
112
|
+
"@radix-ui/react-avatar": "*",
|
|
113
|
+
"@radix-ui/react-checkbox": "*",
|
|
114
|
+
"@radix-ui/react-collapsible": "*",
|
|
115
|
+
"@radix-ui/react-dialog": "*",
|
|
116
|
+
"@radix-ui/react-dropdown-menu": "*",
|
|
117
|
+
"@radix-ui/react-label": "*",
|
|
118
|
+
"@radix-ui/react-popover": "*",
|
|
119
|
+
"@radix-ui/react-progress": "*",
|
|
120
|
+
"@radix-ui/react-radio-group": "*",
|
|
121
|
+
"@radix-ui/react-scroll-area": "*",
|
|
122
|
+
"@radix-ui/react-select": "*",
|
|
123
|
+
"@radix-ui/react-separator": "*",
|
|
124
|
+
"@radix-ui/react-slider": "*",
|
|
125
|
+
"@radix-ui/react-slot": "*",
|
|
126
|
+
"@radix-ui/react-switch": "*",
|
|
127
|
+
"@radix-ui/react-tabs": "*",
|
|
128
|
+
"@radix-ui/react-toast": "*",
|
|
129
|
+
"@radix-ui/react-toggle": "*",
|
|
130
|
+
"@radix-ui/react-toggle-group": "*",
|
|
131
|
+
"@radix-ui/react-tooltip": "*",
|
|
132
|
+
"class-variance-authority": "^0.7.0",
|
|
133
|
+
"clsx": "^2.0.0",
|
|
134
|
+
"cmdk": "*",
|
|
135
|
+
"embla-carousel-react": "*",
|
|
136
|
+
"framer-motion": "^12.0.0",
|
|
137
|
+
"input-otp": "*",
|
|
138
|
+
"lucide-react": "^0.400.0",
|
|
139
|
+
"next": ">=14.0.0",
|
|
140
|
+
"next-themes": "^0.4.0",
|
|
141
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
142
|
+
"react-day-picker": "*",
|
|
143
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
144
|
+
"react-hook-form": "^7.0.0",
|
|
145
|
+
"react-markdown": "^10.0.0",
|
|
146
|
+
"remark-gfm": "^4.0.0",
|
|
147
|
+
"sonner": "^1.0.0",
|
|
148
|
+
"tailwind-merge": "^2.0.0",
|
|
149
|
+
"vaul": "^1.0.0",
|
|
150
|
+
"zod": "^3.0.0"
|
|
151
|
+
},
|
|
152
|
+
"devDependencies": {
|
|
153
|
+
"@hookform/resolvers": "^3.10.0",
|
|
154
|
+
"@radix-ui/react-accordion": "latest",
|
|
155
|
+
"@radix-ui/react-alert-dialog": "latest",
|
|
156
|
+
"@radix-ui/react-aspect-ratio": "latest",
|
|
157
|
+
"@radix-ui/react-avatar": "latest",
|
|
158
|
+
"@radix-ui/react-checkbox": "latest",
|
|
159
|
+
"@radix-ui/react-collapsible": "latest",
|
|
160
|
+
"@radix-ui/react-dialog": "latest",
|
|
161
|
+
"@radix-ui/react-dropdown-menu": "latest",
|
|
162
|
+
"@radix-ui/react-label": "latest",
|
|
163
|
+
"@radix-ui/react-popover": "latest",
|
|
164
|
+
"@radix-ui/react-progress": "latest",
|
|
165
|
+
"@radix-ui/react-radio-group": "latest",
|
|
166
|
+
"@radix-ui/react-scroll-area": "latest",
|
|
167
|
+
"@radix-ui/react-select": "latest",
|
|
168
|
+
"@radix-ui/react-separator": "latest",
|
|
169
|
+
"@radix-ui/react-slider": "latest",
|
|
170
|
+
"@radix-ui/react-slot": "latest",
|
|
171
|
+
"@radix-ui/react-switch": "latest",
|
|
172
|
+
"@radix-ui/react-tabs": "latest",
|
|
173
|
+
"@radix-ui/react-toast": "latest",
|
|
174
|
+
"@radix-ui/react-toggle": "latest",
|
|
175
|
+
"@radix-ui/react-toggle-group": "latest",
|
|
176
|
+
"@radix-ui/react-tooltip": "latest",
|
|
177
|
+
"@types/react": "^19",
|
|
178
|
+
"@types/react-dom": "^19",
|
|
179
|
+
"class-variance-authority": "^0.7.1",
|
|
180
|
+
"clsx": "^2.1.1",
|
|
181
|
+
"cmdk": "latest",
|
|
182
|
+
"embla-carousel-react": "^8.6.0",
|
|
183
|
+
"framer-motion": "^12.23.22",
|
|
184
|
+
"input-otp": "^1.4.2",
|
|
185
|
+
"lucide-react": "^0.577.0",
|
|
186
|
+
"next": "^16.1.7",
|
|
187
|
+
"next-themes": "^0.4.6",
|
|
188
|
+
"react": "19.2.4",
|
|
189
|
+
"react-day-picker": "latest",
|
|
190
|
+
"react-dom": "19.2.4",
|
|
191
|
+
"react-hook-form": "7.72.0",
|
|
192
|
+
"react-markdown": "^10.1.0",
|
|
193
|
+
"remark-gfm": "^4.0.1",
|
|
194
|
+
"sonner": "^1.7.4",
|
|
195
|
+
"tailwind-merge": "^2.5.5",
|
|
196
|
+
"tailwindcss": "^4.2.4",
|
|
197
|
+
"tsup": "^8.5.0",
|
|
198
|
+
"tw-animate-css": "^1.4.0",
|
|
199
|
+
"typescript": "^5",
|
|
200
|
+
"vaul": "^1.1.2",
|
|
201
|
+
"zod": "^3.25.67"
|
|
202
|
+
}
|
|
203
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import * as AccordionPrimitive from "@radix-ui/react-accordion";
|
|
5
|
+
import { ChevronDown } from "lucide-react";
|
|
6
|
+
import { cn } from "../lib/utils";
|
|
7
|
+
|
|
8
|
+
const Accordion = AccordionPrimitive.Root;
|
|
9
|
+
|
|
10
|
+
const AccordionItem = React.forwardRef<
|
|
11
|
+
React.ElementRef<typeof AccordionPrimitive.Item>,
|
|
12
|
+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
|
|
13
|
+
>(({ className, ...props }, ref) => (
|
|
14
|
+
<AccordionPrimitive.Item
|
|
15
|
+
ref={ref}
|
|
16
|
+
className={cn("border-b border-border/50", className)}
|
|
17
|
+
{...props}
|
|
18
|
+
/>
|
|
19
|
+
));
|
|
20
|
+
AccordionItem.displayName = "AccordionItem";
|
|
21
|
+
|
|
22
|
+
const AccordionTrigger = React.forwardRef<
|
|
23
|
+
React.ElementRef<typeof AccordionPrimitive.Trigger>,
|
|
24
|
+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
|
|
25
|
+
>(({ className, children, ...props }, ref) => (
|
|
26
|
+
<AccordionPrimitive.Header className="flex">
|
|
27
|
+
<AccordionPrimitive.Trigger
|
|
28
|
+
ref={ref}
|
|
29
|
+
className={cn(
|
|
30
|
+
"flex flex-1 items-center justify-between py-4 font-medium transition-all duration-300 hover:underline [&[data-state=open]>svg]:rotate-180 glass-hover rounded-xl px-4 hover:bg-accent/20",
|
|
31
|
+
className
|
|
32
|
+
)}
|
|
33
|
+
{...props}
|
|
34
|
+
>
|
|
35
|
+
{children}
|
|
36
|
+
<ChevronDown className="h-4 w-4 shrink-0 transition-transform duration-300" />
|
|
37
|
+
</AccordionPrimitive.Trigger>
|
|
38
|
+
</AccordionPrimitive.Header>
|
|
39
|
+
));
|
|
40
|
+
AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
|
|
41
|
+
|
|
42
|
+
const AccordionContent = React.forwardRef<
|
|
43
|
+
React.ElementRef<typeof AccordionPrimitive.Content>,
|
|
44
|
+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
|
|
45
|
+
>(({ className, children, ...props }, ref) => (
|
|
46
|
+
<AccordionPrimitive.Content
|
|
47
|
+
ref={ref}
|
|
48
|
+
className="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
|
|
49
|
+
{...props}
|
|
50
|
+
>
|
|
51
|
+
<div className={cn("pb-4 pt-0 px-4", className)}>{children}</div>
|
|
52
|
+
</AccordionPrimitive.Content>
|
|
53
|
+
));
|
|
54
|
+
|
|
55
|
+
AccordionContent.displayName = AccordionPrimitive.Content.displayName;
|
|
56
|
+
|
|
57
|
+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
|
|
5
|
+
import { cn } from "../lib/utils";
|
|
6
|
+
import { buttonVariants } from "./button";
|
|
7
|
+
|
|
8
|
+
const AlertDialog = AlertDialogPrimitive.Root;
|
|
9
|
+
|
|
10
|
+
const AlertDialogTrigger = AlertDialogPrimitive.Trigger;
|
|
11
|
+
|
|
12
|
+
const AlertDialogPortal = AlertDialogPrimitive.Portal;
|
|
13
|
+
|
|
14
|
+
const AlertDialogOverlay = React.forwardRef<
|
|
15
|
+
React.ElementRef<typeof AlertDialogPrimitive.Overlay>,
|
|
16
|
+
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>
|
|
17
|
+
>(({ className, ...props }, ref) => (
|
|
18
|
+
<AlertDialogPrimitive.Overlay
|
|
19
|
+
className={cn(
|
|
20
|
+
"fixed inset-0 z-50 bg-black/50 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
21
|
+
className
|
|
22
|
+
)}
|
|
23
|
+
{...props}
|
|
24
|
+
ref={ref}
|
|
25
|
+
/>
|
|
26
|
+
));
|
|
27
|
+
AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
|
|
28
|
+
|
|
29
|
+
const AlertDialogContent = React.forwardRef<
|
|
30
|
+
React.ElementRef<typeof AlertDialogPrimitive.Content>,
|
|
31
|
+
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>
|
|
32
|
+
>(({ className, ...props }, ref) => (
|
|
33
|
+
<AlertDialogPortal>
|
|
34
|
+
<AlertDialogOverlay />
|
|
35
|
+
<AlertDialogPrimitive.Content
|
|
36
|
+
ref={ref}
|
|
37
|
+
className={cn(
|
|
38
|
+
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 glass p-6 shadow-2xl duration-200 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 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-2xl border border-border/50",
|
|
39
|
+
className
|
|
40
|
+
)}
|
|
41
|
+
{...props}
|
|
42
|
+
/>
|
|
43
|
+
</AlertDialogPortal>
|
|
44
|
+
));
|
|
45
|
+
AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
|
|
46
|
+
|
|
47
|
+
const AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
|
|
48
|
+
<div className={cn("flex flex-col space-y-2 text-center sm:text-left", className)} {...props} />
|
|
49
|
+
);
|
|
50
|
+
AlertDialogHeader.displayName = "AlertDialogHeader";
|
|
51
|
+
|
|
52
|
+
const AlertDialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
|
|
53
|
+
<div
|
|
54
|
+
className={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)}
|
|
55
|
+
{...props}
|
|
56
|
+
/>
|
|
57
|
+
);
|
|
58
|
+
AlertDialogFooter.displayName = "AlertDialogFooter";
|
|
59
|
+
|
|
60
|
+
const AlertDialogTitle = React.forwardRef<
|
|
61
|
+
React.ElementRef<typeof AlertDialogPrimitive.Title>,
|
|
62
|
+
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>
|
|
63
|
+
>(({ className, ...props }, ref) => (
|
|
64
|
+
<AlertDialogPrimitive.Title
|
|
65
|
+
ref={ref}
|
|
66
|
+
className={cn("text-lg font-semibold", className)}
|
|
67
|
+
{...props}
|
|
68
|
+
/>
|
|
69
|
+
));
|
|
70
|
+
AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
|
|
71
|
+
|
|
72
|
+
const AlertDialogDescription = React.forwardRef<
|
|
73
|
+
React.ElementRef<typeof AlertDialogPrimitive.Description>,
|
|
74
|
+
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>
|
|
75
|
+
>(({ className, ...props }, ref) => (
|
|
76
|
+
<AlertDialogPrimitive.Description
|
|
77
|
+
ref={ref}
|
|
78
|
+
className={cn("text-sm text-muted-foreground", className)}
|
|
79
|
+
{...props}
|
|
80
|
+
/>
|
|
81
|
+
));
|
|
82
|
+
AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
|
|
83
|
+
|
|
84
|
+
const AlertDialogAction = React.forwardRef<
|
|
85
|
+
React.ElementRef<typeof AlertDialogPrimitive.Action>,
|
|
86
|
+
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>
|
|
87
|
+
>(({ className, ...props }, ref) => (
|
|
88
|
+
<AlertDialogPrimitive.Action ref={ref} className={cn(buttonVariants(), className)} {...props} />
|
|
89
|
+
));
|
|
90
|
+
AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
|
|
91
|
+
|
|
92
|
+
const AlertDialogCancel = React.forwardRef<
|
|
93
|
+
React.ElementRef<typeof AlertDialogPrimitive.Cancel>,
|
|
94
|
+
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>
|
|
95
|
+
>(({ className, ...props }, ref) => (
|
|
96
|
+
<AlertDialogPrimitive.Cancel
|
|
97
|
+
ref={ref}
|
|
98
|
+
className={cn(buttonVariants({ variant: "outline" }), "mt-2 sm:mt-0", className)}
|
|
99
|
+
{...props}
|
|
100
|
+
/>
|
|
101
|
+
));
|
|
102
|
+
AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
|
|
103
|
+
|
|
104
|
+
export {
|
|
105
|
+
AlertDialog,
|
|
106
|
+
AlertDialogPortal,
|
|
107
|
+
AlertDialogOverlay,
|
|
108
|
+
AlertDialogTrigger,
|
|
109
|
+
AlertDialogContent,
|
|
110
|
+
AlertDialogHeader,
|
|
111
|
+
AlertDialogFooter,
|
|
112
|
+
AlertDialogTitle,
|
|
113
|
+
AlertDialogDescription,
|
|
114
|
+
AlertDialogAction,
|
|
115
|
+
AlertDialogCancel,
|
|
116
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
3
|
+
import { cn } from "../lib/utils";
|
|
4
|
+
import { textVariants } from "./text";
|
|
5
|
+
|
|
6
|
+
const alertVariants = cva(
|
|
7
|
+
"relative w-full rounded-xl border border-border/50 px-4 py-3 text-sm glass transition-all duration-300 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",
|
|
8
|
+
{
|
|
9
|
+
variants: {
|
|
10
|
+
variant: {
|
|
11
|
+
default: "bg-background text-foreground",
|
|
12
|
+
destructive:
|
|
13
|
+
"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive bg-destructive/10",
|
|
14
|
+
warning:
|
|
15
|
+
"border-yellow-500/50 text-yellow-600 dark:border-yellow-500 [&>svg]:text-yellow-600 bg-yellow-500/10",
|
|
16
|
+
success:
|
|
17
|
+
"border-green-500/50 text-green-600 dark:border-green-500 [&>svg]:text-green-600 bg-green-500/10",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
defaultVariants: {
|
|
21
|
+
variant: "default",
|
|
22
|
+
},
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
const Alert = React.forwardRef<
|
|
27
|
+
HTMLDivElement,
|
|
28
|
+
React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>
|
|
29
|
+
>(({ className, variant, ...props }, ref) => (
|
|
30
|
+
<div ref={ref} role="alert" className={cn(alertVariants({ variant }), className)} {...props} />
|
|
31
|
+
));
|
|
32
|
+
Alert.displayName = "Alert";
|
|
33
|
+
|
|
34
|
+
const AlertTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(
|
|
35
|
+
({ className, ...props }, ref) => (
|
|
36
|
+
<h5
|
|
37
|
+
ref={ref}
|
|
38
|
+
className={cn(
|
|
39
|
+
"mb-1",
|
|
40
|
+
textVariants({ weight: "medium", leading: "none", tracking: "tight" }),
|
|
41
|
+
className
|
|
42
|
+
)}
|
|
43
|
+
{...props}
|
|
44
|
+
/>
|
|
45
|
+
)
|
|
46
|
+
);
|
|
47
|
+
AlertTitle.displayName = "AlertTitle";
|
|
48
|
+
|
|
49
|
+
const AlertDescription = React.forwardRef<
|
|
50
|
+
HTMLParagraphElement,
|
|
51
|
+
React.HTMLAttributes<HTMLParagraphElement>
|
|
52
|
+
>(({ className, ...props }, ref) => (
|
|
53
|
+
<div ref={ref} className={cn("text-sm [&_p]:leading-relaxed", className)} {...props} />
|
|
54
|
+
));
|
|
55
|
+
AlertDescription.displayName = "AlertDescription";
|
|
56
|
+
|
|
57
|
+
export { Alert, AlertTitle, AlertDescription };
|
|
@@ -0,0 +1,9 @@
|
|
|
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 };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import * as AvatarPrimitive from "@radix-ui/react-avatar";
|
|
5
|
+
import { cn } from "../lib/utils";
|
|
6
|
+
|
|
7
|
+
const Avatar = React.forwardRef<
|
|
8
|
+
React.ElementRef<typeof AvatarPrimitive.Root>,
|
|
9
|
+
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>
|
|
10
|
+
>(({ className, ...props }, ref) => (
|
|
11
|
+
<AvatarPrimitive.Root
|
|
12
|
+
ref={ref}
|
|
13
|
+
className={cn(
|
|
14
|
+
"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full border border-border/50 shadow-lg backdrop-blur-md bg-card/50 transition-all duration-300 hover:shadow-xl hover:shadow-black/20 hover:border-accent/30",
|
|
15
|
+
className
|
|
16
|
+
)}
|
|
17
|
+
{...props}
|
|
18
|
+
/>
|
|
19
|
+
));
|
|
20
|
+
Avatar.displayName = AvatarPrimitive.Root.displayName;
|
|
21
|
+
|
|
22
|
+
const AvatarImage = React.forwardRef<
|
|
23
|
+
React.ElementRef<typeof AvatarPrimitive.Image>,
|
|
24
|
+
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>
|
|
25
|
+
>(({ className, ...props }, ref) => (
|
|
26
|
+
<AvatarPrimitive.Image
|
|
27
|
+
ref={ref}
|
|
28
|
+
className={cn("aspect-square h-full w-full object-cover", className)}
|
|
29
|
+
{...props}
|
|
30
|
+
/>
|
|
31
|
+
));
|
|
32
|
+
AvatarImage.displayName = AvatarPrimitive.Image.displayName;
|
|
33
|
+
|
|
34
|
+
const AvatarFallback = React.forwardRef<
|
|
35
|
+
React.ElementRef<typeof AvatarPrimitive.Fallback>,
|
|
36
|
+
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>
|
|
37
|
+
>(({ className, ...props }, ref) => (
|
|
38
|
+
<AvatarPrimitive.Fallback
|
|
39
|
+
ref={ref}
|
|
40
|
+
className={cn(
|
|
41
|
+
"flex h-full w-full items-center justify-center rounded-full bg-muted text-muted-foreground text-sm font-medium backdrop-blur-md",
|
|
42
|
+
className
|
|
43
|
+
)}
|
|
44
|
+
{...props}
|
|
45
|
+
/>
|
|
46
|
+
));
|
|
47
|
+
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
|
|
48
|
+
|
|
49
|
+
export { Avatar, AvatarImage, AvatarFallback };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
3
|
+
import { cn } from "../lib/utils";
|
|
4
|
+
|
|
5
|
+
const badgeVariants = cva(
|
|
6
|
+
"inline-flex items-center rounded-lg border px-2.5 py-0.5 text-xs font-semibold transition-[background-color,color,box-shadow,border-color] duration-300 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 backdrop-blur-md",
|
|
7
|
+
{
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
default:
|
|
11
|
+
"border-transparent bg-primary/80 text-primary-foreground shadow-lg hover:bg-primary hover:shadow-xl hover:shadow-primary/20",
|
|
12
|
+
secondary:
|
|
13
|
+
"border-transparent bg-secondary/80 text-secondary-foreground shadow-lg hover:bg-secondary hover:shadow-xl hover:shadow-secondary/20",
|
|
14
|
+
destructive:
|
|
15
|
+
"border-transparent bg-destructive/80 text-destructive-foreground shadow-lg hover:bg-destructive hover:shadow-xl hover:shadow-destructive/20",
|
|
16
|
+
outline: "text-foreground glass glass-hover",
|
|
17
|
+
overlay: "border-transparent bg-black/50 text-white backdrop-blur-sm shadow-lg",
|
|
18
|
+
glass: "glass glass-hover text-foreground border-border/50",
|
|
19
|
+
success:
|
|
20
|
+
"border-transparent bg-green-500/80 text-primary shadow-lg hover:bg-green-500 hover:shadow-xl hover:shadow-green-500/20",
|
|
21
|
+
warning:
|
|
22
|
+
"border-transparent bg-yellow-500/80 text-primary shadow-lg hover:bg-yellow-500 hover:shadow-xl hover:shadow-yellow-500/20",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: {
|
|
26
|
+
variant: "default",
|
|
27
|
+
},
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
export interface BadgeProps
|
|
32
|
+
extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {}
|
|
33
|
+
|
|
34
|
+
function Badge({ className, variant, ...props }: BadgeProps) {
|
|
35
|
+
return <div className={cn(badgeVariants({ variant }), className)} {...props} />;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { Badge, badgeVariants };
|