@fluencypassdevs/cycle 1.15.0 → 1.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/bin/mcp.mjs +94 -0
  2. package/dist/{chunk-YINJ5YZ5.js → chunk-2NMEKWO5.js} +2 -2
  3. package/dist/{chunk-YINJ5YZ5.js.map → chunk-2NMEKWO5.js.map} +1 -1
  4. package/dist/{chunk-5I4PGGLN.js → chunk-3TSOMZJO.js} +4 -4
  5. package/dist/{chunk-5I4PGGLN.js.map → chunk-3TSOMZJO.js.map} +1 -1
  6. package/dist/{chunk-L32AMI4K.js → chunk-3VAYZAEF.js} +8 -8
  7. package/dist/{chunk-L32AMI4K.js.map → chunk-3VAYZAEF.js.map} +1 -1
  8. package/dist/{chunk-EF6FQT4Y.js → chunk-46SWH3RS.js} +4 -4
  9. package/dist/{chunk-EF6FQT4Y.js.map → chunk-46SWH3RS.js.map} +1 -1
  10. package/dist/{chunk-YJ4U7ISM.js → chunk-5Z3ZM7PS.js} +4 -4
  11. package/dist/{chunk-YJ4U7ISM.js.map → chunk-5Z3ZM7PS.js.map} +1 -1
  12. package/dist/{chunk-5BNTQSCS.js → chunk-6ANVMIR5.js} +4 -4
  13. package/dist/{chunk-5BNTQSCS.js.map → chunk-6ANVMIR5.js.map} +1 -1
  14. package/dist/{chunk-QZVQPUVT.js → chunk-6RHG4VOA.js} +4 -4
  15. package/dist/{chunk-QZVQPUVT.js.map → chunk-6RHG4VOA.js.map} +1 -1
  16. package/dist/{chunk-JMNMW54C.js → chunk-7AACZB3Q.js} +4 -4
  17. package/dist/{chunk-JMNMW54C.js.map → chunk-7AACZB3Q.js.map} +1 -1
  18. package/dist/{chunk-JGUDRAWA.js → chunk-AIBZJWUG.js} +8 -8
  19. package/dist/{chunk-JGUDRAWA.js.map → chunk-AIBZJWUG.js.map} +1 -1
  20. package/dist/{chunk-MTKKVYNS.js → chunk-AUCSNGST.js} +4 -4
  21. package/dist/{chunk-MTKKVYNS.js.map → chunk-AUCSNGST.js.map} +1 -1
  22. package/dist/{chunk-SZUWVHP4.js → chunk-C2P3ZSEY.js} +4 -4
  23. package/dist/{chunk-SZUWVHP4.js.map → chunk-C2P3ZSEY.js.map} +1 -1
  24. package/dist/{chunk-NOMLQHZS.js → chunk-C5JGLWV6.js} +4 -4
  25. package/dist/{chunk-NOMLQHZS.js.map → chunk-C5JGLWV6.js.map} +1 -1
  26. package/dist/{chunk-HZJRM5EK.js → chunk-C6YZNBOO.js} +5 -5
  27. package/dist/{chunk-HZJRM5EK.js.map → chunk-C6YZNBOO.js.map} +1 -1
  28. package/dist/{chunk-3EFI7PYC.js → chunk-CBBCTX3A.js} +5 -5
  29. package/dist/{chunk-3EFI7PYC.js.map → chunk-CBBCTX3A.js.map} +1 -1
  30. package/dist/{chunk-7NFHHOAE.js → chunk-CMOTOQK7.js} +4 -4
  31. package/dist/{chunk-7NFHHOAE.js.map → chunk-CMOTOQK7.js.map} +1 -1
  32. package/dist/chunk-DJ3DMPKK.js +56 -0
  33. package/dist/chunk-DJ3DMPKK.js.map +1 -0
  34. package/dist/{chunk-UJ6OER6O.js → chunk-DO4M3OVV.js} +6 -6
  35. package/dist/{chunk-UJ6OER6O.js.map → chunk-DO4M3OVV.js.map} +1 -1
  36. package/dist/{chunk-DCNZ2DRR.js → chunk-E3E64CT4.js} +6 -6
  37. package/dist/{chunk-DCNZ2DRR.js.map → chunk-E3E64CT4.js.map} +1 -1
  38. package/dist/{chunk-MSLQRGSP.js → chunk-E6WZOLWX.js} +4 -4
  39. package/dist/{chunk-MSLQRGSP.js.map → chunk-E6WZOLWX.js.map} +1 -1
  40. package/dist/{chunk-C6BQAAHX.js → chunk-EFT7BHN7.js} +3 -3
  41. package/dist/{chunk-C6BQAAHX.js.map → chunk-EFT7BHN7.js.map} +1 -1
  42. package/dist/{chunk-CIM6KJH5.js → chunk-EMX27A3U.js} +4 -4
  43. package/dist/{chunk-CIM6KJH5.js.map → chunk-EMX27A3U.js.map} +1 -1
  44. package/dist/{chunk-ELZCZ6ZH.js → chunk-EZVWNHDF.js} +5 -5
  45. package/dist/{chunk-ELZCZ6ZH.js.map → chunk-EZVWNHDF.js.map} +1 -1
  46. package/dist/{chunk-XHKFKLHD.js → chunk-FTR4NEFA.js} +4 -4
  47. package/dist/{chunk-XHKFKLHD.js.map → chunk-FTR4NEFA.js.map} +1 -1
  48. package/dist/chunk-G57PPNB3.js +74 -0
  49. package/dist/chunk-G57PPNB3.js.map +1 -0
  50. package/dist/{chunk-6JH4YWWX.js → chunk-GR65GV2N.js} +4 -4
  51. package/dist/{chunk-6JH4YWWX.js.map → chunk-GR65GV2N.js.map} +1 -1
  52. package/dist/{chunk-I5A3CME4.js → chunk-H6VG367Y.js} +4 -4
  53. package/dist/{chunk-I5A3CME4.js.map → chunk-H6VG367Y.js.map} +1 -1
  54. package/dist/{chunk-A3Z5GGAI.js → chunk-HBFS7W6V.js} +4 -4
  55. package/dist/{chunk-A3Z5GGAI.js.map → chunk-HBFS7W6V.js.map} +1 -1
  56. package/dist/{chunk-5NKTYXWQ.js → chunk-HCSVANPX.js} +5 -5
  57. package/dist/{chunk-5NKTYXWQ.js.map → chunk-HCSVANPX.js.map} +1 -1
  58. package/dist/{chunk-QANROH2K.js → chunk-HIAYFCBX.js} +4 -4
  59. package/dist/{chunk-QANROH2K.js.map → chunk-HIAYFCBX.js.map} +1 -1
  60. package/dist/{chunk-5HPZCREI.js → chunk-HXFGULDU.js} +4 -4
  61. package/dist/{chunk-5HPZCREI.js.map → chunk-HXFGULDU.js.map} +1 -1
  62. package/dist/{chunk-726XFHED.js → chunk-HZOLDTOT.js} +4 -4
  63. package/dist/{chunk-726XFHED.js.map → chunk-HZOLDTOT.js.map} +1 -1
  64. package/dist/{chunk-74WKJRW7.js → chunk-I4DM7SVV.js} +4 -4
  65. package/dist/{chunk-74WKJRW7.js.map → chunk-I4DM7SVV.js.map} +1 -1
  66. package/dist/{chunk-V7M2NHUO.js → chunk-IGFCIAF3.js} +3 -3
  67. package/dist/{chunk-V7M2NHUO.js.map → chunk-IGFCIAF3.js.map} +1 -1
  68. package/dist/{chunk-NYJMA2T7.js → chunk-ILYZQBBN.js} +4 -4
  69. package/dist/{chunk-NYJMA2T7.js.map → chunk-ILYZQBBN.js.map} +1 -1
  70. package/dist/{chunk-X4IBONFB.js → chunk-J3DGYZGK.js} +4 -4
  71. package/dist/{chunk-X4IBONFB.js.map → chunk-J3DGYZGK.js.map} +1 -1
  72. package/dist/{chunk-6OYSTCGP.js → chunk-JDGM46MB.js} +4 -4
  73. package/dist/{chunk-6OYSTCGP.js.map → chunk-JDGM46MB.js.map} +1 -1
  74. package/dist/{chunk-66CU7J2I.js → chunk-JDPJQSZV.js} +4 -4
  75. package/dist/{chunk-66CU7J2I.js.map → chunk-JDPJQSZV.js.map} +1 -1
  76. package/dist/{chunk-CWMXYPWK.js → chunk-JGZGZIGR.js} +4 -4
  77. package/dist/{chunk-CWMXYPWK.js.map → chunk-JGZGZIGR.js.map} +1 -1
  78. package/dist/chunk-JQRGW2RF.js +82 -0
  79. package/dist/chunk-JQRGW2RF.js.map +1 -0
  80. package/dist/{chunk-JRJBKPXW.js → chunk-JUVL7GN2.js} +4 -4
  81. package/dist/{chunk-JRJBKPXW.js.map → chunk-JUVL7GN2.js.map} +1 -1
  82. package/dist/{chunk-VXWMC2NK.js → chunk-K2XIXOMO.js} +4 -4
  83. package/dist/{chunk-VXWMC2NK.js.map → chunk-K2XIXOMO.js.map} +1 -1
  84. package/dist/{chunk-2MXR6RRJ.js → chunk-KCEFPJZT.js} +4 -4
  85. package/dist/{chunk-2MXR6RRJ.js.map → chunk-KCEFPJZT.js.map} +1 -1
  86. package/dist/{chunk-L2DJS6PG.js → chunk-KRENXLKC.js} +6 -6
  87. package/dist/{chunk-L2DJS6PG.js.map → chunk-KRENXLKC.js.map} +1 -1
  88. package/dist/{chunk-2EKU7RP4.js → chunk-KSALAAWD.js} +4 -4
  89. package/dist/{chunk-2EKU7RP4.js.map → chunk-KSALAAWD.js.map} +1 -1
  90. package/dist/{chunk-JJETOZMI.js → chunk-LBMPZDD5.js} +4 -4
  91. package/dist/{chunk-JJETOZMI.js.map → chunk-LBMPZDD5.js.map} +1 -1
  92. package/dist/{chunk-W4GSXVJ2.js → chunk-LC55JPI4.js} +4 -4
  93. package/dist/{chunk-W4GSXVJ2.js.map → chunk-LC55JPI4.js.map} +1 -1
  94. package/dist/{chunk-CG7NXMBC.js → chunk-M3U2TKWS.js} +8 -8
  95. package/dist/{chunk-CG7NXMBC.js.map → chunk-M3U2TKWS.js.map} +1 -1
  96. package/dist/{chunk-UEJLA7Q6.js → chunk-M56K3ZKY.js} +4 -4
  97. package/dist/{chunk-UEJLA7Q6.js.map → chunk-M56K3ZKY.js.map} +1 -1
  98. package/dist/{chunk-D4UH2HJQ.js → chunk-MJKZELI3.js} +7 -7
  99. package/dist/{chunk-D4UH2HJQ.js.map → chunk-MJKZELI3.js.map} +1 -1
  100. package/dist/{chunk-5XNYJECW.js → chunk-NE5CT5LH.js} +5 -5
  101. package/dist/{chunk-5XNYJECW.js.map → chunk-NE5CT5LH.js.map} +1 -1
  102. package/dist/{chunk-XQUQDZVA.js → chunk-OHRYR7PN.js} +3 -2
  103. package/dist/chunk-OHRYR7PN.js.map +1 -0
  104. package/dist/{chunk-NVA4ZJOS.js → chunk-QM54AVC7.js} +4 -4
  105. package/dist/{chunk-NVA4ZJOS.js.map → chunk-QM54AVC7.js.map} +1 -1
  106. package/dist/{chunk-TYCPXAXF.js → chunk-QTH4LSO6.js} +3 -2
  107. package/dist/chunk-QTH4LSO6.js.map +1 -0
  108. package/dist/{chunk-ZTANTDKS.js → chunk-RXCQLSWL.js} +4 -4
  109. package/dist/{chunk-ZTANTDKS.js.map → chunk-RXCQLSWL.js.map} +1 -1
  110. package/dist/{chunk-IGMII4BK.js → chunk-SCZXIVL5.js} +4 -4
  111. package/dist/{chunk-IGMII4BK.js.map → chunk-SCZXIVL5.js.map} +1 -1
  112. package/dist/{chunk-NW56QDQM.js → chunk-SDPIL7HA.js} +3 -2
  113. package/dist/chunk-SDPIL7HA.js.map +1 -0
  114. package/dist/{chunk-EACBYVLK.js → chunk-SIEPZ5LD.js} +4 -4
  115. package/dist/{chunk-EACBYVLK.js.map → chunk-SIEPZ5LD.js.map} +1 -1
  116. package/dist/{chunk-V3CBOIGK.js → chunk-SXCNJQ7S.js} +6 -6
  117. package/dist/{chunk-V3CBOIGK.js.map → chunk-SXCNJQ7S.js.map} +1 -1
  118. package/dist/{chunk-7ZXAU2CD.js → chunk-T5AHJXEY.js} +5 -5
  119. package/dist/{chunk-7ZXAU2CD.js.map → chunk-T5AHJXEY.js.map} +1 -1
  120. package/dist/{chunk-K2NUBNSA.js → chunk-T7EIAVSF.js} +3 -2
  121. package/dist/chunk-T7EIAVSF.js.map +1 -0
  122. package/dist/{chunk-F2Q3E2ZM.js → chunk-TBLO2A4C.js} +4 -4
  123. package/dist/{chunk-F2Q3E2ZM.js.map → chunk-TBLO2A4C.js.map} +1 -1
  124. package/dist/{chunk-HDCU6QSG.js → chunk-U27GHP5Z.js} +4 -4
  125. package/dist/{chunk-HDCU6QSG.js.map → chunk-U27GHP5Z.js.map} +1 -1
  126. package/dist/{chunk-VYHRNO77.js → chunk-U2SCIVKI.js} +4 -4
  127. package/dist/{chunk-VYHRNO77.js.map → chunk-U2SCIVKI.js.map} +1 -1
  128. package/dist/chunk-WCDYTWKA.js +105 -0
  129. package/dist/chunk-WCDYTWKA.js.map +1 -0
  130. package/dist/{chunk-AL2ALTBH.js → chunk-WL6J5ZVH.js} +4 -4
  131. package/dist/{chunk-AL2ALTBH.js.map → chunk-WL6J5ZVH.js.map} +1 -1
  132. package/dist/{chunk-5LZHXNBV.js → chunk-WMOGNJWP.js} +3 -3
  133. package/dist/{chunk-5LZHXNBV.js.map → chunk-WMOGNJWP.js.map} +1 -1
  134. package/dist/{chunk-TPRZMMT6.js → chunk-WUK6APAX.js} +6 -6
  135. package/dist/{chunk-TPRZMMT6.js.map → chunk-WUK6APAX.js.map} +1 -1
  136. package/dist/{chunk-NZXP7BAH.js → chunk-XDJ2E6KQ.js} +4 -4
  137. package/dist/{chunk-NZXP7BAH.js.map → chunk-XDJ2E6KQ.js.map} +1 -1
  138. package/dist/{chunk-F2XA2Z75.js → chunk-XMZVSCCY.js} +7 -7
  139. package/dist/{chunk-F2XA2Z75.js.map → chunk-XMZVSCCY.js.map} +1 -1
  140. package/dist/{chunk-7LH7PSQS.js → chunk-XXTQV27H.js} +6 -6
  141. package/dist/{chunk-7LH7PSQS.js.map → chunk-XXTQV27H.js.map} +1 -1
  142. package/dist/{chunk-3LXU5C35.js → chunk-Y33BGBHR.js} +4 -4
  143. package/dist/{chunk-3LXU5C35.js.map → chunk-Y33BGBHR.js.map} +1 -1
  144. package/dist/{chunk-JPEDYOV7.js → chunk-YW7VSQJE.js} +4 -4
  145. package/dist/{chunk-JPEDYOV7.js.map → chunk-YW7VSQJE.js.map} +1 -1
  146. package/dist/chunk-YZNOE4TO.js +48 -0
  147. package/dist/chunk-YZNOE4TO.js.map +1 -0
  148. package/dist/{chunk-PY2BIZNB.js → chunk-ZJRXBOM2.js} +4 -4
  149. package/dist/{chunk-PY2BIZNB.js.map → chunk-ZJRXBOM2.js.map} +1 -1
  150. package/dist/composites/chat-thread.js +14 -13
  151. package/dist/hooks/use-intersection.js +3 -2
  152. package/dist/hooks/use-reduced-motion.js +3 -2
  153. package/dist/icons/index.js +4 -3
  154. package/dist/icons/lucide.js +1 -0
  155. package/dist/index.js +56 -55
  156. package/dist/layout/container.js +4 -3
  157. package/dist/layout/grid.js +4 -3
  158. package/dist/layout/stack.js +4 -3
  159. package/dist/lib/utils.js +3 -2
  160. package/dist/logos/fluencypass.js +4 -3
  161. package/dist/logos/product.js +5 -4
  162. package/dist/marketing/buttons/cta-brand.d.ts +39 -0
  163. package/dist/marketing/buttons/cta-brand.js +8 -0
  164. package/dist/marketing/buttons/cta-brand.js.map +1 -0
  165. package/dist/marketing/buttons/index.d.ts +5 -0
  166. package/dist/marketing/buttons/index.js +9 -0
  167. package/dist/marketing/buttons/index.js.map +1 -0
  168. package/dist/marketing/buttons/link-brand.d.ts +39 -0
  169. package/dist/marketing/buttons/link-brand.js +6 -0
  170. package/dist/marketing/buttons/link-brand.js.map +1 -0
  171. package/dist/marketing/effects/card-dark-glow.js +4 -3
  172. package/dist/marketing/effects/circle-glow.js +4 -3
  173. package/dist/marketing/effects/hand-underline.d.ts +33 -0
  174. package/dist/marketing/effects/hand-underline.js +8 -0
  175. package/dist/marketing/effects/hand-underline.js.map +1 -0
  176. package/dist/marketing/effects/index.d.ts +3 -0
  177. package/dist/marketing/effects/index.js +11 -5
  178. package/dist/marketing/effects/magnetic-button.d.ts +36 -0
  179. package/dist/marketing/effects/magnetic-button.js +7 -0
  180. package/dist/marketing/effects/magnetic-button.js.map +1 -0
  181. package/dist/marketing/effects/marquee.js +4 -3
  182. package/dist/marketing/effects/rotating-word.d.ts +40 -0
  183. package/dist/marketing/effects/rotating-word.js +7 -0
  184. package/dist/marketing/effects/rotating-word.js.map +1 -0
  185. package/dist/marketing/layout/index.js +4 -3
  186. package/dist/marketing/layout/section.js +4 -3
  187. package/dist/marketing/motion/animated-number.js +6 -5
  188. package/dist/marketing/motion/index.js +9 -8
  189. package/dist/marketing/motion/reveal-on-scroll.js +6 -5
  190. package/dist/marketing/motion/smooth-anchor.js +3 -2
  191. package/dist/marketing/motion/stagger-reveal.js +6 -5
  192. package/dist/marketing/typography/hero-heading.js +4 -3
  193. package/dist/marketing/typography/index.js +7 -6
  194. package/dist/marketing/typography/section-eyebrow.js +4 -3
  195. package/dist/marketing/typography/section-heading.js +4 -3
  196. package/dist/marketing/typography/section-subtitle.js +4 -3
  197. package/dist/styles/tokens.css +37 -8
  198. package/dist/ui/accordion.js +4 -3
  199. package/dist/ui/alert-dialog.js +5 -4
  200. package/dist/ui/alert.js +6 -5
  201. package/dist/ui/audio-player.js +7 -6
  202. package/dist/ui/avatar.js +4 -3
  203. package/dist/ui/badge.js +4 -3
  204. package/dist/ui/button.js +4 -3
  205. package/dist/ui/chat-bubble.js +5 -4
  206. package/dist/ui/chat-message.js +10 -9
  207. package/dist/ui/chat-panel.js +9 -8
  208. package/dist/ui/checkbox.js +4 -3
  209. package/dist/ui/circular-progress.js +4 -3
  210. package/dist/ui/dialog.js +5 -4
  211. package/dist/ui/drawer.js +4 -3
  212. package/dist/ui/dropdown-menu.js +4 -3
  213. package/dist/ui/editor.js +8 -7
  214. package/dist/ui/empty.js +4 -3
  215. package/dist/ui/fab.js +4 -3
  216. package/dist/ui/file-card.js +4 -3
  217. package/dist/ui/input.js +4 -3
  218. package/dist/ui/label.js +4 -3
  219. package/dist/ui/like-dislike.js +8 -7
  220. package/dist/ui/live-waiting.js +7 -6
  221. package/dist/ui/message-bar.js +4 -3
  222. package/dist/ui/message-rating.js +4 -3
  223. package/dist/ui/player-i18n.js +3 -2
  224. package/dist/ui/popover.js +4 -3
  225. package/dist/ui/progress-dot.js +4 -3
  226. package/dist/ui/progress-stage.js +4 -3
  227. package/dist/ui/progress.js +4 -3
  228. package/dist/ui/radio-group.js +4 -3
  229. package/dist/ui/resizable.js +4 -3
  230. package/dist/ui/scroll-area.js +4 -3
  231. package/dist/ui/select.js +4 -3
  232. package/dist/ui/sheet.js +4 -3
  233. package/dist/ui/skeleton.js +4 -3
  234. package/dist/ui/slider.js +4 -3
  235. package/dist/ui/sonner.js +6 -5
  236. package/dist/ui/spinner.js +6 -5
  237. package/dist/ui/switch.js +4 -3
  238. package/dist/ui/tabs.js +4 -3
  239. package/dist/ui/textarea.js +4 -3
  240. package/dist/ui/toggle.js +4 -3
  241. package/dist/ui/tooltip.js +4 -3
  242. package/dist/ui/video-player.js +7 -6
  243. package/package.json +10 -2
  244. package/dist/chunk-K2NUBNSA.js.map +0 -1
  245. package/dist/chunk-NW56QDQM.js.map +0 -1
  246. package/dist/chunk-TYCPXAXF.js.map +0 -1
  247. package/dist/chunk-XQUQDZVA.js.map +0 -1
@@ -1,5 +1,6 @@
1
- export { ScrollArea, ScrollBar } from '../chunk-3LXU5C35.js';
2
- import '../chunk-TYCPXAXF.js';
3
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { ScrollArea, ScrollBar } from '../chunk-Y33BGBHR.js';
3
+ import '../chunk-QTH4LSO6.js';
4
+ import '../chunk-2NMEKWO5.js';
4
5
  //# sourceMappingURL=scroll-area.js.map
5
6
  //# sourceMappingURL=scroll-area.js.map
package/dist/ui/select.js CHANGED
@@ -1,5 +1,6 @@
1
- export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue } from '../chunk-SZUWVHP4.js';
2
- import '../chunk-TYCPXAXF.js';
3
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue } from '../chunk-C2P3ZSEY.js';
3
+ import '../chunk-QTH4LSO6.js';
4
+ import '../chunk-2NMEKWO5.js';
4
5
  //# sourceMappingURL=select.js.map
5
6
  //# sourceMappingURL=select.js.map
package/dist/ui/sheet.js CHANGED
@@ -1,5 +1,6 @@
1
- export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from '../chunk-QZVQPUVT.js';
2
- import '../chunk-TYCPXAXF.js';
3
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from '../chunk-6RHG4VOA.js';
3
+ import '../chunk-QTH4LSO6.js';
4
+ import '../chunk-2NMEKWO5.js';
4
5
  //# sourceMappingURL=sheet.js.map
5
6
  //# sourceMappingURL=sheet.js.map
@@ -1,5 +1,6 @@
1
- export { Skeleton } from '../chunk-2EKU7RP4.js';
2
- import '../chunk-TYCPXAXF.js';
3
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { Skeleton } from '../chunk-KSALAAWD.js';
3
+ import '../chunk-QTH4LSO6.js';
4
+ import '../chunk-2NMEKWO5.js';
4
5
  //# sourceMappingURL=skeleton.js.map
5
6
  //# sourceMappingURL=skeleton.js.map
package/dist/ui/slider.js CHANGED
@@ -1,5 +1,6 @@
1
- export { Slider, sliderVariants } from '../chunk-AL2ALTBH.js';
2
- import '../chunk-TYCPXAXF.js';
3
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { Slider, sliderVariants } from '../chunk-WL6J5ZVH.js';
3
+ import '../chunk-QTH4LSO6.js';
4
+ import '../chunk-2NMEKWO5.js';
4
5
  //# sourceMappingURL=slider.js.map
5
6
  //# sourceMappingURL=slider.js.map
package/dist/ui/sonner.js CHANGED
@@ -1,7 +1,8 @@
1
- export { Toaster, cycleToast } from '../chunk-ELZCZ6ZH.js';
2
- import '../chunk-JPEDYOV7.js';
3
- import '../chunk-V7M2NHUO.js';
4
- import '../chunk-TYCPXAXF.js';
5
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { Toaster, cycleToast } from '../chunk-EZVWNHDF.js';
3
+ import '../chunk-YW7VSQJE.js';
4
+ import '../chunk-IGFCIAF3.js';
5
+ import '../chunk-QTH4LSO6.js';
6
+ import '../chunk-2NMEKWO5.js';
6
7
  //# sourceMappingURL=sonner.js.map
7
8
  //# sourceMappingURL=sonner.js.map
@@ -1,7 +1,8 @@
1
- export { Spinner } from '../chunk-5XNYJECW.js';
2
- import '../chunk-JPEDYOV7.js';
3
- import '../chunk-V7M2NHUO.js';
4
- import '../chunk-TYCPXAXF.js';
5
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { Spinner } from '../chunk-NE5CT5LH.js';
3
+ import '../chunk-YW7VSQJE.js';
4
+ import '../chunk-IGFCIAF3.js';
5
+ import '../chunk-QTH4LSO6.js';
6
+ import '../chunk-2NMEKWO5.js';
6
7
  //# sourceMappingURL=spinner.js.map
7
8
  //# sourceMappingURL=spinner.js.map
package/dist/ui/switch.js CHANGED
@@ -1,5 +1,6 @@
1
- export { Switch, switchVariants } from '../chunk-NVA4ZJOS.js';
2
- import '../chunk-TYCPXAXF.js';
3
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { Switch, switchVariants } from '../chunk-QM54AVC7.js';
3
+ import '../chunk-QTH4LSO6.js';
4
+ import '../chunk-2NMEKWO5.js';
4
5
  //# sourceMappingURL=switch.js.map
5
6
  //# sourceMappingURL=switch.js.map
package/dist/ui/tabs.js CHANGED
@@ -1,5 +1,6 @@
1
- export { Tabs, TabsContent, TabsList, TabsTrigger, tabsListVariants } from '../chunk-2MXR6RRJ.js';
2
- import '../chunk-TYCPXAXF.js';
3
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { Tabs, TabsContent, TabsList, TabsTrigger, tabsListVariants } from '../chunk-KCEFPJZT.js';
3
+ import '../chunk-QTH4LSO6.js';
4
+ import '../chunk-2NMEKWO5.js';
4
5
  //# sourceMappingURL=tabs.js.map
5
6
  //# sourceMappingURL=tabs.js.map
@@ -1,5 +1,6 @@
1
- export { Textarea } from '../chunk-JJETOZMI.js';
2
- import '../chunk-TYCPXAXF.js';
3
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { Textarea } from '../chunk-LBMPZDD5.js';
3
+ import '../chunk-QTH4LSO6.js';
4
+ import '../chunk-2NMEKWO5.js';
4
5
  //# sourceMappingURL=textarea.js.map
5
6
  //# sourceMappingURL=textarea.js.map
package/dist/ui/toggle.js CHANGED
@@ -1,5 +1,6 @@
1
- export { Toggle, toggleVariants } from '../chunk-CIM6KJH5.js';
2
- import '../chunk-TYCPXAXF.js';
3
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { Toggle, toggleVariants } from '../chunk-EMX27A3U.js';
3
+ import '../chunk-QTH4LSO6.js';
4
+ import '../chunk-2NMEKWO5.js';
4
5
  //# sourceMappingURL=toggle.js.map
5
6
  //# sourceMappingURL=toggle.js.map
@@ -1,5 +1,6 @@
1
- export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../chunk-IGMII4BK.js';
2
- import '../chunk-TYCPXAXF.js';
3
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../chunk-SCZXIVL5.js';
3
+ import '../chunk-QTH4LSO6.js';
4
+ import '../chunk-2NMEKWO5.js';
4
5
  //# sourceMappingURL=tooltip.js.map
5
6
  //# sourceMappingURL=tooltip.js.map
@@ -1,8 +1,9 @@
1
- export { VideoPlayer } from '../chunk-V3CBOIGK.js';
2
- import '../chunk-C6BQAAHX.js';
3
- import '../chunk-JPEDYOV7.js';
4
- import '../chunk-V7M2NHUO.js';
5
- import '../chunk-TYCPXAXF.js';
6
- import '../chunk-YINJ5YZ5.js';
1
+ "use client";
2
+ export { VideoPlayer } from '../chunk-SXCNJQ7S.js';
3
+ import '../chunk-EFT7BHN7.js';
4
+ import '../chunk-YW7VSQJE.js';
5
+ import '../chunk-IGFCIAF3.js';
6
+ import '../chunk-QTH4LSO6.js';
7
+ import '../chunk-2NMEKWO5.js';
7
8
  //# sourceMappingURL=video-player.js.map
8
9
  //# sourceMappingURL=video-player.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluencypassdevs/cycle",
3
- "version": "1.15.0",
3
+ "version": "1.16.1",
4
4
  "description": "Cycle Design System — UI component library by Fluencypass",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -83,6 +83,14 @@
83
83
  "import": "./dist/marketing/effects/*.js",
84
84
  "types": "./dist/marketing/effects/*.d.ts"
85
85
  },
86
+ "./marketing/buttons": {
87
+ "import": "./dist/marketing/buttons/index.js",
88
+ "types": "./dist/marketing/buttons/index.d.ts"
89
+ },
90
+ "./marketing/buttons/*": {
91
+ "import": "./dist/marketing/buttons/*.js",
92
+ "types": "./dist/marketing/buttons/*.d.ts"
93
+ },
86
94
  "./styles.css": "./dist/styles/tokens.css",
87
95
  "./tailwind-theme.css": "./dist/styles/tokens.css"
88
96
  },
@@ -99,7 +107,7 @@
99
107
  "scripts": {
100
108
  "dev": "next dev",
101
109
  "build": "next build",
102
- "build:lib": "tsup && mkdir -p dist/styles && cp src/styles/tokens.css dist/styles/tokens.css",
110
+ "build:lib": "tsup && mkdir -p dist/styles && cp src/styles/tokens.css dist/styles/tokens.css && node scripts/add-use-client-prefix.mjs",
103
111
  "start": "next start",
104
112
  "lint": "eslint",
105
113
  "registry:build": "tsx scripts/build-registry.ts",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-reduced-motion.ts"],"names":[],"mappings":";;AAYO,SAAS,gBAAA,GAA4B;AAC1C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAE5C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA;AAClE,IAAA,UAAA,CAAW,MAAM,OAAO,CAAA;AAExB,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAA+B,UAAA,CAAW,MAAM,OAAO,CAAA;AACxE,IAAA,KAAA,CAAM,gBAAA,CAAiB,UAAU,OAAO,CAAA;AACxC,IAAA,OAAO,MAAM,KAAA,CAAM,mBAAA,CAAoB,QAAA,EAAU,OAAO,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,OAAA;AACT","file":"chunk-K2NUBNSA.js","sourcesContent":["\"use client\"\n\nimport { useEffect, useState } from \"react\"\n\n/**\n * Returns `true` quando o usuario habilitou \"prefers-reduced-motion\" no SO.\n * Componentes do `marketing/motion/*` consultam esse hook pra desligar animacoes\n * (resolver para o estado final direto) — requisito WCAG 2.3.3.\n *\n * SSR-safe: comeca em `false` no server e atualiza no client apos mount.\n * Reage a mudancas dinamicas (usuario toggla a preferencia com a aba aberta).\n */\nexport function useReducedMotion(): boolean {\n const [reduced, setReduced] = useState(false)\n\n useEffect(() => {\n const media = window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n setReduced(media.matches)\n\n const handler = (event: MediaQueryListEvent) => setReduced(event.matches)\n media.addEventListener(\"change\", handler)\n return () => media.removeEventListener(\"change\", handler)\n }, [])\n\n return reduced\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/marketing/motion/smooth-anchor.tsx"],"names":[],"mappings":"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","file":"chunk-NW56QDQM.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\n\nexport interface SmoothAnchorProps {\n /** Offset em px pra compensar header sticky. Default `96`. */\n headerOffset?: number\n /** Duracao do scroll em ms. Default `900`. */\n duration?: number\n}\n\n/**\n * Intercepta cliques em links de hash (`<a href=\"#algo\">`) e faz scroll suave\n * com easing `easeInOutCubic` em vez do `scroll-behavior: smooth` nativo\n * (que tem duracao curta e easing fixo).\n *\n * Renderiza `null` (so registra listener global). Monte UMA VEZ por app,\n * tipicamente no `<RootLayout>` ou na pagina raiz da landing.\n *\n * Comportamento:\n * - Ignora clicks com modificadores (cmd/ctrl/middle-button).\n * - Atualiza URL via `history.replaceState` sem disparar scroll nativo.\n * - Adiciona classe `anchor-target-pulse` no destino apos chegar (animacao\n * visual opcional, definida em `globals.css`).\n * - Respeita `prefers-reduced-motion` (scroll instantaneo, sem easing).\n *\n * @example\n * // app/layout.tsx\n * <body>\n * <SmoothAnchor headerOffset={64} />\n * {children}\n * </body>\n */\nfunction SmoothAnchor({ headerOffset = 96, duration = 900 }: SmoothAnchorProps) {\n React.useEffect(() => {\n if (typeof window === \"undefined\") return\n\n // Se a pagina abre ja com hash, pulsa o destino apos o scroll inicial.\n if (window.location.hash) {\n const id = window.location.hash.slice(1)\n const el = document.getElementById(id)\n if (el) {\n requestAnimationFrame(() => el.classList.add(\"anchor-target-pulse\"))\n }\n }\n\n function onClick(e: MouseEvent) {\n if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey) return\n const target = e.target as HTMLElement | null\n const anchor = target?.closest('a[href^=\"#\"]') as HTMLAnchorElement | null\n if (!anchor) return\n const href = anchor.getAttribute(\"href\")\n if (!href || href === \"#\") return\n const id = href.slice(1)\n const el = document.getElementById(id)\n if (!el) return\n\n e.preventDefault()\n const prefersReduced = window.matchMedia(\n \"(prefers-reduced-motion: reduce)\"\n ).matches\n\n const rect = el.getBoundingClientRect()\n const targetY = window.scrollY + rect.top - headerOffset\n\n if (prefersReduced) {\n window.scrollTo(0, targetY)\n } else {\n smoothScrollTo(targetY, duration)\n }\n\n history.replaceState(null, \"\", href)\n // Reativa pulse mesmo se a URL ja for a mesma\n el.classList.remove(\"anchor-target-pulse\")\n void el.offsetWidth\n el.classList.add(\"anchor-target-pulse\")\n }\n\n document.addEventListener(\"click\", onClick)\n return () => document.removeEventListener(\"click\", onClick)\n }, [headerOffset, duration])\n\n return null\n}\n\nfunction smoothScrollTo(targetY: number, duration: number) {\n const startY = window.scrollY\n const distance = targetY - startY\n if (Math.abs(distance) < 2) return\n const startTime = performance.now()\n\n function step(now: number) {\n const elapsed = now - startTime\n const t = Math.min(elapsed / duration, 1)\n const eased = easeInOutCubic(t)\n window.scrollTo(0, startY + distance * eased)\n if (t < 1) requestAnimationFrame(step)\n }\n\n requestAnimationFrame(step)\n}\n\nfunction easeInOutCubic(t: number): number {\n return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2\n}\n\nexport { SmoothAnchor }\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/utils.ts"],"names":[],"mappings":";;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B","file":"chunk-TYCPXAXF.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-intersection.ts"],"names":[],"mappings":";;AAiCO,SAAS,eAAA,CACd,OAAA,GAAkC,EAAC,EACqB;AACxD,EAAA,MAAM;AAAA,IACJ,SAAA,GAAY,IAAA;AAAA,IACZ,UAAA,GAAa,kBAAA;AAAA,IACb,IAAA,GAAO,IAAA;AAAA,IACP,IAAA,GAAO,IAAA;AAAA,IACP,YAAA,GAAe;AAAA,GACjB,GAAI,OAAA;AAEJ,EAAA,MAAM,GAAA,GAAM,OAAiB,IAAI,CAAA;AACjC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,YAAY,CAAA;AAEvD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,CAAC,KAAK,CAAA,KAAM;AACX,QAAA,IAAI,+BAAO,cAAA,EAAgB;AACzB,UAAA,YAAA,CAAa,IAAI,CAAA;AACjB,UAAA,IAAI,IAAA,WAAe,UAAA,EAAW;AAAA,QAChC,CAAA,MAAA,IAAW,CAAC,IAAA,EAAM;AAChB,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF,CAAA;AAAA,MACA,EAAE,SAAA,EAAW,UAAA,EAAY,IAAA;AAAK,KAChC;AAEA,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,GAAG,CAAC,SAAA,EAAW,YAAY,IAAA,EAAM,IAAA,EAAM,YAAY,CAAC,CAAA;AAEpD,EAAA,OAAO,EAAE,KAAK,SAAA,EAAU;AAC1B","file":"chunk-XQUQDZVA.js","sourcesContent":["\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\n\nexport interface UseIntersectionOptions {\n /** Quanto do elemento precisa estar visivel pra disparar (0-1). Default `0.15`. */\n threshold?: number\n /** Margin do viewport (CSS shorthand). Default `\"0px 0px -10% 0px\"`. */\n rootMargin?: string\n /** Container alternativo (default: viewport). */\n root?: Element | null\n /** Quando `true`, desliga o observer apos a primeira intersecao. Default `true`. */\n once?: boolean\n /**\n * Quando `true`, comeca como visivel (sem aguardar observer). Util quando\n * `useReducedMotion()` e true e queremos pular a animacao de entrada.\n */\n startVisible?: boolean\n}\n\n/**\n * Observa um elemento e retorna `{ ref, isVisible }`. Reusado por\n * `RevealOnScroll`, `StaggerReveal` e `AnimatedNumber`.\n *\n * Comportamento:\n * - SSR-safe (so monta IntersectionObserver no client).\n * - `once=true` (default) desconecta o observer apos a primeira intersecao.\n * - `startVisible=true` ja entrega `isVisible: true` no primeiro render.\n *\n * @example\n * const { ref, isVisible } = useIntersection({ threshold: 0.4 })\n * return <div ref={ref}>{isVisible ? \"visible\" : \"hidden\"}</div>\n */\nexport function useIntersection<T extends HTMLElement = HTMLDivElement>(\n options: UseIntersectionOptions = {}\n): { ref: React.RefObject<T | null>; isVisible: boolean } {\n const {\n threshold = 0.15,\n rootMargin = \"0px 0px -10% 0px\",\n root = null,\n once = true,\n startVisible = false,\n } = options\n\n const ref = useRef<T | null>(null)\n const [isVisible, setIsVisible] = useState(startVisible)\n\n useEffect(() => {\n if (startVisible) return\n const el = ref.current\n if (!el) return\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry?.isIntersecting) {\n setIsVisible(true)\n if (once) observer.disconnect()\n } else if (!once) {\n setIsVisible(false)\n }\n },\n { threshold, rootMargin, root }\n )\n\n observer.observe(el)\n return () => observer.disconnect()\n }, [threshold, rootMargin, root, once, startVisible])\n\n return { ref, isVisible }\n}\n"]}