@luxfi/core 5.1.2 → 5.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. package/commerce/AUTO-GEN-bullion-by-family.json +33 -33
  2. package/commerce/EDIT-ME-bullion-market-prices.ts +11 -11
  3. package/commerce/assign-prices.ts +49 -49
  4. package/commerce/assign-videos-by-family-group.ts +14 -14
  5. package/commerce/bullion-price-1oz.ts +5 -5
  6. package/commerce/index.ts +18 -18
  7. package/commerce/lux-service-options.ts +6 -6
  8. package/components/access-code-input.tsx +71 -71
  9. package/components/auth/auth-listener.tsx +29 -29
  10. package/components/auth/auth-token/clear-auth-token.tsx +12 -12
  11. package/components/auth/auth-token/set-auth-token.tsx +16 -16
  12. package/components/auth/common-auth-domains.ts +16 -16
  13. package/components/auth/login-panel.tsx +104 -104
  14. package/components/chat-widget.tsx +80 -80
  15. package/components/commerce/bag-button.tsx +98 -98
  16. package/components/commerce/buy-drawer/drawer.tsx +44 -44
  17. package/components/commerce/buy-drawer/index.tsx +46 -46
  18. package/components/commerce/checkout-button.tsx +116 -116
  19. package/components/commerce/checkout-panel/close-button.tsx +26 -26
  20. package/components/commerce/checkout-panel/dt-bag-carousel.tsx +36 -36
  21. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +66 -66
  22. package/components/commerce/checkout-panel/index.tsx +123 -123
  23. package/components/commerce/checkout-panel/links-row.tsx +21 -21
  24. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +54 -54
  25. package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
  26. package/components/commerce/checkout-panel/thank-you.tsx +18 -18
  27. package/components/commerce/checkout-widget/const.ts +13 -13
  28. package/components/commerce/checkout-widget/index.tsx +86 -86
  29. package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
  30. package/components/commerce/checkout-widget/use-anim-clx-set.ts +56 -56
  31. package/components/commerce/checkout-widget/use-lagging-item-ref.ts +29 -29
  32. package/components/commerce/desktop-bag-popup.tsx +78 -78
  33. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  34. package/components/commerce/mobile-login-button.tsx +101 -0
  35. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  36. package/components/commerce/mobile-nav-menu-ai.tsx +98 -0
  37. package/components/commerce/mobile-nav-menu-item.tsx +46 -0
  38. package/components/commerce/mobile-nav-menu.tsx +79 -64
  39. package/components/contact-dialog/contact-form.tsx +112 -112
  40. package/components/contact-dialog/disclaimer.tsx +13 -13
  41. package/components/contact-dialog/index.tsx +64 -64
  42. package/components/copyright.tsx +21 -21
  43. package/components/footer.tsx +77 -77
  44. package/components/header/desktop.tsx +54 -54
  45. package/components/header/guts.tsx +27 -0
  46. package/components/header/index.tsx +47 -26
  47. package/components/header/mobile.tsx +165 -161
  48. package/components/header/theme-toggle.tsx +26 -26
  49. package/components/icons/avatar.tsx +11 -0
  50. package/components/icons/bag-icon.tsx +10 -10
  51. package/components/icons/github.tsx +14 -14
  52. package/components/icons/index.tsx +43 -35
  53. package/components/icons/left-arrow.tsx +11 -0
  54. package/components/icons/lux-logo.tsx +10 -10
  55. package/components/icons/right-arrow.tsx +10 -0
  56. package/components/icons/search.tsx +12 -0
  57. package/components/icons/secure-delivery.tsx +13 -13
  58. package/components/icons/social-icon.tsx +35 -35
  59. package/components/icons/social-svg.css +3 -3
  60. package/components/icons/youtube-logo.tsx +59 -59
  61. package/components/index.ts +27 -27
  62. package/components/logo.tsx +81 -81
  63. package/components/mini-chart/index.tsx +7 -7
  64. package/components/mini-chart/mini-chart-props.ts +43 -43
  65. package/components/mini-chart/mini-chart.tsx +85 -85
  66. package/components/mini-chart/wrapper.tsx +23 -23
  67. package/components/not-found/index.tsx +27 -27
  68. package/components/not-found/not-found-content.mdx +5 -5
  69. package/components/scripts.tsx +24 -24
  70. package/conf/index.ts +50 -50
  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 +73 -72
  86. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  87. package/root-layout/index.tsx +121 -120
  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 +292 -0
  100. package/style/cart-animation.css +29 -29
  101. package/style/checkout-animation.css +23 -23
  102. package/style/lux-colors.css +85 -85
  103. package/style/lux-global.css +30 -30
  104. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  105. package/tailwind/index.ts +2 -2
  106. package/tailwind/lux-tw-fonts.ts +39 -39
  107. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  108. package/tsconfig.json +10 -10
  109. package/types/chatbot-config.ts +6 -6
  110. package/types/chatbot-suggested-question.ts +7 -7
  111. package/types/commerce-config.ts +10 -10
  112. package/types/contact-info.ts +10 -10
  113. package/types/index.ts +5 -5
  114. package/types/site-def.ts +45 -45
  115. package/site-def/main-nav.ts +0 -35
@@ -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
@@ -0,0 +1,101 @@
1
+ 'use client'
2
+ import React from "react"
3
+ import { observer } from "mobx-react-lite"
4
+
5
+ import {
6
+ Button,
7
+ LinkElement,
8
+ Popover,
9
+ PopoverContent,
10
+ PopoverTrigger,
11
+ Separator
12
+ } from '@hanzo/ui/primitives'
13
+
14
+ import type { LinkDef } from '@hanzo/ui/types'
15
+ import { cn } from '@hanzo/ui/util'
16
+
17
+ import { useAuth } from "@hanzo/auth/service"
18
+
19
+ import { Avatar } from "../icons"
20
+ import { Ethereum } from "@hanzo/auth/icons"
21
+ import { Icons } from ".."
22
+
23
+ const MobileAuthWidget: React.FC<{
24
+ noLogin?: boolean
25
+ className?: string
26
+ handleLogin?: () => void
27
+ }> = observer(({
28
+ noLogin = false,
29
+ handleLogin,
30
+ className
31
+ }) => {
32
+ const auth = useAuth()
33
+
34
+ if (!auth) {
35
+ return null
36
+ }
37
+ if (!auth.loggedIn && typeof window !== 'undefined') {
38
+ return (noLogin ? null : (
39
+ (handleLogin) ? (
40
+ <div className="flex items-center py-3 px-5 gap-4">
41
+ <Icons.Avatar className='self-center w-6 h-6' />
42
+ <Button
43
+ variant='link'
44
+ className='text-2xl !min-w-0 self-center'
45
+ onClick={handleLogin}
46
+ >
47
+ Log In / Sign Up
48
+ </Button>
49
+ </div>
50
+ ) : (
51
+ <LinkElement
52
+ def={{
53
+ href: `${process.env.NEXT_PUBLIC_LOGIN_SITE_URL}?redirectUrl=${window.location.href}`,
54
+ title: 'Login',
55
+ variant: 'primary',
56
+ newTab: false
57
+ } satisfies LinkDef}
58
+ className='h-8 w-fit !min-w-0'
59
+ />
60
+ )
61
+ ))
62
+ }
63
+
64
+ return (
65
+ <Popover>
66
+ <PopoverTrigger asChild>
67
+ <Button
68
+ variant="outline"
69
+ size='icon'
70
+ className={cn('rounded-full text-muted border-2 border-muted bg-level-1 hover:bg-level-2 hover:border-foreground hover:text-foreground uppercase w-8 h-8', className)}
71
+ >{auth.user?.email[0]}</Button>
72
+ </PopoverTrigger>
73
+ <PopoverContent className='bg-level-0'>
74
+ <div className="grid gap-4">
75
+ <div className="space-y-2 truncate">
76
+ {auth.user?.displayName ? (
77
+ <>
78
+ <h4 className="font-medium leading-none truncate">{auth.user.displayName}</h4>
79
+ <p className="text-sm opacity-50 truncate">{auth.user.email}</p>
80
+ </>
81
+ ) : (
82
+ <h4 className="font-medium leading-none truncate">{auth.user?.email}</h4>
83
+ )}
84
+ {auth.user?.walletAddress ? (
85
+ <p className="text-sm opacity-50 truncate">{auth.user.walletAddress}</p>
86
+ ) : (
87
+ <Button variant="outline" className='w-full flex items-center gap-2' onClick={auth.associateWallet.bind(auth)}>
88
+ <Ethereum height={20} />Connect your wallet
89
+ </Button>
90
+ )}
91
+ </div>
92
+ <Separator />
93
+ <Button variant="outline" onClick={auth.logout.bind(auth)}>Logout</Button>
94
+ </div>
95
+ </PopoverContent>
96
+ </Popover>
97
+ )
98
+
99
+ })
100
+
101
+ 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
@@ -0,0 +1,98 @@
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
@@ -0,0 +1,46 @@
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
+
46
+ export default MobileNavMenuItem
@@ -1,64 +1,79 @@
1
- 'use client'
2
- import React from 'react'
3
-
4
- import type { LinkDef } from '@hanzo/ui/types'
5
- import { LinkElement } from '@hanzo/ui/primitives'
6
- import { cn } from '@hanzo/ui/util'
7
-
8
- const MobileNav: React.FC<{
9
- currentAs: string | undefined
10
- links: LinkDef[]
11
- className?: string
12
- commonItemClx?: string | ((def: LinkDef) => string),
13
- /**
14
- * This is called *in addition* to the link's actual navigation
15
- * action. eg, I link is clicked, and the modal menu is closes
16
- */
17
- onAction?: () => void
18
- }> = ({
19
- currentAs,
20
- links,
21
- onAction,
22
- className='',
23
- commonItemClx,
24
- }) => (
25
-
26
- links.length > 0 ? (
27
-
28
- <nav className={className} >
29
- {links.map((el, index) => {
30
- const variant = el.variant ?? 'link'
31
- let internalClx = ''
32
- // note that linkFG (or any other variant of 'link')
33
- // will not get assigned these classes,
34
- // and will remain styles is 'foreground' (hence the name)
35
- if (variant === 'link') {
36
- internalClx+= ' text-muted hover:text-foreground active:text-accent rounded-none'
37
- if (currentAs && currentAs === el.href) {
38
- internalClx += ' text-accent '
39
- }
40
- }
41
- else {
42
- internalClx+= ' min-w-0'
43
- }
44
- if (currentAs && currentAs === el.href) {
45
- internalClx += ' pointer-events-none'
46
- }
47
- const itemClx = (commonItemClx) ? (typeof commonItemClx === 'string' ? commonItemClx : commonItemClx(el)) : ''
48
-
49
- return (
50
- <LinkElement
51
- def={el}
52
- key={`common-${index}`}
53
- size='lg'
54
- className={cn(internalClx, itemClx)}
55
- onClick={onAction}
56
- />
57
- )
58
- })}
59
- </nav>
60
- )
61
- : null
62
- )
63
-
64
- export default MobileNav
1
+ 'use client'
2
+ import React from 'react'
3
+
4
+ import type { LinkDef } from '@hanzo/ui/types'
5
+ import { LinkElement } from '@hanzo/ui/primitives'
6
+ import { cn } from '@hanzo/ui/util'
7
+ import type { LinkDefExtended } from '../../site-def/main-nav'
8
+ import MobileNavMenuAI from './mobile-nav-menu-ai'
9
+ import MobileNavMenuItem from './mobile-nav-menu-item'
10
+ import MobileAuthWidget from './mobile-login-button'
11
+
12
+ const MobileNav: React.FC<{
13
+ currentAs: string | undefined
14
+ links: LinkDefExtended[]
15
+ className?: string
16
+ commonItemClx?: string | ((def: LinkDef) => string),
17
+ setChatbotOpen: (open: boolean) => void,
18
+ /**
19
+ * This is called *in addition* to the link's actual navigation
20
+ * action. eg, I link is clicked, and the modal menu is closes
21
+ */
22
+ onAction?: () => void
23
+ setMenuState: (arg: 'closed' | 'nav' | 'login' | 'bag') => void
24
+ }> = ({
25
+ currentAs,
26
+ links,
27
+ onAction,
28
+ setMenuState,
29
+ className = '',
30
+ commonItemClx,
31
+ setChatbotOpen,
32
+ }) => (
33
+ links.length > 0 ? (
34
+
35
+ <div className={cn('flex flex-col h-full', className)} >
36
+ <div className="flex flex-col flex-1">
37
+ {links.map((el, index) => {
38
+ const variant = el.variant ?? 'link'
39
+ let internalClx = ''
40
+ // note that linkFG (or any other variant of 'link')
41
+ // will not get assigned these classes,
42
+ // and will remain styles is 'foreground' (hence the name)
43
+ if (variant === 'link') {
44
+ internalClx += ' text-muted hover:text-foreground active:text-accent rounded-none'
45
+ if (currentAs && currentAs === el.href) {
46
+ internalClx += ' text-accent '
47
+ }
48
+ }
49
+ else {
50
+ internalClx += ' min-w-0'
51
+ }
52
+ if (currentAs && currentAs === el.href) {
53
+ internalClx += ' pointer-events-none'
54
+ }
55
+ const itemClx = (commonItemClx) ? (typeof commonItemClx === 'string' ? commonItemClx : commonItemClx(el)) : ''
56
+
57
+ // return (
58
+ // <LinkElement
59
+ // def={el}
60
+ // key={`common-${index}`}
61
+ // size='lg'
62
+ // className={cn(internalClx, itemClx)}
63
+ // onClick={onAction}
64
+ // />
65
+ // )
66
+ if (el.isAIMenu) {
67
+ return <MobileNavMenuAI link={el} setChatbotOpen={setChatbotOpen} />
68
+ } else {
69
+ return <MobileNavMenuItem link={el} />
70
+ }
71
+ })}
72
+ </div>
73
+ <MobileAuthWidget className=' text-2xl' handleLogin={() => { setMenuState('login') }} />
74
+ </div>
75
+ )
76
+ : null
77
+ )
78
+
79
+ export default MobileNav