@luxfi/core 5.2.4 → 5.2.5

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 -0
  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 -100
  34. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  35. package/components/commerce/mobile-nav-menu-ai.tsx +45 -98
  36. package/components/commerce/mobile-nav-menu-item.tsx +49 -45
  37. package/components/commerce/mobile-nav-menu.tsx +68 -80
  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 -54
  45. package/components/header/index.tsx +52 -40
  46. package/components/header/mobile.tsx +166 -165
  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 -0
  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 -292
  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,101 +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 { 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 { 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
+
101
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,98 +1,45 @@
1
- 'use client'
2
- import React, { useState } from 'react'
3
- import type { LinkDefExtended } from '../../site-def/main-nav'
4
- import { LeftArrow, RightArrow, Search } from '../icons'
5
- import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut } from '@hanzo/ui/primitives'
6
- import { Calculator, Calendar, CreditCard, Settings, Smile, User } from 'lucide-react'
7
- import { ChatWidget } from '@luxfi/core'
8
- import Link from 'next/link'
9
-
10
- interface MobileNavMenuAIProps {
11
- link: LinkDefExtended,
12
- setChatbotOpen: (open: boolean) => void
13
- }
14
-
15
- const MobileNavMenuAI: React.FC<MobileNavMenuAIProps> = ({
16
- link,
17
- setChatbotOpen
18
- }) => {
19
- const [isOpen, setIsOpen] = useState<boolean>(false)
20
-
21
- React.useEffect(() => {
22
- console.log('open', setChatbotOpen)
23
- }, [setChatbotOpen]);
24
-
25
- return (
26
- <>
27
- <Link href="https://lux.chat">
28
- <div className="w-full px-5 py-4 text-2xl bg-[#202020] cursor-pointer" onClick={() => {
29
- console.log('test1', setChatbotOpen)
30
- if (setChatbotOpen) {
31
- setChatbotOpen(true)
32
- console.log('test2')
33
- }
34
- }}>
35
- <div className="flex items-center gap-5 border-b border-[#3A3A3A]">
36
- <Search className='w-6 h-6 flex-none' />
37
- <div className="text-white font-bold flex-1 ">Ask AI Chat...</div>
38
- <RightArrow className='w-6 h-6 flex-none' />
39
- </div>
40
- </div>
41
- </Link>
42
- <div className={`fixed left-0 top-0 w-screen h-[calc(100vh-64px)] ${isOpen ? 'block' : 'hidden'}`} style={{ backgroundColor: 'black' }}>
43
- <div className="h-fit bg-[#202020]">
44
- <Command className='rounded-lg border shadow-md text-[#A7A7A8]'>
45
- <div className="w-full px-5 py-4 text-2xl cursor-pointer">
46
- <div className="flex items-center gap-5 border-b border-[#3A3A3A]">
47
- <LeftArrow className='w-6 h-6' onClick={() => setIsOpen(false)} />
48
- {/* <Search className='w-6 h-6 flex-none' />
49
- <div className="text-white font-bold flex-1 ">Ask AI Chat...</div> */}
50
- <CommandInput className="text-white font-bold flex-1 text-xl" placeholder='Ask AI Chat...' />
51
- <RightArrow className='w-6 h-6 flex-none' />
52
- </div>
53
- </div>
54
- <CommandList className='max-h-none h-fit'>
55
- <CommandEmpty>No result found.</CommandEmpty>
56
- <CommandGroup heading="Suggestions">
57
- <CommandItem>
58
- <Calendar className='mr-2 h-4 w-4' />
59
- <span>Calendar</span>
60
- </CommandItem>
61
- <CommandItem>
62
- <Smile className='mr-2 h-4 w-4' />
63
- <span>Search Emoji</span>
64
- </CommandItem>
65
- <CommandItem>
66
- <Calculator className="mr-2 h-4 w-4" />
67
- <span>Calculator</span>
68
- </CommandItem>
69
- </CommandGroup>
70
- <CommandSeparator>
71
- </CommandSeparator>
72
- <CommandGroup heading='Settings'>
73
- <CommandItem>
74
- <User className='mr-2 h-4 w-4' />
75
- <span>Profile</span>
76
- <CommandShortcut>⌘P</CommandShortcut>
77
- </CommandItem>
78
- <CommandItem>
79
- <CreditCard className="mr-2 h-4 w-4" />
80
- <span>Billing</span>
81
- <CommandShortcut>⌘B</CommandShortcut>
82
- </CommandItem>
83
- <CommandItem>
84
- <Settings className="mr-2 h-4 w-4" />
85
- <span>Settings</span>
86
- <CommandShortcut>⌘S</CommandShortcut>
87
- </CommandItem>
88
- </CommandGroup>
89
- </CommandList>
90
- </Command>
91
-
92
- </div>
93
- </div>
94
- </>
95
- )
96
- }
97
-
98
- export default MobileNavMenuAI
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
+ export default MobileNavMenuAI;
@@ -1,46 +1,50 @@
1
- import React, { useState } from 'react'
2
- import type { LinkDefExtended } from '../../site-def/main-nav'
3
- import { RightArrow } from '../icons'
4
- import LeftArrow from '../icons/left-arrow'
5
- import Link from 'next/link'
6
-
7
- interface MobileNavMenuItemProps {
8
- link: LinkDefExtended
9
- }
10
-
11
- const MobileNavMenuItem: React.FC<MobileNavMenuItemProps> = ({
12
- link
13
- }) => {
14
- const [isOpen, setIsOpen] = useState<boolean>(false);
15
-
16
- return (
17
- <>
18
- <div className="w-full flex items-center px-5 py-3 gap-[27px] text-2xl cursor-pointer" onClick={() => setIsOpen(true)}>
19
- <span className='block w-[18px] h-[22px] items-center'>{link.icon}</span>
20
- <span className='flex-1'>{link.title}</span>
21
- <RightArrow className='' />
22
- </div>
23
- <div className={`fixed left-0 top-0 w-screen h-screen ${isOpen ? 'block' : 'hidden'}`} style={{ backgroundColor: 'black' }}>
24
- <div className="w-full flex items-center px-5 py-3 gap-[27px] text-2xl font-bold" onClick={() => setIsOpen(false)}>
25
- <LeftArrow />
26
- <span className="text-white">{link.title}</span>
27
- </div>
28
- <div className="flex flex-col">
29
- {link.childMenu?.map((menu, index) => {
30
- return (
31
- <div className="w-full flex items-center px-5 py-3 gap-[27px] text-2xl" key={index}>
32
- <span className='block w-[18px] h-[22px] self-center'>{menu.icon}</span>
33
- <span className='flex-1'>{menu.title}</span>
34
- <Link href={menu.href}>
35
- <RightArrow className='' />
36
- </Link>
37
- </div>
38
- )
39
- })}
40
- </div>
41
- </div>
42
- </>
43
- )
44
- }
45
-
1
+ import React, { useState } from 'react'
2
+ import type { LinkDefExtended } from '../../site-def/main-nav'
3
+ import { RightArrow } from '../icons'
4
+ import LeftArrow from '../icons/left-arrow'
5
+ import Link from 'next/link'
6
+ import MobileNavMenuAI from './mobile-nav-menu-ai'
7
+
8
+ interface MobileNavMenuItemProps {
9
+ link: LinkDefExtended,
10
+ setMenuOpen: (open: boolean) => void
11
+
12
+ }
13
+
14
+ const MobileNavMenuItem: React.FC<MobileNavMenuItemProps> = ({
15
+ link,
16
+ setMenuOpen
17
+ }) => {
18
+ const [isOpen, setIsOpen] = useState<boolean>(false);
19
+
20
+ return (
21
+ <>
22
+ <div className="w-full flex items-center px-5 py-3 gap-[27px] text-2xl cursor-pointer" onClick={() => setIsOpen(true)}>
23
+ <span className='block w-[18px] h-[22px] items-center'>{link.icon}</span>
24
+ <span className='flex-1'>{link.title}</span>
25
+ <RightArrow className='' />
26
+ </div>
27
+ <div className={`fixed left-0 top-0 w-screen h-screen ${isOpen ? 'block' : 'hidden'}`} style={{ backgroundColor: 'black' }}>
28
+ <MobileNavMenuAI setMenuOpen={setMenuOpen} />
29
+ <div className="w-full flex items-center px-5 py-3 gap-[27px] text-2xl font-bold" onClick={() => setIsOpen(false)}>
30
+ <LeftArrow />
31
+ <span className="text-white">{link.title}</span>
32
+ </div>
33
+ <div className="flex flex-col">
34
+ {link.childMenu?.map((menu, index) => {
35
+ return (
36
+ <Link href={menu.href}>
37
+ <div className="w-full flex items-center px-5 py-3 gap-[27px] text-2xl" key={index}>
38
+ <span className='w-[18px] h-[22px] self-center flex items-center justify-center'>{menu.icon}</span>
39
+ <span className='flex-1'>{menu.title}</span>
40
+ </div>
41
+ </Link>
42
+ )
43
+ })}
44
+ </div>
45
+ </div>
46
+ </>
47
+ )
48
+ }
49
+
46
50
  export default MobileNavMenuItem