@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,11 @@
1
+ import * as React from "react";
2
+ export interface MeteorShowerProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ count?: number;
4
+ angle?: number;
5
+ minDuration?: number;
6
+ maxDuration?: number;
7
+ minDelay?: number;
8
+ maxDelay?: number;
9
+ }
10
+ export declare const MeteorShower: React.ForwardRefExoticComponent<MeteorShowerProps & React.RefAttributes<HTMLDivElement>>;
11
+ //# sourceMappingURL=meteor-shower.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meteor-shower.d.ts","sourceRoot":"","sources":["../../src/components/meteor-shower.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,MAAM,WAAW,iBAAkB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,YAAY,0FAyExB,CAAA"}
@@ -0,0 +1,39 @@
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 MeteorShower = React.forwardRef(({ className, count = 12, angle = 215, minDuration = 2, maxDuration = 5, minDelay = 0, maxDelay = 4, ...props }, ref) => {
7
+ const prefersReducedMotion = usePrefersReducedMotion();
8
+ const meteors = React.useMemo(() => {
9
+ return Array.from({ length: count }).map((_, i) => ({
10
+ id: i,
11
+ top: `${-30 + Math.random() * -10}%`,
12
+ left: `${10 + Math.random() * 90}%`,
13
+ duration: minDuration + Math.random() * (maxDuration - minDuration),
14
+ delay: minDelay + Math.random() * (maxDelay - minDelay),
15
+ size: 1 + Math.random() * 2
16
+ }));
17
+ }, [count, minDuration, maxDuration, minDelay, maxDelay]);
18
+ if (prefersReducedMotion)
19
+ return null;
20
+ return (_jsx("div", { ref: ref, className: cn("pointer-events-none absolute inset-0 overflow-hidden", className), "aria-hidden": true, ...props, children: meteors.map((meteor) => (_jsx("span", { className: "absolute animate-[meteor-fall_var(--meteor-duration,3s)_linear_infinite]", style: {
21
+ "--meteor-angle": `${angle}deg`,
22
+ "--meteor-duration": `${meteor.duration}s`,
23
+ top: meteor.top,
24
+ left: meteor.left,
25
+ animationDelay: `${meteor.delay}s`,
26
+ width: `${meteor.size}px`,
27
+ height: `${meteor.size}px`,
28
+ borderRadius: "50%",
29
+ background: "var(--color-foreground)",
30
+ boxShadow: `0 0 0 1px rgba(255,255,255,0.1), 0 0 ${meteor.size * 10}px ${meteor.size * 2}px rgba(255,255,255,0.1)`,
31
+ }, children: _jsx("span", { className: "absolute top-1/2 block -translate-y-1/2", style: {
32
+ width: `${30 + Math.random() * 40}px`,
33
+ height: `${meteor.size * 0.5}px`,
34
+ right: "100%",
35
+ background: `linear-gradient(to right, transparent, var(--color-foreground))`,
36
+ opacity: 0.4
37
+ } }) }, meteor.id))) }));
38
+ });
39
+ MeteorShower.displayName = "MeteorShower";
@@ -0,0 +1,30 @@
1
+ import * as React from "react";
2
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
3
+ import { type VariantProps } from "class-variance-authority";
4
+ export type ModalProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>;
5
+ export declare const Modal: React.FC<DialogPrimitive.DialogProps>;
6
+ export declare const ModalTrigger: React.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
7
+ export declare const ModalClose: React.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
8
+ export type ModalPortalProps = DialogPrimitive.DialogPortalProps;
9
+ export declare const ModalPortal: (props: ModalPortalProps) => import("react/jsx-runtime").JSX.Element;
10
+ declare const modalContentVariants: (props?: ({
11
+ variant?: "default" | "glass" | "frosted" | "matte" | null | undefined;
12
+ size?: "sm" | "md" | "lg" | null | undefined;
13
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
14
+ export type ModalOverlayProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>;
15
+ export declare const ModalOverlay: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
16
+ export type ModalContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & VariantProps<typeof modalContentVariants>;
17
+ export declare const ModalContent: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & VariantProps<(props?: ({
18
+ variant?: "default" | "glass" | "frosted" | "matte" | null | undefined;
19
+ size?: "sm" | "md" | "lg" | null | undefined;
20
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
21
+ export type ModalHeaderProps = React.HTMLAttributes<HTMLDivElement>;
22
+ export declare const ModalHeader: ({ className, ...props }: ModalHeaderProps) => import("react/jsx-runtime").JSX.Element;
23
+ export type ModalFooterProps = React.HTMLAttributes<HTMLDivElement>;
24
+ export declare const ModalFooter: ({ className, ...props }: ModalFooterProps) => import("react/jsx-runtime").JSX.Element;
25
+ export type ModalTitleProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>;
26
+ export declare const ModalTitle: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
27
+ export type ModalDescriptionProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>;
28
+ export declare const ModalDescription: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
29
+ export {};
30
+ //# sourceMappingURL=modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../src/components/modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAKjE,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAA;AAEpF,eAAO,MAAM,KAAK,uCAAuB,CAAA;AACzC,eAAO,MAAM,YAAY,8GAA0B,CAAA;AACnD,eAAO,MAAM,UAAU,4GAAwB,CAAA;AAE/C,MAAM,MAAM,gBAAgB,GAAG,eAAe,CAAC,iBAAiB,CAAA;AAEhE,eAAO,MAAM,WAAW,GAAI,OAAO,gBAAgB,4CAElD,CAAA;AAED,QAAA,MAAM,oBAAoB;;;8EAyBzB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,CAAA;AAE9F,eAAO,MAAM,YAAY,8JAYvB,CAAA;AAIF,MAAM,MAAM,iBAAiB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,GAC5F,YAAY,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAE3C,eAAO,MAAM,YAAY;;;sHAqBvB,CAAA;AAIF,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;AAEnE,eAAO,MAAM,WAAW,GAAI,yBAAyB,gBAAgB,4CAEpE,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;AAEnE,eAAO,MAAM,WAAW,GAAI,yBAAyB,gBAAgB,4CAKpE,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AAE1F,eAAO,MAAM,UAAU,oKAKrB,CAAA;AAIF,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,WAAW,CAAC,CAAA;AAEtG,eAAO,MAAM,gBAAgB,8KAS3B,CAAA"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
4
+ import { cva } from "class-variance-authority";
5
+ import { X } from "lucide-react";
6
+ import { cn } from "../lib/cn";
7
+ export const Modal = DialogPrimitive.Root;
8
+ export const ModalTrigger = DialogPrimitive.Trigger;
9
+ export const ModalClose = DialogPrimitive.Close;
10
+ export const ModalPortal = (props) => (_jsx(DialogPrimitive.Portal, { ...props }));
11
+ const modalContentVariants = cva("fixed left-1/2 top-1/2 z-50 grid w-[min(92vw,34rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-2xl border p-6 text-[var(--color-foreground)] outline-none duration-normal ease-standard data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0 data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95 data-[state=open]:slide-in-from-bottom-3 data-[state=closed]:slide-out-to-bottom-3 motion-reduce:transition-none motion-reduce:data-[state=open]:animate-none motion-reduce:data-[state=closed]:animate-none", {
12
+ variants: {
13
+ variant: {
14
+ default: "border-black/10 bg-[linear-gradient(180deg,rgb(255_255_255),rgb(244_244_246))] shadow-[0_1px_0_rgb(255_255_255_/_0.9)_inset,0_24px_50px_-30px_rgb(15_23_42_/_0.45)] dark:border-white/[0.14] dark:bg-[linear-gradient(180deg,rgb(58_64_74_/_0.94),rgb(38_42_50_/_0.94))] dark:shadow-[0_1px_0_rgb(255_255_255_/_0.08)_inset,0_26px_52px_-30px_rgb(0_0_0_/_0.72)]",
15
+ glass: "border-white/20 [border-top-color:var(--glass-refraction-top)] bg-[linear-gradient(155deg,rgb(255_255_255_/_0.65),rgb(244_244_244_/_0.35))] backdrop-blur-xl backdrop-saturate-[180%] shadow-[0_0_0_1px_rgb(255_255_255_/_0.2)_inset,0_24px_50px_-30px_rgb(15_23_42_/_0.35)] 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.1)_inset,0_26px_52px_-30px_rgb(0_0_0_/_0.7)]",
16
+ frosted: "border-white/30 [border-top-color:var(--glass-refraction-top)] bg-[linear-gradient(155deg,rgb(255_255_255_/_0.82),rgb(244_244_244_/_0.55))] backdrop-blur-[40px] backdrop-saturate-[200%] shadow-[0_0_0_1px_rgb(255_255_255_/_0.25)_inset,0_0_20px_rgb(255_255_255_/_0.15)_inset,0_24px_50px_-30px_rgb(15_23_42_/_0.4)] 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_20px_rgb(255_255_255_/_0.06)_inset,0_26px_52px_-30px_rgb(0_0_0_/_0.75)]",
17
+ matte: "border-black/12 bg-[linear-gradient(180deg,rgb(248_248_249),rgb(234_234_236))] shadow-[0_1px_0_rgb(255_255_255_/_0.88)_inset,0_20px_42px_-28px_rgb(15_23_42_/_0.4)] 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_22px_44px_-28px_rgb(0_0_0_/_0.7)]"
18
+ },
19
+ size: {
20
+ sm: "w-[min(92vw,28rem)] p-5",
21
+ md: "w-[min(92vw,34rem)] p-6",
22
+ lg: "w-[min(94vw,42rem)] p-7"
23
+ }
24
+ },
25
+ defaultVariants: {
26
+ variant: "glass",
27
+ size: "md"
28
+ }
29
+ });
30
+ export const ModalOverlay = React.forwardRef(({ className, ...props }, ref) => (_jsx(DialogPrimitive.Overlay, { ref: ref, className: cn("fixed inset-0 z-50 bg-[radial-gradient(circle_at_top,rgb(15_23_42_/_0.24),rgb(2_6_23_/_0.52))] backdrop-blur-[2px] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0 duration-normal ease-standard motion-reduce:data-[state=open]:animate-none motion-reduce:data-[state=closed]:animate-none dark:bg-[radial-gradient(circle_at_top,rgb(15_23_42_/_0.36),rgb(2_6_23_/_0.74))]", className), ...props })));
31
+ ModalOverlay.displayName = "ModalOverlay";
32
+ export const ModalContent = React.forwardRef(({ className, children, variant, size, ...props }, ref) => (_jsxs(ModalPortal, { children: [_jsx(ModalOverlay, {}), _jsxs(DialogPrimitive.Content, { ref: ref, className: cn(modalContentVariants({ variant, size }), className), ...props, children: [children, _jsxs(DialogPrimitive.Close, { className: "absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-lg border border-transparent bg-black/[0.04] text-[var(--color-foreground)]/70 transition-[background-color,color,border-color] duration-fast ease-standard hover:border-black/10 hover:bg-black/[0.07] hover:text-[var(--color-foreground)] 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:hover:border-white/[0.16] dark:hover:bg-white/[0.11]", children: [_jsx(X, { className: "h-4 w-4" }), _jsx("span", { className: "sr-only", children: "Close" })] })] })] })));
33
+ ModalContent.displayName = "ModalContent";
34
+ export const ModalHeader = ({ className, ...props }) => (_jsx("div", { className: cn("flex flex-col gap-1.5 text-left", className), ...props }));
35
+ export const ModalFooter = ({ className, ...props }) => (_jsx("div", { className: cn("mt-2 flex flex-col-reverse gap-2 border-t border-black/10 pt-4 sm:flex-row sm:justify-end dark:border-white/[0.12]", className), ...props }));
36
+ export const ModalTitle = React.forwardRef(({ className, ...props }, ref) => (_jsx(DialogPrimitive.Title, { ref: ref, className: cn("text-lg font-semibold tracking-tight", className), ...props })));
37
+ ModalTitle.displayName = "ModalTitle";
38
+ export const ModalDescription = React.forwardRef(({ className, ...props }, ref) => (_jsx(DialogPrimitive.Description, { ref: ref, className: cn("text-sm leading-relaxed text-neutral-600 dark:text-neutral-300", className), ...props })));
39
+ ModalDescription.displayName = "ModalDescription";
@@ -0,0 +1,22 @@
1
+ import * as React from "react";
2
+ export interface MorphingTabItem {
3
+ id: string;
4
+ label: React.ReactNode;
5
+ disabled?: boolean;
6
+ }
7
+ export interface MorphingTabsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
8
+ /** Tab items */
9
+ items: MorphingTabItem[];
10
+ /** Active tab id */
11
+ activeId?: string;
12
+ /** Default active tab id */
13
+ defaultActiveId?: string;
14
+ /** Callback when active tab changes */
15
+ onTabChange?: (id: string) => void;
16
+ /** Visual variant */
17
+ variant?: "glass" | "solid" | "underline";
18
+ /** Size */
19
+ size?: "sm" | "md" | "lg";
20
+ }
21
+ export declare const MorphingTabs: React.ForwardRefExoticComponent<MorphingTabsProps & React.RefAttributes<HTMLDivElement>>;
22
+ //# sourceMappingURL=morphing-tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"morphing-tabs.d.ts","sourceRoot":"","sources":["../../src/components/morphing-tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IAC/F,gBAAgB;IAChB,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,4BAA4B;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,uCAAuC;IACvC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,WAAW,CAAA;IACzC,WAAW;IACX,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;CAC1B;AAED,eAAO,MAAM,YAAY,0FAmIxB,CAAA"}
@@ -0,0 +1,72 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } 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 MorphingTabs = React.forwardRef(({ className, items, activeId: controlledActiveId, defaultActiveId, onTabChange, variant = "glass", size = "md", ...props }, ref) => {
7
+ const prefersReducedMotion = usePrefersReducedMotion();
8
+ const [internalActive, setInternalActive] = React.useState(defaultActiveId ?? items[0]?.id ?? "");
9
+ const activeId = controlledActiveId ?? internalActive;
10
+ const tabRefs = React.useRef(new Map());
11
+ const containerRef = React.useRef(null);
12
+ const [indicatorStyle, setIndicatorStyle] = React.useState({});
13
+ const updateIndicator = React.useCallback(() => {
14
+ const activeTab = tabRefs.current.get(activeId);
15
+ const container = containerRef.current;
16
+ if (!activeTab || !container)
17
+ return;
18
+ const containerRect = container.getBoundingClientRect();
19
+ const tabRect = activeTab.getBoundingClientRect();
20
+ setIndicatorStyle({
21
+ left: tabRect.left - containerRect.left,
22
+ top: variant === "underline" ? undefined : tabRect.top - containerRect.top,
23
+ bottom: variant === "underline" ? 0 : undefined,
24
+ width: tabRect.width,
25
+ height: variant === "underline" ? 2 : tabRect.height,
26
+ });
27
+ }, [activeId, variant]);
28
+ React.useEffect(() => {
29
+ updateIndicator();
30
+ }, [updateIndicator]);
31
+ React.useEffect(() => {
32
+ const container = containerRef.current;
33
+ if (!container)
34
+ return;
35
+ const observer = new ResizeObserver(() => updateIndicator());
36
+ observer.observe(container);
37
+ return () => observer.disconnect();
38
+ }, [updateIndicator]);
39
+ const handleTabClick = (id) => {
40
+ if (!controlledActiveId)
41
+ setInternalActive(id);
42
+ onTabChange?.(id);
43
+ };
44
+ const sizeClasses = {
45
+ sm: "text-xs px-2.5 py-1",
46
+ md: "text-sm px-3.5 py-1.5",
47
+ lg: "text-base px-5 py-2",
48
+ };
49
+ const indicatorVariantClasses = {
50
+ glass: cn("rounded-lg", "border border-white/20 [border-top-color:var(--glass-refraction-top)]", "bg-[var(--glass-4-surface)]", "backdrop-blur-xl backdrop-saturate-[180%]", "shadow-[0_0_0_1px_rgb(255_255_255_/_0.1)_inset,var(--shadow-glass-sm)]", "dark:border-white/[0.12] dark:[border-top-color:rgb(255_255_255_/_0.18)]", "dark:shadow-[0_0_0_1px_rgb(255_255_255_/_0.06)_inset,0_2px_8px_rgb(0_0_0_/_0.3)]"),
51
+ solid: "rounded-lg bg-neutral-900 dark:bg-neutral-100 shadow-sm",
52
+ underline: "bg-neutral-900 dark:bg-neutral-100 rounded-full",
53
+ };
54
+ const setRefs = React.useCallback((node) => {
55
+ containerRef.current = node;
56
+ if (typeof ref === "function") {
57
+ ref(node);
58
+ return;
59
+ }
60
+ if (ref)
61
+ ref.current = node;
62
+ }, [ref]);
63
+ return (_jsxs("div", { ref: setRefs, role: "tablist", className: cn("relative inline-flex items-center gap-0.5 rounded-xl p-1", "border border-white/10 bg-[var(--glass-2-surface)] backdrop-blur-xl", "shadow-[0_0_0_1px_rgb(255_255_255_/_0.04)_inset,var(--shadow-soft)]", "dark:border-white/[0.06]", variant === "underline" && "rounded-none border-0 border-b border-white/10 bg-transparent p-0 backdrop-blur-none shadow-none dark:border-white/[0.08]", className), ...props, children: [_jsx("div", { "aria-hidden": "true", className: cn("absolute transition-all ease-out", prefersReducedMotion ? "duration-0" : "duration-300", indicatorVariantClasses[variant]), style: indicatorStyle }), items.map((item) => (_jsx("button", { ref: (el) => { if (el)
64
+ tabRefs.current.set(item.id, el);
65
+ else
66
+ tabRefs.current.delete(item.id); }, role: "tab", type: "button", "aria-selected": activeId === item.id, disabled: item.disabled, className: cn("relative z-[1] whitespace-nowrap font-medium transition-colors duration-200", sizeClasses[size], activeId === item.id
67
+ ? variant === "solid"
68
+ ? "text-white dark:text-neutral-950"
69
+ : "text-foreground"
70
+ : "text-foreground/50 hover:text-foreground/80", item.disabled && "pointer-events-none opacity-40"), onClick: () => handleTabClick(item.id), children: item.label }, item.id)))] }));
71
+ });
72
+ MorphingTabs.displayName = "MorphingTabs";
@@ -0,0 +1,11 @@
1
+ import * as React from "react";
2
+ export interface NumberTickerProps extends React.HTMLAttributes<HTMLSpanElement> {
3
+ value: number;
4
+ from?: number;
5
+ duration?: number;
6
+ delay?: number;
7
+ decimals?: number;
8
+ formatOptions?: Intl.NumberFormatOptions;
9
+ }
10
+ export declare const NumberTicker: React.ForwardRefExoticComponent<NumberTickerProps & React.RefAttributes<HTMLSpanElement>>;
11
+ //# sourceMappingURL=number-ticker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-ticker.d.ts","sourceRoot":"","sources":["../../src/components/number-ticker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,MAAM,WAAW,iBAAkB,SAAQ,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;IAC9E,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAA;CACzC;AAED,eAAO,MAAM,YAAY,2FAgFxB,CAAA"}
@@ -0,0 +1,66 @@
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 NumberTicker = React.forwardRef(({ className, value, from = 0, duration = 1.5, delay = 0, decimals = 0, formatOptions, ...props }, ref) => {
7
+ const innerRef = React.useRef(null);
8
+ const combinedRef = useCombinedRef(ref, innerRef);
9
+ const [display, setDisplay] = React.useState(from);
10
+ const [hasAnimated, setHasAnimated] = React.useState(false);
11
+ const prefersReducedMotion = usePrefersReducedMotion();
12
+ React.useEffect(() => {
13
+ if (prefersReducedMotion) {
14
+ setDisplay(value);
15
+ return;
16
+ }
17
+ const el = innerRef.current;
18
+ if (!el)
19
+ return;
20
+ const observer = new IntersectionObserver(([entry]) => {
21
+ if (entry.isIntersecting && !hasAnimated) {
22
+ setHasAnimated(true);
23
+ const timeout = window.setTimeout(() => {
24
+ const startTime = performance.now();
25
+ const durationMs = duration * 1000;
26
+ const tick = (now) => {
27
+ const elapsed = now - startTime;
28
+ const progress = Math.min(elapsed / durationMs, 1);
29
+ const eased = 1 - Math.pow(1 - progress, 3);
30
+ const current = from + (value - from) * eased;
31
+ setDisplay(current);
32
+ if (progress < 1) {
33
+ requestAnimationFrame(tick);
34
+ }
35
+ };
36
+ requestAnimationFrame(tick);
37
+ }, delay * 1000);
38
+ return () => window.clearTimeout(timeout);
39
+ }
40
+ }, { threshold: 0.1 });
41
+ observer.observe(el);
42
+ return () => observer.disconnect();
43
+ }, [value, from, duration, delay, prefersReducedMotion, hasAnimated]);
44
+ const formatted = React.useMemo(() => {
45
+ if (formatOptions) {
46
+ return new Intl.NumberFormat(undefined, formatOptions).format(display);
47
+ }
48
+ return display.toFixed(decimals);
49
+ }, [display, decimals, formatOptions]);
50
+ return (_jsx("span", { ref: combinedRef, className: cn("tabular-nums", className), ...props, children: formatted }));
51
+ });
52
+ NumberTicker.displayName = "NumberTicker";
53
+ function useCombinedRef(...refs) {
54
+ return React.useCallback((node) => {
55
+ for (const ref of refs) {
56
+ if (typeof ref === "function") {
57
+ ref(node);
58
+ }
59
+ else if (ref && typeof ref === "object") {
60
+ ref.current = node;
61
+ }
62
+ }
63
+ },
64
+ // eslint-disable-next-line react-hooks/exhaustive-deps
65
+ refs);
66
+ }
@@ -0,0 +1,21 @@
1
+ import * as React from "react";
2
+ export interface OrbitingCirclesProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ /** Orbit radius in px */
4
+ radius?: number;
5
+ /** Full orbit duration in seconds */
6
+ duration?: number;
7
+ /** Animation delay in seconds */
8
+ delay?: number;
9
+ /** Reverse orbit direction */
10
+ reverse?: boolean;
11
+ /** Show orbit path ring */
12
+ path?: boolean;
13
+ /** Starting angle in degrees */
14
+ startAngle?: number;
15
+ /** Visual variant */
16
+ variant?: "default" | "glass" | "3d";
17
+ /** Size of the orbiting container in px */
18
+ iconSize?: number;
19
+ }
20
+ export declare const OrbitingCircles: React.ForwardRefExoticComponent<OrbitingCirclesProps & React.RefAttributes<HTMLDivElement>>;
21
+ //# sourceMappingURL=orbiting-circles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orbiting-circles.d.ts","sourceRoot":"","sources":["../../src/components/orbiting-circles.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,MAAM,WAAW,oBAAqB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAChF,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8BAA8B;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,qBAAqB;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,IAAI,CAAA;IACpC,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAsBD,eAAO,MAAM,eAAe,6FAiE3B,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../lib/cn";
4
+ const variantClasses = {
5
+ default: "",
6
+ glass: cn("rounded-full", "border border-white/20 [border-top-color:var(--glass-refraction-top)]", "bg-white/60 backdrop-blur-xl backdrop-saturate-[180%]", "shadow-[0_0_0_1px_rgb(255_255_255_/_0.3)_inset,0_4px_12px_-4px_rgb(15_23_42_/_0.12)]", "dark:border-white/[0.12] dark:bg-white/[0.08]", "dark:shadow-[0_0_0_1px_rgb(255_255_255_/_0.06)_inset,0_4px_12px_-4px_rgb(0_0_0_/_0.4)]"),
7
+ "3d": cn("rounded-full", "border border-white/30 [border-top-color:var(--glass-refraction-top)]", "bg-white/70 backdrop-blur-xl backdrop-saturate-[200%]", "shadow-[0_0_0_1px_rgb(255_255_255_/_0.5)_inset,0_0_12px_rgb(255_255_255_/_0.12)_inset,0_8px_24px_-6px_rgb(15_23_42_/_0.25),0_2px_6px_-2px_rgb(15_23_42_/_0.15)]", "dark:border-white/[0.16] dark:bg-[linear-gradient(155deg,rgb(255_255_255_/_0.14),rgb(255_255_255_/_0.06))]", "dark:shadow-[0_0_0_1px_rgb(255_255_255_/_0.1)_inset,0_0_12px_rgb(255_255_255_/_0.04)_inset,0_8px_24px_-6px_rgb(0_0_0_/_0.5),0_2px_6px_-2px_rgb(0_0_0_/_0.3)]"),
8
+ };
9
+ export const OrbitingCircles = React.forwardRef(({ className, children, radius = 100, duration = 20, delay = 0, reverse = false, path = false, startAngle = 0, variant = "default", iconSize = 32, style, ...props }, ref) => {
10
+ const half = iconSize / 2;
11
+ return (_jsxs(_Fragment, { children: [path && (_jsx("svg", { "aria-hidden": true, className: "pointer-events-none absolute inset-0 size-full", children: _jsx("circle", { cx: "50%", cy: "50%", r: radius, fill: "none", stroke: "currentColor", strokeOpacity: 0.1, strokeWidth: 1, strokeDasharray: "4 4" }) })), _jsx("div", { ref: ref, className: cn("absolute left-1/2 top-1/2 flex items-center justify-center animate-orbit motion-reduce:[animation:none]", variantClasses[variant], className), style: {
12
+ width: iconSize,
13
+ height: iconSize,
14
+ marginLeft: -half,
15
+ marginTop: -half,
16
+ "--orbit-radius": radius,
17
+ "--orbit-start": startAngle,
18
+ "--orbit-duration": `${duration}s`,
19
+ animationDelay: `${-delay}s`,
20
+ animationDirection: reverse ? "reverse" : "normal",
21
+ ...style,
22
+ }, ...props, children: children })] }));
23
+ });
24
+ OrbitingCircles.displayName = "OrbitingCircles";
@@ -0,0 +1,19 @@
1
+ import * as React from "react";
2
+ export interface ParticleFieldProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ /** Number of particles */
4
+ count?: number;
5
+ /** Particle color */
6
+ color?: string;
7
+ /** Min particle size in px */
8
+ minSize?: number;
9
+ /** Max particle size in px */
10
+ maxSize?: number;
11
+ /** Float duration in seconds */
12
+ duration?: number;
13
+ /** Float distance in px */
14
+ distance?: number;
15
+ /** Particle shape */
16
+ shape?: "circle" | "square";
17
+ }
18
+ export declare const ParticleField: React.ForwardRefExoticComponent<ParticleFieldProps & React.RefAttributes<HTMLDivElement>>;
19
+ //# sourceMappingURL=particle-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particle-field.d.ts","sourceRoot":"","sources":["../../src/components/particle-field.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,MAAM,WAAW,kBAAmB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC9E,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qBAAqB;IACrB,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAC5B;AAOD,eAAO,MAAM,aAAa,2FAqEzB,CAAA"}
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../lib/cn";
4
+ function seededRandom(seed) {
5
+ const x = Math.sin(seed * 9301 + 49297) * 49297;
6
+ return x - Math.floor(x);
7
+ }
8
+ export const ParticleField = React.forwardRef(({ className, count = 30, color, minSize = 2, maxSize = 5, duration = 5, distance = 200, shape = "circle", style, ...props }, ref) => {
9
+ const particles = React.useMemo(() => {
10
+ return Array.from({ length: count }, (_, i) => {
11
+ const r1 = seededRandom(i + 1);
12
+ const r2 = seededRandom(i + 100);
13
+ const r3 = seededRandom(i + 200);
14
+ const r4 = seededRandom(i + 300);
15
+ const size = minSize + r1 * (maxSize - minSize);
16
+ return {
17
+ id: i,
18
+ x: r2 * 100,
19
+ y: r3 * 100,
20
+ size,
21
+ delay: r4 * duration,
22
+ drift: (r1 - 0.5) * 40,
23
+ dur: duration * (0.7 + r2 * 0.6),
24
+ };
25
+ });
26
+ }, [count, minSize, maxSize, duration]);
27
+ const particleColor = color ?? "currentColor";
28
+ return (_jsx("div", { ref: ref, "aria-hidden": true, className: cn("pointer-events-none absolute inset-0 overflow-hidden", className), style: style, ...props, children: particles.map((p) => (_jsx("div", { className: cn("absolute animate-particle-float motion-reduce:[animation:none]", shape === "circle" ? "rounded-full" : "rounded-sm"), style: {
29
+ "--particle-distance": `${-distance}px`,
30
+ "--particle-drift": `${p.drift}px`,
31
+ "--particle-duration": `${p.dur}s`,
32
+ width: p.size,
33
+ height: p.size,
34
+ left: `${p.x}%`,
35
+ bottom: `${p.y * 0.3}%`,
36
+ backgroundColor: particleColor,
37
+ opacity: 0,
38
+ animationDelay: `${-p.delay}s`,
39
+ } }, p.id))) }));
40
+ });
41
+ ParticleField.displayName = "ParticleField";
@@ -0,0 +1,27 @@
1
+ import * as React from "react";
2
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
3
+ import { type VariantProps } from "class-variance-authority";
4
+ declare const popoverTriggerVariants: (props?: ({
5
+ variant?: "default" | "glass" | "frosted" | "outline" | "ghost" | null | undefined;
6
+ size?: "sm" | "md" | "lg" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ declare const popoverContentVariants: (props?: ({
9
+ variant?: "default" | "glass" | "frosted" | "outline" | "ghost" | null | undefined;
10
+ size?: "sm" | "md" | "lg" | null | undefined;
11
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
12
+ export type PopoverProps = React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Root>;
13
+ export declare const Popover: React.FC<PopoverPrimitive.PopoverProps>;
14
+ export type PopoverTriggerProps = React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Trigger> & VariantProps<typeof popoverTriggerVariants>;
15
+ export declare const PopoverTrigger: React.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & VariantProps<(props?: ({
16
+ variant?: "default" | "glass" | "frosted" | "outline" | "ghost" | null | undefined;
17
+ size?: "sm" | "md" | "lg" | null | undefined;
18
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLButtonElement>>;
19
+ export type PopoverContentProps = React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & VariantProps<typeof popoverContentVariants>;
20
+ export declare const PopoverContent: React.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & VariantProps<(props?: ({
21
+ variant?: "default" | "glass" | "frosted" | "outline" | "ghost" | null | undefined;
22
+ size?: "sm" | "md" | "lg" | null | undefined;
23
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
24
+ export declare const PopoverClose: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverCloseProps & React.RefAttributes<HTMLButtonElement>>;
25
+ export declare const PopoverAnchor: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverAnchorProps & React.RefAttributes<HTMLDivElement>>;
26
+ export {};
27
+ //# sourceMappingURL=popover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/components/popover.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,QAAA,MAAM,sBAAsB;;;8EAsB3B,CAAA;AAED,QAAA,MAAM,sBAAsB;;;8EAmB1B,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAA;AAEvF,eAAO,MAAM,OAAO,yCAAwB,CAAA;AAE5C,MAAM,MAAM,mBAAmB,GAC7B,KAAK,CAAC,wBAAwB,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,GAC/D,YAAY,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAE7C,eAAO,MAAM,cAAc;;;yHASzB,CAAA;AAIF,MAAM,MAAM,mBAAmB,GAC7B,KAAK,CAAC,wBAAwB,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,GAC/D,YAAY,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAE7C,eAAO,MAAM,cAAc;;;sHAazB,CAAA;AAIF,eAAO,MAAM,YAAY,8GAAyB,CAAA;AAClD,eAAO,MAAM,aAAa,4GAA0B,CAAA"}
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
4
+ import { cva } from "class-variance-authority";
5
+ import { cn } from "../lib/cn";
6
+ const popoverTriggerVariants = cva("inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-accent)] focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", {
7
+ variants: {
8
+ variant: {
9
+ default: "bg-[var(--color-surface)] text-[var(--color-foreground)] border border-[var(--color-border)]",
10
+ glass: "backdrop-blur-xl backdrop-saturate-[180%] bg-[var(--glass-3-surface)] border border-white/20 [border-top-color:var(--glass-refraction-top)] shadow-[0_0_0_1px_rgb(255_255_255_/_0.1)_inset,var(--shadow-glass-sm)] dark:border-white/[0.1] dark:shadow-[0_0_0_1px_rgb(255_255_255_/_0.05)_inset,0_8px_24px_rgb(0_0_0_/_0.35)] text-[var(--color-foreground)]",
11
+ frosted: "backdrop-blur-[40px] backdrop-saturate-[200%] bg-[var(--glass-4-surface)] border border-white/30 [border-top-color:var(--glass-refraction-top)] shadow-[0_0_0_1px_rgb(255_255_255_/_0.15)_inset,0_0_16px_rgb(255_255_255_/_0.1)_inset,var(--shadow-glass-md)] dark:border-white/[0.14] dark:shadow-[0_0_0_1px_rgb(255_255_255_/_0.07)_inset,0_0_16px_rgb(255_255_255_/_0.03)_inset,0_8px_24px_rgb(0_0_0_/_0.4)] text-[var(--color-foreground)]",
12
+ outline: "bg-transparent border border-[var(--color-border)] text-[var(--color-foreground)]",
13
+ ghost: "bg-transparent border border-transparent text-[var(--color-foreground)]"
14
+ },
15
+ size: {
16
+ sm: "h-8 px-3",
17
+ md: "h-10 px-4",
18
+ lg: "h-11 px-5"
19
+ }
20
+ },
21
+ defaultVariants: {
22
+ variant: "default",
23
+ size: "md"
24
+ }
25
+ });
26
+ const popoverContentVariants = cva("z-50 rounded-md border p-4 shadow-md outline-none", {
27
+ variants: {
28
+ variant: {
29
+ default: "bg-[var(--color-surface)] border-[var(--color-border)] text-[var(--color-foreground)]",
30
+ glass: "backdrop-blur-xl backdrop-saturate-[180%] bg-[var(--glass-3-surface)] border border-white/20 [border-top-color:var(--glass-refraction-top)] shadow-[0_0_0_1px_rgb(255_255_255_/_0.1)_inset,var(--shadow-glass-sm)] dark:border-white/[0.1] dark:shadow-[0_0_0_1px_rgb(255_255_255_/_0.05)_inset,0_8px_24px_rgb(0_0_0_/_0.35)] text-[var(--color-foreground)]",
31
+ frosted: "backdrop-blur-[40px] backdrop-saturate-[200%] bg-[var(--glass-4-surface)] border border-white/30 [border-top-color:var(--glass-refraction-top)] shadow-[0_0_0_1px_rgb(255_255_255_/_0.15)_inset,0_0_16px_rgb(255_255_255_/_0.1)_inset,var(--shadow-glass-md)] dark:border-white/[0.14] dark:shadow-[0_0_0_1px_rgb(255_255_255_/_0.07)_inset,0_0_16px_rgb(255_255_255_/_0.03)_inset,0_8px_24px_rgb(0_0_0_/_0.4)] text-[var(--color-foreground)]",
32
+ outline: "bg-transparent border-[var(--color-border)] text-[var(--color-foreground)]",
33
+ ghost: "bg-transparent border-transparent text-[var(--color-foreground)]"
34
+ },
35
+ size: {
36
+ sm: "w-56 text-xs",
37
+ md: "w-72 text-sm",
38
+ lg: "w-80 text-base"
39
+ }
40
+ },
41
+ defaultVariants: {
42
+ variant: "default",
43
+ size: "md"
44
+ }
45
+ });
46
+ export const Popover = PopoverPrimitive.Root;
47
+ export const PopoverTrigger = React.forwardRef(({ className, variant, size, ...props }, ref) => (_jsx(PopoverPrimitive.Trigger, { ref: ref, className: cn(popoverTriggerVariants({ variant, size }), className), ...props })));
48
+ PopoverTrigger.displayName = PopoverPrimitive.Trigger.displayName;
49
+ export const PopoverContent = React.forwardRef(({ className, align = "center", sideOffset = 8, variant, size, ...props }, ref) => (_jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { ref: ref, align: align, sideOffset: sideOffset, className: cn(popoverContentVariants({ variant, size }), className), ...props }) })));
50
+ PopoverContent.displayName = PopoverPrimitive.Content.displayName;
51
+ export const PopoverClose = PopoverPrimitive.Close;
52
+ export const PopoverAnchor = PopoverPrimitive.Anchor;
@@ -0,0 +1,13 @@
1
+ import * as React from "react";
2
+ export interface PrismBorderProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ /** Animation duration in seconds */
4
+ duration?: number;
5
+ /** Border width in px */
6
+ borderWidth?: number;
7
+ /** Border radius */
8
+ borderRadius?: string;
9
+ /** Custom gradient colors */
10
+ colors?: string[];
11
+ }
12
+ export declare const PrismBorder: React.ForwardRefExoticComponent<PrismBorderProps & React.RefAttributes<HTMLDivElement>>;
13
+ //# sourceMappingURL=prism-border.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prism-border.d.ts","sourceRoot":"","sources":["../../src/components/prism-border.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC5E,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,eAAO,MAAM,WAAW,yFA+CvB,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../lib/cn";
4
+ export const PrismBorder = React.forwardRef(({ className, children, duration = 3, borderWidth = 2, borderRadius = "0.75rem", colors = ["#f43f5e", "#f97316", "#eab308", "#22c55e", "#06b6d4", "#6366f1", "#a855f7", "#f43f5e"], style, ...props }, ref) => {
5
+ const gradient = `linear-gradient(90deg, ${colors.join(", ")})`;
6
+ return (_jsxs("div", { ref: ref, className: cn("relative", className), style: { borderRadius, ...style }, ...props, children: [_jsx("div", { "aria-hidden": "true", className: "absolute inset-0 animate-prism-rotate motion-reduce:[animation:none] [background-size:200%_200%]", style: {
7
+ "--prism-duration": `${duration}s`,
8
+ backgroundImage: gradient,
9
+ borderRadius,
10
+ mask: `linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)`,
11
+ maskComposite: "exclude",
12
+ WebkitMaskComposite: "xor",
13
+ padding: borderWidth,
14
+ } }), _jsx("div", { className: "relative", style: { borderRadius }, children: children })] }));
15
+ });
16
+ PrismBorder.displayName = "PrismBorder";