@luxfi/core 5.2.5 → 5.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. package/commerce/ui/conf.ts +13 -13
  2. package/commerce/ui/context.tsx +102 -102
  3. package/commerce/ui/store.ts +276 -276
  4. package/components/access-code-input.tsx +71 -71
  5. package/components/auth/auth-listener.tsx +29 -29
  6. package/components/auth/auth-token/clear-auth-token.tsx +12 -12
  7. package/components/auth/auth-token/set-auth-token.tsx +16 -16
  8. package/components/auth/common-auth-domains.ts +16 -16
  9. package/components/auth/login-panel.tsx +107 -107
  10. package/components/chat-widget.tsx +85 -85
  11. package/components/commerce/add-widget.tsx +20 -20
  12. package/components/commerce/bag-button.tsx +98 -98
  13. package/components/commerce/buy-button.tsx +34 -34
  14. package/components/commerce/checkout-button.tsx +129 -129
  15. package/components/commerce/checkout-panel/close-button.tsx +26 -26
  16. package/components/commerce/checkout-panel/dt-bag-carousel.tsx +36 -36
  17. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +66 -66
  18. package/components/commerce/checkout-panel/index.tsx +129 -129
  19. package/components/commerce/checkout-panel/links-row.tsx +21 -21
  20. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +54 -54
  21. package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
  22. package/components/commerce/checkout-panel/thank-you.tsx +18 -18
  23. package/components/commerce/checkout-widget/const.ts +13 -13
  24. package/components/commerce/checkout-widget/index.tsx +192 -192
  25. package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
  26. package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -58
  27. package/components/commerce/desktop-bag-popup.tsx +78 -78
  28. package/components/commerce/desktop-nav-menu.tsx +235 -235
  29. package/components/commerce/drawer/index.tsx +116 -116
  30. package/components/commerce/drawer/micro.tsx +144 -144
  31. package/components/commerce/drawer/shell.tsx +83 -83
  32. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  33. package/components/commerce/mobile-login-button.tsx +101 -101
  34. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  35. package/components/commerce/mobile-nav-menu-ai.tsx +44 -44
  36. package/components/commerce/mobile-nav-menu-item.tsx +49 -49
  37. package/components/commerce/mobile-nav-menu.tsx +68 -68
  38. package/components/contact-dialog/contact-form.tsx +113 -113
  39. package/components/contact-dialog/disclaimer.tsx +13 -13
  40. package/components/contact-dialog/index.tsx +64 -64
  41. package/components/copyright.tsx +21 -21
  42. package/components/drawer-margin.tsx +25 -25
  43. package/components/footer.tsx +77 -77
  44. package/components/header/desktop.tsx +57 -57
  45. package/components/header/index.tsx +52 -52
  46. package/components/header/mobile.tsx +166 -166
  47. package/components/header/theme-toggle.tsx +26 -26
  48. package/components/icons/avatar.tsx +11 -11
  49. package/components/icons/bag-icon.tsx +10 -10
  50. package/components/icons/github.tsx +14 -14
  51. package/components/icons/index.tsx +43 -43
  52. package/components/icons/left-arrow.tsx +11 -11
  53. package/components/icons/lux-logo.tsx +10 -10
  54. package/components/icons/right-arrow.tsx +10 -10
  55. package/components/icons/search.tsx +12 -12
  56. package/components/icons/secure-delivery.tsx +13 -13
  57. package/components/icons/social-icon.tsx +35 -35
  58. package/components/icons/social-svg.css +3 -3
  59. package/components/icons/warpcast.tsx +58 -58
  60. package/components/icons/youtube-logo.tsx +59 -59
  61. package/components/index.ts +25 -25
  62. package/components/logo.tsx +81 -81
  63. package/components/main.tsx +27 -27
  64. package/components/mini-chart/index.tsx +7 -7
  65. package/components/mini-chart/mini-chart-props.ts +43 -43
  66. package/components/mini-chart/mini-chart.tsx +85 -85
  67. package/components/mini-chart/wrapper.tsx +23 -23
  68. package/components/not-found/index.tsx +28 -28
  69. package/components/not-found/not-found-content.mdx +5 -5
  70. package/components/scripts.tsx +24 -24
  71. package/environment.d.ts +5 -5
  72. package/next/analytics/fpixel.ts +15 -15
  73. package/next/analytics/google-analytics.ts +13 -13
  74. package/next/analytics/index.ts +3 -3
  75. package/next/analytics/pixel-analytics.tsx +54 -54
  76. package/next/font/get-app-router-font-classes.ts +12 -12
  77. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  78. package/next/font/next-font-desc.ts +27 -27
  79. package/next/font/pages-router-font-vars.tsx +18 -18
  80. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  81. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  82. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  83. package/next/head-metadata/index.tsx +208 -208
  84. package/next/middleware/determine-device-mw.ts +16 -16
  85. package/package.json +78 -78
  86. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  87. package/root-layout/index.tsx +112 -112
  88. package/server-actions/firebase-app.ts +14 -14
  89. package/server-actions/index.ts +5 -5
  90. package/server-actions/store-contact.ts +51 -51
  91. package/site-def/footer/community.tsx +67 -67
  92. package/site-def/footer/company.ts +37 -37
  93. package/site-def/footer/ecosystem.ts +37 -37
  94. package/site-def/footer/index.tsx +26 -26
  95. package/site-def/footer/legal.ts +28 -28
  96. package/site-def/footer/network.ts +45 -45
  97. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  98. package/site-def/index.ts +2 -2
  99. package/site-def/main-nav.tsx +338 -338
  100. package/style/cart-animation.css +29 -29
  101. package/style/checkout-animation.css +23 -23
  102. package/style/drawer-handle-overrides.css +160 -160
  103. package/style/lux-colors.css +85 -85
  104. package/style/lux-global.css +30 -30
  105. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  106. package/tailwind/index.ts +2 -2
  107. package/tailwind/lux-tw-fonts.ts +39 -39
  108. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  109. package/tsconfig.json +15 -15
  110. package/types/chatbot-config.ts +6 -6
  111. package/types/chatbot-suggested-question.ts +7 -7
  112. package/types/contact-info.ts +10 -10
  113. package/types/index.ts +4 -4
  114. 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;