@hanzo/ui 5.3.19 → 5.3.21

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 (229) hide show
  1. package/dist/3d/button.js +298 -1
  2. package/dist/3d/button.mjs +273 -1
  3. package/dist/3d/card.js +234 -1
  4. package/dist/3d/card.mjs +207 -1
  5. package/dist/3d/carousel.js +371 -1
  6. package/dist/3d/carousel.mjs +344 -1
  7. package/dist/3d/grid.js +362 -1
  8. package/dist/3d/grid.mjs +337 -1
  9. package/dist/3d/index.js +1518 -1
  10. package/dist/3d/index.mjs +1472 -1
  11. package/dist/3d/marquee.js +352 -1
  12. package/dist/3d/marquee.mjs +327 -1
  13. package/dist/3d/pin.js +46 -1
  14. package/dist/3d/pin.mjs +24 -1
  15. package/dist/accordion.js +80 -1
  16. package/dist/accordion.mjs +55 -1
  17. package/dist/alert-dialog.js +220 -1
  18. package/dist/alert-dialog.mjs +187 -1
  19. package/dist/alert.js +68 -1
  20. package/dist/alert.mjs +64 -1
  21. package/dist/animation/animated-background.js +424 -1
  22. package/dist/animation/animated-background.mjs +418 -1
  23. package/dist/animation/animated-beam.js +119 -1
  24. package/dist/animation/animated-beam.mjs +97 -1
  25. package/dist/animation/animated-cursor.js +275 -1
  26. package/dist/animation/animated-cursor.mjs +270 -1
  27. package/dist/animation/animated-icon.js +357 -2
  28. package/dist/animation/animated-icon.mjs +351 -2
  29. package/dist/animation/animated-list.js +339 -1
  30. package/dist/animation/animated-list.mjs +333 -1
  31. package/dist/animation/animated-number.js +283 -1
  32. package/dist/animation/animated-number.mjs +277 -1
  33. package/dist/animation/animated-testimonials.js +97 -1
  34. package/dist/animation/animated-testimonials.mjs +75 -1
  35. package/dist/animation/animated-tooltip.js +67 -1
  36. package/dist/animation/animated-tooltip.mjs +45 -1
  37. package/dist/animation/apple-cards-carousel.js +308 -1
  38. package/dist/animation/apple-cards-carousel.mjs +285 -1
  39. package/dist/animation/apple-hello-effect.js +60 -1
  40. package/dist/animation/apple-hello-effect.mjs +38 -1
  41. package/dist/animation/index.js +1952 -2
  42. package/dist/animation/index.mjs +1921 -2
  43. package/dist/avatar.js +71 -1
  44. package/dist/avatar.mjs +47 -1
  45. package/dist/badge.js +66 -1
  46. package/dist/badge.mjs +40 -1
  47. package/dist/blocks/index.js +1665 -2
  48. package/dist/blocks/index.mjs +1626 -2
  49. package/dist/breadcrumb.js +107 -1
  50. package/dist/breadcrumb.mjs +99 -1
  51. package/dist/calendar.js +189 -1
  52. package/dist/calendar.mjs +164 -1
  53. package/dist/carousel.js +278 -1
  54. package/dist/carousel.mjs +249 -1
  55. package/dist/checkbox.js +60 -1
  56. package/dist/checkbox.mjs +35 -1
  57. package/dist/code/block.js +226 -2
  58. package/dist/code/block.mjs +203 -2
  59. package/dist/code/compare.js +445 -5
  60. package/dist/code/compare.mjs +422 -5
  61. package/dist/code/diff.js +430 -12
  62. package/dist/code/diff.mjs +406 -11
  63. package/dist/code/editor.js +243 -1
  64. package/dist/code/editor.mjs +218 -1
  65. package/dist/code/explorer.js +291 -1
  66. package/dist/code/explorer.mjs +268 -1
  67. package/dist/code/index.js +2515 -26
  68. package/dist/code/index.mjs +2472 -24
  69. package/dist/code/preview.js +364 -6
  70. package/dist/code/preview.mjs +341 -6
  71. package/dist/code/snippet.js +274 -2
  72. package/dist/code/snippet.mjs +250 -2
  73. package/dist/code/tabs.js +75 -1
  74. package/dist/code/tabs.mjs +53 -1
  75. package/dist/code/terminal.js +437 -3
  76. package/dist/code/terminal.mjs +414 -3
  77. package/dist/collapsible.js +33 -1
  78. package/dist/collapsible.mjs +9 -1
  79. package/dist/command.js +262 -1
  80. package/dist/command.mjs +232 -1
  81. package/dist/context-menu.js +207 -1
  82. package/dist/context-menu.mjs +171 -1
  83. package/dist/device/index.js +3 -1
  84. package/dist/device/index.mjs +2 -0
  85. package/dist/dialog.js +151 -1
  86. package/dist/dialog.mjs +121 -1
  87. package/dist/dock/basic.js +174 -1
  88. package/dist/dock/basic.mjs +151 -1
  89. package/dist/dock/index.js +628 -1
  90. package/dist/dock/index.mjs +601 -1
  91. package/dist/dock/limelight-nav.js +295 -1
  92. package/dist/dock/limelight-nav.mjs +274 -1
  93. package/dist/dock/macos.js +141 -1
  94. package/dist/dock/macos.mjs +118 -1
  95. package/dist/dock/menu.js +70 -1
  96. package/dist/dock/menu.mjs +48 -1
  97. package/dist/dock/message.js +144 -1
  98. package/dist/dock/message.mjs +122 -1
  99. package/dist/drawer.js +115 -1
  100. package/dist/drawer.mjs +103 -1
  101. package/dist/dropdown-menu.js +202 -1
  102. package/dist/dropdown-menu.mjs +166 -1
  103. package/dist/finance/AdvancedChart.js +48 -2
  104. package/dist/finance/AdvancedChart.mjs +46 -2
  105. package/dist/finance/CompanyProfile.js +48 -2
  106. package/dist/finance/CompanyProfile.mjs +46 -2
  107. package/dist/finance/CryptoScreener.js +45 -2
  108. package/dist/finance/CryptoScreener.mjs +43 -2
  109. package/dist/finance/Financials.js +52 -2
  110. package/dist/finance/Financials.mjs +50 -2
  111. package/dist/finance/ForexScreener.js +46 -2
  112. package/dist/finance/ForexScreener.mjs +44 -2
  113. package/dist/finance/MarketOverview.js +104 -2
  114. package/dist/finance/MarketOverview.mjs +102 -2
  115. package/dist/finance/NewsTimeline.js +44 -2
  116. package/dist/finance/NewsTimeline.mjs +42 -2
  117. package/dist/finance/OrderEntry.js +131 -1
  118. package/dist/finance/OrderEntry.mjs +129 -1
  119. package/dist/finance/OrdersHistory.js +64 -1
  120. package/dist/finance/OrdersHistory.mjs +62 -1
  121. package/dist/finance/PositionsList.js +80 -1
  122. package/dist/finance/PositionsList.mjs +78 -1
  123. package/dist/finance/StockScreener.js +46 -2
  124. package/dist/finance/StockScreener.mjs +44 -2
  125. package/dist/finance/SymbolInfo.js +46 -2
  126. package/dist/finance/SymbolInfo.mjs +44 -2
  127. package/dist/finance/TechnicalAnalysis.js +54 -2
  128. package/dist/finance/TechnicalAnalysis.mjs +52 -2
  129. package/dist/finance/TickerTape.js +56 -2
  130. package/dist/finance/TickerTape.mjs +54 -2
  131. package/dist/finance/TradingPanel.js +191 -1
  132. package/dist/finance/TradingPanel.mjs +189 -1
  133. package/dist/finance/index.js +930 -2
  134. package/dist/finance/index.mjs +914 -2
  135. package/dist/form/index.js +155 -1
  136. package/dist/form/index.mjs +125 -1
  137. package/dist/form.js +172 -1
  138. package/dist/form.mjs +142 -1
  139. package/dist/hover-card.js +58 -1
  140. package/dist/hover-card.mjs +34 -1
  141. package/dist/index.js +8467 -192
  142. package/dist/index.mjs +8087 -192
  143. package/dist/input-otp.js +79 -1
  144. package/dist/input-otp.mjs +54 -1
  145. package/dist/lib/utils.js +29 -1
  146. package/dist/lib/utils.mjs +25 -1
  147. package/dist/navigation/index.js +98 -1
  148. package/dist/navigation/index.mjs +79 -1
  149. package/dist/navigation-menu.js +149 -1
  150. package/dist/navigation-menu.mjs +116 -1
  151. package/dist/pattern/grid-pattern.js +326 -3
  152. package/dist/pattern/grid-pattern.mjs +303 -3
  153. package/dist/pattern/index.js +326 -3
  154. package/dist/pattern/index.mjs +303 -3
  155. package/dist/popover.js +63 -1
  156. package/dist/popover.mjs +37 -1
  157. package/dist/primitives/index.js +8467 -192
  158. package/dist/primitives/index.mjs +8087 -192
  159. package/dist/primitives-export.js +8467 -192
  160. package/dist/primitives-export.mjs +8087 -192
  161. package/dist/progress.js +62 -1
  162. package/dist/progress.mjs +37 -1
  163. package/dist/project/gantt.js +65 -1
  164. package/dist/project/gantt.mjs +43 -1
  165. package/dist/project/index.js +636 -1
  166. package/dist/project/index.mjs +611 -1
  167. package/dist/project/kanban.js +597 -1
  168. package/dist/project/kanban.mjs +572 -1
  169. package/dist/project/list.js +35 -1
  170. package/dist/project/list.mjs +12 -1
  171. package/dist/radio-group.js +68 -1
  172. package/dist/radio-group.mjs +45 -1
  173. package/dist/resizable.js +72 -1
  174. package/dist/resizable.mjs +48 -1
  175. package/dist/scroll-area.js +89 -1
  176. package/dist/scroll-area.mjs +66 -1
  177. package/dist/select.js +140 -1
  178. package/dist/select.mjs +111 -1
  179. package/dist/separator.js +59 -1
  180. package/dist/separator.mjs +34 -1
  181. package/dist/sheet.js +148 -1
  182. package/dist/sheet.mjs +117 -1
  183. package/dist/skeleton.js +32 -1
  184. package/dist/skeleton.mjs +27 -1
  185. package/dist/slider.js +99 -1
  186. package/dist/slider.mjs +73 -1
  187. package/dist/sonner.js +34 -1
  188. package/dist/sonner.mjs +29 -1
  189. package/dist/switch.js +62 -1
  190. package/dist/switch.mjs +37 -1
  191. package/dist/table.js +110 -1
  192. package/dist/table.mjs +101 -1
  193. package/dist/tabs.js +82 -1
  194. package/dist/tabs.mjs +57 -1
  195. package/dist/tailwind/index.js +2024 -1
  196. package/dist/tailwind/index.mjs +2012 -1
  197. package/dist/textarea.js +78 -1
  198. package/dist/textarea.mjs +56 -1
  199. package/dist/toggle-group.js +118 -1
  200. package/dist/toggle-group.mjs +93 -1
  201. package/dist/toggle.js +71 -1
  202. package/dist/toggle.mjs +48 -1
  203. package/dist/tooltip.js +67 -1
  204. package/dist/tooltip.mjs +40 -1
  205. package/dist/types/index.js +58 -1
  206. package/dist/types/index.mjs +52 -1
  207. package/dist/ui/announcement.js +129 -1
  208. package/dist/ui/announcement.mjs +107 -1
  209. package/dist/ui/avatar-group.js +88 -1
  210. package/dist/ui/avatar-group.mjs +65 -1
  211. package/dist/ui/banner.js +85 -1
  212. package/dist/ui/banner.mjs +62 -1
  213. package/dist/ui/cursor.js +78 -1
  214. package/dist/ui/cursor.mjs +56 -1
  215. package/dist/ui/index.js +475 -1
  216. package/dist/ui/index.mjs +442 -1
  217. package/dist/ui/marquee.js +74 -1
  218. package/dist/ui/marquee.mjs +52 -1
  219. package/dist/ui/pill.js +85 -1
  220. package/dist/ui/pill.mjs +62 -1
  221. package/dist/ui/spinner.js +28 -1
  222. package/dist/ui/spinner.mjs +26 -1
  223. package/dist/ui/tags.js +101 -1
  224. package/dist/ui/tags.mjs +79 -1
  225. package/dist/ui/ticker.js +73 -1
  226. package/dist/ui/ticker.mjs +51 -1
  227. package/dist/util/index.js +458 -1
  228. package/dist/util/index.mjs +400 -1
  229. package/package.json +1 -1
package/dist/3d/button.js CHANGED
@@ -1 +1,298 @@
1
- 'use strict';var e=require('react'),classVarianceAuthority=require('class-variance-authority'),utils=require('@hanzo/ui/lib/utils'),jsxRuntime=require('react/jsx-runtime');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var e__namespace=/*#__PURE__*/_interopNamespace(e);var G=classVarianceAuthority.cva(["relative inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium","transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring","disabled:pointer-events-none disabled:opacity-50 cursor-pointer select-none","transform-gpu will-change-transform active:scale-95","before:absolute before:inset-0 before:rounded-md before:transition-all before:duration-150","after:absolute after:inset-0 after:rounded-md after:transition-all after:duration-150"],{variants:{variant:{default:["bg-primary text-primary-foreground shadow-md hover:bg-primary/90","before:bg-gradient-to-t before:from-primary/80 before:to-primary before:translate-y-1 before:shadow-lg","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0","hover:after:opacity-100"],destructive:["bg-destructive text-destructive-foreground shadow-md hover:bg-destructive/90","before:bg-gradient-to-t before:from-destructive/80 before:to-destructive before:translate-y-1 before:shadow-lg","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0","hover:after:opacity-100"],outline:["border border-input bg-background text-foreground shadow-sm hover:bg-accent hover:text-accent-foreground","before:bg-gradient-to-t before:from-muted/50 before:to-background before:translate-y-1 before:border before:border-input","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/10 after:to-transparent after:opacity-0","hover:after:opacity-100"],secondary:["bg-secondary text-secondary-foreground shadow-md hover:bg-secondary/80","before:bg-gradient-to-t before:from-secondary/80 before:to-secondary before:translate-y-1 before:shadow-lg","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0","hover:after:opacity-100"],ghost:["text-foreground hover:bg-accent hover:text-accent-foreground","before:bg-gradient-to-t before:from-accent/30 before:to-accent/10 before:translate-y-1 before:opacity-0","hover:before:opacity-100 hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/10 after:to-transparent after:opacity-0","hover:after:opacity-50"],link:["text-primary underline-offset-4 hover:underline","before:hidden after:hidden"],neon:["bg-gradient-to-r from-purple-500 to-pink-500 text-white shadow-lg","before:bg-gradient-to-t before:from-purple-600 before:to-pink-600 before:translate-y-1 before:shadow-lg","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/30 after:to-transparent after:opacity-0","hover:after:opacity-100","hover:shadow-purple-500/25 hover:shadow-2xl"],glass:["bg-white/10 backdrop-blur-md border border-white/20 text-foreground shadow-lg","before:bg-gradient-to-t before:from-white/5 before:to-white/20 before:translate-y-1 before:backdrop-blur-md before:border before:border-white/20","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/30 after:to-transparent after:opacity-0","hover:after:opacity-100"],gradient:["bg-gradient-to-r from-blue-500 via-purple-500 to-pink-500 text-white shadow-lg","before:bg-gradient-to-t before:from-blue-600 before:via-purple-600 before:to-pink-600 before:translate-y-1 before:shadow-lg","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0","hover:after:opacity-100","hover:bg-gradient-to-r hover:from-blue-400 hover:via-purple-400 hover:to-pink-400"]},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",xl:"h-12 rounded-lg px-10 text-base",icon:"h-10 w-10"},depth:{none:"before:translate-y-0",sm:"before:translate-y-0.5 hover:before:translate-y-0 active:before:translate-y-0",default:"before:translate-y-1 hover:before:translate-y-0.5 active:before:translate-y-0",lg:"before:translate-y-1.5 hover:before:translate-y-0.5 active:before:translate-y-0",xl:"before:translate-y-2 hover:before:translate-y-1 active:before:translate-y-0"}},defaultVariants:{variant:"default",size:"default",depth:"default"}}),s=e__namespace.forwardRef(({className:t,variant:r,size:d,depth:b,tiltOnHover:n=false,glowIntensity:u=0,shadowColor:T,pressAnimation:c=true,children:E,onMouseEnter:p,onMouseLeave:h,onMouseMove:g,onMouseDown:m,onMouseUp:v,style:H,...P},L)=>{let l=e__namespace.useRef(null),[q,y]=e__namespace.useState(false),[w,R]=e__namespace.useState(false),[B,x]=e__namespace.useState({x:0,y:0}),M=e__namespace.useCallback(a=>{if(!n||!l.current)return;let i=l.current.getBoundingClientRect(),I=i.left+i.width/2,O=i.top+i.height/2,V=(a.clientX-I)/(i.width/2),$=(a.clientY-O)/(i.height/2);x({x:$*-10,y:V*10});},[n]),D=e__namespace.useCallback(()=>{x({x:0,y:0});},[]),k=e__namespace.useCallback(a=>{y(true),p?.(a);},[p]),C=e__namespace.useCallback(a=>{y(false),D(),h?.(a);},[h,D]),z=e__namespace.useCallback(a=>{n&&M(a),g?.(a);},[g,n,M]),N=e__namespace.useCallback(a=>{c&&R(true),m?.(a);},[m,c]),S=e__namespace.useCallback(a=>{R(false),v?.(a);},[v]);e__namespace.useImperativeHandle(L,()=>l.current);let Y={...H,transform:n?`perspective(1000px) rotateX(${B.x}deg) rotateY(${B.y}deg) ${w?"translateY(1px)":""}`:w?"translateY(1px)":void 0,filter:u>0?`drop-shadow(0 0 ${u*4}px ${T||"currentColor"})`:void 0,transition:"all 150ms cubic-bezier(0.4, 0, 0.2, 1)"};return jsxRuntime.jsx("button",{ref:l,className:utils.cn(G({variant:r,size:d,depth:b}),t),style:Y,onMouseEnter:k,onMouseLeave:C,onMouseMove:z,onMouseDown:N,onMouseUp:S,...P,children:jsxRuntime.jsx("span",{className:"relative z-10 flex items-center justify-center gap-2",children:E})})});s.displayName="Button3D";var f={Hero:e__namespace.forwardRef((t,r)=>jsxRuntime.jsx(s,{ref:r,variant:"gradient",size:"xl",depth:"lg",tiltOnHover:true,glowIntensity:2,...t})),CTA:e__namespace.forwardRef((t,r)=>jsxRuntime.jsx(s,{ref:r,variant:"neon",size:"lg",depth:"default",tiltOnHover:true,glowIntensity:1,...t})),Glass:e__namespace.forwardRef((t,r)=>jsxRuntime.jsx(s,{ref:r,variant:"glass",size:"default",depth:"sm",tiltOnHover:true,...t})),Minimal:e__namespace.forwardRef((t,r)=>jsxRuntime.jsx(s,{ref:r,variant:"ghost",size:"default",depth:"sm",...t})),Danger:e__namespace.forwardRef((t,r)=>jsxRuntime.jsx(s,{ref:r,variant:"destructive",size:"default",depth:"default",shadowColor:"rgb(239 68 68)",...t}))};f.Hero.displayName="Button3DPreset.Hero";f.CTA.displayName="Button3DPreset.CTA";f.Glass.displayName="Button3DPreset.Glass";f.Minimal.displayName="Button3DPreset.Minimal";f.Danger.displayName="Button3DPreset.Danger";var j=e__namespace.forwardRef(({loading:t=false,children:r,disabled:d,...b},n)=>jsxRuntime.jsxs(s,{ref:n,disabled:d||t,...b,children:[t&&jsxRuntime.jsx("div",{className:"animate-spin rounded-full h-4 w-4 border-2 border-current border-t-transparent"}),!t&&r]}));j.displayName="Button3DLoading";exports.Button3D=s;exports.Button3DLoading=j;exports.Button3DPreset=f;exports.button3DVariants=G;
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var React = require('react');
5
+ var classVarianceAuthority = require('class-variance-authority');
6
+ var utils = require('@hanzo/ui/lib/utils');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
+
29
+ var button3DVariants = classVarianceAuthority.cva(
30
+ [
31
+ "relative inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium",
32
+ "transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
33
+ "disabled:pointer-events-none disabled:opacity-50 cursor-pointer select-none",
34
+ "transform-gpu will-change-transform active:scale-95",
35
+ "before:absolute before:inset-0 before:rounded-md before:transition-all before:duration-150",
36
+ "after:absolute after:inset-0 after:rounded-md after:transition-all after:duration-150"
37
+ ],
38
+ {
39
+ variants: {
40
+ variant: {
41
+ default: [
42
+ "bg-primary text-primary-foreground shadow-md hover:bg-primary/90",
43
+ "before:bg-gradient-to-t before:from-primary/80 before:to-primary before:translate-y-1 before:shadow-lg",
44
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
45
+ "after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0",
46
+ "hover:after:opacity-100"
47
+ ],
48
+ destructive: [
49
+ "bg-destructive text-destructive-foreground shadow-md hover:bg-destructive/90",
50
+ "before:bg-gradient-to-t before:from-destructive/80 before:to-destructive before:translate-y-1 before:shadow-lg",
51
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
52
+ "after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0",
53
+ "hover:after:opacity-100"
54
+ ],
55
+ outline: [
56
+ "border border-input bg-background text-foreground shadow-sm hover:bg-accent hover:text-accent-foreground",
57
+ "before:bg-gradient-to-t before:from-muted/50 before:to-background before:translate-y-1 before:border before:border-input",
58
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
59
+ "after:bg-gradient-to-b after:from-white/10 after:to-transparent after:opacity-0",
60
+ "hover:after:opacity-100"
61
+ ],
62
+ secondary: [
63
+ "bg-secondary text-secondary-foreground shadow-md hover:bg-secondary/80",
64
+ "before:bg-gradient-to-t before:from-secondary/80 before:to-secondary before:translate-y-1 before:shadow-lg",
65
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
66
+ "after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0",
67
+ "hover:after:opacity-100"
68
+ ],
69
+ ghost: [
70
+ "text-foreground hover:bg-accent hover:text-accent-foreground",
71
+ "before:bg-gradient-to-t before:from-accent/30 before:to-accent/10 before:translate-y-1 before:opacity-0",
72
+ "hover:before:opacity-100 hover:before:translate-y-0.5 active:before:translate-y-0",
73
+ "after:bg-gradient-to-b after:from-white/10 after:to-transparent after:opacity-0",
74
+ "hover:after:opacity-50"
75
+ ],
76
+ link: [
77
+ "text-primary underline-offset-4 hover:underline",
78
+ "before:hidden after:hidden"
79
+ ],
80
+ neon: [
81
+ "bg-gradient-to-r from-purple-500 to-pink-500 text-white shadow-lg",
82
+ "before:bg-gradient-to-t before:from-purple-600 before:to-pink-600 before:translate-y-1 before:shadow-lg",
83
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
84
+ "after:bg-gradient-to-b after:from-white/30 after:to-transparent after:opacity-0",
85
+ "hover:after:opacity-100",
86
+ "hover:shadow-purple-500/25 hover:shadow-2xl"
87
+ ],
88
+ glass: [
89
+ "bg-white/10 backdrop-blur-md border border-white/20 text-foreground shadow-lg",
90
+ "before:bg-gradient-to-t before:from-white/5 before:to-white/20 before:translate-y-1 before:backdrop-blur-md before:border before:border-white/20",
91
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
92
+ "after:bg-gradient-to-b after:from-white/30 after:to-transparent after:opacity-0",
93
+ "hover:after:opacity-100"
94
+ ],
95
+ gradient: [
96
+ "bg-gradient-to-r from-blue-500 via-purple-500 to-pink-500 text-white shadow-lg",
97
+ "before:bg-gradient-to-t before:from-blue-600 before:via-purple-600 before:to-pink-600 before:translate-y-1 before:shadow-lg",
98
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
99
+ "after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0",
100
+ "hover:after:opacity-100",
101
+ "hover:bg-gradient-to-r hover:from-blue-400 hover:via-purple-400 hover:to-pink-400"
102
+ ]
103
+ },
104
+ size: {
105
+ default: "h-10 px-4 py-2",
106
+ sm: "h-9 rounded-md px-3",
107
+ lg: "h-11 rounded-md px-8",
108
+ xl: "h-12 rounded-lg px-10 text-base",
109
+ icon: "h-10 w-10"
110
+ },
111
+ depth: {
112
+ none: "before:translate-y-0",
113
+ sm: "before:translate-y-0.5 hover:before:translate-y-0 active:before:translate-y-0",
114
+ default: "before:translate-y-1 hover:before:translate-y-0.5 active:before:translate-y-0",
115
+ lg: "before:translate-y-1.5 hover:before:translate-y-0.5 active:before:translate-y-0",
116
+ xl: "before:translate-y-2 hover:before:translate-y-1 active:before:translate-y-0"
117
+ }
118
+ },
119
+ defaultVariants: {
120
+ variant: "default",
121
+ size: "default",
122
+ depth: "default"
123
+ }
124
+ }
125
+ );
126
+ var Button3D = React__namespace.forwardRef(
127
+ ({
128
+ className,
129
+ variant,
130
+ size,
131
+ depth,
132
+ tiltOnHover = false,
133
+ glowIntensity = 0,
134
+ shadowColor,
135
+ pressAnimation = true,
136
+ children,
137
+ onMouseEnter,
138
+ onMouseLeave,
139
+ onMouseMove,
140
+ onMouseDown,
141
+ onMouseUp,
142
+ style,
143
+ ...props
144
+ }, ref) => {
145
+ const buttonRef = React__namespace.useRef(null);
146
+ const [isHovered, setIsHovered] = React__namespace.useState(false);
147
+ const [isPressed, setIsPressed] = React__namespace.useState(false);
148
+ const [tiltTransform, setTiltTransform] = React__namespace.useState({ x: 0, y: 0 });
149
+ const updateTilt = React__namespace.useCallback(
150
+ (e) => {
151
+ if (!tiltOnHover || !buttonRef.current) return;
152
+ const rect = buttonRef.current.getBoundingClientRect();
153
+ const centerX = rect.left + rect.width / 2;
154
+ const centerY = rect.top + rect.height / 2;
155
+ const deltaX = (e.clientX - centerX) / (rect.width / 2);
156
+ const deltaY = (e.clientY - centerY) / (rect.height / 2);
157
+ setTiltTransform({
158
+ x: deltaY * -10,
159
+ // Inverted for more natural feel
160
+ y: deltaX * 10
161
+ });
162
+ },
163
+ [tiltOnHover]
164
+ );
165
+ const resetTilt = React__namespace.useCallback(() => {
166
+ setTiltTransform({ x: 0, y: 0 });
167
+ }, []);
168
+ const handleMouseEnter = React__namespace.useCallback(
169
+ (e) => {
170
+ setIsHovered(true);
171
+ onMouseEnter?.(e);
172
+ },
173
+ [onMouseEnter]
174
+ );
175
+ const handleMouseLeave = React__namespace.useCallback(
176
+ (e) => {
177
+ setIsHovered(false);
178
+ resetTilt();
179
+ onMouseLeave?.(e);
180
+ },
181
+ [onMouseLeave, resetTilt]
182
+ );
183
+ const handleMouseMove = React__namespace.useCallback(
184
+ (e) => {
185
+ if (tiltOnHover) {
186
+ updateTilt(e);
187
+ }
188
+ onMouseMove?.(e);
189
+ },
190
+ [onMouseMove, tiltOnHover, updateTilt]
191
+ );
192
+ const handleMouseDown = React__namespace.useCallback(
193
+ (e) => {
194
+ if (pressAnimation) {
195
+ setIsPressed(true);
196
+ }
197
+ onMouseDown?.(e);
198
+ },
199
+ [onMouseDown, pressAnimation]
200
+ );
201
+ const handleMouseUp = React__namespace.useCallback(
202
+ (e) => {
203
+ setIsPressed(false);
204
+ onMouseUp?.(e);
205
+ },
206
+ [onMouseUp]
207
+ );
208
+ React__namespace.useImperativeHandle(ref, () => buttonRef.current);
209
+ const buttonStyle = {
210
+ ...style,
211
+ transform: tiltOnHover ? `perspective(1000px) rotateX(${tiltTransform.x}deg) rotateY(${tiltTransform.y}deg) ${isPressed ? "translateY(1px)" : ""}` : isPressed ? "translateY(1px)" : void 0,
212
+ filter: glowIntensity > 0 ? `drop-shadow(0 0 ${glowIntensity * 4}px ${shadowColor || "currentColor"})` : void 0,
213
+ transition: "all 150ms cubic-bezier(0.4, 0, 0.2, 1)"
214
+ };
215
+ return /* @__PURE__ */ jsxRuntime.jsx(
216
+ "button",
217
+ {
218
+ ref: buttonRef,
219
+ className: utils.cn(button3DVariants({ variant, size, depth }), className),
220
+ style: buttonStyle,
221
+ onMouseEnter: handleMouseEnter,
222
+ onMouseLeave: handleMouseLeave,
223
+ onMouseMove: handleMouseMove,
224
+ onMouseDown: handleMouseDown,
225
+ onMouseUp: handleMouseUp,
226
+ ...props,
227
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "relative z-10 flex items-center justify-center gap-2", children })
228
+ }
229
+ );
230
+ }
231
+ );
232
+ Button3D.displayName = "Button3D";
233
+ var Button3DPreset = {
234
+ Hero: React__namespace.forwardRef((props, ref) => /* @__PURE__ */ jsxRuntime.jsx(
235
+ Button3D,
236
+ {
237
+ ref,
238
+ variant: "gradient",
239
+ size: "xl",
240
+ depth: "lg",
241
+ tiltOnHover: true,
242
+ glowIntensity: 2,
243
+ ...props
244
+ }
245
+ )),
246
+ CTA: React__namespace.forwardRef((props, ref) => /* @__PURE__ */ jsxRuntime.jsx(
247
+ Button3D,
248
+ {
249
+ ref,
250
+ variant: "neon",
251
+ size: "lg",
252
+ depth: "default",
253
+ tiltOnHover: true,
254
+ glowIntensity: 1,
255
+ ...props
256
+ }
257
+ )),
258
+ Glass: React__namespace.forwardRef((props, ref) => /* @__PURE__ */ jsxRuntime.jsx(
259
+ Button3D,
260
+ {
261
+ ref,
262
+ variant: "glass",
263
+ size: "default",
264
+ depth: "sm",
265
+ tiltOnHover: true,
266
+ ...props
267
+ }
268
+ )),
269
+ Minimal: React__namespace.forwardRef((props, ref) => /* @__PURE__ */ jsxRuntime.jsx(Button3D, { ref, variant: "ghost", size: "default", depth: "sm", ...props })),
270
+ Danger: React__namespace.forwardRef((props, ref) => /* @__PURE__ */ jsxRuntime.jsx(
271
+ Button3D,
272
+ {
273
+ ref,
274
+ variant: "destructive",
275
+ size: "default",
276
+ depth: "default",
277
+ shadowColor: "rgb(239 68 68)",
278
+ ...props
279
+ }
280
+ ))
281
+ };
282
+ Button3DPreset.Hero.displayName = "Button3DPreset.Hero";
283
+ Button3DPreset.CTA.displayName = "Button3DPreset.CTA";
284
+ Button3DPreset.Glass.displayName = "Button3DPreset.Glass";
285
+ Button3DPreset.Minimal.displayName = "Button3DPreset.Minimal";
286
+ Button3DPreset.Danger.displayName = "Button3DPreset.Danger";
287
+ var Button3DLoading = React__namespace.forwardRef(({ loading = false, children, disabled, ...props }, ref) => {
288
+ return /* @__PURE__ */ jsxRuntime.jsxs(Button3D, { ref, disabled: disabled || loading, ...props, children: [
289
+ loading && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "animate-spin rounded-full h-4 w-4 border-2 border-current border-t-transparent" }),
290
+ !loading && children
291
+ ] });
292
+ });
293
+ Button3DLoading.displayName = "Button3DLoading";
294
+
295
+ exports.Button3D = Button3D;
296
+ exports.Button3DLoading = Button3DLoading;
297
+ exports.Button3DPreset = Button3DPreset;
298
+ exports.button3DVariants = button3DVariants;
@@ -1 +1,273 @@
1
- import*as e from'react';import {cva}from'class-variance-authority';import {cn}from'@hanzo/ui/lib/utils';import {jsx,jsxs}from'react/jsx-runtime';var G=cva(["relative inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium","transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring","disabled:pointer-events-none disabled:opacity-50 cursor-pointer select-none","transform-gpu will-change-transform active:scale-95","before:absolute before:inset-0 before:rounded-md before:transition-all before:duration-150","after:absolute after:inset-0 after:rounded-md after:transition-all after:duration-150"],{variants:{variant:{default:["bg-primary text-primary-foreground shadow-md hover:bg-primary/90","before:bg-gradient-to-t before:from-primary/80 before:to-primary before:translate-y-1 before:shadow-lg","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0","hover:after:opacity-100"],destructive:["bg-destructive text-destructive-foreground shadow-md hover:bg-destructive/90","before:bg-gradient-to-t before:from-destructive/80 before:to-destructive before:translate-y-1 before:shadow-lg","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0","hover:after:opacity-100"],outline:["border border-input bg-background text-foreground shadow-sm hover:bg-accent hover:text-accent-foreground","before:bg-gradient-to-t before:from-muted/50 before:to-background before:translate-y-1 before:border before:border-input","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/10 after:to-transparent after:opacity-0","hover:after:opacity-100"],secondary:["bg-secondary text-secondary-foreground shadow-md hover:bg-secondary/80","before:bg-gradient-to-t before:from-secondary/80 before:to-secondary before:translate-y-1 before:shadow-lg","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0","hover:after:opacity-100"],ghost:["text-foreground hover:bg-accent hover:text-accent-foreground","before:bg-gradient-to-t before:from-accent/30 before:to-accent/10 before:translate-y-1 before:opacity-0","hover:before:opacity-100 hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/10 after:to-transparent after:opacity-0","hover:after:opacity-50"],link:["text-primary underline-offset-4 hover:underline","before:hidden after:hidden"],neon:["bg-gradient-to-r from-purple-500 to-pink-500 text-white shadow-lg","before:bg-gradient-to-t before:from-purple-600 before:to-pink-600 before:translate-y-1 before:shadow-lg","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/30 after:to-transparent after:opacity-0","hover:after:opacity-100","hover:shadow-purple-500/25 hover:shadow-2xl"],glass:["bg-white/10 backdrop-blur-md border border-white/20 text-foreground shadow-lg","before:bg-gradient-to-t before:from-white/5 before:to-white/20 before:translate-y-1 before:backdrop-blur-md before:border before:border-white/20","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/30 after:to-transparent after:opacity-0","hover:after:opacity-100"],gradient:["bg-gradient-to-r from-blue-500 via-purple-500 to-pink-500 text-white shadow-lg","before:bg-gradient-to-t before:from-blue-600 before:via-purple-600 before:to-pink-600 before:translate-y-1 before:shadow-lg","hover:before:translate-y-0.5 active:before:translate-y-0","after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0","hover:after:opacity-100","hover:bg-gradient-to-r hover:from-blue-400 hover:via-purple-400 hover:to-pink-400"]},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",xl:"h-12 rounded-lg px-10 text-base",icon:"h-10 w-10"},depth:{none:"before:translate-y-0",sm:"before:translate-y-0.5 hover:before:translate-y-0 active:before:translate-y-0",default:"before:translate-y-1 hover:before:translate-y-0.5 active:before:translate-y-0",lg:"before:translate-y-1.5 hover:before:translate-y-0.5 active:before:translate-y-0",xl:"before:translate-y-2 hover:before:translate-y-1 active:before:translate-y-0"}},defaultVariants:{variant:"default",size:"default",depth:"default"}}),s=e.forwardRef(({className:t,variant:r,size:d,depth:b,tiltOnHover:n=false,glowIntensity:u=0,shadowColor:T,pressAnimation:c=true,children:E,onMouseEnter:p,onMouseLeave:h,onMouseMove:g,onMouseDown:m,onMouseUp:v,style:H,...P},L)=>{let l=e.useRef(null),[q,y]=e.useState(false),[w,R]=e.useState(false),[B,x]=e.useState({x:0,y:0}),M=e.useCallback(a=>{if(!n||!l.current)return;let i=l.current.getBoundingClientRect(),I=i.left+i.width/2,O=i.top+i.height/2,V=(a.clientX-I)/(i.width/2),$=(a.clientY-O)/(i.height/2);x({x:$*-10,y:V*10});},[n]),D=e.useCallback(()=>{x({x:0,y:0});},[]),k=e.useCallback(a=>{y(true),p?.(a);},[p]),C=e.useCallback(a=>{y(false),D(),h?.(a);},[h,D]),z=e.useCallback(a=>{n&&M(a),g?.(a);},[g,n,M]),N=e.useCallback(a=>{c&&R(true),m?.(a);},[m,c]),S=e.useCallback(a=>{R(false),v?.(a);},[v]);e.useImperativeHandle(L,()=>l.current);let Y={...H,transform:n?`perspective(1000px) rotateX(${B.x}deg) rotateY(${B.y}deg) ${w?"translateY(1px)":""}`:w?"translateY(1px)":void 0,filter:u>0?`drop-shadow(0 0 ${u*4}px ${T||"currentColor"})`:void 0,transition:"all 150ms cubic-bezier(0.4, 0, 0.2, 1)"};return jsx("button",{ref:l,className:cn(G({variant:r,size:d,depth:b}),t),style:Y,onMouseEnter:k,onMouseLeave:C,onMouseMove:z,onMouseDown:N,onMouseUp:S,...P,children:jsx("span",{className:"relative z-10 flex items-center justify-center gap-2",children:E})})});s.displayName="Button3D";var f={Hero:e.forwardRef((t,r)=>jsx(s,{ref:r,variant:"gradient",size:"xl",depth:"lg",tiltOnHover:true,glowIntensity:2,...t})),CTA:e.forwardRef((t,r)=>jsx(s,{ref:r,variant:"neon",size:"lg",depth:"default",tiltOnHover:true,glowIntensity:1,...t})),Glass:e.forwardRef((t,r)=>jsx(s,{ref:r,variant:"glass",size:"default",depth:"sm",tiltOnHover:true,...t})),Minimal:e.forwardRef((t,r)=>jsx(s,{ref:r,variant:"ghost",size:"default",depth:"sm",...t})),Danger:e.forwardRef((t,r)=>jsx(s,{ref:r,variant:"destructive",size:"default",depth:"default",shadowColor:"rgb(239 68 68)",...t}))};f.Hero.displayName="Button3DPreset.Hero";f.CTA.displayName="Button3DPreset.CTA";f.Glass.displayName="Button3DPreset.Glass";f.Minimal.displayName="Button3DPreset.Minimal";f.Danger.displayName="Button3DPreset.Danger";var j=e.forwardRef(({loading:t=false,children:r,disabled:d,...b},n)=>jsxs(s,{ref:n,disabled:d||t,...b,children:[t&&jsx("div",{className:"animate-spin rounded-full h-4 w-4 border-2 border-current border-t-transparent"}),!t&&r]}));j.displayName="Button3DLoading";export{s as Button3D,j as Button3DLoading,f as Button3DPreset,G as button3DVariants};
1
+ "use client";
2
+ import * as React from 'react';
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from '@hanzo/ui/lib/utils';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ var button3DVariants = cva(
8
+ [
9
+ "relative inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium",
10
+ "transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
11
+ "disabled:pointer-events-none disabled:opacity-50 cursor-pointer select-none",
12
+ "transform-gpu will-change-transform active:scale-95",
13
+ "before:absolute before:inset-0 before:rounded-md before:transition-all before:duration-150",
14
+ "after:absolute after:inset-0 after:rounded-md after:transition-all after:duration-150"
15
+ ],
16
+ {
17
+ variants: {
18
+ variant: {
19
+ default: [
20
+ "bg-primary text-primary-foreground shadow-md hover:bg-primary/90",
21
+ "before:bg-gradient-to-t before:from-primary/80 before:to-primary before:translate-y-1 before:shadow-lg",
22
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
23
+ "after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0",
24
+ "hover:after:opacity-100"
25
+ ],
26
+ destructive: [
27
+ "bg-destructive text-destructive-foreground shadow-md hover:bg-destructive/90",
28
+ "before:bg-gradient-to-t before:from-destructive/80 before:to-destructive before:translate-y-1 before:shadow-lg",
29
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
30
+ "after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0",
31
+ "hover:after:opacity-100"
32
+ ],
33
+ outline: [
34
+ "border border-input bg-background text-foreground shadow-sm hover:bg-accent hover:text-accent-foreground",
35
+ "before:bg-gradient-to-t before:from-muted/50 before:to-background before:translate-y-1 before:border before:border-input",
36
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
37
+ "after:bg-gradient-to-b after:from-white/10 after:to-transparent after:opacity-0",
38
+ "hover:after:opacity-100"
39
+ ],
40
+ secondary: [
41
+ "bg-secondary text-secondary-foreground shadow-md hover:bg-secondary/80",
42
+ "before:bg-gradient-to-t before:from-secondary/80 before:to-secondary before:translate-y-1 before:shadow-lg",
43
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
44
+ "after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0",
45
+ "hover:after:opacity-100"
46
+ ],
47
+ ghost: [
48
+ "text-foreground hover:bg-accent hover:text-accent-foreground",
49
+ "before:bg-gradient-to-t before:from-accent/30 before:to-accent/10 before:translate-y-1 before:opacity-0",
50
+ "hover:before:opacity-100 hover:before:translate-y-0.5 active:before:translate-y-0",
51
+ "after:bg-gradient-to-b after:from-white/10 after:to-transparent after:opacity-0",
52
+ "hover:after:opacity-50"
53
+ ],
54
+ link: [
55
+ "text-primary underline-offset-4 hover:underline",
56
+ "before:hidden after:hidden"
57
+ ],
58
+ neon: [
59
+ "bg-gradient-to-r from-purple-500 to-pink-500 text-white shadow-lg",
60
+ "before:bg-gradient-to-t before:from-purple-600 before:to-pink-600 before:translate-y-1 before:shadow-lg",
61
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
62
+ "after:bg-gradient-to-b after:from-white/30 after:to-transparent after:opacity-0",
63
+ "hover:after:opacity-100",
64
+ "hover:shadow-purple-500/25 hover:shadow-2xl"
65
+ ],
66
+ glass: [
67
+ "bg-white/10 backdrop-blur-md border border-white/20 text-foreground shadow-lg",
68
+ "before:bg-gradient-to-t before:from-white/5 before:to-white/20 before:translate-y-1 before:backdrop-blur-md before:border before:border-white/20",
69
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
70
+ "after:bg-gradient-to-b after:from-white/30 after:to-transparent after:opacity-0",
71
+ "hover:after:opacity-100"
72
+ ],
73
+ gradient: [
74
+ "bg-gradient-to-r from-blue-500 via-purple-500 to-pink-500 text-white shadow-lg",
75
+ "before:bg-gradient-to-t before:from-blue-600 before:via-purple-600 before:to-pink-600 before:translate-y-1 before:shadow-lg",
76
+ "hover:before:translate-y-0.5 active:before:translate-y-0",
77
+ "after:bg-gradient-to-b after:from-white/20 after:to-transparent after:opacity-0",
78
+ "hover:after:opacity-100",
79
+ "hover:bg-gradient-to-r hover:from-blue-400 hover:via-purple-400 hover:to-pink-400"
80
+ ]
81
+ },
82
+ size: {
83
+ default: "h-10 px-4 py-2",
84
+ sm: "h-9 rounded-md px-3",
85
+ lg: "h-11 rounded-md px-8",
86
+ xl: "h-12 rounded-lg px-10 text-base",
87
+ icon: "h-10 w-10"
88
+ },
89
+ depth: {
90
+ none: "before:translate-y-0",
91
+ sm: "before:translate-y-0.5 hover:before:translate-y-0 active:before:translate-y-0",
92
+ default: "before:translate-y-1 hover:before:translate-y-0.5 active:before:translate-y-0",
93
+ lg: "before:translate-y-1.5 hover:before:translate-y-0.5 active:before:translate-y-0",
94
+ xl: "before:translate-y-2 hover:before:translate-y-1 active:before:translate-y-0"
95
+ }
96
+ },
97
+ defaultVariants: {
98
+ variant: "default",
99
+ size: "default",
100
+ depth: "default"
101
+ }
102
+ }
103
+ );
104
+ var Button3D = React.forwardRef(
105
+ ({
106
+ className,
107
+ variant,
108
+ size,
109
+ depth,
110
+ tiltOnHover = false,
111
+ glowIntensity = 0,
112
+ shadowColor,
113
+ pressAnimation = true,
114
+ children,
115
+ onMouseEnter,
116
+ onMouseLeave,
117
+ onMouseMove,
118
+ onMouseDown,
119
+ onMouseUp,
120
+ style,
121
+ ...props
122
+ }, ref) => {
123
+ const buttonRef = React.useRef(null);
124
+ const [isHovered, setIsHovered] = React.useState(false);
125
+ const [isPressed, setIsPressed] = React.useState(false);
126
+ const [tiltTransform, setTiltTransform] = React.useState({ x: 0, y: 0 });
127
+ const updateTilt = React.useCallback(
128
+ (e) => {
129
+ if (!tiltOnHover || !buttonRef.current) return;
130
+ const rect = buttonRef.current.getBoundingClientRect();
131
+ const centerX = rect.left + rect.width / 2;
132
+ const centerY = rect.top + rect.height / 2;
133
+ const deltaX = (e.clientX - centerX) / (rect.width / 2);
134
+ const deltaY = (e.clientY - centerY) / (rect.height / 2);
135
+ setTiltTransform({
136
+ x: deltaY * -10,
137
+ // Inverted for more natural feel
138
+ y: deltaX * 10
139
+ });
140
+ },
141
+ [tiltOnHover]
142
+ );
143
+ const resetTilt = React.useCallback(() => {
144
+ setTiltTransform({ x: 0, y: 0 });
145
+ }, []);
146
+ const handleMouseEnter = React.useCallback(
147
+ (e) => {
148
+ setIsHovered(true);
149
+ onMouseEnter?.(e);
150
+ },
151
+ [onMouseEnter]
152
+ );
153
+ const handleMouseLeave = React.useCallback(
154
+ (e) => {
155
+ setIsHovered(false);
156
+ resetTilt();
157
+ onMouseLeave?.(e);
158
+ },
159
+ [onMouseLeave, resetTilt]
160
+ );
161
+ const handleMouseMove = React.useCallback(
162
+ (e) => {
163
+ if (tiltOnHover) {
164
+ updateTilt(e);
165
+ }
166
+ onMouseMove?.(e);
167
+ },
168
+ [onMouseMove, tiltOnHover, updateTilt]
169
+ );
170
+ const handleMouseDown = React.useCallback(
171
+ (e) => {
172
+ if (pressAnimation) {
173
+ setIsPressed(true);
174
+ }
175
+ onMouseDown?.(e);
176
+ },
177
+ [onMouseDown, pressAnimation]
178
+ );
179
+ const handleMouseUp = React.useCallback(
180
+ (e) => {
181
+ setIsPressed(false);
182
+ onMouseUp?.(e);
183
+ },
184
+ [onMouseUp]
185
+ );
186
+ React.useImperativeHandle(ref, () => buttonRef.current);
187
+ const buttonStyle = {
188
+ ...style,
189
+ transform: tiltOnHover ? `perspective(1000px) rotateX(${tiltTransform.x}deg) rotateY(${tiltTransform.y}deg) ${isPressed ? "translateY(1px)" : ""}` : isPressed ? "translateY(1px)" : void 0,
190
+ filter: glowIntensity > 0 ? `drop-shadow(0 0 ${glowIntensity * 4}px ${shadowColor || "currentColor"})` : void 0,
191
+ transition: "all 150ms cubic-bezier(0.4, 0, 0.2, 1)"
192
+ };
193
+ return /* @__PURE__ */ jsx(
194
+ "button",
195
+ {
196
+ ref: buttonRef,
197
+ className: cn(button3DVariants({ variant, size, depth }), className),
198
+ style: buttonStyle,
199
+ onMouseEnter: handleMouseEnter,
200
+ onMouseLeave: handleMouseLeave,
201
+ onMouseMove: handleMouseMove,
202
+ onMouseDown: handleMouseDown,
203
+ onMouseUp: handleMouseUp,
204
+ ...props,
205
+ children: /* @__PURE__ */ jsx("span", { className: "relative z-10 flex items-center justify-center gap-2", children })
206
+ }
207
+ );
208
+ }
209
+ );
210
+ Button3D.displayName = "Button3D";
211
+ var Button3DPreset = {
212
+ Hero: React.forwardRef((props, ref) => /* @__PURE__ */ jsx(
213
+ Button3D,
214
+ {
215
+ ref,
216
+ variant: "gradient",
217
+ size: "xl",
218
+ depth: "lg",
219
+ tiltOnHover: true,
220
+ glowIntensity: 2,
221
+ ...props
222
+ }
223
+ )),
224
+ CTA: React.forwardRef((props, ref) => /* @__PURE__ */ jsx(
225
+ Button3D,
226
+ {
227
+ ref,
228
+ variant: "neon",
229
+ size: "lg",
230
+ depth: "default",
231
+ tiltOnHover: true,
232
+ glowIntensity: 1,
233
+ ...props
234
+ }
235
+ )),
236
+ Glass: React.forwardRef((props, ref) => /* @__PURE__ */ jsx(
237
+ Button3D,
238
+ {
239
+ ref,
240
+ variant: "glass",
241
+ size: "default",
242
+ depth: "sm",
243
+ tiltOnHover: true,
244
+ ...props
245
+ }
246
+ )),
247
+ Minimal: React.forwardRef((props, ref) => /* @__PURE__ */ jsx(Button3D, { ref, variant: "ghost", size: "default", depth: "sm", ...props })),
248
+ Danger: React.forwardRef((props, ref) => /* @__PURE__ */ jsx(
249
+ Button3D,
250
+ {
251
+ ref,
252
+ variant: "destructive",
253
+ size: "default",
254
+ depth: "default",
255
+ shadowColor: "rgb(239 68 68)",
256
+ ...props
257
+ }
258
+ ))
259
+ };
260
+ Button3DPreset.Hero.displayName = "Button3DPreset.Hero";
261
+ Button3DPreset.CTA.displayName = "Button3DPreset.CTA";
262
+ Button3DPreset.Glass.displayName = "Button3DPreset.Glass";
263
+ Button3DPreset.Minimal.displayName = "Button3DPreset.Minimal";
264
+ Button3DPreset.Danger.displayName = "Button3DPreset.Danger";
265
+ var Button3DLoading = React.forwardRef(({ loading = false, children, disabled, ...props }, ref) => {
266
+ return /* @__PURE__ */ jsxs(Button3D, { ref, disabled: disabled || loading, ...props, children: [
267
+ loading && /* @__PURE__ */ jsx("div", { className: "animate-spin rounded-full h-4 w-4 border-2 border-current border-t-transparent" }),
268
+ !loading && children
269
+ ] });
270
+ });
271
+ Button3DLoading.displayName = "Button3DLoading";
272
+
273
+ export { Button3D, Button3DLoading, Button3DPreset, button3DVariants };