Skip to content

Commit

Permalink
feat: add CallToAction, FAQs, Footer, HeroSection, TakedownForm, and …
Browse files Browse the repository at this point in the history
…Testimonials components
  • Loading branch information
R1shabh-Gupta committed Aug 15, 2024
1 parent a0e4071 commit 2347a0d
Show file tree
Hide file tree
Showing 6 changed files with 470 additions and 0 deletions.
28 changes: 28 additions & 0 deletions frontend/components/CallToAction.tsx
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>
);
}
50 changes: 50 additions & 0 deletions frontend/components/FAQs.tsx
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&apos;s FAQs</span>
<span className="hidden md:inline-block">
Rubik&apos;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>
);
}
50 changes: 50 additions & 0 deletions frontend/components/Footer.tsx
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">
&copy; 2024 Rubik. All rights reserved.
</p>
</div>
</footer>
);
};

export default Footer;
94 changes: 94 additions & 0 deletions frontend/components/HeroSection.tsx
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&apos;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>
);
}
167 changes: 167 additions & 0 deletions frontend/components/TakedownForm.tsx
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
&quot;Generate Notice&quot; 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;
Loading

0 comments on commit 2347a0d

Please sign in to comment.