@luxfi/core 5.2.12 → 5.2.13
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.
- 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 +21 -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.13",
|
|
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
|
+
}
|