@luxfi/core 5.2.10 → 5.2.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. package/commerce/ui/conf.ts +13 -13
  2. package/commerce/ui/context.tsx +126 -126
  3. package/commerce/ui/store.ts +306 -304
  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/back-button.tsx +49 -42
  11. package/components/chat-widget.tsx +85 -85
  12. package/components/commerce/add-widget.tsx +20 -20
  13. package/components/commerce/bag-button.tsx +98 -98
  14. package/components/commerce/buy-button.tsx +34 -34
  15. package/components/commerce/checkout-button.tsx +129 -129
  16. package/components/commerce/checkout-panel/cart-accordian.tsx +66 -0
  17. package/components/commerce/checkout-panel/checkout-panel-props.ts +10 -0
  18. package/components/commerce/checkout-panel/{dt-bag-carousel.tsx → desktop-bag-carousel.tsx} +36 -36
  19. package/components/commerce/checkout-panel/desktop-cp.tsx +83 -0
  20. package/components/commerce/checkout-panel/index.tsx +126 -129
  21. package/components/commerce/checkout-panel/mobile-cp.tsx +67 -0
  22. package/components/commerce/checkout-panel/policy-links.tsx +29 -0
  23. package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
  24. package/components/commerce/checkout-panel/thank-you.tsx +18 -18
  25. package/components/commerce/checkout-widget/const.ts +13 -13
  26. package/components/commerce/checkout-widget/index.tsx +192 -192
  27. package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
  28. package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -58
  29. package/components/commerce/desktop-bag-popup.tsx +78 -78
  30. package/components/commerce/desktop-nav-menu.tsx +130 -130
  31. package/components/commerce/drawer/index.tsx +99 -99
  32. package/components/commerce/drawer/micro.tsx +144 -144
  33. package/components/commerce/drawer/shell.tsx +85 -85
  34. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  35. package/components/commerce/mobile-login-button.tsx +101 -101
  36. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  37. package/components/commerce/mobile-nav-menu-ai.tsx +47 -48
  38. package/components/commerce/mobile-nav-menu-item.tsx +49 -49
  39. package/components/commerce/mobile-nav-menu.tsx +101 -101
  40. package/components/contact-dialog/contact-form.tsx +113 -113
  41. package/components/contact-dialog/disclaimer.tsx +13 -13
  42. package/components/contact-dialog/index.tsx +64 -64
  43. package/components/copyright.tsx +21 -21
  44. package/components/drawer-margin.tsx +25 -25
  45. package/components/footer.tsx +77 -77
  46. package/components/header/desktop.tsx +50 -50
  47. package/components/header/index.tsx +52 -52
  48. package/components/header/mobile.tsx +163 -163
  49. package/components/header/theme-toggle.tsx +26 -26
  50. package/components/icons/24k-gold-card.tsx +43 -43
  51. package/components/icons/ai-chat.tsx +29 -29
  52. package/components/icons/anodized-titanium.tsx +45 -45
  53. package/components/icons/avatar.tsx +11 -11
  54. package/components/icons/bag-icon.tsx +10 -10
  55. package/components/icons/blog.tsx +20 -20
  56. package/components/icons/bridge.tsx +68 -68
  57. package/components/icons/changelog.tsx +21 -21
  58. package/components/icons/chrome.tsx +45 -45
  59. package/components/icons/coins.tsx +20 -20
  60. package/components/icons/compare-cards.tsx +21 -21
  61. package/components/icons/credit.tsx +20 -20
  62. package/components/icons/customer-support.tsx +21 -21
  63. package/components/icons/customers.tsx +33 -33
  64. package/components/icons/developer-docs.tsx +20 -20
  65. package/components/icons/exchange.tsx +21 -21
  66. package/components/icons/explorer.tsx +22 -22
  67. package/components/icons/faqs.tsx +21 -21
  68. package/components/icons/github.tsx +14 -14
  69. package/components/icons/guides.tsx +21 -21
  70. package/components/icons/gun-metal.tsx +44 -44
  71. package/components/icons/index.tsx +43 -43
  72. package/components/icons/integrations.tsx +25 -25
  73. package/components/icons/irradescent.tsx +41 -41
  74. package/components/icons/launch-subnet.tsx +21 -21
  75. package/components/icons/left-arrow.tsx +11 -11
  76. package/components/icons/lux-finance.tsx +23 -23
  77. package/components/icons/lux-logo.tsx +10 -10
  78. package/components/icons/lux-pass.tsx +25 -25
  79. package/components/icons/lux-quests.tsx +21 -21
  80. package/components/icons/market.tsx +24 -24
  81. package/components/icons/mirrored-titanium.tsx +46 -46
  82. package/components/icons/more-benefits.tsx +21 -21
  83. package/components/icons/open-source.tsx +26 -26
  84. package/components/icons/right-arrow.tsx +10 -10
  85. package/components/icons/safe.tsx +37 -37
  86. package/components/icons/search.tsx +12 -12
  87. package/components/icons/secure-delivery.tsx +13 -13
  88. package/components/icons/shop.tsx +20 -20
  89. package/components/icons/social-icon.tsx +35 -35
  90. package/components/icons/social-svg.css +3 -3
  91. package/components/icons/sterling-silver-card.tsx +44 -44
  92. package/components/icons/templates.tsx +21 -21
  93. package/components/icons/validators.tsx +41 -41
  94. package/components/icons/view-all-card.tsx +20 -20
  95. package/components/icons/wallet.tsx +20 -20
  96. package/components/icons/warpcast.tsx +58 -58
  97. package/components/icons/youtube-logo.tsx +59 -59
  98. package/components/index.ts +27 -27
  99. package/components/logo.tsx +89 -89
  100. package/components/main.tsx +27 -27
  101. package/components/mini-chart/index.tsx +7 -7
  102. package/components/mini-chart/mini-chart-props.ts +43 -43
  103. package/components/mini-chart/mini-chart.tsx +85 -85
  104. package/components/mini-chart/wrapper.tsx +23 -23
  105. package/components/not-found/index.tsx +28 -28
  106. package/components/not-found/not-found-content.mdx +5 -5
  107. package/components/scripts.tsx +24 -24
  108. package/components/tooltip.tsx +31 -31
  109. package/environment.d.ts +5 -5
  110. package/next/analytics/fpixel.ts +15 -15
  111. package/next/analytics/google-analytics.ts +13 -13
  112. package/next/analytics/index.ts +3 -3
  113. package/next/analytics/pixel-analytics.tsx +54 -54
  114. package/next/font/get-app-router-font-classes.ts +12 -12
  115. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  116. package/next/font/next-font-desc.ts +27 -27
  117. package/next/font/pages-router-font-vars.tsx +18 -18
  118. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  119. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  120. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  121. package/next/head-metadata/index.tsx +208 -208
  122. package/next/middleware/determine-device-mw.ts +16 -16
  123. package/package.json +79 -79
  124. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  125. package/root-layout/index.tsx +112 -112
  126. package/server-actions/firebase-app.ts +14 -14
  127. package/server-actions/index.ts +5 -5
  128. package/server-actions/store-contact.ts +51 -51
  129. package/site-def/footer/community.tsx +67 -67
  130. package/site-def/footer/company.ts +37 -37
  131. package/site-def/footer/ecosystem.ts +37 -37
  132. package/site-def/footer/index.tsx +26 -26
  133. package/site-def/footer/legal.ts +28 -28
  134. package/site-def/footer/network.ts +45 -45
  135. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  136. package/site-def/index.ts +2 -2
  137. package/site-def/main-nav.tsx +392 -392
  138. package/style/cart-animation.css +29 -29
  139. package/style/checkout-animation.css +23 -23
  140. package/style/drawer-handle-overrides.css +160 -160
  141. package/style/lux-colors.css +85 -85
  142. package/style/lux-global.css +30 -30
  143. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  144. package/tailwind/index.ts +2 -2
  145. package/tailwind/lux-tw-fonts.ts +39 -39
  146. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  147. package/tsconfig.json +15 -15
  148. package/types/chatbot-config.ts +6 -6
  149. package/types/chatbot-suggested-question.ts +7 -7
  150. package/types/contact-info.ts +10 -10
  151. package/types/index.ts +4 -4
  152. package/types/site-def.ts +43 -43
  153. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +0 -85
  154. package/components/commerce/checkout-panel/links-row.tsx +0 -21
  155. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +0 -55
@@ -1,78 +1,78 @@
1
- 'use client'
2
- import React, { useState, useEffect } from 'react'
3
- import { useRouter } from 'next/navigation'
4
-
5
- import { X } from 'lucide-react'
6
-
7
- import {
8
- Popover,
9
- PopoverContent,
10
- PopoverTrigger,
11
- PopoverClose,
12
- } from "@hanzo/ui/primitives"
13
-
14
- import { cn } from '@hanzo/ui/util'
15
- import { CartPanel, useCommerce } from '@hanzo/commerce'
16
-
17
- import * as Icons from '../icons'
18
- import sendGAEvent from '../../next/analytics/google-analytics'
19
-
20
- const DesktopBagPopup: React.FC<{
21
- triggerClx?: string
22
- popupClx?: string
23
- trigger: React.ReactNode
24
- }> = ({
25
- triggerClx='',
26
- popupClx='',
27
- trigger
28
- }) => {
29
- const cmmc = useCommerce()
30
-
31
- const [bagOpen, setBagOpen] = useState<boolean>(false)
32
- const router = useRouter()
33
-
34
- useEffect(() => {
35
- if (bagOpen) {
36
- sendGAEvent('view_cart', {
37
- items: cmmc.cartItems.map((item) => ({
38
- item_id: item.sku,
39
- item_name: item.title,
40
- item_category: item.familyId,
41
- price: item.price,
42
- quantity: item.quantity
43
- })),
44
- value: cmmc.cartTotal,
45
- currency: 'USD',
46
- })
47
- }
48
- }, [bagOpen])
49
-
50
- return (
51
- <Popover open={bagOpen} onOpenChange={setBagOpen}>
52
- <PopoverTrigger className={triggerClx}>
53
- {trigger}
54
- </PopoverTrigger>
55
- <PopoverContent sideOffset={28} className={cn('relative flex flex-col p-0 px-4 pb-4 pt-2', popupClx)}>
56
- <PopoverClose className='absolute z-above-content right-2 top-2 self-end hover:bg-level-3 text-muted hover:text-accent p-1 rounded-full'><X className='w-5 h-5'/></PopoverClose>
57
- <CartPanel
58
- handleCheckout={() => {router.push('/checkout')}}
59
- className='mt-4 mb-4 border-none py-0 px-4'
60
- listClx='rounded-sm pr-3'
61
- scrollAfter={5}
62
- scrollHeightClx='h-[70vh]'
63
- itemClx='mt-3'
64
- totalClx='sticky px-1 pr-2 -bottom-[1px] bg-level-1'
65
- buttonClx='max-w-[220px] flex-none'
66
- >
67
- <div className='flex flex-row items-center flex-none justify-center '>
68
- <Icons.bag className='mr-2 relative w-6 h-7 fill-foreground ' />
69
- <p className='font-heading text-foreground text-default'>Your Bag</p>
70
- </div>
71
- <div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none'/>
72
- </CartPanel>
73
- </PopoverContent>
74
- </Popover>
75
- )
76
- }
77
-
78
- export default DesktopBagPopup
1
+ 'use client'
2
+ import React, { useState, useEffect } from 'react'
3
+ import { useRouter } from 'next/navigation'
4
+
5
+ import { X } from 'lucide-react'
6
+
7
+ import {
8
+ Popover,
9
+ PopoverContent,
10
+ PopoverTrigger,
11
+ PopoverClose,
12
+ } from "@hanzo/ui/primitives"
13
+
14
+ import { cn } from '@hanzo/ui/util'
15
+ import { CartPanel, useCommerce } from '@hanzo/commerce'
16
+
17
+ import * as Icons from '../icons'
18
+ import sendGAEvent from '../../next/analytics/google-analytics'
19
+
20
+ const DesktopBagPopup: React.FC<{
21
+ triggerClx?: string
22
+ popupClx?: string
23
+ trigger: React.ReactNode
24
+ }> = ({
25
+ triggerClx='',
26
+ popupClx='',
27
+ trigger
28
+ }) => {
29
+ const cmmc = useCommerce()
30
+
31
+ const [bagOpen, setBagOpen] = useState<boolean>(false)
32
+ const router = useRouter()
33
+
34
+ useEffect(() => {
35
+ if (bagOpen) {
36
+ sendGAEvent('view_cart', {
37
+ items: cmmc.cartItems.map((item) => ({
38
+ item_id: item.sku,
39
+ item_name: item.title,
40
+ item_category: item.familyId,
41
+ price: item.price,
42
+ quantity: item.quantity
43
+ })),
44
+ value: cmmc.cartTotal,
45
+ currency: 'USD',
46
+ })
47
+ }
48
+ }, [bagOpen])
49
+
50
+ return (
51
+ <Popover open={bagOpen} onOpenChange={setBagOpen}>
52
+ <PopoverTrigger className={triggerClx}>
53
+ {trigger}
54
+ </PopoverTrigger>
55
+ <PopoverContent sideOffset={28} className={cn('relative flex flex-col p-0 px-4 pb-4 pt-2', popupClx)}>
56
+ <PopoverClose className='absolute z-above-content right-2 top-2 self-end hover:bg-level-3 text-muted hover:text-accent p-1 rounded-full'><X className='w-5 h-5'/></PopoverClose>
57
+ <CartPanel
58
+ handleCheckout={() => {router.push('/checkout')}}
59
+ className='mt-4 mb-4 border-none py-0 px-4'
60
+ listClx='rounded-sm pr-3'
61
+ scrollAfter={5}
62
+ scrollHeightClx='h-[70vh]'
63
+ itemClx='mt-3'
64
+ totalClx='sticky px-1 pr-2 -bottom-[1px] bg-level-1'
65
+ buttonClx='max-w-[220px] flex-none'
66
+ >
67
+ <div className='flex flex-row items-center flex-none justify-center '>
68
+ <Icons.bag className='mr-2 relative w-6 h-7 fill-foreground ' />
69
+ <p className='font-heading text-foreground text-default'>Your Bag</p>
70
+ </div>
71
+ <div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none'/>
72
+ </CartPanel>
73
+ </PopoverContent>
74
+ </Popover>
75
+ )
76
+ }
77
+
78
+ export default DesktopBagPopup
@@ -1,131 +1,131 @@
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 { ChildMenu, 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 DesktopNav: React.FC<{
21
- links: LinkDefExtended[],
22
- }> = ({
23
- links
24
-
25
- }) => (
26
- links.length > 0 ? (
27
- <NavigationMenu>
28
- <NavigationMenuList>
29
- {links.map((el, index) => {
30
-
31
- if (el.isAIMenu) {
32
- return (
33
- <NavigationMenuItem key={index}>
34
- <Link href={el.href} legacyBehavior passHref>
35
- <NavigationMenuLink className={navigationMenuTriggerStyle()}>
36
- {el.title}
37
- </NavigationMenuLink>
38
- </Link>
39
- </NavigationMenuItem>
40
- )
41
- } else if (el.title == "Credit") {
42
- return (
43
- <NavigationMenuItem key={index}>
44
- <NavigationMenuTrigger>{el.title}</NavigationMenuTrigger>
45
- <NavigationMenuContent className="!left-0">
46
- <div className="grid grid-cols-3 w-[846px]">
47
- {GroupChildMenu(el.childMenu)}
48
- </div>
49
- </NavigationMenuContent>
50
- </NavigationMenuItem>
51
- )
52
- } else {
53
- return (
54
- <NavigationMenuItem key={index}>
55
- <NavigationMenuTrigger className=" !rounded-2xl">{el.title}</NavigationMenuTrigger>
56
- <NavigationMenuContent className="!left-0">
57
- <div className="flex flex-row">
58
- {GroupChildMenu(el.childMenu)}
59
- </div>
60
- </NavigationMenuContent>
61
- </NavigationMenuItem>
62
- )
63
- }
64
-
65
- })}
66
- </NavigationMenuList>
67
- </NavigationMenu>
68
- ) : null
69
- )
70
- export default DesktopNav
71
-
72
- const ListItem = React.forwardRef<
73
- React.ElementRef<"a">,
74
- React.ComponentPropsWithoutRef<"a">
75
- >(({ className, title, children, key, ...props }, ref) => {
76
- return (
77
- <li key={key}>
78
- <NavigationMenuLink asChild>
79
- <a
80
- ref={ref}
81
- className={cn(
82
- "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",
83
- className
84
- )}
85
- {...props}
86
- >
87
- <div className="text-sm font-medium leading-none">{title}</div>
88
- <p className="line-clamp-3 text-sm leading-snug text-muted-foreground">
89
- {children}
90
- </p>
91
- </a>
92
- </NavigationMenuLink>
93
- </li>
94
- )
95
- })
96
- ListItem.displayName = "ListItem"
97
-
98
- const GroupChildMenu = (childs: ChildMenu[] | undefined) => {
99
- // Initialize groupedChildMenus with the type specification
100
- if (!childs) {
101
- return null
102
- }
103
- let groupedChildMenus = childs.reduce((grouped: Record<string, ChildMenu[]>, childLink) => {
104
- if (childLink.groupName) {
105
- if (!grouped[childLink.groupName]) {
106
- grouped[childLink.groupName] = []
107
- }
108
- grouped[childLink.groupName].push(childLink)
109
- }
110
- return grouped
111
- }, {} as Record<string, ChildMenu[]>) // added explicit type here
112
-
113
- // Convert groups object to array
114
- return Object.entries(groupedChildMenus).map(([groupName, childLinks]: [string, ChildMenu[]]) => { // added type specification here
115
- return (
116
- <div key={groupName} className={` py-4 px-4 ${groupName === "Elite Card" || groupName === "Sovereign Card" ? " -mt-34" : ""}` }>
117
- <h2 className="text-muted-1">{groupName}</h2>
118
- <ul className=" w-[200px] gap-3 md:w-[250px] lg:w-[250px]">
119
- {childLinks.map((link) => (
120
- <div className={"flex items-center"} key={link.title}>
121
- {link.icon}
122
- <ListItem key={link.title} title={link.title} href={link.href} className="text-muted-1 hover:text-primary hover:bg-transparent">
123
- {link.contents}
124
- </ListItem>
125
- </div>
126
- ))}
127
- </ul>
128
- </div>
129
- )
130
- })
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 { ChildMenu, 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 DesktopNav: React.FC<{
21
+ links: LinkDefExtended[],
22
+ }> = ({
23
+ links
24
+
25
+ }) => (
26
+ links.length > 0 ? (
27
+ <NavigationMenu>
28
+ <NavigationMenuList>
29
+ {links.map((el, index) => {
30
+
31
+ if (el.isAIMenu) {
32
+ return (
33
+ <NavigationMenuItem key={index}>
34
+ <Link href={el.href} legacyBehavior passHref>
35
+ <NavigationMenuLink className={navigationMenuTriggerStyle()}>
36
+ {el.title}
37
+ </NavigationMenuLink>
38
+ </Link>
39
+ </NavigationMenuItem>
40
+ )
41
+ } else if (el.title == "Credit") {
42
+ return (
43
+ <NavigationMenuItem key={index}>
44
+ <NavigationMenuTrigger>{el.title}</NavigationMenuTrigger>
45
+ <NavigationMenuContent className="!left-0">
46
+ <div className="grid grid-cols-3 w-[846px]">
47
+ {GroupChildMenu(el.childMenu)}
48
+ </div>
49
+ </NavigationMenuContent>
50
+ </NavigationMenuItem>
51
+ )
52
+ } else {
53
+ return (
54
+ <NavigationMenuItem key={index}>
55
+ <NavigationMenuTrigger className=" !rounded-2xl">{el.title}</NavigationMenuTrigger>
56
+ <NavigationMenuContent className="!left-0">
57
+ <div className="flex flex-row">
58
+ {GroupChildMenu(el.childMenu)}
59
+ </div>
60
+ </NavigationMenuContent>
61
+ </NavigationMenuItem>
62
+ )
63
+ }
64
+
65
+ })}
66
+ </NavigationMenuList>
67
+ </NavigationMenu>
68
+ ) : null
69
+ )
70
+ export default DesktopNav
71
+
72
+ const ListItem = React.forwardRef<
73
+ React.ElementRef<"a">,
74
+ React.ComponentPropsWithoutRef<"a">
75
+ >(({ className, title, children, key, ...props }, ref) => {
76
+ return (
77
+ <li key={key}>
78
+ <NavigationMenuLink asChild>
79
+ <a
80
+ ref={ref}
81
+ className={cn(
82
+ "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",
83
+ className
84
+ )}
85
+ {...props}
86
+ >
87
+ <div className="text-sm font-medium leading-none">{title}</div>
88
+ <p className="line-clamp-3 text-sm leading-snug text-muted-foreground">
89
+ {children}
90
+ </p>
91
+ </a>
92
+ </NavigationMenuLink>
93
+ </li>
94
+ )
95
+ })
96
+ ListItem.displayName = "ListItem"
97
+
98
+ const GroupChildMenu = (childs: ChildMenu[] | undefined) => {
99
+ // Initialize groupedChildMenus with the type specification
100
+ if (!childs) {
101
+ return null
102
+ }
103
+ let groupedChildMenus = childs.reduce((grouped: Record<string, ChildMenu[]>, childLink) => {
104
+ if (childLink.groupName) {
105
+ if (!grouped[childLink.groupName]) {
106
+ grouped[childLink.groupName] = []
107
+ }
108
+ grouped[childLink.groupName].push(childLink)
109
+ }
110
+ return grouped
111
+ }, {} as Record<string, ChildMenu[]>) // added explicit type here
112
+
113
+ // Convert groups object to array
114
+ return Object.entries(groupedChildMenus).map(([groupName, childLinks]: [string, ChildMenu[]]) => { // added type specification here
115
+ return (
116
+ <div key={groupName} className={` py-4 px-4 ${groupName === "Elite Card" || groupName === "Sovereign Card" ? " -mt-34" : ""}` }>
117
+ <h2 className="text-muted-1">{groupName}</h2>
118
+ <ul className=" w-[200px] gap-3 md:w-[250px] lg:w-[250px]">
119
+ {childLinks.map((link) => (
120
+ <div className={"flex items-center"} key={link.title}>
121
+ {link.icon}
122
+ <ListItem key={link.title} title={link.title} href={link.href} className="text-muted-1 hover:text-primary hover:bg-transparent">
123
+ {link.contents}
124
+ </ListItem>
125
+ </div>
126
+ ))}
127
+ </ul>
128
+ </div>
129
+ )
130
+ })
131
131
  }
@@ -1,99 +1,99 @@
1
- 'use client'
2
- import React from 'react'
3
- import { useRouter } from 'next/navigation'
4
- import { observer } from 'mobx-react-lite'
5
-
6
- import { CarouselBuyCard } from '@hanzo/commerce'
7
-
8
- import {
9
- useSelectAndBuy,
10
- useCommerceDrawer,
11
- useRecentActivity
12
- } from '../../../commerce/ui/context'
13
-
14
- import CommerceDrawer from './shell'
15
- import CheckoutButton from '../checkout-button'
16
- import Micro from './micro'
17
-
18
- const CommerceUIComponent: React.FC = observer(() => {
19
-
20
- const buy = useSelectAndBuy()
21
- const drawer = useCommerceDrawer()
22
- const recent = useRecentActivity()
23
- const router = useRouter()
24
-
25
-
26
- const handleCheckout = (): void => {
27
- router.push('/checkout')
28
- }
29
-
30
-
31
- const handleHandleClicked = (): void => {
32
-
33
- if (drawer.state === 'full') {
34
- buy.hideVariants()
35
- }
36
- else if (drawer.state === 'micro') {
37
- if (drawer.showAdded) {
38
- buy.showVariants(recent.item?.sku ?? '')
39
- }
40
- // checkout only
41
- else {
42
- drawer.setClosedByUser(true)
43
- }
44
- }
45
- }
46
-
47
- const handleItemClicked = () => {
48
- buy.showVariants(recent.item?.sku ?? '')
49
- }
50
-
51
- const handleCloseGesture = (): boolean => {
52
- if (drawer.state === 'full') {
53
- buy.hideVariants()
54
- return true // "handled!"
55
- }
56
- return false
57
- }
58
-
59
- return (
60
- <CommerceDrawer
61
- handleHandleClicked={handleHandleClicked}
62
- handleCloseGesture={handleCloseGesture}
63
- drawerClx='flex flex-col'
64
- >
65
- {drawer.state === 'full' && (
66
- /* The actual drawer is larger than the visible area (due to awkward
67
- vaul impl. So we have to ask the drawer for its currect snappoint
68
- and constrain layout to that.
69
- */
70
- <div style={{height: drawer.snapPointPx - 24 /* fudge factor for handle area */}}>
71
- <CarouselBuyCard
72
- skuPath={buy.currentSkuPath!}
73
- checkoutButton={
74
- <CheckoutButton
75
- handleCheckout={handleCheckout}
76
- className='w-full min-w-[160px] sm:max-w-[320px]'
77
- />
78
- }
79
- onQuantityChanged={recent.quantityChanged.bind(recent)}
80
- clx='justify-between h-full pb-3 gap-8'
81
- addBtnClx='w-full min-w-[160px] sm:max-w-[320px]'
82
- buttonsAreaClx='grow-0 shrink-0 mt-0'
83
- selectorClx='max-w-[475px] justify-between grow'
84
-
85
- />
86
- </div>
87
- )}
88
- {drawer.state === 'micro' && (
89
- <Micro
90
- handleCheckout={handleCheckout}
91
- handleItemClicked={handleItemClicked}
92
- clx='w-full px-2 sm:w-[460px] sm:mx-auto md:w-[550px]'
93
- />
94
- )}
95
- </CommerceDrawer>
96
- )
97
- })
98
-
99
- export default CommerceUIComponent
1
+ 'use client'
2
+ import React from 'react'
3
+ import { useRouter } from 'next/navigation'
4
+ import { observer } from 'mobx-react-lite'
5
+
6
+ import { CarouselBuyCard } from '@hanzo/commerce'
7
+
8
+ import {
9
+ useSelectAndBuy,
10
+ useCommerceDrawer,
11
+ useRecentActivity
12
+ } from '../../../commerce/ui/context'
13
+
14
+ import CommerceDrawer from './shell'
15
+ import CheckoutButton from '../checkout-button'
16
+ import Micro from './micro'
17
+
18
+ const CommerceUIComponent: React.FC = observer(() => {
19
+
20
+ const buy = useSelectAndBuy()
21
+ const drawer = useCommerceDrawer()
22
+ const recent = useRecentActivity()
23
+ const router = useRouter()
24
+
25
+
26
+ const handleCheckout = (): void => {
27
+ router.push('/checkout')
28
+ }
29
+
30
+
31
+ const handleHandleClicked = (): void => {
32
+
33
+ if (drawer.state === 'full') {
34
+ buy.hideVariants()
35
+ }
36
+ else if (drawer.state === 'micro') {
37
+ if (drawer.showAdded) {
38
+ buy.showVariants(recent.item?.sku ?? '')
39
+ }
40
+ // checkout only
41
+ else {
42
+ drawer.setClosedByUser(true)
43
+ }
44
+ }
45
+ }
46
+
47
+ const handleItemClicked = () => {
48
+ buy.showVariants(recent.item?.sku ?? '')
49
+ }
50
+
51
+ const handleCloseGesture = (): boolean => {
52
+ if (drawer.state === 'full') {
53
+ buy.hideVariants()
54
+ return true // "handled!"
55
+ }
56
+ return false
57
+ }
58
+
59
+ return (
60
+ <CommerceDrawer
61
+ handleHandleClicked={handleHandleClicked}
62
+ handleCloseGesture={handleCloseGesture}
63
+ drawerClx='flex flex-col'
64
+ >
65
+ {drawer.state === 'full' && (
66
+ /* The actual drawer is larger than the visible area (due to awkward
67
+ vaul impl. So we have to ask the drawer for its currect snappoint
68
+ and constrain layout to that.
69
+ */
70
+ <div style={{height: drawer.snapPointPx - 24 /* fudge factor for handle area */}}>
71
+ <CarouselBuyCard
72
+ skuPath={buy.currentSkuPath!}
73
+ checkoutButton={
74
+ <CheckoutButton
75
+ handleCheckout={handleCheckout}
76
+ className='w-full min-w-[160px] sm:max-w-[320px]'
77
+ />
78
+ }
79
+ onQuantityChanged={recent.quantityChanged.bind(recent)}
80
+ clx='justify-between h-full pb-3 gap-8'
81
+ addBtnClx='w-full min-w-[160px] sm:max-w-[320px]'
82
+ buttonsAreaClx='grow-0 shrink-0 mt-0'
83
+ selectorClx='max-w-[475px] justify-between grow'
84
+
85
+ />
86
+ </div>
87
+ )}
88
+ {drawer.state === 'micro' && (
89
+ <Micro
90
+ handleCheckout={handleCheckout}
91
+ handleItemClicked={handleItemClicked}
92
+ clx='w-full px-2 sm:w-[460px] sm:mx-auto md:w-[550px]'
93
+ />
94
+ )}
95
+ </CommerceDrawer>
96
+ )
97
+ })
98
+
99
+ export default CommerceUIComponent