bynana-ui 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/accordion/index.js +2 -0
  2. package/dist/accordion/index.js.map +1 -0
  3. package/dist/accordion/index.mjs +2 -0
  4. package/dist/accordion/index.mjs.map +1 -0
  5. package/dist/alert/index.js +2 -0
  6. package/dist/alert/index.js.map +1 -0
  7. package/dist/alert/index.mjs +2 -0
  8. package/dist/alert/index.mjs.map +1 -0
  9. package/dist/attract-button/index.js +2 -0
  10. package/dist/attract-button/index.js.map +1 -0
  11. package/dist/attract-button/index.mjs +2 -0
  12. package/dist/attract-button/index.mjs.map +1 -0
  13. package/dist/card/index.js +2 -0
  14. package/dist/card/index.js.map +1 -0
  15. package/dist/card/index.mjs +2 -0
  16. package/dist/card/index.mjs.map +1 -0
  17. package/dist/checkbox/index.js +2 -0
  18. package/dist/checkbox/index.js.map +1 -0
  19. package/dist/checkbox/index.mjs +2 -0
  20. package/dist/checkbox/index.mjs.map +1 -0
  21. package/dist/circular-text/index.js +2 -0
  22. package/dist/circular-text/index.js.map +1 -0
  23. package/dist/circular-text/index.mjs +2 -0
  24. package/dist/circular-text/index.mjs.map +1 -0
  25. package/dist/command-button/index.js +2 -0
  26. package/dist/command-button/index.js.map +1 -0
  27. package/dist/command-button/index.mjs +2 -0
  28. package/dist/command-button/index.mjs.map +1 -0
  29. package/dist/copy-button/index.js +2 -0
  30. package/dist/copy-button/index.js.map +1 -0
  31. package/dist/copy-button/index.mjs +2 -0
  32. package/dist/copy-button/index.mjs.map +1 -0
  33. package/dist/counter/index.js +2 -0
  34. package/dist/counter/index.js.map +1 -0
  35. package/dist/counter/index.mjs +2 -0
  36. package/dist/counter/index.mjs.map +1 -0
  37. package/dist/decrypted-text/index.js +2 -0
  38. package/dist/decrypted-text/index.js.map +1 -0
  39. package/dist/decrypted-text/index.mjs +2 -0
  40. package/dist/decrypted-text/index.mjs.map +1 -0
  41. package/dist/dock/index.js +2 -0
  42. package/dist/dock/index.js.map +1 -0
  43. package/dist/dock/index.mjs +2 -0
  44. package/dist/dock/index.mjs.map +1 -0
  45. package/dist/drawer/index.js +2 -0
  46. package/dist/drawer/index.js.map +1 -0
  47. package/dist/drawer/index.mjs +2 -0
  48. package/dist/drawer/index.mjs.map +1 -0
  49. package/dist/elastic-text/index.js +2 -0
  50. package/dist/elastic-text/index.js.map +1 -0
  51. package/dist/elastic-text/index.mjs +2 -0
  52. package/dist/elastic-text/index.mjs.map +1 -0
  53. package/dist/file-tree/index.js +2 -0
  54. package/dist/file-tree/index.js.map +1 -0
  55. package/dist/file-tree/index.mjs +2 -0
  56. package/dist/file-tree/index.mjs.map +1 -0
  57. package/dist/glowing-text/index.js +2 -0
  58. package/dist/glowing-text/index.js.map +1 -0
  59. package/dist/glowing-text/index.mjs +2 -0
  60. package/dist/glowing-text/index.mjs.map +1 -0
  61. package/dist/index.js +24 -3
  62. package/dist/index.js.map +1 -1
  63. package/dist/index.mjs +24 -3
  64. package/dist/index.mjs.map +1 -1
  65. package/dist/input/index.js +2 -0
  66. package/dist/input/index.js.map +1 -0
  67. package/dist/input/index.mjs +2 -0
  68. package/dist/input/index.mjs.map +1 -0
  69. package/dist/loading-flower/index.js +7 -0
  70. package/dist/loading-flower/index.js.map +1 -0
  71. package/dist/loading-flower/index.mjs +7 -0
  72. package/dist/loading-flower/index.mjs.map +1 -0
  73. package/dist/loading-geometric/index.js +7 -0
  74. package/dist/loading-geometric/index.js.map +1 -0
  75. package/dist/loading-geometric/index.mjs +7 -0
  76. package/dist/loading-geometric/index.mjs.map +1 -0
  77. package/dist/loading-morph/index.js +5 -0
  78. package/dist/loading-morph/index.js.map +1 -0
  79. package/dist/loading-morph/index.mjs +5 -0
  80. package/dist/loading-morph/index.mjs.map +1 -0
  81. package/dist/loading-rings/index.js +4 -0
  82. package/dist/loading-rings/index.js.map +1 -0
  83. package/dist/loading-rings/index.mjs +4 -0
  84. package/dist/loading-rings/index.mjs.map +1 -0
  85. package/dist/loading-text/index.js +6 -0
  86. package/dist/loading-text/index.js.map +1 -0
  87. package/dist/loading-text/index.mjs +6 -0
  88. package/dist/loading-text/index.mjs.map +1 -0
  89. package/dist/loading-words/index.js +4 -0
  90. package/dist/loading-words/index.js.map +1 -0
  91. package/dist/loading-words/index.mjs +4 -0
  92. package/dist/loading-words/index.mjs.map +1 -0
  93. package/dist/modal/index.js +2 -0
  94. package/dist/modal/index.js.map +1 -0
  95. package/dist/modal/index.mjs +2 -0
  96. package/dist/modal/index.mjs.map +1 -0
  97. package/dist/morph-text/index.js +2 -0
  98. package/dist/morph-text/index.js.map +1 -0
  99. package/dist/morph-text/index.mjs +2 -0
  100. package/dist/morph-text/index.mjs.map +1 -0
  101. package/dist/particle-button/index.js +2 -0
  102. package/dist/particle-button/index.js.map +1 -0
  103. package/dist/particle-button/index.mjs +2 -0
  104. package/dist/particle-button/index.mjs.map +1 -0
  105. package/dist/perspective-text/index.js +2 -0
  106. package/dist/perspective-text/index.js.map +1 -0
  107. package/dist/perspective-text/index.mjs +2 -0
  108. package/dist/perspective-text/index.mjs.map +1 -0
  109. package/dist/radio/index.js +2 -0
  110. package/dist/radio/index.js.map +1 -0
  111. package/dist/radio/index.mjs +2 -0
  112. package/dist/radio/index.mjs.map +1 -0
  113. package/dist/reveal-text/index.js +2 -0
  114. package/dist/reveal-text/index.js.map +1 -0
  115. package/dist/reveal-text/index.mjs +2 -0
  116. package/dist/reveal-text/index.mjs.map +1 -0
  117. package/dist/select/index.js +2 -0
  118. package/dist/select/index.js.map +1 -0
  119. package/dist/select/index.mjs +2 -0
  120. package/dist/select/index.mjs.map +1 -0
  121. package/dist/sliced-text/index.js +2 -0
  122. package/dist/sliced-text/index.js.map +1 -0
  123. package/dist/sliced-text/index.mjs +2 -0
  124. package/dist/sliced-text/index.mjs.map +1 -0
  125. package/dist/split-text/index.js +2 -0
  126. package/dist/split-text/index.js.map +1 -0
  127. package/dist/split-text/index.mjs +2 -0
  128. package/dist/split-text/index.mjs.map +1 -0
  129. package/dist/stepper/index.js +2 -0
  130. package/dist/stepper/index.js.map +1 -0
  131. package/dist/stepper/index.mjs +2 -0
  132. package/dist/stepper/index.mjs.map +1 -0
  133. package/dist/tabs/index.js +2 -0
  134. package/dist/tabs/index.js.map +1 -0
  135. package/dist/tabs/index.mjs +2 -0
  136. package/dist/tabs/index.mjs.map +1 -0
  137. package/dist/terminal/index.js +2 -0
  138. package/dist/terminal/index.js.map +1 -0
  139. package/dist/terminal/index.mjs +2 -0
  140. package/dist/terminal/index.mjs.map +1 -0
  141. package/dist/textarea/index.js +2 -0
  142. package/dist/textarea/index.js.map +1 -0
  143. package/dist/textarea/index.mjs +2 -0
  144. package/dist/textarea/index.mjs.map +1 -0
  145. package/dist/toolbar/index.js +2 -0
  146. package/dist/toolbar/index.js.map +1 -0
  147. package/dist/toolbar/index.mjs +2 -0
  148. package/dist/toolbar/index.mjs.map +1 -0
  149. package/dist/tooltip-animated/index.js +2 -0
  150. package/dist/tooltip-animated/index.js.map +1 -0
  151. package/dist/tooltip-animated/index.mjs +2 -0
  152. package/dist/tooltip-animated/index.mjs.map +1 -0
  153. package/dist/tooltip-minimal/index.js +2 -0
  154. package/dist/tooltip-minimal/index.js.map +1 -0
  155. package/dist/tooltip-minimal/index.mjs +2 -0
  156. package/dist/tooltip-minimal/index.mjs.map +1 -0
  157. package/dist/true-focus/index.js +2 -0
  158. package/dist/true-focus/index.js.map +1 -0
  159. package/dist/true-focus/index.mjs +2 -0
  160. package/dist/true-focus/index.mjs.map +1 -0
  161. package/package.json +94 -275
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),framerMotion=require('framer-motion'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function a(...i){return tailwindMerge.twMerge(clsx.clsx(i))}function h({items:i,className:l,allowMultiple:m=false}){let[n,r]=react.useState([]),d=t=>{r(m?e=>e.includes(t)?e.filter(u=>u!==t):[...e,t]:e=>e.includes(t)?[]:[t]);};return jsxRuntime.jsx("div",{className:a("w-full space-y-2",l),children:i.map((t,e)=>jsxRuntime.jsxs("div",{className:"border border-zinc-200 dark:border-zinc-800 rounded-lg overflow-hidden",children:[jsxRuntime.jsxs("button",{onClick:()=>d(e),className:"w-full px-4 py-3 flex items-center justify-between text-left bg-zinc-50 dark:bg-zinc-900 hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors",children:[jsxRuntime.jsx("span",{className:"font-medium",children:t.title}),jsxRuntime.jsx(framerMotion.motion.svg,{animate:{rotate:n.includes(e)?180:0},transition:{duration:.2},className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),jsxRuntime.jsx(framerMotion.AnimatePresence,{children:n.includes(e)&&jsxRuntime.jsx(framerMotion.motion.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{duration:.2},children:jsxRuntime.jsx("div",{className:"px-4 py-3 bg-white dark:bg-zinc-950",children:t.content})})})]},e))})}var A=h;exports.Accordion=h;exports.default=A;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/accordion/index.tsx"],"names":["cn","inputs","twMerge","clsx","Accordion","items","className","allowMultiple","openItems","setOpenItems","useState","toggleItem","index","prev","i","jsx","item","jsxs","motion","AnimatePresence","accordion_default"],"mappings":"4OAGO,SAASA,CAAAA,CAAAA,GAAMC,EAAsB,CAC1C,OAAOC,qBAAAA,CAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CCYO,SAASG,CAAAA,CAAU,CAAE,KAAA,CAAAC,CAAAA,CAAO,SAAA,CAAAC,EAAW,aAAA,CAAAC,CAAAA,CAAgB,KAAM,CAAA,CAAmB,CACrF,GAAM,CAACC,CAAAA,CAAWC,CAAY,CAAA,CAAIC,cAAAA,CAAmB,EAAE,EAEjDC,CAAAA,CAAcC,CAAAA,EAAkB,CAElCH,CAAAA,CADEF,CAAAA,CACYM,CAAAA,EACZA,EAAK,QAAA,CAASD,CAAK,CAAA,CAAIC,CAAAA,CAAK,MAAA,CAAQC,CAAAA,EAAMA,IAAMF,CAAK,CAAA,CAAI,CAAC,GAAGC,CAAAA,CAAMD,CAAK,EAG5DC,CAAAA,EAAUA,CAAAA,CAAK,QAAA,CAASD,CAAK,CAAA,CAAI,GAAK,CAACA,CAAK,CAF1D,EAIJ,CAAA,CAEA,OACEG,eAAC,KAAA,CAAA,CAAI,SAAA,CAAWf,CAAAA,CAAG,kBAAA,CAAoBM,CAAS,CAAA,CAC7C,SAAAD,CAAAA,CAAM,GAAA,CAAI,CAACW,CAAAA,CAAMJ,CAAAA,GAChBK,eAAAA,CAAC,OAEC,SAAA,CAAU,wEAAA,CAEV,QAAA,CAAA,CAAAA,eAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMN,CAAAA,CAAWC,CAAK,CAAA,CAC/B,SAAA,CAAU,qJAAA,CAEV,QAAA,CAAA,CAAAG,eAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAe,QAAA,CAAAC,CAAAA,CAAK,KAAA,CAAM,EAC1CD,cAAAA,CAACG,mBAAAA,CAAO,GAAA,CAAP,CACC,OAAA,CAAS,CAAE,OAAQV,CAAAA,CAAU,QAAA,CAASI,CAAK,CAAA,CAAI,GAAA,CAAM,CAAE,EACvD,UAAA,CAAY,CAAE,QAAA,CAAU,EAAI,CAAA,CAC5B,SAAA,CAAU,UACV,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,OAAA,CAAQ,WAAA,CAER,SAAAG,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,YAAa,CAAA,CAAG,CAAA,CAAE,gBAAA,CAAiB,CAAA,CACxF,CAAA,CAAA,CACF,CAAA,CACAA,eAACI,4BAAAA,CAAA,CACE,QAAA,CAAAX,CAAAA,CAAU,QAAA,CAASI,CAAK,GACvBG,cAAAA,CAACG,mBAAAA,CAAO,GAAA,CAAP,CACC,OAAA,CAAS,CAAE,OAAQ,CAAA,CAAG,OAAA,CAAS,CAAE,CAAA,CACjC,OAAA,CAAS,CAAE,OAAQ,MAAA,CAAQ,OAAA,CAAS,CAAE,CAAA,CACtC,IAAA,CAAM,CAAE,OAAQ,CAAA,CAAG,OAAA,CAAS,CAAE,CAAA,CAC9B,UAAA,CAAY,CAAE,SAAU,EAAI,CAAA,CAE5B,QAAA,CAAAH,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sCAAuC,QAAA,CAAAC,CAAAA,CAAK,OAAA,CAAQ,CAAA,CACrE,CAAA,CAEJ,CAAA,CAAA,CAAA,CA9BKJ,CA+BP,CACD,CAAA,CACH,CAEJ,CAEA,IAAOQ,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 { useState } from \"react\";\r\nimport { motion, AnimatePresence } from \"framer-motion\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface AccordionItem {\r\n title: string;\r\n content: React.ReactNode;\r\n}\r\n\r\ninterface AccordionProps {\r\n items: AccordionItem[];\r\n className?: string;\r\n allowMultiple?: boolean;\r\n}\r\n\r\nexport function Accordion({ items, className, allowMultiple = false }: AccordionProps) {\r\n const [openItems, setOpenItems] = useState<number[]>([]);\r\n\r\n const toggleItem = (index: number) => {\r\n if (allowMultiple) {\r\n setOpenItems((prev) =>\r\n prev.includes(index) ? prev.filter((i) => i !== index) : [...prev, index]\r\n );\r\n } else {\r\n setOpenItems((prev) => (prev.includes(index) ? [] : [index]));\r\n }\r\n };\r\n\r\n return (\r\n <div className={cn(\"w-full space-y-2\", className)}>\r\n {items.map((item, index) => (\r\n <div\r\n key={index}\r\n className=\"border border-zinc-200 dark:border-zinc-800 rounded-lg overflow-hidden\"\r\n >\r\n <button\r\n onClick={() => toggleItem(index)}\r\n className=\"w-full px-4 py-3 flex items-center justify-between text-left bg-zinc-50 dark:bg-zinc-900 hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors\"\r\n >\r\n <span className=\"font-medium\">{item.title}</span>\r\n <motion.svg\r\n animate={{ rotate: openItems.includes(index) ? 180 : 0 }}\r\n transition={{ duration: 0.2 }}\r\n className=\"w-5 h-5\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </motion.svg>\r\n </button>\r\n <AnimatePresence>\r\n {openItems.includes(index) && (\r\n <motion.div\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{ duration: 0.2 }}\r\n >\r\n <div className=\"px-4 py-3 bg-white dark:bg-zinc-950\">{item.content}</div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport default Accordion;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useState}from'react';import {motion,AnimatePresence}from'framer-motion';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs}from'react/jsx-runtime';function a(...i){return twMerge(clsx(i))}function h({items:i,className:l,allowMultiple:m=false}){let[n,r]=useState([]),d=t=>{r(m?e=>e.includes(t)?e.filter(u=>u!==t):[...e,t]:e=>e.includes(t)?[]:[t]);};return jsx("div",{className:a("w-full space-y-2",l),children:i.map((t,e)=>jsxs("div",{className:"border border-zinc-200 dark:border-zinc-800 rounded-lg overflow-hidden",children:[jsxs("button",{onClick:()=>d(e),className:"w-full px-4 py-3 flex items-center justify-between text-left bg-zinc-50 dark:bg-zinc-900 hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors",children:[jsx("span",{className:"font-medium",children:t.title}),jsx(motion.svg,{animate:{rotate:n.includes(e)?180:0},transition:{duration:.2},className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),jsx(AnimatePresence,{children:n.includes(e)&&jsx(motion.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{duration:.2},children:jsx("div",{className:"px-4 py-3 bg-white dark:bg-zinc-950",children:t.content})})})]},e))})}var A=h;export{h as Accordion,A as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/accordion/index.tsx"],"names":["cn","inputs","twMerge","clsx","Accordion","items","className","allowMultiple","openItems","setOpenItems","useState","toggleItem","index","prev","i","jsx","item","jsxs","motion","AnimatePresence","accordion_default"],"mappings":"sLAGO,SAASA,CAAAA,CAAAA,GAAMC,EAAsB,CAC1C,OAAOC,OAAAA,CAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCYO,SAASG,CAAAA,CAAU,CAAE,KAAA,CAAAC,CAAAA,CAAO,SAAA,CAAAC,EAAW,aAAA,CAAAC,CAAAA,CAAgB,KAAM,CAAA,CAAmB,CACrF,GAAM,CAACC,CAAAA,CAAWC,CAAY,CAAA,CAAIC,QAAAA,CAAmB,EAAE,EAEjDC,CAAAA,CAAcC,CAAAA,EAAkB,CAElCH,CAAAA,CADEF,CAAAA,CACYM,CAAAA,EACZA,EAAK,QAAA,CAASD,CAAK,CAAA,CAAIC,CAAAA,CAAK,MAAA,CAAQC,CAAAA,EAAMA,IAAMF,CAAK,CAAA,CAAI,CAAC,GAAGC,CAAAA,CAAMD,CAAK,EAG5DC,CAAAA,EAAUA,CAAAA,CAAK,QAAA,CAASD,CAAK,CAAA,CAAI,GAAK,CAACA,CAAK,CAF1D,EAIJ,CAAA,CAEA,OACEG,IAAC,KAAA,CAAA,CAAI,SAAA,CAAWf,CAAAA,CAAG,kBAAA,CAAoBM,CAAS,CAAA,CAC7C,SAAAD,CAAAA,CAAM,GAAA,CAAI,CAACW,CAAAA,CAAMJ,CAAAA,GAChBK,IAAAA,CAAC,OAEC,SAAA,CAAU,wEAAA,CAEV,QAAA,CAAA,CAAAA,IAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMN,CAAAA,CAAWC,CAAK,CAAA,CAC/B,SAAA,CAAU,qJAAA,CAEV,QAAA,CAAA,CAAAG,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAe,QAAA,CAAAC,CAAAA,CAAK,KAAA,CAAM,EAC1CD,GAAAA,CAACG,MAAAA,CAAO,GAAA,CAAP,CACC,OAAA,CAAS,CAAE,OAAQV,CAAAA,CAAU,QAAA,CAASI,CAAK,CAAA,CAAI,GAAA,CAAM,CAAE,EACvD,UAAA,CAAY,CAAE,QAAA,CAAU,EAAI,CAAA,CAC5B,SAAA,CAAU,UACV,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,OAAA,CAAQ,WAAA,CAER,SAAAG,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,YAAa,CAAA,CAAG,CAAA,CAAE,gBAAA,CAAiB,CAAA,CACxF,CAAA,CAAA,CACF,CAAA,CACAA,IAACI,eAAAA,CAAA,CACE,QAAA,CAAAX,CAAAA,CAAU,QAAA,CAASI,CAAK,GACvBG,GAAAA,CAACG,MAAAA,CAAO,GAAA,CAAP,CACC,OAAA,CAAS,CAAE,OAAQ,CAAA,CAAG,OAAA,CAAS,CAAE,CAAA,CACjC,OAAA,CAAS,CAAE,OAAQ,MAAA,CAAQ,OAAA,CAAS,CAAE,CAAA,CACtC,IAAA,CAAM,CAAE,OAAQ,CAAA,CAAG,OAAA,CAAS,CAAE,CAAA,CAC9B,UAAA,CAAY,CAAE,SAAU,EAAI,CAAA,CAE5B,QAAA,CAAAH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sCAAuC,QAAA,CAAAC,CAAAA,CAAK,OAAA,CAAQ,CAAA,CACrE,CAAA,CAEJ,CAAA,CAAA,CAAA,CA9BKJ,CA+BP,CACD,CAAA,CACH,CAEJ,CAEA,IAAOQ,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 { useState } from \"react\";\r\nimport { motion, AnimatePresence } from \"framer-motion\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface AccordionItem {\r\n title: string;\r\n content: React.ReactNode;\r\n}\r\n\r\ninterface AccordionProps {\r\n items: AccordionItem[];\r\n className?: string;\r\n allowMultiple?: boolean;\r\n}\r\n\r\nexport function Accordion({ items, className, allowMultiple = false }: AccordionProps) {\r\n const [openItems, setOpenItems] = useState<number[]>([]);\r\n\r\n const toggleItem = (index: number) => {\r\n if (allowMultiple) {\r\n setOpenItems((prev) =>\r\n prev.includes(index) ? prev.filter((i) => i !== index) : [...prev, index]\r\n );\r\n } else {\r\n setOpenItems((prev) => (prev.includes(index) ? [] : [index]));\r\n }\r\n };\r\n\r\n return (\r\n <div className={cn(\"w-full space-y-2\", className)}>\r\n {items.map((item, index) => (\r\n <div\r\n key={index}\r\n className=\"border border-zinc-200 dark:border-zinc-800 rounded-lg overflow-hidden\"\r\n >\r\n <button\r\n onClick={() => toggleItem(index)}\r\n className=\"w-full px-4 py-3 flex items-center justify-between text-left bg-zinc-50 dark:bg-zinc-900 hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors\"\r\n >\r\n <span className=\"font-medium\">{item.title}</span>\r\n <motion.svg\r\n animate={{ rotate: openItems.includes(index) ? 180 : 0 }}\r\n transition={{ duration: 0.2 }}\r\n className=\"w-5 h-5\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </motion.svg>\r\n </button>\r\n <AnimatePresence>\r\n {openItems.includes(index) && (\r\n <motion.div\r\n initial={{ height: 0, opacity: 0 }}\r\n animate={{ height: \"auto\", opacity: 1 }}\r\n exit={{ height: 0, opacity: 0 }}\r\n transition={{ duration: 0.2 }}\r\n >\r\n <div className=\"px-4 py-3 bg-white dark:bg-zinc-950\">{item.content}</div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport default Accordion;\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var m=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var m__default=/*#__PURE__*/_interopDefault(m);function o(...e){return tailwindMerge.twMerge(clsx.clsx(e))}function h({className:e="",close:r=false,children:l,onClose:s}){let[a,n]=m__default.default.useState(true);if(!a)return null;let i=()=>{n(false),s?.();};return jsxRuntime.jsx("div",{className:o("min-h-[400px] w-full flex items-center justify-center p-4",e),children:jsxRuntime.jsx("div",{className:"flex flex-col items-center w-full lg:max-w-[75%] gap-6",children:jsxRuntime.jsxs("div",{className:"relative flex items-center gap-3 rounded-lg border border-zinc-300 dark:border-zinc-700 bg-transparent px-4 py-3 shadow-sm w-full max-w-md transition-all duration-200",children:[l,r&&jsxRuntime.jsx("button",{onClick:i,className:"absolute top-2 right-2 text-gray-500 hover:text-gray-700 dark:text-white/60 dark:hover:text-white transition-colors",children:jsxRuntime.jsx("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})})})}function N({children:e,className:r}){return jsxRuntime.jsx("div",{className:o("text-primary flex-shrink-0",r),children:e})}function b({children:e,className:r}){return jsxRuntime.jsx("span",{className:o("text-foreground font-medium text-sm flex-1",r),children:e})}function A({children:e,className:r}){return jsxRuntime.jsx("div",{className:o("flex items-center gap-2",r),children:e})}exports.Alert=h;exports.AlertIcon=N;exports.AlertTitle=b;exports.AlertToolbar=A;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/alert/index.tsx"],"names":["cn","inputs","twMerge","clsx","Alert","className","close","children","onClose","isVisible","setIsVisible","React","handleClose","jsx","jsxs","AlertIcon","AlertTitle","AlertToolbar"],"mappings":"yPAGO,SAASA,CAAAA,CAAAA,GAAMC,EAAsB,CAC1C,OAAOC,sBAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CCsBO,SAASG,CAAAA,CAAM,CAAE,SAAA,CAAAC,CAAAA,CAAY,GAAI,KAAA,CAAAC,CAAAA,CAAQ,MAAO,QAAA,CAAAC,CAAAA,CAAU,QAAAC,CAAQ,CAAA,CAAe,CACtF,GAAM,CAACC,CAAAA,CAAWC,CAAY,EAAIC,kBAAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAErD,GAAI,CAACF,CAAAA,CAAW,OAAO,KAEvB,IAAMG,CAAAA,CAAc,IAAM,CACxBF,CAAAA,CAAa,KAAK,CAAA,CAClBF,CAAAA,KACF,CAAA,CAEA,OACEK,eAAC,KAAA,CAAA,CAAI,SAAA,CAAWb,EAAG,2DAAA,CAA6DK,CAAS,EACvF,QAAA,CAAAQ,cAAAA,CAAC,OAAI,SAAA,CAAU,wDAAA,CACb,SAAAC,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wKAAA,CACZ,QAAA,CAAA,CAAAP,EACAD,CAAAA,EACCO,cAAAA,CAAC,UACC,OAAA,CAASD,CAAAA,CACT,SAAA,CAAU,qHAAA,CAEV,SAAAC,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,SAAA,CAAU,IAAA,CAAK,OAAO,OAAA,CAAQ,WAAA,CAAY,OAAO,cAAA,CAC9D,QAAA,CAAAA,eAAC,MAAA,CAAA,CAAK,aAAA,CAAc,QAAQ,cAAA,CAAe,OAAA,CAAQ,YAAa,CAAA,CAAG,CAAA,CAAE,uBAAuB,CAAA,CAC9F,CAAA,CACF,GAEJ,CAAA,CACF,CAAA,CACF,CAEJ,CAEO,SAASE,EAAU,CAAE,QAAA,CAAAR,EAAU,SAAA,CAAAF,CAAU,EAAmB,CACjE,OAAOQ,eAAC,KAAA,CAAA,CAAI,SAAA,CAAWb,EAAG,4BAAA,CAA8BK,CAAS,CAAA,CAAI,QAAA,CAAAE,EAAS,CAChF,CAEO,SAASS,CAAAA,CAAW,CAAE,SAAAT,CAAAA,CAAU,SAAA,CAAAF,CAAU,CAAA,CAAoB,CACnE,OAAOQ,cAAAA,CAAC,MAAA,CAAA,CAAK,UAAWb,CAAAA,CAAG,4CAAA,CAA8CK,CAAS,CAAA,CAAI,QAAA,CAAAE,EAAS,CACjG,CAEO,SAASU,CAAAA,CAAa,CAAE,SAAAV,CAAAA,CAAU,SAAA,CAAAF,CAAU,CAAA,CAAsB,CACvE,OAAOQ,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAWb,CAAAA,CAAG,yBAAA,CAA2BK,CAAS,CAAA,CAAI,QAAA,CAAAE,EAAS,CAC7E","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 AlertProps {\r\n className?: string;\r\n close?: boolean;\r\n children?: React.ReactNode;\r\n onClose?: () => void;\r\n}\r\n\r\ninterface AlertIconProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\ninterface AlertTitleProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\ninterface AlertToolbarProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function Alert({ className = \"\", close = false, children, onClose }: AlertProps) {\r\n const [isVisible, setIsVisible] = React.useState(true);\r\n\r\n if (!isVisible) return null;\r\n\r\n const handleClose = () => {\r\n setIsVisible(false);\r\n onClose?.();\r\n };\r\n\r\n return (\r\n <div className={cn(\"min-h-[400px] w-full flex items-center justify-center p-4\", className)}>\r\n <div className=\"flex flex-col items-center w-full lg:max-w-[75%] gap-6\">\r\n <div className=\"relative flex items-center gap-3 rounded-lg border border-zinc-300 dark:border-zinc-700 bg-transparent px-4 py-3 shadow-sm w-full max-w-md transition-all duration-200\">\r\n {children}\r\n {close && (\r\n <button\r\n onClick={handleClose}\r\n className=\"absolute top-2 right-2 text-gray-500 hover:text-gray-700 dark:text-white/60 dark:hover:text-white transition-colors\"\r\n >\r\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport function AlertIcon({ children, className }: AlertIconProps) {\r\n return <div className={cn(\"text-primary flex-shrink-0\", className)}>{children}</div>;\r\n}\r\n\r\nexport function AlertTitle({ children, className }: AlertTitleProps) {\r\n return <span className={cn(\"text-foreground font-medium text-sm flex-1\", className)}>{children}</span>;\r\n}\r\n\r\nexport function AlertToolbar({ children, className }: AlertToolbarProps) {\r\n return <div className={cn(\"flex items-center gap-2\", className)}>{children}</div>;\r\n}\r\n"]}
@@ -0,0 +1,2 @@
1
+ import m from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs}from'react/jsx-runtime';function o(...e){return twMerge(clsx(e))}function h({className:e="",close:r=false,children:l,onClose:s}){let[a,n]=m.useState(true);if(!a)return null;let i=()=>{n(false),s?.();};return jsx("div",{className:o("min-h-[400px] w-full flex items-center justify-center p-4",e),children:jsx("div",{className:"flex flex-col items-center w-full lg:max-w-[75%] gap-6",children:jsxs("div",{className:"relative flex items-center gap-3 rounded-lg border border-zinc-300 dark:border-zinc-700 bg-transparent px-4 py-3 shadow-sm w-full max-w-md transition-all duration-200",children:[l,r&&jsx("button",{onClick:i,className:"absolute top-2 right-2 text-gray-500 hover:text-gray-700 dark:text-white/60 dark:hover:text-white transition-colors",children:jsx("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})})})}function N({children:e,className:r}){return jsx("div",{className:o("text-primary flex-shrink-0",r),children:e})}function b({children:e,className:r}){return jsx("span",{className:o("text-foreground font-medium text-sm flex-1",r),children:e})}function A({children:e,className:r}){return jsx("div",{className:o("flex items-center gap-2",r),children:e})}export{h as Alert,N as AlertIcon,b as AlertTitle,A as AlertToolbar};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/alert/index.tsx"],"names":["cn","inputs","twMerge","clsx","Alert","className","close","children","onClose","isVisible","setIsVisible","React","handleClose","jsx","jsxs","AlertIcon","AlertTitle","AlertToolbar"],"mappings":"2HAGO,SAASA,CAAAA,CAAAA,GAAMC,EAAsB,CAC1C,OAAOC,QAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCsBO,SAASG,CAAAA,CAAM,CAAE,SAAA,CAAAC,CAAAA,CAAY,GAAI,KAAA,CAAAC,CAAAA,CAAQ,MAAO,QAAA,CAAAC,CAAAA,CAAU,QAAAC,CAAQ,CAAA,CAAe,CACtF,GAAM,CAACC,CAAAA,CAAWC,CAAY,EAAIC,CAAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAErD,GAAI,CAACF,CAAAA,CAAW,OAAO,KAEvB,IAAMG,CAAAA,CAAc,IAAM,CACxBF,CAAAA,CAAa,KAAK,CAAA,CAClBF,CAAAA,KACF,CAAA,CAEA,OACEK,IAAC,KAAA,CAAA,CAAI,SAAA,CAAWb,EAAG,2DAAA,CAA6DK,CAAS,EACvF,QAAA,CAAAQ,GAAAA,CAAC,OAAI,SAAA,CAAU,wDAAA,CACb,SAAAC,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,wKAAA,CACZ,QAAA,CAAA,CAAAP,EACAD,CAAAA,EACCO,GAAAA,CAAC,UACC,OAAA,CAASD,CAAAA,CACT,SAAA,CAAU,qHAAA,CAEV,SAAAC,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,SAAA,CAAU,IAAA,CAAK,OAAO,OAAA,CAAQ,WAAA,CAAY,OAAO,cAAA,CAC9D,QAAA,CAAAA,IAAC,MAAA,CAAA,CAAK,aAAA,CAAc,QAAQ,cAAA,CAAe,OAAA,CAAQ,YAAa,CAAA,CAAG,CAAA,CAAE,uBAAuB,CAAA,CAC9F,CAAA,CACF,GAEJ,CAAA,CACF,CAAA,CACF,CAEJ,CAEO,SAASE,EAAU,CAAE,QAAA,CAAAR,EAAU,SAAA,CAAAF,CAAU,EAAmB,CACjE,OAAOQ,IAAC,KAAA,CAAA,CAAI,SAAA,CAAWb,EAAG,4BAAA,CAA8BK,CAAS,CAAA,CAAI,QAAA,CAAAE,EAAS,CAChF,CAEO,SAASS,CAAAA,CAAW,CAAE,SAAAT,CAAAA,CAAU,SAAA,CAAAF,CAAU,CAAA,CAAoB,CACnE,OAAOQ,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAWb,CAAAA,CAAG,4CAAA,CAA8CK,CAAS,CAAA,CAAI,QAAA,CAAAE,EAAS,CACjG,CAEO,SAASU,CAAAA,CAAa,CAAE,SAAAV,CAAAA,CAAU,SAAA,CAAAF,CAAU,CAAA,CAAsB,CACvE,OAAOQ,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAWb,CAAAA,CAAG,yBAAA,CAA2BK,CAAS,CAAA,CAAI,QAAA,CAAAE,EAAS,CAC7E","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 AlertProps {\r\n className?: string;\r\n close?: boolean;\r\n children?: React.ReactNode;\r\n onClose?: () => void;\r\n}\r\n\r\ninterface AlertIconProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\ninterface AlertTitleProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\ninterface AlertToolbarProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function Alert({ className = \"\", close = false, children, onClose }: AlertProps) {\r\n const [isVisible, setIsVisible] = React.useState(true);\r\n\r\n if (!isVisible) return null;\r\n\r\n const handleClose = () => {\r\n setIsVisible(false);\r\n onClose?.();\r\n };\r\n\r\n return (\r\n <div className={cn(\"min-h-[400px] w-full flex items-center justify-center p-4\", className)}>\r\n <div className=\"flex flex-col items-center w-full lg:max-w-[75%] gap-6\">\r\n <div className=\"relative flex items-center gap-3 rounded-lg border border-zinc-300 dark:border-zinc-700 bg-transparent px-4 py-3 shadow-sm w-full max-w-md transition-all duration-200\">\r\n {children}\r\n {close && (\r\n <button\r\n onClick={handleClose}\r\n className=\"absolute top-2 right-2 text-gray-500 hover:text-gray-700 dark:text-white/60 dark:hover:text-white transition-colors\"\r\n >\r\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport function AlertIcon({ children, className }: AlertIconProps) {\r\n return <div className={cn(\"text-primary flex-shrink-0\", className)}>{children}</div>;\r\n}\r\n\r\nexport function AlertTitle({ children, className }: AlertTitleProps) {\r\n return <span className={cn(\"text-foreground font-medium text-sm flex-1\", className)}>{children}</span>;\r\n}\r\n\r\nexport function AlertToolbar({ children, className }: AlertToolbarProps) {\r\n return <div className={cn(\"flex items-center gap-2\", className)}>{children}</div>;\r\n}\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),framerMotion=require('framer-motion'),react=require('react'),jsxRuntime=require('react/jsx-runtime');function o(...n){return tailwindMerge.twMerge(clsx.clsx(n))}function w({className:n,particleCount:i=12,children:f,...b}){let[s,c]=react.useState(false),[t,y]=react.useState([]),e=framerMotion.useAnimation();react.useEffect(()=>{let a=Array.from({length:i},(r,v)=>({id:v,x:Math.random()*360-180,y:Math.random()*360-180}));y(a);},[i]);let l=react.useCallback(async()=>{c(true),await e.start({x:0,y:0,transition:{type:"spring",stiffness:50,damping:10}});},[e]),u=react.useCallback(async()=>{c(false),await e.start(a=>({x:t[a].x,y:t[a].y,transition:{type:"spring",stiffness:100,damping:15}}));},[e,t]);return jsxRuntime.jsxs("button",{className:o("min-w-40 relative touch-none px-4 py-2 rounded-md","bg-violet-100 dark:bg-violet-900","hover:bg-violet-200 dark:hover:bg-violet-800","text-violet-600 dark:text-violet-300","border border-violet-300 dark:border-violet-700","transition-all duration-300",n),onMouseEnter:l,onMouseLeave:u,onTouchStart:l,onTouchEnd:u,...b,children:[t.map((a,r)=>jsxRuntime.jsx(framerMotion.motion.div,{custom:r,initial:{x:t[r].x,y:t[r].y},animate:e,className:o("absolute w-1.5 h-1.5 rounded-full bg-violet-400 dark:bg-violet-300 transition-opacity duration-300",s?"opacity-100":"opacity-40")},r)),jsxRuntime.jsx("span",{className:"relative w-full flex items-center justify-center gap-2",children:f||(s?"Attracting":"Hover me")})]})}var T=w;exports.AttractButton=w;exports.default=T;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/attract-button/index.tsx"],"names":["cn","inputs","twMerge","clsx","AttractButton","className","particleCount","children","props","isAttracting","setIsAttracting","useState","particles","setParticles","particlesControl","useAnimation","useEffect","newParticles","_","i","handleInteractionStart","useCallback","handleInteractionEnd","jsxs","index","jsx","motion","attract_button_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 { cn } from \"../utils/cn\";\r\nimport { motion, useAnimation } from \"framer-motion\";\r\nimport { useEffect, useState, useCallback } from \"react\";\r\n\r\ninterface AttractButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n particleCount?: number;\r\n attractRadius?: number;\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface Particle {\r\n id: number;\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport function AttractButton({\r\n className,\r\n particleCount = 12,\r\n children,\r\n ...props\r\n}: AttractButtonProps) {\r\n const [isAttracting, setIsAttracting] = useState(false);\r\n const [particles, setParticles] = useState<Particle[]>([]);\r\n const particlesControl = useAnimation();\r\n\r\n useEffect(() => {\r\n const newParticles = Array.from({ length: particleCount }, (_, i) => ({\r\n id: i,\r\n x: Math.random() * 360 - 180,\r\n y: Math.random() * 360 - 180,\r\n }));\r\n setParticles(newParticles);\r\n }, [particleCount]);\r\n\r\n const handleInteractionStart = useCallback(async () => {\r\n setIsAttracting(true);\r\n await particlesControl.start({ x: 0, y: 0, transition: { type: \"spring\", stiffness: 50, damping: 10 } });\r\n }, [particlesControl]);\r\n\r\n const handleInteractionEnd = useCallback(async () => {\r\n setIsAttracting(false);\r\n await particlesControl.start((i) => ({\r\n x: particles[i].x,\r\n y: particles[i].y,\r\n transition: { type: \"spring\", stiffness: 100, damping: 15 },\r\n }));\r\n }, [particlesControl, particles]);\r\n\r\n return (\r\n <button\r\n className={cn(\r\n \"min-w-40 relative touch-none px-4 py-2 rounded-md\",\r\n \"bg-violet-100 dark:bg-violet-900\",\r\n \"hover:bg-violet-200 dark:hover:bg-violet-800\",\r\n \"text-violet-600 dark:text-violet-300\",\r\n \"border border-violet-300 dark:border-violet-700\",\r\n \"transition-all duration-300\",\r\n className\r\n )}\r\n onMouseEnter={handleInteractionStart}\r\n onMouseLeave={handleInteractionEnd}\r\n onTouchStart={handleInteractionStart}\r\n onTouchEnd={handleInteractionEnd}\r\n {...props}\r\n >\r\n {particles.map((_, index) => (\r\n <motion.div\r\n key={index}\r\n custom={index}\r\n initial={{ x: particles[index].x, y: particles[index].y }}\r\n animate={particlesControl}\r\n className={cn(\"absolute w-1.5 h-1.5 rounded-full bg-violet-400 dark:bg-violet-300 transition-opacity duration-300\", isAttracting ? \"opacity-100\" : \"opacity-40\")}\r\n />\r\n ))}\r\n <span className=\"relative w-full flex items-center justify-center gap-2\">\r\n {children || (isAttracting ? \"Attracting\" : \"Hover me\")}\r\n </span>\r\n </button>\r\n );\r\n}\r\n\r\nexport default AttractButton;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {useAnimation,motion}from'framer-motion';import {useState,useEffect,useCallback}from'react';import {jsxs,jsx}from'react/jsx-runtime';function o(...n){return twMerge(clsx(n))}function w({className:n,particleCount:i=12,children:f,...b}){let[s,c]=useState(false),[t,y]=useState([]),e=useAnimation();useEffect(()=>{let a=Array.from({length:i},(r,v)=>({id:v,x:Math.random()*360-180,y:Math.random()*360-180}));y(a);},[i]);let l=useCallback(async()=>{c(true),await e.start({x:0,y:0,transition:{type:"spring",stiffness:50,damping:10}});},[e]),u=useCallback(async()=>{c(false),await e.start(a=>({x:t[a].x,y:t[a].y,transition:{type:"spring",stiffness:100,damping:15}}));},[e,t]);return jsxs("button",{className:o("min-w-40 relative touch-none px-4 py-2 rounded-md","bg-violet-100 dark:bg-violet-900","hover:bg-violet-200 dark:hover:bg-violet-800","text-violet-600 dark:text-violet-300","border border-violet-300 dark:border-violet-700","transition-all duration-300",n),onMouseEnter:l,onMouseLeave:u,onTouchStart:l,onTouchEnd:u,...b,children:[t.map((a,r)=>jsx(motion.div,{custom:r,initial:{x:t[r].x,y:t[r].y},animate:e,className:o("absolute w-1.5 h-1.5 rounded-full bg-violet-400 dark:bg-violet-300 transition-opacity duration-300",s?"opacity-100":"opacity-40")},r)),jsx("span",{className:"relative w-full flex items-center justify-center gap-2",children:f||(s?"Attracting":"Hover me")})]})}var T=w;export{w as AttractButton,T as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/attract-button/index.tsx"],"names":["cn","inputs","twMerge","clsx","AttractButton","className","particleCount","children","props","isAttracting","setIsAttracting","useState","particles","setParticles","particlesControl","useAnimation","useEffect","newParticles","_","i","handleInteractionStart","useCallback","handleInteractionEnd","jsxs","index","jsx","motion","attract_button_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 { cn } from \"../utils/cn\";\r\nimport { motion, useAnimation } from \"framer-motion\";\r\nimport { useEffect, useState, useCallback } from \"react\";\r\n\r\ninterface AttractButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n particleCount?: number;\r\n attractRadius?: number;\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface Particle {\r\n id: number;\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport function AttractButton({\r\n className,\r\n particleCount = 12,\r\n children,\r\n ...props\r\n}: AttractButtonProps) {\r\n const [isAttracting, setIsAttracting] = useState(false);\r\n const [particles, setParticles] = useState<Particle[]>([]);\r\n const particlesControl = useAnimation();\r\n\r\n useEffect(() => {\r\n const newParticles = Array.from({ length: particleCount }, (_, i) => ({\r\n id: i,\r\n x: Math.random() * 360 - 180,\r\n y: Math.random() * 360 - 180,\r\n }));\r\n setParticles(newParticles);\r\n }, [particleCount]);\r\n\r\n const handleInteractionStart = useCallback(async () => {\r\n setIsAttracting(true);\r\n await particlesControl.start({ x: 0, y: 0, transition: { type: \"spring\", stiffness: 50, damping: 10 } });\r\n }, [particlesControl]);\r\n\r\n const handleInteractionEnd = useCallback(async () => {\r\n setIsAttracting(false);\r\n await particlesControl.start((i) => ({\r\n x: particles[i].x,\r\n y: particles[i].y,\r\n transition: { type: \"spring\", stiffness: 100, damping: 15 },\r\n }));\r\n }, [particlesControl, particles]);\r\n\r\n return (\r\n <button\r\n className={cn(\r\n \"min-w-40 relative touch-none px-4 py-2 rounded-md\",\r\n \"bg-violet-100 dark:bg-violet-900\",\r\n \"hover:bg-violet-200 dark:hover:bg-violet-800\",\r\n \"text-violet-600 dark:text-violet-300\",\r\n \"border border-violet-300 dark:border-violet-700\",\r\n \"transition-all duration-300\",\r\n className\r\n )}\r\n onMouseEnter={handleInteractionStart}\r\n onMouseLeave={handleInteractionEnd}\r\n onTouchStart={handleInteractionStart}\r\n onTouchEnd={handleInteractionEnd}\r\n {...props}\r\n >\r\n {particles.map((_, index) => (\r\n <motion.div\r\n key={index}\r\n custom={index}\r\n initial={{ x: particles[index].x, y: particles[index].y }}\r\n animate={particlesControl}\r\n className={cn(\"absolute w-1.5 h-1.5 rounded-full bg-violet-400 dark:bg-violet-300 transition-opacity duration-300\", isAttracting ? \"opacity-100\" : \"opacity-40\")}\r\n />\r\n ))}\r\n <span className=\"relative w-full flex items-center justify-center gap-2\">\r\n {children || (isAttracting ? \"Attracting\" : \"Hover me\")}\r\n </span>\r\n </button>\r\n );\r\n}\r\n\r\nexport default AttractButton;\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function t(...r){return tailwindMerge.twMerge(clsx.clsx(r))}function i({children:r,className:e,hover:o=false}){return jsxRuntime.jsx("div",{className:t("rounded-xl p-6","bg-white dark:bg-zinc-900","border border-zinc-200 dark:border-zinc-800",o&&"transition-all duration-200 hover:shadow-lg hover:-translate-y-1",e),children:r})}function C({children:r,className:e}){return jsxRuntime.jsx("div",{className:t("mb-4",e),children:r})}function m({children:r,className:e}){return jsxRuntime.jsx("h3",{className:t("text-lg font-semibold",e),children:r})}function f({children:r,className:e}){return jsxRuntime.jsx("p",{className:t("text-sm text-zinc-500 dark:text-zinc-400",e),children:r})}function u({children:r,className:e}){return jsxRuntime.jsx("div",{className:t("",e),children:r})}function N({children:r,className:e}){return jsxRuntime.jsx("div",{className:t("mt-4 pt-4 border-t border-zinc-200 dark:border-zinc-800",e),children:r})}var h=i;exports.Card=i;exports.CardContent=u;exports.CardDescription=f;exports.CardFooter=N;exports.CardHeader=C;exports.CardTitle=m;exports.default=h;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/card/index.tsx"],"names":["cn","inputs","twMerge","clsx","Card","children","className","hover","jsx","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","card_default"],"mappings":"+KAGO,SAASA,CAAAA,CAAAA,GAAMC,EAAsB,CAC1C,OAAOC,qBAAAA,CAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CCKO,SAASG,CAAAA,CAAK,CAAE,SAAAC,CAAAA,CAAU,SAAA,CAAAC,CAAAA,CAAW,KAAA,CAAAC,EAAQ,KAAM,CAAA,CAAc,CACtE,OACEC,eAAC,KAAA,CAAA,CACC,SAAA,CAAWR,CAAAA,CACT,gBAAA,CACA,4BACA,6CAAA,CACAO,CAAAA,EAAS,kEAAA,CACTD,CACF,EAEC,QAAA,CAAAD,CAAAA,CACH,CAEJ,CAOO,SAASI,CAAAA,CAAW,CAAE,QAAA,CAAAJ,CAAAA,CAAU,UAAAC,CAAU,CAAA,CAAoB,CACnE,OAAOE,eAAC,KAAA,CAAA,CAAI,SAAA,CAAWR,CAAAA,CAAG,MAAA,CAAQM,CAAS,CAAA,CAAI,QAAA,CAAAD,CAAAA,CAAS,CAC1D,CAOO,SAASK,CAAAA,CAAU,CAAE,QAAA,CAAAL,EAAU,SAAA,CAAAC,CAAU,CAAA,CAAmB,CACjE,OAAOE,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAWR,CAAAA,CAAG,wBAAyBM,CAAS,CAAA,CAAI,QAAA,CAAAD,CAAAA,CAAS,CAC1E,CAOO,SAASM,CAAAA,CAAgB,CAAE,SAAAN,CAAAA,CAAU,SAAA,CAAAC,CAAU,CAAA,CAAyB,CAC7E,OAAOE,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAWR,EAAG,0CAAA,CAA4CM,CAAS,CAAA,CAAI,QAAA,CAAAD,EAAS,CAC5F,CAOO,SAASO,CAAAA,CAAY,CAAE,QAAA,CAAAP,CAAAA,CAAU,SAAA,CAAAC,CAAU,EAAqB,CACrE,OAAOE,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAWR,CAAAA,CAAG,EAAA,CAAIM,CAAS,CAAA,CAAI,SAAAD,CAAAA,CAAS,CACtD,CAOO,SAASQ,EAAW,CAAE,QAAA,CAAAR,CAAAA,CAAU,SAAA,CAAAC,CAAU,CAAA,CAAoB,CACnE,OAAOE,cAAAA,CAAC,OAAI,SAAA,CAAWR,CAAAA,CAAG,yDAAA,CAA2DM,CAAS,EAAI,QAAA,CAAAD,CAAAA,CAAS,CAC7G,KAEOS,CAAAA,CAAQV","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 { cn } from \"../utils/cn\";\r\n\r\ninterface CardProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n hover?: boolean;\r\n}\r\n\r\nexport function Card({ children, className, hover = false }: CardProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"rounded-xl p-6\",\r\n \"bg-white dark:bg-zinc-900\",\r\n \"border border-zinc-200 dark:border-zinc-800\",\r\n hover && \"transition-all duration-200 hover:shadow-lg hover:-translate-y-1\",\r\n className\r\n )}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\ninterface CardHeaderProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CardHeader({ children, className }: CardHeaderProps) {\r\n return <div className={cn(\"mb-4\", className)}>{children}</div>;\r\n}\r\n\r\ninterface CardTitleProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CardTitle({ children, className }: CardTitleProps) {\r\n return <h3 className={cn(\"text-lg font-semibold\", className)}>{children}</h3>;\r\n}\r\n\r\ninterface CardDescriptionProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CardDescription({ children, className }: CardDescriptionProps) {\r\n return <p className={cn(\"text-sm text-zinc-500 dark:text-zinc-400\", className)}>{children}</p>;\r\n}\r\n\r\ninterface CardContentProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CardContent({ children, className }: CardContentProps) {\r\n return <div className={cn(\"\", className)}>{children}</div>;\r\n}\r\n\r\ninterface CardFooterProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CardFooter({ children, className }: CardFooterProps) {\r\n return <div className={cn(\"mt-4 pt-4 border-t border-zinc-200 dark:border-zinc-800\", className)}>{children}</div>;\r\n}\r\n\r\nexport default Card;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx}from'react/jsx-runtime';function t(...r){return twMerge(clsx(r))}function i({children:r,className:e,hover:o=false}){return jsx("div",{className:t("rounded-xl p-6","bg-white dark:bg-zinc-900","border border-zinc-200 dark:border-zinc-800",o&&"transition-all duration-200 hover:shadow-lg hover:-translate-y-1",e),children:r})}function C({children:r,className:e}){return jsx("div",{className:t("mb-4",e),children:r})}function m({children:r,className:e}){return jsx("h3",{className:t("text-lg font-semibold",e),children:r})}function f({children:r,className:e}){return jsx("p",{className:t("text-sm text-zinc-500 dark:text-zinc-400",e),children:r})}function u({children:r,className:e}){return jsx("div",{className:t("",e),children:r})}function N({children:r,className:e}){return jsx("div",{className:t("mt-4 pt-4 border-t border-zinc-200 dark:border-zinc-800",e),children:r})}var h=i;export{i as Card,u as CardContent,f as CardDescription,N as CardFooter,C as CardHeader,m as CardTitle,h as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/card/index.tsx"],"names":["cn","inputs","twMerge","clsx","Card","children","className","hover","jsx","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","card_default"],"mappings":"iGAGO,SAASA,CAAAA,CAAAA,GAAMC,EAAsB,CAC1C,OAAOC,OAAAA,CAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCKO,SAASG,CAAAA,CAAK,CAAE,SAAAC,CAAAA,CAAU,SAAA,CAAAC,CAAAA,CAAW,KAAA,CAAAC,EAAQ,KAAM,CAAA,CAAc,CACtE,OACEC,IAAC,KAAA,CAAA,CACC,SAAA,CAAWR,CAAAA,CACT,gBAAA,CACA,4BACA,6CAAA,CACAO,CAAAA,EAAS,kEAAA,CACTD,CACF,EAEC,QAAA,CAAAD,CAAAA,CACH,CAEJ,CAOO,SAASI,CAAAA,CAAW,CAAE,QAAA,CAAAJ,CAAAA,CAAU,UAAAC,CAAU,CAAA,CAAoB,CACnE,OAAOE,IAAC,KAAA,CAAA,CAAI,SAAA,CAAWR,CAAAA,CAAG,MAAA,CAAQM,CAAS,CAAA,CAAI,QAAA,CAAAD,CAAAA,CAAS,CAC1D,CAOO,SAASK,CAAAA,CAAU,CAAE,QAAA,CAAAL,EAAU,SAAA,CAAAC,CAAU,CAAA,CAAmB,CACjE,OAAOE,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAWR,CAAAA,CAAG,wBAAyBM,CAAS,CAAA,CAAI,QAAA,CAAAD,CAAAA,CAAS,CAC1E,CAOO,SAASM,CAAAA,CAAgB,CAAE,SAAAN,CAAAA,CAAU,SAAA,CAAAC,CAAU,CAAA,CAAyB,CAC7E,OAAOE,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAWR,EAAG,0CAAA,CAA4CM,CAAS,CAAA,CAAI,QAAA,CAAAD,EAAS,CAC5F,CAOO,SAASO,CAAAA,CAAY,CAAE,QAAA,CAAAP,CAAAA,CAAU,SAAA,CAAAC,CAAU,EAAqB,CACrE,OAAOE,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAWR,CAAAA,CAAG,EAAA,CAAIM,CAAS,CAAA,CAAI,SAAAD,CAAAA,CAAS,CACtD,CAOO,SAASQ,EAAW,CAAE,QAAA,CAAAR,CAAAA,CAAU,SAAA,CAAAC,CAAU,CAAA,CAAoB,CACnE,OAAOE,GAAAA,CAAC,OAAI,SAAA,CAAWR,CAAAA,CAAG,yDAAA,CAA2DM,CAAS,EAAI,QAAA,CAAAD,CAAAA,CAAS,CAC7G,KAEOS,CAAAA,CAAQV","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 { cn } from \"../utils/cn\";\r\n\r\ninterface CardProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n hover?: boolean;\r\n}\r\n\r\nexport function Card({ children, className, hover = false }: CardProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"rounded-xl p-6\",\r\n \"bg-white dark:bg-zinc-900\",\r\n \"border border-zinc-200 dark:border-zinc-800\",\r\n hover && \"transition-all duration-200 hover:shadow-lg hover:-translate-y-1\",\r\n className\r\n )}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\ninterface CardHeaderProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CardHeader({ children, className }: CardHeaderProps) {\r\n return <div className={cn(\"mb-4\", className)}>{children}</div>;\r\n}\r\n\r\ninterface CardTitleProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CardTitle({ children, className }: CardTitleProps) {\r\n return <h3 className={cn(\"text-lg font-semibold\", className)}>{children}</h3>;\r\n}\r\n\r\ninterface CardDescriptionProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CardDescription({ children, className }: CardDescriptionProps) {\r\n return <p className={cn(\"text-sm text-zinc-500 dark:text-zinc-400\", className)}>{children}</p>;\r\n}\r\n\r\ninterface CardContentProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CardContent({ children, className }: CardContentProps) {\r\n return <div className={cn(\"\", className)}>{children}</div>;\r\n}\r\n\r\ninterface CardFooterProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CardFooter({ children, className }: CardFooterProps) {\r\n return <div className={cn(\"mt-4 pt-4 border-t border-zinc-200 dark:border-zinc-800\", className)}>{children}</div>;\r\n}\r\n\r\nexport default Card;\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var framerMotion=require('framer-motion'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function t(...e){return tailwindMerge.twMerge(clsx.clsx(e))}function b({checked:e=false,onChange:a,label:r,disabled:n=false,className:s}){return jsxRuntime.jsxs("label",{className:t("inline-flex items-center gap-2 cursor-pointer",n&&"opacity-50 cursor-not-allowed",s),children:[jsxRuntime.jsx("button",{type:"button",role:"checkbox","aria-checked":e,disabled:n,onClick:()=>a?.(!e),className:t("w-5 h-5 rounded border-2 flex items-center justify-center transition-colors",e?"bg-blue-500 border-blue-500":"bg-transparent border-zinc-300 dark:border-zinc-600"),children:jsxRuntime.jsx(framerMotion.motion.svg,{initial:false,animate:{scale:e?1:0,opacity:e?1:0},transition:{duration:.15},className:"w-3 h-3 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:3,d:"M5 13l4 4L19 7"})})}),r&&jsxRuntime.jsx("span",{className:"text-sm",children:r})]})}var g=b;exports.Checkbox=b;exports.default=g;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/checkbox/index.tsx"],"names":["cn","inputs","twMerge","clsx","Checkbox","checked","onChange","label","disabled","className","jsxs","jsx","motion","checkbox_default"],"mappings":"qNAGO,SAASA,KAAMC,CAAAA,CAAsB,CAC1C,OAAOC,qBAAAA,CAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CCQO,SAASG,EAAS,CAAE,OAAA,CAAAC,CAAAA,CAAU,KAAA,CAAO,QAAA,CAAAC,CAAAA,CAAU,KAAA,CAAAC,CAAAA,CAAO,QAAA,CAAAC,CAAAA,CAAW,KAAA,CAAO,SAAA,CAAAC,CAAU,CAAA,CAAkB,CACzG,OACEC,gBAAC,OAAA,CAAA,CACC,SAAA,CAAWV,CAAAA,CACT,+CAAA,CACAQ,CAAAA,EAAY,+BAAA,CACZC,CACF,CAAA,CAEA,UAAAE,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,IAAA,CAAK,UAAA,CACL,cAAA,CAAcN,CAAAA,CACd,SAAUG,CAAAA,CACV,OAAA,CAAS,IAAMF,CAAAA,GAAW,CAACD,CAAO,CAAA,CAClC,SAAA,CAAWL,CAAAA,CACT,6EAAA,CACAK,CAAAA,CACI,6BAAA,CACA,qDACN,CAAA,CAEA,QAAA,CAAAM,cAAAA,CAACC,oBAAO,GAAA,CAAP,CACC,OAAA,CAAS,KAAA,CACT,OAAA,CAAS,CAAE,KAAA,CAAOP,CAAAA,CAAU,EAAI,CAAA,CAAG,OAAA,CAASA,CAAAA,CAAU,CAAA,CAAI,CAAE,CAAA,CAC5D,UAAA,CAAY,CAAE,SAAU,GAAK,CAAA,CAC7B,SAAA,CAAU,oBAAA,CACV,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,OAAA,CAAQ,WAAA,CAER,QAAA,CAAAM,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,QAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,gBAAA,CAAiB,CAAA,CACxF,CAAA,CACF,CAAA,CACCJ,CAAAA,EAASI,eAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAAJ,CAAAA,CAAM,CAAA,CAAA,CAC7C,CAEJ,KAEOM,CAAAA,CAAQT","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 CheckboxProps {\r\n checked?: boolean;\r\n onChange?: (checked: boolean) => void;\r\n label?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport function Checkbox({ checked = false, onChange, label, disabled = false, className }: CheckboxProps) {\r\n return (\r\n <label\r\n className={cn(\r\n \"inline-flex items-center gap-2 cursor-pointer\",\r\n disabled && \"opacity-50 cursor-not-allowed\",\r\n className\r\n )}\r\n >\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n aria-checked={checked}\r\n disabled={disabled}\r\n onClick={() => onChange?.(!checked)}\r\n className={cn(\r\n \"w-5 h-5 rounded border-2 flex items-center justify-center transition-colors\",\r\n checked\r\n ? \"bg-blue-500 border-blue-500\"\r\n : \"bg-transparent border-zinc-300 dark:border-zinc-600\"\r\n )}\r\n >\r\n <motion.svg\r\n initial={false}\r\n animate={{ scale: checked ? 1 : 0, opacity: checked ? 1 : 0 }}\r\n transition={{ duration: 0.15 }}\r\n className=\"w-3 h-3 text-white\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M5 13l4 4L19 7\" />\r\n </motion.svg>\r\n </button>\r\n {label && <span className=\"text-sm\">{label}</span>}\r\n </label>\r\n );\r\n}\r\n\r\nexport default Checkbox;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {motion}from'framer-motion';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsxs,jsx}from'react/jsx-runtime';function t(...e){return twMerge(clsx(e))}function b({checked:e=false,onChange:a,label:r,disabled:n=false,className:s}){return jsxs("label",{className:t("inline-flex items-center gap-2 cursor-pointer",n&&"opacity-50 cursor-not-allowed",s),children:[jsx("button",{type:"button",role:"checkbox","aria-checked":e,disabled:n,onClick:()=>a?.(!e),className:t("w-5 h-5 rounded border-2 flex items-center justify-center transition-colors",e?"bg-blue-500 border-blue-500":"bg-transparent border-zinc-300 dark:border-zinc-600"),children:jsx(motion.svg,{initial:false,animate:{scale:e?1:0,opacity:e?1:0},transition:{duration:.15},className:"w-3 h-3 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:3,d:"M5 13l4 4L19 7"})})}),r&&jsx("span",{className:"text-sm",children:r})]})}var g=b;export{b as Checkbox,g as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/checkbox/index.tsx"],"names":["cn","inputs","twMerge","clsx","Checkbox","checked","onChange","label","disabled","className","jsxs","jsx","motion","checkbox_default"],"mappings":"yIAGO,SAASA,KAAMC,CAAAA,CAAsB,CAC1C,OAAOC,OAAAA,CAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCQO,SAASG,EAAS,CAAE,OAAA,CAAAC,CAAAA,CAAU,KAAA,CAAO,QAAA,CAAAC,CAAAA,CAAU,KAAA,CAAAC,CAAAA,CAAO,QAAA,CAAAC,CAAAA,CAAW,KAAA,CAAO,SAAA,CAAAC,CAAU,CAAA,CAAkB,CACzG,OACEC,KAAC,OAAA,CAAA,CACC,SAAA,CAAWV,CAAAA,CACT,+CAAA,CACAQ,CAAAA,EAAY,+BAAA,CACZC,CACF,CAAA,CAEA,UAAAE,GAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,IAAA,CAAK,UAAA,CACL,cAAA,CAAcN,CAAAA,CACd,SAAUG,CAAAA,CACV,OAAA,CAAS,IAAMF,CAAAA,GAAW,CAACD,CAAO,CAAA,CAClC,SAAA,CAAWL,CAAAA,CACT,6EAAA,CACAK,CAAAA,CACI,6BAAA,CACA,qDACN,CAAA,CAEA,QAAA,CAAAM,GAAAA,CAACC,OAAO,GAAA,CAAP,CACC,OAAA,CAAS,KAAA,CACT,OAAA,CAAS,CAAE,KAAA,CAAOP,CAAAA,CAAU,EAAI,CAAA,CAAG,OAAA,CAASA,CAAAA,CAAU,CAAA,CAAI,CAAE,CAAA,CAC5D,UAAA,CAAY,CAAE,SAAU,GAAK,CAAA,CAC7B,SAAA,CAAU,oBAAA,CACV,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,OAAA,CAAQ,WAAA,CAER,QAAA,CAAAM,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,QAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,gBAAA,CAAiB,CAAA,CACxF,CAAA,CACF,CAAA,CACCJ,CAAAA,EAASI,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAAJ,CAAAA,CAAM,CAAA,CAAA,CAC7C,CAEJ,KAEOM,CAAAA,CAAQT","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 CheckboxProps {\r\n checked?: boolean;\r\n onChange?: (checked: boolean) => void;\r\n label?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport function Checkbox({ checked = false, onChange, label, disabled = false, className }: CheckboxProps) {\r\n return (\r\n <label\r\n className={cn(\r\n \"inline-flex items-center gap-2 cursor-pointer\",\r\n disabled && \"opacity-50 cursor-not-allowed\",\r\n className\r\n )}\r\n >\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n aria-checked={checked}\r\n disabled={disabled}\r\n onClick={() => onChange?.(!checked)}\r\n className={cn(\r\n \"w-5 h-5 rounded border-2 flex items-center justify-center transition-colors\",\r\n checked\r\n ? \"bg-blue-500 border-blue-500\"\r\n : \"bg-transparent border-zinc-300 dark:border-zinc-600\"\r\n )}\r\n >\r\n <motion.svg\r\n initial={false}\r\n animate={{ scale: checked ? 1 : 0, opacity: checked ? 1 : 0 }}\r\n transition={{ duration: 0.15 }}\r\n className=\"w-3 h-3 text-white\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M5 13l4 4L19 7\" />\r\n </motion.svg>\r\n </button>\r\n {label && <span className=\"text-sm\">{label}</span>}\r\n </label>\r\n );\r\n}\r\n\r\nexport default Checkbox;\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),framerMotion=require('framer-motion'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function f(...n){return tailwindMerge.twMerge(clsx.clsx(n))}function C({text:n,spinDuration:s=20,onHover:i="speedUp",className:u=""}){let l=Array.from(n),a=framerMotion.useAnimation(),r=framerMotion.useMotionValue(0);react.useEffect(()=>{let t=r.get();a.start({rotate:t+360,scale:1,transition:{rotate:{from:t,to:t+360,ease:"linear",duration:s,repeat:1/0},scale:{type:"spring",damping:20,stiffness:300}}});},[s,a,r]);let g=()=>{let t=r.get(),e=s,o=1;switch(i){case "slowDown":e=s*2;break;case "speedUp":e=s/4;break;case "pause":e=0;break;case "goBonkers":e=s/20,o=.8;break}i==="pause"?a.stop():a.start({rotate:t+360,scale:o,transition:{rotate:{from:t,to:t+360,ease:"linear",duration:e,repeat:1/0},scale:{type:"spring",damping:20,stiffness:300}}});},d=()=>{let t=r.get();a.start({rotate:t+360,scale:1,transition:{rotate:{from:t,to:t+360,ease:"linear",duration:s,repeat:1/0},scale:{type:"spring",damping:20,stiffness:300}}});};return jsxRuntime.jsx(framerMotion.motion.div,{className:f("relative w-32 h-32 cursor-pointer",u),style:{rotate:r},initial:{rotate:0},animate:a,onMouseEnter:g,onMouseLeave:d,children:l.map((t,e)=>{let o=360/l.length*e,c=60,p=o*Math.PI/180,y=Math.cos(p)*c,x=Math.sin(p)*c;return jsxRuntime.jsx("span",{className:"absolute text-lg font-bold",style:{transform:`translate(-50%, -50%) translate(${y}px, ${x}px) rotate(${o+90}deg)`,left:"50%",top:"50%"},children:t},e)})})}var V=C;exports.CircularText=C;exports.default=V;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/circular-text/index.tsx"],"names":["cn","inputs","twMerge","clsx","CircularText","text","spinDuration","onHover","className","letters","controls","useAnimation","rotation","useMotionValue","useEffect","start","handleHoverStart","duration","scale","handleHoverEnd","jsx","motion","letter","i","rotationDeg","radius","angle","x","y","circular_text_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 { useEffect } from \"react\";\r\nimport { motion, useAnimation, useMotionValue } from \"framer-motion\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface CircularTextProps {\r\n text: string;\r\n spinDuration?: number;\r\n onHover?: \"slowDown\" | \"speedUp\" | \"pause\" | \"goBonkers\";\r\n className?: string;\r\n}\r\n\r\nexport function CircularText({\r\n text,\r\n spinDuration = 20,\r\n onHover = \"speedUp\",\r\n className = \"\",\r\n}: CircularTextProps) {\r\n const letters = Array.from(text);\r\n const controls = useAnimation();\r\n const rotation = useMotionValue(0);\r\n\r\n useEffect(() => {\r\n const start = rotation.get();\r\n controls.start({\r\n rotate: start + 360,\r\n scale: 1,\r\n transition: {\r\n rotate: { from: start, to: start + 360, ease: \"linear\", duration: spinDuration, repeat: Infinity },\r\n scale: { type: \"spring\", damping: 20, stiffness: 300 },\r\n },\r\n });\r\n }, [spinDuration, controls, rotation]);\r\n\r\n const handleHoverStart = () => {\r\n const start = rotation.get();\r\n let duration = spinDuration;\r\n let scale = 1;\r\n\r\n switch (onHover) {\r\n case \"slowDown\": duration = spinDuration * 2; break;\r\n case \"speedUp\": duration = spinDuration / 4; break;\r\n case \"pause\": duration = 0; break;\r\n case \"goBonkers\": duration = spinDuration / 20; scale = 0.8; break;\r\n }\r\n\r\n if (onHover === \"pause\") {\r\n controls.stop();\r\n } else {\r\n controls.start({\r\n rotate: start + 360,\r\n scale,\r\n transition: {\r\n rotate: { from: start, to: start + 360, ease: \"linear\", duration, repeat: Infinity },\r\n scale: { type: \"spring\", damping: 20, stiffness: 300 },\r\n },\r\n });\r\n }\r\n };\r\n\r\n const handleHoverEnd = () => {\r\n const start = rotation.get();\r\n controls.start({\r\n rotate: start + 360,\r\n scale: 1,\r\n transition: {\r\n rotate: { from: start, to: start + 360, ease: \"linear\", duration: spinDuration, repeat: Infinity },\r\n scale: { type: \"spring\", damping: 20, stiffness: 300 },\r\n },\r\n });\r\n };\r\n\r\n return (\r\n <motion.div\r\n className={cn(\"relative w-32 h-32 cursor-pointer\", className)}\r\n style={{ rotate: rotation }}\r\n initial={{ rotate: 0 }}\r\n animate={controls}\r\n onMouseEnter={handleHoverStart}\r\n onMouseLeave={handleHoverEnd}\r\n >\r\n {letters.map((letter, i) => {\r\n const rotationDeg = (360 / letters.length) * i;\r\n const radius = 60;\r\n const angle = (rotationDeg * Math.PI) / 180;\r\n const x = Math.cos(angle) * radius;\r\n const y = Math.sin(angle) * radius;\r\n\r\n return (\r\n <span\r\n key={i}\r\n className=\"absolute text-lg font-bold\"\r\n style={{\r\n transform: `translate(-50%, -50%) translate(${x}px, ${y}px) rotate(${rotationDeg + 90}deg)`,\r\n left: \"50%\",\r\n top: \"50%\",\r\n }}\r\n >\r\n {letter}\r\n </span>\r\n );\r\n })}\r\n </motion.div>\r\n );\r\n}\r\n\r\nexport default CircularText;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useEffect}from'react';import {useAnimation,useMotionValue,motion}from'framer-motion';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx}from'react/jsx-runtime';function f(...n){return twMerge(clsx(n))}function C({text:n,spinDuration:s=20,onHover:i="speedUp",className:u=""}){let l=Array.from(n),a=useAnimation(),r=useMotionValue(0);useEffect(()=>{let t=r.get();a.start({rotate:t+360,scale:1,transition:{rotate:{from:t,to:t+360,ease:"linear",duration:s,repeat:1/0},scale:{type:"spring",damping:20,stiffness:300}}});},[s,a,r]);let g=()=>{let t=r.get(),e=s,o=1;switch(i){case "slowDown":e=s*2;break;case "speedUp":e=s/4;break;case "pause":e=0;break;case "goBonkers":e=s/20,o=.8;break}i==="pause"?a.stop():a.start({rotate:t+360,scale:o,transition:{rotate:{from:t,to:t+360,ease:"linear",duration:e,repeat:1/0},scale:{type:"spring",damping:20,stiffness:300}}});},d=()=>{let t=r.get();a.start({rotate:t+360,scale:1,transition:{rotate:{from:t,to:t+360,ease:"linear",duration:s,repeat:1/0},scale:{type:"spring",damping:20,stiffness:300}}});};return jsx(motion.div,{className:f("relative w-32 h-32 cursor-pointer",u),style:{rotate:r},initial:{rotate:0},animate:a,onMouseEnter:g,onMouseLeave:d,children:l.map((t,e)=>{let o=360/l.length*e,c=60,p=o*Math.PI/180,y=Math.cos(p)*c,x=Math.sin(p)*c;return jsx("span",{className:"absolute text-lg font-bold",style:{transform:`translate(-50%, -50%) translate(${y}px, ${x}px) rotate(${o+90}deg)`,left:"50%",top:"50%"},children:t},e)})})}var V=C;export{C as CircularText,V as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/circular-text/index.tsx"],"names":["cn","inputs","twMerge","clsx","CircularText","text","spinDuration","onHover","className","letters","controls","useAnimation","rotation","useMotionValue","useEffect","start","handleHoverStart","duration","scale","handleHoverEnd","jsx","motion","letter","i","rotationDeg","radius","angle","x","y","circular_text_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 { useEffect } from \"react\";\r\nimport { motion, useAnimation, useMotionValue } from \"framer-motion\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface CircularTextProps {\r\n text: string;\r\n spinDuration?: number;\r\n onHover?: \"slowDown\" | \"speedUp\" | \"pause\" | \"goBonkers\";\r\n className?: string;\r\n}\r\n\r\nexport function CircularText({\r\n text,\r\n spinDuration = 20,\r\n onHover = \"speedUp\",\r\n className = \"\",\r\n}: CircularTextProps) {\r\n const letters = Array.from(text);\r\n const controls = useAnimation();\r\n const rotation = useMotionValue(0);\r\n\r\n useEffect(() => {\r\n const start = rotation.get();\r\n controls.start({\r\n rotate: start + 360,\r\n scale: 1,\r\n transition: {\r\n rotate: { from: start, to: start + 360, ease: \"linear\", duration: spinDuration, repeat: Infinity },\r\n scale: { type: \"spring\", damping: 20, stiffness: 300 },\r\n },\r\n });\r\n }, [spinDuration, controls, rotation]);\r\n\r\n const handleHoverStart = () => {\r\n const start = rotation.get();\r\n let duration = spinDuration;\r\n let scale = 1;\r\n\r\n switch (onHover) {\r\n case \"slowDown\": duration = spinDuration * 2; break;\r\n case \"speedUp\": duration = spinDuration / 4; break;\r\n case \"pause\": duration = 0; break;\r\n case \"goBonkers\": duration = spinDuration / 20; scale = 0.8; break;\r\n }\r\n\r\n if (onHover === \"pause\") {\r\n controls.stop();\r\n } else {\r\n controls.start({\r\n rotate: start + 360,\r\n scale,\r\n transition: {\r\n rotate: { from: start, to: start + 360, ease: \"linear\", duration, repeat: Infinity },\r\n scale: { type: \"spring\", damping: 20, stiffness: 300 },\r\n },\r\n });\r\n }\r\n };\r\n\r\n const handleHoverEnd = () => {\r\n const start = rotation.get();\r\n controls.start({\r\n rotate: start + 360,\r\n scale: 1,\r\n transition: {\r\n rotate: { from: start, to: start + 360, ease: \"linear\", duration: spinDuration, repeat: Infinity },\r\n scale: { type: \"spring\", damping: 20, stiffness: 300 },\r\n },\r\n });\r\n };\r\n\r\n return (\r\n <motion.div\r\n className={cn(\"relative w-32 h-32 cursor-pointer\", className)}\r\n style={{ rotate: rotation }}\r\n initial={{ rotate: 0 }}\r\n animate={controls}\r\n onMouseEnter={handleHoverStart}\r\n onMouseLeave={handleHoverEnd}\r\n >\r\n {letters.map((letter, i) => {\r\n const rotationDeg = (360 / letters.length) * i;\r\n const radius = 60;\r\n const angle = (rotationDeg * Math.PI) / 180;\r\n const x = Math.cos(angle) * radius;\r\n const y = Math.sin(angle) * radius;\r\n\r\n return (\r\n <span\r\n key={i}\r\n className=\"absolute text-lg font-bold\"\r\n style={{\r\n transform: `translate(-50%, -50%) translate(${x}px, ${y}px) rotate(${rotationDeg + 90}deg)`,\r\n left: \"50%\",\r\n top: \"50%\",\r\n }}\r\n >\r\n {letter}\r\n </span>\r\n );\r\n })}\r\n </motion.div>\r\n );\r\n}\r\n\r\nexport default CircularText;\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function r(...o){return tailwindMerge.twMerge(clsx.clsx(o))}function d({className:o,children:e,shortcut:n="CMD + K",...a}){return jsxRuntime.jsxs("button",{...a,className:r("relative p-2 rounded-lg overflow-hidden","bg-gradient-to-b from-zinc-50 to-zinc-100 dark:from-zinc-800 dark:to-zinc-900","border border-zinc-200 dark:border-zinc-800","hover:border-zinc-300 dark:hover:border-zinc-700","transition-all duration-300 ease-out group","inline-flex items-center justify-center gap-2",o),children:[jsxRuntime.jsx("svg",{className:r("w-4 h-4 text-zinc-600 dark:text-zinc-400","transition-all duration-300","group-hover:scale-110 group-hover:rotate-[-4deg] group-active:scale-95"),fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M18 3a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3H6a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3V6a3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3h12a3 3 0 0 0 3-3 3 3 0 0 0-3-3z"})}),jsxRuntime.jsx("span",{className:"text-sm text-zinc-600 dark:text-zinc-400",children:e||n}),jsxRuntime.jsx("span",{className:"absolute inset-0 bg-gradient-to-r from-indigo-500/0 via-indigo-500/10 to-indigo-500/0 translate-x-[-100%] group-hover:translate-x-[100%] transition-transform duration-500 ease-out"})]})}var g=d;exports.CommandButton=d;exports.default=g;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/command-button/index.tsx"],"names":["cn","inputs","twMerge","clsx","CommandButton","className","children","shortcut","props","jsxs","jsx","command_button_default"],"mappings":"+KAGO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,qBAAAA,CAAQC,UAAKF,CAAM,CAAC,CAC7B,CCGO,SAASG,CAAAA,CAAc,CAAE,SAAA,CAAAC,CAAAA,CAAW,SAAAC,CAAAA,CAAU,QAAA,CAAAC,EAAW,SAAA,CAAW,GAAGC,CAAM,CAAA,CAAuB,CACzG,OACEC,eAAAA,CAAC,QAAA,CAAA,CACE,GAAGD,CAAAA,CACJ,SAAA,CAAWR,CAAAA,CACT,yCAAA,CACA,+EAAA,CACA,6CAAA,CACA,mDACA,4CAAA,CACA,+CAAA,CACAK,CACF,CAAA,CAEA,QAAA,CAAA,CAAAK,eAAC,KAAA,CAAA,CACC,SAAA,CAAWV,EACT,0CAAA,CACA,6BAAA,CACA,wEACF,CAAA,CACA,IAAA,CAAK,OACL,OAAA,CAAQ,WAAA,CACR,OAAO,cAAA,CAEP,QAAA,CAAAU,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAa,EAAG,CAAA,CAAE,0LAAA,CAA2L,EAClQ,CAAA,CACAA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0CAAA,CAA4C,QAAA,CAAAJ,GAAYC,CAAAA,CAAS,CAAA,CACjFG,eAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sLAAsL,CAAA,CAAA,CACxM,CAEJ,CAEA,IAAOC,CAAAA,CAAQP","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 { cn } from \"../utils/cn\";\r\n\r\ninterface CommandButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n shortcut?: string;\r\n}\r\n\r\nexport function CommandButton({ className, children, shortcut = \"CMD + K\", ...props }: CommandButtonProps) {\r\n return (\r\n <button\r\n {...props}\r\n className={cn(\r\n \"relative p-2 rounded-lg overflow-hidden\",\r\n \"bg-gradient-to-b from-zinc-50 to-zinc-100 dark:from-zinc-800 dark:to-zinc-900\",\r\n \"border border-zinc-200 dark:border-zinc-800\",\r\n \"hover:border-zinc-300 dark:hover:border-zinc-700\",\r\n \"transition-all duration-300 ease-out group\",\r\n \"inline-flex items-center justify-center gap-2\",\r\n className\r\n )}\r\n >\r\n <svg\r\n className={cn(\r\n \"w-4 h-4 text-zinc-600 dark:text-zinc-400\",\r\n \"transition-all duration-300\",\r\n \"group-hover:scale-110 group-hover:rotate-[-4deg] group-active:scale-95\"\r\n )}\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M18 3a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3H6a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3V6a3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3h12a3 3 0 0 0 3-3 3 3 0 0 0-3-3z\" />\r\n </svg>\r\n <span className=\"text-sm text-zinc-600 dark:text-zinc-400\">{children || shortcut}</span>\r\n <span className=\"absolute inset-0 bg-gradient-to-r from-indigo-500/0 via-indigo-500/10 to-indigo-500/0 translate-x-[-100%] group-hover:translate-x-[100%] transition-transform duration-500 ease-out\" />\r\n </button>\r\n );\r\n}\r\n\r\nexport default CommandButton;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsxs,jsx}from'react/jsx-runtime';function r(...o){return twMerge(clsx(o))}function d({className:o,children:e,shortcut:n="CMD + K",...a}){return jsxs("button",{...a,className:r("relative p-2 rounded-lg overflow-hidden","bg-gradient-to-b from-zinc-50 to-zinc-100 dark:from-zinc-800 dark:to-zinc-900","border border-zinc-200 dark:border-zinc-800","hover:border-zinc-300 dark:hover:border-zinc-700","transition-all duration-300 ease-out group","inline-flex items-center justify-center gap-2",o),children:[jsx("svg",{className:r("w-4 h-4 text-zinc-600 dark:text-zinc-400","transition-all duration-300","group-hover:scale-110 group-hover:rotate-[-4deg] group-active:scale-95"),fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M18 3a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3H6a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3V6a3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3h12a3 3 0 0 0 3-3 3 3 0 0 0-3-3z"})}),jsx("span",{className:"text-sm text-zinc-600 dark:text-zinc-400",children:e||n}),jsx("span",{className:"absolute inset-0 bg-gradient-to-r from-indigo-500/0 via-indigo-500/10 to-indigo-500/0 translate-x-[-100%] group-hover:translate-x-[100%] transition-transform duration-500 ease-out"})]})}var g=d;export{d as CommandButton,g as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/command-button/index.tsx"],"names":["cn","inputs","twMerge","clsx","CommandButton","className","children","shortcut","props","jsxs","jsx","command_button_default"],"mappings":"sGAGO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,OAAAA,CAAQC,KAAKF,CAAM,CAAC,CAC7B,CCGO,SAASG,CAAAA,CAAc,CAAE,SAAA,CAAAC,CAAAA,CAAW,SAAAC,CAAAA,CAAU,QAAA,CAAAC,EAAW,SAAA,CAAW,GAAGC,CAAM,CAAA,CAAuB,CACzG,OACEC,IAAAA,CAAC,QAAA,CAAA,CACE,GAAGD,CAAAA,CACJ,SAAA,CAAWR,CAAAA,CACT,yCAAA,CACA,+EAAA,CACA,6CAAA,CACA,mDACA,4CAAA,CACA,+CAAA,CACAK,CACF,CAAA,CAEA,QAAA,CAAA,CAAAK,IAAC,KAAA,CAAA,CACC,SAAA,CAAWV,EACT,0CAAA,CACA,6BAAA,CACA,wEACF,CAAA,CACA,IAAA,CAAK,OACL,OAAA,CAAQ,WAAA,CACR,OAAO,cAAA,CAEP,QAAA,CAAAU,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAa,EAAG,CAAA,CAAE,0LAAA,CAA2L,EAClQ,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,0CAAA,CAA4C,QAAA,CAAAJ,GAAYC,CAAAA,CAAS,CAAA,CACjFG,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sLAAsL,CAAA,CAAA,CACxM,CAEJ,CAEA,IAAOC,CAAAA,CAAQP","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 { cn } from \"../utils/cn\";\r\n\r\ninterface CommandButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n shortcut?: string;\r\n}\r\n\r\nexport function CommandButton({ className, children, shortcut = \"CMD + K\", ...props }: CommandButtonProps) {\r\n return (\r\n <button\r\n {...props}\r\n className={cn(\r\n \"relative p-2 rounded-lg overflow-hidden\",\r\n \"bg-gradient-to-b from-zinc-50 to-zinc-100 dark:from-zinc-800 dark:to-zinc-900\",\r\n \"border border-zinc-200 dark:border-zinc-800\",\r\n \"hover:border-zinc-300 dark:hover:border-zinc-700\",\r\n \"transition-all duration-300 ease-out group\",\r\n \"inline-flex items-center justify-center gap-2\",\r\n className\r\n )}\r\n >\r\n <svg\r\n className={cn(\r\n \"w-4 h-4 text-zinc-600 dark:text-zinc-400\",\r\n \"transition-all duration-300\",\r\n \"group-hover:scale-110 group-hover:rotate-[-4deg] group-active:scale-95\"\r\n )}\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M18 3a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3H6a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3V6a3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3h12a3 3 0 0 0 3-3 3 3 0 0 0-3-3z\" />\r\n </svg>\r\n <span className=\"text-sm text-zinc-600 dark:text-zinc-400\">{children || shortcut}</span>\r\n <span className=\"absolute inset-0 bg-gradient-to-r from-indigo-500/0 via-indigo-500/10 to-indigo-500/0 translate-x-[-100%] group-hover:translate-x-[100%] transition-transform duration-500 ease-out\" />\r\n </button>\r\n );\r\n}\r\n\r\nexport default CommandButton;\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 n(...e){return tailwindMerge.twMerge(clsx.clsx(e))}function f({text:e="Copy",value:t,onCopy:s,className:c}){let[l,r]=react.useState(false);return jsxRuntime.jsx("button",{onClick:async()=>{try{t&&await navigator.clipboard.writeText(t),s?.(),r(!0),setTimeout(()=>r(!1),2e3);}catch(p){console.error("Failed to copy:",p);}},className:n("inline-flex items-center gap-2 px-4 py-2","bg-transparent hover:bg-zinc-100 dark:hover:bg-zinc-800","text-zinc-900 dark:text-zinc-100","border border-zinc-300 dark:border-zinc-700","rounded-md transition-all duration-200 font-medium text-sm",c),children:l?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("svg",{className:"w-4 h-4 text-green-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})}),"Copied!"]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"})}),e]})})}var y=f;exports.CopyButton=f;exports.default=y;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/copy-button/index.tsx"],"names":["cn","inputs","twMerge","clsx","CopyButton","text","value","onCopy","className","copied","setCopied","useState","jsx","error","jsxs","Fragment","copy_button_default"],"mappings":"sMAGO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,qBAAAA,CAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CCOO,SAASG,EAAW,CACzB,IAAA,CAAAC,EAAO,MAAA,CACP,KAAA,CAAAC,EACA,MAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CACF,EAAoB,CAClB,GAAM,CAACC,CAAAA,CAAQC,CAAS,CAAA,CAAIC,cAAAA,CAAS,KAAK,CAAA,CAe1C,OACEC,cAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAfe,SAAY,CAC7B,GAAI,CACEN,CAAAA,EACF,MAAM,UAAU,SAAA,CAAU,SAAA,CAAUA,CAAK,CAAA,CAE3CC,KAAS,CACTG,CAAAA,CAAU,CAAA,CAAI,CAAA,CACd,WAAW,IAAMA,CAAAA,CAAU,EAAK,CAAA,CAAG,GAAI,EACzC,CAAA,MAASG,CAAAA,CAAO,CACd,OAAA,CAAQ,MAAM,iBAAA,CAAmBA,CAAK,EACxC,CACF,EAKI,SAAA,CAAWb,CAAAA,CACT,0CAAA,CACA,yDAAA,CACA,mCACA,6CAAA,CACA,4DAAA,CACAQ,CACF,CAAA,CAEC,SAAAC,CAAAA,CACCK,eAAAA,CAAAC,mBAAAA,CAAA,CACE,UAAAH,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CAAyB,KAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,YAChF,QAAA,CAAAA,cAAAA,CAAC,QAAK,aAAA,CAAc,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,iBAAiB,CAAA,CACxF,CAAA,CAAM,SAAA,CAAA,CAER,CAAA,CAEAE,gBAAAC,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAH,cAAAA,CAAC,OAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,OAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,eAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,QAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,uHAAA,CAAwH,EAC/L,CAAA,CACCP,CAAAA,CAAAA,CACH,EAEJ,CAEJ,KAEOW,CAAAA,CAAQZ","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 { cn } from \"../utils/cn\";\r\n\r\ninterface CopyButtonProps {\r\n text?: string;\r\n value?: string;\r\n onCopy?: () => void;\r\n className?: string;\r\n}\r\n\r\nexport function CopyButton({ \r\n text = \"Copy\",\r\n value,\r\n onCopy,\r\n className \r\n}: CopyButtonProps) {\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = async () => {\r\n try {\r\n if (value) {\r\n await navigator.clipboard.writeText(value);\r\n }\r\n onCopy?.();\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (error) {\r\n console.error(\"Failed to copy:\", error);\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n onClick={handleCopy}\r\n className={cn(\r\n \"inline-flex items-center gap-2 px-4 py-2\",\r\n \"bg-transparent hover:bg-zinc-100 dark:hover:bg-zinc-800\",\r\n \"text-zinc-900 dark:text-zinc-100\",\r\n \"border border-zinc-300 dark:border-zinc-700\",\r\n \"rounded-md transition-all duration-200 font-medium text-sm\",\r\n className\r\n )}\r\n >\r\n {copied ? (\r\n <>\r\n <svg className=\"w-4 h-4 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n Copied!\r\n </>\r\n ) : (\r\n <>\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\r\n </svg>\r\n {text}\r\n </>\r\n )}\r\n </button>\r\n );\r\n}\r\n\r\nexport default CopyButton;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useState}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs,Fragment}from'react/jsx-runtime';function n(...e){return twMerge(clsx(e))}function f({text:e="Copy",value:t,onCopy:s,className:c}){let[l,r]=useState(false);return jsx("button",{onClick:async()=>{try{t&&await navigator.clipboard.writeText(t),s?.(),r(!0),setTimeout(()=>r(!1),2e3);}catch(p){console.error("Failed to copy:",p);}},className:n("inline-flex items-center gap-2 px-4 py-2","bg-transparent hover:bg-zinc-100 dark:hover:bg-zinc-800","text-zinc-900 dark:text-zinc-100","border border-zinc-300 dark:border-zinc-700","rounded-md transition-all duration-200 font-medium text-sm",c),children:l?jsxs(Fragment,{children:[jsx("svg",{className:"w-4 h-4 text-green-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})}),"Copied!"]}):jsxs(Fragment,{children:[jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"})}),e]})})}var y=f;export{f as CopyButton,y as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/copy-button/index.tsx"],"names":["cn","inputs","twMerge","clsx","CopyButton","text","value","onCopy","className","copied","setCopied","useState","jsx","error","jsxs","Fragment","copy_button_default"],"mappings":"4IAGO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,OAAAA,CAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCOO,SAASG,EAAW,CACzB,IAAA,CAAAC,EAAO,MAAA,CACP,KAAA,CAAAC,EACA,MAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CACF,EAAoB,CAClB,GAAM,CAACC,CAAAA,CAAQC,CAAS,CAAA,CAAIC,QAAAA,CAAS,KAAK,CAAA,CAe1C,OACEC,GAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAfe,SAAY,CAC7B,GAAI,CACEN,CAAAA,EACF,MAAM,UAAU,SAAA,CAAU,SAAA,CAAUA,CAAK,CAAA,CAE3CC,KAAS,CACTG,CAAAA,CAAU,CAAA,CAAI,CAAA,CACd,WAAW,IAAMA,CAAAA,CAAU,EAAK,CAAA,CAAG,GAAI,EACzC,CAAA,MAASG,CAAAA,CAAO,CACd,OAAA,CAAQ,MAAM,iBAAA,CAAmBA,CAAK,EACxC,CACF,EAKI,SAAA,CAAWb,CAAAA,CACT,0CAAA,CACA,yDAAA,CACA,mCACA,6CAAA,CACA,4DAAA,CACAQ,CACF,CAAA,CAEC,SAAAC,CAAAA,CACCK,IAAAA,CAAAC,QAAAA,CAAA,CACE,UAAAH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CAAyB,KAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,YAChF,QAAA,CAAAA,GAAAA,CAAC,QAAK,aAAA,CAAc,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,iBAAiB,CAAA,CACxF,CAAA,CAAM,SAAA,CAAA,CAER,CAAA,CAEAE,KAAAC,QAAAA,CAAA,CACE,QAAA,CAAA,CAAAH,GAAAA,CAAC,OAAI,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,OAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACjE,QAAA,CAAAA,IAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,QAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,uHAAA,CAAwH,EAC/L,CAAA,CACCP,CAAAA,CAAAA,CACH,EAEJ,CAEJ,KAEOW,CAAAA,CAAQZ","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 { cn } from \"../utils/cn\";\r\n\r\ninterface CopyButtonProps {\r\n text?: string;\r\n value?: string;\r\n onCopy?: () => void;\r\n className?: string;\r\n}\r\n\r\nexport function CopyButton({ \r\n text = \"Copy\",\r\n value,\r\n onCopy,\r\n className \r\n}: CopyButtonProps) {\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = async () => {\r\n try {\r\n if (value) {\r\n await navigator.clipboard.writeText(value);\r\n }\r\n onCopy?.();\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (error) {\r\n console.error(\"Failed to copy:\", error);\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n onClick={handleCopy}\r\n className={cn(\r\n \"inline-flex items-center gap-2 px-4 py-2\",\r\n \"bg-transparent hover:bg-zinc-100 dark:hover:bg-zinc-800\",\r\n \"text-zinc-900 dark:text-zinc-100\",\r\n \"border border-zinc-300 dark:border-zinc-700\",\r\n \"rounded-md transition-all duration-200 font-medium text-sm\",\r\n className\r\n )}\r\n >\r\n {copied ? (\r\n <>\r\n <svg className=\"w-4 h-4 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n Copied!\r\n </>\r\n ) : (\r\n <>\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\r\n </svg>\r\n {text}\r\n </>\r\n )}\r\n </button>\r\n );\r\n}\r\n\r\nexport default CopyButton;\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var framerMotion=require('framer-motion'),react=require('react'),jsxRuntime=require('react/jsx-runtime');function b({mv:i,number:e,height:t}){let u=framerMotion.useTransform(i,r=>{let n=r%10,s=(10+e-n)%10,o=s*t;return s>5&&(o-=10*t),o});return jsxRuntime.jsx(framerMotion.motion.span,{style:{y:u,position:"absolute",inset:0,display:"flex",justifyContent:"center"},children:e})}function y({place:i,value:e,height:t,digitStyle:u}){let r=Math.floor(e/i),n=framerMotion.useSpring(r,{stiffness:200,damping:25});return react.useEffect(()=>{n.set(r);},[n,r]),jsxRuntime.jsx("div",{style:{height:t,position:"relative",overflow:"hidden",...u},children:Array.from({length:10},(s,o)=>jsxRuntime.jsx(b,{mv:n,number:o,height:t},o))})}function S({value:i,fontSize:e=100,padding:t=0,places:u=[100,10,1],gap:r=8,textColor:n="#000000",fontWeight:s=900,containerStyle:o,digitStyle:m}){let p=e+t;return jsxRuntime.jsx("div",{style:{display:"flex",gap:r,fontSize:e,color:n,fontWeight:s,...o},children:u.map(l=>jsxRuntime.jsx(y,{place:l,value:i,height:p,digitStyle:m},l))})}var C=S;exports.Counter=S;exports.default=C;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/counter/index.tsx"],"names":["Number","mv","number","height","y","useTransform","latest","placeValue","offset","memo","jsx","motion","Digit","place","value","digitStyle","valueRoundedToPlace","animatedValue","useSpring","useEffect","_","i","Counter","fontSize","padding","places","gap","textColor","fontWeight","containerStyle","counter_default"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\r\n\r\nimport { MotionValue, motion, useSpring, useTransform } from \"framer-motion\";\r\nimport { useEffect } from \"react\";\r\n\r\ninterface NumberProps {\r\n mv: MotionValue<number>;\r\n number: number;\r\n height: number;\r\n}\r\n\r\nfunction Number({ mv, number, height }: NumberProps) {\r\n const y = useTransform(mv, (latest) => {\r\n const placeValue = latest % 10;\r\n let offset = (10 + number - placeValue) % 10;\r\n let memo = offset * height;\r\n if (offset > 5) {\r\n memo -= 10 * height;\r\n }\r\n return memo;\r\n });\r\n\r\n return (\r\n <motion.span style={{ y, position: \"absolute\", inset: 0, display: \"flex\", justifyContent: \"center\" }}>\r\n {number}\r\n </motion.span>\r\n );\r\n}\r\n\r\ninterface DigitProps {\r\n place: number;\r\n value: number;\r\n height: number;\r\n digitStyle?: React.CSSProperties;\r\n}\r\n\r\nfunction Digit({ place, value, height, digitStyle }: DigitProps) {\r\n const valueRoundedToPlace = Math.floor(value / place);\r\n const animatedValue = useSpring(valueRoundedToPlace, { stiffness: 200, damping: 25 });\r\n\r\n useEffect(() => {\r\n animatedValue.set(valueRoundedToPlace);\r\n }, [animatedValue, valueRoundedToPlace]);\r\n\r\n return (\r\n <div style={{ height, position: \"relative\", overflow: \"hidden\", ...digitStyle }}>\r\n {Array.from({ length: 10 }, (_, i) => (\r\n <Number key={i} mv={animatedValue} number={i} height={height} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface CounterProps {\r\n value: number;\r\n fontSize?: number;\r\n padding?: number;\r\n places?: number[];\r\n gap?: number;\r\n textColor?: string;\r\n fontWeight?: React.CSSProperties[\"fontWeight\"];\r\n containerStyle?: React.CSSProperties;\r\n digitStyle?: React.CSSProperties;\r\n}\r\n\r\nexport function Counter({\r\n value,\r\n fontSize = 100,\r\n padding = 0,\r\n places = [100, 10, 1],\r\n gap = 8,\r\n textColor = \"#000000\",\r\n fontWeight = 900,\r\n containerStyle,\r\n digitStyle,\r\n}: CounterProps) {\r\n const height = fontSize + padding;\r\n\r\n return (\r\n <div style={{ display: \"flex\", gap, fontSize, color: textColor, fontWeight, ...containerStyle }}>\r\n {places.map((place) => (\r\n <Digit key={place} place={place} value={value} height={height} digitStyle={digitStyle} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport default Counter;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useSpring,useTransform,motion}from'framer-motion';import {useEffect}from'react';import {jsx}from'react/jsx-runtime';function b({mv:i,number:e,height:t}){let u=useTransform(i,r=>{let n=r%10,s=(10+e-n)%10,o=s*t;return s>5&&(o-=10*t),o});return jsx(motion.span,{style:{y:u,position:"absolute",inset:0,display:"flex",justifyContent:"center"},children:e})}function y({place:i,value:e,height:t,digitStyle:u}){let r=Math.floor(e/i),n=useSpring(r,{stiffness:200,damping:25});return useEffect(()=>{n.set(r);},[n,r]),jsx("div",{style:{height:t,position:"relative",overflow:"hidden",...u},children:Array.from({length:10},(s,o)=>jsx(b,{mv:n,number:o,height:t},o))})}function S({value:i,fontSize:e=100,padding:t=0,places:u=[100,10,1],gap:r=8,textColor:n="#000000",fontWeight:s=900,containerStyle:o,digitStyle:m}){let p=e+t;return jsx("div",{style:{display:"flex",gap:r,fontSize:e,color:n,fontWeight:s,...o},children:u.map(l=>jsx(y,{place:l,value:i,height:p,digitStyle:m},l))})}var C=S;export{S as Counter,C as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/counter/index.tsx"],"names":["Number","mv","number","height","y","useTransform","latest","placeValue","offset","memo","jsx","motion","Digit","place","value","digitStyle","valueRoundedToPlace","animatedValue","useSpring","useEffect","_","i","Counter","fontSize","padding","places","gap","textColor","fontWeight","containerStyle","counter_default"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\";\r\n\r\nimport { MotionValue, motion, useSpring, useTransform } from \"framer-motion\";\r\nimport { useEffect } from \"react\";\r\n\r\ninterface NumberProps {\r\n mv: MotionValue<number>;\r\n number: number;\r\n height: number;\r\n}\r\n\r\nfunction Number({ mv, number, height }: NumberProps) {\r\n const y = useTransform(mv, (latest) => {\r\n const placeValue = latest % 10;\r\n let offset = (10 + number - placeValue) % 10;\r\n let memo = offset * height;\r\n if (offset > 5) {\r\n memo -= 10 * height;\r\n }\r\n return memo;\r\n });\r\n\r\n return (\r\n <motion.span style={{ y, position: \"absolute\", inset: 0, display: \"flex\", justifyContent: \"center\" }}>\r\n {number}\r\n </motion.span>\r\n );\r\n}\r\n\r\ninterface DigitProps {\r\n place: number;\r\n value: number;\r\n height: number;\r\n digitStyle?: React.CSSProperties;\r\n}\r\n\r\nfunction Digit({ place, value, height, digitStyle }: DigitProps) {\r\n const valueRoundedToPlace = Math.floor(value / place);\r\n const animatedValue = useSpring(valueRoundedToPlace, { stiffness: 200, damping: 25 });\r\n\r\n useEffect(() => {\r\n animatedValue.set(valueRoundedToPlace);\r\n }, [animatedValue, valueRoundedToPlace]);\r\n\r\n return (\r\n <div style={{ height, position: \"relative\", overflow: \"hidden\", ...digitStyle }}>\r\n {Array.from({ length: 10 }, (_, i) => (\r\n <Number key={i} mv={animatedValue} number={i} height={height} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface CounterProps {\r\n value: number;\r\n fontSize?: number;\r\n padding?: number;\r\n places?: number[];\r\n gap?: number;\r\n textColor?: string;\r\n fontWeight?: React.CSSProperties[\"fontWeight\"];\r\n containerStyle?: React.CSSProperties;\r\n digitStyle?: React.CSSProperties;\r\n}\r\n\r\nexport function Counter({\r\n value,\r\n fontSize = 100,\r\n padding = 0,\r\n places = [100, 10, 1],\r\n gap = 8,\r\n textColor = \"#000000\",\r\n fontWeight = 900,\r\n containerStyle,\r\n digitStyle,\r\n}: CounterProps) {\r\n const height = fontSize + padding;\r\n\r\n return (\r\n <div style={{ display: \"flex\", gap, fontSize, color: textColor, fontWeight, ...containerStyle }}>\r\n {places.map((place) => (\r\n <Digit key={place} place={place} value={value} height={height} digitStyle={digitStyle} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport default Counter;\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),framerMotion=require('framer-motion'),jsxRuntime=require('react/jsx-runtime');function F({text:r,speed:w=50,maxIterations:y=10,sequential:S=false,revealDirection:N="start",useOriginalCharsOnly:I=false,characters:x="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+",className:L="",parentClassName:P="",encryptedClassName:C="",animateOn:f="hover",...k}){let[T,h]=react.useState(r),[g,M]=react.useState(false),[A,m]=react.useState(false),[R,z]=react.useState(new Set),[H,j]=react.useState(false),D=react.useRef(null);react.useEffect(()=>{let o,i=0,l=s=>{let a=r.length;switch(N){case "start":return s.size;case "end":return a-1-s.size;case "center":{let n=Math.floor(a/2),t=Math.floor(s.size/2),c=s.size%2===0?n+t:n-t-1;if(c>=0&&c<a&&!s.has(c))return c;for(let e=0;e<a;e++)if(!s.has(e))return e;return 0}default:return s.size}},b=I?Array.from(new Set(r.split(""))).filter(s=>s!==" "):x.split(""),d=(s,a)=>{if(I){let n=s.split("").map((e,u)=>({char:e,isSpace:e===" ",index:u,isRevealed:a.has(u)})),t=n.filter(e=>!e.isSpace&&!e.isRevealed).map(e=>e.char);for(let e=t.length-1;e>0;e--){let u=Math.floor(Math.random()*(e+1));[t[e],t[u]]=[t[u],t[e]];}let c=0;return n.map(e=>e.isSpace?" ":e.isRevealed?s[e.index]:t[c++]).join("")}else return s.split("").map((n,t)=>n===" "?" ":a.has(t)?s[t]:b[Math.floor(Math.random()*b.length)]).join("")};return g?(m(true),o=setInterval(()=>{z(s=>{if(S)if(s.size<r.length){let a=l(s),n=new Set(s);return n.add(a),h(d(r,n)),n}else return clearInterval(o),m(false),s;else return h(d(r,s)),i++,i>=y&&(clearInterval(o),m(false),h(r)),s});},w)):(h(r),z(new Set),m(false)),()=>{o&&clearInterval(o);}},[g,r,w,y,S,N,x,I]),react.useEffect(()=>{if(f!=="view"&&f!=="both")return;let o=b=>{b.forEach(d=>{d.isIntersecting&&!H&&(M(true),j(true));});},i=new IntersectionObserver(o,{threshold:.1}),l=D.current;return l&&i.observe(l),()=>{l&&i.unobserve(l);}},[f,H]);let J=f==="hover"||f==="both"?{onMouseEnter:()=>M(true),onMouseLeave:()=>M(false)}:{};return jsxRuntime.jsxs(framerMotion.motion.span,{className:P,ref:D,style:{display:"inline-block",whiteSpace:"pre-wrap"},...J,...k,children:[jsxRuntime.jsx("span",{className:"sr-only",children:T}),jsxRuntime.jsx("span",{"aria-hidden":"true",children:T.split("").map((o,i)=>{let l=R.has(i)||!A||!g;return jsxRuntime.jsx("span",{className:l?L:C,children:o},i)})})]})}var V=F;exports.DecryptedText=F;exports.default=V;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/decrypted-text/index.tsx"],"names":["DecryptedText","text","speed","maxIterations","sequential","revealDirection","useOriginalCharsOnly","characters","className","parentClassName","encryptedClassName","animateOn","props","displayText","setDisplayText","useState","isHovering","setIsHovering","isScrambling","setIsScrambling","revealedIndices","setRevealedIndices","hasAnimated","setHasAnimated","containerRef","useRef","useEffect","interval","currentIteration","getNextIndex","revealedSet","textLength","middle","offset","nextIndex","i","availableChars","char","shuffleText","originalText","currentRevealed","positions","nonSpaceChars","p","j","charIndex","prevRevealed","newRevealed","observerCallback","entries","entry","observer","currentRef","hoverProps","jsxs","motion","jsx","index","isRevealedOrDone","decrypted_text_default"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\r\n\r\nimport { useEffect, useState, useRef } from \"react\";\r\nimport { motion, HTMLMotionProps } from \"framer-motion\";\r\n\r\ninterface DecryptedTextProps extends HTMLMotionProps<\"span\"> {\r\n text: string;\r\n speed?: number;\r\n maxIterations?: number;\r\n sequential?: boolean;\r\n revealDirection?: \"start\" | \"end\" | \"center\";\r\n useOriginalCharsOnly?: boolean;\r\n characters?: string;\r\n className?: string;\r\n parentClassName?: string;\r\n encryptedClassName?: string;\r\n animateOn?: \"view\" | \"hover\" | \"both\";\r\n}\r\n\r\nexport function DecryptedText({\r\n text,\r\n speed = 50,\r\n maxIterations = 10,\r\n sequential = false,\r\n revealDirection = \"start\",\r\n useOriginalCharsOnly = false,\r\n characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+\",\r\n className = \"\",\r\n parentClassName = \"\",\r\n encryptedClassName = \"\",\r\n animateOn = \"hover\",\r\n ...props\r\n}: DecryptedTextProps) {\r\n const [displayText, setDisplayText] = useState<string>(text);\r\n const [isHovering, setIsHovering] = useState<boolean>(false);\r\n const [isScrambling, setIsScrambling] = useState<boolean>(false);\r\n const [revealedIndices, setRevealedIndices] = useState<Set<number>>(new Set());\r\n const [hasAnimated, setHasAnimated] = useState<boolean>(false);\r\n const containerRef = useRef<HTMLSpanElement>(null);\r\n\r\n useEffect(() => {\r\n let interval: NodeJS.Timeout;\r\n let currentIteration = 0;\r\n\r\n const getNextIndex = (revealedSet: Set<number>): number => {\r\n const textLength = text.length;\r\n switch (revealDirection) {\r\n case \"start\":\r\n return revealedSet.size;\r\n case \"end\":\r\n return textLength - 1 - revealedSet.size;\r\n case \"center\": {\r\n const middle = Math.floor(textLength / 2);\r\n const offset = Math.floor(revealedSet.size / 2);\r\n const nextIndex = revealedSet.size % 2 === 0 ? middle + offset : middle - offset - 1;\r\n if (nextIndex >= 0 && nextIndex < textLength && !revealedSet.has(nextIndex)) {\r\n return nextIndex;\r\n }\r\n for (let i = 0; i < textLength; i++) {\r\n if (!revealedSet.has(i)) return i;\r\n }\r\n return 0;\r\n }\r\n default:\r\n return revealedSet.size;\r\n }\r\n };\r\n\r\n const availableChars = useOriginalCharsOnly\r\n ? Array.from(new Set(text.split(\"\"))).filter((char) => char !== \" \")\r\n : characters.split(\"\");\r\n\r\n const shuffleText = (originalText: string, currentRevealed: Set<number>): string => {\r\n if (useOriginalCharsOnly) {\r\n const positions = originalText.split(\"\").map((char, i) => ({\r\n char,\r\n isSpace: char === \" \",\r\n index: i,\r\n isRevealed: currentRevealed.has(i),\r\n }));\r\n\r\n const nonSpaceChars = positions.filter((p) => !p.isSpace && !p.isRevealed).map((p) => p.char);\r\n\r\n for (let i = nonSpaceChars.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [nonSpaceChars[i], nonSpaceChars[j]] = [nonSpaceChars[j], nonSpaceChars[i]];\r\n }\r\n\r\n let charIndex = 0;\r\n return positions\r\n .map((p) => {\r\n if (p.isSpace) return \" \";\r\n if (p.isRevealed) return originalText[p.index];\r\n return nonSpaceChars[charIndex++];\r\n })\r\n .join(\"\");\r\n } else {\r\n return originalText\r\n .split(\"\")\r\n .map((char, i) => {\r\n if (char === \" \") return \" \";\r\n if (currentRevealed.has(i)) return originalText[i];\r\n return availableChars[Math.floor(Math.random() * availableChars.length)];\r\n })\r\n .join(\"\");\r\n }\r\n };\r\n\r\n if (isHovering) {\r\n setIsScrambling(true);\r\n interval = setInterval(() => {\r\n setRevealedIndices((prevRevealed) => {\r\n if (sequential) {\r\n if (prevRevealed.size < text.length) {\r\n const nextIndex = getNextIndex(prevRevealed);\r\n const newRevealed = new Set(prevRevealed);\r\n newRevealed.add(nextIndex);\r\n setDisplayText(shuffleText(text, newRevealed));\r\n return newRevealed;\r\n } else {\r\n clearInterval(interval);\r\n setIsScrambling(false);\r\n return prevRevealed;\r\n }\r\n } else {\r\n setDisplayText(shuffleText(text, prevRevealed));\r\n currentIteration++;\r\n if (currentIteration >= maxIterations) {\r\n clearInterval(interval);\r\n setIsScrambling(false);\r\n setDisplayText(text);\r\n }\r\n return prevRevealed;\r\n }\r\n });\r\n }, speed);\r\n } else {\r\n setDisplayText(text);\r\n setRevealedIndices(new Set());\r\n setIsScrambling(false);\r\n }\r\n\r\n return () => {\r\n if (interval) clearInterval(interval);\r\n };\r\n }, [isHovering, text, speed, maxIterations, sequential, revealDirection, characters, useOriginalCharsOnly]);\r\n\r\n useEffect(() => {\r\n if (animateOn !== \"view\" && animateOn !== \"both\") return;\r\n\r\n const observerCallback = (entries: IntersectionObserverEntry[]) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting && !hasAnimated) {\r\n setIsHovering(true);\r\n setHasAnimated(true);\r\n }\r\n });\r\n };\r\n\r\n const observer = new IntersectionObserver(observerCallback, { threshold: 0.1 });\r\n const currentRef = containerRef.current;\r\n if (currentRef) {\r\n observer.observe(currentRef);\r\n }\r\n\r\n return () => {\r\n if (currentRef) {\r\n observer.unobserve(currentRef);\r\n }\r\n };\r\n }, [animateOn, hasAnimated]);\r\n\r\n const hoverProps =\r\n animateOn === \"hover\" || animateOn === \"both\"\r\n ? {\r\n onMouseEnter: () => setIsHovering(true),\r\n onMouseLeave: () => setIsHovering(false),\r\n }\r\n : {};\r\n\r\n return (\r\n <motion.span\r\n className={parentClassName}\r\n ref={containerRef}\r\n style={{ display: \"inline-block\", whiteSpace: \"pre-wrap\" }}\r\n {...hoverProps}\r\n {...props}\r\n >\r\n <span className=\"sr-only\">{displayText}</span>\r\n <span aria-hidden=\"true\">\r\n {displayText.split(\"\").map((char, index) => {\r\n const isRevealedOrDone = revealedIndices.has(index) || !isScrambling || !isHovering;\r\n return (\r\n <span key={index} className={isRevealedOrDone ? className : encryptedClassName}>\r\n {char}\r\n </span>\r\n );\r\n })}\r\n </span>\r\n </motion.span>\r\n );\r\n}\r\n\r\nexport default DecryptedText;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useState,useRef,useEffect}from'react';import {motion}from'framer-motion';import {jsxs,jsx}from'react/jsx-runtime';function F({text:r,speed:w=50,maxIterations:y=10,sequential:S=false,revealDirection:N="start",useOriginalCharsOnly:I=false,characters:x="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+",className:L="",parentClassName:P="",encryptedClassName:C="",animateOn:f="hover",...k}){let[T,h]=useState(r),[g,M]=useState(false),[A,m]=useState(false),[R,z]=useState(new Set),[H,j]=useState(false),D=useRef(null);useEffect(()=>{let o,i=0,l=s=>{let a=r.length;switch(N){case "start":return s.size;case "end":return a-1-s.size;case "center":{let n=Math.floor(a/2),t=Math.floor(s.size/2),c=s.size%2===0?n+t:n-t-1;if(c>=0&&c<a&&!s.has(c))return c;for(let e=0;e<a;e++)if(!s.has(e))return e;return 0}default:return s.size}},b=I?Array.from(new Set(r.split(""))).filter(s=>s!==" "):x.split(""),d=(s,a)=>{if(I){let n=s.split("").map((e,u)=>({char:e,isSpace:e===" ",index:u,isRevealed:a.has(u)})),t=n.filter(e=>!e.isSpace&&!e.isRevealed).map(e=>e.char);for(let e=t.length-1;e>0;e--){let u=Math.floor(Math.random()*(e+1));[t[e],t[u]]=[t[u],t[e]];}let c=0;return n.map(e=>e.isSpace?" ":e.isRevealed?s[e.index]:t[c++]).join("")}else return s.split("").map((n,t)=>n===" "?" ":a.has(t)?s[t]:b[Math.floor(Math.random()*b.length)]).join("")};return g?(m(true),o=setInterval(()=>{z(s=>{if(S)if(s.size<r.length){let a=l(s),n=new Set(s);return n.add(a),h(d(r,n)),n}else return clearInterval(o),m(false),s;else return h(d(r,s)),i++,i>=y&&(clearInterval(o),m(false),h(r)),s});},w)):(h(r),z(new Set),m(false)),()=>{o&&clearInterval(o);}},[g,r,w,y,S,N,x,I]),useEffect(()=>{if(f!=="view"&&f!=="both")return;let o=b=>{b.forEach(d=>{d.isIntersecting&&!H&&(M(true),j(true));});},i=new IntersectionObserver(o,{threshold:.1}),l=D.current;return l&&i.observe(l),()=>{l&&i.unobserve(l);}},[f,H]);let J=f==="hover"||f==="both"?{onMouseEnter:()=>M(true),onMouseLeave:()=>M(false)}:{};return jsxs(motion.span,{className:P,ref:D,style:{display:"inline-block",whiteSpace:"pre-wrap"},...J,...k,children:[jsx("span",{className:"sr-only",children:T}),jsx("span",{"aria-hidden":"true",children:T.split("").map((o,i)=>{let l=R.has(i)||!A||!g;return jsx("span",{className:l?L:C,children:o},i)})})]})}var V=F;export{F as DecryptedText,V as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/decrypted-text/index.tsx"],"names":["DecryptedText","text","speed","maxIterations","sequential","revealDirection","useOriginalCharsOnly","characters","className","parentClassName","encryptedClassName","animateOn","props","displayText","setDisplayText","useState","isHovering","setIsHovering","isScrambling","setIsScrambling","revealedIndices","setRevealedIndices","hasAnimated","setHasAnimated","containerRef","useRef","useEffect","interval","currentIteration","getNextIndex","revealedSet","textLength","middle","offset","nextIndex","i","availableChars","char","shuffleText","originalText","currentRevealed","positions","nonSpaceChars","p","j","charIndex","prevRevealed","newRevealed","observerCallback","entries","entry","observer","currentRef","hoverProps","jsxs","motion","jsx","index","isRevealedOrDone","decrypted_text_default"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\";\r\n\r\nimport { useEffect, useState, useRef } from \"react\";\r\nimport { motion, HTMLMotionProps } from \"framer-motion\";\r\n\r\ninterface DecryptedTextProps extends HTMLMotionProps<\"span\"> {\r\n text: string;\r\n speed?: number;\r\n maxIterations?: number;\r\n sequential?: boolean;\r\n revealDirection?: \"start\" | \"end\" | \"center\";\r\n useOriginalCharsOnly?: boolean;\r\n characters?: string;\r\n className?: string;\r\n parentClassName?: string;\r\n encryptedClassName?: string;\r\n animateOn?: \"view\" | \"hover\" | \"both\";\r\n}\r\n\r\nexport function DecryptedText({\r\n text,\r\n speed = 50,\r\n maxIterations = 10,\r\n sequential = false,\r\n revealDirection = \"start\",\r\n useOriginalCharsOnly = false,\r\n characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+\",\r\n className = \"\",\r\n parentClassName = \"\",\r\n encryptedClassName = \"\",\r\n animateOn = \"hover\",\r\n ...props\r\n}: DecryptedTextProps) {\r\n const [displayText, setDisplayText] = useState<string>(text);\r\n const [isHovering, setIsHovering] = useState<boolean>(false);\r\n const [isScrambling, setIsScrambling] = useState<boolean>(false);\r\n const [revealedIndices, setRevealedIndices] = useState<Set<number>>(new Set());\r\n const [hasAnimated, setHasAnimated] = useState<boolean>(false);\r\n const containerRef = useRef<HTMLSpanElement>(null);\r\n\r\n useEffect(() => {\r\n let interval: NodeJS.Timeout;\r\n let currentIteration = 0;\r\n\r\n const getNextIndex = (revealedSet: Set<number>): number => {\r\n const textLength = text.length;\r\n switch (revealDirection) {\r\n case \"start\":\r\n return revealedSet.size;\r\n case \"end\":\r\n return textLength - 1 - revealedSet.size;\r\n case \"center\": {\r\n const middle = Math.floor(textLength / 2);\r\n const offset = Math.floor(revealedSet.size / 2);\r\n const nextIndex = revealedSet.size % 2 === 0 ? middle + offset : middle - offset - 1;\r\n if (nextIndex >= 0 && nextIndex < textLength && !revealedSet.has(nextIndex)) {\r\n return nextIndex;\r\n }\r\n for (let i = 0; i < textLength; i++) {\r\n if (!revealedSet.has(i)) return i;\r\n }\r\n return 0;\r\n }\r\n default:\r\n return revealedSet.size;\r\n }\r\n };\r\n\r\n const availableChars = useOriginalCharsOnly\r\n ? Array.from(new Set(text.split(\"\"))).filter((char) => char !== \" \")\r\n : characters.split(\"\");\r\n\r\n const shuffleText = (originalText: string, currentRevealed: Set<number>): string => {\r\n if (useOriginalCharsOnly) {\r\n const positions = originalText.split(\"\").map((char, i) => ({\r\n char,\r\n isSpace: char === \" \",\r\n index: i,\r\n isRevealed: currentRevealed.has(i),\r\n }));\r\n\r\n const nonSpaceChars = positions.filter((p) => !p.isSpace && !p.isRevealed).map((p) => p.char);\r\n\r\n for (let i = nonSpaceChars.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [nonSpaceChars[i], nonSpaceChars[j]] = [nonSpaceChars[j], nonSpaceChars[i]];\r\n }\r\n\r\n let charIndex = 0;\r\n return positions\r\n .map((p) => {\r\n if (p.isSpace) return \" \";\r\n if (p.isRevealed) return originalText[p.index];\r\n return nonSpaceChars[charIndex++];\r\n })\r\n .join(\"\");\r\n } else {\r\n return originalText\r\n .split(\"\")\r\n .map((char, i) => {\r\n if (char === \" \") return \" \";\r\n if (currentRevealed.has(i)) return originalText[i];\r\n return availableChars[Math.floor(Math.random() * availableChars.length)];\r\n })\r\n .join(\"\");\r\n }\r\n };\r\n\r\n if (isHovering) {\r\n setIsScrambling(true);\r\n interval = setInterval(() => {\r\n setRevealedIndices((prevRevealed) => {\r\n if (sequential) {\r\n if (prevRevealed.size < text.length) {\r\n const nextIndex = getNextIndex(prevRevealed);\r\n const newRevealed = new Set(prevRevealed);\r\n newRevealed.add(nextIndex);\r\n setDisplayText(shuffleText(text, newRevealed));\r\n return newRevealed;\r\n } else {\r\n clearInterval(interval);\r\n setIsScrambling(false);\r\n return prevRevealed;\r\n }\r\n } else {\r\n setDisplayText(shuffleText(text, prevRevealed));\r\n currentIteration++;\r\n if (currentIteration >= maxIterations) {\r\n clearInterval(interval);\r\n setIsScrambling(false);\r\n setDisplayText(text);\r\n }\r\n return prevRevealed;\r\n }\r\n });\r\n }, speed);\r\n } else {\r\n setDisplayText(text);\r\n setRevealedIndices(new Set());\r\n setIsScrambling(false);\r\n }\r\n\r\n return () => {\r\n if (interval) clearInterval(interval);\r\n };\r\n }, [isHovering, text, speed, maxIterations, sequential, revealDirection, characters, useOriginalCharsOnly]);\r\n\r\n useEffect(() => {\r\n if (animateOn !== \"view\" && animateOn !== \"both\") return;\r\n\r\n const observerCallback = (entries: IntersectionObserverEntry[]) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting && !hasAnimated) {\r\n setIsHovering(true);\r\n setHasAnimated(true);\r\n }\r\n });\r\n };\r\n\r\n const observer = new IntersectionObserver(observerCallback, { threshold: 0.1 });\r\n const currentRef = containerRef.current;\r\n if (currentRef) {\r\n observer.observe(currentRef);\r\n }\r\n\r\n return () => {\r\n if (currentRef) {\r\n observer.unobserve(currentRef);\r\n }\r\n };\r\n }, [animateOn, hasAnimated]);\r\n\r\n const hoverProps =\r\n animateOn === \"hover\" || animateOn === \"both\"\r\n ? {\r\n onMouseEnter: () => setIsHovering(true),\r\n onMouseLeave: () => setIsHovering(false),\r\n }\r\n : {};\r\n\r\n return (\r\n <motion.span\r\n className={parentClassName}\r\n ref={containerRef}\r\n style={{ display: \"inline-block\", whiteSpace: \"pre-wrap\" }}\r\n {...hoverProps}\r\n {...props}\r\n >\r\n <span className=\"sr-only\">{displayText}</span>\r\n <span aria-hidden=\"true\">\r\n {displayText.split(\"\").map((char, index) => {\r\n const isRevealedOrDone = revealedIndices.has(index) || !isScrambling || !isHovering;\r\n return (\r\n <span key={index} className={isRevealedOrDone ? className : encryptedClassName}>\r\n {char}\r\n </span>\r\n );\r\n })}\r\n </span>\r\n </motion.span>\r\n );\r\n}\r\n\r\nexport default DecryptedText;\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 n(...e){return tailwindMerge.twMerge(clsx.clsx(e))}function h({className:e,children:r,direction:o="middle"}){let t={top:"items-start",middle:"items-center",bottom:"items-end"};return jsxRuntime.jsx(framerMotion.motion.div,{className:n("mx-auto w-max mt-8 h-[58px] p-2 flex gap-2 rounded-2xl border","supports-backdrop-blur:bg-white/10 supports-backdrop-blur:dark:bg-black/10 backdrop-blur-md","border-gray-200 bg-gray-50/80 dark:border-gray-800 dark:bg-gray-900/80",t[o],e),children:r})}function I({size:e=40,magnification:r=60,distance:o=140,children:t,className:d}){let i=react.useRef(null),s=framerMotion.useMotionValue(1/0),c=framerMotion.useSpring(framerMotion.useTransform(s,[-o,0,o],[e,r,e]),{mass:.1,stiffness:150,damping:12});return jsxRuntime.jsx(framerMotion.motion.div,{ref:i,style:{width:c},onMouseMove:u=>s.set(u.pageX-i.current.offsetLeft-c.get()/2),onMouseLeave:()=>s.set(1/0),className:n("flex aspect-square cursor-pointer items-center justify-center rounded-full",d),children:t})}exports.Dock=h;exports.DockIcon=I;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/dock/index.tsx"],"names":["cn","inputs","twMerge","clsx","Dock","className","children","direction","directionClasses","jsx","motion","DockIcon","size","magnification","distance","ref","useRef","mouseX","useMotionValue","width","useSpring","useTransform","e"],"mappings":"mLAGO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,sBAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CCOO,SAASG,CAAAA,CAAK,CAAE,SAAA,CAAAC,CAAAA,CAAW,QAAA,CAAAC,CAAAA,CAAU,UAAAC,CAAAA,CAAY,QAAS,CAAA,CAAc,CAC7E,IAAMC,CAAAA,CAAmB,CACvB,GAAA,CAAK,aAAA,CACL,OAAQ,cAAA,CACR,MAAA,CAAQ,WACV,CAAA,CAEA,OACEC,eAACC,mBAAAA,CAAO,GAAA,CAAP,CACC,SAAA,CAAWV,EACT,+DAAA,CACA,6FAAA,CACA,yEACAQ,CAAAA,CAAiBD,CAAS,EAC1BF,CACF,CAAA,CAEC,QAAA,CAAAC,CAAAA,CACH,CAEJ,CAUO,SAASK,EAAS,CACvB,IAAA,CAAAC,EAAO,EAAA,CACP,aAAA,CAAAC,CAAAA,CAAgB,EAAA,CAChB,SAAAC,CAAAA,CAAW,GAAA,CACX,QAAA,CAAAR,CAAAA,CACA,UAAAD,CACF,CAAA,CAAkB,CAChB,IAAMU,EAAMC,YAAAA,CAAuB,IAAI,EACjCC,CAAAA,CAASC,2BAAAA,CAAe,GAAQ,CAAA,CAEhCC,CAAAA,CAAQC,sBAAAA,CACZC,yBAAAA,CAAaJ,EAAQ,CAAC,CAACH,EAAU,CAAA,CAAGA,CAAQ,EAAG,CAACF,CAAAA,CAAMC,CAAAA,CAAeD,CAAI,CAAC,CAAA,CAC1E,CAAE,KAAM,EAAA,CAAK,SAAA,CAAW,IAAK,OAAA,CAAS,EAAG,CAC3C,CAAA,CAEA,OACEH,cAAAA,CAACC,mBAAAA,CAAO,GAAA,CAAP,CACC,IAAKK,CAAAA,CACL,KAAA,CAAO,CAAE,KAAA,CAAAI,CAAM,CAAA,CACf,WAAA,CAAcG,GAAML,CAAAA,CAAO,GAAA,CAAIK,EAAE,KAAA,CAAQP,CAAAA,CAAI,OAAA,CAAS,UAAA,CAAaI,EAAM,GAAA,EAAI,CAAI,CAAC,CAAA,CAClF,YAAA,CAAc,IAAMF,CAAAA,CAAO,GAAA,CAAI,CAAA,CAAA,CAAQ,CAAA,CACvC,UAAWjB,CAAAA,CAAG,4EAAA,CAA8EK,CAAS,CAAA,CAEpG,QAAA,CAAAC,EACH,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, { useRef } from \"react\";\r\nimport { motion, useMotionValue, useSpring, useTransform } from \"framer-motion\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\nexport interface DockProps {\r\n className?: string;\r\n children: React.ReactNode;\r\n direction?: \"top\" | \"middle\" | \"bottom\";\r\n}\r\n\r\nexport function Dock({ className, children, direction = \"middle\" }: DockProps) {\r\n const directionClasses = {\r\n top: \"items-start\",\r\n middle: \"items-center\",\r\n bottom: \"items-end\",\r\n };\r\n\r\n return (\r\n <motion.div\r\n className={cn(\r\n \"mx-auto w-max mt-8 h-[58px] p-2 flex gap-2 rounded-2xl border\",\r\n \"supports-backdrop-blur:bg-white/10 supports-backdrop-blur:dark:bg-black/10 backdrop-blur-md\",\r\n \"border-gray-200 bg-gray-50/80 dark:border-gray-800 dark:bg-gray-900/80\",\r\n directionClasses[direction],\r\n className\r\n )}\r\n >\r\n {children}\r\n </motion.div>\r\n );\r\n}\r\n\r\nexport interface DockIconProps {\r\n size?: number;\r\n magnification?: number;\r\n distance?: number;\r\n children?: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function DockIcon({\r\n size = 40,\r\n magnification = 60,\r\n distance = 140,\r\n children,\r\n className,\r\n}: DockIconProps) {\r\n const ref = useRef<HTMLDivElement>(null);\r\n const mouseX = useMotionValue(Infinity);\r\n\r\n const width = useSpring(\r\n useTransform(mouseX, [-distance, 0, distance], [size, magnification, size]),\r\n { mass: 0.1, stiffness: 150, damping: 12 }\r\n );\r\n\r\n return (\r\n <motion.div\r\n ref={ref}\r\n style={{ width }}\r\n onMouseMove={(e) => mouseX.set(e.pageX - ref.current!.offsetLeft - width.get() / 2)}\r\n onMouseLeave={() => mouseX.set(Infinity)}\r\n className={cn(\"flex aspect-square cursor-pointer items-center justify-center rounded-full\", className)}\r\n >\r\n {children}\r\n </motion.div>\r\n );\r\n}\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useRef}from'react';import {motion,useMotionValue,useSpring,useTransform}from'framer-motion';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx}from'react/jsx-runtime';function n(...e){return twMerge(clsx(e))}function h({className:e,children:r,direction:o="middle"}){let t={top:"items-start",middle:"items-center",bottom:"items-end"};return jsx(motion.div,{className:n("mx-auto w-max mt-8 h-[58px] p-2 flex gap-2 rounded-2xl border","supports-backdrop-blur:bg-white/10 supports-backdrop-blur:dark:bg-black/10 backdrop-blur-md","border-gray-200 bg-gray-50/80 dark:border-gray-800 dark:bg-gray-900/80",t[o],e),children:r})}function I({size:e=40,magnification:r=60,distance:o=140,children:t,className:d}){let i=useRef(null),s=useMotionValue(1/0),c=useSpring(useTransform(s,[-o,0,o],[e,r,e]),{mass:.1,stiffness:150,damping:12});return jsx(motion.div,{ref:i,style:{width:c},onMouseMove:u=>s.set(u.pageX-i.current.offsetLeft-c.get()/2),onMouseLeave:()=>s.set(1/0),className:n("flex aspect-square cursor-pointer items-center justify-center rounded-full",d),children:t})}export{h as Dock,I as DockIcon};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/dock/index.tsx"],"names":["cn","inputs","twMerge","clsx","Dock","className","children","direction","directionClasses","jsx","motion","DockIcon","size","magnification","distance","ref","useRef","mouseX","useMotionValue","width","useSpring","useTransform","e"],"mappings":"qMAGO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAAsB,CAC1C,OAAOC,QAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCOO,SAASG,CAAAA,CAAK,CAAE,SAAA,CAAAC,CAAAA,CAAW,QAAA,CAAAC,CAAAA,CAAU,UAAAC,CAAAA,CAAY,QAAS,CAAA,CAAc,CAC7E,IAAMC,CAAAA,CAAmB,CACvB,GAAA,CAAK,aAAA,CACL,OAAQ,cAAA,CACR,MAAA,CAAQ,WACV,CAAA,CAEA,OACEC,IAACC,MAAAA,CAAO,GAAA,CAAP,CACC,SAAA,CAAWV,EACT,+DAAA,CACA,6FAAA,CACA,yEACAQ,CAAAA,CAAiBD,CAAS,EAC1BF,CACF,CAAA,CAEC,QAAA,CAAAC,CAAAA,CACH,CAEJ,CAUO,SAASK,EAAS,CACvB,IAAA,CAAAC,EAAO,EAAA,CACP,aAAA,CAAAC,CAAAA,CAAgB,EAAA,CAChB,SAAAC,CAAAA,CAAW,GAAA,CACX,QAAA,CAAAR,CAAAA,CACA,UAAAD,CACF,CAAA,CAAkB,CAChB,IAAMU,EAAMC,MAAAA,CAAuB,IAAI,EACjCC,CAAAA,CAASC,cAAAA,CAAe,GAAQ,CAAA,CAEhCC,CAAAA,CAAQC,SAAAA,CACZC,YAAAA,CAAaJ,EAAQ,CAAC,CAACH,EAAU,CAAA,CAAGA,CAAQ,EAAG,CAACF,CAAAA,CAAMC,CAAAA,CAAeD,CAAI,CAAC,CAAA,CAC1E,CAAE,KAAM,EAAA,CAAK,SAAA,CAAW,IAAK,OAAA,CAAS,EAAG,CAC3C,CAAA,CAEA,OACEH,GAAAA,CAACC,MAAAA,CAAO,GAAA,CAAP,CACC,IAAKK,CAAAA,CACL,KAAA,CAAO,CAAE,KAAA,CAAAI,CAAM,CAAA,CACf,WAAA,CAAcG,GAAML,CAAAA,CAAO,GAAA,CAAIK,EAAE,KAAA,CAAQP,CAAAA,CAAI,OAAA,CAAS,UAAA,CAAaI,EAAM,GAAA,EAAI,CAAI,CAAC,CAAA,CAClF,YAAA,CAAc,IAAMF,CAAAA,CAAO,GAAA,CAAI,CAAA,CAAA,CAAQ,CAAA,CACvC,UAAWjB,CAAAA,CAAG,4EAAA,CAA8EK,CAAS,CAAA,CAEpG,QAAA,CAAAC,EACH,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, { useRef } from \"react\";\r\nimport { motion, useMotionValue, useSpring, useTransform } from \"framer-motion\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\nexport interface DockProps {\r\n className?: string;\r\n children: React.ReactNode;\r\n direction?: \"top\" | \"middle\" | \"bottom\";\r\n}\r\n\r\nexport function Dock({ className, children, direction = \"middle\" }: DockProps) {\r\n const directionClasses = {\r\n top: \"items-start\",\r\n middle: \"items-center\",\r\n bottom: \"items-end\",\r\n };\r\n\r\n return (\r\n <motion.div\r\n className={cn(\r\n \"mx-auto w-max mt-8 h-[58px] p-2 flex gap-2 rounded-2xl border\",\r\n \"supports-backdrop-blur:bg-white/10 supports-backdrop-blur:dark:bg-black/10 backdrop-blur-md\",\r\n \"border-gray-200 bg-gray-50/80 dark:border-gray-800 dark:bg-gray-900/80\",\r\n directionClasses[direction],\r\n className\r\n )}\r\n >\r\n {children}\r\n </motion.div>\r\n );\r\n}\r\n\r\nexport interface DockIconProps {\r\n size?: number;\r\n magnification?: number;\r\n distance?: number;\r\n children?: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function DockIcon({\r\n size = 40,\r\n magnification = 60,\r\n distance = 140,\r\n children,\r\n className,\r\n}: DockIconProps) {\r\n const ref = useRef<HTMLDivElement>(null);\r\n const mouseX = useMotionValue(Infinity);\r\n\r\n const width = useSpring(\r\n useTransform(mouseX, [-distance, 0, distance], [size, magnification, size]),\r\n { mass: 0.1, stiffness: 150, damping: 12 }\r\n );\r\n\r\n return (\r\n <motion.div\r\n ref={ref}\r\n style={{ width }}\r\n onMouseMove={(e) => mouseX.set(e.pageX - ref.current!.offsetLeft - width.get() / 2)}\r\n onMouseLeave={() => mouseX.set(Infinity)}\r\n className={cn(\"flex aspect-square cursor-pointer items-center justify-center rounded-full\", className)}\r\n >\r\n {children}\r\n </motion.div>\r\n );\r\n}\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var react=require('react'),framerMotion=require('framer-motion'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime');function r(...t){return tailwindMerge.twMerge(clsx.clsx(t))}function g({isOpen:t,onClose:i,children:c,className:m,position:o="right"}){react.useEffect(()=>{let a=f=>{f.key==="Escape"&&i();};return t&&(document.addEventListener("keydown",a),document.body.style.overflow="hidden"),()=>{document.removeEventListener("keydown",a),document.body.style.overflow="unset";}},[t,i]);let n={left:{initial:{x:"-100%"},animate:{x:0},exit:{x:"-100%"}},right:{initial:{x:"100%"},animate:{x:0},exit:{x:"100%"}},bottom:{initial:{y:"100%"},animate:{y:0},exit:{y:"100%"}}},d={left:"left-0 top-0 h-full w-80",right:"right-0 top-0 h-full w-80",bottom:"bottom-0 left-0 right-0 h-auto max-h-[80vh]"};return jsxRuntime.jsx(framerMotion.AnimatePresence,{children:t&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(framerMotion.motion.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},onClick:i,className:"fixed inset-0 bg-black/50 z-50"}),jsxRuntime.jsxs(framerMotion.motion.div,{initial:n[o].initial,animate:n[o].animate,exit:n[o].exit,transition:{type:"spring",damping:25,stiffness:300},className:r("fixed z-50 p-6","bg-white dark:bg-zinc-900","shadow-xl",d[o],m),children:[jsxRuntime.jsx("button",{onClick:i,className:"absolute top-4 right-4 p-1 rounded-lg hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors",children:jsxRuntime.jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})}),c]})]})})}var z=g;exports.Drawer=g;exports.default=z;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/drawer/index.tsx"],"names":["cn","inputs","twMerge","clsx","Drawer","isOpen","onClose","children","className","position","useEffect","handleEscape","e","variants","positionClasses","jsx","AnimatePresence","jsxs","Fragment","motion","drawer_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 { useEffect } from \"react\";\r\nimport { motion, AnimatePresence } from \"framer-motion\";\r\nimport { cn } from \"../utils/cn\";\r\n\r\ninterface DrawerProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n children: React.ReactNode;\r\n className?: string;\r\n position?: \"left\" | \"right\" | \"bottom\";\r\n}\r\n\r\nexport function Drawer({ isOpen, onClose, children, className, position = \"right\" }: DrawerProps) {\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") onClose();\r\n };\r\n if (isOpen) {\r\n document.addEventListener(\"keydown\", handleEscape);\r\n document.body.style.overflow = \"hidden\";\r\n }\r\n return () => {\r\n document.removeEventListener(\"keydown\", handleEscape);\r\n document.body.style.overflow = \"unset\";\r\n };\r\n }, [isOpen, onClose]);\r\n\r\n const variants = {\r\n left: { initial: { x: \"-100%\" }, animate: { x: 0 }, exit: { x: \"-100%\" } },\r\n right: { initial: { x: \"100%\" }, animate: { x: 0 }, exit: { x: \"100%\" } },\r\n bottom: { initial: { y: \"100%\" }, animate: { y: 0 }, exit: { y: \"100%\" } },\r\n };\r\n\r\n const positionClasses = {\r\n left: \"left-0 top-0 h-full w-80\",\r\n right: \"right-0 top-0 h-full w-80\",\r\n bottom: \"bottom-0 left-0 right-0 h-auto max-h-[80vh]\",\r\n };\r\n\r\n return (\r\n <AnimatePresence>\r\n {isOpen && (\r\n <>\r\n <motion.div\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: 1 }}\r\n exit={{ opacity: 0 }}\r\n onClick={onClose}\r\n className=\"fixed inset-0 bg-black/50 z-50\"\r\n />\r\n <motion.div\r\n initial={variants[position].initial}\r\n animate={variants[position].animate}\r\n exit={variants[position].exit}\r\n transition={{ type: \"spring\", damping: 25, stiffness: 300 }}\r\n className={cn(\r\n \"fixed z-50 p-6\",\r\n \"bg-white dark:bg-zinc-900\",\r\n \"shadow-xl\",\r\n positionClasses[position],\r\n className\r\n )}\r\n >\r\n <button\r\n onClick={onClose}\r\n className=\"absolute top-4 right-4 p-1 rounded-lg hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors\"\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n {children}\r\n </motion.div>\r\n </>\r\n )}\r\n </AnimatePresence>\r\n );\r\n}\r\n\r\nexport default Drawer;\r\n"]}
@@ -0,0 +1,2 @@
1
+ import {useEffect}from'react';import {AnimatePresence,motion}from'framer-motion';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs,Fragment}from'react/jsx-runtime';function r(...t){return twMerge(clsx(t))}function g({isOpen:t,onClose:i,children:c,className:m,position:o="right"}){useEffect(()=>{let a=f=>{f.key==="Escape"&&i();};return t&&(document.addEventListener("keydown",a),document.body.style.overflow="hidden"),()=>{document.removeEventListener("keydown",a),document.body.style.overflow="unset";}},[t,i]);let n={left:{initial:{x:"-100%"},animate:{x:0},exit:{x:"-100%"}},right:{initial:{x:"100%"},animate:{x:0},exit:{x:"100%"}},bottom:{initial:{y:"100%"},animate:{y:0},exit:{y:"100%"}}},d={left:"left-0 top-0 h-full w-80",right:"right-0 top-0 h-full w-80",bottom:"bottom-0 left-0 right-0 h-auto max-h-[80vh]"};return jsx(AnimatePresence,{children:t&&jsxs(Fragment,{children:[jsx(motion.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},onClick:i,className:"fixed inset-0 bg-black/50 z-50"}),jsxs(motion.div,{initial:n[o].initial,animate:n[o].animate,exit:n[o].exit,transition:{type:"spring",damping:25,stiffness:300},className:r("fixed z-50 p-6","bg-white dark:bg-zinc-900","shadow-xl",d[o],m),children:[jsx("button",{onClick:i,className:"absolute top-4 right-4 p-1 rounded-lg hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors",children:jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})}),c]})]})})}var z=g;export{g as Drawer,z as default};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map