1
0
Fork 0

refactor: change primary features to timeline, translate to czech

This commit is contained in:
Vojtěch Mareš 2022-12-06 12:10:47 +01:00
parent 26afd703ac
commit f72f20ef8b
Signed by: vojtech.mares
GPG key ID: C6827B976F17240D
8 changed files with 34 additions and 115 deletions

View file

@ -1,62 +1,29 @@
import { useEffect, useState } from 'react'
import Image from 'next/image' import Image from 'next/image'
import { Tab } from '@headlessui/react'
import clsx from 'clsx' import clsx from 'clsx'
import { Container } from '@/components/Container' import { Container } from '@/components/Container'
import backgroundImage from '@/images/background-features.jpg' import backgroundImage from '@/images/background-features.jpg'
import screenshotExpenses from '@/images/screenshots/contacts.png'
import screenshotPayroll from '@/images/screenshots/contacts.png'
import screenshotReporting from '@/images/screenshots/contacts.png'
import screenshotVatReturns from '@/images/screenshots/contacts.png'
const features = [ const steps = [
{ {
title: 'Analyze your needs', name: 'Analýza současného stavu',
description: description: 'Zjistíme kde jsou slabá místa vaší infrastruktury nebo aplikace, a nebo obojího.',
"Set up an environment for your developers to crete, experiment and collaborate with others to develop the best version of your application possible.",
image: screenshotPayroll,
}, },
{ {
title: 'Design a solution', name: 'Návrh řešení',
description: description: 'Navrhnu, jak tato slabá místa odstranit, na co si dát pozor a naplánujeme případné další kroky. ',
"Build an automated pipeline which manages the lifecycle of the application from building, testing up to deploying to production, even on fridays.",
image: screenshotExpenses,
}, },
{ {
title: 'Build it', name: 'Implementace',
description: description: 'Přesunu vaši aplikaci do Kubernetes, ať na vašem vlastním hardware nebo v public cloudu. Celá infrastruktura bude jasně deklarovaná jako kód pomocí Terraformu.',
"We only sell our software to companies who don't deal with VAT at all, so technically we do all the VAT stuff they need.",
image: screenshotVatReturns,
}, },
{ {
title: 'Train your team', name: 'Proškolení vašeho týmu',
description: description: 'Naučím váš tým používat moderní technologie, tak abyste mohli rozvíjet vaší aplikaci a byznys a technologie byly nástrojem k rozvoji, ne břemenem, které s sebou táhnete.',
'Easily export your data into an Excel spreadsheet where you can do whatever the hell you want with it.',
image: screenshotReporting,
}, },
] ]
export function PrimaryFeatures() { export function PrimaryFeatures() {
let [tabOrientation, setTabOrientation] = useState('horizontal')
useEffect(() => {
let lgMediaQuery = window.matchMedia('(min-width: 1024px)')
type MediaQueryChangeProps = { matches: any }
function onMediaQueryChange({ matches }: MediaQueryChangeProps) {
setTabOrientation(matches ? 'vertical' : 'horizontal')
}
onMediaQueryChange(lgMediaQuery)
lgMediaQuery.addEventListener('change', onMediaQueryChange)
return () => {
lgMediaQuery.removeEventListener('change', onMediaQueryChange)
}
}, [])
return ( return (
<section <section
id="features" id="features"
@ -74,82 +41,34 @@ export function PrimaryFeatures() {
<Container className="relative"> <Container className="relative">
<div className="max-w-2xl md:mx-auto md:text-center xl:max-w-none"> <div className="max-w-2xl md:mx-auto md:text-center xl:max-w-none">
<h2 className="font-display text-3xl tracking-tight text-white sm:text-4xl md:text-5xl"> <h2 className="font-display text-3xl tracking-tight text-white sm:text-4xl md:text-5xl">
From zero to cloud. Z nuly do cloudu.
</h2> </h2>
<p className="mt-6 text-lg tracking-tight text-blue-100"> <p className="mt-6 text-lg tracking-tight text-blue-100">
Well everything you need, from start to finish. Vše co budete potřebovat, od začátku do cíle.
</p> </p>
</div> </div>
<Tab.Group <nav aria-label="Progress">
as="div" <ol role="list" className="overflow-hidden pt-2 mt-20 max-w-3xl mx-auto">
className="mt-16 grid grid-cols-1 items-center gap-y-2 pt-10 sm:gap-y-6 md:mt-20 lg:grid-cols-12 lg:pt-0" {steps.map((step, stepIdx) => (
vertical={tabOrientation === 'vertical'} <li key={step.name} className={clsx(stepIdx !== steps.length - 1 ? 'pb-10' : '', 'relative')}>
> {stepIdx !== steps.length - 1 ? (
{({ selectedIndex }) => ( <div className="absolute top-4 left-6 -ml-px mt-0.5 h-full w-0.5 bg-white" aria-hidden="true" />
<> ) : null}
<div className="-mx-4 flex overflow-x-auto pb-4 sm:mx-0 sm:overflow-visible sm:pb-0 lg:col-span-5"> <div className="group relative flex items-start">
<Tab.List className="relative z-10 flex gap-x-4 whitespace-nowrap px-4 sm:mx-auto sm:px-0 lg:mx-0 lg:block lg:gap-x-0 lg:gap-y-1 lg:whitespace-normal"> <span className="flex h-9 items-center" aria-hidden="true">
{features.map((feature, featureIndex) => ( <span className="relative z-10 flex h-12 w-12 items-center justify-center rounded-full border-2 border-blue-600 bg-white">
<div <span className="h-3 w-3 rounded-full bg-blue-600" />
key={feature.title} </span>
className={clsx( </span>
'group relative rounded-full py-1 px-4 lg:rounded-r-none lg:rounded-l-xl lg:p-6', <span className="ml-4 flex min-w-0 flex-col">
selectedIndex === featureIndex <span className="text-2xl text-white font-normal">{step.name}</span>
? 'bg-white lg:bg-white/10 lg:ring-1 lg:ring-inset lg:ring-white/10' <span className="text-lg text-blue-200">{step.description}</span>
: 'hover:bg-white/10 lg:hover:bg-white/5' </span>
)} </div>
> </li>
<h3> ))}
<Tab </ol>
className={clsx( </nav>
'font-display text-lg [&:not(:focus-visible)]:focus:outline-none',
selectedIndex === featureIndex
? 'text-blue-600 lg:text-white'
: 'text-blue-100 hover:text-white lg:text-white'
)}
>
<span className="absolute inset-0 rounded-full lg:rounded-r-none lg:rounded-l-xl" />
{feature.title}
</Tab>
</h3>
<p
className={clsx(
'mt-2 hidden text-sm lg:block',
selectedIndex === featureIndex
? 'text-white'
: 'text-blue-100 group-hover:text-white'
)}
>
{feature.description}
</p>
</div>
))}
</Tab.List>
</div>
<Tab.Panels className="lg:col-span-7">
{features.map((feature) => (
<Tab.Panel key={feature.title} unmount={false}>
<div className="relative sm:px-6 lg:hidden">
<div className="absolute -inset-x-4 top-[-6.5rem] bottom-[-4.25rem] bg-white/10 ring-1 ring-inset ring-white/10 sm:inset-x-0 sm:rounded-t-xl" />
<p className="relative mx-auto max-w-2xl text-base text-white sm:text-center">
{feature.description}
</p>
</div>
<div className="mt-10 w-[45rem] overflow-hidden rounded-xl bg-slate-50 shadow-xl shadow-blue-900/20 sm:w-auto lg:mt-0 lg:w-[67.8125rem]">
<Image
className="w-full"
src={feature.image}
alt=""
priority
sizes="(min-width: 1024px) 67.8125rem, (min-width: 640px) 100vw, 45rem"
/>
</div>
</Tab.Panel>
))}
</Tab.Panels>
</>
)}
</Tab.Group>
</Container> </Container>
</section> </section>
) )

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

View file

@ -25,7 +25,7 @@ export default function Home() {
<main> <main>
<Header /> <Header />
<Hero /> <Hero />
{/* <PrimaryFeatures /> */} <PrimaryFeatures />
<TechStack /> <TechStack />
<CallToAction /> <CallToAction />
<Environment /> <Environment />