@blueshift-gg/ui-components 0.1.1 → 0.1.3

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 (209) hide show
  1. package/dist/Alert.d.mts +19 -0
  2. package/dist/Alert.d.ts +19 -0
  3. package/dist/Alert.js +99 -0
  4. package/dist/Alert.js.map +1 -0
  5. package/dist/Alert.mjs +93 -0
  6. package/dist/Alert.mjs.map +1 -0
  7. package/dist/Avatar.d.mts +2 -2
  8. package/dist/Avatar.d.ts +2 -2
  9. package/dist/Avatar.js +2 -2
  10. package/dist/Avatar.js.map +1 -1
  11. package/dist/Avatar.mjs +2 -2
  12. package/dist/Avatar.mjs.map +1 -1
  13. package/dist/Badge.d.mts +4 -4
  14. package/dist/Badge.d.ts +4 -4
  15. package/dist/Badge.js +3 -3
  16. package/dist/Badge.js.map +1 -1
  17. package/dist/Badge.mjs +3 -3
  18. package/dist/Badge.mjs.map +1 -1
  19. package/dist/Button.d.mts +1 -1
  20. package/dist/Button.d.ts +1 -1
  21. package/dist/Button.js.map +1 -1
  22. package/dist/Button.mjs.map +1 -1
  23. package/dist/Checkbox.js.map +1 -1
  24. package/dist/Checkbox.mjs.map +1 -1
  25. package/dist/Codeblock.js.map +1 -1
  26. package/dist/Codeblock.mjs.map +1 -1
  27. package/dist/CrossHair.js.map +1 -1
  28. package/dist/CrossHair.mjs.map +1 -1
  29. package/dist/DecryptText.js.map +1 -1
  30. package/dist/DecryptText.mjs.map +1 -1
  31. package/dist/Divider.js.map +1 -1
  32. package/dist/Divider.mjs.map +1 -1
  33. package/dist/Dropdown.d.mts +1 -1
  34. package/dist/Dropdown.d.ts +1 -1
  35. package/dist/Dropdown.js.map +1 -1
  36. package/dist/Dropdown.mjs.map +1 -1
  37. package/dist/GridLines.js +1 -1
  38. package/dist/GridLines.js.map +1 -1
  39. package/dist/GridLines.mjs +1 -1
  40. package/dist/GridLines.mjs.map +1 -1
  41. package/dist/HeadingReveal.d.mts +15 -0
  42. package/dist/HeadingReveal.d.ts +15 -0
  43. package/dist/HeadingReveal.js +68 -0
  44. package/dist/HeadingReveal.js.map +1 -0
  45. package/dist/HeadingReveal.mjs +62 -0
  46. package/dist/HeadingReveal.mjs.map +1 -0
  47. package/dist/Icon.d.mts +1 -1
  48. package/dist/Icon.d.ts +1 -1
  49. package/dist/Input.d.mts +1 -1
  50. package/dist/Input.d.ts +1 -1
  51. package/dist/Input.js.map +1 -1
  52. package/dist/Input.mjs.map +1 -1
  53. package/dist/Logo.js.map +1 -1
  54. package/dist/Logo.mjs.map +1 -1
  55. package/dist/Pagination.js.map +1 -1
  56. package/dist/Pagination.mjs.map +1 -1
  57. package/dist/Slider.d.mts +1 -1
  58. package/dist/Slider.d.ts +1 -1
  59. package/dist/Slider.js.map +1 -1
  60. package/dist/Slider.mjs.map +1 -1
  61. package/dist/Tabs.d.mts +1 -1
  62. package/dist/Tabs.d.ts +1 -1
  63. package/dist/Tabs.js.map +1 -1
  64. package/dist/Tabs.mjs.map +1 -1
  65. package/dist/Toast.d.mts +1 -1
  66. package/dist/Toast.d.ts +1 -1
  67. package/dist/Toast.js +2 -3
  68. package/dist/Toast.js.map +1 -1
  69. package/dist/Toast.mjs +2 -3
  70. package/dist/Toast.mjs.map +1 -1
  71. package/dist/Tooltip.js.map +1 -1
  72. package/dist/Tooltip.mjs.map +1 -1
  73. package/dist/icons/Anchor.d.mts +1 -1
  74. package/dist/icons/Anchor.d.ts +1 -1
  75. package/dist/icons/ArrowLeft.d.mts +1 -1
  76. package/dist/icons/ArrowLeft.d.ts +1 -1
  77. package/dist/icons/ArrowRight.d.mts +1 -1
  78. package/dist/icons/ArrowRight.d.ts +1 -1
  79. package/dist/icons/Assembly.d.mts +1 -1
  80. package/dist/icons/Assembly.d.ts +1 -1
  81. package/dist/icons/Challenge.d.mts +1 -1
  82. package/dist/icons/Challenge.d.ts +1 -1
  83. package/dist/icons/Chevron.d.mts +1 -1
  84. package/dist/icons/Chevron.d.ts +1 -1
  85. package/dist/icons/ChevronLeft.d.mts +1 -1
  86. package/dist/icons/ChevronLeft.d.ts +1 -1
  87. package/dist/icons/ChevronRight.d.mts +1 -1
  88. package/dist/icons/ChevronRight.d.ts +1 -1
  89. package/dist/icons/Claim.d.mts +1 -1
  90. package/dist/icons/Claim.d.ts +1 -1
  91. package/dist/icons/Claimed.d.mts +1 -1
  92. package/dist/icons/Claimed.d.ts +1 -1
  93. package/dist/icons/Close.d.mts +1 -1
  94. package/dist/icons/Close.d.ts +1 -1
  95. package/dist/icons/Code.d.mts +1 -1
  96. package/dist/icons/Code.d.ts +1 -1
  97. package/dist/icons/Copy.d.mts +1 -1
  98. package/dist/icons/Copy.d.ts +1 -1
  99. package/dist/icons/Developer.d.mts +1 -1
  100. package/dist/icons/Developer.d.ts +1 -1
  101. package/dist/icons/Difficulty.d.mts +1 -1
  102. package/dist/icons/Difficulty.d.ts +1 -1
  103. package/dist/icons/Discord.d.mts +1 -1
  104. package/dist/icons/Discord.d.ts +1 -1
  105. package/dist/icons/Dollar.d.mts +1 -1
  106. package/dist/icons/Dollar.d.ts +1 -1
  107. package/dist/icons/DoubleArrow.d.mts +1 -1
  108. package/dist/icons/DoubleArrow.d.ts +1 -1
  109. package/dist/icons/EVM.d.mts +1 -1
  110. package/dist/icons/EVM.d.ts +1 -1
  111. package/dist/icons/Email.d.mts +1 -1
  112. package/dist/icons/Email.d.ts +1 -1
  113. package/dist/icons/Error.d.mts +1 -1
  114. package/dist/icons/Error.d.ts +1 -1
  115. package/dist/icons/External.d.mts +1 -1
  116. package/dist/icons/External.d.ts +1 -1
  117. package/dist/icons/Filter.d.mts +1 -1
  118. package/dist/icons/Filter.d.ts +1 -1
  119. package/dist/icons/Firmware.d.mts +1 -1
  120. package/dist/icons/Firmware.d.ts +1 -1
  121. package/dist/icons/Flag.d.mts +1 -1
  122. package/dist/icons/Flag.d.ts +1 -1
  123. package/dist/icons/Flame.d.mts +1 -1
  124. package/dist/icons/Flame.d.ts +1 -1
  125. package/dist/icons/Flexible.d.mts +1 -1
  126. package/dist/icons/Flexible.d.ts +1 -1
  127. package/dist/icons/Free.d.mts +1 -1
  128. package/dist/icons/Free.d.ts +1 -1
  129. package/dist/icons/General.d.mts +1 -1
  130. package/dist/icons/General.d.ts +1 -1
  131. package/dist/icons/Github.d.mts +1 -1
  132. package/dist/icons/Github.d.ts +1 -1
  133. package/dist/icons/GridView.d.mts +1 -1
  134. package/dist/icons/GridView.d.ts +1 -1
  135. package/dist/icons/Heart.d.mts +1 -1
  136. package/dist/icons/Heart.d.ts +1 -1
  137. package/dist/icons/Info.d.mts +1 -1
  138. package/dist/icons/Info.d.ts +1 -1
  139. package/dist/icons/Language.d.mts +1 -1
  140. package/dist/icons/Language.d.ts +1 -1
  141. package/dist/icons/Lessons.d.mts +1 -1
  142. package/dist/icons/Lessons.d.ts +1 -1
  143. package/dist/icons/Link.d.mts +1 -1
  144. package/dist/icons/Link.d.ts +1 -1
  145. package/dist/icons/ListView.d.mts +1 -1
  146. package/dist/icons/ListView.d.ts +1 -1
  147. package/dist/icons/Loading.d.mts +1 -1
  148. package/dist/icons/Loading.d.ts +1 -1
  149. package/dist/icons/Locked.d.mts +1 -1
  150. package/dist/icons/Locked.d.ts +1 -1
  151. package/dist/icons/Mentor.d.mts +1 -1
  152. package/dist/icons/Mentor.d.ts +1 -1
  153. package/dist/icons/Modular.d.mts +1 -1
  154. package/dist/icons/Modular.d.ts +1 -1
  155. package/dist/icons/NFT.d.mts +1 -1
  156. package/dist/icons/NFT.d.ts +1 -1
  157. package/dist/icons/Online.d.mts +1 -1
  158. package/dist/icons/Online.d.ts +1 -1
  159. package/dist/icons/Password.d.mts +1 -1
  160. package/dist/icons/Password.d.ts +1 -1
  161. package/dist/icons/Product.d.mts +1 -1
  162. package/dist/icons/Product.d.ts +1 -1
  163. package/dist/icons/Progress.d.mts +1 -1
  164. package/dist/icons/Progress.d.ts +1 -1
  165. package/dist/icons/Protocol.d.mts +1 -1
  166. package/dist/icons/Protocol.d.ts +1 -1
  167. package/dist/icons/Rewards.d.mts +1 -1
  168. package/dist/icons/Rewards.d.ts +1 -1
  169. package/dist/icons/Rust.d.mts +1 -1
  170. package/dist/icons/Rust.d.ts +1 -1
  171. package/dist/icons/Search.d.mts +1 -1
  172. package/dist/icons/Search.d.ts +1 -1
  173. package/dist/icons/SmartContract.d.mts +1 -1
  174. package/dist/icons/SmartContract.d.ts +1 -1
  175. package/dist/icons/Solana.d.mts +1 -1
  176. package/dist/icons/Solana.d.ts +1 -1
  177. package/dist/icons/Success.d.mts +1 -1
  178. package/dist/icons/Success.d.ts +1 -1
  179. package/dist/icons/SuccessCircle.d.mts +1 -1
  180. package/dist/icons/SuccessCircle.d.ts +1 -1
  181. package/dist/icons/Table.d.mts +1 -1
  182. package/dist/icons/Table.d.ts +1 -1
  183. package/dist/icons/Target.d.mts +1 -1
  184. package/dist/icons/Target.d.ts +1 -1
  185. package/dist/icons/Training.d.mts +1 -1
  186. package/dist/icons/Training.d.ts +1 -1
  187. package/dist/icons/Typescript.d.mts +1 -1
  188. package/dist/icons/Typescript.d.ts +1 -1
  189. package/dist/icons/Unclaimed.d.mts +1 -1
  190. package/dist/icons/Unclaimed.d.ts +1 -1
  191. package/dist/icons/Upload.d.mts +1 -1
  192. package/dist/icons/Upload.d.ts +1 -1
  193. package/dist/icons/Wallet.d.mts +1 -1
  194. package/dist/icons/Wallet.d.ts +1 -1
  195. package/dist/icons/WalletSmall.d.mts +1 -1
  196. package/dist/icons/WalletSmall.d.ts +1 -1
  197. package/dist/icons/Warning.d.mts +1 -1
  198. package/dist/icons/Warning.d.ts +1 -1
  199. package/dist/icons/X.d.mts +1 -1
  200. package/dist/icons/X.d.ts +1 -1
  201. package/dist/icons/index.d.mts +1 -1
  202. package/dist/icons/index.d.ts +1 -1
  203. package/dist/index.d.mts +3 -1
  204. package/dist/index.d.ts +3 -1
  205. package/dist/index.js +10 -0
  206. package/dist/index.mjs +2 -0
  207. package/package.json +12 -10
  208. package/dist/{index-DWGhkMUQ.d.mts → Icon-CTxwWbdC.d.mts} +8 -8
  209. package/dist/{index-ekBNDG0H.d.ts → Icon-llWd6yMa.d.ts} +8 -8
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Checkbox.tsx"],"names":["jsxs","jsx","classNames","AnimatePresence","motion","crisp"],"mappings":";;;;;;;;;;;AAYO,MAAM,WAAW,CAAC;AAAA,EACvB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,KAAqB;AACnB,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAA+C;AACxE,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,IACnC;AAAA,EACF,CAAA;AAEA,EAAA,sCACG,KAAA,EAAA,EAAI,SAAA,EAAU,qDACb,QAAA,kBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oCAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,UAAA;AAAA,QACL,OAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA,EAAU,iBAAA;AAAA,QACV,SAAA,EAAWC,2BAAA;AAAA,UACT,SAAA;AAAA,UACA,4SAAA;AAAA,UACA;AAAA,YACE,6GACE,KAAA,KAAU,SAAA;AAAA,YACZ,2FACE,KAAA,KAAU;AAAA;AACd;AACF;AAAA,KACF;AAAA,IACC,OAAA,oBACCD,cAAA,CAACE,qBAAA,EAAA,EAAgB,IAAA,EAAK,WAAA,EACpB,QAAA,kBAAAF,cAAA;AAAA,MAACG,YAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAChC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAChC,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,MAAMC,aAAA,EAAM;AAAA,QACzC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAC7B,SAAA,EAAWH,2BAAA;AAAA,UACT,+HAAA;AAAA,UACA;AAAA,YACE,oBAAoB,KAAA,KAAU,SAAA;AAAA,YAC9B,sBAAsB,KAAA,KAAU;AAAA;AAClC;AACF;AAAA,KACD,EACH;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ","file":"Checkbox.js","sourcesContent":["import classNames from \"classnames\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { crisp } from \"./utils/easings\";\n\nexport type CheckboxProps = {\n checked: boolean;\n className?: string;\n disabled?: boolean;\n handleChange?: (checked: boolean) => void;\n theme?: \"primary\" | \"secondary\";\n};\n\nexport const Checkbox = ({\n checked,\n className,\n disabled,\n handleChange,\n theme = \"primary\",\n}: CheckboxProps) => {\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (handleChange) {\n handleChange(event.target.checked);\n }\n };\n\n return (\n <div className=\"flex h-[14px] w-[14px] flex-shrink-0 items-center\">\n <div className=\"group grid size-[14px] grid-cols-1\">\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={handleInputChange}\n className={classNames(\n className,\n \"border-shade-mute col-start-1 row-start-1 appearance-none border-[1.5px] bg-transparent transition duration-100 ease-in-out checked:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 disabled:border-[1.5px] disabled:bg-card-solid disabled:opacity-40 forced-colors:appearance-auto\",\n {\n \"checked:border-brand-secondary indeterminate:border-brand-secondary focus-visible:outline-brand-secondary\":\n theme === \"primary\",\n \"checked:border-secondary indeterminate:border-secondary focus-visible:outline-secondary\":\n theme === \"secondary\",\n }\n )}\n />\n {checked && (\n <AnimatePresence mode=\"popLayout\">\n <motion.div\n initial={{ opacity: 0, scale: 0 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.1, ease: crisp }}\n exit={{ opacity: 0, scale: 0 }}\n className={classNames(\n \"pointer-events-none col-start-1 row-start-1 size-1 self-center justify-self-center opacity-0 group-has-[:checked]:opacity-100\",\n {\n \"bg-brand-primary\": theme === \"primary\",\n \"bg-shade-secondary\": theme === \"secondary\",\n }\n )}\n ></motion.div>\n </AnimatePresence>\n )}\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/Checkbox.tsx"],"names":["jsxs","jsx","classNames","AnimatePresence","motion","crisp"],"mappings":";;;;;;;;;;;AAcO,MAAM,WAAW,CAAC;AAAA,EACvB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,KAAqB;AACnB,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAA+C;AACxE,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,IACnC;AAAA,EACF,CAAA;AAEA,EAAA,sCACG,KAAA,EAAA,EAAI,SAAA,EAAU,qDACb,QAAA,kBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oCAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,UAAA;AAAA,QACL,OAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA,EAAU,iBAAA;AAAA,QACV,SAAA,EAAWC,2BAAA;AAAA,UACT,SAAA;AAAA,UACA,4SAAA;AAAA,UACA;AAAA,YACE,6GACE,KAAA,KAAU,SAAA;AAAA,YACZ,2FACE,KAAA,KAAU;AAAA;AACd;AACF;AAAA,KACF;AAAA,IACC,OAAA,oBACCD,cAAA,CAACE,qBAAA,EAAA,EAAgB,IAAA,EAAK,WAAA,EACpB,QAAA,kBAAAF,cAAA;AAAA,MAACG,YAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAChC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAChC,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,MAAMC,aAAA,EAAM;AAAA,QACzC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAC7B,SAAA,EAAWH,2BAAA;AAAA,UACT,+HAAA;AAAA,UACA;AAAA,YACE,oBAAoB,KAAA,KAAU,SAAA;AAAA,YAC9B,sBAAsB,KAAA,KAAU;AAAA;AAClC;AACF;AAAA,KACD,EACH;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ","file":"Checkbox.js","sourcesContent":["\"use client\";\n\nimport classNames from \"classnames\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { crisp } from \"./utils/easings\";\n\nexport type CheckboxProps = {\n checked: boolean;\n className?: string;\n disabled?: boolean;\n handleChange?: (checked: boolean) => void;\n theme?: \"primary\" | \"secondary\";\n};\n\nexport const Checkbox = ({\n checked,\n className,\n disabled,\n handleChange,\n theme = \"primary\",\n}: CheckboxProps) => {\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (handleChange) {\n handleChange(event.target.checked);\n }\n };\n\n return (\n <div className=\"flex h-[14px] w-[14px] flex-shrink-0 items-center\">\n <div className=\"group grid size-[14px] grid-cols-1\">\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={handleInputChange}\n className={classNames(\n className,\n \"border-shade-mute col-start-1 row-start-1 appearance-none border-[1.5px] bg-transparent transition duration-100 ease-in-out checked:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 disabled:border-[1.5px] disabled:bg-card-solid disabled:opacity-40 forced-colors:appearance-auto\",\n {\n \"checked:border-brand-secondary indeterminate:border-brand-secondary focus-visible:outline-brand-secondary\":\n theme === \"primary\",\n \"checked:border-secondary indeterminate:border-secondary focus-visible:outline-secondary\":\n theme === \"secondary\",\n }\n )}\n />\n {checked && (\n <AnimatePresence mode=\"popLayout\">\n <motion.div\n initial={{ opacity: 0, scale: 0 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.1, ease: crisp }}\n exit={{ opacity: 0, scale: 0 }}\n className={classNames(\n \"pointer-events-none col-start-1 row-start-1 size-1 self-center justify-self-center opacity-0 group-has-[:checked]:opacity-100\",\n {\n \"bg-brand-primary\": theme === \"primary\",\n \"bg-shade-secondary\": theme === \"secondary\",\n }\n )}\n ></motion.div>\n </AnimatePresence>\n )}\n </div>\n </div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Checkbox.tsx"],"names":[],"mappings":";;;;;AAYO,MAAM,WAAW,CAAC;AAAA,EACvB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,KAAqB;AACnB,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAA+C;AACxE,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,IACnC;AAAA,EACF,CAAA;AAEA,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,qDACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oCAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,UAAA;AAAA,QACL,OAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA,EAAU,iBAAA;AAAA,QACV,SAAA,EAAW,UAAA;AAAA,UACT,SAAA;AAAA,UACA,4SAAA;AAAA,UACA;AAAA,YACE,6GACE,KAAA,KAAU,SAAA;AAAA,YACZ,2FACE,KAAA,KAAU;AAAA;AACd;AACF;AAAA,KACF;AAAA,IACC,OAAA,oBACC,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAK,WAAA,EACpB,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAChC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAChC,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,MAAM,KAAA,EAAM;AAAA,QACzC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAC7B,SAAA,EAAW,UAAA;AAAA,UACT,+HAAA;AAAA,UACA;AAAA,YACE,oBAAoB,KAAA,KAAU,SAAA;AAAA,YAC9B,sBAAsB,KAAA,KAAU;AAAA;AAClC;AACF;AAAA,KACD,EACH;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ","file":"Checkbox.mjs","sourcesContent":["import classNames from \"classnames\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { crisp } from \"./utils/easings\";\n\nexport type CheckboxProps = {\n checked: boolean;\n className?: string;\n disabled?: boolean;\n handleChange?: (checked: boolean) => void;\n theme?: \"primary\" | \"secondary\";\n};\n\nexport const Checkbox = ({\n checked,\n className,\n disabled,\n handleChange,\n theme = \"primary\",\n}: CheckboxProps) => {\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (handleChange) {\n handleChange(event.target.checked);\n }\n };\n\n return (\n <div className=\"flex h-[14px] w-[14px] flex-shrink-0 items-center\">\n <div className=\"group grid size-[14px] grid-cols-1\">\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={handleInputChange}\n className={classNames(\n className,\n \"border-shade-mute col-start-1 row-start-1 appearance-none border-[1.5px] bg-transparent transition duration-100 ease-in-out checked:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 disabled:border-[1.5px] disabled:bg-card-solid disabled:opacity-40 forced-colors:appearance-auto\",\n {\n \"checked:border-brand-secondary indeterminate:border-brand-secondary focus-visible:outline-brand-secondary\":\n theme === \"primary\",\n \"checked:border-secondary indeterminate:border-secondary focus-visible:outline-secondary\":\n theme === \"secondary\",\n }\n )}\n />\n {checked && (\n <AnimatePresence mode=\"popLayout\">\n <motion.div\n initial={{ opacity: 0, scale: 0 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.1, ease: crisp }}\n exit={{ opacity: 0, scale: 0 }}\n className={classNames(\n \"pointer-events-none col-start-1 row-start-1 size-1 self-center justify-self-center opacity-0 group-has-[:checked]:opacity-100\",\n {\n \"bg-brand-primary\": theme === \"primary\",\n \"bg-shade-secondary\": theme === \"secondary\",\n }\n )}\n ></motion.div>\n </AnimatePresence>\n )}\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/Checkbox.tsx"],"names":[],"mappings":";;;;;AAcO,MAAM,WAAW,CAAC;AAAA,EACvB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,KAAqB;AACnB,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAA+C;AACxE,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,IACnC;AAAA,EACF,CAAA;AAEA,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,qDACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oCAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,UAAA;AAAA,QACL,OAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA,EAAU,iBAAA;AAAA,QACV,SAAA,EAAW,UAAA;AAAA,UACT,SAAA;AAAA,UACA,4SAAA;AAAA,UACA;AAAA,YACE,6GACE,KAAA,KAAU,SAAA;AAAA,YACZ,2FACE,KAAA,KAAU;AAAA;AACd;AACF;AAAA,KACF;AAAA,IACC,OAAA,oBACC,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAK,WAAA,EACpB,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAChC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAChC,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,MAAM,KAAA,EAAM;AAAA,QACzC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAC7B,SAAA,EAAW,UAAA;AAAA,UACT,+HAAA;AAAA,UACA;AAAA,YACE,oBAAoB,KAAA,KAAU,SAAA;AAAA,YAC9B,sBAAsB,KAAA,KAAU;AAAA;AAClC;AACF;AAAA,KACD,EACH;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ","file":"Checkbox.mjs","sourcesContent":["\"use client\";\n\nimport classNames from \"classnames\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { crisp } from \"./utils/easings\";\n\nexport type CheckboxProps = {\n checked: boolean;\n className?: string;\n disabled?: boolean;\n handleChange?: (checked: boolean) => void;\n theme?: \"primary\" | \"secondary\";\n};\n\nexport const Checkbox = ({\n checked,\n className,\n disabled,\n handleChange,\n theme = \"primary\",\n}: CheckboxProps) => {\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (handleChange) {\n handleChange(event.target.checked);\n }\n };\n\n return (\n <div className=\"flex h-[14px] w-[14px] flex-shrink-0 items-center\">\n <div className=\"group grid size-[14px] grid-cols-1\">\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={handleInputChange}\n className={classNames(\n className,\n \"border-shade-mute col-start-1 row-start-1 appearance-none border-[1.5px] bg-transparent transition duration-100 ease-in-out checked:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 disabled:border-[1.5px] disabled:bg-card-solid disabled:opacity-40 forced-colors:appearance-auto\",\n {\n \"checked:border-brand-secondary indeterminate:border-brand-secondary focus-visible:outline-brand-secondary\":\n theme === \"primary\",\n \"checked:border-secondary indeterminate:border-secondary focus-visible:outline-secondary\":\n theme === \"secondary\",\n }\n )}\n />\n {checked && (\n <AnimatePresence mode=\"popLayout\">\n <motion.div\n initial={{ opacity: 0, scale: 0 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.1, ease: crisp }}\n exit={{ opacity: 0, scale: 0 }}\n className={classNames(\n \"pointer-events-none col-start-1 row-start-1 size-1 self-center justify-self-center opacity-0 group-has-[:checked]:opacity-100\",\n {\n \"bg-brand-primary\": theme === \"primary\",\n \"bg-shade-secondary\": theme === \"secondary\",\n }\n )}\n ></motion.div>\n </AnimatePresence>\n )}\n </div>\n </div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Codeblock.tsx"],"names":["useCopyToClipboard","useState","jsxs","motion","classNames","jsx","CrosshairCorners","Icon","AnimatePresence","silk"],"mappings":"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","file":"Codeblock.js","sourcesContent":["import { AnimatePresence, motion, MotionProps } from \"motion/react\";\nimport classNames from \"classnames\";\nimport { CrosshairCorners } from \"./CrossHair\";\nimport { Icon } from \"./Icon\";\nimport { useCopyToClipboard } from \"usehooks-ts\";\nimport { useState } from \"react\";\nimport { silk } from \"./utils/easings\";\nimport { GridLines } from \"./GridLines\";\n\nexport type CodeblockProps = {\n code: string;\n language: \"Rust\" | \"Typescript\" | \"Assembly\";\n animation?: MotionProps;\n};\n\nexport const Codeblock = ({ code, language, animation }: CodeblockProps) => {\n const [_, copyToClipboard] = useCopyToClipboard();\n const [isCopied, setIsCopied] = useState(false);\n const handleCopy = () => {\n copyToClipboard(code);\n setIsCopied(true);\n setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n };\n return (\n <motion.div\n className={classNames(\n \"relative bg-card-foreground w-full flex flex-col gap-y-6 gradient-border before:bg-card-border pt-3 pb-6\",\n language === \"Rust\" && \"text-brand-rust\",\n language === \"Typescript\" && \"text-brand-typescript\",\n language === \"Assembly\" && \"text-brand-assembly\"\n )}\n {...animation}\n >\n <motion.div className=\"px-3.5 py-2 bg-current/5 border border-current/15 flex items-center justify-between relative\">\n <CrosshairCorners\n animationDelay={0}\n animationDuration={0.5}\n variant=\"bordered\"\n size={6}\n spacingX={1}\n />\n <div className=\"flex items-center gap-x-2\">\n <Icon\n name={language}\n className=\"flex-shrink-0 text-current\"\n size={16}\n />\n <span className=\"font-mono text-sm\">{language}</span>\n </div>\n\n <div\n onClick={() => handleCopy()}\n className=\"w-[16px] h-[16px] text-shade-secondary hover:text-shade-primary relative z-10\"\n >\n <AnimatePresence mode=\"popLayout\">\n <motion.div\n initial={{ opacity: 0, filter: \"blur(4px)\", scale: 0.4 }}\n animate={{ opacity: 1, filter: \"blur(0px)\", scale: 1 }}\n exit={{ opacity: 0, filter: \"blur(4px)\", scale: 0.4 }}\n transition={{ duration: 0.2, ease: silk }}\n key={isCopied ? \"copied\" : \"copy\"}\n >\n {isCopied ? (\n <Icon name=\"Success\" size={16} />\n ) : (\n <Icon name=\"Copy\" size={16} />\n )}\n </motion.div>\n </AnimatePresence>\n </div>\n </motion.div>\n <div className=\"inset-0 absolute bg-gradient-to-b from-current/8 via-transparent to-transparent\"></div>\n <pre className=\"px-6 font-mono-code\">{code}</pre>\n </motion.div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/Codeblock.tsx"],"names":["useCopyToClipboard","useState","jsxs","motion","classNames","jsx","CrosshairCorners","Icon","AnimatePresence","silk"],"mappings":"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","file":"Codeblock.js","sourcesContent":["\"use client\";\n\nimport { AnimatePresence, motion, MotionProps } from \"motion/react\";\nimport classNames from \"classnames\";\nimport { CrosshairCorners } from \"./CrossHair\";\nimport { Icon } from \"./Icon\";\nimport { useCopyToClipboard } from \"usehooks-ts\";\nimport { useState } from \"react\";\nimport { silk } from \"./utils/easings\";\nimport { GridLines } from \"./GridLines\";\n\nexport type CodeblockProps = {\n code: string;\n language: \"Rust\" | \"Typescript\" | \"Assembly\";\n animation?: MotionProps;\n};\n\nexport const Codeblock = ({ code, language, animation }: CodeblockProps) => {\n const [_, copyToClipboard] = useCopyToClipboard();\n const [isCopied, setIsCopied] = useState(false);\n const handleCopy = () => {\n copyToClipboard(code);\n setIsCopied(true);\n setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n };\n return (\n <motion.div\n className={classNames(\n \"relative bg-card-foreground w-full flex flex-col gap-y-6 gradient-border before:bg-card-border pt-3 pb-6\",\n language === \"Rust\" && \"text-brand-rust\",\n language === \"Typescript\" && \"text-brand-typescript\",\n language === \"Assembly\" && \"text-brand-assembly\"\n )}\n {...animation}\n >\n <motion.div className=\"px-3.5 py-2 bg-current/5 border border-current/15 flex items-center justify-between relative\">\n <CrosshairCorners\n animationDelay={0}\n animationDuration={0.5}\n variant=\"bordered\"\n size={6}\n spacingX={1}\n />\n <div className=\"flex items-center gap-x-2\">\n <Icon\n name={language}\n className=\"flex-shrink-0 text-current\"\n size={16}\n />\n <span className=\"font-mono text-sm\">{language}</span>\n </div>\n\n <div\n onClick={() => handleCopy()}\n className=\"w-[16px] h-[16px] text-shade-secondary hover:text-shade-primary relative z-10\"\n >\n <AnimatePresence mode=\"popLayout\">\n <motion.div\n initial={{ opacity: 0, filter: \"blur(4px)\", scale: 0.4 }}\n animate={{ opacity: 1, filter: \"blur(0px)\", scale: 1 }}\n exit={{ opacity: 0, filter: \"blur(4px)\", scale: 0.4 }}\n transition={{ duration: 0.2, ease: silk }}\n key={isCopied ? \"copied\" : \"copy\"}\n >\n {isCopied ? (\n <Icon name=\"Success\" size={16} />\n ) : (\n <Icon name=\"Copy\" size={16} />\n )}\n </motion.div>\n </AnimatePresence>\n </div>\n </motion.div>\n <div className=\"inset-0 absolute bg-gradient-to-b from-current/8 via-transparent to-transparent\"></div>\n <pre className=\"px-6 font-mono-code\">{code}</pre>\n </motion.div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Codeblock.tsx"],"names":[],"mappings":"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","file":"Codeblock.mjs","sourcesContent":["import { AnimatePresence, motion, MotionProps } from \"motion/react\";\nimport classNames from \"classnames\";\nimport { CrosshairCorners } from \"./CrossHair\";\nimport { Icon } from \"./Icon\";\nimport { useCopyToClipboard } from \"usehooks-ts\";\nimport { useState } from \"react\";\nimport { silk } from \"./utils/easings\";\nimport { GridLines } from \"./GridLines\";\n\nexport type CodeblockProps = {\n code: string;\n language: \"Rust\" | \"Typescript\" | \"Assembly\";\n animation?: MotionProps;\n};\n\nexport const Codeblock = ({ code, language, animation }: CodeblockProps) => {\n const [_, copyToClipboard] = useCopyToClipboard();\n const [isCopied, setIsCopied] = useState(false);\n const handleCopy = () => {\n copyToClipboard(code);\n setIsCopied(true);\n setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n };\n return (\n <motion.div\n className={classNames(\n \"relative bg-card-foreground w-full flex flex-col gap-y-6 gradient-border before:bg-card-border pt-3 pb-6\",\n language === \"Rust\" && \"text-brand-rust\",\n language === \"Typescript\" && \"text-brand-typescript\",\n language === \"Assembly\" && \"text-brand-assembly\"\n )}\n {...animation}\n >\n <motion.div className=\"px-3.5 py-2 bg-current/5 border border-current/15 flex items-center justify-between relative\">\n <CrosshairCorners\n animationDelay={0}\n animationDuration={0.5}\n variant=\"bordered\"\n size={6}\n spacingX={1}\n />\n <div className=\"flex items-center gap-x-2\">\n <Icon\n name={language}\n className=\"flex-shrink-0 text-current\"\n size={16}\n />\n <span className=\"font-mono text-sm\">{language}</span>\n </div>\n\n <div\n onClick={() => handleCopy()}\n className=\"w-[16px] h-[16px] text-shade-secondary hover:text-shade-primary relative z-10\"\n >\n <AnimatePresence mode=\"popLayout\">\n <motion.div\n initial={{ opacity: 0, filter: \"blur(4px)\", scale: 0.4 }}\n animate={{ opacity: 1, filter: \"blur(0px)\", scale: 1 }}\n exit={{ opacity: 0, filter: \"blur(4px)\", scale: 0.4 }}\n transition={{ duration: 0.2, ease: silk }}\n key={isCopied ? \"copied\" : \"copy\"}\n >\n {isCopied ? (\n <Icon name=\"Success\" size={16} />\n ) : (\n <Icon name=\"Copy\" size={16} />\n )}\n </motion.div>\n </AnimatePresence>\n </div>\n </motion.div>\n <div className=\"inset-0 absolute bg-gradient-to-b from-current/8 via-transparent to-transparent\"></div>\n <pre className=\"px-6 font-mono-code\">{code}</pre>\n </motion.div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/Codeblock.tsx"],"names":[],"mappings":"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","file":"Codeblock.mjs","sourcesContent":["\"use client\";\n\nimport { AnimatePresence, motion, MotionProps } from \"motion/react\";\nimport classNames from \"classnames\";\nimport { CrosshairCorners } from \"./CrossHair\";\nimport { Icon } from \"./Icon\";\nimport { useCopyToClipboard } from \"usehooks-ts\";\nimport { useState } from \"react\";\nimport { silk } from \"./utils/easings\";\nimport { GridLines } from \"./GridLines\";\n\nexport type CodeblockProps = {\n code: string;\n language: \"Rust\" | \"Typescript\" | \"Assembly\";\n animation?: MotionProps;\n};\n\nexport const Codeblock = ({ code, language, animation }: CodeblockProps) => {\n const [_, copyToClipboard] = useCopyToClipboard();\n const [isCopied, setIsCopied] = useState(false);\n const handleCopy = () => {\n copyToClipboard(code);\n setIsCopied(true);\n setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n };\n return (\n <motion.div\n className={classNames(\n \"relative bg-card-foreground w-full flex flex-col gap-y-6 gradient-border before:bg-card-border pt-3 pb-6\",\n language === \"Rust\" && \"text-brand-rust\",\n language === \"Typescript\" && \"text-brand-typescript\",\n language === \"Assembly\" && \"text-brand-assembly\"\n )}\n {...animation}\n >\n <motion.div className=\"px-3.5 py-2 bg-current/5 border border-current/15 flex items-center justify-between relative\">\n <CrosshairCorners\n animationDelay={0}\n animationDuration={0.5}\n variant=\"bordered\"\n size={6}\n spacingX={1}\n />\n <div className=\"flex items-center gap-x-2\">\n <Icon\n name={language}\n className=\"flex-shrink-0 text-current\"\n size={16}\n />\n <span className=\"font-mono text-sm\">{language}</span>\n </div>\n\n <div\n onClick={() => handleCopy()}\n className=\"w-[16px] h-[16px] text-shade-secondary hover:text-shade-primary relative z-10\"\n >\n <AnimatePresence mode=\"popLayout\">\n <motion.div\n initial={{ opacity: 0, filter: \"blur(4px)\", scale: 0.4 }}\n animate={{ opacity: 1, filter: \"blur(0px)\", scale: 1 }}\n exit={{ opacity: 0, filter: \"blur(4px)\", scale: 0.4 }}\n transition={{ duration: 0.2, ease: silk }}\n key={isCopied ? \"copied\" : \"copy\"}\n >\n {isCopied ? (\n <Icon name=\"Success\" size={16} />\n ) : (\n <Icon name=\"Copy\" size={16} />\n )}\n </motion.div>\n </AnimatePresence>\n </div>\n </motion.div>\n <div className=\"inset-0 absolute bg-gradient-to-b from-current/8 via-transparent to-transparent\"></div>\n <pre className=\"px-6 font-mono-code\">{code}</pre>\n </motion.div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/CrossHair.tsx"],"names":["jsx","motion","classNames","anticipate","jsxs","Fragment"],"mappings":"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","file":"CrossHair.js","sourcesContent":["import classNames from \"classnames\";\nimport { anticipate, motion } from \"motion/react\";\n\nexport type CrosshairCornersProps = {\n size?: number;\n spacingX?: number;\n spacingY?: number;\n animationDelay?: number;\n thickness?: number;\n animationDuration?: number;\n variant?: \"corners\" | \"cross\" | \"bordered\";\n corners?: (\"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\")[];\n borders?: (\"left\" | \"right\")[];\n className?: string;\n moveDistance?: number;\n key?: string;\n};\n\nexport const CrosshairCorners = ({\n size = 10,\n spacingX = 0,\n animationDelay = 2.5,\n spacingY = 0,\n className = \"\",\n moveDistance = 5,\n thickness,\n animationDuration = 2.15,\n key,\n variant = \"corners\",\n corners = [\"top-left\", \"top-right\", \"bottom-left\", \"bottom-right\"],\n borders = [\"left\", \"right\"],\n}: CrosshairCornersProps) => {\n // Default thickness to 1/4th of the size if not provided\n const actualThickness = thickness ?? size / 4;\n\n return (\n <motion.div\n key={key || null}\n className={classNames(\n \"absolute w-full h-full inset-0 will-change-opacity\",\n className\n )}\n initial={{ opacity: 0, scale: 0.99 }}\n animate={{\n opacity: [0, 1, 0.2, 1, 0.4, 1, 0.6, 1, 0.8, 1],\n scale: [0.99, 1, 0.99, 1, 1, 1],\n }}\n transition={{\n duration: animationDuration,\n ease: anticipate,\n delay: animationDelay,\n }}\n style={\n {\n \"--size\": size + \"px\",\n \"--spacing-x\": spacingX + \"px\",\n \"--spacing-y\": spacingY + \"px\",\n \"--move\": moveDistance + \"px\",\n \"--thickness\": actualThickness + \"px\",\n \"--half-size\": size / 2 + \"px\",\n } as any\n }\n >\n {variant === \"cross\" ? (\n /* Cross/Plus Pattern in Corners */\n <>\n {/* Top Left Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-left\") && \"hidden\"\n )}\n style={{\n left: `calc((var(--spacing-x) + var(--half-size)) * -1 + 1px)`,\n top: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n\n {/* Top Right Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-right\") && \"hidden\"\n )}\n style={{\n right: `calc((var(--spacing-x) + var(--half-size)) * -1)`,\n top: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n\n {/* Bottom Left Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-left\") && \"hidden\"\n )}\n style={{\n left: `calc((var(--spacing-x) + var(--half-size)) * -1 + 1px)`,\n bottom: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n\n {/* Bottom Right Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-right\") && \"hidden\"\n )}\n style={{\n right: `calc((var(--spacing-x) + var(--half-size)) * -1)`,\n bottom: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n </>\n ) : variant === \"bordered\" ? (\n /* Corner Pattern with Left and Right Borders */\n <>\n {/* Top Left */}\n <div\n className={classNames(\n \"absolute left-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n (!corners.includes(\"top-left\") || !borders.includes(\"left\")) &&\n \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Top Right */}\n <div\n className={classNames(\n \"absolute right-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n (!corners.includes(\"top-right\") || !borders.includes(\"right\")) &&\n \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Left */}\n <div\n className={classNames(\n \"absolute left-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[var(--move)]\",\n (!corners.includes(\"bottom-left\") || !borders.includes(\"left\")) &&\n \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Right */}\n <div\n className={classNames(\n \"absolute right-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[var(--move)]\",\n (!corners.includes(\"bottom-right\") ||\n !borders.includes(\"right\")) &&\n \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Left Border */}\n {borders.includes(\"left\") && (\n <div\n className=\"absolute left-0 w-[var(--thickness)] bg-current transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)]\"\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n height: `calc(100% + (var(--spacing-y) * 2))`,\n }}\n ></div>\n )}\n\n {/* Right Border */}\n {borders.includes(\"right\") && (\n <div\n className=\"absolute right-0 w-[var(--thickness)] bg-current transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)]\"\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n height: `calc(100% + (var(--spacing-y) * 2))`,\n }}\n ></div>\n )}\n </>\n ) : (\n /* Corner Pattern (existing) */\n <>\n {/* Top Left */}\n <div\n className={classNames(\n \"absolute left-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-left\") && \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Top Right */}\n <div\n className={classNames(\n \"absolute right-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-right\") && \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Left */}\n <div\n className={classNames(\n \"absolute left-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-left\") && \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Right */}\n <div\n className={classNames(\n \"absolute right-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-right\") && \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n </>\n )}\n </motion.div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/CrossHair.tsx"],"names":["jsx","motion","classNames","anticipate","jsxs","Fragment"],"mappings":"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","file":"CrossHair.js","sourcesContent":["\"use client\";\n\nimport classNames from \"classnames\";\nimport { anticipate, motion } from \"motion/react\";\n\nexport type CrosshairCornersProps = {\n size?: number;\n spacingX?: number;\n spacingY?: number;\n animationDelay?: number;\n thickness?: number;\n animationDuration?: number;\n variant?: \"corners\" | \"cross\" | \"bordered\";\n corners?: (\"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\")[];\n borders?: (\"left\" | \"right\")[];\n className?: string;\n moveDistance?: number;\n key?: string;\n};\n\nexport const CrosshairCorners = ({\n size = 10,\n spacingX = 0,\n animationDelay = 2.5,\n spacingY = 0,\n className = \"\",\n moveDistance = 5,\n thickness,\n animationDuration = 2.15,\n key,\n variant = \"corners\",\n corners = [\"top-left\", \"top-right\", \"bottom-left\", \"bottom-right\"],\n borders = [\"left\", \"right\"],\n}: CrosshairCornersProps) => {\n // Default thickness to 1/4th of the size if not provided\n const actualThickness = thickness ?? size / 4;\n\n return (\n <motion.div\n key={key || null}\n className={classNames(\n \"absolute w-full h-full inset-0 will-change-opacity\",\n className\n )}\n initial={{ opacity: 0, scale: 0.99 }}\n animate={{\n opacity: [0, 1, 0.2, 1, 0.4, 1, 0.6, 1, 0.8, 1],\n scale: [0.99, 1, 0.99, 1, 1, 1],\n }}\n transition={{\n duration: animationDuration,\n ease: anticipate,\n delay: animationDelay,\n }}\n style={\n {\n \"--size\": size + \"px\",\n \"--spacing-x\": spacingX + \"px\",\n \"--spacing-y\": spacingY + \"px\",\n \"--move\": moveDistance + \"px\",\n \"--thickness\": actualThickness + \"px\",\n \"--half-size\": size / 2 + \"px\",\n } as any\n }\n >\n {variant === \"cross\" ? (\n /* Cross/Plus Pattern in Corners */\n <>\n {/* Top Left Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-left\") && \"hidden\"\n )}\n style={{\n left: `calc((var(--spacing-x) + var(--half-size)) * -1 + 1px)`,\n top: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n\n {/* Top Right Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-right\") && \"hidden\"\n )}\n style={{\n right: `calc((var(--spacing-x) + var(--half-size)) * -1)`,\n top: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n\n {/* Bottom Left Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-left\") && \"hidden\"\n )}\n style={{\n left: `calc((var(--spacing-x) + var(--half-size)) * -1 + 1px)`,\n bottom: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n\n {/* Bottom Right Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-right\") && \"hidden\"\n )}\n style={{\n right: `calc((var(--spacing-x) + var(--half-size)) * -1)`,\n bottom: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n </>\n ) : variant === \"bordered\" ? (\n /* Corner Pattern with Left and Right Borders */\n <>\n {/* Top Left */}\n <div\n className={classNames(\n \"absolute left-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n (!corners.includes(\"top-left\") || !borders.includes(\"left\")) &&\n \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Top Right */}\n <div\n className={classNames(\n \"absolute right-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n (!corners.includes(\"top-right\") || !borders.includes(\"right\")) &&\n \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Left */}\n <div\n className={classNames(\n \"absolute left-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[var(--move)]\",\n (!corners.includes(\"bottom-left\") || !borders.includes(\"left\")) &&\n \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Right */}\n <div\n className={classNames(\n \"absolute right-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[var(--move)]\",\n (!corners.includes(\"bottom-right\") ||\n !borders.includes(\"right\")) &&\n \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Left Border */}\n {borders.includes(\"left\") && (\n <div\n className=\"absolute left-0 w-[var(--thickness)] bg-current transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)]\"\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n height: `calc(100% + (var(--spacing-y) * 2))`,\n }}\n ></div>\n )}\n\n {/* Right Border */}\n {borders.includes(\"right\") && (\n <div\n className=\"absolute right-0 w-[var(--thickness)] bg-current transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)]\"\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n height: `calc(100% + (var(--spacing-y) * 2))`,\n }}\n ></div>\n )}\n </>\n ) : (\n /* Corner Pattern (existing) */\n <>\n {/* Top Left */}\n <div\n className={classNames(\n \"absolute left-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-left\") && \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Top Right */}\n <div\n className={classNames(\n \"absolute right-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-right\") && \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Left */}\n <div\n className={classNames(\n \"absolute left-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-left\") && \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Right */}\n <div\n className={classNames(\n \"absolute right-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-right\") && \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n </>\n )}\n </motion.div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/CrossHair.tsx"],"names":[],"mappings":"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","file":"CrossHair.mjs","sourcesContent":["import classNames from \"classnames\";\nimport { anticipate, motion } from \"motion/react\";\n\nexport type CrosshairCornersProps = {\n size?: number;\n spacingX?: number;\n spacingY?: number;\n animationDelay?: number;\n thickness?: number;\n animationDuration?: number;\n variant?: \"corners\" | \"cross\" | \"bordered\";\n corners?: (\"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\")[];\n borders?: (\"left\" | \"right\")[];\n className?: string;\n moveDistance?: number;\n key?: string;\n};\n\nexport const CrosshairCorners = ({\n size = 10,\n spacingX = 0,\n animationDelay = 2.5,\n spacingY = 0,\n className = \"\",\n moveDistance = 5,\n thickness,\n animationDuration = 2.15,\n key,\n variant = \"corners\",\n corners = [\"top-left\", \"top-right\", \"bottom-left\", \"bottom-right\"],\n borders = [\"left\", \"right\"],\n}: CrosshairCornersProps) => {\n // Default thickness to 1/4th of the size if not provided\n const actualThickness = thickness ?? size / 4;\n\n return (\n <motion.div\n key={key || null}\n className={classNames(\n \"absolute w-full h-full inset-0 will-change-opacity\",\n className\n )}\n initial={{ opacity: 0, scale: 0.99 }}\n animate={{\n opacity: [0, 1, 0.2, 1, 0.4, 1, 0.6, 1, 0.8, 1],\n scale: [0.99, 1, 0.99, 1, 1, 1],\n }}\n transition={{\n duration: animationDuration,\n ease: anticipate,\n delay: animationDelay,\n }}\n style={\n {\n \"--size\": size + \"px\",\n \"--spacing-x\": spacingX + \"px\",\n \"--spacing-y\": spacingY + \"px\",\n \"--move\": moveDistance + \"px\",\n \"--thickness\": actualThickness + \"px\",\n \"--half-size\": size / 2 + \"px\",\n } as any\n }\n >\n {variant === \"cross\" ? (\n /* Cross/Plus Pattern in Corners */\n <>\n {/* Top Left Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-left\") && \"hidden\"\n )}\n style={{\n left: `calc((var(--spacing-x) + var(--half-size)) * -1 + 1px)`,\n top: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n\n {/* Top Right Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-right\") && \"hidden\"\n )}\n style={{\n right: `calc((var(--spacing-x) + var(--half-size)) * -1)`,\n top: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n\n {/* Bottom Left Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-left\") && \"hidden\"\n )}\n style={{\n left: `calc((var(--spacing-x) + var(--half-size)) * -1 + 1px)`,\n bottom: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n\n {/* Bottom Right Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-right\") && \"hidden\"\n )}\n style={{\n right: `calc((var(--spacing-x) + var(--half-size)) * -1)`,\n bottom: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n </>\n ) : variant === \"bordered\" ? (\n /* Corner Pattern with Left and Right Borders */\n <>\n {/* Top Left */}\n <div\n className={classNames(\n \"absolute left-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n (!corners.includes(\"top-left\") || !borders.includes(\"left\")) &&\n \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Top Right */}\n <div\n className={classNames(\n \"absolute right-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n (!corners.includes(\"top-right\") || !borders.includes(\"right\")) &&\n \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Left */}\n <div\n className={classNames(\n \"absolute left-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[var(--move)]\",\n (!corners.includes(\"bottom-left\") || !borders.includes(\"left\")) &&\n \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Right */}\n <div\n className={classNames(\n \"absolute right-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[var(--move)]\",\n (!corners.includes(\"bottom-right\") ||\n !borders.includes(\"right\")) &&\n \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Left Border */}\n {borders.includes(\"left\") && (\n <div\n className=\"absolute left-0 w-[var(--thickness)] bg-current transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)]\"\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n height: `calc(100% + (var(--spacing-y) * 2))`,\n }}\n ></div>\n )}\n\n {/* Right Border */}\n {borders.includes(\"right\") && (\n <div\n className=\"absolute right-0 w-[var(--thickness)] bg-current transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)]\"\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n height: `calc(100% + (var(--spacing-y) * 2))`,\n }}\n ></div>\n )}\n </>\n ) : (\n /* Corner Pattern (existing) */\n <>\n {/* Top Left */}\n <div\n className={classNames(\n \"absolute left-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-left\") && \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Top Right */}\n <div\n className={classNames(\n \"absolute right-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-right\") && \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Left */}\n <div\n className={classNames(\n \"absolute left-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-left\") && \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Right */}\n <div\n className={classNames(\n \"absolute right-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-right\") && \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n </>\n )}\n </motion.div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/CrossHair.tsx"],"names":[],"mappings":"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","file":"CrossHair.mjs","sourcesContent":["\"use client\";\n\nimport classNames from \"classnames\";\nimport { anticipate, motion } from \"motion/react\";\n\nexport type CrosshairCornersProps = {\n size?: number;\n spacingX?: number;\n spacingY?: number;\n animationDelay?: number;\n thickness?: number;\n animationDuration?: number;\n variant?: \"corners\" | \"cross\" | \"bordered\";\n corners?: (\"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\")[];\n borders?: (\"left\" | \"right\")[];\n className?: string;\n moveDistance?: number;\n key?: string;\n};\n\nexport const CrosshairCorners = ({\n size = 10,\n spacingX = 0,\n animationDelay = 2.5,\n spacingY = 0,\n className = \"\",\n moveDistance = 5,\n thickness,\n animationDuration = 2.15,\n key,\n variant = \"corners\",\n corners = [\"top-left\", \"top-right\", \"bottom-left\", \"bottom-right\"],\n borders = [\"left\", \"right\"],\n}: CrosshairCornersProps) => {\n // Default thickness to 1/4th of the size if not provided\n const actualThickness = thickness ?? size / 4;\n\n return (\n <motion.div\n key={key || null}\n className={classNames(\n \"absolute w-full h-full inset-0 will-change-opacity\",\n className\n )}\n initial={{ opacity: 0, scale: 0.99 }}\n animate={{\n opacity: [0, 1, 0.2, 1, 0.4, 1, 0.6, 1, 0.8, 1],\n scale: [0.99, 1, 0.99, 1, 1, 1],\n }}\n transition={{\n duration: animationDuration,\n ease: anticipate,\n delay: animationDelay,\n }}\n style={\n {\n \"--size\": size + \"px\",\n \"--spacing-x\": spacingX + \"px\",\n \"--spacing-y\": spacingY + \"px\",\n \"--move\": moveDistance + \"px\",\n \"--thickness\": actualThickness + \"px\",\n \"--half-size\": size / 2 + \"px\",\n } as any\n }\n >\n {variant === \"cross\" ? (\n /* Cross/Plus Pattern in Corners */\n <>\n {/* Top Left Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-left\") && \"hidden\"\n )}\n style={{\n left: `calc((var(--spacing-x) + var(--half-size)) * -1 + 1px)`,\n top: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n\n {/* Top Right Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-right\") && \"hidden\"\n )}\n style={{\n right: `calc((var(--spacing-x) + var(--half-size)) * -1)`,\n top: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n\n {/* Bottom Left Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-left\") && \"hidden\"\n )}\n style={{\n left: `calc((var(--spacing-x) + var(--half-size)) * -1 + 1px)`,\n bottom: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n\n {/* Bottom Right Cross */}\n <div\n className={classNames(\n \"absolute\",\n \"before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:left-1/2 before:top-1/2 before:translate-x-[-50%] before:translate-y-[-50%]\",\n \"after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:left-1/2 after:top-1/2 after:translate-x-[-50%] after:translate-y-[-50%]\",\n \"transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-right\") && \"hidden\"\n )}\n style={{\n right: `calc((var(--spacing-x) + var(--half-size)) * -1)`,\n bottom: `calc((var(--spacing-y) + var(--half-size)) * -1)`,\n width: `var(--size)`,\n height: `var(--size)`,\n }}\n ></div>\n </>\n ) : variant === \"bordered\" ? (\n /* Corner Pattern with Left and Right Borders */\n <>\n {/* Top Left */}\n <div\n className={classNames(\n \"absolute left-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n (!corners.includes(\"top-left\") || !borders.includes(\"left\")) &&\n \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Top Right */}\n <div\n className={classNames(\n \"absolute right-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n (!corners.includes(\"top-right\") || !borders.includes(\"right\")) &&\n \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Left */}\n <div\n className={classNames(\n \"absolute left-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[var(--move)]\",\n (!corners.includes(\"bottom-left\") || !borders.includes(\"left\")) &&\n \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Right */}\n <div\n className={classNames(\n \"absolute right-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[var(--move)]\",\n (!corners.includes(\"bottom-right\") ||\n !borders.includes(\"right\")) &&\n \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Left Border */}\n {borders.includes(\"left\") && (\n <div\n className=\"absolute left-0 w-[var(--thickness)] bg-current transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)]\"\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n height: `calc(100% + (var(--spacing-y) * 2))`,\n }}\n ></div>\n )}\n\n {/* Right Border */}\n {borders.includes(\"right\") && (\n <div\n className=\"absolute right-0 w-[var(--thickness)] bg-current transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)]\"\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n height: `calc(100% + (var(--spacing-y) * 2))`,\n }}\n ></div>\n )}\n </>\n ) : (\n /* Corner Pattern (existing) */\n <>\n {/* Top Left */}\n <div\n className={classNames(\n \"absolute left-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-left\") && \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Top Right */}\n <div\n className={classNames(\n \"absolute right-0 top-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[calc(var(--move)*-1)]\",\n !corners.includes(\"top-right\") && \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n top: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Left */}\n <div\n className={classNames(\n \"absolute left-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[calc(var(--move)*-1)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-left\") && \"hidden\"\n )}\n style={{\n left: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n\n {/* Bottom Right */}\n <div\n className={classNames(\n \"absolute right-0 bottom-0 before:content-[''] before:absolute before:h-[var(--size)] before:w-[var(--thickness)] before:bg-current before:right-0 before:bottom-0 after:content-[''] after:absolute after:h-[var(--thickness)] after:w-[var(--size)] after:bg-current after:right-0 after:bottom-0 transition-all duration-300 group-hover/testimonial:translate-x-[var(--move)] group-hover/testimonial:translate-y-[var(--move)]\",\n !corners.includes(\"bottom-right\") && \"hidden\"\n )}\n style={{\n right: `calc(var(--spacing-x) * -1)`,\n bottom: `calc(var(--spacing-y) * -1)`,\n }}\n ></div>\n </>\n )}\n </motion.div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/DecryptText.tsx"],"names":["useState","useEffect","isExiting","jsxs","motion","classNames","jsx"],"mappings":"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","file":"DecryptText.js","sourcesContent":["import { useEffect, useState } from \"react\";\nimport { motion } from \"motion/react\";\nimport classNames from \"classnames\";\n\ninterface DecryptedTextProps {\n text: string;\n speed?: number;\n className?: string;\n encryptedClassName?: string;\n parentClassName?: string;\n isHovering?: boolean;\n}\n\nexport default function DecryptedText({\n text,\n speed = 20,\n className = \"\",\n parentClassName = \"\",\n encryptedClassName = \"\",\n isHovering = false,\n}: DecryptedTextProps) {\n const [displayText, setDisplayText] = useState<string>(text);\n const [isScrambling, setIsScrambling] = useState<boolean>(false);\n const [revealedIndices, setRevealedIndices] = useState<Set<number>>(\n new Set()\n );\n const [isExiting, setIsExiting] = useState<boolean>(false);\n\n useEffect(() => {\n let interval: NodeJS.Timeout;\n\n const shuffleText = (\n currentRevealed: Set<number>,\n isExiting: boolean = false\n ): string => {\n const positions = text.split(\"\").map((char, i) => ({\n char,\n isSpace: char === \" \",\n index: i,\n isRevealed: isExiting\n ? !currentRevealed.has(i)\n : currentRevealed.has(i),\n }));\n\n const nonSpaceChars = positions\n .filter((p) => !p.isSpace && !p.isRevealed)\n .map((p) => p.char);\n\n for (let i = nonSpaceChars.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [nonSpaceChars[i], nonSpaceChars[j]] = [\n nonSpaceChars[j],\n nonSpaceChars[i],\n ];\n }\n\n let charIndex = 0;\n return positions\n .map((p) => {\n if (p.isSpace) return \" \";\n if (p.isRevealed) return text[p.index];\n return nonSpaceChars[charIndex++];\n })\n .join(\"\");\n };\n\n if (isHovering) {\n setIsExiting(false);\n setIsScrambling(true);\n interval = setInterval(() => {\n setRevealedIndices((prevRevealed) => {\n if (prevRevealed.size < text.length) {\n const nextIndex = prevRevealed.size;\n const newRevealed = new Set(prevRevealed);\n newRevealed.add(nextIndex);\n setDisplayText(shuffleText(newRevealed));\n return newRevealed;\n } else {\n clearInterval(interval);\n setIsScrambling(false);\n return prevRevealed;\n }\n });\n }, speed);\n } else if (revealedIndices.size > 0) {\n setIsExiting(true);\n setIsScrambling(true);\n interval = setInterval(() => {\n setRevealedIndices((prevRevealed) => {\n if (prevRevealed.size > 0) {\n const newRevealed = new Set(prevRevealed);\n newRevealed.delete(prevRevealed.size - 1);\n setDisplayText(shuffleText(newRevealed, true));\n return newRevealed;\n } else {\n clearInterval(interval);\n setIsScrambling(false);\n setIsExiting(false);\n return prevRevealed;\n }\n });\n }, speed);\n } else {\n setDisplayText(text);\n setRevealedIndices(new Set());\n setIsScrambling(false);\n setIsExiting(false);\n }\n\n return () => {\n if (interval) clearInterval(interval);\n };\n }, [isHovering, text, speed]);\n\n return (\n <motion.span\n className={classNames(\n \"inline-block whitespace-pre-wrap\",\n parentClassName\n )}\n >\n <span className=\"sr-only\">{displayText}</span>\n\n <span aria-hidden=\"true\" className=\"inline-flex tracking-tight\">\n {displayText.split(\"\").map((char, index) => {\n const isRevealedOrDone =\n (isExiting\n ? !revealedIndices.has(index)\n : revealedIndices.has(index)) ||\n !isScrambling ||\n (!isHovering && !isExiting);\n\n return (\n <span\n key={index}\n className={isRevealedOrDone ? className : encryptedClassName}\n >\n {char}\n </span>\n );\n })}\n </span>\n </motion.span>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/DecryptText.tsx"],"names":["useState","useEffect","isExiting","jsxs","motion","classNames","jsx"],"mappings":"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","file":"DecryptText.js","sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { motion } from \"motion/react\";\nimport classNames from \"classnames\";\n\ninterface DecryptedTextProps {\n text: string;\n speed?: number;\n className?: string;\n encryptedClassName?: string;\n parentClassName?: string;\n isHovering?: boolean;\n}\n\nexport default function DecryptedText({\n text,\n speed = 20,\n className = \"\",\n parentClassName = \"\",\n encryptedClassName = \"\",\n isHovering = false,\n}: DecryptedTextProps) {\n const [displayText, setDisplayText] = useState<string>(text);\n const [isScrambling, setIsScrambling] = useState<boolean>(false);\n const [revealedIndices, setRevealedIndices] = useState<Set<number>>(\n new Set()\n );\n const [isExiting, setIsExiting] = useState<boolean>(false);\n\n useEffect(() => {\n let interval: NodeJS.Timeout;\n\n const shuffleText = (\n currentRevealed: Set<number>,\n isExiting: boolean = false\n ): string => {\n const positions = text.split(\"\").map((char, i) => ({\n char,\n isSpace: char === \" \",\n index: i,\n isRevealed: isExiting\n ? !currentRevealed.has(i)\n : currentRevealed.has(i),\n }));\n\n const nonSpaceChars = positions\n .filter((p) => !p.isSpace && !p.isRevealed)\n .map((p) => p.char);\n\n for (let i = nonSpaceChars.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [nonSpaceChars[i], nonSpaceChars[j]] = [\n nonSpaceChars[j],\n nonSpaceChars[i],\n ];\n }\n\n let charIndex = 0;\n return positions\n .map((p) => {\n if (p.isSpace) return \" \";\n if (p.isRevealed) return text[p.index];\n return nonSpaceChars[charIndex++];\n })\n .join(\"\");\n };\n\n if (isHovering) {\n setIsExiting(false);\n setIsScrambling(true);\n interval = setInterval(() => {\n setRevealedIndices((prevRevealed) => {\n if (prevRevealed.size < text.length) {\n const nextIndex = prevRevealed.size;\n const newRevealed = new Set(prevRevealed);\n newRevealed.add(nextIndex);\n setDisplayText(shuffleText(newRevealed));\n return newRevealed;\n } else {\n clearInterval(interval);\n setIsScrambling(false);\n return prevRevealed;\n }\n });\n }, speed);\n } else if (revealedIndices.size > 0) {\n setIsExiting(true);\n setIsScrambling(true);\n interval = setInterval(() => {\n setRevealedIndices((prevRevealed) => {\n if (prevRevealed.size > 0) {\n const newRevealed = new Set(prevRevealed);\n newRevealed.delete(prevRevealed.size - 1);\n setDisplayText(shuffleText(newRevealed, true));\n return newRevealed;\n } else {\n clearInterval(interval);\n setIsScrambling(false);\n setIsExiting(false);\n return prevRevealed;\n }\n });\n }, speed);\n } else {\n setDisplayText(text);\n setRevealedIndices(new Set());\n setIsScrambling(false);\n setIsExiting(false);\n }\n\n return () => {\n if (interval) clearInterval(interval);\n };\n }, [isHovering, text, speed]);\n\n return (\n <motion.span\n className={classNames(\n \"inline-block whitespace-pre-wrap\",\n parentClassName\n )}\n >\n <span className=\"sr-only\">{displayText}</span>\n\n <span aria-hidden=\"true\" className=\"inline-flex tracking-tight\">\n {displayText.split(\"\").map((char, index) => {\n const isRevealedOrDone =\n (isExiting\n ? !revealedIndices.has(index)\n : revealedIndices.has(index)) ||\n !isScrambling ||\n (!isHovering && !isExiting);\n\n return (\n <span\n key={index}\n className={isRevealedOrDone ? className : encryptedClassName}\n >\n {char}\n </span>\n );\n })}\n </span>\n </motion.span>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/DecryptText.tsx"],"names":["isExiting"],"mappings":"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","file":"DecryptText.mjs","sourcesContent":["import { useEffect, useState } from \"react\";\nimport { motion } from \"motion/react\";\nimport classNames from \"classnames\";\n\ninterface DecryptedTextProps {\n text: string;\n speed?: number;\n className?: string;\n encryptedClassName?: string;\n parentClassName?: string;\n isHovering?: boolean;\n}\n\nexport default function DecryptedText({\n text,\n speed = 20,\n className = \"\",\n parentClassName = \"\",\n encryptedClassName = \"\",\n isHovering = false,\n}: DecryptedTextProps) {\n const [displayText, setDisplayText] = useState<string>(text);\n const [isScrambling, setIsScrambling] = useState<boolean>(false);\n const [revealedIndices, setRevealedIndices] = useState<Set<number>>(\n new Set()\n );\n const [isExiting, setIsExiting] = useState<boolean>(false);\n\n useEffect(() => {\n let interval: NodeJS.Timeout;\n\n const shuffleText = (\n currentRevealed: Set<number>,\n isExiting: boolean = false\n ): string => {\n const positions = text.split(\"\").map((char, i) => ({\n char,\n isSpace: char === \" \",\n index: i,\n isRevealed: isExiting\n ? !currentRevealed.has(i)\n : currentRevealed.has(i),\n }));\n\n const nonSpaceChars = positions\n .filter((p) => !p.isSpace && !p.isRevealed)\n .map((p) => p.char);\n\n for (let i = nonSpaceChars.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [nonSpaceChars[i], nonSpaceChars[j]] = [\n nonSpaceChars[j],\n nonSpaceChars[i],\n ];\n }\n\n let charIndex = 0;\n return positions\n .map((p) => {\n if (p.isSpace) return \" \";\n if (p.isRevealed) return text[p.index];\n return nonSpaceChars[charIndex++];\n })\n .join(\"\");\n };\n\n if (isHovering) {\n setIsExiting(false);\n setIsScrambling(true);\n interval = setInterval(() => {\n setRevealedIndices((prevRevealed) => {\n if (prevRevealed.size < text.length) {\n const nextIndex = prevRevealed.size;\n const newRevealed = new Set(prevRevealed);\n newRevealed.add(nextIndex);\n setDisplayText(shuffleText(newRevealed));\n return newRevealed;\n } else {\n clearInterval(interval);\n setIsScrambling(false);\n return prevRevealed;\n }\n });\n }, speed);\n } else if (revealedIndices.size > 0) {\n setIsExiting(true);\n setIsScrambling(true);\n interval = setInterval(() => {\n setRevealedIndices((prevRevealed) => {\n if (prevRevealed.size > 0) {\n const newRevealed = new Set(prevRevealed);\n newRevealed.delete(prevRevealed.size - 1);\n setDisplayText(shuffleText(newRevealed, true));\n return newRevealed;\n } else {\n clearInterval(interval);\n setIsScrambling(false);\n setIsExiting(false);\n return prevRevealed;\n }\n });\n }, speed);\n } else {\n setDisplayText(text);\n setRevealedIndices(new Set());\n setIsScrambling(false);\n setIsExiting(false);\n }\n\n return () => {\n if (interval) clearInterval(interval);\n };\n }, [isHovering, text, speed]);\n\n return (\n <motion.span\n className={classNames(\n \"inline-block whitespace-pre-wrap\",\n parentClassName\n )}\n >\n <span className=\"sr-only\">{displayText}</span>\n\n <span aria-hidden=\"true\" className=\"inline-flex tracking-tight\">\n {displayText.split(\"\").map((char, index) => {\n const isRevealedOrDone =\n (isExiting\n ? !revealedIndices.has(index)\n : revealedIndices.has(index)) ||\n !isScrambling ||\n (!isHovering && !isExiting);\n\n return (\n <span\n key={index}\n className={isRevealedOrDone ? className : encryptedClassName}\n >\n {char}\n </span>\n );\n })}\n </span>\n </motion.span>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/DecryptText.tsx"],"names":["isExiting"],"mappings":"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","file":"DecryptText.mjs","sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { motion } from \"motion/react\";\nimport classNames from \"classnames\";\n\ninterface DecryptedTextProps {\n text: string;\n speed?: number;\n className?: string;\n encryptedClassName?: string;\n parentClassName?: string;\n isHovering?: boolean;\n}\n\nexport default function DecryptedText({\n text,\n speed = 20,\n className = \"\",\n parentClassName = \"\",\n encryptedClassName = \"\",\n isHovering = false,\n}: DecryptedTextProps) {\n const [displayText, setDisplayText] = useState<string>(text);\n const [isScrambling, setIsScrambling] = useState<boolean>(false);\n const [revealedIndices, setRevealedIndices] = useState<Set<number>>(\n new Set()\n );\n const [isExiting, setIsExiting] = useState<boolean>(false);\n\n useEffect(() => {\n let interval: NodeJS.Timeout;\n\n const shuffleText = (\n currentRevealed: Set<number>,\n isExiting: boolean = false\n ): string => {\n const positions = text.split(\"\").map((char, i) => ({\n char,\n isSpace: char === \" \",\n index: i,\n isRevealed: isExiting\n ? !currentRevealed.has(i)\n : currentRevealed.has(i),\n }));\n\n const nonSpaceChars = positions\n .filter((p) => !p.isSpace && !p.isRevealed)\n .map((p) => p.char);\n\n for (let i = nonSpaceChars.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [nonSpaceChars[i], nonSpaceChars[j]] = [\n nonSpaceChars[j],\n nonSpaceChars[i],\n ];\n }\n\n let charIndex = 0;\n return positions\n .map((p) => {\n if (p.isSpace) return \" \";\n if (p.isRevealed) return text[p.index];\n return nonSpaceChars[charIndex++];\n })\n .join(\"\");\n };\n\n if (isHovering) {\n setIsExiting(false);\n setIsScrambling(true);\n interval = setInterval(() => {\n setRevealedIndices((prevRevealed) => {\n if (prevRevealed.size < text.length) {\n const nextIndex = prevRevealed.size;\n const newRevealed = new Set(prevRevealed);\n newRevealed.add(nextIndex);\n setDisplayText(shuffleText(newRevealed));\n return newRevealed;\n } else {\n clearInterval(interval);\n setIsScrambling(false);\n return prevRevealed;\n }\n });\n }, speed);\n } else if (revealedIndices.size > 0) {\n setIsExiting(true);\n setIsScrambling(true);\n interval = setInterval(() => {\n setRevealedIndices((prevRevealed) => {\n if (prevRevealed.size > 0) {\n const newRevealed = new Set(prevRevealed);\n newRevealed.delete(prevRevealed.size - 1);\n setDisplayText(shuffleText(newRevealed, true));\n return newRevealed;\n } else {\n clearInterval(interval);\n setIsScrambling(false);\n setIsExiting(false);\n return prevRevealed;\n }\n });\n }, speed);\n } else {\n setDisplayText(text);\n setRevealedIndices(new Set());\n setIsScrambling(false);\n setIsExiting(false);\n }\n\n return () => {\n if (interval) clearInterval(interval);\n };\n }, [isHovering, text, speed]);\n\n return (\n <motion.span\n className={classNames(\n \"inline-block whitespace-pre-wrap\",\n parentClassName\n )}\n >\n <span className=\"sr-only\">{displayText}</span>\n\n <span aria-hidden=\"true\" className=\"inline-flex tracking-tight\">\n {displayText.split(\"\").map((char, index) => {\n const isRevealedOrDone =\n (isExiting\n ? !revealedIndices.has(index)\n : revealedIndices.has(index)) ||\n !isScrambling ||\n (!isHovering && !isExiting);\n\n return (\n <span\n key={index}\n className={isRevealedOrDone ? className : encryptedClassName}\n >\n {char}\n </span>\n );\n })}\n </span>\n </motion.span>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Divider.tsx"],"names":["jsxs","classNames","jsx"],"mappings":";;;;;;;;;AAQO,MAAM,UAAU,CAAC;AAAA,EACtB,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAoB;AAClB,EAAA,uBACEA,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,2BAAA;AAAA,QACT,MAAA;AAAA,QACA,cAAc,YAAA,IAAgB,iBAAA;AAAA,QAC9B,cAAc,UAAA,IAAc,iBAAA;AAAA,QAC5B;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWD,2BAAA;AAAA,cACT,eAAA;AAAA,cACA,cAAc,YAAA,IAAgB,aAAA;AAAA,cAC9B,cAAc,UAAA,IAAc;AAAA;AAC9B;AAAA,SACF;AAAA,wBACAC,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWD,2BAAA;AAAA,cACT,iBAAA;AAAA,cACA,cAAc,YAAA,IAAgB,aAAA;AAAA,cAC9B,cAAc,UAAA,IAAc;AAAA;AAC9B;AAAA;AACF;AAAA;AAAA,GACF;AAEJ","file":"Divider.js","sourcesContent":["import classNames from \"classnames\";\nimport { GridLines } from \"./GridLines\";\n\nexport type DividerProps = {\n className?: string;\n direction?: \"horizontal\" | \"vertical\";\n};\n\nexport const Divider = ({\n className,\n direction = \"horizontal\",\n}: DividerProps) => {\n return (\n <div\n className={classNames(\n \"flex\",\n direction === \"horizontal\" && \"flex-col w-full\",\n direction === \"vertical\" && \"flex-row h-full\",\n className\n )}\n >\n <div\n className={classNames(\n \"bg-background\",\n direction === \"horizontal\" && \"w-full h-px\",\n direction === \"vertical\" && \"h-full w-px\"\n )}\n />\n <div\n className={classNames(\n \"bg-border-light\",\n direction === \"horizontal\" && \"w-full h-px\",\n direction === \"vertical\" && \"h-full w-px\"\n )}\n />\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/Divider.tsx"],"names":["jsxs","classNames","jsx"],"mappings":";;;;;;;;;AAOO,MAAM,UAAU,CAAC;AAAA,EACtB,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAoB;AAClB,EAAA,uBACEA,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,2BAAA;AAAA,QACT,MAAA;AAAA,QACA,cAAc,YAAA,IAAgB,iBAAA;AAAA,QAC9B,cAAc,UAAA,IAAc,iBAAA;AAAA,QAC5B;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWD,2BAAA;AAAA,cACT,eAAA;AAAA,cACA,cAAc,YAAA,IAAgB,aAAA;AAAA,cAC9B,cAAc,UAAA,IAAc;AAAA;AAC9B;AAAA,SACF;AAAA,wBACAC,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWD,2BAAA;AAAA,cACT,iBAAA;AAAA,cACA,cAAc,YAAA,IAAgB,aAAA;AAAA,cAC9B,cAAc,UAAA,IAAc;AAAA;AAC9B;AAAA;AACF;AAAA;AAAA,GACF;AAEJ","file":"Divider.js","sourcesContent":["import classNames from \"classnames\";\n\nexport type DividerProps = {\n className?: string;\n direction?: \"horizontal\" | \"vertical\";\n};\n\nexport const Divider = ({\n className,\n direction = \"horizontal\",\n}: DividerProps) => {\n return (\n <div\n className={classNames(\n \"flex\",\n direction === \"horizontal\" && \"flex-col w-full\",\n direction === \"vertical\" && \"flex-row h-full\",\n className\n )}\n >\n <div\n className={classNames(\n \"bg-background\",\n direction === \"horizontal\" && \"w-full h-px\",\n direction === \"vertical\" && \"h-full w-px\"\n )}\n />\n <div\n className={classNames(\n \"bg-border-light\",\n direction === \"horizontal\" && \"w-full h-px\",\n direction === \"vertical\" && \"h-full w-px\"\n )}\n />\n </div>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Divider.tsx"],"names":[],"mappings":";;;AAQO,MAAM,UAAU,CAAC;AAAA,EACtB,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAoB;AAClB,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,UAAA;AAAA,QACT,MAAA;AAAA,QACA,cAAc,YAAA,IAAgB,iBAAA;AAAA,QAC9B,cAAc,UAAA,IAAc,iBAAA;AAAA,QAC5B;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,UAAA;AAAA,cACT,eAAA;AAAA,cACA,cAAc,YAAA,IAAgB,aAAA;AAAA,cAC9B,cAAc,UAAA,IAAc;AAAA;AAC9B;AAAA,SACF;AAAA,wBACA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,UAAA;AAAA,cACT,iBAAA;AAAA,cACA,cAAc,YAAA,IAAgB,aAAA;AAAA,cAC9B,cAAc,UAAA,IAAc;AAAA;AAC9B;AAAA;AACF;AAAA;AAAA,GACF;AAEJ","file":"Divider.mjs","sourcesContent":["import classNames from \"classnames\";\nimport { GridLines } from \"./GridLines\";\n\nexport type DividerProps = {\n className?: string;\n direction?: \"horizontal\" | \"vertical\";\n};\n\nexport const Divider = ({\n className,\n direction = \"horizontal\",\n}: DividerProps) => {\n return (\n <div\n className={classNames(\n \"flex\",\n direction === \"horizontal\" && \"flex-col w-full\",\n direction === \"vertical\" && \"flex-row h-full\",\n className\n )}\n >\n <div\n className={classNames(\n \"bg-background\",\n direction === \"horizontal\" && \"w-full h-px\",\n direction === \"vertical\" && \"h-full w-px\"\n )}\n />\n <div\n className={classNames(\n \"bg-border-light\",\n direction === \"horizontal\" && \"w-full h-px\",\n direction === \"vertical\" && \"h-full w-px\"\n )}\n />\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/Divider.tsx"],"names":[],"mappings":";;;AAOO,MAAM,UAAU,CAAC;AAAA,EACtB,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAoB;AAClB,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,UAAA;AAAA,QACT,MAAA;AAAA,QACA,cAAc,YAAA,IAAgB,iBAAA;AAAA,QAC9B,cAAc,UAAA,IAAc,iBAAA;AAAA,QAC5B;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,UAAA;AAAA,cACT,eAAA;AAAA,cACA,cAAc,YAAA,IAAgB,aAAA;AAAA,cAC9B,cAAc,UAAA,IAAc;AAAA;AAC9B;AAAA,SACF;AAAA,wBACA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,UAAA;AAAA,cACT,iBAAA;AAAA,cACA,cAAc,YAAA,IAAgB,aAAA;AAAA,cAC9B,cAAc,UAAA,IAAc;AAAA;AAC9B;AAAA;AACF;AAAA;AAAA,GACF;AAEJ","file":"Divider.mjs","sourcesContent":["import classNames from \"classnames\";\n\nexport type DividerProps = {\n className?: string;\n direction?: \"horizontal\" | \"vertical\";\n};\n\nexport const Divider = ({\n className,\n direction = \"horizontal\",\n}: DividerProps) => {\n return (\n <div\n className={classNames(\n \"flex\",\n direction === \"horizontal\" && \"flex-col w-full\",\n direction === \"vertical\" && \"flex-row h-full\",\n className\n )}\n >\n <div\n className={classNames(\n \"bg-background\",\n direction === \"horizontal\" && \"w-full h-px\",\n direction === \"vertical\" && \"h-full w-px\"\n )}\n />\n <div\n className={classNames(\n \"bg-border-light\",\n direction === \"horizontal\" && \"w-full h-px\",\n direction === \"vertical\" && \"h-full w-px\"\n )}\n />\n </div>\n );\n};\n"]}
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { a as IconProps } from './index-DWGhkMUQ.mjs';
2
+ import { a as IconProps } from './Icon-CTxwWbdC.mjs';
3
3
  import './utils/colours.mjs';
4
4
 
5
5
  type DropdownProps = {
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { a as IconProps } from './index-ekBNDG0H.js';
2
+ import { a as IconProps } from './Icon-llWd6yMa.js';
3
3
  import './utils/colours.js';
4
4
 
5
5
  type DropdownProps = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Dropdown.tsx"],"names":["useState","useRef","useCallback","useEffect","jsx","AnimatePresence","motion","swift","classNames","jsxs","Checkbox","Divider","useOnClickOutside","Button","CrosshairCorners","Icon"],"mappings":"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","file":"Dropdown.js","sourcesContent":["import { IconName } from \"./icons\";\nimport { Button, ButtonProps } from \"./Button\";\nimport { useRef, useState, useEffect, useCallback } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport classNames from \"classnames\";\nimport { crisp, glide, swift } from \"./utils/easings\";\nimport { Checkbox } from \"./Checkbox\";\nimport { Divider } from \"./Divider\";\nimport { Icon, type IconProps } from \"./Icon\";\nimport { useOnClickOutside } from \"usehooks-ts\";\nimport { CrosshairCorners } from \"./CrossHair\";\n\nexport type DropdownProps = {\n className?: string;\n items: {\n label: string;\n icon?: IconProps;\n value: string;\n disabled?: boolean;\n }[];\n selectedItem?: string | string[] | undefined;\n handleChange: (item: string | string[] | undefined) => void;\n multiple?: boolean;\n disabled?: boolean;\n label: string;\n multiSelectLabel?: string;\n buttonClassName?: string;\n menuClassName?: string;\n menuIcon?: IconProps;\n size?: \"sm\" | \"md\" | \"lg\";\n isScrollable?: boolean;\n animationOrigin?: \"top-left\" | \"top-center\" | \"top-right\";\n search?: string;\n onClearSearch?: () => void;\n};\n\nexport type DropdownButtonProps = {\n label: string;\n multiSelectLabel?: string;\n disabled?: boolean;\n className?: string;\n onClick: () => void;\n buttonClassName?: string;\n selectedItems?: DropdownProps[\"items\"];\n multiple?: boolean;\n count?: number;\n menuIcon?: IconProps;\n size?: \"sm\" | \"md\" | \"lg\";\n};\n\nexport type DropdownItemProps = {\n label: string;\n icon?: IconProps;\n onClick: () => void;\n disabled?: boolean;\n isSelected?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n};\n\nexport type DropdownMenuProps = {\n items: {\n label: string;\n icon?: IconProps;\n value: string;\n disabled?: boolean;\n }[];\n selectedItem?: string | string[] | undefined;\n handleChange: (item: string | string[] | undefined) => void;\n multiple?: boolean;\n menuClassName?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n isOpen: boolean;\n onItemClick?: (value: string) => void;\n isScrollable?: boolean;\n animationOrigin?: \"top-left\" | \"top-center\" | \"top-right\";\n search?: string;\n onClearSearch?: () => void;\n};\n\nexport const DropdownMenu = ({\n items,\n selectedItem,\n handleChange,\n multiple = false,\n menuClassName,\n size = \"md\",\n isOpen,\n onItemClick,\n isScrollable = false,\n animationOrigin = \"top-left\",\n search,\n onClearSearch,\n}: DropdownMenuProps) => {\n const [isAtBottom, setIsAtBottom] = useState(false);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n // Filter items based on search term\n const filteredItems = (() => {\n // If search is provided, filter based on search\n if (search) {\n return items.filter((item) =>\n item.label.toLowerCase().includes(search.toLowerCase())\n );\n }\n\n // Default: show all items\n return items;\n })();\n\n // Handle scroll detection\n const handleScroll = useCallback(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const { scrollTop, scrollHeight, clientHeight } = container;\n const threshold = 5; // Small threshold to account for rounding\n const isNearBottom = scrollTop + clientHeight >= scrollHeight - threshold;\n\n setIsAtBottom(isNearBottom);\n }, []);\n\n // Reset scroll state when items change or menu opens\n useEffect(() => {\n if (isOpen) {\n setIsAtBottom(false);\n }\n }, [isOpen, filteredItems.length]);\n\n // Check if content is actually scrollable\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container || !isOpen) return;\n\n const { scrollHeight, clientHeight } = container;\n const hasScrollbar = scrollHeight > clientHeight;\n\n // If no scrollbar (content fits), consider it \"at bottom\"\n if (!hasScrollbar) {\n setIsAtBottom(true);\n }\n }, [isOpen, filteredItems.length]);\n\n // Helper to check if an item is selected\n const isItemSelected = (value: string) => {\n if (multiple) {\n return (\n Array.isArray(selectedItem) &&\n selectedItem.length > 0 &&\n selectedItem.includes(value)\n );\n }\n return !!selectedItem && selectedItem === value;\n };\n\n // Handle item selection\n const handleItemClick = (value: string) => {\n if (multiple) {\n const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];\n\n // If all items are selected, clicking any item should deselect all others\n if (isAllSelected()) {\n handleChange([value]);\n } else if (currentSelection.includes(value)) {\n // Remove from selection\n handleChange(currentSelection.filter((item) => item !== value));\n } else {\n // Add to selection\n handleChange([...currentSelection, value]);\n }\n } else {\n // Single select - if clicking the already selected item, deselect it\n if (selectedItem === value) {\n handleChange(undefined);\n } else {\n // Otherwise, select the new item\n handleChange(value);\n }\n // Call the optional callback for single select\n onItemClick?.(value);\n }\n };\n\n // Handle select all\n const handleSelectAll = () => {\n const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];\n const allValues = filteredItems\n .filter((item) => !item.disabled)\n .map((item) => item.value);\n\n if (currentSelection.length === allValues.length) {\n // Deselect all\n handleChange([]);\n } else {\n // Select all\n handleChange(allValues);\n }\n };\n\n // Check if all items are selected\n const isAllSelected = () => {\n if (!Array.isArray(selectedItem) || selectedItem.length === 0) return false;\n const selectableItems = filteredItems.filter((item) => !item.disabled);\n return (\n selectableItems.length > 0 &&\n selectedItem.length === selectableItems.length &&\n selectableItems.every((item) => selectedItem.includes(item.value))\n );\n };\n\n return (\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0, scale: 0.8, y: -15 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n transition={{ duration: 0.1, ease: swift }}\n exit={{ opacity: 0, scale: 0.8, y: -5 }}\n className={classNames(\n \"absolute top-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border\",\n (size === \"lg\" || size === \"md\") && \"min-w-[200px]\",\n animationOrigin === \"top-left\" && \"origin-top-left\",\n animationOrigin === \"top-center\" && \"origin-top-center\",\n animationOrigin === \"top-right\" && \"origin-top-right\",\n menuClassName\n )}\n >\n <div\n ref={scrollContainerRef}\n onScroll={handleScroll}\n className={classNames(\n \"flex flex-col gap-y-1\",\n isScrollable && [\n \"max-h-[250px] overflow-y-auto\",\n !isAtBottom &&\n \"[mask-image:linear-gradient(180deg,black,black_85%,transparent_100%)]\",\n ]\n )}\n >\n {multiple && (\n <div className=\"group flex flex-col gap-y-1\">\n <button\n onClick={handleSelectAll}\n className={classNames(\n \"py-3 pl-2.5 pr-3 flex items-center gap-x-2.5 outline-none bg-transparent transition-colors duration-100 ease-crisp hover:bg-border-light/50\"\n )}\n >\n <Checkbox checked={isAllSelected()} />\n <span className=\"text-sm text-shade-primary font-medium\">\n Select All\n </span>\n </button>\n <Divider direction=\"horizontal\" />\n </div>\n )}\n {filteredItems.length > 0 ? (\n filteredItems.map((item) => (\n <DropdownItem\n key={item.value}\n label={item.label}\n icon={\n item.icon?.name\n ? {\n name: item.icon.name,\n className: item.icon.className,\n size: item.icon.size,\n difficulties: item.icon.difficulties,\n }\n : undefined\n }\n onClick={() => handleItemClick(item.value)}\n disabled={item.disabled}\n isSelected={isItemSelected(item.value)}\n size={size}\n />\n ))\n ) : (\n <button\n onClick={() => {\n // Clear search by calling the onClearSearch callback\n if (onClearSearch) {\n onClearSearch();\n }\n }}\n className=\"py-3 pl-2.5 pr-3 text-sm font-mono text-shade-tertiary hover:bg-border-light/50 transition-colors duration-100 ease-crisp w-full text-center\"\n >\n No options found\n </button>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n\nexport const Dropdown = ({\n className,\n items,\n selectedItem,\n handleChange,\n label = \"View All\",\n multiSelectLabel,\n disabled,\n buttonClassName,\n menuClassName,\n multiple = false,\n menuIcon,\n size = \"md\",\n isScrollable = false,\n search,\n onClearSearch,\n}: DropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n\n // Handle item selection for single select (closes menu)\n const handleItemClick = (value: string) => {\n if (!multiple) {\n // Single select - if clicking the already selected item, deselect it\n if (selectedItem === value) {\n handleChange(undefined);\n } else {\n // Otherwise, select the new item\n handleChange(value);\n }\n setIsOpen(false);\n }\n };\n\n const ref = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = () => {\n setIsOpen(false);\n };\n\n // Cast ref to RefObject<HTMLElement> to satisfy useOnClickOutside's expected type\n useOnClickOutside(ref as React.RefObject<HTMLElement>, handleClickOutside);\n\n // Get selected items for display in button\n const getSelectedItems = () => {\n if (multiple) {\n const selectedValues = Array.isArray(selectedItem) ? selectedItem : [];\n return items.filter((item) => selectedValues.includes(item.value));\n } else {\n const selected = items.find((item) => item.value === selectedItem);\n return selected ? [selected] : [];\n }\n };\n\n return (\n <div\n ref={ref}\n className={classNames(\n \"relative flex flex-col gap-y-1.5 items-start\",\n className\n )}\n >\n <DropdownButton\n label={label}\n multiSelectLabel={multiSelectLabel}\n disabled={disabled}\n className={buttonClassName}\n onClick={() => setIsOpen(!isOpen)}\n selectedItems={getSelectedItems()}\n multiple={multiple}\n count={getSelectedItems().length}\n menuIcon={menuIcon}\n size={size}\n />\n\n <DropdownMenu\n items={items}\n selectedItem={selectedItem}\n handleChange={handleChange}\n multiple={multiple}\n menuClassName={menuClassName}\n size={size}\n isOpen={isOpen}\n onItemClick={handleItemClick}\n isScrollable={isScrollable}\n search={search}\n onClearSearch={onClearSearch}\n />\n </div>\n );\n};\n\nexport const DropdownButton = ({\n label,\n multiSelectLabel,\n disabled,\n className,\n onClick,\n selectedItems = [],\n multiple = false,\n count = 0,\n menuIcon,\n size,\n}: DropdownButtonProps) => {\n const [isHovered, setIsHovered] = useState(false);\n\n // Determine what to display\n const hasSelection = selectedItems.length > 0;\n const isSingleSelection = selectedItems.length === 1;\n const isMultipleSelection = selectedItems.length > 1;\n\n // Compute icon and label based on selection state\n let buttonIcon: ButtonProps[\"icon\"] | undefined;\n let buttonLabel: string;\n\n if (hasSelection && isSingleSelection) {\n // Single selection: show selected item's icon and label\n const selectedItem = selectedItems[0];\n buttonIcon = selectedItem.icon\n ? {\n name: selectedItem.icon.name,\n className: selectedItem.icon.className || \"\",\n size: selectedItem.icon.size || 18,\n difficulties: selectedItem.icon.difficulties,\n }\n : menuIcon;\n buttonLabel = selectedItem.label;\n } else if (isMultipleSelection && multiple && multiSelectLabel) {\n // Multiple selections: show count and multiSelectLabel\n // Collect all difficulties from selected items\n const combinedDifficulties = selectedItems\n .filter((item) => item.icon?.difficulties)\n .flatMap((item) => item.icon!.difficulties!)\n .filter((value, index, self) => self.indexOf(value) === index) // Remove duplicates\n .sort((a, b) => a - b); // Sort in ascending order\n\n buttonIcon = menuIcon\n ? {\n name: menuIcon.name,\n className: menuIcon.className || \"\",\n size: menuIcon.size || 18,\n difficulties:\n combinedDifficulties.length > 0\n ? combinedDifficulties\n : menuIcon.difficulties,\n }\n : undefined;\n buttonLabel = `${count} ${multiSelectLabel}`;\n } else {\n // Default: no selection\n buttonIcon = menuIcon;\n buttonLabel = label;\n }\n\n return (\n <Button\n icon={buttonIcon}\n label={buttonLabel}\n disabled={disabled}\n size={size}\n variant=\"secondary\"\n className={classNames(\n \"!origin-bottom-left !justify-start w-full\",\n (size === \"md\" || size === \"lg\") && \"!pr-[18px] !pl-[12px]\",\n size === \"sm\" && \"!pr-4 !pl-3\",\n className\n )}\n useHoverEffect={false}\n crosshairProps={{\n variant: \"corners\",\n corners: [\"bottom-right\"],\n spacingX: !isHovered ? -6 : -4,\n spacingY: !isHovered ? -6 : -4,\n animationDuration: 0.5,\n animationDelay: 0,\n className: \"text-shade-mute group-hover:text-shade-primary\",\n }}\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n />\n );\n};\n\nexport const DropdownItem = ({\n label,\n icon,\n onClick,\n disabled,\n isSelected = false,\n size,\n}: DropdownItemProps) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={classNames(\n \"hover:bg-border-light/50 relative group/item disabled:opacity-40 flex items-center gap-x-2.5 outline-none transition-colors duration-100 ease-crisp\",\n size === \"lg\" && \"py-4 pl-3 pr-3 text-base\",\n size === \"md\" && \"py-3 pl-2.5 pr-3 text-sm\",\n size === \"sm\" && \"py-2 pl-2.5 pr-3 h-[36px] text-sm\",\n isSelected && \"bg-background/50\"\n )}\n >\n <div className=\"opacity-0 group-hover/item:!opacity-100 absolute inset-0.5\">\n <CrosshairCorners\n size={6}\n variant=\"corners\"\n corners={[\"bottom-right\"]}\n className=\"text-shade-mute\"\n animationDelay={0}\n animationDuration={0.5}\n />\n </div>\n\n {icon && (\n <Icon\n name={icon.name}\n className={classNames(\"flex-shrink-0\", icon.className)}\n size={icon.size || 18}\n difficulties={icon.difficulties}\n />\n )}\n <span\n className={classNames(\" text-shade-primary font-medium leading-[100%]\")}\n >\n {label}\n </span>\n </button>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/Dropdown.tsx"],"names":["useState","useRef","useCallback","useEffect","jsx","AnimatePresence","motion","swift","classNames","jsxs","Checkbox","Divider","useOnClickOutside","Button","CrosshairCorners","Icon"],"mappings":";;;;;;;;;;;;;;;;;;AAgFO,MAAM,eAAe,CAAC;AAAA,EAC3B,KAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,aAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,MAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,eAAA,GAAkB,UAAA;AAAA,EAClB,MAAA;AAAA,EACA;AACF,CAAA,KAAyB;AACvB,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,kBAAA,GAAqBC,aAAuB,IAAI,CAAA;AAGtD,EAAA,MAAM,iBAAiB,MAAM;AAE3B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,KAAA,CAAM,MAAA;AAAA,QAAO,CAAC,SACnB,IAAA,CAAK,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa;AAAA,OACxD;AAAA,IACF;AAGA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,GAAG;AAGH,EAAA,MAAM,YAAA,GAAeC,kBAAY,MAAM;AACrC,IAAA,MAAM,YAAY,kBAAA,CAAmB,OAAA;AACrC,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAc,YAAA,EAAa,GAAI,SAAA;AAClD,IAAA,MAAM,SAAA,GAAY,CAAA;AAClB,IAAA,MAAM,YAAA,GAAe,SAAA,GAAY,YAAA,IAAgB,YAAA,GAAe,SAAA;AAEhE,IAAA,aAAA,CAAc,YAAY,CAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAA,CAAc,MAAM,CAAC,CAAA;AAGjC,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAY,kBAAA,CAAmB,OAAA;AACrC,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,EAAQ;AAE3B,IAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAa,GAAI,SAAA;AACvC,IAAA,MAAM,eAAe,YAAA,GAAe,YAAA;AAGpC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAA,CAAc,MAAM,CAAC,CAAA;AAGjC,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACxC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OACE,KAAA,CAAM,QAAQ,YAAY,CAAA,IAC1B,aAAa,MAAA,GAAS,CAAA,IACtB,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAAA,IAE/B;AACA,IAAA,OAAO,CAAC,CAAC,YAAA,IAAgB,YAAA,KAAiB,KAAA;AAAA,EAC5C,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAkB;AACzC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,mBAAmB,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAI,eAAe,EAAC;AAGvE,MAAA,IAAI,eAAc,EAAG;AACnB,QAAA,YAAA,CAAa,CAAC,KAAK,CAAC,CAAA;AAAA,MACtB,CAAA,MAAA,IAAW,gBAAA,CAAiB,QAAA,CAAS,KAAK,CAAA,EAAG;AAE3C,QAAA,YAAA,CAAa,iBAAiB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,KAAS,KAAK,CAAC,CAAA;AAAA,MAChE,CAAA,MAAO;AAEL,QAAA,YAAA,CAAa,CAAC,GAAG,gBAAA,EAAkB,KAAK,CAAC,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,YAAA,CAAa,MAAS,CAAA;AAAA,MACxB,CAAA,MAAO;AAEL,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAEA,MAAA,WAAA,GAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,MAAM,mBAAmB,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAI,eAAe,EAAC;AACvE,IAAA,MAAM,SAAA,GAAY,aAAA,CACf,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,QAAQ,CAAA,CAC/B,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,KAAK,CAAA;AAE3B,IAAA,IAAI,gBAAA,CAAiB,MAAA,KAAW,SAAA,CAAU,MAAA,EAAQ;AAEhD,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,IACjB,CAAA,MAAO;AAEL,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,YAAY,KAAK,YAAA,CAAa,MAAA,KAAW,GAAG,OAAO,KAAA;AACtE,IAAA,MAAM,kBAAkB,aAAA,CAAc,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,KAAK,QAAQ,CAAA;AACrE,IAAA,OACE,eAAA,CAAgB,MAAA,GAAS,CAAA,IACzB,YAAA,CAAa,WAAW,eAAA,CAAgB,MAAA,IACxC,eAAA,CAAgB,KAAA,CAAM,CAAC,IAAA,KAAS,YAAA,CAAa,QAAA,CAAS,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EAErE,CAAA;AAEA,EAAA,uBACEC,cAAA,CAACC,2BACE,QAAA,EAAA,MAAA,oBACCD,cAAA;AAAA,IAACE,cAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,SAAS,EAAE,OAAA,EAAS,GAAG,KAAA,EAAO,GAAA,EAAK,GAAG,GAAA,EAAI;AAAA,MAC1C,SAAS,EAAE,OAAA,EAAS,GAAG,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,MAAMC,aAAA,EAAM;AAAA,MACzC,MAAM,EAAE,OAAA,EAAS,GAAG,KAAA,EAAO,GAAA,EAAK,GAAG,EAAA,EAAG;AAAA,MACtC,SAAA,EAAWC,2BAAA;AAAA,QACT,4FAAA;AAAA,QAAA,CACC,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,IAAA,KAAS,eAAA;AAAA,QACpC,oBAAoB,UAAA,IAAc,iBAAA;AAAA,QAClC,oBAAoB,YAAA,IAAgB,mBAAA;AAAA,QACpC,oBAAoB,WAAA,IAAe,kBAAA;AAAA,QACnC;AAAA,OACF;AAAA,MAEA,QAAA,kBAAAC,eAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,kBAAA;AAAA,UACL,QAAA,EAAU,YAAA;AAAA,UACV,SAAA,EAAWD,2BAAA;AAAA,YACT,uBAAA;AAAA,YACA,YAAA,IAAgB;AAAA,cACd,+BAAA;AAAA,cACA,CAAC,UAAA,IACC;AAAA;AACJ,WACF;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,QAAA,oBACCC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,eAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,eAAA;AAAA,kBACT,SAAA,EAAWD,2BAAA;AAAA,oBACT;AAAA,mBACF;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAJ,cAAA,CAACM,iBAAA,EAAA,EAAS,OAAA,EAAS,aAAA,EAAc,EAAG,CAAA;AAAA,oCACpCN,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,QAAA,EAAA,YAAA,EAEzD;AAAA;AAAA;AAAA,eACF;AAAA,8BACAA,cAAA,CAACO,eAAA,EAAA,EAAQ,SAAA,EAAU,YAAA,EAAa;AAAA,aAAA,EAClC,CAAA;AAAA,YAED,cAAc,MAAA,GAAS,CAAA,GACtB,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,qBACjBP,cAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBAEC,OAAO,IAAA,CAAK,KAAA;AAAA,gBACZ,IAAA,EACE,IAAA,CAAK,IAAA,EAAM,IAAA,GACP;AAAA,kBACE,IAAA,EAAM,KAAK,IAAA,CAAK,IAAA;AAAA,kBAChB,SAAA,EAAW,KAAK,IAAA,CAAK,SAAA;AAAA,kBACrB,IAAA,EAAM,KAAK,IAAA,CAAK,IAAA;AAAA,kBAChB,YAAA,EAAc,KAAK,IAAA,CAAK;AAAA,iBAC1B,GACA,MAAA;AAAA,gBAEN,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAAA,gBACzC,UAAU,IAAA,CAAK,QAAA;AAAA,gBACf,UAAA,EAAY,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AAAA,gBACrC;AAAA,eAAA;AAAA,cAfK,IAAA,CAAK;AAAA,aAiBb,CAAA,mBAEDA,cAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM;AAEb,kBAAA,IAAI,aAAA,EAAe;AACjB,oBAAA,aAAA,EAAc;AAAA,kBAChB;AAAA,gBACF,CAAA;AAAA,gBACA,SAAA,EAAU,8IAAA;AAAA,gBACX,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA;AAEJ;AAAA,GACF,EAEJ,CAAA;AAEJ;AAEO,MAAM,WAAW,CAAC;AAAA,EACvB,SAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA,GAAQ,UAAA;AAAA,EACR,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,YAAA,GAAe,KAAA;AAAA,EACf,MAAA;AAAA,EACA;AACF,CAAA,KAAqB;AACnB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIJ,eAAS,KAAK,CAAA;AAG1C,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAkB;AACzC,IAAA,IAAI,CAAC,QAAA,EAAU;AAEb,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,YAAA,CAAa,MAAS,CAAA;AAAA,MACxB,CAAA,MAAO;AAEL,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,GAAA,GAAMC,aAAuB,IAAI,CAAA;AAEvC,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EACjB,CAAA;AAGA,EAAAW,4BAAA,CAAkB,KAAqC,kBAAkB,CAAA;AAGzE,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,iBAAiB,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAI,eAAe,EAAC;AACrE,MAAA,OAAO,KAAA,CAAM,OAAO,CAAC,IAAA,KAAS,eAAe,QAAA,CAAS,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACnE,CAAA,MAAO;AACL,MAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,UAAU,YAAY,CAAA;AACjE,MAAA,OAAO,QAAA,GAAW,CAAC,QAAQ,CAAA,GAAI,EAAC;AAAA,IAClC;AAAA,EACF,CAAA;AAEA,EAAA,uBACEH,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAWD,2BAAA;AAAA,QACT,8CAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,cAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,gBAAA;AAAA,YACA,QAAA;AAAA,YACA,SAAA,EAAW,eAAA;AAAA,YACX,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,YAChC,eAAe,gBAAA,EAAiB;AAAA,YAChC,QAAA;AAAA,YACA,KAAA,EAAO,kBAAiB,CAAE,MAAA;AAAA,YAC1B,QAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,wBAEAA,cAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,YAAA;AAAA,YACA,YAAA;AAAA,YACA,QAAA;AAAA,YACA,aAAA;AAAA,YACA,IAAA;AAAA,YACA,MAAA;AAAA,YACA,WAAA,EAAa,eAAA;AAAA,YACb,YAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAEO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAgB,EAAC;AAAA,EACjB,QAAA,GAAW,KAAA;AAAA,EACX,KAAA,GAAQ,CAAA;AAAA,EACR,QAAA;AAAA,EACA;AACF,CAAA,KAA2B;AACzB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIJ,eAAS,KAAK,CAAA;AAGhD,EAAA,MAAM,YAAA,GAAe,cAAc,MAAA,GAAS,CAAA;AAC5C,EAAA,MAAM,iBAAA,GAAoB,cAAc,MAAA,KAAW,CAAA;AACnD,EAAA,MAAM,mBAAA,GAAsB,cAAc,MAAA,GAAS,CAAA;AAGnD,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,gBAAgB,iBAAA,EAAmB;AAErC,IAAA,MAAM,YAAA,GAAe,cAAc,CAAC,CAAA;AACpC,IAAA,UAAA,GAAa,aAAa,IAAA,GACtB;AAAA,MACE,IAAA,EAAM,aAAa,IAAA,CAAK,IAAA;AAAA,MACxB,SAAA,EAAW,YAAA,CAAa,IAAA,CAAK,SAAA,IAAa,EAAA;AAAA,MAC1C,IAAA,EAAM,YAAA,CAAa,IAAA,CAAK,IAAA,IAAQ,EAAA;AAAA,MAChC,YAAA,EAAc,aAAa,IAAA,CAAK;AAAA,KAClC,GACA,QAAA;AACJ,IAAA,WAAA,GAAc,YAAA,CAAa,KAAA;AAAA,EAC7B,CAAA,MAAA,IAAW,mBAAA,IAAuB,QAAA,IAAY,gBAAA,EAAkB;AAG9D,IAAA,MAAM,oBAAA,GAAuB,aAAA,CAC1B,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,IAAA,EAAM,YAAY,CAAA,CACxC,OAAA,CAAQ,CAAC,IAAA,KAAS,IAAA,CAAK,KAAM,YAAa,CAAA,CAC1C,MAAA,CAAO,CAAC,KAAA,EAAO,KAAA,EAAO,IAAA,KAAS,IAAA,CAAK,QAAQ,KAAK,CAAA,KAAM,KAAK,CAAA,CAC5D,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAEvB,IAAA,UAAA,GAAa,QAAA,GACT;AAAA,MACE,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,SAAA,EAAW,SAAS,SAAA,IAAa,EAAA;AAAA,MACjC,IAAA,EAAM,SAAS,IAAA,IAAQ,EAAA;AAAA,MACvB,YAAA,EACE,oBAAA,CAAqB,MAAA,GAAS,CAAA,GAC1B,uBACA,QAAA,CAAS;AAAA,KACjB,GACA,MAAA;AACJ,IAAA,WAAA,GAAc,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAA;AAAA,EAC5C,CAAA,MAAO;AAEL,IAAA,UAAA,GAAa,QAAA;AACb,IAAA,WAAA,GAAc,KAAA;AAAA,EAChB;AAEA,EAAA,uBACEI,cAAA;AAAA,IAACS,aAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,QAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,EAAQ,WAAA;AAAA,MACR,SAAA,EAAWL,2BAAA;AAAA,QACT,2CAAA;AAAA,QAAA,CACC,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,IAAA,KAAS,uBAAA;AAAA,QACpC,SAAS,IAAA,IAAQ,aAAA;AAAA,QACjB;AAAA,OACF;AAAA,MACA,cAAA,EAAgB,KAAA;AAAA,MAChB,cAAA,EAAgB;AAAA,QACd,OAAA,EAAS,SAAA;AAAA,QACT,OAAA,EAAS,CAAC,cAAc,CAAA;AAAA,QACxB,QAAA,EAAU,CAAC,SAAA,GAAY,EAAA,GAAK,EAAA;AAAA,QAC5B,QAAA,EAAU,CAAC,SAAA,GAAY,EAAA,GAAK,EAAA;AAAA,QAC5B,iBAAA,EAAmB,GAAA;AAAA,QACnB,cAAA,EAAgB,CAAA;AAAA,QAChB,SAAA,EAAW;AAAA,OACb;AAAA,MACA,OAAA;AAAA,MACA,YAAA,EAAc,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,MACrC,YAAA,EAAc,MAAM,YAAA,CAAa,KAAK;AAAA;AAAA,GACxC;AAEJ;AAEO,MAAM,eAAe,CAAC;AAAA,EAC3B,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb;AACF,CAAA,KAAyB;AACvB,EAAA,uBACEC,eAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAWD,2BAAA;AAAA,QACT,qJAAA;AAAA,QACA,SAAS,IAAA,IAAQ,0BAAA;AAAA,QACjB,SAAS,IAAA,IAAQ,0BAAA;AAAA,QACjB,SAAS,IAAA,IAAQ,mCAAA;AAAA,QACjB,UAAA,IAAc;AAAA,OAChB;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4DAAA,EACb,QAAA,kBAAAA,cAAA;AAAA,UAACU,0BAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,CAAA;AAAA,YACN,OAAA,EAAQ,SAAA;AAAA,YACR,OAAA,EAAS,CAAC,cAAc,CAAA;AAAA,YACxB,SAAA,EAAU,iBAAA;AAAA,YACV,cAAA,EAAgB,CAAA;AAAA,YAChB,iBAAA,EAAmB;AAAA;AAAA,SACrB,EACF,CAAA;AAAA,QAEC,IAAA,oBACCV,cAAA;AAAA,UAACW,SAAA;AAAA,UAAA;AAAA,YACC,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,SAAA,EAAWP,2BAAA,CAAW,eAAA,EAAiB,IAAA,CAAK,SAAS,CAAA;AAAA,YACrD,IAAA,EAAM,KAAK,IAAA,IAAQ,EAAA;AAAA,YACnB,cAAc,IAAA,CAAK;AAAA;AAAA,SACrB;AAAA,wBAEFJ,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWI,4BAAW,gDAAgD,CAAA;AAAA,YAErE,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ","file":"Dropdown.js","sourcesContent":["\"use client\";\n\nimport { Button, ButtonProps } from \"./Button\";\nimport { useRef, useState, useEffect, useCallback } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport classNames from \"classnames\";\nimport { swift } from \"./utils/easings\";\nimport { Checkbox } from \"./Checkbox\";\nimport { Divider } from \"./Divider\";\nimport { Icon, type IconProps } from \"./Icon\";\nimport { useOnClickOutside } from \"usehooks-ts\";\nimport { CrosshairCorners } from \"./CrossHair\";\n\nexport type DropdownProps = {\n className?: string;\n items: {\n label: string;\n icon?: IconProps;\n value: string;\n disabled?: boolean;\n }[];\n selectedItem?: string | string[] | undefined;\n handleChange: (item: string | string[] | undefined) => void;\n multiple?: boolean;\n disabled?: boolean;\n label: string;\n multiSelectLabel?: string;\n buttonClassName?: string;\n menuClassName?: string;\n menuIcon?: IconProps;\n size?: \"sm\" | \"md\" | \"lg\";\n isScrollable?: boolean;\n animationOrigin?: \"top-left\" | \"top-center\" | \"top-right\";\n search?: string;\n onClearSearch?: () => void;\n};\n\nexport type DropdownButtonProps = {\n label: string;\n multiSelectLabel?: string;\n disabled?: boolean;\n className?: string;\n onClick: () => void;\n buttonClassName?: string;\n selectedItems?: DropdownProps[\"items\"];\n multiple?: boolean;\n count?: number;\n menuIcon?: IconProps;\n size?: \"sm\" | \"md\" | \"lg\";\n};\n\nexport type DropdownItemProps = {\n label: string;\n icon?: IconProps;\n onClick: () => void;\n disabled?: boolean;\n isSelected?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n};\n\nexport type DropdownMenuProps = {\n items: {\n label: string;\n icon?: IconProps;\n value: string;\n disabled?: boolean;\n }[];\n selectedItem?: string | string[] | undefined;\n handleChange: (item: string | string[] | undefined) => void;\n multiple?: boolean;\n menuClassName?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n isOpen: boolean;\n onItemClick?: (value: string) => void;\n isScrollable?: boolean;\n animationOrigin?: \"top-left\" | \"top-center\" | \"top-right\";\n search?: string;\n onClearSearch?: () => void;\n};\n\nexport const DropdownMenu = ({\n items,\n selectedItem,\n handleChange,\n multiple = false,\n menuClassName,\n size = \"md\",\n isOpen,\n onItemClick,\n isScrollable = false,\n animationOrigin = \"top-left\",\n search,\n onClearSearch,\n}: DropdownMenuProps) => {\n const [isAtBottom, setIsAtBottom] = useState(false);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n // Filter items based on search term\n const filteredItems = (() => {\n // If search is provided, filter based on search\n if (search) {\n return items.filter((item) =>\n item.label.toLowerCase().includes(search.toLowerCase())\n );\n }\n\n // Default: show all items\n return items;\n })();\n\n // Handle scroll detection\n const handleScroll = useCallback(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const { scrollTop, scrollHeight, clientHeight } = container;\n const threshold = 5; // Small threshold to account for rounding\n const isNearBottom = scrollTop + clientHeight >= scrollHeight - threshold;\n\n setIsAtBottom(isNearBottom);\n }, []);\n\n // Reset scroll state when items change or menu opens\n useEffect(() => {\n if (isOpen) {\n setIsAtBottom(false);\n }\n }, [isOpen, filteredItems.length]);\n\n // Check if content is actually scrollable\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container || !isOpen) return;\n\n const { scrollHeight, clientHeight } = container;\n const hasScrollbar = scrollHeight > clientHeight;\n\n // If no scrollbar (content fits), consider it \"at bottom\"\n if (!hasScrollbar) {\n setIsAtBottom(true);\n }\n }, [isOpen, filteredItems.length]);\n\n // Helper to check if an item is selected\n const isItemSelected = (value: string) => {\n if (multiple) {\n return (\n Array.isArray(selectedItem) &&\n selectedItem.length > 0 &&\n selectedItem.includes(value)\n );\n }\n return !!selectedItem && selectedItem === value;\n };\n\n // Handle item selection\n const handleItemClick = (value: string) => {\n if (multiple) {\n const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];\n\n // If all items are selected, clicking any item should deselect all others\n if (isAllSelected()) {\n handleChange([value]);\n } else if (currentSelection.includes(value)) {\n // Remove from selection\n handleChange(currentSelection.filter((item) => item !== value));\n } else {\n // Add to selection\n handleChange([...currentSelection, value]);\n }\n } else {\n // Single select - if clicking the already selected item, deselect it\n if (selectedItem === value) {\n handleChange(undefined);\n } else {\n // Otherwise, select the new item\n handleChange(value);\n }\n // Call the optional callback for single select\n onItemClick?.(value);\n }\n };\n\n // Handle select all\n const handleSelectAll = () => {\n const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];\n const allValues = filteredItems\n .filter((item) => !item.disabled)\n .map((item) => item.value);\n\n if (currentSelection.length === allValues.length) {\n // Deselect all\n handleChange([]);\n } else {\n // Select all\n handleChange(allValues);\n }\n };\n\n // Check if all items are selected\n const isAllSelected = () => {\n if (!Array.isArray(selectedItem) || selectedItem.length === 0) return false;\n const selectableItems = filteredItems.filter((item) => !item.disabled);\n return (\n selectableItems.length > 0 &&\n selectedItem.length === selectableItems.length &&\n selectableItems.every((item) => selectedItem.includes(item.value))\n );\n };\n\n return (\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0, scale: 0.8, y: -15 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n transition={{ duration: 0.1, ease: swift }}\n exit={{ opacity: 0, scale: 0.8, y: -5 }}\n className={classNames(\n \"absolute top-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border\",\n (size === \"lg\" || size === \"md\") && \"min-w-[200px]\",\n animationOrigin === \"top-left\" && \"origin-top-left\",\n animationOrigin === \"top-center\" && \"origin-top-center\",\n animationOrigin === \"top-right\" && \"origin-top-right\",\n menuClassName\n )}\n >\n <div\n ref={scrollContainerRef}\n onScroll={handleScroll}\n className={classNames(\n \"flex flex-col gap-y-1\",\n isScrollable && [\n \"max-h-[250px] overflow-y-auto\",\n !isAtBottom &&\n \"[mask-image:linear-gradient(180deg,black,black_85%,transparent_100%)]\",\n ]\n )}\n >\n {multiple && (\n <div className=\"group flex flex-col gap-y-1\">\n <button\n onClick={handleSelectAll}\n className={classNames(\n \"py-3 pl-2.5 pr-3 flex items-center gap-x-2.5 outline-none bg-transparent transition-colors duration-100 ease-crisp hover:bg-border-light/50\"\n )}\n >\n <Checkbox checked={isAllSelected()} />\n <span className=\"text-sm text-shade-primary font-medium\">\n Select All\n </span>\n </button>\n <Divider direction=\"horizontal\" />\n </div>\n )}\n {filteredItems.length > 0 ? (\n filteredItems.map((item) => (\n <DropdownItem\n key={item.value}\n label={item.label}\n icon={\n item.icon?.name\n ? {\n name: item.icon.name,\n className: item.icon.className,\n size: item.icon.size,\n difficulties: item.icon.difficulties,\n }\n : undefined\n }\n onClick={() => handleItemClick(item.value)}\n disabled={item.disabled}\n isSelected={isItemSelected(item.value)}\n size={size}\n />\n ))\n ) : (\n <button\n onClick={() => {\n // Clear search by calling the onClearSearch callback\n if (onClearSearch) {\n onClearSearch();\n }\n }}\n className=\"py-3 pl-2.5 pr-3 text-sm font-mono text-shade-tertiary hover:bg-border-light/50 transition-colors duration-100 ease-crisp w-full text-center\"\n >\n No options found\n </button>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n\nexport const Dropdown = ({\n className,\n items,\n selectedItem,\n handleChange,\n label = \"View All\",\n multiSelectLabel,\n disabled,\n buttonClassName,\n menuClassName,\n multiple = false,\n menuIcon,\n size = \"md\",\n isScrollable = false,\n search,\n onClearSearch,\n}: DropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n\n // Handle item selection for single select (closes menu)\n const handleItemClick = (value: string) => {\n if (!multiple) {\n // Single select - if clicking the already selected item, deselect it\n if (selectedItem === value) {\n handleChange(undefined);\n } else {\n // Otherwise, select the new item\n handleChange(value);\n }\n setIsOpen(false);\n }\n };\n\n const ref = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = () => {\n setIsOpen(false);\n };\n\n // Cast ref to RefObject<HTMLElement> to satisfy useOnClickOutside's expected type\n useOnClickOutside(ref as React.RefObject<HTMLElement>, handleClickOutside);\n\n // Get selected items for display in button\n const getSelectedItems = () => {\n if (multiple) {\n const selectedValues = Array.isArray(selectedItem) ? selectedItem : [];\n return items.filter((item) => selectedValues.includes(item.value));\n } else {\n const selected = items.find((item) => item.value === selectedItem);\n return selected ? [selected] : [];\n }\n };\n\n return (\n <div\n ref={ref}\n className={classNames(\n \"relative flex flex-col gap-y-1.5 items-start\",\n className\n )}\n >\n <DropdownButton\n label={label}\n multiSelectLabel={multiSelectLabel}\n disabled={disabled}\n className={buttonClassName}\n onClick={() => setIsOpen(!isOpen)}\n selectedItems={getSelectedItems()}\n multiple={multiple}\n count={getSelectedItems().length}\n menuIcon={menuIcon}\n size={size}\n />\n\n <DropdownMenu\n items={items}\n selectedItem={selectedItem}\n handleChange={handleChange}\n multiple={multiple}\n menuClassName={menuClassName}\n size={size}\n isOpen={isOpen}\n onItemClick={handleItemClick}\n isScrollable={isScrollable}\n search={search}\n onClearSearch={onClearSearch}\n />\n </div>\n );\n};\n\nexport const DropdownButton = ({\n label,\n multiSelectLabel,\n disabled,\n className,\n onClick,\n selectedItems = [],\n multiple = false,\n count = 0,\n menuIcon,\n size,\n}: DropdownButtonProps) => {\n const [isHovered, setIsHovered] = useState(false);\n\n // Determine what to display\n const hasSelection = selectedItems.length > 0;\n const isSingleSelection = selectedItems.length === 1;\n const isMultipleSelection = selectedItems.length > 1;\n\n // Compute icon and label based on selection state\n let buttonIcon: ButtonProps[\"icon\"] | undefined;\n let buttonLabel: string;\n\n if (hasSelection && isSingleSelection) {\n // Single selection: show selected item's icon and label\n const selectedItem = selectedItems[0];\n buttonIcon = selectedItem.icon\n ? {\n name: selectedItem.icon.name,\n className: selectedItem.icon.className || \"\",\n size: selectedItem.icon.size || 18,\n difficulties: selectedItem.icon.difficulties,\n }\n : menuIcon;\n buttonLabel = selectedItem.label;\n } else if (isMultipleSelection && multiple && multiSelectLabel) {\n // Multiple selections: show count and multiSelectLabel\n // Collect all difficulties from selected items\n const combinedDifficulties = selectedItems\n .filter((item) => item.icon?.difficulties)\n .flatMap((item) => item.icon!.difficulties!)\n .filter((value, index, self) => self.indexOf(value) === index) // Remove duplicates\n .sort((a, b) => a - b); // Sort in ascending order\n\n buttonIcon = menuIcon\n ? {\n name: menuIcon.name,\n className: menuIcon.className || \"\",\n size: menuIcon.size || 18,\n difficulties:\n combinedDifficulties.length > 0\n ? combinedDifficulties\n : menuIcon.difficulties,\n }\n : undefined;\n buttonLabel = `${count} ${multiSelectLabel}`;\n } else {\n // Default: no selection\n buttonIcon = menuIcon;\n buttonLabel = label;\n }\n\n return (\n <Button\n icon={buttonIcon}\n label={buttonLabel}\n disabled={disabled}\n size={size}\n variant=\"secondary\"\n className={classNames(\n \"!origin-bottom-left !justify-start w-full\",\n (size === \"md\" || size === \"lg\") && \"!pr-[18px] !pl-[12px]\",\n size === \"sm\" && \"!pr-4 !pl-3\",\n className\n )}\n useHoverEffect={false}\n crosshairProps={{\n variant: \"corners\",\n corners: [\"bottom-right\"],\n spacingX: !isHovered ? -6 : -4,\n spacingY: !isHovered ? -6 : -4,\n animationDuration: 0.5,\n animationDelay: 0,\n className: \"text-shade-mute group-hover:text-shade-primary\",\n }}\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n />\n );\n};\n\nexport const DropdownItem = ({\n label,\n icon,\n onClick,\n disabled,\n isSelected = false,\n size,\n}: DropdownItemProps) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={classNames(\n \"hover:bg-border-light/50 relative group/item disabled:opacity-40 flex items-center gap-x-2.5 outline-none transition-colors duration-100 ease-crisp\",\n size === \"lg\" && \"py-4 pl-3 pr-3 text-base\",\n size === \"md\" && \"py-3 pl-2.5 pr-3 text-sm\",\n size === \"sm\" && \"py-2 pl-2.5 pr-3 h-[36px] text-sm\",\n isSelected && \"bg-background/50\"\n )}\n >\n <div className=\"opacity-0 group-hover/item:!opacity-100 absolute inset-0.5\">\n <CrosshairCorners\n size={6}\n variant=\"corners\"\n corners={[\"bottom-right\"]}\n className=\"text-shade-mute\"\n animationDelay={0}\n animationDuration={0.5}\n />\n </div>\n\n {icon && (\n <Icon\n name={icon.name}\n className={classNames(\"flex-shrink-0\", icon.className)}\n size={icon.size || 18}\n difficulties={icon.difficulties}\n />\n )}\n <span\n className={classNames(\" text-shade-primary font-medium leading-[100%]\")}\n >\n {label}\n </span>\n </button>\n );\n};\n"]}