@luxfi/core 5.2.6 → 5.2.7
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/ui/conf.ts +13 -13
- package/commerce/ui/context.tsx +102 -102
- package/commerce/ui/store.ts +276 -276
- 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 -107
- package/components/chat-widget.tsx +85 -85
- package/components/commerce/add-widget.tsx +20 -20
- package/components/commerce/bag-button.tsx +98 -98
- package/components/commerce/buy-button.tsx +34 -34
- package/components/commerce/checkout-button.tsx +129 -129
- 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 -129
- 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 -192
- package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
- package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -58
- package/components/commerce/desktop-bag-popup.tsx +78 -78
- package/components/commerce/desktop-nav-menu.tsx +130 -235
- package/components/commerce/drawer/index.tsx +116 -116
- package/components/commerce/drawer/micro.tsx +144 -144
- package/components/commerce/drawer/shell.tsx +83 -83
- package/components/commerce/mobile-bag-drawer.tsx +51 -51
- package/components/commerce/mobile-login-button.tsx +101 -101
- package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
- package/components/commerce/mobile-nav-menu-ai.tsx +44 -44
- package/components/commerce/mobile-nav-menu-item.tsx +49 -49
- package/components/commerce/mobile-nav-menu.tsx +68 -68
- package/components/contact-dialog/contact-form.tsx +113 -113
- 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 -25
- package/components/footer.tsx +77 -77
- package/components/header/desktop.tsx +49 -57
- package/components/header/index.tsx +52 -52
- package/components/header/mobile.tsx +166 -166
- 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/warpcast.tsx +58 -58
- package/components/icons/youtube-logo.tsx +59 -59
- package/components/index.ts +25 -25
- package/components/logo.tsx +81 -81
- package/components/main.tsx +27 -27
- 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 -28
- package/components/not-found/not-found-content.mdx +5 -5
- package/components/scripts.tsx +24 -24
- 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 +78 -78
- package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
- package/root-layout/index.tsx +112 -112
- 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 +338 -338
- package/style/cart-animation.css +29 -29
- package/style/checkout-animation.css +23 -23
- package/style/drawer-handle-overrides.css +160 -160
- 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 -15
- package/types/chatbot-config.ts +6 -6
- package/types/chatbot-suggested-question.ts +7 -7
- package/types/contact-info.ts +10 -10
- package/types/index.ts +4 -4
- package/types/site-def.ts +43 -43
|
@@ -1,83 +1,83 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
import React, {type PropsWithChildren } from 'react'
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
Drawer,
|
|
6
|
-
DrawerContent,
|
|
7
|
-
DrawerHandle,
|
|
8
|
-
type DrawerProps,
|
|
9
|
-
} from '@hanzo/ui/primitives'
|
|
10
|
-
import { cn } from '@hanzo/ui/util'
|
|
11
|
-
|
|
12
|
-
import '../../../style/drawer-handle-overrides.css'
|
|
13
|
-
|
|
14
|
-
const CommerceDrawer: React.FC<PropsWithChildren &
|
|
15
|
-
Omit<DrawerProps, 'onOpenChange'> &
|
|
16
|
-
{
|
|
17
|
-
setOpen: (b: boolean) => void
|
|
18
|
-
handleHandleClicked: () => void
|
|
19
|
-
drawerClx?: string
|
|
20
|
-
mobile?: boolean
|
|
21
|
-
micro?: boolean
|
|
22
|
-
}
|
|
23
|
-
> = ({
|
|
24
|
-
children,
|
|
25
|
-
open,
|
|
26
|
-
setOpen,
|
|
27
|
-
modal,
|
|
28
|
-
snapPoints,
|
|
29
|
-
setActiveSnapPoint,
|
|
30
|
-
activeSnapPoint,
|
|
31
|
-
handleHandleClicked,
|
|
32
|
-
drawerClx='',
|
|
33
|
-
mobile=false,
|
|
34
|
-
micro=false,
|
|
35
|
-
...rest
|
|
36
|
-
}) => (
|
|
37
|
-
// @ts-ignore
|
|
38
|
-
<Drawer
|
|
39
|
-
open={open}
|
|
40
|
-
onOpenChange={setOpen}
|
|
41
|
-
modal={modal}
|
|
42
|
-
snapPoints={snapPoints}
|
|
43
|
-
setActiveSnapPoint={setActiveSnapPoint}
|
|
44
|
-
activeSnapPoint={activeSnapPoint}
|
|
45
|
-
fastDragSkipsToEnd={false}
|
|
46
|
-
dragHandleOnly={true}
|
|
47
|
-
handleHandleClicked={handleHandleClicked}
|
|
48
|
-
extendHandleDragRegion={false}
|
|
49
|
-
// debugOutput
|
|
50
|
-
{...rest}
|
|
51
|
-
>
|
|
52
|
-
<DrawerContent
|
|
53
|
-
defaultHandle={false}
|
|
54
|
-
className={cn(
|
|
55
|
-
'border-0',
|
|
56
|
-
//(micro ? (mobile ? 'mt-4 pt-1.5' : 'mt-5 pt-4') : 'mt-5 pt-5'),
|
|
57
|
-
mobile ? 'pt-5' : 'pt-6',
|
|
58
|
-
'w-full h-full',
|
|
59
|
-
)}
|
|
60
|
-
// https://github.com/radix-ui/primitives/discussions/935
|
|
61
|
-
onOpenAutoFocus={(e) => {e.preventDefault()}}
|
|
62
|
-
>
|
|
63
|
-
<DrawerHandle
|
|
64
|
-
className={cn(
|
|
65
|
-
'absolute top-0 left-0 right-0 mx-auto z-10',
|
|
66
|
-
'flex justify-center items-start',
|
|
67
|
-
'border-t rounded-t-lg border-muted-2',
|
|
68
|
-
mobile ? 'h-5 touch-pan-y' : 'h-6',
|
|
69
|
-
)}
|
|
70
|
-
>
|
|
71
|
-
<div className={cn(
|
|
72
|
-
// pseudo-handle
|
|
73
|
-
'rounded-[3px] bg-level-3',
|
|
74
|
-
mobile ? 'w-[155px] mt-[5px] h-1.5' : 'w-[180px] mt-[3px] h-2.5 hover:bg-level-4',
|
|
75
|
-
!mobile ? 'cursor-grab active:cursor-grabbing' : '',
|
|
76
|
-
)} />
|
|
77
|
-
</DrawerHandle>
|
|
78
|
-
{children}
|
|
79
|
-
</DrawerContent>
|
|
80
|
-
</Drawer>
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
export default CommerceDrawer
|
|
1
|
+
'use client'
|
|
2
|
+
import React, {type PropsWithChildren } from 'react'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
Drawer,
|
|
6
|
+
DrawerContent,
|
|
7
|
+
DrawerHandle,
|
|
8
|
+
type DrawerProps,
|
|
9
|
+
} from '@hanzo/ui/primitives'
|
|
10
|
+
import { cn } from '@hanzo/ui/util'
|
|
11
|
+
|
|
12
|
+
import '../../../style/drawer-handle-overrides.css'
|
|
13
|
+
|
|
14
|
+
const CommerceDrawer: React.FC<PropsWithChildren &
|
|
15
|
+
Omit<DrawerProps, 'onOpenChange'> &
|
|
16
|
+
{
|
|
17
|
+
setOpen: (b: boolean) => void
|
|
18
|
+
handleHandleClicked: () => void
|
|
19
|
+
drawerClx?: string
|
|
20
|
+
mobile?: boolean
|
|
21
|
+
micro?: boolean
|
|
22
|
+
}
|
|
23
|
+
> = ({
|
|
24
|
+
children,
|
|
25
|
+
open,
|
|
26
|
+
setOpen,
|
|
27
|
+
modal,
|
|
28
|
+
snapPoints,
|
|
29
|
+
setActiveSnapPoint,
|
|
30
|
+
activeSnapPoint,
|
|
31
|
+
handleHandleClicked,
|
|
32
|
+
drawerClx='',
|
|
33
|
+
mobile=false,
|
|
34
|
+
micro=false,
|
|
35
|
+
...rest
|
|
36
|
+
}) => (
|
|
37
|
+
// @ts-ignore
|
|
38
|
+
<Drawer
|
|
39
|
+
open={open}
|
|
40
|
+
onOpenChange={setOpen}
|
|
41
|
+
modal={modal}
|
|
42
|
+
snapPoints={snapPoints}
|
|
43
|
+
setActiveSnapPoint={setActiveSnapPoint}
|
|
44
|
+
activeSnapPoint={activeSnapPoint}
|
|
45
|
+
fastDragSkipsToEnd={false}
|
|
46
|
+
dragHandleOnly={true}
|
|
47
|
+
handleHandleClicked={handleHandleClicked}
|
|
48
|
+
extendHandleDragRegion={false}
|
|
49
|
+
// debugOutput
|
|
50
|
+
{...rest}
|
|
51
|
+
>
|
|
52
|
+
<DrawerContent
|
|
53
|
+
defaultHandle={false}
|
|
54
|
+
className={cn(
|
|
55
|
+
'border-0',
|
|
56
|
+
//(micro ? (mobile ? 'mt-4 pt-1.5' : 'mt-5 pt-4') : 'mt-5 pt-5'),
|
|
57
|
+
mobile ? 'pt-5' : 'pt-6',
|
|
58
|
+
'w-full h-full',
|
|
59
|
+
)}
|
|
60
|
+
// https://github.com/radix-ui/primitives/discussions/935
|
|
61
|
+
onOpenAutoFocus={(e) => {e.preventDefault()}}
|
|
62
|
+
>
|
|
63
|
+
<DrawerHandle
|
|
64
|
+
className={cn(
|
|
65
|
+
'absolute top-0 left-0 right-0 mx-auto z-10',
|
|
66
|
+
'flex justify-center items-start',
|
|
67
|
+
'border-t rounded-t-lg border-muted-2',
|
|
68
|
+
mobile ? 'h-5 touch-pan-y' : 'h-6',
|
|
69
|
+
)}
|
|
70
|
+
>
|
|
71
|
+
<div className={cn(
|
|
72
|
+
// pseudo-handle
|
|
73
|
+
'rounded-[3px] bg-level-3',
|
|
74
|
+
mobile ? 'w-[155px] mt-[5px] h-1.5' : 'w-[180px] mt-[3px] h-2.5 hover:bg-level-4',
|
|
75
|
+
!mobile ? 'cursor-grab active:cursor-grabbing' : '',
|
|
76
|
+
)} />
|
|
77
|
+
</DrawerHandle>
|
|
78
|
+
{children}
|
|
79
|
+
</DrawerContent>
|
|
80
|
+
</Drawer>
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
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,102 +1,102 @@
|
|
|
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 { Ethereum } from "@hanzo/auth/icons"
|
|
20
|
-
import { Icons } from ".."
|
|
21
|
-
|
|
22
|
-
const MobileAuthWidget: React.FC<{
|
|
23
|
-
noLogin?: boolean
|
|
24
|
-
className?: string
|
|
25
|
-
handleLogin?: () => void
|
|
26
|
-
}> = observer(({
|
|
27
|
-
noLogin = false,
|
|
28
|
-
className
|
|
29
|
-
}) => {
|
|
30
|
-
const auth = useAuth()
|
|
31
|
-
const handleLogin = () => {
|
|
32
|
-
window.location.href = "https://lux.id";
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
if (!auth) {
|
|
36
|
-
return null
|
|
37
|
-
}
|
|
38
|
-
if (!auth.loggedIn && typeof window !== 'undefined') {
|
|
39
|
-
return (noLogin ? null : (
|
|
40
|
-
(handleLogin) ? (
|
|
41
|
-
<div className="flex items-center py-3 px-5 gap-4">
|
|
42
|
-
<Icons.Avatar className='self-center w-6 h-6' />
|
|
43
|
-
<Button
|
|
44
|
-
variant='link'
|
|
45
|
-
className='text-2xl !min-w-0 self-center'
|
|
46
|
-
onClick={handleLogin}
|
|
47
|
-
>
|
|
48
|
-
Log In / Sign Up
|
|
49
|
-
</Button>
|
|
50
|
-
</div>
|
|
51
|
-
) : (
|
|
52
|
-
<LinkElement
|
|
53
|
-
def={{
|
|
54
|
-
href: `${process.env.NEXT_PUBLIC_LOGIN_SITE_URL}?redirectUrl=${window.location.href}`,
|
|
55
|
-
title: 'Login',
|
|
56
|
-
variant: 'primary',
|
|
57
|
-
newTab: false
|
|
58
|
-
} satisfies LinkDef}
|
|
59
|
-
className='h-8 w-fit !min-w-0'
|
|
60
|
-
/>
|
|
61
|
-
)
|
|
62
|
-
))
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return (
|
|
66
|
-
<Popover>
|
|
67
|
-
<PopoverTrigger asChild>
|
|
68
|
-
<Button
|
|
69
|
-
variant="outline"
|
|
70
|
-
size='icon'
|
|
71
|
-
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)}
|
|
72
|
-
>{auth.user?.email[0]}</Button>
|
|
73
|
-
</PopoverTrigger>
|
|
74
|
-
<PopoverContent className='bg-level-0'>
|
|
75
|
-
<div className="grid gap-4">
|
|
76
|
-
<div className="space-y-2 truncate">
|
|
77
|
-
{auth.user?.displayName ? (
|
|
78
|
-
<>
|
|
79
|
-
<h4 className="font-medium leading-none truncate">{auth.user.displayName}</h4>
|
|
80
|
-
<p className="text-sm opacity-50 truncate">{auth.user.email}</p>
|
|
81
|
-
</>
|
|
82
|
-
) : (
|
|
83
|
-
<h4 className="font-medium leading-none truncate">{auth.user?.email}</h4>
|
|
84
|
-
)}
|
|
85
|
-
{auth.user?.walletAddress ? (
|
|
86
|
-
<p className="text-sm opacity-50 truncate">{auth.user.walletAddress}</p>
|
|
87
|
-
) : (
|
|
88
|
-
<Button variant="outline" className='w-full flex items-center gap-2' onClick={auth.associateWallet.bind(auth)}>
|
|
89
|
-
<Ethereum height={20} />Connect your wallet
|
|
90
|
-
</Button>
|
|
91
|
-
)}
|
|
92
|
-
</div>
|
|
93
|
-
<Separator />
|
|
94
|
-
<Button variant="outline" onClick={auth.logout.bind(auth)}>Logout</Button>
|
|
95
|
-
</div>
|
|
96
|
-
</PopoverContent>
|
|
97
|
-
</Popover>
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
})
|
|
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 { Ethereum } from "@hanzo/auth/icons"
|
|
20
|
+
import { Icons } from ".."
|
|
21
|
+
|
|
22
|
+
const MobileAuthWidget: React.FC<{
|
|
23
|
+
noLogin?: boolean
|
|
24
|
+
className?: string
|
|
25
|
+
handleLogin?: () => void
|
|
26
|
+
}> = observer(({
|
|
27
|
+
noLogin = false,
|
|
28
|
+
className
|
|
29
|
+
}) => {
|
|
30
|
+
const auth = useAuth()
|
|
31
|
+
const handleLogin = () => {
|
|
32
|
+
window.location.href = "https://lux.id";
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
if (!auth) {
|
|
36
|
+
return null
|
|
37
|
+
}
|
|
38
|
+
if (!auth.loggedIn && typeof window !== 'undefined') {
|
|
39
|
+
return (noLogin ? null : (
|
|
40
|
+
(handleLogin) ? (
|
|
41
|
+
<div className="flex items-center py-3 px-5 gap-4">
|
|
42
|
+
<Icons.Avatar className='self-center w-6 h-6' />
|
|
43
|
+
<Button
|
|
44
|
+
variant='link'
|
|
45
|
+
className='text-2xl !min-w-0 self-center'
|
|
46
|
+
onClick={handleLogin}
|
|
47
|
+
>
|
|
48
|
+
Log In / Sign Up
|
|
49
|
+
</Button>
|
|
50
|
+
</div>
|
|
51
|
+
) : (
|
|
52
|
+
<LinkElement
|
|
53
|
+
def={{
|
|
54
|
+
href: `${process.env.NEXT_PUBLIC_LOGIN_SITE_URL}?redirectUrl=${window.location.href}`,
|
|
55
|
+
title: 'Login',
|
|
56
|
+
variant: 'primary',
|
|
57
|
+
newTab: false
|
|
58
|
+
} satisfies LinkDef}
|
|
59
|
+
className='h-8 w-fit !min-w-0'
|
|
60
|
+
/>
|
|
61
|
+
)
|
|
62
|
+
))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<Popover>
|
|
67
|
+
<PopoverTrigger asChild>
|
|
68
|
+
<Button
|
|
69
|
+
variant="outline"
|
|
70
|
+
size='icon'
|
|
71
|
+
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)}
|
|
72
|
+
>{auth.user?.email[0]}</Button>
|
|
73
|
+
</PopoverTrigger>
|
|
74
|
+
<PopoverContent className='bg-level-0'>
|
|
75
|
+
<div className="grid gap-4">
|
|
76
|
+
<div className="space-y-2 truncate">
|
|
77
|
+
{auth.user?.displayName ? (
|
|
78
|
+
<>
|
|
79
|
+
<h4 className="font-medium leading-none truncate">{auth.user.displayName}</h4>
|
|
80
|
+
<p className="text-sm opacity-50 truncate">{auth.user.email}</p>
|
|
81
|
+
</>
|
|
82
|
+
) : (
|
|
83
|
+
<h4 className="font-medium leading-none truncate">{auth.user?.email}</h4>
|
|
84
|
+
)}
|
|
85
|
+
{auth.user?.walletAddress ? (
|
|
86
|
+
<p className="text-sm opacity-50 truncate">{auth.user.walletAddress}</p>
|
|
87
|
+
) : (
|
|
88
|
+
<Button variant="outline" className='w-full flex items-center gap-2' onClick={auth.associateWallet.bind(auth)}>
|
|
89
|
+
<Ethereum height={20} />Connect your wallet
|
|
90
|
+
</Button>
|
|
91
|
+
)}
|
|
92
|
+
</div>
|
|
93
|
+
<Separator />
|
|
94
|
+
<Button variant="outline" onClick={auth.logout.bind(auth)}>Logout</Button>
|
|
95
|
+
</div>
|
|
96
|
+
</PopoverContent>
|
|
97
|
+
</Popover>
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
})
|
|
101
|
+
|
|
102
102
|
export default MobileAuthWidget
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
import React, { useState } from 'react'
|
|
3
|
-
|
|
4
|
-
import { Plus } from 'lucide-react'
|
|
5
|
-
|
|
6
|
-
import { Button } from '@hanzo/ui/primitives'
|
|
7
|
-
import { cn } from '@hanzo/ui/util'
|
|
8
|
-
|
|
9
|
-
const MobileMenuToggleButton: React.FC<{
|
|
10
|
-
open: boolean
|
|
11
|
-
setOpen: (b: boolean) => void
|
|
12
|
-
className?: string
|
|
13
|
-
}> = ({
|
|
14
|
-
open,
|
|
15
|
-
setOpen,
|
|
16
|
-
className=''
|
|
17
|
-
}) => {
|
|
18
|
-
|
|
19
|
-
return (
|
|
20
|
-
<Button
|
|
21
|
-
variant='ghost'
|
|
22
|
-
size='default'
|
|
23
|
-
rounded='full'
|
|
24
|
-
onClick={() => {setOpen(!open)}}
|
|
25
|
-
className={cn('p-0 aspect-square hover:bg-background sm:hover:bg-level-1 active:scale-75', className)}
|
|
26
|
-
>
|
|
27
|
-
<Plus width={28} height={28} className={
|
|
28
|
-
'block h-full will-change-transform transition-transform transition-scale transition-duration-[1500] ' +
|
|
29
|
-
(open ? 'rotate-[135deg] scale-110' : 'rotate-none')
|
|
30
|
-
} />
|
|
31
|
-
</Button>
|
|
32
|
-
)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export default MobileMenuToggleButton
|
|
1
|
+
'use client'
|
|
2
|
+
import React, { useState } from 'react'
|
|
3
|
+
|
|
4
|
+
import { Plus } from 'lucide-react'
|
|
5
|
+
|
|
6
|
+
import { Button } from '@hanzo/ui/primitives'
|
|
7
|
+
import { cn } from '@hanzo/ui/util'
|
|
8
|
+
|
|
9
|
+
const MobileMenuToggleButton: React.FC<{
|
|
10
|
+
open: boolean
|
|
11
|
+
setOpen: (b: boolean) => void
|
|
12
|
+
className?: string
|
|
13
|
+
}> = ({
|
|
14
|
+
open,
|
|
15
|
+
setOpen,
|
|
16
|
+
className=''
|
|
17
|
+
}) => {
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<Button
|
|
21
|
+
variant='ghost'
|
|
22
|
+
size='default'
|
|
23
|
+
rounded='full'
|
|
24
|
+
onClick={() => {setOpen(!open)}}
|
|
25
|
+
className={cn('p-0 aspect-square hover:bg-background sm:hover:bg-level-1 active:scale-75', className)}
|
|
26
|
+
>
|
|
27
|
+
<Plus width={28} height={28} className={
|
|
28
|
+
'block h-full will-change-transform transition-transform transition-scale transition-duration-[1500] ' +
|
|
29
|
+
(open ? 'rotate-[135deg] scale-110' : 'rotate-none')
|
|
30
|
+
} />
|
|
31
|
+
</Button>
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default MobileMenuToggleButton
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
import React, { useState } from 'react'
|
|
3
|
-
import { Plus } from 'lucide-react'
|
|
4
|
-
import { Search } from '../icons'
|
|
5
|
-
import { ChatWidget } from '../../components'
|
|
6
|
-
import { Button, Card } from '@hanzo/ui/primitives'
|
|
7
|
-
import LuxLogo from '../icons/lux-logo'
|
|
8
|
-
|
|
9
|
-
interface MobileNavMenuAIProps {
|
|
10
|
-
setMenuOpen: (open: boolean) => void
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const MobileNavMenuAI: React.FC<MobileNavMenuAIProps> = ({ setMenuOpen }) => {
|
|
14
|
-
const [isOpen, setIsOpen] = useState<boolean>(false)
|
|
15
|
-
|
|
16
|
-
return (
|
|
17
|
-
<>
|
|
18
|
-
<div className="w-full px-5 py-4 text-2xl bg-[#202020] cursor-pointer">
|
|
19
|
-
<div className="flex items-center gap-5 border-b border-[#3A3A3A]">
|
|
20
|
-
<Search className='w-6 h-6 flex-none' />
|
|
21
|
-
<div className="text-white font-bold flex-1" onClick={() => setIsOpen(true)}>Ask AI Chat...</div>
|
|
22
|
-
<Plus className='w-6 h-6 flex-none rotate-45 transition-transform' onClick={() => setMenuOpen(false)} />
|
|
23
|
-
</div>
|
|
24
|
-
</div>
|
|
25
|
-
<div className={
|
|
26
|
-
'fixed bottom-0 sm:bottom-16 right-0 w-full h-full ' +
|
|
27
|
-
'sm:max-w-[400px] sm:max-h-[550px] sm:px-4 z-floating ' +
|
|
28
|
-
(isOpen ? 'flex' : 'hidden')
|
|
29
|
-
}>
|
|
30
|
-
<Card className='flex flex-col h-full w-full'>
|
|
31
|
-
<div className='flex px-4 py-2 h-16 bg-level-0 items-center justify-between'>
|
|
32
|
-
<h3 className='font-semibold font-heading'>LUX<span className='opacity-60'>AI</span></h3>
|
|
33
|
-
<Button onClick={() => setIsOpen(false)} variant='link' size='icon' className='w-fit sm:hidden'>
|
|
34
|
-
<Plus className='w-6 h-6 flex-none mr-1 rotate-45 transition-transform'/>
|
|
35
|
-
</Button>
|
|
36
|
-
</div>
|
|
37
|
-
<iframe src="https://lux.chat/iframe" className='h-full' />
|
|
38
|
-
</Card>
|
|
39
|
-
</div>
|
|
40
|
-
|
|
41
|
-
</>
|
|
42
|
-
)
|
|
43
|
-
};
|
|
44
|
-
|
|
1
|
+
'use client'
|
|
2
|
+
import React, { useState } from 'react'
|
|
3
|
+
import { Plus } from 'lucide-react'
|
|
4
|
+
import { Search } from '../icons'
|
|
5
|
+
import { ChatWidget } from '../../components'
|
|
6
|
+
import { Button, Card } from '@hanzo/ui/primitives'
|
|
7
|
+
import LuxLogo from '../icons/lux-logo'
|
|
8
|
+
|
|
9
|
+
interface MobileNavMenuAIProps {
|
|
10
|
+
setMenuOpen: (open: boolean) => void
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const MobileNavMenuAI: React.FC<MobileNavMenuAIProps> = ({ setMenuOpen }) => {
|
|
14
|
+
const [isOpen, setIsOpen] = useState<boolean>(false)
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<>
|
|
18
|
+
<div className="w-full px-5 py-4 text-2xl bg-[#202020] cursor-pointer">
|
|
19
|
+
<div className="flex items-center gap-5 border-b border-[#3A3A3A]">
|
|
20
|
+
<Search className='w-6 h-6 flex-none' />
|
|
21
|
+
<div className="text-white font-bold flex-1" onClick={() => setIsOpen(true)}>Ask AI Chat...</div>
|
|
22
|
+
<Plus className='w-6 h-6 flex-none rotate-45 transition-transform' onClick={() => setMenuOpen(false)} />
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
<div className={
|
|
26
|
+
'fixed bottom-0 sm:bottom-16 right-0 w-full h-full ' +
|
|
27
|
+
'sm:max-w-[400px] sm:max-h-[550px] sm:px-4 z-floating ' +
|
|
28
|
+
(isOpen ? 'flex' : 'hidden')
|
|
29
|
+
}>
|
|
30
|
+
<Card className='flex flex-col h-full w-full'>
|
|
31
|
+
<div className='flex px-4 py-2 h-16 bg-level-0 items-center justify-between'>
|
|
32
|
+
<h3 className='font-semibold font-heading'>LUX<span className='opacity-60'>AI</span></h3>
|
|
33
|
+
<Button onClick={() => setIsOpen(false)} variant='link' size='icon' className='w-fit sm:hidden'>
|
|
34
|
+
<Plus className='w-6 h-6 flex-none mr-1 rotate-45 transition-transform'/>
|
|
35
|
+
</Button>
|
|
36
|
+
</div>
|
|
37
|
+
<iframe src="https://lux.chat/iframe" className='h-full' />
|
|
38
|
+
</Card>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
</>
|
|
42
|
+
)
|
|
43
|
+
};
|
|
44
|
+
|
|
45
45
|
export default MobileNavMenuAI;
|