diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/README.md b/README.md index e69de29..e215bc4 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/app/about/page.tsx b/app/about/page.tsx new file mode 100644 index 0000000..71de40f --- /dev/null +++ b/app/about/page.tsx @@ -0,0 +1,111 @@ +import Image from "next/image"; + +import aboutBg from "@/public/assets/images/our-mission-bg.png"; +import avatar from "@/public/assets/avatars/avatar.png"; +import avatar1 from "@/public/assets/avatars/avatar_1.png"; +import avatar2 from "@/public/assets/avatars/avatar_2.png"; +import avatar3 from "@/public/assets/avatars/avatar_3.png"; + +import TeamMemberCard from "@/components/about/TeamMemberCard"; + +const AboutPage = () => { + return ( +
+
+
+ About background + {/* Mobile darkening overlay */} +
+
+
+
+ +
+
+

+ Our Mission +

+

+ Us as human, we better work as a collective no matter the language + or background we have. However we at LAN Codes believe we can + bring one more player to the team, AI. Acceleration of machine + learning language (MLL) models. "AI", is scary. In some way "I + Robot" it may seem more real to some. However, for players in LAN + Codes there is nothing that scares us. We are attempting to use + our critical thinking and MLL's efficiency to remove the busy work + and reduce human errors. While working on creating these systems + our results will produce cost effective security with + uncompromising safety. We believe that safety should not be a + privilege. +

+
+
+
+ +
+
+
+
+

Founder

+
+ +
+ +

+ I was always told you cannot reinvent the wheel, but you can make + it better. While working in reactive security prevention, then + moved towards proactive security prevention and a sprinkle of + inspiration, I managed to find a gap in many security doors, and + better yet a solution to tighten them up. With that goal I have + managed to organize the team of fearless people and with their + help LAN Codes became a reality from just an idea on a napkin. +

+
+ +
+

Meet the team

+
+ +
+ + + +
+
+
+
+ ); +}; + +export default AboutPage; diff --git a/app/api/contact/route.ts b/app/api/contact/route.ts new file mode 100644 index 0000000..5610d65 --- /dev/null +++ b/app/api/contact/route.ts @@ -0,0 +1,41 @@ +import { saveContact } from "@/lib/contactStore"; +import { contactSchema } from "@/schemas/schemas"; + +export async function POST(req: Request) { + try { + const body = await req.json(); + const { + firstName, + lastName, + companyName, + address, + email, + phone, + industry, + notes, + subscribe, + } = contactSchema.parse(body); + + const saved = await saveContact({ + firstName, + lastName, + companyName, + address, + email, + phone, + industry, + notes, + subscribe, + }); + + return Response.json({ success: true, id: saved.id }); + } catch (err: any) { + if (err?.issues) { + return Response.json( + { success: false, errors: err.issues }, + { status: 400 } + ); + } + return Response.json({ success: false }, { status: 500 }); + } +} diff --git a/app/contact/page.tsx b/app/contact/page.tsx new file mode 100644 index 0000000..98273de --- /dev/null +++ b/app/contact/page.tsx @@ -0,0 +1,33 @@ +const ContactPage = () => { + return ( +
+
+
+

+ If you have any questions send us an email and we will be happy to + answer them. +
+ You can expect our team to get back to your with in 24h-48h. +

+ +

+ service@lancodes.ca +

+
+ +
+

+ Looking for a job? Send us your resume and we will get back to you + when our next round of hiring starts. +

+ +

+ hireme@lancodes.ca +

+
+
+
+ ); +}; + +export default ContactPage; diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000..718d6fe Binary files /dev/null and b/app/favicon.ico differ diff --git a/app/fonts.css b/app/fonts.css new file mode 100644 index 0000000..8a540b0 --- /dev/null +++ b/app/fonts.css @@ -0,0 +1,47 @@ +@font-face { + font-family: 'Fira Code'; + src: url('/assets/fonts/static/FiraCode-Regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Fira Code'; + src: url('/assets/fonts/static/FiraCode-Medium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Fira Code'; + src: url('/assets/fonts/static/FiraCode-SemiBold.ttf') format('truetype'); + font-weight: 600; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Fira Code'; + src: url('/assets/fonts/static/FiraCode-Bold.ttf') format('truetype'); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Fira Code'; + src: url('/assets/fonts/static/FiraCode-Light.ttf') format('truetype'); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Fira Code VF'; + src: url('/assets/fonts/FiraCode-VariableFont_wght.ttf') format('truetype-variations'); + font-weight: 300 700; + font-style: normal; + font-display: swap; +} diff --git a/app/get-started/page.tsx b/app/get-started/page.tsx new file mode 100644 index 0000000..b8ca4d8 --- /dev/null +++ b/app/get-started/page.tsx @@ -0,0 +1,218 @@ +"use client"; + +import { useForm, SubmitHandler } from "react-hook-form"; +import { z } from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { contactSchema } from "@/schemas/schemas"; +import { toast } from "react-toastify"; + +type FormValues = z.infer; + +const GetStartedPage = () => { + const { + register, + handleSubmit, + formState: { errors, isSubmitting }, + reset, + watch, + setValue, + } = useForm({ resolver: zodResolver(contactSchema) }); + + const onSubmit: SubmitHandler = async (data) => { + try { + const res = await fetch("/api/contact", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(data), + }); + + if (!res.ok) throw new Error("Request failed"); + toast.success("Thank you! We'll be in touch."); + reset(); + } catch (e) { + toast.error("Failed to save contact. Please try again."); + } + }; + + return ( +
+
+

+ Join Us on This Journey +

+

+ Be a part of something innovative. As our early adapters, you will be + one of the key players making a change in how staying safe online is + important yet effortless. You will get exclusive early access to our + newest solutions and influence the development, while staying + protected in the process. +

+
+ +
+
+
+
+ + + {errors.firstName && ( +

+ {errors.firstName.message} +

+ )} +
+
+ + + {errors.lastName && ( +

+ {errors.lastName.message} +

+ )} +
+
+ + + {errors.companyName && ( +

+ {errors.companyName.message} +

+ )} +
+
+ + + {errors.address && ( +

+ {errors.address.message} +

+ )} +
+
+ + + {errors.email && ( +

+ {errors.email.message} +

+ )} +
+
+ + + {errors.phone && ( +

+ {errors.phone.message} +

+ )} +
+
+ +
+ + + {errors.industry && ( +

+ {errors.industry.message} +

+ )} +
+ +
+ +