@luxfi/core 5.2.8 → 5.2.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (150) hide show
  1. package/commerce/ui/conf.ts +13 -13
  2. package/commerce/ui/context.tsx +126 -126
  3. package/commerce/ui/store.ts +304 -304
  4. package/components/access-code-input.tsx +71 -71
  5. package/components/auth/auth-listener.tsx +29 -29
  6. package/components/auth/auth-token/clear-auth-token.tsx +12 -12
  7. package/components/auth/auth-token/set-auth-token.tsx +16 -16
  8. package/components/auth/common-auth-domains.ts +16 -16
  9. package/components/auth/login-panel.tsx +107 -107
  10. package/components/back-button.tsx +42 -42
  11. package/components/chat-widget.tsx +85 -85
  12. package/components/commerce/add-widget.tsx +20 -20
  13. package/components/commerce/bag-button.tsx +98 -98
  14. package/components/commerce/buy-button.tsx +34 -34
  15. package/components/commerce/checkout-button.tsx +129 -129
  16. package/components/commerce/checkout-panel/dt-bag-carousel.tsx +36 -36
  17. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +84 -84
  18. package/components/commerce/checkout-panel/index.tsx +129 -129
  19. package/components/commerce/checkout-panel/links-row.tsx +21 -21
  20. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +54 -54
  21. package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
  22. package/components/commerce/checkout-panel/thank-you.tsx +18 -18
  23. package/components/commerce/checkout-widget/const.ts +13 -13
  24. package/components/commerce/checkout-widget/index.tsx +192 -192
  25. package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
  26. package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -58
  27. package/components/commerce/desktop-bag-popup.tsx +78 -78
  28. package/components/commerce/desktop-nav-menu.tsx +131 -130
  29. package/components/commerce/drawer/index.tsx +99 -99
  30. package/components/commerce/drawer/micro.tsx +144 -144
  31. package/components/commerce/drawer/shell.tsx +85 -85
  32. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  33. package/components/commerce/mobile-login-button.tsx +101 -101
  34. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  35. package/components/commerce/mobile-nav-menu-ai.tsx +48 -42
  36. package/components/commerce/mobile-nav-menu-item.tsx +49 -49
  37. package/components/commerce/mobile-nav-menu.tsx +102 -68
  38. package/components/contact-dialog/contact-form.tsx +113 -113
  39. package/components/contact-dialog/disclaimer.tsx +13 -13
  40. package/components/contact-dialog/index.tsx +64 -64
  41. package/components/copyright.tsx +21 -21
  42. package/components/drawer-margin.tsx +25 -25
  43. package/components/footer.tsx +77 -77
  44. package/components/header/desktop.tsx +50 -49
  45. package/components/header/index.tsx +52 -52
  46. package/components/header/mobile.tsx +163 -163
  47. package/components/header/theme-toggle.tsx +26 -26
  48. package/components/icons/24k-gold-card.tsx +43 -0
  49. package/components/icons/ai-chat.tsx +29 -0
  50. package/components/icons/anodized-titanium.tsx +45 -0
  51. package/components/icons/avatar.tsx +11 -11
  52. package/components/icons/bag-icon.tsx +10 -10
  53. package/components/icons/blog.tsx +20 -0
  54. package/components/icons/bridge.tsx +68 -0
  55. package/components/icons/changelog.tsx +21 -0
  56. package/components/icons/chrome.tsx +45 -0
  57. package/components/icons/coins.tsx +20 -0
  58. package/components/icons/compare-cards.tsx +21 -0
  59. package/components/icons/credit.tsx +20 -0
  60. package/components/icons/customer-support.tsx +21 -0
  61. package/components/icons/customers.tsx +33 -0
  62. package/components/icons/developer-docs.tsx +20 -0
  63. package/components/icons/exchange.tsx +21 -0
  64. package/components/icons/explorer.tsx +22 -0
  65. package/components/icons/faqs.tsx +21 -0
  66. package/components/icons/github.tsx +14 -14
  67. package/components/icons/guides.tsx +21 -0
  68. package/components/icons/gun-metal.tsx +44 -0
  69. package/components/icons/index.tsx +43 -43
  70. package/components/icons/integrations.tsx +25 -0
  71. package/components/icons/irradescent.tsx +41 -0
  72. package/components/icons/launch-subnet.tsx +21 -0
  73. package/components/icons/left-arrow.tsx +11 -11
  74. package/components/icons/lux-finance.tsx +23 -0
  75. package/components/icons/lux-logo.tsx +10 -10
  76. package/components/icons/lux-pass.tsx +25 -0
  77. package/components/icons/lux-quests.tsx +21 -0
  78. package/components/icons/market.tsx +24 -0
  79. package/components/icons/mirrored-titanium.tsx +46 -0
  80. package/components/icons/more-benefits.tsx +21 -0
  81. package/components/icons/open-source.tsx +26 -0
  82. package/components/icons/right-arrow.tsx +10 -10
  83. package/components/icons/safe.tsx +37 -0
  84. package/components/icons/search.tsx +12 -12
  85. package/components/icons/secure-delivery.tsx +13 -13
  86. package/components/icons/shop.tsx +20 -0
  87. package/components/icons/social-icon.tsx +35 -35
  88. package/components/icons/social-svg.css +3 -3
  89. package/components/icons/sterling-silver-card.tsx +44 -0
  90. package/components/icons/templates.tsx +21 -0
  91. package/components/icons/validators.tsx +41 -0
  92. package/components/icons/view-all-card.tsx +20 -0
  93. package/components/icons/wallet.tsx +20 -0
  94. package/components/icons/warpcast.tsx +58 -58
  95. package/components/icons/youtube-logo.tsx +59 -59
  96. package/components/index.ts +27 -27
  97. package/components/logo.tsx +89 -89
  98. package/components/main.tsx +27 -27
  99. package/components/mini-chart/index.tsx +7 -7
  100. package/components/mini-chart/mini-chart-props.ts +43 -43
  101. package/components/mini-chart/mini-chart.tsx +85 -85
  102. package/components/mini-chart/wrapper.tsx +23 -23
  103. package/components/not-found/index.tsx +28 -28
  104. package/components/not-found/not-found-content.mdx +5 -5
  105. package/components/scripts.tsx +24 -24
  106. package/components/tooltip.tsx +31 -31
  107. package/environment.d.ts +5 -5
  108. package/next/analytics/fpixel.ts +15 -15
  109. package/next/analytics/google-analytics.ts +13 -13
  110. package/next/analytics/index.ts +3 -3
  111. package/next/analytics/pixel-analytics.tsx +54 -54
  112. package/next/font/get-app-router-font-classes.ts +12 -12
  113. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  114. package/next/font/next-font-desc.ts +27 -27
  115. package/next/font/pages-router-font-vars.tsx +18 -18
  116. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  117. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  118. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  119. package/next/head-metadata/index.tsx +208 -208
  120. package/next/middleware/determine-device-mw.ts +16 -16
  121. package/package.json +79 -79
  122. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  123. package/root-layout/index.tsx +112 -112
  124. package/server-actions/firebase-app.ts +14 -14
  125. package/server-actions/index.ts +5 -5
  126. package/server-actions/store-contact.ts +51 -51
  127. package/site-def/footer/community.tsx +67 -67
  128. package/site-def/footer/company.ts +37 -37
  129. package/site-def/footer/ecosystem.ts +37 -37
  130. package/site-def/footer/index.tsx +26 -26
  131. package/site-def/footer/legal.ts +28 -28
  132. package/site-def/footer/network.ts +45 -45
  133. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  134. package/site-def/index.ts +2 -2
  135. package/site-def/main-nav.tsx +392 -338
  136. package/style/cart-animation.css +29 -29
  137. package/style/checkout-animation.css +23 -23
  138. package/style/drawer-handle-overrides.css +160 -160
  139. package/style/lux-colors.css +85 -85
  140. package/style/lux-global.css +30 -30
  141. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  142. package/tailwind/index.ts +2 -2
  143. package/tailwind/lux-tw-fonts.ts +39 -39
  144. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  145. package/tsconfig.json +15 -15
  146. package/types/chatbot-config.ts +6 -6
  147. package/types/chatbot-suggested-question.ts +7 -7
  148. package/types/contact-info.ts +10 -10
  149. package/types/index.ts +4 -4
  150. package/types/site-def.ts +43 -43
@@ -1,85 +1,85 @@
1
- 'use client'
2
- import React from 'react'
3
-
4
- import { Button, Card } from '@hanzo/ui/primitives'
5
- import { cn } from '@hanzo/ui/util'
6
-
7
- import LuxLogo from './icons/lux-logo'
8
- import type { ChatbotSuggestedQuestion } from '../types'
9
-
10
- const ChatWidget: React.FC<{
11
- title: string
12
- chatbotUrl: string
13
- subtitle?: string
14
- question?: string
15
- buttonClx?: string
16
- /*
17
- ChatBotSuggestQuestion.icon
18
- Currently supports these icons from remix icons (https://remixicon.com/):
19
- GlobalLineIcon,
20
- ShieldFlashLineIcon,
21
- BankCardLineIcon,
22
- GroupLineIcon,
23
- QuestionnaireLineIcon
24
- */
25
- suggestedQuestions?: ChatbotSuggestedQuestion[]
26
- }> = ({
27
- title,
28
- chatbotUrl,
29
- subtitle,
30
- question,
31
- suggestedQuestions,
32
- buttonClx=''
33
- }) => {
34
-
35
- const [showChatbot, setShowChatbot] = React.useState<boolean>(false)
36
-
37
- const onClick = () => { setShowChatbot(!showChatbot) }
38
-
39
- const searchParams = new URLSearchParams()
40
- if (question) {
41
- searchParams.append('question', question)
42
- }
43
- if (suggestedQuestions) {
44
- searchParams.append('sQuestions', suggestedQuestions.map(({ message }) => message).join(','))
45
- searchParams.append('sHeadings', suggestedQuestions.map(({ heading }) => heading).join(','))
46
- searchParams.append('sIcons', suggestedQuestions.map(({ icon }) => icon).join(','))
47
- }
48
-
49
- const iframeSrc = `${chatbotUrl}?${searchParams.toString()}`
50
-
51
- return (<>
52
- <div className={
53
- 'fixed bottom-0 sm:bottom-16 right-0 w-full h-full ' +
54
- 'sm:max-w-[400px] sm:max-h-[550px] sm:px-4 z-floating ' +
55
- (showChatbot ? 'flex' : 'hidden')
56
- }>
57
- <Card className='flex flex-col h-full w-full'>
58
- <div className='flex px-4 py-2 h-12 bg-level-0 items-center justify-between'>
59
- <h3 className='font-semibold font-heading'>{title} <span className='opacity-60'>{subtitle}</span></h3>
60
- <Button onClick={onClick} variant='link' size='icon' className='w-fit sm:hidden'>
61
- <LuxLogo width={24} height={24}/>
62
- </Button>
63
- </div>
64
- <iframe src={iframeSrc} className='h-full' />
65
- </Card>
66
- </div>
67
-
68
- <LuxLogo
69
- width={28}
70
- height={28}
71
- onClick={onClick}
72
- className={cn(
73
- // z-index should be below anything in commerce-iu (buy drawer and checkout widget)
74
- 'fixed bottom-5 right-5 z-floating cursor-pointer',
75
- 'hover:drop-shadow-[0_2px_6px_rgba(255,255,255,1)]',
76
- 'transition-transform',
77
- showChatbot ? 'rotate-180' : '',
78
- buttonClx
79
- )}
80
- strokeWidth={1}
81
- />
82
- </>)
83
- }
84
-
85
- export default ChatWidget
1
+ 'use client'
2
+ import React from 'react'
3
+
4
+ import { Button, Card } from '@hanzo/ui/primitives'
5
+ import { cn } from '@hanzo/ui/util'
6
+
7
+ import LuxLogo from './icons/lux-logo'
8
+ import type { ChatbotSuggestedQuestion } from '../types'
9
+
10
+ const ChatWidget: React.FC<{
11
+ title: string
12
+ chatbotUrl: string
13
+ subtitle?: string
14
+ question?: string
15
+ buttonClx?: string
16
+ /*
17
+ ChatBotSuggestQuestion.icon
18
+ Currently supports these icons from remix icons (https://remixicon.com/):
19
+ GlobalLineIcon,
20
+ ShieldFlashLineIcon,
21
+ BankCardLineIcon,
22
+ GroupLineIcon,
23
+ QuestionnaireLineIcon
24
+ */
25
+ suggestedQuestions?: ChatbotSuggestedQuestion[]
26
+ }> = ({
27
+ title,
28
+ chatbotUrl,
29
+ subtitle,
30
+ question,
31
+ suggestedQuestions,
32
+ buttonClx=''
33
+ }) => {
34
+
35
+ const [showChatbot, setShowChatbot] = React.useState<boolean>(false)
36
+
37
+ const onClick = () => { setShowChatbot(!showChatbot) }
38
+
39
+ const searchParams = new URLSearchParams()
40
+ if (question) {
41
+ searchParams.append('question', question)
42
+ }
43
+ if (suggestedQuestions) {
44
+ searchParams.append('sQuestions', suggestedQuestions.map(({ message }) => message).join(','))
45
+ searchParams.append('sHeadings', suggestedQuestions.map(({ heading }) => heading).join(','))
46
+ searchParams.append('sIcons', suggestedQuestions.map(({ icon }) => icon).join(','))
47
+ }
48
+
49
+ const iframeSrc = `${chatbotUrl}?${searchParams.toString()}`
50
+
51
+ return (<>
52
+ <div className={
53
+ 'fixed bottom-0 sm:bottom-16 right-0 w-full h-full ' +
54
+ 'sm:max-w-[400px] sm:max-h-[550px] sm:px-4 z-floating ' +
55
+ (showChatbot ? 'flex' : 'hidden')
56
+ }>
57
+ <Card className='flex flex-col h-full w-full'>
58
+ <div className='flex px-4 py-2 h-12 bg-level-0 items-center justify-between'>
59
+ <h3 className='font-semibold font-heading'>{title} <span className='opacity-60'>{subtitle}</span></h3>
60
+ <Button onClick={onClick} variant='link' size='icon' className='w-fit sm:hidden'>
61
+ <LuxLogo width={24} height={24}/>
62
+ </Button>
63
+ </div>
64
+ <iframe src={iframeSrc} className='h-full' />
65
+ </Card>
66
+ </div>
67
+
68
+ <LuxLogo
69
+ width={28}
70
+ height={28}
71
+ onClick={onClick}
72
+ className={cn(
73
+ // z-index should be below anything in commerce-iu (buy drawer and checkout widget)
74
+ 'fixed bottom-5 right-5 z-floating cursor-pointer',
75
+ 'hover:drop-shadow-[0_2px_6px_rgba(255,255,255,1)]',
76
+ 'transition-transform',
77
+ showChatbot ? 'rotate-180' : '',
78
+ buttonClx
79
+ )}
80
+ strokeWidth={1}
81
+ />
82
+ </>)
83
+ }
84
+
85
+ export default ChatWidget
@@ -1,20 +1,20 @@
1
- 'use client'
2
- import React from 'react'
3
-
4
- import type { LineItem } from '@hanzo/commerce/types'
5
- import { AddToCartWidget } from '@hanzo/commerce'
6
-
7
- import { useRecentActivity } from '../../commerce/ui/context'
8
-
9
- const AddWidget: React.FC<{
10
- item: LineItem
11
- disabled?: boolean
12
- className?: string
13
- buttonClx?: string
14
- variant?: 'minimal' | 'primary' | 'outline'
15
- }> = (props) => {
16
- const l = useRecentActivity()
17
- return <AddToCartWidget {...props} onQuantityChanged={l.quantityChanged.bind(l)}/>
18
- }
19
-
20
- export default AddWidget
1
+ 'use client'
2
+ import React from 'react'
3
+
4
+ import type { LineItem } from '@hanzo/commerce/types'
5
+ import { AddToCartWidget } from '@hanzo/commerce'
6
+
7
+ import { useRecentActivity } from '../../commerce/ui/context'
8
+
9
+ const AddWidget: React.FC<{
10
+ item: LineItem
11
+ disabled?: boolean
12
+ className?: string
13
+ buttonClx?: string
14
+ variant?: 'minimal' | 'primary' | 'outline'
15
+ }> = (props) => {
16
+ const l = useRecentActivity()
17
+ return <AddToCartWidget {...props} onQuantityChanged={l.quantityChanged.bind(l)}/>
18
+ }
19
+
20
+ export default AddWidget
@@ -1,98 +1,98 @@
1
- 'use client'
2
- import React, { useEffect, useRef } from 'react'
3
- import { observable, type IObservableValue, reaction, runInAction } from 'mobx'
4
- import { observer } from 'mobx-react-lite'
5
-
6
- import { buttonVariants } from '@hanzo/ui/primitives'
7
- import { cn, type VariantProps } from '@hanzo/ui/util'
8
- import { useCommerce } from '@hanzo/commerce'
9
-
10
- import * as Icons from '../icons'
11
-
12
- const BagButton: React.FC<{
13
- showIfEmpty?: boolean
14
- animateOnHover?: boolean
15
- animateOnQuantityChange?: boolean
16
- size?: VariantProps<typeof buttonVariants>['size']
17
- className?: string
18
- iconClx?: string
19
- onClick?: () => void
20
- }> = observer(({
21
- showIfEmpty=false,
22
- animateOnHover=true,
23
- animateOnQuantityChange=true,
24
- size='default',
25
- className='',
26
- iconClx='',
27
- onClick
28
- }) => {
29
-
30
- const c = useCommerce()
31
- const wiggleRef = useRef<IObservableValue<'more' | 'less' | 'none'>>(observable.box('none'))
32
-
33
- useEffect(() => (
34
- // return IReactionDisposer
35
- animateOnQuantityChange ? reaction(
36
- () => (c.cartQuantity),
37
- (curr, prev) => {
38
- if (curr > prev) {
39
- runInAction(() => {wiggleRef.current.set('more')})
40
- }
41
- else {
42
- runInAction(() => {wiggleRef.current.set('less')})
43
- }
44
- setTimeout(() => {
45
- // Note that this doesn't actually stop the animation
46
- // just resets the styles
47
- runInAction(() => {wiggleRef.current.set('none')})
48
- }, 800)
49
- }
50
- ) : undefined
51
- ), [])
52
-
53
- // undefined means context is not installed, ie commerce functions are not in use
54
- if (!c || (!showIfEmpty && c.cartEmpty)) {
55
- return <div /> // trigger code needs non-null
56
- }
57
-
58
-
59
- return (
60
- <div
61
- aria-label="Bag"
62
- role='button'
63
- onClick={onClick}
64
- className={cn(
65
- buttonVariants({ variant: 'ghost', size, rounded: 'md' }),
66
- // Overides the bg change on hover --not a "hover effect"
67
- 'relative group p-0 aspect-square hover:bg-background',
68
- ((wiggleRef.current.get() === 'more') ?
69
- 'item-added-to-cart-animation'
70
- :
71
- (wiggleRef.current.get() === 'less') ? 'item-removed-from-cart-animation' : ''),
72
- className
73
- )}
74
- >
75
- {!c.cartEmpty && (
76
- <div className={
77
- 'z-above-content flex flex-col justify-center items-center ' +
78
- 'absolute left-0 right-0 top-0 bottom-0 ' +
79
- 'leading-none font-sans font-bold text-primary-fg text-xs '
80
- }>
81
- <div className='h-[3px] w-full' />
82
- <div>{c.cartQuantity}</div>
83
- </div>
84
- )}
85
- <Icons.bag width='24' height='28' className={cn(
86
- 'relative -top-[3px] fill-primary',
87
- iconClx,
88
- (animateOnHover ?
89
- 'group-hover:fill-primary-hover group-hover:scale-105 transition-scale transition-duration-300'
90
- :
91
- ''
92
- )
93
- )} aria-hidden="true" />
94
- </div>
95
- )
96
- })
97
-
98
- export default BagButton
1
+ 'use client'
2
+ import React, { useEffect, useRef } from 'react'
3
+ import { observable, type IObservableValue, reaction, runInAction } from 'mobx'
4
+ import { observer } from 'mobx-react-lite'
5
+
6
+ import { buttonVariants } from '@hanzo/ui/primitives'
7
+ import { cn, type VariantProps } from '@hanzo/ui/util'
8
+ import { useCommerce } from '@hanzo/commerce'
9
+
10
+ import * as Icons from '../icons'
11
+
12
+ const BagButton: React.FC<{
13
+ showIfEmpty?: boolean
14
+ animateOnHover?: boolean
15
+ animateOnQuantityChange?: boolean
16
+ size?: VariantProps<typeof buttonVariants>['size']
17
+ className?: string
18
+ iconClx?: string
19
+ onClick?: () => void
20
+ }> = observer(({
21
+ showIfEmpty=false,
22
+ animateOnHover=true,
23
+ animateOnQuantityChange=true,
24
+ size='default',
25
+ className='',
26
+ iconClx='',
27
+ onClick
28
+ }) => {
29
+
30
+ const c = useCommerce()
31
+ const wiggleRef = useRef<IObservableValue<'more' | 'less' | 'none'>>(observable.box('none'))
32
+
33
+ useEffect(() => (
34
+ // return IReactionDisposer
35
+ animateOnQuantityChange ? reaction(
36
+ () => (c.cartQuantity),
37
+ (curr, prev) => {
38
+ if (curr > prev) {
39
+ runInAction(() => {wiggleRef.current.set('more')})
40
+ }
41
+ else {
42
+ runInAction(() => {wiggleRef.current.set('less')})
43
+ }
44
+ setTimeout(() => {
45
+ // Note that this doesn't actually stop the animation
46
+ // just resets the styles
47
+ runInAction(() => {wiggleRef.current.set('none')})
48
+ }, 800)
49
+ }
50
+ ) : undefined
51
+ ), [])
52
+
53
+ // undefined means context is not installed, ie commerce functions are not in use
54
+ if (!c || (!showIfEmpty && c.cartEmpty)) {
55
+ return <div /> // trigger code needs non-null
56
+ }
57
+
58
+
59
+ return (
60
+ <div
61
+ aria-label="Bag"
62
+ role='button'
63
+ onClick={onClick}
64
+ className={cn(
65
+ buttonVariants({ variant: 'ghost', size, rounded: 'md' }),
66
+ // Overides the bg change on hover --not a "hover effect"
67
+ 'relative group p-0 aspect-square hover:bg-background',
68
+ ((wiggleRef.current.get() === 'more') ?
69
+ 'item-added-to-cart-animation'
70
+ :
71
+ (wiggleRef.current.get() === 'less') ? 'item-removed-from-cart-animation' : ''),
72
+ className
73
+ )}
74
+ >
75
+ {!c.cartEmpty && (
76
+ <div className={
77
+ 'z-above-content flex flex-col justify-center items-center ' +
78
+ 'absolute left-0 right-0 top-0 bottom-0 ' +
79
+ 'leading-none font-sans font-bold text-primary-fg text-xs '
80
+ }>
81
+ <div className='h-[3px] w-full' />
82
+ <div>{c.cartQuantity}</div>
83
+ </div>
84
+ )}
85
+ <Icons.bag width='24' height='28' className={cn(
86
+ 'relative -top-[3px] fill-primary',
87
+ iconClx,
88
+ (animateOnHover ?
89
+ 'group-hover:fill-primary-hover group-hover:scale-105 transition-scale transition-duration-300'
90
+ :
91
+ ''
92
+ )
93
+ )} aria-hidden="true" />
94
+ </div>
95
+ )
96
+ })
97
+
98
+ export default BagButton
@@ -1,34 +1,34 @@
1
- 'use client'
2
- import React, {type PropsWithChildren} from 'react'
3
-
4
- import { Button, buttonVariants } from '@hanzo/ui/primitives'
5
- import { type VariantProps } from '@hanzo/ui/util'
6
-
7
- import { cn } from '@hanzo/ui/util'
8
- import { useSelectAndBuy } from '../../commerce/ui/context'
9
-
10
- const BuyButton: React.FC<
11
- PropsWithChildren &
12
- VariantProps<typeof buttonVariants> &
13
- {
14
- skuPath: string
15
- className?: string
16
- }
17
- > = ({
18
- skuPath,
19
- children,
20
- className='',
21
- ...rest
22
- }) => {
23
-
24
- const buyOptions = useSelectAndBuy()
25
- const handleClick = (): void => { buyOptions.showVariants(skuPath) }
26
-
27
- return (
28
- <Button onClick={handleClick} {...rest} className={cn(className, '')}>
29
- {children}
30
- </Button>
31
- )
32
- }
33
-
34
- export default BuyButton
1
+ 'use client'
2
+ import React, {type PropsWithChildren} from 'react'
3
+
4
+ import { Button, buttonVariants } from '@hanzo/ui/primitives'
5
+ import { type VariantProps } from '@hanzo/ui/util'
6
+
7
+ import { cn } from '@hanzo/ui/util'
8
+ import { useSelectAndBuy } from '../../commerce/ui/context'
9
+
10
+ const BuyButton: React.FC<
11
+ PropsWithChildren &
12
+ VariantProps<typeof buttonVariants> &
13
+ {
14
+ skuPath: string
15
+ className?: string
16
+ }
17
+ > = ({
18
+ skuPath,
19
+ children,
20
+ className='',
21
+ ...rest
22
+ }) => {
23
+
24
+ const buyOptions = useSelectAndBuy()
25
+ const handleClick = (): void => { buyOptions.showVariants(skuPath) }
26
+
27
+ return (
28
+ <Button onClick={handleClick} {...rest} className={cn(className, '')}>
29
+ {children}
30
+ </Button>
31
+ )
32
+ }
33
+
34
+ export default BuyButton