INIT REPO

This commit is contained in:
William Jeynes
2026-06-23 11:57:18 +01:00
commit 77c2c3acdf
56 changed files with 14347 additions and 0 deletions
+227
View File
@@ -0,0 +1,227 @@
"use client";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { InputWrapper } from "@/components/ui/input_wrapper";
import Section from "@/components/ui/section";
import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from "@/components/ui/select";
import { Spinner } from "@/components/ui/spinner";
import { getRandomThirdPartyCount, getRandomUsername } from "@/lib/utils";
import Link from "next/link";
import { useState } from "react";
export default function Page() {
const [password, setPassword] = useState("");
const [email, setEmail] = useState("");
const [email2, setEmail2] = useState("");
const [email3, setEmail3] = useState("");
const [hours, setHours] = useState("");
const [experience, setExperience] = useState("");
const [graduationYear, setGraduationYear] = useState("");
const [digitOfPi, setDigitOfPi] = useState("");
const [submitSpinner, setSubmitSpinner] = useState(false);
const isValidPassword = password.length >= 8
return (
<div className="flex flex-col items-center min-h-screen gap-6 mt-8 mb-8">
<h1 className="text-3xl mb-3">Apply to The Last Tech Job</h1>
<form className="flex flex-col gap-10">
<Section>
<div>
<p className="text-lg">Enter your personal details</p>
<p className="text-md text-gray-700">All fields are required. All details will be shared with our {getRandomThirdPartyCount()} third parties.</p>
</div>
<InputWrapper name="Name">
<Input type="text" placeholder="First Name" />
<Input type="text" placeholder="Last Name" />
</InputWrapper>
<InputWrapper name="Email">
<Input
type="email"
placeholder="Email Address"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
</InputWrapper>
<InputWrapper
name="Confirm Email"
error={email !== email2 ? "Emails do not match" : ""}
>
<Input
type="email"
placeholder="Email Address"
value={email2}
onChange={(e) => setEmail2(e.target.value)}
/>
</InputWrapper>
{email === email2 && email !== "" ? (
<InputWrapper
name="Are you 100% sure that's your email?"
error={email !== email2 || email !== email3 ? "Emails do not match" : ""}
>
<Input
type="email"
placeholder="Email Address"
value={email3}
onChange={(e) => setEmail3(e.target.value)}
/>
</InputWrapper>
) : null}
<InputWrapper name="Phone Number">
<Input type="tel" placeholder="Phone Number" />
</InputWrapper>
<InputWrapper
name="Password"
error={isValidPassword ? "Password already taken by " + getRandomUsername() : ""}>
<Input
type="password"
placeholder="Password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
</InputWrapper>
<InputWrapper name="Bank Details">
<Input type="text" placeholder="Card Number" />
<Input type="text" placeholder="Expiration Date" />
<Input type="text" placeholder="CVV" />
</InputWrapper>
<InputWrapper name="Discord Username">
<Input type="text" placeholder="Username" />
</InputWrapper>
<InputWrapper name="Home Address">
<Input type="text" placeholder="Address" />
</InputWrapper>
<InputWrapper name="Date of Birth">
<Input type="date" placeholder="Date of Birth" />
</InputWrapper>
<InputWrapper name="Pet Names">
<Input type="textarea" placeholder="Sheldon, Casper, Benny, ..." />
</InputWrapper>
<InputWrapper name="Favorite Color">
<Input type="color" placeholder="Favorite Color" />
</InputWrapper>
<InputWrapper name="Who did you vote for in the previous election?">
<Select>
<SelectTrigger className="w-full max-w-48 override">
<SelectValue placeholder="Select a party" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>Party Name</SelectLabel>
<SelectItem value="capitalists">Filthy Capitalists</SelectItem>
<SelectItem value="communists">Dirty Communists</SelectItem>
<SelectItem value="centrists">Boring Centrists</SelectItem>
<SelectItem value="greens">Tree Huggers</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</InputWrapper>
<InputWrapper
name="How many hours do you have in Counter Strike and League of Legends?"
error={Number(hours) < 1 ? "" : "Must be less than 1"}
>
<Input
type="text"
placeholder="No. of hours"
value={hours}
onChange={(e) => setHours(e.target.value)}
/>
</InputWrapper>
</Section>
<Section>
<p className="text-lg">Education and Work history</p>
<p className="text-md">All fields are required. Answer with honesty, we already know everything :)</p>
<InputWrapper name="University/College" description="Only acceptable universities are selectable">
<div>
<input id="cambridge" name="university" type="radio" value="Cambridge" />
<label htmlFor="cambridge"> Cambridge </label>
</div>
<div>
<input id="oxford" name="university" type="radio" value="Oxford" />
<label htmlFor="oxford"> Oxford </label>
</div>
<div>
<input id="tau" name="university" type="radio" value="TAU" />
<label htmlFor="tau"> Tel Aviv University</label>
</div>
</InputWrapper>
<InputWrapper
name="How many years of experience do you have?"
error={Number(experience) >= 30 || experience == "" ? "" : "Must be at least 30 years"}
>
<Input
type="number"
placeholder="Years of experience"
value={experience}
onChange={(e) => setExperience(e.target.value)}
/>
</InputWrapper>
<InputWrapper
name="What year did you graduate?"
error={Number(graduationYear) < 2025 && graduationYear != "" ? "Must have graduated within the last 12 months." : ""}
>
<Input
type="number"
placeholder="Year of graduation"
value={graduationYear}
onChange={(e) => setGraduationYear(e.target.value)}
/>
</InputWrapper>
</Section>
<Section>
<p className="text-lg">Additional Questions</p>
{/* <InputWrapper
name="As an Evil.AI employee, what is the first country you will visit?"
error="Must pick another country."
>
<Input type="text" placeholder="Israel"/>
</InputWrapper> */}
<InputWrapper
name="What is the 16,331st digit of pi?"
description={digitOfPi == "8" ? "Correct!" : ""}
>
<Input
type="number"
placeholder="Type your answer here"
value={digitOfPi}
onChange={(e) => setDigitOfPi(e.target.value)}
/>
</InputWrapper>
</Section>
<Button type="submit" className="self-center text-4xl p-6">
<Link href="/careers/apply/submitted/" onClick={() => setSubmitSpinner(true)}>Submit Application</Link>
{submitSpinner && <Spinner data-icon="inline-start" />}
</Button>
</form>
</div>
);
};
+12
View File
@@ -0,0 +1,12 @@
"use client"
export default function Page() {
return (
<div className="flex flex-col items-center min-h-screen gap-6 mt-8 mb-8">
<h1 className="text-3xl mb-3">Application Submitted</h1>
<p className="text-lg">Thank you for applying to The Last Tech Job. We have received your application and will be reviewing it shortly.</p>
<p className="text-lg">We may get back to you in 14-18 months.</p>
<p className="text-md text-gray-700">In the meantime, we would suggest checking out our other job opportunities, however they have all been taken by AI.</p>
</div>
);
};
+64
View File
@@ -0,0 +1,64 @@
"use client";
import { Button } from "@/components/ui/button";
import Section from "@/components/ui/section";
import Link from "next/link";
export default function Page() {
return (
<div className="flex flex-col items-center min-h-screen gap-6 mt-8 mb-8">
<h1 className="text-3xl mb-3">Apply to The Last Tech Job</h1>
<Section>
<div className="font-bold text-lg override">This is it! The Last Tech Job!</div>
<div>
Here at Evil Inc. we are committed to preserving the jobs of the future, and that&apos;s
why we are offering one final opportunity for the next generation of experienced
graduates to kick-start their nearly non-existent career in technology.
Your responsibilities may include:
<ul className="list-disc list-inside">
<li>Development of advanced military AI-enhanced automonmous drones, including facial
recognition systems, instant drone-to-drone communication and state-of-the-art vision
and audio processing.</li>
<li>Handling large databases of personal information (adults & children).</li>
<li>Deployment across 57 different countries, of which 40 are classified as low
economically developed. We are helping the people of these countries to become safer
and more secure.</li>
<li>Work with a team of 4-6 AI agents who have no ulterior motive whatsoever.</li>
</ul>
</div>
<div>
Our job offers a competitive salary of <span className="font-bold">£20,000 per year</span>, with opportunities for growth
and personal development. You will also have the chance to win health insurance for
1 month, or a ticket to watch our CEO drive at the next Formula 1 Grand Prix.
</div>
<ul className="list-disc list-inside">
Job requirements:
<li>At least 30 years of experience.</li>
<li>Must have graduated within the previous 12 months.</li>
<li>Experience in Assembly, Fortran, OcamL and Brainfuck is necessary.</li>
<li>Must have fluency in Swahili.</li>
<li>Right to work in Cambodia, as we cannot provide you with sponsorship.</li>
<li>Must hold valid HGV driving license.</li>
<li>DBS check needed as role may require working around children.</li>
</ul>
<ul className="list-disc list-inside">
Desirables:
<li>Clean social media history</li>
<li>Know the rules of Warhammer 40k</li>
<li>Weak moral compass</li>
</ul>
<Button className="bg-blue-500 text-white px-4 py-2 rounded mt-4" asChild>
<Link href="/careers/apply/">Apply now!</Link>
</Button>
</Section>
</div>
);
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

+228
View File
@@ -0,0 +1,228 @@
@import "tailwindcss";
@import "tw-animate-css";
@import "shadcn/tailwind.css";
/* @custom-variant dark (&:is(.dark *)); */
:root {
--background: #ffffff;
--foreground: #171717;
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);
--color-sidebar-ring: var(--sidebar-ring);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar: var(--sidebar);
--color-chart-5: var(--chart-5);
--color-chart-4: var(--chart-4);
--color-chart-3: var(--chart-3);
--color-chart-2: var(--chart-2);
--color-chart-1: var(--chart-1);
--color-ring: var(--ring);
--color-input: var(--input);
--color-border: var(--border);
--color-destructive: var(--destructive);
--color-accent-foreground: var(--accent-foreground);
--color-accent: var(--accent);
--color-muted-foreground: var(--muted-foreground);
--color-muted: var(--muted);
--color-secondary-foreground: var(--secondary-foreground);
--color-secondary: var(--secondary);
--color-primary-foreground: var(--primary-foreground);
--color-primary: var(--primary);
--color-popover-foreground: var(--popover-foreground);
--color-popover: var(--popover);
--color-card-foreground: var(--card-foreground);
--color-card: var(--card);
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--radius-2xl: calc(var(--radius) + 8px);
--radius-3xl: calc(var(--radius) + 12px);
--radius-4xl: calc(var(--radius) + 16px);
}
:root {
--radius: 0.625rem;
--background: oklch(1 0 0);
--foreground: oklch(0.145 0 0);
--card: oklch(1 0 0);
--card-foreground: oklch(0.145 0 0);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.145 0 0);
--primary: oklch(0.205 0 0);
--primary-foreground: oklch(0.985 0 0);
--secondary: oklch(0.97 0 0);
--secondary-foreground: oklch(0.205 0 0);
--muted: oklch(0.97 0 0);
--muted-foreground: oklch(0.556 0 0);
--accent: oklch(0.97 0 0);
--accent-foreground: oklch(0.205 0 0);
--destructive: oklch(0.577 0.245 27.325);
--border: oklch(0.922 0 0);
--input: oklch(0.922 0 0);
--ring: oklch(0.708 0 0);
--chart-1: oklch(0.646 0.222 41.116);
--chart-2: oklch(0.6 0.118 184.704);
--chart-3: oklch(0.398 0.07 227.392);
--chart-4: oklch(0.828 0.189 84.429);
--chart-5: oklch(0.769 0.188 70.08);
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.145 0 0);
--sidebar-primary: oklch(0.205 0 0);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.97 0 0);
--sidebar-accent-foreground: oklch(0.205 0 0);
--sidebar-border: oklch(0.922 0 0);
--sidebar-ring: oklch(0.708 0 0);
--brightness: 1
}
.dark {
--background: oklch(0.145 0 0);
--foreground: oklch(0.985 0 0);
--card: oklch(0.205 0 0);
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.205 0 0);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.922 0 0);
--primary-foreground: oklch(0.205 0 0);
--secondary: oklch(0.269 0 0);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.269 0 0);
--muted-foreground: oklch(0.708 0 0);
--accent: oklch(0.269 0 0);
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.704 0.191 22.216);
--border: oklch(1 0 0 / 10%);
--input: oklch(1 0 0 / 15%);
--ring: oklch(0.556 0 0);
--chart-1: oklch(0.488 0.243 264.376);
--chart-2: oklch(0.696 0.17 162.48);
--chart-3: oklch(0.769 0.188 70.08);
--chart-4: oklch(0.627 0.265 303.9);
--chart-5: oklch(0.645 0.246 16.439);
--sidebar: oklch(0.205 0 0);
--sidebar-foreground: oklch(0.985 0 0);
--sidebar-primary: oklch(0.488 0.243 264.376);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.269 0 0);
--sidebar-accent-foreground: oklch(0.985 0 0);
--sidebar-border: oklch(1 0 0 / 10%);
--sidebar-ring: oklch(0.556 0 0);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
}
/* @media (prefers-color-scheme: dark) {
:root {
--background: #0a0a0a;
--foreground: #ededed;
}
} */
body {
font-family: Arial, Helvetica, sans-serif;
}
.main {
filter: brightness(var(--brightness));
}
html {
scroll-behavior: smooth;
}
/* Accessibility Modes */
.epilepsy-mode .main,
.epilepsy-mode .main h1,
.epilepsy-mode .main h2,
.epilepsy-mode .main h3,
.epilepsy-mode .main h4,
.epilepsy-mode .main h5,
.epilepsy-mode .main h6,
.epilepsy-mode .main p {
animation: bgCycle 3s steps(5) infinite;
}
.epilepsy-mode .override {
animation: bgCycle 10s steps(5) infinite;
}
.epilepsy-mode .main .bg-white {
animation: bgCycle 10s steps(5) infinite;
}
.small-text-mode .main,
.small-text-mode .main h1,
.small-text-mode .main h2,
.small-text-mode .main h3,
.small-text-mode .main h4,
.small-text-mode .main h5,
.small-text-mode .main h6,
.small-text-mode .main p {
font-size: 8px;
}
.small-text-mode .override {
font-size: 8px !important;
}
.low-contrast-mode .main {
background-color: #BBBBBB;
}
.low-contrast-mode .main h1,
.low-contrast-mode .main h2,
.low-contrast-mode .main h3,
.low-contrast-mode .main h4,
.low-contrast-mode .main h5,
.low-contrast-mode .main h6 {
color: #AAAAAA !important;
}
.low-contrast-mode .override {
color: #AAAAAA !important;
border-color: #AAAAAA !important;
}
.low-contrast-mode .imgOverride {
filter: invert() !important;
}
.dim-mode body {
--brightness: 0.3;
background-color: #4D4D4D
}
.a {
border: 1px solid black;
background: white
}
@keyframes bgCycle {
0% { background-color: #ff0000; color: #00ff00;}
20% { background-color: #00ff00; color: #0000ff;}
40% { background-color: #0000ff; color: #ffff00;}
60% { background-color: #ffff00; color: #ff00ff;}
80% { background-color: #ff00ff; color: #ff0000;}
100% { background-color: #ff0000; color: #00ff00;}
}
+53
View File
@@ -0,0 +1,53 @@
"use client";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
import "../i18n";
import TitleBar from "@/components/titlebar";
import Footer from "@/components/footer";
import InaccessabilityPopup from "@/components/inacessability/inaccessabilityPopup";
import Glasses from "@/components/inacessability/glasses";
import CookieConsent from "@/components/cookie-consent";
import Nudge from "@/components/inacessability/nudge";
import { useState } from "react";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
const [nudgeOpen, setNudgeOpen] = useState(false);
return (
<html lang="en">
<head>
<title>Evil Inc. | Providing Security Solutions Inaccessibly</title>
</head>
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
<CookieConsent />
<Nudge open={nudgeOpen} setOpen={setNudgeOpen} />
<div className="main">
<TitleBar />
<div className="px-6">
{children}
</div>
<Footer />
</div>
<Glasses setNudgeOpen={setNudgeOpen} size={200} />
</body>
</html>
);
}
+15
View File
@@ -0,0 +1,15 @@
"use client";
import Customers from "@/components/home/customers";
import Header from "@/components/home/header";
import Testimonies from "@/components/home/testimonies";
export default function Home() {
return (
<div>
<Header />
<Customers />
<Testimonies />
</div>
);
}