After Width: | Height: | Size: 140 KiB |
After Width: | Height: | Size: 316 KiB |
After Width: | Height: | Size: 326 KiB |
After Width: | Height: | Size: 294 KiB |
After Width: | Height: | Size: 199 KiB |
After Width: | Height: | Size: 261 KiB |
After Width: | Height: | Size: 277 KiB |
After Width: | Height: | Size: 279 KiB |
After Width: | Height: | Size: 296 KiB |
After Width: | Height: | Size: 773 KiB |
After Width: | Height: | Size: 263 KiB |
After Width: | Height: | Size: 318 KiB |
After Width: | Height: | Size: 218 KiB |
After Width: | Height: | Size: 275 KiB |
After Width: | Height: | Size: 428 KiB |
@ -0,0 +1,140 @@ |
||||
import { useState } from 'react'; |
||||
import { cn } from '../../lib/classname.ts'; |
||||
|
||||
const demoItems = [ |
||||
{ |
||||
title: 'Roadmap Editor', |
||||
description: |
||||
'<span class="font-semibold">Powerful editor</span> to create custom roadmaps and other trackable documents', |
||||
image: '/images/team-promo/roadmap-editor.png', |
||||
}, |
||||
{ |
||||
title: 'Invite Members', |
||||
description: |
||||
'Invite your <span class="font-semibold">team members and assign roles</span>', |
||||
image: '/images/team-promo/invite-members.png', |
||||
}, |
||||
{ |
||||
title: 'Track Progress', |
||||
description: |
||||
'You and your team can <span class="font-semibold">track progress</span> on the roadmaps', |
||||
image: '/images/team-promo/update-progress.png', |
||||
}, |
||||
{ |
||||
title: 'Team Dashboard', |
||||
description: |
||||
'Keep an eye on the team progress through <span class="font-semibold">team dashboard</span>', |
||||
image: '/images/team-promo/team-dashboard.png', |
||||
}, |
||||
{ |
||||
title: 'Roadmaps and Documents', |
||||
description: |
||||
'Create as many <span class="font-semibold">roadmaps or trackable documents</span> as you want', |
||||
image: '/images/team-promo/many-roadmaps.png', |
||||
}, |
||||
{ |
||||
title: 'Community Roadmaps', |
||||
description: |
||||
'Create custom roadmaps or customize <span class="font-semibold">community roadmaps</span> to fit your needs', |
||||
image: '/images/team-promo/our-roadmaps.png', |
||||
}, |
||||
{ |
||||
title: 'Sharing Settings', |
||||
description: |
||||
'Share a roadmap or trackable document with <span class="font-semibold">everyone or specific people</span>', |
||||
image: '/images/team-promo/sharing-settings.png', |
||||
}, |
||||
{ |
||||
title: 'More Coming Soon!', |
||||
description: |
||||
'<span class="font-semibold">We have a lot more coming soon!</span>', |
||||
}, |
||||
]; |
||||
|
||||
export function TeamDemo() { |
||||
const [hasViewed, setHasViewed] = useState<number[]>([0]); |
||||
const [activeItem, setActiveItem] = useState(demoItems[0]); |
||||
|
||||
return ( |
||||
<div className="border-t py-12 hidden sm:block"> |
||||
<div className="container"> |
||||
<h2 className="mb-2 text-3xl font-bold">See how it works</h2> |
||||
<p>Here is a sneak peek of what you can do today (more coming soon!)</p> |
||||
|
||||
<div className="relative mt-7 flex flex-row items-center gap-2.5"> |
||||
{demoItems.map((item, counter) => { |
||||
const isActive = item === activeItem; |
||||
const hasAlreadyViewed = hasViewed.includes(counter); |
||||
|
||||
if (!isActive) { |
||||
return ( |
||||
<span key={item.title} className="relative flex items-center"> |
||||
<span |
||||
onClick={() => { |
||||
setHasViewed([ |
||||
...hasViewed, |
||||
counter |
||||
]) |
||||
setActiveItem(item); |
||||
}} |
||||
className={cn('z-50 cursor-pointer rounded-full p-[6px]', { |
||||
'bg-black': item === activeItem, |
||||
'bg-gray-300 hover:bg-gray-400': item !== activeItem, |
||||
})} |
||||
/> |
||||
{!hasAlreadyViewed && <span className="pointer-events-none absolute inline-flex h-full w-full animate-ping rounded-full bg-gray-400 opacity-75"></span> } |
||||
</span> |
||||
); |
||||
} |
||||
|
||||
return ( |
||||
<span key={item.title} className=" rounded-full bg-black px-3 py-0.5 text-sm text-white"> |
||||
{activeItem.title} |
||||
</span> |
||||
); |
||||
})} |
||||
</div> |
||||
<div className="mt-4 overflow-hidden rounded-xl border border-gray-300"> |
||||
<div className="p-3"> |
||||
<p |
||||
className="text-base text-black" |
||||
dangerouslySetInnerHTML={{ __html: activeItem.description }} |
||||
/> |
||||
</div> |
||||
{activeItem.image && ( |
||||
<img |
||||
className="rounded-b-xl border-t" |
||||
src={activeItem.image} |
||||
alt="" |
||||
/> |
||||
)} |
||||
{!activeItem.image && ( |
||||
<div className="bg-gray-50 py-4 pl-3"> |
||||
<p className="mb-3"> |
||||
Register your team now and help us shape the future of teams in |
||||
roadmap.sh! |
||||
</p> |
||||
<div className="flex flex-row items-center gap-2"> |
||||
<a |
||||
href="/signup" |
||||
className="inline-flex items-center justify-center rounded-lg border border-transparent bg-purple-600 px-5 py-2 text-base font-medium text-white hover:bg-purple-700" |
||||
> |
||||
Create your Team |
||||
</a> |
||||
<span className="ml-1 text-base"> |
||||
or |
||||
<a |
||||
href="/login" |
||||
className="text-purple-600 underline hover:text-purple-700" |
||||
> |
||||
Login to your account |
||||
</a> |
||||
</span> |
||||
</div> |
||||
</div> |
||||
)} |
||||
</div> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
@ -0,0 +1,65 @@ |
||||
import { CheckCircle, CheckCircle2, CheckIcon } from 'lucide-react'; |
||||
|
||||
const featureList = [ |
||||
'Invite your team members', |
||||
'Create custom roadmaps for your teams', |
||||
"Plan, track and document your team's skills and growth", |
||||
"Get insights on your team's skills and growth", |
||||
]; |
||||
|
||||
export function TeamHeroBanner() { |
||||
return ( |
||||
<div className="bg-white py-8 lg:py-12"> |
||||
<div className="container"> |
||||
<div className="flex flex-row items-center justify-start text-left lg:justify-between"> |
||||
<div className="flex flex-grow flex-col"> |
||||
<h1 className="mb-0.5 sm:mb-2.5 text-2xl sm:text-4xl font-bold lg:mb-4 lg:text-5xl"> |
||||
Roadmaps for Teams |
||||
</h1> |
||||
<p className="mb-4 text-base leading-normal text-gray-600 sm:mb-0 sm:leading-none lg:text-lg"> |
||||
Train, plan and track your team's skills and career growth. |
||||
</p> |
||||
|
||||
<ul className="mb-4 mt-0 hidden text-sm leading-7 sm:mb-4 sm:mt-4 sm:flex sm:flex-col lg:mb-6 lg:mt-6 lg:text-base lg:leading-8"> |
||||
{featureList.map((feature, index) => ( |
||||
<li key={feature}> |
||||
<CheckCircle className="hidden h-6 w-6 text-green-500 sm:inline-block" /> |
||||
<span className="ml-0 sm:ml-2">{feature}</span> |
||||
</li> |
||||
))} |
||||
</ul> |
||||
|
||||
<div className="flex flex-col items-start gap-2 sm:flex-row sm:items-center"> |
||||
<a |
||||
href="/signup" |
||||
className="flex w-full items-center justify-center rounded-lg border border-transparent bg-purple-600 px-5 py-2 text-sm font-medium text-white hover:bg-blue-700 sm:w-auto sm:text-base" |
||||
> |
||||
Create your Team |
||||
</a> |
||||
<span className="ml-1 hidden text-base sm:inline"> |
||||
or |
||||
<a |
||||
href="/login" |
||||
className="text-purple-600 underline hover:text-purple-700" |
||||
> |
||||
Login to your account |
||||
</a> |
||||
</span> |
||||
<a |
||||
href="/login" |
||||
className="flex w-full items-center justify-center rounded-lg border border-purple-600 px-5 py-2 text-base text-sm font-medium text-purple-600 hover:bg-blue-700 sm:hidden sm:text-base" |
||||
> |
||||
Login to your account |
||||
</a> |
||||
</div> |
||||
</div> |
||||
<img |
||||
alt={'team roadmaps'} |
||||
className="hidden h-64 md:block lg:h-80" |
||||
src="/images/team-promo/hero.png" |
||||
/> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
@ -0,0 +1,80 @@ |
||||
import { Check, CheckCircle, Copy, Sparkles } from 'lucide-react'; |
||||
import { useCopyText } from '../../hooks/use-copy-text.ts'; |
||||
import { cn } from '../../lib/classname.ts'; |
||||
|
||||
export function TeamPricing() { |
||||
const { isCopied, copyText } = useCopyText(); |
||||
const teamEmail = 'teams@roadmap.sh'; |
||||
|
||||
return ( |
||||
<div className="py-4 sm:py-8 md:py-12 border-t"> |
||||
<div className="container"> |
||||
<h2 className="mb-1 sm:mb-1.5 md:mb-2 text-xl sm:text-2xl md:text-3xl font-bold">Beta Pricing</h2> |
||||
<p className="mb-4 sm:mb-8 text-base sm:text-lg text-gray-600"> |
||||
We are currently in beta and are offering free access to all features. |
||||
</p> |
||||
|
||||
<div className="flex flex-col sm:flex-row gap-6 sm:gap-4"> |
||||
<div className="relative flex flex-col items-center justify-center gap-2 overflow-hidden rounded-xl border border-purple-500"> |
||||
<div className="px-8 pb-2 pt-5 sm:pt-4 text-center"> |
||||
<h3 className="mb-1 text-2xl font-bold">Free</h3> |
||||
<p className="text-sm text-gray-500">No credit card required</p> |
||||
<p className="flex items-start justify-center gap-1 py-6 text-3xl"> |
||||
<span className="text-base text-gray-600">$</span> |
||||
<span className="text-5xl font-bold">0</span> |
||||
</p> |
||||
|
||||
<a |
||||
href="/signup" |
||||
className="block rounded-md bg-purple-600 px-6 py-2 text-center text-sm font-medium leading-6 text-white shadow transition hover:bg-gray-700 hover:shadow-lg focus:outline-none" |
||||
> |
||||
Sign up for free |
||||
</a> |
||||
</div> |
||||
<div className="flex w-full flex-col gap-1 border-t px-8 py-5 sm:py-3 text-center"> |
||||
<p className="text-gray-600">Roles and Permissions</p> |
||||
<p className="text-gray-600">Custom Roadmaps</p> |
||||
<p className="text-gray-600">Progress Tracking</p> |
||||
<p className="text-gray-600">Team Insights</p> |
||||
<p className="text-gray-600">Onboarding support</p> |
||||
</div> |
||||
</div> |
||||
<div className="flex py-8 flex-grow flex-col items-center justify-center rounded-md border border-gray-300"> |
||||
<img alt={'waving hand'} src={'/images/team-promo/contact.png'} className="mb-3 h-40" /> |
||||
<p className="mb-2 font-medium text-gray-500"> |
||||
Questions? We are here to help! |
||||
</p> |
||||
<p className="text-gray-600"> |
||||
<button |
||||
onClick={() => { |
||||
copyText(teamEmail); |
||||
}} |
||||
className={cn( |
||||
'relative flex items-center justify-between gap-3 overflow-hidden rounded-md border border-black bg-white px-4 py-2 text-black hover:bg-gray-100' |
||||
)} |
||||
> |
||||
{teamEmail} |
||||
<Copy |
||||
className="relative top-[1px] ml-2 inline-block text-black transition-opacity" |
||||
size={16} |
||||
/> |
||||
|
||||
<span |
||||
className={cn( |
||||
'absolute bottom-0 left-0 right-0 flex items-center justify-center bg-black text-white transition-all', |
||||
{ |
||||
'top-full': !isCopied, |
||||
'top-0': isCopied, |
||||
} |
||||
)} |
||||
> |
||||
Email copied! |
||||
</span> |
||||
</button> |
||||
</p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
@ -0,0 +1,62 @@ |
||||
const toolsList = [ |
||||
{ |
||||
imageUrl: '/images/team-promo/skill-gap.png', |
||||
title: 'Skill gap analysis', |
||||
description: 'Understand the skills of your team and identify gaps.', |
||||
}, |
||||
{ |
||||
imageUrl: '/images/team-promo/growth-plans.png', |
||||
title: 'Growth plans', |
||||
description: 'Prepare shared or individual growth plans for members.', |
||||
}, |
||||
{ |
||||
imageUrl: '/images/team-promo/progress-tracking.png', |
||||
title: 'Progress tracking', |
||||
description: 'Track the and compare the progress of team members.', |
||||
}, |
||||
{ |
||||
imageUrl: '/images/team-promo/team-insights.png', |
||||
title: 'Team insights', |
||||
description: 'Get insights about your team skills, progress and more.', |
||||
}, |
||||
{ |
||||
imageUrl: '/images/team-promo/onboarding.png', |
||||
title: 'Onboarding', |
||||
description: 'Prepare onboarding plans for new team members.', |
||||
}, |
||||
{ |
||||
imageUrl: '/images/team-promo/documentation.png', |
||||
title: 'Documentation', |
||||
description: 'Create and share visual team documentations.', |
||||
}, |
||||
]; |
||||
|
||||
export function TeamTools() { |
||||
return ( |
||||
<div className="py-4 sm:py-8 md:py-12 border-t"> |
||||
<div className="container"> |
||||
<h2 className="mb-1 sm:mb-1.5 md:mb-2 text-xl sm:text-2xl md:text-3xl font-bold">Tools to help you excel</h2> |
||||
<p className='text-sm md:text-base'> |
||||
Skill gap analysis, growth plans, progress tracking, team insights and |
||||
more. |
||||
</p> |
||||
|
||||
<div className="mt-3 sm:mt-5 md:mt-8 grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-2 sm:gap-4"> |
||||
{toolsList.map((tool) => { |
||||
return ( |
||||
<div className="rounded-md sm:rounded-xl border p-2 sm:p-5 text-left sm:text-center md:text-left"> |
||||
<img |
||||
alt={tool.title} |
||||
src={tool.imageUrl} |
||||
className="mb-5 h-48 hidden sm:block mx-auto md:mx-0" |
||||
/> |
||||
<h3 className="mb-0.5 sm:mb-2 text-lg sm:text-2xl font-bold">{tool.title}</h3> |
||||
<p className='text-sm sm:text-base'>{tool.description}</p> |
||||
</div> |
||||
); |
||||
})} |
||||
</div> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
@ -0,0 +1,14 @@ |
||||
--- |
||||
import BaseLayout from '../layouts/BaseLayout.astro'; |
||||
import { TeamHeroBanner } from '../components/TeamMarketing/TeamHeroBanner'; |
||||
import { TeamTools } from '../components/TeamMarketing/TeamTools'; |
||||
import { TeamDemo } from '../components/TeamMarketing/TeamDemo'; |
||||
import { TeamPricing } from '../components/TeamMarketing/TeamPricing'; |
||||
--- |
||||
|
||||
<BaseLayout title='Roadmaps for teams' permalink={'/teams'}> |
||||
<TeamHeroBanner /> |
||||
<TeamTools /> |
||||
<TeamDemo client:load /> |
||||
<TeamPricing client:load /> |
||||
</BaseLayout> |