-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add CallToAction, FAQs, Footer, HeroSection, TakedownForm, and …
…Testimonials components
- Loading branch information
1 parent
a0e4071
commit 2347a0d
Showing
6 changed files
with
470 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
import { CircleBackground } from "@/components/ui/CircleBackground"; | ||
import { Button } from "./ui/button"; | ||
|
||
export function CallToAction() { | ||
return ( | ||
<section className="relative overflow-hidden py-20 sm:py-28 bg-black"> | ||
<div className="absolute left-20 top-1/2 -translate-y-1/2 sm:left-1/2 sm:-translate-x-1/2"> | ||
<CircleBackground color="#fff" className="animate-spin-slower" /> | ||
</div> | ||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 relative"> | ||
<div className="mx-auto max-w-md text-center"> | ||
<h2 className="text-3xl font-medium tracking-tight text-white sm:text-4xl"> | ||
Secure Your Frontend Today | ||
</h2> | ||
<p className="mt-4 text-lg text-gray-300"> | ||
Enhance your web security in moments. Sign up for Rubik to access | ||
automated takedowns, breach detection, and more. | ||
</p> | ||
<div className="mt-8 flex justify-center items-center"> | ||
<Button className="bg-white text-slate-950 hover:bg-white/90"> | ||
Get Started Now | ||
</Button> | ||
</div> | ||
</div> | ||
</div> | ||
</section> | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
"use client"; | ||
|
||
import { faqs } from "@/constants/data"; | ||
import { Icon } from "@iconify/react"; | ||
import { Accordion, AccordionItem } from "@nextui-org/react"; | ||
|
||
export default function FAQs() { | ||
return ( | ||
<section className="mx-auto w-full max-w-6xl px-4 py-20 sm:py-32 md:px-6 lg:px-8 lg:py-40"> | ||
<div className="mx-auto flex w-full max-w-4xl flex-col items-center gap-8"> | ||
<h2 className="w-full max-w-3xl bg-gradient-to-br from-foreground to-foreground-600 bg-clip-text px-2 text-center text-3xl font-bold leading-7 tracking-tight text-transparent md:text-5xl"> | ||
<span className="inline-block md:hidden">Acme's FAQs</span> | ||
<span className="hidden md:inline-block"> | ||
Rubik's Frequently asked questions | ||
</span> | ||
</h2> | ||
|
||
<Accordion | ||
fullWidth | ||
keepContentMounted | ||
itemClasses={{ | ||
base: "px-0 md:px-2 md:px-6", | ||
title: "font-medium", | ||
trigger: "py-6 flex-row-reverse", | ||
content: "pt-0 pb-6 text-base text-default-500", | ||
indicator: "rotate-0 data-[open=true]:-rotate-45", | ||
}} | ||
items={faqs} | ||
selectionMode="multiple" | ||
> | ||
{faqs.map((item, i) => ( | ||
<AccordionItem | ||
key={i} | ||
indicator={ | ||
<Icon | ||
className="text-secondary" | ||
icon="lucide:plus" | ||
width={24} | ||
/> | ||
} | ||
title={item.title} | ||
> | ||
{item.content} | ||
</AccordionItem> | ||
))} | ||
</Accordion> | ||
</div> | ||
</section> | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
import { footerLinks, socialItems } from "@/constants/data"; | ||
import { Link, Spacer } from "@nextui-org/react"; | ||
|
||
const Footer = () => { | ||
return ( | ||
<footer className="flex w-full flex-col"> | ||
<div className="mx-auto flex w-full max-w-7xl flex-col items-center justify-center px-6 py-12 lg:px-8"> | ||
<div className="flex items-center justify-center"> | ||
<h1 className="font-semibold text-xl sm:text-3xl text-slate-800 dark:text-slate-200 font-logo z-10"> | ||
Rubik | ||
</h1> | ||
</div> | ||
<Spacer y={4} /> | ||
<div className="flex flex-wrap justify-center gap-x-4 gap-y-1"> | ||
{footerLinks.map((item) => ( | ||
<Link | ||
key={item.name} | ||
isExternal | ||
className="text-default-500" | ||
href={item.href} | ||
size="sm" | ||
> | ||
{item.name} | ||
</Link> | ||
))} | ||
</div> | ||
<Spacer y={6} /> | ||
<div className="flex justify-center gap-x-4"> | ||
{socialItems.map((item) => ( | ||
<Link | ||
key={item.name} | ||
isExternal | ||
className="text-default-400" | ||
href={item.href} | ||
> | ||
<span className="sr-only">{item.name}</span> | ||
<item.icon aria-hidden="true" className="w-5" /> | ||
</Link> | ||
))} | ||
</div> | ||
<Spacer y={4} /> | ||
<p className="mt-1 text-center text-small text-default-400"> | ||
© 2024 Rubik. All rights reserved. | ||
</p> | ||
</div> | ||
</footer> | ||
); | ||
}; | ||
|
||
export default Footer; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
import Image from "next/image"; | ||
|
||
export default function HeroSection() { | ||
return ( | ||
<div className="relative isolate overflow-hidden"> | ||
<svg | ||
className="absolute inset-0 -z-10 h-full w-full stroke-white/10 [mask-image:radial-gradient(100%_100%_at_top_right,white,transparent)]" | ||
aria-hidden="true" | ||
> | ||
<defs> | ||
<pattern | ||
id="983e3e4c-de6d-4c3f-8d64-b9761d1534cc" | ||
width={200} | ||
height={200} | ||
x="50%" | ||
y={-1} | ||
patternUnits="userSpaceOnUse" | ||
> | ||
<path d="M.5 200V.5H200" fill="none" /> | ||
</pattern> | ||
</defs> | ||
<svg x="50%" y={-1} className="overflow-visible fill-gray-800/20"> | ||
<path | ||
d="M-200 0h201v201h-201Z M600 0h201v201h-201Z M-400 600h201v201h-201Z M200 800h201v201h-201Z" | ||
strokeWidth={0} | ||
/> | ||
</svg> | ||
<rect | ||
width="100%" | ||
height="100%" | ||
strokeWidth={0} | ||
fill="url(#983e3e4c-de6d-4c3f-8d64-b9761d1534cc)" | ||
/> | ||
</svg> | ||
<div | ||
className="absolute left-[calc(50%-4rem)] top-10 -z-10 transform-gpu blur-3xl sm:left-[calc(50%-18rem)] lg:left-48 lg:top-[calc(50%-30rem)] xl:left-[calc(50%-24rem)]" | ||
aria-hidden="true" | ||
> | ||
<div | ||
className="aspect-[1108/632] w-[69.25rem] bg-gradient-to-r from-[#80caff] to-[#4f46e5] opacity-20" | ||
style={{ | ||
clipPath: | ||
"polygon(73.6% 51.7%, 91.7% 11.8%, 100% 46.4%, 97.4% 82.2%, 92.5% 84.9%, 75.7% 64%, 55.3% 47.5%, 46.5% 49.4%, 45% 62.9%, 50.3% 87.2%, 21.3% 64.1%, 0.1% 100%, 5.4% 51.1%, 21.4% 63.9%, 58.9% 0.2%, 73.6% 51.7%)", | ||
}} | ||
/> | ||
</div> | ||
<div className="mx-auto max-w-7xl px-6 pb-24 pt-10 sm:pb-32 lg:flex lg:px-8 lg:py-20"> | ||
<div className="mx-auto max-w-2xl flex-shrink-0 lg:mx-0 lg:max-w-xl lg:pt-8"> | ||
<div className="mt-24 sm:mt-32 lg:mt-16"> | ||
<a href="#" className="inline-flex space-x-6"> | ||
<span className="rounded-full bg-indigo-500/10 px-3 py-1 text-sm font-semibold leading-6 text-indigo-400 ring-1 ring-inset ring-indigo-500/20"> | ||
What's new | ||
</span> | ||
<span className="inline-flex items-center space-x-2 text-sm font-medium leading-6 text-gray-300"> | ||
<span>Just shipped v1.0</span> | ||
</span> | ||
</a> | ||
</div> | ||
<h1 className="mt-10 text-4xl font-bold tracking-tight text-white sm:text-6xl"> | ||
Secure Your Digital Presence with Rubik | ||
</h1> | ||
<p className="mt-6 text-lg leading-8 text-gray-300"> | ||
Rubik is your ultimate toolkit for automated penetration testing, | ||
breach detection, and domain security. Effortlessly safeguard your | ||
digital assets with our powerful, user-friendly, and 100% free | ||
platform. | ||
</p> | ||
<div className="mt-10 flex items-center gap-x-6"> | ||
<button className="relative inline-flex h-12 overflow-hidden rounded-full p-[1px] focus:outline-none focus:ring-2 focus:ring-slate-400 focus:ring-offset-2 focus:ring-offset-slate-50"> | ||
<span className="absolute inset-[-1000%] animate-[spin_2s_linear_infinite] bg-[conic-gradient(from_90deg_at_50%_50%,#E2CBFF_0%,#393BB2_50%,#E2CBFF_100%)]" /> | ||
<span className="inline-flex h-full w-full cursor-pointer items-center justify-center rounded-full bg-slate-950 px-6 py-1 text-sm font-semibold text-white backdrop-blur-3xl"> | ||
Dashboard | ||
</span> | ||
</button> | ||
<a href="#" className="text-sm font-semibold leading-6 text-white"> | ||
Learn more <span aria-hidden="true">→</span> | ||
</a> | ||
</div> | ||
</div> | ||
<div className="mx-auto mt-16 flex max-w-2xl sm:mt-24 lg:ml-10 lg:mr-0 lg:mt-0 lg:max-w-none lg:flex-none xl:ml-32"> | ||
<div className="max-w-3xl flex-none sm:max-w-5xl lg:max-w-none"> | ||
<Image | ||
src="https://tailwindui.com/img/component-images/dark-project-app-screenshot.png" | ||
alt="App screenshot" | ||
width={2432} | ||
height={1442} | ||
className="w-[66rem] rounded-md bg-white/5 shadow-2xl ring-1 ring-white/10" | ||
/> | ||
</div> | ||
</div> | ||
</div> | ||
</div> | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,167 @@ | ||
import { Button } from "@/components/ui/button"; | ||
import { Input } from "@/components/ui/input"; | ||
import { Label } from "@/components/ui/label"; | ||
import { | ||
Select, | ||
SelectContent, | ||
SelectItem, | ||
SelectTrigger, | ||
SelectValue, | ||
} from "@/components/ui/select"; | ||
import { Textarea } from "./ui/textarea"; | ||
|
||
import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog"; | ||
import CopyButton from "./ui/CopyButton"; | ||
|
||
const TakedownForm = () => { | ||
const takedownReasons = [ | ||
{ | ||
name: "Copyright infringement", | ||
id: "copyright-infringement", | ||
}, | ||
{ | ||
name: "Trademark infringement", | ||
id: "trademark-infringement", | ||
}, | ||
{ | ||
name: "Defamation or libel", | ||
id: "defamation-or-libel", | ||
}, | ||
{ | ||
name: "Privacy violations", | ||
id: "privacy-violations", | ||
}, | ||
{ | ||
name: "Malware or phishing activities", | ||
id: "malware-or-phishing-activities", | ||
}, | ||
{ | ||
name: "Violation of terms of service", | ||
id: "violation-of-terms-of-service", | ||
}, | ||
{ | ||
name: "Personal safety concerns", | ||
id: "personal-safety-concerns", | ||
}, | ||
{ | ||
name: "Other (specify)", | ||
id: "other", | ||
}, | ||
]; | ||
return ( | ||
<> | ||
<h1 className="flex gap-1 text-2xl font-semibold"> | ||
<span className="text-[#E51015]">Takedown </span>Form | ||
</h1> | ||
<p className="text-sm font-medium">Enter takedown details</p> | ||
|
||
<form className="mt-4"> | ||
<div className="grid items-center w-full gap-6"> | ||
<div className="flex flex-row gap-8"> | ||
<div className="basis-1/2"> | ||
<Label htmlFor="name">Infringing Content</Label> | ||
<Input | ||
id="name" | ||
placeholder="http://www.website-that-stole-your-content.com" | ||
/> | ||
</div> | ||
|
||
<div className="basis-1/2"> | ||
<Label htmlFor="name">Brand Content</Label> | ||
<Input | ||
id="name" | ||
placeholder="http://www.website-from-where-data-is-stolen.com" | ||
/> | ||
</div> | ||
</div> | ||
|
||
<div className="grid w-full gap-1.5"> | ||
<Label htmlFor="framework" className="mb-1.5"> | ||
Select the reason for infringement | ||
</Label> | ||
<Select> | ||
<SelectTrigger id="framework"> | ||
<SelectValue placeholder="Select" /> | ||
</SelectTrigger> | ||
<SelectContent position="popper"> | ||
{takedownReasons.map((reason) => ( | ||
<SelectItem key={reason.id} value={reason.id}> | ||
{reason.name} | ||
</SelectItem> | ||
))} | ||
</SelectContent> | ||
</Select> | ||
</div> | ||
|
||
<div className="grid w-full gap-1.5"> | ||
<Label htmlFor="message" className="mb-1.5"> | ||
Detailed description of the infringement that took place | ||
</Label> | ||
<Textarea | ||
placeholder="Type your message here." | ||
id="message" | ||
className="leading-9 mb-1.5" | ||
/> | ||
<div className="flex justify-between"> | ||
<Button>Generate Notice</Button> | ||
|
||
<Dialog> | ||
<DialogTrigger>Need help?</DialogTrigger> | ||
<DialogContent className="max-w-xl"> | ||
<ul className="flex flex-col gap-3"> | ||
<li> | ||
<span className="font-semibold">Step 1:</span> Enter the | ||
URL of the infringing content that you want to report. | ||
</li> | ||
<li> | ||
<span className="font-semibold">Step 2:</span> Provide the | ||
URL of your brand content that has been infringed. | ||
</li> | ||
<li> | ||
<span className="font-semibold">Step 3:</span> Select the | ||
reason for the infringement from the dropdown list. | ||
</li> | ||
<li> | ||
<span className="font-semibold">Step 4:</span> Describe | ||
the infringement in detail to provide more context. | ||
</li> | ||
<li> | ||
<span className="font-semibold">Step 5:</span> Click | ||
"Generate Notice" to create a takedown notice. | ||
</li> | ||
<li> | ||
<span className="font-semibold">Step 6:</span> Review the | ||
generated notice, then download or send it via email. | ||
</li> | ||
</ul> | ||
</DialogContent> | ||
</Dialog> | ||
</div> | ||
</div> | ||
|
||
<div className="grid w-full gap-1.5"> | ||
<Label htmlFor="message" className="mb-1.5"> | ||
Generated Notice | ||
</Label> | ||
<Textarea | ||
placeholder="Review your generated notice here" | ||
id="message" | ||
className="leading-9 mb-1.5" | ||
/> | ||
<div className="flex justify-between"> | ||
<div className="flex gap-4"> | ||
<Button className="bg-[#e11318] hover:bg-[#E51015] text-white font-semibold"> | ||
Download Notice | ||
</Button> | ||
<Button>Send e-mail</Button> | ||
</div> | ||
<CopyButton /> | ||
</div> | ||
</div> | ||
</div> | ||
</form> | ||
</> | ||
); | ||
}; | ||
|
||
export default TakedownForm; |
Oops, something went wrong.