Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add kubecon landing page #115

Merged
merged 3 commits into from
Oct 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that's not in the google tag manager thing too?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's for cases of user having JS disabled

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

wasn't clear from the docs, and i figure it doesn't hurt to leave it

<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
Loading