bynana-ui 1.5.0 → 1.6.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 (45) hide show
  1. package/dist/crosshair/index.js +2 -0
  2. package/dist/crosshair/index.js.map +1 -0
  3. package/dist/crosshair/index.mjs +2 -0
  4. package/dist/crosshair/index.mjs.map +1 -0
  5. package/dist/decay-card/index.js +3 -0
  6. package/dist/decay-card/index.js.map +1 -0
  7. package/dist/decay-card/index.mjs +3 -0
  8. package/dist/decay-card/index.mjs.map +1 -0
  9. package/dist/flowing-menu/index.js +3 -0
  10. package/dist/flowing-menu/index.js.map +1 -0
  11. package/dist/flowing-menu/index.mjs +3 -0
  12. package/dist/flowing-menu/index.mjs.map +1 -0
  13. package/dist/gooey-nav/index.js +2 -0
  14. package/dist/gooey-nav/index.js.map +1 -0
  15. package/dist/gooey-nav/index.mjs +2 -0
  16. package/dist/gooey-nav/index.mjs.map +1 -0
  17. package/dist/index.js +13 -12
  18. package/dist/index.js.map +1 -1
  19. package/dist/index.mjs +13 -12
  20. package/dist/index.mjs.map +1 -1
  21. package/dist/liquid-glass-card/index.js +2 -0
  22. package/dist/liquid-glass-card/index.js.map +1 -0
  23. package/dist/liquid-glass-card/index.mjs +2 -0
  24. package/dist/liquid-glass-card/index.mjs.map +1 -0
  25. package/dist/pill-nav/index.js +2 -0
  26. package/dist/pill-nav/index.js.map +1 -0
  27. package/dist/pill-nav/index.mjs +2 -0
  28. package/dist/pill-nav/index.mjs.map +1 -0
  29. package/dist/scroll-text/index.js +2 -0
  30. package/dist/scroll-text/index.js.map +1 -0
  31. package/dist/scroll-text/index.mjs +2 -0
  32. package/dist/scroll-text/index.mjs.map +1 -0
  33. package/dist/smooth-drawer/index.js +2 -0
  34. package/dist/smooth-drawer/index.js.map +1 -0
  35. package/dist/smooth-drawer/index.mjs +2 -0
  36. package/dist/smooth-drawer/index.mjs.map +1 -0
  37. package/dist/smooth-tab/index.js +2 -0
  38. package/dist/smooth-tab/index.js.map +1 -0
  39. package/dist/smooth-tab/index.mjs +2 -0
  40. package/dist/smooth-tab/index.mjs.map +1 -0
  41. package/dist/target-cursor/index.js +2 -0
  42. package/dist/target-cursor/index.js.map +1 -0
  43. package/dist/target-cursor/index.mjs +2 -0
  44. package/dist/target-cursor/index.mjs.map +1 -0
  45. package/package.json +11 -1
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var b=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var b__default=/*#__PURE__*/_interopDefault(b);function s(...t){return tailwindMerge.twMerge(clsx.clsx(t))}var u="shadow-[0_0_6px_rgba(0,0,0,0.03),0_2px_6px_rgba(0,0,0,0.08),inset_3px_3px_0.5px_-3px_rgba(0,0,0,0.9),inset_-3px_-3px_0.5px_-3px_rgba(0,0,0,0.85),inset_1px_1px_1px_-0.5px_rgba(0,0,0,0.6),inset_-1px_-1px_1px_-0.5px_rgba(0,0,0,0.6),inset_0_0_6px_6px_rgba(0,0,0,0.12),inset_0_0_2px_2px_rgba(0,0,0,0.06),0_0_12px_rgba(255,255,255,0.15)] dark:shadow-[0_0_8px_rgba(0,0,0,0.03),0_2px_6px_rgba(0,0,0,0.08),inset_3px_3px_0.5px_-3.5px_rgba(255,255,255,0.09),inset_-3px_-3px_0.5px_-3.5px_rgba(255,255,255,0.85),inset_1px_1px_1px_-0.5px_rgba(255,255,255,0.6),inset_-1px_-1px_1px_-0.5px_rgba(255,255,255,0.6),inset_0_0_6px_6px_rgba(255,255,255,0.12),inset_0_0_2px_2px_rgba(255,255,255,0.06),0_0_12px_rgba(0,0,0,0.15)]",o=b__default.default.memo(({id:t,scale:r=30})=>jsxRuntime.jsxs("svg",{className:"hidden",children:[jsxRuntime.jsx("title",{children:"Glass Effect Filter"}),jsxRuntime.jsx("defs",{children:jsxRuntime.jsxs("filter",{colorInterpolationFilters:"sRGB",height:"200%",id:t,width:"200%",x:"-50%",y:"-50%",children:[jsxRuntime.jsx("feTurbulence",{baseFrequency:"0.05 0.05",numOctaves:"1",result:"turbulence",seed:"1",type:"fractalNoise"}),jsxRuntime.jsx("feGaussianBlur",{in:"turbulence",result:"blurredNoise",stdDeviation:"2"}),jsxRuntime.jsx("feDisplacementMap",{in:"SourceGraphic",in2:"blurredNoise",result:"displaced",scale:r,xChannelSelector:"R",yChannelSelector:"B"}),jsxRuntime.jsx("feGaussianBlur",{in:"displaced",result:"finalBlur",stdDeviation:"4"}),jsxRuntime.jsx("feComposite",{in:"finalBlur",in2:"finalBlur",operator:"over"})]})})]}));o.displayName="GlassFilter";function f({className:t,glassSize:r="default",glassEffect:n=true,children:l,...i}){let p=b.useId();return jsxRuntime.jsxs("div",{className:s("group relative overflow-hidden rounded-lg border border-zinc-200 dark:border-zinc-800","bg-white/20 dark:bg-zinc-900/20 backdrop-blur-[2px]","transition-all duration-300",{sm:"p-4",default:"p-6",lg:"p-8"}[r],t),...i,children:[jsxRuntime.jsx("div",{className:s("pointer-events-none absolute inset-0 rounded-lg transition-all",u)}),n&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"-z-10 pointer-events-none absolute inset-0 overflow-hidden rounded-lg",style:{backdropFilter:`url("#${p}")`}}),jsxRuntime.jsx(o,{id:p,scale:30})]}),jsxRuntime.jsx("div",{className:"relative z-10",children:l}),jsxRuntime.jsx("div",{className:"pointer-events-none absolute inset-0 z-20 rounded-lg bg-gradient-to-r from-transparent via-black/5 to-transparent opacity-0 transition-opacity duration-200 group-hover:opacity-100 dark:via-white/5"})]})}function G({className:t,variant:r="default",children:n,...l}){let i=b.useId();return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("button",{className:s("relative px-4 py-2 rounded-full font-medium transition-transform duration-300 hover:scale-105",r==="default"&&"bg-zinc-900 dark:bg-white text-white dark:text-zinc-900",r==="ghost"&&"bg-transparent text-zinc-700 dark:text-zinc-300 hover:bg-zinc-200/80 dark:hover:bg-zinc-800/80",t),...l,children:[jsxRuntime.jsx("div",{className:s("pointer-events-none absolute inset-0 rounded-full transition-all",u)}),jsxRuntime.jsx("div",{className:"-z-10 pointer-events-none absolute inset-0 isolate overflow-hidden rounded-full",style:{backdropFilter:`url("#${i}")`}}),jsxRuntime.jsx("span",{className:"relative z-10",children:n})]}),jsxRuntime.jsx(o,{id:i,scale:70})]})}var k=f;exports.LiquidButton=G;exports.LiquidGlassCard=f;exports.default=k;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/liquid-glass-card/index.tsx"],"names":["cn","inputs","twMerge","clsx","GLASS_SHADOW","GlassFilter","React","id","scale","jsxs","jsx","LiquidGlassCard","className","glassSize","glassEffect","children","props","filterId","useId","Fragment","LiquidButton","variant","liquid_glass_card_default"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useId } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\nconst GLASS_SHADOW =\r\n \"shadow-[0_0_6px_rgba(0,0,0,0.03),0_2px_6px_rgba(0,0,0,0.08),inset_3px_3px_0.5px_-3px_rgba(0,0,0,0.9),inset_-3px_-3px_0.5px_-3px_rgba(0,0,0,0.85),inset_1px_1px_1px_-0.5px_rgba(0,0,0,0.6),inset_-1px_-1px_1px_-0.5px_rgba(0,0,0,0.6),inset_0_0_6px_6px_rgba(0,0,0,0.12),inset_0_0_2px_2px_rgba(0,0,0,0.06),0_0_12px_rgba(255,255,255,0.15)] dark:shadow-[0_0_8px_rgba(0,0,0,0.03),0_2px_6px_rgba(0,0,0,0.08),inset_3px_3px_0.5px_-3.5px_rgba(255,255,255,0.09),inset_-3px_-3px_0.5px_-3.5px_rgba(255,255,255,0.85),inset_1px_1px_1px_-0.5px_rgba(255,255,255,0.6),inset_-1px_-1px_1px_-0.5px_rgba(255,255,255,0.6),inset_0_0_6px_6px_rgba(255,255,255,0.12),inset_0_0_2px_2px_rgba(255,255,255,0.06),0_0_12px_rgba(0,0,0,0.15)]\";\r\n\r\ninterface GlassFilterProps {\r\n id: string;\r\n scale?: number;\r\n}\r\n\r\nconst GlassFilter = React.memo(({ id, scale = 30 }: GlassFilterProps) => (\r\n <svg className=\"hidden\">\r\n <title>Glass Effect Filter</title>\r\n <defs>\r\n <filter\r\n colorInterpolationFilters=\"sRGB\"\r\n height=\"200%\"\r\n id={id}\r\n width=\"200%\"\r\n x=\"-50%\"\r\n y=\"-50%\"\r\n >\r\n <feTurbulence\r\n baseFrequency=\"0.05 0.05\"\r\n numOctaves=\"1\"\r\n result=\"turbulence\"\r\n seed=\"1\"\r\n type=\"fractalNoise\"\r\n />\r\n <feGaussianBlur in=\"turbulence\" result=\"blurredNoise\" stdDeviation=\"2\" />\r\n <feDisplacementMap\r\n in=\"SourceGraphic\"\r\n in2=\"blurredNoise\"\r\n result=\"displaced\"\r\n scale={scale}\r\n xChannelSelector=\"R\"\r\n yChannelSelector=\"B\"\r\n />\r\n <feGaussianBlur in=\"displaced\" result=\"finalBlur\" stdDeviation=\"4\" />\r\n <feComposite in=\"finalBlur\" in2=\"finalBlur\" operator=\"over\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n));\r\nGlassFilter.displayName = \"GlassFilter\";\r\n\r\ninterface LiquidGlassCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n glassSize?: \"sm\" | \"default\" | \"lg\";\r\n glassEffect?: boolean;\r\n}\r\n\r\nexport function LiquidGlassCard({\r\n className,\r\n glassSize = \"default\",\r\n glassEffect = true,\r\n children,\r\n ...props\r\n}: LiquidGlassCardProps) {\r\n const filterId = useId();\r\n\r\n const sizeClasses = {\r\n sm: \"p-4\",\r\n default: \"p-6\",\r\n lg: \"p-8\",\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"group relative overflow-hidden rounded-lg border border-zinc-200 dark:border-zinc-800\",\r\n \"bg-white/20 dark:bg-zinc-900/20 backdrop-blur-[2px]\",\r\n \"transition-all duration-300\",\r\n sizeClasses[glassSize],\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div\r\n className={cn(\r\n \"pointer-events-none absolute inset-0 rounded-lg transition-all\",\r\n GLASS_SHADOW\r\n )}\r\n />\r\n\r\n {glassEffect && (\r\n <>\r\n <div\r\n className=\"-z-10 pointer-events-none absolute inset-0 overflow-hidden rounded-lg\"\r\n style={{ backdropFilter: `url(\"#${filterId}\")` }}\r\n />\r\n <GlassFilter id={filterId} scale={30} />\r\n </>\r\n )}\r\n\r\n <div className=\"relative z-10\">{children}</div>\r\n\r\n <div className=\"pointer-events-none absolute inset-0 z-20 rounded-lg bg-gradient-to-r from-transparent via-black/5 to-transparent opacity-0 transition-opacity duration-200 group-hover:opacity-100 dark:via-white/5\" />\r\n </div>\r\n );\r\n}\r\n\r\ninterface LiquidButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n variant?: \"default\" | \"ghost\";\r\n}\r\n\r\nexport function LiquidButton({\r\n className,\r\n variant = \"default\",\r\n children,\r\n ...props\r\n}: LiquidButtonProps) {\r\n const filterId = useId();\r\n\r\n return (\r\n <>\r\n <button\r\n className={cn(\r\n \"relative px-4 py-2 rounded-full font-medium transition-transform duration-300 hover:scale-105\",\r\n variant === \"default\" &&\r\n \"bg-zinc-900 dark:bg-white text-white dark:text-zinc-900\",\r\n variant === \"ghost\" &&\r\n \"bg-transparent text-zinc-700 dark:text-zinc-300 hover:bg-zinc-200/80 dark:hover:bg-zinc-800/80\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div\r\n className={cn(\r\n \"pointer-events-none absolute inset-0 rounded-full transition-all\",\r\n GLASS_SHADOW\r\n )}\r\n />\r\n <div\r\n className=\"-z-10 pointer-events-none absolute inset-0 isolate overflow-hidden rounded-full\"\r\n style={{ backdropFilter: `url(\"#${filterId}\")` }}\r\n />\r\n <span className=\"relative z-10\">{children}</span>\r\n </button>\r\n <GlassFilter id={filterId} scale={70} />\r\n </>\r\n );\r\n}\r\n\r\nexport default LiquidGlassCard;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import b,{useId}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function s(...t){return twMerge(clsx(t))}var u="shadow-[0_0_6px_rgba(0,0,0,0.03),0_2px_6px_rgba(0,0,0,0.08),inset_3px_3px_0.5px_-3px_rgba(0,0,0,0.9),inset_-3px_-3px_0.5px_-3px_rgba(0,0,0,0.85),inset_1px_1px_1px_-0.5px_rgba(0,0,0,0.6),inset_-1px_-1px_1px_-0.5px_rgba(0,0,0,0.6),inset_0_0_6px_6px_rgba(0,0,0,0.12),inset_0_0_2px_2px_rgba(0,0,0,0.06),0_0_12px_rgba(255,255,255,0.15)] dark:shadow-[0_0_8px_rgba(0,0,0,0.03),0_2px_6px_rgba(0,0,0,0.08),inset_3px_3px_0.5px_-3.5px_rgba(255,255,255,0.09),inset_-3px_-3px_0.5px_-3.5px_rgba(255,255,255,0.85),inset_1px_1px_1px_-0.5px_rgba(255,255,255,0.6),inset_-1px_-1px_1px_-0.5px_rgba(255,255,255,0.6),inset_0_0_6px_6px_rgba(255,255,255,0.12),inset_0_0_2px_2px_rgba(255,255,255,0.06),0_0_12px_rgba(0,0,0,0.15)]",o=b.memo(({id:t,scale:r=30})=>jsxs("svg",{className:"hidden",children:[jsx("title",{children:"Glass Effect Filter"}),jsx("defs",{children:jsxs("filter",{colorInterpolationFilters:"sRGB",height:"200%",id:t,width:"200%",x:"-50%",y:"-50%",children:[jsx("feTurbulence",{baseFrequency:"0.05 0.05",numOctaves:"1",result:"turbulence",seed:"1",type:"fractalNoise"}),jsx("feGaussianBlur",{in:"turbulence",result:"blurredNoise",stdDeviation:"2"}),jsx("feDisplacementMap",{in:"SourceGraphic",in2:"blurredNoise",result:"displaced",scale:r,xChannelSelector:"R",yChannelSelector:"B"}),jsx("feGaussianBlur",{in:"displaced",result:"finalBlur",stdDeviation:"4"}),jsx("feComposite",{in:"finalBlur",in2:"finalBlur",operator:"over"})]})})]}));o.displayName="GlassFilter";function f({className:t,glassSize:r="default",glassEffect:n=true,children:l,...i}){let p=useId();return jsxs("div",{className:s("group relative overflow-hidden rounded-lg border border-zinc-200 dark:border-zinc-800","bg-white/20 dark:bg-zinc-900/20 backdrop-blur-[2px]","transition-all duration-300",{sm:"p-4",default:"p-6",lg:"p-8"}[r],t),...i,children:[jsx("div",{className:s("pointer-events-none absolute inset-0 rounded-lg transition-all",u)}),n&&jsxs(Fragment,{children:[jsx("div",{className:"-z-10 pointer-events-none absolute inset-0 overflow-hidden rounded-lg",style:{backdropFilter:`url("#${p}")`}}),jsx(o,{id:p,scale:30})]}),jsx("div",{className:"relative z-10",children:l}),jsx("div",{className:"pointer-events-none absolute inset-0 z-20 rounded-lg bg-gradient-to-r from-transparent via-black/5 to-transparent opacity-0 transition-opacity duration-200 group-hover:opacity-100 dark:via-white/5"})]})}function G({className:t,variant:r="default",children:n,...l}){let i=useId();return jsxs(Fragment,{children:[jsxs("button",{className:s("relative px-4 py-2 rounded-full font-medium transition-transform duration-300 hover:scale-105",r==="default"&&"bg-zinc-900 dark:bg-white text-white dark:text-zinc-900",r==="ghost"&&"bg-transparent text-zinc-700 dark:text-zinc-300 hover:bg-zinc-200/80 dark:hover:bg-zinc-800/80",t),...l,children:[jsx("div",{className:s("pointer-events-none absolute inset-0 rounded-full transition-all",u)}),jsx("div",{className:"-z-10 pointer-events-none absolute inset-0 isolate overflow-hidden rounded-full",style:{backdropFilter:`url("#${i}")`}}),jsx("span",{className:"relative z-10",children:n})]}),jsx(o,{id:i,scale:70})]})}var k=f;export{G as LiquidButton,f as LiquidGlassCard,k as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/liquid-glass-card/index.tsx"],"names":["cn","inputs","twMerge","clsx","GLASS_SHADOW","GlassFilter","React","id","scale","jsxs","jsx","LiquidGlassCard","className","glassSize","glassEffect","children","props","filterId","useId","Fragment","LiquidButton","variant","liquid_glass_card_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useId } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\nconst GLASS_SHADOW =\r\n \"shadow-[0_0_6px_rgba(0,0,0,0.03),0_2px_6px_rgba(0,0,0,0.08),inset_3px_3px_0.5px_-3px_rgba(0,0,0,0.9),inset_-3px_-3px_0.5px_-3px_rgba(0,0,0,0.85),inset_1px_1px_1px_-0.5px_rgba(0,0,0,0.6),inset_-1px_-1px_1px_-0.5px_rgba(0,0,0,0.6),inset_0_0_6px_6px_rgba(0,0,0,0.12),inset_0_0_2px_2px_rgba(0,0,0,0.06),0_0_12px_rgba(255,255,255,0.15)] dark:shadow-[0_0_8px_rgba(0,0,0,0.03),0_2px_6px_rgba(0,0,0,0.08),inset_3px_3px_0.5px_-3.5px_rgba(255,255,255,0.09),inset_-3px_-3px_0.5px_-3.5px_rgba(255,255,255,0.85),inset_1px_1px_1px_-0.5px_rgba(255,255,255,0.6),inset_-1px_-1px_1px_-0.5px_rgba(255,255,255,0.6),inset_0_0_6px_6px_rgba(255,255,255,0.12),inset_0_0_2px_2px_rgba(255,255,255,0.06),0_0_12px_rgba(0,0,0,0.15)]\";\r\n\r\ninterface GlassFilterProps {\r\n id: string;\r\n scale?: number;\r\n}\r\n\r\nconst GlassFilter = React.memo(({ id, scale = 30 }: GlassFilterProps) => (\r\n <svg className=\"hidden\">\r\n <title>Glass Effect Filter</title>\r\n <defs>\r\n <filter\r\n colorInterpolationFilters=\"sRGB\"\r\n height=\"200%\"\r\n id={id}\r\n width=\"200%\"\r\n x=\"-50%\"\r\n y=\"-50%\"\r\n >\r\n <feTurbulence\r\n baseFrequency=\"0.05 0.05\"\r\n numOctaves=\"1\"\r\n result=\"turbulence\"\r\n seed=\"1\"\r\n type=\"fractalNoise\"\r\n />\r\n <feGaussianBlur in=\"turbulence\" result=\"blurredNoise\" stdDeviation=\"2\" />\r\n <feDisplacementMap\r\n in=\"SourceGraphic\"\r\n in2=\"blurredNoise\"\r\n result=\"displaced\"\r\n scale={scale}\r\n xChannelSelector=\"R\"\r\n yChannelSelector=\"B\"\r\n />\r\n <feGaussianBlur in=\"displaced\" result=\"finalBlur\" stdDeviation=\"4\" />\r\n <feComposite in=\"finalBlur\" in2=\"finalBlur\" operator=\"over\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n));\r\nGlassFilter.displayName = \"GlassFilter\";\r\n\r\ninterface LiquidGlassCardProps extends React.HTMLAttributes<HTMLDivElement> {\r\n glassSize?: \"sm\" | \"default\" | \"lg\";\r\n glassEffect?: boolean;\r\n}\r\n\r\nexport function LiquidGlassCard({\r\n className,\r\n glassSize = \"default\",\r\n glassEffect = true,\r\n children,\r\n ...props\r\n}: LiquidGlassCardProps) {\r\n const filterId = useId();\r\n\r\n const sizeClasses = {\r\n sm: \"p-4\",\r\n default: \"p-6\",\r\n lg: \"p-8\",\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"group relative overflow-hidden rounded-lg border border-zinc-200 dark:border-zinc-800\",\r\n \"bg-white/20 dark:bg-zinc-900/20 backdrop-blur-[2px]\",\r\n \"transition-all duration-300\",\r\n sizeClasses[glassSize],\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div\r\n className={cn(\r\n \"pointer-events-none absolute inset-0 rounded-lg transition-all\",\r\n GLASS_SHADOW\r\n )}\r\n />\r\n\r\n {glassEffect && (\r\n <>\r\n <div\r\n className=\"-z-10 pointer-events-none absolute inset-0 overflow-hidden rounded-lg\"\r\n style={{ backdropFilter: `url(\"#${filterId}\")` }}\r\n />\r\n <GlassFilter id={filterId} scale={30} />\r\n </>\r\n )}\r\n\r\n <div className=\"relative z-10\">{children}</div>\r\n\r\n <div className=\"pointer-events-none absolute inset-0 z-20 rounded-lg bg-gradient-to-r from-transparent via-black/5 to-transparent opacity-0 transition-opacity duration-200 group-hover:opacity-100 dark:via-white/5\" />\r\n </div>\r\n );\r\n}\r\n\r\ninterface LiquidButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n variant?: \"default\" | \"ghost\";\r\n}\r\n\r\nexport function LiquidButton({\r\n className,\r\n variant = \"default\",\r\n children,\r\n ...props\r\n}: LiquidButtonProps) {\r\n const filterId = useId();\r\n\r\n return (\r\n <>\r\n <button\r\n className={cn(\r\n \"relative px-4 py-2 rounded-full font-medium transition-transform duration-300 hover:scale-105\",\r\n variant === \"default\" &&\r\n \"bg-zinc-900 dark:bg-white text-white dark:text-zinc-900\",\r\n variant === \"ghost\" &&\r\n \"bg-transparent text-zinc-700 dark:text-zinc-300 hover:bg-zinc-200/80 dark:hover:bg-zinc-800/80\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <div\r\n className={cn(\r\n \"pointer-events-none absolute inset-0 rounded-full transition-all\",\r\n GLASS_SHADOW\r\n )}\r\n />\r\n <div\r\n className=\"-z-10 pointer-events-none absolute inset-0 isolate overflow-hidden rounded-full\"\r\n style={{ backdropFilter: `url(\"#${filterId}\")` }}\r\n />\r\n <span className=\"relative z-10\">{children}</span>\r\n </button>\r\n <GlassFilter id={filterId} scale={70} />\r\n </>\r\n );\r\n}\r\n\r\nexport default LiquidGlassCard;\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function a(...o){return tailwindMerge.twMerge(clsx.clsx(o))}function M({logo:o,logoAlt:b="Logo",items:n,activeHref:f,className:x="",baseColor:r="#fff",pillColor:u="#000000",hoveredPillTextColor:h="#ffffff",pillTextColor:v,onMobileMenuClick:N}){let c=v??r,[t,d]=react.useState(false),[m,p]=react.useState(null),y=()=>{d(!t),N?.();};return jsxRuntime.jsxs("div",{className:a("relative",x),children:[jsxRuntime.jsxs("nav",{className:"flex items-center gap-4 px-4 py-2 rounded-full",style:{backgroundColor:u},"aria-label":"Primary",children:[o&&jsxRuntime.jsx("a",{href:n?.[0]?.href||"#","aria-label":"Home",className:"flex-shrink-0",children:jsxRuntime.jsx("img",{src:o,alt:b,className:"h-8 w-8 object-contain"})}),jsxRuntime.jsx("div",{className:"hidden md:flex items-center gap-1",children:jsxRuntime.jsx("ul",{className:"flex items-center gap-1",role:"menubar",children:n.map((l,s)=>jsxRuntime.jsx("li",{role:"none",children:jsxRuntime.jsx("a",{role:"menuitem",href:l.href,className:a("relative px-4 py-2 rounded-full text-sm font-medium transition-all duration-300",f===l.href&&"font-semibold"),style:{color:m===s?h:c,backgroundColor:m===s?r:"transparent"},"aria-label":l.ariaLabel||l.label,onMouseEnter:()=>p(s),onMouseLeave:()=>p(null),children:l.label})},l.href))})}),jsxRuntime.jsxs("button",{className:"md:hidden flex flex-col gap-1 p-2",onClick:y,"aria-label":"Toggle menu",children:[jsxRuntime.jsx("span",{className:a("w-5 h-0.5 transition-all duration-300",t&&"rotate-45 translate-y-1.5"),style:{backgroundColor:r}}),jsxRuntime.jsx("span",{className:a("w-5 h-0.5 transition-all duration-300",t&&"-rotate-45 -translate-y-1"),style:{backgroundColor:r}})]})]}),t&&jsxRuntime.jsx("div",{className:"md:hidden absolute top-full left-0 right-0 mt-2 rounded-xl p-4 shadow-lg",style:{backgroundColor:u},children:jsxRuntime.jsx("ul",{className:"flex flex-col gap-2",children:n.map(l=>jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:l.href,className:a("block px-4 py-2 rounded-lg text-sm font-medium transition-colors",f===l.href&&"font-semibold"),style:{color:c},onClick:()=>d(false),children:l.label})},l.href))})})]})}var R=M;exports.PillNav=M;exports.default=R;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/pill-nav/index.tsx"],"names":["cn","inputs","twMerge","clsx","PillNav","logo","logoAlt","items","activeHref","className","baseColor","pillColor","hoveredPillTextColor","pillTextColor","onMobileMenuClick","resolvedPillTextColor","isMobileMenuOpen","setIsMobileMenuOpen","useState","hoveredIndex","setHoveredIndex","toggleMobileMenu","jsxs","jsx","item","i","pill_nav_default"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\nexport type PillNavItem = {\r\n label: string;\r\n href: string;\r\n ariaLabel?: string;\r\n};\r\n\r\nexport interface PillNavProps {\r\n logo?: string;\r\n logoAlt?: string;\r\n items: PillNavItem[];\r\n activeHref?: string;\r\n className?: string;\r\n baseColor?: string;\r\n pillColor?: string;\r\n hoveredPillTextColor?: string;\r\n pillTextColor?: string;\r\n onMobileMenuClick?: () => void;\r\n}\r\n\r\nexport function PillNav({\r\n logo,\r\n logoAlt = \"Logo\",\r\n items,\r\n activeHref,\r\n className = \"\",\r\n baseColor = \"#fff\",\r\n pillColor = \"#000000\",\r\n hoveredPillTextColor = \"#ffffff\",\r\n pillTextColor,\r\n onMobileMenuClick,\r\n}: PillNavProps) {\r\n const resolvedPillTextColor = pillTextColor ?? baseColor;\r\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\r\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\r\n\r\n const toggleMobileMenu = () => {\r\n setIsMobileMenuOpen(!isMobileMenuOpen);\r\n onMobileMenuClick?.();\r\n };\r\n\r\n return (\r\n <div className={cn(\"relative\", className)}>\r\n <nav\r\n className=\"flex items-center gap-4 px-4 py-2 rounded-full\"\r\n style={{ backgroundColor: pillColor }}\r\n aria-label=\"Primary\"\r\n >\r\n {logo && (\r\n <a href={items?.[0]?.href || \"#\"} aria-label=\"Home\" className=\"flex-shrink-0\">\r\n <img src={logo} alt={logoAlt} className=\"h-8 w-8 object-contain\" />\r\n </a>\r\n )}\r\n\r\n {/* Desktop Navigation */}\r\n <div className=\"hidden md:flex items-center gap-1\">\r\n <ul className=\"flex items-center gap-1\" role=\"menubar\">\r\n {items.map((item, i) => (\r\n <li key={item.href} role=\"none\">\r\n <a\r\n role=\"menuitem\"\r\n href={item.href}\r\n className={cn(\r\n \"relative px-4 py-2 rounded-full text-sm font-medium transition-all duration-300\",\r\n activeHref === item.href && \"font-semibold\"\r\n )}\r\n style={{\r\n color: hoveredIndex === i ? hoveredPillTextColor : resolvedPillTextColor,\r\n backgroundColor: hoveredIndex === i ? baseColor : \"transparent\",\r\n }}\r\n aria-label={item.ariaLabel || item.label}\r\n onMouseEnter={() => setHoveredIndex(i)}\r\n onMouseLeave={() => setHoveredIndex(null)}\r\n >\r\n {item.label}\r\n </a>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n\r\n {/* Mobile Menu Button */}\r\n <button\r\n className=\"md:hidden flex flex-col gap-1 p-2\"\r\n onClick={toggleMobileMenu}\r\n aria-label=\"Toggle menu\"\r\n >\r\n <span\r\n className={cn(\r\n \"w-5 h-0.5 transition-all duration-300\",\r\n isMobileMenuOpen && \"rotate-45 translate-y-1.5\"\r\n )}\r\n style={{ backgroundColor: baseColor }}\r\n />\r\n <span\r\n className={cn(\r\n \"w-5 h-0.5 transition-all duration-300\",\r\n isMobileMenuOpen && \"-rotate-45 -translate-y-1\"\r\n )}\r\n style={{ backgroundColor: baseColor }}\r\n />\r\n </button>\r\n </nav>\r\n\r\n {/* Mobile Menu */}\r\n {isMobileMenuOpen && (\r\n <div\r\n className=\"md:hidden absolute top-full left-0 right-0 mt-2 rounded-xl p-4 shadow-lg\"\r\n style={{ backgroundColor: pillColor }}\r\n >\r\n <ul className=\"flex flex-col gap-2\">\r\n {items.map((item) => (\r\n <li key={item.href}>\r\n <a\r\n href={item.href}\r\n className={cn(\r\n \"block px-4 py-2 rounded-lg text-sm font-medium transition-colors\",\r\n activeHref === item.href && \"font-semibold\"\r\n )}\r\n style={{ color: resolvedPillTextColor }}\r\n onClick={() => setIsMobileMenuOpen(false)}\r\n >\r\n {item.label}\r\n </a>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default PillNav;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useState}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsxs,jsx}from'react/jsx-runtime';function a(...o){return twMerge(clsx(o))}function M({logo:o,logoAlt:b="Logo",items:n,activeHref:f,className:x="",baseColor:r="#fff",pillColor:u="#000000",hoveredPillTextColor:h="#ffffff",pillTextColor:v,onMobileMenuClick:N}){let c=v??r,[t,d]=useState(false),[m,p]=useState(null),y=()=>{d(!t),N?.();};return jsxs("div",{className:a("relative",x),children:[jsxs("nav",{className:"flex items-center gap-4 px-4 py-2 rounded-full",style:{backgroundColor:u},"aria-label":"Primary",children:[o&&jsx("a",{href:n?.[0]?.href||"#","aria-label":"Home",className:"flex-shrink-0",children:jsx("img",{src:o,alt:b,className:"h-8 w-8 object-contain"})}),jsx("div",{className:"hidden md:flex items-center gap-1",children:jsx("ul",{className:"flex items-center gap-1",role:"menubar",children:n.map((l,s)=>jsx("li",{role:"none",children:jsx("a",{role:"menuitem",href:l.href,className:a("relative px-4 py-2 rounded-full text-sm font-medium transition-all duration-300",f===l.href&&"font-semibold"),style:{color:m===s?h:c,backgroundColor:m===s?r:"transparent"},"aria-label":l.ariaLabel||l.label,onMouseEnter:()=>p(s),onMouseLeave:()=>p(null),children:l.label})},l.href))})}),jsxs("button",{className:"md:hidden flex flex-col gap-1 p-2",onClick:y,"aria-label":"Toggle menu",children:[jsx("span",{className:a("w-5 h-0.5 transition-all duration-300",t&&"rotate-45 translate-y-1.5"),style:{backgroundColor:r}}),jsx("span",{className:a("w-5 h-0.5 transition-all duration-300",t&&"-rotate-45 -translate-y-1"),style:{backgroundColor:r}})]})]}),t&&jsx("div",{className:"md:hidden absolute top-full left-0 right-0 mt-2 rounded-xl p-4 shadow-lg",style:{backgroundColor:u},children:jsx("ul",{className:"flex flex-col gap-2",children:n.map(l=>jsx("li",{children:jsx("a",{href:l.href,className:a("block px-4 py-2 rounded-lg text-sm font-medium transition-colors",f===l.href&&"font-semibold"),style:{color:c},onClick:()=>d(false),children:l.label})},l.href))})})]})}var R=M;export{M as PillNav,R as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/pill-nav/index.tsx"],"names":["cn","inputs","twMerge","clsx","PillNav","logo","logoAlt","items","activeHref","className","baseColor","pillColor","hoveredPillTextColor","pillTextColor","onMobileMenuClick","resolvedPillTextColor","isMobileMenuOpen","setIsMobileMenuOpen","useState","hoveredIndex","setHoveredIndex","toggleMobileMenu","jsxs","jsx","item","i","pill_nav_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\nexport type PillNavItem = {\r\n label: string;\r\n href: string;\r\n ariaLabel?: string;\r\n};\r\n\r\nexport interface PillNavProps {\r\n logo?: string;\r\n logoAlt?: string;\r\n items: PillNavItem[];\r\n activeHref?: string;\r\n className?: string;\r\n baseColor?: string;\r\n pillColor?: string;\r\n hoveredPillTextColor?: string;\r\n pillTextColor?: string;\r\n onMobileMenuClick?: () => void;\r\n}\r\n\r\nexport function PillNav({\r\n logo,\r\n logoAlt = \"Logo\",\r\n items,\r\n activeHref,\r\n className = \"\",\r\n baseColor = \"#fff\",\r\n pillColor = \"#000000\",\r\n hoveredPillTextColor = \"#ffffff\",\r\n pillTextColor,\r\n onMobileMenuClick,\r\n}: PillNavProps) {\r\n const resolvedPillTextColor = pillTextColor ?? baseColor;\r\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\r\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\r\n\r\n const toggleMobileMenu = () => {\r\n setIsMobileMenuOpen(!isMobileMenuOpen);\r\n onMobileMenuClick?.();\r\n };\r\n\r\n return (\r\n <div className={cn(\"relative\", className)}>\r\n <nav\r\n className=\"flex items-center gap-4 px-4 py-2 rounded-full\"\r\n style={{ backgroundColor: pillColor }}\r\n aria-label=\"Primary\"\r\n >\r\n {logo && (\r\n <a href={items?.[0]?.href || \"#\"} aria-label=\"Home\" className=\"flex-shrink-0\">\r\n <img src={logo} alt={logoAlt} className=\"h-8 w-8 object-contain\" />\r\n </a>\r\n )}\r\n\r\n {/* Desktop Navigation */}\r\n <div className=\"hidden md:flex items-center gap-1\">\r\n <ul className=\"flex items-center gap-1\" role=\"menubar\">\r\n {items.map((item, i) => (\r\n <li key={item.href} role=\"none\">\r\n <a\r\n role=\"menuitem\"\r\n href={item.href}\r\n className={cn(\r\n \"relative px-4 py-2 rounded-full text-sm font-medium transition-all duration-300\",\r\n activeHref === item.href && \"font-semibold\"\r\n )}\r\n style={{\r\n color: hoveredIndex === i ? hoveredPillTextColor : resolvedPillTextColor,\r\n backgroundColor: hoveredIndex === i ? baseColor : \"transparent\",\r\n }}\r\n aria-label={item.ariaLabel || item.label}\r\n onMouseEnter={() => setHoveredIndex(i)}\r\n onMouseLeave={() => setHoveredIndex(null)}\r\n >\r\n {item.label}\r\n </a>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n\r\n {/* Mobile Menu Button */}\r\n <button\r\n className=\"md:hidden flex flex-col gap-1 p-2\"\r\n onClick={toggleMobileMenu}\r\n aria-label=\"Toggle menu\"\r\n >\r\n <span\r\n className={cn(\r\n \"w-5 h-0.5 transition-all duration-300\",\r\n isMobileMenuOpen && \"rotate-45 translate-y-1.5\"\r\n )}\r\n style={{ backgroundColor: baseColor }}\r\n />\r\n <span\r\n className={cn(\r\n \"w-5 h-0.5 transition-all duration-300\",\r\n isMobileMenuOpen && \"-rotate-45 -translate-y-1\"\r\n )}\r\n style={{ backgroundColor: baseColor }}\r\n />\r\n </button>\r\n </nav>\r\n\r\n {/* Mobile Menu */}\r\n {isMobileMenuOpen && (\r\n <div\r\n className=\"md:hidden absolute top-full left-0 right-0 mt-2 rounded-xl p-4 shadow-lg\"\r\n style={{ backgroundColor: pillColor }}\r\n >\r\n <ul className=\"flex flex-col gap-2\">\r\n {items.map((item) => (\r\n <li key={item.href}>\r\n <a\r\n href={item.href}\r\n className={cn(\r\n \"block px-4 py-2 rounded-lg text-sm font-medium transition-colors\",\r\n activeHref === item.href && \"font-semibold\"\r\n )}\r\n style={{ color: resolvedPillTextColor }}\r\n onClick={() => setIsMobileMenuOpen(false)}\r\n >\r\n {item.label}\r\n </a>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default PillNav;\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function c(...n){return tailwindMerge.twMerge(clsx.clsx(n))}function h({texts:n=["TailwindCSS","React","Next.js","TypeScript","Vercel","Motion"],className:f}){let[x,d]=react.useState(0),l=react.useRef(null),i=react.useRef([]);return react.useEffect(()=>{if(!l.current)return;let t=new IntersectionObserver(e=>{e.forEach(o=>{if(o.isIntersecting){let s=i.current.findIndex(p=>p===o.target);s!==-1&&d(s);}});},{threshold:.7,root:l.current,rootMargin:"-45% 0px -45% 0px"});return i.current.forEach(e=>{e&&t.observe(e);}),()=>t.disconnect()},[n]),jsxRuntime.jsx("div",{className:c("w-full max-w-3xl mx-auto",f),children:jsxRuntime.jsxs("div",{ref:l,className:c("h-[300px] overflow-y-auto","relative flex flex-col items-center","[&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]"),children:[jsxRuntime.jsx("div",{className:"h-[150px]"}),jsxRuntime.jsx("div",{className:"flex flex-col items-center w-full",children:n.map((t,e)=>jsxRuntime.jsx("div",{ref:o=>{i.current[e]=o;},className:c("text-5xl font-bold py-8 px-4 whitespace-nowrap","transition-all duration-300",x===e?"text-zinc-900 dark:text-white scale-100 opacity-100":"text-zinc-400/50 dark:text-zinc-600 scale-95 opacity-50"),children:t},`${t}-${e}`))}),jsxRuntime.jsx("div",{className:"h-[150px]"})]})})}var I=h;exports.ScrollText=h;exports.default=I;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/scroll-text/index.tsx"],"names":["cn","inputs","twMerge","clsx","ScrollText","texts","className","activeIndex","setActiveIndex","useState","containerRef","useRef","itemsRef","useEffect","observer","entries","entry","index","item","jsx","jsxs","text","el","scroll_text_default"],"mappings":"sMAGO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,qBAAAA,CAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CCKO,SAASG,CAAAA,CAAW,CACzB,KAAA,CAAAC,CAAAA,CAAQ,CACN,cACA,OAAA,CACA,SAAA,CACA,YAAA,CACA,QAAA,CACA,QACF,CAAA,CACA,UAAAC,CACF,CAAA,CAAoB,CAClB,GAAM,CAACC,CAAAA,CAAaC,CAAc,CAAA,CAAIC,cAAAA,CAAS,CAAC,CAAA,CAC1CC,CAAAA,CAAeC,aAAuB,IAAI,CAAA,CAC1CC,CAAAA,CAAWD,YAAAA,CAAkC,EAAE,EAErD,OAAAE,eAAAA,CAAU,IAAM,CACd,GAAI,CAACH,EAAa,OAAA,CAAS,OAE3B,IAAMI,CAAAA,CAAW,IAAI,oBAAA,CAClBC,GAAY,CACXA,CAAAA,CAAQ,QAASC,CAAAA,EAAU,CACzB,GAAIA,CAAAA,CAAM,cAAA,CAAgB,CACxB,IAAMC,CAAAA,CAAQL,CAAAA,CAAS,QAAQ,SAAA,CAC5BM,CAAAA,EAASA,CAAAA,GAASF,CAAAA,CAAM,MAC3B,CAAA,CACIC,IAAU,EAAA,EACZT,CAAAA,CAAeS,CAAK,EAExB,CACF,CAAC,EACH,CAAA,CACA,CACE,UAAW,EAAA,CACX,IAAA,CAAMP,EAAa,OAAA,CACnB,UAAA,CAAY,mBACd,CACF,CAAA,CAEA,OAAAE,EAAS,OAAA,CAAQ,OAAA,CAASM,CAAAA,EAAS,CAC7BA,CAAAA,EAAMJ,CAAAA,CAAS,QAAQI,CAAI,EACjC,CAAC,CAAA,CAEM,IAAMJ,CAAAA,CAAS,YACxB,CAAA,CAAG,CAACT,CAAK,CAAC,EAGRc,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWnB,CAAAA,CAAG,0BAAA,CAA4BM,CAAS,EACtD,QAAA,CAAAc,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKV,CAAAA,CACL,SAAA,CAAWV,EACT,2BAAA,CACA,qCAAA,CACA,gFACF,CAAA,CAEA,QAAA,CAAA,CAAAmB,cAAAA,CAAC,OAAI,SAAA,CAAU,WAAA,CAAY,EAC3BA,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,mCAAA,CACZ,QAAA,CAAAd,CAAAA,CAAM,GAAA,CAAI,CAACgB,CAAAA,CAAMJ,IAChBE,cAAAA,CAAC,KAAA,CAAA,CAEC,GAAA,CAAMG,CAAAA,EAAO,CACXV,CAAAA,CAAS,QAAQK,CAAK,CAAA,CAAIK,EAC5B,CAAA,CACA,SAAA,CAAWtB,CAAAA,CACT,iDACA,6BAAA,CACAO,CAAAA,GAAgBU,CAAAA,CACZ,qDAAA,CACA,yDACN,CAAA,CAEC,SAAAI,CAAAA,CAAAA,CAZI,CAAA,EAAGA,CAAI,CAAA,CAAA,EAAIJ,CAAK,CAAA,CAavB,CACD,CAAA,CACH,CAAA,CACAE,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CAAY,GAC7B,CAAA,CACF,CAEJ,CAEA,IAAOI,CAAAA,CAAQnB","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useRef, useState, useEffect } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface ScrollTextProps {\r\n texts?: string[];\r\n className?: string;\r\n}\r\n\r\nexport function ScrollText({\r\n texts = [\r\n \"TailwindCSS\",\r\n \"React\",\r\n \"Next.js\",\r\n \"TypeScript\",\r\n \"Vercel\",\r\n \"Motion\",\r\n ],\r\n className,\r\n}: ScrollTextProps) {\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const itemsRef = useRef<(HTMLDivElement | null)[]>([]);\r\n\r\n useEffect(() => {\r\n if (!containerRef.current) return;\r\n\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting) {\r\n const index = itemsRef.current.findIndex(\r\n (item) => item === entry.target\r\n );\r\n if (index !== -1) {\r\n setActiveIndex(index);\r\n }\r\n }\r\n });\r\n },\r\n {\r\n threshold: 0.7,\r\n root: containerRef.current,\r\n rootMargin: \"-45% 0px -45% 0px\",\r\n }\r\n );\r\n\r\n itemsRef.current.forEach((item) => {\r\n if (item) observer.observe(item);\r\n });\r\n\r\n return () => observer.disconnect();\r\n }, [texts]);\r\n\r\n return (\r\n <div className={cn(\"w-full max-w-3xl mx-auto\", className)}>\r\n <div\r\n ref={containerRef}\r\n className={cn(\r\n \"h-[300px] overflow-y-auto\",\r\n \"relative flex flex-col items-center\",\r\n \"[&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]\"\r\n )}\r\n >\r\n <div className=\"h-[150px]\" />\r\n <div className=\"flex flex-col items-center w-full\">\r\n {texts.map((text, index) => (\r\n <div\r\n key={`${text}-${index}`}\r\n ref={(el) => {\r\n itemsRef.current[index] = el;\r\n }}\r\n className={cn(\r\n \"text-5xl font-bold py-8 px-4 whitespace-nowrap\",\r\n \"transition-all duration-300\",\r\n activeIndex === index\r\n ? \"text-zinc-900 dark:text-white scale-100 opacity-100\"\r\n : \"text-zinc-400/50 dark:text-zinc-600 scale-95 opacity-50\"\r\n )}\r\n >\r\n {text}\r\n </div>\r\n ))}\r\n </div>\r\n <div className=\"h-[150px]\" />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default ScrollText;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useState,useRef,useEffect}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs}from'react/jsx-runtime';function c(...n){return twMerge(clsx(n))}function h({texts:n=["TailwindCSS","React","Next.js","TypeScript","Vercel","Motion"],className:f}){let[x,d]=useState(0),l=useRef(null),i=useRef([]);return useEffect(()=>{if(!l.current)return;let t=new IntersectionObserver(e=>{e.forEach(o=>{if(o.isIntersecting){let s=i.current.findIndex(p=>p===o.target);s!==-1&&d(s);}});},{threshold:.7,root:l.current,rootMargin:"-45% 0px -45% 0px"});return i.current.forEach(e=>{e&&t.observe(e);}),()=>t.disconnect()},[n]),jsx("div",{className:c("w-full max-w-3xl mx-auto",f),children:jsxs("div",{ref:l,className:c("h-[300px] overflow-y-auto","relative flex flex-col items-center","[&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]"),children:[jsx("div",{className:"h-[150px]"}),jsx("div",{className:"flex flex-col items-center w-full",children:n.map((t,e)=>jsx("div",{ref:o=>{i.current[e]=o;},className:c("text-5xl font-bold py-8 px-4 whitespace-nowrap","transition-all duration-300",x===e?"text-zinc-900 dark:text-white scale-100 opacity-100":"text-zinc-400/50 dark:text-zinc-600 scale-95 opacity-50"),children:t},`${t}-${e}`))}),jsx("div",{className:"h-[150px]"})]})})}var I=h;export{h as ScrollText,I as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/scroll-text/index.tsx"],"names":["cn","inputs","twMerge","clsx","ScrollText","texts","className","activeIndex","setActiveIndex","useState","containerRef","useRef","itemsRef","useEffect","observer","entries","entry","index","item","jsx","jsxs","text","el","scroll_text_default"],"mappings":"oJAGO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,OAAAA,CAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCKO,SAASG,CAAAA,CAAW,CACzB,KAAA,CAAAC,CAAAA,CAAQ,CACN,cACA,OAAA,CACA,SAAA,CACA,YAAA,CACA,QAAA,CACA,QACF,CAAA,CACA,UAAAC,CACF,CAAA,CAAoB,CAClB,GAAM,CAACC,CAAAA,CAAaC,CAAc,CAAA,CAAIC,QAAAA,CAAS,CAAC,CAAA,CAC1CC,CAAAA,CAAeC,OAAuB,IAAI,CAAA,CAC1CC,CAAAA,CAAWD,MAAAA,CAAkC,EAAE,EAErD,OAAAE,SAAAA,CAAU,IAAM,CACd,GAAI,CAACH,EAAa,OAAA,CAAS,OAE3B,IAAMI,CAAAA,CAAW,IAAI,oBAAA,CAClBC,GAAY,CACXA,CAAAA,CAAQ,QAASC,CAAAA,EAAU,CACzB,GAAIA,CAAAA,CAAM,cAAA,CAAgB,CACxB,IAAMC,CAAAA,CAAQL,CAAAA,CAAS,QAAQ,SAAA,CAC5BM,CAAAA,EAASA,CAAAA,GAASF,CAAAA,CAAM,MAC3B,CAAA,CACIC,IAAU,EAAA,EACZT,CAAAA,CAAeS,CAAK,EAExB,CACF,CAAC,EACH,CAAA,CACA,CACE,UAAW,EAAA,CACX,IAAA,CAAMP,EAAa,OAAA,CACnB,UAAA,CAAY,mBACd,CACF,CAAA,CAEA,OAAAE,EAAS,OAAA,CAAQ,OAAA,CAASM,CAAAA,EAAS,CAC7BA,CAAAA,EAAMJ,CAAAA,CAAS,QAAQI,CAAI,EACjC,CAAC,CAAA,CAEM,IAAMJ,CAAAA,CAAS,YACxB,CAAA,CAAG,CAACT,CAAK,CAAC,EAGRc,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWnB,CAAAA,CAAG,0BAAA,CAA4BM,CAAS,EACtD,QAAA,CAAAc,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKV,CAAAA,CACL,SAAA,CAAWV,EACT,2BAAA,CACA,qCAAA,CACA,gFACF,CAAA,CAEA,QAAA,CAAA,CAAAmB,GAAAA,CAAC,OAAI,SAAA,CAAU,WAAA,CAAY,EAC3BA,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,mCAAA,CACZ,QAAA,CAAAd,CAAAA,CAAM,GAAA,CAAI,CAACgB,CAAAA,CAAMJ,IAChBE,GAAAA,CAAC,KAAA,CAAA,CAEC,GAAA,CAAMG,CAAAA,EAAO,CACXV,CAAAA,CAAS,QAAQK,CAAK,CAAA,CAAIK,EAC5B,CAAA,CACA,SAAA,CAAWtB,CAAAA,CACT,iDACA,6BAAA,CACAO,CAAAA,GAAgBU,CAAAA,CACZ,qDAAA,CACA,yDACN,CAAA,CAEC,SAAAI,CAAAA,CAAAA,CAZI,CAAA,EAAGA,CAAI,CAAA,CAAA,EAAIJ,CAAK,CAAA,CAavB,CACD,CAAA,CACH,CAAA,CACAE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CAAY,GAC7B,CAAA,CACF,CAEJ,CAEA,IAAOI,CAAAA,CAAQnB","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useRef, useState, useEffect } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface ScrollTextProps {\r\n texts?: string[];\r\n className?: string;\r\n}\r\n\r\nexport function ScrollText({\r\n texts = [\r\n \"TailwindCSS\",\r\n \"React\",\r\n \"Next.js\",\r\n \"TypeScript\",\r\n \"Vercel\",\r\n \"Motion\",\r\n ],\r\n className,\r\n}: ScrollTextProps) {\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const itemsRef = useRef<(HTMLDivElement | null)[]>([]);\r\n\r\n useEffect(() => {\r\n if (!containerRef.current) return;\r\n\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting) {\r\n const index = itemsRef.current.findIndex(\r\n (item) => item === entry.target\r\n );\r\n if (index !== -1) {\r\n setActiveIndex(index);\r\n }\r\n }\r\n });\r\n },\r\n {\r\n threshold: 0.7,\r\n root: containerRef.current,\r\n rootMargin: \"-45% 0px -45% 0px\",\r\n }\r\n );\r\n\r\n itemsRef.current.forEach((item) => {\r\n if (item) observer.observe(item);\r\n });\r\n\r\n return () => observer.disconnect();\r\n }, [texts]);\r\n\r\n return (\r\n <div className={cn(\"w-full max-w-3xl mx-auto\", className)}>\r\n <div\r\n ref={containerRef}\r\n className={cn(\r\n \"h-[300px] overflow-y-auto\",\r\n \"relative flex flex-col items-center\",\r\n \"[&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]\"\r\n )}\r\n >\r\n <div className=\"h-[150px]\" />\r\n <div className=\"flex flex-col items-center w-full\">\r\n {texts.map((text, index) => (\r\n <div\r\n key={`${text}-${index}`}\r\n ref={(el) => {\r\n itemsRef.current[index] = el;\r\n }}\r\n className={cn(\r\n \"text-5xl font-bold py-8 px-4 whitespace-nowrap\",\r\n \"transition-all duration-300\",\r\n activeIndex === index\r\n ? \"text-zinc-900 dark:text-white scale-100 opacity-100\"\r\n : \"text-zinc-400/50 dark:text-zinc-600 scale-95 opacity-50\"\r\n )}\r\n >\r\n {text}\r\n </div>\r\n ))}\r\n </div>\r\n <div className=\"h-[150px]\" />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default ScrollText;\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function i(...r){return tailwindMerge.twMerge(clsx.clsx(r))}function b({trigger:r,title:s="Drawer Title",description:l,children:n,className:d,side:c="right"}){let[e,a]=react.useState(false);return react.useEffect(()=>(e?document.body.style.overflow="hidden":document.body.style.overflow="",()=>{document.body.style.overflow="";}),[e]),jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{onClick:()=>a(true),className:"cursor-pointer",children:r||jsxRuntime.jsx("button",{className:"px-4 py-2 bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 rounded-lg font-medium hover:opacity-90 transition-opacity",children:"Open Drawer"})}),e&&jsxRuntime.jsx("div",{className:"fixed inset-0 z-50 bg-black/50 backdrop-blur-sm transition-opacity duration-300",onClick:()=>a(false)}),jsxRuntime.jsx("div",{"data-open":e,className:i("fixed z-50 bg-white dark:bg-zinc-900 shadow-xl transition-transform duration-300 ease-out",{left:"left-0 top-0 h-full w-80 -translate-x-full data-[open=true]:translate-x-0",right:"right-0 top-0 h-full w-80 translate-x-full data-[open=true]:translate-x-0",top:"top-0 left-0 w-full h-80 -translate-y-full data-[open=true]:translate-y-0",bottom:"bottom-0 left-0 w-full h-80 translate-y-full data-[open=true]:translate-y-0"}[c],d),children:jsxRuntime.jsxs("div",{className:"flex flex-col h-full",children:[jsxRuntime.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-zinc-200 dark:border-zinc-800",children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("h2",{className:"text-lg font-semibold text-zinc-900 dark:text-white",children:s}),l&&jsxRuntime.jsx("p",{className:"text-sm text-zinc-500 dark:text-zinc-400",children:l})]}),jsxRuntime.jsx("button",{onClick:()=>a(false),className:"p-2 rounded-lg hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors","aria-label":"Close drawer",children:jsxRuntime.jsx("svg",{className:"w-5 h-5 text-zinc-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),jsxRuntime.jsx("div",{className:"flex-1 overflow-auto p-4",children:n})]})})]})}var z=b;exports.SmoothDrawer=b;exports.default=z;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/smooth-drawer/index.tsx"],"names":["cn","inputs","twMerge","clsx","SmoothDrawer","trigger","title","description","children","className","side","isOpen","setIsOpen","useState","useEffect","jsxs","Fragment","jsx","smooth_drawer_default"],"mappings":"sMAGO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,sBAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CCSO,SAASG,EAAa,CAC3B,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CAAQ,cAAA,CACR,YAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,EAAO,OACT,CAAA,CAAsB,CACpB,GAAM,CAACC,CAAAA,CAAQC,CAAS,CAAA,CAAIC,cAAAA,CAAS,KAAK,CAAA,CAE1C,OAAAC,gBAAU,KACJH,CAAAA,CACF,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAW,SAE/B,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAW,EAAA,CAE1B,IAAM,CACX,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAW,GACjC,CAAA,CAAA,CACC,CAACA,CAAM,CAAC,CAAA,CAUTI,eAAAA,CAAAC,mBAAAA,CAAA,CAEE,UAAAC,cAAAA,CAAC,KAAA,CAAA,CAAI,OAAA,CAAS,IAAML,CAAAA,CAAU,IAAI,EAAG,SAAA,CAAU,gBAAA,CAC5C,QAAA,CAAAP,CAAAA,EACCY,cAAAA,CAAC,QAAA,CAAA,CAAO,UAAU,8HAAA,CAA+H,QAAA,CAAA,aAAA,CAEjJ,CAAA,CAEJ,CAAA,CAGCN,CAAAA,EACCM,cAAAA,CAAC,OACC,SAAA,CAAU,iFAAA,CACV,QAAS,IAAML,CAAAA,CAAU,KAAK,CAAA,CAChC,CAAA,CAIFK,cAAAA,CAAC,KAAA,CAAA,CACC,WAAA,CAAWN,CAAAA,CACX,UAAWX,CAAAA,CACT,2FAAA,CA9BW,CACjB,IAAA,CAAM,2EAAA,CACN,KAAA,CAAO,4EACP,GAAA,CAAK,2EAAA,CACL,MAAA,CAAQ,6EACV,CAAA,CA0BmBU,CAAI,EACfD,CACF,CAAA,CAEA,QAAA,CAAAM,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAEb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qFAAA,CACb,QAAA,CAAA,CAAAA,gBAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAE,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,qDAAA,CACX,SAAAX,CAAAA,CACH,CAAA,CACCC,CAAAA,EACCU,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,2CACV,QAAA,CAAAV,CAAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CACAU,cAAAA,CAAC,QAAA,CAAA,CACC,QAAS,IAAML,CAAAA,CAAU,KAAK,CAAA,CAC9B,SAAA,CAAU,2EAAA,CACV,aAAW,cAAA,CAEX,QAAA,CAAAK,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,uBAAA,CACV,KAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,OAAA,CAAQ,WAAA,CAER,QAAA,CAAAA,eAAC,MAAA,CAAA,CACC,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CACf,WAAA,CAAa,EACb,CAAA,CAAE,sBAAA,CACJ,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGAA,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CAA4B,QAAA,CAAAT,CAAAA,CAAS,CAAA,CAAA,CACtD,EACF,CAAA,CAAA,CACF,CAEJ,CAEA,IAAOU,CAAAA,CAAQd","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useState, useEffect } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface SmoothDrawerProps {\r\n trigger?: React.ReactNode;\r\n title?: string;\r\n description?: string;\r\n children?: React.ReactNode;\r\n className?: string;\r\n side?: \"left\" | \"right\" | \"top\" | \"bottom\";\r\n}\r\n\r\nexport function SmoothDrawer({\r\n trigger,\r\n title = \"Drawer Title\",\r\n description,\r\n children,\r\n className,\r\n side = \"right\",\r\n}: SmoothDrawerProps) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n document.body.style.overflow = \"hidden\";\r\n } else {\r\n document.body.style.overflow = \"\";\r\n }\r\n return () => {\r\n document.body.style.overflow = \"\";\r\n };\r\n }, [isOpen]);\r\n\r\n const sideStyles = {\r\n left: \"left-0 top-0 h-full w-80 -translate-x-full data-[open=true]:translate-x-0\",\r\n right: \"right-0 top-0 h-full w-80 translate-x-full data-[open=true]:translate-x-0\",\r\n top: \"top-0 left-0 w-full h-80 -translate-y-full data-[open=true]:translate-y-0\",\r\n bottom: \"bottom-0 left-0 w-full h-80 translate-y-full data-[open=true]:translate-y-0\",\r\n };\r\n\r\n return (\r\n <>\r\n {/* Trigger */}\r\n <div onClick={() => setIsOpen(true)} className=\"cursor-pointer\">\r\n {trigger || (\r\n <button className=\"px-4 py-2 bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 rounded-lg font-medium hover:opacity-90 transition-opacity\">\r\n Open Drawer\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Overlay */}\r\n {isOpen && (\r\n <div\r\n className=\"fixed inset-0 z-50 bg-black/50 backdrop-blur-sm transition-opacity duration-300\"\r\n onClick={() => setIsOpen(false)}\r\n />\r\n )}\r\n\r\n {/* Drawer */}\r\n <div\r\n data-open={isOpen}\r\n className={cn(\r\n \"fixed z-50 bg-white dark:bg-zinc-900 shadow-xl transition-transform duration-300 ease-out\",\r\n sideStyles[side],\r\n className\r\n )}\r\n >\r\n <div className=\"flex flex-col h-full\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between p-4 border-b border-zinc-200 dark:border-zinc-800\">\r\n <div>\r\n <h2 className=\"text-lg font-semibold text-zinc-900 dark:text-white\">\r\n {title}\r\n </h2>\r\n {description && (\r\n <p className=\"text-sm text-zinc-500 dark:text-zinc-400\">\r\n {description}\r\n </p>\r\n )}\r\n </div>\r\n <button\r\n onClick={() => setIsOpen(false)}\r\n className=\"p-2 rounded-lg hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors\"\r\n aria-label=\"Close drawer\"\r\n >\r\n <svg\r\n className=\"w-5 h-5 text-zinc-500\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M6 18L18 6M6 6l12 12\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-auto p-4\">{children}</div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\nexport default SmoothDrawer;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useState,useEffect}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsxs,Fragment,jsx}from'react/jsx-runtime';function i(...r){return twMerge(clsx(r))}function b({trigger:r,title:s="Drawer Title",description:l,children:n,className:d,side:c="right"}){let[e,a]=useState(false);return useEffect(()=>(e?document.body.style.overflow="hidden":document.body.style.overflow="",()=>{document.body.style.overflow="";}),[e]),jsxs(Fragment,{children:[jsx("div",{onClick:()=>a(true),className:"cursor-pointer",children:r||jsx("button",{className:"px-4 py-2 bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 rounded-lg font-medium hover:opacity-90 transition-opacity",children:"Open Drawer"})}),e&&jsx("div",{className:"fixed inset-0 z-50 bg-black/50 backdrop-blur-sm transition-opacity duration-300",onClick:()=>a(false)}),jsx("div",{"data-open":e,className:i("fixed z-50 bg-white dark:bg-zinc-900 shadow-xl transition-transform duration-300 ease-out",{left:"left-0 top-0 h-full w-80 -translate-x-full data-[open=true]:translate-x-0",right:"right-0 top-0 h-full w-80 translate-x-full data-[open=true]:translate-x-0",top:"top-0 left-0 w-full h-80 -translate-y-full data-[open=true]:translate-y-0",bottom:"bottom-0 left-0 w-full h-80 translate-y-full data-[open=true]:translate-y-0"}[c],d),children:jsxs("div",{className:"flex flex-col h-full",children:[jsxs("div",{className:"flex items-center justify-between p-4 border-b border-zinc-200 dark:border-zinc-800",children:[jsxs("div",{children:[jsx("h2",{className:"text-lg font-semibold text-zinc-900 dark:text-white",children:s}),l&&jsx("p",{className:"text-sm text-zinc-500 dark:text-zinc-400",children:l})]}),jsx("button",{onClick:()=>a(false),className:"p-2 rounded-lg hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors","aria-label":"Close drawer",children:jsx("svg",{className:"w-5 h-5 text-zinc-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),jsx("div",{className:"flex-1 overflow-auto p-4",children:n})]})})]})}var z=b;export{b as SmoothDrawer,z as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/smooth-drawer/index.tsx"],"names":["cn","inputs","twMerge","clsx","SmoothDrawer","trigger","title","description","children","className","side","isOpen","setIsOpen","useState","useEffect","jsxs","Fragment","jsx","smooth_drawer_default"],"mappings":"sJAGO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,QAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCSO,SAASG,EAAa,CAC3B,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CAAQ,cAAA,CACR,YAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,EAAO,OACT,CAAA,CAAsB,CACpB,GAAM,CAACC,CAAAA,CAAQC,CAAS,CAAA,CAAIC,QAAAA,CAAS,KAAK,CAAA,CAE1C,OAAAC,UAAU,KACJH,CAAAA,CACF,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAW,SAE/B,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAW,EAAA,CAE1B,IAAM,CACX,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAW,GACjC,CAAA,CAAA,CACC,CAACA,CAAM,CAAC,CAAA,CAUTI,IAAAA,CAAAC,QAAAA,CAAA,CAEE,UAAAC,GAAAA,CAAC,KAAA,CAAA,CAAI,OAAA,CAAS,IAAML,CAAAA,CAAU,IAAI,EAAG,SAAA,CAAU,gBAAA,CAC5C,QAAA,CAAAP,CAAAA,EACCY,GAAAA,CAAC,QAAA,CAAA,CAAO,UAAU,8HAAA,CAA+H,QAAA,CAAA,aAAA,CAEjJ,CAAA,CAEJ,CAAA,CAGCN,CAAAA,EACCM,GAAAA,CAAC,OACC,SAAA,CAAU,iFAAA,CACV,QAAS,IAAML,CAAAA,CAAU,KAAK,CAAA,CAChC,CAAA,CAIFK,GAAAA,CAAC,KAAA,CAAA,CACC,WAAA,CAAWN,CAAAA,CACX,UAAWX,CAAAA,CACT,2FAAA,CA9BW,CACjB,IAAA,CAAM,2EAAA,CACN,KAAA,CAAO,4EACP,GAAA,CAAK,2EAAA,CACL,MAAA,CAAQ,6EACV,CAAA,CA0BmBU,CAAI,EACfD,CACF,CAAA,CAEA,QAAA,CAAAM,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAEb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qFAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAE,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,qDAAA,CACX,SAAAX,CAAAA,CACH,CAAA,CACCC,CAAAA,EACCU,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,2CACV,QAAA,CAAAV,CAAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CACAU,GAAAA,CAAC,QAAA,CAAA,CACC,QAAS,IAAML,CAAAA,CAAU,KAAK,CAAA,CAC9B,SAAA,CAAU,2EAAA,CACV,aAAW,cAAA,CAEX,QAAA,CAAAK,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,uBAAA,CACV,KAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,OAAA,CAAQ,WAAA,CAER,QAAA,CAAAA,IAAC,MAAA,CAAA,CACC,aAAA,CAAc,OAAA,CACd,cAAA,CAAe,OAAA,CACf,WAAA,CAAa,EACb,CAAA,CAAE,sBAAA,CACJ,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGAA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BAAA,CAA4B,QAAA,CAAAT,CAAAA,CAAS,CAAA,CAAA,CACtD,EACF,CAAA,CAAA,CACF,CAEJ,CAEA,IAAOU,CAAAA,CAAQd","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useState, useEffect } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface SmoothDrawerProps {\r\n trigger?: React.ReactNode;\r\n title?: string;\r\n description?: string;\r\n children?: React.ReactNode;\r\n className?: string;\r\n side?: \"left\" | \"right\" | \"top\" | \"bottom\";\r\n}\r\n\r\nexport function SmoothDrawer({\r\n trigger,\r\n title = \"Drawer Title\",\r\n description,\r\n children,\r\n className,\r\n side = \"right\",\r\n}: SmoothDrawerProps) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n document.body.style.overflow = \"hidden\";\r\n } else {\r\n document.body.style.overflow = \"\";\r\n }\r\n return () => {\r\n document.body.style.overflow = \"\";\r\n };\r\n }, [isOpen]);\r\n\r\n const sideStyles = {\r\n left: \"left-0 top-0 h-full w-80 -translate-x-full data-[open=true]:translate-x-0\",\r\n right: \"right-0 top-0 h-full w-80 translate-x-full data-[open=true]:translate-x-0\",\r\n top: \"top-0 left-0 w-full h-80 -translate-y-full data-[open=true]:translate-y-0\",\r\n bottom: \"bottom-0 left-0 w-full h-80 translate-y-full data-[open=true]:translate-y-0\",\r\n };\r\n\r\n return (\r\n <>\r\n {/* Trigger */}\r\n <div onClick={() => setIsOpen(true)} className=\"cursor-pointer\">\r\n {trigger || (\r\n <button className=\"px-4 py-2 bg-zinc-900 dark:bg-white text-white dark:text-zinc-900 rounded-lg font-medium hover:opacity-90 transition-opacity\">\r\n Open Drawer\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Overlay */}\r\n {isOpen && (\r\n <div\r\n className=\"fixed inset-0 z-50 bg-black/50 backdrop-blur-sm transition-opacity duration-300\"\r\n onClick={() => setIsOpen(false)}\r\n />\r\n )}\r\n\r\n {/* Drawer */}\r\n <div\r\n data-open={isOpen}\r\n className={cn(\r\n \"fixed z-50 bg-white dark:bg-zinc-900 shadow-xl transition-transform duration-300 ease-out\",\r\n sideStyles[side],\r\n className\r\n )}\r\n >\r\n <div className=\"flex flex-col h-full\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between p-4 border-b border-zinc-200 dark:border-zinc-800\">\r\n <div>\r\n <h2 className=\"text-lg font-semibold text-zinc-900 dark:text-white\">\r\n {title}\r\n </h2>\r\n {description && (\r\n <p className=\"text-sm text-zinc-500 dark:text-zinc-400\">\r\n {description}\r\n </p>\r\n )}\r\n </div>\r\n <button\r\n onClick={() => setIsOpen(false)}\r\n className=\"p-2 rounded-lg hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors\"\r\n aria-label=\"Close drawer\"\r\n >\r\n <svg\r\n className=\"w-5 h-5 text-zinc-500\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M6 18L18 6M6 6l12 12\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-auto p-4\">{children}</div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\nexport default SmoothDrawer;\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function o(...t){return tailwindMerge.twMerge(clsx.clsx(t))}var N=[{id:"tab1",title:"Tab 1",color:"bg-blue-500"},{id:"tab2",title:"Tab 2",color:"bg-purple-500"},{id:"tab3",title:"Tab 3",color:"bg-emerald-500"},{id:"tab4",title:"Tab 4",color:"bg-amber-500"}];function S({items:t=N,defaultTabId:m,className:p,activeColor:v="bg-blue-500",onChange:x}){let[r,h]=react.useState(m||t[0]?.id||""),[a,T]=react.useState({width:0,left:0}),s=react.useRef(new Map),d=react.useRef(null);react.useLayoutEffect(()=>{let e=()=>{let n=s.current.get(r),i=d.current;if(n&&i){let u=n.getBoundingClientRect(),w=i.getBoundingClientRect();T({width:u.width,left:u.left-w.left});}};return requestAnimationFrame(e),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[r]);let z=e=>{h(e),x?.(e);},l=t.find(e=>e.id===r);return jsxRuntime.jsxs("div",{className:o("flex flex-col",p),children:[l?.content&&jsxRuntime.jsx("div",{className:"mb-4 p-6 bg-zinc-100 dark:bg-zinc-900 rounded-lg min-h-[200px]",children:l.content}),jsxRuntime.jsxs("div",{ref:d,role:"tablist",className:o("relative flex items-center gap-1 p-1","bg-zinc-100 dark:bg-zinc-900 rounded-xl","border border-zinc-200 dark:border-zinc-800"),children:[jsxRuntime.jsx("div",{className:o("absolute rounded-lg transition-all duration-300 ease-out",l?.color||v),style:{width:a.width-8,left:a.left+4,height:"calc(100% - 8px)",top:"4px"}}),t.map(e=>{let n=r===e.id;return jsxRuntime.jsx("button",{ref:i=>{i?s.current.set(e.id,i):s.current.delete(e.id);},type:"button",role:"tab","aria-selected":n,onClick:()=>z(e.id),className:o("relative z-10 flex-1 px-4 py-2 rounded-lg","text-sm font-medium transition-colors duration-300","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500",n?"text-white":"text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-zinc-100"),children:e.title},e.id)})]})]})}var D=S;exports.SmoothTab=S;exports.default=D;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/smooth-tab/index.tsx"],"names":["cn","inputs","twMerge","clsx","DEFAULT_TABS","SmoothTab","items","defaultTabId","className","activeColor","onChange","selected","setSelected","useState","dimensions","setDimensions","buttonRefs","useRef","containerRef","useLayoutEffect","updateDimensions","selectedButton","container","rect","containerRect","handleTabClick","tabId","selectedItem","item","jsxs","jsx","isSelected","el","smooth_tab_default"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useState, useRef, useLayoutEffect } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface TabItem {\r\n id: string;\r\n title: string;\r\n content?: React.ReactNode;\r\n color?: string;\r\n}\r\n\r\ninterface SmoothTabProps {\r\n items?: TabItem[];\r\n defaultTabId?: string;\r\n className?: string;\r\n activeColor?: string;\r\n onChange?: (tabId: string) => void;\r\n}\r\n\r\nconst DEFAULT_TABS: TabItem[] = [\r\n { id: \"tab1\", title: \"Tab 1\", color: \"bg-blue-500\" },\r\n { id: \"tab2\", title: \"Tab 2\", color: \"bg-purple-500\" },\r\n { id: \"tab3\", title: \"Tab 3\", color: \"bg-emerald-500\" },\r\n { id: \"tab4\", title: \"Tab 4\", color: \"bg-amber-500\" },\r\n];\r\n\r\nexport function SmoothTab({\r\n items = DEFAULT_TABS,\r\n defaultTabId,\r\n className,\r\n activeColor = \"bg-blue-500\",\r\n onChange,\r\n}: SmoothTabProps) {\r\n const [selected, setSelected] = useState<string>(defaultTabId || items[0]?.id || \"\");\r\n const [dimensions, setDimensions] = useState({ width: 0, left: 0 });\r\n const buttonRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n useLayoutEffect(() => {\r\n const updateDimensions = () => {\r\n const selectedButton = buttonRefs.current.get(selected);\r\n const container = containerRef.current;\r\n\r\n if (selectedButton && container) {\r\n const rect = selectedButton.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n\r\n setDimensions({\r\n width: rect.width,\r\n left: rect.left - containerRect.left,\r\n });\r\n }\r\n };\r\n\r\n requestAnimationFrame(updateDimensions);\r\n window.addEventListener(\"resize\", updateDimensions);\r\n return () => window.removeEventListener(\"resize\", updateDimensions);\r\n }, [selected]);\r\n\r\n const handleTabClick = (tabId: string) => {\r\n setSelected(tabId);\r\n onChange?.(tabId);\r\n };\r\n\r\n const selectedItem = items.find((item) => item.id === selected);\r\n\r\n return (\r\n <div className={cn(\"flex flex-col\", className)}>\r\n {/* Content Area */}\r\n {selectedItem?.content && (\r\n <div className=\"mb-4 p-6 bg-zinc-100 dark:bg-zinc-900 rounded-lg min-h-[200px]\">\r\n {selectedItem.content}\r\n </div>\r\n )}\r\n\r\n {/* Tab Bar */}\r\n <div\r\n ref={containerRef}\r\n role=\"tablist\"\r\n className={cn(\r\n \"relative flex items-center gap-1 p-1\",\r\n \"bg-zinc-100 dark:bg-zinc-900 rounded-xl\",\r\n \"border border-zinc-200 dark:border-zinc-800\"\r\n )}\r\n >\r\n {/* Sliding Background */}\r\n <div\r\n className={cn(\r\n \"absolute rounded-lg transition-all duration-300 ease-out\",\r\n selectedItem?.color || activeColor\r\n )}\r\n style={{\r\n width: dimensions.width - 8,\r\n left: dimensions.left + 4,\r\n height: \"calc(100% - 8px)\",\r\n top: \"4px\",\r\n }}\r\n />\r\n\r\n {/* Tab Buttons */}\r\n {items.map((item) => {\r\n const isSelected = selected === item.id;\r\n return (\r\n <button\r\n key={item.id}\r\n ref={(el) => {\r\n if (el) buttonRefs.current.set(item.id, el);\r\n else buttonRefs.current.delete(item.id);\r\n }}\r\n type=\"button\"\r\n role=\"tab\"\r\n aria-selected={isSelected}\r\n onClick={() => handleTabClick(item.id)}\r\n className={cn(\r\n \"relative z-10 flex-1 px-4 py-2 rounded-lg\",\r\n \"text-sm font-medium transition-colors duration-300\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500\",\r\n isSelected\r\n ? \"text-white\"\r\n : \"text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-zinc-100\"\r\n )}\r\n >\r\n {item.title}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default SmoothTab;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useState,useRef,useLayoutEffect}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsxs,jsx}from'react/jsx-runtime';function o(...t){return twMerge(clsx(t))}var N=[{id:"tab1",title:"Tab 1",color:"bg-blue-500"},{id:"tab2",title:"Tab 2",color:"bg-purple-500"},{id:"tab3",title:"Tab 3",color:"bg-emerald-500"},{id:"tab4",title:"Tab 4",color:"bg-amber-500"}];function S({items:t=N,defaultTabId:m,className:p,activeColor:v="bg-blue-500",onChange:x}){let[r,h]=useState(m||t[0]?.id||""),[a,T]=useState({width:0,left:0}),s=useRef(new Map),d=useRef(null);useLayoutEffect(()=>{let e=()=>{let n=s.current.get(r),i=d.current;if(n&&i){let u=n.getBoundingClientRect(),w=i.getBoundingClientRect();T({width:u.width,left:u.left-w.left});}};return requestAnimationFrame(e),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[r]);let z=e=>{h(e),x?.(e);},l=t.find(e=>e.id===r);return jsxs("div",{className:o("flex flex-col",p),children:[l?.content&&jsx("div",{className:"mb-4 p-6 bg-zinc-100 dark:bg-zinc-900 rounded-lg min-h-[200px]",children:l.content}),jsxs("div",{ref:d,role:"tablist",className:o("relative flex items-center gap-1 p-1","bg-zinc-100 dark:bg-zinc-900 rounded-xl","border border-zinc-200 dark:border-zinc-800"),children:[jsx("div",{className:o("absolute rounded-lg transition-all duration-300 ease-out",l?.color||v),style:{width:a.width-8,left:a.left+4,height:"calc(100% - 8px)",top:"4px"}}),t.map(e=>{let n=r===e.id;return jsx("button",{ref:i=>{i?s.current.set(e.id,i):s.current.delete(e.id);},type:"button",role:"tab","aria-selected":n,onClick:()=>z(e.id),className:o("relative z-10 flex-1 px-4 py-2 rounded-lg","text-sm font-medium transition-colors duration-300","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500",n?"text-white":"text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-zinc-100"),children:e.title},e.id)})]})]})}var D=S;export{S as SmoothTab,D as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/smooth-tab/index.tsx"],"names":["cn","inputs","twMerge","clsx","DEFAULT_TABS","SmoothTab","items","defaultTabId","className","activeColor","onChange","selected","setSelected","useState","dimensions","setDimensions","buttonRefs","useRef","containerRef","useLayoutEffect","updateDimensions","selectedButton","container","rect","containerRect","handleTabClick","tabId","selectedItem","item","jsxs","jsx","isSelected","el","smooth_tab_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useState, useRef, useLayoutEffect } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface TabItem {\r\n id: string;\r\n title: string;\r\n content?: React.ReactNode;\r\n color?: string;\r\n}\r\n\r\ninterface SmoothTabProps {\r\n items?: TabItem[];\r\n defaultTabId?: string;\r\n className?: string;\r\n activeColor?: string;\r\n onChange?: (tabId: string) => void;\r\n}\r\n\r\nconst DEFAULT_TABS: TabItem[] = [\r\n { id: \"tab1\", title: \"Tab 1\", color: \"bg-blue-500\" },\r\n { id: \"tab2\", title: \"Tab 2\", color: \"bg-purple-500\" },\r\n { id: \"tab3\", title: \"Tab 3\", color: \"bg-emerald-500\" },\r\n { id: \"tab4\", title: \"Tab 4\", color: \"bg-amber-500\" },\r\n];\r\n\r\nexport function SmoothTab({\r\n items = DEFAULT_TABS,\r\n defaultTabId,\r\n className,\r\n activeColor = \"bg-blue-500\",\r\n onChange,\r\n}: SmoothTabProps) {\r\n const [selected, setSelected] = useState<string>(defaultTabId || items[0]?.id || \"\");\r\n const [dimensions, setDimensions] = useState({ width: 0, left: 0 });\r\n const buttonRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n useLayoutEffect(() => {\r\n const updateDimensions = () => {\r\n const selectedButton = buttonRefs.current.get(selected);\r\n const container = containerRef.current;\r\n\r\n if (selectedButton && container) {\r\n const rect = selectedButton.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n\r\n setDimensions({\r\n width: rect.width,\r\n left: rect.left - containerRect.left,\r\n });\r\n }\r\n };\r\n\r\n requestAnimationFrame(updateDimensions);\r\n window.addEventListener(\"resize\", updateDimensions);\r\n return () => window.removeEventListener(\"resize\", updateDimensions);\r\n }, [selected]);\r\n\r\n const handleTabClick = (tabId: string) => {\r\n setSelected(tabId);\r\n onChange?.(tabId);\r\n };\r\n\r\n const selectedItem = items.find((item) => item.id === selected);\r\n\r\n return (\r\n <div className={cn(\"flex flex-col\", className)}>\r\n {/* Content Area */}\r\n {selectedItem?.content && (\r\n <div className=\"mb-4 p-6 bg-zinc-100 dark:bg-zinc-900 rounded-lg min-h-[200px]\">\r\n {selectedItem.content}\r\n </div>\r\n )}\r\n\r\n {/* Tab Bar */}\r\n <div\r\n ref={containerRef}\r\n role=\"tablist\"\r\n className={cn(\r\n \"relative flex items-center gap-1 p-1\",\r\n \"bg-zinc-100 dark:bg-zinc-900 rounded-xl\",\r\n \"border border-zinc-200 dark:border-zinc-800\"\r\n )}\r\n >\r\n {/* Sliding Background */}\r\n <div\r\n className={cn(\r\n \"absolute rounded-lg transition-all duration-300 ease-out\",\r\n selectedItem?.color || activeColor\r\n )}\r\n style={{\r\n width: dimensions.width - 8,\r\n left: dimensions.left + 4,\r\n height: \"calc(100% - 8px)\",\r\n top: \"4px\",\r\n }}\r\n />\r\n\r\n {/* Tab Buttons */}\r\n {items.map((item) => {\r\n const isSelected = selected === item.id;\r\n return (\r\n <button\r\n key={item.id}\r\n ref={(el) => {\r\n if (el) buttonRefs.current.set(item.id, el);\r\n else buttonRefs.current.delete(item.id);\r\n }}\r\n type=\"button\"\r\n role=\"tab\"\r\n aria-selected={isSelected}\r\n onClick={() => handleTabClick(item.id)}\r\n className={cn(\r\n \"relative z-10 flex-1 px-4 py-2 rounded-lg\",\r\n \"text-sm font-medium transition-colors duration-300\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500\",\r\n isSelected\r\n ? \"text-white\"\r\n : \"text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-zinc-100\"\r\n )}\r\n >\r\n {item.title}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default SmoothTab;\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function E(...t){return tailwindMerge.twMerge(clsx.clsx(t))}function F({targetSelector:t=".cursor-target",spinDuration:v=2,hideDefaultCursor:b=true,color:w="#000000",className:M}){let x=react.useRef(null),C=react.useRef(null),[h,p]=react.useState({x:0,y:0}),[d,g]=react.useState(false),[R,T]=react.useState(0),u=react.useRef();react.useEffect(()=>{if(typeof window>"u")return;let a=document.body.style.cursor;b&&(document.body.style.cursor="none"),p({x:window.innerWidth/2,y:window.innerHeight/2});let o=e=>{p({x:e.clientX,y:e.clientY});},n=e=>{let s=e.target;(s.matches(t)||s.closest(t))&&g(true);},r=e=>{let s=e.target;(s.matches(t)||s.closest(t))&&g(false);};window.addEventListener("mousemove",o),window.addEventListener("mouseover",n),window.addEventListener("mouseout",r);let c,y=e=>{c||(c=e);let W=(e-c)/(v*1e3)*360;T(W%360),u.current=requestAnimationFrame(y);};return u.current=requestAnimationFrame(y),()=>{window.removeEventListener("mousemove",o),window.removeEventListener("mouseover",n),window.removeEventListener("mouseout",r),document.body.style.cursor=a,u.current&&cancelAnimationFrame(u.current);}},[t,v,b]);let l=12,i=3;return jsxRuntime.jsxs("div",{ref:x,className:E("fixed pointer-events-none z-[10000]",M),style:{left:h.x,top:h.y,transform:`translate(-50%, -50%) rotate(${d?0:R}deg)`,transition:d?"transform 0.2s ease":"none"},children:[jsxRuntime.jsx("div",{ref:C,className:"absolute rounded-full",style:{width:6,height:6,backgroundColor:w,left:"50%",top:"50%",transform:"translate(-50%, -50%)"}}),["tl","tr","br","bl"].map(a=>{let o=a.includes("t"),n=a.includes("l"),r=d?20:l*1.5;return jsxRuntime.jsx("div",{className:"absolute transition-all duration-200",style:{width:l,height:l,borderColor:w,borderWidth:i,borderStyle:"solid",borderTopWidth:o?i:0,borderBottomWidth:o?0:i,borderLeftWidth:n?i:0,borderRightWidth:n?0:i,left:n?-r:"auto",right:n?"auto":-r,top:o?-r:"auto",bottom:o?"auto":-r}},a)})]})}var B=F;exports.TargetCursor=F;exports.default=B;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/target-cursor/index.tsx"],"names":["cn","inputs","twMerge","clsx","TargetCursor","targetSelector","spinDuration","hideDefaultCursor","color","className","cursorRef","useRef","dotRef","position","setPosition","useState","isHovering","setIsHovering","rotation","setRotation","animationRef","useEffect","originalCursor","handleMouseMove","handleMouseOver","target","handleMouseOut","startTime","animate","timestamp","newRotation","cornerSize","borderWidth","jsxs","jsx","corner","isTop","isLeft","offset","target_cursor_default"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface TargetCursorProps {\r\n targetSelector?: string;\r\n spinDuration?: number;\r\n hideDefaultCursor?: boolean;\r\n color?: string;\r\n className?: string;\r\n}\r\n\r\nexport function TargetCursor({\r\n targetSelector = \".cursor-target\",\r\n spinDuration = 2,\r\n hideDefaultCursor = true,\r\n color = \"#000000\",\r\n className,\r\n}: TargetCursorProps) {\r\n const cursorRef = useRef<HTMLDivElement>(null);\r\n const dotRef = useRef<HTMLDivElement>(null);\r\n const [position, setPosition] = useState({ x: 0, y: 0 });\r\n const [isHovering, setIsHovering] = useState(false);\r\n const [rotation, setRotation] = useState(0);\r\n const animationRef = useRef<number>();\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n\r\n const originalCursor = document.body.style.cursor;\r\n if (hideDefaultCursor) {\r\n document.body.style.cursor = \"none\";\r\n }\r\n\r\n setPosition({ x: window.innerWidth / 2, y: window.innerHeight / 2 });\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n setPosition({ x: e.clientX, y: e.clientY });\r\n };\r\n\r\n const handleMouseOver = (e: MouseEvent) => {\r\n const target = e.target as Element;\r\n if (target.matches(targetSelector) || target.closest(targetSelector)) {\r\n setIsHovering(true);\r\n }\r\n };\r\n\r\n const handleMouseOut = (e: MouseEvent) => {\r\n const target = e.target as Element;\r\n if (target.matches(targetSelector) || target.closest(targetSelector)) {\r\n setIsHovering(false);\r\n }\r\n };\r\n\r\n window.addEventListener(\"mousemove\", handleMouseMove);\r\n window.addEventListener(\"mouseover\", handleMouseOver);\r\n window.addEventListener(\"mouseout\", handleMouseOut);\r\n\r\n // Rotation animation\r\n let startTime: number;\r\n const animate = (timestamp: number) => {\r\n if (!startTime) startTime = timestamp;\r\n const elapsed = timestamp - startTime;\r\n const newRotation = (elapsed / (spinDuration * 1000)) * 360;\r\n setRotation(newRotation % 360);\r\n animationRef.current = requestAnimationFrame(animate);\r\n };\r\n animationRef.current = requestAnimationFrame(animate);\r\n\r\n return () => {\r\n window.removeEventListener(\"mousemove\", handleMouseMove);\r\n window.removeEventListener(\"mouseover\", handleMouseOver);\r\n window.removeEventListener(\"mouseout\", handleMouseOut);\r\n document.body.style.cursor = originalCursor;\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n }\r\n };\r\n }, [targetSelector, spinDuration, hideDefaultCursor]);\r\n\r\n const cornerSize = 12;\r\n const borderWidth = 3;\r\n\r\n return (\r\n <div\r\n ref={cursorRef}\r\n className={cn(\"fixed pointer-events-none z-[10000]\", className)}\r\n style={{\r\n left: position.x,\r\n top: position.y,\r\n transform: `translate(-50%, -50%) rotate(${isHovering ? 0 : rotation}deg)`,\r\n transition: isHovering ? \"transform 0.2s ease\" : \"none\",\r\n }}\r\n >\r\n {/* Center dot */}\r\n <div\r\n ref={dotRef}\r\n className=\"absolute rounded-full\"\r\n style={{\r\n width: 6,\r\n height: 6,\r\n backgroundColor: color,\r\n left: \"50%\",\r\n top: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n }}\r\n />\r\n\r\n {/* Corners */}\r\n {[\"tl\", \"tr\", \"br\", \"bl\"].map((corner) => {\r\n const isTop = corner.includes(\"t\");\r\n const isLeft = corner.includes(\"l\");\r\n const offset = isHovering ? 20 : cornerSize * 1.5;\r\n\r\n return (\r\n <div\r\n key={corner}\r\n className=\"absolute transition-all duration-200\"\r\n style={{\r\n width: cornerSize,\r\n height: cornerSize,\r\n borderColor: color,\r\n borderWidth: borderWidth,\r\n borderStyle: \"solid\",\r\n borderTopWidth: isTop ? borderWidth : 0,\r\n borderBottomWidth: !isTop ? borderWidth : 0,\r\n borderLeftWidth: isLeft ? borderWidth : 0,\r\n borderRightWidth: !isLeft ? borderWidth : 0,\r\n left: isLeft ? -offset : \"auto\",\r\n right: !isLeft ? -offset : \"auto\",\r\n top: isTop ? -offset : \"auto\",\r\n bottom: !isTop ? -offset : \"auto\",\r\n }}\r\n />\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n\r\nexport default TargetCursor;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useRef,useState,useEffect}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsxs,jsx}from'react/jsx-runtime';function E(...t){return twMerge(clsx(t))}function F({targetSelector:t=".cursor-target",spinDuration:v=2,hideDefaultCursor:b=true,color:w="#000000",className:M}){let x=useRef(null),C=useRef(null),[h,p]=useState({x:0,y:0}),[d,g]=useState(false),[R,T]=useState(0),u=useRef();useEffect(()=>{if(typeof window>"u")return;let a=document.body.style.cursor;b&&(document.body.style.cursor="none"),p({x:window.innerWidth/2,y:window.innerHeight/2});let o=e=>{p({x:e.clientX,y:e.clientY});},n=e=>{let s=e.target;(s.matches(t)||s.closest(t))&&g(true);},r=e=>{let s=e.target;(s.matches(t)||s.closest(t))&&g(false);};window.addEventListener("mousemove",o),window.addEventListener("mouseover",n),window.addEventListener("mouseout",r);let c,y=e=>{c||(c=e);let W=(e-c)/(v*1e3)*360;T(W%360),u.current=requestAnimationFrame(y);};return u.current=requestAnimationFrame(y),()=>{window.removeEventListener("mousemove",o),window.removeEventListener("mouseover",n),window.removeEventListener("mouseout",r),document.body.style.cursor=a,u.current&&cancelAnimationFrame(u.current);}},[t,v,b]);let l=12,i=3;return jsxs("div",{ref:x,className:E("fixed pointer-events-none z-[10000]",M),style:{left:h.x,top:h.y,transform:`translate(-50%, -50%) rotate(${d?0:R}deg)`,transition:d?"transform 0.2s ease":"none"},children:[jsx("div",{ref:C,className:"absolute rounded-full",style:{width:6,height:6,backgroundColor:w,left:"50%",top:"50%",transform:"translate(-50%, -50%)"}}),["tl","tr","br","bl"].map(a=>{let o=a.includes("t"),n=a.includes("l"),r=d?20:l*1.5;return jsx("div",{className:"absolute transition-all duration-200",style:{width:l,height:l,borderColor:w,borderWidth:i,borderStyle:"solid",borderTopWidth:o?i:0,borderBottomWidth:o?0:i,borderLeftWidth:n?i:0,borderRightWidth:n?0:i,left:n?-r:"auto",right:n?"auto":-r,top:o?-r:"auto",bottom:o?"auto":-r}},a)})]})}var B=F;export{F as TargetCursor,B as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/target-cursor/index.tsx"],"names":["cn","inputs","twMerge","clsx","TargetCursor","targetSelector","spinDuration","hideDefaultCursor","color","className","cursorRef","useRef","dotRef","position","setPosition","useState","isHovering","setIsHovering","rotation","setRotation","animationRef","useEffect","originalCursor","handleMouseMove","handleMouseOver","target","handleMouseOut","startTime","animate","timestamp","newRotation","cornerSize","borderWidth","jsxs","jsx","corner","isTop","isLeft","offset","target_cursor_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface TargetCursorProps {\r\n targetSelector?: string;\r\n spinDuration?: number;\r\n hideDefaultCursor?: boolean;\r\n color?: string;\r\n className?: string;\r\n}\r\n\r\nexport function TargetCursor({\r\n targetSelector = \".cursor-target\",\r\n spinDuration = 2,\r\n hideDefaultCursor = true,\r\n color = \"#000000\",\r\n className,\r\n}: TargetCursorProps) {\r\n const cursorRef = useRef<HTMLDivElement>(null);\r\n const dotRef = useRef<HTMLDivElement>(null);\r\n const [position, setPosition] = useState({ x: 0, y: 0 });\r\n const [isHovering, setIsHovering] = useState(false);\r\n const [rotation, setRotation] = useState(0);\r\n const animationRef = useRef<number>();\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n\r\n const originalCursor = document.body.style.cursor;\r\n if (hideDefaultCursor) {\r\n document.body.style.cursor = \"none\";\r\n }\r\n\r\n setPosition({ x: window.innerWidth / 2, y: window.innerHeight / 2 });\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n setPosition({ x: e.clientX, y: e.clientY });\r\n };\r\n\r\n const handleMouseOver = (e: MouseEvent) => {\r\n const target = e.target as Element;\r\n if (target.matches(targetSelector) || target.closest(targetSelector)) {\r\n setIsHovering(true);\r\n }\r\n };\r\n\r\n const handleMouseOut = (e: MouseEvent) => {\r\n const target = e.target as Element;\r\n if (target.matches(targetSelector) || target.closest(targetSelector)) {\r\n setIsHovering(false);\r\n }\r\n };\r\n\r\n window.addEventListener(\"mousemove\", handleMouseMove);\r\n window.addEventListener(\"mouseover\", handleMouseOver);\r\n window.addEventListener(\"mouseout\", handleMouseOut);\r\n\r\n // Rotation animation\r\n let startTime: number;\r\n const animate = (timestamp: number) => {\r\n if (!startTime) startTime = timestamp;\r\n const elapsed = timestamp - startTime;\r\n const newRotation = (elapsed / (spinDuration * 1000)) * 360;\r\n setRotation(newRotation % 360);\r\n animationRef.current = requestAnimationFrame(animate);\r\n };\r\n animationRef.current = requestAnimationFrame(animate);\r\n\r\n return () => {\r\n window.removeEventListener(\"mousemove\", handleMouseMove);\r\n window.removeEventListener(\"mouseover\", handleMouseOver);\r\n window.removeEventListener(\"mouseout\", handleMouseOut);\r\n document.body.style.cursor = originalCursor;\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n }\r\n };\r\n }, [targetSelector, spinDuration, hideDefaultCursor]);\r\n\r\n const cornerSize = 12;\r\n const borderWidth = 3;\r\n\r\n return (\r\n <div\r\n ref={cursorRef}\r\n className={cn(\"fixed pointer-events-none z-[10000]\", className)}\r\n style={{\r\n left: position.x,\r\n top: position.y,\r\n transform: `translate(-50%, -50%) rotate(${isHovering ? 0 : rotation}deg)`,\r\n transition: isHovering ? \"transform 0.2s ease\" : \"none\",\r\n }}\r\n >\r\n {/* Center dot */}\r\n <div\r\n ref={dotRef}\r\n className=\"absolute rounded-full\"\r\n style={{\r\n width: 6,\r\n height: 6,\r\n backgroundColor: color,\r\n left: \"50%\",\r\n top: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n }}\r\n />\r\n\r\n {/* Corners */}\r\n {[\"tl\", \"tr\", \"br\", \"bl\"].map((corner) => {\r\n const isTop = corner.includes(\"t\");\r\n const isLeft = corner.includes(\"l\");\r\n const offset = isHovering ? 20 : cornerSize * 1.5;\r\n\r\n return (\r\n <div\r\n key={corner}\r\n className=\"absolute transition-all duration-200\"\r\n style={{\r\n width: cornerSize,\r\n height: cornerSize,\r\n borderColor: color,\r\n borderWidth: borderWidth,\r\n borderStyle: \"solid\",\r\n borderTopWidth: isTop ? borderWidth : 0,\r\n borderBottomWidth: !isTop ? borderWidth : 0,\r\n borderLeftWidth: isLeft ? borderWidth : 0,\r\n borderRightWidth: !isLeft ? borderWidth : 0,\r\n left: isLeft ? -offset : \"auto\",\r\n right: !isLeft ? -offset : \"auto\",\r\n top: isTop ? -offset : \"auto\",\r\n bottom: !isTop ? -offset : \"auto\",\r\n }}\r\n />\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n\r\nexport default TargetCursor;\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bynana-ui",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "120+ Beautiful React UI components built with Tailwind CSS and Framer Motion",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -128,6 +128,16 @@
128
128
  "./v0-button": { "import": "./dist/v0-button/index.mjs", "require": "./dist/v0-button/index.js", "types": "./dist/v0-button/index.d.ts" },
129
129
  "./contribution-graph": { "import": "./dist/contribution-graph/index.mjs", "require": "./dist/contribution-graph/index.js", "types": "./dist/contribution-graph/index.d.ts" },
130
130
  "./elastic-slider": { "import": "./dist/elastic-slider/index.mjs", "require": "./dist/elastic-slider/index.js", "types": "./dist/elastic-slider/index.d.ts" },
131
+ "./flowing-menu": { "import": "./dist/flowing-menu/index.mjs", "require": "./dist/flowing-menu/index.js", "types": "./dist/flowing-menu/index.d.ts" },
132
+ "./gooey-nav": { "import": "./dist/gooey-nav/index.mjs", "require": "./dist/gooey-nav/index.js", "types": "./dist/gooey-nav/index.d.ts" },
133
+ "./pill-nav": { "import": "./dist/pill-nav/index.mjs", "require": "./dist/pill-nav/index.js", "types": "./dist/pill-nav/index.d.ts" },
134
+ "./smooth-drawer": { "import": "./dist/smooth-drawer/index.mjs", "require": "./dist/smooth-drawer/index.js", "types": "./dist/smooth-drawer/index.d.ts" },
135
+ "./smooth-tab": { "import": "./dist/smooth-tab/index.mjs", "require": "./dist/smooth-tab/index.js", "types": "./dist/smooth-tab/index.d.ts" },
136
+ "./decay-card": { "import": "./dist/decay-card/index.mjs", "require": "./dist/decay-card/index.js", "types": "./dist/decay-card/index.d.ts" },
137
+ "./liquid-glass-card": { "import": "./dist/liquid-glass-card/index.mjs", "require": "./dist/liquid-glass-card/index.js", "types": "./dist/liquid-glass-card/index.d.ts" },
138
+ "./target-cursor": { "import": "./dist/target-cursor/index.mjs", "require": "./dist/target-cursor/index.js", "types": "./dist/target-cursor/index.d.ts" },
139
+ "./crosshair": { "import": "./dist/crosshair/index.mjs", "require": "./dist/crosshair/index.js", "types": "./dist/crosshair/index.d.ts" },
140
+ "./scroll-text": { "import": "./dist/scroll-text/index.mjs", "require": "./dist/scroll-text/index.js", "types": "./dist/scroll-text/index.d.ts" },
131
141
  "./styles.css": "./dist/styles.css"
132
142
  },
133
143
  "files": ["dist", "README.md"],