@luxfi/core 5.1.4 → 5.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. package/commerce/{AUTO-GEN-bullion-by-family.json → data/AUTO-GEN-bullion-by-family.json} +33 -33
  2. package/commerce/{EDIT-ME-bullion-market-prices.ts → data/EDIT-ME-bullion-market-prices.ts} +11 -11
  3. package/commerce/{assign-prices.ts → data/assign-prices.ts} +49 -49
  4. package/commerce/{assign-videos-by-family-group.ts → data/assign-videos-by-family-group.ts} +14 -14
  5. package/commerce/{bullion-price-1oz.ts → data/bullion-price-1oz.ts} +5 -5
  6. package/commerce/{index.ts → data/index.ts} +18 -18
  7. package/commerce/ui/conf.ts +13 -0
  8. package/commerce/ui/context.tsx +102 -0
  9. package/commerce/ui/store.ts +277 -0
  10. package/components/access-code-input.tsx +71 -71
  11. package/components/auth/auth-listener.tsx +29 -29
  12. package/components/auth/auth-token/clear-auth-token.tsx +12 -12
  13. package/components/auth/auth-token/set-auth-token.tsx +16 -16
  14. package/components/auth/common-auth-domains.ts +16 -16
  15. package/components/auth/login-panel.tsx +107 -104
  16. package/components/chat-widget.tsx +85 -80
  17. package/components/commerce/add-widget.tsx +20 -0
  18. package/components/commerce/bag-button.tsx +98 -98
  19. package/components/commerce/buy-button.tsx +34 -0
  20. package/components/commerce/checkout-button.tsx +129 -116
  21. package/components/commerce/checkout-panel/close-button.tsx +26 -26
  22. package/components/commerce/checkout-panel/dt-bag-carousel.tsx +36 -36
  23. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +66 -66
  24. package/components/commerce/checkout-panel/index.tsx +129 -124
  25. package/components/commerce/checkout-panel/links-row.tsx +21 -21
  26. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +54 -54
  27. package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
  28. package/components/commerce/checkout-panel/thank-you.tsx +18 -18
  29. package/components/commerce/checkout-widget/const.ts +13 -13
  30. package/components/commerce/checkout-widget/index.tsx +192 -86
  31. package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
  32. package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -56
  33. package/components/commerce/desktop-bag-popup.tsx +78 -78
  34. package/components/commerce/drawer/index.tsx +117 -0
  35. package/components/commerce/drawer/micro.tsx +136 -0
  36. package/components/commerce/drawer/shell.tsx +79 -0
  37. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  38. package/components/commerce/mobile-login-button.tsx +100 -100
  39. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  40. package/components/commerce/mobile-nav-menu-ai.tsx +97 -97
  41. package/components/commerce/mobile-nav-menu-item.tsx +45 -45
  42. package/components/commerce/mobile-nav-menu.tsx +80 -79
  43. package/components/contact-dialog/contact-form.tsx +113 -112
  44. package/components/contact-dialog/disclaimer.tsx +13 -13
  45. package/components/contact-dialog/index.tsx +64 -64
  46. package/components/copyright.tsx +21 -21
  47. package/components/drawer-margin.tsx +25 -0
  48. package/components/footer.tsx +77 -77
  49. package/components/header/desktop.tsx +54 -54
  50. package/components/header/index.tsx +40 -47
  51. package/components/header/mobile.tsx +165 -165
  52. package/components/header/theme-toggle.tsx +26 -26
  53. package/components/icons/avatar.tsx +11 -11
  54. package/components/icons/bag-icon.tsx +10 -10
  55. package/components/icons/github.tsx +14 -14
  56. package/components/icons/index.tsx +43 -43
  57. package/components/icons/left-arrow.tsx +11 -11
  58. package/components/icons/lux-logo.tsx +10 -10
  59. package/components/icons/right-arrow.tsx +10 -10
  60. package/components/icons/search.tsx +12 -12
  61. package/components/icons/secure-delivery.tsx +13 -13
  62. package/components/icons/social-icon.tsx +35 -35
  63. package/components/icons/social-svg.css +3 -3
  64. package/components/icons/youtube-logo.tsx +59 -59
  65. package/components/index.ts +25 -27
  66. package/components/logo.tsx +81 -81
  67. package/components/main.tsx +27 -0
  68. package/components/mini-chart/index.tsx +7 -7
  69. package/components/mini-chart/mini-chart-props.ts +43 -43
  70. package/components/mini-chart/mini-chart.tsx +85 -85
  71. package/components/mini-chart/wrapper.tsx +23 -23
  72. package/components/not-found/index.tsx +28 -27
  73. package/components/not-found/not-found-content.mdx +5 -5
  74. package/components/scripts.tsx +24 -24
  75. package/conf/index.ts +52 -50
  76. package/{commerce/lux-service-options.ts → conf/lux-commerce-options.ts} +6 -6
  77. package/environment.d.ts +5 -5
  78. package/next/analytics/fpixel.ts +15 -15
  79. package/next/analytics/google-analytics.ts +13 -13
  80. package/next/analytics/index.ts +3 -3
  81. package/next/analytics/pixel-analytics.tsx +54 -54
  82. package/next/font/get-app-router-font-classes.ts +12 -12
  83. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  84. package/next/font/next-font-desc.ts +27 -27
  85. package/next/font/pages-router-font-vars.tsx +18 -18
  86. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  87. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  88. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  89. package/next/head-metadata/index.tsx +208 -208
  90. package/next/middleware/determine-device-mw.ts +16 -16
  91. package/package.json +80 -73
  92. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  93. package/root-layout/index.tsx +118 -121
  94. package/server-actions/firebase-app.ts +14 -14
  95. package/server-actions/index.ts +5 -5
  96. package/server-actions/store-contact.ts +51 -51
  97. package/site-def/footer/community.tsx +67 -67
  98. package/site-def/footer/company.ts +37 -37
  99. package/site-def/footer/ecosystem.ts +37 -37
  100. package/site-def/footer/index.tsx +26 -26
  101. package/site-def/footer/legal.ts +28 -28
  102. package/site-def/footer/network.ts +45 -45
  103. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  104. package/site-def/index.ts +2 -2
  105. package/site-def/main-nav.tsx +292 -292
  106. package/style/cart-animation.css +29 -29
  107. package/style/checkout-animation.css +23 -23
  108. package/style/drawer-handle-overrides.css +160 -0
  109. package/style/lux-colors.css +85 -85
  110. package/style/lux-global.css +30 -30
  111. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  112. package/tailwind/index.ts +2 -2
  113. package/tailwind/lux-tw-fonts.ts +39 -39
  114. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  115. package/tsconfig.json +15 -10
  116. package/types/chatbot-config.ts +6 -6
  117. package/types/chatbot-suggested-question.ts +7 -7
  118. package/types/commerce-config.ts +10 -10
  119. package/types/contact-info.ts +10 -10
  120. package/types/index.ts +5 -5
  121. package/types/site-def.ts +45 -45
  122. package/components/commerce/buy-drawer/drawer.tsx +0 -44
  123. package/components/commerce/buy-drawer/index.tsx +0 -46
  124. package/components/commerce/checkout-widget/use-lagging-item-ref.ts +0 -30
  125. package/components/header/guts.tsx +0 -27
@@ -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,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
-
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
98
  export default MobileNavMenuAI
@@ -1,46 +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
-
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
46
  export default MobileNavMenuItem
@@ -1,79 +1,80 @@
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
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
+ // TODO :aa shouldn't be so aware of parent context!
24
+ setMenuState: (arg: 'closed' | 'nav' | 'login' | 'bag') => void
25
+ }> = ({
26
+ currentAs,
27
+ links,
28
+ onAction,
29
+ setMenuState,
30
+ className = '',
31
+ commonItemClx,
32
+ setChatbotOpen,
33
+ }) => (
34
+ links.length > 0 ? (
35
+
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'
46
+ if (currentAs && currentAs === el.href) {
47
+ internalClx += ' text-accent '
48
+ }
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)) : ''
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
+ })}
74
+ </div>
75
+ <MobileAuthWidget className=' text-2xl' handleLogin={() => { setMenuState('login') }} />
76
+ </div>
77
+ ) : null
78
+ )
79
+
80
+ export default MobileNav