refactor: change primary features to timeline, translate to czech
This commit is contained in:
parent
26afd703ac
commit
f72f20ef8b
8 changed files with 34 additions and 115 deletions
|
|
@ -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 až 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 |
|
|
@ -25,7 +25,7 @@ export default function Home() {
|
||||||
<main>
|
<main>
|
||||||
<Header />
|
<Header />
|
||||||
<Hero />
|
<Hero />
|
||||||
{/* <PrimaryFeatures /> */}
|
<PrimaryFeatures />
|
||||||
<TechStack />
|
<TechStack />
|
||||||
<CallToAction />
|
<CallToAction />
|
||||||
<Environment />
|
<Environment />
|
||||||
|
|
|
||||||
Reference in a new issue