bynana-ui 1.5.0 → 1.6.1

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 (69) hide show
  1. package/dist/apple-activity-card/index.js +2 -0
  2. package/dist/apple-activity-card/index.js.map +1 -0
  3. package/dist/apple-activity-card/index.mjs +2 -0
  4. package/dist/apple-activity-card/index.mjs.map +1 -0
  5. package/dist/bento-grid/index.js +2 -0
  6. package/dist/bento-grid/index.js.map +1 -0
  7. package/dist/bento-grid/index.mjs +2 -0
  8. package/dist/bento-grid/index.mjs.map +1 -0
  9. package/dist/card-stack/index.js +2 -0
  10. package/dist/card-stack/index.js.map +1 -0
  11. package/dist/card-stack/index.mjs +2 -0
  12. package/dist/card-stack/index.mjs.map +1 -0
  13. package/dist/crosshair/index.js +2 -0
  14. package/dist/crosshair/index.js.map +1 -0
  15. package/dist/crosshair/index.mjs +2 -0
  16. package/dist/crosshair/index.mjs.map +1 -0
  17. package/dist/decay-card/index.js +3 -0
  18. package/dist/decay-card/index.js.map +1 -0
  19. package/dist/decay-card/index.mjs +3 -0
  20. package/dist/decay-card/index.mjs.map +1 -0
  21. package/dist/flowing-menu/index.js +3 -0
  22. package/dist/flowing-menu/index.js.map +1 -0
  23. package/dist/flowing-menu/index.mjs +3 -0
  24. package/dist/flowing-menu/index.mjs.map +1 -0
  25. package/dist/gooey-nav/index.js +2 -0
  26. package/dist/gooey-nav/index.js.map +1 -0
  27. package/dist/gooey-nav/index.mjs +2 -0
  28. package/dist/gooey-nav/index.mjs.map +1 -0
  29. package/dist/index.js +13 -12
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +13 -12
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/liquid-glass-card/index.js +2 -0
  34. package/dist/liquid-glass-card/index.js.map +1 -0
  35. package/dist/liquid-glass-card/index.mjs +2 -0
  36. package/dist/liquid-glass-card/index.mjs.map +1 -0
  37. package/dist/pill-nav/index.js +2 -0
  38. package/dist/pill-nav/index.js.map +1 -0
  39. package/dist/pill-nav/index.mjs +2 -0
  40. package/dist/pill-nav/index.mjs.map +1 -0
  41. package/dist/scroll-text/index.js +2 -0
  42. package/dist/scroll-text/index.js.map +1 -0
  43. package/dist/scroll-text/index.mjs +2 -0
  44. package/dist/scroll-text/index.mjs.map +1 -0
  45. package/dist/smooth-drawer/index.js +2 -0
  46. package/dist/smooth-drawer/index.js.map +1 -0
  47. package/dist/smooth-drawer/index.mjs +2 -0
  48. package/dist/smooth-drawer/index.mjs.map +1 -0
  49. package/dist/smooth-tab/index.js +2 -0
  50. package/dist/smooth-tab/index.js.map +1 -0
  51. package/dist/smooth-tab/index.mjs +2 -0
  52. package/dist/smooth-tab/index.mjs.map +1 -0
  53. package/dist/stats-cards/index.js +2 -0
  54. package/dist/stats-cards/index.js.map +1 -0
  55. package/dist/stats-cards/index.mjs +2 -0
  56. package/dist/stats-cards/index.mjs.map +1 -0
  57. package/dist/stats-grid/index.js +2 -0
  58. package/dist/stats-grid/index.js.map +1 -0
  59. package/dist/stats-grid/index.mjs +2 -0
  60. package/dist/stats-grid/index.mjs.map +1 -0
  61. package/dist/target-cursor/index.js +2 -0
  62. package/dist/target-cursor/index.js.map +1 -0
  63. package/dist/target-cursor/index.mjs +2 -0
  64. package/dist/target-cursor/index.mjs.map +1 -0
  65. package/dist/tweet-card/index.js +2 -0
  66. package/dist/tweet-card/index.js.map +1 -0
  67. package/dist/tweet-card/index.mjs +2 -0
  68. package/dist/tweet-card/index.mjs.map +1 -0
  69. package/package.json +17 -1
@@ -0,0 +1,2 @@
1
+ 'use strict';var framerMotion=require('framer-motion'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function c(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var x=({data:e,index:r})=>{let i=(e.size-16)/2,o=i*2*Math.PI,m=(100-e.value)/100*o,n=`gradient-${e.label.toLowerCase()}-${r}`;return jsxRuntime.jsx(framerMotion.motion.div,{className:"absolute inset-0 flex items-center justify-center",initial:{opacity:0,scale:.8},animate:{opacity:1,scale:1},transition:{duration:.8,delay:r*.2,ease:"easeOut"},children:jsxRuntime.jsxs("svg",{width:e.size,height:e.size,viewBox:`0 0 ${e.size} ${e.size}`,className:"transform -rotate-90","aria-label":`${e.label} Activity Progress - ${e.value}%`,children:[jsxRuntime.jsx("title",{children:`${e.label} Activity Progress - ${e.value}%`}),jsxRuntime.jsx("defs",{children:jsxRuntime.jsxs("linearGradient",{id:n,x1:"0%",y1:"0%",x2:"100%",y2:"100%",children:[jsxRuntime.jsx("stop",{offset:"0%",style:{stopColor:e.color,stopOpacity:1}}),jsxRuntime.jsx("stop",{offset:"100%",style:{stopColor:e.color==="#FF2D55"?"#FF6B8B":e.color==="#A3F900"?"#C5FF4D":"#4DDFED",stopOpacity:1}})]})}),jsxRuntime.jsx("circle",{cx:e.size/2,cy:e.size/2,r:i,fill:"none",stroke:"currentColor",strokeWidth:16,className:"text-zinc-200/50 dark:text-zinc-800/50"}),jsxRuntime.jsx(framerMotion.motion.circle,{cx:e.size/2,cy:e.size/2,r:i,fill:"none",stroke:`url(#${n})`,strokeWidth:16,strokeDasharray:o,initial:{strokeDashoffset:o},animate:{strokeDashoffset:m},transition:{duration:1.8,delay:r*.2,ease:"easeInOut"},strokeLinecap:"round",style:{filter:"drop-shadow(0 0 6px rgba(0,0,0,0.15))"}})]})})},d=[{label:"MOVE",value:85,color:"#FF2D55",size:200,current:479,target:800,unit:"CAL"},{label:"EXERCISE",value:60,color:"#A3F900",size:160,current:24,target:30,unit:"MIN"},{label:"STAND",value:30,color:"#04C7DD",size:120,current:6,target:12,unit:"HR"}];function b({title:e="Activity Rings",className:r,activities:a=d}){return jsxRuntime.jsx("div",{className:c("relative w-full max-w-3xl mx-auto p-8 rounded-3xl text-zinc-900 dark:text-white",r),children:jsxRuntime.jsxs("div",{className:"flex flex-col items-center gap-8",children:[jsxRuntime.jsx(framerMotion.motion.h2,{className:"text-2xl font-medium text-zinc-900 dark:text-white",initial:{opacity:0,y:-20},animate:{opacity:1,y:0},transition:{duration:.5},children:e}),jsxRuntime.jsxs("div",{className:"flex items-center",children:[jsxRuntime.jsx("div",{className:"relative w-[180px] h-[180px]",children:a.map((i,o)=>jsxRuntime.jsx(x,{data:i,index:o},i.label))}),jsxRuntime.jsx(framerMotion.motion.div,{className:"flex flex-col gap-6 ml-8",initial:{opacity:0,x:20},animate:{opacity:1,x:0},transition:{duration:.5,delay:.3},children:a.map(i=>jsxRuntime.jsxs("div",{className:"flex flex-col",children:[jsxRuntime.jsx("span",{className:"text-sm font-medium text-zinc-600 dark:text-zinc-400",children:i.label}),jsxRuntime.jsxs("span",{className:"text-2xl font-semibold",style:{color:i.color},children:[i.current,"/",i.target,jsxRuntime.jsx("span",{className:"text-base ml-1 text-zinc-600 dark:text-zinc-400",children:i.unit})]})]},i.label))})]})]})})}exports.AppleActivityCard=b;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/apple-activity-card/index.tsx"],"names":["cn","inputs","twMerge","clsx","CircleProgress","data","index","radius","circumference","progress","gradientId","jsx","motion","jsxs","defaultActivities","AppleActivityCard","title","className","activities","activity"],"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 { motion } from \"framer-motion\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface ActivityData {\r\n label: string;\r\n value: number;\r\n color: string;\r\n size: number;\r\n current: number;\r\n target: number;\r\n unit: string;\r\n}\r\n\r\ninterface CircleProgressProps {\r\n data: ActivityData;\r\n index: number;\r\n}\r\n\r\nconst CircleProgress = ({ data, index }: CircleProgressProps) => {\r\n const strokeWidth = 16;\r\n const radius = (data.size - strokeWidth) / 2;\r\n const circumference = radius * 2 * Math.PI;\r\n const progress = ((100 - data.value) / 100) * circumference;\r\n const gradientId = `gradient-${data.label.toLowerCase()}-${index}`;\r\n\r\n return (\r\n <motion.div\r\n className=\"absolute inset-0 flex items-center justify-center\"\r\n initial={{ opacity: 0, scale: 0.8 }}\r\n animate={{ opacity: 1, scale: 1 }}\r\n transition={{ duration: 0.8, delay: index * 0.2, ease: \"easeOut\" }}\r\n >\r\n <svg\r\n width={data.size}\r\n height={data.size}\r\n viewBox={`0 0 ${data.size} ${data.size}`}\r\n className=\"transform -rotate-90\"\r\n aria-label={`${data.label} Activity Progress - ${data.value}%`}\r\n >\r\n <title>{`${data.label} Activity Progress - ${data.value}%`}</title>\r\n <defs>\r\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\r\n <stop offset=\"0%\" style={{ stopColor: data.color, stopOpacity: 1 }} />\r\n <stop\r\n offset=\"100%\"\r\n style={{\r\n stopColor: data.color === \"#FF2D55\" ? \"#FF6B8B\" : data.color === \"#A3F900\" ? \"#C5FF4D\" : \"#4DDFED\",\r\n stopOpacity: 1,\r\n }}\r\n />\r\n </linearGradient>\r\n </defs>\r\n <circle\r\n cx={data.size / 2}\r\n cy={data.size / 2}\r\n r={radius}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={strokeWidth}\r\n className=\"text-zinc-200/50 dark:text-zinc-800/50\"\r\n />\r\n <motion.circle\r\n cx={data.size / 2}\r\n cy={data.size / 2}\r\n r={radius}\r\n fill=\"none\"\r\n stroke={`url(#${gradientId})`}\r\n strokeWidth={strokeWidth}\r\n strokeDasharray={circumference}\r\n initial={{ strokeDashoffset: circumference }}\r\n animate={{ strokeDashoffset: progress }}\r\n transition={{ duration: 1.8, delay: index * 0.2, ease: \"easeInOut\" }}\r\n strokeLinecap=\"round\"\r\n style={{ filter: \"drop-shadow(0 0 6px rgba(0,0,0,0.15))\" }}\r\n />\r\n </svg>\r\n </motion.div>\r\n );\r\n};\r\n\r\ninterface AppleActivityCardProps {\r\n title?: string;\r\n className?: string;\r\n activities?: ActivityData[];\r\n}\r\n\r\nconst defaultActivities: ActivityData[] = [\r\n { label: \"MOVE\", value: 85, color: \"#FF2D55\", size: 200, current: 479, target: 800, unit: \"CAL\" },\r\n { label: \"EXERCISE\", value: 60, color: \"#A3F900\", size: 160, current: 24, target: 30, unit: \"MIN\" },\r\n { label: \"STAND\", value: 30, color: \"#04C7DD\", size: 120, current: 6, target: 12, unit: \"HR\" },\r\n];\r\n\r\nexport function AppleActivityCard({ title = \"Activity Rings\", className, activities = defaultActivities }: AppleActivityCardProps) {\r\n return (\r\n <div className={cn(\"relative w-full max-w-3xl mx-auto p-8 rounded-3xl text-zinc-900 dark:text-white\", className)}>\r\n <div className=\"flex flex-col items-center gap-8\">\r\n <motion.h2\r\n className=\"text-2xl font-medium text-zinc-900 dark:text-white\"\r\n initial={{ opacity: 0, y: -20 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n transition={{ duration: 0.5 }}\r\n >\r\n {title}\r\n </motion.h2>\r\n <div className=\"flex items-center\">\r\n <div className=\"relative w-[180px] h-[180px]\">\r\n {activities.map((activity, index) => (\r\n <CircleProgress key={activity.label} data={activity} index={index} />\r\n ))}\r\n </div>\r\n <motion.div\r\n className=\"flex flex-col gap-6 ml-8\"\r\n initial={{ opacity: 0, x: 20 }}\r\n animate={{ opacity: 1, x: 0 }}\r\n transition={{ duration: 0.5, delay: 0.3 }}\r\n >\r\n {activities.map((activity) => (\r\n <div key={activity.label} className=\"flex flex-col\">\r\n <span className=\"text-sm font-medium text-zinc-600 dark:text-zinc-400\">{activity.label}</span>\r\n <span className=\"text-2xl font-semibold\" style={{ color: activity.color }}>\r\n {activity.current}/{activity.target}\r\n <span className=\"text-base ml-1 text-zinc-600 dark:text-zinc-400\">{activity.unit}</span>\r\n </span>\r\n </div>\r\n ))}\r\n </motion.div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport type { ActivityData };\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {motion}from'framer-motion';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs}from'react/jsx-runtime';function c(...e){return twMerge(clsx(e))}var x=({data:e,index:r})=>{let i=(e.size-16)/2,o=i*2*Math.PI,m=(100-e.value)/100*o,n=`gradient-${e.label.toLowerCase()}-${r}`;return jsx(motion.div,{className:"absolute inset-0 flex items-center justify-center",initial:{opacity:0,scale:.8},animate:{opacity:1,scale:1},transition:{duration:.8,delay:r*.2,ease:"easeOut"},children:jsxs("svg",{width:e.size,height:e.size,viewBox:`0 0 ${e.size} ${e.size}`,className:"transform -rotate-90","aria-label":`${e.label} Activity Progress - ${e.value}%`,children:[jsx("title",{children:`${e.label} Activity Progress - ${e.value}%`}),jsx("defs",{children:jsxs("linearGradient",{id:n,x1:"0%",y1:"0%",x2:"100%",y2:"100%",children:[jsx("stop",{offset:"0%",style:{stopColor:e.color,stopOpacity:1}}),jsx("stop",{offset:"100%",style:{stopColor:e.color==="#FF2D55"?"#FF6B8B":e.color==="#A3F900"?"#C5FF4D":"#4DDFED",stopOpacity:1}})]})}),jsx("circle",{cx:e.size/2,cy:e.size/2,r:i,fill:"none",stroke:"currentColor",strokeWidth:16,className:"text-zinc-200/50 dark:text-zinc-800/50"}),jsx(motion.circle,{cx:e.size/2,cy:e.size/2,r:i,fill:"none",stroke:`url(#${n})`,strokeWidth:16,strokeDasharray:o,initial:{strokeDashoffset:o},animate:{strokeDashoffset:m},transition:{duration:1.8,delay:r*.2,ease:"easeInOut"},strokeLinecap:"round",style:{filter:"drop-shadow(0 0 6px rgba(0,0,0,0.15))"}})]})})},d=[{label:"MOVE",value:85,color:"#FF2D55",size:200,current:479,target:800,unit:"CAL"},{label:"EXERCISE",value:60,color:"#A3F900",size:160,current:24,target:30,unit:"MIN"},{label:"STAND",value:30,color:"#04C7DD",size:120,current:6,target:12,unit:"HR"}];function b({title:e="Activity Rings",className:r,activities:a=d}){return jsx("div",{className:c("relative w-full max-w-3xl mx-auto p-8 rounded-3xl text-zinc-900 dark:text-white",r),children:jsxs("div",{className:"flex flex-col items-center gap-8",children:[jsx(motion.h2,{className:"text-2xl font-medium text-zinc-900 dark:text-white",initial:{opacity:0,y:-20},animate:{opacity:1,y:0},transition:{duration:.5},children:e}),jsxs("div",{className:"flex items-center",children:[jsx("div",{className:"relative w-[180px] h-[180px]",children:a.map((i,o)=>jsx(x,{data:i,index:o},i.label))}),jsx(motion.div,{className:"flex flex-col gap-6 ml-8",initial:{opacity:0,x:20},animate:{opacity:1,x:0},transition:{duration:.5,delay:.3},children:a.map(i=>jsxs("div",{className:"flex flex-col",children:[jsx("span",{className:"text-sm font-medium text-zinc-600 dark:text-zinc-400",children:i.label}),jsxs("span",{className:"text-2xl font-semibold",style:{color:i.color},children:[i.current,"/",i.target,jsx("span",{className:"text-base ml-1 text-zinc-600 dark:text-zinc-400",children:i.unit})]})]},i.label))})]})]})})}export{b as AppleActivityCard};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/apple-activity-card/index.tsx"],"names":["cn","inputs","twMerge","clsx","CircleProgress","data","index","radius","circumference","progress","gradientId","jsx","motion","jsxs","defaultActivities","AppleActivityCard","title","className","activities","activity"],"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 { motion } from \"framer-motion\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface ActivityData {\r\n label: string;\r\n value: number;\r\n color: string;\r\n size: number;\r\n current: number;\r\n target: number;\r\n unit: string;\r\n}\r\n\r\ninterface CircleProgressProps {\r\n data: ActivityData;\r\n index: number;\r\n}\r\n\r\nconst CircleProgress = ({ data, index }: CircleProgressProps) => {\r\n const strokeWidth = 16;\r\n const radius = (data.size - strokeWidth) / 2;\r\n const circumference = radius * 2 * Math.PI;\r\n const progress = ((100 - data.value) / 100) * circumference;\r\n const gradientId = `gradient-${data.label.toLowerCase()}-${index}`;\r\n\r\n return (\r\n <motion.div\r\n className=\"absolute inset-0 flex items-center justify-center\"\r\n initial={{ opacity: 0, scale: 0.8 }}\r\n animate={{ opacity: 1, scale: 1 }}\r\n transition={{ duration: 0.8, delay: index * 0.2, ease: \"easeOut\" }}\r\n >\r\n <svg\r\n width={data.size}\r\n height={data.size}\r\n viewBox={`0 0 ${data.size} ${data.size}`}\r\n className=\"transform -rotate-90\"\r\n aria-label={`${data.label} Activity Progress - ${data.value}%`}\r\n >\r\n <title>{`${data.label} Activity Progress - ${data.value}%`}</title>\r\n <defs>\r\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\r\n <stop offset=\"0%\" style={{ stopColor: data.color, stopOpacity: 1 }} />\r\n <stop\r\n offset=\"100%\"\r\n style={{\r\n stopColor: data.color === \"#FF2D55\" ? \"#FF6B8B\" : data.color === \"#A3F900\" ? \"#C5FF4D\" : \"#4DDFED\",\r\n stopOpacity: 1,\r\n }}\r\n />\r\n </linearGradient>\r\n </defs>\r\n <circle\r\n cx={data.size / 2}\r\n cy={data.size / 2}\r\n r={radius}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={strokeWidth}\r\n className=\"text-zinc-200/50 dark:text-zinc-800/50\"\r\n />\r\n <motion.circle\r\n cx={data.size / 2}\r\n cy={data.size / 2}\r\n r={radius}\r\n fill=\"none\"\r\n stroke={`url(#${gradientId})`}\r\n strokeWidth={strokeWidth}\r\n strokeDasharray={circumference}\r\n initial={{ strokeDashoffset: circumference }}\r\n animate={{ strokeDashoffset: progress }}\r\n transition={{ duration: 1.8, delay: index * 0.2, ease: \"easeInOut\" }}\r\n strokeLinecap=\"round\"\r\n style={{ filter: \"drop-shadow(0 0 6px rgba(0,0,0,0.15))\" }}\r\n />\r\n </svg>\r\n </motion.div>\r\n );\r\n};\r\n\r\ninterface AppleActivityCardProps {\r\n title?: string;\r\n className?: string;\r\n activities?: ActivityData[];\r\n}\r\n\r\nconst defaultActivities: ActivityData[] = [\r\n { label: \"MOVE\", value: 85, color: \"#FF2D55\", size: 200, current: 479, target: 800, unit: \"CAL\" },\r\n { label: \"EXERCISE\", value: 60, color: \"#A3F900\", size: 160, current: 24, target: 30, unit: \"MIN\" },\r\n { label: \"STAND\", value: 30, color: \"#04C7DD\", size: 120, current: 6, target: 12, unit: \"HR\" },\r\n];\r\n\r\nexport function AppleActivityCard({ title = \"Activity Rings\", className, activities = defaultActivities }: AppleActivityCardProps) {\r\n return (\r\n <div className={cn(\"relative w-full max-w-3xl mx-auto p-8 rounded-3xl text-zinc-900 dark:text-white\", className)}>\r\n <div className=\"flex flex-col items-center gap-8\">\r\n <motion.h2\r\n className=\"text-2xl font-medium text-zinc-900 dark:text-white\"\r\n initial={{ opacity: 0, y: -20 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n transition={{ duration: 0.5 }}\r\n >\r\n {title}\r\n </motion.h2>\r\n <div className=\"flex items-center\">\r\n <div className=\"relative w-[180px] h-[180px]\">\r\n {activities.map((activity, index) => (\r\n <CircleProgress key={activity.label} data={activity} index={index} />\r\n ))}\r\n </div>\r\n <motion.div\r\n className=\"flex flex-col gap-6 ml-8\"\r\n initial={{ opacity: 0, x: 20 }}\r\n animate={{ opacity: 1, x: 0 }}\r\n transition={{ duration: 0.5, delay: 0.3 }}\r\n >\r\n {activities.map((activity) => (\r\n <div key={activity.label} className=\"flex flex-col\">\r\n <span className=\"text-sm font-medium text-zinc-600 dark:text-zinc-400\">{activity.label}</span>\r\n <span className=\"text-2xl font-semibold\" style={{ color: activity.color }}>\r\n {activity.current}/{activity.target}\r\n <span className=\"text-base ml-1 text-zinc-600 dark:text-zinc-400\">{activity.unit}</span>\r\n </span>\r\n </div>\r\n ))}\r\n </motion.div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport type { ActivityData };\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function t(...r){return tailwindMerge.twMerge(clsx.clsx(r))}function h({children:r,className:a}){return jsxRuntime.jsx("div",{className:t("grid w-full auto-rows-[22rem] grid-cols-3 gap-4",a),children:r})}function k({name:r,className:a,background:o,Icon:i,description:p,href:n,cta:l,onClick:d}){return jsxRuntime.jsxs(n?"a":"div",{...n?{href:n,target:"_blank",rel:"noopener noreferrer"}:{},onClick:d,className:t("group relative col-span-3 flex flex-col justify-between overflow-hidden rounded-xl cursor-pointer","bg-white [box-shadow:0_0_0_1px_rgba(0,0,0,.03),0_2px_4px_rgba(0,0,0,.05),0_12px_24px_rgba(0,0,0,.05)]","transform-gpu dark:bg-black dark:[border:1px_solid_rgba(255,255,255,.1)] dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset]",a),children:[typeof o=="string"?jsxRuntime.jsx("div",{className:t("absolute inset-0",o)}):jsxRuntime.jsx("div",{className:"absolute inset-0",children:o}),jsxRuntime.jsxs("div",{className:"pointer-events-none z-10 flex transform-gpu flex-col gap-1 p-6 transition-all duration-300 group-hover:-translate-y-10",children:[i&&jsxRuntime.jsx(i,{className:"h-12 w-12 origin-left transform-gpu text-neutral-700 transition-all duration-300 ease-in-out group-hover:scale-75 dark:text-neutral-300"}),jsxRuntime.jsx("h3",{className:"text-xl font-semibold text-neutral-700 dark:text-neutral-300",children:r}),jsxRuntime.jsx("p",{className:"max-w-lg text-neutral-400",children:p})]}),l&&jsxRuntime.jsx("div",{className:"pointer-events-none absolute bottom-0 flex w-full translate-y-10 transform-gpu flex-row items-center p-4 opacity-0 transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100",children:jsxRuntime.jsxs("span",{className:"pointer-events-auto ml-auto flex items-center gap-2 rounded-lg bg-black px-4 py-2 text-white dark:bg-white dark:text-black",children:[l,jsxRuntime.jsx("svg",{className:"ml-2 h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})})]})}),jsxRuntime.jsx("div",{className:"pointer-events-none absolute inset-0 transform-gpu transition-all duration-300 group-hover:bg-black/[.03] group-hover:dark:bg-neutral-800/10"})]})}exports.BentoCard=k;exports.BentoGrid=h;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/bento-grid/index.tsx"],"names":["cn","inputs","twMerge","clsx","BentoGrid","children","className","jsx","BentoCard","name","background","Icon","description","href","cta","onClick","jsxs"],"mappings":"sHAGO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,qBAAAA,CAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CCgBO,SAASG,CAAAA,CAAU,CAAE,QAAA,CAAAC,CAAAA,CAAU,UAAAC,CAAU,CAAA,CAAmB,CACjE,OAAOC,cAAAA,CAAC,OAAI,SAAA,CAAWP,CAAAA,CAAG,kDAAmDM,CAAS,CAAA,CAAI,SAAAD,CAAAA,CAAS,CACrG,CAEO,SAASG,EAAU,CAAE,IAAA,CAAAC,EAAM,SAAA,CAAAH,CAAAA,CAAW,WAAAI,CAAAA,CAAY,IAAA,CAAAC,EAAM,WAAA,CAAAC,CAAAA,CAAa,KAAAC,CAAAA,CAAM,GAAA,CAAAC,EAAK,OAAA,CAAAC,CAAQ,EAAmB,CAIhH,OACEC,eAAAA,CAJcH,CAAAA,CAAO,IAAM,KAAA,CAI1B,CACE,GAJgBA,CAAAA,CAAO,CAAE,KAAAA,CAAAA,CAAM,MAAA,CAAQ,SAAU,GAAA,CAAK,qBAAsB,EAAI,EAAC,CAKlF,QAASE,CAAAA,CACT,SAAA,CAAWf,EACT,mGAAA,CACA,uGAAA,CACA,+HAAA,CACAM,CACF,EAEC,QAAA,CAAA,CAAA,OAAOI,CAAAA,EAAe,SACrBH,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAWP,CAAAA,CAAG,kBAAA,CAAoBU,CAAU,CAAA,CAAG,CAAA,CAEpDH,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAAoB,QAAA,CAAAG,CAAAA,CAAW,EAGhDM,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wHAAA,CACZ,UAAAL,CAAAA,EACCJ,cAAAA,CAACI,EAAA,CAAK,SAAA,CAAU,0IAA0I,CAAA,CAE5JJ,cAAAA,CAAC,MAAG,SAAA,CAAU,8DAAA,CAAgE,SAAAE,CAAAA,CAAK,CAAA,CACnFF,eAAC,GAAA,CAAA,CAAE,SAAA,CAAU,4BAA6B,QAAA,CAAAK,CAAAA,CAAY,CAAA,CAAA,CACxD,CAAA,CAECE,GACCP,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kMAAA,CACb,QAAA,CAAAS,gBAAC,MAAA,CAAA,CAAK,SAAA,CAAU,6HACb,QAAA,CAAA,CAAAF,CAAAA,CACDP,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAe,IAAA,CAAK,MAAA,CAAO,OAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACtE,QAAA,CAAAA,eAAC,MAAA,CAAA,CAAK,aAAA,CAAc,QAAQ,cAAA,CAAe,OAAA,CAAQ,YAAa,CAAA,CAAG,CAAA,CAAE,eAAe,CAAA,CACtF,CAAA,CAAA,CACF,EACF,CAAA,CAEFA,cAAAA,CAAC,OAAI,SAAA,CAAU,8IAAA,CAA+I,GAChK,CAEJ","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 from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface BentoCardProps {\r\n name: string;\r\n className?: string;\r\n background?: React.ReactNode | string;\r\n Icon?: React.ComponentType<{ className?: string }>;\r\n description: string;\r\n href?: string;\r\n cta?: string;\r\n onClick?: () => void;\r\n}\r\n\r\ninterface BentoGridProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function BentoGrid({ children, className }: BentoGridProps) {\r\n return <div className={cn(\"grid w-full auto-rows-[22rem] grid-cols-3 gap-4\", className)}>{children}</div>;\r\n}\r\n\r\nexport function BentoCard({ name, className, background, Icon, description, href, cta, onClick }: BentoCardProps) {\r\n const Wrapper = href ? \"a\" : \"div\";\r\n const wrapperProps = href ? { href, target: \"_blank\", rel: \"noopener noreferrer\" } : {};\r\n\r\n return (\r\n <Wrapper\r\n {...wrapperProps}\r\n onClick={onClick}\r\n className={cn(\r\n \"group relative col-span-3 flex flex-col justify-between overflow-hidden rounded-xl cursor-pointer\",\r\n \"bg-white [box-shadow:0_0_0_1px_rgba(0,0,0,.03),0_2px_4px_rgba(0,0,0,.05),0_12px_24px_rgba(0,0,0,.05)]\",\r\n \"transform-gpu dark:bg-black dark:[border:1px_solid_rgba(255,255,255,.1)] dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset]\",\r\n className\r\n )}\r\n >\r\n {typeof background === \"string\" ? (\r\n <div className={cn(\"absolute inset-0\", background)} />\r\n ) : (\r\n <div className=\"absolute inset-0\">{background}</div>\r\n )}\r\n\r\n <div className=\"pointer-events-none z-10 flex transform-gpu flex-col gap-1 p-6 transition-all duration-300 group-hover:-translate-y-10\">\r\n {Icon && (\r\n <Icon className=\"h-12 w-12 origin-left transform-gpu text-neutral-700 transition-all duration-300 ease-in-out group-hover:scale-75 dark:text-neutral-300\" />\r\n )}\r\n <h3 className=\"text-xl font-semibold text-neutral-700 dark:text-neutral-300\">{name}</h3>\r\n <p className=\"max-w-lg text-neutral-400\">{description}</p>\r\n </div>\r\n\r\n {cta && (\r\n <div className=\"pointer-events-none absolute bottom-0 flex w-full translate-y-10 transform-gpu flex-row items-center p-4 opacity-0 transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100\">\r\n <span className=\"pointer-events-auto ml-auto flex items-center gap-2 rounded-lg bg-black px-4 py-2 text-white dark:bg-white dark:text-black\">\r\n {cta}\r\n <svg className=\"ml-2 h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"pointer-events-none absolute inset-0 transform-gpu transition-all duration-300 group-hover:bg-black/[.03] group-hover:dark:bg-neutral-800/10\" />\r\n </Wrapper>\r\n );\r\n}\r\n\r\nexport type { BentoCardProps, BentoGridProps };\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs}from'react/jsx-runtime';function t(...r){return twMerge(clsx(r))}function h({children:r,className:a}){return jsx("div",{className:t("grid w-full auto-rows-[22rem] grid-cols-3 gap-4",a),children:r})}function k({name:r,className:a,background:o,Icon:i,description:p,href:n,cta:l,onClick:d}){return jsxs(n?"a":"div",{...n?{href:n,target:"_blank",rel:"noopener noreferrer"}:{},onClick:d,className:t("group relative col-span-3 flex flex-col justify-between overflow-hidden rounded-xl cursor-pointer","bg-white [box-shadow:0_0_0_1px_rgba(0,0,0,.03),0_2px_4px_rgba(0,0,0,.05),0_12px_24px_rgba(0,0,0,.05)]","transform-gpu dark:bg-black dark:[border:1px_solid_rgba(255,255,255,.1)] dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset]",a),children:[typeof o=="string"?jsx("div",{className:t("absolute inset-0",o)}):jsx("div",{className:"absolute inset-0",children:o}),jsxs("div",{className:"pointer-events-none z-10 flex transform-gpu flex-col gap-1 p-6 transition-all duration-300 group-hover:-translate-y-10",children:[i&&jsx(i,{className:"h-12 w-12 origin-left transform-gpu text-neutral-700 transition-all duration-300 ease-in-out group-hover:scale-75 dark:text-neutral-300"}),jsx("h3",{className:"text-xl font-semibold text-neutral-700 dark:text-neutral-300",children:r}),jsx("p",{className:"max-w-lg text-neutral-400",children:p})]}),l&&jsx("div",{className:"pointer-events-none absolute bottom-0 flex w-full translate-y-10 transform-gpu flex-row items-center p-4 opacity-0 transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100",children:jsxs("span",{className:"pointer-events-auto ml-auto flex items-center gap-2 rounded-lg bg-black px-4 py-2 text-white dark:bg-white dark:text-black",children:[l,jsx("svg",{className:"ml-2 h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})})]})}),jsx("div",{className:"pointer-events-none absolute inset-0 transform-gpu transition-all duration-300 group-hover:bg-black/[.03] group-hover:dark:bg-neutral-800/10"})]})}export{k as BentoCard,h as BentoGrid};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/bento-grid/index.tsx"],"names":["cn","inputs","twMerge","clsx","BentoGrid","children","className","jsx","BentoCard","name","background","Icon","description","href","cta","onClick","jsxs"],"mappings":"sGAGO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,OAAAA,CAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCgBO,SAASG,CAAAA,CAAU,CAAE,QAAA,CAAAC,CAAAA,CAAU,UAAAC,CAAU,CAAA,CAAmB,CACjE,OAAOC,GAAAA,CAAC,OAAI,SAAA,CAAWP,CAAAA,CAAG,kDAAmDM,CAAS,CAAA,CAAI,SAAAD,CAAAA,CAAS,CACrG,CAEO,SAASG,EAAU,CAAE,IAAA,CAAAC,EAAM,SAAA,CAAAH,CAAAA,CAAW,WAAAI,CAAAA,CAAY,IAAA,CAAAC,EAAM,WAAA,CAAAC,CAAAA,CAAa,KAAAC,CAAAA,CAAM,GAAA,CAAAC,EAAK,OAAA,CAAAC,CAAQ,EAAmB,CAIhH,OACEC,IAAAA,CAJcH,CAAAA,CAAO,IAAM,KAAA,CAI1B,CACE,GAJgBA,CAAAA,CAAO,CAAE,KAAAA,CAAAA,CAAM,MAAA,CAAQ,SAAU,GAAA,CAAK,qBAAsB,EAAI,EAAC,CAKlF,QAASE,CAAAA,CACT,SAAA,CAAWf,EACT,mGAAA,CACA,uGAAA,CACA,+HAAA,CACAM,CACF,EAEC,QAAA,CAAA,CAAA,OAAOI,CAAAA,EAAe,SACrBH,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAWP,CAAAA,CAAG,kBAAA,CAAoBU,CAAU,CAAA,CAAG,CAAA,CAEpDH,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAAoB,QAAA,CAAAG,CAAAA,CAAW,EAGhDM,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wHAAA,CACZ,UAAAL,CAAAA,EACCJ,GAAAA,CAACI,EAAA,CAAK,SAAA,CAAU,0IAA0I,CAAA,CAE5JJ,GAAAA,CAAC,MAAG,SAAA,CAAU,8DAAA,CAAgE,SAAAE,CAAAA,CAAK,CAAA,CACnFF,IAAC,GAAA,CAAA,CAAE,SAAA,CAAU,4BAA6B,QAAA,CAAAK,CAAAA,CAAY,CAAA,CAAA,CACxD,CAAA,CAECE,GACCP,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,kMAAA,CACb,QAAA,CAAAS,KAAC,MAAA,CAAA,CAAK,SAAA,CAAU,6HACb,QAAA,CAAA,CAAAF,CAAAA,CACDP,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAe,IAAA,CAAK,MAAA,CAAO,OAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACtE,QAAA,CAAAA,IAAC,MAAA,CAAA,CAAK,aAAA,CAAc,QAAQ,cAAA,CAAe,OAAA,CAAQ,YAAa,CAAA,CAAG,CAAA,CAAE,eAAe,CAAA,CACtF,CAAA,CAAA,CACF,EACF,CAAA,CAEFA,GAAAA,CAAC,OAAI,SAAA,CAAU,8IAAA,CAA+I,GAChK,CAEJ","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 from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface BentoCardProps {\r\n name: string;\r\n className?: string;\r\n background?: React.ReactNode | string;\r\n Icon?: React.ComponentType<{ className?: string }>;\r\n description: string;\r\n href?: string;\r\n cta?: string;\r\n onClick?: () => void;\r\n}\r\n\r\ninterface BentoGridProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function BentoGrid({ children, className }: BentoGridProps) {\r\n return <div className={cn(\"grid w-full auto-rows-[22rem] grid-cols-3 gap-4\", className)}>{children}</div>;\r\n}\r\n\r\nexport function BentoCard({ name, className, background, Icon, description, href, cta, onClick }: BentoCardProps) {\r\n const Wrapper = href ? \"a\" : \"div\";\r\n const wrapperProps = href ? { href, target: \"_blank\", rel: \"noopener noreferrer\" } : {};\r\n\r\n return (\r\n <Wrapper\r\n {...wrapperProps}\r\n onClick={onClick}\r\n className={cn(\r\n \"group relative col-span-3 flex flex-col justify-between overflow-hidden rounded-xl cursor-pointer\",\r\n \"bg-white [box-shadow:0_0_0_1px_rgba(0,0,0,.03),0_2px_4px_rgba(0,0,0,.05),0_12px_24px_rgba(0,0,0,.05)]\",\r\n \"transform-gpu dark:bg-black dark:[border:1px_solid_rgba(255,255,255,.1)] dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset]\",\r\n className\r\n )}\r\n >\r\n {typeof background === \"string\" ? (\r\n <div className={cn(\"absolute inset-0\", background)} />\r\n ) : (\r\n <div className=\"absolute inset-0\">{background}</div>\r\n )}\r\n\r\n <div className=\"pointer-events-none z-10 flex transform-gpu flex-col gap-1 p-6 transition-all duration-300 group-hover:-translate-y-10\">\r\n {Icon && (\r\n <Icon className=\"h-12 w-12 origin-left transform-gpu text-neutral-700 transition-all duration-300 ease-in-out group-hover:scale-75 dark:text-neutral-300\" />\r\n )}\r\n <h3 className=\"text-xl font-semibold text-neutral-700 dark:text-neutral-300\">{name}</h3>\r\n <p className=\"max-w-lg text-neutral-400\">{description}</p>\r\n </div>\r\n\r\n {cta && (\r\n <div className=\"pointer-events-none absolute bottom-0 flex w-full translate-y-10 transform-gpu flex-row items-center p-4 opacity-0 transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100\">\r\n <span className=\"pointer-events-auto ml-auto flex items-center gap-2 rounded-lg bg-black px-4 py-2 text-white dark:bg-white dark:text-black\">\r\n {cta}\r\n <svg className=\"ml-2 h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"pointer-events-none absolute inset-0 transform-gpu transition-all duration-300 group-hover:bg-black/[.03] group-hover:dark:bg-neutral-800/10\" />\r\n </Wrapper>\r\n );\r\n}\r\n\r\nexport type { BentoCardProps, BentoGridProps };\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),framerMotion=require('framer-motion'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function p(...t){return tailwindMerge.twMerge(clsx.clsx(t))}var y=({item:t,index:e,totalCards:r,isExpanded:s})=>{let i=(r-1)*5,n=e*10-i,o=e*2,m=e*1.5,l=320,u=240,b=(l+(r-1)*(l-u))/2,g=e*(l-u)-b+l/2,f=e*5-(r-1)*2.5;return jsxRuntime.jsxs(framerMotion.motion.div,{initial:{x:n,y:o,rotate:m,scale:1},animate:{x:s?g:n,y:s?0:o,rotate:s?f:m,scale:1,zIndex:r-e},transition:{type:"spring",stiffness:350,damping:30,mass:.8},className:p("absolute inset-0 rounded-2xl p-6 w-full","bg-gradient-to-br from-white/40 via-neutral-50/30 to-neutral-100/20","dark:from-neutral-800/40 dark:via-neutral-900/30 dark:to-black/20","border border-white/20 dark:border-neutral-800/20","backdrop-blur-xl backdrop-saturate-150","shadow-[0_8px_20px_rgb(0,0,0,0.08)] dark:shadow-[0_8px_20px_rgb(0,0,0,0.3)]","transition-all duration-500 ease-out transform-gpu overflow-hidden"),style:{maxWidth:"320px",left:"50%",marginLeft:"-160px"},children:[jsxRuntime.jsx("div",{className:"absolute inset-1 rounded-xl bg-neutral-900/50 backdrop-blur-sm border border-neutral-200/50 dark:border-neutral-700/50"}),jsxRuntime.jsxs("div",{className:"relative z-10",children:[jsxRuntime.jsx("dl",{className:"mb-4 grid grid-cols-4 gap-2",children:t.specs.map(c=>jsxRuntime.jsxs("div",{className:"text-[10px] flex flex-col items-start",children:[jsxRuntime.jsx("dd",{className:"font-medium text-gray-500 dark:text-gray-400",children:c.value}),jsxRuntime.jsx("dt",{className:"text-white dark:text-gray-100",children:c.label})]},c.label))}),jsxRuntime.jsx("div",{className:"aspect-[16/11] w-full overflow-hidden rounded-lg bg-neutral-100 dark:bg-neutral-900 border border-neutral-200/50 dark:border-neutral-700/50",children:jsxRuntime.jsx("img",{src:t.image,alt:t.title,className:"object-cover w-full h-full",loading:"lazy"})}),jsxRuntime.jsxs("div",{className:"mt-4",children:[jsxRuntime.jsx("h2",{className:"text-3xl font-bold tracking-tight text-white",children:t.title}),jsxRuntime.jsx("span",{className:"block text-3xl font-semibold tracking-tight bg-gradient-to-r from-gray-400 via-gray-300 to-gray-500 bg-clip-text text-transparent",children:t.subtitle}),t.description&&jsxRuntime.jsx("p",{className:"mt-2 text-sm text-gray-500 dark:text-gray-400",children:t.description})]})]})]})};function P({items:t,className:e,defaultExpanded:r=false}){let[s,i]=react.useState(r);return jsxRuntime.jsx("button",{className:p("relative mx-auto cursor-pointer min-h-[440px] w-full max-w-[90vw] md:max-w-[1200px]","appearance-none bg-transparent border-0 p-0 flex items-center justify-center mb-8",e),onClick:()=>i(!s),"aria-label":"Toggle card stack",type:"button",children:t.map((n,o)=>jsxRuntime.jsx(y,{item:n,index:o,totalCards:t.length,isExpanded:s},n.id))})}exports.CardStack=P;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/card-stack/index.tsx"],"names":["cn","inputs","twMerge","clsx","Card","item","index","totalCards","isExpanded","centerOffset","defaultX","defaultY","defaultRotate","cardWidth","cardOverlap","expandedCenterOffset","spreadX","spreadRotate","jsxs","motion","jsx","spec","CardStack","items","className","defaultExpanded","setIsExpanded","useState"],"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 { useState } from \"react\";\r\nimport { motion } from \"framer-motion\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface Specification {\r\n label: string;\r\n value: string;\r\n}\r\n\r\ninterface CardStackItem {\r\n id: string;\r\n title: string;\r\n subtitle: string;\r\n image: string;\r\n specs: Specification[];\r\n description?: string;\r\n}\r\n\r\ninterface CardProps {\r\n item: CardStackItem;\r\n index: number;\r\n totalCards: number;\r\n isExpanded: boolean;\r\n}\r\n\r\nconst Card = ({ item, index, totalCards, isExpanded }: CardProps) => {\r\n const centerOffset = (totalCards - 1) * 5;\r\n const defaultX = index * 10 - centerOffset;\r\n const defaultY = index * 2;\r\n const defaultRotate = index * 1.5;\r\n\r\n const cardWidth = 320;\r\n const cardOverlap = 240;\r\n const totalExpandedWidth = cardWidth + (totalCards - 1) * (cardWidth - cardOverlap);\r\n const expandedCenterOffset = totalExpandedWidth / 2;\r\n\r\n const spreadX = index * (cardWidth - cardOverlap) - expandedCenterOffset + cardWidth / 2;\r\n const spreadRotate = index * 5 - (totalCards - 1) * 2.5;\r\n\r\n return (\r\n <motion.div\r\n initial={{ x: defaultX, y: defaultY, rotate: defaultRotate, scale: 1 }}\r\n animate={{\r\n x: isExpanded ? spreadX : defaultX,\r\n y: isExpanded ? 0 : defaultY,\r\n rotate: isExpanded ? spreadRotate : defaultRotate,\r\n scale: 1,\r\n zIndex: totalCards - index,\r\n }}\r\n transition={{ type: \"spring\", stiffness: 350, damping: 30, mass: 0.8 }}\r\n className={cn(\r\n \"absolute inset-0 rounded-2xl p-6 w-full\",\r\n \"bg-gradient-to-br from-white/40 via-neutral-50/30 to-neutral-100/20\",\r\n \"dark:from-neutral-800/40 dark:via-neutral-900/30 dark:to-black/20\",\r\n \"border border-white/20 dark:border-neutral-800/20\",\r\n \"backdrop-blur-xl backdrop-saturate-150\",\r\n \"shadow-[0_8px_20px_rgb(0,0,0,0.08)] dark:shadow-[0_8px_20px_rgb(0,0,0,0.3)]\",\r\n \"transition-all duration-500 ease-out transform-gpu overflow-hidden\"\r\n )}\r\n style={{ maxWidth: \"320px\", left: \"50%\", marginLeft: \"-160px\" }}\r\n >\r\n <div className=\"absolute inset-1 rounded-xl bg-neutral-900/50 backdrop-blur-sm border border-neutral-200/50 dark:border-neutral-700/50\" />\r\n <div className=\"relative z-10\">\r\n <dl className=\"mb-4 grid grid-cols-4 gap-2\">\r\n {item.specs.map((spec) => (\r\n <div key={spec.label} className=\"text-[10px] flex flex-col items-start\">\r\n <dd className=\"font-medium text-gray-500 dark:text-gray-400\">{spec.value}</dd>\r\n <dt className=\"text-white dark:text-gray-100\">{spec.label}</dt>\r\n </div>\r\n ))}\r\n </dl>\r\n <div className=\"aspect-[16/11] w-full overflow-hidden rounded-lg bg-neutral-100 dark:bg-neutral-900 border border-neutral-200/50 dark:border-neutral-700/50\">\r\n <img src={item.image} alt={item.title} className=\"object-cover w-full h-full\" loading=\"lazy\" />\r\n </div>\r\n <div className=\"mt-4\">\r\n <h2 className=\"text-3xl font-bold tracking-tight text-white\">{item.title}</h2>\r\n <span className=\"block text-3xl font-semibold tracking-tight bg-gradient-to-r from-gray-400 via-gray-300 to-gray-500 bg-clip-text text-transparent\">\r\n {item.subtitle}\r\n </span>\r\n {item.description && <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400\">{item.description}</p>}\r\n </div>\r\n </div>\r\n </motion.div>\r\n );\r\n};\r\n\r\ninterface CardStackProps {\r\n items: CardStackItem[];\r\n className?: string;\r\n defaultExpanded?: boolean;\r\n}\r\n\r\nexport function CardStack({ items, className, defaultExpanded = false }: CardStackProps) {\r\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\r\n\r\n return (\r\n <button\r\n className={cn(\r\n \"relative mx-auto cursor-pointer min-h-[440px] w-full max-w-[90vw] md:max-w-[1200px]\",\r\n \"appearance-none bg-transparent border-0 p-0 flex items-center justify-center mb-8\",\r\n className\r\n )}\r\n onClick={() => setIsExpanded(!isExpanded)}\r\n aria-label=\"Toggle card stack\"\r\n type=\"button\"\r\n >\r\n {items.map((item, index) => (\r\n <Card key={item.id} item={item} index={index} totalCards={items.length} isExpanded={isExpanded} />\r\n ))}\r\n </button>\r\n );\r\n}\r\n\r\nexport type { CardStackItem, Specification };\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useState}from'react';import {motion}from'framer-motion';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs}from'react/jsx-runtime';function p(...t){return twMerge(clsx(t))}var y=({item:t,index:e,totalCards:r,isExpanded:s})=>{let i=(r-1)*5,n=e*10-i,o=e*2,m=e*1.5,l=320,u=240,b=(l+(r-1)*(l-u))/2,g=e*(l-u)-b+l/2,f=e*5-(r-1)*2.5;return jsxs(motion.div,{initial:{x:n,y:o,rotate:m,scale:1},animate:{x:s?g:n,y:s?0:o,rotate:s?f:m,scale:1,zIndex:r-e},transition:{type:"spring",stiffness:350,damping:30,mass:.8},className:p("absolute inset-0 rounded-2xl p-6 w-full","bg-gradient-to-br from-white/40 via-neutral-50/30 to-neutral-100/20","dark:from-neutral-800/40 dark:via-neutral-900/30 dark:to-black/20","border border-white/20 dark:border-neutral-800/20","backdrop-blur-xl backdrop-saturate-150","shadow-[0_8px_20px_rgb(0,0,0,0.08)] dark:shadow-[0_8px_20px_rgb(0,0,0,0.3)]","transition-all duration-500 ease-out transform-gpu overflow-hidden"),style:{maxWidth:"320px",left:"50%",marginLeft:"-160px"},children:[jsx("div",{className:"absolute inset-1 rounded-xl bg-neutral-900/50 backdrop-blur-sm border border-neutral-200/50 dark:border-neutral-700/50"}),jsxs("div",{className:"relative z-10",children:[jsx("dl",{className:"mb-4 grid grid-cols-4 gap-2",children:t.specs.map(c=>jsxs("div",{className:"text-[10px] flex flex-col items-start",children:[jsx("dd",{className:"font-medium text-gray-500 dark:text-gray-400",children:c.value}),jsx("dt",{className:"text-white dark:text-gray-100",children:c.label})]},c.label))}),jsx("div",{className:"aspect-[16/11] w-full overflow-hidden rounded-lg bg-neutral-100 dark:bg-neutral-900 border border-neutral-200/50 dark:border-neutral-700/50",children:jsx("img",{src:t.image,alt:t.title,className:"object-cover w-full h-full",loading:"lazy"})}),jsxs("div",{className:"mt-4",children:[jsx("h2",{className:"text-3xl font-bold tracking-tight text-white",children:t.title}),jsx("span",{className:"block text-3xl font-semibold tracking-tight bg-gradient-to-r from-gray-400 via-gray-300 to-gray-500 bg-clip-text text-transparent",children:t.subtitle}),t.description&&jsx("p",{className:"mt-2 text-sm text-gray-500 dark:text-gray-400",children:t.description})]})]})]})};function P({items:t,className:e,defaultExpanded:r=false}){let[s,i]=useState(r);return jsx("button",{className:p("relative mx-auto cursor-pointer min-h-[440px] w-full max-w-[90vw] md:max-w-[1200px]","appearance-none bg-transparent border-0 p-0 flex items-center justify-center mb-8",e),onClick:()=>i(!s),"aria-label":"Toggle card stack",type:"button",children:t.map((n,o)=>jsx(y,{item:n,index:o,totalCards:t.length,isExpanded:s},n.id))})}export{P as CardStack};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/card-stack/index.tsx"],"names":["cn","inputs","twMerge","clsx","Card","item","index","totalCards","isExpanded","centerOffset","defaultX","defaultY","defaultRotate","cardWidth","cardOverlap","expandedCenterOffset","spreadX","spreadRotate","jsxs","motion","jsx","spec","CardStack","items","className","defaultExpanded","setIsExpanded","useState"],"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 { useState } from \"react\";\r\nimport { motion } from \"framer-motion\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface Specification {\r\n label: string;\r\n value: string;\r\n}\r\n\r\ninterface CardStackItem {\r\n id: string;\r\n title: string;\r\n subtitle: string;\r\n image: string;\r\n specs: Specification[];\r\n description?: string;\r\n}\r\n\r\ninterface CardProps {\r\n item: CardStackItem;\r\n index: number;\r\n totalCards: number;\r\n isExpanded: boolean;\r\n}\r\n\r\nconst Card = ({ item, index, totalCards, isExpanded }: CardProps) => {\r\n const centerOffset = (totalCards - 1) * 5;\r\n const defaultX = index * 10 - centerOffset;\r\n const defaultY = index * 2;\r\n const defaultRotate = index * 1.5;\r\n\r\n const cardWidth = 320;\r\n const cardOverlap = 240;\r\n const totalExpandedWidth = cardWidth + (totalCards - 1) * (cardWidth - cardOverlap);\r\n const expandedCenterOffset = totalExpandedWidth / 2;\r\n\r\n const spreadX = index * (cardWidth - cardOverlap) - expandedCenterOffset + cardWidth / 2;\r\n const spreadRotate = index * 5 - (totalCards - 1) * 2.5;\r\n\r\n return (\r\n <motion.div\r\n initial={{ x: defaultX, y: defaultY, rotate: defaultRotate, scale: 1 }}\r\n animate={{\r\n x: isExpanded ? spreadX : defaultX,\r\n y: isExpanded ? 0 : defaultY,\r\n rotate: isExpanded ? spreadRotate : defaultRotate,\r\n scale: 1,\r\n zIndex: totalCards - index,\r\n }}\r\n transition={{ type: \"spring\", stiffness: 350, damping: 30, mass: 0.8 }}\r\n className={cn(\r\n \"absolute inset-0 rounded-2xl p-6 w-full\",\r\n \"bg-gradient-to-br from-white/40 via-neutral-50/30 to-neutral-100/20\",\r\n \"dark:from-neutral-800/40 dark:via-neutral-900/30 dark:to-black/20\",\r\n \"border border-white/20 dark:border-neutral-800/20\",\r\n \"backdrop-blur-xl backdrop-saturate-150\",\r\n \"shadow-[0_8px_20px_rgb(0,0,0,0.08)] dark:shadow-[0_8px_20px_rgb(0,0,0,0.3)]\",\r\n \"transition-all duration-500 ease-out transform-gpu overflow-hidden\"\r\n )}\r\n style={{ maxWidth: \"320px\", left: \"50%\", marginLeft: \"-160px\" }}\r\n >\r\n <div className=\"absolute inset-1 rounded-xl bg-neutral-900/50 backdrop-blur-sm border border-neutral-200/50 dark:border-neutral-700/50\" />\r\n <div className=\"relative z-10\">\r\n <dl className=\"mb-4 grid grid-cols-4 gap-2\">\r\n {item.specs.map((spec) => (\r\n <div key={spec.label} className=\"text-[10px] flex flex-col items-start\">\r\n <dd className=\"font-medium text-gray-500 dark:text-gray-400\">{spec.value}</dd>\r\n <dt className=\"text-white dark:text-gray-100\">{spec.label}</dt>\r\n </div>\r\n ))}\r\n </dl>\r\n <div className=\"aspect-[16/11] w-full overflow-hidden rounded-lg bg-neutral-100 dark:bg-neutral-900 border border-neutral-200/50 dark:border-neutral-700/50\">\r\n <img src={item.image} alt={item.title} className=\"object-cover w-full h-full\" loading=\"lazy\" />\r\n </div>\r\n <div className=\"mt-4\">\r\n <h2 className=\"text-3xl font-bold tracking-tight text-white\">{item.title}</h2>\r\n <span className=\"block text-3xl font-semibold tracking-tight bg-gradient-to-r from-gray-400 via-gray-300 to-gray-500 bg-clip-text text-transparent\">\r\n {item.subtitle}\r\n </span>\r\n {item.description && <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400\">{item.description}</p>}\r\n </div>\r\n </div>\r\n </motion.div>\r\n );\r\n};\r\n\r\ninterface CardStackProps {\r\n items: CardStackItem[];\r\n className?: string;\r\n defaultExpanded?: boolean;\r\n}\r\n\r\nexport function CardStack({ items, className, defaultExpanded = false }: CardStackProps) {\r\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\r\n\r\n return (\r\n <button\r\n className={cn(\r\n \"relative mx-auto cursor-pointer min-h-[440px] w-full max-w-[90vw] md:max-w-[1200px]\",\r\n \"appearance-none bg-transparent border-0 p-0 flex items-center justify-center mb-8\",\r\n className\r\n )}\r\n onClick={() => setIsExpanded(!isExpanded)}\r\n aria-label=\"Toggle card stack\"\r\n type=\"button\"\r\n >\r\n {items.map((item, index) => (\r\n <Card key={item.id} item={item} index={index} totalCards={items.length} isExpanded={isExpanded} />\r\n ))}\r\n </button>\r\n );\r\n}\r\n\r\nexport type { CardStackItem, Specification };\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 v(...i){return tailwindMerge.twMerge(clsx.clsx(i))}var x=(i,r,l)=>(1-l)*i+l*r;function w({color:i="#000000",containerRef:r=null,className:l}){let h=react.useRef(null),t=react.useRef(null),n=react.useRef(null),a=react.useRef({x:0,y:0}),o=react.useRef({x:0,y:0}),p=react.useRef();return react.useEffect(()=>{if(typeof window>"u")return;let E=(e,s)=>{if(s){let u=s.getBoundingClientRect();return {x:e.clientX-u.left,y:e.clientY-u.top}}return {x:e.clientX,y:e.clientY}},y=e=>{if(a.current=E(e,r?.current||void 0),r?.current){let s=r.current.getBoundingClientRect(),u=e.clientX<s.left||e.clientX>s.right||e.clientY<s.top||e.clientY>s.bottom;t.current&&n.current&&(t.current.style.opacity=u?"0":"1",n.current.style.opacity=u?"0":"1");}},m=r?.current||window;m.addEventListener("mousemove",y),t.current&&n.current&&(t.current.style.opacity="0",n.current.style.opacity="0");let f=()=>{o.current={...a.current},t.current&&n.current&&(t.current.style.opacity="1",n.current.style.opacity="1"),m.removeEventListener("mousemove",f);};m.addEventListener("mousemove",f);let d=()=>{o.current.x=x(o.current.x,a.current.x,.15),o.current.y=x(o.current.y,a.current.y,.15),t.current&&n.current&&(n.current.style.transform=`translateX(${o.current.x}px)`,t.current.style.transform=`translateY(${o.current.y}px)`),p.current=requestAnimationFrame(d);};return d(),()=>{m.removeEventListener("mousemove",y),p.current&&cancelAnimationFrame(p.current);}},[r]),jsxRuntime.jsxs("div",{ref:h,className:v("pointer-events-none z-[10000]",l),style:{position:r?"absolute":"fixed",top:0,left:0,width:"100%",height:"100%"},children:[jsxRuntime.jsx("div",{ref:t,style:{position:"absolute",width:"100%",height:"1px",background:i,pointerEvents:"none",opacity:0,transition:"opacity 0.3s ease"}}),jsxRuntime.jsx("div",{ref:n,style:{position:"absolute",height:"100%",width:"1px",background:i,pointerEvents:"none",opacity:0,transition:"opacity 0.3s ease"}})]})}var F=w;exports.Crosshair=w;exports.default=F;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/crosshair/index.tsx"],"names":["cn","inputs","twMerge","clsx","lerp","a","b","n","Crosshair","color","containerRef","className","cursorRef","useRef","lineHorizontalRef","lineVerticalRef","mouseRef","renderedRef","animationRef","useEffect","getMousePos","container","bounds","handleMouseMove","ev","isOutside","target","onFirstMove","render","jsxs","jsx","crosshair_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 } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface CrosshairProps {\r\n color?: string;\r\n containerRef?: React.RefObject<HTMLElement>;\r\n className?: string;\r\n}\r\n\r\nconst lerp = (a: number, b: number, n: number) => (1 - n) * a + n * b;\r\n\r\nexport function Crosshair({\r\n color = \"#000000\",\r\n containerRef = null,\r\n className,\r\n}: CrosshairProps) {\r\n const cursorRef = useRef<HTMLDivElement>(null);\r\n const lineHorizontalRef = useRef<HTMLDivElement>(null);\r\n const lineVerticalRef = useRef<HTMLDivElement>(null);\r\n const mouseRef = useRef({ x: 0, y: 0 });\r\n const renderedRef = useRef({ x: 0, y: 0 });\r\n const animationRef = useRef<number>();\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n\r\n const getMousePos = (e: MouseEvent, container?: HTMLElement) => {\r\n if (container) {\r\n const bounds = container.getBoundingClientRect();\r\n return {\r\n x: e.clientX - bounds.left,\r\n y: e.clientY - bounds.top,\r\n };\r\n }\r\n return { x: e.clientX, y: e.clientY };\r\n };\r\n\r\n const handleMouseMove = (ev: MouseEvent) => {\r\n mouseRef.current = getMousePos(ev, containerRef?.current || undefined);\r\n\r\n if (containerRef?.current) {\r\n const bounds = containerRef.current.getBoundingClientRect();\r\n const isOutside =\r\n ev.clientX < bounds.left ||\r\n ev.clientX > bounds.right ||\r\n ev.clientY < bounds.top ||\r\n ev.clientY > bounds.bottom;\r\n\r\n if (lineHorizontalRef.current && lineVerticalRef.current) {\r\n lineHorizontalRef.current.style.opacity = isOutside ? \"0\" : \"1\";\r\n lineVerticalRef.current.style.opacity = isOutside ? \"0\" : \"1\";\r\n }\r\n }\r\n };\r\n\r\n const target = containerRef?.current || window;\r\n target.addEventListener(\"mousemove\", handleMouseMove as any);\r\n\r\n // Initial setup\r\n if (lineHorizontalRef.current && lineVerticalRef.current) {\r\n lineHorizontalRef.current.style.opacity = \"0\";\r\n lineVerticalRef.current.style.opacity = \"0\";\r\n }\r\n\r\n const onFirstMove = () => {\r\n renderedRef.current = { ...mouseRef.current };\r\n if (lineHorizontalRef.current && lineVerticalRef.current) {\r\n lineHorizontalRef.current.style.opacity = \"1\";\r\n lineVerticalRef.current.style.opacity = \"1\";\r\n }\r\n target.removeEventListener(\"mousemove\", onFirstMove as any);\r\n };\r\n target.addEventListener(\"mousemove\", onFirstMove as any);\r\n\r\n const render = () => {\r\n renderedRef.current.x = lerp(renderedRef.current.x, mouseRef.current.x, 0.15);\r\n renderedRef.current.y = lerp(renderedRef.current.y, mouseRef.current.y, 0.15);\r\n\r\n if (lineHorizontalRef.current && lineVerticalRef.current) {\r\n lineVerticalRef.current.style.transform = `translateX(${renderedRef.current.x}px)`;\r\n lineHorizontalRef.current.style.transform = `translateY(${renderedRef.current.y}px)`;\r\n }\r\n\r\n animationRef.current = requestAnimationFrame(render);\r\n };\r\n\r\n render();\r\n\r\n return () => {\r\n target.removeEventListener(\"mousemove\", handleMouseMove as any);\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n }\r\n };\r\n }, [containerRef]);\r\n\r\n return (\r\n <div\r\n ref={cursorRef}\r\n className={cn(\"pointer-events-none z-[10000]\", className)}\r\n style={{\r\n position: containerRef ? \"absolute\" : \"fixed\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n }}\r\n >\r\n <div\r\n ref={lineHorizontalRef}\r\n style={{\r\n position: \"absolute\",\r\n width: \"100%\",\r\n height: \"1px\",\r\n background: color,\r\n pointerEvents: \"none\",\r\n opacity: 0,\r\n transition: \"opacity 0.3s ease\",\r\n }}\r\n />\r\n <div\r\n ref={lineVerticalRef}\r\n style={{\r\n position: \"absolute\",\r\n height: \"100%\",\r\n width: \"1px\",\r\n background: color,\r\n pointerEvents: \"none\",\r\n opacity: 0,\r\n transition: \"opacity 0.3s ease\",\r\n }}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default Crosshair;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useRef,useEffect}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsxs,jsx}from'react/jsx-runtime';function v(...i){return twMerge(clsx(i))}var x=(i,r,l)=>(1-l)*i+l*r;function w({color:i="#000000",containerRef:r=null,className:l}){let h=useRef(null),t=useRef(null),n=useRef(null),a=useRef({x:0,y:0}),o=useRef({x:0,y:0}),p=useRef();return useEffect(()=>{if(typeof window>"u")return;let E=(e,s)=>{if(s){let u=s.getBoundingClientRect();return {x:e.clientX-u.left,y:e.clientY-u.top}}return {x:e.clientX,y:e.clientY}},y=e=>{if(a.current=E(e,r?.current||void 0),r?.current){let s=r.current.getBoundingClientRect(),u=e.clientX<s.left||e.clientX>s.right||e.clientY<s.top||e.clientY>s.bottom;t.current&&n.current&&(t.current.style.opacity=u?"0":"1",n.current.style.opacity=u?"0":"1");}},m=r?.current||window;m.addEventListener("mousemove",y),t.current&&n.current&&(t.current.style.opacity="0",n.current.style.opacity="0");let f=()=>{o.current={...a.current},t.current&&n.current&&(t.current.style.opacity="1",n.current.style.opacity="1"),m.removeEventListener("mousemove",f);};m.addEventListener("mousemove",f);let d=()=>{o.current.x=x(o.current.x,a.current.x,.15),o.current.y=x(o.current.y,a.current.y,.15),t.current&&n.current&&(n.current.style.transform=`translateX(${o.current.x}px)`,t.current.style.transform=`translateY(${o.current.y}px)`),p.current=requestAnimationFrame(d);};return d(),()=>{m.removeEventListener("mousemove",y),p.current&&cancelAnimationFrame(p.current);}},[r]),jsxs("div",{ref:h,className:v("pointer-events-none z-[10000]",l),style:{position:r?"absolute":"fixed",top:0,left:0,width:"100%",height:"100%"},children:[jsx("div",{ref:t,style:{position:"absolute",width:"100%",height:"1px",background:i,pointerEvents:"none",opacity:0,transition:"opacity 0.3s ease"}}),jsx("div",{ref:n,style:{position:"absolute",height:"100%",width:"1px",background:i,pointerEvents:"none",opacity:0,transition:"opacity 0.3s ease"}})]})}var F=w;export{w as Crosshair,F as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/crosshair/index.tsx"],"names":["cn","inputs","twMerge","clsx","lerp","a","b","n","Crosshair","color","containerRef","className","cursorRef","useRef","lineHorizontalRef","lineVerticalRef","mouseRef","renderedRef","animationRef","useEffect","getMousePos","container","bounds","handleMouseMove","ev","isOutside","target","onFirstMove","render","jsxs","jsx","crosshair_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 } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface CrosshairProps {\r\n color?: string;\r\n containerRef?: React.RefObject<HTMLElement>;\r\n className?: string;\r\n}\r\n\r\nconst lerp = (a: number, b: number, n: number) => (1 - n) * a + n * b;\r\n\r\nexport function Crosshair({\r\n color = \"#000000\",\r\n containerRef = null,\r\n className,\r\n}: CrosshairProps) {\r\n const cursorRef = useRef<HTMLDivElement>(null);\r\n const lineHorizontalRef = useRef<HTMLDivElement>(null);\r\n const lineVerticalRef = useRef<HTMLDivElement>(null);\r\n const mouseRef = useRef({ x: 0, y: 0 });\r\n const renderedRef = useRef({ x: 0, y: 0 });\r\n const animationRef = useRef<number>();\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n\r\n const getMousePos = (e: MouseEvent, container?: HTMLElement) => {\r\n if (container) {\r\n const bounds = container.getBoundingClientRect();\r\n return {\r\n x: e.clientX - bounds.left,\r\n y: e.clientY - bounds.top,\r\n };\r\n }\r\n return { x: e.clientX, y: e.clientY };\r\n };\r\n\r\n const handleMouseMove = (ev: MouseEvent) => {\r\n mouseRef.current = getMousePos(ev, containerRef?.current || undefined);\r\n\r\n if (containerRef?.current) {\r\n const bounds = containerRef.current.getBoundingClientRect();\r\n const isOutside =\r\n ev.clientX < bounds.left ||\r\n ev.clientX > bounds.right ||\r\n ev.clientY < bounds.top ||\r\n ev.clientY > bounds.bottom;\r\n\r\n if (lineHorizontalRef.current && lineVerticalRef.current) {\r\n lineHorizontalRef.current.style.opacity = isOutside ? \"0\" : \"1\";\r\n lineVerticalRef.current.style.opacity = isOutside ? \"0\" : \"1\";\r\n }\r\n }\r\n };\r\n\r\n const target = containerRef?.current || window;\r\n target.addEventListener(\"mousemove\", handleMouseMove as any);\r\n\r\n // Initial setup\r\n if (lineHorizontalRef.current && lineVerticalRef.current) {\r\n lineHorizontalRef.current.style.opacity = \"0\";\r\n lineVerticalRef.current.style.opacity = \"0\";\r\n }\r\n\r\n const onFirstMove = () => {\r\n renderedRef.current = { ...mouseRef.current };\r\n if (lineHorizontalRef.current && lineVerticalRef.current) {\r\n lineHorizontalRef.current.style.opacity = \"1\";\r\n lineVerticalRef.current.style.opacity = \"1\";\r\n }\r\n target.removeEventListener(\"mousemove\", onFirstMove as any);\r\n };\r\n target.addEventListener(\"mousemove\", onFirstMove as any);\r\n\r\n const render = () => {\r\n renderedRef.current.x = lerp(renderedRef.current.x, mouseRef.current.x, 0.15);\r\n renderedRef.current.y = lerp(renderedRef.current.y, mouseRef.current.y, 0.15);\r\n\r\n if (lineHorizontalRef.current && lineVerticalRef.current) {\r\n lineVerticalRef.current.style.transform = `translateX(${renderedRef.current.x}px)`;\r\n lineHorizontalRef.current.style.transform = `translateY(${renderedRef.current.y}px)`;\r\n }\r\n\r\n animationRef.current = requestAnimationFrame(render);\r\n };\r\n\r\n render();\r\n\r\n return () => {\r\n target.removeEventListener(\"mousemove\", handleMouseMove as any);\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n }\r\n };\r\n }, [containerRef]);\r\n\r\n return (\r\n <div\r\n ref={cursorRef}\r\n className={cn(\"pointer-events-none z-[10000]\", className)}\r\n style={{\r\n position: containerRef ? \"absolute\" : \"fixed\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n }}\r\n >\r\n <div\r\n ref={lineHorizontalRef}\r\n style={{\r\n position: \"absolute\",\r\n width: \"100%\",\r\n height: \"1px\",\r\n background: color,\r\n pointerEvents: \"none\",\r\n opacity: 0,\r\n transition: \"opacity 0.3s ease\",\r\n }}\r\n />\r\n <div\r\n ref={lineVerticalRef}\r\n style={{\r\n position: \"absolute\",\r\n height: \"100%\",\r\n width: \"1px\",\r\n background: color,\r\n pointerEvents: \"none\",\r\n opacity: 0,\r\n transition: \"opacity 0.3s ease\",\r\n }}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default Crosshair;\r\n"]}
@@ -0,0 +1,3 @@
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 R(...f){return tailwindMerge.twMerge(clsx.clsx(f))}function T({width:f=300,height:C=400,image:D="https://picsum.photos/300/400?grayscale",children:y,className:E}){let p=react.useRef(null),h=react.useRef(null),i=react.useRef({x:0,y:0}),a=react.useRef({x:0,y:0}),o=react.useRef({x:0,y:0,rz:0}),x=react.useRef(0),g=react.useRef();react.useEffect(()=>{if(typeof window>"u")return;i.current={x:window.innerWidth/2,y:window.innerHeight/2},a.current={...i.current};let l=(n,c,e)=>(1-e)*n+e*c,m=(n,c,e,t,d)=>(n-c)*(d-t)/(e-c)+t,N=(n,c,e,t)=>Math.hypot(n-c,e-t),v=n=>{i.current={x:n.clientX,y:n.clientY};};window.addEventListener("mousemove",v);let M=()=>{let n=window.innerWidth,c=window.innerHeight,e=l(o.current.x,m(i.current.x,0,n,-120,120),.1),t=l(o.current.y,m(i.current.y,0,c,-120,120),.1),d=l(o.current.rz,m(i.current.x,0,n,-10,10),.1),r=50;e>r&&(e=r+(e-r)*.2),e<-r&&(e=-r+(e+r)*.2),t>r&&(t=r+(t-r)*.2),t<-r&&(t=-r+(t+r)*.2),o.current={x:e,y:t,rz:d},p.current&&(p.current.style.transform=`translate(${e}px, ${t}px) rotateZ(${d}deg)`);let S=N(a.current.x,i.current.x,a.current.y,i.current.y);x.current=l(x.current,m(S,0,200,0,400),.06),h.current&&h.current.setAttribute("scale",String(x.current)),a.current={...i.current},g.current=requestAnimationFrame(M);};return M(),()=>{window.removeEventListener("mousemove",v),g.current&&cancelAnimationFrame(g.current);}},[]);let b=`imgFilter-${Math.random().toString(36).substr(2,9)}`;return jsxRuntime.jsxs("div",{className:R("relative",E),style:{width:`${f}px`,height:`${C}px`},ref:p,children:[jsxRuntime.jsxs("svg",{viewBox:"-60 -75 720 900",preserveAspectRatio:"xMidYMid slice",className:"w-full h-full",children:[jsxRuntime.jsx("defs",{children:jsxRuntime.jsxs("filter",{id:b,children:[jsxRuntime.jsx("feTurbulence",{type:"turbulence",baseFrequency:"0.015",numOctaves:"5",seed:"4",stitchTiles:"stitch",x:"0%",y:"0%",width:"100%",height:"100%",result:"turbulence1"}),jsxRuntime.jsx("feDisplacementMap",{ref:h,in:"SourceGraphic",in2:"turbulence1",scale:"0",xChannelSelector:"R",yChannelSelector:"B",x:"0%",y:"0%",width:"100%",height:"100%",result:"displacementMap3"})]})}),jsxRuntime.jsx("g",{children:jsxRuntime.jsx("image",{href:D,x:"0",y:"0",width:"600",height:"750",filter:`url(#${b})`,preserveAspectRatio:"xMidYMid slice"})})]}),y&&jsxRuntime.jsx("div",{className:"absolute inset-0 flex items-end p-6",children:jsxRuntime.jsx("div",{className:"text-white",children:y})})]})}var B=T;
2
+ exports.DecayCard=T;exports.default=B;//# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/decay-card/index.tsx"],"names":["cn","inputs","twMerge","clsx","DecayCard","width","height","image","children","className","containerRef","useRef","displacementMapRef","cursor","cachedCursor","imgTransforms","displacementScale","animationRef","useEffect","lerp","a","b","n","map","x","c","distance","x1","x2","y1","y2","handleMouseMove","ev","render","winWidth","winHeight","targetX","targetY","targetRz","bound","cursorTravelledDistance","filterId","jsxs","jsx","decay_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, { useEffect, useRef, ReactNode } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface DecayCardProps {\r\n width?: number;\r\n height?: number;\r\n image?: string;\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function DecayCard({\r\n width = 300,\r\n height = 400,\r\n image = \"https://picsum.photos/300/400?grayscale\",\r\n children,\r\n className,\r\n}: DecayCardProps) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const displacementMapRef = useRef<SVGFEDisplacementMapElement>(null);\r\n const cursor = useRef({ x: 0, y: 0 });\r\n const cachedCursor = useRef({ x: 0, y: 0 });\r\n const imgTransforms = useRef({ x: 0, y: 0, rz: 0 });\r\n const displacementScale = useRef(0);\r\n const animationRef = useRef<number>();\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n\r\n cursor.current = { x: window.innerWidth / 2, y: window.innerHeight / 2 };\r\n cachedCursor.current = { ...cursor.current };\r\n\r\n const lerp = (a: number, b: number, n: number) => (1 - n) * a + n * b;\r\n const map = (x: number, a: number, b: number, c: number, d: number) =>\r\n ((x - a) * (d - c)) / (b - a) + c;\r\n const distance = (x1: number, x2: number, y1: number, y2: number) =>\r\n Math.hypot(x1 - x2, y1 - y2);\r\n\r\n const handleMouseMove = (ev: MouseEvent) => {\r\n cursor.current = { x: ev.clientX, y: ev.clientY };\r\n };\r\n\r\n window.addEventListener(\"mousemove\", handleMouseMove);\r\n\r\n const render = () => {\r\n const winWidth = window.innerWidth;\r\n const winHeight = window.innerHeight;\r\n\r\n let targetX = lerp(\r\n imgTransforms.current.x,\r\n map(cursor.current.x, 0, winWidth, -120, 120),\r\n 0.1\r\n );\r\n let targetY = lerp(\r\n imgTransforms.current.y,\r\n map(cursor.current.y, 0, winHeight, -120, 120),\r\n 0.1\r\n );\r\n let targetRz = lerp(\r\n imgTransforms.current.rz,\r\n map(cursor.current.x, 0, winWidth, -10, 10),\r\n 0.1\r\n );\r\n\r\n const bound = 50;\r\n if (targetX > bound) targetX = bound + (targetX - bound) * 0.2;\r\n if (targetX < -bound) targetX = -bound + (targetX + bound) * 0.2;\r\n if (targetY > bound) targetY = bound + (targetY - bound) * 0.2;\r\n if (targetY < -bound) targetY = -bound + (targetY + bound) * 0.2;\r\n\r\n imgTransforms.current = { x: targetX, y: targetY, rz: targetRz };\r\n\r\n if (containerRef.current) {\r\n containerRef.current.style.transform = `translate(${targetX}px, ${targetY}px) rotateZ(${targetRz}deg)`;\r\n }\r\n\r\n const cursorTravelledDistance = distance(\r\n cachedCursor.current.x,\r\n cursor.current.x,\r\n cachedCursor.current.y,\r\n cursor.current.y\r\n );\r\n\r\n displacementScale.current = lerp(\r\n displacementScale.current,\r\n map(cursorTravelledDistance, 0, 200, 0, 400),\r\n 0.06\r\n );\r\n\r\n if (displacementMapRef.current) {\r\n displacementMapRef.current.setAttribute(\r\n \"scale\",\r\n String(displacementScale.current)\r\n );\r\n }\r\n\r\n cachedCursor.current = { ...cursor.current };\r\n animationRef.current = requestAnimationFrame(render);\r\n };\r\n\r\n render();\r\n\r\n return () => {\r\n window.removeEventListener(\"mousemove\", handleMouseMove);\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n const filterId = `imgFilter-${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n return (\r\n <div\r\n className={cn(\"relative\", className)}\r\n style={{ width: `${width}px`, height: `${height}px` }}\r\n ref={containerRef}\r\n >\r\n <svg\r\n viewBox=\"-60 -75 720 900\"\r\n preserveAspectRatio=\"xMidYMid slice\"\r\n className=\"w-full h-full\"\r\n >\r\n <defs>\r\n <filter id={filterId}>\r\n <feTurbulence\r\n type=\"turbulence\"\r\n baseFrequency=\"0.015\"\r\n numOctaves=\"5\"\r\n seed=\"4\"\r\n stitchTiles=\"stitch\"\r\n x=\"0%\"\r\n y=\"0%\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n result=\"turbulence1\"\r\n />\r\n <feDisplacementMap\r\n ref={displacementMapRef}\r\n in=\"SourceGraphic\"\r\n in2=\"turbulence1\"\r\n scale=\"0\"\r\n xChannelSelector=\"R\"\r\n yChannelSelector=\"B\"\r\n x=\"0%\"\r\n y=\"0%\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n result=\"displacementMap3\"\r\n />\r\n </filter>\r\n </defs>\r\n <g>\r\n <image\r\n href={image}\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"600\"\r\n height=\"750\"\r\n filter={`url(#${filterId})`}\r\n preserveAspectRatio=\"xMidYMid slice\"\r\n />\r\n </g>\r\n </svg>\r\n {children && (\r\n <div className=\"absolute inset-0 flex items-end p-6\">\r\n <div className=\"text-white\">{children}</div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default DecayCard;\r\n"]}
@@ -0,0 +1,3 @@
1
+ import {useRef,useEffect}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsxs,jsx}from'react/jsx-runtime';function R(...f){return twMerge(clsx(f))}function T({width:f=300,height:C=400,image:D="https://picsum.photos/300/400?grayscale",children:y,className:E}){let p=useRef(null),h=useRef(null),i=useRef({x:0,y:0}),a=useRef({x:0,y:0}),o=useRef({x:0,y:0,rz:0}),x=useRef(0),g=useRef();useEffect(()=>{if(typeof window>"u")return;i.current={x:window.innerWidth/2,y:window.innerHeight/2},a.current={...i.current};let l=(n,c,e)=>(1-e)*n+e*c,m=(n,c,e,t,d)=>(n-c)*(d-t)/(e-c)+t,N=(n,c,e,t)=>Math.hypot(n-c,e-t),v=n=>{i.current={x:n.clientX,y:n.clientY};};window.addEventListener("mousemove",v);let M=()=>{let n=window.innerWidth,c=window.innerHeight,e=l(o.current.x,m(i.current.x,0,n,-120,120),.1),t=l(o.current.y,m(i.current.y,0,c,-120,120),.1),d=l(o.current.rz,m(i.current.x,0,n,-10,10),.1),r=50;e>r&&(e=r+(e-r)*.2),e<-r&&(e=-r+(e+r)*.2),t>r&&(t=r+(t-r)*.2),t<-r&&(t=-r+(t+r)*.2),o.current={x:e,y:t,rz:d},p.current&&(p.current.style.transform=`translate(${e}px, ${t}px) rotateZ(${d}deg)`);let S=N(a.current.x,i.current.x,a.current.y,i.current.y);x.current=l(x.current,m(S,0,200,0,400),.06),h.current&&h.current.setAttribute("scale",String(x.current)),a.current={...i.current},g.current=requestAnimationFrame(M);};return M(),()=>{window.removeEventListener("mousemove",v),g.current&&cancelAnimationFrame(g.current);}},[]);let b=`imgFilter-${Math.random().toString(36).substr(2,9)}`;return jsxs("div",{className:R("relative",E),style:{width:`${f}px`,height:`${C}px`},ref:p,children:[jsxs("svg",{viewBox:"-60 -75 720 900",preserveAspectRatio:"xMidYMid slice",className:"w-full h-full",children:[jsx("defs",{children:jsxs("filter",{id:b,children:[jsx("feTurbulence",{type:"turbulence",baseFrequency:"0.015",numOctaves:"5",seed:"4",stitchTiles:"stitch",x:"0%",y:"0%",width:"100%",height:"100%",result:"turbulence1"}),jsx("feDisplacementMap",{ref:h,in:"SourceGraphic",in2:"turbulence1",scale:"0",xChannelSelector:"R",yChannelSelector:"B",x:"0%",y:"0%",width:"100%",height:"100%",result:"displacementMap3"})]})}),jsx("g",{children:jsx("image",{href:D,x:"0",y:"0",width:"600",height:"750",filter:`url(#${b})`,preserveAspectRatio:"xMidYMid slice"})})]}),y&&jsx("div",{className:"absolute inset-0 flex items-end p-6",children:jsx("div",{className:"text-white",children:y})})]})}var B=T;
2
+ export{T as DecayCard,B as default};//# sourceMappingURL=index.mjs.map
3
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/decay-card/index.tsx"],"names":["cn","inputs","twMerge","clsx","DecayCard","width","height","image","children","className","containerRef","useRef","displacementMapRef","cursor","cachedCursor","imgTransforms","displacementScale","animationRef","useEffect","lerp","a","b","n","map","x","c","distance","x1","x2","y1","y2","handleMouseMove","ev","render","winWidth","winHeight","targetX","targetY","targetRz","bound","cursorTravelledDistance","filterId","jsxs","jsx","decay_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, { useEffect, useRef, ReactNode } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface DecayCardProps {\r\n width?: number;\r\n height?: number;\r\n image?: string;\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function DecayCard({\r\n width = 300,\r\n height = 400,\r\n image = \"https://picsum.photos/300/400?grayscale\",\r\n children,\r\n className,\r\n}: DecayCardProps) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const displacementMapRef = useRef<SVGFEDisplacementMapElement>(null);\r\n const cursor = useRef({ x: 0, y: 0 });\r\n const cachedCursor = useRef({ x: 0, y: 0 });\r\n const imgTransforms = useRef({ x: 0, y: 0, rz: 0 });\r\n const displacementScale = useRef(0);\r\n const animationRef = useRef<number>();\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n\r\n cursor.current = { x: window.innerWidth / 2, y: window.innerHeight / 2 };\r\n cachedCursor.current = { ...cursor.current };\r\n\r\n const lerp = (a: number, b: number, n: number) => (1 - n) * a + n * b;\r\n const map = (x: number, a: number, b: number, c: number, d: number) =>\r\n ((x - a) * (d - c)) / (b - a) + c;\r\n const distance = (x1: number, x2: number, y1: number, y2: number) =>\r\n Math.hypot(x1 - x2, y1 - y2);\r\n\r\n const handleMouseMove = (ev: MouseEvent) => {\r\n cursor.current = { x: ev.clientX, y: ev.clientY };\r\n };\r\n\r\n window.addEventListener(\"mousemove\", handleMouseMove);\r\n\r\n const render = () => {\r\n const winWidth = window.innerWidth;\r\n const winHeight = window.innerHeight;\r\n\r\n let targetX = lerp(\r\n imgTransforms.current.x,\r\n map(cursor.current.x, 0, winWidth, -120, 120),\r\n 0.1\r\n );\r\n let targetY = lerp(\r\n imgTransforms.current.y,\r\n map(cursor.current.y, 0, winHeight, -120, 120),\r\n 0.1\r\n );\r\n let targetRz = lerp(\r\n imgTransforms.current.rz,\r\n map(cursor.current.x, 0, winWidth, -10, 10),\r\n 0.1\r\n );\r\n\r\n const bound = 50;\r\n if (targetX > bound) targetX = bound + (targetX - bound) * 0.2;\r\n if (targetX < -bound) targetX = -bound + (targetX + bound) * 0.2;\r\n if (targetY > bound) targetY = bound + (targetY - bound) * 0.2;\r\n if (targetY < -bound) targetY = -bound + (targetY + bound) * 0.2;\r\n\r\n imgTransforms.current = { x: targetX, y: targetY, rz: targetRz };\r\n\r\n if (containerRef.current) {\r\n containerRef.current.style.transform = `translate(${targetX}px, ${targetY}px) rotateZ(${targetRz}deg)`;\r\n }\r\n\r\n const cursorTravelledDistance = distance(\r\n cachedCursor.current.x,\r\n cursor.current.x,\r\n cachedCursor.current.y,\r\n cursor.current.y\r\n );\r\n\r\n displacementScale.current = lerp(\r\n displacementScale.current,\r\n map(cursorTravelledDistance, 0, 200, 0, 400),\r\n 0.06\r\n );\r\n\r\n if (displacementMapRef.current) {\r\n displacementMapRef.current.setAttribute(\r\n \"scale\",\r\n String(displacementScale.current)\r\n );\r\n }\r\n\r\n cachedCursor.current = { ...cursor.current };\r\n animationRef.current = requestAnimationFrame(render);\r\n };\r\n\r\n render();\r\n\r\n return () => {\r\n window.removeEventListener(\"mousemove\", handleMouseMove);\r\n if (animationRef.current) {\r\n cancelAnimationFrame(animationRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n const filterId = `imgFilter-${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n return (\r\n <div\r\n className={cn(\"relative\", className)}\r\n style={{ width: `${width}px`, height: `${height}px` }}\r\n ref={containerRef}\r\n >\r\n <svg\r\n viewBox=\"-60 -75 720 900\"\r\n preserveAspectRatio=\"xMidYMid slice\"\r\n className=\"w-full h-full\"\r\n >\r\n <defs>\r\n <filter id={filterId}>\r\n <feTurbulence\r\n type=\"turbulence\"\r\n baseFrequency=\"0.015\"\r\n numOctaves=\"5\"\r\n seed=\"4\"\r\n stitchTiles=\"stitch\"\r\n x=\"0%\"\r\n y=\"0%\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n result=\"turbulence1\"\r\n />\r\n <feDisplacementMap\r\n ref={displacementMapRef}\r\n in=\"SourceGraphic\"\r\n in2=\"turbulence1\"\r\n scale=\"0\"\r\n xChannelSelector=\"R\"\r\n yChannelSelector=\"B\"\r\n x=\"0%\"\r\n y=\"0%\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n result=\"displacementMap3\"\r\n />\r\n </filter>\r\n </defs>\r\n <g>\r\n <image\r\n href={image}\r\n x=\"0\"\r\n y=\"0\"\r\n width=\"600\"\r\n height=\"750\"\r\n filter={`url(#${filterId})`}\r\n preserveAspectRatio=\"xMidYMid slice\"\r\n />\r\n </g>\r\n </svg>\r\n {children && (\r\n <div className=\"absolute inset-0 flex items-end p-6\">\r\n <div className=\"text-white\">{children}</div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default DecayCard;\r\n"]}
@@ -0,0 +1,3 @@
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 n(...a){return tailwindMerge.twMerge(clsx.clsx(a))}var x=[{link:"#",text:"About",image:"https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?w=800&q=80"},{link:"#",text:"Services",image:"https://images.unsplash.com/photo-1618556450994-a6a128ef0d9d?w=800&q=80"},{link:"#",text:"Work",image:"https://images.unsplash.com/photo-1618556450991-2f1af64e8191?w=800&q=80"},{link:"#",text:"Contact",image:"https://images.unsplash.com/photo-1618556450783-953e03f0bb7a?w=800&q=80"}];function g({items:a=x,className:c=""}){let[f,m]=react.useState(-1),[e,l]=react.useState(-1);return jsxRuntime.jsxs("div",{className:n("flex gap-8",c),children:[jsxRuntime.jsxs("div",{className:"flex-1",children:[jsxRuntime.jsxs("div",{className:"mb-6",children:[jsxRuntime.jsx("h2",{className:"text-2xl font-bold text-white",children:"Menu"}),jsxRuntime.jsx("p",{className:"text-sm text-zinc-400",children:"Explore our pages"})]}),jsxRuntime.jsx("nav",{className:"flex flex-col gap-2",children:a.map((i,s)=>jsxRuntime.jsxs("a",{href:i.link,className:n("group flex items-center gap-4 py-4 px-4 rounded-lg transition-all duration-300",e===s?"bg-zinc-800 translate-x-4":"bg-transparent"),onMouseEnter:()=>l(s),onMouseLeave:()=>l(-1),onClick:()=>m(s),children:[jsxRuntime.jsx("span",{className:"text-sm text-zinc-500 font-mono",children:String(s+1).padStart(2,"0")}),jsxRuntime.jsx("span",{className:n("text-xl font-medium transition-colors",e===s?"text-white":"text-zinc-400"),children:i.text}),jsxRuntime.jsx("span",{className:n("ml-auto text-xl transition-all duration-300",e===s?"opacity-100 translate-x-0":"opacity-0 -translate-x-2"),children:"\u2192"})]},s))})]}),jsxRuntime.jsx("div",{className:n("w-80 h-80 rounded-2xl overflow-hidden transition-all duration-500",e>=0?"opacity-100 scale-100":"opacity-0 scale-95"),children:e>=0&&a[e]?.image&&jsxRuntime.jsxs("div",{className:"relative w-full h-full",children:[jsxRuntime.jsx("img",{src:a[e].image,alt:a[e].text,className:"w-full h-full object-cover"}),jsxRuntime.jsx("div",{className:"absolute inset-0 bg-gradient-to-t from-black/60 to-transparent"}),jsxRuntime.jsx("h3",{className:"absolute bottom-4 left-4 text-2xl font-bold text-white",children:a[e].text})]})})]})}var M=g;
2
+ exports.FlowingMenu=g;exports.default=M;//# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/flowing-menu/index.tsx"],"names":["cn","inputs","twMerge","clsx","DEFAULT_ITEMS","FlowingMenu","items","className","activeIndex","setActiveIndex","useState","hoveredIndex","setHoveredIndex","jsxs","jsx","item","index","flowing_menu_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 } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface FlowingMenuItem {\r\n link: string;\r\n text: string;\r\n image?: string;\r\n}\r\n\r\ninterface FlowingMenuProps {\r\n items?: FlowingMenuItem[];\r\n className?: string;\r\n}\r\n\r\nconst DEFAULT_ITEMS: FlowingMenuItem[] = [\r\n { link: \"#\", text: \"About\", image: \"https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?w=800&q=80\" },\r\n { link: \"#\", text: \"Services\", image: \"https://images.unsplash.com/photo-1618556450994-a6a128ef0d9d?w=800&q=80\" },\r\n { link: \"#\", text: \"Work\", image: \"https://images.unsplash.com/photo-1618556450991-2f1af64e8191?w=800&q=80\" },\r\n { link: \"#\", text: \"Contact\", image: \"https://images.unsplash.com/photo-1618556450783-953e03f0bb7a?w=800&q=80\" },\r\n];\r\n\r\nexport function FlowingMenu({ items = DEFAULT_ITEMS, className = \"\" }: FlowingMenuProps) {\r\n const [activeIndex, setActiveIndex] = useState<number>(-1);\r\n const [hoveredIndex, setHoveredIndex] = useState<number>(-1);\r\n\r\n return (\r\n <div className={cn(\"flex gap-8\", className)}>\r\n {/* Menu */}\r\n <div className=\"flex-1\">\r\n <div className=\"mb-6\">\r\n <h2 className=\"text-2xl font-bold text-white\">Menu</h2>\r\n <p className=\"text-sm text-zinc-400\">Explore our pages</p>\r\n </div>\r\n\r\n <nav className=\"flex flex-col gap-2\">\r\n {items.map((item, index) => (\r\n <a\r\n key={index}\r\n href={item.link}\r\n className={cn(\r\n \"group flex items-center gap-4 py-4 px-4 rounded-lg transition-all duration-300\",\r\n hoveredIndex === index\r\n ? \"bg-zinc-800 translate-x-4\"\r\n : \"bg-transparent\"\r\n )}\r\n onMouseEnter={() => setHoveredIndex(index)}\r\n onMouseLeave={() => setHoveredIndex(-1)}\r\n onClick={() => setActiveIndex(index)}\r\n >\r\n <span className=\"text-sm text-zinc-500 font-mono\">\r\n {String(index + 1).padStart(2, \"0\")}\r\n </span>\r\n <span\r\n className={cn(\r\n \"text-xl font-medium transition-colors\",\r\n hoveredIndex === index ? \"text-white\" : \"text-zinc-400\"\r\n )}\r\n >\r\n {item.text}\r\n </span>\r\n <span\r\n className={cn(\r\n \"ml-auto text-xl transition-all duration-300\",\r\n hoveredIndex === index\r\n ? \"opacity-100 translate-x-0\"\r\n : \"opacity-0 -translate-x-2\"\r\n )}\r\n >\r\n →\r\n </span>\r\n </a>\r\n ))}\r\n </nav>\r\n </div>\r\n\r\n {/* Preview */}\r\n <div\r\n className={cn(\r\n \"w-80 h-80 rounded-2xl overflow-hidden transition-all duration-500\",\r\n hoveredIndex >= 0 ? \"opacity-100 scale-100\" : \"opacity-0 scale-95\"\r\n )}\r\n >\r\n {hoveredIndex >= 0 && items[hoveredIndex]?.image && (\r\n <div className=\"relative w-full h-full\">\r\n <img\r\n src={items[hoveredIndex].image}\r\n alt={items[hoveredIndex].text}\r\n className=\"w-full h-full object-cover\"\r\n />\r\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/60 to-transparent\" />\r\n <h3 className=\"absolute bottom-4 left-4 text-2xl font-bold text-white\">\r\n {items[hoveredIndex].text}\r\n </h3>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default FlowingMenu;\r\n"]}
@@ -0,0 +1,3 @@
1
+ import {useState}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsxs,jsx}from'react/jsx-runtime';function n(...a){return twMerge(clsx(a))}var x=[{link:"#",text:"About",image:"https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?w=800&q=80"},{link:"#",text:"Services",image:"https://images.unsplash.com/photo-1618556450994-a6a128ef0d9d?w=800&q=80"},{link:"#",text:"Work",image:"https://images.unsplash.com/photo-1618556450991-2f1af64e8191?w=800&q=80"},{link:"#",text:"Contact",image:"https://images.unsplash.com/photo-1618556450783-953e03f0bb7a?w=800&q=80"}];function g({items:a=x,className:c=""}){let[f,m]=useState(-1),[e,l]=useState(-1);return jsxs("div",{className:n("flex gap-8",c),children:[jsxs("div",{className:"flex-1",children:[jsxs("div",{className:"mb-6",children:[jsx("h2",{className:"text-2xl font-bold text-white",children:"Menu"}),jsx("p",{className:"text-sm text-zinc-400",children:"Explore our pages"})]}),jsx("nav",{className:"flex flex-col gap-2",children:a.map((i,s)=>jsxs("a",{href:i.link,className:n("group flex items-center gap-4 py-4 px-4 rounded-lg transition-all duration-300",e===s?"bg-zinc-800 translate-x-4":"bg-transparent"),onMouseEnter:()=>l(s),onMouseLeave:()=>l(-1),onClick:()=>m(s),children:[jsx("span",{className:"text-sm text-zinc-500 font-mono",children:String(s+1).padStart(2,"0")}),jsx("span",{className:n("text-xl font-medium transition-colors",e===s?"text-white":"text-zinc-400"),children:i.text}),jsx("span",{className:n("ml-auto text-xl transition-all duration-300",e===s?"opacity-100 translate-x-0":"opacity-0 -translate-x-2"),children:"\u2192"})]},s))})]}),jsx("div",{className:n("w-80 h-80 rounded-2xl overflow-hidden transition-all duration-500",e>=0?"opacity-100 scale-100":"opacity-0 scale-95"),children:e>=0&&a[e]?.image&&jsxs("div",{className:"relative w-full h-full",children:[jsx("img",{src:a[e].image,alt:a[e].text,className:"w-full h-full object-cover"}),jsx("div",{className:"absolute inset-0 bg-gradient-to-t from-black/60 to-transparent"}),jsx("h3",{className:"absolute bottom-4 left-4 text-2xl font-bold text-white",children:a[e].text})]})})]})}var M=g;
2
+ export{g as FlowingMenu,M as default};//# sourceMappingURL=index.mjs.map
3
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/flowing-menu/index.tsx"],"names":["cn","inputs","twMerge","clsx","DEFAULT_ITEMS","FlowingMenu","items","className","activeIndex","setActiveIndex","useState","hoveredIndex","setHoveredIndex","jsxs","jsx","item","index","flowing_menu_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 } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface FlowingMenuItem {\r\n link: string;\r\n text: string;\r\n image?: string;\r\n}\r\n\r\ninterface FlowingMenuProps {\r\n items?: FlowingMenuItem[];\r\n className?: string;\r\n}\r\n\r\nconst DEFAULT_ITEMS: FlowingMenuItem[] = [\r\n { link: \"#\", text: \"About\", image: \"https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?w=800&q=80\" },\r\n { link: \"#\", text: \"Services\", image: \"https://images.unsplash.com/photo-1618556450994-a6a128ef0d9d?w=800&q=80\" },\r\n { link: \"#\", text: \"Work\", image: \"https://images.unsplash.com/photo-1618556450991-2f1af64e8191?w=800&q=80\" },\r\n { link: \"#\", text: \"Contact\", image: \"https://images.unsplash.com/photo-1618556450783-953e03f0bb7a?w=800&q=80\" },\r\n];\r\n\r\nexport function FlowingMenu({ items = DEFAULT_ITEMS, className = \"\" }: FlowingMenuProps) {\r\n const [activeIndex, setActiveIndex] = useState<number>(-1);\r\n const [hoveredIndex, setHoveredIndex] = useState<number>(-1);\r\n\r\n return (\r\n <div className={cn(\"flex gap-8\", className)}>\r\n {/* Menu */}\r\n <div className=\"flex-1\">\r\n <div className=\"mb-6\">\r\n <h2 className=\"text-2xl font-bold text-white\">Menu</h2>\r\n <p className=\"text-sm text-zinc-400\">Explore our pages</p>\r\n </div>\r\n\r\n <nav className=\"flex flex-col gap-2\">\r\n {items.map((item, index) => (\r\n <a\r\n key={index}\r\n href={item.link}\r\n className={cn(\r\n \"group flex items-center gap-4 py-4 px-4 rounded-lg transition-all duration-300\",\r\n hoveredIndex === index\r\n ? \"bg-zinc-800 translate-x-4\"\r\n : \"bg-transparent\"\r\n )}\r\n onMouseEnter={() => setHoveredIndex(index)}\r\n onMouseLeave={() => setHoveredIndex(-1)}\r\n onClick={() => setActiveIndex(index)}\r\n >\r\n <span className=\"text-sm text-zinc-500 font-mono\">\r\n {String(index + 1).padStart(2, \"0\")}\r\n </span>\r\n <span\r\n className={cn(\r\n \"text-xl font-medium transition-colors\",\r\n hoveredIndex === index ? \"text-white\" : \"text-zinc-400\"\r\n )}\r\n >\r\n {item.text}\r\n </span>\r\n <span\r\n className={cn(\r\n \"ml-auto text-xl transition-all duration-300\",\r\n hoveredIndex === index\r\n ? \"opacity-100 translate-x-0\"\r\n : \"opacity-0 -translate-x-2\"\r\n )}\r\n >\r\n →\r\n </span>\r\n </a>\r\n ))}\r\n </nav>\r\n </div>\r\n\r\n {/* Preview */}\r\n <div\r\n className={cn(\r\n \"w-80 h-80 rounded-2xl overflow-hidden transition-all duration-500\",\r\n hoveredIndex >= 0 ? \"opacity-100 scale-100\" : \"opacity-0 scale-95\"\r\n )}\r\n >\r\n {hoveredIndex >= 0 && items[hoveredIndex]?.image && (\r\n <div className=\"relative w-full h-full\">\r\n <img\r\n src={items[hoveredIndex].image}\r\n alt={items[hoveredIndex].text}\r\n className=\"w-full h-full object-cover\"\r\n />\r\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/60 to-transparent\" />\r\n <h3 className=\"absolute bottom-4 left-4 text-2xl font-bold text-white\">\r\n {items[hoveredIndex].text}\r\n </h3>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default FlowingMenu;\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 r(...l){return tailwindMerge.twMerge(clsx.clsx(l))}var d=[{label:"Home",href:"#"},{label:"About",href:"#"},{label:"Services",href:"#"},{label:"Contact",href:"#"}];function y({items:l=d,className:n="",activeColor:s="#8b5cf6",inactiveColor:c="#a1a1aa",backgroundColor:i="#18181b"}){let[o,m]=react.useState(0),u=(t,e)=>{e.preventDefault(),m(t);};return jsxRuntime.jsx("div",{className:r("relative",n),children:jsxRuntime.jsx("nav",{className:"relative rounded-full px-2 py-2",style:{backgroundColor:i},children:jsxRuntime.jsx("ul",{className:"flex items-center gap-1",children:l.map((t,e)=>jsxRuntime.jsx("li",{className:"relative",children:jsxRuntime.jsxs("a",{href:t.href,className:r("relative z-10 block px-4 py-2 text-sm font-medium rounded-full transition-all duration-300",o===e&&"text-white"),style:{color:o===e?"#fff":c},onClick:f=>u(e,f),children:[t.label,o===e&&jsxRuntime.jsx("span",{className:"absolute inset-0 rounded-full -z-10 animate-pulse",style:{backgroundColor:s,boxShadow:`0 0 20px ${s}`}})]})},e))})})})}var I=y;exports.GooeyNav=y;exports.default=I;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/gooey-nav/index.tsx"],"names":["cn","inputs","twMerge","clsx","DEFAULT_ITEMS","GooeyNav","items","className","activeColor","inactiveColor","backgroundColor","activeIndex","setActiveIndex","useState","handleClick","index","event","jsx","item","jsxs","e","gooey_nav_default"],"mappings":"sMAGO,SAASA,KAAMC,CAAAA,CAAsB,CAC1C,OAAOC,qBAAAA,CAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CCaA,IAAMG,CAAAA,CAAgC,CACpC,CAAE,KAAA,CAAO,OAAQ,IAAA,CAAM,GAAI,EAC3B,CAAE,KAAA,CAAO,QAAS,IAAA,CAAM,GAAI,EAC5B,CAAE,KAAA,CAAO,UAAA,CAAY,IAAA,CAAM,GAAI,CAAA,CAC/B,CAAE,MAAO,SAAA,CAAW,IAAA,CAAM,GAAI,CAChC,CAAA,CAEO,SAASC,CAAAA,CAAS,CACvB,MAAAC,CAAAA,CAAQF,CAAAA,CACR,UAAAG,CAAAA,CAAY,EAAA,CACZ,YAAAC,CAAAA,CAAc,SAAA,CACd,cAAAC,CAAAA,CAAgB,SAAA,CAChB,gBAAAC,CAAAA,CAAkB,SACpB,EAAkB,CAChB,GAAM,CAACC,CAAAA,CAAaC,CAAc,EAAIC,cAAAA,CAAiB,CAAC,EAElDC,CAAAA,CAAc,CAACC,EAAeC,CAAAA,GAA+C,CACjFA,EAAM,cAAA,EAAe,CACrBJ,CAAAA,CAAeG,CAAK,EACtB,CAAA,CAEA,OACEE,eAAC,KAAA,CAAA,CAAI,SAAA,CAAWjB,EAAG,UAAA,CAAYO,CAAS,EACtC,QAAA,CAAAU,cAAAA,CAAC,OACC,SAAA,CAAU,iCAAA,CACV,MAAO,CAAE,eAAA,CAAAP,CAAgB,CAAA,CAEzB,QAAA,CAAAO,eAAC,IAAA,CAAA,CAAG,SAAA,CAAU,0BACX,QAAA,CAAAX,CAAAA,CAAM,IAAI,CAACY,CAAAA,CAAMH,IAChBE,cAAAA,CAAC,IAAA,CAAA,CAAe,UAAU,UAAA,CACxB,QAAA,CAAAE,gBAAC,GAAA,CAAA,CACC,IAAA,CAAMD,EAAK,IAAA,CACX,SAAA,CAAWlB,EACT,4FAAA,CACAW,CAAAA,GAAgBI,CAAAA,EAAS,YAC3B,EACA,KAAA,CAAO,CACL,MAAOJ,CAAAA,GAAgBI,CAAAA,CAAQ,OAASN,CAC1C,CAAA,CACA,QAAUW,CAAAA,EAAMN,CAAAA,CAAYC,EAAOK,CAAC,CAAA,CAEnC,UAAAF,CAAAA,CAAK,KAAA,CACLP,IAAgBI,CAAAA,EACfE,cAAAA,CAAC,QACC,SAAA,CAAU,mDAAA,CACV,MAAO,CACL,eAAA,CAAiBT,EACjB,SAAA,CAAW,CAAA,SAAA,EAAYA,CAAW,CAAA,CACpC,CAAA,CACF,GAEJ,CAAA,CAAA,CAtBOO,CAuBT,CACD,CAAA,CACH,CAAA,CACF,EACF,CAEJ,KAEOM,CAAAA,CAAQhB","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 } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface GooeyNavItem {\r\n label: string;\r\n href: string;\r\n}\r\n\r\nexport interface GooeyNavProps {\r\n items?: GooeyNavItem[];\r\n className?: string;\r\n activeColor?: string;\r\n inactiveColor?: string;\r\n backgroundColor?: string;\r\n}\r\n\r\nconst DEFAULT_ITEMS: GooeyNavItem[] = [\r\n { label: \"Home\", href: \"#\" },\r\n { label: \"About\", href: \"#\" },\r\n { label: \"Services\", href: \"#\" },\r\n { label: \"Contact\", href: \"#\" },\r\n];\r\n\r\nexport function GooeyNav({\r\n items = DEFAULT_ITEMS,\r\n className = \"\",\r\n activeColor = \"#8b5cf6\",\r\n inactiveColor = \"#a1a1aa\",\r\n backgroundColor = \"#18181b\",\r\n}: GooeyNavProps) {\r\n const [activeIndex, setActiveIndex] = useState<number>(0);\r\n\r\n const handleClick = (index: number, event: React.MouseEvent<HTMLAnchorElement>) => {\r\n event.preventDefault();\r\n setActiveIndex(index);\r\n };\r\n\r\n return (\r\n <div className={cn(\"relative\", className)}>\r\n <nav\r\n className=\"relative rounded-full px-2 py-2\"\r\n style={{ backgroundColor }}\r\n >\r\n <ul className=\"flex items-center gap-1\">\r\n {items.map((item, index) => (\r\n <li key={index} className=\"relative\">\r\n <a\r\n href={item.href}\r\n className={cn(\r\n \"relative z-10 block px-4 py-2 text-sm font-medium rounded-full transition-all duration-300\",\r\n activeIndex === index && \"text-white\"\r\n )}\r\n style={{\r\n color: activeIndex === index ? \"#fff\" : inactiveColor,\r\n }}\r\n onClick={(e) => handleClick(index, e)}\r\n >\r\n {item.label}\r\n {activeIndex === index && (\r\n <span\r\n className=\"absolute inset-0 rounded-full -z-10 animate-pulse\"\r\n style={{\r\n backgroundColor: activeColor,\r\n boxShadow: `0 0 20px ${activeColor}`,\r\n }}\r\n />\r\n )}\r\n </a>\r\n </li>\r\n ))}\r\n </ul>\r\n </nav>\r\n </div>\r\n );\r\n}\r\n\r\nexport default GooeyNav;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useState}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs}from'react/jsx-runtime';function r(...l){return twMerge(clsx(l))}var d=[{label:"Home",href:"#"},{label:"About",href:"#"},{label:"Services",href:"#"},{label:"Contact",href:"#"}];function y({items:l=d,className:n="",activeColor:s="#8b5cf6",inactiveColor:c="#a1a1aa",backgroundColor:i="#18181b"}){let[o,m]=useState(0),u=(t,e)=>{e.preventDefault(),m(t);};return jsx("div",{className:r("relative",n),children:jsx("nav",{className:"relative rounded-full px-2 py-2",style:{backgroundColor:i},children:jsx("ul",{className:"flex items-center gap-1",children:l.map((t,e)=>jsx("li",{className:"relative",children:jsxs("a",{href:t.href,className:r("relative z-10 block px-4 py-2 text-sm font-medium rounded-full transition-all duration-300",o===e&&"text-white"),style:{color:o===e?"#fff":c},onClick:f=>u(e,f),children:[t.label,o===e&&jsx("span",{className:"absolute inset-0 rounded-full -z-10 animate-pulse",style:{backgroundColor:s,boxShadow:`0 0 20px ${s}`}})]})},e))})})})}var I=y;export{y as GooeyNav,I as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/gooey-nav/index.tsx"],"names":["cn","inputs","twMerge","clsx","DEFAULT_ITEMS","GooeyNav","items","className","activeColor","inactiveColor","backgroundColor","activeIndex","setActiveIndex","useState","handleClick","index","event","jsx","item","jsxs","e","gooey_nav_default"],"mappings":"mIAGO,SAASA,KAAMC,CAAAA,CAAsB,CAC1C,OAAOC,OAAAA,CAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCaA,IAAMG,CAAAA,CAAgC,CACpC,CAAE,KAAA,CAAO,OAAQ,IAAA,CAAM,GAAI,EAC3B,CAAE,KAAA,CAAO,QAAS,IAAA,CAAM,GAAI,EAC5B,CAAE,KAAA,CAAO,UAAA,CAAY,IAAA,CAAM,GAAI,CAAA,CAC/B,CAAE,MAAO,SAAA,CAAW,IAAA,CAAM,GAAI,CAChC,CAAA,CAEO,SAASC,CAAAA,CAAS,CACvB,MAAAC,CAAAA,CAAQF,CAAAA,CACR,UAAAG,CAAAA,CAAY,EAAA,CACZ,YAAAC,CAAAA,CAAc,SAAA,CACd,cAAAC,CAAAA,CAAgB,SAAA,CAChB,gBAAAC,CAAAA,CAAkB,SACpB,EAAkB,CAChB,GAAM,CAACC,CAAAA,CAAaC,CAAc,EAAIC,QAAAA,CAAiB,CAAC,EAElDC,CAAAA,CAAc,CAACC,EAAeC,CAAAA,GAA+C,CACjFA,EAAM,cAAA,EAAe,CACrBJ,CAAAA,CAAeG,CAAK,EACtB,CAAA,CAEA,OACEE,IAAC,KAAA,CAAA,CAAI,SAAA,CAAWjB,EAAG,UAAA,CAAYO,CAAS,EACtC,QAAA,CAAAU,GAAAA,CAAC,OACC,SAAA,CAAU,iCAAA,CACV,MAAO,CAAE,eAAA,CAAAP,CAAgB,CAAA,CAEzB,QAAA,CAAAO,IAAC,IAAA,CAAA,CAAG,SAAA,CAAU,0BACX,QAAA,CAAAX,CAAAA,CAAM,IAAI,CAACY,CAAAA,CAAMH,IAChBE,GAAAA,CAAC,IAAA,CAAA,CAAe,UAAU,UAAA,CACxB,QAAA,CAAAE,KAAC,GAAA,CAAA,CACC,IAAA,CAAMD,EAAK,IAAA,CACX,SAAA,CAAWlB,EACT,4FAAA,CACAW,CAAAA,GAAgBI,CAAAA,EAAS,YAC3B,EACA,KAAA,CAAO,CACL,MAAOJ,CAAAA,GAAgBI,CAAAA,CAAQ,OAASN,CAC1C,CAAA,CACA,QAAUW,CAAAA,EAAMN,CAAAA,CAAYC,EAAOK,CAAC,CAAA,CAEnC,UAAAF,CAAAA,CAAK,KAAA,CACLP,IAAgBI,CAAAA,EACfE,GAAAA,CAAC,QACC,SAAA,CAAU,mDAAA,CACV,MAAO,CACL,eAAA,CAAiBT,EACjB,SAAA,CAAW,CAAA,SAAA,EAAYA,CAAW,CAAA,CACpC,CAAA,CACF,GAEJ,CAAA,CAAA,CAtBOO,CAuBT,CACD,CAAA,CACH,CAAA,CACF,EACF,CAEJ,KAEOM,CAAAA,CAAQhB","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 } from \"react\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface GooeyNavItem {\r\n label: string;\r\n href: string;\r\n}\r\n\r\nexport interface GooeyNavProps {\r\n items?: GooeyNavItem[];\r\n className?: string;\r\n activeColor?: string;\r\n inactiveColor?: string;\r\n backgroundColor?: string;\r\n}\r\n\r\nconst DEFAULT_ITEMS: GooeyNavItem[] = [\r\n { label: \"Home\", href: \"#\" },\r\n { label: \"About\", href: \"#\" },\r\n { label: \"Services\", href: \"#\" },\r\n { label: \"Contact\", href: \"#\" },\r\n];\r\n\r\nexport function GooeyNav({\r\n items = DEFAULT_ITEMS,\r\n className = \"\",\r\n activeColor = \"#8b5cf6\",\r\n inactiveColor = \"#a1a1aa\",\r\n backgroundColor = \"#18181b\",\r\n}: GooeyNavProps) {\r\n const [activeIndex, setActiveIndex] = useState<number>(0);\r\n\r\n const handleClick = (index: number, event: React.MouseEvent<HTMLAnchorElement>) => {\r\n event.preventDefault();\r\n setActiveIndex(index);\r\n };\r\n\r\n return (\r\n <div className={cn(\"relative\", className)}>\r\n <nav\r\n className=\"relative rounded-full px-2 py-2\"\r\n style={{ backgroundColor }}\r\n >\r\n <ul className=\"flex items-center gap-1\">\r\n {items.map((item, index) => (\r\n <li key={index} className=\"relative\">\r\n <a\r\n href={item.href}\r\n className={cn(\r\n \"relative z-10 block px-4 py-2 text-sm font-medium rounded-full transition-all duration-300\",\r\n activeIndex === index && \"text-white\"\r\n )}\r\n style={{\r\n color: activeIndex === index ? \"#fff\" : inactiveColor,\r\n }}\r\n onClick={(e) => handleClick(index, e)}\r\n >\r\n {item.label}\r\n {activeIndex === index && (\r\n <span\r\n className=\"absolute inset-0 rounded-full -z-10 animate-pulse\"\r\n style={{\r\n backgroundColor: activeColor,\r\n boxShadow: `0 0 20px ${activeColor}`,\r\n }}\r\n />\r\n )}\r\n </a>\r\n </li>\r\n ))}\r\n </ul>\r\n </nav>\r\n </div>\r\n );\r\n}\r\n\r\nexport default GooeyNav;\r\n"]}