@luxfi/core 5.2.12 → 5.2.14
Sign up to get free protection for your applications and to get access to all the features.
- package/commerce/ui/conf.ts +13 -13
- package/commerce/ui/context.tsx +126 -126
- package/commerce/ui/store.ts +304 -304
- package/components/access-code-input.tsx +71 -71
- package/components/auth/auth-listener.tsx +29 -29
- package/components/auth/auth-token/clear-auth-token.tsx +12 -12
- package/components/auth/auth-token/set-auth-token.tsx +16 -16
- package/components/auth/common-auth-domains.ts +16 -16
- package/components/auth/login-panel.tsx +107 -107
- package/components/back-button.tsx +42 -42
- package/components/chat-widget.tsx +85 -85
- package/components/commerce/add-widget.tsx +20 -20
- package/components/commerce/bag-button.tsx +98 -98
- package/components/commerce/buy-button.tsx +34 -34
- package/components/commerce/checkout-button.tsx +129 -129
- package/components/commerce/checkout-panel/dt-bag-carousel.tsx +36 -36
- package/components/commerce/checkout-panel/dt-checkout-panel.tsx +84 -84
- package/components/commerce/checkout-panel/index.tsx +129 -129
- package/components/commerce/checkout-panel/links-row.tsx +21 -21
- package/components/commerce/checkout-panel/mb-checkout-panel.tsx +54 -54
- package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
- package/components/commerce/checkout-panel/thank-you.tsx +18 -18
- package/components/commerce/checkout-widget/const.ts +13 -13
- package/components/commerce/checkout-widget/index.tsx +192 -192
- package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
- package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -58
- package/components/commerce/desktop-bag-popup.tsx +78 -78
- package/components/commerce/desktop-nav-menu.tsx +130 -130
- package/components/commerce/drawer/index.tsx +99 -99
- package/components/commerce/drawer/micro.tsx +144 -144
- package/components/commerce/drawer/shell.tsx +85 -85
- package/components/commerce/mobile-bag-drawer.tsx +51 -51
- package/components/commerce/mobile-login-button.tsx +101 -101
- package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
- package/components/commerce/mobile-nav-menu-ai.tsx +48 -48
- package/components/commerce/mobile-nav-menu-item.tsx +49 -49
- package/components/commerce/mobile-nav-menu.tsx +101 -101
- package/components/contact-dialog/contact-form.tsx +113 -113
- package/components/contact-dialog/disclaimer.tsx +13 -13
- package/components/contact-dialog/index.tsx +64 -64
- package/components/copyright.tsx +17 -21
- package/components/drawer-margin.tsx +25 -25
- package/components/footer.tsx +77 -77
- package/components/header/desktop.tsx +50 -50
- package/components/header/index.tsx +52 -52
- package/components/header/mobile.tsx +163 -163
- package/components/header/theme-toggle.tsx +26 -26
- package/components/icons/24k-gold-card.tsx +43 -43
- package/components/icons/ai-chat-act.tsx +47 -47
- package/components/icons/ai-chat.tsx +29 -29
- package/components/icons/anodized-titanium.tsx +45 -45
- package/components/icons/avatar.tsx +11 -11
- package/components/icons/bag-icon.tsx +10 -10
- package/components/icons/blog-act.tsx +14 -14
- package/components/icons/blog.tsx +20 -20
- package/components/icons/bridge-act.tsx +18 -18
- package/components/icons/bridge.tsx +68 -68
- package/components/icons/changelog-act.tsx +15 -15
- package/components/icons/changelog.tsx +21 -21
- package/components/icons/chrome.tsx +45 -45
- package/components/icons/coins-act.tsx +29 -29
- package/components/icons/coins.tsx +20 -20
- package/components/icons/compare-cards-act.tsx +30 -30
- package/components/icons/compare-cards.tsx +21 -21
- package/components/icons/credit-act.tsx +29 -29
- package/components/icons/credit.tsx +20 -20
- package/components/icons/customer-support-act.tsx +27 -27
- package/components/icons/customer-support.tsx +21 -21
- package/components/icons/customers-act.tsx +65 -65
- package/components/icons/customers.tsx +33 -33
- package/components/icons/developer-docs-act.tsx +26 -26
- package/components/icons/developer-docs.tsx +20 -20
- package/components/icons/exchange-act.tsx +27 -27
- package/components/icons/exchange.tsx +21 -21
- package/components/icons/explorer-act.tsx +27 -27
- package/components/icons/explorer.tsx +22 -22
- package/components/icons/faqs-act.tsx +27 -27
- package/components/icons/faqs.tsx +21 -21
- package/components/icons/github.tsx +14 -14
- package/components/icons/guides-act.tsx +26 -26
- package/components/icons/guides.tsx +21 -21
- package/components/icons/gun-metal.tsx +44 -44
- package/components/icons/index.tsx +43 -43
- package/components/icons/integrations-act.tsx +41 -41
- package/components/icons/integrations.tsx +25 -25
- package/components/icons/irradescent.tsx +41 -41
- package/components/icons/launch-subnet.tsx +21 -21
- package/components/icons/launchsubnet-act.tsx +29 -29
- package/components/icons/left-arrow.tsx +11 -11
- package/components/icons/lux-finance-act.tsx +34 -34
- package/components/icons/lux-finance.tsx +23 -23
- package/components/icons/lux-logo.tsx +10 -10
- package/components/icons/lux-pass-act.tsx +41 -41
- package/components/icons/lux-pass.tsx +25 -25
- package/components/icons/lux-quests-act.tsx +15 -15
- package/components/icons/lux-quests.tsx +21 -21
- package/components/icons/market-act.tsx +39 -39
- package/components/icons/market.tsx +24 -24
- package/components/icons/mirrored-titanium.tsx +46 -46
- package/components/icons/more-benefits-act.tsx +29 -29
- package/components/icons/more-benefits.tsx +21 -21
- package/components/icons/open-source-act.tsx +41 -41
- package/components/icons/open-source.tsx +26 -26
- package/components/icons/right-arrow.tsx +10 -10
- package/components/icons/safe-act.tsx +77 -77
- package/components/icons/safe.tsx +37 -37
- package/components/icons/search.tsx +12 -12
- package/components/icons/secure-delivery.tsx +13 -13
- package/components/icons/shop-act.tsx +29 -29
- package/components/icons/shop.tsx +20 -20
- package/components/icons/social-icon.tsx +35 -35
- package/components/icons/social-svg.css +3 -3
- package/components/icons/sterling-silver-card.tsx +44 -44
- package/components/icons/templates-act.tsx +29 -29
- package/components/icons/templates.tsx +21 -21
- package/components/icons/validators-act.tsx +42 -42
- package/components/icons/validators.tsx +41 -41
- package/components/icons/view-all-card-act.tsx +28 -28
- package/components/icons/view-all-card.tsx +20 -20
- package/components/icons/wallet-act.tsx +29 -29
- package/components/icons/wallet.tsx +20 -20
- package/components/icons/warpcast.tsx +58 -58
- package/components/icons/youtube-logo.tsx +59 -59
- package/components/index.ts +27 -27
- package/components/logo.tsx +89 -89
- package/components/main.tsx +27 -27
- package/components/mini-chart/index.tsx +7 -7
- package/components/mini-chart/mini-chart-props.ts +43 -43
- package/components/mini-chart/mini-chart.tsx +85 -85
- package/components/mini-chart/wrapper.tsx +23 -23
- package/components/not-found/index.tsx +28 -28
- package/components/not-found/not-found-content.mdx +5 -5
- package/components/scripts.tsx +24 -24
- package/components/tooltip.tsx +31 -31
- package/environment.d.ts +5 -5
- package/next/analytics/fpixel.ts +15 -15
- package/next/analytics/google-analytics.ts +13 -13
- package/next/analytics/index.ts +3 -3
- package/next/analytics/pixel-analytics.tsx +54 -54
- package/next/font/get-app-router-font-classes.ts +12 -12
- package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
- package/next/font/next-font-desc.ts +27 -27
- package/next/font/pages-router-font-vars.tsx +18 -18
- package/next/head-metadata/from-next/metadata-types.ts +158 -158
- package/next/head-metadata/from-next/opengraph-types.ts +267 -267
- package/next/head-metadata/from-next/twitter-types.ts +92 -92
- package/next/head-metadata/index.tsx +208 -208
- package/next/middleware/determine-device-mw.ts +16 -16
- package/package.json +79 -79
- package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
- package/root-layout/index.tsx +112 -112
- package/server-actions/firebase-app.ts +14 -14
- package/server-actions/index.ts +5 -5
- package/server-actions/store-contact.ts +51 -51
- package/site-def/footer/community.tsx +67 -67
- package/site-def/footer/company.ts +37 -37
- package/site-def/footer/ecosystem.ts +37 -37
- package/site-def/footer/index.tsx +26 -26
- package/site-def/footer/legal.ts +28 -28
- package/site-def/footer/network.ts +45 -45
- package/site-def/footer/svg/warpcast-logo.svg +11 -11
- package/site-def/index.ts +2 -2
- package/site-def/main-nav.tsx +458 -458
- package/style/cart-animation.css +29 -29
- package/style/checkout-animation.css +23 -23
- package/style/drawer-handle-overrides.css +160 -160
- package/style/lux-colors.css +85 -85
- package/style/lux-global.css +47 -47
- package/tailwind/fontFamily.tailwind.lux.ts +18 -18
- package/tailwind/index.ts +2 -2
- package/tailwind/lux-tw-fonts.ts +39 -39
- package/tailwind/tailwind.config.lux-preset.ts +10 -10
- package/tsconfig.json +15 -15
- package/types/chatbot-config.ts +6 -6
- package/types/chatbot-suggested-question.ts +7 -7
- package/types/contact-info.ts +10 -10
- package/types/index.ts +4 -4
- package/types/site-def.ts +43 -43
package/package.json
CHANGED
@@ -1,79 +1,79 @@
|
|
1
|
-
{
|
2
|
-
"name": "@luxfi/core",
|
3
|
-
"version": "5.2.
|
4
|
-
"description": "Library that contains shared UI primitives, support for a common design system, and other boilerplate support.",
|
5
|
-
"publishConfig": {
|
6
|
-
"registry": "https://registry.npmjs.org/",
|
7
|
-
"access": "public",
|
8
|
-
"scope": "@luxfi"
|
9
|
-
},
|
10
|
-
"repository": {
|
11
|
-
"type": "git",
|
12
|
-
"url": "git+https://github.com/luxfi/web.git",
|
13
|
-
"directory": "packages/core"
|
14
|
-
},
|
15
|
-
"keywords": [
|
16
|
-
"components",
|
17
|
-
"radix-ui",
|
18
|
-
"hanzo",
|
19
|
-
"luxdefi"
|
20
|
-
],
|
21
|
-
"scripts": {
|
22
|
-
"lat": "npm show @luxfi/core version",
|
23
|
-
"pub": "npm publish",
|
24
|
-
"build": "tsc",
|
25
|
-
"tc": "tsc",
|
26
|
-
"clean": "rm -rf node_modules"
|
27
|
-
},
|
28
|
-
"exports": {
|
29
|
-
".": "./components/index.ts",
|
30
|
-
"./commerce": "./commerce/ui/context.tsx",
|
31
|
-
"./root-layout": "./root-layout/index.tsx",
|
32
|
-
"./server-actions": "./server-actions/index.ts",
|
33
|
-
"./next": "./next/index.ts",
|
34
|
-
"./style/": "./style/",
|
35
|
-
"./site-def": "./site-def/index.ts",
|
36
|
-
"./tailwind": "./tailwind/index.ts"
|
37
|
-
},
|
38
|
-
"dependencies": {
|
39
|
-
"@next/third-parties": "^14.1.0",
|
40
|
-
"@types/node": "^20.12.12",
|
41
|
-
"cookies-next": "^4.1.1",
|
42
|
-
"date-fns": "^3.6.0",
|
43
|
-
"embla-carousel-autoplay": "^8.1.1",
|
44
|
-
"firebase": "10.12.0",
|
45
|
-
"react-device-detect": "^2.2.3",
|
46
|
-
"react-social-icons": "^6.4.0",
|
47
|
-
"react-tooltip": "^5.26.4",
|
48
|
-
"request": "^2.88.2",
|
49
|
-
"usehooks-ts": "^3.1.0"
|
50
|
-
},
|
51
|
-
"peerDependencies": {
|
52
|
-
"@hanzo/auth": "*",
|
53
|
-
"@hanzo/commerce": "*",
|
54
|
-
"@hanzo/ui": "*",
|
55
|
-
"@hookform/resolvers": "^3.3.2",
|
56
|
-
"lucide-react": "^0.344.0",
|
57
|
-
"mobx": "^6.12.3",
|
58
|
-
"mobx-react-lite": "^4.0.7",
|
59
|
-
"next": "14.2.3",
|
60
|
-
"next-themes": "^0.2.1",
|
61
|
-
"react": "*",
|
62
|
-
"react-dom": "*",
|
63
|
-
"react-hook-form": "^7.51.4",
|
64
|
-
"validator": "^13.11.0",
|
65
|
-
"zod": "3.23.8"
|
66
|
-
},
|
67
|
-
"devDependencies": {
|
68
|
-
"@mdx-js/loader": "^3.0.0",
|
69
|
-
"@mdx-js/react": "^3.0.0",
|
70
|
-
"@types/facebook-pixel": "^0.0.30",
|
71
|
-
"@types/gtag.js": "^0.0.19",
|
72
|
-
"@types/mdx": "^2.0.9",
|
73
|
-
"@types/node": "^20.11.24",
|
74
|
-
"@types/react": "*",
|
75
|
-
"@types/react-dom": "*",
|
76
|
-
"tailwindcss": "^3.4.3",
|
77
|
-
"typescript": "5.4.5"
|
78
|
-
}
|
79
|
-
}
|
1
|
+
{
|
2
|
+
"name": "@luxfi/core",
|
3
|
+
"version": "5.2.14",
|
4
|
+
"description": "Library that contains shared UI primitives, support for a common design system, and other boilerplate support.",
|
5
|
+
"publishConfig": {
|
6
|
+
"registry": "https://registry.npmjs.org/",
|
7
|
+
"access": "public",
|
8
|
+
"scope": "@luxfi"
|
9
|
+
},
|
10
|
+
"repository": {
|
11
|
+
"type": "git",
|
12
|
+
"url": "git+https://github.com/luxfi/web.git",
|
13
|
+
"directory": "packages/core"
|
14
|
+
},
|
15
|
+
"keywords": [
|
16
|
+
"components",
|
17
|
+
"radix-ui",
|
18
|
+
"hanzo",
|
19
|
+
"luxdefi"
|
20
|
+
],
|
21
|
+
"scripts": {
|
22
|
+
"lat": "npm show @luxfi/core version",
|
23
|
+
"pub": "npm publish",
|
24
|
+
"build": "tsc",
|
25
|
+
"tc": "tsc",
|
26
|
+
"clean": "rm -rf node_modules"
|
27
|
+
},
|
28
|
+
"exports": {
|
29
|
+
".": "./components/index.ts",
|
30
|
+
"./commerce": "./commerce/ui/context.tsx",
|
31
|
+
"./root-layout": "./root-layout/index.tsx",
|
32
|
+
"./server-actions": "./server-actions/index.ts",
|
33
|
+
"./next": "./next/index.ts",
|
34
|
+
"./style/": "./style/",
|
35
|
+
"./site-def": "./site-def/index.ts",
|
36
|
+
"./tailwind": "./tailwind/index.ts"
|
37
|
+
},
|
38
|
+
"dependencies": {
|
39
|
+
"@next/third-parties": "^14.1.0",
|
40
|
+
"@types/node": "^20.12.12",
|
41
|
+
"cookies-next": "^4.1.1",
|
42
|
+
"date-fns": "^3.6.0",
|
43
|
+
"embla-carousel-autoplay": "^8.1.1",
|
44
|
+
"firebase": "10.12.0",
|
45
|
+
"react-device-detect": "^2.2.3",
|
46
|
+
"react-social-icons": "^6.4.0",
|
47
|
+
"react-tooltip": "^5.26.4",
|
48
|
+
"request": "^2.88.2",
|
49
|
+
"usehooks-ts": "^3.1.0"
|
50
|
+
},
|
51
|
+
"peerDependencies": {
|
52
|
+
"@hanzo/auth": "*",
|
53
|
+
"@hanzo/commerce": "*",
|
54
|
+
"@hanzo/ui": "*",
|
55
|
+
"@hookform/resolvers": "^3.3.2",
|
56
|
+
"lucide-react": "^0.344.0",
|
57
|
+
"mobx": "^6.12.3",
|
58
|
+
"mobx-react-lite": "^4.0.7",
|
59
|
+
"next": "14.2.3",
|
60
|
+
"next-themes": "^0.2.1",
|
61
|
+
"react": "*",
|
62
|
+
"react-dom": "*",
|
63
|
+
"react-hook-form": "^7.51.4",
|
64
|
+
"validator": "^13.11.0",
|
65
|
+
"zod": "3.23.8"
|
66
|
+
},
|
67
|
+
"devDependencies": {
|
68
|
+
"@mdx-js/loader": "^3.0.0",
|
69
|
+
"@mdx-js/react": "^3.0.0",
|
70
|
+
"@types/facebook-pixel": "^0.0.30",
|
71
|
+
"@types/gtag.js": "^0.0.19",
|
72
|
+
"@types/mdx": "^2.0.9",
|
73
|
+
"@types/node": "^20.11.24",
|
74
|
+
"@types/react": "*",
|
75
|
+
"@types/react-dom": "*",
|
76
|
+
"tailwindcss": "^3.4.3",
|
77
|
+
"typescript": "5.4.5"
|
78
|
+
}
|
79
|
+
}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
Unwise to have this in a barrel / index file that is mostly imported by a Client Component.
|
1
|
+
Unwise to have this in a barrel / index file that is mostly imported by a Client Component.
|
2
2
|
Creates Next / SSR issues
|
package/root-layout/index.tsx
CHANGED
@@ -1,112 +1,112 @@
|
|
1
|
-
import React, { type PropsWithChildren } from 'react'
|
2
|
-
import type { Viewport } from 'next'
|
3
|
-
|
4
|
-
import { Toaster } from '@hanzo/ui/primitives'
|
5
|
-
import { AuthServiceProvider } from '@hanzo/auth/service'
|
6
|
-
import { getUserServerSide } from '@hanzo/auth/server'
|
7
|
-
import type { AuthServiceConf } from '@hanzo/auth/types'
|
8
|
-
import { CommerceProvider } from '@hanzo/commerce'
|
9
|
-
|
10
|
-
import getAppRouterBodyFontClasses from '../next/font/get-app-router-font-classes'
|
11
|
-
import { FacebookPixelHead } from '../next/analytics/pixel-analytics'
|
12
|
-
|
13
|
-
import { CommerceUIProvider } from '../commerce/ui/context'
|
14
|
-
import { AuthListener, ChatWidget, Header, Scripts } from '../components'
|
15
|
-
|
16
|
-
import CommerceDrawer from '../components/commerce/drawer'
|
17
|
-
|
18
|
-
import type SiteDef from '../types/site-def'
|
19
|
-
|
20
|
-
import '../style/lux-global.css'
|
21
|
-
import '../style/cart-animation.css'
|
22
|
-
import '../style/checkout-animation.css'
|
23
|
-
|
24
|
-
|
25
|
-
// Next 14: https://nextjs.org/docs/app/building-your-application/upgrading/codemods#use-viewport-export
|
26
|
-
const viewport = {
|
27
|
-
themeColor: [
|
28
|
-
{ media: '(prefers-color-scheme: light)', color: 'white' },
|
29
|
-
{ media: '(prefers-color-scheme: dark)', color: 'black' },
|
30
|
-
],
|
31
|
-
} satisfies Viewport
|
32
|
-
|
33
|
-
/*
|
34
|
-
These '.variable' fields are actually autogenerate css classnames that *define* the actual
|
35
|
-
css variables ('--<ugly-name>') that one asks for in the tailwind classes.
|
36
|
-
They are what make them available in the global scope. So this MUST
|
37
|
-
be done like this for the tailwind font classes to work.
|
38
|
-
|
39
|
-
(...not to be confused with the css var itself. This field should be named something else!)
|
40
|
-
*/
|
41
|
-
|
42
|
-
/*
|
43
|
-
re body: overflow-y-hidden overflow-x-hidden, h-full
|
44
|
-
We cannot have these on body tag for scroll-snap to work on iOS!
|
45
|
-
*/
|
46
|
-
const bodyClasses =
|
47
|
-
'bg-background text-foreground flex flex-col min-h-full overflow-x-hidden ' +
|
48
|
-
getAppRouterBodyFontClasses()
|
49
|
-
|
50
|
-
async function RootLayout({
|
51
|
-
showHeader = false,
|
52
|
-
chatbot = false,
|
53
|
-
siteDef,
|
54
|
-
children,
|
55
|
-
} : {
|
56
|
-
siteDef: SiteDef
|
57
|
-
showHeader?: boolean
|
58
|
-
chatbot?: boolean
|
59
|
-
} & PropsWithChildren) {
|
60
|
-
|
61
|
-
const currentUser = await getUserServerSide()
|
62
|
-
|
63
|
-
const Guts: React.FC = () => (<>
|
64
|
-
{showHeader && <Header siteDef={siteDef}/>}
|
65
|
-
{children}
|
66
|
-
{chatbot && (<ChatWidget
|
67
|
-
title='LUX'
|
68
|
-
subtitle='AI'
|
69
|
-
chatbotUrl='https://lux.chat/?isIframe=true'
|
70
|
-
suggestedQuestions={siteDef.chatbot?.suggestedQuestions ?? []}
|
71
|
-
buttonClx='hidden md:block'
|
72
|
-
/>)}
|
73
|
-
</>)
|
74
|
-
|
75
|
-
return (
|
76
|
-
<html lang='en' suppressHydrationWarning className='hanzo-ui-dark-theme' style={{backgroundColor: '#000'}}>
|
77
|
-
<head >
|
78
|
-
{/* https://stackoverflow.com/a/75716588/11645689 */ }
|
79
|
-
<base target='_blank' />
|
80
|
-
<FacebookPixelHead/>
|
81
|
-
</head>
|
82
|
-
|
83
|
-
<body className={bodyClasses} style={{
|
84
|
-
|
85
|
-
// As also noted above, 'overflow: hidden' on the <body> tag breaks scroll snap!
|
86
|
-
display: 'none', // see scripts.tsx // :aa concerned about this.
|
87
|
-
|
88
|
-
}}>
|
89
|
-
<Scripts/>
|
90
|
-
<AuthServiceProvider user={currentUser} conf={{} as AuthServiceConf}>
|
91
|
-
{siteDef?.commerce ? (
|
92
|
-
<CommerceProvider config={siteDef.commerce!} >
|
93
|
-
<CommerceUIProvider >
|
94
|
-
<Guts />
|
95
|
-
<CommerceDrawer />
|
96
|
-
</CommerceUIProvider>
|
97
|
-
</CommerceProvider>
|
98
|
-
) : (
|
99
|
-
<Guts />
|
100
|
-
)}
|
101
|
-
<AuthListener/>
|
102
|
-
</AuthServiceProvider>
|
103
|
-
<Toaster position='top-center' duration={3000}/>
|
104
|
-
</body>
|
105
|
-
</html>
|
106
|
-
)
|
107
|
-
}
|
108
|
-
|
109
|
-
export {
|
110
|
-
RootLayout,
|
111
|
-
viewport
|
112
|
-
}
|
1
|
+
import React, { type PropsWithChildren } from 'react'
|
2
|
+
import type { Viewport } from 'next'
|
3
|
+
|
4
|
+
import { Toaster } from '@hanzo/ui/primitives'
|
5
|
+
import { AuthServiceProvider } from '@hanzo/auth/service'
|
6
|
+
import { getUserServerSide } from '@hanzo/auth/server'
|
7
|
+
import type { AuthServiceConf } from '@hanzo/auth/types'
|
8
|
+
import { CommerceProvider } from '@hanzo/commerce'
|
9
|
+
|
10
|
+
import getAppRouterBodyFontClasses from '../next/font/get-app-router-font-classes'
|
11
|
+
import { FacebookPixelHead } from '../next/analytics/pixel-analytics'
|
12
|
+
|
13
|
+
import { CommerceUIProvider } from '../commerce/ui/context'
|
14
|
+
import { AuthListener, ChatWidget, Header, Scripts } from '../components'
|
15
|
+
|
16
|
+
import CommerceDrawer from '../components/commerce/drawer'
|
17
|
+
|
18
|
+
import type SiteDef from '../types/site-def'
|
19
|
+
|
20
|
+
import '../style/lux-global.css'
|
21
|
+
import '../style/cart-animation.css'
|
22
|
+
import '../style/checkout-animation.css'
|
23
|
+
|
24
|
+
|
25
|
+
// Next 14: https://nextjs.org/docs/app/building-your-application/upgrading/codemods#use-viewport-export
|
26
|
+
const viewport = {
|
27
|
+
themeColor: [
|
28
|
+
{ media: '(prefers-color-scheme: light)', color: 'white' },
|
29
|
+
{ media: '(prefers-color-scheme: dark)', color: 'black' },
|
30
|
+
],
|
31
|
+
} satisfies Viewport
|
32
|
+
|
33
|
+
/*
|
34
|
+
These '.variable' fields are actually autogenerate css classnames that *define* the actual
|
35
|
+
css variables ('--<ugly-name>') that one asks for in the tailwind classes.
|
36
|
+
They are what make them available in the global scope. So this MUST
|
37
|
+
be done like this for the tailwind font classes to work.
|
38
|
+
|
39
|
+
(...not to be confused with the css var itself. This field should be named something else!)
|
40
|
+
*/
|
41
|
+
|
42
|
+
/*
|
43
|
+
re body: overflow-y-hidden overflow-x-hidden, h-full
|
44
|
+
We cannot have these on body tag for scroll-snap to work on iOS!
|
45
|
+
*/
|
46
|
+
const bodyClasses =
|
47
|
+
'bg-background text-foreground flex flex-col min-h-full overflow-x-hidden ' +
|
48
|
+
getAppRouterBodyFontClasses()
|
49
|
+
|
50
|
+
async function RootLayout({
|
51
|
+
showHeader = false,
|
52
|
+
chatbot = false,
|
53
|
+
siteDef,
|
54
|
+
children,
|
55
|
+
} : {
|
56
|
+
siteDef: SiteDef
|
57
|
+
showHeader?: boolean
|
58
|
+
chatbot?: boolean
|
59
|
+
} & PropsWithChildren) {
|
60
|
+
|
61
|
+
const currentUser = await getUserServerSide()
|
62
|
+
|
63
|
+
const Guts: React.FC = () => (<>
|
64
|
+
{showHeader && <Header siteDef={siteDef}/>}
|
65
|
+
{children}
|
66
|
+
{chatbot && (<ChatWidget
|
67
|
+
title='LUX'
|
68
|
+
subtitle='AI'
|
69
|
+
chatbotUrl='https://lux.chat/?isIframe=true'
|
70
|
+
suggestedQuestions={siteDef.chatbot?.suggestedQuestions ?? []}
|
71
|
+
buttonClx='hidden md:block'
|
72
|
+
/>)}
|
73
|
+
</>)
|
74
|
+
|
75
|
+
return (
|
76
|
+
<html lang='en' suppressHydrationWarning className='hanzo-ui-dark-theme' style={{backgroundColor: '#000'}}>
|
77
|
+
<head >
|
78
|
+
{/* https://stackoverflow.com/a/75716588/11645689 */ }
|
79
|
+
<base target='_blank' />
|
80
|
+
<FacebookPixelHead/>
|
81
|
+
</head>
|
82
|
+
|
83
|
+
<body className={bodyClasses} style={{
|
84
|
+
|
85
|
+
// As also noted above, 'overflow: hidden' on the <body> tag breaks scroll snap!
|
86
|
+
display: 'none', // see scripts.tsx // :aa concerned about this.
|
87
|
+
|
88
|
+
}}>
|
89
|
+
<Scripts/>
|
90
|
+
<AuthServiceProvider user={currentUser} conf={{} as AuthServiceConf}>
|
91
|
+
{siteDef?.commerce ? (
|
92
|
+
<CommerceProvider config={siteDef.commerce!} >
|
93
|
+
<CommerceUIProvider >
|
94
|
+
<Guts />
|
95
|
+
<CommerceDrawer />
|
96
|
+
</CommerceUIProvider>
|
97
|
+
</CommerceProvider>
|
98
|
+
) : (
|
99
|
+
<Guts />
|
100
|
+
)}
|
101
|
+
<AuthListener/>
|
102
|
+
</AuthServiceProvider>
|
103
|
+
<Toaster position='top-center' duration={3000}/>
|
104
|
+
</body>
|
105
|
+
</html>
|
106
|
+
)
|
107
|
+
}
|
108
|
+
|
109
|
+
export {
|
110
|
+
RootLayout,
|
111
|
+
viewport
|
112
|
+
}
|
@@ -1,14 +1,14 @@
|
|
1
|
-
import { initializeApp, getApps } from 'firebase/app'
|
2
|
-
|
3
|
-
const firebaseConfig = {
|
4
|
-
apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
|
5
|
-
authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
|
6
|
-
projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
|
7
|
-
storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
|
8
|
-
messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
|
9
|
-
appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
|
10
|
-
measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,
|
11
|
-
}
|
12
|
-
|
13
|
-
// Initialize Firebase instance if there isn't one already
|
14
|
-
export default getApps().length === 0 ? initializeApp(firebaseConfig) : getApps()[0]
|
1
|
+
import { initializeApp, getApps } from 'firebase/app'
|
2
|
+
|
3
|
+
const firebaseConfig = {
|
4
|
+
apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
|
5
|
+
authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
|
6
|
+
projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
|
7
|
+
storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
|
8
|
+
messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
|
9
|
+
appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
|
10
|
+
measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,
|
11
|
+
}
|
12
|
+
|
13
|
+
// Initialize Firebase instance if there isn't one already
|
14
|
+
export default getApps().length === 0 ? initializeApp(firebaseConfig) : getApps()[0]
|
package/server-actions/index.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
import storeContact from './store-contact'
|
2
|
-
|
3
|
-
export {
|
4
|
-
storeContact as default
|
5
|
-
}
|
1
|
+
import storeContact from './store-contact'
|
2
|
+
|
3
|
+
export {
|
4
|
+
storeContact as default
|
5
|
+
}
|
@@ -1,51 +1,51 @@
|
|
1
|
-
'use server'
|
2
|
-
|
3
|
-
import {
|
4
|
-
getFirestore,
|
5
|
-
collection,
|
6
|
-
setDoc,
|
7
|
-
doc,
|
8
|
-
serverTimestamp,
|
9
|
-
type Firestore,
|
10
|
-
} from 'firebase/firestore'
|
11
|
-
|
12
|
-
import firebaseApp from './firebase-app'
|
13
|
-
import type { ContactInfo } from '../types'
|
14
|
-
|
15
|
-
let dbInstance: Firestore | undefined = undefined
|
16
|
-
|
17
|
-
const getDBInstance = (name: string): Firestore => {
|
18
|
-
if (!dbInstance) {
|
19
|
-
dbInstance = getFirestore(firebaseApp, name)
|
20
|
-
}
|
21
|
-
return dbInstance
|
22
|
-
}
|
23
|
-
|
24
|
-
const storeContact = async ( formData: ContactInfo, enclosure: any ) => {
|
25
|
-
const email = formData.email
|
26
|
-
const phone = formData.phone
|
27
|
-
const dbName = enclosure?.dbId
|
28
|
-
const tableName = enclosure?.listId
|
29
|
-
|
30
|
-
let error: any | null = null
|
31
|
-
const tableRef = collection(getDBInstance(dbName), tableName)
|
32
|
-
|
33
|
-
try {
|
34
|
-
await setDoc(doc(tableRef, email), {
|
35
|
-
email,
|
36
|
-
phone,
|
37
|
-
timestamp: serverTimestamp(),
|
38
|
-
})
|
39
|
-
return { success: !error, error, id: email }
|
40
|
-
}
|
41
|
-
catch (e) {
|
42
|
-
console.error('Error writing contact info to database: ', e)
|
43
|
-
error = e
|
44
|
-
}
|
45
|
-
|
46
|
-
return { success: !error, error }
|
47
|
-
}
|
48
|
-
|
49
|
-
export {
|
50
|
-
storeContact as default
|
51
|
-
}
|
1
|
+
'use server'
|
2
|
+
|
3
|
+
import {
|
4
|
+
getFirestore,
|
5
|
+
collection,
|
6
|
+
setDoc,
|
7
|
+
doc,
|
8
|
+
serverTimestamp,
|
9
|
+
type Firestore,
|
10
|
+
} from 'firebase/firestore'
|
11
|
+
|
12
|
+
import firebaseApp from './firebase-app'
|
13
|
+
import type { ContactInfo } from '../types'
|
14
|
+
|
15
|
+
let dbInstance: Firestore | undefined = undefined
|
16
|
+
|
17
|
+
const getDBInstance = (name: string): Firestore => {
|
18
|
+
if (!dbInstance) {
|
19
|
+
dbInstance = getFirestore(firebaseApp, name)
|
20
|
+
}
|
21
|
+
return dbInstance
|
22
|
+
}
|
23
|
+
|
24
|
+
const storeContact = async ( formData: ContactInfo, enclosure: any ) => {
|
25
|
+
const email = formData.email
|
26
|
+
const phone = formData.phone
|
27
|
+
const dbName = enclosure?.dbId
|
28
|
+
const tableName = enclosure?.listId
|
29
|
+
|
30
|
+
let error: any | null = null
|
31
|
+
const tableRef = collection(getDBInstance(dbName), tableName)
|
32
|
+
|
33
|
+
try {
|
34
|
+
await setDoc(doc(tableRef, email), {
|
35
|
+
email,
|
36
|
+
phone,
|
37
|
+
timestamp: serverTimestamp(),
|
38
|
+
})
|
39
|
+
return { success: !error, error, id: email }
|
40
|
+
}
|
41
|
+
catch (e) {
|
42
|
+
console.error('Error writing contact info to database: ', e)
|
43
|
+
error = e
|
44
|
+
}
|
45
|
+
|
46
|
+
return { success: !error, error }
|
47
|
+
}
|
48
|
+
|
49
|
+
export {
|
50
|
+
storeContact as default
|
51
|
+
}
|