@hanzo/ui 0.5.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/assets/lux-site-icons/android-chrome-192x192.png +0 -0
  2. package/assets/lux-site-icons/android-chrome-512x512.png +0 -0
  3. package/assets/lux-site-icons/apple-touch-icon.png +0 -0
  4. package/assets/lux-site-icons/favicon-16x16.png +0 -0
  5. package/assets/lux-site-icons/favicon-32x32.png +0 -0
  6. package/assets/lux-site-icons/favicon.ico +0 -0
  7. package/assets/standard-docs/LUX-NFT-Terms-and-Conditions.pdf +0 -0
  8. package/assets/standard-docs/LUX-Privacy-Policy.pdf +0 -0
  9. package/blocks/components/accordian-block.tsx +48 -0
  10. package/blocks/components/block-component-props.ts +11 -0
  11. package/blocks/components/bullet-cards-block.tsx +43 -0
  12. package/blocks/components/card-block.tsx +213 -0
  13. package/blocks/components/carte-blanche-block/index.tsx +98 -0
  14. package/blocks/components/content.tsx +70 -0
  15. package/blocks/components/cta-block.tsx +98 -0
  16. package/blocks/components/enh-heading-block.tsx +194 -0
  17. package/blocks/components/grid-block/grid-block-mutator.ts +12 -0
  18. package/blocks/components/grid-block/index.tsx +83 -0
  19. package/blocks/components/grid-block/mutator-registry.ts +10 -0
  20. package/blocks/components/grid-block/table-borders.mutator.ts +47 -0
  21. package/blocks/components/group-block.tsx +83 -0
  22. package/blocks/components/heading-block.tsx +88 -0
  23. package/blocks/components/image-block.tsx +108 -0
  24. package/blocks/components/index.ts +30 -0
  25. package/blocks/components/screenful-block/content.tsx +115 -0
  26. package/blocks/components/screenful-block/index.tsx +77 -0
  27. package/blocks/components/screenful-block/poster-background.tsx +34 -0
  28. package/blocks/components/screenful-block/video-background.tsx +45 -0
  29. package/blocks/components/space-block.tsx +66 -0
  30. package/blocks/components/video-block.tsx +137 -0
  31. package/blocks/def/accordian-block.ts +14 -0
  32. package/blocks/def/block.ts +7 -0
  33. package/blocks/def/bullet-cards-block.ts +20 -0
  34. package/blocks/def/card-block.ts +24 -0
  35. package/blocks/def/carte-blanche-block.ts +20 -0
  36. package/blocks/def/cta-block.ts +19 -0
  37. package/blocks/def/element-block.ts +11 -0
  38. package/blocks/def/enh-heading-block.ts +45 -0
  39. package/blocks/def/grid-block.ts +16 -0
  40. package/blocks/def/group-block.ts +11 -0
  41. package/blocks/def/heading-block.ts +15 -0
  42. package/blocks/def/image-block.ts +36 -0
  43. package/blocks/def/index.ts +35 -0
  44. package/blocks/def/screenful-block.ts +51 -0
  45. package/blocks/def/space-block.ts +64 -0
  46. package/blocks/def/video-block.ts +28 -0
  47. package/blocks/index.ts +2 -0
  48. package/common/chat-widget.tsx +75 -0
  49. package/common/contact-dialog/contact-form.tsx +111 -0
  50. package/common/contact-dialog/disclaimer.tsx +13 -0
  51. package/common/contact-dialog/index.tsx +48 -0
  52. package/common/copyright.tsx +21 -0
  53. package/common/drawer-menu.tsx +51 -0
  54. package/common/footer.tsx +77 -0
  55. package/common/head-metadata/from-next/metadata-types.ts +158 -0
  56. package/common/head-metadata/from-next/opengraph-types.ts +267 -0
  57. package/common/head-metadata/from-next/twitter-types.ts +92 -0
  58. package/common/head-metadata/index.tsx +208 -0
  59. package/common/header/index.tsx +57 -0
  60. package/common/header/mobile-nav.tsx +72 -0
  61. package/common/header/theme-toggle.tsx +26 -0
  62. package/common/icons/github.tsx +14 -0
  63. package/common/icons/index.tsx +34 -0
  64. package/common/icons/lux-logo.tsx +10 -0
  65. package/common/icons/secure-delivery.tsx +13 -0
  66. package/common/icons/social-icon.tsx +35 -0
  67. package/common/icons/youtube-logo.tsx +59 -0
  68. package/common/index.ts +14 -0
  69. package/common/logo.tsx +71 -0
  70. package/common/mini-chart/index.tsx +8 -0
  71. package/common/mini-chart/mini-chart-props.ts +44 -0
  72. package/common/mini-chart/mini-chart.tsx +76 -0
  73. package/common/mini-chart/wrapper.tsx +23 -0
  74. package/context-providers/index.ts +1 -0
  75. package/context-providers/theme-provider.tsx +20 -0
  76. package/next/README.md +11 -0
  77. package/next/determine-device-middleware.ts +16 -0
  78. package/next/fonts/DrukTextWide-Bold-Trial.otf +0 -0
  79. package/next/fonts/DrukTextWide-Heavy-Trial.otf +0 -0
  80. package/next/fonts/DrukTextWide-Medium-Trial.otf +0 -0
  81. package/next/get-app-router-font-classes.ts +12 -0
  82. package/next/load-and-return-lux-next-fonts-on-import.ts +68 -0
  83. package/next/next-font-desc.ts +28 -0
  84. package/next/not-found-content.mdx +4 -0
  85. package/next/not-found.tsx +23 -0
  86. package/next/pages-router-font-vars.tsx +18 -0
  87. package/next/root-layout.tsx +53 -0
  88. package/package.json +105 -0
  89. package/primitives/accordion.tsx +61 -0
  90. package/primitives/action-button.tsx +46 -0
  91. package/primitives/apply-typography.tsx +55 -0
  92. package/primitives/avatar.tsx +49 -0
  93. package/primitives/badge.tsx +36 -0
  94. package/primitives/button.tsx +73 -0
  95. package/primitives/calendar.tsx +72 -0
  96. package/primitives/card.tsx +83 -0
  97. package/primitives/checkbox.tsx +32 -0
  98. package/primitives/command.tsx +155 -0
  99. package/primitives/dialog-video-controller.tsx +38 -0
  100. package/primitives/dialog.tsx +152 -0
  101. package/primitives/form.tsx +179 -0
  102. package/primitives/index.ts +144 -0
  103. package/primitives/inline-icon.tsx +37 -0
  104. package/primitives/input.tsx +30 -0
  105. package/primitives/label.tsx +28 -0
  106. package/primitives/link-element.tsx +104 -0
  107. package/primitives/main.tsx +17 -0
  108. package/primitives/mdx-link.tsx +22 -0
  109. package/primitives/nav-items.tsx +48 -0
  110. package/primitives/popover.tsx +35 -0
  111. package/primitives/progress.tsx +27 -0
  112. package/primitives/scroll-area.tsx +47 -0
  113. package/primitives/select.tsx +169 -0
  114. package/primitives/separator.tsx +29 -0
  115. package/primitives/sheet.tsx +175 -0
  116. package/primitives/skeleton.tsx +15 -0
  117. package/primitives/switch.tsx +33 -0
  118. package/primitives/table.tsx +117 -0
  119. package/primitives/tabs.tsx +60 -0
  120. package/primitives/tailwind-indicator.tsx +19 -0
  121. package/primitives/text-area.tsx +26 -0
  122. package/primitives/toast.tsx +129 -0
  123. package/primitives/toaster.tsx +37 -0
  124. package/primitives/use-toast.ts +192 -0
  125. package/primitives/video-player.tsx +26 -0
  126. package/primitives/youtube-embed.tsx +83 -0
  127. package/siteDef/footer/community.tsx +67 -0
  128. package/siteDef/footer/company.ts +37 -0
  129. package/siteDef/footer/ecosystem.ts +37 -0
  130. package/siteDef/footer/index.tsx +26 -0
  131. package/siteDef/footer/legal.ts +28 -0
  132. package/siteDef/footer/network.ts +33 -0
  133. package/siteDef/footer/svg/warpcast-logo.svg +12 -0
  134. package/siteDef/main-nav.ts +35 -0
  135. package/style/globals.css +13 -0
  136. package/style/hanzo-common.css +32 -0
  137. package/style/hanzo-default-colors.css +79 -0
  138. package/style/social-svg.css +3 -0
  139. package/tailwind/colors.tailwind.js +46 -0
  140. package/tailwind/fonts.tailwind.ts +31 -0
  141. package/tailwind/index.ts +18 -0
  142. package/tailwind/lux-tw-fonts.ts +32 -0
  143. package/tailwind/safelist.tailwind.js +26 -0
  144. package/tailwind/screens.tailwind.js +8 -0
  145. package/tailwind/spacing.tailwind.js +57 -0
  146. package/tailwind/tailwind.config.base.js +905 -0
  147. package/tailwind/tw-font-desc.ts +15 -0
  148. package/tailwind/typo-plugin/get-plugin-styles.js +676 -0
  149. package/tailwind/typo-plugin/index.d.ts +9 -0
  150. package/tailwind/typo-plugin/index.js +141 -0
  151. package/tailwind/typo-plugin/utils.js +60 -0
  152. package/tailwind/typography-test.mdx +36 -0
  153. package/types/breakpoints.ts +11 -0
  154. package/types/bullet-item.ts +10 -0
  155. package/types/button-def.ts +39 -0
  156. package/types/contact-info.ts +11 -0
  157. package/types/dimensions.ts +20 -0
  158. package/types/grid-def.ts +37 -0
  159. package/types/icon.ts +10 -0
  160. package/types/image-def.ts +28 -0
  161. package/types/index.ts +29 -0
  162. package/types/link-def.ts +59 -0
  163. package/types/site-def.ts +31 -0
  164. package/types/t-shirt-size.ts +5 -0
  165. package/util/index.ts +76 -0
  166. package/util/specifier.ts +43 -0
@@ -0,0 +1,129 @@
1
+ // @ts-nocheck
2
+ 'use client'
3
+ import * as React from "react"
4
+ import * as ToastPrimitives from "@radix-ui/react-toast"
5
+ import { cva, type VariantProps } from "class-variance-authority"
6
+ import { X } from "lucide-react"
7
+
8
+ import { cn } from "../util"
9
+
10
+ const ToastProvider = ToastPrimitives.Provider
11
+
12
+ const ToastViewport = React.forwardRef<
13
+ React.ElementRef<typeof ToastPrimitives.Viewport>,
14
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>
15
+ >(({ className, ...props }, ref) => (
16
+ <ToastPrimitives.Viewport
17
+ ref={ref}
18
+ className={cn(
19
+ "fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",
20
+ className
21
+ )}
22
+ {...props}
23
+ />
24
+ ))
25
+ ToastViewport.displayName = ToastPrimitives.Viewport.displayName
26
+
27
+ const toastVariants = cva(
28
+ "group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",
29
+ {
30
+ variants: {
31
+ variant: {
32
+ default: "border bg-background text-foreground",
33
+ destructive:
34
+ "destructive group border-destructive bg-destructive text-destructive-fg",
35
+ },
36
+ },
37
+ defaultVariants: {
38
+ variant: "default",
39
+ },
40
+ }
41
+ )
42
+
43
+ const Toast = React.forwardRef<
44
+ React.ElementRef<typeof ToastPrimitives.Root>,
45
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &
46
+ VariantProps<typeof toastVariants>
47
+ >(({ className, variant, ...props }, ref) => {
48
+ return (
49
+ <ToastPrimitives.Root
50
+ ref={ref}
51
+ className={cn(toastVariants({ variant }), className)}
52
+ {...props}
53
+ />
54
+ )
55
+ })
56
+ Toast.displayName = ToastPrimitives.Root.displayName
57
+
58
+ const ToastAction = React.forwardRef<
59
+ React.ElementRef<typeof ToastPrimitives.Action>,
60
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>
61
+ >(({ className, ...props }, ref) => (
62
+ <ToastPrimitives.Action
63
+ ref={ref}
64
+ className={cn(
65
+ "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted-1/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-fg group-[.destructive]:focus:ring-destructive",
66
+ className
67
+ )}
68
+ {...props}
69
+ />
70
+ ))
71
+ ToastAction.displayName = ToastPrimitives.Action.displayName
72
+
73
+ const ToastClose = React.forwardRef<
74
+ React.ElementRef<typeof ToastPrimitives.Close>,
75
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>
76
+ >(({ className, ...props }, ref) => (
77
+ <ToastPrimitives.Close
78
+ ref={ref}
79
+ className={cn(
80
+ "absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",
81
+ className
82
+ )}
83
+ toast-close=""
84
+ {...props}
85
+ >
86
+ <X className="h-4 w-4" />
87
+ </ToastPrimitives.Close>
88
+ ))
89
+ ToastClose.displayName = ToastPrimitives.Close.displayName
90
+
91
+ const ToastTitle = React.forwardRef<
92
+ React.ElementRef<typeof ToastPrimitives.Title>,
93
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>
94
+ >(({ className, ...props }, ref) => (
95
+ <ToastPrimitives.Title
96
+ ref={ref}
97
+ className={cn("text-sm font-semibold", className)}
98
+ {...props}
99
+ />
100
+ ))
101
+ ToastTitle.displayName = ToastPrimitives.Title.displayName
102
+
103
+ const ToastDescription = React.forwardRef<
104
+ React.ElementRef<typeof ToastPrimitives.Description>,
105
+ React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>
106
+ >(({ className, ...props }, ref) => (
107
+ <ToastPrimitives.Description
108
+ ref={ref}
109
+ className={cn("text-sm opacity-90", className)}
110
+ {...props}
111
+ />
112
+ ))
113
+ ToastDescription.displayName = ToastPrimitives.Description.displayName
114
+
115
+ type ToastProps = React.ComponentPropsWithoutRef<typeof Toast>
116
+
117
+ type ToastActionElement = React.ReactElement<typeof ToastAction>
118
+
119
+ export {
120
+ type ToastProps,
121
+ type ToastActionElement,
122
+ ToastProvider,
123
+ ToastViewport,
124
+ Toast,
125
+ ToastTitle,
126
+ ToastDescription,
127
+ ToastClose,
128
+ ToastAction,
129
+ }
@@ -0,0 +1,37 @@
1
+ // @ts-nocheck
2
+ "use client"
3
+
4
+ import {
5
+ Toast,
6
+ ToastClose,
7
+ ToastDescription,
8
+ ToastProvider,
9
+ ToastTitle,
10
+ ToastViewport,
11
+ } from "./toast"
12
+
13
+ import { useToast } from "./use-toast"
14
+
15
+ export const Toaster: React.FC = () => {
16
+ const { toasts } = useToast()
17
+
18
+ return (
19
+ <ToastProvider>
20
+ {toasts.map(function ({ id, title, description, action, ...props }) {
21
+ return (
22
+ <Toast key={id} {...props}>
23
+ <div className="grid gap-1">
24
+ {title && <ToastTitle>{title}</ToastTitle>}
25
+ {description && (
26
+ <ToastDescription>{description}</ToastDescription>
27
+ )}
28
+ </div>
29
+ {action}
30
+ <ToastClose />
31
+ </Toast>
32
+ )
33
+ })}
34
+ <ToastViewport />
35
+ </ToastProvider>
36
+ )
37
+ }
@@ -0,0 +1,192 @@
1
+ // Inspired by react-hot-toast library
2
+ import * as React from "react"
3
+
4
+ import type {
5
+ ToastActionElement,
6
+ ToastProps,
7
+ } from "./toast"
8
+
9
+ const TOAST_LIMIT = 1
10
+ const TOAST_REMOVE_DELAY = 1000000
11
+
12
+ type ToasterToast = ToastProps & {
13
+ id: string
14
+ title?: React.ReactNode
15
+ description?: React.ReactNode
16
+ action?: ToastActionElement
17
+ }
18
+
19
+ const actionTypes = {
20
+ ADD_TOAST: "ADD_TOAST",
21
+ UPDATE_TOAST: "UPDATE_TOAST",
22
+ DISMISS_TOAST: "DISMISS_TOAST",
23
+ REMOVE_TOAST: "REMOVE_TOAST",
24
+ } as const
25
+
26
+ let count = 0
27
+
28
+ function genId() {
29
+ count = (count + 1) % Number.MAX_VALUE
30
+ return count.toString()
31
+ }
32
+
33
+ type ActionType = typeof actionTypes
34
+
35
+ type Action =
36
+ | {
37
+ type: ActionType["ADD_TOAST"]
38
+ toast: ToasterToast
39
+ }
40
+ | {
41
+ type: ActionType["UPDATE_TOAST"]
42
+ toast: Partial<ToasterToast>
43
+ }
44
+ | {
45
+ type: ActionType["DISMISS_TOAST"]
46
+ toastId?: ToasterToast["id"]
47
+ }
48
+ | {
49
+ type: ActionType["REMOVE_TOAST"]
50
+ toastId?: ToasterToast["id"]
51
+ }
52
+
53
+ interface State {
54
+ toasts: ToasterToast[]
55
+ }
56
+
57
+ const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()
58
+
59
+ const addToRemoveQueue = (toastId: string) => {
60
+ if (toastTimeouts.has(toastId)) {
61
+ return
62
+ }
63
+
64
+ const timeout = setTimeout(() => {
65
+ toastTimeouts.delete(toastId)
66
+ dispatch({
67
+ type: "REMOVE_TOAST",
68
+ toastId: toastId,
69
+ })
70
+ }, TOAST_REMOVE_DELAY)
71
+
72
+ toastTimeouts.set(toastId, timeout)
73
+ }
74
+
75
+ const reducer = (state: State, action: Action): State => {
76
+ switch (action.type) {
77
+ case "ADD_TOAST":
78
+ return {
79
+ ...state,
80
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
81
+ }
82
+
83
+ case "UPDATE_TOAST":
84
+ return {
85
+ ...state,
86
+ toasts: state.toasts.map((t) =>
87
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
88
+ ),
89
+ }
90
+
91
+ case "DISMISS_TOAST": {
92
+ const { toastId } = action
93
+
94
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
95
+ // but I'll keep it here for simplicity
96
+ if (toastId) {
97
+ addToRemoveQueue(toastId)
98
+ } else {
99
+ state.toasts.forEach((toast) => {
100
+ addToRemoveQueue(toast.id)
101
+ })
102
+ }
103
+
104
+ return {
105
+ ...state,
106
+ toasts: state.toasts.map((t) =>
107
+ t.id === toastId || toastId === undefined
108
+ ? {
109
+ ...t,
110
+ open: false,
111
+ }
112
+ : t
113
+ ),
114
+ }
115
+ }
116
+ case "REMOVE_TOAST":
117
+ if (action.toastId === undefined) {
118
+ return {
119
+ ...state,
120
+ toasts: [],
121
+ }
122
+ }
123
+ return {
124
+ ...state,
125
+ toasts: state.toasts.filter((t) => t.id !== action.toastId),
126
+ }
127
+ }
128
+ }
129
+
130
+ const listeners: Array<(state: State) => void> = []
131
+
132
+ let memoryState: State = { toasts: [] }
133
+
134
+ function dispatch(action: Action) {
135
+ memoryState = reducer(memoryState, action)
136
+ listeners.forEach((listener) => {
137
+ listener(memoryState)
138
+ })
139
+ }
140
+
141
+ type Toast = Omit<ToasterToast, "id">
142
+
143
+ function toast({ ...props }: Toast) {
144
+ const id = genId()
145
+
146
+ const update = (props: ToasterToast) =>
147
+ dispatch({
148
+ type: "UPDATE_TOAST",
149
+ toast: { ...props, id },
150
+ })
151
+ const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id })
152
+
153
+ dispatch({
154
+ type: "ADD_TOAST",
155
+ toast: {
156
+ ...props,
157
+ id,
158
+ open: true,
159
+ onOpenChange: (open: any) => {
160
+ if (!open) dismiss()
161
+ },
162
+ },
163
+ })
164
+
165
+ return {
166
+ id: id,
167
+ dismiss,
168
+ update,
169
+ }
170
+ }
171
+
172
+ function useToast() {
173
+ const [state, setState] = React.useState<State>(memoryState)
174
+
175
+ React.useEffect(() => {
176
+ listeners.push(setState)
177
+ return () => {
178
+ const index = listeners.indexOf(setState)
179
+ if (index > -1) {
180
+ listeners.splice(index, 1)
181
+ }
182
+ }
183
+ }, [state])
184
+
185
+ return {
186
+ ...state,
187
+ toast,
188
+ dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
189
+ }
190
+ }
191
+
192
+ export { useToast, toast }
@@ -0,0 +1,26 @@
1
+ 'use client'
2
+ import React from 'react'
3
+
4
+ interface VideoProps extends React.ComponentPropsWithoutRef<"video"> {
5
+ sources: string[]
6
+ className?: string
7
+ }
8
+
9
+ const VideoPlayer = React.forwardRef<HTMLVideoElement, VideoProps>(
10
+ ({
11
+ sources,
12
+ className='',
13
+ ...rest
14
+ }, ref) => {
15
+
16
+
17
+ return (
18
+ <video ref={ref} {...rest} className={className}>
19
+ {sources.map((source, index) => (
20
+ <source key={index} src={source} />
21
+ ))}
22
+ </video>
23
+ )
24
+ })
25
+
26
+ export default VideoPlayer
@@ -0,0 +1,83 @@
1
+ 'use client'
2
+
3
+ import { useState } from 'react'
4
+ import Image from 'next/image'
5
+
6
+ import * as Icons from '../common/icons'
7
+
8
+ // Concept based on https://www.youtube.com/watch?v=lLqRchtjN00
9
+ // (https://github.com/a-trost/fableton)
10
+
11
+ const YouTubeEmbed: React.FC<{
12
+ youtubeID: string
13
+ width: number
14
+ height: number
15
+ buttonSize?: number
16
+ timeAt?: string // '5s'
17
+ title?: string
18
+ caption?: string
19
+ className?: string
20
+ }> = ({
21
+ youtubeID,
22
+ width,
23
+ height,
24
+ buttonSize=100,
25
+ timeAt,
26
+ title,
27
+ caption,
28
+ className=''
29
+ }) => {
30
+
31
+ const [showVideo, setShowVideo] = useState(false)
32
+
33
+ // re autoplay: https://stackoverflow.com/a/45610557/11645689
34
+ return (
35
+ <div className={className}>
36
+ {showVideo ? (
37
+ <iframe
38
+ width={width}
39
+ height={height}
40
+ src={`https://www.youtube-nocookie.com/embed/${youtubeID + ((timeAt) ? `?t=${timeAt}&` : '?')}rel=0&autoplay=1`}
41
+ allow='accelerometer ; autoplay *; clipboard-write *; encrypted-media *; gyroscope *; picture-in-picture *;'
42
+ allowFullScreen
43
+ title={title || 'Youtube video'}
44
+ className='aspect-[16/9] h-full w-full p-0 border-0 '
45
+ />
46
+ ) : (
47
+ <button
48
+ type='button'
49
+ onClick={() => setShowVideo(true)}
50
+ className='relative aspect-[16/9] w-full'
51
+ aria-label={`Play video ${title}`}
52
+ >
53
+ <Image
54
+ src={`https://img.youtube.com/vi/${youtubeID}/maxresdefault.jpg`}
55
+ alt=''
56
+ className='h-full w-full'
57
+ width={width}
58
+ height={height}
59
+ loading='lazy'
60
+ />
61
+ <div
62
+ className={ //https://stackoverflow.com/a/23384995/11645689
63
+ 'absolute z-50 left-[50%] top-[50%] -translate-y-2/4 -translate-x-2/4 ' +
64
+ 'grid place-items-center ' +
65
+ 'text-xl text-white opacity-90'
66
+ }
67
+ >
68
+ <Icons.youtube
69
+ width={buttonSize}
70
+ height={buttonSize}
71
+ role='img'
72
+ className='transform transition hover:scale-110'
73
+ {...{'aria-hidden': true}}
74
+ />
75
+ </div>
76
+ {caption && <p className='hidden md:block whitespace-nowrap typography absolute z-50 left-[50%] top-[20px] -translate-x-2/4 '>{caption}</p>}
77
+ </button>
78
+ )}
79
+ </div>
80
+ )
81
+ }
82
+
83
+ export default YouTubeEmbed
@@ -0,0 +1,67 @@
1
+ import type { LinkDef } from '../../types'
2
+ import { Icons } from '../../common'
3
+
4
+ // @ts-ignore (will build in project that has @svgr support)
5
+ import SVG_warp_logo from './svg/warpcast-logo.svg'
6
+
7
+ const SOC_ICON_SIZE = 18
8
+
9
+ export default [
10
+ {
11
+ title: 'Community',
12
+ href: '',
13
+ variant: 'linkFG',
14
+ },
15
+
16
+ {
17
+ title: 'Lux Channel',
18
+ href: 'https://warpcast.com/~/channel/lux',
19
+ icon: <SVG_warp_logo width={SOC_ICON_SIZE} height={SOC_ICON_SIZE} /> //<Icons.SocialIcon network='warpcast' size={SOC_ICON_SIZE} />
20
+ },
21
+ {
22
+ title: 'Lux Discussion',
23
+ href: 'https://github.com/orgs/luxdefi/discussions',
24
+ icon: <Icons.SocialIcon network='github' size={SOC_ICON_SIZE} />
25
+ },
26
+
27
+ /*
28
+ {
29
+ title: 'Discord',
30
+ href: 'https://discord.gg/luxdefi',
31
+ external: true,
32
+ icon: <Icons.SocialIcon network='discord' size={SOC_ICON_SIZE} />
33
+ },
34
+ {
35
+ title: 'Telegram',
36
+ href: 'https://t.me/luxdefi',
37
+ external: true,
38
+ icon: <Icons.SocialIcon network='telegram' size={SOC_ICON_SIZE} />
39
+ },
40
+ */
41
+
42
+ {
43
+ title: '@luxdefi',
44
+ href: 'https://twitter.com/luxdefi',
45
+ icon: <Icons.SocialIcon network='x' size={SOC_ICON_SIZE} />
46
+ },
47
+ {
48
+ title: '@luxdefi',
49
+ href: 'https://facebook.com/luxdefi',
50
+ icon: <Icons.SocialIcon network='facebook' size={SOC_ICON_SIZE + 2} />
51
+ },
52
+ {
53
+ title: '@luxdefi',
54
+ href: 'https://www.instagram.com/luxdefi',
55
+ icon: <Icons.SocialIcon network='instagram' size={SOC_ICON_SIZE + 2} />
56
+ },
57
+ {
58
+ title: '@luxdefi',
59
+ href: 'https://linkedin.com/company/luxdefi',
60
+ icon: <Icons.SocialIcon network='linkedin' size={SOC_ICON_SIZE + 2} />
61
+ },
62
+ {
63
+ title: '@luxdefi',
64
+ href: 'https://www.youtube.com/@luxdefi',
65
+ icon: <Icons.SocialIcon network='youtube' size={SOC_ICON_SIZE + 2} />
66
+ },
67
+ ] satisfies LinkDef[]
@@ -0,0 +1,37 @@
1
+ import type { LinkDef } from '../../types'
2
+
3
+ export default [
4
+ {
5
+ title: 'Company',
6
+ href: "https://lux.partners/",
7
+ variant: 'linkFG',
8
+ newTab: false,
9
+ },
10
+ {
11
+ title: 'About',
12
+ href: 'https://lux.partners',
13
+ newTab: false,
14
+ },
15
+ {
16
+ title: 'Brand',
17
+ href: 'https://drive.google.com/drive/folders/14OJtKLVakGY6883XO9yGbiHtlFxQUUm5?usp=share_link',
18
+ },
19
+ {
20
+ title: 'Careers',
21
+ href: 'https://docs.google.com/document/d/1SCt0Hg7EIs06TootKCA1am1xo4mcXoKF/edit#heading=h.30j0zll',
22
+ newTab: true,
23
+ },
24
+ {
25
+ title: 'Partnerships',
26
+ href: 'https://apply.lux.partners/',
27
+ newTab: false,
28
+ },
29
+ {
30
+ title: 'Press',
31
+ href: 'mailto:ai@lux.partners?subject=%E2%96%BC%20Press',
32
+ },
33
+ {
34
+ title: 'Help',
35
+ href: 'mailto:ai@lux.partners?subject=%E2%96%BC%20Help',
36
+ },
37
+ ] satisfies LinkDef[]
@@ -0,0 +1,37 @@
1
+ import type { LinkDef } from '../../types'
2
+
3
+ export default [
4
+ {
5
+ title: 'Ecosystem',
6
+ href: '',
7
+ variant: 'linkFG'
8
+ },
9
+ {
10
+ title: 'Lux Silver',
11
+ href: 'https://lux.market/silver',
12
+ },
13
+ {
14
+ title: 'Lux Gold',
15
+ href: 'https://lux.market/gold',
16
+ },
17
+ {
18
+ title: 'Lux Credit Card',
19
+ href: 'https://lux.credit',
20
+ },
21
+ {
22
+ title: 'Lux Exchange',
23
+ href: 'https://lux.exchange',
24
+ },
25
+ {
26
+ title: 'Lux Finance',
27
+ href: 'https://lux.finance',
28
+ },
29
+ {
30
+ title: 'Lux Market',
31
+ href: 'https://lux.market',
32
+ },
33
+ {
34
+ title: 'Lux Network',
35
+ href: 'https://lux.network',
36
+ },
37
+ ] satisfies LinkDef[]
@@ -0,0 +1,26 @@
1
+ import type { LinkDef } from '../../types'
2
+
3
+ import ecosystem from './ecosystem'
4
+ import network from './network'
5
+ import company from './company'
6
+ import community from './community'
7
+ import { legal, legalColumn } from './legal'
8
+
9
+
10
+ const common = [
11
+ ecosystem,
12
+ network,
13
+ company,
14
+ community,
15
+ ] satisfies LinkDef[][]
16
+
17
+ export {
18
+ ecosystem,
19
+ network,
20
+ company,
21
+ community,
22
+ legal,
23
+ legalColumn,
24
+ common as default
25
+ }
26
+
@@ -0,0 +1,28 @@
1
+ import type { LinkDef } from '../../types'
2
+
3
+ const legal: LinkDef[] = [
4
+ {
5
+ title: 'Terms and Conditions',
6
+ href: '/assets/standard-docs/LUX-NFT-Terms-and-Conditions.pdf',
7
+ newTab: true,
8
+ },
9
+ {
10
+ title: 'Privacy Policy',
11
+ href: '/assets/standard-docs/LUX-Privacy-Policy.pdf',
12
+ newTab: true,
13
+ },
14
+ ]
15
+
16
+ const title: LinkDef =
17
+ {
18
+ title: 'Legal',
19
+ href: '',
20
+ variant: 'linkFG',
21
+ }
22
+
23
+ const legalColumn: LinkDef[] = [title, ...legal]
24
+
25
+ export {
26
+ legal,
27
+ legalColumn
28
+ }
@@ -0,0 +1,33 @@
1
+ import type { LinkDef } from '../../types'
2
+
3
+ export default [
4
+ {
5
+ title: 'Network',
6
+ href: "https://lux.network/",
7
+ variant: 'linkFG'
8
+ },
9
+ {
10
+ title: 'Lux Bridge',
11
+ href: "https://bridge.lux.network/",
12
+ },
13
+ {
14
+ title: 'Lux Explorer',
15
+ href: "https://explore.lux.network/",
16
+ },
17
+ {
18
+ title: 'Lux Wallet',
19
+ href: "https://wallet.lux.network/",
20
+ },
21
+ {
22
+ title: 'Lux Safe',
23
+ href: "https://safe.lux.network/",
24
+ },
25
+ {
26
+ title: 'Lux Validator',
27
+ href: "https://lux.market/validator/",
28
+ },
29
+ {
30
+ title: 'Open Source',
31
+ href: 'https://github.com/luxdefi',
32
+ },
33
+ ] satisfies LinkDef[]