Skip to content

Commit

Permalink
add kubecon landing page (#115)
Browse files Browse the repository at this point in the history
* add kubecon landing page

* make responsive

* add google analytics
  • Loading branch information
jsladerman authored Oct 24, 2024
1 parent 12d9eb8 commit 79a82f7
Show file tree
Hide file tree
Showing 15 changed files with 551 additions and 40 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"@loomhq/loom-embed": "1.5.0",
"@markdoc/markdoc": "0.4.0",
"@markdoc/next.js": "0.2.2",
"@next/third-parties": "15.0.1",
"@open-draft/until": "2.1.0",
"@pluralsh/design-system": "3.54.0",
"@react-types/shared": "3.22.0",
Expand Down
2 changes: 2 additions & 0 deletions pages/_app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { type AppProps } from 'next/app'
import NextLink from 'next/link'
import { useRouter } from 'next/router'

import { GoogleTagManager } from '@next/third-parties/google'
import { MarkdocContextProvider } from '@pluralsh/design-system/dist/markdoc'
import { ThemeProvider as StyledThemeProvider } from 'styled-components'
import { SWRConfig } from 'swr'
Expand Down Expand Up @@ -82,6 +83,7 @@ function App({ Component, pageProps }: MyAppProps) {
}
const app = (
<>
<GoogleTagManager gtmId={process.env.NEXT_PUBLIC_GA_ID ?? ''} />
<CssBaseline />
<PluralGlobalStyle />
<GlobalStyles />
Expand Down
26 changes: 11 additions & 15 deletions pages/_document.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,23 +49,19 @@ class MyDocument extends Document {
type="text/javascript"
data-widget-position="bottom-right"
/>
<script
async
src={`https://www.googletagmanager.com/gtag/js?id=${process.env.NEXT_PUBLIC_GA_ID}`}
/>
<script
dangerouslySetInnerHTML={{
__html: `window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('consent', 'default', {ad_storage:'denied', analytics_storage:'denied'});
gtag('set', 'ads_data_redaction', true);
gtag('set', 'url_passthrough', true);
gtag('js', new Date());
gtag('config', '${process.env.NEXT_PUBLIC_GA_ID}');`,
}}
/>
</Head>
<body>
{/* <!-- Google Tag Manager (noscript) --> */}
<noscript>
<iframe
title="Google Tag Manager"
src={`https://www.googletagmanager.com/ns.html?id=${process.env.NEXT_PUBLIC_GA_ID}`}
height="0"
width="0"
style={{ display: 'none', visibility: 'hidden' }}
/>
</noscript>
{/* <!-- End Google Tag Manager (noscript) --> */}
<Main />
<NextScript />
</body>
Expand Down
2 changes: 1 addition & 1 deletion pages/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ export default function Index({
'linear-gradient(to bottom, #0E1015, #747AF6 60%, #102356)',
}}
>
<StandardPageWidth className="pb-xxxxxlarge">
<StandardPageWidth className="pb-xxxxxxlarge">
<QuoteSection
title="Delivering value to DevOps and Platform Engineering teams"
quotes={quotes ?? []}
Expand Down
331 changes: 331 additions & 0 deletions pages/kubecon.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,331 @@
import { Button, CalendarIcon } from '@pluralsh/design-system'
import Image from 'next/image'
import Link from 'next/link'

import styled from 'styled-components'

import { TextColumnWithIcon } from '@src/components/custom-page/MultiColumnText'
import { FooterVariant } from '@src/components/FooterFull'
import { KubeconHeader, handleDownloadICS } from '@src/components/Kubecon'
import { StandardPageWidth } from '@src/components/layout/LayoutHelpers'
import { ImpactCardSection } from '@src/components/page-sections/ImpactCardSection'
import {
Body1,
Hero1,
Hero2,
OverlineLabel,
ResponsiveText,
Title1,
} from '@src/components/Typography'
import getPricing from '@src/data/getPricing'
import { propsWithGlobalSettings } from '@src/utils/getGlobalProps'

export default function KubeCon() {
return (
<div className="bg-[#0F1116]">
<div className="relative opacity-60 transition-opacity lg:opacity-100">
<div
css={`
position: absolute;
top: 260px;
left: 191px;
border-radius: 50%;
background: #17e8a0;
filter: blur(178px);
width: 200px;
height: 200px;
`}
/>
<div
css={`
position: absolute;
top: 200px;
left: 50%;
transform: translateX(-50%);
border-radius: 50%;
background: #7075f5;
filter: blur(178px);
width: 150px;
height: 150px;
@media (max-width: 768px) {
display: none;
}
`}
/>
<div
css={`
position: absolute;
top: 265px;
right: 171px;
border-radius: 50%;
background: #99daff;
filter: blur(178px);
width: 200px;
height: 200px;
`}
/>
<img
src="/images/pricing/pricing-circles.svg"
className="absolute left-1/2 top-[400px] -translate-x-1/2"
/>
</div>
<StandardPageWidth>
<div className="flex flex-col items-center gap-xxlarge py-xxxxxxlarge">
<KubeconHeader />
<div className="flex max-w-3xl flex-col items-center gap-small text-center">
<Hero1>Meet us at KubeCon</Hero1>
<Body1 $color="text-light">
Join Plural at KubeCon North America 2024 in Salt Lake City, UT.
We're excited to showcase our latest solutions that empower
organizations to streamline their Kubernetes deployments and
operations.
</Body1>
</div>
<Button
large
primary
rel="noopener noreferrer"
target="_blank"
as={Link}
href="/contact-sales"
className="mt-medium w-fit"
>
Book a demo
</Button>
</div>
</StandardPageWidth>
<WhereToFindUsSection>
<StandardPageWidth>
<div className="flex flex-col items-center">
<div className="flex flex-col items-center py-xlarge text-center">
<OverlineLabel>Where to find us</OverlineLabel>
<Hero2>
Visit our booth —{' '}
<span className="text-text-primary-accent">R23</span>
</Hero2>
<Body1
$color="text-light"
className="mt-small"
>
Booth R23 is near the CNCF project pavilion, across from the
game zone.
</Body1>
</div>
<Image
className="w-[500px] rounded-large border border-solid border-[#ffffff99]"
src="/images/kubecon/booths-map.jpg"
alt="Booth map"
width={2366}
height={1432}
/>
<div className="flex flex-col gap-xlarge pb-large pt-xxlarge lg:flex-row">
<TextColumnWithIcon
heading="Experience live demos"
bodyText="See Plural in action and explore our platform's capabilities"
icon="StackRun"
/>
<div className="pt-xxlarge">
<TextColumnWithIcon
heading="Meet our experts"
bodyText="Chat with our team and Founders, about your Kubernetes management challenges — and how we can help!"
icon="People"
/>
</div>
<TextColumnWithIcon
heading="Exclusive swag"
bodyText="Swing by and pick up Plural swag we made exclusively for KubeCon 2024"
icon="MagicWand"
/>
</div>
</div>
</StandardPageWidth>
</WhereToFindUsSection>
<StandardPageWidth>
<div className="flex w-full flex-col items-center py-xxxxlarge">
<ImpactCardSection />
<Button
large
primary
rel="noopener noreferrer"
target="_blank"
as={Link}
href="/contact-sales"
>
Book a demo
</Button>
</div>
<div className="flex flex-col gap-xxxlarge pb-xxxxxxlarge pt-xxxxlarge">
<div className="flex flex-col gap-xxxlarge lg:flex-row">
<Image
className="w-full"
src="/images/kubecon/session-info.jpg"
alt="Session info"
width={1600}
height={900}
/>
<div className="flex flex-col gap-medium text-text-light">
<OverlineLabel>Get engaged</OverlineLabel>
<Title1 $color="text">Attend our session</Title1>
<SessionInfoListSC>
Join us for an insightful session where we'll delve into:
<ul>
<br />
<li>
The latest updates from the Kubernetes SIG-UI, focusing on
the evolution of the Kubernetes Dashboard project.
</li>
<li>
A comprehensive overview of key changes, enhancements, and
advancements, including a detailed exploration of the
project's new architecture.
</li>
<li>
The future of Kubernetes management and developer
experience.
</li>
</ul>
</SessionInfoListSC>
<Button
large
primary
className="w-fit"
startIcon={<CalendarIcon />}
onClick={handleDownloadICS}
>
Add session to calendar
</Button>
</div>
</div>
<div
className="border-gray-300 flex flex-col items-center
justify-between gap-large overflow-auto rounded-large
border border-border bg-fill-zero p-xlarge lg:flex-row"
>
<div className="flex flex-col">
<ResponsiveText
textStyles={{ lg: 'mSubtitle1', '': 'mSubtitle2' }}
>
Can't connect in person?
</ResponsiveText>
<ResponsiveText
color="text-light"
textStyles={{ lg: 'mBody1', '': 'mBody2' }}
>
No worries! We have plenty of ways for you to explore Plural.
</ResponsiveText>
</div>
<div className="flex gap-medium">
<Button
secondary
rel="noopener noreferrer"
target="_blank"
as={Link}
href="https://docs.plural.sh/"
>
Read our docs
</Button>
<Button
floating
rel="noopener noreferrer"
target="_blank"
as={Link}
href="https://plural.sh/"
>
Learn more
</Button>
<Button
primary
rel="noopener noreferrer"
target="_blank"
as={Link}
href="https://plural.sh/contact-sales"
>
Book a demo
</Button>
</div>
</div>
</div>
</StandardPageWidth>
<div className="relative w-full border-y border-fill-two bg-[#171A21]">
<RepeatingLogoSC />
<div className="mx-auto flex w-[75%] flex-col items-center justify-center gap-xsmall py-xxxxxlarge text-center">
<OverlineLabel>Learn more</OverlineLabel>
<Hero2>About Plural</Hero2>
<Body1 className="mt-xsmall">
Plural makes enterprise Kubernetes management accessible, efficient,
and cost-effective. Founded to address the operational complexities
of Kubernetes, Plural provides platform engineering and DevOps teams
with a comprehensive suite of tools for managing Kubernetes fleets
at scale.
</Body1>
<Button
className="mt-xlarge"
large
primary
as={Link}
rel="noopener noreferrer"
target="_blank"
href="https://plural.sh/"
>
Learn more about Plural
</Button>
</div>
</div>
</div>
)
}

export const getStaticProps = async () => {
const { data, error } = await getPricing()
const proPlan = data?.pricing_page?.pro_plan
const enterprisePlan = data?.pricing_page?.enterprise_plan

if (!proPlan || !enterprisePlan || error) {
return { notFound: true }
}

return propsWithGlobalSettings({
metaTitle: 'Plural at KubeCon',
metaDescription:
'Join Plural at KubeCon North America 2024 in Salt Lake City, UT.',
footerVariant: FooterVariant.kitchenSink,
})
}

const WhereToFindUsSection = styled.div(({ theme }) => {
const bgGradient = `linear-gradient(180deg, #0E1015 0%, rgba(14, 16, 21, 0.0) 50%, #0E1015 100%),
radial-gradient(81.85% 81.85% at 50% 18.15%, #0E1015 0%, rgba(14, 16, 21, 0.55) 100%)`

return {
padding: `${theme.spacing.xxxxlarge}px 0`,
background: bgGradient,
[`@media (min-width: ${theme.breakpoints.desktopSmall}px)`]: {
background: `${bgGradient}, url(/images/kubecon/booth-bg.jpg) no-repeat center center / cover`,
},
}
})

const RepeatingLogoSC = styled.div`
position: absolute;
inset: 0;
background: url('/favicon-128.png') repeat;
background-size: 64px 64px;
width: 100%;
opacity: 0.025;
`

const SessionInfoListSC = styled.div`
font-family: Inter;
font-size: 16px;
font-style: normal;
font-weight: 300;
line-height: 20px;
letter-spacing: 0.5px;
ul {
list-style: disc;
padding-left: 16px;
}
li {
margin-bottom: 6px;
}
`
Binary file added public/images/kubecon/booth-bg.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/kubecon/booths-map.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/kubecon/session-info.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/kubecon/visit-us.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 79a82f7

Please sign in to comment.