@luxfi/core 5.2.4 → 5.2.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,235 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+
5
+ import Link from "next/link"
6
+ import { cn } from '@hanzo/ui/util'
7
+ import type { LinkDef } from '@hanzo/ui/types'
8
+ import type { LinkDefExtended } from "../../site-def/main-nav"
9
+ import {
10
+ NavigationMenu,
11
+ NavigationMenuContent,
12
+ NavigationMenuItem,
13
+ NavigationMenuLink,
14
+ NavigationMenuList,
15
+ NavigationMenuTrigger,
16
+ navigationMenuTriggerStyle
17
+ } from '@hanzo/ui/primitives'
18
+ import Warpcast from "../icons/warpcast"
19
+
20
+ // const components: { title: string; href: string; description: string }[] = [
21
+ // {
22
+ // title: "Alert Dialog",
23
+ // href: "/docs/primitives/alert-dialog",
24
+ // description:
25
+ // "A modal dialog that interrupts the user with important content and expects a response.",
26
+ // },
27
+ // {
28
+ // title: "Hover Card",
29
+ // href: "/docs/primitives/hover-card",
30
+ // description:
31
+ // "For sighted users to preview content available behind a link.",
32
+ // },
33
+ // {
34
+ // title: "Progress",
35
+ // href: "/docs/primitives/progress",
36
+ // description:
37
+ // "Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.",
38
+ // },
39
+ // {
40
+ // title: "Scroll-area",
41
+ // href: "/docs/primitives/scroll-area",
42
+ // description: "Visually or semantically separates content.",
43
+ // },
44
+ // {
45
+ // title: "Tabs",
46
+ // href: "/docs/primitives/tabs",
47
+ // description:
48
+ // "A set of layered sections of content—known as tab panels—that are displayed one at a time.",
49
+ // },
50
+ // {
51
+ // title: "Tooltip",
52
+ // href: "/docs/primitives/tooltip",
53
+ // description:
54
+ // "A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.",
55
+ // },
56
+ // ]
57
+
58
+ // export function NavigationMenuDemo() {
59
+ // return (
60
+ // <NavigationMenu>
61
+ // <NavigationMenuList>
62
+ // <NavigationMenuItem>
63
+ // <NavigationMenuTrigger>Getting started</NavigationMenuTrigger>
64
+ // <NavigationMenuContent>
65
+ // <ul className="grid gap-3 p-6 md:w-[400px] lg:w-[500px] lg:grid-cols-[.75fr_1fr]">
66
+ // <li className="row-span-3">
67
+ // <NavigationMenuLink asChild>
68
+ // <a
69
+ // className="flex h-full w-full select-none flex-col justify-end rounded-md bg-gradient-to-b from-muted/50 to-muted p-6 no-underline outline-none focus:shadow-md"
70
+ // href="/"
71
+ // >
72
+ // {/* <Icons.logo className="h-6 w-6" /> */}
73
+ // <div className="mb-2 mt-4 text-lg font-medium">
74
+ // shadcn/ui
75
+ // </div>
76
+ // <p className="text-sm leading-tight text-muted-foreground">
77
+ // Beautifully designed components that you can copy and
78
+ // paste into your apps. Accessible. Customizable. Open
79
+ // Source.
80
+ // </p>
81
+ // </a>
82
+ // </NavigationMenuLink>
83
+ // </li>
84
+ // <ListItem href="/docs" title="Introduction">
85
+ // Re-usable components built using Radix UI and Tailwind CSS.
86
+ // </ListItem>
87
+ // <ListItem href="/docs/installation" title="Installation">
88
+ // How to install dependencies and structure your app.
89
+ // </ListItem>
90
+ // <ListItem href="/docs/primitives/typography" title="Typography">
91
+ // Styles for headings, paragraphs, lists...etc
92
+ // </ListItem>
93
+ // </ul>
94
+ // </NavigationMenuContent>
95
+ // </NavigationMenuItem>
96
+ // <NavigationMenuItem>
97
+ // <NavigationMenuTrigger>Components</NavigationMenuTrigger>
98
+ // <NavigationMenuContent>
99
+ // <ul className="w-[400px] gap-3 p-4 md:w-[500px] md:grid-cols-1 lg:w-[600px] ">
100
+ // {components.map((component) => (
101
+ // <ListItem
102
+ // key={component.title}
103
+ // title={component.title}
104
+ // href={component.href}
105
+ // >
106
+ // {component.description}
107
+ // </ListItem>
108
+ // ))}
109
+ // </ul>
110
+ // </NavigationMenuContent>
111
+ // </NavigationMenuItem>
112
+ // <NavigationMenuItem>
113
+ // <Link href="/docs" legacyBehavior passHref>
114
+ // <NavigationMenuLink className={navigationMenuTriggerStyle()}>
115
+ // Documentation
116
+ // </NavigationMenuLink>
117
+ // </Link>
118
+ // </NavigationMenuItem>
119
+ // </NavigationMenuList>
120
+ // </NavigationMenu>
121
+ // )
122
+ // }
123
+
124
+
125
+ const DesktopNav: React.FC<{
126
+ links: LinkDefExtended[],
127
+ }> = ({
128
+ links
129
+
130
+ }) => (
131
+ links.length > 0 ? (
132
+ <NavigationMenu>
133
+ <NavigationMenuList>
134
+ {links.map((el, index) => {
135
+
136
+ if (el.isAIMenu) {
137
+ return (
138
+ <NavigationMenuItem>
139
+ <Link href={el.href} legacyBehavior passHref>
140
+ <NavigationMenuLink className={navigationMenuTriggerStyle()}>
141
+ {el.title}
142
+ </NavigationMenuLink>
143
+ </Link>
144
+ </NavigationMenuItem>
145
+ )
146
+ } else if (el.title == 'Community') {
147
+ return (
148
+ <NavigationMenuItem>
149
+ <NavigationMenuTrigger>{el.title}</NavigationMenuTrigger>
150
+ <NavigationMenuContent>
151
+ <ul className="grid md:grid-cols-2 gap-3 p-6 md:w-[400px] lg:w-[500px]">
152
+ <li className="row-span-3">
153
+ <NavigationMenuLink asChild>
154
+ <a
155
+ className="flex h-full w-full select-none flex-col justify-end rounded-md bg-gradient-to-b from-muted/50 to-muted p-6 no-underline outline-none focus:shadow-md"
156
+ href={el.href}
157
+ >
158
+ <Warpcast />
159
+ <div className="mb-2 mt-4 text-lg font-medium">
160
+ {el.title}
161
+ </div>
162
+ <p className="text-sm leading-tight text-muted-foreground">
163
+ {el.details}
164
+ </p>
165
+ </a>
166
+ </NavigationMenuLink>
167
+ </li>
168
+ {el.childMenu?.map((component) => (
169
+ <div className="relative flex items-center my-2">
170
+ <div className="mr-2 mt-0">
171
+ {component.icon}
172
+ </div>
173
+ <ListItem href={component.href} title={component.title}>
174
+ {component.contents}
175
+ </ListItem>
176
+ </div>
177
+ ))}
178
+
179
+ </ul>
180
+ </NavigationMenuContent>
181
+ </NavigationMenuItem>
182
+ )
183
+ } else {
184
+ return (
185
+ <NavigationMenuItem>
186
+ <NavigationMenuTrigger>{el.title}</NavigationMenuTrigger>
187
+ <NavigationMenuContent>
188
+ <ul className="grid w-[400px] gap-3 p-4 md:w-[500px] md:grid-cols-2 lg:w-[500px] ">
189
+ {el.childMenu?.map((component) => (
190
+ <ListItem
191
+ key={component.title}
192
+ title={component.title}
193
+ href={component.href}
194
+ >
195
+ {component.contents}
196
+ </ListItem>
197
+ ))}
198
+ </ul>
199
+ </NavigationMenuContent>
200
+ </NavigationMenuItem>
201
+ )
202
+ }
203
+
204
+ })}
205
+ </NavigationMenuList>
206
+ </NavigationMenu>
207
+ ) : null
208
+ )
209
+ export default DesktopNav
210
+
211
+ const ListItem = React.forwardRef<
212
+ React.ElementRef<"a">,
213
+ React.ComponentPropsWithoutRef<"a">
214
+ >(({ className, title, children, ...props }, ref) => {
215
+ return (
216
+ <li>
217
+ <NavigationMenuLink asChild>
218
+ <a
219
+ ref={ref}
220
+ className={cn(
221
+ "block select-none space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors hover:bg-level-1 hover:text-accent-foreground focus:bg-level-1 focus:text-accent-foreground",
222
+ className
223
+ )}
224
+ {...props}
225
+ >
226
+ <div className="text-sm font-medium leading-none">{title}</div>
227
+ <p className="line-clamp-3 text-sm leading-snug text-muted-foreground">
228
+ {children}
229
+ </p>
230
+ </a>
231
+ </NavigationMenuLink>
232
+ </li>
233
+ )
234
+ })
235
+ ListItem.displayName = "ListItem"
@@ -16,7 +16,6 @@ import { cn } from '@hanzo/ui/util'
16
16
 
17
17
  import { useAuth } from "@hanzo/auth/service"
18
18
 
19
- import { Avatar } from "../icons"
20
19
  import { Ethereum } from "@hanzo/auth/icons"
21
20
  import { Icons } from ".."
22
21
 
@@ -26,10 +25,12 @@ const MobileAuthWidget: React.FC<{
26
25
  handleLogin?: () => void
27
26
  }> = observer(({
28
27
  noLogin = false,
29
- handleLogin,
30
28
  className
31
29
  }) => {
32
30
  const auth = useAuth()
31
+ const handleLogin = () => {
32
+ window.location.href = "https://lux.id";
33
+ };
33
34
 
34
35
  if (!auth) {
35
36
  return null
@@ -1,98 +1,45 @@
1
1
  'use client'
2
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'
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'
9
8
 
10
9
  interface MobileNavMenuAIProps {
11
- link: LinkDefExtended,
12
- setChatbotOpen: (open: boolean) => void
10
+ setMenuOpen: (open: boolean) => void
13
11
  }
14
12
 
15
- const MobileNavMenuAI: React.FC<MobileNavMenuAIProps> = ({
16
- link,
17
- setChatbotOpen
18
- }) => {
13
+ const MobileNavMenuAI: React.FC<MobileNavMenuAIProps> = ({ setMenuOpen }) => {
19
14
  const [isOpen, setIsOpen] = useState<boolean>(false)
20
15
 
21
- React.useEffect(() => {
22
- console.log('open', setChatbotOpen)
23
- }, [setChatbotOpen]);
24
-
25
16
  return (
26
17
  <>
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
-
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)} />
92
23
  </div>
93
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
+
94
41
  </>
95
42
  )
96
- }
43
+ };
97
44
 
98
- export default MobileNavMenuAI
45
+ export default MobileNavMenuAI;
@@ -3,13 +3,17 @@ import type { LinkDefExtended } from '../../site-def/main-nav'
3
3
  import { RightArrow } from '../icons'
4
4
  import LeftArrow from '../icons/left-arrow'
5
5
  import Link from 'next/link'
6
+ import MobileNavMenuAI from './mobile-nav-menu-ai'
6
7
 
7
8
  interface MobileNavMenuItemProps {
8
- link: LinkDefExtended
9
+ link: LinkDefExtended,
10
+ setMenuOpen: (open: boolean) => void
11
+
9
12
  }
10
13
 
11
14
  const MobileNavMenuItem: React.FC<MobileNavMenuItemProps> = ({
12
- link
15
+ link,
16
+ setMenuOpen
13
17
  }) => {
14
18
  const [isOpen, setIsOpen] = useState<boolean>(false);
15
19
 
@@ -21,6 +25,7 @@ const MobileNavMenuItem: React.FC<MobileNavMenuItemProps> = ({
21
25
  <RightArrow className='' />
22
26
  </div>
23
27
  <div className={`fixed left-0 top-0 w-screen h-screen ${isOpen ? 'block' : 'hidden'}`} style={{ backgroundColor: 'black' }}>
28
+ <MobileNavMenuAI setMenuOpen={setMenuOpen} />
24
29
  <div className="w-full flex items-center px-5 py-3 gap-[27px] text-2xl font-bold" onClick={() => setIsOpen(false)}>
25
30
  <LeftArrow />
26
31
  <span className="text-white">{link.title}</span>
@@ -28,13 +33,12 @@ const MobileNavMenuItem: React.FC<MobileNavMenuItemProps> = ({
28
33
  <div className="flex flex-col">
29
34
  {link.childMenu?.map((menu, index) => {
30
35
  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>
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>
38
42
  )
39
43
  })}
40
44
  </div>
@@ -2,7 +2,6 @@
2
2
  import React from 'react'
3
3
 
4
4
  import type { LinkDef } from '@hanzo/ui/types'
5
- import { LinkElement } from '@hanzo/ui/primitives'
6
5
  import { cn } from '@hanzo/ui/util'
7
6
  import type { LinkDefExtended } from '../../site-def/main-nav'
8
7
  import MobileNavMenuAI from './mobile-nav-menu-ai'
@@ -13,68 +12,57 @@ const MobileNav: React.FC<{
13
12
  currentAs: string | undefined
14
13
  links: LinkDefExtended[]
15
14
  className?: string
16
- commonItemClx?: string | ((def: LinkDef) => string),
17
- setChatbotOpen: (open: boolean) => void,
15
+ commonItemClx?: string | ((def: LinkDef) => string)
16
+ setChatbotOpen: (open: boolean) => void
17
+ setMenuOpen: (open: boolean) => void
18
18
  /**
19
19
  * This is called *in addition* to the link's actual navigation
20
20
  * action. eg, I link is clicked, and the modal menu is closes
21
21
  */
22
- onAction?: () => void
23
- // TODO :aa shouldn't be so aware of parent context!
22
+ // TODO :aa shouldn't be so aware of parent context!
24
23
  setMenuState: (arg: 'closed' | 'nav' | 'login' | 'bag') => void
25
24
  }> = ({
26
25
  currentAs,
27
26
  links,
28
- onAction,
29
27
  setMenuState,
30
28
  className = '',
31
29
  commonItemClx,
32
30
  setChatbotOpen,
31
+ setMenuOpen
33
32
  }) => (
34
- links.length > 0 ? (
33
+ links.length > 0 ? (
35
34
 
36
- <div className={cn('flex flex-col h-full', className)} >
37
- <div className="flex flex-col flex-1">
38
- {links.map((el, index) => {
39
- const variant = el.variant ?? 'link'
40
- let internalClx = ''
41
- // note that linkFG (or any other variant of 'link')
42
- // will not get assigned these classes,
43
- // and will remain styles is 'foreground' (hence the name)
44
- if (variant === 'link') {
45
- internalClx += ' text-muted hover:text-foreground active:text-accent rounded-none'
35
+ <div className={cn('flex flex-col h-full', className)} >
36
+ <MobileNavMenuAI setMenuOpen={setMenuOpen} />
37
+ <div className="flex flex-col flex-1">
38
+ {links.map((el, index) => {
39
+ const variant = el.variant ?? 'link'
40
+ let internalClx = ''
41
+ // note that linkFG (or any other variant of 'link')
42
+ // will not get assigned these classes,
43
+ // and will remain styles is 'foreground' (hence the name)
44
+ if (variant === 'link') {
45
+ internalClx += ' text-muted hover:text-foreground active:text-accent rounded-none'
46
+ if (currentAs && currentAs === el.href) {
47
+ internalClx += ' text-accent '
48
+ }
49
+ }
50
+ else {
51
+ internalClx += ' min-w-0'
52
+ }
46
53
  if (currentAs && currentAs === el.href) {
47
- internalClx += ' text-accent '
54
+ internalClx += ' pointer-events-none'
48
55
  }
49
- }
50
- else {
51
- internalClx += ' min-w-0'
52
- }
53
- if (currentAs && currentAs === el.href) {
54
- internalClx += ' pointer-events-none'
55
- }
56
- const itemClx = (commonItemClx) ? (typeof commonItemClx === 'string' ? commonItemClx : commonItemClx(el)) : ''
56
+ const itemClx = (commonItemClx) ? (typeof commonItemClx === 'string' ? commonItemClx : commonItemClx(el)) : ''
57
57
 
58
- // return (
59
- // <LinkElement
60
- // def={el}
61
- // key={`common-${index}`}
62
- // size='lg'
63
- // className={cn(internalClx, itemClx)}
64
- // onClick={onAction}
65
- // />
66
- // )
67
- if (el.isAIMenu) {
68
- return <MobileNavMenuAI link={el} setChatbotOpen={setChatbotOpen} />
69
- }
70
- else {
71
- return <MobileNavMenuItem link={el} />
72
- }
73
- })}
58
+ if (!el.isAIMenu) {
59
+ return <MobileNavMenuItem link={el} setMenuOpen={setMenuOpen}/>
60
+ }
61
+ })}
62
+ </div>
63
+ <MobileAuthWidget className=' text-2xl' handleLogin={() => { setMenuState('login') }} />
74
64
  </div>
75
- <MobileAuthWidget className=' text-2xl' handleLogin={() => { setMenuState('login') }} />
76
- </div>
77
- ) : null
78
- )
65
+ ) : null
66
+ )
79
67
 
80
68
  export default MobileNav
@@ -8,6 +8,7 @@ import { Logo } from '..'
8
8
 
9
9
  import DesktopBagPopup from '../commerce/desktop-bag-popup'
10
10
  import BagButton from '../commerce/bag-button'
11
+ import DesktopNav from '../commerce/desktop-nav-menu'
11
12
 
12
13
 
13
14
  import type { LinkDef } from '@hanzo/ui/types'
@@ -35,13 +36,15 @@ const DesktopHeader: React.FC<{
35
36
  <Logo size='sm' href='/' className='hidden md:flex lg:hidden' key='one' layout='text-only'/>
36
37
  {/* md or larger */}
37
38
  <div className='flex gap-4 items-center'>
38
- <NavItems
39
+ {/* <NavItems
39
40
  currentAs={currentAs}
40
41
  items={links}
41
42
  className='flex md:gap-4 lg:justify-between lg:gap-7'
42
43
  itemClx='font-nav h-8'
43
44
  key='three'
44
- />
45
+ /> */}
46
+
47
+ <DesktopNav links = {links}/>
45
48
  <DesktopBagPopup popupClx='w-[340px]' trigger={<BagButton className='text-primary -mr-[3px] lg:min-w-0' />} />
46
49
  <AuthWidget/>
47
50
  </div>
@@ -17,24 +17,36 @@ const Header: React.FC<{
17
17
  }) => {
18
18
 
19
19
  // TODO
20
- const [open, setOpen] = React.useState<boolean>(false);
20
+ const [open, setOpen] = React.useState<boolean>(false);
21
21
 
22
- const { nav: { common, featured }, currentAs } = siteDef
23
- const links = (featured) ? [...common, ...featured] : common
22
+ const { nav: { common, featured }, currentAs } = siteDef
23
+ const links = (featured) ? [...common, ...featured] : common
24
+ const isDesktopView = (): boolean => {
25
+ if (typeof window === 'undefined') return false
26
+ return window.innerWidth > 768
27
+ }
24
28
 
25
- return (<>
26
- <DesktopHeader
27
- className={cn(className, 'hidden md:flex')}
28
- links={links}
29
- currentAs={currentAs}
30
- />
31
- <MobileHeader
32
- className={cn(className, 'md:hidden')}
33
- links={links}
34
- currentAs={currentAs}
35
- setChatbotOpen={setOpen}
36
- />
37
- </>)
38
- }
29
+ return (<>
30
+ <DesktopHeader
31
+ className={cn(className, 'hidden md:flex')}
32
+ links={links}
33
+ currentAs={currentAs}
34
+ />
35
+ <MobileHeader
36
+ className={cn(className, 'md:hidden')}
37
+ links={links}
38
+ currentAs={currentAs}
39
+ setChatbotOpen={setOpen}
40
+ />
41
+ {isDesktopView() && (
42
+ <ChatWidget
43
+ title='LUX'
44
+ subtitle='AI'
45
+ chatbotUrl='https://lux.chat/iframe'
46
+ suggestedQuestions={siteDef.chatbot?.suggestedQuestions ?? []}
47
+ />
48
+ )}
49
+ </>)
50
+ }
39
51
 
40
52
  export default Header
@@ -154,6 +154,7 @@ const MobileHeader: React.FC<{
154
154
  commonItemClx='px-0 text-xl h-16 justify-start '
155
155
  setMenuState={setMenuState}
156
156
  setChatbotOpen={setChatbotOpen}
157
+ setMenuOpen={setMenuOpen}
157
158
  />
158
159
  )
159
160
  )}
@@ -25,7 +25,7 @@ const SocialIcon: React.FC<SocialIconProps> = ({
25
25
  className={cn('color-inherit', className)}
26
26
  bgColor='transparent'
27
27
  fgColor='currentColor'
28
- style={{height: size, width: size}}
28
+ style={{height: size, width: size, flex: 'none' }}
29
29
  />
30
30
  )
31
31