@luxfi/core 5.1.4 → 5.1.6
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.
- package/commerce/{AUTO-GEN-bullion-by-family.json → data/AUTO-GEN-bullion-by-family.json} +33 -33
- package/commerce/{EDIT-ME-bullion-market-prices.ts → data/EDIT-ME-bullion-market-prices.ts} +11 -11
- package/commerce/{assign-prices.ts → data/assign-prices.ts} +49 -49
- package/commerce/{assign-videos-by-family-group.ts → data/assign-videos-by-family-group.ts} +14 -14
- package/commerce/{bullion-price-1oz.ts → data/bullion-price-1oz.ts} +5 -5
- package/commerce/{index.ts → data/index.ts} +18 -18
- package/commerce/ui/conf.ts +13 -0
- package/commerce/ui/context.tsx +102 -0
- package/commerce/ui/store.ts +277 -0
- package/components/access-code-input.tsx +71 -71
- package/components/auth/auth-listener.tsx +29 -29
- package/components/auth/auth-token/clear-auth-token.tsx +12 -12
- package/components/auth/auth-token/set-auth-token.tsx +16 -16
- package/components/auth/common-auth-domains.ts +16 -16
- package/components/auth/login-panel.tsx +107 -104
- package/components/chat-widget.tsx +85 -80
- package/components/commerce/add-widget.tsx +20 -0
- package/components/commerce/bag-button.tsx +98 -98
- package/components/commerce/buy-button.tsx +34 -0
- package/components/commerce/checkout-button.tsx +129 -116
- package/components/commerce/checkout-panel/close-button.tsx +26 -26
- package/components/commerce/checkout-panel/dt-bag-carousel.tsx +36 -36
- package/components/commerce/checkout-panel/dt-checkout-panel.tsx +66 -66
- package/components/commerce/checkout-panel/index.tsx +129 -124
- package/components/commerce/checkout-panel/links-row.tsx +21 -21
- package/components/commerce/checkout-panel/mb-checkout-panel.tsx +54 -54
- package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
- package/components/commerce/checkout-panel/thank-you.tsx +18 -18
- package/components/commerce/checkout-widget/const.ts +13 -13
- package/components/commerce/checkout-widget/index.tsx +192 -86
- package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
- package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -56
- package/components/commerce/desktop-bag-popup.tsx +78 -78
- package/components/commerce/drawer/index.tsx +117 -0
- package/components/commerce/drawer/micro.tsx +136 -0
- package/components/commerce/drawer/shell.tsx +79 -0
- package/components/commerce/mobile-bag-drawer.tsx +51 -51
- package/components/commerce/mobile-login-button.tsx +100 -100
- package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
- package/components/commerce/mobile-nav-menu-ai.tsx +97 -97
- package/components/commerce/mobile-nav-menu-item.tsx +45 -45
- package/components/commerce/mobile-nav-menu.tsx +80 -79
- package/components/contact-dialog/contact-form.tsx +113 -112
- package/components/contact-dialog/disclaimer.tsx +13 -13
- package/components/contact-dialog/index.tsx +64 -64
- package/components/copyright.tsx +21 -21
- package/components/drawer-margin.tsx +25 -0
- package/components/footer.tsx +77 -77
- package/components/header/desktop.tsx +54 -54
- package/components/header/index.tsx +40 -47
- package/components/header/mobile.tsx +165 -165
- package/components/header/theme-toggle.tsx +26 -26
- package/components/icons/avatar.tsx +11 -11
- package/components/icons/bag-icon.tsx +10 -10
- package/components/icons/github.tsx +14 -14
- package/components/icons/index.tsx +43 -43
- package/components/icons/left-arrow.tsx +11 -11
- package/components/icons/lux-logo.tsx +10 -10
- package/components/icons/right-arrow.tsx +10 -10
- package/components/icons/search.tsx +12 -12
- package/components/icons/secure-delivery.tsx +13 -13
- package/components/icons/social-icon.tsx +35 -35
- package/components/icons/social-svg.css +3 -3
- package/components/icons/youtube-logo.tsx +59 -59
- package/components/index.ts +25 -27
- package/components/logo.tsx +81 -81
- package/components/main.tsx +27 -0
- package/components/mini-chart/index.tsx +7 -7
- package/components/mini-chart/mini-chart-props.ts +43 -43
- package/components/mini-chart/mini-chart.tsx +85 -85
- package/components/mini-chart/wrapper.tsx +23 -23
- package/components/not-found/index.tsx +28 -27
- package/components/not-found/not-found-content.mdx +5 -5
- package/components/scripts.tsx +24 -24
- package/conf/index.ts +52 -50
- package/{commerce/lux-service-options.ts → conf/lux-commerce-options.ts} +6 -6
- package/environment.d.ts +5 -5
- package/next/analytics/fpixel.ts +15 -15
- package/next/analytics/google-analytics.ts +13 -13
- package/next/analytics/index.ts +3 -3
- package/next/analytics/pixel-analytics.tsx +54 -54
- package/next/font/get-app-router-font-classes.ts +12 -12
- package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
- package/next/font/next-font-desc.ts +27 -27
- package/next/font/pages-router-font-vars.tsx +18 -18
- package/next/head-metadata/from-next/metadata-types.ts +158 -158
- package/next/head-metadata/from-next/opengraph-types.ts +267 -267
- package/next/head-metadata/from-next/twitter-types.ts +92 -92
- package/next/head-metadata/index.tsx +208 -208
- package/next/middleware/determine-device-mw.ts +16 -16
- package/package.json +80 -73
- package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
- package/root-layout/index.tsx +118 -121
- package/server-actions/firebase-app.ts +14 -14
- package/server-actions/index.ts +5 -5
- package/server-actions/store-contact.ts +51 -51
- package/site-def/footer/community.tsx +67 -67
- package/site-def/footer/company.ts +37 -37
- package/site-def/footer/ecosystem.ts +37 -37
- package/site-def/footer/index.tsx +26 -26
- package/site-def/footer/legal.ts +28 -28
- package/site-def/footer/network.ts +45 -45
- package/site-def/footer/svg/warpcast-logo.svg +11 -11
- package/site-def/index.ts +2 -2
- package/site-def/main-nav.tsx +292 -292
- package/style/cart-animation.css +29 -29
- package/style/checkout-animation.css +23 -23
- package/style/drawer-handle-overrides.css +160 -0
- package/style/lux-colors.css +85 -85
- package/style/lux-global.css +30 -30
- package/tailwind/fontFamily.tailwind.lux.ts +18 -18
- package/tailwind/index.ts +2 -2
- package/tailwind/lux-tw-fonts.ts +39 -39
- package/tailwind/tailwind.config.lux-preset.ts +10 -10
- package/tsconfig.json +15 -10
- package/types/chatbot-config.ts +6 -6
- package/types/chatbot-suggested-question.ts +7 -7
- package/types/commerce-config.ts +10 -10
- package/types/contact-info.ts +10 -10
- package/types/index.ts +5 -5
- package/types/site-def.ts +45 -45
- package/components/commerce/buy-drawer/drawer.tsx +0 -44
- package/components/commerce/buy-drawer/index.tsx +0 -46
- package/components/commerce/checkout-widget/use-lagging-item-ref.ts +0 -30
- package/components/header/guts.tsx +0 -27
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
import React from 'react'
|
|
3
|
+
import { useRouter } from 'next/navigation'
|
|
4
|
+
import { observer } from 'mobx-react-lite'
|
|
5
|
+
|
|
6
|
+
import { CarouselBuyCard } from '@hanzo/commerce'
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
useSelectAndBuy,
|
|
10
|
+
useCommerceDrawer,
|
|
11
|
+
useRecentActivity
|
|
12
|
+
} from '../../../commerce/ui/context'
|
|
13
|
+
|
|
14
|
+
import CommerceDrawer from './shell'
|
|
15
|
+
import CheckoutButton from '../checkout-button'
|
|
16
|
+
import Micro from './micro'
|
|
17
|
+
|
|
18
|
+
const CommerceUIComponent: React.FC = observer(() => {
|
|
19
|
+
|
|
20
|
+
const buy = useSelectAndBuy()
|
|
21
|
+
const drawer = useCommerceDrawer()
|
|
22
|
+
const recent = useRecentActivity()
|
|
23
|
+
const router = useRouter()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
const handleCheckout = (): void => {
|
|
27
|
+
router.push('/checkout')
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// see handleCloseGesture()
|
|
31
|
+
const setOpen = (b: boolean): void => {
|
|
32
|
+
if (!b) {
|
|
33
|
+
console.log("ON CLOSE")
|
|
34
|
+
if (!drawer.closedByUser) {
|
|
35
|
+
console.log("syncing closed state to UI gesture")
|
|
36
|
+
drawer.setClosedByUser(true)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const handleHandleClicked = (): void => {
|
|
42
|
+
|
|
43
|
+
if (drawer.state === 'full') {
|
|
44
|
+
buy.hideVariants()
|
|
45
|
+
}
|
|
46
|
+
else if (drawer.state === 'micro') {
|
|
47
|
+
if (drawer.showAdded) {
|
|
48
|
+
buy.showVariants(recent.item?.sku ?? '')
|
|
49
|
+
}
|
|
50
|
+
// checkout only
|
|
51
|
+
else {
|
|
52
|
+
drawer.setClosedByUser(true)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const handleItemClicked = () => {
|
|
58
|
+
buy.showVariants(recent.item?.sku ?? '')
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const handleCloseGesture = (): boolean => {
|
|
62
|
+
if (drawer.state === 'full') {
|
|
63
|
+
buy.hideVariants()
|
|
64
|
+
return true // "handled!"
|
|
65
|
+
}
|
|
66
|
+
return false
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
return (
|
|
71
|
+
<CommerceDrawer
|
|
72
|
+
open={drawer.open}
|
|
73
|
+
setOpen={setOpen}
|
|
74
|
+
snapPoints={drawer.points}
|
|
75
|
+
modal={drawer.modal}
|
|
76
|
+
activeSnapPoint={drawer.activePoint}
|
|
77
|
+
setActiveSnapPoint={drawer.onActivePointChanged.bind(drawer)}
|
|
78
|
+
handleHandleClicked={handleHandleClicked}
|
|
79
|
+
handleCloseGesture={handleCloseGesture}
|
|
80
|
+
micro={drawer.state === 'micro'}
|
|
81
|
+
mobile={drawer.isMobile}
|
|
82
|
+
drawerClx='flex flex-col'
|
|
83
|
+
>
|
|
84
|
+
{drawer.state === 'full' && (
|
|
85
|
+
/* The actual drawer is larger than the visible area (due to awkward
|
|
86
|
+
vaul impl. So we have to ask the drawer for its currect snappoint
|
|
87
|
+
and constrain layout to that.
|
|
88
|
+
*/
|
|
89
|
+
<div style={{height: drawer.snapPointPx - 24 /* fudge factor for handle area */}}>
|
|
90
|
+
<CarouselBuyCard
|
|
91
|
+
skuPath={buy.currentSkuPath!}
|
|
92
|
+
checkoutButton={
|
|
93
|
+
<CheckoutButton
|
|
94
|
+
handleCheckout={handleCheckout}
|
|
95
|
+
className='w-full min-w-[160px] sm:max-w-[320px]'
|
|
96
|
+
/>
|
|
97
|
+
}
|
|
98
|
+
onQuantityChanged={recent.quantityChanged.bind(recent)}
|
|
99
|
+
clx='justify-between h-full pb-3'
|
|
100
|
+
addBtnClx='w-full min-w-[160px] sm:max-w-[320px]'
|
|
101
|
+
selectorClx='max-w-[475px]'
|
|
102
|
+
|
|
103
|
+
/>
|
|
104
|
+
</div>
|
|
105
|
+
)}
|
|
106
|
+
{drawer.state === 'micro' && (
|
|
107
|
+
<Micro
|
|
108
|
+
handleCheckout={handleCheckout}
|
|
109
|
+
handleItemClicked={handleItemClicked}
|
|
110
|
+
clx='w-full sm:w-[460px] sm:mx-auto md:w-[550px]'
|
|
111
|
+
/>
|
|
112
|
+
)}
|
|
113
|
+
</CommerceDrawer>
|
|
114
|
+
)
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
export default CommerceUIComponent
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
import React from 'react'
|
|
3
|
+
import { observer } from 'mobx-react-lite'
|
|
4
|
+
|
|
5
|
+
import { Button, Image } from '@hanzo/ui/primitives'
|
|
6
|
+
import { cn, } from '@hanzo/ui/util'
|
|
7
|
+
import type { LineItem } from '@hanzo/commerce/types'
|
|
8
|
+
import { useCommerce, formatCurrencyValue } from '@hanzo/commerce'
|
|
9
|
+
|
|
10
|
+
import CheckoutButton from '../checkout-button'
|
|
11
|
+
import { useCommerceDrawer, useRecentActivity } from '../../../commerce/ui/context'
|
|
12
|
+
|
|
13
|
+
const CN = {
|
|
14
|
+
// h: mind padding!
|
|
15
|
+
mobile: { w: 36, h: 36 },
|
|
16
|
+
sm: { w: 60, h: 36 },
|
|
17
|
+
desktop: { w: 60, h: 36 },
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const renderTitle = (item: LineItem): React.ReactNode => {
|
|
21
|
+
const toks = item.title.split(', ')
|
|
22
|
+
if (toks.length === 2) {
|
|
23
|
+
return <><p>{toks[0]},</p><p className=''>{toks[1]}</p></>
|
|
24
|
+
}
|
|
25
|
+
return <p>{item.title}</p>
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const Info: React.FC<{
|
|
29
|
+
item: LineItem
|
|
30
|
+
clx?: string
|
|
31
|
+
}> = ({
|
|
32
|
+
item,
|
|
33
|
+
clx=''
|
|
34
|
+
}) => {
|
|
35
|
+
|
|
36
|
+
const cmmc = useCommerce()
|
|
37
|
+
const family = cmmc.getFamilyById(item.familyId)
|
|
38
|
+
|
|
39
|
+
let topLine = family!.title
|
|
40
|
+
if (item.sku.startsWith('LXM-AG') || item.sku.startsWith('LXM-AU')) {
|
|
41
|
+
topLine = family!.parentTitle + ', ' + family!.title
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const optionLabel = item.optionLabelShort ?? item.optionLabel
|
|
45
|
+
const priceStr = formatCurrencyValue(item.price)
|
|
46
|
+
|
|
47
|
+
return (<>
|
|
48
|
+
<div className={cn('sm:hidden flex flex-col !text-muted items-stretch whitespace-nowrap text-ellipsis ', clx)}>
|
|
49
|
+
<p className='text-left text-xs'>{topLine}</p>
|
|
50
|
+
<div className='flex justify-between text-xxs'>
|
|
51
|
+
<div>{optionLabel}</div>
|
|
52
|
+
<div className='pl-2.5'>{priceStr}</div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
<div className={cn('hidden sm:flex !text-muted flex-col items-stretch whitespace-nowrap text-ellipsis text-xs', clx)}>
|
|
56
|
+
<p className='text-left'>{topLine}</p>
|
|
57
|
+
<div className='flex justify-between'>
|
|
58
|
+
<div>{optionLabel}</div>
|
|
59
|
+
<div className='pl-2.5'>{priceStr}</div>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
</>)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
const Micro: React.FC<{
|
|
67
|
+
clx?: string
|
|
68
|
+
handleCheckout: () => void
|
|
69
|
+
handleItemClicked: () => void
|
|
70
|
+
}> = observer(({
|
|
71
|
+
clx='',
|
|
72
|
+
handleCheckout,
|
|
73
|
+
handleItemClicked
|
|
74
|
+
}) => {
|
|
75
|
+
|
|
76
|
+
const drawer = useCommerceDrawer()
|
|
77
|
+
const recent = useRecentActivity()
|
|
78
|
+
|
|
79
|
+
return (
|
|
80
|
+
<div className={cn(
|
|
81
|
+
'px-2 sm:px-3 sm:px-0',
|
|
82
|
+
(drawer.showAdded ? 'grid grid-cols-2 ' : 'flex justify-center items-center '),
|
|
83
|
+
'gap-2 md:gap-3 relative',
|
|
84
|
+
clx
|
|
85
|
+
)}>
|
|
86
|
+
{drawer.showAdded && (
|
|
87
|
+
<div className='pb-3 flex flex-col items-stretch'>
|
|
88
|
+
<p className='text-muted text-xxs md:text-xs leading-none pl-1'>recent item:</p>
|
|
89
|
+
<Button
|
|
90
|
+
variant='ghost'
|
|
91
|
+
rounded='sm'
|
|
92
|
+
onClick={handleItemClicked}
|
|
93
|
+
className={cn(
|
|
94
|
+
'flex flex-row justify-between items-center gap-1',
|
|
95
|
+
'-ml-1.5',
|
|
96
|
+
'overflow-hidden ',
|
|
97
|
+
'px-1 py-1 md:px-2 md:py-2',
|
|
98
|
+
)}
|
|
99
|
+
>
|
|
100
|
+
{recent.item?.img && (<>
|
|
101
|
+
<Image def={recent.item.img} constrainTo={CN.mobile} preload className='sm:hidden grow-0 shrink-0'/>
|
|
102
|
+
<Image def={recent.item.img} constrainTo={CN.sm} preload className='hidden sm:flex md:hidden grow-0 shrink-0'/>
|
|
103
|
+
<Image def={recent.item.img} constrainTo={CN.desktop} preload className='hidden md:flex grow-0 shrink-0'/>
|
|
104
|
+
</>)}
|
|
105
|
+
{recent.item && (
|
|
106
|
+
<div className='grow w-full'>
|
|
107
|
+
<Info item={recent.item} clx='w-full'/>
|
|
108
|
+
</div>
|
|
109
|
+
)}
|
|
110
|
+
</Button>
|
|
111
|
+
</div>
|
|
112
|
+
)}
|
|
113
|
+
{drawer.showCheckout && (
|
|
114
|
+
<div className={cn(
|
|
115
|
+
'flex flex-col justify-center w-full',
|
|
116
|
+
(drawer.showAdded ? 'items-stretch' : 'items-center pt-3' )
|
|
117
|
+
)}>
|
|
118
|
+
<CheckoutButton
|
|
119
|
+
handleCheckout={handleCheckout}
|
|
120
|
+
variant='primary'
|
|
121
|
+
size={drawer.isMobile ? 'default' : 'lg'}
|
|
122
|
+
rounded={drawer.isMobile ? 'md' : 'lg'}
|
|
123
|
+
centerText={drawer.isMobile ? !drawer.showAdded : true}
|
|
124
|
+
className={cn(drawer.isMobile ?
|
|
125
|
+
(drawer.showAdded ? 'pl-3.5 pr-2.5' : 'min-w-[320px]')
|
|
126
|
+
:
|
|
127
|
+
(drawer.showAdded ? '' : 'w-[320px]')
|
|
128
|
+
)}
|
|
129
|
+
/>
|
|
130
|
+
</div>
|
|
131
|
+
)}
|
|
132
|
+
</div>
|
|
133
|
+
)
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
export default Micro
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
import React, {type PropsWithChildren } from 'react'
|
|
3
|
+
|
|
4
|
+
import { X as LucideX} from 'lucide-react'
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
Button,
|
|
8
|
+
Drawer,
|
|
9
|
+
DrawerContent,
|
|
10
|
+
DrawerHandle,
|
|
11
|
+
type DrawerProps,
|
|
12
|
+
} from '@hanzo/ui/primitives'
|
|
13
|
+
import { cn } from '@hanzo/ui/util'
|
|
14
|
+
|
|
15
|
+
import '../../../style/drawer-handle-overrides.css'
|
|
16
|
+
|
|
17
|
+
const CommerceDrawer: React.FC<PropsWithChildren &
|
|
18
|
+
Omit<DrawerProps, 'onOpenChange'> &
|
|
19
|
+
{
|
|
20
|
+
setOpen: (b: boolean) => void
|
|
21
|
+
handleHandleClicked: () => void
|
|
22
|
+
drawerClx?: string
|
|
23
|
+
mobile?: boolean
|
|
24
|
+
micro?: boolean
|
|
25
|
+
}
|
|
26
|
+
> = ({
|
|
27
|
+
children,
|
|
28
|
+
open,
|
|
29
|
+
setOpen,
|
|
30
|
+
modal,
|
|
31
|
+
snapPoints,
|
|
32
|
+
setActiveSnapPoint,
|
|
33
|
+
activeSnapPoint,
|
|
34
|
+
handleHandleClicked,
|
|
35
|
+
drawerClx='',
|
|
36
|
+
mobile=false,
|
|
37
|
+
micro=false,
|
|
38
|
+
...rest
|
|
39
|
+
}) => (
|
|
40
|
+
// @ts-ignore
|
|
41
|
+
<Drawer
|
|
42
|
+
open={open}
|
|
43
|
+
onOpenChange={setOpen}
|
|
44
|
+
modal={modal}
|
|
45
|
+
snapPoints={snapPoints}
|
|
46
|
+
setActiveSnapPoint={setActiveSnapPoint}
|
|
47
|
+
activeSnapPoint={activeSnapPoint}
|
|
48
|
+
fastDragSkipsToEnd={false}
|
|
49
|
+
dragHandleOnly={true}
|
|
50
|
+
handleHandleClicked={handleHandleClicked}
|
|
51
|
+
// debugOutput
|
|
52
|
+
{...rest}
|
|
53
|
+
>
|
|
54
|
+
<DrawerContent
|
|
55
|
+
defaultHandle={false}
|
|
56
|
+
className={cn(
|
|
57
|
+
(modal ? 'rounded-t-xl border-muted-2' : 'rounded-t-md border-muted-4' ),
|
|
58
|
+
(micro ? (mobile ? 'mt-4 pt-1.5' : 'mt-5 pt-4') : 'mt-5 pt-5'),
|
|
59
|
+
'w-full h-full'
|
|
60
|
+
)}
|
|
61
|
+
// https://github.com/radix-ui/primitives/discussions/935
|
|
62
|
+
onOpenAutoFocus={(e) => {e.preventDefault()}}
|
|
63
|
+
>
|
|
64
|
+
<DrawerHandle
|
|
65
|
+
className={cn(
|
|
66
|
+
'absolute left-0 right-0 mx-auto z-10',
|
|
67
|
+
'bg-level-3 hover:bg-level-2',
|
|
68
|
+
!mobile ? 'cursor-grab active:cursor-grabbing' : 'touch-pan-y',
|
|
69
|
+
(micro ? (mobile ? 'top-1 w-[85px] h-2 rounded-[2px]' : 'top-2 w-[85px] h-3 rounded-[2px]') : 'top-2 w-[100px] h-3 rounded-full'),
|
|
70
|
+
'[&>[vaul-handle-hitarea]]:hidden',
|
|
71
|
+
//(!micro ? 'bg-level-3 hover:bg-level-2 ' : 'bg-level-1 hover:bg-level-2 ')
|
|
72
|
+
)}
|
|
73
|
+
/>
|
|
74
|
+
{children}
|
|
75
|
+
</DrawerContent>
|
|
76
|
+
</Drawer>
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
export default CommerceDrawer
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
import React from 'react'
|
|
3
|
-
|
|
4
|
-
import { Drawer, DrawerContent} from '@hanzo/ui/primitives'
|
|
5
|
-
import { cn } from '@hanzo/ui/util'
|
|
6
|
-
import { CartPanel } from '@hanzo/commerce'
|
|
7
|
-
|
|
8
|
-
import BagButton from './bag-button'
|
|
9
|
-
|
|
10
|
-
const MobileBagDrawer: React.FC<{
|
|
11
|
-
open: boolean,
|
|
12
|
-
setOpen: (b: boolean) => void
|
|
13
|
-
handleCheckout: () => void
|
|
14
|
-
className?: string
|
|
15
|
-
}> = ({
|
|
16
|
-
open,
|
|
17
|
-
setOpen,
|
|
18
|
-
handleCheckout,
|
|
19
|
-
className='',
|
|
20
|
-
}) => {
|
|
21
|
-
|
|
22
|
-
return (
|
|
23
|
-
<Drawer open={open} onOpenChange={setOpen}>
|
|
24
|
-
<DrawerContent className={cn('rounded-t-xl mt-6 pb-12 h-auto', className)} >
|
|
25
|
-
<CartPanel
|
|
26
|
-
handleCheckout={handleCheckout}
|
|
27
|
-
className='mt-4 mb-4 border-none py-0 px-4 w-full '
|
|
28
|
-
listClx='rounded-sm pr-3'
|
|
29
|
-
scrollAfter={5}
|
|
30
|
-
itemClx='mt-2'
|
|
31
|
-
totalClx='sticky px-1 pr-2 border rounded-sm -bottom-[1px] bg-background'
|
|
32
|
-
buttonClx='max-w-[220px] flex-none'
|
|
33
|
-
>
|
|
34
|
-
<div className='flex flex-row items-center flex-none justify-center '>
|
|
35
|
-
<BagButton
|
|
36
|
-
animateOnHover={false}
|
|
37
|
-
showIfEmpty
|
|
38
|
-
className=
|
|
39
|
-
'mr-2 relative w-6 h-7'
|
|
40
|
-
iconClx='fill-foreground '
|
|
41
|
-
/>
|
|
42
|
-
<p className='font-heading text-foreground text-default'>Your Bag</p>
|
|
43
|
-
</div>
|
|
44
|
-
<div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none'/>
|
|
45
|
-
</CartPanel>
|
|
46
|
-
</DrawerContent>
|
|
47
|
-
</Drawer>
|
|
48
|
-
)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export default MobileBagDrawer
|
|
1
|
+
'use client'
|
|
2
|
+
import React from 'react'
|
|
3
|
+
|
|
4
|
+
import { Drawer, DrawerContent} from '@hanzo/ui/primitives'
|
|
5
|
+
import { cn } from '@hanzo/ui/util'
|
|
6
|
+
import { CartPanel } from '@hanzo/commerce'
|
|
7
|
+
|
|
8
|
+
import BagButton from './bag-button'
|
|
9
|
+
|
|
10
|
+
const MobileBagDrawer: React.FC<{
|
|
11
|
+
open: boolean,
|
|
12
|
+
setOpen: (b: boolean) => void
|
|
13
|
+
handleCheckout: () => void
|
|
14
|
+
className?: string
|
|
15
|
+
}> = ({
|
|
16
|
+
open,
|
|
17
|
+
setOpen,
|
|
18
|
+
handleCheckout,
|
|
19
|
+
className='',
|
|
20
|
+
}) => {
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<Drawer open={open} onOpenChange={setOpen}>
|
|
24
|
+
<DrawerContent className={cn('rounded-t-xl mt-6 pb-12 h-auto', className)} >
|
|
25
|
+
<CartPanel
|
|
26
|
+
handleCheckout={handleCheckout}
|
|
27
|
+
className='mt-4 mb-4 border-none py-0 px-4 w-full '
|
|
28
|
+
listClx='rounded-sm pr-3'
|
|
29
|
+
scrollAfter={5}
|
|
30
|
+
itemClx='mt-2'
|
|
31
|
+
totalClx='sticky px-1 pr-2 border rounded-sm -bottom-[1px] bg-background'
|
|
32
|
+
buttonClx='max-w-[220px] flex-none'
|
|
33
|
+
>
|
|
34
|
+
<div className='flex flex-row items-center flex-none justify-center '>
|
|
35
|
+
<BagButton
|
|
36
|
+
animateOnHover={false}
|
|
37
|
+
showIfEmpty
|
|
38
|
+
className=
|
|
39
|
+
'mr-2 relative w-6 h-7'
|
|
40
|
+
iconClx='fill-foreground '
|
|
41
|
+
/>
|
|
42
|
+
<p className='font-heading text-foreground text-default'>Your Bag</p>
|
|
43
|
+
</div>
|
|
44
|
+
<div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none'/>
|
|
45
|
+
</CartPanel>
|
|
46
|
+
</DrawerContent>
|
|
47
|
+
</Drawer>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export default MobileBagDrawer
|
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
import React from "react"
|
|
3
|
-
import { observer } from "mobx-react-lite"
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
Button,
|
|
7
|
-
LinkElement,
|
|
8
|
-
Popover,
|
|
9
|
-
PopoverContent,
|
|
10
|
-
PopoverTrigger,
|
|
11
|
-
Separator
|
|
12
|
-
} from '@hanzo/ui/primitives'
|
|
13
|
-
|
|
14
|
-
import type { LinkDef } from '@hanzo/ui/types'
|
|
15
|
-
import { cn } from '@hanzo/ui/util'
|
|
16
|
-
|
|
17
|
-
import { useAuth } from "@hanzo/auth/service"
|
|
18
|
-
|
|
19
|
-
import { Avatar } from "../icons"
|
|
20
|
-
import { Ethereum } from "@hanzo/auth/icons"
|
|
21
|
-
import { Icons } from ".."
|
|
22
|
-
|
|
23
|
-
const MobileAuthWidget: React.FC<{
|
|
24
|
-
noLogin?: boolean
|
|
25
|
-
className?: string
|
|
26
|
-
handleLogin?: () => void
|
|
27
|
-
}> = observer(({
|
|
28
|
-
noLogin = false,
|
|
29
|
-
handleLogin,
|
|
30
|
-
className
|
|
31
|
-
}) => {
|
|
32
|
-
const auth = useAuth()
|
|
33
|
-
|
|
34
|
-
if (!auth) {
|
|
35
|
-
return null
|
|
36
|
-
}
|
|
37
|
-
if (!auth.loggedIn && typeof window !== 'undefined') {
|
|
38
|
-
return (noLogin ? null : (
|
|
39
|
-
(handleLogin) ? (
|
|
40
|
-
<div className="flex items-center py-3 px-5 gap-4">
|
|
41
|
-
<Icons.Avatar className='self-center w-6 h-6' />
|
|
42
|
-
<Button
|
|
43
|
-
variant='link'
|
|
44
|
-
className='text-2xl !min-w-0 self-center'
|
|
45
|
-
onClick={handleLogin}
|
|
46
|
-
>
|
|
47
|
-
Log In / Sign Up
|
|
48
|
-
</Button>
|
|
49
|
-
</div>
|
|
50
|
-
) : (
|
|
51
|
-
<LinkElement
|
|
52
|
-
def={{
|
|
53
|
-
href: `${process.env.NEXT_PUBLIC_LOGIN_SITE_URL}?redirectUrl=${window.location.href}`,
|
|
54
|
-
title: 'Login',
|
|
55
|
-
variant: 'primary',
|
|
56
|
-
newTab: false
|
|
57
|
-
} satisfies LinkDef}
|
|
58
|
-
className='h-8 w-fit !min-w-0'
|
|
59
|
-
/>
|
|
60
|
-
)
|
|
61
|
-
))
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return (
|
|
65
|
-
<Popover>
|
|
66
|
-
<PopoverTrigger asChild>
|
|
67
|
-
<Button
|
|
68
|
-
variant="outline"
|
|
69
|
-
size='icon'
|
|
70
|
-
className={cn('rounded-full text-muted border-2 border-muted bg-level-1 hover:bg-level-2 hover:border-foreground hover:text-foreground uppercase w-8 h-8', className)}
|
|
71
|
-
>{auth.user?.email[0]}</Button>
|
|
72
|
-
</PopoverTrigger>
|
|
73
|
-
<PopoverContent className='bg-level-0'>
|
|
74
|
-
<div className="grid gap-4">
|
|
75
|
-
<div className="space-y-2 truncate">
|
|
76
|
-
{auth.user?.displayName ? (
|
|
77
|
-
<>
|
|
78
|
-
<h4 className="font-medium leading-none truncate">{auth.user.displayName}</h4>
|
|
79
|
-
<p className="text-sm opacity-50 truncate">{auth.user.email}</p>
|
|
80
|
-
</>
|
|
81
|
-
) : (
|
|
82
|
-
<h4 className="font-medium leading-none truncate">{auth.user?.email}</h4>
|
|
83
|
-
)}
|
|
84
|
-
{auth.user?.walletAddress ? (
|
|
85
|
-
<p className="text-sm opacity-50 truncate">{auth.user.walletAddress}</p>
|
|
86
|
-
) : (
|
|
87
|
-
<Button variant="outline" className='w-full flex items-center gap-2' onClick={auth.associateWallet.bind(auth)}>
|
|
88
|
-
<Ethereum height={20} />Connect your wallet
|
|
89
|
-
</Button>
|
|
90
|
-
)}
|
|
91
|
-
</div>
|
|
92
|
-
<Separator />
|
|
93
|
-
<Button variant="outline" onClick={auth.logout.bind(auth)}>Logout</Button>
|
|
94
|
-
</div>
|
|
95
|
-
</PopoverContent>
|
|
96
|
-
</Popover>
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
})
|
|
100
|
-
|
|
1
|
+
'use client'
|
|
2
|
+
import React from "react"
|
|
3
|
+
import { observer } from "mobx-react-lite"
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
Button,
|
|
7
|
+
LinkElement,
|
|
8
|
+
Popover,
|
|
9
|
+
PopoverContent,
|
|
10
|
+
PopoverTrigger,
|
|
11
|
+
Separator
|
|
12
|
+
} from '@hanzo/ui/primitives'
|
|
13
|
+
|
|
14
|
+
import type { LinkDef } from '@hanzo/ui/types'
|
|
15
|
+
import { cn } from '@hanzo/ui/util'
|
|
16
|
+
|
|
17
|
+
import { useAuth } from "@hanzo/auth/service"
|
|
18
|
+
|
|
19
|
+
import { Avatar } from "../icons"
|
|
20
|
+
import { Ethereum } from "@hanzo/auth/icons"
|
|
21
|
+
import { Icons } from ".."
|
|
22
|
+
|
|
23
|
+
const MobileAuthWidget: React.FC<{
|
|
24
|
+
noLogin?: boolean
|
|
25
|
+
className?: string
|
|
26
|
+
handleLogin?: () => void
|
|
27
|
+
}> = observer(({
|
|
28
|
+
noLogin = false,
|
|
29
|
+
handleLogin,
|
|
30
|
+
className
|
|
31
|
+
}) => {
|
|
32
|
+
const auth = useAuth()
|
|
33
|
+
|
|
34
|
+
if (!auth) {
|
|
35
|
+
return null
|
|
36
|
+
}
|
|
37
|
+
if (!auth.loggedIn && typeof window !== 'undefined') {
|
|
38
|
+
return (noLogin ? null : (
|
|
39
|
+
(handleLogin) ? (
|
|
40
|
+
<div className="flex items-center py-3 px-5 gap-4">
|
|
41
|
+
<Icons.Avatar className='self-center w-6 h-6' />
|
|
42
|
+
<Button
|
|
43
|
+
variant='link'
|
|
44
|
+
className='text-2xl !min-w-0 self-center'
|
|
45
|
+
onClick={handleLogin}
|
|
46
|
+
>
|
|
47
|
+
Log In / Sign Up
|
|
48
|
+
</Button>
|
|
49
|
+
</div>
|
|
50
|
+
) : (
|
|
51
|
+
<LinkElement
|
|
52
|
+
def={{
|
|
53
|
+
href: `${process.env.NEXT_PUBLIC_LOGIN_SITE_URL}?redirectUrl=${window.location.href}`,
|
|
54
|
+
title: 'Login',
|
|
55
|
+
variant: 'primary',
|
|
56
|
+
newTab: false
|
|
57
|
+
} satisfies LinkDef}
|
|
58
|
+
className='h-8 w-fit !min-w-0'
|
|
59
|
+
/>
|
|
60
|
+
)
|
|
61
|
+
))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<Popover>
|
|
66
|
+
<PopoverTrigger asChild>
|
|
67
|
+
<Button
|
|
68
|
+
variant="outline"
|
|
69
|
+
size='icon'
|
|
70
|
+
className={cn('rounded-full text-muted border-2 border-muted bg-level-1 hover:bg-level-2 hover:border-foreground hover:text-foreground uppercase w-8 h-8', className)}
|
|
71
|
+
>{auth.user?.email[0]}</Button>
|
|
72
|
+
</PopoverTrigger>
|
|
73
|
+
<PopoverContent className='bg-level-0'>
|
|
74
|
+
<div className="grid gap-4">
|
|
75
|
+
<div className="space-y-2 truncate">
|
|
76
|
+
{auth.user?.displayName ? (
|
|
77
|
+
<>
|
|
78
|
+
<h4 className="font-medium leading-none truncate">{auth.user.displayName}</h4>
|
|
79
|
+
<p className="text-sm opacity-50 truncate">{auth.user.email}</p>
|
|
80
|
+
</>
|
|
81
|
+
) : (
|
|
82
|
+
<h4 className="font-medium leading-none truncate">{auth.user?.email}</h4>
|
|
83
|
+
)}
|
|
84
|
+
{auth.user?.walletAddress ? (
|
|
85
|
+
<p className="text-sm opacity-50 truncate">{auth.user.walletAddress}</p>
|
|
86
|
+
) : (
|
|
87
|
+
<Button variant="outline" className='w-full flex items-center gap-2' onClick={auth.associateWallet.bind(auth)}>
|
|
88
|
+
<Ethereum height={20} />Connect your wallet
|
|
89
|
+
</Button>
|
|
90
|
+
)}
|
|
91
|
+
</div>
|
|
92
|
+
<Separator />
|
|
93
|
+
<Button variant="outline" onClick={auth.logout.bind(auth)}>Logout</Button>
|
|
94
|
+
</div>
|
|
95
|
+
</PopoverContent>
|
|
96
|
+
</Popover>
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
})
|
|
100
|
+
|
|
101
101
|
export default MobileAuthWidget
|