@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.
Files changed (207) hide show
  1. package/dist/chunk-2CUFS5LF.js +80 -0
  2. package/dist/chunk-3GWWZKX7.js +33 -0
  3. package/dist/chunk-3VMDCCCX.js +10 -0
  4. package/dist/chunk-4AVS6CV4.js +89 -0
  5. package/dist/chunk-4JOV7FXW.js +17 -0
  6. package/dist/chunk-4KOMHDZD.js +89 -0
  7. package/dist/chunk-4UO73SKC.js +26 -0
  8. package/dist/chunk-7H54PTVH.js +116 -0
  9. package/dist/chunk-CW24PLDW.js +24 -0
  10. package/dist/chunk-EBAMCZDW.js +112 -0
  11. package/dist/chunk-ERMIA7NP.js +106 -0
  12. package/dist/chunk-ESO2EM3L.js +46 -0
  13. package/dist/chunk-EUHEIWHZ.js +32 -0
  14. package/dist/chunk-FEK5XGZW.js +8 -0
  15. package/dist/chunk-NKHH23YK.js +31 -0
  16. package/dist/chunk-R47NEOSI.js +78 -0
  17. package/dist/chunk-UXAYXRFN.js +69 -0
  18. package/dist/chunk-X6GATUI2.js +19 -0
  19. package/dist/components/accordion.d.ts +9 -0
  20. package/dist/components/accordion.js +53 -0
  21. package/dist/components/alert-dialog.d.ts +23 -0
  22. package/dist/components/alert-dialog.js +98 -0
  23. package/dist/components/alert.d.ts +11 -0
  24. package/dist/components/alert.js +52 -0
  25. package/dist/components/aspect-ratio.d.ts +6 -0
  26. package/dist/components/aspect-ratio.js +2 -0
  27. package/dist/components/avatar.d.ts +8 -0
  28. package/dist/components/avatar.js +47 -0
  29. package/dist/components/badge.d.ts +13 -0
  30. package/dist/components/badge.js +3 -0
  31. package/dist/components/breadcrumb.d.ts +14 -0
  32. package/dist/components/breadcrumb.js +96 -0
  33. package/dist/components/button.d.ts +16 -0
  34. package/dist/components/button.js +4 -0
  35. package/dist/components/calendar.d.ts +11 -0
  36. package/dist/components/calendar.js +56 -0
  37. package/dist/components/card.d.ts +13 -0
  38. package/dist/components/card.js +4 -0
  39. package/dist/components/carousel.d.ts +24 -0
  40. package/dist/components/carousel.js +198 -0
  41. package/dist/components/checkbox.d.ts +6 -0
  42. package/dist/components/checkbox.js +25 -0
  43. package/dist/components/collapsible.d.ts +8 -0
  44. package/dist/components/collapsible.js +26 -0
  45. package/dist/components/command.d.ts +84 -0
  46. package/dist/components/command.js +4 -0
  47. package/dist/components/currency-input.d.ts +17 -0
  48. package/dist/components/currency-input.js +121 -0
  49. package/dist/components/dialog.d.ts +22 -0
  50. package/dist/components/dialog.js +3 -0
  51. package/dist/components/drawer.d.ts +27 -0
  52. package/dist/components/drawer.js +85 -0
  53. package/dist/components/dropdown-menu.d.ts +28 -0
  54. package/dist/components/dropdown-menu.js +211 -0
  55. package/dist/components/empty-state.d.ts +22 -0
  56. package/dist/components/empty-state.js +81 -0
  57. package/dist/components/form.d.ts +28 -0
  58. package/dist/components/form.js +97 -0
  59. package/dist/components/haptic-button.d.ts +12 -0
  60. package/dist/components/haptic-button.js +17 -0
  61. package/dist/components/input-otp.d.ts +14 -0
  62. package/dist/components/input-otp.js +62 -0
  63. package/dist/components/input.d.ts +6 -0
  64. package/dist/components/input.js +3 -0
  65. package/dist/components/label.d.ts +8 -0
  66. package/dist/components/label.js +3 -0
  67. package/dist/components/lazy-markdown.d.ts +11 -0
  68. package/dist/components/lazy-markdown.js +13 -0
  69. package/dist/components/link-button.d.ts +30 -0
  70. package/dist/components/link-button.js +17 -0
  71. package/dist/components/markdown-renderer.d.ts +11 -0
  72. package/dist/components/markdown-renderer.js +10 -0
  73. package/dist/components/multi-select-combobox.d.ts +23 -0
  74. package/dist/components/multi-select-combobox.js +114 -0
  75. package/dist/components/pagination.d.ts +18 -0
  76. package/dist/components/pagination.js +101 -0
  77. package/dist/components/popover.d.ts +8 -0
  78. package/dist/components/popover.js +3 -0
  79. package/dist/components/progress.d.ts +6 -0
  80. package/dist/components/progress.js +30 -0
  81. package/dist/components/radio-group.d.ts +7 -0
  82. package/dist/components/radio-group.js +30 -0
  83. package/dist/components/rating.d.ts +15 -0
  84. package/dist/components/rating.js +120 -0
  85. package/dist/components/scroll-area.d.ts +7 -0
  86. package/dist/components/scroll-area.js +44 -0
  87. package/dist/components/search-bar.d.ts +17 -0
  88. package/dist/components/search-bar.js +92 -0
  89. package/dist/components/searchable-select.d.ts +22 -0
  90. package/dist/components/searchable-select.js +104 -0
  91. package/dist/components/select.d.ts +15 -0
  92. package/dist/components/select.js +129 -0
  93. package/dist/components/separator.d.ts +6 -0
  94. package/dist/components/separator.js +25 -0
  95. package/dist/components/sheet.d.ts +29 -0
  96. package/dist/components/sheet.js +96 -0
  97. package/dist/components/skeleton-card.d.ts +13 -0
  98. package/dist/components/skeleton-card.js +154 -0
  99. package/dist/components/skeleton.d.ts +6 -0
  100. package/dist/components/skeleton.js +3 -0
  101. package/dist/components/slider.d.ts +6 -0
  102. package/dist/components/slider.js +24 -0
  103. package/dist/components/sliding-panels.d.ts +19 -0
  104. package/dist/components/sliding-panels.js +75 -0
  105. package/dist/components/sonner.d.ts +6 -0
  106. package/dist/components/sonner.js +23 -0
  107. package/dist/components/sticky-container.d.ts +44 -0
  108. package/dist/components/sticky-container.js +39 -0
  109. package/dist/components/switch.d.ts +6 -0
  110. package/dist/components/switch.js +31 -0
  111. package/dist/components/table.d.ts +12 -0
  112. package/dist/components/table.js +81 -0
  113. package/dist/components/tabs.d.ts +12 -0
  114. package/dist/components/tabs.js +55 -0
  115. package/dist/components/text.d.ts +31 -0
  116. package/dist/components/text.js +3 -0
  117. package/dist/components/textarea.d.ts +6 -0
  118. package/dist/components/textarea.js +23 -0
  119. package/dist/components/toast.d.ts +18 -0
  120. package/dist/components/toast.js +3 -0
  121. package/dist/components/toaster.d.ts +5 -0
  122. package/dist/components/toaster.js +25 -0
  123. package/dist/components/toggle-group.d.ts +12 -0
  124. package/dist/components/toggle-group.js +72 -0
  125. package/dist/components/toggle.d.ts +13 -0
  126. package/dist/components/toggle.js +3 -0
  127. package/dist/components/tooltip.d.ts +9 -0
  128. package/dist/components/tooltip.js +26 -0
  129. package/dist/components/use-mobile.d.ts +3 -0
  130. package/dist/components/use-mobile.js +19 -0
  131. package/dist/components/use-toast.d.ts +42 -0
  132. package/dist/components/use-toast.js +2 -0
  133. package/dist/hooks/use-haptic.d.ts +22 -0
  134. package/dist/hooks/use-haptic.js +2 -0
  135. package/dist/hooks/use-mobile.d.ts +3 -0
  136. package/dist/hooks/use-mobile.js +19 -0
  137. package/dist/hooks/use-mounted-theme.d.ts +6 -0
  138. package/dist/hooks/use-mounted-theme.js +18 -0
  139. package/dist/hooks/use-sticky.d.ts +18 -0
  140. package/dist/hooks/use-sticky.js +2 -0
  141. package/dist/lib/utils.d.ts +5 -0
  142. package/dist/lib/utils.js +2 -0
  143. package/package.json +203 -0
  144. package/src/components/accordion.tsx +57 -0
  145. package/src/components/alert-dialog.tsx +116 -0
  146. package/src/components/alert.tsx +57 -0
  147. package/src/components/aspect-ratio.tsx +9 -0
  148. package/src/components/avatar.tsx +49 -0
  149. package/src/components/badge.tsx +38 -0
  150. package/src/components/breadcrumb.tsx +102 -0
  151. package/src/components/button.tsx +94 -0
  152. package/src/components/calendar.tsx +60 -0
  153. package/src/components/card.tsx +67 -0
  154. package/src/components/carousel.tsx +230 -0
  155. package/src/components/checkbox.tsx +27 -0
  156. package/src/components/collapsible.tsx +28 -0
  157. package/src/components/command.tsx +148 -0
  158. package/src/components/currency-input.tsx +158 -0
  159. package/src/components/dialog.tsx +103 -0
  160. package/src/components/drawer.tsx +99 -0
  161. package/src/components/dropdown-menu.tsx +228 -0
  162. package/src/components/empty-state.tsx +118 -0
  163. package/src/components/form.tsx +152 -0
  164. package/src/components/haptic-button.tsx +19 -0
  165. package/src/components/input-otp.tsx +70 -0
  166. package/src/components/input.tsx +23 -0
  167. package/src/components/label.tsx +20 -0
  168. package/src/components/lazy-markdown.tsx +20 -0
  169. package/src/components/link-button.tsx +40 -0
  170. package/src/components/markdown-renderer.tsx +20 -0
  171. package/src/components/multi-select-combobox.tsx +148 -0
  172. package/src/components/pagination.tsx +106 -0
  173. package/src/components/popover.tsx +30 -0
  174. package/src/components/progress.tsx +27 -0
  175. package/src/components/radio-group.tsx +37 -0
  176. package/src/components/rating.tsx +136 -0
  177. package/src/components/scroll-area.tsx +45 -0
  178. package/src/components/search-bar.tsx +113 -0
  179. package/src/components/searchable-select.tsx +134 -0
  180. package/src/components/select.tsx +152 -0
  181. package/src/components/separator.tsx +25 -0
  182. package/src/components/sheet.tsx +121 -0
  183. package/src/components/skeleton-card.tsx +282 -0
  184. package/src/components/skeleton.tsx +17 -0
  185. package/src/components/slider.tsx +24 -0
  186. package/src/components/sliding-panels.tsx +99 -0
  187. package/src/components/sonner.tsx +25 -0
  188. package/src/components/sticky-container.tsx +88 -0
  189. package/src/components/switch.tsx +28 -0
  190. package/src/components/table.tsx +90 -0
  191. package/src/components/tabs.tsx +72 -0
  192. package/src/components/text.test.tsx +192 -0
  193. package/src/components/text.tsx +114 -0
  194. package/src/components/textarea.tsx +22 -0
  195. package/src/components/toast.tsx +129 -0
  196. package/src/components/toaster.tsx +31 -0
  197. package/src/components/toggle-group.tsx +69 -0
  198. package/src/components/toggle.tsx +46 -0
  199. package/src/components/tooltip.tsx +29 -0
  200. package/src/components/use-mobile.tsx +19 -0
  201. package/src/components/use-toast.ts +180 -0
  202. package/src/globals.css +409 -0
  203. package/src/hooks/use-haptic.ts +118 -0
  204. package/src/hooks/use-mobile.ts +19 -0
  205. package/src/hooks/use-mounted-theme.ts +20 -0
  206. package/src/hooks/use-sticky.ts +47 -0
  207. 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,2 @@
1
+ export { useHaptic } from '../chunk-R47NEOSI.js';
2
+ import '../chunk-3GWWZKX7.js';
@@ -0,0 +1,3 @@
1
+ declare function useIsMobile(): boolean;
2
+
3
+ export { useIsMobile };
@@ -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,6 @@
1
+ declare function useMountedTheme(): {
2
+ mounted: boolean;
3
+ isDark: boolean;
4
+ };
5
+
6
+ export { useMountedTheme };
@@ -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 };
@@ -0,0 +1,2 @@
1
+ export { useSticky } from '../chunk-EUHEIWHZ.js';
2
+ import '../chunk-3GWWZKX7.js';
@@ -0,0 +1,5 @@
1
+ import { ClassValue } from 'clsx';
2
+
3
+ declare function cn(...inputs: ClassValue[]): string;
4
+
5
+ export { cn };
@@ -0,0 +1,2 @@
1
+ export { cn } from '../chunk-FEK5XGZW.js';
2
+ import '../chunk-3GWWZKX7.js';
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 };