@luxfi/core 5.3.6 → 10.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (197) hide show
  1. package/package.json +36 -80
  2. package/tsconfig.json +10 -15
  3. package/tsconfig.tsbuildinfo +1 -0
  4. package/types/asset.ts +28 -0
  5. package/types/contract.ts +13 -0
  6. package/types/deposit-address.ts +9 -0
  7. package/types/exchange.ts +25 -0
  8. package/types/index.ts +21 -4
  9. package/types/network-type.ts +16 -0
  10. package/types/network.ts +58 -0
  11. package/types/swap-status.ts +58 -0
  12. package/types/transaction-type.ts +5 -0
  13. package/types/utila.ts +36 -0
  14. package/commerce/ui/conf.ts +0 -13
  15. package/commerce/ui/context.tsx +0 -123
  16. package/commerce/ui/store.ts +0 -290
  17. package/components/access-code-input.tsx +0 -71
  18. package/components/auth/auth-listener.tsx +0 -29
  19. package/components/auth/auth-token/clear-auth-token.tsx +0 -12
  20. package/components/auth/auth-token/set-auth-token.tsx +0 -16
  21. package/components/auth/common-auth-domains.ts +0 -16
  22. package/components/auth/login-panel.tsx +0 -107
  23. package/components/back-button.tsx +0 -49
  24. package/components/chat-widget.tsx +0 -85
  25. package/components/commerce/_to_deprecate_checkout-widget/const.ts +0 -13
  26. package/components/commerce/_to_deprecate_checkout-widget/index.tsx_ +0 -188
  27. package/components/commerce/_to_deprecate_checkout-widget/obs-string-set.ts +0 -48
  28. package/components/commerce/_to_deprecate_checkout-widget/use-anim-clx-set.ts +0 -59
  29. package/components/commerce/bag-button.tsx +0 -98
  30. package/components/commerce/buy-button.tsx +0 -34
  31. package/components/commerce/checkout-button.tsx +0 -129
  32. package/components/commerce/checkout-panel/cart-accordian.tsx +0 -66
  33. package/components/commerce/checkout-panel/checkout-panel-props.ts +0 -10
  34. package/components/commerce/checkout-panel/desktop-bag-carousel.tsx +0 -36
  35. package/components/commerce/checkout-panel/desktop-cp.tsx +0 -83
  36. package/components/commerce/checkout-panel/index.tsx +0 -126
  37. package/components/commerce/checkout-panel/mobile-cp.tsx +0 -67
  38. package/components/commerce/checkout-panel/policy-links.tsx +0 -29
  39. package/components/commerce/checkout-panel/steps-indicator.tsx +0 -39
  40. package/components/commerce/checkout-panel/thank-you.tsx +0 -18
  41. package/components/commerce/desktop-bag-popup.tsx +0 -78
  42. package/components/commerce/desktop-nav-menu.tsx +0 -194
  43. package/components/commerce/drawer/index.tsx +0 -88
  44. package/components/commerce/drawer/micro.tsx +0 -145
  45. package/components/commerce/drawer/shell.tsx +0 -85
  46. package/components/commerce/mobile-bag-drawer.tsx +0 -51
  47. package/components/commerce/mobile-login-button.tsx +0 -108
  48. package/components/commerce/mobile-menu-toggle-button.tsx +0 -35
  49. package/components/commerce/mobile-nav-menu-ai.tsx +0 -51
  50. package/components/commerce/mobile-nav-menu-item.tsx +0 -50
  51. package/components/commerce/mobile-nav-menu.tsx +0 -102
  52. package/components/contact-dialog/contact-form.tsx +0 -113
  53. package/components/contact-dialog/disclaimer.tsx +0 -13
  54. package/components/contact-dialog/index.tsx +0 -64
  55. package/components/copyright.tsx +0 -21
  56. package/components/drawer-margin.tsx +0 -28
  57. package/components/footer.tsx +0 -78
  58. package/components/header/desktop.tsx +0 -51
  59. package/components/header/index.tsx +0 -50
  60. package/components/header/mobile.tsx +0 -163
  61. package/components/header/theme-toggle.tsx +0 -26
  62. package/components/icons/24k-gold-card.tsx +0 -43
  63. package/components/icons/ai-chat-act.tsx +0 -47
  64. package/components/icons/ai-chat.tsx +0 -29
  65. package/components/icons/anodized-titanium.tsx +0 -45
  66. package/components/icons/avatar.tsx +0 -11
  67. package/components/icons/bag-icon.tsx +0 -10
  68. package/components/icons/blog-act.tsx +0 -14
  69. package/components/icons/blog.tsx +0 -20
  70. package/components/icons/bridge-act.tsx +0 -18
  71. package/components/icons/bridge.tsx +0 -68
  72. package/components/icons/changelog-act.tsx +0 -15
  73. package/components/icons/changelog.tsx +0 -21
  74. package/components/icons/chrome.tsx +0 -45
  75. package/components/icons/coins-act.tsx +0 -29
  76. package/components/icons/coins.tsx +0 -20
  77. package/components/icons/compare-cards-act.tsx +0 -30
  78. package/components/icons/compare-cards.tsx +0 -21
  79. package/components/icons/credit-act.tsx +0 -29
  80. package/components/icons/credit.tsx +0 -20
  81. package/components/icons/customer-support-act.tsx +0 -27
  82. package/components/icons/customer-support.tsx +0 -21
  83. package/components/icons/customers-act.tsx +0 -65
  84. package/components/icons/customers.tsx +0 -33
  85. package/components/icons/developer-docs-act.tsx +0 -26
  86. package/components/icons/developer-docs.tsx +0 -20
  87. package/components/icons/exchange-act.tsx +0 -27
  88. package/components/icons/exchange.tsx +0 -21
  89. package/components/icons/explorer-act.tsx +0 -27
  90. package/components/icons/explorer.tsx +0 -22
  91. package/components/icons/faqs-act.tsx +0 -27
  92. package/components/icons/faqs.tsx +0 -21
  93. package/components/icons/github.tsx +0 -14
  94. package/components/icons/guides-act.tsx +0 -26
  95. package/components/icons/guides.tsx +0 -21
  96. package/components/icons/gun-metal.tsx +0 -44
  97. package/components/icons/index.tsx +0 -43
  98. package/components/icons/integrations-act.tsx +0 -41
  99. package/components/icons/integrations.tsx +0 -25
  100. package/components/icons/irradescent.tsx +0 -41
  101. package/components/icons/launch-subnet.tsx +0 -21
  102. package/components/icons/launchsubnet-act.tsx +0 -29
  103. package/components/icons/left-arrow.tsx +0 -11
  104. package/components/icons/lux-finance-act.tsx +0 -34
  105. package/components/icons/lux-finance.tsx +0 -23
  106. package/components/icons/lux-logo.tsx +0 -10
  107. package/components/icons/lux-pass-act.tsx +0 -41
  108. package/components/icons/lux-pass.tsx +0 -25
  109. package/components/icons/lux-quests-act.tsx +0 -15
  110. package/components/icons/lux-quests.tsx +0 -21
  111. package/components/icons/market-act.tsx +0 -39
  112. package/components/icons/market.tsx +0 -24
  113. package/components/icons/mirrored-titanium.tsx +0 -46
  114. package/components/icons/more-benefits-act.tsx +0 -29
  115. package/components/icons/more-benefits.tsx +0 -21
  116. package/components/icons/open-source-act.tsx +0 -41
  117. package/components/icons/open-source.tsx +0 -26
  118. package/components/icons/right-arrow.tsx +0 -10
  119. package/components/icons/safe-act.tsx +0 -77
  120. package/components/icons/safe.tsx +0 -37
  121. package/components/icons/search.tsx +0 -12
  122. package/components/icons/secure-delivery.tsx +0 -13
  123. package/components/icons/shop-act.tsx +0 -29
  124. package/components/icons/shop.tsx +0 -20
  125. package/components/icons/social-icon.tsx +0 -35
  126. package/components/icons/social-svg.css +0 -3
  127. package/components/icons/sterling-silver-card.tsx +0 -44
  128. package/components/icons/templates-act.tsx +0 -29
  129. package/components/icons/templates.tsx +0 -21
  130. package/components/icons/validators-act.tsx +0 -42
  131. package/components/icons/validators.tsx +0 -41
  132. package/components/icons/view-all-card-act.tsx +0 -28
  133. package/components/icons/view-all-card.tsx +0 -20
  134. package/components/icons/wallet-act.tsx +0 -29
  135. package/components/icons/wallet.tsx +0 -20
  136. package/components/icons/warpcast.tsx +0 -58
  137. package/components/icons/youtube-logo.tsx +0 -59
  138. package/components/index.ts +0 -25
  139. package/components/logo.tsx +0 -89
  140. package/components/main.tsx +0 -27
  141. package/components/mini-chart/index.tsx +0 -8
  142. package/components/mini-chart/mini-chart-props.ts +0 -44
  143. package/components/mini-chart/mini-chart.tsx +0 -85
  144. package/components/mini-chart/wrapper.tsx +0 -23
  145. package/components/not-found/index.tsx +0 -28
  146. package/components/not-found/not-found-content.mdx +0 -5
  147. package/components/scripts.tsx +0 -24
  148. package/components/tooltip.tsx +0 -31
  149. package/environment.d.ts +0 -6
  150. package/next/analytics/fpixel.ts +0 -16
  151. package/next/analytics/google-analytics.ts +0 -14
  152. package/next/analytics/index.ts +0 -3
  153. package/next/analytics/pixel-analytics.tsx +0 -55
  154. package/next/font/get-app-router-font-classes.ts +0 -12
  155. package/next/font/load-and-return-lux-next-fonts-on-import.ts +0 -68
  156. package/next/font/local/Druk-Wide-Bold.ttf +0 -0
  157. package/next/font/local/Druk-Wide-Medium.ttf +0 -0
  158. package/next/font/local/InterVariable-Italic.ttf +0 -0
  159. package/next/font/local/InterVariable-Italic.woff2 +0 -0
  160. package/next/font/local/InterVariable.ttf +0 -0
  161. package/next/font/local/InterVariable.woff2 +0 -0
  162. package/next/font/next-font-desc.ts +0 -28
  163. package/next/font/pages-router-font-vars.tsx +0 -18
  164. package/next/head-metadata/from-next/metadata-types.ts +0 -158
  165. package/next/head-metadata/from-next/opengraph-types.ts +0 -267
  166. package/next/head-metadata/from-next/twitter-types.ts +0 -92
  167. package/next/head-metadata/index.tsx +0 -208
  168. package/next/index.ts +0 -1
  169. package/next/middleware/determine-device-mw.ts +0 -16
  170. package/root-layout/WHY_THIS_IS_SEPARATE.txt +0 -2
  171. package/root-layout/index.tsx +0 -112
  172. package/server-actions/TO-DO.txt +0 -1
  173. package/server-actions/firebase-app.ts +0 -14
  174. package/server-actions/index.ts +0 -5
  175. package/server-actions/store-contact.ts +0 -51
  176. package/site-def/footer/community.tsx +0 -67
  177. package/site-def/footer/company.ts +0 -37
  178. package/site-def/footer/ecosystem.ts +0 -37
  179. package/site-def/footer/index.tsx +0 -26
  180. package/site-def/footer/legal.ts +0 -28
  181. package/site-def/footer/network.ts +0 -45
  182. package/site-def/footer/svg/warpcast-logo.svg +0 -12
  183. package/site-def/index.ts +0 -3
  184. package/site-def/main-nav.tsx +0 -458
  185. package/style/cart-animation.css +0 -29
  186. package/style/checkout-animation.css +0 -23
  187. package/style/drawer-handle-overrides.css +0 -160
  188. package/style/lux-colors.css +0 -85
  189. package/style/lux-global.css +0 -51
  190. package/tailwind/fontFamily.tailwind.lux.ts +0 -18
  191. package/tailwind/index.ts +0 -2
  192. package/tailwind/lux-tw-fonts.ts +0 -40
  193. package/tailwind/tailwind.config.lux-preset.ts +0 -10
  194. package/types/chatbot-config.ts +0 -7
  195. package/types/chatbot-suggested-question.ts +0 -7
  196. package/types/contact-info.ts +0 -11
  197. package/types/site-def.ts +0 -43
@@ -1,83 +0,0 @@
1
- 'use client'
2
- import React, { type PropsWithChildren } from 'react'
3
- import { observer } from 'mobx-react-lite'
4
-
5
- import { ScrollArea, StepIndicator } from '@hanzo/ui/primitives'
6
- import { AuthWidget } from '@hanzo/auth/components'
7
- import { CartPanel, useCommerce } from '@hanzo/commerce'
8
- import { cn } from '@hanzo/ui/util'
9
-
10
- import { BackButton, Logo, Tooltip } from '../..'
11
- import DesktopBagCarousel from './desktop-bag-carousel'
12
- import LinksRow from './policy-links'
13
- import type CheckoutPanelProps from './checkout-panel-props'
14
-
15
- const DesktopCheckoutPanel: React.FC<PropsWithChildren & CheckoutPanelProps> = observer(({
16
- step,
17
- stepNames,
18
- onLeave,
19
- clx='',
20
- children
21
- }) => {
22
-
23
- const cmmc = useCommerce()
24
- return (
25
- <div /* id='CHECKOUT_PANEL' */ className={cn('grid grid-cols-2', clx)}>
26
- <div key={1} className='w-full h-full bg-background flex flex-row items-start justify-end'>
27
- <div className='w-full h-full max-w-[750px] relative flex flex-col items-stretch justify-start px-8 pb-8'>
28
- <div key={1} className='h-[80px] grow-0 flex flex-row items-center z-10' >
29
- <Logo size='md' href='/' onClick={onLeave} variant='text-only' outerClx='logo-outer-tooltip-class' />
30
- <Tooltip select='.logo-outer-tooltip-class' text='home' position='right' offset={6}/>
31
- </div>
32
- <BackButton
33
- size='sm'
34
- clx={
35
- 'z-10 absolute top-14 left-6 !px-0 aspect-square ' +
36
- 'rounded-full hover:!bg-level-3 ' +
37
- 'back-button-tooltip-class '
38
- }
39
- onBack={onLeave}
40
- />
41
- <Tooltip select='.back-button-tooltip-class' text='back' position='right' offset={5}/>
42
- <div key={2} className={cn(
43
- 'w-full grow min-h-0 max-w-[550px] mx-auto flex flex-col gap-3',
44
- (cmmc.cartItems.length > 4 ? 'justify-between' : 'justify-start gap-10 pt-10')
45
- )}>
46
- <DesktopBagCarousel className='grow-0 h-[260px] w-[360px] lg:w-[420px] mx-auto -mt-8' constrainTo={{w: 250, h: 250}}/>
47
- <CartPanel
48
- className='w-full border-none p-0'
49
- itemClx='mb-2'
50
- totalClx='sticky bottom-0 bg-background'
51
- listClx='pr-3'
52
- scrollAfter={4}
53
- scrollHeightClx='min-h-[50vh] grow'
54
- showPromoCode
55
- showShipping
56
- selectItems
57
- />
58
- </div>
59
- </div>
60
- </div>
61
- <div key={2} className='w-full h-full flex flex-col bg-level-1 min-h-screen justify-between'>
62
- <ScrollArea className='w-full flex flex-row items-start justify-start overflow-y-auto'>
63
- <div className='h-full w-full max-w-[750px] relative flex flex-col items-center px-8 pt-0'>
64
- <div key={1} className='bg-level-1 sticky h-[80px] bg-[#aaaaff] w-full top-0 flex justify-center items-end'>
65
- <AuthWidget noLogin className='hidden md:flex absolute top-4 right-4 '/>
66
- <StepIndicator dotSizeRem={1.35} steps={stepNames} currentStep={step} className='gap-2 text-base w-pr-70' />
67
- </div>
68
- <div key={2} className='w-full max-w-[550px] mx-auto py-8'>
69
- {children}
70
- </div>
71
- </div>
72
- </ScrollArea>
73
- <div className='w-full max-w-[750px] relative flex flex-col items-center px-8 pt-0'>
74
- <div className='w-full max-w-[550px] mx-auto flex flex-col items-center'>
75
- <LinksRow clx='w-full' />
76
- </div>
77
- </div>
78
- </div>
79
- </div>
80
- )
81
- })
82
-
83
- export default DesktopCheckoutPanel
@@ -1,126 +0,0 @@
1
- 'use client'
2
- import React, { useLayoutEffect, useRef, useState } from 'react'
3
-
4
- import { capitalize, cn } from '@hanzo/ui/util'
5
-
6
- import { useCommerce, ShippingStepForm, PaymentStepForm } from '@hanzo/commerce'
7
- import type { CheckoutStep } from '@hanzo/commerce/types'
8
-
9
- import ThankYou from './thank-you'
10
-
11
- const STEPS = [
12
- {
13
- name: 'payment',
14
- Comp: PaymentStepForm
15
- },
16
- {
17
- name: 'delivery',
18
- Comp: ShippingStepForm
19
- },
20
- {
21
- name: 'done',
22
- label: 'Done!',
23
- Comp: ThankYou
24
- }
25
- ] satisfies CheckoutStep[]
26
-
27
- const STEP_NAMES = STEPS.map((s) => (s.label ? s.label : capitalize(s.name)))
28
-
29
- import DesktopCP from './desktop-cp'
30
- import MobileCP from './mobile-cp'
31
-
32
- const CheckoutPanel: React.FC<{
33
- clx?: string
34
- }> = ({
35
- clx=''
36
- }) => {
37
-
38
- const cmmc = useCommerce()
39
-
40
- // For sites that don't initialize cmmc
41
- if (!cmmc) {
42
- console.log("CHECKOUT PANEL: cmmc svc undefined!")
43
- return <></>
44
- }
45
-
46
- const [stepIndex, setStepIndex] = useState<number>(0)
47
- const [orderId, setOrderId] = useState<string | undefined>(undefined)
48
-
49
- // Step.name or 'first' or 'next' or 'last'
50
- const setStep = (name: string): void => {
51
-
52
- if (name === 'first') {
53
- setStepIndex(0)
54
- }
55
- else if (name === 'last') {
56
- setStepIndex(STEPS.length - 1)
57
- }
58
- else if (name === 'next') {
59
- if (stepIndex <= STEPS.length - 2) {
60
- setStepIndex(stepIndex + 1)
61
- }
62
- else {
63
- throw new Error('CheckoutPanel.setStep(): Attempting to advance past last step!')
64
- }
65
- }
66
- else {
67
- const indexFound = STEPS.findIndex((el) => (el.name === name))
68
- if (indexFound !== -1) {
69
- setStepIndex(indexFound)
70
- }
71
- else {
72
- throw new Error('CheckoutPanel.setStep(): Step named ' + name + ' not found!')
73
- }
74
- }
75
- }
76
-
77
- const _close = () => {
78
- setStep('first')
79
- }
80
-
81
- // Determine if mobile or desktop layout based on visibility of desktopElement
82
- // This prevents issues with multiple instances of 3rd party e-commerce widgets
83
- // from ever being in the DOM.
84
- // https://stackoverflow.com/a/21696585/11378853
85
- const desktopElement = useRef<HTMLDivElement | null>(null)
86
- const [layout, setLayout] = useState<'mobile' | 'desktop' | undefined>(undefined)
87
-
88
- useLayoutEffect(() => {
89
- const checkLayout = () => {
90
- setLayout(!!desktopElement.current?.offsetParent ? 'desktop' : 'mobile')
91
- }
92
-
93
- // initial layout check
94
- checkLayout()
95
-
96
- window.addEventListener('resize', checkLayout)
97
- return () => {
98
- window.removeEventListener('resize', checkLayout)
99
- }
100
- }, [])
101
-
102
- const StepToRender = STEPS[stepIndex].Comp
103
-
104
- return (<>
105
- <DesktopCP
106
- clx={cn('h-full', clx, 'hidden md:flex')}
107
- onLeave={_close}
108
- step={stepIndex}
109
- stepNames={STEP_NAMES}
110
- >
111
- {/* Element required to determine if DesktopCP is visible. See above. */}
112
- <div ref={desktopElement}/>
113
- {layout === 'desktop' && <StepToRender onDone={() => {setStep('next')}} orderId={orderId} setOrderId={setOrderId}/>}
114
- </DesktopCP>
115
- <MobileCP
116
- clx={cn('w-full h-full overflow-y-auto', clx, 'md:hidden' )}
117
- onLeave={_close}
118
- step={stepIndex}
119
- stepNames={STEP_NAMES}
120
- >
121
- {layout === 'mobile' && <StepToRender onDone={() => {setStep('next')}} orderId={orderId} setOrderId={setOrderId}/>}
122
- </MobileCP>
123
- </>)
124
- }
125
-
126
- export default CheckoutPanel
@@ -1,67 +0,0 @@
1
- 'use client'
2
- import React, { type PropsWithChildren } from 'react'
3
-
4
- import { StepIndicator } from '@hanzo/ui/primitives'
5
- import { cn } from '@hanzo/ui/util'
6
- import { AuthWidget } from '@hanzo/auth/components'
7
-
8
- import { BackButton, Logo } from '../..'
9
- import BagButton from '../bag-button'
10
- import PolicyLinks from './policy-links'
11
- import CartAccordian from './cart-accordian'
12
- import type CheckoutPanelProps from './checkout-panel-props'
13
-
14
-
15
- const MobileCheckoutPanel: React.FC<PropsWithChildren & CheckoutPanelProps> = ({
16
- step,
17
- stepNames,
18
- onLeave,
19
- clx='',
20
- children
21
- }) => (
22
-
23
- <div /* id='MOBILE_GRID' */ className={cn('bg-background flex flex-col justify-start px-4 pt-[101px]', clx)}>
24
- <div className='fixed z-11 top-0 h-[45px] w-full flex justify-between items-stretch bg-background'>
25
- <div className='flex items-stretch gap-1 grow-0'>
26
- <BackButton
27
- size='sm'
28
- clx={
29
- '-ml-5 !px-0 aspect-square h-full ' +
30
- 'rounded-full active:!bg-level-3 '
31
- }
32
- onBack={onLeave}
33
- />
34
- <Logo size='xs' variant='text-only' href='/' onClick={onLeave} outerClx='-ml-2'/>
35
- </div>
36
- <StepIndicator
37
- dotSizeRem={1}
38
- steps={stepNames}
39
- currentStep={step}
40
- className='relative grow mx-2 top-[14px] text-xs font-semibold w-full'
41
- />
42
-
43
- {/* 72px by observation (for centering). Need wrapper div since 'noLogin' returns null if no logged in user */}
44
- <div className='w-[72px] grow-0 shrink-0 flex items-center justify-center'><AuthWidget noLogin className=''/></div>
45
- </div>
46
- <CartAccordian
47
- icon={
48
- <BagButton
49
- animateOnHover={false}
50
- showIfEmpty
51
- size='sm'
52
- className='mr-1 relative w-5 h-6 sm:w-6 sm:h-7'
53
- iconClx='fill-foreground'
54
- />
55
- }
56
- clx='flex items-center justify-center w-full'
57
- triggerClx='bg-background fixed z-11 top-[45px] left-0 right-0 !m-0 px-4'
58
- panelClx='!py-0'
59
- scrollAfter={3}
60
- scrollHeightClx='h-[385px]'
61
- />
62
- {children}
63
- <PolicyLinks clx='mt-auto mb-3 pt-2' />
64
- </div>
65
- )
66
-
67
- export default MobileCheckoutPanel
@@ -1,29 +0,0 @@
1
- import React from 'react'
2
- import Link from 'next/link'
3
-
4
- import { Separator, buttonVariants } from '@hanzo/ui/primitives'
5
- import { cn } from '@hanzo/ui/util'
6
-
7
-
8
- const linkClx = buttonVariants({
9
- variant: 'linkMuted',
10
- size: 'link',
11
- rounded: 'none',
12
- })
13
-
14
- const PolicyLinks: React.FC<{
15
- clx?: string
16
- }> = ({
17
- clx=''
18
- }) => (
19
- <div className={cn('flex flex-col items-center', clx)}>
20
- <Separator/>
21
- <div className='flex gap-4 py-2 text-sm'>
22
- {/* TODO: add Refund policy and Privacy policy links */}
23
- <Link className={linkClx} href=''>refund policy</Link>
24
- <Link className={linkClx} href=''>privacy policy</Link>
25
- </div>
26
- </div>
27
- )
28
-
29
- export default PolicyLinks
@@ -1,39 +0,0 @@
1
- import {
2
- Breadcrumb,
3
- BreadcrumbItem,
4
- BreadcrumbLink,
5
- BreadcrumbList,
6
- BreadcrumbSeparator
7
- } from '@hanzo/ui/primitives'
8
- import { cn } from '@hanzo/ui/util'
9
-
10
- const StepsIndicator: React.FC<{
11
- currentStep: number
12
- stepNames: string[]
13
- className?: string
14
- }> = ({
15
- currentStep,
16
- stepNames,
17
- className=''
18
- }) => (
19
- <Breadcrumb className={className}>
20
- <BreadcrumbList>
21
- {stepNames.map((name, i) => (
22
- <>
23
- <BreadcrumbItem key={`item-${i}`}>
24
- <BreadcrumbLink className={cn(
25
- currentStep >= i ? '!text-foreground hover:text-foreground' : 'hover:text-muted-2',
26
- 'text-xxs sm:text-sm'
27
- )}
28
- >
29
- {name}
30
- </BreadcrumbLink>
31
- </BreadcrumbItem>
32
- {i !== stepNames.length - 1 && <BreadcrumbSeparator key={`sep-${i}`}/>}
33
- </>
34
- ))}
35
- </BreadcrumbList>
36
- </Breadcrumb>
37
- )
38
-
39
- export default StepsIndicator
@@ -1,18 +0,0 @@
1
- import React from 'react'
2
- import Link from 'next/link'
3
-
4
- import { ApplyTypography } from '@hanzo/ui/primitives'
5
-
6
- import type { CheckoutStepComponentProps } from '@hanzo/commerce/types'
7
-
8
- const ThankYou: React.FC<CheckoutStepComponentProps> = ({}) => (
9
- <ApplyTypography className='flex flex-col gap-4 text-center mt-10'>
10
- <h3>Thank you for your order!</h3>
11
- <h6>Once your payment has been confirmed, you'll recieve an email with additional information.</h6>
12
- <p>
13
- While you wait, we cordially invite you to join the <Link href='https://warpcast.com/~/channel/lux'>Lux Channel</Link> on <Link href='https://warpcast.com/~/invite-page/227706?id=fbc9ca91'>Warpcast</Link>.
14
- </p>
15
- </ApplyTypography>
16
- )
17
-
18
- export default ThankYou
@@ -1,78 +0,0 @@
1
- 'use client'
2
- import React, { useState, useEffect } from 'react'
3
- import { useRouter } from 'next/navigation'
4
-
5
- import { X } from 'lucide-react'
6
-
7
- import {
8
- Popover,
9
- PopoverContent,
10
- PopoverTrigger,
11
- PopoverClose,
12
- } from "@hanzo/ui/primitives"
13
-
14
- import { cn } from '@hanzo/ui/util'
15
- import { CartPanel, useCommerce } from '@hanzo/commerce'
16
-
17
- import * as Icons from '../icons'
18
- import sendGAEvent from '../../next/analytics/google-analytics'
19
-
20
- const DesktopBagPopup: React.FC<{
21
- triggerClx?: string
22
- popupClx?: string
23
- trigger: React.ReactNode
24
- }> = ({
25
- triggerClx='',
26
- popupClx='',
27
- trigger
28
- }) => {
29
- const cmmc = useCommerce()
30
-
31
- const [bagOpen, setBagOpen] = useState<boolean>(false)
32
- const router = useRouter()
33
-
34
- useEffect(() => {
35
- if (bagOpen) {
36
- sendGAEvent('view_cart', {
37
- items: cmmc.cartItems.map((item) => ({
38
- item_id: item.sku,
39
- item_name: item.title,
40
- item_category: item.familyId,
41
- price: item.price,
42
- quantity: item.quantity
43
- })),
44
- value: cmmc.cartTotal,
45
- currency: 'USD',
46
- })
47
- }
48
- }, [bagOpen])
49
-
50
- return (
51
- <Popover open={bagOpen} onOpenChange={setBagOpen}>
52
- <PopoverTrigger className={triggerClx}>
53
- {trigger}
54
- </PopoverTrigger>
55
- <PopoverContent sideOffset={28} className={cn('relative flex flex-col p-0 px-4 pb-4 pt-2', popupClx)}>
56
- <PopoverClose className='absolute z-above-content right-2 top-2 self-end hover:bg-level-3 text-muted hover:text-accent p-1 rounded-full'><X className='w-5 h-5'/></PopoverClose>
57
- <CartPanel
58
- handleCheckout={() => {router.push('/checkout')}}
59
- className='mt-4 mb-4 border-none py-0 px-4'
60
- listClx='rounded-sm pr-3'
61
- scrollAfter={5}
62
- scrollHeightClx='h-[70vh]'
63
- itemClx='mt-3'
64
- totalClx='sticky px-1 pr-2 -bottom-[1px] bg-level-1'
65
- buttonClx='max-w-[220px] flex-none'
66
- >
67
- <div className='flex flex-row items-center flex-none justify-center '>
68
- <Icons.bag className='mr-2 relative w-6 h-7 fill-foreground ' />
69
- <p className='font-heading text-foreground text-default'>Your Bag</p>
70
- </div>
71
- <div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none'/>
72
- </CartPanel>
73
- </PopoverContent>
74
- </Popover>
75
- )
76
- }
77
-
78
- export default DesktopBagPopup
@@ -1,194 +0,0 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import Link from "next/link"
5
- import { cn } from '@hanzo/ui/util'
6
- import type { ChildMenu, LinkDefExtended } from "../../site-def/main-nav"
7
- import {
8
- NavigationMenu,
9
- NavigationMenuContent,
10
- NavigationMenuItem,
11
- NavigationMenuLink,
12
- NavigationMenuList,
13
- NavigationMenuTrigger,
14
- navigationMenuTriggerStyle
15
- } from '@hanzo/ui/primitives'
16
-
17
- const DesktopNav: React.FC<{
18
- links: LinkDefExtended[],
19
- isMenuOpened: boolean,
20
- setIsMenuOpen: React.Dispatch<React.SetStateAction<boolean>>
21
- }> = ({ links, isMenuOpened, setIsMenuOpen }) => {
22
-
23
- React.useEffect(() => {
24
- const preventScroll = (e: WheelEvent | TouchEvent) => {
25
- e.preventDefault();
26
- };
27
-
28
- if (isMenuOpened) {
29
- window.addEventListener('wheel', preventScroll, { passive: false });
30
- window.addEventListener('touchmove', preventScroll, { passive: false });
31
- window.addEventListener('keydown', preventScrollKeys, { passive: false });
32
- } else {
33
- window.removeEventListener('wheel', preventScroll);
34
- window.removeEventListener('touchmove', preventScroll);
35
- window.removeEventListener('keydown', preventScrollKeys);
36
- }
37
-
38
- return () => {
39
- window.removeEventListener('wheel', preventScroll);
40
- window.removeEventListener('touchmove', preventScroll);
41
- window.removeEventListener('keydown', preventScrollKeys);
42
- };
43
- }, [isMenuOpened]);
44
-
45
- const preventScrollKeys = (e: KeyboardEvent) => {
46
- if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', ' '].includes(e.key)) {
47
- e.preventDefault();
48
- }
49
- };
50
-
51
- const handleMouseEnter = React.useCallback(() => {
52
- setIsMenuOpen(true);
53
- }, [setIsMenuOpen]);
54
-
55
- const handleMouseLeave = React.useCallback(() => {
56
- setIsMenuOpen(false);
57
- }, [setIsMenuOpen]);
58
-
59
- const menuHiddenClass = !isMenuOpened ? "invisible" : "";
60
-
61
- return links.length > 0 ? (
62
- <NavigationMenu>
63
- <NavigationMenuList>
64
- {links.map((el, index) => (
65
- <NavigationMenuItem key={index} className="!m-0">
66
- {el.isAIMenu ? (
67
- <Link href={el.href} legacyBehavior passHref>
68
- <NavigationMenuLink className={cn(navigationMenuTriggerStyle(), ' text-muted-1 bg-transparent')}>
69
- {el.title}
70
- </NavigationMenuLink>
71
- </Link>
72
- ) : el.title === "Cards" ? (
73
- <>
74
- <NavigationMenuTrigger
75
- className="text-muted-1 bg-transparent"
76
- onMouseEnter={handleMouseEnter}
77
- onFocus={handleMouseEnter}
78
- onMouseLeave={handleMouseLeave}
79
- onBlur={handleMouseLeave}
80
- >
81
- <Link href={el.href} legacyBehavior passHref>
82
- {el.title}
83
- </Link>
84
- </NavigationMenuTrigger>
85
- <NavigationMenuContent
86
- className={cn("fixed left-0 top-14 pt-6 w-screen h-full border-0 !backdrop-blur-3xl bg-transparent mt-0", menuHiddenClass)}
87
- onMouseEnter={handleMouseEnter}
88
- onMouseLeave={handleMouseLeave}
89
- >
90
- <div className="flex justify-center items-start">
91
- <div className="grid xl:grid-cols-3 w-full justify-center max-w-[750px]">
92
- {GroupChildMenu({ childs: el.childMenu, isCards: true })}
93
- </div>
94
- </div>
95
- </NavigationMenuContent>
96
- </>
97
- ) : (
98
- <>
99
- <NavigationMenuTrigger
100
- className="text-muted-1 bg-transparent"
101
- onMouseEnter={handleMouseEnter}
102
- onFocus={handleMouseEnter}
103
- onMouseLeave={handleMouseLeave}
104
- onBlur={handleMouseLeave}
105
- >
106
- {
107
- el.href && el.href !== "" ?
108
- <Link href={el.href} legacyBehavior passHref>
109
- {el.title}
110
- </Link> : <>{el.title}</>
111
- }
112
- </NavigationMenuTrigger>
113
- <NavigationMenuContent
114
- className={cn("fixed left-0 top-14 pt-6 w-screen h-full border-0 !backdrop-blur-3xl bg-transparent mt-0", menuHiddenClass)}
115
- onMouseEnter={handleMouseEnter}
116
- onMouseLeave={handleMouseLeave}
117
- >
118
- <div className="flex flex-row w-full justify-center">
119
- {GroupChildMenu({ childs: el.childMenu })}
120
- </div>
121
- </NavigationMenuContent>
122
- </>
123
- )}
124
- </NavigationMenuItem>
125
- ))}
126
- </NavigationMenuList>
127
- </NavigationMenu>
128
- ) : null;
129
- };
130
-
131
- export default DesktopNav
132
-
133
- const ListItem = React.forwardRef<
134
- React.ElementRef<"a">,
135
- React.ComponentPropsWithoutRef<"a">
136
- >(({ className, title, children, ...props }, ref) => (
137
- <li key={title}>
138
- <NavigationMenuLink asChild>
139
- <a
140
- ref={ref}
141
- className={cn(
142
- "block select-none space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors hover:text-accent-foreground focus:bg-level-1 focus:text-accent-foreground text-muted-1 hover:text-primary hover:bg-transparent duration-1000 ease-in-out",
143
- className
144
- )}
145
- {...props}
146
- >
147
- <div className="text-sm font-medium leading-none">{title}</div>
148
- <p className="line-clamp-3 text-sm leading-snug text-muted-1">
149
- {children}
150
- </p>
151
- </a>
152
- </NavigationMenuLink>
153
- </li>
154
- ));
155
- ListItem.displayName = "ListItem"
156
-
157
- const GroupChildMenu = (params: { childs: ChildMenu[] | undefined, isCards?: boolean }) => {
158
- const { childs, isCards = false } = params;
159
-
160
- if (!childs) {
161
- return null;
162
- }
163
-
164
- const groupedChildMenus = childs.reduce((grouped: Record<string, ChildMenu[]>, childLink) => {
165
- if (childLink.groupName) {
166
- grouped[childLink.groupName] = grouped[childLink.groupName] || [];
167
- grouped[childLink.groupName].push(childLink);
168
- }
169
- return grouped;
170
- }, {});
171
-
172
- const getChildExtraClass = (index: number) => {
173
- if (isCards && (index === 3 || index === 4)) {
174
- return "xl:-mt-32"
175
- }
176
- return ""
177
- };
178
-
179
- return Object.entries(groupedChildMenus).map(([groupName, childLinks], index) => (
180
- <div key={groupName} className={cn("py-4 px-4 ", getChildExtraClass(index))}>
181
- <h2 className="text-muted-1">{groupName}</h2>
182
- <ul className="w-[200px] gap-3 md:w-[250px] lg:w-[250px]">
183
- {childLinks.map((link) => (
184
- <div className="flex justify-start items-center" key={link.title}>
185
- {link.icon}
186
- <ListItem key={link.title} title={link.title} href={link.href} className="ml-[14px]">
187
- {link.contents}
188
- </ListItem>
189
- </div>
190
- ))}
191
- </ul>
192
- </div>
193
- ));
194
- };