@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.
- package/package.json +36 -80
- package/tsconfig.json +10 -15
- package/tsconfig.tsbuildinfo +1 -0
- package/types/asset.ts +28 -0
- package/types/contract.ts +13 -0
- package/types/deposit-address.ts +9 -0
- package/types/exchange.ts +25 -0
- package/types/index.ts +21 -4
- package/types/network-type.ts +16 -0
- package/types/network.ts +58 -0
- package/types/swap-status.ts +58 -0
- package/types/transaction-type.ts +5 -0
- package/types/utila.ts +36 -0
- package/commerce/ui/conf.ts +0 -13
- package/commerce/ui/context.tsx +0 -123
- package/commerce/ui/store.ts +0 -290
- package/components/access-code-input.tsx +0 -71
- package/components/auth/auth-listener.tsx +0 -29
- package/components/auth/auth-token/clear-auth-token.tsx +0 -12
- package/components/auth/auth-token/set-auth-token.tsx +0 -16
- package/components/auth/common-auth-domains.ts +0 -16
- package/components/auth/login-panel.tsx +0 -107
- package/components/back-button.tsx +0 -49
- package/components/chat-widget.tsx +0 -85
- package/components/commerce/_to_deprecate_checkout-widget/const.ts +0 -13
- package/components/commerce/_to_deprecate_checkout-widget/index.tsx_ +0 -188
- package/components/commerce/_to_deprecate_checkout-widget/obs-string-set.ts +0 -48
- package/components/commerce/_to_deprecate_checkout-widget/use-anim-clx-set.ts +0 -59
- package/components/commerce/bag-button.tsx +0 -98
- package/components/commerce/buy-button.tsx +0 -34
- package/components/commerce/checkout-button.tsx +0 -129
- package/components/commerce/checkout-panel/cart-accordian.tsx +0 -66
- package/components/commerce/checkout-panel/checkout-panel-props.ts +0 -10
- package/components/commerce/checkout-panel/desktop-bag-carousel.tsx +0 -36
- package/components/commerce/checkout-panel/desktop-cp.tsx +0 -83
- package/components/commerce/checkout-panel/index.tsx +0 -126
- package/components/commerce/checkout-panel/mobile-cp.tsx +0 -67
- package/components/commerce/checkout-panel/policy-links.tsx +0 -29
- package/components/commerce/checkout-panel/steps-indicator.tsx +0 -39
- package/components/commerce/checkout-panel/thank-you.tsx +0 -18
- package/components/commerce/desktop-bag-popup.tsx +0 -78
- package/components/commerce/desktop-nav-menu.tsx +0 -194
- package/components/commerce/drawer/index.tsx +0 -88
- package/components/commerce/drawer/micro.tsx +0 -145
- package/components/commerce/drawer/shell.tsx +0 -85
- package/components/commerce/mobile-bag-drawer.tsx +0 -51
- package/components/commerce/mobile-login-button.tsx +0 -108
- package/components/commerce/mobile-menu-toggle-button.tsx +0 -35
- package/components/commerce/mobile-nav-menu-ai.tsx +0 -51
- package/components/commerce/mobile-nav-menu-item.tsx +0 -50
- package/components/commerce/mobile-nav-menu.tsx +0 -102
- package/components/contact-dialog/contact-form.tsx +0 -113
- package/components/contact-dialog/disclaimer.tsx +0 -13
- package/components/contact-dialog/index.tsx +0 -64
- package/components/copyright.tsx +0 -21
- package/components/drawer-margin.tsx +0 -28
- package/components/footer.tsx +0 -78
- package/components/header/desktop.tsx +0 -51
- package/components/header/index.tsx +0 -50
- package/components/header/mobile.tsx +0 -163
- package/components/header/theme-toggle.tsx +0 -26
- package/components/icons/24k-gold-card.tsx +0 -43
- package/components/icons/ai-chat-act.tsx +0 -47
- package/components/icons/ai-chat.tsx +0 -29
- package/components/icons/anodized-titanium.tsx +0 -45
- package/components/icons/avatar.tsx +0 -11
- package/components/icons/bag-icon.tsx +0 -10
- package/components/icons/blog-act.tsx +0 -14
- package/components/icons/blog.tsx +0 -20
- package/components/icons/bridge-act.tsx +0 -18
- package/components/icons/bridge.tsx +0 -68
- package/components/icons/changelog-act.tsx +0 -15
- package/components/icons/changelog.tsx +0 -21
- package/components/icons/chrome.tsx +0 -45
- package/components/icons/coins-act.tsx +0 -29
- package/components/icons/coins.tsx +0 -20
- package/components/icons/compare-cards-act.tsx +0 -30
- package/components/icons/compare-cards.tsx +0 -21
- package/components/icons/credit-act.tsx +0 -29
- package/components/icons/credit.tsx +0 -20
- package/components/icons/customer-support-act.tsx +0 -27
- package/components/icons/customer-support.tsx +0 -21
- package/components/icons/customers-act.tsx +0 -65
- package/components/icons/customers.tsx +0 -33
- package/components/icons/developer-docs-act.tsx +0 -26
- package/components/icons/developer-docs.tsx +0 -20
- package/components/icons/exchange-act.tsx +0 -27
- package/components/icons/exchange.tsx +0 -21
- package/components/icons/explorer-act.tsx +0 -27
- package/components/icons/explorer.tsx +0 -22
- package/components/icons/faqs-act.tsx +0 -27
- package/components/icons/faqs.tsx +0 -21
- package/components/icons/github.tsx +0 -14
- package/components/icons/guides-act.tsx +0 -26
- package/components/icons/guides.tsx +0 -21
- package/components/icons/gun-metal.tsx +0 -44
- package/components/icons/index.tsx +0 -43
- package/components/icons/integrations-act.tsx +0 -41
- package/components/icons/integrations.tsx +0 -25
- package/components/icons/irradescent.tsx +0 -41
- package/components/icons/launch-subnet.tsx +0 -21
- package/components/icons/launchsubnet-act.tsx +0 -29
- package/components/icons/left-arrow.tsx +0 -11
- package/components/icons/lux-finance-act.tsx +0 -34
- package/components/icons/lux-finance.tsx +0 -23
- package/components/icons/lux-logo.tsx +0 -10
- package/components/icons/lux-pass-act.tsx +0 -41
- package/components/icons/lux-pass.tsx +0 -25
- package/components/icons/lux-quests-act.tsx +0 -15
- package/components/icons/lux-quests.tsx +0 -21
- package/components/icons/market-act.tsx +0 -39
- package/components/icons/market.tsx +0 -24
- package/components/icons/mirrored-titanium.tsx +0 -46
- package/components/icons/more-benefits-act.tsx +0 -29
- package/components/icons/more-benefits.tsx +0 -21
- package/components/icons/open-source-act.tsx +0 -41
- package/components/icons/open-source.tsx +0 -26
- package/components/icons/right-arrow.tsx +0 -10
- package/components/icons/safe-act.tsx +0 -77
- package/components/icons/safe.tsx +0 -37
- package/components/icons/search.tsx +0 -12
- package/components/icons/secure-delivery.tsx +0 -13
- package/components/icons/shop-act.tsx +0 -29
- package/components/icons/shop.tsx +0 -20
- package/components/icons/social-icon.tsx +0 -35
- package/components/icons/social-svg.css +0 -3
- package/components/icons/sterling-silver-card.tsx +0 -44
- package/components/icons/templates-act.tsx +0 -29
- package/components/icons/templates.tsx +0 -21
- package/components/icons/validators-act.tsx +0 -42
- package/components/icons/validators.tsx +0 -41
- package/components/icons/view-all-card-act.tsx +0 -28
- package/components/icons/view-all-card.tsx +0 -20
- package/components/icons/wallet-act.tsx +0 -29
- package/components/icons/wallet.tsx +0 -20
- package/components/icons/warpcast.tsx +0 -58
- package/components/icons/youtube-logo.tsx +0 -59
- package/components/index.ts +0 -25
- package/components/logo.tsx +0 -89
- package/components/main.tsx +0 -27
- package/components/mini-chart/index.tsx +0 -8
- package/components/mini-chart/mini-chart-props.ts +0 -44
- package/components/mini-chart/mini-chart.tsx +0 -85
- package/components/mini-chart/wrapper.tsx +0 -23
- package/components/not-found/index.tsx +0 -28
- package/components/not-found/not-found-content.mdx +0 -5
- package/components/scripts.tsx +0 -24
- package/components/tooltip.tsx +0 -31
- package/environment.d.ts +0 -6
- package/next/analytics/fpixel.ts +0 -16
- package/next/analytics/google-analytics.ts +0 -14
- package/next/analytics/index.ts +0 -3
- package/next/analytics/pixel-analytics.tsx +0 -55
- package/next/font/get-app-router-font-classes.ts +0 -12
- package/next/font/load-and-return-lux-next-fonts-on-import.ts +0 -68
- package/next/font/local/Druk-Wide-Bold.ttf +0 -0
- package/next/font/local/Druk-Wide-Medium.ttf +0 -0
- package/next/font/local/InterVariable-Italic.ttf +0 -0
- package/next/font/local/InterVariable-Italic.woff2 +0 -0
- package/next/font/local/InterVariable.ttf +0 -0
- package/next/font/local/InterVariable.woff2 +0 -0
- package/next/font/next-font-desc.ts +0 -28
- package/next/font/pages-router-font-vars.tsx +0 -18
- package/next/head-metadata/from-next/metadata-types.ts +0 -158
- package/next/head-metadata/from-next/opengraph-types.ts +0 -267
- package/next/head-metadata/from-next/twitter-types.ts +0 -92
- package/next/head-metadata/index.tsx +0 -208
- package/next/index.ts +0 -1
- package/next/middleware/determine-device-mw.ts +0 -16
- package/root-layout/WHY_THIS_IS_SEPARATE.txt +0 -2
- package/root-layout/index.tsx +0 -112
- package/server-actions/TO-DO.txt +0 -1
- package/server-actions/firebase-app.ts +0 -14
- package/server-actions/index.ts +0 -5
- package/server-actions/store-contact.ts +0 -51
- package/site-def/footer/community.tsx +0 -67
- package/site-def/footer/company.ts +0 -37
- package/site-def/footer/ecosystem.ts +0 -37
- package/site-def/footer/index.tsx +0 -26
- package/site-def/footer/legal.ts +0 -28
- package/site-def/footer/network.ts +0 -45
- package/site-def/footer/svg/warpcast-logo.svg +0 -12
- package/site-def/index.ts +0 -3
- package/site-def/main-nav.tsx +0 -458
- package/style/cart-animation.css +0 -29
- package/style/checkout-animation.css +0 -23
- package/style/drawer-handle-overrides.css +0 -160
- package/style/lux-colors.css +0 -85
- package/style/lux-global.css +0 -51
- package/tailwind/fontFamily.tailwind.lux.ts +0 -18
- package/tailwind/index.ts +0 -2
- package/tailwind/lux-tw-fonts.ts +0 -40
- package/tailwind/tailwind.config.lux-preset.ts +0 -10
- package/types/chatbot-config.ts +0 -7
- package/types/chatbot-suggested-question.ts +0 -7
- package/types/contact-info.ts +0 -11
- 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
|
-
};
|