@luxfi/core 5.2.5 → 5.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. package/commerce/ui/conf.ts +13 -13
  2. package/commerce/ui/context.tsx +102 -102
  3. package/commerce/ui/store.ts +276 -276
  4. package/components/access-code-input.tsx +71 -71
  5. package/components/auth/auth-listener.tsx +29 -29
  6. package/components/auth/auth-token/clear-auth-token.tsx +12 -12
  7. package/components/auth/auth-token/set-auth-token.tsx +16 -16
  8. package/components/auth/common-auth-domains.ts +16 -16
  9. package/components/auth/login-panel.tsx +107 -107
  10. package/components/chat-widget.tsx +85 -85
  11. package/components/commerce/add-widget.tsx +20 -20
  12. package/components/commerce/bag-button.tsx +98 -98
  13. package/components/commerce/buy-button.tsx +34 -34
  14. package/components/commerce/checkout-button.tsx +129 -129
  15. package/components/commerce/checkout-panel/close-button.tsx +26 -26
  16. package/components/commerce/checkout-panel/dt-bag-carousel.tsx +36 -36
  17. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +66 -66
  18. package/components/commerce/checkout-panel/index.tsx +129 -129
  19. package/components/commerce/checkout-panel/links-row.tsx +21 -21
  20. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +54 -54
  21. package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
  22. package/components/commerce/checkout-panel/thank-you.tsx +18 -18
  23. package/components/commerce/checkout-widget/const.ts +13 -13
  24. package/components/commerce/checkout-widget/index.tsx +192 -192
  25. package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
  26. package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -58
  27. package/components/commerce/desktop-bag-popup.tsx +78 -78
  28. package/components/commerce/desktop-nav-menu.tsx +235 -235
  29. package/components/commerce/drawer/index.tsx +116 -116
  30. package/components/commerce/drawer/micro.tsx +144 -144
  31. package/components/commerce/drawer/shell.tsx +83 -83
  32. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  33. package/components/commerce/mobile-login-button.tsx +101 -101
  34. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  35. package/components/commerce/mobile-nav-menu-ai.tsx +44 -44
  36. package/components/commerce/mobile-nav-menu-item.tsx +49 -49
  37. package/components/commerce/mobile-nav-menu.tsx +68 -68
  38. package/components/contact-dialog/contact-form.tsx +113 -113
  39. package/components/contact-dialog/disclaimer.tsx +13 -13
  40. package/components/contact-dialog/index.tsx +64 -64
  41. package/components/copyright.tsx +21 -21
  42. package/components/drawer-margin.tsx +25 -25
  43. package/components/footer.tsx +77 -77
  44. package/components/header/desktop.tsx +57 -57
  45. package/components/header/index.tsx +52 -52
  46. package/components/header/mobile.tsx +166 -166
  47. package/components/header/theme-toggle.tsx +26 -26
  48. package/components/icons/avatar.tsx +11 -11
  49. package/components/icons/bag-icon.tsx +10 -10
  50. package/components/icons/github.tsx +14 -14
  51. package/components/icons/index.tsx +43 -43
  52. package/components/icons/left-arrow.tsx +11 -11
  53. package/components/icons/lux-logo.tsx +10 -10
  54. package/components/icons/right-arrow.tsx +10 -10
  55. package/components/icons/search.tsx +12 -12
  56. package/components/icons/secure-delivery.tsx +13 -13
  57. package/components/icons/social-icon.tsx +35 -35
  58. package/components/icons/social-svg.css +3 -3
  59. package/components/icons/warpcast.tsx +58 -58
  60. package/components/icons/youtube-logo.tsx +59 -59
  61. package/components/index.ts +25 -25
  62. package/components/logo.tsx +81 -81
  63. package/components/main.tsx +27 -27
  64. package/components/mini-chart/index.tsx +7 -7
  65. package/components/mini-chart/mini-chart-props.ts +43 -43
  66. package/components/mini-chart/mini-chart.tsx +85 -85
  67. package/components/mini-chart/wrapper.tsx +23 -23
  68. package/components/not-found/index.tsx +28 -28
  69. package/components/not-found/not-found-content.mdx +5 -5
  70. package/components/scripts.tsx +24 -24
  71. package/environment.d.ts +5 -5
  72. package/next/analytics/fpixel.ts +15 -15
  73. package/next/analytics/google-analytics.ts +13 -13
  74. package/next/analytics/index.ts +3 -3
  75. package/next/analytics/pixel-analytics.tsx +54 -54
  76. package/next/font/get-app-router-font-classes.ts +12 -12
  77. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  78. package/next/font/next-font-desc.ts +27 -27
  79. package/next/font/pages-router-font-vars.tsx +18 -18
  80. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  81. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  82. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  83. package/next/head-metadata/index.tsx +208 -208
  84. package/next/middleware/determine-device-mw.ts +16 -16
  85. package/package.json +78 -78
  86. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  87. package/root-layout/index.tsx +112 -112
  88. package/server-actions/firebase-app.ts +14 -14
  89. package/server-actions/index.ts +5 -5
  90. package/server-actions/store-contact.ts +51 -51
  91. package/site-def/footer/community.tsx +67 -67
  92. package/site-def/footer/company.ts +37 -37
  93. package/site-def/footer/ecosystem.ts +37 -37
  94. package/site-def/footer/index.tsx +26 -26
  95. package/site-def/footer/legal.ts +28 -28
  96. package/site-def/footer/network.ts +45 -45
  97. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  98. package/site-def/index.ts +2 -2
  99. package/site-def/main-nav.tsx +338 -338
  100. package/style/cart-animation.css +29 -29
  101. package/style/checkout-animation.css +23 -23
  102. package/style/drawer-handle-overrides.css +160 -160
  103. package/style/lux-colors.css +85 -85
  104. package/style/lux-global.css +30 -30
  105. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  106. package/tailwind/index.ts +2 -2
  107. package/tailwind/lux-tw-fonts.ts +39 -39
  108. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  109. package/tsconfig.json +15 -15
  110. package/types/chatbot-config.ts +6 -6
  111. package/types/chatbot-suggested-question.ts +7 -7
  112. package/types/contact-info.ts +10 -10
  113. package/types/index.ts +4 -4
  114. package/types/site-def.ts +43 -43
@@ -1,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,235 +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"
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"