@glinui/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 (244) hide show
  1. package/dist/components/accordion.d.ts +42 -0
  2. package/dist/components/accordion.d.ts.map +1 -0
  3. package/dist/components/accordion.js +85 -0
  4. package/dist/components/alert-dialog.d.ts +30 -0
  5. package/dist/components/alert-dialog.d.ts.map +1 -0
  6. package/dist/components/alert-dialog.js +53 -0
  7. package/dist/components/alert.d.ts +15 -0
  8. package/dist/components/alert.d.ts.map +1 -0
  9. package/dist/components/alert.js +39 -0
  10. package/dist/components/animated-gradient.d.ts +11 -0
  11. package/dist/components/animated-gradient.d.ts.map +1 -0
  12. package/dist/components/animated-gradient.js +23 -0
  13. package/dist/components/aurora-background.d.ts +15 -0
  14. package/dist/components/aurora-background.d.ts.map +1 -0
  15. package/dist/components/aurora-background.js +26 -0
  16. package/dist/components/avatar.d.ts +54 -0
  17. package/dist/components/avatar.d.ts.map +1 -0
  18. package/dist/components/avatar.js +92 -0
  19. package/dist/components/badge.d.ts +13 -0
  20. package/dist/components/badge.d.ts.map +1 -0
  21. package/dist/components/badge.js +32 -0
  22. package/dist/components/blur-fade.d.ts +17 -0
  23. package/dist/components/blur-fade.d.ts.map +1 -0
  24. package/dist/components/blur-fade.js +48 -0
  25. package/dist/components/blur-spotlight.d.ts +13 -0
  26. package/dist/components/blur-spotlight.d.ts.map +1 -0
  27. package/dist/components/blur-spotlight.js +58 -0
  28. package/dist/components/border-beam.d.ts +11 -0
  29. package/dist/components/border-beam.d.ts.map +1 -0
  30. package/dist/components/border-beam.js +14 -0
  31. package/dist/components/button.d.ts +17 -0
  32. package/dist/components/button.d.ts.map +1 -0
  33. package/dist/components/button.js +33 -0
  34. package/dist/components/card.d.ts +39 -0
  35. package/dist/components/card.d.ts.map +1 -0
  36. package/dist/components/card.js +81 -0
  37. package/dist/components/checkbox.d.ts +14 -0
  38. package/dist/components/checkbox.d.ts.map +1 -0
  39. package/dist/components/checkbox.js +58 -0
  40. package/dist/components/chip.d.ts +15 -0
  41. package/dist/components/chip.d.ts.map +1 -0
  42. package/dist/components/chip.js +35 -0
  43. package/dist/components/chromatic-text.d.ts +11 -0
  44. package/dist/components/chromatic-text.d.ts.map +1 -0
  45. package/dist/components/chromatic-text.js +22 -0
  46. package/dist/components/code.d.ts +13 -0
  47. package/dist/components/code.d.ts.map +1 -0
  48. package/dist/components/code.js +27 -0
  49. package/dist/components/command.d.ts +89 -0
  50. package/dist/components/command.d.ts.map +1 -0
  51. package/dist/components/command.js +123 -0
  52. package/dist/components/counter.d.ts +19 -0
  53. package/dist/components/counter.d.ts.map +1 -0
  54. package/dist/components/counter.js +28 -0
  55. package/dist/components/data-table.d.ts +38 -0
  56. package/dist/components/data-table.d.ts.map +1 -0
  57. package/dist/components/data-table.js +183 -0
  58. package/dist/components/depth-card.d.ts +15 -0
  59. package/dist/components/depth-card.d.ts.map +1 -0
  60. package/dist/components/depth-card.js +52 -0
  61. package/dist/components/dot-pattern.d.ts +10 -0
  62. package/dist/components/dot-pattern.d.ts.map +1 -0
  63. package/dist/components/dot-pattern.js +10 -0
  64. package/dist/components/dropdown-menu.d.ts +74 -0
  65. package/dist/components/dropdown-menu.d.ts.map +1 -0
  66. package/dist/components/dropdown-menu.js +90 -0
  67. package/dist/components/floating-panel.d.ts +17 -0
  68. package/dist/components/floating-panel.d.ts.map +1 -0
  69. package/dist/components/floating-panel.js +57 -0
  70. package/dist/components/glass-breadcrumb.d.ts +17 -0
  71. package/dist/components/glass-breadcrumb.d.ts.map +1 -0
  72. package/dist/components/glass-breadcrumb.js +14 -0
  73. package/dist/components/glass-card.d.ts +20 -0
  74. package/dist/components/glass-card.d.ts.map +1 -0
  75. package/dist/components/glass-card.js +36 -0
  76. package/dist/components/glass-dock.d.ts +21 -0
  77. package/dist/components/glass-dock.d.ts.map +1 -0
  78. package/dist/components/glass-dock.js +54 -0
  79. package/dist/components/glass-navbar.d.ts +21 -0
  80. package/dist/components/glass-navbar.d.ts.map +1 -0
  81. package/dist/components/glass-navbar.js +43 -0
  82. package/dist/components/glass-toggle.d.ts +15 -0
  83. package/dist/components/glass-toggle.d.ts.map +1 -0
  84. package/dist/components/glass-toggle.js +32 -0
  85. package/dist/components/glow-border.d.ts +13 -0
  86. package/dist/components/glow-border.d.ts.map +1 -0
  87. package/dist/components/glow-border.js +10 -0
  88. package/dist/components/gradient-mesh.d.ts +13 -0
  89. package/dist/components/gradient-mesh.d.ts.map +1 -0
  90. package/dist/components/gradient-mesh.js +25 -0
  91. package/dist/components/heading.d.ts +18 -0
  92. package/dist/components/heading.d.ts.map +1 -0
  93. package/dist/components/heading.js +28 -0
  94. package/dist/components/hover-card.d.ts +32 -0
  95. package/dist/components/hover-card.d.ts.map +1 -0
  96. package/dist/components/hover-card.js +28 -0
  97. package/dist/components/icon-frame.d.ts +13 -0
  98. package/dist/components/icon-frame.d.ts.map +1 -0
  99. package/dist/components/icon-frame.js +27 -0
  100. package/dist/components/input.d.ts +13 -0
  101. package/dist/components/input.d.ts.map +1 -0
  102. package/dist/components/input.js +38 -0
  103. package/dist/components/kbd.d.ts +13 -0
  104. package/dist/components/kbd.d.ts.map +1 -0
  105. package/dist/components/kbd.js +27 -0
  106. package/dist/components/label.d.ts +13 -0
  107. package/dist/components/label.d.ts.map +1 -0
  108. package/dist/components/label.js +27 -0
  109. package/dist/components/light-leak.d.ts +15 -0
  110. package/dist/components/light-leak.d.ts.map +1 -0
  111. package/dist/components/light-leak.js +29 -0
  112. package/dist/components/link.d.ts +15 -0
  113. package/dist/components/link.d.ts.map +1 -0
  114. package/dist/components/link.js +32 -0
  115. package/dist/components/liquid-button.d.ts +17 -0
  116. package/dist/components/liquid-button.d.ts.map +1 -0
  117. package/dist/components/liquid-button.js +18 -0
  118. package/dist/components/magnetic-cta.d.ts +18 -0
  119. package/dist/components/magnetic-cta.d.ts.map +1 -0
  120. package/dist/components/magnetic-cta.js +46 -0
  121. package/dist/components/marquee.d.ts +10 -0
  122. package/dist/components/marquee.d.ts.map +1 -0
  123. package/dist/components/marquee.js +16 -0
  124. package/dist/components/meteor-shower.d.ts +11 -0
  125. package/dist/components/meteor-shower.d.ts.map +1 -0
  126. package/dist/components/meteor-shower.js +39 -0
  127. package/dist/components/modal.d.ts +30 -0
  128. package/dist/components/modal.d.ts.map +1 -0
  129. package/dist/components/modal.js +39 -0
  130. package/dist/components/morphing-tabs.d.ts +22 -0
  131. package/dist/components/morphing-tabs.d.ts.map +1 -0
  132. package/dist/components/morphing-tabs.js +72 -0
  133. package/dist/components/number-ticker.d.ts +11 -0
  134. package/dist/components/number-ticker.d.ts.map +1 -0
  135. package/dist/components/number-ticker.js +66 -0
  136. package/dist/components/orbiting-circles.d.ts +21 -0
  137. package/dist/components/orbiting-circles.d.ts.map +1 -0
  138. package/dist/components/orbiting-circles.js +24 -0
  139. package/dist/components/particle-field.d.ts +19 -0
  140. package/dist/components/particle-field.d.ts.map +1 -0
  141. package/dist/components/particle-field.js +41 -0
  142. package/dist/components/popover.d.ts +27 -0
  143. package/dist/components/popover.d.ts.map +1 -0
  144. package/dist/components/popover.js +52 -0
  145. package/dist/components/prism-border.d.ts +13 -0
  146. package/dist/components/prism-border.d.ts.map +1 -0
  147. package/dist/components/prism-border.js +16 -0
  148. package/dist/components/progress.d.ts +58 -0
  149. package/dist/components/progress.d.ts.map +1 -0
  150. package/dist/components/progress.js +108 -0
  151. package/dist/components/pulsating-button.d.ts +13 -0
  152. package/dist/components/pulsating-button.d.ts.map +1 -0
  153. package/dist/components/pulsating-button.js +40 -0
  154. package/dist/components/radio-group.d.ts +27 -0
  155. package/dist/components/radio-group.d.ts.map +1 -0
  156. package/dist/components/radio-group.js +58 -0
  157. package/dist/components/retro-grid.d.ts +13 -0
  158. package/dist/components/retro-grid.d.ts.map +1 -0
  159. package/dist/components/retro-grid.js +17 -0
  160. package/dist/components/reveal-text.d.ts +17 -0
  161. package/dist/components/reveal-text.d.ts.map +1 -0
  162. package/dist/components/reveal-text.js +61 -0
  163. package/dist/components/ripple-button.d.ts +11 -0
  164. package/dist/components/ripple-button.d.ts.map +1 -0
  165. package/dist/components/ripple-button.js +47 -0
  166. package/dist/components/ripple.d.ts +13 -0
  167. package/dist/components/ripple.d.ts.map +1 -0
  168. package/dist/components/ripple.js +24 -0
  169. package/dist/components/select.d.ts +24 -0
  170. package/dist/components/select.d.ts.map +1 -0
  171. package/dist/components/select.js +30 -0
  172. package/dist/components/separator.d.ts +29 -0
  173. package/dist/components/separator.d.ts.map +1 -0
  174. package/dist/components/separator.js +84 -0
  175. package/dist/components/sheet.d.ts +41 -0
  176. package/dist/components/sheet.d.ts.map +1 -0
  177. package/dist/components/sheet.js +85 -0
  178. package/dist/components/shimmer-button.d.ts +13 -0
  179. package/dist/components/shimmer-button.d.ts.map +1 -0
  180. package/dist/components/shimmer-button.js +32 -0
  181. package/dist/components/skeleton.d.ts +17 -0
  182. package/dist/components/skeleton.d.ts.map +1 -0
  183. package/dist/components/skeleton.js +42 -0
  184. package/dist/components/slider.d.ts +14 -0
  185. package/dist/components/slider.d.ts.map +1 -0
  186. package/dist/components/slider.js +89 -0
  187. package/dist/components/sonner.d.ts +14 -0
  188. package/dist/components/sonner.d.ts.map +1 -0
  189. package/dist/components/sonner.js +70 -0
  190. package/dist/components/spotlight-card.d.ts +11 -0
  191. package/dist/components/spotlight-card.d.ts.map +1 -0
  192. package/dist/components/spotlight-card.js +39 -0
  193. package/dist/components/spotlight.d.ts +19 -0
  194. package/dist/components/spotlight.d.ts.map +1 -0
  195. package/dist/components/spotlight.js +23 -0
  196. package/dist/components/status-dot.d.ts +24 -0
  197. package/dist/components/status-dot.d.ts.map +1 -0
  198. package/dist/components/status-dot.js +46 -0
  199. package/dist/components/switch.d.ts +42 -0
  200. package/dist/components/switch.d.ts.map +1 -0
  201. package/dist/components/switch.js +77 -0
  202. package/dist/components/table.d.ts +69 -0
  203. package/dist/components/table.d.ts.map +1 -0
  204. package/dist/components/table.js +176 -0
  205. package/dist/components/tabs.d.ts +34 -0
  206. package/dist/components/tabs.d.ts.map +1 -0
  207. package/dist/components/tabs.js +75 -0
  208. package/dist/components/text-reveal.d.ts +6 -0
  209. package/dist/components/text-reveal.d.ts.map +1 -0
  210. package/dist/components/text-reveal.js +56 -0
  211. package/dist/components/text.d.ts +13 -0
  212. package/dist/components/text.d.ts.map +1 -0
  213. package/dist/components/text.js +27 -0
  214. package/dist/components/textarea.d.ts +13 -0
  215. package/dist/components/textarea.d.ts.map +1 -0
  216. package/dist/components/textarea.js +37 -0
  217. package/dist/components/toast.d.ts +23 -0
  218. package/dist/components/toast.d.ts.map +1 -0
  219. package/dist/components/toast.js +36 -0
  220. package/dist/components/tooltip.d.ts +35 -0
  221. package/dist/components/tooltip.d.ts.map +1 -0
  222. package/dist/components/tooltip.js +34 -0
  223. package/dist/components/tree.d.ts +50 -0
  224. package/dist/components/tree.d.ts.map +1 -0
  225. package/dist/components/tree.js +77 -0
  226. package/dist/components/typewriter.d.ts +25 -0
  227. package/dist/components/typewriter.d.ts.map +1 -0
  228. package/dist/components/typewriter.js +109 -0
  229. package/dist/components/word-rotate.d.ts +11 -0
  230. package/dist/components/word-rotate.d.ts.map +1 -0
  231. package/dist/components/word-rotate.js +29 -0
  232. package/dist/index.d.ts +80 -0
  233. package/dist/index.d.ts.map +1 -0
  234. package/dist/index.js +79 -0
  235. package/dist/lib/cn.d.ts +3 -0
  236. package/dist/lib/cn.d.ts.map +1 -0
  237. package/dist/lib/cn.js +5 -0
  238. package/dist/lib/use-liquid-glass.d.ts +46 -0
  239. package/dist/lib/use-liquid-glass.d.ts.map +1 -0
  240. package/dist/lib/use-liquid-glass.js +144 -0
  241. package/dist/lib/use-prefers-reduced-motion.d.ts +2 -0
  242. package/dist/lib/use-prefers-reduced-motion.d.ts.map +1 -0
  243. package/dist/lib/use-prefers-reduced-motion.js +23 -0
  244. package/package.json +72 -0
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import * as TabsPrimitive from "@radix-ui/react-tabs";
4
+ import { cva } from "class-variance-authority";
5
+ import { cn } from "../lib/cn";
6
+ const tabsListVariants = cva("inline-flex items-center rounded-xl border p-1 transition-[background-color,border-color,box-shadow] duration-fast ease-standard motion-reduce:transition-none", {
7
+ variants: {
8
+ variant: {
9
+ default: "border-[var(--color-border)] bg-[var(--color-surface)]",
10
+ glass: "backdrop-blur-md bg-[var(--glass-1-surface)] border border-white/15 [border-top-color:var(--glass-refraction-top)]",
11
+ outline: "bg-transparent border border-[var(--color-border)]",
12
+ ghost: "bg-transparent border border-transparent",
13
+ liquid: "border-white/25 [border-top-color:var(--glass-refraction-top)] bg-[radial-gradient(circle_at_16%_14%,rgb(255_255_255_/_0.72),transparent_46%),linear-gradient(165deg,rgb(255_255_255_/_0.58),rgb(238_238_238_/_0.32))] dark:border-white/[0.14] dark:[border-top-color:rgb(255_255_255_/_0.32)] dark:bg-[linear-gradient(165deg,rgb(255_255_255_/_0.12),rgb(255_255_255_/_0.05))]",
14
+ matte: "border-black/10 bg-[linear-gradient(180deg,rgb(250_250_250),rgb(236_236_238))] dark:border-white/[0.14] dark:bg-[linear-gradient(180deg,rgb(55_60_70_/_0.9),rgb(37_42_50_/_0.9))]"
15
+ },
16
+ size: {
17
+ sm: "h-8 gap-1",
18
+ md: "h-10 gap-1.5",
19
+ lg: "h-11 gap-2"
20
+ }
21
+ },
22
+ defaultVariants: {
23
+ variant: "default",
24
+ size: "md"
25
+ }
26
+ });
27
+ const tabsTriggerVariants = cva("inline-flex items-center justify-center whitespace-nowrap rounded-lg font-medium transition-[background-color,color,border-color,box-shadow] duration-fast ease-standard focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]/35 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 motion-reduce:transition-none", {
28
+ variants: {
29
+ variant: {
30
+ default: "text-[var(--color-foreground)]/80 data-[state=active]:bg-[var(--color-background)] data-[state=active]:text-[var(--color-foreground)] data-[state=active]:shadow-[0_8px_16px_-14px_rgb(2_6_23_/_0.5)]",
31
+ glass: "text-[var(--color-foreground)]/80 data-[state=active]:border data-[state=active]:border-white/20 data-[state=active]:[border-top-color:var(--glass-refraction-top)] data-[state=active]:bg-[var(--glass-2-surface)] data-[state=active]:text-[var(--color-foreground)] data-[state=active]:shadow-[0_0_0_1px_rgb(255_255_255_/_0.18)_inset] dark:data-[state=active]:border-white/[0.12]",
32
+ outline: "text-[var(--color-foreground)]/80 border border-transparent data-[state=active]:border-[var(--color-border)] data-[state=active]:bg-[var(--color-surface)] data-[state=active]:text-[var(--color-foreground)]",
33
+ ghost: "text-[var(--color-foreground)]/75 data-[state=active]:bg-[var(--color-foreground)]/[0.08] data-[state=active]:text-[var(--color-foreground)] dark:data-[state=active]:bg-white/[0.12]",
34
+ liquid: "text-[var(--color-foreground)]/80 data-[state=active]:border data-[state=active]:border-white/25 data-[state=active]:bg-[linear-gradient(165deg,rgb(255_255_255_/_0.72),rgb(244_244_244_/_0.36))] data-[state=active]:text-[var(--color-foreground)] data-[state=active]:shadow-[0_0_0_1px_rgb(255_255_255_/_0.2)_inset] dark:data-[state=active]:border-white/[0.14] dark:data-[state=active]:bg-[linear-gradient(165deg,rgb(255_255_255_/_0.16),rgb(255_255_255_/_0.06))]",
35
+ matte: "text-[var(--color-foreground)]/80 data-[state=active]:bg-black/[0.06] data-[state=active]:text-[var(--color-foreground)] dark:data-[state=active]:bg-white/[0.12]"
36
+ },
37
+ size: {
38
+ sm: "h-6 px-2 text-xs",
39
+ md: "h-8 px-3 text-sm",
40
+ lg: "h-9 px-4 text-base"
41
+ }
42
+ },
43
+ defaultVariants: {
44
+ variant: "default",
45
+ size: "md"
46
+ }
47
+ });
48
+ const tabsContentVariants = cva("mt-2 rounded-xl border text-[var(--color-foreground)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]/35 focus-visible:ring-offset-2", {
49
+ variants: {
50
+ variant: {
51
+ default: "bg-[var(--color-surface)] border-[var(--color-border)]",
52
+ glass: "backdrop-blur-md bg-[var(--glass-1-surface)] border border-white/15 [border-top-color:var(--glass-refraction-top)]",
53
+ outline: "bg-transparent border-[var(--color-border)]",
54
+ ghost: "bg-transparent border-transparent",
55
+ liquid: "border-white/25 [border-top-color:var(--glass-refraction-top)] bg-[radial-gradient(circle_at_16%_14%,rgb(255_255_255_/_0.72),transparent_46%),linear-gradient(165deg,rgb(255_255_255_/_0.58),rgb(238_238_238_/_0.32))] dark:border-white/[0.14] dark:[border-top-color:rgb(255_255_255_/_0.32)] dark:bg-[linear-gradient(165deg,rgb(255_255_255_/_0.12),rgb(255_255_255_/_0.05))]",
56
+ matte: "border-black/10 bg-[linear-gradient(180deg,rgb(250_250_250),rgb(236_236_238))] dark:border-white/[0.14] dark:bg-[linear-gradient(180deg,rgb(55_60_70_/_0.9),rgb(37_42_50_/_0.9))]"
57
+ },
58
+ size: {
59
+ sm: "p-2 text-xs",
60
+ md: "p-3 text-sm",
61
+ lg: "p-4 text-base"
62
+ }
63
+ },
64
+ defaultVariants: {
65
+ variant: "default",
66
+ size: "md"
67
+ }
68
+ });
69
+ export const Tabs = TabsPrimitive.Root;
70
+ export const TabsList = React.forwardRef(({ className, variant, size, ...props }, ref) => (_jsx(TabsPrimitive.List, { ref: ref, className: cn(tabsListVariants({ variant, size }), className), ...props })));
71
+ TabsList.displayName = "TabsList";
72
+ export const TabsTrigger = React.forwardRef(({ className, variant, size, ...props }, ref) => (_jsx(TabsPrimitive.Trigger, { ref: ref, className: cn(tabsTriggerVariants({ variant, size }), className), ...props })));
73
+ TabsTrigger.displayName = "TabsTrigger";
74
+ export const TabsContent = React.forwardRef(({ className, variant, size, ...props }, ref) => (_jsx(TabsPrimitive.Content, { ref: ref, className: cn(tabsContentVariants({ variant, size }), className), ...props })));
75
+ TabsContent.displayName = "TabsContent";
@@ -0,0 +1,6 @@
1
+ import * as React from "react";
2
+ export interface TextRevealProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ text: string;
4
+ }
5
+ export declare const TextReveal: React.ForwardRefExoticComponent<TextRevealProps & React.RefAttributes<HTMLDivElement>>;
6
+ //# sourceMappingURL=text-reveal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-reveal.d.ts","sourceRoot":"","sources":["../../src/components/text-reveal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,MAAM,WAAW,eAAgB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC3E,IAAI,EAAE,MAAM,CAAA;CACb;AAED,eAAO,MAAM,UAAU,wFA+EtB,CAAA"}
@@ -0,0 +1,56 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../lib/cn";
5
+ import { usePrefersReducedMotion } from "../lib/use-prefers-reduced-motion";
6
+ export const TextReveal = React.forwardRef(({ className, text, ...props }, ref) => {
7
+ const containerRef = React.useRef(null);
8
+ const [progress, setProgress] = React.useState(0);
9
+ const prefersReducedMotion = usePrefersReducedMotion();
10
+ const words = text.split(" ");
11
+ React.useEffect(() => {
12
+ if (prefersReducedMotion) {
13
+ setProgress(1);
14
+ return;
15
+ }
16
+ const el = containerRef.current;
17
+ if (!el)
18
+ return;
19
+ // Find nearest scrollable ancestor (handles custom scroll containers)
20
+ const getScrollParent = (node) => {
21
+ let parent = node.parentElement;
22
+ while (parent) {
23
+ const style = getComputedStyle(parent);
24
+ if (/(auto|scroll)/.test(style.overflow + style.overflowY)) {
25
+ return parent;
26
+ }
27
+ parent = parent.parentElement;
28
+ }
29
+ return window;
30
+ };
31
+ const scrollTarget = getScrollParent(el);
32
+ const handleScroll = () => {
33
+ const rect = el.getBoundingClientRect();
34
+ const viewportHeight = scrollTarget instanceof Window
35
+ ? window.innerHeight
36
+ : scrollTarget.clientHeight;
37
+ const elementTop = scrollTarget instanceof Window
38
+ ? rect.top
39
+ : rect.top - scrollTarget.getBoundingClientRect().top;
40
+ const elementHeight = rect.height;
41
+ const start = viewportHeight * 0.8;
42
+ const end = viewportHeight * 0.2;
43
+ const scrollProgress = (start - elementTop) / (start - end + elementHeight * 0.5);
44
+ setProgress(Math.max(0, Math.min(1, scrollProgress)));
45
+ };
46
+ scrollTarget.addEventListener("scroll", handleScroll, { passive: true });
47
+ handleScroll();
48
+ return () => scrollTarget.removeEventListener("scroll", handleScroll);
49
+ }, [prefersReducedMotion]);
50
+ return (_jsx("div", { ref: ref, className: cn("relative", className), ...props, children: _jsx("div", { ref: containerRef, className: "py-20", children: _jsx("p", { className: "flex flex-wrap text-3xl font-bold leading-relaxed md:text-4xl lg:text-5xl", children: words.map((word, i) => {
51
+ const wordProgress = i / words.length;
52
+ const opacity = Math.max(0.15, Math.min(1, (progress - wordProgress) * words.length * 0.5 + 0.15));
53
+ return (_jsx("span", { className: "mr-[0.25em] transition-opacity duration-200", style: { opacity }, children: word }, i));
54
+ }) }) }) }));
55
+ });
56
+ TextReveal.displayName = "TextReveal";
@@ -0,0 +1,13 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const textVariants: (props?: ({
4
+ variant?: "default" | "glass" | "ghost" | "muted" | null | undefined;
5
+ size?: "sm" | "md" | "lg" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ export type TextProps = React.HTMLAttributes<HTMLParagraphElement> & VariantProps<typeof textVariants>;
8
+ export declare const Text: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & VariantProps<(props?: ({
9
+ variant?: "default" | "glass" | "ghost" | "muted" | null | undefined;
10
+ size?: "sm" | "md" | "lg" | null | undefined;
11
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLParagraphElement>>;
12
+ export {};
13
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/components/text.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIjE,QAAA,MAAM,YAAY;;;8EAmBhB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,GAAG,YAAY,CAAC,OAAO,YAAY,CAAC,CAAA;AAEtG,eAAO,MAAM,IAAI;;;4HAIhB,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cva } from "class-variance-authority";
4
+ import { cn } from "../lib/cn";
5
+ const textVariants = cva("transition-colors duration-fast ease-standard motion-reduce:transition-none", {
6
+ variants: {
7
+ variant: {
8
+ default: "text-[var(--color-foreground)]",
9
+ muted: "text-neutral-600 dark:text-neutral-300",
10
+ glass: "rounded-md border border-white/20 [border-top-color:var(--glass-refraction-top)] bg-[var(--glass-1-surface)] px-2 py-1 text-[var(--color-foreground)] dark:border-white/[0.14] dark:bg-white/[0.05]",
11
+ ghost: "rounded-md px-2 py-1 text-[var(--color-foreground)]/85"
12
+ },
13
+ size: {
14
+ sm: "text-xs leading-5",
15
+ md: "text-sm leading-6",
16
+ lg: "text-base leading-7"
17
+ }
18
+ },
19
+ defaultVariants: {
20
+ variant: "default",
21
+ size: "md"
22
+ }
23
+ });
24
+ export const Text = React.forwardRef(({ className, variant, size, ...props }, ref) => {
25
+ return _jsx("p", { ref: ref, className: cn(textVariants({ variant, size }), className), ...props });
26
+ });
27
+ Text.displayName = "Text";
@@ -0,0 +1,13 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const textareaVariants: (props?: ({
4
+ variant?: "default" | "glass" | "frosted" | "outline" | "ghost" | "matte" | "underline" | "filled" | "liquid" | null | undefined;
5
+ size?: "sm" | "md" | "lg" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ export type TextareaProps = Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, "size"> & VariantProps<typeof textareaVariants>;
8
+ export declare const Textarea: React.ForwardRefExoticComponent<Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, "size"> & VariantProps<(props?: ({
9
+ variant?: "default" | "glass" | "frosted" | "outline" | "ghost" | "matte" | "underline" | "filled" | "liquid" | null | undefined;
10
+ size?: "sm" | "md" | "lg" | null | undefined;
11
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLTextAreaElement>>;
12
+ export {};
13
+ //# sourceMappingURL=textarea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.d.ts","sourceRoot":"","sources":["../../src/components/textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIjE,QAAA,MAAM,gBAAgB;;;8EAwCrB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,GACzF,YAAY,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAEvC,eAAO,MAAM,QAAQ;;;2HAWpB,CAAA"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cva } from "class-variance-authority";
4
+ import { cn } from "../lib/cn";
5
+ const textareaVariants = cva("w-full border font-medium text-[var(--color-foreground)] placeholder:text-neutral-400 transition-[background-color,border-color,box-shadow,color] duration-normal ease-standard focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 motion-reduce:transition-none dark:placeholder:text-neutral-500", {
6
+ variants: {
7
+ variant: {
8
+ default: "rounded-xl border-[var(--color-border)] bg-[var(--color-surface)] shadow-sm focus-visible:border-[var(--color-accent)]/60 focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]/30 focus-visible:ring-offset-1 hover:border-[var(--color-border)]/80 dark:border-white/10 dark:bg-white/[0.04] dark:focus-visible:border-[var(--color-accent)]/50 dark:focus-visible:ring-[var(--color-accent)]/20",
9
+ glass: "relative rounded-xl border-white/24 [border-top-color:var(--glass-refraction-top)] bg-[radial-gradient(circle_at_18%_14%,rgb(255_255_255_/_0.86),transparent_44%),linear-gradient(158deg,rgb(255_255_255_/_0.7),rgb(243_247_250_/_0.46))] backdrop-blur-md backdrop-saturate-[180%] shadow-[0_0_0_1px_rgb(255_255_255_/_0.2)_inset,0_8px_18px_-14px_rgb(15_23_42_/_0.24)] focus-visible:border-white/34 focus-visible:[border-top-color:rgb(255_255_255_/_0.82)] focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]/22 focus-visible:ring-offset-0 hover:border-white/32 dark:border-white/[0.1] dark:bg-white/[0.05] dark:focus-visible:border-white/20 dark:focus-visible:ring-white/15",
10
+ frosted: "relative rounded-xl border-white/30 [border-top-color:var(--glass-refraction-top)] bg-[radial-gradient(circle_at_18%_14%,rgb(255_255_255_/_0.92),transparent_44%),linear-gradient(158deg,rgb(255_255_255_/_0.85),rgb(243_247_250_/_0.65))] backdrop-blur-[40px] backdrop-saturate-[200%] shadow-[0_0_0_1px_rgb(255_255_255_/_0.25)_inset,0_0_16px_rgb(255_255_255_/_0.1)_inset,0_8px_18px_-14px_rgb(15_23_42_/_0.28)] focus-visible:border-white/40 focus-visible:[border-top-color:rgb(255_255_255_/_0.88)] focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]/24 focus-visible:ring-offset-0 hover:border-white/36 dark:border-white/[0.14] dark:bg-white/[0.08] dark:focus-visible:border-white/24 dark:focus-visible:ring-white/18",
11
+ liquid: "relative rounded-xl border-white/24 [border-top-color:var(--glass-refraction-top)] bg-[radial-gradient(circle_at_18%_12%,rgb(255_255_255_/_0.92),transparent_42%),radial-gradient(circle_at_84%_88%,rgb(226_232_240_/_0.58),transparent_58%),linear-gradient(145deg,rgb(255_255_255_/_0.82),rgb(235_241_246_/_0.55))] backdrop-blur-xl backdrop-saturate-[180%] shadow-[0_0_0_1px_rgb(255_255_255_/_0.24)_inset,0_10px_20px_-14px_rgb(15_23_42_/_0.26)] focus-visible:border-white/36 focus-visible:[border-top-color:rgb(255_255_255_/_0.88)] focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]/24 focus-visible:ring-offset-0 hover:border-white/34 dark:border-white/[0.12] dark:bg-[linear-gradient(145deg,rgb(255_255_255_/_0.13),rgb(255_255_255_/_0.05))] dark:focus-visible:border-white/[0.24] dark:focus-visible:ring-white/16",
12
+ matte: "rounded-xl border-black/12 bg-[linear-gradient(180deg,rgb(249_250_251),rgb(237_239_242))] shadow-[0_1px_0_rgb(255_255_255_/_0.88)_inset,0_6px_14px_-12px_rgb(15_23_42_/_0.24)] focus-visible:border-black/25 focus-visible:ring-2 focus-visible:ring-black/12 focus-visible:ring-offset-0 hover:border-black/16 dark:border-white/[0.14] dark:bg-[linear-gradient(180deg,rgb(49_54_63_/_0.92),rgb(34_38_46_/_0.92))] dark:focus-visible:border-white/[0.28] dark:focus-visible:ring-white/14",
13
+ outline: "rounded-xl border-[var(--color-border)] bg-transparent shadow-sm focus-visible:border-[var(--color-accent)]/70 focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]/25 focus-visible:ring-offset-1 hover:border-[var(--color-foreground)]/20 dark:border-white/15 dark:focus-visible:border-[var(--color-accent)]/50",
14
+ ghost: "rounded-xl border-transparent bg-transparent focus-visible:border-white/10 focus-visible:bg-[var(--glass-1-surface)] focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]/20 focus-visible:ring-offset-0 hover:border-white/10 hover:bg-[var(--glass-1-surface)] dark:hover:bg-white/[0.06] dark:focus-visible:bg-white/[0.06]",
15
+ underline: "rounded-none border-x-0 border-t-0 border-b border-b-[var(--color-border)] bg-transparent px-0 shadow-none focus-visible:border-b-[var(--color-accent)] focus-visible:ring-0 focus-visible:ring-offset-0 hover:border-b-[var(--color-foreground)]/30 dark:border-b-white/20 dark:focus-visible:border-b-[var(--color-accent)]",
16
+ filled: "rounded-xl border-transparent bg-[var(--color-foreground)]/[0.07] focus-visible:border-[var(--color-accent)]/50 focus-visible:bg-[var(--color-foreground)]/[0.09] focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]/25 focus-visible:ring-offset-0 hover:bg-[var(--color-foreground)]/[0.10] dark:bg-white/[0.08] dark:focus-visible:bg-white/[0.11] dark:hover:bg-white/[0.11]"
17
+ },
18
+ size: {
19
+ sm: "px-3 py-1.5 text-xs",
20
+ md: "px-3.5 py-2 text-sm",
21
+ lg: "px-4 py-2.5 text-base"
22
+ }
23
+ },
24
+ compoundVariants: [
25
+ { variant: "underline", size: "sm", class: "px-0" },
26
+ { variant: "underline", size: "md", class: "px-0" },
27
+ { variant: "underline", size: "lg", class: "px-0" }
28
+ ],
29
+ defaultVariants: {
30
+ variant: "default",
31
+ size: "md"
32
+ }
33
+ });
34
+ export const Textarea = React.forwardRef(({ className, rows = 4, variant, size, ...props }, ref) => {
35
+ return (_jsx("textarea", { ref: ref, rows: rows, className: cn(textareaVariants({ variant, size }), className), ...props }));
36
+ });
37
+ Textarea.displayName = "Textarea";
@@ -0,0 +1,23 @@
1
+ import * as React from "react";
2
+ import * as ToastPrimitives from "@radix-ui/react-toast";
3
+ import { type VariantProps } from "class-variance-authority";
4
+ export declare const ToastProvider: React.FC<ToastPrimitives.ToastProviderProps>;
5
+ declare const toastVariants: (props?: ({
6
+ variant?: "default" | "glass" | "frosted" | "matte" | null | undefined;
7
+ size?: "sm" | "md" | "lg" | null | undefined;
8
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
9
+ export type ToastViewportProps = React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>;
10
+ export declare const ToastViewport: React.ForwardRefExoticComponent<Omit<ToastPrimitives.ToastViewportProps & React.RefAttributes<HTMLOListElement>, "ref"> & React.RefAttributes<HTMLOListElement>>;
11
+ export type ToastProps = React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> & VariantProps<typeof toastVariants>;
12
+ export declare const Toast: React.ForwardRefExoticComponent<Omit<ToastPrimitives.ToastProps & React.RefAttributes<HTMLLIElement>, "ref"> & VariantProps<(props?: ({
13
+ variant?: "default" | "glass" | "frosted" | "matte" | null | undefined;
14
+ size?: "sm" | "md" | "lg" | null | undefined;
15
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLLIElement>>;
16
+ export type ToastTitleProps = React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>;
17
+ export declare const ToastTitle: React.ForwardRefExoticComponent<Omit<ToastPrimitives.ToastTitleProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
18
+ export type ToastDescriptionProps = React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>;
19
+ export declare const ToastDescription: React.ForwardRefExoticComponent<Omit<ToastPrimitives.ToastDescriptionProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
20
+ export type ToastCloseProps = React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>;
21
+ export declare const ToastClose: React.ForwardRefExoticComponent<Omit<ToastPrimitives.ToastCloseProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
22
+ export {};
23
+ //# sourceMappingURL=toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../src/components/toast.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAKjE,eAAO,MAAM,aAAa,8CAA2B,CAAA;AAErD,QAAA,MAAM,aAAa;;;8EAyBlB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAA;AAEhG,eAAO,MAAM,aAAa,kKAYxB,CAAA;AAIF,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,GAClF,YAAY,CAAC,OAAO,aAAa,CAAC,CAAA;AAEpC,eAAO,MAAM,KAAK;;;qHAYhB,CAAA;AAIF,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AAE1F,eAAO,MAAM,UAAU,2JASrB,CAAA;AAIF,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,wBAAwB,CAChE,OAAO,eAAe,CAAC,WAAW,CACnC,CAAA;AAED,eAAO,MAAM,gBAAgB,iKAS3B,CAAA;AAIF,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AAE1F,eAAO,MAAM,UAAU,iKAerB,CAAA"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import * as ToastPrimitives from "@radix-ui/react-toast";
4
+ import { cva } from "class-variance-authority";
5
+ import { X } from "lucide-react";
6
+ import { cn } from "../lib/cn";
7
+ export const ToastProvider = ToastPrimitives.Provider;
8
+ const toastVariants = cva("group pointer-events-auto relative isolate flex w-full items-start justify-between gap-3 overflow-hidden rounded-2xl border transition-[transform,opacity,box-shadow,border-color,background-color] duration-normal ease-standard data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:slide-in-from-bottom-3 data-[state=closed]:fade-out-0 data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] motion-reduce:transition-none motion-reduce:data-[state=open]:animate-none motion-reduce:data-[state=closed]:animate-none", {
9
+ variants: {
10
+ variant: {
11
+ default: "border-black/10 bg-[linear-gradient(180deg,rgb(255_255_255),rgb(244_244_246))] text-[var(--color-foreground)] shadow-[0_1px_0_rgb(255_255_255_/_0.9)_inset,0_10px_26px_-18px_rgb(15_23_42_/_0.38)] dark:border-white/[0.14] dark:bg-[linear-gradient(180deg,rgb(56_62_72_/_0.94),rgb(37_42_50_/_0.94))] dark:shadow-[0_1px_0_rgb(255_255_255_/_0.08)_inset,0_12px_28px_-18px_rgb(0_0_0_/_0.68)]",
12
+ glass: "border-white/20 [border-top-color:var(--glass-refraction-top)] bg-[linear-gradient(155deg,rgb(255_255_255_/_0.64),rgb(246_246_246_/_0.35))] text-[var(--color-foreground)] backdrop-blur-lg backdrop-saturate-[180%] shadow-[0_0_0_1px_rgb(255_255_255_/_0.2)_inset,0_10px_26px_-18px_rgb(15_23_42_/_0.32)] dark:border-white/[0.12] dark:bg-[linear-gradient(155deg,rgb(255_255_255_/_0.14),rgb(255_255_255_/_0.05))] dark:shadow-[0_0_0_1px_rgb(255_255_255_/_0.09)_inset,0_12px_28px_-18px_rgb(0_0_0_/_0.66)]",
13
+ frosted: "border-white/30 [border-top-color:var(--glass-refraction-top)] bg-[linear-gradient(155deg,rgb(255_255_255_/_0.8),rgb(246_246_246_/_0.55))] text-[var(--color-foreground)] backdrop-blur-[40px] backdrop-saturate-[200%] shadow-[0_0_0_1px_rgb(255_255_255_/_0.25)_inset,0_0_16px_rgb(255_255_255_/_0.12)_inset,0_10px_26px_-18px_rgb(15_23_42_/_0.36)] dark:border-white/[0.16] dark:bg-[linear-gradient(155deg,rgb(255_255_255_/_0.2),rgb(255_255_255_/_0.08))] dark:shadow-[0_0_0_1px_rgb(255_255_255_/_0.12)_inset,0_0_16px_rgb(255_255_255_/_0.05)_inset,0_12px_28px_-18px_rgb(0_0_0_/_0.7)]",
14
+ matte: "border-black/12 bg-[linear-gradient(180deg,rgb(248_248_249),rgb(232_232_235))] text-[var(--color-foreground)] shadow-[0_1px_0_rgb(255_255_255_/_0.88)_inset,0_10px_24px_-18px_rgb(15_23_42_/_0.34)] dark:border-white/[0.16] dark:bg-[linear-gradient(180deg,rgb(50_55_63_/_0.96),rgb(33_37_44_/_0.96))] dark:shadow-[0_1px_0_rgb(255_255_255_/_0.1)_inset,0_12px_26px_-18px_rgb(0_0_0_/_0.7)]"
15
+ },
16
+ size: {
17
+ sm: "p-3.5 pr-5",
18
+ md: "p-4 pr-6",
19
+ lg: "p-5 pr-7"
20
+ }
21
+ },
22
+ defaultVariants: {
23
+ variant: "glass",
24
+ size: "md"
25
+ }
26
+ });
27
+ export const ToastViewport = React.forwardRef(({ className, ...props }, ref) => (_jsx(ToastPrimitives.Viewport, { ref: ref, className: cn("pointer-events-none fixed bottom-0 right-0 z-[100] flex max-h-screen w-full flex-col gap-2 p-4 sm:bottom-3 sm:right-3 sm:max-w-[440px]", className), ...props })));
28
+ ToastViewport.displayName = "ToastViewport";
29
+ export const Toast = React.forwardRef(({ className, variant, size, ...props }, ref) => (_jsx(ToastPrimitives.Root, { ref: ref, className: cn(toastVariants({ variant, size }), className), ...props })));
30
+ Toast.displayName = "Toast";
31
+ export const ToastTitle = React.forwardRef(({ className, ...props }, ref) => (_jsx(ToastPrimitives.Title, { ref: ref, className: cn("text-sm font-semibold leading-tight tracking-tight", className), ...props })));
32
+ ToastTitle.displayName = "ToastTitle";
33
+ export const ToastDescription = React.forwardRef(({ className, ...props }, ref) => (_jsx(ToastPrimitives.Description, { ref: ref, className: cn("text-sm leading-relaxed text-neutral-600 dark:text-neutral-300", className), ...props })));
34
+ ToastDescription.displayName = "ToastDescription";
35
+ export const ToastClose = React.forwardRef(({ className, ...props }, ref) => (_jsxs(ToastPrimitives.Close, { ref: ref, className: cn("absolute right-2 top-2 inline-flex h-7 w-7 items-center justify-center rounded-md border border-transparent bg-black/[0.04] text-neutral-500 transition-[color,background-color,border-color] duration-fast ease-standard hover:border-black/10 hover:bg-black/[0.08] hover:text-neutral-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-accent)] focus-visible:ring-offset-2 dark:bg-white/[0.06] dark:text-neutral-300 dark:hover:border-white/[0.18] dark:hover:bg-white/[0.12] dark:hover:text-neutral-100", className), ...props, children: [_jsx(X, { className: "h-3.5 w-3.5" }), _jsx("span", { className: "sr-only", children: "Close" })] })));
36
+ ToastClose.displayName = "ToastClose";
@@ -0,0 +1,35 @@
1
+ import * as React from "react";
2
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
3
+ import { type VariantProps } from "class-variance-authority";
4
+ export declare const TooltipProvider: React.FC<TooltipPrimitive.TooltipProviderProps>;
5
+ export type TooltipProps = Omit<React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>, "onOpenChange"> & {
6
+ /** Controlled open state. */
7
+ open?: boolean;
8
+ /** Initial open state for uncontrolled usage. */
9
+ defaultOpen?: boolean;
10
+ /** Callback when open state changes. */
11
+ onOpenChange?: (open: boolean) => void;
12
+ /** Delay in ms before showing tooltip content. */
13
+ delayDuration?: number;
14
+ };
15
+ export declare const Tooltip: ({ delayDuration, ...props }: TooltipProps) => import("react/jsx-runtime").JSX.Element;
16
+ export declare const TooltipTrigger: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>>;
17
+ declare const tooltipContentVariants: (props?: ({
18
+ variant?: "default" | "glass" | "frosted" | null | undefined;
19
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
20
+ export type TooltipContentProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> & VariantProps<typeof tooltipContentVariants> & {
21
+ /** Preferred side for tooltip content. */
22
+ side?: "top" | "right" | "bottom" | "left";
23
+ /** Gap in px between trigger and content. */
24
+ sideOffset?: number;
25
+ };
26
+ export declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & VariantProps<(props?: ({
27
+ variant?: "default" | "glass" | "frosted" | null | undefined;
28
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
29
+ /** Preferred side for tooltip content. */
30
+ side?: "top" | "right" | "bottom" | "left";
31
+ /** Gap in px between trigger and content. */
32
+ sideOffset?: number;
33
+ } & React.RefAttributes<HTMLDivElement>>;
34
+ export {};
35
+ //# sourceMappingURL=tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../src/components/tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIjE,eAAO,MAAM,eAAe,iDAA4B,CAAA;AACxD,MAAM,MAAM,YAAY,GAAG,IAAI,CAC7B,KAAK,CAAC,wBAAwB,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC,EAC5D,cAAc,CACf,GAAG;IACF,6BAA6B;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,iDAAiD;IACjD,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,wCAAwC;IACxC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,6BAA6B,YAAY,4CAEhE,CAAA;AAED,eAAO,MAAM,cAAc,gHAA2B,CAAA;AAEtD,QAAA,MAAM,sBAAsB;;8EA0B3B,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,GAC/F,YAAY,CAAC,OAAO,sBAAsB,CAAC,GAAG;IAC5C,0CAA0C;IAC1C,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;IAC1C,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAEH,eAAO,MAAM,cAAc;;;IANvB,0CAA0C;WACnC,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM;IAC1C,6CAA6C;iBAChC,MAAM;wCAerB,CAAA"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
4
+ import { cva } from "class-variance-authority";
5
+ import { cn } from "../lib/cn";
6
+ export const TooltipProvider = TooltipPrimitive.Provider;
7
+ export const Tooltip = ({ delayDuration, ...props }) => (_jsx(TooltipPrimitive.Root, { delayDuration: delayDuration, ...props }));
8
+ export const TooltipTrigger = TooltipPrimitive.Trigger;
9
+ const tooltipContentVariants = cva("z-50 overflow-hidden rounded-md px-3 py-1.5 text-xs shadow-md", {
10
+ variants: {
11
+ variant: {
12
+ default: "bg-neutral-900 text-white dark:bg-neutral-100 dark:text-neutral-900",
13
+ glass: [
14
+ "border border-white/20 [border-top-color:var(--glass-refraction-top)]",
15
+ "bg-[var(--glass-3-surface)] text-[var(--color-foreground)]",
16
+ "backdrop-blur-xl backdrop-saturate-[180%]",
17
+ "shadow-[0_0_0_1px_rgb(255_255_255_/_0.1)_inset,var(--shadow-glass-sm)]",
18
+ "dark:border-white/[0.1] dark:shadow-[0_0_0_1px_rgb(255_255_255_/_0.05)_inset,0_4px_12px_rgb(0_0_0_/_0.35)]"
19
+ ].join(" "),
20
+ frosted: [
21
+ "border border-white/30 [border-top-color:var(--glass-refraction-top)]",
22
+ "bg-[var(--glass-4-surface)] text-[var(--color-foreground)]",
23
+ "backdrop-blur-[40px] backdrop-saturate-[200%]",
24
+ "shadow-[0_0_0_1px_rgb(255_255_255_/_0.15)_inset,0_0_12px_rgb(255_255_255_/_0.1)_inset,var(--shadow-glass-sm)]",
25
+ "dark:border-white/[0.14] dark:shadow-[0_0_0_1px_rgb(255_255_255_/_0.07)_inset,0_0_12px_rgb(255_255_255_/_0.03)_inset,0_4px_12px_rgb(0_0_0_/_0.35)]"
26
+ ].join(" ")
27
+ }
28
+ },
29
+ defaultVariants: {
30
+ variant: "default"
31
+ }
32
+ });
33
+ export const TooltipContent = React.forwardRef(({ className, variant, sideOffset = 6, ...props }, ref) => (_jsx(TooltipPrimitive.Portal, { children: _jsx(TooltipPrimitive.Content, { ref: ref, sideOffset: sideOffset, className: cn(tooltipContentVariants({ variant }), className), ...props }) })));
34
+ TooltipContent.displayName = "TooltipContent";
@@ -0,0 +1,50 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const treeVariants: (props?: ({
4
+ variant?: "default" | "glass" | "outline" | "ghost" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ export type TreeNode = {
7
+ /** Display label */
8
+ label: string;
9
+ /** Optional href — makes the node a link */
10
+ href?: string;
11
+ /** Open link in new tab */
12
+ external?: boolean;
13
+ /** Optional badge text shown after the label */
14
+ badge?: string;
15
+ /** Badge color variant */
16
+ badgeVariant?: "default" | "success" | "warning" | "info" | "destructive";
17
+ /** Nested children — presence makes this a folder */
18
+ children?: TreeNode[];
19
+ /** Custom icon override */
20
+ icon?: React.ReactNode;
21
+ };
22
+ export type TreeProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof treeVariants> & {
23
+ /** Extra classes for the tree root wrapper. */
24
+ className?: string;
25
+ /** Tree data */
26
+ nodes: TreeNode[];
27
+ /** Expand all folders by default */
28
+ defaultExpanded?: boolean;
29
+ };
30
+ export declare const Tree: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
31
+ variant?: "default" | "glass" | "outline" | "ghost" | null | undefined;
32
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
33
+ /** Extra classes for the tree root wrapper. */
34
+ className?: string;
35
+ /** Tree data */
36
+ nodes: TreeNode[];
37
+ /** Expand all folders by default */
38
+ defaultExpanded?: boolean;
39
+ } & React.RefAttributes<HTMLDivElement>>;
40
+ export declare function buildFileTree(paths: string[], options?: {
41
+ /** Base href prefix for leaf nodes */
42
+ hrefPrefix?: string;
43
+ /** Custom badge function per file path */
44
+ getBadge?: (path: string) => {
45
+ badge: string;
46
+ badgeVariant?: TreeNode["badgeVariant"];
47
+ } | null;
48
+ }): TreeNode[];
49
+ export {};
50
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/components/tree.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAOjE,QAAA,MAAM,YAAY;;8EAYhB,CAAA;AAIF,MAAM,MAAM,QAAQ,GAAG;IACrB,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0BAA0B;IAC1B,YAAY,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,aAAa,CAAA;IACzE,qDAAqD;IACrD,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAA;IACrB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAC1D,YAAY,CAAC,OAAO,YAAY,CAAC,GAAG;IAClC,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,oCAAoC;IACpC,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAgGH,eAAO,MAAM,IAAI;;;IAtGb,+CAA+C;gBACnC,MAAM;IAClB,gBAAgB;WACT,QAAQ,EAAE;IACjB,oCAAoC;sBAClB,OAAO;wCA6G5B,CAAA;AAMD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE;IACR,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAA;KAAE,GAAG,IAAI,CAAA;CAC/F,GACA,QAAQ,EAAE,CA+BZ"}
@@ -0,0 +1,77 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cva } from "class-variance-authority";
5
+ import { ChevronRight, Folder, FolderOpen, FileText } from "lucide-react";
6
+ import { cn } from "../lib/cn";
7
+ /* ── Variants ──────────────────────────────────────────────────────────── */
8
+ const treeVariants = cva("w-full rounded-lg border text-sm", {
9
+ variants: {
10
+ variant: {
11
+ default: "border-border/60 bg-[var(--color-surface)]",
12
+ glass: "backdrop-blur-md border-white/10 bg-[var(--glass-1-surface)]",
13
+ outline: "border-border/60 bg-transparent",
14
+ ghost: "border-transparent bg-transparent"
15
+ }
16
+ },
17
+ defaultVariants: {
18
+ variant: "default"
19
+ }
20
+ });
21
+ /* ── TreeNodeItem (recursive) ──────────────────────────────────────────── */
22
+ const badgeColors = {
23
+ default: "bg-neutral-100/60 text-neutral-600 dark:bg-white/[0.06] dark:text-neutral-400",
24
+ success: "bg-emerald-100/60 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400",
25
+ warning: "bg-amber-100/60 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400",
26
+ info: "bg-blue-100/60 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",
27
+ destructive: "bg-red-100/60 text-red-700 dark:bg-red-900/30 dark:text-red-400"
28
+ };
29
+ function TreeNodeItem({ node, depth, defaultExpanded }) {
30
+ const isFolder = node.children && node.children.length > 0;
31
+ const [expanded, setExpanded] = React.useState(defaultExpanded);
32
+ const paddingLeft = 12 + depth * 16;
33
+ const content = (_jsxs(_Fragment, { children: [isFolder ? (_jsx("span", { className: "text-neutral-400 dark:text-neutral-500", children: expanded ? _jsx(FolderOpen, { className: "size-4" }) : _jsx(Folder, { className: "size-4" }) })) : (_jsx("span", { className: "text-neutral-400 dark:text-neutral-500", children: node.icon ?? _jsx(FileText, { className: "size-3.5" }) })), _jsx("span", { className: cn("truncate", isFolder ? "font-medium text-foreground" : "font-mono text-neutral-700 dark:text-neutral-300"), children: node.label }), node.badge && (_jsx("span", { className: cn("ml-auto shrink-0 rounded-md border border-current/10 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider", badgeColors[node.badgeVariant ?? "default"]), children: node.badge }))] }));
34
+ if (isFolder) {
35
+ return (_jsxs("div", { children: [_jsxs("button", { type: "button", onClick: () => setExpanded(!expanded), className: "flex w-full items-center gap-2 py-1.5 text-left transition-colors hover:bg-black/[0.03] dark:hover:bg-white/[0.03]", style: { paddingLeft }, children: [_jsx(ChevronRight, { className: cn("size-3 shrink-0 text-neutral-400 transition-transform duration-150", expanded && "rotate-90") }), content] }), expanded && (_jsx("div", { children: node.children.map((child, i) => (_jsx(TreeNodeItem, { node: child, depth: depth + 1, defaultExpanded: defaultExpanded }, `${child.label}-${i}`))) }))] }));
36
+ }
37
+ const sharedClassName = "flex w-full items-center gap-2 py-1.5 transition-colors hover:bg-black/[0.03] dark:hover:bg-white/[0.03]";
38
+ if (node.href) {
39
+ return (_jsx("a", { href: node.href, target: node.external ? "_blank" : undefined, rel: node.external ? "noopener noreferrer" : undefined, className: sharedClassName, style: { paddingLeft: paddingLeft + 15 }, children: content }));
40
+ }
41
+ return (_jsx("div", { className: sharedClassName, style: { paddingLeft: paddingLeft + 15 }, children: content }));
42
+ }
43
+ /* ── Tree ──────────────────────────────────────────────────────────────── */
44
+ export const Tree = React.forwardRef(({ className, variant, nodes, defaultExpanded = true, ...props }, ref) => {
45
+ return (_jsx("div", { ref: ref, className: cn(treeVariants({ variant }), className), ...props, children: _jsx("div", { className: "py-1", children: nodes.map((node, i) => (_jsx(TreeNodeItem, { node: node, depth: 0, defaultExpanded: defaultExpanded }, `${node.label}-${i}`))) }) }));
46
+ });
47
+ Tree.displayName = "Tree";
48
+ /* ── Utility: build tree from flat file paths ─────────────────────────── */
49
+ export function buildFileTree(paths, options) {
50
+ const root = { label: "", children: [] };
51
+ for (const filePath of paths) {
52
+ const parts = filePath.split("/");
53
+ let current = root;
54
+ for (let i = 0; i < parts.length; i++) {
55
+ const part = parts[i];
56
+ const isLeaf = i === parts.length - 1;
57
+ if (isLeaf) {
58
+ const badgeInfo = options?.getBadge?.(filePath);
59
+ current.children.push({
60
+ label: part,
61
+ href: options?.hrefPrefix ? `${options.hrefPrefix}/${filePath}` : undefined,
62
+ external: !!options?.hrefPrefix,
63
+ ...(badgeInfo ?? {})
64
+ });
65
+ }
66
+ else {
67
+ let folder = current.children.find((c) => c.label === part && c.children);
68
+ if (!folder) {
69
+ folder = { label: part, children: [] };
70
+ current.children.push(folder);
71
+ }
72
+ current = folder;
73
+ }
74
+ }
75
+ }
76
+ return root.children;
77
+ }
@@ -0,0 +1,25 @@
1
+ import * as React from "react";
2
+ export interface TypewriterProps extends React.HTMLAttributes<HTMLSpanElement> {
3
+ /** The text to type out (single string mode). */
4
+ text?: string;
5
+ /** Array of words/phrases to cycle through (multi-word mode). */
6
+ words?: string[];
7
+ /** Milliseconds per character when typing. Default: 50 */
8
+ speed?: number;
9
+ /** Milliseconds per character when deleting. Default: 30 */
10
+ deleteSpeed?: number;
11
+ /** Initial delay before typing starts, in ms. Default: 0 */
12
+ delay?: number;
13
+ /** Show a blinking cursor. Default: true */
14
+ cursor?: boolean;
15
+ /** The cursor character. Default: "|" */
16
+ cursorChar?: string;
17
+ /** Loop the typing animation. Default: false */
18
+ loop?: boolean;
19
+ /** Pause at end before deleting/retyping, in ms. Default: 1500 */
20
+ pauseDuration?: number;
21
+ /** Callback fired when a word finishes typing (fires per cycle). */
22
+ onComplete?: () => void;
23
+ }
24
+ export declare const Typewriter: React.ForwardRefExoticComponent<TypewriterProps & React.RefAttributes<HTMLSpanElement>>;
25
+ //# sourceMappingURL=typewriter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typewriter.d.ts","sourceRoot":"","sources":["../../src/components/typewriter.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,MAAM,WAAW,eAAgB,SAAQ,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;IAC5E,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gDAAgD;IAChD,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;CACxB;AAID,eAAO,MAAM,UAAU,yFA6JtB,CAAA"}