diff --git a/client/src/assets/gruns-swipeable.png b/client/src/assets/gruns-swipeable.png new file mode 100644 index 0000000..97a7a2e Binary files /dev/null and b/client/src/assets/gruns-swipeable.png differ diff --git a/client/src/assets/tetris.png b/client/src/assets/tetris.png new file mode 100644 index 0000000..01dbf81 Binary files /dev/null and b/client/src/assets/tetris.png differ diff --git a/client/src/components/page-layout/PageLayout.module.css b/client/src/components/page-layout/PageLayout.module.css index ef9939e..210db47 100644 --- a/client/src/components/page-layout/PageLayout.module.css +++ b/client/src/components/page-layout/PageLayout.module.css @@ -5,10 +5,30 @@ background-color: var(--surface-purple); overflow: hidden; min-height: 100vh; - display: flex; + display: grid; + grid-template-columns: + minmax(5rem, 1fr) [banner-start] minmax(0, 182.5px) [content-start] minmax( + 0, + 915px + ) + [content-end] minmax(0, 182.5px) [banner-end] minmax(5rem, 1fr); justify-content: center; } +@media (width < 768px) { + /* in small screens, the banner becomes more confined than the content */ + .pageLayout { + grid-template-columns: + 1.5rem [content-start] 1rem + [banner-start] minmax(0, 915px) + [banner-end] 1rem [content-end] 1.5rem; + } +} + +.pageLayout > * { + z-index: 1; +} + .pageLayout::before { content: ""; position: absolute; @@ -41,14 +61,17 @@ .content { position: relative; - max-width: 915px; width: 100%; - margin-inline: 2rem; margin-block: 6rem; z-index: 1; + grid-column: content; +} + +.content.noMarginTop { + margin-top: 0; } -.hero { +.intro { display: flex; flex-direction: column; align-items: center; @@ -57,10 +80,10 @@ margin-bottom: var(--bolt-space-8); } -.hero h1 { +.intro h1 { text-align: center; } -.hero p { +.intro p { text-align: center; } diff --git a/client/src/components/page-layout/PageLayout.tsx b/client/src/components/page-layout/PageLayout.tsx index 1450265..0c57ddc 100644 --- a/client/src/components/page-layout/PageLayout.tsx +++ b/client/src/components/page-layout/PageLayout.tsx @@ -2,7 +2,7 @@ import type { JSX } from "preact/jsx-runtime"; import styles from "./PageLayout.module.css"; export interface PageLayoutProps { - children: JSX.Element; + children: JSX.Element | JSX.Element[]; } function PageLayoutRoot({ children }: PageLayoutProps) { @@ -11,21 +11,27 @@ function PageLayoutRoot({ children }: PageLayoutProps) { export interface PageLayoutContentProps { children: JSX.Element | JSX.Element[]; + noMarginTop?: boolean; } -function Content({ children }: PageLayoutContentProps) { - return
{children}
; +function Content({ children, noMarginTop }: PageLayoutContentProps) { + return ( +
+ {children} +
+ ); } export interface PageLayoutHeroProps { children: JSX.Element | JSX.Element[]; } -function Hero({ children }: PageLayoutHeroProps) { - return
{children}
; +function Intro({ children }: PageLayoutHeroProps) { + return
{children}
; } export const PageLayout = Object.assign(PageLayoutRoot, { - Hero, + Intro, Content, }); diff --git a/client/src/design/heading/Heading.module.css b/client/src/design/heading/Heading.module.css index 5ba5f37..7ced947 100644 --- a/client/src/design/heading/Heading.module.css +++ b/client/src/design/heading/Heading.module.css @@ -1,15 +1,17 @@ .heading1 { font-size: var(--bolt-font-heading-1-size); - line-height: 1.2; + line-height: var(--bolt-font-heading-1-line-height); font-weight: var(--bolt-font-heading-1-weight); margin-block: 0; } .heading1.large { font-size: var(--bolt-font-heading-1-large-size); + line-height: var(--bolt-font-heading-1-large-line-height); } .heading1.xlarge { font-size: var(--bolt-font-heading-1-xlarge-size); + line-height: var(--bolt-font-heading-1-xlarge-line-height); } .heading2 { diff --git a/client/src/pages/products/Product.module.css b/client/src/pages/products/Product.module.css index d0e1b03..2716e06 100644 --- a/client/src/pages/products/Product.module.css +++ b/client/src/pages/products/Product.module.css @@ -1,3 +1,48 @@ +.hero { + display: grid; + grid-template-columns: 1fr max-content; + gap: 6rem; + + padding: 7.5rem 4.5rem; + grid-column: banner; + background-color: var(--bolt-surface-informative); + border-radius: var(--bolt-border-radius-lg); + margin-top: 3rem; + margin-bottom: 8rem; +} + +@media (width < 992px) { + .hero { + grid-template-columns: 1fr; + padding: 2.5rem 1.5rem; + margin-top: 2rem; + margin-bottom: 4rem; + } +} + +.heroContent { + display: flex; + flex-direction: column; + gap: var(--bolt-space-2); + justify-content: center; +} + +.heroSample { + display: flex; + align-items: center; +} + +.heroGame { + height: 380px; + z-index: 1; +} + +.heroAd { + height: 430px; + margin-left: -45px; + border-radius: var(--bolt-border-radius-lg); +} + .preview { display: flex; align-items: center; diff --git a/client/src/pages/products/Products.tsx b/client/src/pages/products/Products.tsx index a12d6d8..91c261c 100644 --- a/client/src/pages/products/Products.tsx +++ b/client/src/pages/products/Products.tsx @@ -19,6 +19,9 @@ import IconCheckoutProduct from "../../assets/icon-checkout-product.png"; import PreviewCheckoutProduct from "../../assets/preview-checkout-product.png"; import PreviewCheckoutGame from "../../assets/preview-checkout-game.png"; +import GrunsSwipeable from "../../assets/gruns-swipeable.png"; +import tetris from "../../assets/tetris.png"; + import styles from "./Product.module.css"; import { Heading1 } from "../../design/heading/Heading"; import { TextBlock } from "../../design/text-block/TextBlock"; @@ -29,8 +32,29 @@ import { CheckoutAction } from "./ad-action/CheckoutAction"; export default function Products() { return ( - - +
+
+ Reach New Audiences with Gaming Ads + + Connect your brand with millions of customers through rewarded + in-game ads. Turning playtime into measurable revenue. + +
+
+ Tetris Ad Preview + Gruns Swipeable Ad Preview +
+
+ + Explore the different products BoltPlay offers within gaming -
+ - + Developer SDKs Integrate ads into your game to generate additional revenue - +
diff --git a/client/vite.config.ts b/client/vite.config.ts index 5d164f7..b20f420 100644 --- a/client/vite.config.ts +++ b/client/vite.config.ts @@ -25,6 +25,7 @@ export default defineConfig(({ mode }) => { allowedHosts: [ 'localhost', '.ngrok.io', + '.ngrok.app', 'dev.bolt.me', ] }